From 29c84ec5c3f8e614b050d5645734a4d8df67956d Mon Sep 17 00:00:00 2001 From: "DAL\\Administrator" <3452720699@qq.com> Date: Tue, 25 Aug 2026 14:15:30 +0800 Subject: [PATCH 01/50] chore(vnext): checkpoint C0 governance and baseline --- .gitattributes | 2 + .github/workflows/ci.yml | 38 +- docs/VNEXT_ELECTRON_NODE_ARCHITECTURE_ZH.md | 128 +- .../0011-v1-single-branch-single-final-pr.md | 45 + docs/adr/0012-dual-resource-lock-contract.md | 54 + .../0013-restore-v2-recovery-state-machine.md | 62 + .../contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md | 19 +- docs/architecture/contracts/ERROR_CODES_ZH.md | 21 +- docs/migration/BEHAVIOR_FIXTURES_ZH.md | 8 +- .../VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md | 53 +- .../evidence/C0_BASELINE_2026-08-25.md | 40 + package-lock.json | 1387 ++++++----------- package.json | 4 +- web/dist/assets/index-776d2b19.css | 1 - web/dist/assets/index-BhSMcRqW.js | 10 + web/dist/assets/index-BhSMcRqW.js.map | 1 + web/dist/assets/index-C3tdtTcI.css | 1 + web/dist/assets/index-aed55189.js | 42 - web/dist/assets/index-aed55189.js.map | 1 - web/dist/index.html | 7 +- web/index.html | 2 +- 21 files changed, 890 insertions(+), 1036 deletions(-) create mode 100644 .gitattributes create mode 100644 docs/adr/0011-v1-single-branch-single-final-pr.md create mode 100644 docs/adr/0012-dual-resource-lock-contract.md create mode 100644 docs/adr/0013-restore-v2-recovery-state-machine.md create mode 100644 docs/migration/evidence/C0_BASELINE_2026-08-25.md delete mode 100644 web/dist/assets/index-776d2b19.css create mode 100644 web/dist/assets/index-BhSMcRqW.js create mode 100644 web/dist/assets/index-BhSMcRqW.js.map create mode 100644 web/dist/assets/index-C3tdtTcI.css delete mode 100644 web/dist/assets/index-aed55189.js delete mode 100644 web/dist/assets/index-aed55189.js.map diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..79a730b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +web/index.html text eol=lf +web/dist/index.html text eol=lf diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eaddbb9..ee04efd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,9 +28,39 @@ jobs: node-version: ${{ matrix.node-version }} cache: "npm" - run: npm ci - - run: npm run web:build - run: npm test + web-build: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - windows-latest + - ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: "24" + cache: "npm" + - run: npm ci + - run: npm run web:build + + dependency-audit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: "24" + cache: "npm" + - run: npm ci + - name: Reject production moderate, high, and critical vulnerabilities + run: npm audit --omit=dev --audit-level=moderate + - name: Reject full-tree high and critical vulnerabilities + run: npm audit --audit-level=high + desktop-test: runs-on: windows-latest steps: @@ -71,6 +101,8 @@ jobs: if: ${{ always() }} needs: - test + - web-build + - dependency-audit - desktop-test - desktop-macos - desktop-linux-lock @@ -79,11 +111,15 @@ jobs: - name: Verify required jobs env: NODE_TEST_RESULT: ${{ needs.test.result }} + WEB_BUILD_RESULT: ${{ needs.web-build.result }} + DEPENDENCY_AUDIT_RESULT: ${{ needs.dependency-audit.result }} DESKTOP_TEST_RESULT: ${{ needs.desktop-test.result }} MACOS_TEST_RESULT: ${{ needs.desktop-macos.result }} LINUX_LOCK_RESULT: ${{ needs.desktop-linux-lock.result }} run: | if [ "$NODE_TEST_RESULT" != "success" ] || + [ "$WEB_BUILD_RESULT" != "success" ] || + [ "$DEPENDENCY_AUDIT_RESULT" != "success" ] || [ "$DESKTOP_TEST_RESULT" != "success" ] || [ "$MACOS_TEST_RESULT" != "success" ] || [ "$LINUX_LOCK_RESULT" != "success" ]; then diff --git a/docs/VNEXT_ELECTRON_NODE_ARCHITECTURE_ZH.md b/docs/VNEXT_ELECTRON_NODE_ARCHITECTURE_ZH.md index c5cb81e..fb0fdd3 100644 --- a/docs/VNEXT_ELECTRON_NODE_ARCHITECTURE_ZH.md +++ b/docs/VNEXT_ELECTRON_NODE_ARCHITECTURE_ZH.md @@ -353,10 +353,12 @@ window.sqlite ### 4.7 渐进迁移 - `main` 始终可发布; -- 每个 PR 都可独立审查; +- 默认按 ADR-0008 使用可独立合入的小型 PR; +- 经 ADR-0011 明确批准的 V1 例外使用单一 `V1` 分支和一个最终 PR,但 `C0`~`C10` 必须成为不可变、可独立审查和回退的内部 checkpoint; +- 分支 checkpoint 的验证不等于受保护分支的阶段 Completed,最终合入前 Phase 保持 In Progress/Pending; - 旧 CLI 和旧 GUI 在迁移期间继续工作; - 新 Electron 先只读,再开放写入; -- 不使用长期漂移的“大重写分支”承载全部开发。 +- 不使用该例外放宽 Fixture、兼容、发布或 .NET 保留门槛。 --- @@ -819,17 +821,13 @@ export interface SyncPlan { - 进程锁; - SQLite 可写性。 -若变化,返回: +若任一绑定状态变化,Apply 返回统一的 Canonical Code: ```text -PLAN_STALE -PROFILE_CHANGED -STORAGE_CHANGED -CONFIG_CHANGED -ROLLOUT_CHANGED +STALE_STATE ``` -用户必须刷新并再次确认。 +安全的 `details.reason` 可区分 `profile/config/storage/rollout/state-db`;调用方不得据此绕过重新 Prepare。Plan 超过 TTL 则返回 `PLAN_EXPIRED`。用户必须刷新并再次确认。 ### 9.4 Plan 存储 @@ -1440,7 +1438,7 @@ Core Runtime 使用 `OperationCoordinator`: ### 18.2 跨进程锁 -同一 Codex Home 的所有正式入口必须遵守兼容的跨进程锁合同: +同一 Codex Home 的所有正式入口必须遵守兼容的跨进程锁合同;vNext 对共享 SQLite Home 的双层资源身份、路径、顺序和错误语义由 [ADR-0012](adr/0012-dual-resource-lock-contract.md) 冻结,当前代码尚未实现该目标合同: ```text CLI、Web UI、Electron、旧 GUI 同时运行 @@ -1490,7 +1488,8 @@ interface CoreErrorDto { INVALID_INPUT PROFILE_CHANGED STORAGE_CHANGED -PLAN_STALE +STALE_STATE +PLAN_EXPIRED CODEX_HOME_NOT_FOUND STATE_DB_NOT_FOUND SQLITE_UNSUPPORTED_PATH @@ -1505,6 +1504,7 @@ RECOVERY_REQUIRED RESTORE_VALIDATION_FAILED PERMISSION_DENIED OPERATION_BUSY +LOCK_UNVERIFIABLE OPERATION_CANCELLED CORE_RUNTIME_CRASHED PROTOCOL_VERSION_MISMATCH @@ -2378,9 +2378,18 @@ Electron 只开放: --- -## 31. 首批 PR 拆分建议 +## 31. V1 内部 Checkpoint 序列 + +在 ADR-0011 的单最终 PR 例外下,以下 `C0`~`C10` 是 V1 分支内的不可变 checkpoint,不是已经合入的独立 PR。旧 PR 2~PR 10 的依赖与安全意图按 ADR-0011 映射到这些 checkpoint。每个 checkpoint 必须保留 commit、测试证据和回退点;所有 Phase 状态仍以最终合入受保护分支为准。 -### PR 1:冻结架构合同和 ADR +### C0:V1 交付治理、双层锁与 Restore v2 文档合同 + +- 新增 ADR-0011~ADR-0013; +- 使架构、执行索引、Core/Error/Fixture 合同对单最终 PR、共享 State DB 锁与 Restore v2 目标可互相导航; +- 固化基线测试与依赖审计,并消除现有 Vite 链的 high/moderate 告警; +- 不把目标合同描述为已经实现。 + +### 已完成基线:PR 1(阶段 0 原合同) - 以本文件作为已确认的架构基线; - 新增 ADR-0001~ADR-0010; @@ -2388,74 +2397,76 @@ Electron 只开放: - 更新 `AGENTS.md` 中的 ADR 入口; - 不改运行代码。 -### PR 2:Core Public API +### C1:Core Public API 与结构化错误 - 新增 `src/public-api.js`; - CLI 和 Web 改为只从 Public API 导入; -- 不移动核心模块; -- 原测试全绿。 - -### PR 3:结构化错误 - -- 统一 Error Code; +- 不移动核心模块或改变事务顺序; +- 统一 Canonical Error Code 与 Legacy Adapter; - 保持现有人类提示; -- Web 与 CLI 映射; -- 加错误合同测试。 +- 增加 Public API、错误合同和入口隔离测试。 -### PR 4:CLI `--json` +### C2:CLI `--json` -- Status JSON; -- Sync JSON; -- Exit Code 合同; -- 文档; -- 自动化测试。 +- Human Mode 保持 v0.5 兼容; +- JSON Mode stdout 只输出一个版本化 envelope,进度与诊断进入 stderr; +- 固定 JSON Mode Exit Code 并以真实子进程测试。 -### PR 5:Prepare / Apply +### C3:Prepare / Apply、协调器与双层锁 -- 先把现有 Web 的 Revision 逻辑下沉; -- `prepareSync`; -- `applySync`; +- 把 Web Revision 逻辑下沉为 Core Plan/Apply; +- Sync、Switch、Restore 使用短期、单次、锁内重校验的 planId; +- Node 与迁移期 .NET 实现 Codex Home → State DB resource 双层锁; +- Watch 合并事件并让位于人工操作; - CLI 内部仍一次完成; - 兼容现有命令。 -### PR 6:Workspace 与 Core 骨架 +### C4:Workspace、Contracts 与 Core Client - npm workspaces; - `packages/core`,先包装阶段 1 的 `src/public-api.js`,不改变业务行为; - `packages/contracts`; - `packages/core-client`; -- 不迁移 UI,不在同一 PR 搬迁 Core 内部模块。 +- 根 npm 包继续独立提供 Node 16 CLI,Electron 依赖不进入其 tarball。 -### PR 7:React UI 分解 +### C5:共享 React UI 与 Web 迁移 -- `AppShell`; -- `OverviewFeature`; -- `SyncFeature`; -- `HttpCoreClient`; -- Web UI 保持可用。 +- 建立 AppShell、Design System、九个 feature 页面、i18n 和主题; +- Web 通过 `HttpCoreClient` 复用 `app-ui`; +- 保留 pairing、Origin、Profile/Storage Revision、History 隐私边界。 -### PR 8:Electron Skeleton +### C6:Electron 安全骨架、Utility Runtime 与只读能力 - electron-vite; - electron-builder; -- Main/Preload/Renderer; -- 安全基线; -- Hello/Version 握手。 +- Main/Preload/Renderer/Core Utility Process 边界; +- 安全 BrowserWindow、白名单 IPC、Hello/Version 握手与 crash recovery; +- 只开放 Profile、Status、Backup、Diagnostics 和按需 History。 -### PR 9:Core Utility Process +### C7:Electron Sync / Switch -- Supervisor; -- Runtime Host; -- Status; -- Crash Test; -- Protocol Test。 +- 只经 Prepare/Confirm/Apply 开放写入; +- Provider 与三种 model 策略; +- Progress、Cancel、Partial、Backup-first 与安全 Fixture。 + +### C8:Restore / Watch / Diagnostics / Update + +- Restore v2 恢复前 snapshot、独立 journal、补偿与 ack reconciliation; +- Foreign Pending、Prune 保护、Watch 优先级、脱敏诊断包; +- Main-only 更新,写入或 Pending Recovery 时禁止安装。 + +### C9:打包、CI 与发布工程 + +- 四个目标平台产物、native SQLite、asar 审计、SBOM 与 checksums; +- Electron integration 与 packaged smoke 纳入唯一 `ci-gate`; +- CI 只生成候选 artifact,不自动发布。 -### PR 10:Read-only Preview Release +### C10:最终证据与 Legacy 交接 -- Windows/macOS/Linux package; -- GitHub prerelease; -- 使用说明; -- 反馈模板。 +- 同步最新 `main` 并重跑全部门禁; +- README 默认推荐 Electron,.NET 保留并标记 Legacy; +- 生成脱敏 evidence bundle; +- tag、npm/GitHub Release、签名、公证和更新通道继续等待单独授权。 --- @@ -2542,7 +2553,7 @@ Electron 只开放: 4. 不把业务规则写进 Renderer、Preload、IPC Handler; 5. 不新增第二套同步实现; 6. 不以“一次性翻译”为理由重写高风险 Core; -7. 一个 PR 只解决一个主要架构目标; +7. 默认一个 PR、或 ADR-0011 的一个内部 checkpoint,只解决一个主要架构目标; 8. 修改外部合同必须更新 Contract Test; 9. 修改安全流程必须补失败/回滚测试; 10. 不读取或输出 `auth.json`、Token、消息正文; @@ -2578,7 +2589,10 @@ docs/adr/ ├─ 0007-shared-ui-through-core-client.md ├─ 0008-incremental-migration-no-big-bang-rewrite.md ├─ 0009-plan-confirm-apply-for-writes.md -└─ 0010-electron-vite-and-electron-builder.md +├─ 0010-electron-vite-and-electron-builder.md +├─ 0011-v1-single-branch-single-final-pr.md +├─ 0012-dual-resource-lock-contract.md +└─ 0013-restore-v2-recovery-state-machine.md ``` ADR 一旦 Accepted,不应通过普通重构 PR 静默推翻。 diff --git a/docs/adr/0011-v1-single-branch-single-final-pr.md b/docs/adr/0011-v1-single-branch-single-final-pr.md new file mode 100644 index 0000000..69f0ae1 --- /dev/null +++ b/docs/adr/0011-v1-single-branch-single-final-pr.md @@ -0,0 +1,45 @@ +# vNext/ADR-0011:V1 单分支、单最终 PR 的受控交付例外 + +- Status: Accepted +- Date: 2026-08-25 +- Scope: V1 delivery governance + +## Context + +ADR-0008 的默认拓扑是小型、可独立合入的 PR。维护者已明确批准一次受控例外:V1 在单一 `V1` 分支中推进,并只创建一个最终 PR。该授权只改变合并拓扑,不改变 vNext 的安全、兼容、验证或发布门槛。 + +## Decision + +V1 使用本次批准计划中的不可变内部 Checkpoint `C0`~`C10`。旧执行索引中的 PR 2~PR 10 仅作为历史依赖来源,按以下方式并入新 checkpoint:Public API 与结构化错误归入 `C1`,CLI JSON 归入 `C2`,Prepare/Apply 与双层锁归入 `C3`,Workspace/Core/Contracts 归入 `C4`,共享 UI/Web 归入 `C5`,Electron Skeleton、Utility Runtime 和只读能力归入 `C6`,后续依次为 `C7` Sync/Switch、`C8` Restore/Watch/Diagnostics/Update、`C9` 打包/CI、`C10` 最终证据与 Legacy 交接。每个 checkpoint 必须有单独 commit、可重复 CI 证据、变更摘要和明确的上一个回退 commit。 + +最终 PR 必须保留这些 checkpoint 的线性、可审查历史。分支上的 checkpoint 可以标注“已验证”或“合入后可完成”,但在最终 PR 合入受保护分支前,不得把任一 Phase 标为 Completed、不得宣称 Electron 已替代 .NET,也不得删除 Legacy 实现或停止其关键 CI。 + +本 ADR 仅局部 supersede ADR-0008 的“每个主要维度必须以独立 PR 合入”这一合并拓扑。ADR-0008 的一个主要维度、可验证入口/退出条件、旧入口可用、测试/Fixture、.NET 保留、只读先行及差异登记等全部不变量继续有效。 + +## Invariants + +- 一个 checkpoint 只改变一个主要架构维度;不得把 Core 搬迁、TypeScript 翻译、算法变更、Electron 写能力和 Legacy 清理混在同一 checkpoint。 +- 每个 checkpoint 必须从干净输入重复运行其适用测试;跨运行时和三平台门槛仍以真实进程/packaged 证据为准,不能用 Mock 或分支声明替代。 +- V1 开始时和最终门禁前必须合并最新 `origin/main`,不得 rebase 或 force-push;若最终合并发生冲突,解决后必须重新验证全部适用证据。其他 checkpoint 只记录基线与回退 commit,不额外制造未经计划批准的合并要求。 +- Electron 写能力、Restore v2、Watch、默认桌面入口和 .NET 清理仍受执行索引对应退出门槛阻断。 +- 不得从 V1 分支对真实 Codex Home、真实凭据或真实消息正文进行测试、迁移或发布验证。 + +## Consequences + +该例外减少 PR 数量,但不减少审查单位;最终 PR 审查必须按 checkpoint 审阅。它增加主线漂移风险,因此需要 checkpoint 证据、频繁同步和可撤回的 feature gate。若真实 Beta、跨平台 package 或兼容门槛无法在最终合入前获得证据,V1 必须停在相应 checkpoint,不能用“单 PR 已获授权”绕过门槛。 + +## Rejected Alternatives + +- **把一条长提交链当作已完成的各阶段**:未合入受保护分支时,阶段状态和发布承诺不成立。 +- **用最终总 diff 代替 checkpoint 审查**:无法隔离安全回归或给出可靠回退点。 +- **为缩短分支周期放宽 Fixture、锁、Restore 或 packaged 验证**:与本 ADR 的授权范围不符。 + +## Migration and Validation + +执行索引记录 `C0`~`C10` 的目标、依赖、证据和回退点。每个 checkpoint 的验证必须更新适用合同和 Fixture;本 ADR 本身不表示任何运行时代码、错误适配、锁协议或 Restore v2 已实现。 + +## Related + +- [渐进迁移 ADR](0008-incremental-migration-no-big-bang-rewrite.md) +- [Node Core 单一权威 ADR](0002-node-core-as-single-authority.md) +- [迁移执行索引](../migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md) diff --git a/docs/adr/0012-dual-resource-lock-contract.md b/docs/adr/0012-dual-resource-lock-contract.md new file mode 100644 index 0000000..e420e6f --- /dev/null +++ b/docs/adr/0012-dual-resource-lock-contract.md @@ -0,0 +1,54 @@ +# vNext/ADR-0012:Codex Home 与 State DB 的双层资源锁合同 + +- Status: Accepted +- Date: 2026-08-25 +- Scope: vNext target lock contract; not implemented by v0.5 + +## Context + +现有入口以 Codex Home 为主要操作边界;但两个不同 Codex Home 可以解析到同一 SQLite Home。仅持有各自 Codex Home 锁时,两个写者仍可能并行修改同一 `state_5.sqlite`。UI 内的“操作中”状态不能提供跨进程或跨运行时互斥。 + +## Decision + +vNext 的每个写操作按解析后的双层资源身份协调: + +1. **Codex Home lock**:绝对规范化的 Codex Home identity,锁路径固定为 `/tmp/provider-sync.lock`;它保护 config、rollout、global state、backup root 和同一 Codex Home 的操作顺序。 +2. **State DB resource lock**:保护最终解析出的权威 `state_5.sqlite`,且独立于 Codex Home identity。资源身份由数据库物理父目录的 `realpath` 与规范化文件名组成;Windows 对完整 identity 进行大小写折叠。数据库存在时使用最终物理路径;Restore 将创建缺失数据库时,先可靠解析父目录,再使用父目录与 basename。无法证明父目录、重解析点或最终目标身份时返回 `LOCK_UNVERIFIABLE`。 + +State DB resource lock 路径固定为: + +```text +/.codex-provider-sync/locks/.lock +``` + +Hash 输入使用 UTF-8 编码的规范化 resource identity;Node 与 .NET 必须产生相同小写十六进制 SHA-256。锁继续使用 protocol v2 的 canonical owner/claims/instance identity;owner/claim 可增加可选 `scope` 与 `resourceKey` 字段,旧 v2 reader 必须仍能读取基础字段并 fail closed。 + +需要 SQLite 的写操作必须按以下顺序执行:获取 Codex Home lock → 在 Home lock 内重新读取 config 并解析权威 State DB → 建立物理 resource identity → 获取 State DB resource lock → 在两锁内重新校验 Revision、pending journal 和 SQLite writable → 创建 backup → mutation/验证/终结 journal → 逆序释放锁。两个锁必须一直持有到 journal 落入耐久终态。`prune-backups` 仅获取 Codex Home lock;Status/History 不获取写锁;Watch 不长期持锁,而是每次 apply 按同一顺序获取。Windows WSL UNC 等不受支持路径在创建任一 backup、journal 或业务 mutation 前失败。 + +Node、迁移期 .NET、CLI、Web、Electron Runtime 必须使用相同锁路径、identity/hash 规则、owner metadata schema、持有周期和冲突语义。现有 protocol v2 Codex Home lock 兼容测试继续是迁移门槛;引入 State DB resource lock 时,双方必须通过真实争锁测试,之后才能宣称双层锁合同成立。 + +## Error Semantics + +- 已证明存在活跃、兼容的 owner 时返回 `OPERATION_BUSY`,`details.busyScope` 为 `codex-home` 或 `state-db`。 +- owner、协议、进程启动身份、锁目录/resource identity 或 ABA 状态不可验证时返回 `LOCK_UNVERIFIABLE`,并保留 `details.lockScope`;不得自动删除锁目录或降级为 Busy。 +- 已获取资源锁但 SQLite 引擎仍拒绝写入时返回 `SQLITE_BUSY`;它不等同于资源锁冲突。 +- 获锁后的 pending journal 返回 `PENDING_TRANSACTION` 或 `RECOVERY_REQUIRED`;该错误优先于普通写入。 +- lock path 创建/访问被拒绝时返回 `PERMISSION_DENIED`,而不是假装无竞争者。 + +## Invariants + +- 锁不是 backup 或 journal 的替代物;获得两锁不允许跳过 Plan、Revision、Backup-first、transaction journal 或验证。 +- 同一 State DB 的败方不得创建 backup、journal、config/rollout/SQLite/global-state mutation,且所有原始 Hash 保持不变。 +- 任一正式入口不得自行发明锁路径、只靠 UI 禁用按钮,或在持有 State DB resource lock 后再以相反顺序等待 Codex Home lock。 +- 当前 v0.5 单层行为仍是现状事实;本文不声称它已实现双层锁。 + +## Migration and Validation + +实现前必须完成 `node-dotnet-lock-contention`、`shared-sqlite-home-contention`、双层 lock-order/deadlock、`lock-unverifiable` 和 Windows UNC 无写入 Fixture。真实 Node/.NET 进程必须在同一临时资源上争锁;Mock 不足以证明兼容。任何旧协议的兼容读取或拒绝策略必须有独立 Fixture 和差异登记。 + +## Related + +- [Core 单一权威 ADR](0002-node-core-as-single-authority.md) +- [Plan / Confirm / Apply ADR](0009-plan-confirm-apply-for-writes.md) +- [Error Code 合同](../architecture/contracts/ERROR_CODES_ZH.md) +- [行为 Fixtures](../migration/BEHAVIOR_FIXTURES_ZH.md) diff --git a/docs/adr/0013-restore-v2-recovery-state-machine.md b/docs/adr/0013-restore-v2-recovery-state-machine.md new file mode 100644 index 0000000..6f6d153 --- /dev/null +++ b/docs/adr/0013-restore-v2-recovery-state-machine.md @@ -0,0 +1,62 @@ +# vNext/ADR-0013:Restore v2 的恢复前快照与独立 Journal 状态机 + +- Status: Accepted +- Date: 2026-08-25 +- Scope: vNext target Restore contract; not implemented by v0.5 + +## Context + +v0.5 Restore 会校验被选中的受管 backup 与已有 journal,但不会在恢复前创建新的 snapshot,也没有独立的 restore journal。若 config、global state、SQLite 或 rollout 已部分替换后进程崩溃,不能以与 Sync 相同的证据自动补偿。该已知安全债已在 Core 外部行为合同中记录。 + +## Decision + +Restore v2 在任何目标 mutation 前,必须在目标 Codex Home 的 managed backup root 创建一个**恢复前 snapshot**,并为这一次 Restore 创建独立、持久、追加式的 restore operation journal。该 snapshot 记录恢复前的允许目标、SQLite Home/DB identity、source backup identity、manifest hash、目标清单和 hashes;它不是对用户所选 source backup 的就地修改,也不改变 source backup v1/v2 的可恢复格式。 + +Restore v2 先校验 source backup、relocation 授权和目标边界,再取得 ADR-0012 所定义的资源锁;在锁内重新验证 preflight snapshot、storage identity、pending journal 和可写性,随后才创建恢复前 snapshot 和 journal。任何 snapshot 失败必须在 mutation boundary 前以 `BACKUP_FAILED` 或更具体错误失败。 + +## Restore Journal State Machine + +每个 Restore v2 journal 具有独立 `operationId`、`operationKind=restore`、source backup identity、pre-restore snapshot identity 和 schema/protocol version。其持久状态只允许: + +```text +prepared + -> applying + -> committing + -> committed-pending-ack + -> completed + +prepared | applying | committing + -> rollback-pending + -> rolled-back + or recovery-required +``` + +`completed`、`rolled-back` 与 `recovery-required` 是耐久终态。`committed-pending-ack` 表示目标内容已经提交,但调用方尚未完成终态确认:恢复流程必须重新读取 journal、核对 operationId、目标 manifest 与 hashes,然后只允许前进到 `completed`;不得在该窗口对已提交目标启动补偿。若无法证明目标与 manifest 一致,则进入 `recovery-required` 并保留 snapshot、journal、source backup 和已完成/未完成 targets。 + +兼容读取规则固定为:旧 v1 `committed` 投影为 v2 `completed`,旧 `rolledBack` 投影为 `rolled-back`,旧 `recoveryRequired` 投影为 `recovery-required`;不得把历史 v1 `committed` 解释为 `committed-pending-ack`。v2 reader 必须能读取 v1;旧 reader 遇到未知 v2 schema 时必须 fail closed,不得改写 journal。 + +## Compensation, Crash and Foreign Pending Rules + +- mutation 或 crash 发生在 `prepared`、`applying`、`committing` 或 `rollback-pending` 时,后续普通写入必须被阻断;显式 recovery 依据 pre-restore snapshot 执行补偿,成功后将本 Restore journal 收敛到 `rolled-back`。 +- 补偿失败、目标 identity 改变、snapshot 覆盖不足或 journal 尾部不可信时,必须保留全部证据并返回 `RECOVERY_REQUIRED`;不得无 journal 地报告部分成功。 +- 只有与所选 source backup 明确绑定、且本次 Restore 覆盖其全部必要目标的 pending journal 才能由该 Restore 收敛;其他 foreign pending 保持 recovery blocker,不得被顺带清除或忽略。可执行恢复时,当前 Restore 仍创建自己的 pre-restore snapshot 和 journal。 +- Node 与 .NET 都必须识别对方生成的 Restore v2 journal、source backup v1/v2 和 terminal 语义;未知 schema/version 必须 fail closed,而非解析 message 或猜测状态。 +- 用户取消只允许在 Core 定义的安全点;取消后的 journal 是否需要恢复由 durable journal 状态决定,而不是由取消信号本身决定。 + +## Invariants + +- Restore v2 继续保留现有 restore options、relocation 双重授权以及 relocation 时不恢复旧 config 的规则。 +- Restore v2 不读取/复制认证数据、Token 或消息正文;所有测试只使用临时 Fixture。 +- Prune 不得删除 source backup、恢复前 snapshot 或任一非 terminal Restore journal 引用的 backup。 +- 本 ADR 不把 v0.5 Restore 描述为已经事务化;实现和 release 仍受执行索引阶段 5 门槛约束。 + +## Migration and Validation + +必须以真实 crash/fault-injection 验证恢复前 snapshot 失败、每个 journal 状态窗口、commit/rollback acknowledgement、restore-mid-failure、foreign pending 与 Node/.NET 双向恢复。仅当这些证据通过后,才可开放 Electron Restore 或宣称跨入口 Recovery 等价。 + +## Related + +- [Plan / Confirm / Apply ADR](0009-plan-confirm-apply-for-writes.md) +- [双层资源锁 ADR](0012-dual-resource-lock-contract.md) +- [Core 外部行为合同](../architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md) +- [行为 Fixtures](../migration/BEHAVIOR_FIXTURES_ZH.md) diff --git a/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md b/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md index 319a3d3..ac13282 100644 --- a/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md +++ b/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md @@ -103,6 +103,12 @@ Web Profile 虽然不是 CLI,其显式 SQLite Home 仍沿用现有来源值 `c - Windows WSL UNC SQLite Home 不允许安全读写,写操作必须在备份和其他 mutation 之前失败; - 不得因为某个候选 DB 存在,就同时改写多个数据库。 +### 3.4 vNext 目标:双层资源锁(未实现) + +v0.5 当前以 Codex Home operation lock 为现状事实;它尚未实现共享 State DB 的独立资源锁。vNext 的目标合同由 [ADR-0012](../../adr/0012-dual-resource-lock-contract.md) 冻结:会修改 SQLite 的操作在同一 Codex Home lock 之外还必须持有按物理 DB identity 计算的 State DB resource lock,并以固定顺序在锁内重新校验 storage、Revision、pending journal 和可写性。 + +该目标不改变本节的 storage 优先级,也不授权当前入口扩展写入。双层 lock 的 Node/.NET 兼容、owner metadata、Busy/不可验证错误和 Hash 无副作用证据属于后续实现与 Fixture 门槛。 + ## 4. `getStatus` ### 4.1 当前输入 @@ -412,7 +418,13 @@ platform? - 当前恢复目标已落盘但 rolledBack terminal 标记失败时,调用方只会收到失败,不能据此证明目标未恢复或 Journal 已收敛;vNext 必须增加 commit/terminal acknowledgement reconciliation; - 补齐安全机制时必须继续兼容 v1/v2 旧备份格式和现有 restore 选项。 -### 7.4 当前结果 +### 7.4 vNext Restore v2 目标(未实现) + +[ADR-0013](../../adr/0013-restore-v2-recovery-state-machine.md) 冻结 Restore v2 的目标:在任何 restore mutation 前创建独立的恢复前 snapshot,并用独立 restore operation journal 记录 source backup、目标清单、每目标状态和 durable terminal。`prepared/applying/committing/rollback-pending` crash 必须由显式 recovery 依据该 snapshot 补偿;`committed-pending-ack` 必须按目标 Hash 前进到 `completed` 或 `recovery-required`,不得对已提交目标启动反向补偿。 + +当前 `runRestore` 仍是 7.3 所述 v0.5 行为。source backup v1/v2、现有 restore options、relocation 双重授权和 foreign pending 处理必须保持兼容;未知 journal/schema 必须 fail closed,不能依赖 message 推断结果。 + +### 7.5 当前结果 成功时返回经过验证的备份 `metadata.json` payload。v2 托管备份通常包含: @@ -600,10 +612,7 @@ firstUserMessage 正式 operation lock 当前按 Codex Home 定位。因此,两个不同 Codex Home 如果显式解析到同一个 SQLite Home/同一个 `state_5.sqlite`,会获得不同的 operation lock,当前实现不能阻止它们并发修改同一数据库。 -该行为是已知并发盲区,不是允许并发的合同。vNext 在宣称多 Profile 安全前必须二选一并形成 ADR: - -- 对规范化后的 SQLite 资源增加跨 Codex Home 的 resource lock;或 -- 检测共享目标并 fail closed,要求用户串行处理。 +该行为是已知并发盲区,不是允许并发的合同。ADR-0012 已冻结 vNext 选择:对规范化后的 SQLite 资源增加跨 Codex Home 的 resource lock;在该合同完成真实跨运行时验证前,任何入口仍不得宣称多 Profile/shared SQLite 写入安全。 在此问题解决前,测试和文档不得把“不同 Profile/Codex Home”直接等同于“不同存储资源”。 diff --git a/docs/architecture/contracts/ERROR_CODES_ZH.md b/docs/architecture/contracts/ERROR_CODES_ZH.md index a1938b8..6592de3 100644 --- a/docs/architecture/contracts/ERROR_CODES_ZH.md +++ b/docs/architecture/contracts/ERROR_CODES_ZH.md @@ -49,7 +49,7 @@ interface CoreErrorDto { | `INVALID_INPUT` | 输入缺失、互斥参数、格式或范围无效 | error | 修改输入后是 | 否 | | `PROFILE_CHANGED` | 已确认的 Profile Revision 已变化 | warning | 重新读取并确认后是 | 否 | | `STORAGE_CHANGED` | 已确认的存储解析结果或 Revision 已变化 | warning | 重新准备 Plan 后是 | 否 | -| `PLAN_STALE` | Plan 绑定的文件、目标或指纹已变化 | warning | 重新准备 Plan 后是 | 否 | +| `PLAN_STALE` | 现有/过渡入口用于表示 Plan 绑定的文件、目标或指纹已变化;vNext Prepare/Apply 统一映射为 `STALE_STATE` | warning | 重新准备 Plan 后是 | 否 | | `CODEX_HOME_NOT_FOUND` | Codex Home 不存在或不可解析 | error | 修正路径后是 | 否 | | `STATE_DB_NOT_FOUND` | 权威 SQLite Home 中缺少要求存在的 `state_5.sqlite` | error | 修复目标后是 | 否 | | `SQLITE_UNSUPPORTED_PATH` | 当前平台不能安全访问该 SQLite 路径,例如 Windows WSL UNC | error | 更换执行环境或路径后是 | 否 | @@ -75,11 +75,18 @@ interface CoreErrorDto { | Code | 补充原因 | Severity | Retryable | Recovery Required | | --- | --- | --- | --- | --- | -| `PLAN_EXPIRED` | Plan 已有明确的过期时间和重新准备动作;它与存储内容变化导致的 `PLAN_STALE` 不同 | warning | 重新准备 Plan 后是 | 否 | +| `PLAN_EXPIRED` | Plan 已有明确的过期时间和重新准备动作;它与状态漂移导致的 `STALE_STATE` 不同 | warning | 重新准备 Plan 后是 | 否 | +| `STALE_STATE` | Apply 加锁后发现 profile/config/rollout/state DB 或 storage revision 与 Plan 不一致 | warning | 重新准备 Plan 后是 | 否 | | `LOCK_UNVERIFIABLE` | 无法可靠验证锁所有者、进程启动身份、协议版本或锁目录身份;不能误判为普通 Busy,也不能冒险删除 | error | 消除不确定状态后是 | 否 | `LOCK_UNVERIFIABLE` 必须 fail closed。只有确认存在活跃冲突所有者时才使用 `OPERATION_BUSY`;未来协议、损坏 owner、身份读取失败或 ABA/目录身份不确定均使用 `LOCK_UNVERIFIABLE`。用户提示不得建议盲目删除锁目录。 +ADR-0012 的双层资源锁实现后,`OPERATION_BUSY.details.busyScope` 必须为 `codex-home` 或 `state-db`,`LOCK_UNVERIFIABLE.details.lockScope` 必须标示同一范围;SQLite 引擎在资源锁已获得后仍 busy 时继续使用 `SQLITE_BUSY`。这些字段是 vNext 目标,不表示当前入口已发出它们。 + +vNext Prepare/Apply 对任何加锁后 revision 漂移只发出 `STALE_STATE`,并可用安全的 `details.reason=profile|config|storage|rollout|state-db` 说明维度。`PLAN_STALE`、`PROFILE_CHANGED` 与 `STORAGE_CHANGED` 在旧 Web/适配器完成迁移前仍可读取,但不得成为新 CoreClient/IPC 的稳定写操作结果。 + +ADR-0013 的 Restore v2 实现后,非 terminal restore operation journal 使用 `PENDING_TRANSACTION` 或 `RECOVERY_REQUIRED`;`details` 可安全包含 `operationKind=restore`、operationId、source backup identity、pre-restore snapshot identity 和 completed/uncompleted target 摘要,但不得包含消息正文、认证信息或任意原始路径。 + ## 4. Legacy Surface 现状 ### 4.1 Node Core / CLI @@ -125,12 +132,12 @@ interface CoreErrorDto { | `RECOVERY_REQUIRED`、`recovery_required` | `RECOVERY_REQUIRED` | 保留备份路径、operationId 与恢复要求 | | `SYNC_FAILED_ROLLED_BACK`、`sync_failed_rolled_back` | `SYNC_FAILED_ROLLED_BACK` | `recoveryRequired=false`,保留 rollback status | | `ABORT_ERR`、`cancelled` | `OPERATION_CANCELLED` | 映射前检查 Journal;不能仅凭取消认定无需恢复 | -| `TARGET_BUSY`、`target_busy`、`operation_busy` | `OPERATION_BUSY` | 仅适用于已证明存在活跃竞争者;用 `details.busyScope` 区分 coordinator/target | -| 锁 owner/协议/进程身份无法验证,未来协议或目录身份不确定 | `LOCK_UNVERIFIABLE` | 必须 fail closed,不得降级为 Busy 或自动清锁 | -| `plan_stale` | `PLAN_STALE` | 调用方必须丢弃旧 Plan | +| `TARGET_BUSY`、`target_busy`、`operation_busy` | `OPERATION_BUSY` | 仅适用于已证明存在活跃竞争者;vNext 用 `details.busyScope=codex-home|state-db` 区分资源范围 | +| 锁 owner/协议/进程身份无法验证,未来协议或目录身份不确定 | `LOCK_UNVERIFIABLE` | 必须 fail closed;vNext 用 `details.lockScope=codex-home|state-db`;不得降级为 Busy 或自动清锁 | +| `plan_stale`、`PLAN_STALE` | `STALE_STATE` | Prepare/Apply 调用方必须丢弃旧 Plan;旧直连 Web 入口迁移前可保留原码 | | `plan_expired` | `PLAN_EXPIRED` | 调用方必须重新生成 Plan | -| `PROFILE_CHANGED` | `PROFILE_CHANGED` | Web/Client 刷新 Profile 后重新确认 | -| `STORAGE_CHANGED` | `STORAGE_CHANGED` | 重新解析 Storage 与 Revision | +| `PROFILE_CHANGED` | `STALE_STATE` | Prepare/Apply 使用 `details.reason=profile`;旧直连 Web 入口迁移前可保留原码 | +| `STORAGE_CHANGED` | `STALE_STATE` | Prepare/Apply 使用 `details.reason=storage`;旧直连 Web 入口迁移前可保留原码 | | `operation_failed` | 优先映射具体码,否则 `INTERNAL_ERROR` | 禁止把所有失败永久折叠为 `INTERNAL_ERROR` | | Node/OS `ENOENT` | 由操作上下文映射 | Codex Home、State DB、Backup 的缺失必须分别分类 | | Node/OS `EACCES`、`EPERM` | `PERMISSION_DENIED` | 原始系统码可放入安全 details | diff --git a/docs/migration/BEHAVIOR_FIXTURES_ZH.md b/docs/migration/BEHAVIOR_FIXTURES_ZH.md index bfc2ca1..ced7935 100644 --- a/docs/migration/BEHAVIOR_FIXTURES_ZH.md +++ b/docs/migration/BEHAVIOR_FIXTURES_ZH.md @@ -69,14 +69,20 @@ Fixture 不是用户数据样本,严禁从真实 `~/.codex`、认证文件或 | Fixture ID | 运行方式 | 关键预期 / 安全门槛 | | --- | --- | --- | | `locked-rollout` | 平台真实文件锁 | 锁定文件不被写;其他安全目标可形成 Partial Result;返回 `ROLLOUT_LOCKED` 语义并可重试 | -| `active-rollout-changing` | 扫描后、应用前改变目标 | 变化文件被跳过或 Plan 失效;不覆盖 Codex 新写入,使用 `ROLLOUT_CHANGED`/`PLAN_STALE` | +| `active-rollout-changing` | 扫描后、应用前改变目标 | 变化文件被跳过或 Plan 失效;不覆盖 Codex 新写入;Prepare/Apply 返回 `STALE_STATE`(`details.reason=rollout`),旧直连入口可保留 `ROLLOUT_CHANGED` | | `sqlite-busy` | 真实 SQLite 写锁 | 在 rollout mutation 和 Backup 前阻断,返回 `SQLITE_BUSY`,全部原始 Hash 不变 | | `node-dotnet-lock-contention` | 启动真实 Node 与 .NET 进程争用同一 `/tmp/provider-sync.lock` | 恰有一个写者获得 protocol v2 锁;另一方为 `OPERATION_BUSY`;败方不创建 Backup、不改任何目标 | | `shared-sqlite-home-contention` | 两个不同 Codex Home 指向同一 SQLite Home,并发写 | 不能因 Codex Home 锁不同而同时写同一 DB;阶段 1 必须验证/裁决共享资源锁,在通过前不得开放 Electron 写能力 | +| `dual-resource-lock-order` | 两个 Codex Home 与一个 SQLite Home 由 Node/.NET 交叉并发写 | 两层 lock 路径和顺序一致;不死锁;恰有一个 SQLite writer;败方无 Backup、Journal 或业务 mutation | +| `sqlite-resource-lock-unverifiable` | State DB resource lock 的 owner、协议、物理路径 identity 或 ABA 状态不可验证 | fail closed,返回 `LOCK_UNVERIFIABLE` 且范围为 state-db;不得自动删除或降级为 Busy | | `lock-unverifiable` | future protocol、损坏 owner、进程启动身份不可读、ABA/目录身份变化 | fail closed,返回 `LOCK_UNVERIFIABLE`;不得误报普通 Busy,不得自动删除不可证明归属的锁 | | `pending-journal` | Managed Backup 中存在未终结 Journal | Status 可读并暴露恢复证据;Sync/Switch 被 `PENDING_TRANSACTION`/`RECOVERY_REQUIRED` 阻断。Prune 仍可作为 recovery-safe maintenance 执行,但必须保护所有 Pending Journal 引用的备份 | | `foreign-pending-restore` | Node 创建 Pending Journal/Backup 后由 .NET Restore,及反方向 | 两个方向都只按受管清单恢复,清除 Pending 前必须落入合法 terminal;差异需显式裁决 | | `restore-mid-failure` | Restore 在某一目标已替换后注入失败 | 不能报告成功;必须完整补偿,或保留可操作证据并返回 `RECOVERY_REQUIRED`,不得留下无 Journal 的半恢复状态 | +| `restore-v2-pre-snapshot-failure` | Restore v2 的恢复前 snapshot 在任何目标 mutation 前失败 | `BACKUP_FAILED` 或更具体失败;不创建 restore mutation,source backup 与原始目标 Hash 不变 | +| `restore-v2-journal-crash-matrix` | Restore v2 在 prepared/applying/committing/committed-pending-ack/rollback-pending 和 ack 窗口终止 | 非 terminal 阻断普通写并可由 pre-restore snapshot 或目标 hash 显式收敛;completed/rolled-back/recovery-required 经重新读取确认,不能反向改写 terminal | +| `restore-v2-foreign-pending` | Node 与 .NET 用对方 source backup 的 pending journal 触发 Restore v2 | 先验证 foreign manifest/journal 与目标边界;当前 Restore 仍创建自身 snapshot/journal;未知版本 fail closed | +| `restore-v2-ack-reconciliation` | `committed-pending-ack` 已持久化但 API acknowledgement/observer 失败 | 不把已提交 Restore 报为可回滚失败;重新读取 journal 与目标 Hash 后收敛到 `completed` 或 `recovery-required` | | `bidirectional-backup-roundtrip` | Node Backup→.NET Restore;.NET Backup→Node Restore | 两个方向恢复到等价语义状态;正文和不应变化字段逐字节一致;Metadata v1/v2 兼容边界明确 | | `journal-crash-matrix` | 在 prepared/applying/applied/commit/rollback 及 ack 窗口真实终止进程 | durable terminal 优先;非 terminal 阻断后续写;不得对 committed 状态补回滚事件;显式 Restore 可收敛 | | `rollback-recovery-required` | mutation 后使自动 rollback 的一个或多个目标失败 | 原始错误与所有 rollback error 均保留;Backup、completed/uncompleted targets 和 `RECOVERY_REQUIRED` 可用于人工恢复 | diff --git a/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md b/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md index 1f9ccdc..21367c4 100644 --- a/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md +++ b/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md @@ -1,6 +1,6 @@ # vNext 升级改造执行索引 -> **状态:阶段 0 交付完成(合入 `main` 后生效)** +> **状态:受保护分支上的阶段 0 已完成;V1 的 C0 checkpoint 在单最终 PR 合入前不推进任何后续 Phase 状态。** > > **日期:2026-08-24** > @@ -21,7 +21,7 @@ 5. [行为兼容 Fixture 清单](BEHAVIOR_FIXTURES_ZH.md); 6. 本执行索引中的阶段状态。 -发生冲突时必须先登记差异并裁决,不能让后提交的新实现自动成为权威。 +发生冲突时必须先登记差异并裁决,不能让后提交的新实现自动成为权威。ADR-0011 的 V1 合并拓扑例外只改变 checkpoint 的承载方式,不改变本权威顺序。 ## 2. 总体状态 @@ -36,7 +36,15 @@ | 6 | Electron Stable,替代 .NET | Pending | Electron 成为默认桌面产品,.NET 标记 Legacy | | 7 | 清理 Legacy | Pending | 移出重复 .NET 业务代码,保留历史标签、分支和迁移说明 | -状态只能按 `Pending → In Progress → Completed` 前进。PR 分支可以把自身交付标为“合入后 Completed”,但受保护分支上的阶段只有在退出门槛全部满足并完成合并后才正式生效。 +状态只能按 `Pending → In Progress → Completed` 前进。V1 的 `C0`~`C10` 仅是内部 checkpoint:可记录“已验证”或“合入后 Completed”,但在最终 PR 合入受保护分支前,Phase 1~7 仍为 Pending 或 In Progress,不能标记 Completed。 + +## 2.1 V1 单最终 PR checkpoint 治理 + +- 本分支受 [ADR-0011](../adr/0011-v1-single-branch-single-final-pr.md) 约束:`C0`~`C10` 采用批准计划中的合并后编号;旧 PR 2~PR 10 只保留为依赖与安全意图来源。 +- 每个 checkpoint 必须记录 commit SHA、范围、适用测试/Fixture、真实平台证据、未满足 gate 和上一个可回退 commit;最终 PR 审查按 checkpoint 进行。 +- checkpoint 通过不自动开放下一阶段能力:Electron 写、Restore v2、Watch、默认桌面入口和 Legacy 清理由本索引的对应退出门槛继续阻断。 +- checkpoint 无法在同步 `main` 后重放或复验时,停止在最近已验证 checkpoint;不得以合并拓扑例外跳过差异登记、Fixture 或发布验证。 +- 在 V1 分支内,本索引中“进入条件:上一 Phase Completed”表示相应前序 checkpoint 的全部证据已验证;它不改变受保护分支上该 Phase 仍未 Completed 的状态。 ## 3. 阶段门槛 @@ -49,7 +57,7 @@ 退出门槛: -- ADR-0001~ADR-0010 均为 Accepted,历史 v0.4 ADR 不与 vNext 编号混淆; +- ADR-0001~ADR-0013 均为 Accepted,历史 v0.4 ADR 不与 vNext 编号混淆; - Core 外部行为、CLI、Error Code、Fixture 和本索引可互相导航; - 每份文档明确“当前已实现”与“vNext 目标”; - 本阶段不修改运行代码、CLI 输出、Error Class 或运行代码目录结构; @@ -63,7 +71,7 @@ - 新增 `src/public-api.js`,CLI/Web 不再导入 Core 内部实现; - 展示逻辑与业务结果分离,现有用户可见语义不变; -- PR 2~PR 5 均已完成:Public API、结构化错误、CLI `--json` 与 Prepare/Apply 已分别落地; +- C1~C3 均已完成:Public API/结构化错误、CLI `--json`、Prepare/Apply 与双层锁已分别落地; - CLI `--json` 是 opt-in 加法;默认 Human Mode、命令语义和 v0.5 兼容行为保持不变; - 原 Node 测试全绿,新增 Public API Contract Test; - 真实 Node↔.NET 对同一 Codex Home 的 protocol v2 操作锁争用通过:恰有一个写者,败方无副作用; @@ -148,33 +156,34 @@ - 删除的只是重复业务实现,不删除 Node CLI; - 仓库文档、依赖图、发布脚本和安全说明不再引用已移除路径。 -## 4. 首批 PR 依赖 +## 4. V1 checkpoint 依赖 -| PR | 内容 | 依赖 | 关键合入门槛 | 状态 | +| Checkpoint | 内容 | 依赖 | 最终合入前必须保留的证据 | V1 状态 | | --- | --- | --- | --- | --- | -| PR 1 | 冻结架构合同和 ADR | 无 | 仅文档;阶段 0 退出门槛 | **Completed(合入 `main` 后)** | -| PR 2 | Core Public API | PR 1 | CLI/Web 仅走 Public API;现有测试全绿;锁合同验证 | Pending | -| PR 3 | 结构化错误 | PR 2 | Canonical/Legacy Adapter、`LOCK_UNVERIFIABLE`、错误合同测试 | Pending | -| PR 4 | CLI `--json` | PR 2、PR 3 | stdout 单一 JSON、stderr 日志、Exit Code 与 Schema 合同 | Pending | -| PR 5 | Prepare / Apply | PR 2、PR 3 | Revision/Plan/Apply 下沉;CLI Human Mode 兼容 | Pending | -| PR 6 | Workspace 与 Core 骨架 | PR 2~PR 5(阶段 1 Completed) | workspaces/Core/Contracts/CoreClient 骨架;不搬 UI、不改算法 | Pending | -| PR 7 | React UI 分解 | PR 6 | AppShell/Feature/HttpCoreClient;现有 Web UI 可用;阶段 2 退出门槛 | Pending | -| PR 8 | Electron Skeleton | PR 7(阶段 2 Completed) | Main/Preload/Renderer 安全基线与版本握手;无业务写 | Pending | -| PR 9 | Core Utility Process | PR 8 | Supervisor、Status、Crash/Protocol Test;Pending Journal 检查 | Pending | -| PR 10 | Read-only Preview Release | PR 9 | 三平台 package、只读 smoke、使用说明和反馈模板;阶段 3 退出门槛 | Pending | +| C0 | 治理、基线与依赖安全 | 阶段 0 | ADR-0011~0013、合同导航、基线测试、Vite 审计告警清零 | In Progress(V1) | +| C1 | Core Public API 与结构化错误 | C0 | CLI/Web 仅走 Public API;Canonical/Legacy Adapter;错误合同测试 | Pending | +| C2 | CLI `--json` | C1 | stdout 单一 JSON、stderr 日志、JSON Exit Code 与 Schema 合同 | Pending | +| C3 | Prepare/Apply、协调器与双层锁 | C1、C2 | Revision/Plan/Apply、Node/.NET 双层资源锁、真实争锁证据 | Pending | +| C4 | Workspace、Core、Contracts、CoreClient | C1~C3(Phase 1 全部门槛已验证) | 不搬高风险算法;根 npm CLI tarball/Node 16 兼容 | Pending | +| C5 | 共享 React UI 与 Web | C4 | AppShell/Features/HttpCoreClient;Web 安全与功能等价;阶段 2 门槛 | Pending | +| C6 | Electron 安全骨架、Utility Runtime、只读能力 | C5(Phase 2 全部门槛已验证) | 安全窗口/IPC、握手、crash recovery、三平台只读 smoke | Pending | +| C7 | Electron Sync/Switch | C6(Phase 3 全部门槛已验证) | Prepare/Apply、Busy/Partial/Cancel、Backup/Restore 回环 | Pending | +| C8 | Restore/Watch/Diagnostics/Update | C7(Phase 4 全部门槛已验证) | Restore v2 crash matrix、foreign pending、诊断隐私、Watch/Update | Pending | +| C9 | 打包、CI 与发布工程 | C8(Phase 5 全部门槛已验证) | 四目标产物、native SQLite、packaged smoke、SBOM/checksums | Pending | +| C10 | 最终证据与 Legacy 交接 | C9 | evidence bundle、README/Legacy、全量门禁;不自动发布 | Pending | -PR 4 与 PR 5 可在 PR 2/3 后并行开发;两者都完成后才能进入 PR 6。PR 6~PR 10 按阶段门槛顺序推进,不能用“只搭骨架”绕过上一阶段的退出条件。 +`C0`~`C10` 按表中依赖和阶段门槛推进,不能用“只搭骨架”绕过上一阶段的退出条件。Checkpoint 内可以有若干小提交,但最终 evidence 必须绑定一个明确 commit。 -PR 到阶段的归属固定为:PR 1 完成阶段 0;PR 2~PR 5 完成阶段 1;PR 6~PR 7 完成阶段 2;PR 8~PR 10 完成阶段 3。阶段 4 之后的 PR 编号在 Read-only Preview 证据完成后确定。 +checkpoint 到阶段的归属固定为:C0 不推进运行 Phase;C1~C3 的完整证据在最终合入后可完成阶段 1;C4~C5 可完成阶段 2;C6 可完成阶段 3;C7 可完成阶段 4;C8 可完成阶段 5;C9~C10 只能形成阶段 6 的 release-ready 证据。阶段 6 仍需真实 Beta、签名/公证与单独授权的发布验证;阶段 7 不属于本 PR。 -阶段 4 之后的写入、Restore/Watch、Stable 与 Legacy 清理 PR,在 Read-only Preview 证据完成后再编号,避免提前承诺不可靠的拆分。 +任何 checkpoint 只有代码、合同、Fixture、CI 和适用真实平台证据同时闭合后才能标记已验证;分支内通过不等于公开发布或稳定用户验证完成。 ## 5. 跨阶段安全门槛矩阵 | 安全证据 | 最晚完成阶段 | 阻断内容 | | --- | --- | --- | | 真实 Node↔.NET 同 Codex Home 争锁 | 阶段 1 | 阻断“迁移期入口共享安全锁合同”的声明 | -| Busy 与不可验证锁的结构化区分 | 阶段 1/PR 3 | 阻断自动重试、自动清锁和 Electron 写入 | +| Busy 与不可验证锁的结构化区分 | 阶段 1/C3 | 阻断自动重试、自动清锁和 Electron 写入 | | 不同 Codex Home 共享 SQLite Home 的互斥 | 阶段 4 进入前 | 阻断所有 Electron 写能力 | | 双向 Backup Round-trip | 阶段 2 建证、阶段 5 全通过 | 阻断 .NET Legacy 替代 | | Foreign Pending Restore | 阶段 2 建证、阶段 5 全通过 | 阻断跨入口 Recovery 声明 | @@ -208,4 +217,4 @@ Node 与 .NET 在同一 Fixture 上不一致时,PR 必须记录: ## 8. 本 PR 完成后的下一步 -阶段 0 合入并标记 Completed 后,下一项是 PR 2:新增 `src/public-api.js`,让 CLI 与 Web 经单一公开入口调用现有 Node 行为。该 PR 不移动 Core、不改同步算法,也不同时引入 `--json`、TypeScript 或 Electron。 +V1 的下一项是 `C1`:新增 `src/public-api.js`,让 CLI 与 Web 经单一公开入口调用现有 Node 行为,并建立结构化错误边界。该 checkpoint 不移动 Core、不改同步算法,也不同时引入 `--json`、TypeScript 或 Electron;其验证不使 Phase 1 在最终 PR 合入前 Completed。 diff --git a/docs/migration/evidence/C0_BASELINE_2026-08-25.md b/docs/migration/evidence/C0_BASELINE_2026-08-25.md new file mode 100644 index 0000000..79b9b10 --- /dev/null +++ b/docs/migration/evidence/C0_BASELINE_2026-08-25.md @@ -0,0 +1,40 @@ +# C0 基线与治理证据(2026-08-25) + +状态:本地门禁通过,等待远端 CI。本文记录 V1 的输入基线与 C0 候选;checkpoint 的最终 commit SHA 在 C10 evidence bundle 中统一索引。 + +## 边界 + +- 输入基线:`c7ff85218a07a8e5f14132c582cad1239c52865e`(当时 `HEAD`、`origin/main`、`origin/V1` 相同)。 +- C0 只冻结治理、锁与 Restore 设计,升级现有 Web 构建工具链并拆分 CI;不声称 Prepare/Apply、双层锁或 Restore v2 已在运行时实现。 +- 未读取真实 Codex Home、认证信息、凭据、token 或消息正文。 +- 未创建 tag,未发布 npm/GitHub Release,未签名、公证或写更新通道。 + +## 工具链选择 + +在 2026-08-25 从 npm 主 registry 查询稳定版本及 peer/engine 约束后,选择精确版本: + +- `vite@8.2.2` +- `@vitejs/plugin-react@6.1.0` + +两者的现代构建 engine 均为 `^20.19.0 || >=22.12.0`,因此 Web build 固定到 Node 24;根 CLI 的 Node `>=16.20.2` 兼容测试不再执行 Vite。这两个构建依赖使用精确版本,不使用 `^` 或 `~`。升级前审计为 2 个 high、1 个 moderate,均来自旧 Vite 构建链;升级后生产树和完整树均为 0。 + +## 本地验证 + +环境:Windows x64,Node `v24.11.1`,npm `11.10.0`。 + +| 命令 | 结果 | +| --- | --- | +| `npm test` | 259 passed,0 failed,0 skipped | +| `npm run web:build` | Vite 8.2.2 production build 成功,21 modules transformed | +| `npm audit --omit=dev --json` | moderate/high/critical 均为 0 | +| `npm audit --audit-level=high --json` | 完整依赖树 high/critical 为 0;当前所有 severity 均为 0 | +| `npm pack --dry-run --json` | 成功;根包仍包含既有 CLI、文档与 Web dist | +| `dotnet test desktop/CodexProviderSync.Core.Tests/CodexProviderSync.Core.Tests.csproj --filter FullyQualifiedName~LockServiceTests --configuration Release` | 28 passed,0 failed,0 skipped | +| `git diff --check` | 通过 | + +## 已知未闭合项 + +- Node 16.20.2 的 Windows/Ubuntu 真正 tarball 安装与执行由后续兼容 CI/产物门禁提供,本地没有重复模拟。 +- 本轮只复跑 .NET `LockServiceTests`,没有把该结果表述为 .NET 全套或三平台实机证据。 +- 当前 npm/Web dist 仍包含 source map;C9 必须从发布产物排除并用包内容扫描证明。 +- 只有远端所有必需 job 成功后,C0 才能在 V1 证据索引中标记为已验证;Phase 状态在最终 PR 合入前仍不得标记 Completed。 diff --git a/package-lock.json b/package-lock.json index bbdc827..4388ec3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,8 +16,8 @@ "codex-provider": "src/cli.js" }, "devDependencies": { - "@vitejs/plugin-react": "^4.3.4", - "vite": "^4.5.14" + "@vitejs/plugin-react": "6.1.0", + "vite": "8.2.2" }, "engines": { "node": ">=16.20.2" @@ -26,312 +26,20 @@ "better-sqlite3": "8.7.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.8.tgz", - "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.8", - "@babel/types": "^7.29.8", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", - "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", - "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.8", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.8", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz", - "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" + "url": "https://github.com/sponsors/Boshen" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", "cpu": [ "arm" ], @@ -342,13 +50,13 @@ "android" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", "cpu": [ "arm64" ], @@ -359,30 +67,13 @@ "android" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", "cpu": [ "arm64" ], @@ -393,13 +84,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", "cpu": [ "x64" ], @@ -410,30 +101,13 @@ "darwin" ], "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", "cpu": [ "x64" ], @@ -444,13 +118,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", "cpu": [ "arm" ], @@ -461,13 +135,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", "cpu": [ "arm64" ], @@ -478,49 +152,15 @@ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" + "arm64" ], "dev": true, "license": "MIT", @@ -529,13 +169,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", "cpu": [ "ppc64" ], @@ -546,30 +186,13 @@ "linux" ], "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", "cpu": [ "s390x" ], @@ -580,13 +203,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", "cpu": [ "x64" ], @@ -597,47 +220,13 @@ "linux" ], "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", "cpu": [ "x64" ], @@ -645,16 +234,16 @@ "license": "MIT", "optional": true, "os": [ - "sunos" + "linux" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", "cpu": [ "arm64" ], @@ -662,18 +251,18 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "openharmony" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", "cpu": [ - "ia32" + "arm64" ], "dev": true, "license": "MIT", @@ -682,13 +271,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", "cpu": [ "x64" ], @@ -699,122 +288,44 @@ "win32" ], "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, "license": "MIT" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.4", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", - "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", + "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.26.0", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" + "@rolldown/pluginutils": "^1.0.1" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } } }, "node_modules/base64-js": { @@ -837,19 +348,6 @@ ], "optional": true }, - "node_modules/baseline-browser-mapping": { - "version": "2.11.12", - "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.12.tgz", - "integrity": "sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/better-sqlite3": { "version": "8.7.0", "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-8.7.0.tgz", @@ -881,47 +379,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/browserslist": { - "version": "4.28.7", - "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.7.tgz", - "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.44", - "caniuse-lite": "^1.0.30001806", - "electron-to-chromium": "^1.5.393", - "node-releases": "^2.0.51", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/browserslist/node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true, - "license": "MIT" - }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -946,58 +403,12 @@ "ieee754": "^1.1.13" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001806", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", - "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "optional": true }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -1025,74 +436,19 @@ "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.400", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.400.tgz", - "integrity": "sha512-96EWDNjM59SYflgeV5Ylsf4EMiq1a25YjCnJH7cxn/AF2H3pILRweaUnoLax0yKHWdpOzY6JKEu45e8irqZIHA==", - "dev": true, - "license": "ISC" - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "optional": true, + "dependencies": { + "once": "^1.4.0" } }, "node_modules/expand-template": { @@ -1104,6 +460,24 @@ "node": ">=6" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -1118,7 +492,7 @@ }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, @@ -1131,16 +505,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -1185,30 +549,265 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" }, "engines": { - "node": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/loose-envify": { @@ -1223,16 +822,6 @@ "loose-envify": "cli.js" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -1260,17 +849,10 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "optional": true }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/nanoid": { - "version": "3.3.17", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.17.tgz", - "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -1315,15 +897,28 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/postcss": { - "version": "8.5.25", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.25.tgz", - "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "dev": true, "funding": [ { @@ -1341,7 +936,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.16", + "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -1426,16 +1021,6 @@ "react": "^18.3.1" } }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -1450,21 +1035,38 @@ "node": ">= 6" } }, - "node_modules/rollup": { - "version": "3.30.0", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.30.0.tgz", - "integrity": "sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA==", + "node_modules/rolldown": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", "dev": true, "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.146.0", + "@rolldown/pluginutils": "^1.0.0" + }, "bin": { - "rollup": "dist/bin/rollup" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" } }, "node_modules/safe-buffer": { @@ -1555,7 +1157,7 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", @@ -1609,6 +1211,23 @@ "node": ">=6" } }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -1621,37 +1240,6 @@ "node": "*" } }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -1659,50 +1247,66 @@ "optional": true }, "node_modules/vite": { - "version": "4.5.14", - "resolved": "https://registry.npmmirror.com/vite/-/vite-4.5.14.tgz", - "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, - "less": { + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { "optional": true }, - "lightningcss": { + "jiti": { + "optional": true + }, + "less": { "optional": true }, "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -1711,6 +1315,12 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, @@ -1719,13 +1329,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "optional": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" } } } diff --git a/package.json b/package.json index 476adfd..e030549 100644 --- a/package.json +++ b/package.json @@ -53,8 +53,8 @@ "react-dom": "^18.3.1" }, "devDependencies": { - "@vitejs/plugin-react": "^4.3.4", - "vite": "^4.5.14" + "@vitejs/plugin-react": "6.1.0", + "vite": "8.2.2" }, "overrides": { "node-releases": "2.0.18" diff --git a/web/dist/assets/index-776d2b19.css b/web/dist/assets/index-776d2b19.css deleted file mode 100644 index dbec9df..0000000 --- a/web/dist/assets/index-776d2b19.css +++ /dev/null @@ -1 +0,0 @@ -:root{color:#172033;background:#f5f7fa;font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;font-synthesis:none;text-rendering:optimizeLegibility;--accent: #2463eb;--accent-strong: #174fc8;--accent-soft: #edf3ff;--success: #11865b;--success-soft: #eaf8f2;--warning: #b36309;--warning-soft: #fff7e6;--danger: #c43c45;--danger-soft: #fff0f0;--text: #172033;--muted: #687388;--subtle: #8a94a7;--border: #dfe4ec;--border-strong: #cdd4df;--surface: #ffffff;--sidebar: #fbfcfe;--mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace}*{box-sizing:border-box}body{margin:0;min-width:320px;min-height:100vh;background:#f5f7fa}button,input,select{font:inherit}button{color:inherit}button:focus-visible,input:focus-visible,select:focus-visible{outline:3px solid rgba(36,99,235,.18);outline-offset:1px}.app-shell{min-height:100vh;display:grid;grid-template-columns:198px minmax(0,1fr);grid-template-rows:68px minmax(0,1fr)}.app-header{grid-column:1 / -1;display:flex;align-items:center;justify-content:space-between;padding:0 24px;background:var(--surface);border-bottom:1px solid var(--border);position:sticky;top:0;z-index:30}.brand,.header-actions,.service-state,.brand-mark,.nav-item,.sidebar-provider-value,.path-input-wrap,.button,.alignment-state,.column-label,.warning-row,.execution-head,.backup-assurance,.text-button,.backup-row,.backup-root-line,.live-operation,.modal-callout,.restore-summary,.toast>div{display:flex;align-items:center}.brand{gap:11px}.brand-mark{width:36px;height:36px;justify-content:center;color:#fff;background:#202a3d;border-radius:9px;box-shadow:0 5px 13px #17203329}.brand-name{font-size:15px;font-weight:720;letter-spacing:-.01em}.brand-subtitle{margin-top:2px;color:var(--muted);font-size:11px}.header-actions{gap:16px}.service-state{gap:8px;color:#4f5b70;font-size:12px}.status-dot{width:7px;height:7px;border-radius:50%;background:#9aa4b5;box-shadow:0 0 0 3px #9aa4b51f;flex:0 0 auto}.status-dot--success{background:var(--success);box-shadow:0 0 0 3px #11865b1f}.status-dot--warning{background:#db820d;box-shadow:0 0 0 3px #db820d1f}.status-dot--danger{background:var(--danger);box-shadow:0 0 0 3px #c43c451f}.sidebar{grid-column:1;grid-row:2;position:sticky;top:68px;height:calc(100vh - 68px);display:flex;flex-direction:column;padding:19px 12px 16px;background:var(--sidebar);border-right:1px solid var(--border)}.navigation{display:grid;gap:4px}.nav-item{width:100%;gap:10px;border:0;border-radius:7px;background:transparent;padding:10px 12px;color:#657087;font-size:13px;text-align:left;cursor:pointer}.nav-item:hover{background:#f0f3f8;color:#354157}.nav-item--active{background:var(--accent-soft);color:#174fc8;font-weight:650;box-shadow:inset 2px 0 0 var(--accent)}.sidebar-foot{margin-top:auto;padding:14px 10px 0;border-top:1px solid var(--border)}.sidebar-provider-label{color:var(--subtle);font-size:10px;text-transform:uppercase;letter-spacing:.08em}.sidebar-provider-value{gap:8px;margin-top:8px;font-family:var(--mono);font-size:12px;font-weight:700}.sidebar-version{margin-top:12px;color:#a0a8b6;font-size:10px}.main-area{grid-column:2;grid-row:2;min-width:0}.storage-bar{min-height:88px;display:grid;grid-template-columns:minmax(220px,.8fr) minmax(260px,1.2fr) auto auto auto;gap:10px;align-items:end;padding:15px 26px 16px;background:rgba(255,255,255,.92);border-bottom:1px solid var(--border);position:sticky;top:68px;z-index:20;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.path-field{display:grid;gap:6px;min-width:0;color:#455168;font-size:11px;font-weight:650}.path-field span small{color:var(--subtle);font-weight:450}.path-input-wrap{height:36px;gap:8px;padding:0 10px;border:1px solid var(--border-strong);background:#fff;border-radius:7px;color:#8791a3}.path-input-wrap:focus-within{border-color:#8eaff6;box-shadow:0 0 0 3px #2463eb17}.path-input-wrap input,.path-input-wrap select{min-width:0;width:100%;border:0;outline:0;color:#273247;font-family:var(--mono);font-size:11px;background:transparent}.storage-refresh{height:36px}.view-content{max-width:1480px;margin:0 auto;padding:24px 26px 42px}.history-view{height:calc(100dvh - 156px);min-height:0;display:flex;flex-direction:column;overflow:hidden}h1,h2,p{margin-top:0}h1{margin-bottom:6px;font-size:25px;letter-spacing:-.025em}h2{margin-bottom:5px;font-size:16px;letter-spacing:-.014em}.section-title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:18px}.section-title-row p,.execution-head p,.page-intro p{margin-bottom:0;color:var(--muted);font-size:12px;line-height:1.55}.section-title-row--compact{align-items:center}.button{min-height:36px;justify-content:center;gap:7px;padding:0 13px;border:1px solid transparent;border-radius:7px;font-size:12px;font-weight:650;cursor:pointer;transition:background .15s ease,border-color .15s ease,box-shadow .15s ease,transform .15s ease}.button:hover:not(:disabled){transform:translateY(-1px)}.button:disabled{opacity:.48;cursor:not-allowed}.button--primary{color:#fff;background:var(--accent);border-color:var(--accent);box-shadow:0 5px 12px #2463eb2e}.button--primary:hover:not(:disabled){background:var(--accent-strong)}.button--secondary{color:#3d4960;background:#fff;border-color:var(--border-strong);box-shadow:0 1px 2px #1720330a}.button--secondary:hover:not(:disabled){background:#f8faff;border-color:#b7c2d2}.button--quiet{background:#f5f7fa;border-color:#edf0f5;color:#3e4b62}.button--danger{color:#fff;background:var(--danger);border-color:var(--danger)}.button--compact{min-height:31px;padding:0 10px;font-size:11px}.text-button{gap:3px;border:0;background:transparent;color:var(--accent);font-size:11px;font-weight:650;cursor:pointer}.icon-button{width:32px;height:32px;display:grid;place-items:center;border:0;border-radius:6px;background:transparent;cursor:pointer;color:var(--muted)}.icon-button:hover{background:#f1f3f7}.status-panel,.data-section,.recent-backups,.backup-list-section,.activity-console{background:var(--surface);border:1px solid var(--border);border-radius:10px;box-shadow:0 1px 2px #17203306}.status-panel{padding:20px 22px 21px}.alignment-state{gap:7px;min-height:30px;padding:0 10px;border:1px solid var(--border);border-radius:6px;font-size:11px;font-weight:650}.alignment-state--success{color:var(--success);border-color:#bfe4d4;background:var(--success-soft)}.alignment-state--warning{color:var(--warning);border-color:#ead2a4;background:var(--warning-soft)}.summary-strip{display:grid;grid-template-columns:repeat(4,1fr);margin-top:20px;border-top:1px solid var(--border);border-bottom:1px solid var(--border)}.summary-item{min-width:0;padding:15px 18px;border-right:1px solid var(--border)}.summary-item:first-child{padding-left:0}.summary-item:last-child{border-right:0}.summary-item>span{display:block;color:var(--muted);font-size:10px}.summary-item strong{display:block;margin-top:5px;font-size:19px;letter-spacing:-.025em;overflow:hidden;text-overflow:ellipsis}.summary-item small{display:block;margin-top:3px;color:var(--subtle);font-size:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.distribution-grid{display:grid;grid-template-columns:minmax(0,1fr) 1px minmax(0,1fr);gap:22px;padding-top:19px}.distribution-divider{background:var(--border)}.column-label{gap:7px;margin-bottom:14px;color:#3f4a5f;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em}.distribution-block+.distribution-block{margin-top:16px}.distribution-heading,.distribution-meta{display:flex;justify-content:space-between;gap:12px}.distribution-heading{margin-bottom:8px;color:var(--muted);font-size:11px}.distribution-heading strong{color:#3c485e}.distribution-list{display:grid;gap:8px}.distribution-meta{margin-bottom:5px;color:var(--muted);font-family:var(--mono);font-size:10px}.provider-name{color:#303b50}.bar-track{height:5px;overflow:hidden;background:#edf0f5;border-radius:99px}.bar-fill{display:block;height:100%;background:#9eabc0;border-radius:inherit}.bar-fill--current{background:var(--accent)}.empty-inline{color:var(--subtle);font-size:11px}.warning-stack{margin-top:12px;display:grid;gap:7px}.warning-row{align-items:flex-start;gap:10px;padding:10px 13px;border:1px solid;border-radius:7px;font-size:11px}.warning-row svg{margin-top:1px;flex:0 0 auto}.warning-row div{display:grid;gap:2px}.warning-row span{color:#6e5d47;line-height:1.5;word-break:break-word}.warning-row--warning{background:var(--warning-soft);border-color:#ebd7ae;color:var(--warning)}.warning-row--danger{background:var(--danger-soft);border-color:#efc2c4;color:var(--danger)}.warning-row--info{background:#eef6ff;border-color:#c9def8;color:#2463a7}.warning-row--info span{color:#4f6a89}.overview-lower-grid{display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:18px;align-items:start;margin-top:18px}.overview-main-column{min-width:0;width:100%;display:grid;grid-template-columns:minmax(0,1fr);gap:18px}.data-section,.recent-backups{min-width:0;padding:18px 20px}.table-scroll{overflow-x:auto;margin-top:15px}.data-table{width:100%;border-collapse:collapse;font-size:11px}.data-table th{padding:9px 10px;color:var(--muted);background:#f8fafc;border-top:1px solid var(--border);border-bottom:1px solid var(--border);font-weight:650;text-align:left;white-space:nowrap}.data-table td{padding:11px 10px;border-bottom:1px solid #edf0f4;color:#465268;vertical-align:top}.data-table tbody tr:last-child td{border-bottom:0}.path-cell{max-width:260px;font-family:var(--mono);color:#263249!important;word-break:break-all}.table-empty{color:var(--subtle)!important;text-align:center;padding:25px!important}.execution-panel{position:sticky;top:174px;padding:19px;background:#fff;border:1px solid #cdd8e9;border-radius:10px;box-shadow:0 9px 24px #26375312}.execution-head{align-items:flex-start;justify-content:space-between;gap:14px}.execution-head>svg{color:var(--accent);margin-top:2px}.segmented{display:grid;grid-template-columns:1fr 1fr;gap:4px;margin-top:17px;padding:4px;background:#f1f4f8;border-radius:8px}.segmented-option{min-width:0;display:grid;gap:3px;padding:9px 8px;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--muted);cursor:pointer;text-align:left}.segmented-option span{font-size:11px;font-weight:700}.segmented-option small{color:var(--subtle);font-size:9px}.segmented-option--active{background:#fff;color:#263249;border-color:#dce3ee;box-shadow:0 2px 5px #17203312}.form-grid{display:grid;grid-template-columns:minmax(0,1fr) 100px;gap:12px;margin-top:15px}.form-field{display:grid;align-content:start;gap:6px;color:#4c586d;font-size:10px;font-weight:650}.form-field select,.form-field input,.custom-model-option input[type=text]{width:100%;height:35px;padding:0 9px;color:#273247;background:#fff;border:1px solid var(--border-strong);border-radius:6px;font-size:11px}.form-field small{color:var(--subtle);font-weight:450;line-height:1.35}.form-field .field-error{color:var(--danger)}.manual-provider-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:7px;align-items:center;margin-top:9px}.manual-provider-row input{min-width:0;height:32px;padding:0 9px;color:#273247;background:#fff;border:1px solid var(--border-strong);border-radius:6px;font-family:var(--mono);font-size:10px}.manual-remove{grid-column:1 / -1;justify-self:start;padding:0;border:0;background:transparent;color:var(--danger);font-size:9px;cursor:pointer}.model-options,.restore-options{margin:16px 0 0;padding:13px;border:1px solid var(--border);border-radius:7px}.model-options legend,.restore-options legend{padding:0 5px;color:#566176;font-size:10px;font-weight:700}.model-options>label,.restore-options>label{display:flex;align-items:flex-start;gap:8px;padding:7px 0;color:#364258;font-size:11px;cursor:pointer}.model-options input[type=radio],.restore-options input[type=checkbox]{margin:2px 0 0;accent-color:var(--accent)}.model-options label>span,.restore-options label>span{min-width:0;display:grid;gap:2px;flex:1}.model-options small,.restore-options small{color:var(--muted);font-size:9px;font-weight:450;line-height:1.4}.custom-model-option input[type=text]{margin-top:5px}.backup-assurance{gap:7px;margin-top:14px;color:var(--success);font-size:10px}.execute-button{width:100%;height:40px;margin-top:14px}.backup-rows{margin-top:13px;border-top:1px solid var(--border)}.backup-row{min-width:0;gap:11px;padding:11px 0;border-bottom:1px solid #edf0f4}.backup-row:last-child{border-bottom:0}.backup-icon{width:30px;height:30px;display:grid;place-items:center;color:#5e6a80;background:#f1f4f8;border-radius:7px;flex:0 0 auto}.backup-main{min-width:0;display:grid;gap:2px;flex:1}.backup-main strong{font-size:11px}.backup-main span,.backup-size{color:var(--muted);font-size:10px}.empty-state{padding:25px 0 12px;color:var(--subtle);font-size:11px;text-align:center}.page-intro{display:flex;align-items:center;justify-content:space-between;gap:24px;padding:4px 2px 20px}.prune-control{display:flex;align-items:center;gap:10px;color:var(--muted);font-size:11px}.prune-control input{width:64px;height:34px;border:1px solid var(--border-strong);border-radius:6px;text-align:center}.backup-list-section{overflow:hidden}.backup-root-line{gap:8px;padding:13px 17px;background:#f8fafc;border-bottom:1px solid var(--border);color:#59657a;font-size:10px}.backup-root-line span{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;font-family:var(--mono);white-space:nowrap}.backup-root-line strong{color:#465168;font-size:10px}.full-backup-row{display:grid;grid-template-columns:190px 230px minmax(220px,1fr) auto;gap:22px;align-items:center;padding:16px 18px;border-bottom:1px solid var(--border)}.full-backup-row:last-child{border-bottom:0}.backup-date,.backup-source{min-width:0;display:grid;gap:5px}.backup-date strong{font-size:12px}.backup-date span,.backup-source span{color:var(--subtle);font-size:9px}.backup-facts{display:flex;gap:15px;color:var(--muted);font-size:10px}.backup-facts span{display:grid;gap:3px}.backup-facts strong{color:#344057}.backup-source code{overflow:hidden;color:#445169;font-family:var(--mono);font-size:9px;text-overflow:ellipsis;white-space:nowrap}.backup-row-actions{display:flex;align-items:center;justify-content:flex-end;gap:12px;color:var(--muted);font-size:10px}.large-empty{display:grid;justify-items:center;gap:7px;padding:70px 20px;color:var(--subtle)}.large-empty strong{color:#59657a;font-size:13px}.large-empty span{font-size:11px}.live-operation{gap:7px;color:var(--warning);font-size:11px}.activity-console{overflow:hidden}.console-head{display:flex;justify-content:space-between;padding:12px 15px;color:#b6c2d4;background:#202a3b;border-bottom:1px solid #354156;font-family:var(--mono);font-size:10px}.console-body{min-height:440px;max-height:calc(100vh - 250px);overflow:auto;padding:7px 0;background:#17202f;content-visibility:auto}.console-row{display:grid;grid-template-columns:150px 70px minmax(220px,1fr) minmax(0,1.2fr);gap:12px;padding:8px 15px;border-bottom:1px solid rgba(255,255,255,.035);color:#d7deea;font-family:var(--mono);font-size:10px;line-height:1.45}.console-row time,.console-detail{color:#7e8ca3}.console-level{color:#8fa3c1;text-transform:uppercase}.console-row--success .console-level{color:#54d19f}.console-row--error .console-level{color:#ff8790}.console-row--progress .console-level{color:#79a8ff}.console-empty{padding:30px 15px;color:#708098;font-family:var(--mono);font-size:11px}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;display:grid;place-items:center;padding:20px;background:rgba(20,28,43,.46);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.modal{width:min(600px,100%);max-height:calc(100vh - 40px);overflow:auto;background:#fff;border:1px solid #cfd6e1;border-radius:12px;box-shadow:0 24px 70px #0e172840;animation:modal-in .16s ease-out}.modal-head{display:flex;align-items:center;justify-content:space-between;padding:17px 19px;border-bottom:1px solid var(--border)}.modal-head h2{margin:0;font-size:16px}.modal-body{padding:18px 19px}.modal-actions{display:flex;justify-content:flex-end;gap:9px;padding:13px 19px;background:#f8fafc;border-top:1px solid var(--border)}.modal-callout{align-items:flex-start;gap:10px;padding:11px 12px;color:#9a5909;background:var(--warning-soft);border:1px solid #ead4aa;border-radius:7px}.modal-callout>svg{margin-top:1px;flex:0 0 auto}.modal-callout div{display:grid;gap:3px}.modal-callout span{color:#735f43;font-size:10px;line-height:1.55;word-break:break-word}.modal-callout--danger{color:var(--danger);background:var(--danger-soft);border-color:#efc1c4}.modal-callout--warning{margin-top:14px}.operation-scope{margin:16px 0 0;border-top:1px solid var(--border)}.operation-scope>div{display:grid;grid-template-columns:130px minmax(0,1fr);gap:14px;padding:9px 0;border-bottom:1px solid #edf0f4;font-size:11px}.operation-scope dt{color:var(--muted)}.operation-scope dd{margin:0;color:#2d394f;font-family:var(--mono);word-break:break-word}.operation-scope small{color:var(--subtle)}.restore-summary{align-items:flex-start;gap:10px;padding-bottom:13px;border-bottom:1px solid var(--border)}.restore-summary div{min-width:0;display:grid;gap:4px}.restore-summary strong{font-size:12px}.restore-summary code{color:var(--muted);font-family:var(--mono);font-size:9px;word-break:break-all}.restore-options{margin-bottom:14px}.profile-form{display:grid;gap:12px}.profile-form label{display:grid;gap:6px;color:#4c586d;font-size:10px;font-weight:650}.profile-form input{width:100%;height:36px;padding:0 10px;color:#273247;border:1px solid var(--border-strong);border-radius:6px;font:11px var(--mono)}.access-gate{min-height:100vh;display:grid;place-content:center;justify-items:center;gap:12px;padding:24px;color:#344057;background:#f5f7fb;text-align:center}.access-gate svg{color:var(--accent)}.access-gate h1{margin:0;font-size:22px}.access-gate p{max-width:520px;margin:0;color:var(--muted);line-height:1.6}.access-gate code{padding:8px 12px;color:#273247;background:#fff;border:1px solid var(--border);border-radius:6px}.toast{position:fixed;right:22px;bottom:22px;z-index:120;width:min(390px,calc(100vw - 44px));display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:13px 14px;background:#fff;border:1px solid var(--border-strong);border-left:3px solid var(--accent);border-radius:8px;box-shadow:0 15px 40px #161f302e;animation:toast-in .2s ease-out}.toast>div{align-items:flex-start;gap:9px}.toast span{display:grid;gap:3px}.toast strong{font-size:12px}.toast small{color:var(--muted);font-size:10px;line-height:1.4;word-break:break-word}.toast button{border:0;background:transparent;color:var(--muted);cursor:pointer}.toast--success{border-left-color:var(--success)}.toast--success>div>svg{color:var(--success)}.toast--error{border-left-color:var(--danger)}.toast--error>div>svg{color:var(--danger)}.toast--warning{border-left-color:var(--warning)}.toast--warning>div>svg{color:var(--warning)}.spin{animation:spin 1s linear infinite}.history-toolbar{display:grid;grid-template-columns:minmax(220px,1.7fr) repeat(3,minmax(130px,1fr));gap:9px;margin-bottom:14px}.history-toolbar input,.history-toolbar select{width:100%;min-width:0;padding:10px 11px;border:1px solid var(--border-strong);border-radius:7px;background:#fff;color:var(--text);font:inherit}.history-error{display:flex;align-items:center;gap:8px;margin-bottom:12px;padding:10px 12px;color:var(--danger);background:#fff5f3;border:1px solid #f2c9c2;border-radius:7px;font-size:12px}.history-layout{display:grid;grid-template-columns:minmax(300px,.8fr) minmax(0,1.4fr);flex:1 1 auto;min-height:0;height:100%;border:1px solid var(--border);border-radius:9px;overflow:hidden;background:#fff}.history-list-panel{display:flex;min-width:0;min-height:0;flex-direction:column;overflow:hidden;border-right:1px solid var(--border);background:#fbfcfe}.history-list-head{display:flex;justify-content:space-between;padding:13px 15px;color:var(--muted);border-bottom:1px solid var(--border);font-size:11px}.history-list{flex:1 1 auto;min-height:0;height:0;overflow-y:auto;overscroll-behavior:contain}.history-session-row{display:block;width:100%;padding:13px 15px;text-align:left;border:0;border-bottom:1px solid var(--border);background:transparent;color:var(--text);cursor:pointer}.history-session-row:hover,.history-session-row--selected{background:#eef5ff}.history-session-top{display:flex;justify-content:space-between;gap:9px}.history-session-top strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.history-session-top time{flex:none;color:var(--subtle);font-size:10px}.history-session-row p{display:-webkit-box;margin:7px 0;overflow:hidden;color:var(--muted);font-size:11px;line-height:1.45;-webkit-box-orient:vertical;-webkit-line-clamp:2}.history-session-meta{display:flex;flex-wrap:wrap;gap:7px;color:var(--subtle);font-size:10px}.history-session-meta span:first-child{color:var(--accent)}.history-pagination{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-top:1px solid var(--border)}.history-pagination span{color:var(--muted);font-size:11px}.history-detail-panel{min-width:0;min-height:0;overflow-y:auto;overscroll-behavior:contain;background:#fff}.history-detail-head{display:flex;justify-content:space-between;gap:12px;padding:20px 22px 15px;border-bottom:1px solid var(--border)}.history-detail-head h2{margin:0 0 6px;font-size:17px}.history-detail-head p{margin:0;color:var(--muted);font:10px/1.4 var(--mono);word-break:break-word}.history-detail-head>span{flex:none;height:fit-content;padding:4px 7px;color:var(--accent);background:#edf4ff;border-radius:4px;font-size:10px}.history-truncated{display:flex;align-items:center;gap:7px;margin:14px 22px 0;padding:9px 10px;color:#8b631c;background:#fff8e7;border:1px solid #f0dfae;border-radius:6px;font-size:11px}.message-stream{display:grid;gap:14px;padding:20px 22px 28px}.chat-message{max-width:88%}.chat-message--user{justify-self:end}.chat-message--assistant{justify-self:start}.chat-message-label{display:flex;justify-content:space-between;gap:12px;margin-bottom:5px;color:var(--muted);font-size:10px}.chat-message--user .chat-message-label{color:var(--accent)}.chat-message-label time{color:var(--subtle);font:9px var(--mono)}.chat-message-body{padding:11px 13px;white-space:pre-wrap;word-break:break-word;color:var(--text);background:#f5f7fb;border:1px solid var(--border);border-radius:8px;font-size:12px;line-height:1.6}.chat-message--user .chat-message-body{background:#edf4ff;border-color:#d5e4fb}.chat-message-body code{padding:1px 4px;background:rgba(45,57,79,.08);border-radius:3px;font:11px var(--mono)}.chat-message-body pre{margin:8px 0 0;padding:10px;overflow:auto;background:#1f2937;color:#f7f9fc;border-radius:5px;white-space:pre}.chat-message-body pre code{padding:0;background:transparent;color:inherit}@keyframes spin{to{transform:rotate(360deg)}}@keyframes modal-in{0%{opacity:0;transform:translateY(8px) scale(.99)}}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}}@media (max-width: 1120px){.app-shell{grid-template-columns:168px minmax(0,1fr)}.overview-lower-grid{grid-template-columns:1fr}.execution-panel{position:static}.full-backup-row{grid-template-columns:170px 1fr auto}.backup-source{grid-column:1 / 3;grid-row:2}.backup-row-actions{grid-column:3;grid-row:1 / 3}}@media (max-width: 820px){.app-shell{display:block}.app-header{height:62px;padding:0 14px}.brand-subtitle,.service-state{display:none}.sidebar{position:sticky;top:62px;z-index:25;width:100%;height:auto;display:block;padding:7px 10px;border-right:0;border-bottom:1px solid var(--border)}.navigation{display:grid;grid-template-columns:repeat(4,1fr)}.nav-item{justify-content:center;padding:8px}.nav-item--active{box-shadow:inset 0 -2px 0 var(--accent)}.sidebar-foot{display:none}.storage-bar{position:static;grid-template-columns:1fr;padding:14px}.view-content{padding:18px 14px 32px}.summary-strip{grid-template-columns:1fr 1fr}.summary-item{border-bottom:1px solid var(--border)}.summary-item:nth-child(2){border-right:0}.summary-item:nth-child(3),.summary-item:nth-child(4){border-bottom:0}.summary-item:nth-child(3){padding-left:0}.distribution-grid{grid-template-columns:1fr}.distribution-divider{height:1px}.page-intro{align-items:flex-start;flex-direction:column}.full-backup-row{grid-template-columns:1fr auto;gap:12px}.backup-facts,.backup-source{grid-column:1 / -1}.backup-row-actions{grid-column:2;grid-row:1}.console-row{grid-template-columns:115px 62px minmax(180px,1fr)}.console-detail{grid-column:3}.history-toolbar{grid-template-columns:1fr 1fr}.history-toolbar input{grid-column:1 / -1}.history-view{height:calc(100dvh - 270px);min-height:520px}.history-layout{grid-template-columns:1fr;min-height:0}.history-list-panel{min-height:0;max-height:40%;border-right:0;border-bottom:1px solid var(--border)}.history-detail-panel{min-height:0}}@media (max-width: 560px){.header-actions .button span{display:none}.brand-name{font-size:13px}.status-panel,.data-section,.recent-backups{padding:16px}.section-title-row{align-items:flex-start;flex-direction:column}.summary-strip{grid-template-columns:1fr}.summary-item{padding-left:0;border-right:0;border-bottom:1px solid var(--border)!important}.summary-item:last-child{border-bottom:0!important}.form-grid,.segmented{grid-template-columns:1fr}.backup-size{display:none}.prune-control{width:100%;justify-content:space-between}.operation-scope>div{grid-template-columns:1fr;gap:4px}.modal{max-height:calc(100vh - 20px)}.modal-backdrop{padding:10px}.history-toolbar{grid-template-columns:1fr}.history-toolbar input{grid-column:auto}.history-view{height:calc(100dvh - 300px);min-height:500px}.history-detail-head,.message-stream{padding-left:15px;padding-right:15px}.chat-message{max-width:96%}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{scroll-behavior:auto!important;animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}} diff --git a/web/dist/assets/index-BhSMcRqW.js b/web/dist/assets/index-BhSMcRqW.js new file mode 100644 index 0000000..6d4f452 --- /dev/null +++ b/web/dist/assets/index-BhSMcRqW.js @@ -0,0 +1,10 @@ +var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.provider`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.iterator;function p(e){return typeof e!=`object`||!e?null:(e=f&&e[f]||e[`@@iterator`],typeof e==`function`?e:null)}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function _(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}_.prototype.isReactComponent={},_.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`setState(...): takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},_.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function v(){}v.prototype=_.prototype;function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}var b=y.prototype=new v;b.constructor=y,h(b,_.prototype),b.isPureReactComponent=!0;var x=Array.isArray,ee=Object.prototype.hasOwnProperty,S={current:null},C={key:!0,ref:!0,__self:!0,__source:!0};function w(e,n,r){var i,a={},o=null,s=null;if(n!=null)for(i in n.ref!==void 0&&(s=n.ref),n.key!==void 0&&(o=``+n.key),n)ee.call(n,i)&&!C.hasOwnProperty(i)&&(a[i]=n[i]);var c=arguments.length-2;if(c===1)a.children=r;else if(1{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=typeof setTimeout==`function`?setTimeout:null,_=typeof clearTimeout==`function`?clearTimeout:null,v=typeof setImmediate<`u`?setImmediate:null;typeof navigator<`u`&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function y(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function b(e){if(h=!1,y(e),!m){if(n(c)!==null)m=!0,O(x);else{var t=n(l);t!==null&&ie(b,t.startTime-e)}}}function x(t,i){m=!1,h&&(h=!1,_(C),C=-1),p=!0;var a=f;try{for(y(i),d=n(c);d!==null&&(!(d.expirationTime>i)||t&&!te());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=i);i=e.unstable_now(),typeof s==`function`?d.callback=s:d===n(c)&&r(c),y(i)}else r(c);d=n(c)}if(d!==null)var u=!0;else{var g=n(l);g!==null&&ie(b,g.startTime-i),u=!1}return u}finally{d=null,f=a,p=!1}}var ee=!1,S=null,C=-1,w=5,T=-1;function te(){return!(e.unstable_now()-Te||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(_(C),C=-1):h=!0,ie(b,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,O(x))),r},e.unstable_shouldYield=te,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u(),n=f();function r(e){for(var t=`https://reactjs.org/docs/error-decoder.html?invariant=`+e,n=1;n`u`||window.document===void 0||window.document.createElement===void 0),l=Object.prototype.hasOwnProperty,d=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p={},m={};function h(e){return l.call(m,e)?!0:l.call(p,e)?!1:d.test(e)?m[e]=!0:(p[e]=!0,!1)}function g(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case`function`:case`symbol`:return!0;case`boolean`:return r?!1:n===null?(e=e.toLowerCase().slice(0,5),e!==`data-`&&e!==`aria-`):!n.acceptsBooleans;default:return!1}}function _(e,t,n,r){if(t==null||g(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function v(e,t,n,r,i,a,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=i,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a,this.removeEmptyString=o}var y={};`children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style`.split(` `).forEach(function(e){y[e]=new v(e,0,!1,e,null,!1,!1)}),[[`acceptCharset`,`accept-charset`],[`className`,`class`],[`htmlFor`,`for`],[`httpEquiv`,`http-equiv`]].forEach(function(e){var t=e[0];y[t]=new v(t,1,!1,e[1],null,!1,!1)}),[`contentEditable`,`draggable`,`spellCheck`,`value`].forEach(function(e){y[e]=new v(e,2,!1,e.toLowerCase(),null,!1,!1)}),[`autoReverse`,`externalResourcesRequired`,`focusable`,`preserveAlpha`].forEach(function(e){y[e]=new v(e,2,!1,e,null,!1,!1)}),`allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope`.split(` `).forEach(function(e){y[e]=new v(e,3,!1,e.toLowerCase(),null,!1,!1)}),[`checked`,`multiple`,`muted`,`selected`].forEach(function(e){y[e]=new v(e,3,!0,e,null,!1,!1)}),[`capture`,`download`].forEach(function(e){y[e]=new v(e,4,!1,e,null,!1,!1)}),[`cols`,`rows`,`size`,`span`].forEach(function(e){y[e]=new v(e,6,!1,e,null,!1,!1)}),[`rowSpan`,`start`].forEach(function(e){y[e]=new v(e,5,!1,e.toLowerCase(),null,!1,!1)});var b=/[\-:]([a-z])/g;function x(e){return e[1].toUpperCase()}`accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height`.split(` `).forEach(function(e){var t=e.replace(b,x);y[t]=new v(t,1,!1,e,null,!1,!1)}),`xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type`.split(` `).forEach(function(e){var t=e.replace(b,x);y[t]=new v(t,1,!1,e,`http://www.w3.org/1999/xlink`,!1,!1)}),[`xml:base`,`xml:lang`,`xml:space`].forEach(function(e){var t=e.replace(b,x);y[t]=new v(t,1,!1,e,`http://www.w3.org/XML/1998/namespace`,!1,!1)}),[`tabIndex`,`crossOrigin`].forEach(function(e){y[e]=new v(e,1,!1,e.toLowerCase(),null,!1,!1)}),y.xlinkHref=new v(`xlinkHref`,1,!1,`xlink:href`,`http://www.w3.org/1999/xlink`,!0,!1),[`src`,`href`,`action`,`formAction`].forEach(function(e){y[e]=new v(e,1,!1,e.toLowerCase(),null,!0,!0)});function ee(e,t,n,r){var i=y.hasOwnProperty(t)?y[t]:null;(i===null?r||!(2s||i[o]!==a[s]){var c=` +`+i[o].replace(` at new `,` at `);return e.displayName&&c.includes(``)&&(c=c.replace(``,e.displayName)),c}while(1<=o&&0<=s);break}}}finally{de=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:``)?ue(e):``}function pe(e){switch(e.tag){case 5:return ue(e.type);case 16:return ue(`Lazy`);case 13:return ue(`Suspense`);case 19:return ue(`SuspenseList`);case 0:case 2:case 15:return e=fe(e.type,!1),e;case 11:return e=fe(e.type.render,!1),e;case 1:return e=fe(e.type,!0),e;default:return``}}function me(e){if(e==null)return null;if(typeof e==`function`)return e.displayName||e.name||null;if(typeof e==`string`)return e;switch(e){case T:return`Fragment`;case w:return`Portal`;case ne:return`Profiler`;case te:return`StrictMode`;case O:return`Suspense`;case ie:return`SuspenseList`}if(typeof e==`object`)switch(e.$$typeof){case E:return(e.displayName||`Context`)+`.Consumer`;case re:return(e._context.displayName||`Context`)+`.Provider`;case D:var t=e.render;return e=e.displayName,e||=(e=t.displayName||t.name||``,e===``?`ForwardRef`:`ForwardRef(`+e+`)`),e;case k:return t=e.displayName||null,t===null?me(e.type)||`Memo`:t;case ae:t=e._payload,e=e._init;try{return me(e(t))}catch{}}return null}function he(e){var t=e.type;switch(e.tag){case 24:return`Cache`;case 9:return(t.displayName||`Context`)+`.Consumer`;case 10:return(t._context.displayName||`Context`)+`.Provider`;case 18:return`DehydratedFragment`;case 11:return e=t.render,e=e.displayName||e.name||``,t.displayName||(e===``?`ForwardRef`:`ForwardRef(`+e+`)`);case 7:return`Fragment`;case 5:return t;case 4:return`Portal`;case 3:return`Root`;case 6:return`Text`;case 16:return me(t);case 8:return t===te?`StrictMode`:`Mode`;case 22:return`Offscreen`;case 12:return`Profiler`;case 21:return`Scope`;case 13:return`Suspense`;case 19:return`SuspenseList`;case 25:return`TracingMarker`;case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t==`function`)return t.displayName||t.name||null;if(typeof t==`string`)return t}return null}function j(e){switch(typeof e){case`boolean`:case`number`:case`string`:case`undefined`:return e;case`object`:return e;default:return``}}function M(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()===`input`&&(t===`checkbox`||t===`radio`)}function N(e){var t=M(e)?`checked`:`value`,n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=``+e[t];if(!e.hasOwnProperty(t)&&n!==void 0&&typeof n.get==`function`&&typeof n.set==`function`){var i=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(e){r=``+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=``+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function P(e){e._valueTracker||=N(e)}function ge(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r=``;return e&&(r=M(e)?e.checked?`true`:`false`:e.value),e=r,e!==n&&(t.setValue(e),!0)}function _e(e){if(e||=typeof document<`u`?document:void 0,e===void 0)return null;try{return e.activeElement||e.body}catch{return e.body}}function ve(e,t){var n=t.checked;return A({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function ye(e,t){var n=t.defaultValue==null?``:t.defaultValue,r=t.checked==null?t.defaultChecked:t.checked;n=j(t.value==null?n:t.value),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type===`checkbox`||t.type===`radio`?t.checked!=null:t.value!=null}}function be(e,t){t=t.checked,t!=null&&ee(e,`checked`,t,!1)}function xe(e,t){be(e,t);var n=j(t.value),r=t.type;if(n!=null)r===`number`?(n===0&&e.value===``||e.value!=n)&&(e.value=``+n):e.value!==``+n&&(e.value=``+n);else if(r===`submit`||r===`reset`){e.removeAttribute(`value`);return}t.hasOwnProperty(`value`)?Ce(e,t.type,n):t.hasOwnProperty(`defaultValue`)&&Ce(e,t.type,j(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Se(e,t,n){if(t.hasOwnProperty(`value`)||t.hasOwnProperty(`defaultValue`)){var r=t.type;if(!(r!==`submit`&&r!==`reset`||t.value!==void 0&&t.value!==null))return;t=``+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==``&&(e.name=``),e.defaultChecked=!!e._wrapperState.initialChecked,n!==``&&(e.name=n)}function Ce(e,t,n){(t!==`number`||_e(e.ownerDocument)!==e)&&(n==null?e.defaultValue=``+e._wrapperState.initialValue:e.defaultValue!==``+n&&(e.defaultValue=``+n))}var F=Array.isArray;function we(e,t,n,r){if(e=e.options,t){t={};for(var i=0;i`+t.valueOf().toString()+``,t=je.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ne(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Pe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Fe=[`Webkit`,`ms`,`Moz`,`O`];Object.keys(Pe).forEach(function(e){Fe.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Pe[t]=Pe[e]})});function Ie(e,t,n){return t==null||typeof t==`boolean`||t===``?``:n||typeof t!=`number`||t===0||Pe.hasOwnProperty(e)&&Pe[e]?(``+t).trim():t+`px`}function Le(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=n.indexOf(`--`)===0,i=Ie(n,t[n],r);n===`float`&&(n=`cssFloat`),r?e.setProperty(n,i):e[n]=i}}var Re=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ze(e,t){if(t){if(Re[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(r(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(r(60));if(typeof t.dangerouslySetInnerHTML!=`object`||!(`__html`in t.dangerouslySetInnerHTML))throw Error(r(61))}if(t.style!=null&&typeof t.style!=`object`)throw Error(r(62))}}function Be(e,t){if(e.indexOf(`-`)===-1)return typeof t.is==`string`;switch(e){case`annotation-xml`:case`color-profile`:case`font-face`:case`font-face-src`:case`font-face-uri`:case`font-face-format`:case`font-face-name`:case`missing-glyph`:return!1;default:return!0}}var Ve=null;function He(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Ue=null,We=null,Ge=null;function Ke(e){if(e=Wi(e)){if(typeof Ue!=`function`)throw Error(r(280));var t=e.stateNode;t&&(t=Ki(t),Ue(e.stateNode,e.type,t))}}function qe(e){We?Ge?Ge.push(e):Ge=[e]:We=e}function Je(){if(We){var e=We,t=Ge;if(Ge=We=null,Ke(e),t)for(e=0;e>>=0,e===0?32:31-(At(e)/jt|0)|0}var Nt=64,Pt=4194304;function Ft(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function It(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,i=e.suspendedLanes,a=e.pingedLanes,o=n&268435455;if(o!==0){var s=o&~i;s===0?(a&=o,a!==0&&(r=Ft(a))):r=Ft(s)}else o=n&~i,o===0?a!==0&&(r=Ft(a)):r=Ft(o);if(r===0)return 0;if(t!==0&&t!==r&&(t&i)===0&&(i=r&-r,a=t&-t,i>=a||i===16&&a&4194240))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Ht(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-kt(t),e[t]=n}function Ut(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=ir),sr=` `,cr=!1;function lr(e,t){switch(e){case`keyup`:return nr.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function ur(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var dr=!1;function fr(e,t){switch(e){case`compositionend`:return ur(t);case`keypress`:return t.which===32?(cr=!0,sr):null;case`textInput`:return e=t.data,e===sr&&cr?null:e;default:return null}}function pr(e,t){if(dr)return e===`compositionend`||!rr&&lr(e,t)?(e=Dn(),En=Tn=wn=null,dr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Fr(n)}}function Lr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Lr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Rr(){for(var e=window,t=_e();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=_e(e.document)}return t}function zr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}function Br(e){var t=Rr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Lr(n.ownerDocument.documentElement,n)){if(r!==null&&zr(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),`selectionStart`in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=n.textContent.length,a=Math.min(r.start,i);r=r.end===void 0?a:Math.min(r.end,i),!e.extend&&a>r&&(i=r,r=a,a=i),i=Ir(n,a);var o=Ir(n,r);i&&o&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),a>r?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus==`function`&&n.focus(),n=0;n=document.documentMode,Hr=null,Ur=null,Wr=null,Gr=!1;function Kr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Gr||Hr==null||Hr!==_e(r)||(r=Hr,`selectionStart`in r&&zr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Wr&&Pr(Wr,r)||(Wr=r,r=_i(Ur,`onSelect`),0Ji||(e.current=qi[Ji],qi[Ji]=null,Ji--)}function B(e,t){Ji++,qi[Ji]=e.current,e.current=t}var Xi={},Zi=Yi(Xi),Qi=Yi(!1),$i=Xi;function ea(e,t){var n=e.type.contextTypes;if(!n)return Xi;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i={},a;for(a in n)i[a]=t[a];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function ta(e){return e=e.childContextTypes,e!=null}function na(){z(Qi),z(Zi)}function ra(e,t,n){if(Zi.current!==Xi)throw Error(r(168));B(Zi,t),B(Qi,n)}function ia(e,t,n){var i=e.stateNode;if(t=t.childContextTypes,typeof i.getChildContext!=`function`)return n;for(var a in i=i.getChildContext(),i)if(!(a in t))throw Error(r(108,he(e)||`Unknown`,a));return A({},n,i)}function aa(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Xi,$i=Zi.current,B(Zi,e),B(Qi,Qi.current),!0}function oa(e,t,n){var i=e.stateNode;if(!i)throw Error(r(169));n?(e=ia(e,t,$i),i.__reactInternalMemoizedMergedChildContext=e,z(Qi),z(Zi),B(Zi,e)):z(Qi),B(Qi,n)}var sa=null,ca=!1,la=!1;function ua(e){sa===null?sa=[e]:sa.push(e)}function da(e){ca=!0,ua(e)}function fa(){if(!la&&sa!==null){la=!0;var e=0,t=L;try{var n=sa;for(L=1;e>=o,i-=o,ba=1<<32-kt(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(r,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(r,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(r,d),V&&Sa(r,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),V&&Sa(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return V&&Sa(a,g),u}for(h=i(a,h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),V&&Sa(a,g),u}function _(e,r,i,o){if(typeof i==`object`&&i&&i.type===T&&i.key===null&&(i=i.props.children),typeof i==`object`&&i){switch(i.$$typeof){case C:a:{for(var c=i.key,l=r;l!==null;){if(l.key===c){if(c=i.type,c===T){if(l.tag===7){n(e,l.sibling),r=a(l,i.props.children),r.return=e,e=r;break a}}else if(l.elementType===c||typeof c==`object`&&c&&c.$$typeof===ae&&Va(c)===l.type){n(e,l.sibling),r=a(l,i.props),r.ref=za(e,l,i),r.return=e,e=r;break a}n(e,l);break}t(e,l),l=l.sibling}i.type===T?(r=Zl(i.props.children,e.mode,o,i.key),r.return=e,e=r):(o=Xl(i.type,i.key,i.props,null,e.mode,o),o.ref=za(e,r,i),o.return=e,e=o)}return s(e);case w:a:{for(l=i.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===i.containerInfo&&r.stateNode.implementation===i.implementation){n(e,r.sibling),r=a(r,i.children||[]),r.return=e,e=r;break a}n(e,r);break}t(e,r),r=r.sibling}r=eu(i,e.mode,o),r.return=e,e=r}return s(e);case ae:return l=i._init,_(e,r,l(i._payload),o)}if(F(i))return h(e,r,i,o);if(ce(i))return g(e,r,i,o);Ba(e,i)}return typeof i==`string`&&i!==``||typeof i==`number`?(i=``+i,r!==null&&r.tag===6?(n(e,r.sibling),r=a(r,i),r.return=e,e=r):(n(e,r),r=$l(i,e.mode,o),r.return=e,e=r),s(e)):n(e,r)}return _}var Ua=Ha(!0),Wa=Ha(!1),Ga=Yi(null),Ka=null,qa=null,Ja=null;function Ya(){Ja=qa=Ka=null}function Xa(e){var t=Ga.current;z(Ga),e._currentValue=t}function Za(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)===t?r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t):(e.childLanes|=t,r!==null&&(r.childLanes|=t)),e===n)break;e=e.return}}function Qa(e,t){Ka=e,Ja=qa=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(Rs=!0),e.firstContext=null)}function $a(e){var t=e._currentValue;if(Ja!==e){if(e={context:e,memoizedValue:t,next:null},qa===null){if(Ka===null)throw Error(r(308));qa=e,Ka.dependencies={lanes:0,firstContext:e}}else qa=qa.next=e}return t}var eo=null;function to(e){eo===null?eo=[e]:eo.push(e)}function no(e,t,n,r){var i=t.interleaved;return i===null?(n.next=n,to(t)):(n.next=i.next,i.next=n),t.interleaved=n,ro(e,r)}function ro(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var io=!1;function ao(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function oo(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function so(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function co(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,J&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,ro(e,n)}return i=r.interleaved,i===null?(t.next=t,to(r)):(t.next=i.next,i.next=t),r.interleaved=t,ro(e,n)}function lo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194240)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Wt(e,n)}}function uo(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function fo(e,t,n,r){var i=e.updateQueue;io=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane,p=s.eventTime;if((r&f)===f){u!==null&&(u=u.next={eventTime:p,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});a:{var m=e,h=s;switch(f=t,p=n,h.tag){case 1:if(m=h.payload,typeof m==`function`){d=m.call(p,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=h.payload,f=typeof m==`function`?m.call(p,d,f):m,f==null)break a;d=A({},d,f);break a;case 2:io=!0}}s.callback!==null&&s.lane!==0&&(e.flags|=64,f=i.effects,f===null?i.effects=[s]:f.push(s))}else p={eventTime:p,lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;f=s,s=f.next,f.next=null,i.lastBaseUpdate=f,i.shared.pending=null}}while(1);if(u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,t=i.shared.interleaved,t!==null){i=t;do o|=i.lane,i=i.next;while(i!==t)}else a===null&&(i.shared.lanes=0);Yc|=o,e.lanes=o,e.memoizedState=d}}function po(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=Do.transition;Do.transition={};try{e(!1),t()}finally{L=n,Do.transition=r}}function ds(){return Ro().memoizedState}function fs(e,t,n){var r=ml(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},ms(e))hs(t,n);else if(n=no(e,t,n,r),n!==null){var i=pl();hl(n,e,r,i),gs(n,t,r)}}function ps(e,t,n){var r=ml(e),i={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(ms(e))hs(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Nr(s,o)){var c=t.interleaved;c===null?(i.next=i,to(t)):(i.next=c.next,c.next=i),t.interleaved=i;return}}catch{}n=no(e,t,i,r),n!==null&&(i=pl(),hl(n,e,r,i),gs(n,t,r))}}function ms(e){var t=e.alternate;return e===U||t!==null&&t===U}function hs(e,t){Ao=ko=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function gs(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Wt(e,n)}}var _s={readContext:$a,useCallback:No,useContext:No,useEffect:No,useImperativeHandle:No,useInsertionEffect:No,useLayoutEffect:No,useMemo:No,useReducer:No,useRef:No,useState:No,useDebugValue:No,useDeferredValue:No,useTransition:No,useMutableSource:No,useSyncExternalStore:No,useId:No,unstable_isNewReconciler:!1},vs={readContext:$a,useCallback:function(e,t){return Lo().memoizedState=[e,t===void 0?null:t],e},useContext:$a,useEffect:es,useImperativeHandle:function(e,t,n){return n=n==null?null:n.concat([e]),Qo(4194308,4,is.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Qo(4194308,4,e,t)},useInsertionEffect:function(e,t){return Qo(4,2,e,t)},useMemo:function(e,t){var n=Lo();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Lo();return t=n===void 0?t:n(t),r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=fs.bind(null,U,e),[r.memoizedState,e]},useRef:function(e){var t=Lo();return e={current:e},t.memoizedState=e},useState:Yo,useDebugValue:os,useDeferredValue:function(e){return Lo().memoizedState=e},useTransition:function(){var e=Yo(!1),t=e[0];return e=us.bind(null,e[1]),Lo().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var i=U,a=Lo();if(V){if(n===void 0)throw Error(r(407));n=n()}else{if(n=t(),Y===null)throw Error(r(349));Oo&30||Wo(i,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,es(Ko.bind(null,i,o,e),[e]),i.flags|=2048,Xo(9,Go.bind(null,i,o,n,t),void 0,null),n},useId:function(){var e=Lo(),t=Y.identifierPrefix;if(V){var n=xa,r=ba;n=(r&~(1<<32-kt(r)-1)).toString(32)+n,t=`:`+t+`R`+n,n=jo++,0<\/script>`,e=e.removeChild(e.firstChild)):typeof i.is==`string`?e=c.createElement(n,{is:i.is}):(e=c.createElement(n),n===`select`&&(c=e,i.multiple?c.multiple=!0:i.size&&(c.size=i.size))):e=c.createElementNS(e,n),e[Li]=t,e[Ri]=i,cc(e,t,!1,!1),t.stateNode=e;a:{switch(c=Be(n,i),n){case`dialog`:R(`cancel`,e),R(`close`,e),o=i;break;case`iframe`:case`object`:case`embed`:R(`load`,e),o=i;break;case`video`:case`audio`:for(o=0;otl&&(t.flags|=128,i=!0,dc(s,!1),t.lanes=4194304)}}else{if(!i){if(e=Co(c),e!==null){if(t.flags|=128,i=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),dc(s,!0),s.tail===null&&s.tailMode===`hidden`&&!c.alternate&&!V)return fc(t),null}else 2*I()-s.renderingStartTime>tl&&n!==1073741824&&(t.flags|=128,i=!0,dc(s,!1),t.lanes=4194304)}s.isBackwards?(c.sibling=t.child,t.child=c):(n=s.last,n===null?t.child=c:n.sibling=c,s.last=c)}return s.tail===null?(fc(t),null):(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=I(),t.sibling=null,n=H.current,B(H,i?n&1|2:n&1),t);case 22:case 23:return Tl(),i=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==i&&(t.flags|=8192),i&&t.mode&1?Kc&1073741824&&(fc(t),t.subtreeFlags&6&&(t.flags|=8192)):fc(t),null;case 24:return null;case 25:return null}throw Error(r(156,t.tag))}function mc(e,t){switch(Ta(t),t.tag){case 1:return ta(t.type)&&na(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return bo(),z(Qi),z(Zi),To(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return So(t),null;case 13:if(z(H),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));Ia()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return z(H),null;case 4:return bo(),null;case 10:return Xa(t.type._context),null;case 22:case 23:return Tl(),null;case 24:return null;default:return null}}var hc=!1,gc=!1,_c=typeof WeakSet==`function`?WeakSet:Set,K=null;function vc(e,t){var n=e.ref;if(n!==null){if(typeof n==`function`)try{n(null)}catch(n){$(e,t,n)}else n.current=null}}function yc(e,t,n){try{n()}catch(n){$(e,t,n)}}var bc=!1;function xc(e,t){if(Ti=_n,e=Rr(),zr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var i=n.getSelection&&n.getSelection();if(i&&i.rangeCount!==0){n=i.anchorNode;var a=i.anchorOffset,o=i.focusNode;i=i.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||i!==0&&f.nodeType!==3||(l=s+i),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===i&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(Ei={focusedElem:e,selectionRange:n},_n=!1,K=t;K!==null;)if(t=K,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,K=e;else for(;K!==null;){t=K;try{var h=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(h!==null){var g=h.memoizedProps,_=h.memoizedState,v=t.stateNode;v.__reactInternalSnapshotBeforeUpdate=v.getSnapshotBeforeUpdate(t.elementType===t.type?g:xs(t.type,g),_)}break;case 3:var y=t.stateNode.containerInfo;y.nodeType===1?y.textContent=``:y.nodeType===9&&y.documentElement&&y.removeChild(y.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(e){$(t,t.return,e)}if(e=t.sibling,e!==null){e.return=t.return,K=e;break}K=t.return}return h=bc,bc=!1,h}function Sc(e,t,n){var r=t.updateQueue;if(r=r===null?null:r.lastEffect,r!==null){var i=r=r.next;do{if((i.tag&e)===e){var a=i.destroy;i.destroy=void 0,a!==void 0&&yc(t,n,a)}i=i.next}while(i!==r)}}function Cc(e,t){if(t=t.updateQueue,t=t===null?null:t.lastEffect,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function wc(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t==`function`?t(e):t.current=e}}function Tc(e){var t=e.alternate;t!==null&&(e.alternate=null,Tc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Li],delete t[Ri],delete t[Bi],delete t[Vi],delete t[Hi])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ec(e){return e.tag===5||e.tag===3||e.tag===4}function Dc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Ec(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Oc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=wi));else if(r!==4&&(e=e.child,e!==null))for(Oc(e,t,n),e=e.sibling;e!==null;)Oc(e,t,n),e=e.sibling}function kc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(kc(e,t,n),e=e.sibling;e!==null;)kc(e,t,n),e=e.sibling}var q=null,Ac=!1;function jc(e,t,n){for(n=n.child;n!==null;)Mc(e,t,n),n=n.sibling}function Mc(e,t,n){if(Dt&&typeof Dt.onCommitFiberUnmount==`function`)try{Dt.onCommitFiberUnmount(Et,n)}catch{}switch(n.tag){case 5:gc||vc(n,t);case 6:var r=q,i=Ac;q=null,jc(e,t,n),q=r,Ac=i,q!==null&&(Ac?(e=q,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):q.removeChild(n.stateNode));break;case 18:q!==null&&(Ac?(e=q,n=n.stateNode,e.nodeType===8?Ni(e.parentNode,n):e.nodeType===1&&Ni(e,n),hn(e)):Ni(q,n.stateNode));break;case 4:r=q,i=Ac,q=n.stateNode.containerInfo,Ac=!0,jc(e,t,n),q=r,Ac=i;break;case 0:case 11:case 14:case 15:if(!gc&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){i=r=r.next;do{var a=i,o=a.destroy;a=a.tag,o!==void 0&&(a&2||a&4)&&yc(n,t,o),i=i.next}while(i!==r)}jc(e,t,n);break;case 1:if(!gc&&(vc(n,t),r=n.stateNode,typeof r.componentWillUnmount==`function`))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(e){$(n,t,e)}jc(e,t,n);break;case 21:jc(e,t,n);break;case 22:n.mode&1?(gc=(r=gc)||n.memoizedState!==null,jc(e,t,n),gc=r):jc(e,t,n);break;default:jc(e,t,n)}}function Nc(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new _c),t.forEach(function(t){var r=Hl.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))})}}function Pc(e,t){var n=t.deletions;if(n!==null)for(var i=0;ia&&(a=s),i&=~o}if(i=a,i=I()-i,i=(120>i?120:480>i?480:1080>i?1080:1920>i?1920:3e3>i?3e3:4320>i?4320:1960*Hc(i/1960))-i,10e?16:e,sl===null)var i=!1;else{if(e=sl,sl=null,cl=0,J&6)throw Error(r(331));var a=J;for(J|=4,K=e.current;K!==null;){var o=K,s=o.child;if(K.flags&16){var c=o.deletions;if(c!==null){for(var l=0;lI()-el?El(e,0):Zc|=n),gl(e,t)}function Bl(e,t){t===0&&(e.mode&1?(t=Pt,Pt<<=1,!(Pt&130023424)&&(Pt=4194304)):t=1);var n=pl();e=ro(e,t),e!==null&&(Ht(e,t,n),gl(e,n))}function Vl(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Bl(e,n)}function Hl(e,t){var n=0;switch(e.tag){case 13:var i=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:i=e.stateNode;break;default:throw Error(r(314))}i!==null&&i.delete(t),Bl(e,n)}var Ul=function(e,t,n){if(e!==null){if(e.memoizedProps!==t.pendingProps||Qi.current)Rs=!0;else{if((e.lanes&n)===0&&!(t.flags&128))return Rs=!1,sc(e,t,n);Rs=!!(e.flags&131072)}}else Rs=!1,V&&t.flags&1048576&&Ca(t,ga,t.index);switch(t.lanes=0,t.tag){case 2:var i=t.type;ac(e,t),e=t.pendingProps;var a=ea(t,Zi.current);Qa(t,n),a=Fo(null,t,i,e,a,n);var o=Io();return t.flags|=1,typeof a==`object`&&a&&typeof a.render==`function`&&a.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,ta(i)?(o=!0,aa(t)):o=!1,t.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,ao(t),a.updater=Cs,t.stateNode=a,a._reactInternals=t,Ds(t,i,e,n),t=qs(null,t,i,!0,o,n)):(t.tag=0,V&&o&&wa(t),zs(null,t,a,n),t=t.child),t;case 16:i=t.elementType;a:{switch(ac(e,t),e=t.pendingProps,a=i._init,i=a(i._payload),t.type=i,a=t.tag=Jl(i),e=xs(i,e),a){case 0:t=Gs(null,t,i,e,n);break a;case 1:t=Ks(null,t,i,e,n);break a;case 11:t=Bs(null,t,i,e,n);break a;case 14:t=Vs(null,t,i,xs(i.type,e),n);break a}throw Error(r(306,i,``))}return t;case 0:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),Gs(e,t,i,a,n);case 1:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),Ks(e,t,i,a,n);case 3:a:{if(Js(t),e===null)throw Error(r(387));i=t.pendingProps,o=t.memoizedState,a=o.element,oo(e,t),fo(t,i,null,n);var s=t.memoizedState;if(i=s.element,o.isDehydrated){if(o={element:i,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){a=Os(Error(r(423)),t),t=Ys(e,t,i,n,a);break a}if(i!==a){a=Os(Error(r(424)),t),t=Ys(e,t,i,n,a);break a}for(Da=Pi(t.stateNode.containerInfo.firstChild),Ea=t,V=!0,Oa=null,n=Wa(t,null,i,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling}else{if(Ia(),i===a){t=oc(e,t,n);break a}zs(e,t,i,n)}t=t.child}return t;case 5:return xo(t),e===null&&Ma(t),i=t.type,a=t.pendingProps,o=e===null?null:e.memoizedProps,s=a.children,Di(i,a)?s=null:o!==null&&Di(i,o)&&(t.flags|=32),Ws(e,t),zs(e,t,s,n),t.child;case 6:return e===null&&Ma(t),null;case 13:return Qs(e,t,n);case 4:return yo(t,t.stateNode.containerInfo),i=t.pendingProps,e===null?t.child=Ua(t,null,i,n):zs(e,t,i,n),t.child;case 11:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),Bs(e,t,i,a,n);case 7:return zs(e,t,t.pendingProps,n),t.child;case 8:return zs(e,t,t.pendingProps.children,n),t.child;case 12:return zs(e,t,t.pendingProps.children,n),t.child;case 10:a:{if(i=t.type._context,a=t.pendingProps,o=t.memoizedProps,s=a.value,B(Ga,i._currentValue),i._currentValue=s,o!==null){if(Nr(o.value,s)){if(o.children===a.children&&!Qi.current){t=oc(e,t,n);break a}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var c=o.dependencies;if(c!==null){s=o.child;for(var l=c.firstContext;l!==null;){if(l.context===i){if(o.tag===1){l=so(-1,n&-n),l.tag=2;var u=o.updateQueue;if(u!==null){u=u.shared;var d=u.pending;d===null?l.next=l:(l.next=d.next,d.next=l),u.pending=l}}o.lanes|=n,l=o.alternate,l!==null&&(l.lanes|=n),Za(o.return,n,t),c.lanes|=n;break}l=l.next}}else if(o.tag===10)s=o.type===t.type?null:o.child;else if(o.tag===18){if(s=o.return,s===null)throw Error(r(341));s.lanes|=n,c=s.alternate,c!==null&&(c.lanes|=n),Za(s,n,t),s=o.sibling}else s=o.child;if(s!==null)s.return=o;else for(s=o;s!==null;){if(s===t){s=null;break}if(o=s.sibling,o!==null){o.return=s.return,s=o;break}s=s.return}o=s}}zs(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,i=t.pendingProps.children,Qa(t,n),a=$a(a),i=i(a),t.flags|=1,zs(e,t,i,n),t.child;case 14:return i=t.type,a=xs(i,t.pendingProps),a=xs(i.type,a),Vs(e,t,i,a,n);case 15:return Hs(e,t,t.type,t.pendingProps,n);case 17:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),ac(e,t),t.tag=1,ta(i)?(e=!0,aa(t)):e=!1,Qa(t,n),Ts(t,i,a),Ds(t,i,a,n),qs(null,t,i,!0,e,n);case 19:return ic(e,t,n);case 22:return Us(e,t,n)}throw Error(r(156,t.tag))};function Wl(e,t){return gt(e,t)}function Gl(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Kl(e,t,n,r){return new Gl(e,t,n,r)}function ql(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Jl(e){if(typeof e==`function`)return+!!ql(e);if(e!=null){if(e=e.$$typeof,e===D)return 11;if(e===k)return 14}return 2}function Yl(e,t){var n=e.alternate;return n===null?(n=Kl(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Xl(e,t,n,i,a,o){var s=2;if(i=e,typeof e==`function`)ql(e)&&(s=1);else if(typeof e==`string`)s=5;else a:switch(e){case T:return Zl(n.children,a,o,t);case te:s=8,a|=8;break;case ne:return e=Kl(12,n,t,a|2),e.elementType=ne,e.lanes=o,e;case O:return e=Kl(13,n,t,a),e.elementType=O,e.lanes=o,e;case ie:return e=Kl(19,n,t,a),e.elementType=ie,e.lanes=o,e;case oe:return Ql(n,a,o,t);default:if(typeof e==`object`&&e)switch(e.$$typeof){case re:s=10;break a;case E:s=9;break a;case D:s=11;break a;case k:s=14;break a;case ae:s=16,i=null;break a}throw Error(r(130,e==null?e:typeof e,``))}return t=Kl(s,n,t,a),t.elementType=e,t.type=i,t.lanes=o,t}function Zl(e,t,n,r){return e=Kl(7,e,r,t),e.lanes=n,e}function Ql(e,t,n,r){return e=Kl(22,e,r,t),e.elementType=oe,e.lanes=n,e.stateNode={isHidden:!1},e}function $l(e,t,n){return e=Kl(6,e,null,t),e.lanes=n,e}function eu(e,t,n){return t=Kl(4,e.children===null?[]:e.children,e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function tu(e,t,n,r,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Vt(0),this.expirationTimes=Vt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Vt(0),this.identifierPrefix=r,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function nu(e,t,n,r,i,a,o,s,c){return e=new tu(e,t,n,s,c),t===1?(t=1,!0===a&&(t|=8)):t=0,a=Kl(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},ao(a),e}function ru(e,t,n){var r=3{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=m();e.createRoot=t.createRoot,e.hydrateRoot=t.hydrateRoot})),g=c(u(),1),_=h(),v=`cps.web.deviceCredential`,y=class extends Error{constructor(e=`此浏览器需要重新配对。请重新运行 codex-provider web。`){super(e),this.name=`PairingRequiredError`}},b=class extends Error{constructor(e,t,n){super(t||`配置已变更,请重新确认。`),this.name=`ProfileRevisionError`,this.code=e,this.profile=n}};function x(){return!!window.localStorage.getItem(v)}async function ee(){let e=new URLSearchParams(window.location.hash.replace(/^#/,``)).get(`pair`);if(!e)return x();let t=await fetch(`/api/pair`,{method:`POST`,headers:{"X-Codex-Provider-Pairing":e}}),n=await t.json().catch(()=>({}));if(!t.ok||!n.deviceCredential)throw new y(n.error??`配对链接无效、已过期或已被使用。请重新运行 codex-provider web。`);return window.localStorage.setItem(v,n.deviceCredential),window.history.replaceState(null,``,`${window.location.pathname}${window.location.search}`),!0}function S(){return{"X-Codex-Provider-Device":window.localStorage.getItem(v)??``}}function C(e,t,n){return t===409&&[`PROFILE_REVISION_REQUIRED`,`PROFILE_CHANGED`,`STORAGE_REVISION_REQUIRED`,`STORAGE_CHANGED`].includes(e.code)?new b(e.code,e.error,e.profile):Error(e.error??n)}async function w(e,t){let n=await e.json().catch(()=>({}));if(!e.ok)throw n.code===`PAIRING_REQUIRED`?(window.dispatchEvent(new CustomEvent(`cps:pairing-required`,{detail:n.error})),new y(n.error)):C(n,e.status,t);return n}async function T(e,t={},{signal:n}={}){let r=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`,...S()},body:JSON.stringify(t),signal:n});return w(r,`Request failed with HTTP ${r.status}.`)}async function te(e=0){let t=await fetch(`/api/activity?after=${e}`,{headers:S()});return w(t,`Activity request failed with HTTP ${t.status}.`)}async function ne(){let e=await fetch(`/api/profiles`,{headers:S()});return w(e,`Profile request failed with HTTP ${e.status}.`)}async function re(){try{await T(`/api/access/forget`)}finally{window.localStorage.removeItem(v)}}async function E(e={},t={}){return T(`/api/history`,e,t)}async function D(e={},t={}){return T(`/api/history/session`,e,t)}function O(e,t){let[n,r]=(0,g.useState)(()=>{try{let n=window.localStorage.getItem(e);return n?JSON.parse(n):t}catch{return t}});return(0,g.useEffect)(()=>{window.localStorage.setItem(e,JSON.stringify(n))},[e,n]),[n,r]}function ie(){let e=0,t=null;return{begin(){return t?.abort(),t=new AbortController,e+=1,{sequence:e,controller:t,signal:t.signal}},isLatest(t){return t===e},cancel(){t?.abort(),e+=1}}}function k(e,t=300,n=globalThis){let r=n.setTimeout(e,t);return()=>n.clearTimeout(r)}function ae(e,t,n){return!e?.id||!e?.revision||n?.profileId!==e.id||n?.profileRevision!==e.revision||!n?.storageRevision?null:{...t,profile:{...e},profileId:e.id,profileRevision:e.revision,storageRevision:n.storageRevision,status:{...n}}}function oe(e){let t=e?.result?.skippedLockedRolloutFiles??e?.skippedLockedRolloutFiles??[];return Array.isArray(t)?t.filter(Boolean):[]}function se(e,{successTitle:t,partialTitle:n,message:r}){let i=oe(e);return e?.result?.outcome===`partial`||e?.outcome===`partial`||i.length>0?{tone:`warning`,title:n,message:[r,i.length?`已跳过 ${i.length} 个被占用的 rollout 文件:${i.join(`、`)}`:`部分项目未完成;请查看活动日志后重试。`].filter(Boolean).join(`;`)}:{tone:`success`,title:t,message:r}}function ce(e,t){let n=String(e??``).replaceAll(`\\`,`/`).replace(/\/{2,}/g,`/`).replace(/\/$/,``);return t===`win32`?n.toLowerCase():n}function A(e=[],{platform:t=typeof process<`u`?process.platform:`browser`}={}){let n=new Set;return e.filter((e,r)=>{let i=e?.threadId??e?.id,a=e?.rolloutPath??e?.filePath??e?.rolloutFile??e?.path,o=i?`thread:${i}`:a?`rollout:${ce(a,t)}`:`item:${r}`;return!n.has(o)&&(n.add(o),!0)})}function le(e,{caseInsensitive:t=!1}={}){let n=String(e??``).replace(/[\\/]+$/,``).replaceAll(`\\`,`/`);return t?n.toLowerCase():n}function ue(e,t,n){return!!(e&&t&&le(e,n)===le(t,n))}function de(e){let t=String(e??``).replace(/[\\/]+$/,``),n=Math.max(t.lastIndexOf(`/`),t.lastIndexOf(`\\`));return n<0?``:n===0?t.slice(0,1):n===2&&/^[A-Za-z]:/.test(t)?t.slice(0,3):t.slice(0,n)}function fe(e,t){let n=e?.stateDbLocation?.path;if(n)return de(n);let r=t?.metadata,i={caseInsensitive:e?.pathComparisonCaseInsensitive===!0};return Number(r?.version)>=2&&e?.sqliteHomeSource==="default"&&ue(r?.sqliteHome,e?.codexHome,i)?e.codexHome:e?.sqliteHome??``}function pe({backup:e,profile:t,targetSqliteHome:n,restoreDatabase:r,restoreConfig:i,sqliteSupported:a,pathComparisonCaseInsensitive:o=!1}){let s=e?.metadata?.sqliteHome,c=t?.sqliteHome?.trim()??``,l=!!(r&&s&&n&&!ue(s,n,{caseInsensitive:o})),u=l&&!c,d=l&&i;return{requiresRelocation:l,missingExplicitTarget:u,configRestoreConflict:d,canSubmit:!!a&&!u&&!d}}function me(e){return{profileId:e||`default`}}function he({fetchStatus:e,fetchBackups:t,gate:n=ie()}){let r=async({profileId:r,showLoading:i=!0,onLoading:a,onResult:o,onError:s})=>{let{controller:c,sequence:l}=n.begin();i&&a?.(!0);try{let i=me(r),[a,s]=await Promise.all([e(i,{signal:c.signal}),t(i,{signal:c.signal})]);return n.isLatest(l)?(o?.({profileId:r,status:a.status,backups:s}),!0):!1}catch(e){return e?.name===`AbortError`||!n.isLatest(l)||s?.(e),!1}finally{n.isLatest(l)&&a?.(!1)}};return r.cancel=()=>n.cancel(),r}var j=o((e=>{var t=u(),n=Symbol.for(`react.element`),r=Symbol.for(`react.fragment`),i=Object.prototype.hasOwnProperty,a=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,o={key:!0,ref:!0,__self:!0,__source:!0};function s(e,t,r){var s,c={},l=null,u=null;for(s in r!==void 0&&(l=``+r),t.key!==void 0&&(l=``+t.key),t.ref!==void 0&&(u=t.ref),t)i.call(t,s)&&!o.hasOwnProperty(s)&&(c[s]=t[s]);if(e&&e.defaultProps)for(s in t=e.defaultProps,t)c[s]===void 0&&(c[s]=t[s]);return{$$typeof:n,type:e,key:l,ref:u,props:c,_owner:a.current}}e.Fragment=r,e.jsx=s,e.jsxs=s})),M=o(((e,t)=>{t.exports=j()}))();function N({children:e,size:t=18,className:n=``}){return(0,M.jsx)(`svg`,{className:n,width:t,height:t,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:e})}var P=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M20 6v5h-5`}),(0,M.jsx)(`path`,{d:`M4 18v-5h5`}),(0,M.jsx)(`path`,{d:`M18.3 9A7 7 0 0 0 6.7 6.7L4 11`}),(0,M.jsx)(`path`,{d:`M5.7 15A7 7 0 0 0 17.3 17.3L20 13`})]}),ge=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`ellipse`,{cx:`12`,cy:`5`,rx:`8`,ry:`3`}),(0,M.jsx)(`path`,{d:`M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5`}),(0,M.jsx)(`path`,{d:`M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6`})]}),_e=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M3 12a9 9 0 1 0 3-6.7L3 8`}),(0,M.jsx)(`path`,{d:`M3 3v5h5`}),(0,M.jsx)(`path`,{d:`M12 7v5l3 2`})]}),ve=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`M3 12h4l2-7 4 14 2-7h6`})}),ye=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`,rx:`1`}),(0,M.jsx)(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`,rx:`1`}),(0,M.jsx)(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1`}),(0,M.jsx)(`rect`,{x:`14`,y:`14`,width:`7`,height:`7`,rx:`1`})]}),be=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M12 3 4.5 6v5.3c0 4.6 3.2 8 7.5 9.7 4.3-1.7 7.5-5.1 7.5-9.7V6L12 3Z`}),(0,M.jsx)(`path`,{d:`m9 12 2 2 4-4`})]}),xe=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`m9 18 6-6-6-6`})}),Se=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`m6 6 12 12M18 6 6 18`})}),Ce=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`m5 12 4 4L19 6`})}),F=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M12 3 2.8 19h18.4L12 3Z`}),(0,M.jsx)(`path`,{d:`M12 9v4M12 17h.01`})]}),we=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`M3 6.5h6l2 2h10v9.5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6.5Z`})}),Te=[{id:`overview`,label:`概览`,icon:ye},{id:`history`,label:`聊天记录`,icon:_e},{id:`backups`,label:`备份`,icon:_e},{id:`activity`,label:`活动`,icon:ve}],Ee={backupRoot:``,backups:[]};function De(e){return new Intl.NumberFormat(`zh-CN`).format(Number(e)||0)}function Oe(e){let t=[`B`,`KB`,`MB`,`GB`,`TB`],n=Number(e)||0,r=0;for(;n>=1024&&r=10?1:2).replace(/\.0$/,``)} ${t[r]}`}function ke(e){return e?new Intl.DateTimeFormat(`zh-CN`,{month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}).format(new Date(e)):`未知时间`}function Ae(e,t){return e.split(/(`[^`]+`|\*\*[^*]+\*\*|\*[^*]+\*)/g).map((e,n)=>e.startsWith("`")&&e.endsWith("`")?(0,M.jsx)(`code`,{children:e.slice(1,-1)},`${t}-code-${n}`):e.startsWith(`**`)&&e.endsWith(`**`)?(0,M.jsx)(`strong`,{children:e.slice(2,-2)},`${t}-strong-${n}`):e.startsWith(`*`)&&e.endsWith(`*`)?(0,M.jsx)(`em`,{children:e.slice(1,-1)},`${t}-em-${n}`):(0,M.jsx)(g.Fragment,{children:e},`${t}-text-${n}`))}function je({text:e}){return String(e??``).split(/(```[^\n]*\n[\s\S]*?```)/g).map((e,t)=>{if(e.startsWith("```")&&e.endsWith("```")){let n=e.slice(3,-3).replace(/^\w*\n/,``);return(0,M.jsx)(`pre`,{children:(0,M.jsx)(`code`,{children:n})},`block-${t}`)}return e.split(` +`).map((e,n,r)=>(0,M.jsxs)(g.Fragment,{children:[Ae(e,`${t}-${n}`),n{for(let r of e??[]){if(!r||r===`(missing)`)continue;let e=t.get(r)??new Set;e.add(n),t.set(r,e)}};return n(e.configuredProviders,`config`),n(Object.keys(e.rolloutCounts?.sessions??{}),`rollout`),n(Object.keys(e.rolloutCounts?.archived_sessions??{}),`rollout`),n(Object.keys(e.sqliteCounts?.sessions??{}),`sqlite`),n(Object.keys(e.sqliteCounts?.archived_sessions??{}),`sqlite`),n([e.currentProvider],`config`),[...t.entries()].map(([t,n])=>({id:t,sources:[...n],configured:e.configuredProviders?.includes(t),current:t===e.currentProvider})).sort((e,t)=>Number(t.current)-Number(e.current)||e.id.localeCompare(t.id))}function Ne({tone:e=`neutral`}){return(0,M.jsx)(`span`,{className:`status-dot status-dot--${e}`,"aria-hidden":`true`})}function Pe({status:e,busy:t,onRefresh:n}){let r=e?.sqliteAccess?.supported!==!1&&!e?.sqliteCounts?.unreadable;return(0,M.jsxs)(`header`,{className:`app-header`,children:[(0,M.jsxs)(`div`,{className:`brand`,children:[(0,M.jsx)(`div`,{className:`brand-mark`,children:(0,M.jsx)(ge,{size:19})}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`brand-name`,children:`Codex Provider Sync`}),(0,M.jsx)(`div`,{className:`brand-subtitle`,children:`本机元数据一致性工具`})]})]}),(0,M.jsxs)(`div`,{className:`header-actions`,children:[(0,M.jsxs)(`div`,{className:`service-state`,children:[(0,M.jsx)(Ne,{tone:t?`warning`:r?`success`:`danger`}),(0,M.jsx)(`span`,{children:t?`操作执行中`:r?`本地服务就绪`:`需要检查`})]}),(0,M.jsxs)(`button`,{className:`button button--secondary button--compact`,type:`button`,onClick:n,disabled:t,children:[(0,M.jsx)(P,{size:16}),`刷新`]})]})]})}function Fe({view:e,setView:t,status:n,onForgetBrowser:r}){return(0,M.jsxs)(`aside`,{className:`sidebar`,children:[(0,M.jsx)(`nav`,{className:`navigation`,"aria-label":`主导航`,children:Te.map(n=>{let r=n.icon;return(0,M.jsxs)(`button`,{className:`nav-item ${e===n.id?`nav-item--active`:``}`,type:`button`,onClick:()=>t(n.id),children:[(0,M.jsx)(r,{size:17}),(0,M.jsx)(`span`,{children:n.label})]},n.id)})}),(0,M.jsxs)(`div`,{className:`sidebar-foot`,children:[(0,M.jsx)(`div`,{className:`sidebar-provider-label`,children:`当前 Provider`}),(0,M.jsxs)(`div`,{className:`sidebar-provider-value`,children:[(0,M.jsx)(Ne,{tone:`success`}),(0,M.jsx)(`span`,{children:n?.currentProvider??`未读取`})]}),(0,M.jsx)(`div`,{className:`sidebar-version`,children:`Web UI · localhost only`}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,onClick:r,children:`忘记此浏览器`})]})]})}function Ie({profiles:e,profileId:t,setProfileId:n,status:r,onAddProfile:i,onDeleteProfile:a,onRefresh:o,loading:s,profileSwitchDisabled:c}){return(0,M.jsxs)(`section`,{className:`storage-bar`,"aria-label":`存储位置`,children:[(0,M.jsxs)(`label`,{className:`path-field path-field--wide`,children:[(0,M.jsx)(`span`,{children:`存储配置`}),(0,M.jsxs)(`div`,{className:`path-input-wrap`,children:[(0,M.jsx)(we,{size:16}),(0,M.jsx)(`select`,{value:t,onChange:e=>n(e.target.value),disabled:c,children:e.map(e=>(0,M.jsx)(`option`,{value:e.id,children:e.name},e.id))})]})]}),(0,M.jsxs)(`label`,{className:`path-field`,children:[(0,M.jsxs)(`span`,{children:[`当前路径 `,(0,M.jsx)(`small`,{children:`由服务端解析`})]}),(0,M.jsxs)(`div`,{className:`path-input-wrap`,children:[(0,M.jsx)(ge,{size:16}),(0,M.jsx)(`input`,{value:r?.codexHome??``,readOnly:!0,placeholder:`读取状态后显示`})]})]}),(0,M.jsx)(`button`,{className:`button button--secondary storage-refresh`,type:`button`,onClick:i,children:`新增配置`}),t==="default"?null:(0,M.jsx)(`button`,{className:`button button--quiet storage-refresh`,type:`button`,onClick:a,children:`删除配置`}),(0,M.jsxs)(`button`,{className:`button button--secondary storage-refresh`,type:`button`,onClick:o,disabled:s,children:[(0,M.jsx)(P,{size:16,className:s?`spin`:``}),`读取状态`]})]})}function Le({title:e,counts:t,currentProvider:n}){let r=Object.entries(t??{}).sort((e,t)=>t[1]-e[1]),i=r.reduce((e,[,t])=>e+t,0);return(0,M.jsxs)(`div`,{className:`distribution-block`,children:[(0,M.jsxs)(`div`,{className:`distribution-heading`,children:[(0,M.jsx)(`span`,{children:e}),(0,M.jsx)(`strong`,{children:De(i)})]}),(0,M.jsx)(`div`,{className:`distribution-list`,children:r.length===0?(0,M.jsx)(`div`,{className:`empty-inline`,children:`无记录`}):r.map(([e,t])=>(0,M.jsxs)(`div`,{className:`distribution-row`,children:[(0,M.jsxs)(`div`,{className:`distribution-meta`,children:[(0,M.jsx)(`span`,{className:`provider-name`,children:e}),(0,M.jsx)(`span`,{children:De(t)})]}),(0,M.jsx)(`div`,{className:`bar-track`,children:(0,M.jsx)(`span`,{className:e===n?`bar-fill bar-fill--current`:`bar-fill`,style:{width:`${Math.max(5,i?t/i*100:0)}%`}})})]},e))})]})}function Re({status:e,loading:t}){let n=Object.values(e?.rolloutCounts?.sessions??{}).reduce((e,t)=>e+t,0)+Object.values(e?.rolloutCounts?.archived_sessions??{}).reduce((e,t)=>e+t,0),r=Object.values(e?.sqliteCounts?.sessions??{}).reduce((e,t)=>e+t,0)+Object.values(e?.sqliteCounts?.archived_sessions??{}).reduce((e,t)=>e+t,0),i=e?.alignment?.aligned;return(0,M.jsxs)(`section`,{className:`status-panel`,children:[(0,M.jsxs)(`div`,{className:`section-title-row`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`状态总览`}),(0,M.jsx)(`p`,{children:`比较 rollout 文件、SQLite 线程索引和当前 Provider。`})]}),(0,M.jsxs)(`div`,{className:`alignment-state ${i?`alignment-state--success`:`alignment-state--warning`}`,children:[t?(0,M.jsx)(P,{size:16,className:`spin`}):i?(0,M.jsx)(Ce,{size:16}):(0,M.jsx)(F,{size:16}),(0,M.jsx)(`span`,{children:t?`正在检查`:i?`Provider 元数据已对齐`:`发现不一致`})]})]}),(0,M.jsxs)(`div`,{className:`summary-strip`,children:[(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`当前 Provider`}),(0,M.jsx)(`strong`,{children:e?.currentProvider??`—`}),(0,M.jsx)(`small`,{children:e?.currentProviderImplicit?`隐式默认`:`config.toml 根级配置`})]}),(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`Rollout 文件`}),(0,M.jsx)(`strong`,{children:De(n)}),(0,M.jsx)(`small`,{children:`sessions + archived`})]}),(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`SQLite threads`}),(0,M.jsx)(`strong`,{children:e?.sqliteCounts?.unreadable?`不可读`:De(r)}),(0,M.jsx)(`small`,{children:e?.stateDbLocation?.source??`未定位数据库`})]}),(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`托管备份`}),(0,M.jsx)(`strong`,{children:De(e?.backupSummary?.count)}),(0,M.jsx)(`small`,{children:Oe(e?.backupSummary?.totalBytes)})]})]}),(0,M.jsxs)(`div`,{className:`distribution-grid`,children:[(0,M.jsxs)(`div`,{className:`distribution-column`,children:[(0,M.jsxs)(`div`,{className:`column-label`,children:[(0,M.jsx)(we,{size:16}),` Rollout files`]}),(0,M.jsx)(Le,{title:`sessions`,counts:e?.rolloutCounts?.sessions,currentProvider:e?.currentProvider}),(0,M.jsx)(Le,{title:`archived_sessions`,counts:e?.rolloutCounts?.archived_sessions,currentProvider:e?.currentProvider})]}),(0,M.jsx)(`div`,{className:`distribution-divider`}),(0,M.jsxs)(`div`,{className:`distribution-column`,children:[(0,M.jsxs)(`div`,{className:`column-label`,children:[(0,M.jsx)(ge,{size:16}),` SQLite state`]}),(0,M.jsx)(Le,{title:`sessions`,counts:e?.sqliteCounts?.sessions,currentProvider:e?.currentProvider}),(0,M.jsx)(Le,{title:`archived_sessions`,counts:e?.sqliteCounts?.archived_sessions,currentProvider:e?.currentProvider})]})]})]})}function ze({status:e}){let t=[];e?.sqliteAccess?.supported===!1&&t.push({tone:`danger`,title:`SQLite 路径不可安全访问`,detail:e.sqliteAccess.message}),e?.sqliteCounts?.unreadable&&t.push({tone:`danger`,title:`SQLite 当前不可读`,detail:e.sqliteCounts.error}),e?.lockedRolloutFiles?.length&&t.push({tone:`warning`,title:`${e.lockedRolloutFiles.length} 个 rollout 文件正在使用`,detail:`同步会跳过这些活跃文件;会话结束后可再次执行。`}),e?.encryptedContentWarning&&t.push({tone:`warning`,title:`检测到 encrypted_content`,detail:e.encryptedContentWarning});let n=e?.sqliteRepairStats;return(n?.userEventRowsNeedingRepair||n?.cwdRowsNeedingRepair)&&t.push({tone:`info`,title:`SQLite 有待修复字段`,detail:`user-event ${n.userEventRowsNeedingRepair??0},cwd ${n.cwdRowsNeedingRepair??0}`}),t.length===0?null:(0,M.jsx)(`section`,{className:`warning-stack`,"aria-label":`诊断信息`,children:t.map((e,t)=>(0,M.jsxs)(`div`,{className:`warning-row warning-row--${e.tone}`,children:[(0,M.jsx)(F,{size:17}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:e.title}),(0,M.jsx)(`span`,{children:e.detail})]})]},`${e.title}-${t}`))})}function Be({projects:e=[]}){return(0,M.jsxs)(`section`,{className:`data-section`,children:[(0,M.jsx)(`div`,{className:`section-title-row section-title-row--compact`,children:(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`项目可见性`}),(0,M.jsx)(`p`,{children:`检查 Desktop 项目路径、全局排序和首屏 50 条命中。`})]})}),(0,M.jsx)(`div`,{className:`table-scroll`,children:(0,M.jsxs)(`table`,{className:`data-table`,children:[(0,M.jsx)(`thead`,{children:(0,M.jsxs)(`tr`,{children:[(0,M.jsx)(`th`,{children:`项目根目录`}),(0,M.jsx)(`th`,{children:`交互会话`}),(0,M.jsx)(`th`,{children:`首屏`}),(0,M.jsx)(`th`,{children:`Ranks`}),(0,M.jsx)(`th`,{children:`CWD 精确匹配`}),(0,M.jsx)(`th`,{children:`Provider`})]})}),(0,M.jsx)(`tbody`,{children:e.length===0?(0,M.jsx)(`tr`,{children:(0,M.jsx)(`td`,{colSpan:`6`,className:`table-empty`,children:`没有可显示的项目诊断。`})}):e.map(e=>(0,M.jsxs)(`tr`,{children:[(0,M.jsx)(`td`,{className:`path-cell`,children:e.root}),(0,M.jsx)(`td`,{children:e.interactiveThreads}),(0,M.jsxs)(`td`,{children:[e.firstPageThreads,`/50`]}),(0,M.jsx)(`td`,{children:e.rankPreview||`—`}),(0,M.jsxs)(`td`,{children:[e.exactCwdMatches,`/`,e.interactiveThreads]}),(0,M.jsx)(`td`,{children:Object.entries(e.providerCounts??{}).map(([e,t])=>`${e} ${t}`).join(` · `)||`—`})]},e.root))})]})})]})}function Ve({value:e,onChange:t,disabled:n}){return(0,M.jsxs)(`div`,{className:`segmented`,role:`radiogroup`,"aria-label":`执行模式`,children:[(0,M.jsxs)(`button`,{type:`button`,className:e===`sync`?`segmented-option segmented-option--active`:`segmented-option`,onClick:()=>t(`sync`),disabled:n,children:[(0,M.jsx)(`span`,{children:`仅同步元数据`}),(0,M.jsx)(`small`,{children:`不修改 config.toml`})]}),(0,M.jsxs)(`button`,{type:`button`,className:e===`switch`?`segmented-option segmented-option--active`:`segmented-option`,onClick:()=>t(`switch`),disabled:n,children:[(0,M.jsx)(`span`,{children:`切换 Provider 并同步`}),(0,M.jsx)(`small`,{children:`更新根级配置`})]})]})}function He({status:e,providers:t,selectedProvider:n,setSelectedProvider:r,onAddManualProvider:i,onRemoveManualProvider:a,onRequestExecute:o,busy:s}){let[c,l]=O(`cps.web.mode`,`sync`),[u,d]=O(`cps.web.modelMode`,`auto`),[f,p]=O(`cps.web.customModel`,``),[m,h]=O(`cps.web.keepCount`,5),[_,v]=(0,g.useState)(``),y=t.find(e=>e.id===n),b=y?.configured,x=/^[A-Za-z0-9_.-]+$/.test(_.trim()),ee=e?.sqliteAccess?.supported===!1,S=s||!n||ee||e?.sqliteCounts?.unreadable;return(0,M.jsxs)(`section`,{className:`execution-panel`,children:[(0,M.jsxs)(`div`,{className:`execution-head`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`执行同步`}),(0,M.jsx)(`p`,{children:`所有写操作都会先创建备份。执行前请关闭 Codex CLI、App 和 app-server。`})]}),(0,M.jsx)(be,{size:22})]}),(0,M.jsx)(Ve,{value:c,onChange:l,disabled:s}),(0,M.jsxs)(`div`,{className:`form-grid`,children:[(0,M.jsxs)(`label`,{className:`form-field`,children:[(0,M.jsx)(`span`,{children:`目标 Provider`}),(0,M.jsx)(`select`,{value:n,onChange:e=>r(e.target.value),disabled:s,children:t.map(e=>(0,M.jsxs)(`option`,{value:e.id,children:[e.id,e.current?`(当前)`:``]},e.id))}),c===`switch`&&!b?(0,M.jsx)(`small`,{className:`field-error`,children:`切换模式要求该 Provider 已定义在 config.toml。`}):null]}),(0,M.jsxs)(`label`,{className:`form-field form-field--short`,children:[(0,M.jsx)(`span`,{children:`保留备份数`}),(0,M.jsx)(`input`,{type:`number`,min:`1`,max:`100000`,value:m,onChange:e=>h(Number(e.target.value)),disabled:s}),(0,M.jsx)(`small`,{children:`同步后自动清理`})]})]}),(0,M.jsxs)(`div`,{className:`manual-provider-row`,children:[(0,M.jsx)(`input`,{type:`text`,value:_,onChange:e=>v(e.target.value),placeholder:`手动添加 Provider ID`,spellCheck:`false`,disabled:s}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:s||!x,onClick:()=>{i(_.trim()),v(``)},children:`添加`}),y?.manual?(0,M.jsx)(`button`,{className:`manual-remove`,type:`button`,onClick:()=>a(n),disabled:s,children:`删除当前手动项`}):null]}),c===`switch`?(0,M.jsxs)(`fieldset`,{className:`model-options`,disabled:s,children:[(0,M.jsx)(`legend`,{children:`根级 model`}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`auto`,onChange:()=>d(`auto`)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`跟随 Provider 配置`}),(0,M.jsxs)(`small`,{children:["采用 `[model_providers.",n,"]` 中的 model"]})]})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`keep`,onChange:()=>d(`keep`)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`保留当前根级 model`}),(0,M.jsx)(`small`,{children:`只切换 model_provider`})]})]}),(0,M.jsxs)(`label`,{className:`custom-model-option`,children:[(0,M.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`custom`,onChange:()=>d(`custom`)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`自定义 model`}),(0,M.jsx)(`input`,{type:`text`,value:f,onFocus:()=>d(`custom`),onChange:e=>p(e.target.value),placeholder:`例如 MiniMax-M3`})]})]})]}):null,ee?(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`此 SQLite 布局仅供诊断`}),(0,M.jsx)(`span`,{children:e?.sqliteAccess?.message||`当前 SQLite 路径不可由 Web UI 安全写入,因此已禁用执行同步。`})]})]}):null,(0,M.jsxs)(`div`,{className:`backup-assurance`,children:[(0,M.jsx)(Ce,{size:16}),(0,M.jsx)(`span`,{children:`修改前创建 metadata v2 备份,并记录 SQLite Home`})]}),(0,M.jsxs)(`button`,{className:`button button--primary execute-button`,type:`button`,disabled:S||c===`switch`&&!b||c===`switch`&&u===`custom`&&!f.trim(),onClick:()=>o({mode:c,modelMode:u,model:f.trim(),keepCount:m}),children:[s?(0,M.jsx)(P,{size:17,className:`spin`}):(0,M.jsx)(be,{size:17}),s?`正在执行…`:c===`switch`?`切换并同步`:`执行同步`]})]})}function Ue({backups:e,onViewAll:t,onRestore:n,restoreDisabled:r}){return(0,M.jsxs)(`section`,{className:`recent-backups`,children:[(0,M.jsxs)(`div`,{className:`section-title-row section-title-row--compact`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`最近备份`}),(0,M.jsx)(`p`,{children:e.backupRoot||`同步后将在 Codex Home 下创建备份`})]}),(0,M.jsxs)(`button`,{type:`button`,className:`text-button`,onClick:t,children:[`查看全部 `,(0,M.jsx)(xe,{size:14})]})]}),(0,M.jsx)(`div`,{className:`backup-rows`,children:e.backups.length===0?(0,M.jsx)(`div`,{className:`empty-state`,children:`尚无由本工具创建的备份。`}):e.backups.slice(0,3).map(e=>(0,M.jsxs)(`div`,{className:`backup-row`,children:[(0,M.jsx)(`div`,{className:`backup-icon`,children:(0,M.jsx)(_e,{size:17})}),(0,M.jsxs)(`div`,{className:`backup-main`,children:[(0,M.jsx)(`strong`,{children:ke(e.metadata.createdAt)}),(0,M.jsxs)(`span`,{children:[e.metadata.targetProvider,` · `,e.metadata.changedSessionFiles??0,` 个 rollout`]})]}),(0,M.jsx)(`div`,{className:`backup-size`,children:Oe(e.sizeBytes)}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:r,title:r?`当前 SQLite 路径仅供诊断,不能恢复`:void 0,onClick:()=>n(e),children:`恢复`})]},e.id))})]})}function We({status:e,backups:t,providers:n,selectedProvider:r,setSelectedProvider:i,onAddManualProvider:a,onRemoveManualProvider:o,onExecute:s,onRestore:c,setView:l,busy:u,loading:d}){return(0,M.jsxs)(`div`,{className:`view-content`,children:[(0,M.jsx)(Re,{status:e,loading:d}),(0,M.jsx)(ze,{status:e}),(0,M.jsxs)(`div`,{className:`overview-lower-grid`,children:[(0,M.jsxs)(`div`,{className:`overview-main-column`,children:[(0,M.jsx)(Be,{projects:e?.projectThreadVisibility??[]}),(0,M.jsx)(Ue,{backups:t,onViewAll:()=>l(`backups`),onRestore:c,restoreDisabled:e?.sqliteAccess?.supported===!1})]}),(0,M.jsx)(He,{status:e,providers:n,selectedProvider:r,setSelectedProvider:i,onAddManualProvider:a,onRemoveManualProvider:o,onRequestExecute:s,busy:u})]})]})}function Ge({backups:e,status:t,busy:n,onRestore:r,onPrune:i}){let[a,o]=O(`cps.web.keepCount`,5),s=t?.sqliteAccess?.supported===!1;return(0,M.jsxs)(`div`,{className:`view-content`,children:[(0,M.jsxs)(`section`,{className:`page-intro`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h1`,{children:`备份`}),(0,M.jsx)(`p`,{children:`管理当前 Codex Home 下由本工具创建的 metadata v2 备份。`})]}),(0,M.jsxs)(`div`,{className:`prune-control`,children:[(0,M.jsxs)(`label`,{children:[`保留最近 `,(0,M.jsx)(`input`,{type:`number`,min:`0`,max:`100000`,value:a,onChange:e=>o(Number(e.target.value))}),` 份`]}),(0,M.jsx)(`button`,{className:`button button--secondary`,type:`button`,disabled:n,onClick:()=>i(a),children:`清理旧备份`})]})]}),(0,M.jsxs)(`section`,{className:`backup-list-section`,children:[(0,M.jsxs)(`div`,{className:`backup-root-line`,children:[(0,M.jsx)(we,{size:16}),(0,M.jsx)(`span`,{children:e.backupRoot||t?.backupRoot||`—`}),(0,M.jsxs)(`strong`,{children:[e.backups.length,` 份 · `,Oe(e.backups.reduce((e,t)=>e+t.sizeBytes,0))]})]}),(0,M.jsx)(`div`,{className:`full-backup-list`,children:e.backups.length===0?(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(_e,{size:26}),(0,M.jsx)(`strong`,{children:`还没有备份`}),(0,M.jsx)(`span`,{children:`执行一次同步或切换后,备份会显示在这里。`})]}):e.backups.map(e=>(0,M.jsxs)(`article`,{className:`full-backup-row`,children:[(0,M.jsxs)(`div`,{className:`backup-date`,children:[(0,M.jsx)(`strong`,{children:ke(e.metadata.createdAt)}),(0,M.jsx)(`span`,{children:e.id})]}),(0,M.jsxs)(`div`,{className:`backup-facts`,children:[(0,M.jsxs)(`span`,{children:[`Provider `,(0,M.jsx)(`strong`,{children:e.metadata.targetProvider})]}),(0,M.jsxs)(`span`,{children:[`Rollout `,(0,M.jsx)(`strong`,{children:e.metadata.changedSessionFiles??0})]}),(0,M.jsxs)(`span`,{children:[`SQLite `,(0,M.jsx)(`strong`,{children:e.metadata.sqliteDbFiles?.length?`已包含`:`未包含`})]})]}),(0,M.jsxs)(`div`,{className:`backup-source`,children:[(0,M.jsx)(`span`,{children:`SQLite Home`}),(0,M.jsx)(`code`,{children:e.metadata.sqliteHome??`旧版 metadata 未记录`})]}),(0,M.jsxs)(`div`,{className:`backup-row-actions`,children:[(0,M.jsx)(`span`,{children:Oe(e.sizeBytes)}),(0,M.jsx)(`button`,{className:`button button--secondary button--compact`,type:`button`,disabled:n||s,title:s?`当前 SQLite 路径仅供诊断,不能恢复`:void 0,onClick:()=>r(e),children:`恢复`})]})]},e.id))})]})]})}function Ke({activity:e,activeOperation:t}){return(0,M.jsxs)(`div`,{className:`view-content`,children:[(0,M.jsxs)(`section`,{className:`page-intro`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h1`,{children:`活动日志`}),(0,M.jsx)(`p`,{children:`当前 Web UI 会话中的状态刷新、同步阶段和操作结果。`})]}),t?(0,M.jsxs)(`div`,{className:`live-operation`,children:[(0,M.jsx)(P,{size:16,className:`spin`}),` `,t.kind]}):null]}),(0,M.jsxs)(`section`,{className:`activity-console`,children:[(0,M.jsxs)(`div`,{className:`console-head`,children:[(0,M.jsx)(`span`,{children:`Activity log`}),(0,M.jsxs)(`span`,{children:[e.length,` entries`]})]}),(0,M.jsx)(`div`,{className:`console-body`,children:e.length===0?(0,M.jsx)(`div`,{className:`console-empty`,children:`等待操作…`}):e.map(e=>(0,M.jsxs)(`div`,{className:`console-row console-row--${e.level}`,children:[(0,M.jsx)(`time`,{children:ke(e.timestamp)}),(0,M.jsx)(`span`,{className:`console-level`,children:e.level}),(0,M.jsx)(`span`,{className:`console-message`,children:e.message}),typeof e.detail==`string`?(0,M.jsx)(`span`,{className:`console-detail`,children:e.detail}):null]},e.id))})]})]})}function qe({profileId:e,status:t}){let[n,r]=(0,g.useState)(``),[i,a]=(0,g.useState)(``),[o,s]=(0,g.useState)(``),[c,l]=(0,g.useState)(``),[u,d]=(0,g.useState)(`all`),[f,p]=(0,g.useState)(1),[m,h]=(0,g.useState)({sessions:[],total:0,pageSize:50,hasNextPage:!1}),[_,v]=(0,g.useState)(``),[y,b]=(0,g.useState)(null),[x,ee]=(0,g.useState)(!1),[S,C]=(0,g.useState)(!1),[w,T]=(0,g.useState)(``),te=(0,g.useRef)(null),ne=(0,g.useRef)(null);te.current||=ie(),ne.current||=ie();let re=Me(t),O=[...new Set((t?.projectThreadVisibility??[]).map(e=>e.root))];(0,g.useEffect)(()=>{te.current.cancel(),ne.current.cancel(),r(``),a(``),s(``),l(``),d(`all`),p(1),h({sessions:[],total:0,pageSize:50,hasNextPage:!1}),v(``),b(null),T(``)},[e]),(0,g.useEffect)(()=>k(()=>a(n),300,window),[n]);let ae=(0,g.useCallback)(async()=>{let{controller:t,sequence:n}=te.current.begin();ee(!0),T(``);try{let r=await E({...me(e),page:f,pageSize:50,query:i,provider:o,project:c,archived:u},{signal:t.signal});if(!te.current.isLatest(n))return;let a={...r.history,sessions:A(r.history?.sessions)};h(a),v(e=>a.sessions.some(t=>t.id===e)?e:a.sessions[0]?.id??``)}catch(e){e.name!==`AbortError`&&te.current.isLatest(n)&&T(e.message)}finally{te.current.isLatest(n)&&ee(!1)}},[e,f,i,o,c,u]);(0,g.useEffect)(()=>(ae(),()=>te.current.cancel()),[ae]),(0,g.useEffect)(()=>{if(ne.current.cancel(),!_){b(null),C(!1);return}let{controller:t,sequence:n}=ne.current.begin();return b(null),C(!0),T(``),D({...me(e),sessionId:_},{signal:t.signal}).then(e=>{ne.current.isLatest(n)&&b(e.history)}).catch(e=>{e.name!==`AbortError`&&ne.current.isLatest(n)&&T(e.message)}).finally(()=>{ne.current.isLatest(n)&&C(!1)}),()=>t.abort()},[e,_]);let oe=e=>t=>{e(t.target.value),p(1)};return(0,M.jsxs)(`div`,{className:`view-content history-view`,children:[(0,M.jsxs)(`section`,{className:`page-intro`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h1`,{children:`聊天记录`}),(0,M.jsx)(`p`,{children:`从 rollout 文件读取历史会话,只读查看,不修改本地数据。`})]}),(0,M.jsxs)(`button`,{className:`button button--secondary`,type:`button`,onClick:ae,disabled:x,children:[(0,M.jsx)(P,{size:16,className:x?`spin`:``}),`刷新`]})]}),(0,M.jsxs)(`section`,{className:`history-toolbar`,children:[(0,M.jsx)(`input`,{value:n,onChange:oe(r),onKeyDown:e=>{e.key===`Enter`&&(a(n),p(1))},placeholder:`搜索标题、项目、Provider 或消息内容`}),(0,M.jsxs)(`select`,{value:o,onChange:oe(s),children:[(0,M.jsx)(`option`,{value:``,children:`全部 Provider`}),re.map(e=>(0,M.jsx)(`option`,{value:e.id,children:e.id},e.id))]}),(0,M.jsxs)(`select`,{value:c,onChange:oe(l),children:[(0,M.jsx)(`option`,{value:``,children:`全部项目`}),O.map(e=>(0,M.jsx)(`option`,{value:e,children:e},e))]}),(0,M.jsxs)(`select`,{value:u,onChange:oe(d),children:[(0,M.jsx)(`option`,{value:`all`,children:`全部会话`}),(0,M.jsx)(`option`,{value:`active`,children:`活跃会话`}),(0,M.jsx)(`option`,{value:`archived`,children:`已归档`})]})]}),w?(0,M.jsxs)(`div`,{className:`history-error`,children:[(0,M.jsx)(F,{size:16}),w]}):null,(0,M.jsxs)(`section`,{className:`history-layout`,children:[(0,M.jsxs)(`div`,{className:`history-list-panel`,children:[(0,M.jsxs)(`div`,{className:`history-list-head`,children:[(0,M.jsxs)(`strong`,{children:[m.total,` 个会话`]}),(0,M.jsxs)(`span`,{children:[`第 `,m.page,` 页`]})]}),(0,M.jsxs)(`div`,{className:`history-list`,children:[x&&!m.sessions.length?(0,M.jsx)(`div`,{className:`large-empty`,children:`读取中…`}):null,!x&&!m.sessions.length?(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(_e,{size:24}),(0,M.jsx)(`strong`,{children:`没有匹配的会话`})]}):null,m.sessions.map(e=>(0,M.jsxs)(`button`,{type:`button`,className:`history-session-row ${e.id===_?`history-session-row--selected`:``}`,onClick:()=>v(e.id),children:[(0,M.jsxs)(`div`,{className:`history-session-top`,children:[(0,M.jsx)(`strong`,{children:e.title}),(0,M.jsx)(`time`,{children:ke(e.updatedAt)})]}),(0,M.jsx)(`p`,{children:e.firstUserMessage||`没有可读的用户消息`}),(0,M.jsxs)(`div`,{className:`history-session-meta`,children:[(0,M.jsx)(`span`,{children:e.provider}),(0,M.jsxs)(`span`,{children:[e.messageCount,` 条消息`]}),(0,M.jsx)(`span`,{children:e.archived?`已归档`:`活跃`})]})]},e.id))]}),(0,M.jsxs)(`div`,{className:`history-pagination`,children:[(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:f<=1||x,onClick:()=>p(e=>e-1),children:`上一页`}),(0,M.jsx)(`span`,{children:f}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:!m.hasNextPage||x,onClick:()=>p(e=>e+1),children:`下一页`})]})]}),(0,M.jsx)(`div`,{className:`history-detail-panel`,children:S?(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(P,{size:24,className:`spin`}),(0,M.jsx)(`strong`,{children:`正在读取会话`})]}):y?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`div`,{className:`history-detail-head`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:y.session.title}),(0,M.jsxs)(`p`,{children:[y.session.cwd||`未知项目`,` · `,y.session.provider,` · `,y.session.messageCount,` 条消息`]})]}),(0,M.jsx)(`span`,{children:y.session.archived?`已归档`:`活跃`})]}),y.truncated?(0,M.jsxs)(`div`,{className:`history-truncated`,children:[(0,M.jsx)(F,{size:15}),`仅显示最近 `,y.returnedMessageCount,` 条消息。`]}):null,(0,M.jsx)(`div`,{className:`message-stream`,children:y.messages.map(e=>(0,M.jsxs)(`article`,{className:`chat-message chat-message--${e.role}`,children:[(0,M.jsxs)(`div`,{className:`chat-message-label`,children:[e.role===`user`?`你`:`Codex`,(0,M.jsx)(`time`,{children:ke(e.timestamp)})]}),(0,M.jsx)(`div`,{className:`chat-message-body`,children:(0,M.jsx)(je,{text:e.text})})]},`${e.sequence}-${e.timestamp}`))})]}):(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(_e,{size:28}),(0,M.jsx)(`strong`,{children:`选择一个会话`}),(0,M.jsx)(`span`,{children:`聊天内容将在这里显示。`})]})})]})]})}function Je({title:e,children:t,confirmLabel:n,onConfirm:r,onCancel:i,tone:a=`primary`,confirmDisabled:o=!1}){return(0,M.jsx)(`div`,{className:`modal-backdrop`,role:`presentation`,onMouseDown:e=>e.target===e.currentTarget&&i(),children:(0,M.jsxs)(`section`,{className:`modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`modal-title`,children:[(0,M.jsxs)(`div`,{className:`modal-head`,children:[(0,M.jsx)(`h2`,{id:`modal-title`,children:e}),(0,M.jsx)(`button`,{type:`button`,className:`icon-button`,onClick:i,"aria-label":`关闭`,children:(0,M.jsx)(Se,{size:18})})]}),(0,M.jsx)(`div`,{className:`modal-body`,children:t}),(0,M.jsxs)(`div`,{className:`modal-actions`,children:[(0,M.jsx)(`button`,{className:`button button--secondary`,type:`button`,onClick:i,children:`取消`}),(0,M.jsx)(`button`,{className:`button button--${a}`,type:`button`,disabled:o,onClick:r,children:n})]})]})})}function Ye({plan:e,status:t,selectedProvider:n,onCancel:r,onConfirm:i}){return(0,M.jsxs)(Je,{title:e.mode===`switch`?`确认切换并同步`:`确认同步元数据`,confirmLabel:e.mode===`switch`?`确认切换并同步`:`确认执行同步`,onCancel:r,onConfirm:i,children:[(0,M.jsxs)(`div`,{className:`modal-callout`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`请确认 Codex 已完全关闭`}),(0,M.jsx)(`span`,{children:`关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。`})]})]}),(0,M.jsxs)(`dl`,{className:`operation-scope`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`Codex Home`}),(0,M.jsx)(`dd`,{children:t?.codexHome})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`SQLite Home`}),(0,M.jsxs)(`dd`,{children:[t?.sqliteHome,` `,(0,M.jsxs)(`small`,{children:[`(`,t?.sqliteHomeSource,`)`]})]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`当前 Provider`}),(0,M.jsx)(`dd`,{children:t?.currentProvider})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`目标 Provider`}),(0,M.jsx)(`dd`,{children:n})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`配置变更`}),(0,M.jsx)(`dd`,{children:e.mode===`switch`?`更新 config.toml 根级 model_provider`:`不修改 config.toml`})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`Model 策略`}),(0,M.jsx)(`dd`,{children:e.mode===`switch`?e.modelMode===`auto`?`跟随目标 Provider 配置`:e.modelMode===`keep`?`保留当前根级 model`:`设置为 ${e.model}`:`跟随当前根级 model`})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`备份策略`}),(0,M.jsxs)(`dd`,{children:[`修改前创建备份,保留最近 `,e.keepCount,` 份`]})]})]})]})}function Xe({backup:e,status:t,profile:n,onCancel:r,onConfirm:i}){let[a,o]=(0,g.useState)(!1),[s,c]=(0,g.useState)(!0),[l,u]=(0,g.useState)(!0),d=fe(t,e),f=pe({backup:e,profile:n,targetSqliteHome:d,restoreDatabase:s,restoreConfig:a,sqliteSupported:t?.sqliteAccess?.supported!==!1,pathComparisonCaseInsensitive:t?.pathComparisonCaseInsensitive===!0});return(0,M.jsxs)(Je,{title:`恢复备份`,confirmLabel:`覆盖当前元数据`,tone:`danger`,onCancel:r,confirmDisabled:!a&&!s&&!l||!f.canSubmit,onConfirm:()=>i({restoreConfig:a,restoreDatabase:s,restoreSessions:l,allowSqliteHomeRelocation:f.requiresRelocation}),children:[(0,M.jsxs)(`div`,{className:`restore-summary`,children:[(0,M.jsx)(_e,{size:20}),(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`strong`,{children:[ke(e.metadata.createdAt),` · `,e.metadata.targetProvider]}),(0,M.jsx)(`code`,{children:e.path})]})]}),(0,M.jsxs)(`fieldset`,{className:`restore-options`,children:[(0,M.jsx)(`legend`,{children:`选择要覆盖的内容`}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:a,onChange:e=>o(e.target.checked)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`config.toml 与 global state`}),(0,M.jsx)(`small`,{children:`恢复 Provider 配置和 Desktop workspace roots`})]})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:s,onChange:e=>c(e.target.checked)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`SQLite 线程数据库`}),(0,M.jsx)(`small`,{children:`恢复 state_5.sqlite 及备份中的 WAL/SHM`})]})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:l,onChange:e=>u(e.target.checked)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`Rollout 元数据`}),(0,M.jsx)(`small`,{children:`恢复 session_meta 和被修改的 turn_context.model`})]})]})]}),t?.sqliteAccess?.supported===!1?(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`当前 SQLite 路径仅供诊断`}),(0,M.jsx)(`span`,{children:t.sqliteAccess.message||`不能从 Web UI 执行恢复。`})]})]}):null,f.requiresRelocation?(0,M.jsxs)(`div`,{className:`modal-callout ${f.missingExplicitTarget||f.configRestoreConflict?`modal-callout--danger`:`modal-callout--warning`}`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`SQLite Home 与备份来源不同`}),(0,M.jsxs)(`span`,{children:[`来源:`,e.metadata.sqliteHome,(0,M.jsx)(`br`,{}),`目标:`,d,(0,M.jsx)(`br`,{}),f.missingExplicitTarget?`当前 Profile 未明确配置 SQLite Home,不能提交数据库迁移恢复。`:f.configRestoreConflict?`迁移数据库时不能同时恢复旧 config.toml。`:`确认后数据库将恢复到当前 Profile 明确配置的目标位置。`]})]})]}):null,(0,M.jsxs)(`div`,{className:`modal-callout`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`恢复前请关闭 Codex`}),(0,M.jsx)(`span`,{children:`该操作将覆盖所选的当前元数据;请确认 Codex CLI、App 和 app-server 已关闭。`})]})]})]})}function Ze({keepCount:e,backups:t,onCancel:n,onConfirm:r}){let i=Math.max(0,t.backups.length-e);return(0,M.jsxs)(Je,{title:`清理旧备份`,confirmLabel:`删除 ${i} 份旧备份`,tone:`danger`,onCancel:n,onConfirm:r,confirmDisabled:i===0,children:[(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--warning`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`被删除的备份无法直接恢复`}),(0,M.jsx)(`span`,{children:`只处理当前 Codex Home 下由本工具管理的备份目录。`})]})]}),(0,M.jsxs)(`dl`,{className:`operation-scope`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`当前备份`}),(0,M.jsxs)(`dd`,{children:[t.backups.length,` 份`]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`保留`}),(0,M.jsxs)(`dd`,{children:[`最近 `,e,` 份`]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`将删除`}),(0,M.jsxs)(`dd`,{children:[i,` 份`]})]})]})]})}function Qe({onCancel:e,onConfirm:t}){let[n,r]=(0,g.useState)(``),[i,a]=(0,g.useState)(``),[o,s]=(0,g.useState)(``),[c,l]=(0,g.useState)(``),u=/^[A-Za-z0-9_.-]{1,80}$/.test(n)&&i.trim()&&o.trim();return(0,M.jsx)(Je,{title:`新增存储配置`,confirmLabel:`保存配置`,onCancel:e,confirmDisabled:!u,onConfirm:()=>t({profileId:n,name:i,codexHome:o,sqliteHome:c}),children:(0,M.jsxs)(`div`,{className:`profile-form`,children:[(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`配置 ID`}),(0,M.jsx)(`input`,{value:n,onChange:e=>r(e.target.value),placeholder:`work`,spellCheck:`false`})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`显示名称`}),(0,M.jsx)(`input`,{value:i,onChange:e=>a(e.target.value),placeholder:`工作环境`})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`Codex Home`}),(0,M.jsx)(`input`,{value:o,onChange:e=>s(e.target.value),placeholder:`/home/user/.codex`,spellCheck:`false`})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`SQLite Home(可选)`}),(0,M.jsx)(`input`,{value:c,onChange:e=>l(e.target.value),placeholder:`留空时由服务端按配置解析`,spellCheck:`false`})]})]})})}function $e({toast:e,onClose:t}){return(0,g.useEffect)(()=>{if(!e)return;let n=window.setTimeout(t,6e3);return()=>window.clearTimeout(n)},[e,t]),e?(0,M.jsxs)(`div`,{className:`toast toast--${e.tone}`,children:[(0,M.jsxs)(`div`,{children:[e.tone===`success`?(0,M.jsx)(Ce,{size:18}):(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:e.title}),e.message?(0,M.jsx)(`small`,{children:e.message}):null]})]}),(0,M.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`关闭通知`,children:(0,M.jsx)(Se,{size:16})})]}):null}function et(){let[e,t]=(0,g.useState)(`overview`),[n,r]=(0,g.useState)(`checking`),[i,a]=(0,g.useState)(``),[o,s]=O(`cps.web.profileId`,`default`),[c,l]=(0,g.useState)([]),[u,d]=O(`cps.web.manualProviders`,[]),[f,p]=(0,g.useState)(null),[m,h]=(0,g.useState)(Ee),[_,v]=(0,g.useState)(``),[x,S]=(0,g.useState)(!0),[C,w]=(0,g.useState)(!1),[E,D]=(0,g.useState)(null),[ie,k]=(0,g.useState)(null),[oe,ce]=(0,g.useState)([]),[A,le]=(0,g.useState)(null),ue=(0,g.useRef)(0),de=(0,g.useMemo)(()=>{let e=Me(f),t=new Set(e.map(e=>e.id));return[...e.map(e=>({...e,manual:u.includes(e.id)})),...u.filter(e=>!t.has(e)).map(e=>({id:e,sources:[`manual`],configured:!1,current:!1,manual:!0}))]},[f,u]),fe=c.find(e=>e.id===o)??null,pe=(0,g.useRef)(null);pe.current||=he({fetchStatus:(e,t)=>T(`/api/status`,e,t),fetchBackups:(e,t)=>T(`/api/backups`,e,t)});let j=(0,g.useCallback)(async({quiet:e=!1}={})=>{await pe.current({profileId:o,showLoading:!e,onLoading:S,onResult:({status:e,backups:t})=>{p(e),h(t),v(t=>t&&Me(e).some(e=>e.id===t)?t:e.currentProvider)},onError:e=>{k({tone:`error`,title:`状态读取失败`,message:e.message})}})},[o]),N=(0,g.useCallback)(async()=>{let e=await ne();l(e.profiles),s(t=>e.profiles.some(e=>e.id===t)?t:`default`)},[s]),P=(0,g.useCallback)(async()=>{D(null);try{await N(),await j({quiet:!0})}catch{}k({tone:`warning`,title:`配置已变更,请重新确认`,message:`已刷新存储配置和当前状态;未自动重试原操作。`})},[j,N]),ge=(0,g.useCallback)(e=>{let t=ae(fe,e,f);if(!t){k({tone:`warning`,title:`配置需要刷新`,message:`没有可用的配置版本,请刷新后重新确认操作。`}),N().catch(()=>{});return}D(t)},[N,fe,f]);(0,g.useEffect)(()=>{let e=!1;return ee().then(async t=>{if(!t)throw new y;await N(),e||r(`ready`)}).catch(t=>{e||(r(t instanceof y?`required`:`error`),a(t.message))}),()=>{e=!0}},[N]),(0,g.useEffect)(()=>{n===`ready`&&j()},[n,o]),(0,g.useEffect)(()=>{let e=e=>{r(`required`),a(e.detail||`设备凭证已失效。请重新运行 codex-provider web。`)};return window.addEventListener(`cps:pairing-required`,e),()=>window.removeEventListener(`cps:pairing-required`,e)},[]),(0,g.useEffect)(()=>{if(n!==`ready`)return;let e=!1,t=async()=>{try{let t=await te(ue.current);if(e)return;t.activity?.length&&(ue.current=t.activity[t.activity.length-1].id,ce(e=>[...e,...t.activity].slice(-250))),le(t.activeOperation??null)}catch{}};t();let r=window.setInterval(t,900);return()=>{e=!0,window.clearInterval(r)}},[n]);let _e=(0,g.useCallback)(async()=>{let e=E.plan,n=E.profileId;D(null),w(!0),t(`activity`);try{let t={...me(n),profileRevision:E.profileRevision,storageRevision:E.storageRevision,provider:E.selectedProvider,keepCount:e.keepCount},r=e.mode===`switch`?await T(`/api/switch`,{...t,model:e.modelMode===`custom`?e.model:void 0,keepRootModel:e.modelMode===`keep`}):await T(`/api/sync`,t);k(se(r,{successTitle:e.mode===`switch`?`切换并同步完成`:`同步完成`,partialTitle:e.mode===`switch`?`切换并同步部分完成`:`同步部分完成`,message:`备份:${r.result?.backupDir??`已创建`}`})),await j({quiet:!0})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`操作失败`,message:e.message})}finally{w(!1)}},[P,E,j]),ve=(0,g.useCallback)(async e=>{let n=E.backup,r=E.profileId;D(null),w(!0),t(`activity`);try{let t=await T(`/api/restore`,{...me(r),profileRevision:E.profileRevision,storageRevision:E.storageRevision,backupId:n.id,...e});k(se(t,{successTitle:`备份恢复完成`,partialTitle:`备份恢复部分完成`,message:n.id})),await j({quiet:!0})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`恢复失败`,message:e.message})}finally{w(!1)}},[P,E,j]),ye=(0,g.useCallback)(async()=>{let e=E.keepCount,t=E.profileId;D(null),w(!0);try{let n=await T(`/api/prune`,{...me(t),profileRevision:E.profileRevision,storageRevision:E.storageRevision,keepCount:e});k(se(n,{successTitle:`旧备份清理完成`,partialTitle:`旧备份清理部分完成`,message:`删除 ${n.result?.deletedCount??0} 份,释放 ${Oe(n.result?.freedBytes)}`})),await j({quiet:!0})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`备份清理失败`,message:e.message})}finally{w(!1)}},[P,E,j]),xe=(0,g.useCallback)(()=>k(null),[]),Se=(0,g.useCallback)(async e=>{try{let t=await T(`/api/profiles/save`,e.revision?{...e,profileRevision:e.revision}:e);D(null),await N(),s(t.profile.id),k({tone:`success`,title:`存储配置已保存`,message:t.profile.name})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`配置保存失败`,message:e.message})}},[P,N,s]),Ce=(0,g.useCallback)(async()=>{try{await T(`/api/profiles/delete`,{profileId:o,profileRevision:fe?.revision}),s(`default`),await N()}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`配置删除失败`,message:e.message})}},[P,o,N,fe?.revision,s]),F=(0,g.useCallback)(async()=>{await re().catch(()=>{}),r(`required`),a(`此浏览器的设备凭证已失效。重新运行 codex-provider web 即可自动配对。`)},[]),we=(0,g.useCallback)(e=>{d(t=>[...new Set([...t,e])].sort()),v(e)},[d]),Te=(0,g.useCallback)(e=>{d(t=>t.filter(t=>t!==e)),v(f?.currentProvider??``)},[d,f?.currentProvider]);return n===`ready`?(0,M.jsxs)(`div`,{className:`app-shell`,children:[(0,M.jsx)(Pe,{status:f,busy:C||!!A,onRefresh:()=>j()}),(0,M.jsx)(Fe,{view:e,setView:t,status:f,onForgetBrowser:F}),(0,M.jsxs)(`main`,{className:`main-area`,children:[(0,M.jsx)(Ie,{profiles:c,profileId:o,setProfileId:s,status:f,onAddProfile:()=>D({type:`profile`}),onDeleteProfile:Ce,onRefresh:()=>j(),loading:x,profileSwitchDisabled:C||!!E}),e===`overview`?(0,M.jsx)(We,{status:f,backups:m,providers:de,selectedProvider:_,setSelectedProvider:v,onAddManualProvider:we,onRemoveManualProvider:Te,onExecute:e=>ge({type:`execute`,plan:e,selectedProvider:_}),onRestore:e=>ge({type:`restore`,backup:e}),setView:t,busy:C,loading:x}):null,e===`history`?(0,M.jsx)(qe,{profileId:o,status:f}):null,e===`backups`?(0,M.jsx)(Ge,{backups:m,status:f,busy:C,onRestore:e=>ge({type:`restore`,backup:e}),onPrune:e=>ge({type:`prune`,keepCount:e})}):null,e===`activity`?(0,M.jsx)(Ke,{activity:oe,activeOperation:A}):null]}),E?.type===`execute`?(0,M.jsx)(Ye,{plan:E.plan,status:E.status,selectedProvider:E.selectedProvider,onCancel:()=>D(null),onConfirm:_e}):null,E?.type===`restore`?(0,M.jsx)(Xe,{backup:E.backup,status:E.status,profile:E.profile,onCancel:()=>D(null),onConfirm:ve}):null,E?.type===`prune`?(0,M.jsx)(Ze,{keepCount:E.keepCount,backups:m,onCancel:()=>D(null),onConfirm:ye}):null,E?.type===`profile`?(0,M.jsx)(Qe,{onCancel:()=>D(null),onConfirm:Se}):null,(0,M.jsx)($e,{toast:ie,onClose:xe})]}):(0,M.jsxs)(`div`,{className:`access-gate`,children:[(0,M.jsx)(be,{size:32}),(0,M.jsx)(`h1`,{children:n===`checking`?`正在完成安全配对`:`需要重新配对`}),(0,M.jsx)(`p`,{children:n===`checking`?`请稍候…`:i||`请重新运行 codex-provider web。`}),n===`checking`?null:(0,M.jsx)(`code`,{children:`codex-provider web`})]})}(0,_.createRoot)(document.getElementById(`root`)).render((0,M.jsx)(g.StrictMode,{children:(0,M.jsx)(et,{})})); +//# sourceMappingURL=index-BhSMcRqW.js.map \ No newline at end of file diff --git a/web/dist/assets/index-BhSMcRqW.js.map b/web/dist/assets/index-BhSMcRqW.js.map new file mode 100644 index 0000000..78b651f --- /dev/null +++ b/web/dist/assets/index-BhSMcRqW.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-BhSMcRqW.js","names":[],"sources":["../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/scheduler/cjs/scheduler.production.min.js","../../../node_modules/scheduler/index.js","../../../node_modules/react-dom/cjs/react-dom.production.min.js","../../../node_modules/react-dom/index.js","../../../node_modules/react-dom/client.js","../../src/api.js","../../src/hooks.js","../../src/history-requests.js","../../src/operation-state.js","../../src/profile-refresh.js","../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/react/jsx-runtime.js","../../src/icons.jsx","../../src/App.jsx","../../src/main.jsx"],"sourcesContent":["/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1>>1,e=a[d];if(0>>1;dg(C,c))ng(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(ng(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Qa||125d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;cb}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"\")&&(k=k.replace(\"\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e\"+b.valueOf().toString()+\"\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a>=g;e-=g;rg=1<<32-oc(b)+e|c<w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;ww?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&Ng(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=Lg(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Tg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Rg(f.type,f.key,f.props,null,a.mode,h),h.ref=Lg(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=Sg(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);Mg(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=Qg(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Ug=Og(!0),Vg=Og(!1),Wg=Uf(null),Xg=null,Yg=null,Zg=null;function $g(){Zg=Yg=Xg=null}function ah(a){var b=Wg.current;E(Wg);a._currentValue=b}function bh(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}\nfunction ch(a,b){Xg=a;Zg=Yg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(dh=!0),a.firstContext=null)}function eh(a){var b=a._currentValue;if(Zg!==a)if(a={context:a,memoizedValue:b,next:null},null===Yg){if(null===Xg)throw Error(p(308));Yg=a;Xg.dependencies={lanes:0,firstContext:a}}else Yg=Yg.next=a;return b}var fh=null;function gh(a){null===fh?fh=[a]:fh.push(a)}\nfunction hh(a,b,c,d){var e=b.interleaved;null===e?(c.next=c,gh(b)):(c.next=e.next,e.next=c);b.interleaved=c;return ih(a,d)}function ih(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}var jh=!1;function kh(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}\nfunction lh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function mh(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}\nfunction nh(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(K&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return ih(a,c)}e=d.interleaved;null===e?(b.next=b,gh(d)):(b.next=e.next,e.next=b);d.interleaved=b;return ih(a,c)}function oh(a,b,c){b=b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nfunction ph(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction qh(a,b,c,d){var e=a.updateQueue;jh=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var m=a.alternate;null!==m&&(m=m.updateQueue,h=m.lastBaseUpdate,h!==g&&(null===h?m.firstBaseUpdate=l:h.next=l,m.lastBaseUpdate=k))}if(null!==f){var q=e.baseState;g=0;m=l=k=null;h=f;do{var r=h.lane,y=h.eventTime;if((d&r)===r){null!==m&&(m=m.next={eventTime:y,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,\nnext:null});a:{var n=a,t=h;r=b;y=c;switch(t.tag){case 1:n=t.payload;if(\"function\"===typeof n){q=n.call(y,q,r);break a}q=n;break a;case 3:n.flags=n.flags&-65537|128;case 0:n=t.payload;r=\"function\"===typeof n?n.call(y,q,r):n;if(null===r||void 0===r)break a;q=A({},q,r);break a;case 2:jh=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=[h]:r.push(h))}else y={eventTime:y,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===m?(l=m=y,k=q):m=m.next=y,g|=r;\nh=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===m&&(k=q);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=m;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);rh|=g;a.lanes=g;a.memoizedState=q}}\nfunction sh(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;bc?c:4;a(!0);var d=Gh.transition;Gh.transition={};try{a(!1),b()}finally{C=c,Gh.transition=d}}function wi(){return Uh().memoizedState}\nfunction xi(a,b,c){var d=yi(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,c);else if(c=hh(a,b,c,d),null!==c){var e=R();gi(c,a,d,e);Bi(c,b,d)}}\nfunction ii(a,b,c){var d=yi(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,gh(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=hh(a,b,e,d);null!==c&&(e=R(),gi(c,a,d,e),Bi(c,b,d))}}\nfunction zi(a){var b=a.alternate;return a===M||null!==b&&b===M}function Ai(a,b){Jh=Ih=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Bi(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar Rh={readContext:eh,useCallback:P,useContext:P,useEffect:P,useImperativeHandle:P,useInsertionEffect:P,useLayoutEffect:P,useMemo:P,useReducer:P,useRef:P,useState:P,useDebugValue:P,useDeferredValue:P,useTransition:P,useMutableSource:P,useSyncExternalStore:P,useId:P,unstable_isNewReconciler:!1},Oh={readContext:eh,useCallback:function(a,b){Th().memoizedState=[a,void 0===b?null:b];return a},useContext:eh,useEffect:mi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ki(4194308,\n4,pi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ki(4194308,4,a,b)},useInsertionEffect:function(a,b){return ki(4,2,a,b)},useMemo:function(a,b){var c=Th();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=xi.bind(null,M,a);return[d.memoizedState,a]},useRef:function(a){var b=\nTh();a={current:a};return b.memoizedState=a},useState:hi,useDebugValue:ri,useDeferredValue:function(a){return Th().memoizedState=a},useTransition:function(){var a=hi(!1),b=a[0];a=vi.bind(null,a[1]);Th().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=M,e=Th();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===Q)throw Error(p(349));0!==(Hh&30)||di(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;mi(ai.bind(null,d,\nf,a),[a]);d.flags|=2048;bi(9,ci.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=Th(),b=Q.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Kh++;0\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;zj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;eGj&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304)}else{if(!d)if(a=Ch(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Dj(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Gj&&1073741824!==c&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=L.current,G(L,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Hj(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(fj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Ij(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return zh(),E(Wf),E(H),Eh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Bh(b),null;case 13:E(L);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(L),null;case 4:return zh(),null;case 10:return ah(b.type._context),null;case 22:case 23:return Hj(),\nnull;case 24:return null;default:return null}}var Jj=!1,U=!1,Kj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Lj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Mj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Nj=!1;\nfunction Oj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Ci(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Nj;Nj=!1;return n}\nfunction Pj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Mj(b,c,f)}e=e.next}while(e!==d)}}function Qj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Rj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Sj(a){var b=a.alternate;null!==b&&(a.alternate=null,Sj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Tj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Uj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Tj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Vj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Vj(a,b,c),a=a.sibling;null!==a;)Vj(a,b,c),a=a.sibling}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}var X=null,Xj=!1;function Yj(a,b,c){for(c=c.child;null!==c;)Zj(a,b,c),c=c.sibling}\nfunction Zj(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Lj(c,b);case 6:var d=X,e=Xj;X=null;Yj(a,b,c);X=d;Xj=e;null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Xj;X=c.stateNode.containerInfo;Xj=!0;\nYj(a,b,c);X=d;Xj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Mj(c,b,g):0!==(f&4)&&Mj(c,b,g));e=e.next}while(e!==d)}Yj(a,b,c);break;case 1:if(!U&&(Lj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Yj(a,b,c);break;case 21:Yj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Yj(a,b,c),U=d):Yj(a,b,c);break;default:Yj(a,b,c)}}function ak(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Kj);b.forEach(function(b){var d=bk.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction ck(a,b){var c=b.deletions;if(null!==c)for(var d=0;de&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*lk(d/1960))-d;if(10a?16:a;if(null===wk)var d=!1;else{a=wk;wk=null;xk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;kB()-fk?Kk(a,0):rk|=c);Dk(a,b)}function Yk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=R();a=ih(a,b);null!==a&&(Ac(a,b,c),Dk(a,c))}function uj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Yk(a,c)}\nfunction bk(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Yk(a,c)}var Vk;\nVk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)dh=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return dh=!1,yj(a,b,c);dh=0!==(a.flags&131072)?!0:!1}else dh=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;ij(a,b);a=b.pendingProps;var e=Yf(b,H.current);ch(b,c);e=Nh(null,b,d,a,e,c);var f=Sh();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,kh(b),e.updater=Ei,b.stateNode=e,e._reactInternals=b,Ii(b,d,a,c),b=jj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Xi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{ij(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=Zk(d);a=Ci(d,a);switch(e){case 0:b=cj(null,b,d,a,c);break a;case 1:b=hj(null,b,d,a,c);break a;case 11:b=Yi(null,b,d,a,c);break a;case 14:b=$i(null,b,d,Ci(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),cj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),hj(a,b,d,e,c);case 3:a:{kj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;lh(a,b);qh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ji(Error(p(423)),b);b=lj(a,b,d,c,e);break a}else if(d!==e){e=Ji(Error(p(424)),b);b=lj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Vg(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=Zi(a,b,c);break a}Xi(a,b,d,c)}b=b.child}return b;case 5:return Ah(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\ngj(a,b),Xi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return oj(a,b,c);case 4:return yh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Ug(b,null,d,c):Xi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),Yi(a,b,d,e,c);case 7:return Xi(a,b,b.pendingProps,c),b.child;case 8:return Xi(a,b,b.pendingProps.children,c),b.child;case 12:return Xi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Wg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=Zi(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=mh(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);bh(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);bh(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Xi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,ch(b,c),e=eh(e),d=d(e),b.flags|=1,Xi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Ci(d,b.pendingProps),e=Ci(d.type,e),$i(a,b,d,e,c);case 15:return bj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),ij(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,ch(b,c),Gi(b,d,e),Ii(b,d,e,c),jj(null,b,d,!0,a,c);case 19:return xj(a,b,c);case 22:return dj(a,b,c)}throw Error(p(156,b.tag));};function Fk(a,b){return ac(a,b)}\nfunction $k(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new $k(a,b,c,d)}function aj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction Zk(a){if(\"function\"===typeof a)return aj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction Pg(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Rg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)aj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Tg(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return pj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Tg(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function pj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function Qg(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction Sg(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction al(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function bl(a,b,c,d,e,f,g,h,k){a=new al(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};kh(f);return a}function cl(a,b,c){var d=3 ({}));\r\n if (!response.ok || !payload.deviceCredential) {\r\n throw new PairingRequiredError(payload.error ?? \"配对链接无效、已过期或已被使用。请重新运行 codex-provider web。\");\r\n }\r\n window.localStorage.setItem(DEVICE_STORAGE_KEY, payload.deviceCredential);\r\n window.history.replaceState(null, \"\", `${window.location.pathname}${window.location.search}`);\r\n return true;\r\n}\r\n\r\nfunction deviceHeaders() {\r\n return { \"X-Codex-Provider-Device\": window.localStorage.getItem(DEVICE_STORAGE_KEY) ?? \"\" };\r\n}\r\n\r\nexport function toRequestError(payload, status, fallback) {\r\n if (status === 409 && [\r\n \"PROFILE_REVISION_REQUIRED\",\r\n \"PROFILE_CHANGED\",\r\n \"STORAGE_REVISION_REQUIRED\",\r\n \"STORAGE_CHANGED\"\r\n ].includes(payload.code)) {\r\n return new ProfileRevisionError(payload.code, payload.error, payload.profile);\r\n }\r\n return new Error(payload.error ?? fallback);\r\n}\r\n\r\nasync function parseResponse(response, fallback) {\r\n const payload = await response.json().catch(() => ({}));\r\n if (!response.ok) {\r\n if (payload.code === \"PAIRING_REQUIRED\") {\r\n window.dispatchEvent(new CustomEvent(\"cps:pairing-required\", { detail: payload.error }));\r\n throw new PairingRequiredError(payload.error);\r\n }\r\n throw toRequestError(payload, response.status, fallback);\r\n }\r\n return payload;\r\n}\r\n\r\nexport async function apiRequest(path, body = {}, { signal } = {}) {\r\n const response = await fetch(path, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n ...deviceHeaders()\r\n },\r\n body: JSON.stringify(body),\r\n signal\r\n });\r\n return parseResponse(response, `Request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function getActivity(after = 0) {\r\n const response = await fetch(`/api/activity?after=${after}`, {\r\n headers: deviceHeaders()\r\n });\r\n return parseResponse(response, `Activity request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function getProfiles() {\r\n const response = await fetch(\"/api/profiles\", { headers: deviceHeaders() });\r\n return parseResponse(response, `Profile request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function forgetThisBrowser() {\r\n try {\r\n await apiRequest(\"/api/access/forget\");\r\n } finally {\r\n window.localStorage.removeItem(DEVICE_STORAGE_KEY);\r\n }\r\n}\r\n\r\nexport async function getHistory(body = {}, options = {}) {\r\n return apiRequest(\"/api/history\", body, options);\r\n}\r\n\r\nexport async function getHistorySession(body = {}, options = {}) {\r\n return apiRequest(\"/api/history/session\", body, options);\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\nexport function usePersistentState(key, initialValue) {\r\n const [value, setValue] = useState(() => {\r\n try {\r\n const stored = window.localStorage.getItem(key);\r\n return stored ? JSON.parse(stored) : initialValue;\r\n } catch {\r\n return initialValue;\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n window.localStorage.setItem(key, JSON.stringify(value));\r\n }, [key, value]);\r\n\r\n return [value, setValue];\r\n}\r\n","export function createLatestRequestGate() {\r\n let sequence = 0;\r\n let controller = null;\r\n return {\r\n begin() {\r\n controller?.abort();\r\n controller = new AbortController();\r\n sequence += 1;\r\n return { sequence, controller, signal: controller.signal };\r\n },\r\n isLatest(candidate) {\r\n return candidate === sequence;\r\n },\r\n cancel() {\r\n controller?.abort();\r\n sequence += 1;\r\n }\r\n };\r\n}\r\n\r\nexport function scheduleDebounced(callback, delay = 300, timers = globalThis) {\r\n const id = timers.setTimeout(callback, delay);\r\n return () => timers.clearTimeout(id);\r\n}\r\n","export function captureProfileOperation(profile, operation, status) {\r\n if (!profile?.id\r\n || !profile?.revision\r\n || status?.profileId !== profile.id\r\n || status?.profileRevision !== profile.revision\r\n || !status?.storageRevision) return null;\r\n return {\r\n ...operation,\r\n profile: { ...profile },\r\n profileId: profile.id,\r\n profileRevision: profile.revision,\r\n storageRevision: status.storageRevision,\r\n status: { ...status }\r\n };\r\n}\r\n\r\nexport function skippedLockedRolloutFiles(payload) {\r\n const files = payload?.result?.skippedLockedRolloutFiles ?? payload?.skippedLockedRolloutFiles ?? [];\r\n return Array.isArray(files) ? files.filter(Boolean) : [];\r\n}\r\n\r\nexport function operationToast(payload, { successTitle, partialTitle, message }) {\r\n const skipped = skippedLockedRolloutFiles(payload);\r\n const partial = payload?.result?.outcome === \"partial\" || payload?.outcome === \"partial\" || skipped.length > 0;\r\n if (!partial) return { tone: \"success\", title: successTitle, message };\r\n const skippedDetail = skipped.length\r\n ? `已跳过 ${skipped.length} 个被占用的 rollout 文件:${skipped.join(\"、\")}`\r\n : \"部分项目未完成;请查看活动日志后重试。\";\r\n return {\r\n tone: \"warning\",\r\n title: partialTitle,\r\n message: [message, skippedDetail].filter(Boolean).join(\";\")\r\n };\r\n}\r\n\r\nfunction normalizeHistoryPath(path, platform) {\r\n const normalized = String(path ?? \"\").replaceAll(\"\\\\\", \"/\").replace(/\\/{2,}/g, \"/\").replace(/\\/$/, \"\");\r\n return platform === \"win32\" ? normalized.toLowerCase() : normalized;\r\n}\r\n\r\nexport function dedupeHistorySessions(sessions = [], { platform = typeof process !== \"undefined\" ? process.platform : \"browser\" } = {}) {\r\n const seen = new Set();\r\n return sessions.filter((session, index) => {\r\n const threadId = session?.threadId ?? session?.id;\r\n const rolloutPath = session?.rolloutPath ?? session?.filePath ?? session?.rolloutFile ?? session?.path;\r\n const key = threadId ? `thread:${threadId}` : rolloutPath ? `rollout:${normalizeHistoryPath(rolloutPath, platform)}` : `item:${index}`;\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n}\r\n\r\nfunction normalizeStoragePath(value, { caseInsensitive = false } = {}) {\r\n const normalized = String(value ?? \"\").replace(/[\\\\/]+$/, \"\").replaceAll(\"\\\\\", \"/\");\r\n return caseInsensitive ? normalized.toLowerCase() : normalized;\r\n}\r\n\r\nfunction storagePathsEqual(left, right, options) {\r\n return Boolean(left && right && normalizeStoragePath(left, options) === normalizeStoragePath(right, options));\r\n}\r\n\r\nfunction storageParentPath(value) {\r\n const normalized = String(value ?? \"\").replace(/[\\\\/]+$/, \"\");\r\n const separatorIndex = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\r\n if (separatorIndex < 0) return \"\";\r\n if (separatorIndex === 0) return normalized.slice(0, 1);\r\n if (separatorIndex === 2 && /^[A-Za-z]:/.test(normalized)) return normalized.slice(0, 3);\r\n return normalized.slice(0, separatorIndex);\r\n}\r\n\r\nexport function resolveRestoreTargetSqliteHome(status, backup) {\r\n const currentDatabasePath = status?.stateDbLocation?.path;\r\n if (currentDatabasePath) return storageParentPath(currentDatabasePath);\r\n const backupMetadata = backup?.metadata;\r\n const comparison = { caseInsensitive: status?.pathComparisonCaseInsensitive === true };\r\n if (Number(backupMetadata?.version) >= 2\r\n && status?.sqliteHomeSource === \"default\"\r\n && storagePathsEqual(backupMetadata?.sqliteHome, status?.codexHome, comparison)) {\r\n return status.codexHome;\r\n }\r\n return status?.sqliteHome ?? \"\";\r\n}\r\n\r\nexport function restoreRelocationState({ backup, profile, targetSqliteHome, restoreDatabase, restoreConfig, sqliteSupported, pathComparisonCaseInsensitive = false }) {\r\n const sourceSqliteHome = backup?.metadata?.sqliteHome;\r\n const explicitSqliteHome = profile?.sqliteHome?.trim() ?? \"\";\r\n const requiresRelocation = Boolean(\r\n restoreDatabase\r\n && sourceSqliteHome\r\n && targetSqliteHome\r\n && !storagePathsEqual(sourceSqliteHome, targetSqliteHome, { caseInsensitive: pathComparisonCaseInsensitive })\r\n );\r\n const missingExplicitTarget = requiresRelocation && !explicitSqliteHome;\r\n const configRestoreConflict = requiresRelocation && restoreConfig;\r\n return {\r\n requiresRelocation,\r\n missingExplicitTarget,\r\n configRestoreConflict,\r\n canSubmit: Boolean(sqliteSupported) && !missingExplicitTarget && !configRestoreConflict\r\n };\r\n}\r\n","import { createLatestRequestGate } from \"./history-requests.js\";\r\n\r\nexport function storagePayload(profileId) {\r\n return { profileId: profileId || \"default\" };\r\n}\r\n\r\n// Loads status and backups for a storage profile while guaranteeing that only\r\n// the most recently started refresh may touch the UI. A stale request — for\r\n// example one started for profile A before the user switched to profile B —\r\n// is aborted and its results, errors, and loading transitions are discarded,\r\n// even when it finishes after the newer request.\r\nexport function createProfileRefresh({ fetchStatus, fetchBackups, gate = createLatestRequestGate() }) {\r\n const refresh = async ({ profileId, showLoading = true, onLoading, onResult, onError }) => {\r\n const { controller, sequence } = gate.begin();\r\n if (showLoading) onLoading?.(true);\r\n try {\r\n const storage = storagePayload(profileId);\r\n const [statusPayload, backupPayload] = await Promise.all([\r\n fetchStatus(storage, { signal: controller.signal }),\r\n fetchBackups(storage, { signal: controller.signal })\r\n ]);\r\n if (!gate.isLatest(sequence)) return false;\r\n onResult?.({ profileId, status: statusPayload.status, backups: backupPayload });\r\n return true;\r\n } catch (error) {\r\n if (error?.name === \"AbortError\" || !gate.isLatest(sequence)) return false;\r\n onError?.(error);\r\n return false;\r\n } finally {\r\n if (gate.isLatest(sequence)) onLoading?.(false);\r\n }\r\n };\r\n refresh.cancel = () => gate.cancel();\r\n return refresh;\r\n}\r\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from \"react\";\r\n\r\nfunction Icon({ children, size = 18, className = \"\" }) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nexport const RefreshIcon = (props) => ;\r\nexport const DatabaseIcon = (props) => ;\r\nexport const HistoryIcon = (props) => ;\r\nexport const ActivityIcon = (props) => ;\r\nexport const OverviewIcon = (props) => ;\r\nexport const ShieldIcon = (props) => ;\r\nexport const ChevronIcon = (props) => ;\r\nexport const XIcon = (props) => ;\r\nexport const CheckIcon = (props) => ;\r\nexport const AlertIcon = (props) => ;\r\nexport const FolderIcon = (props) => ;\r\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nimport {\r\n PairingRequiredError,\r\n ProfileRevisionError,\r\n apiRequest,\r\n forgetThisBrowser,\r\n getActivity,\r\n getHistory,\r\n getHistorySession,\r\n getProfiles,\r\n initializeAccess\r\n} from \"./api.js\";\r\nimport { usePersistentState } from \"./hooks.js\";\r\nimport { createLatestRequestGate, scheduleDebounced } from \"./history-requests.js\";\r\nimport { captureProfileOperation, dedupeHistorySessions, operationToast, resolveRestoreTargetSqliteHome, restoreRelocationState } from \"./operation-state.js\";\r\nimport { createProfileRefresh, storagePayload } from \"./profile-refresh.js\";\r\nimport {\r\n ActivityIcon,\r\n AlertIcon,\r\n CheckIcon,\r\n ChevronIcon,\r\n DatabaseIcon,\r\n FolderIcon,\r\n HistoryIcon,\r\n OverviewIcon,\r\n RefreshIcon,\r\n ShieldIcon,\r\n XIcon\r\n} from \"./icons.jsx\";\r\n\r\nconst NAV_ITEMS = [\r\n { id: \"overview\", label: \"概览\", icon: OverviewIcon },\r\n { id: \"history\", label: \"聊天记录\", icon: HistoryIcon },\r\n { id: \"backups\", label: \"备份\", icon: HistoryIcon },\r\n { id: \"activity\", label: \"活动\", icon: ActivityIcon }\r\n];\r\n\r\nconst EMPTY_BACKUPS = { backupRoot: \"\", backups: [] };\r\n\r\nfunction formatNumber(value) {\r\n return new Intl.NumberFormat(\"zh-CN\").format(Number(value) || 0);\r\n}\r\n\r\nfunction formatBytes(bytes) {\r\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\r\n let value = Number(bytes) || 0;\r\n let index = 0;\r\n while (value >= 1024 && index < units.length - 1) {\r\n value /= 1024;\r\n index += 1;\r\n }\r\n return index === 0 ? `${value} B` : `${value.toFixed(value >= 10 ? 1 : 2).replace(/\\.0$/, \"\")} ${units[index]}`;\r\n}\r\n\r\nfunction formatDate(value) {\r\n if (!value) return \"未知时间\";\r\n return new Intl.DateTimeFormat(\"zh-CN\", {\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n hour12: false\r\n }).format(new Date(value));\r\n}\r\n\r\nfunction renderInlineMarkdown(text, keyPrefix) {\r\n const parts = text.split(/(`[^`]+`|\\*\\*[^*]+\\*\\*|\\*[^*]+\\*)/g);\r\n return parts.map((part, index) => {\r\n if (part.startsWith(\"`\") && part.endsWith(\"`\")) return {part.slice(1, -1)};\r\n if (part.startsWith(\"**\") && part.endsWith(\"**\")) return {part.slice(2, -2)};\r\n if (part.startsWith(\"*\") && part.endsWith(\"*\")) return {part.slice(1, -1)};\r\n return {part};\r\n });\r\n}\r\n\r\nfunction SafeMarkdown({ text }) {\r\n const blocks = String(text ?? \"\").split(/(```[^\\n]*\\n[\\s\\S]*?```)/g);\r\n return blocks.map((block, index) => {\r\n if (block.startsWith(\"```\") && block.endsWith(\"```\")) {\r\n const lines = block.slice(3, -3).replace(/^\\w*\\n/, \"\");\r\n return
{lines}
;\r\n }\r\n return block.split(\"\\n\").map((line, lineIndex, lines) => {renderInlineMarkdown(line, `${index}-${lineIndex}`)}{lineIndex < lines.length - 1 ?
: null}
);\r\n });\r\n}\r\n\r\nfunction providersFromStatus(status) {\r\n if (!status) return [];\r\n const sources = new Map();\r\n const add = (values, source) => {\r\n for (const value of values ?? []) {\r\n if (!value || value === \"(missing)\") continue;\r\n const bucket = sources.get(value) ?? new Set();\r\n bucket.add(source);\r\n sources.set(value, bucket);\r\n }\r\n };\r\n add(status.configuredProviders, \"config\");\r\n add(Object.keys(status.rolloutCounts?.sessions ?? {}), \"rollout\");\r\n add(Object.keys(status.rolloutCounts?.archived_sessions ?? {}), \"rollout\");\r\n add(Object.keys(status.sqliteCounts?.sessions ?? {}), \"sqlite\");\r\n add(Object.keys(status.sqliteCounts?.archived_sessions ?? {}), \"sqlite\");\r\n add([status.currentProvider], \"config\");\r\n return [...sources.entries()]\r\n .map(([id, providerSources]) => ({\r\n id,\r\n sources: [...providerSources],\r\n configured: status.configuredProviders?.includes(id),\r\n current: id === status.currentProvider\r\n }))\r\n .sort((left, right) => Number(right.current) - Number(left.current) || left.id.localeCompare(right.id));\r\n}\r\n\r\nfunction StatusDot({ tone = \"neutral\" }) {\r\n return ;\r\n}\r\n\r\nfunction AppHeader({ status, busy, onRefresh }) {\r\n const healthy = status?.sqliteAccess?.supported !== false && !status?.sqliteCounts?.unreadable;\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
Codex Provider Sync
\r\n
本机元数据一致性工具
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {busy ? \"操作执行中\" : healthy ? \"本地服务就绪\" : \"需要检查\"}\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Sidebar({ view, setView, status, onForgetBrowser }) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction StorageBar({ profiles, profileId, setProfileId, status, onAddProfile, onDeleteProfile, onRefresh, loading, profileSwitchDisabled }) {\r\n return (\r\n
\r\n \r\n \r\n \r\n {profileId !== \"default\" ? : null}\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction ProviderBars({ title, counts, currentProvider }) {\r\n const entries = Object.entries(counts ?? {}).sort((left, right) => right[1] - left[1]);\r\n const total = entries.reduce((sum, [, count]) => sum + count, 0);\r\n return (\r\n
\r\n
\r\n {title}\r\n {formatNumber(total)}\r\n
\r\n
\r\n {entries.length === 0 ?
无记录
: entries.map(([provider, count]) => (\r\n
\r\n
\r\n {provider}\r\n {formatNumber(count)}\r\n
\r\n
\r\n \r\n
\r\n
\r\n ))}\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction StatusPanel({ status, loading }) {\r\n const rolloutTotal = Object.values(status?.rolloutCounts?.sessions ?? {}).reduce((sum, value) => sum + value, 0)\r\n + Object.values(status?.rolloutCounts?.archived_sessions ?? {}).reduce((sum, value) => sum + value, 0);\r\n const sqliteTotal = Object.values(status?.sqliteCounts?.sessions ?? {}).reduce((sum, value) => sum + value, 0)\r\n + Object.values(status?.sqliteCounts?.archived_sessions ?? {}).reduce((sum, value) => sum + value, 0);\r\n const aligned = status?.alignment?.aligned;\r\n return (\r\n
\r\n
\r\n
\r\n

状态总览

\r\n

比较 rollout 文件、SQLite 线程索引和当前 Provider。

\r\n
\r\n
\r\n {loading ? : aligned ? : }\r\n {loading ? \"正在检查\" : aligned ? \"Provider 元数据已对齐\" : \"发现不一致\"}\r\n
\r\n
\r\n\r\n
\r\n
\r\n 当前 Provider\r\n {status?.currentProvider ?? \"—\"}\r\n {status?.currentProviderImplicit ? \"隐式默认\" : \"config.toml 根级配置\"}\r\n
\r\n
\r\n Rollout 文件\r\n {formatNumber(rolloutTotal)}\r\n sessions + archived\r\n
\r\n
\r\n SQLite threads\r\n {status?.sqliteCounts?.unreadable ? \"不可读\" : formatNumber(sqliteTotal)}\r\n {status?.stateDbLocation?.source ?? \"未定位数据库\"}\r\n
\r\n
\r\n 托管备份\r\n {formatNumber(status?.backupSummary?.count)}\r\n {formatBytes(status?.backupSummary?.totalBytes)}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Rollout files
\r\n \r\n \r\n
\r\n
\r\n
\r\n
SQLite state
\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Warnings({ status }) {\r\n const items = [];\r\n if (status?.sqliteAccess?.supported === false) {\r\n items.push({ tone: \"danger\", title: \"SQLite 路径不可安全访问\", detail: status.sqliteAccess.message });\r\n }\r\n if (status?.sqliteCounts?.unreadable) {\r\n items.push({ tone: \"danger\", title: \"SQLite 当前不可读\", detail: status.sqliteCounts.error });\r\n }\r\n if (status?.lockedRolloutFiles?.length) {\r\n items.push({ tone: \"warning\", title: `${status.lockedRolloutFiles.length} 个 rollout 文件正在使用`, detail: \"同步会跳过这些活跃文件;会话结束后可再次执行。\" });\r\n }\r\n if (status?.encryptedContentWarning) {\r\n items.push({ tone: \"warning\", title: \"检测到 encrypted_content\", detail: status.encryptedContentWarning });\r\n }\r\n const repairs = status?.sqliteRepairStats;\r\n if (repairs?.userEventRowsNeedingRepair || repairs?.cwdRowsNeedingRepair) {\r\n items.push({ tone: \"info\", title: \"SQLite 有待修复字段\", detail: `user-event ${repairs.userEventRowsNeedingRepair ?? 0},cwd ${repairs.cwdRowsNeedingRepair ?? 0}` });\r\n }\r\n if (items.length === 0) return null;\r\n return (\r\n
\r\n {items.map((item, index) => (\r\n
\r\n \r\n
{item.title}{item.detail}
\r\n
\r\n ))}\r\n
\r\n );\r\n}\r\n\r\nfunction ProjectVisibility({ projects = [] }) {\r\n return (\r\n
\r\n
\r\n

项目可见性

检查 Desktop 项目路径、全局排序和首屏 50 条命中。

\r\n
\r\n
\r\n \r\n \r\n \r\n {projects.length === 0 ? (\r\n \r\n ) : projects.map((project) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
项目根目录交互会话首屏RanksCWD 精确匹配Provider
没有可显示的项目诊断。
{project.root}{project.interactiveThreads}{project.firstPageThreads}/50{project.rankPreview || \"—\"}{project.exactCwdMatches}/{project.interactiveThreads}{Object.entries(project.providerCounts ?? {}).map(([provider, count]) => `${provider} ${count}`).join(\" · \") || \"—\"}
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction SegmentedControl({ value, onChange, disabled }) {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nfunction ExecutionPanel({ status, providers, selectedProvider, setSelectedProvider, onAddManualProvider, onRemoveManualProvider, onRequestExecute, busy }) {\r\n const [mode, setMode] = usePersistentState(\"cps.web.mode\", \"sync\");\r\n const [modelMode, setModelMode] = usePersistentState(\"cps.web.modelMode\", \"auto\");\r\n const [customModel, setCustomModel] = usePersistentState(\"cps.web.customModel\", \"\");\r\n const [keepCount, setKeepCount] = usePersistentState(\"cps.web.keepCount\", 5);\r\n const [manualProvider, setManualProvider] = useState(\"\");\r\n const selectedOption = providers.find((provider) => provider.id === selectedProvider);\r\n const switchAllowed = selectedOption?.configured;\r\n const validManualProvider = /^[A-Za-z0-9_.-]+$/.test(manualProvider.trim());\r\n const sqliteUnsupported = status?.sqliteAccess?.supported === false;\r\n const executeDisabled = busy || !selectedProvider || sqliteUnsupported || status?.sqliteCounts?.unreadable;\r\n\r\n return (\r\n
\r\n
\r\n

执行同步

所有写操作都会先创建备份。执行前请关闭 Codex CLI、App 和 app-server。

\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n setManualProvider(event.target.value)}\r\n placeholder=\"手动添加 Provider ID\"\r\n spellCheck=\"false\"\r\n disabled={busy}\r\n />\r\n {\r\n onAddManualProvider(manualProvider.trim());\r\n setManualProvider(\"\");\r\n }}\r\n >\r\n 添加\r\n \r\n {selectedOption?.manual ? : null}\r\n
\r\n\r\n {mode === \"switch\" ? (\r\n
\r\n 根级 model\r\n \r\n \r\n \r\n
\r\n ) : null}\r\n\r\n {sqliteUnsupported ?
此 SQLite 布局仅供诊断{status?.sqliteAccess?.message || \"当前 SQLite 路径不可由 Web UI 安全写入,因此已禁用执行同步。\"}
: null}\r\n\r\n
修改前创建 metadata v2 备份,并记录 SQLite Home
\r\n onRequestExecute({ mode, modelMode, model: customModel.trim(), keepCount })}\r\n >\r\n {busy ? : }\r\n {busy ? \"正在执行…\" : mode === \"switch\" ? \"切换并同步\" : \"执行同步\"}\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction RecentBackups({ backups, onViewAll, onRestore, restoreDisabled }) {\r\n return (\r\n
\r\n
\r\n

最近备份

{backups.backupRoot || \"同步后将在 Codex Home 下创建备份\"}

\r\n \r\n
\r\n
\r\n {backups.backups.length === 0 ?
尚无由本工具创建的备份。
: backups.backups.slice(0, 3).map((backup) => (\r\n
\r\n
\r\n
{formatDate(backup.metadata.createdAt)}{backup.metadata.targetProvider} · {backup.metadata.changedSessionFiles ?? 0} 个 rollout
\r\n
{formatBytes(backup.sizeBytes)}
\r\n \r\n
\r\n ))}\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Overview({ status, backups, providers, selectedProvider, setSelectedProvider, onAddManualProvider, onRemoveManualProvider, onExecute, onRestore, setView, busy, loading }) {\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n setView(\"backups\")} onRestore={onRestore} restoreDisabled={status?.sqliteAccess?.supported === false} />\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction BackupsView({ backups, status, busy, onRestore, onPrune }) {\r\n const [keepCount, setKeepCount] = usePersistentState(\"cps.web.keepCount\", 5);\r\n const restoreDisabled = status?.sqliteAccess?.supported === false;\r\n return (\r\n
\r\n
\r\n

备份

管理当前 Codex Home 下由本工具创建的 metadata v2 备份。

\r\n
\r\n
\r\n
\r\n
{backups.backupRoot || status?.backupRoot || \"—\"}{backups.backups.length} 份 · {formatBytes(backups.backups.reduce((sum, backup) => sum + backup.sizeBytes, 0))}
\r\n
\r\n {backups.backups.length === 0 ?
还没有备份执行一次同步或切换后,备份会显示在这里。
: backups.backups.map((backup) => (\r\n
\r\n
{formatDate(backup.metadata.createdAt)}{backup.id}
\r\n
Provider {backup.metadata.targetProvider}Rollout {backup.metadata.changedSessionFiles ?? 0}SQLite {backup.metadata.sqliteDbFiles?.length ? \"已包含\" : \"未包含\"}
\r\n
SQLite Home{backup.metadata.sqliteHome ?? \"旧版 metadata 未记录\"}
\r\n
{formatBytes(backup.sizeBytes)}
\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction ActivityView({ activity, activeOperation }) {\r\n return (\r\n
\r\n

活动日志

当前 Web UI 会话中的状态刷新、同步阶段和操作结果。

{activeOperation ?
{activeOperation.kind}
: null}
\r\n
\r\n
Activity log{activity.length} entries
\r\n
\r\n {activity.length === 0 ?
等待操作…
: activity.map((entry) => (\r\n
\r\n \r\n {entry.level}\r\n {entry.message}\r\n {typeof entry.detail === \"string\" ? {entry.detail} : null}\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction HistoryView({ profileId, status }) {\r\n const [query, setQuery] = useState(\"\");\r\n const [committedQuery, setCommittedQuery] = useState(\"\");\r\n const [provider, setProvider] = useState(\"\");\r\n const [project, setProject] = useState(\"\");\r\n const [archived, setArchived] = useState(\"all\");\r\n const [page, setPage] = useState(1);\r\n const [history, setHistory] = useState({ sessions: [], total: 0, pageSize: 50, hasNextPage: false });\r\n const [selectedId, setSelectedId] = useState(\"\");\r\n const [detail, setDetail] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [detailLoading, setDetailLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n const listRequest = useRef(null);\r\n const detailRequest = useRef(null);\r\n if (!listRequest.current) listRequest.current = createLatestRequestGate();\r\n if (!detailRequest.current) detailRequest.current = createLatestRequestGate();\r\n const providers = providersFromStatus(status);\r\n const projects = [...new Set((status?.projectThreadVisibility ?? []).map((item) => item.root))];\r\n\r\n useEffect(() => {\r\n listRequest.current.cancel();\r\n detailRequest.current.cancel();\r\n setQuery(\"\");\r\n setCommittedQuery(\"\");\r\n setProvider(\"\");\r\n setProject(\"\");\r\n setArchived(\"all\");\r\n setPage(1);\r\n setHistory({ sessions: [], total: 0, pageSize: 50, hasNextPage: false });\r\n setSelectedId(\"\");\r\n setDetail(null);\r\n setError(\"\");\r\n }, [profileId]);\r\n\r\n useEffect(() => {\r\n return scheduleDebounced(() => setCommittedQuery(query), 300, window);\r\n }, [query]);\r\n\r\n const loadList = useCallback(async () => {\r\n const { controller, sequence } = listRequest.current.begin();\r\n setLoading(true); setError(\"\");\r\n try {\r\n const payload = await getHistory({ ...storagePayload(profileId), page, pageSize: 50, query: committedQuery, provider, project, archived }, { signal: controller.signal });\r\n if (!listRequest.current.isLatest(sequence)) return;\r\n const nextHistory = { ...payload.history, sessions: dedupeHistorySessions(payload.history?.sessions) };\r\n setHistory(nextHistory);\r\n setSelectedId((current) => nextHistory.sessions.some((session) => session.id === current) ? current : nextHistory.sessions[0]?.id ?? \"\");\r\n } catch (requestError) {\r\n if (requestError.name !== \"AbortError\" && listRequest.current.isLatest(sequence)) setError(requestError.message);\r\n } finally {\r\n if (listRequest.current.isLatest(sequence)) setLoading(false);\r\n }\r\n }, [profileId, page, committedQuery, provider, project, archived]);\r\n\r\n useEffect(() => {\r\n loadList();\r\n return () => listRequest.current.cancel();\r\n }, [loadList]);\r\n useEffect(() => {\r\n detailRequest.current.cancel();\r\n if (!selectedId) { setDetail(null); setDetailLoading(false); return undefined; }\r\n const { controller, sequence } = detailRequest.current.begin();\r\n setDetail(null);\r\n setDetailLoading(true);\r\n setError(\"\");\r\n getHistorySession({ ...storagePayload(profileId), sessionId: selectedId }, { signal: controller.signal })\r\n .then((payload) => { if (detailRequest.current.isLatest(sequence)) setDetail(payload.history); })\r\n .catch((requestError) => { if (requestError.name !== \"AbortError\" && detailRequest.current.isLatest(sequence)) setError(requestError.message); })\r\n .finally(() => { if (detailRequest.current.isLatest(sequence)) setDetailLoading(false); });\r\n return () => controller.abort();\r\n }, [profileId, selectedId]);\r\n\r\n const updateFilter = (setter) => (event) => { setter(event.target.value); setPage(1); };\r\n return (\r\n
\r\n

聊天记录

从 rollout 文件读取历史会话,只读查看,不修改本地数据。

\r\n
\r\n { if (event.key === \"Enter\") { setCommittedQuery(query); setPage(1); } }} placeholder=\"搜索标题、项目、Provider 或消息内容\" />\r\n \r\n \r\n \r\n
\r\n {error ?
{error}
: null}\r\n
\r\n
\r\n
{history.total} 个会话第 {history.page} 页
\r\n
\r\n {loading && !history.sessions.length ?
读取中…
: null}\r\n {!loading && !history.sessions.length ?
没有匹配的会话
: null}\r\n {history.sessions.map((session) => )}\r\n
\r\n
{page}
\r\n
\r\n
\r\n {detailLoading ?
正在读取会话
: !detail ?
选择一个会话聊天内容将在这里显示。
: <>

{detail.session.title}

{detail.session.cwd || \"未知项目\"} · {detail.session.provider} · {detail.session.messageCount} 条消息

{detail.session.archived ? \"已归档\" : \"活跃\"}
{detail.truncated ?
仅显示最近 {detail.returnedMessageCount} 条消息。
: null}
{detail.messages.map((message) =>
{message.role === \"user\" ? \"你\" : \"Codex\"}
)}
}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Modal({ title, children, confirmLabel, onConfirm, onCancel, tone = \"primary\", confirmDisabled = false }) {\r\n return (\r\n
event.target === event.currentTarget && onCancel()}>\r\n
\r\n

{title}

\r\n
{children}
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction ExecuteModal({ plan, status, selectedProvider, onCancel, onConfirm }) {\r\n return (\r\n \r\n
请确认 Codex 已完全关闭关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。
\r\n
\r\n
Codex Home
{status?.codexHome}
\r\n
SQLite Home
{status?.sqliteHome} ({status?.sqliteHomeSource})
\r\n
当前 Provider
{status?.currentProvider}
\r\n
目标 Provider
{selectedProvider}
\r\n
配置变更
{plan.mode === \"switch\" ? \"更新 config.toml 根级 model_provider\" : \"不修改 config.toml\"}
\r\n
Model 策略
{plan.mode !== \"switch\" ? \"跟随当前根级 model\" : plan.modelMode === \"auto\" ? \"跟随目标 Provider 配置\" : plan.modelMode === \"keep\" ? \"保留当前根级 model\" : `设置为 ${plan.model}`}
\r\n
备份策略
修改前创建备份,保留最近 {plan.keepCount} 份
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction RestoreModal({ backup, status, profile, onCancel, onConfirm }) {\r\n const [restoreConfig, setRestoreConfig] = useState(false);\r\n const [restoreDatabase, setRestoreDatabase] = useState(true);\r\n const [restoreSessions, setRestoreSessions] = useState(true);\r\n const targetSqliteHome = resolveRestoreTargetSqliteHome(status, backup);\r\n const relocation = restoreRelocationState({\r\n backup,\r\n profile,\r\n targetSqliteHome,\r\n restoreDatabase,\r\n restoreConfig,\r\n sqliteSupported: status?.sqliteAccess?.supported !== false,\r\n pathComparisonCaseInsensitive: status?.pathComparisonCaseInsensitive === true\r\n });\r\n return (\r\n onConfirm({ restoreConfig, restoreDatabase, restoreSessions, allowSqliteHomeRelocation: relocation.requiresRelocation })}\r\n >\r\n
{formatDate(backup.metadata.createdAt)} · {backup.metadata.targetProvider}{backup.path}
\r\n
\r\n 选择要覆盖的内容\r\n \r\n \r\n \r\n
\r\n {status?.sqliteAccess?.supported === false ?
当前 SQLite 路径仅供诊断{status.sqliteAccess.message || \"不能从 Web UI 执行恢复。\"}
: null}\r\n {relocation.requiresRelocation ?
SQLite Home 与备份来源不同来源:{backup.metadata.sqliteHome}
目标:{targetSqliteHome}
{relocation.missingExplicitTarget ? \"当前 Profile 未明确配置 SQLite Home,不能提交数据库迁移恢复。\" : relocation.configRestoreConflict ? \"迁移数据库时不能同时恢复旧 config.toml。\" : \"确认后数据库将恢复到当前 Profile 明确配置的目标位置。\"}
: null}\r\n
恢复前请关闭 Codex该操作将覆盖所选的当前元数据;请确认 Codex CLI、App 和 app-server 已关闭。
\r\n \r\n );\r\n}\r\n\r\nfunction PruneModal({ keepCount, backups, onCancel, onConfirm }) {\r\n const deleteCount = Math.max(0, backups.backups.length - keepCount);\r\n return (\r\n \r\n
被删除的备份无法直接恢复只处理当前 Codex Home 下由本工具管理的备份目录。
\r\n
当前备份
{backups.backups.length} 份
保留
最近 {keepCount} 份
将删除
{deleteCount} 份
\r\n
\r\n );\r\n}\r\n\r\nfunction ProfileModal({ onCancel, onConfirm }) {\r\n const [profileId, setProfileId] = useState(\"\");\r\n const [name, setName] = useState(\"\");\r\n const [codexHome, setCodexHome] = useState(\"\");\r\n const [sqliteHome, setSqliteHome] = useState(\"\");\r\n const valid = /^[A-Za-z0-9_.-]{1,80}$/.test(profileId) && name.trim() && codexHome.trim();\r\n return (\r\n onConfirm({ profileId, name, codexHome, sqliteHome })}>\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Toast({ toast, onClose }) {\r\n useEffect(() => {\r\n if (!toast) return undefined;\r\n const timer = window.setTimeout(onClose, 6000);\r\n return () => window.clearTimeout(timer);\r\n }, [toast, onClose]);\r\n if (!toast) return null;\r\n return
{toast.tone === \"success\" ? : }{toast.title}{toast.message ? {toast.message} : null}
;\r\n}\r\n\r\nexport default function App() {\r\n const [view, setView] = useState(\"overview\");\r\n const [accessState, setAccessState] = useState(\"checking\");\r\n const [accessMessage, setAccessMessage] = useState(\"\");\r\n const [profileId, setProfileId] = usePersistentState(\"cps.web.profileId\", \"default\");\r\n const [profiles, setProfiles] = useState([]);\r\n const [manualProviders, setManualProviders] = usePersistentState(\"cps.web.manualProviders\", []);\r\n const [status, setStatus] = useState(null);\r\n const [backups, setBackups] = useState(EMPTY_BACKUPS);\r\n const [selectedProvider, setSelectedProvider] = useState(\"\");\r\n const [loading, setLoading] = useState(true);\r\n const [busy, setBusy] = useState(false);\r\n const [modal, setModal] = useState(null);\r\n const [toast, setToast] = useState(null);\r\n const [activity, setActivity] = useState([]);\r\n const [activeOperation, setActiveOperation] = useState(null);\r\n const lastActivityId = useRef(0);\r\n\r\n const providers = useMemo(() => {\r\n const detected = providersFromStatus(status);\r\n const detectedIds = new Set(detected.map((provider) => provider.id));\r\n return [\r\n ...detected.map((provider) => ({\r\n ...provider,\r\n manual: manualProviders.includes(provider.id)\r\n })),\r\n ...manualProviders\r\n .filter((provider) => !detectedIds.has(provider))\r\n .map((id) => ({ id, sources: [\"manual\"], configured: false, current: false, manual: true }))\r\n ];\r\n }, [status, manualProviders]);\r\n const selectedProfile = profiles.find((profile) => profile.id === profileId) ?? null;\r\n\r\n const profileRefreshRef = useRef(null);\r\n if (!profileRefreshRef.current) {\r\n profileRefreshRef.current = createProfileRefresh({\r\n fetchStatus: (storage, options) => apiRequest(\"/api/status\", storage, options),\r\n fetchBackups: (storage, options) => apiRequest(\"/api/backups\", storage, options)\r\n });\r\n }\r\n\r\n // Only the latest request for the current profile may update status,\r\n // backups, selectedProvider, loading, and error toasts. Switching profiles\r\n // starts a newer request, which aborts and invalidates the older one even\r\n // if the older one finishes last.\r\n const refresh = useCallback(async ({ quiet = false } = {}) => {\r\n await profileRefreshRef.current({\r\n profileId,\r\n showLoading: !quiet,\r\n onLoading: setLoading,\r\n onResult: ({ status: nextStatus, backups: nextBackups }) => {\r\n setStatus(nextStatus);\r\n setBackups(nextBackups);\r\n setSelectedProvider((current) => current && providersFromStatus(nextStatus).some((provider) => provider.id === current)\r\n ? current\r\n : nextStatus.currentProvider);\r\n },\r\n onError: (error) => {\r\n setToast({ tone: \"error\", title: \"状态读取失败\", message: error.message });\r\n }\r\n });\r\n }, [profileId]);\r\n\r\n const refreshProfiles = useCallback(async () => {\r\n const payload = await getProfiles();\r\n setProfiles(payload.profiles);\r\n setProfileId((current) => payload.profiles.some((profile) => profile.id === current) ? current : \"default\");\r\n }, [setProfileId]);\r\n\r\n const handleProfileConflict = useCallback(async () => {\r\n setModal(null);\r\n try {\r\n await refreshProfiles();\r\n await refresh({ quiet: true });\r\n } catch {\r\n // The user can still retry after the next explicit refresh.\r\n }\r\n setToast({ tone: \"warning\", title: \"配置已变更,请重新确认\", message: \"已刷新存储配置和当前状态;未自动重试原操作。\" });\r\n }, [refresh, refreshProfiles]);\r\n\r\n const openProfileOperation = useCallback((operation) => {\r\n const captured = captureProfileOperation(selectedProfile, operation, status);\r\n if (!captured) {\r\n setToast({ tone: \"warning\", title: \"配置需要刷新\", message: \"没有可用的配置版本,请刷新后重新确认操作。\" });\r\n refreshProfiles().catch(() => {});\r\n return;\r\n }\r\n setModal(captured);\r\n }, [refreshProfiles, selectedProfile, status]);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n initializeAccess()\r\n .then(async (paired) => {\r\n if (!paired) throw new PairingRequiredError();\r\n await refreshProfiles();\r\n if (!cancelled) setAccessState(\"ready\");\r\n })\r\n .catch((error) => {\r\n if (cancelled) return;\r\n setAccessState(error instanceof PairingRequiredError ? \"required\" : \"error\");\r\n setAccessMessage(error.message);\r\n });\r\n return () => { cancelled = true; };\r\n }, [refreshProfiles]);\r\n\r\n useEffect(() => {\r\n if (accessState === \"ready\") refresh();\r\n }, [accessState, profileId]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n const requirePairing = (event) => {\r\n setAccessState(\"required\");\r\n setAccessMessage(event.detail || \"设备凭证已失效。请重新运行 codex-provider web。\");\r\n };\r\n window.addEventListener(\"cps:pairing-required\", requirePairing);\r\n return () => window.removeEventListener(\"cps:pairing-required\", requirePairing);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (accessState !== \"ready\") return undefined;\r\n let stopped = false;\r\n const poll = async () => {\r\n try {\r\n const payload = await getActivity(lastActivityId.current);\r\n if (stopped) return;\r\n if (payload.activity?.length) {\r\n lastActivityId.current = payload.activity[payload.activity.length - 1].id;\r\n setActivity((current) => [...current, ...payload.activity].slice(-250));\r\n }\r\n setActiveOperation(payload.activeOperation ?? null);\r\n } catch {\r\n // A transient poll failure should not interrupt a running operation.\r\n }\r\n };\r\n poll();\r\n const timer = window.setInterval(poll, 900);\r\n return () => { stopped = true; window.clearInterval(timer); };\r\n }, [accessState]);\r\n\r\n const execute = useCallback(async () => {\r\n const plan = modal.plan;\r\n const targetProfileId = modal.profileId;\r\n setModal(null);\r\n setBusy(true);\r\n setView(\"activity\");\r\n try {\r\n const common = { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, provider: modal.selectedProvider, keepCount: plan.keepCount };\r\n const payload = plan.mode === \"switch\"\r\n ? await apiRequest(\"/api/switch\", { ...common, model: plan.modelMode === \"custom\" ? plan.model : undefined, keepRootModel: plan.modelMode === \"keep\" })\r\n : await apiRequest(\"/api/sync\", common);\r\n setToast(operationToast(payload, {\r\n successTitle: plan.mode === \"switch\" ? \"切换并同步完成\" : \"同步完成\",\r\n partialTitle: plan.mode === \"switch\" ? \"切换并同步部分完成\" : \"同步部分完成\",\r\n message: `备份:${payload.result?.backupDir ?? \"已创建\"}`\r\n }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"操作失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const restore = useCallback(async (options) => {\r\n const backup = modal.backup;\r\n const targetProfileId = modal.profileId;\r\n setModal(null);\r\n setBusy(true);\r\n setView(\"activity\");\r\n try {\r\n const payload = await apiRequest(\"/api/restore\", { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, backupId: backup.id, ...options });\r\n setToast(operationToast(payload, { successTitle: \"备份恢复完成\", partialTitle: \"备份恢复部分完成\", message: backup.id }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"恢复失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const prune = useCallback(async () => {\r\n const keepCount = modal.keepCount;\r\n const targetProfileId = modal.profileId;\r\n setModal(null);\r\n setBusy(true);\r\n try {\r\n const payload = await apiRequest(\"/api/prune\", { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, keepCount });\r\n setToast(operationToast(payload, {\r\n successTitle: \"旧备份清理完成\",\r\n partialTitle: \"旧备份清理部分完成\",\r\n message: `删除 ${payload.result?.deletedCount ?? 0} 份,释放 ${formatBytes(payload.result?.freedBytes)}`\r\n }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"备份清理失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const closeToast = useCallback(() => setToast(null), []);\r\n const saveProfile = useCallback(async (profile) => {\r\n try {\r\n const payload = await apiRequest(\"/api/profiles/save\", profile.revision ? { ...profile, profileRevision: profile.revision } : profile);\r\n setModal(null);\r\n await refreshProfiles();\r\n setProfileId(payload.profile.id);\r\n setToast({ tone: \"success\", title: \"存储配置已保存\", message: payload.profile.name });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"配置保存失败\", message: error.message });\r\n }\r\n }, [handleProfileConflict, refreshProfiles, setProfileId]);\r\n const deleteProfile = useCallback(async () => {\r\n try {\r\n await apiRequest(\"/api/profiles/delete\", { profileId, profileRevision: selectedProfile?.revision });\r\n setProfileId(\"default\");\r\n await refreshProfiles();\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"配置删除失败\", message: error.message });\r\n }\r\n }, [handleProfileConflict, profileId, refreshProfiles, selectedProfile?.revision, setProfileId]);\r\n const forgetBrowser = useCallback(async () => {\r\n await forgetThisBrowser().catch(() => {});\r\n setAccessState(\"required\");\r\n setAccessMessage(\"此浏览器的设备凭证已失效。重新运行 codex-provider web 即可自动配对。\");\r\n }, []);\r\n const addManualProvider = useCallback((provider) => {\r\n setManualProviders((current) => [...new Set([...current, provider])].sort());\r\n setSelectedProvider(provider);\r\n }, [setManualProviders]);\r\n const removeManualProvider = useCallback((provider) => {\r\n setManualProviders((current) => current.filter((item) => item !== provider));\r\n setSelectedProvider(status?.currentProvider ?? \"\");\r\n }, [setManualProviders, status?.currentProvider]);\r\n\r\n if (accessState !== \"ready\") {\r\n return

{accessState === \"checking\" ? \"正在完成安全配对\" : \"需要重新配对\"}

{accessState === \"checking\" ? \"请稍候…\" : accessMessage || \"请重新运行 codex-provider web。\"}

{accessState !== \"checking\" ? codex-provider web : null}
;\r\n }\r\n\r\n return (\r\n
\r\n refresh()} />\r\n \r\n
\r\n setModal({ type: \"profile\" })} onDeleteProfile={deleteProfile} onRefresh={() => refresh()} loading={loading} profileSwitchDisabled={busy || Boolean(modal)} />\r\n {view === \"overview\" ? openProfileOperation({ type: \"execute\", plan, selectedProvider })} onRestore={(backup) => openProfileOperation({ type: \"restore\", backup })} setView={setView} busy={busy} loading={loading} /> : null}\r\n {view === \"history\" ? : null}\r\n {view === \"backups\" ? openProfileOperation({ type: \"restore\", backup })} onPrune={(keepCount) => openProfileOperation({ type: \"prune\", keepCount })} /> : null}\r\n {view === \"activity\" ? : null}\r\n
\r\n {modal?.type === \"execute\" ? setModal(null)} onConfirm={execute} /> : null}\r\n {modal?.type === \"restore\" ? setModal(null)} onConfirm={restore} /> : null}\r\n {modal?.type === \"prune\" ? setModal(null)} onConfirm={prune} /> : null}\r\n {modal?.type === \"profile\" ? setModal(null)} onConfirm={saveProfile} /> : null}\r\n \r\n
\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\n\r\nimport App from \"./App.jsx\";\r\nimport \"./styles.css\";\r\n\r\ncreateRoot(document.getElementById(\"root\")).render(\r\n \r\n \r\n \r\n);\r\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,12,13],"mappings":"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"} \ No newline at end of file diff --git a/web/dist/assets/index-C3tdtTcI.css b/web/dist/assets/index-C3tdtTcI.css new file mode 100644 index 0000000..bcac7f5 --- /dev/null +++ b/web/dist/assets/index-C3tdtTcI.css @@ -0,0 +1 @@ +:root{color:#172033;font-synthesis:none;text-rendering:optimizelegibility;--accent:#2463eb;--accent-strong:#174fc8;--accent-soft:#edf3ff;--success:#11865b;--success-soft:#eaf8f2;--warning:#b36309;--warning-soft:#fff7e6;--danger:#c43c45;--danger-soft:#fff0f0;--text:#172033;--muted:#687388;--subtle:#8a94a7;--border:#dfe4ec;--border-strong:#cdd4df;--surface:#fff;--sidebar:#fbfcfe;--mono:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;background:#f5f7fa;font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif}*{box-sizing:border-box}body{background:#f5f7fa;min-width:320px;min-height:100vh;margin:0}button,input,select{font:inherit}button{color:inherit}button:focus-visible,input:focus-visible,select:focus-visible{outline-offset:1px;outline:3px solid #2463eb2e}.app-shell{grid-template-rows:68px minmax(0,1fr);grid-template-columns:198px minmax(0,1fr);min-height:100vh;display:grid}.app-header{background:var(--surface);border-bottom:1px solid var(--border);z-index:30;grid-column:1/-1;justify-content:space-between;align-items:center;padding:0 24px;display:flex;position:sticky;top:0}.brand,.header-actions,.service-state,.brand-mark,.nav-item,.sidebar-provider-value,.path-input-wrap,.button,.alignment-state,.column-label,.warning-row,.execution-head,.backup-assurance,.text-button,.backup-row,.backup-root-line,.live-operation,.modal-callout,.restore-summary,.toast>div{align-items:center;display:flex}.brand{gap:11px}.brand-mark{color:#fff;background:#202a3d;border-radius:9px;justify-content:center;width:36px;height:36px;box-shadow:0 5px 13px #17203329}.brand-name{letter-spacing:-.01em;font-size:15px;font-weight:720}.brand-subtitle{color:var(--muted);margin-top:2px;font-size:11px}.header-actions{gap:16px}.service-state{color:#4f5b70;gap:8px;font-size:12px}.status-dot{background:#9aa4b5;border-radius:50%;flex:none;width:7px;height:7px;box-shadow:0 0 0 3px #9aa4b51f}.status-dot--success{background:var(--success);box-shadow:0 0 0 3px #11865b1f}.status-dot--warning{background:#db820d;box-shadow:0 0 0 3px #db820d1f}.status-dot--danger{background:var(--danger);box-shadow:0 0 0 3px #c43c451f}.sidebar{background:var(--sidebar);border-right:1px solid var(--border);flex-direction:column;grid-area:2/1;height:calc(100vh - 68px);padding:19px 12px 16px;display:flex;position:sticky;top:68px}.navigation{gap:4px;display:grid}.nav-item{color:#657087;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;gap:10px;width:100%;padding:10px 12px;font-size:13px}.nav-item:hover{color:#354157;background:#f0f3f8}.nav-item--active{background:var(--accent-soft);color:#174fc8;box-shadow:inset 2px 0 0 var(--accent);font-weight:650}.sidebar-foot{border-top:1px solid var(--border);margin-top:auto;padding:14px 10px 0}.sidebar-provider-label{color:var(--subtle);text-transform:uppercase;letter-spacing:.08em;font-size:10px}.sidebar-provider-value{font-family:var(--mono);gap:8px;margin-top:8px;font-size:12px;font-weight:700}.sidebar-version{color:#a0a8b6;margin-top:12px;font-size:10px}.main-area{grid-area:2/2;min-width:0}.storage-bar{border-bottom:1px solid var(--border);z-index:20;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background:#ffffffeb;grid-template-columns:minmax(220px,.8fr) minmax(260px,1.2fr) auto auto auto;align-items:end;gap:10px;min-height:88px;padding:15px 26px 16px;display:grid;position:sticky;top:68px}.path-field{color:#455168;gap:6px;min-width:0;font-size:11px;font-weight:650;display:grid}.path-field span small{color:var(--subtle);font-weight:450}.path-input-wrap{border:1px solid var(--border-strong);color:#8791a3;background:#fff;border-radius:7px;gap:8px;height:36px;padding:0 10px}.path-input-wrap:focus-within{border-color:#8eaff6;box-shadow:0 0 0 3px #2463eb17}.path-input-wrap input,.path-input-wrap select{color:#273247;width:100%;min-width:0;font-family:var(--mono);background:0 0;border:0;outline:0;font-size:11px}.storage-refresh{height:36px}.view-content{max-width:1480px;margin:0 auto;padding:24px 26px 42px}.history-view{flex-direction:column;height:calc(100dvh - 156px);min-height:0;display:flex;overflow:hidden}h1,h2,p{margin-top:0}h1{letter-spacing:-.025em;margin-bottom:6px;font-size:25px}h2{letter-spacing:-.014em;margin-bottom:5px;font-size:16px}.section-title-row{justify-content:space-between;align-items:flex-start;gap:18px;display:flex}.section-title-row p,.execution-head p,.page-intro p{color:var(--muted);margin-bottom:0;font-size:12px;line-height:1.55}.section-title-row--compact{align-items:center}.button{cursor:pointer;border:1px solid #0000;border-radius:7px;justify-content:center;gap:7px;min-height:36px;padding:0 13px;font-size:12px;font-weight:650;transition:background .15s,border-color .15s,box-shadow .15s,transform .15s}.button:hover:not(:disabled){transform:translateY(-1px)}.button:disabled{opacity:.48;cursor:not-allowed}.button--primary{color:#fff;background:var(--accent);border-color:var(--accent);box-shadow:0 5px 12px #2463eb2e}.button--primary:hover:not(:disabled){background:var(--accent-strong)}.button--secondary{color:#3d4960;border-color:var(--border-strong);background:#fff;box-shadow:0 1px 2px #1720330a}.button--secondary:hover:not(:disabled){background:#f8faff;border-color:#b7c2d2}.button--quiet{color:#3e4b62;background:#f5f7fa;border-color:#edf0f5}.button--danger{color:#fff;background:var(--danger);border-color:var(--danger)}.button--compact{min-height:31px;padding:0 10px;font-size:11px}.text-button{color:var(--accent);cursor:pointer;background:0 0;border:0;gap:3px;font-size:11px;font-weight:650}.icon-button{cursor:pointer;width:32px;height:32px;color:var(--muted);background:0 0;border:0;border-radius:6px;place-items:center;display:grid}.icon-button:hover{background:#f1f3f7}.status-panel,.data-section,.recent-backups,.backup-list-section,.activity-console{background:var(--surface);border:1px solid var(--border);border-radius:10px;box-shadow:0 1px 2px #17203306}.status-panel{padding:20px 22px 21px}.alignment-state{border:1px solid var(--border);border-radius:6px;gap:7px;min-height:30px;padding:0 10px;font-size:11px;font-weight:650}.alignment-state--success{color:var(--success);background:var(--success-soft);border-color:#bfe4d4}.alignment-state--warning{color:var(--warning);background:var(--warning-soft);border-color:#ead2a4}.summary-strip{border-top:1px solid var(--border);border-bottom:1px solid var(--border);grid-template-columns:repeat(4,1fr);margin-top:20px;display:grid}.summary-item{border-right:1px solid var(--border);min-width:0;padding:15px 18px}.summary-item:first-child{padding-left:0}.summary-item:last-child{border-right:0}.summary-item>span{color:var(--muted);font-size:10px;display:block}.summary-item strong{letter-spacing:-.025em;text-overflow:ellipsis;margin-top:5px;font-size:19px;display:block;overflow:hidden}.summary-item small{color:var(--subtle);white-space:nowrap;text-overflow:ellipsis;margin-top:3px;font-size:10px;display:block;overflow:hidden}.distribution-grid{grid-template-columns:minmax(0,1fr) 1px minmax(0,1fr);gap:22px;padding-top:19px;display:grid}.distribution-divider{background:var(--border)}.column-label{color:#3f4a5f;text-transform:uppercase;letter-spacing:.05em;gap:7px;margin-bottom:14px;font-size:11px;font-weight:700}.distribution-block+.distribution-block{margin-top:16px}.distribution-heading,.distribution-meta{justify-content:space-between;gap:12px;display:flex}.distribution-heading{color:var(--muted);margin-bottom:8px;font-size:11px}.distribution-heading strong{color:#3c485e}.distribution-list{gap:8px;display:grid}.distribution-meta{color:var(--muted);font-family:var(--mono);margin-bottom:5px;font-size:10px}.provider-name{color:#303b50}.bar-track{background:#edf0f5;border-radius:99px;height:5px;overflow:hidden}.bar-fill{border-radius:inherit;background:#9eabc0;height:100%;display:block}.bar-fill--current{background:var(--accent)}.empty-inline{color:var(--subtle);font-size:11px}.warning-stack{gap:7px;margin-top:12px;display:grid}.warning-row{border:1px solid;border-radius:7px;align-items:flex-start;gap:10px;padding:10px 13px;font-size:11px}.warning-row svg{flex:none;margin-top:1px}.warning-row div{gap:2px;display:grid}.warning-row span{color:#6e5d47;word-break:break-word;line-height:1.5}.warning-row--warning{background:var(--warning-soft);color:var(--warning);border-color:#ebd7ae}.warning-row--danger{background:var(--danger-soft);color:var(--danger);border-color:#efc2c4}.warning-row--info{color:#2463a7;background:#eef6ff;border-color:#c9def8}.warning-row--info span{color:#4f6a89}.overview-lower-grid{grid-template-columns:minmax(0,1fr) 360px;align-items:start;gap:18px;margin-top:18px;display:grid}.overview-main-column{grid-template-columns:minmax(0,1fr);gap:18px;width:100%;min-width:0;display:grid}.data-section,.recent-backups{min-width:0;padding:18px 20px}.table-scroll{margin-top:15px;overflow-x:auto}.data-table{border-collapse:collapse;width:100%;font-size:11px}.data-table th{color:var(--muted);border-top:1px solid var(--border);border-bottom:1px solid var(--border);text-align:left;white-space:nowrap;background:#f8fafc;padding:9px 10px;font-weight:650}.data-table td{color:#465268;vertical-align:top;border-bottom:1px solid #edf0f4;padding:11px 10px}.data-table tbody tr:last-child td{border-bottom:0}.path-cell{max-width:260px;font-family:var(--mono);word-break:break-all;color:#263249!important}.table-empty{text-align:center;color:var(--subtle)!important;padding:25px!important}.execution-panel{background:#fff;border:1px solid #cdd8e9;border-radius:10px;padding:19px;position:sticky;top:174px;box-shadow:0 9px 24px #26375312}.execution-head{justify-content:space-between;align-items:flex-start;gap:14px}.execution-head>svg{color:var(--accent);margin-top:2px}.segmented{background:#f1f4f8;border-radius:8px;grid-template-columns:1fr 1fr;gap:4px;margin-top:17px;padding:4px;display:grid}.segmented-option{min-width:0;color:var(--muted);cursor:pointer;text-align:left;background:0 0;border:1px solid #0000;border-radius:6px;gap:3px;padding:9px 8px;display:grid}.segmented-option span{font-size:11px;font-weight:700}.segmented-option small{color:var(--subtle);font-size:9px}.segmented-option--active{color:#263249;background:#fff;border-color:#dce3ee;box-shadow:0 2px 5px #17203312}.form-grid{grid-template-columns:minmax(0,1fr) 100px;gap:12px;margin-top:15px;display:grid}.form-field{color:#4c586d;align-content:start;gap:6px;font-size:10px;font-weight:650;display:grid}.form-field select,.form-field input,.custom-model-option input[type=text]{color:#273247;border:1px solid var(--border-strong);background:#fff;border-radius:6px;width:100%;height:35px;padding:0 9px;font-size:11px}.form-field small{color:var(--subtle);font-weight:450;line-height:1.35}.form-field .field-error{color:var(--danger)}.manual-provider-row{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:7px;margin-top:9px;display:grid}.manual-provider-row input{color:#273247;border:1px solid var(--border-strong);min-width:0;height:32px;font-family:var(--mono);background:#fff;border-radius:6px;padding:0 9px;font-size:10px}.manual-remove{color:var(--danger);cursor:pointer;background:0 0;border:0;grid-column:1/-1;justify-self:start;padding:0;font-size:9px}.model-options,.restore-options{border:1px solid var(--border);border-radius:7px;margin:16px 0 0;padding:13px}.model-options legend,.restore-options legend{color:#566176;padding:0 5px;font-size:10px;font-weight:700}.model-options>label,.restore-options>label{color:#364258;cursor:pointer;align-items:flex-start;gap:8px;padding:7px 0;font-size:11px;display:flex}.model-options input[type=radio],.restore-options input[type=checkbox]{accent-color:var(--accent);margin:2px 0 0}.model-options label>span,.restore-options label>span{flex:1;gap:2px;min-width:0;display:grid}.model-options small,.restore-options small{color:var(--muted);font-size:9px;font-weight:450;line-height:1.4}.custom-model-option input[type=text]{margin-top:5px}.backup-assurance{color:var(--success);gap:7px;margin-top:14px;font-size:10px}.execute-button{width:100%;height:40px;margin-top:14px}.backup-rows{border-top:1px solid var(--border);margin-top:13px}.backup-row{border-bottom:1px solid #edf0f4;gap:11px;min-width:0;padding:11px 0}.backup-row:last-child{border-bottom:0}.backup-icon{color:#5e6a80;background:#f1f4f8;border-radius:7px;flex:none;place-items:center;width:30px;height:30px;display:grid}.backup-main{flex:1;gap:2px;min-width:0;display:grid}.backup-main strong{font-size:11px}.backup-main span,.backup-size{color:var(--muted);font-size:10px}.empty-state{color:var(--subtle);text-align:center;padding:25px 0 12px;font-size:11px}.page-intro{justify-content:space-between;align-items:center;gap:24px;padding:4px 2px 20px;display:flex}.prune-control{color:var(--muted);align-items:center;gap:10px;font-size:11px;display:flex}.prune-control input{border:1px solid var(--border-strong);text-align:center;border-radius:6px;width:64px;height:34px}.backup-list-section{overflow:hidden}.backup-root-line{border-bottom:1px solid var(--border);color:#59657a;background:#f8fafc;gap:8px;padding:13px 17px;font-size:10px}.backup-root-line span{text-overflow:ellipsis;min-width:0;font-family:var(--mono);white-space:nowrap;flex:1;overflow:hidden}.backup-root-line strong{color:#465168;font-size:10px}.full-backup-row{border-bottom:1px solid var(--border);grid-template-columns:190px 230px minmax(220px,1fr) auto;align-items:center;gap:22px;padding:16px 18px;display:grid}.full-backup-row:last-child{border-bottom:0}.backup-date,.backup-source{gap:5px;min-width:0;display:grid}.backup-date strong{font-size:12px}.backup-date span,.backup-source span{color:var(--subtle);font-size:9px}.backup-facts{color:var(--muted);gap:15px;font-size:10px;display:flex}.backup-facts span{gap:3px;display:grid}.backup-facts strong{color:#344057}.backup-source code{color:#445169;font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;font-size:9px;overflow:hidden}.backup-row-actions{color:var(--muted);justify-content:flex-end;align-items:center;gap:12px;font-size:10px;display:flex}.large-empty{color:var(--subtle);justify-items:center;gap:7px;padding:70px 20px;display:grid}.large-empty strong{color:#59657a;font-size:13px}.large-empty span{font-size:11px}.live-operation{color:var(--warning);gap:7px;font-size:11px}.activity-console{overflow:hidden}.console-head{color:#b6c2d4;font-family:var(--mono);background:#202a3b;border-bottom:1px solid #354156;justify-content:space-between;padding:12px 15px;font-size:10px;display:flex}.console-body{content-visibility:auto;background:#17202f;min-height:440px;max-height:calc(100vh - 250px);padding:7px 0;overflow:auto}.console-row{color:#d7deea;font-family:var(--mono);border-bottom:1px solid #ffffff09;grid-template-columns:150px 70px minmax(220px,1fr) minmax(0,1.2fr);gap:12px;padding:8px 15px;font-size:10px;line-height:1.45;display:grid}.console-row time,.console-detail{color:#7e8ca3}.console-level{color:#8fa3c1;text-transform:uppercase}.console-row--success .console-level{color:#54d19f}.console-row--error .console-level{color:#ff8790}.console-row--progress .console-level{color:#79a8ff}.console-empty{color:#708098;font-family:var(--mono);padding:30px 15px;font-size:11px}.modal-backdrop{z-index:100;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background:#141c2b75;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.modal{background:#fff;border:1px solid #cfd6e1;border-radius:12px;width:min(600px,100%);max-height:calc(100vh - 40px);animation:.16s ease-out modal-in;overflow:auto;box-shadow:0 24px 70px #0e172840}.modal-head{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:17px 19px;display:flex}.modal-head h2{margin:0;font-size:16px}.modal-body{padding:18px 19px}.modal-actions{border-top:1px solid var(--border);background:#f8fafc;justify-content:flex-end;gap:9px;padding:13px 19px;display:flex}.modal-callout{color:#9a5909;background:var(--warning-soft);border:1px solid #ead4aa;border-radius:7px;align-items:flex-start;gap:10px;padding:11px 12px}.modal-callout>svg{flex:none;margin-top:1px}.modal-callout div{gap:3px;display:grid}.modal-callout span{color:#735f43;word-break:break-word;font-size:10px;line-height:1.55}.modal-callout--danger{color:var(--danger);background:var(--danger-soft);border-color:#efc1c4}.modal-callout--warning{margin-top:14px}.operation-scope{border-top:1px solid var(--border);margin:16px 0 0}.operation-scope>div{border-bottom:1px solid #edf0f4;grid-template-columns:130px minmax(0,1fr);gap:14px;padding:9px 0;font-size:11px;display:grid}.operation-scope dt{color:var(--muted)}.operation-scope dd{color:#2d394f;font-family:var(--mono);word-break:break-word;margin:0}.operation-scope small{color:var(--subtle)}.restore-summary{border-bottom:1px solid var(--border);align-items:flex-start;gap:10px;padding-bottom:13px}.restore-summary div{gap:4px;min-width:0;display:grid}.restore-summary strong{font-size:12px}.restore-summary code{color:var(--muted);font-family:var(--mono);word-break:break-all;font-size:9px}.restore-options{margin-bottom:14px}.profile-form{gap:12px;display:grid}.profile-form label{color:#4c586d;gap:6px;font-size:10px;font-weight:650;display:grid}.profile-form input{color:#273247;border:1px solid var(--border-strong);width:100%;height:36px;font:11px var(--mono);border-radius:6px;padding:0 10px}.access-gate{color:#344057;text-align:center;background:#f5f7fb;place-content:center;justify-items:center;gap:12px;min-height:100vh;padding:24px;display:grid}.access-gate svg{color:var(--accent)}.access-gate h1{margin:0;font-size:22px}.access-gate p{max-width:520px;color:var(--muted);margin:0;line-height:1.6}.access-gate code{color:#273247;border:1px solid var(--border);background:#fff;border-radius:6px;padding:8px 12px}.toast{z-index:120;border:1px solid var(--border-strong);border-left:3px solid var(--accent);background:#fff;border-radius:8px;justify-content:space-between;align-items:flex-start;gap:12px;width:min(390px,100vw - 44px);padding:13px 14px;animation:.2s ease-out toast-in;display:flex;position:fixed;bottom:22px;right:22px;box-shadow:0 15px 40px #161f302e}.toast>div{align-items:flex-start;gap:9px}.toast span{gap:3px;display:grid}.toast strong{font-size:12px}.toast small{color:var(--muted);word-break:break-word;font-size:10px;line-height:1.4}.toast button{color:var(--muted);cursor:pointer;background:0 0;border:0}.toast--success{border-left-color:var(--success)}.toast--success>div>svg{color:var(--success)}.toast--error{border-left-color:var(--danger)}.toast--error>div>svg{color:var(--danger)}.toast--warning{border-left-color:var(--warning)}.toast--warning>div>svg{color:var(--warning)}.spin{animation:1s linear infinite spin}.history-toolbar{grid-template-columns:minmax(220px,1.7fr) repeat(3,minmax(130px,1fr));gap:9px;margin-bottom:14px;display:grid}.history-toolbar input,.history-toolbar select{border:1px solid var(--border-strong);width:100%;min-width:0;color:var(--text);font:inherit;background:#fff;border-radius:7px;padding:10px 11px}.history-error{color:var(--danger);background:#fff5f3;border:1px solid #f2c9c2;border-radius:7px;align-items:center;gap:8px;margin-bottom:12px;padding:10px 12px;font-size:12px;display:flex}.history-layout{border:1px solid var(--border);background:#fff;border-radius:9px;flex:auto;grid-template-columns:minmax(300px,.8fr) minmax(0,1.4fr);height:100%;min-height:0;display:grid;overflow:hidden}.history-list-panel{border-right:1px solid var(--border);background:#fbfcfe;flex-direction:column;min-width:0;min-height:0;display:flex;overflow:hidden}.history-list-head{color:var(--muted);border-bottom:1px solid var(--border);justify-content:space-between;padding:13px 15px;font-size:11px;display:flex}.history-list{overscroll-behavior:contain;flex:auto;height:0;min-height:0;overflow-y:auto}.history-session-row{text-align:left;border:0;border-bottom:1px solid var(--border);width:100%;color:var(--text);cursor:pointer;background:0 0;padding:13px 15px;display:block}.history-session-row:hover,.history-session-row--selected{background:#eef5ff}.history-session-top{justify-content:space-between;gap:9px;display:flex}.history-session-top strong{text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.history-session-top time{color:var(--subtle);flex:none;font-size:10px}.history-session-row p{color:var(--muted);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:7px 0;font-size:11px;line-height:1.45;display:-webkit-box;overflow:hidden}.history-session-meta{color:var(--subtle);flex-wrap:wrap;gap:7px;font-size:10px;display:flex}.history-session-meta span:first-child{color:var(--accent)}.history-pagination{border-top:1px solid var(--border);justify-content:space-between;align-items:center;padding:10px 12px;display:flex}.history-pagination span{color:var(--muted);font-size:11px}.history-detail-panel{overscroll-behavior:contain;background:#fff;min-width:0;min-height:0;overflow-y:auto}.history-detail-head{border-bottom:1px solid var(--border);justify-content:space-between;gap:12px;padding:20px 22px 15px;display:flex}.history-detail-head h2{margin:0 0 6px;font-size:17px}.history-detail-head p{color:var(--muted);font:10px/1.4 var(--mono);word-break:break-word;margin:0}.history-detail-head>span{height:fit-content;color:var(--accent);background:#edf4ff;border-radius:4px;flex:none;padding:4px 7px;font-size:10px}.history-truncated{color:#8b631c;background:#fff8e7;border:1px solid #f0dfae;border-radius:6px;align-items:center;gap:7px;margin:14px 22px 0;padding:9px 10px;font-size:11px;display:flex}.message-stream{gap:14px;padding:20px 22px 28px;display:grid}.chat-message{max-width:88%}.chat-message--user{justify-self:end}.chat-message--assistant{justify-self:start}.chat-message-label{color:var(--muted);justify-content:space-between;gap:12px;margin-bottom:5px;font-size:10px;display:flex}.chat-message--user .chat-message-label{color:var(--accent)}.chat-message-label time{color:var(--subtle);font:9px var(--mono)}.chat-message-body{white-space:pre-wrap;word-break:break-word;color:var(--text);border:1px solid var(--border);background:#f5f7fb;border-radius:8px;padding:11px 13px;font-size:12px;line-height:1.6}.chat-message--user .chat-message-body{background:#edf4ff;border-color:#d5e4fb}.chat-message-body code{font:11px var(--mono);background:#2d394f14;border-radius:3px;padding:1px 4px}.chat-message-body pre{color:#f7f9fc;white-space:pre;background:#1f2937;border-radius:5px;margin:8px 0 0;padding:10px;overflow:auto}.chat-message-body pre code{color:inherit;background:0 0;padding:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes modal-in{0%{opacity:0;transform:translateY(8px)scale(.99)}}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}}@media (width<=1120px){.app-shell{grid-template-columns:168px minmax(0,1fr)}.overview-lower-grid{grid-template-columns:1fr}.execution-panel{position:static}.full-backup-row{grid-template-columns:170px 1fr auto}.backup-source{grid-area:2/1/auto/3}.backup-row-actions{grid-area:1/3/3}}@media (width<=820px){.app-shell{display:block}.app-header{height:62px;padding:0 14px}.brand-subtitle,.service-state{display:none}.sidebar{z-index:25;border-right:0;border-bottom:1px solid var(--border);width:100%;height:auto;padding:7px 10px;display:block;position:sticky;top:62px}.navigation{grid-template-columns:repeat(4,1fr);display:grid}.nav-item{justify-content:center;padding:8px}.nav-item--active{box-shadow:inset 0 -2px 0 var(--accent)}.sidebar-foot{display:none}.storage-bar{grid-template-columns:1fr;padding:14px;position:static}.view-content{padding:18px 14px 32px}.summary-strip{grid-template-columns:1fr 1fr}.summary-item{border-bottom:1px solid var(--border)}.summary-item:nth-child(2){border-right:0}.summary-item:nth-child(3),.summary-item:nth-child(4){border-bottom:0}.summary-item:nth-child(3){padding-left:0}.distribution-grid{grid-template-columns:1fr}.distribution-divider{height:1px}.page-intro{flex-direction:column;align-items:flex-start}.full-backup-row{grid-template-columns:1fr auto;gap:12px}.backup-facts,.backup-source{grid-column:1/-1}.backup-row-actions{grid-area:1/2}.console-row{grid-template-columns:115px 62px minmax(180px,1fr)}.console-detail{grid-column:3}.history-toolbar{grid-template-columns:1fr 1fr}.history-toolbar input{grid-column:1/-1}.history-view{height:calc(100dvh - 270px);min-height:520px}.history-layout{grid-template-columns:1fr;min-height:0}.history-list-panel{border-right:0;border-bottom:1px solid var(--border);min-height:0;max-height:40%}.history-detail-panel{min-height:0}}@media (width<=560px){.header-actions .button span{display:none}.brand-name{font-size:13px}.status-panel,.data-section,.recent-backups{padding:16px}.section-title-row{flex-direction:column;align-items:flex-start}.summary-strip{grid-template-columns:1fr}.summary-item{border-right:0;padding-left:0;border-bottom:1px solid var(--border)!important}.summary-item:last-child{border-bottom:0!important}.form-grid,.segmented{grid-template-columns:1fr}.backup-size{display:none}.prune-control{justify-content:space-between;width:100%}.operation-scope>div{grid-template-columns:1fr;gap:4px}.modal{max-height:calc(100vh - 20px)}.modal-backdrop{padding:10px}.history-toolbar{grid-template-columns:1fr}.history-toolbar input{grid-column:auto}.history-view{height:calc(100dvh - 300px);min-height:500px}.history-detail-head,.message-stream{padding-left:15px;padding-right:15px}.chat-message{max-width:96%}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}} diff --git a/web/dist/assets/index-aed55189.js b/web/dist/assets/index-aed55189.js deleted file mode 100644 index c39436e..0000000 --- a/web/dist/assets/index-aed55189.js +++ /dev/null @@ -1,42 +0,0 @@ -(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const l of document.querySelectorAll('link[rel="modulepreload"]'))r(l);new MutationObserver(l=>{for(const i of l)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function t(l){const i={};return l.integrity&&(i.integrity=l.integrity),l.referrerPolicy&&(i.referrerPolicy=l.referrerPolicy),l.crossOrigin==="use-credentials"?i.credentials="include":l.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(l){if(l.ep)return;l.ep=!0;const i=t(l);fetch(l.href,i)}})();function Uc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var wu={exports:{}},kl={},ju={exports:{}},F={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var gr=Symbol.for("react.element"),Hc=Symbol.for("react.portal"),Bc=Symbol.for("react.fragment"),Vc=Symbol.for("react.strict_mode"),Qc=Symbol.for("react.profiler"),Wc=Symbol.for("react.provider"),qc=Symbol.for("react.context"),Kc=Symbol.for("react.forward_ref"),Yc=Symbol.for("react.suspense"),Xc=Symbol.for("react.memo"),Gc=Symbol.for("react.lazy"),cs=Symbol.iterator;function Zc(e){return e===null||typeof e!="object"?null:(e=cs&&e[cs]||e["@@iterator"],typeof e=="function"?e:null)}var Su={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},ku=Object.assign,Cu={};function Pt(e,n,t){this.props=e,this.context=n,this.refs=Cu,this.updater=t||Su}Pt.prototype.isReactComponent={};Pt.prototype.setState=function(e,n){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,n,"setState")};Pt.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Nu(){}Nu.prototype=Pt.prototype;function ao(e,n,t){this.props=e,this.context=n,this.refs=Cu,this.updater=t||Su}var co=ao.prototype=new Nu;co.constructor=ao;ku(co,Pt.prototype);co.isPureReactComponent=!0;var ds=Array.isArray,Eu=Object.prototype.hasOwnProperty,fo={current:null},Pu={key:!0,ref:!0,__self:!0,__source:!0};function _u(e,n,t){var r,l={},i=null,s=null;if(n!=null)for(r in n.ref!==void 0&&(s=n.ref),n.key!==void 0&&(i=""+n.key),n)Eu.call(n,r)&&!Pu.hasOwnProperty(r)&&(l[r]=n[r]);var u=arguments.length-2;if(u===1)l.children=t;else if(1>>1,q=k[A];if(0>>1;Al(Rt,T))enl(Zn,Rt)?(k[A]=Zn,k[en]=T,A=en):(k[A]=Rt,k[be]=T,A=be);else if(enl(Zn,T))k[A]=Zn,k[en]=T,A=en;else break e}}return R}function l(k,R){var T=k.sortIndex-R.sortIndex;return T!==0?T:k.id-R.id}if(typeof performance=="object"&&typeof performance.now=="function"){var i=performance;e.unstable_now=function(){return i.now()}}else{var s=Date,u=s.now();e.unstable_now=function(){return s.now()-u}}var a=[],d=[],v=1,m=null,h=3,x=!1,j=!1,S=!1,D=typeof setTimeout=="function"?setTimeout:null,f=typeof clearTimeout=="function"?clearTimeout:null,c=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function p(k){for(var R=t(d);R!==null;){if(R.callback===null)r(d);else if(R.startTime<=k)r(d),R.sortIndex=R.expirationTime,n(a,R);else break;R=t(d)}}function g(k){if(S=!1,p(k),!j)if(t(a)!==null)j=!0,M(C);else{var R=t(d);R!==null&&ie(g,R.startTime-k)}}function C(k,R){j=!1,S&&(S=!1,f(_),_=-1),x=!0;var T=h;try{for(p(R),m=t(a);m!==null&&(!(m.expirationTime>R)||k&&!G());){var A=m.callback;if(typeof A=="function"){m.callback=null,h=m.priorityLevel;var q=A(m.expirationTime<=R);R=e.unstable_now(),typeof q=="function"?m.callback=q:m===t(a)&&r(a),p(R)}else r(a);m=t(a)}if(m!==null)var pn=!0;else{var be=t(d);be!==null&&ie(g,be.startTime-R),pn=!1}return pn}finally{m=null,h=T,x=!1}}var y=!1,N=null,_=-1,I=5,z=-1;function G(){return!(e.unstable_now()-zk||125A?(k.sortIndex=T,n(d,k),t(a)===null&&k===t(d)&&(S?(f(_),_=-1):S=!0,ie(g,T-A))):(k.sortIndex=q,n(a,k),j||x||(j=!0,M(C))),k},e.unstable_shouldYield=G,e.unstable_wrapCallback=function(k){var R=h;return function(){var T=h;h=R;try{return k.apply(this,arguments)}finally{h=T}}}})(Mu);Tu.exports=Mu;var ud=Tu.exports;/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var ad=E,Ee=ud;function w(e){for(var n="https://reactjs.org/docs/error-decoder.html?invariant="+e,t=1;t"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),hi=Object.prototype.hasOwnProperty,cd=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,ps={},hs={};function dd(e){return hi.call(hs,e)?!0:hi.call(ps,e)?!1:cd.test(e)?hs[e]=!0:(ps[e]=!0,!1)}function fd(e,n,t,r){if(t!==null&&t.type===0)return!1;switch(typeof n){case"function":case"symbol":return!0;case"boolean":return r?!1:t!==null?!t.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function pd(e,n,t,r){if(n===null||typeof n>"u"||fd(e,n,t,r))return!0;if(r)return!1;if(t!==null)switch(t.type){case 3:return!n;case 4:return n===!1;case 5:return isNaN(n);case 6:return isNaN(n)||1>n}return!1}function ge(e,n,t,r,l,i,s){this.acceptsBooleans=n===2||n===3||n===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=t,this.propertyName=e,this.type=n,this.sanitizeURL=i,this.removeEmptyString=s}var ae={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){ae[e]=new ge(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var n=e[0];ae[n]=new ge(n,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){ae[e]=new ge(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){ae[e]=new ge(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){ae[e]=new ge(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){ae[e]=new ge(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){ae[e]=new ge(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){ae[e]=new ge(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){ae[e]=new ge(e,5,!1,e.toLowerCase(),null,!1,!1)});var mo=/[\-:]([a-z])/g;function vo(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var n=e.replace(mo,vo);ae[n]=new ge(n,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var n=e.replace(mo,vo);ae[n]=new ge(n,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var n=e.replace(mo,vo);ae[n]=new ge(n,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){ae[e]=new ge(e,1,!1,e.toLowerCase(),null,!1,!1)});ae.xlinkHref=new ge("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){ae[e]=new ge(e,1,!1,e.toLowerCase(),null,!0,!0)});function go(e,n,t,r){var l=ae.hasOwnProperty(n)?ae[n]:null;(l!==null?l.type!==0:r||!(2u||l[s]!==i[u]){var a=` -`+l[s].replace(" at new "," at ");return e.displayName&&a.includes("")&&(a=a.replace("",e.displayName)),a}while(1<=s&&0<=u);break}}}finally{Vl=!1,Error.prepareStackTrace=t}return(e=e?e.displayName||e.name:"")?At(e):""}function hd(e){switch(e.tag){case 5:return At(e.type);case 16:return At("Lazy");case 13:return At("Suspense");case 19:return At("SuspenseList");case 0:case 2:case 15:return e=Ql(e.type,!1),e;case 11:return e=Ql(e.type.render,!1),e;case 1:return e=Ql(e.type,!0),e;default:return""}}function yi(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case nt:return"Fragment";case et:return"Portal";case mi:return"Profiler";case yo:return"StrictMode";case vi:return"Suspense";case gi:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Du:return(e.displayName||"Context")+".Consumer";case Ou:return(e._context.displayName||"Context")+".Provider";case xo:var n=e.render;return e=e.displayName,e||(e=n.displayName||n.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case wo:return n=e.displayName||null,n!==null?n:yi(e.type)||"Memo";case mn:n=e._payload,e=e._init;try{return yi(e(n))}catch{}}return null}function md(e){var n=e.type;switch(e.tag){case 24:return"Cache";case 9:return(n.displayName||"Context")+".Consumer";case 10:return(n._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=n.render,e=e.displayName||e.name||"",n.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return n;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return yi(n);case 8:return n===yo?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n}return null}function zn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function $u(e){var n=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(n==="checkbox"||n==="radio")}function vd(e){var n=$u(e)?"checked":"value",t=Object.getOwnPropertyDescriptor(e.constructor.prototype,n),r=""+e[n];if(!e.hasOwnProperty(n)&&typeof t<"u"&&typeof t.get=="function"&&typeof t.set=="function"){var l=t.get,i=t.set;return Object.defineProperty(e,n,{configurable:!0,get:function(){return l.call(this)},set:function(s){r=""+s,i.call(this,s)}}),Object.defineProperty(e,n,{enumerable:t.enumerable}),{getValue:function(){return r},setValue:function(s){r=""+s},stopTracking:function(){e._valueTracker=null,delete e[n]}}}}function Cr(e){e._valueTracker||(e._valueTracker=vd(e))}function Au(e){if(!e)return!1;var n=e._valueTracker;if(!n)return!0;var t=n.getValue(),r="";return e&&(r=$u(e)?e.checked?"true":"false":e.value),e=r,e!==t?(n.setValue(e),!0):!1}function Jr(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function xi(e,n){var t=n.checked;return X({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:t??e._wrapperState.initialChecked})}function vs(e,n){var t=n.defaultValue==null?"":n.defaultValue,r=n.checked!=null?n.checked:n.defaultChecked;t=zn(n.value!=null?n.value:t),e._wrapperState={initialChecked:r,initialValue:t,controlled:n.type==="checkbox"||n.type==="radio"?n.checked!=null:n.value!=null}}function Uu(e,n){n=n.checked,n!=null&&go(e,"checked",n,!1)}function wi(e,n){Uu(e,n);var t=zn(n.value),r=n.type;if(t!=null)r==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+t):e.value!==""+t&&(e.value=""+t);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}n.hasOwnProperty("value")?ji(e,n.type,t):n.hasOwnProperty("defaultValue")&&ji(e,n.type,zn(n.defaultValue)),n.checked==null&&n.defaultChecked!=null&&(e.defaultChecked=!!n.defaultChecked)}function gs(e,n,t){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaultValue")){var r=n.type;if(!(r!=="submit"&&r!=="reset"||n.value!==void 0&&n.value!==null))return;n=""+e._wrapperState.initialValue,t||n===e.value||(e.value=n),e.defaultValue=n}t=e.name,t!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,t!==""&&(e.name=t)}function ji(e,n,t){(n!=="number"||Jr(e.ownerDocument)!==e)&&(t==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+t&&(e.defaultValue=""+t))}var Ut=Array.isArray;function ft(e,n,t,r){if(e=e.options,n){n={};for(var l=0;l"+n.valueOf().toString()+"",n=Nr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;n.firstChild;)e.appendChild(n.firstChild)}});function er(e,n){if(n){var t=e.firstChild;if(t&&t===e.lastChild&&t.nodeType===3){t.nodeValue=n;return}}e.textContent=n}var Vt={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},gd=["Webkit","ms","Moz","O"];Object.keys(Vt).forEach(function(e){gd.forEach(function(n){n=n+e.charAt(0).toUpperCase()+e.substring(1),Vt[n]=Vt[e]})});function Qu(e,n,t){return n==null||typeof n=="boolean"||n===""?"":t||typeof n!="number"||n===0||Vt.hasOwnProperty(e)&&Vt[e]?(""+n).trim():n+"px"}function Wu(e,n){e=e.style;for(var t in n)if(n.hasOwnProperty(t)){var r=t.indexOf("--")===0,l=Qu(t,n[t],r);t==="float"&&(t="cssFloat"),r?e.setProperty(t,l):e[t]=l}}var yd=X({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Ci(e,n){if(n){if(yd[e]&&(n.children!=null||n.dangerouslySetInnerHTML!=null))throw Error(w(137,e));if(n.dangerouslySetInnerHTML!=null){if(n.children!=null)throw Error(w(60));if(typeof n.dangerouslySetInnerHTML!="object"||!("__html"in n.dangerouslySetInnerHTML))throw Error(w(61))}if(n.style!=null&&typeof n.style!="object")throw Error(w(62))}}function Ni(e,n){if(e.indexOf("-")===-1)return typeof n.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ei=null;function jo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Pi=null,pt=null,ht=null;function ws(e){if(e=wr(e)){if(typeof Pi!="function")throw Error(w(280));var n=e.stateNode;n&&(n=_l(n),Pi(e.stateNode,e.type,n))}}function qu(e){pt?ht?ht.push(e):ht=[e]:pt=e}function Ku(){if(pt){var e=pt,n=ht;if(ht=pt=null,ws(e),n)for(e=0;e>>=0,e===0?32:31-(zd(e)/Rd|0)|0}var Er=64,Pr=4194304;function Ht(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function tl(e,n){var t=e.pendingLanes;if(t===0)return 0;var r=0,l=e.suspendedLanes,i=e.pingedLanes,s=t&268435455;if(s!==0){var u=s&~l;u!==0?r=Ht(u):(i&=s,i!==0&&(r=Ht(i)))}else s=t&~l,s!==0?r=Ht(s):i!==0&&(r=Ht(i));if(r===0)return 0;if(n!==0&&n!==r&&!(n&l)&&(l=r&-r,i=n&-n,l>=i||l===16&&(i&4194240)!==0))return n;if(r&4&&(r|=t&16),n=e.entangledLanes,n!==0)for(e=e.entanglements,n&=r;0t;t++)n.push(e);return n}function yr(e,n,t){e.pendingLanes|=n,n!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,n=31-Ue(n),e[n]=t}function Id(e,n){var t=e.pendingLanes&~n;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=n,e.mutableReadLanes&=n,e.entangledLanes&=n,n=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Wt),zs=String.fromCharCode(32),Rs=!1;function pa(e,n){switch(e){case"keyup":return af.indexOf(n.keyCode)!==-1;case"keydown":return n.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ha(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var tt=!1;function df(e,n){switch(e){case"compositionend":return ha(n);case"keypress":return n.which!==32?null:(Rs=!0,zs);case"textInput":return e=n.data,e===zs&&Rs?null:e;default:return null}}function ff(e,n){if(tt)return e==="compositionend"||!zo&&pa(e,n)?(e=da(),Vr=Eo=xn=null,tt=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(n.ctrlKey||n.altKey||n.metaKey)||n.ctrlKey&&n.altKey){if(n.char&&1=n)return{node:t,offset:n-e};e=r}e:{for(;t;){if(t.nextSibling){t=t.nextSibling;break e}t=t.parentNode}t=void 0}t=Is(t)}}function ya(e,n){return e&&n?e===n?!0:e&&e.nodeType===3?!1:n&&n.nodeType===3?ya(e,n.parentNode):"contains"in e?e.contains(n):e.compareDocumentPosition?!!(e.compareDocumentPosition(n)&16):!1:!1}function xa(){for(var e=window,n=Jr();n instanceof e.HTMLIFrameElement;){try{var t=typeof n.contentWindow.location.href=="string"}catch{t=!1}if(t)e=n.contentWindow;else break;n=Jr(e.document)}return n}function Ro(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return n&&(n==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||n==="textarea"||e.contentEditable==="true")}function jf(e){var n=xa(),t=e.focusedElem,r=e.selectionRange;if(n!==t&&t&&t.ownerDocument&&ya(t.ownerDocument.documentElement,t)){if(r!==null&&Ro(t)){if(n=r.start,e=r.end,e===void 0&&(e=n),"selectionStart"in t)t.selectionStart=n,t.selectionEnd=Math.min(e,t.value.length);else if(e=(n=t.ownerDocument||document)&&n.defaultView||window,e.getSelection){e=e.getSelection();var l=t.textContent.length,i=Math.min(r.start,l);r=r.end===void 0?i:Math.min(r.end,l),!e.extend&&i>r&&(l=r,r=i,i=l),l=Os(t,i);var s=Os(t,r);l&&s&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==s.node||e.focusOffset!==s.offset)&&(n=n.createRange(),n.setStart(l.node,l.offset),e.removeAllRanges(),i>r?(e.addRange(n),e.extend(s.node,s.offset)):(n.setEnd(s.node,s.offset),e.addRange(n)))}}for(n=[],e=t;e=e.parentNode;)e.nodeType===1&&n.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof t.focus=="function"&&t.focus(),t=0;t=document.documentMode,rt=null,Mi=null,Kt=null,Ii=!1;function Ds(e,n,t){var r=t.window===t?t.document:t.nodeType===9?t:t.ownerDocument;Ii||rt==null||rt!==Jr(r)||(r=rt,"selectionStart"in r&&Ro(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Kt&&or(Kt,r)||(Kt=r,r=il(Mi,"onSelect"),0ot||(e.current=Ui[ot],Ui[ot]=null,ot--)}function H(e,n){ot++,Ui[ot]=e.current,e.current=n}var Rn={},pe=Tn(Rn),we=Tn(!1),Bn=Rn;function wt(e,n){var t=e.type.contextTypes;if(!t)return Rn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===n)return r.__reactInternalMemoizedMaskedChildContext;var l={},i;for(i in t)l[i]=n[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=n,e.__reactInternalMemoizedMaskedChildContext=l),l}function je(e){return e=e.childContextTypes,e!=null}function sl(){V(we),V(pe)}function Vs(e,n,t){if(pe.current!==Rn)throw Error(w(168));H(pe,n),H(we,t)}function _a(e,n,t){var r=e.stateNode;if(n=n.childContextTypes,typeof r.getChildContext!="function")return t;r=r.getChildContext();for(var l in r)if(!(l in n))throw Error(w(108,md(e)||"Unknown",l));return X({},t,r)}function ul(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Rn,Bn=pe.current,H(pe,e),H(we,we.current),!0}function Qs(e,n,t){var r=e.stateNode;if(!r)throw Error(w(169));t?(e=_a(e,n,Bn),r.__reactInternalMemoizedMergedChildContext=e,V(we),V(pe),H(pe,e)):V(we),H(we,t)}var tn=null,zl=!1,li=!1;function za(e){tn===null?tn=[e]:tn.push(e)}function Mf(e){zl=!0,za(e)}function Mn(){if(!li&&tn!==null){li=!0;var e=0,n=U;try{var t=tn;for(U=1;e>=s,l-=s,rn=1<<32-Ue(n)+l|t<_?(I=N,N=null):I=N.sibling;var z=h(f,N,p[_],g);if(z===null){N===null&&(N=I);break}e&&N&&z.alternate===null&&n(f,N),c=i(z,c,_),y===null?C=z:y.sibling=z,y=z,N=I}if(_===p.length)return t(f,N),W&&In(f,_),C;if(N===null){for(;__?(I=N,N=null):I=N.sibling;var G=h(f,N,z.value,g);if(G===null){N===null&&(N=I);break}e&&N&&G.alternate===null&&n(f,N),c=i(G,c,_),y===null?C=G:y.sibling=G,y=G,N=I}if(z.done)return t(f,N),W&&In(f,_),C;if(N===null){for(;!z.done;_++,z=p.next())z=m(f,z.value,g),z!==null&&(c=i(z,c,_),y===null?C=z:y.sibling=z,y=z);return W&&In(f,_),C}for(N=r(f,N);!z.done;_++,z=p.next())z=x(N,f,_,z.value,g),z!==null&&(e&&z.alternate!==null&&N.delete(z.key===null?_:z.key),c=i(z,c,_),y===null?C=z:y.sibling=z,y=z);return e&&N.forEach(function(We){return n(f,We)}),W&&In(f,_),C}function D(f,c,p,g){if(typeof p=="object"&&p!==null&&p.type===nt&&p.key===null&&(p=p.props.children),typeof p=="object"&&p!==null){switch(p.$$typeof){case kr:e:{for(var C=p.key,y=c;y!==null;){if(y.key===C){if(C=p.type,C===nt){if(y.tag===7){t(f,y.sibling),c=l(y,p.props.children),c.return=f,f=c;break e}}else if(y.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===mn&&Ks(C)===y.type){t(f,y.sibling),c=l(y,p.props),c.ref=Dt(f,y,p),c.return=f,f=c;break e}t(f,y);break}else n(f,y);y=y.sibling}p.type===nt?(c=Hn(p.props.children,f.mode,g,p.key),c.return=f,f=c):(g=Zr(p.type,p.key,p.props,null,f.mode,g),g.ref=Dt(f,c,p),g.return=f,f=g)}return s(f);case et:e:{for(y=p.key;c!==null;){if(c.key===y)if(c.tag===4&&c.stateNode.containerInfo===p.containerInfo&&c.stateNode.implementation===p.implementation){t(f,c.sibling),c=l(c,p.children||[]),c.return=f,f=c;break e}else{t(f,c);break}else n(f,c);c=c.sibling}c=fi(p,f.mode,g),c.return=f,f=c}return s(f);case mn:return y=p._init,D(f,c,y(p._payload),g)}if(Ut(p))return j(f,c,p,g);if(Lt(p))return S(f,c,p,g);Ir(f,p)}return typeof p=="string"&&p!==""||typeof p=="number"?(p=""+p,c!==null&&c.tag===6?(t(f,c.sibling),c=l(c,p),c.return=f,f=c):(t(f,c),c=di(p,f.mode,g),c.return=f,f=c),s(f)):t(f,c)}return D}var St=Ma(!0),Ia=Ma(!1),dl=Tn(null),fl=null,at=null,Io=null;function Oo(){Io=at=fl=null}function Do(e){var n=dl.current;V(dl),e._currentValue=n}function Vi(e,n,t){for(;e!==null;){var r=e.alternate;if((e.childLanes&n)!==n?(e.childLanes|=n,r!==null&&(r.childLanes|=n)):r!==null&&(r.childLanes&n)!==n&&(r.childLanes|=n),e===t)break;e=e.return}}function vt(e,n){fl=e,Io=at=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&n&&(xe=!0),e.firstContext=null)}function Me(e){var n=e._currentValue;if(Io!==e)if(e={context:e,memoizedValue:n,next:null},at===null){if(fl===null)throw Error(w(308));at=e,fl.dependencies={lanes:0,firstContext:e}}else at=at.next=e;return n}var Fn=null;function Fo(e){Fn===null?Fn=[e]:Fn.push(e)}function Oa(e,n,t,r){var l=n.interleaved;return l===null?(t.next=t,Fo(n)):(t.next=l.next,l.next=t),n.interleaved=t,an(e,r)}function an(e,n){e.lanes|=n;var t=e.alternate;for(t!==null&&(t.lanes|=n),t=e,e=e.return;e!==null;)e.childLanes|=n,t=e.alternate,t!==null&&(t.childLanes|=n),t=e,e=e.return;return t.tag===3?t.stateNode:null}var vn=!1;function $o(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Da(e,n){e=e.updateQueue,n.updateQueue===e&&(n.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function on(e,n){return{eventTime:e,lane:n,tag:0,payload:null,callback:null,next:null}}function Nn(e,n,t){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,$&2){var l=r.pending;return l===null?n.next=n:(n.next=l.next,l.next=n),r.pending=n,an(e,t)}return l=r.interleaved,l===null?(n.next=n,Fo(r)):(n.next=l.next,l.next=n),r.interleaved=n,an(e,t)}function Wr(e,n,t){if(n=n.updateQueue,n!==null&&(n=n.shared,(t&4194240)!==0)){var r=n.lanes;r&=e.pendingLanes,t|=r,n.lanes=t,ko(e,t)}}function Ys(e,n){var t=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,t===r)){var l=null,i=null;if(t=t.firstBaseUpdate,t!==null){do{var s={eventTime:t.eventTime,lane:t.lane,tag:t.tag,payload:t.payload,callback:t.callback,next:null};i===null?l=i=s:i=i.next=s,t=t.next}while(t!==null);i===null?l=i=n:i=i.next=n}else l=i=n;t={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:i,shared:r.shared,effects:r.effects},e.updateQueue=t;return}e=t.lastBaseUpdate,e===null?t.firstBaseUpdate=n:e.next=n,t.lastBaseUpdate=n}function pl(e,n,t,r){var l=e.updateQueue;vn=!1;var i=l.firstBaseUpdate,s=l.lastBaseUpdate,u=l.shared.pending;if(u!==null){l.shared.pending=null;var a=u,d=a.next;a.next=null,s===null?i=d:s.next=d,s=a;var v=e.alternate;v!==null&&(v=v.updateQueue,u=v.lastBaseUpdate,u!==s&&(u===null?v.firstBaseUpdate=d:u.next=d,v.lastBaseUpdate=a))}if(i!==null){var m=l.baseState;s=0,v=d=a=null,u=i;do{var h=u.lane,x=u.eventTime;if((r&h)===h){v!==null&&(v=v.next={eventTime:x,lane:0,tag:u.tag,payload:u.payload,callback:u.callback,next:null});e:{var j=e,S=u;switch(h=n,x=t,S.tag){case 1:if(j=S.payload,typeof j=="function"){m=j.call(x,m,h);break e}m=j;break e;case 3:j.flags=j.flags&-65537|128;case 0:if(j=S.payload,h=typeof j=="function"?j.call(x,m,h):j,h==null)break e;m=X({},m,h);break e;case 2:vn=!0}}u.callback!==null&&u.lane!==0&&(e.flags|=64,h=l.effects,h===null?l.effects=[u]:h.push(u))}else x={eventTime:x,lane:h,tag:u.tag,payload:u.payload,callback:u.callback,next:null},v===null?(d=v=x,a=m):v=v.next=x,s|=h;if(u=u.next,u===null){if(u=l.shared.pending,u===null)break;h=u,u=h.next,h.next=null,l.lastBaseUpdate=h,l.shared.pending=null}}while(1);if(v===null&&(a=m),l.baseState=a,l.firstBaseUpdate=d,l.lastBaseUpdate=v,n=l.shared.interleaved,n!==null){l=n;do s|=l.lane,l=l.next;while(l!==n)}else i===null&&(l.shared.lanes=0);Wn|=s,e.lanes=s,e.memoizedState=m}}function Xs(e,n,t){if(e=n.effects,n.effects=null,e!==null)for(n=0;nt?t:4,e(!0);var r=oi.transition;oi.transition={};try{e(!1),n()}finally{U=t,oi.transition=r}}function ba(){return Ie().memoizedState}function Ff(e,n,t){var r=Pn(e);if(t={lane:r,action:t,hasEagerState:!1,eagerState:null,next:null},ec(e))nc(n,t);else if(t=Oa(e,n,t,r),t!==null){var l=me();He(t,e,r,l),tc(t,n,r)}}function $f(e,n,t){var r=Pn(e),l={lane:r,action:t,hasEagerState:!1,eagerState:null,next:null};if(ec(e))nc(n,l);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=n.lastRenderedReducer,i!==null))try{var s=n.lastRenderedState,u=i(s,t);if(l.hasEagerState=!0,l.eagerState=u,Ve(u,s)){var a=n.interleaved;a===null?(l.next=l,Fo(n)):(l.next=a.next,a.next=l),n.interleaved=l;return}}catch{}finally{}t=Oa(e,n,l,r),t!==null&&(l=me(),He(t,e,r,l),tc(t,n,r))}}function ec(e){var n=e.alternate;return e===Y||n!==null&&n===Y}function nc(e,n){Yt=ml=!0;var t=e.pending;t===null?n.next=n:(n.next=t.next,t.next=n),e.pending=n}function tc(e,n,t){if(t&4194240){var r=n.lanes;r&=e.pendingLanes,t|=r,n.lanes=t,ko(e,t)}}var vl={readContext:Me,useCallback:ce,useContext:ce,useEffect:ce,useImperativeHandle:ce,useInsertionEffect:ce,useLayoutEffect:ce,useMemo:ce,useReducer:ce,useRef:ce,useState:ce,useDebugValue:ce,useDeferredValue:ce,useTransition:ce,useMutableSource:ce,useSyncExternalStore:ce,useId:ce,unstable_isNewReconciler:!1},Af={readContext:Me,useCallback:function(e,n){return Ke().memoizedState=[e,n===void 0?null:n],e},useContext:Me,useEffect:Zs,useImperativeHandle:function(e,n,t){return t=t!=null?t.concat([e]):null,Kr(4194308,4,Ya.bind(null,n,e),t)},useLayoutEffect:function(e,n){return Kr(4194308,4,e,n)},useInsertionEffect:function(e,n){return Kr(4,2,e,n)},useMemo:function(e,n){var t=Ke();return n=n===void 0?null:n,e=e(),t.memoizedState=[e,n],e},useReducer:function(e,n,t){var r=Ke();return n=t!==void 0?t(n):n,r.memoizedState=r.baseState=n,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},r.queue=e,e=e.dispatch=Ff.bind(null,Y,e),[r.memoizedState,e]},useRef:function(e){var n=Ke();return e={current:e},n.memoizedState=e},useState:Gs,useDebugValue:qo,useDeferredValue:function(e){return Ke().memoizedState=e},useTransition:function(){var e=Gs(!1),n=e[0];return e=Df.bind(null,e[1]),Ke().memoizedState=e,[n,e]},useMutableSource:function(){},useSyncExternalStore:function(e,n,t){var r=Y,l=Ke();if(W){if(t===void 0)throw Error(w(407));t=t()}else{if(t=n(),le===null)throw Error(w(349));Qn&30||Ua(r,n,t)}l.memoizedState=t;var i={value:t,getSnapshot:n};return l.queue=i,Zs(Ba.bind(null,r,i,e),[e]),r.flags|=2048,hr(9,Ha.bind(null,r,i,t,n),void 0,null),t},useId:function(){var e=Ke(),n=le.identifierPrefix;if(W){var t=ln,r=rn;t=(r&~(1<<32-Ue(r)-1)).toString(32)+t,n=":"+n+"R"+t,t=fr++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=s.createElement(t,{is:r.is}):(e=s.createElement(t),t==="select"&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,t),e[Ye]=n,e[ar]=r,fc(e,n,!1,!1),n.stateNode=e;e:{switch(s=Ni(t,r),t){case"dialog":B("cancel",e),B("close",e),l=r;break;case"iframe":case"object":case"embed":B("load",e),l=r;break;case"video":case"audio":for(l=0;lNt&&(n.flags|=128,r=!0,Ft(i,!1),n.lanes=4194304)}else{if(!r)if(e=hl(s),e!==null){if(n.flags|=128,r=!0,t=e.updateQueue,t!==null&&(n.updateQueue=t,n.flags|=4),Ft(i,!0),i.tail===null&&i.tailMode==="hidden"&&!s.alternate&&!W)return de(n),null}else 2*J()-i.renderingStartTime>Nt&&t!==1073741824&&(n.flags|=128,r=!0,Ft(i,!1),n.lanes=4194304);i.isBackwards?(s.sibling=n.child,n.child=s):(t=i.last,t!==null?t.sibling=s:n.child=s,i.last=s)}return i.tail!==null?(n=i.tail,i.rendering=n,i.tail=n.sibling,i.renderingStartTime=J(),n.sibling=null,t=K.current,H(K,r?t&1|2:t&1),n):(de(n),null);case 22:case 23:return Jo(),r=n.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(n.flags|=8192),r&&n.mode&1?ke&1073741824&&(de(n),n.subtreeFlags&6&&(n.flags|=8192)):de(n),null;case 24:return null;case 25:return null}throw Error(w(156,n.tag))}function Kf(e,n){switch(To(n),n.tag){case 1:return je(n.type)&&sl(),e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 3:return kt(),V(we),V(pe),Ho(),e=n.flags,e&65536&&!(e&128)?(n.flags=e&-65537|128,n):null;case 5:return Uo(n),null;case 13:if(V(K),e=n.memoizedState,e!==null&&e.dehydrated!==null){if(n.alternate===null)throw Error(w(340));jt()}return e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 19:return V(K),null;case 4:return kt(),null;case 10:return Do(n.type._context),null;case 22:case 23:return Jo(),null;case 24:return null;default:return null}}var Dr=!1,fe=!1,Yf=typeof WeakSet=="function"?WeakSet:Set,P=null;function ct(e,n){var t=e.ref;if(t!==null)if(typeof t=="function")try{t(null)}catch(r){Z(e,n,r)}else t.current=null}function Ji(e,n,t){try{t()}catch(r){Z(e,n,r)}}var uu=!1;function Xf(e,n){if(Oi=rl,e=xa(),Ro(e)){if("selectionStart"in e)var t={start:e.selectionStart,end:e.selectionEnd};else e:{t=(t=e.ownerDocument)&&t.defaultView||window;var r=t.getSelection&&t.getSelection();if(r&&r.rangeCount!==0){t=r.anchorNode;var l=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{t.nodeType,i.nodeType}catch{t=null;break e}var s=0,u=-1,a=-1,d=0,v=0,m=e,h=null;n:for(;;){for(var x;m!==t||l!==0&&m.nodeType!==3||(u=s+l),m!==i||r!==0&&m.nodeType!==3||(a=s+r),m.nodeType===3&&(s+=m.nodeValue.length),(x=m.firstChild)!==null;)h=m,m=x;for(;;){if(m===e)break n;if(h===t&&++d===l&&(u=s),h===i&&++v===r&&(a=s),(x=m.nextSibling)!==null)break;m=h,h=m.parentNode}m=x}t=u===-1||a===-1?null:{start:u,end:a}}else t=null}t=t||{start:0,end:0}}else t=null;for(Di={focusedElem:e,selectionRange:t},rl=!1,P=n;P!==null;)if(n=P,e=n.child,(n.subtreeFlags&1028)!==0&&e!==null)e.return=n,P=e;else for(;P!==null;){n=P;try{var j=n.alternate;if(n.flags&1024)switch(n.tag){case 0:case 11:case 15:break;case 1:if(j!==null){var S=j.memoizedProps,D=j.memoizedState,f=n.stateNode,c=f.getSnapshotBeforeUpdate(n.elementType===n.type?S:De(n.type,S),D);f.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var p=n.stateNode.containerInfo;p.nodeType===1?p.textContent="":p.nodeType===9&&p.documentElement&&p.removeChild(p.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(w(163))}}catch(g){Z(n,n.return,g)}if(e=n.sibling,e!==null){e.return=n.return,P=e;break}P=n.return}return j=uu,uu=!1,j}function Xt(e,n,t){var r=n.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var i=l.destroy;l.destroy=void 0,i!==void 0&&Ji(n,t,i)}l=l.next}while(l!==r)}}function Tl(e,n){if(n=n.updateQueue,n=n!==null?n.lastEffect:null,n!==null){var t=n=n.next;do{if((t.tag&e)===e){var r=t.create;t.destroy=r()}t=t.next}while(t!==n)}}function bi(e){var n=e.ref;if(n!==null){var t=e.stateNode;switch(e.tag){case 5:e=t;break;default:e=t}typeof n=="function"?n(e):n.current=e}}function mc(e){var n=e.alternate;n!==null&&(e.alternate=null,mc(n)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(n=e.stateNode,n!==null&&(delete n[Ye],delete n[ar],delete n[Ai],delete n[Lf],delete n[Tf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function vc(e){return e.tag===5||e.tag===3||e.tag===4}function au(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||vc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function eo(e,n,t){var r=e.tag;if(r===5||r===6)e=e.stateNode,n?t.nodeType===8?t.parentNode.insertBefore(e,n):t.insertBefore(e,n):(t.nodeType===8?(n=t.parentNode,n.insertBefore(e,t)):(n=t,n.appendChild(e)),t=t._reactRootContainer,t!=null||n.onclick!==null||(n.onclick=ol));else if(r!==4&&(e=e.child,e!==null))for(eo(e,n,t),e=e.sibling;e!==null;)eo(e,n,t),e=e.sibling}function no(e,n,t){var r=e.tag;if(r===5||r===6)e=e.stateNode,n?t.insertBefore(e,n):t.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(no(e,n,t),e=e.sibling;e!==null;)no(e,n,t),e=e.sibling}var se=null,$e=!1;function hn(e,n,t){for(t=t.child;t!==null;)gc(e,n,t),t=t.sibling}function gc(e,n,t){if(Xe&&typeof Xe.onCommitFiberUnmount=="function")try{Xe.onCommitFiberUnmount(Cl,t)}catch{}switch(t.tag){case 5:fe||ct(t,n);case 6:var r=se,l=$e;se=null,hn(e,n,t),se=r,$e=l,se!==null&&($e?(e=se,t=t.stateNode,e.nodeType===8?e.parentNode.removeChild(t):e.removeChild(t)):se.removeChild(t.stateNode));break;case 18:se!==null&&($e?(e=se,t=t.stateNode,e.nodeType===8?ri(e.parentNode,t):e.nodeType===1&&ri(e,t),lr(e)):ri(se,t.stateNode));break;case 4:r=se,l=$e,se=t.stateNode.containerInfo,$e=!0,hn(e,n,t),se=r,$e=l;break;case 0:case 11:case 14:case 15:if(!fe&&(r=t.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var i=l,s=i.destroy;i=i.tag,s!==void 0&&(i&2||i&4)&&Ji(t,n,s),l=l.next}while(l!==r)}hn(e,n,t);break;case 1:if(!fe&&(ct(t,n),r=t.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=t.memoizedProps,r.state=t.memoizedState,r.componentWillUnmount()}catch(u){Z(t,n,u)}hn(e,n,t);break;case 21:hn(e,n,t);break;case 22:t.mode&1?(fe=(r=fe)||t.memoizedState!==null,hn(e,n,t),fe=r):hn(e,n,t);break;default:hn(e,n,t)}}function cu(e){var n=e.updateQueue;if(n!==null){e.updateQueue=null;var t=e.stateNode;t===null&&(t=e.stateNode=new Yf),n.forEach(function(r){var l=lp.bind(null,e,r);t.has(r)||(t.add(r),r.then(l,l))})}}function Oe(e,n){var t=n.deletions;if(t!==null)for(var r=0;rl&&(l=s),r&=~i}if(r=l,r=J()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Zf(r/1960))-r,10e?16:e,wn===null)var r=!1;else{if(e=wn,wn=null,xl=0,$&6)throw Error(w(331));var l=$;for($|=4,P=e.current;P!==null;){var i=P,s=i.child;if(P.flags&16){var u=i.deletions;if(u!==null){for(var a=0;aJ()-Go?Un(e,0):Xo|=t),Se(e,n)}function Nc(e,n){n===0&&(e.mode&1?(n=Pr,Pr<<=1,!(Pr&130023424)&&(Pr=4194304)):n=1);var t=me();e=an(e,n),e!==null&&(yr(e,n,t),Se(e,t))}function rp(e){var n=e.memoizedState,t=0;n!==null&&(t=n.retryLane),Nc(e,t)}function lp(e,n){var t=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(t=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(w(314))}r!==null&&r.delete(n),Nc(e,t)}var Ec;Ec=function(e,n,t){if(e!==null)if(e.memoizedProps!==n.pendingProps||we.current)xe=!0;else{if(!(e.lanes&t)&&!(n.flags&128))return xe=!1,Wf(e,n,t);xe=!!(e.flags&131072)}else xe=!1,W&&n.flags&1048576&&Ra(n,cl,n.index);switch(n.lanes=0,n.tag){case 2:var r=n.type;Yr(e,n),e=n.pendingProps;var l=wt(n,pe.current);vt(n,t),l=Vo(null,n,r,e,l,t);var i=Qo();return n.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(n.tag=1,n.memoizedState=null,n.updateQueue=null,je(r)?(i=!0,ul(n)):i=!1,n.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,$o(n),l.updater=Ll,n.stateNode=l,l._reactInternals=n,Wi(n,r,e,t),n=Yi(null,n,r,!0,i,t)):(n.tag=0,W&&i&&Lo(n),he(null,n,l,t),n=n.child),n;case 16:r=n.elementType;e:{switch(Yr(e,n),e=n.pendingProps,l=r._init,r=l(r._payload),n.type=r,l=n.tag=op(r),e=De(r,e),l){case 0:n=Ki(null,n,r,e,t);break e;case 1:n=iu(null,n,r,e,t);break e;case 11:n=ru(null,n,r,e,t);break e;case 14:n=lu(null,n,r,De(r.type,e),t);break e}throw Error(w(306,r,""))}return n;case 0:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:De(r,l),Ki(e,n,r,l,t);case 1:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:De(r,l),iu(e,n,r,l,t);case 3:e:{if(ac(n),e===null)throw Error(w(387));r=n.pendingProps,i=n.memoizedState,l=i.element,Da(e,n),pl(n,r,null,t);var s=n.memoizedState;if(r=s.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},n.updateQueue.baseState=i,n.memoizedState=i,n.flags&256){l=Ct(Error(w(423)),n),n=ou(e,n,r,t,l);break e}else if(r!==l){l=Ct(Error(w(424)),n),n=ou(e,n,r,t,l);break e}else for(Ce=Cn(n.stateNode.containerInfo.firstChild),Ne=n,W=!0,Ae=null,t=Ia(n,null,r,t),n.child=t;t;)t.flags=t.flags&-3|4096,t=t.sibling;else{if(jt(),r===l){n=cn(e,n,t);break e}he(e,n,r,t)}n=n.child}return n;case 5:return Fa(n),e===null&&Bi(n),r=n.type,l=n.pendingProps,i=e!==null?e.memoizedProps:null,s=l.children,Fi(r,l)?s=null:i!==null&&Fi(r,i)&&(n.flags|=32),uc(e,n),he(e,n,s,t),n.child;case 6:return e===null&&Bi(n),null;case 13:return cc(e,n,t);case 4:return Ao(n,n.stateNode.containerInfo),r=n.pendingProps,e===null?n.child=St(n,null,r,t):he(e,n,r,t),n.child;case 11:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:De(r,l),ru(e,n,r,l,t);case 7:return he(e,n,n.pendingProps,t),n.child;case 8:return he(e,n,n.pendingProps.children,t),n.child;case 12:return he(e,n,n.pendingProps.children,t),n.child;case 10:e:{if(r=n.type._context,l=n.pendingProps,i=n.memoizedProps,s=l.value,H(dl,r._currentValue),r._currentValue=s,i!==null)if(Ve(i.value,s)){if(i.children===l.children&&!we.current){n=cn(e,n,t);break e}}else for(i=n.child,i!==null&&(i.return=n);i!==null;){var u=i.dependencies;if(u!==null){s=i.child;for(var a=u.firstContext;a!==null;){if(a.context===r){if(i.tag===1){a=on(-1,t&-t),a.tag=2;var d=i.updateQueue;if(d!==null){d=d.shared;var v=d.pending;v===null?a.next=a:(a.next=v.next,v.next=a),d.pending=a}}i.lanes|=t,a=i.alternate,a!==null&&(a.lanes|=t),Vi(i.return,t,n),u.lanes|=t;break}a=a.next}}else if(i.tag===10)s=i.type===n.type?null:i.child;else if(i.tag===18){if(s=i.return,s===null)throw Error(w(341));s.lanes|=t,u=s.alternate,u!==null&&(u.lanes|=t),Vi(s,t,n),s=i.sibling}else s=i.child;if(s!==null)s.return=i;else for(s=i;s!==null;){if(s===n){s=null;break}if(i=s.sibling,i!==null){i.return=s.return,s=i;break}s=s.return}i=s}he(e,n,l.children,t),n=n.child}return n;case 9:return l=n.type,r=n.pendingProps.children,vt(n,t),l=Me(l),r=r(l),n.flags|=1,he(e,n,r,t),n.child;case 14:return r=n.type,l=De(r,n.pendingProps),l=De(r.type,l),lu(e,n,r,l,t);case 15:return oc(e,n,n.type,n.pendingProps,t);case 17:return r=n.type,l=n.pendingProps,l=n.elementType===r?l:De(r,l),Yr(e,n),n.tag=1,je(r)?(e=!0,ul(n)):e=!1,vt(n,t),rc(n,r,l),Wi(n,r,l,t),Yi(null,n,r,!0,e,t);case 19:return dc(e,n,t);case 22:return sc(e,n,t)}throw Error(w(156,n.tag))};function Pc(e,n){return ea(e,n)}function ip(e,n,t,r){this.tag=e,this.key=t,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=n,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Le(e,n,t,r){return new ip(e,n,t,r)}function es(e){return e=e.prototype,!(!e||!e.isReactComponent)}function op(e){if(typeof e=="function")return es(e)?1:0;if(e!=null){if(e=e.$$typeof,e===xo)return 11;if(e===wo)return 14}return 2}function _n(e,n){var t=e.alternate;return t===null?(t=Le(e.tag,n,e.key,e.mode),t.elementType=e.elementType,t.type=e.type,t.stateNode=e.stateNode,t.alternate=e,e.alternate=t):(t.pendingProps=n,t.type=e.type,t.flags=0,t.subtreeFlags=0,t.deletions=null),t.flags=e.flags&14680064,t.childLanes=e.childLanes,t.lanes=e.lanes,t.child=e.child,t.memoizedProps=e.memoizedProps,t.memoizedState=e.memoizedState,t.updateQueue=e.updateQueue,n=e.dependencies,t.dependencies=n===null?null:{lanes:n.lanes,firstContext:n.firstContext},t.sibling=e.sibling,t.index=e.index,t.ref=e.ref,t}function Zr(e,n,t,r,l,i){var s=2;if(r=e,typeof e=="function")es(e)&&(s=1);else if(typeof e=="string")s=5;else e:switch(e){case nt:return Hn(t.children,l,i,n);case yo:s=8,l|=8;break;case mi:return e=Le(12,t,n,l|2),e.elementType=mi,e.lanes=i,e;case vi:return e=Le(13,t,n,l),e.elementType=vi,e.lanes=i,e;case gi:return e=Le(19,t,n,l),e.elementType=gi,e.lanes=i,e;case Fu:return Il(t,l,i,n);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Ou:s=10;break e;case Du:s=9;break e;case xo:s=11;break e;case wo:s=14;break e;case mn:s=16,r=null;break e}throw Error(w(130,e==null?e:typeof e,""))}return n=Le(s,t,n,l),n.elementType=e,n.type=r,n.lanes=i,n}function Hn(e,n,t,r){return e=Le(7,e,r,n),e.lanes=t,e}function Il(e,n,t,r){return e=Le(22,e,r,n),e.elementType=Fu,e.lanes=t,e.stateNode={isHidden:!1},e}function di(e,n,t){return e=Le(6,e,null,n),e.lanes=t,e}function fi(e,n,t){return n=Le(4,e.children!==null?e.children:[],e.key,n),n.lanes=t,n.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},n}function sp(e,n,t,r,l){this.tag=n,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=ql(0),this.expirationTimes=ql(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ql(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function ns(e,n,t,r,l,i,s,u,a){return e=new sp(e,n,t,u,a),n===1?(n=1,i===!0&&(n|=8)):n=0,i=Le(3,null,null,n),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:t,cache:null,transitions:null,pendingSuspenseBoundaries:null},$o(i),e}function up(e,n,t){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Lc)}catch(e){console.error(e)}}Lc(),Lu.exports=Pe;var pp=Lu.exports,Tc,yu=pp;Tc=yu.createRoot,yu.hydrateRoot;const Al="cps.web.deviceCredential";class Sl extends Error{constructor(n="此浏览器需要重新配对。请重新运行 codex-provider web。"){super(n),this.name="PairingRequiredError"}}class bn extends Error{constructor(n,t,r){super(t||"配置已变更,请重新确认。"),this.name="ProfileRevisionError",this.code=n,this.profile=r}}function hp(){return!!window.localStorage.getItem(Al)}async function mp(){const n=new URLSearchParams(window.location.hash.replace(/^#/,"")).get("pair");if(!n)return hp();const t=await fetch("/api/pair",{method:"POST",headers:{"X-Codex-Provider-Pairing":n}}),r=await t.json().catch(()=>({}));if(!t.ok||!r.deviceCredential)throw new Sl(r.error??"配对链接无效、已过期或已被使用。请重新运行 codex-provider web。");return window.localStorage.setItem(Al,r.deviceCredential),window.history.replaceState(null,"",`${window.location.pathname}${window.location.search}`),!0}function is(){return{"X-Codex-Provider-Device":window.localStorage.getItem(Al)??""}}function vp(e,n,t){return n===409&&["PROFILE_REVISION_REQUIRED","PROFILE_CHANGED","STORAGE_REVISION_REQUIRED","STORAGE_CHANGED"].includes(e.code)?new bn(e.code,e.error,e.profile):new Error(e.error??t)}async function os(e,n){const t=await e.json().catch(()=>({}));if(!e.ok)throw t.code==="PAIRING_REQUIRED"?(window.dispatchEvent(new CustomEvent("cps:pairing-required",{detail:t.error})),new Sl(t.error)):vp(t,e.status,n);return t}async function Fe(e,n={},{signal:t}={}){const r=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",...is()},body:JSON.stringify(n),signal:t});return os(r,`Request failed with HTTP ${r.status}.`)}async function gp(e=0){const n=await fetch(`/api/activity?after=${e}`,{headers:is()});return os(n,`Activity request failed with HTTP ${n.status}.`)}async function yp(){const e=await fetch("/api/profiles",{headers:is()});return os(e,`Profile request failed with HTTP ${e.status}.`)}async function xp(){try{await Fe("/api/access/forget")}finally{window.localStorage.removeItem(Al)}}async function wp(e={},n={}){return Fe("/api/history",e,n)}async function jp(e={},n={}){return Fe("/api/history/session",e,n)}function An(e,n){const[t,r]=E.useState(()=>{try{const l=window.localStorage.getItem(e);return l?JSON.parse(l):n}catch{return n}});return E.useEffect(()=>{window.localStorage.setItem(e,JSON.stringify(t))},[e,t]),[t,r]}function oo(){let e=0,n=null;return{begin(){return n==null||n.abort(),n=new AbortController,e+=1,{sequence:e,controller:n,signal:n.signal}},isLatest(t){return t===e},cancel(){n==null||n.abort(),e+=1}}}function Sp(e,n=300,t=globalThis){const r=t.setTimeout(e,n);return()=>t.clearTimeout(r)}function kp(e,n,t){return!(e!=null&&e.id)||!(e!=null&&e.revision)||(t==null?void 0:t.profileId)!==e.id||(t==null?void 0:t.profileRevision)!==e.revision||!(t!=null&&t.storageRevision)?null:{...n,profile:{...e},profileId:e.id,profileRevision:e.revision,storageRevision:t.storageRevision,status:{...t}}}function Cp(e){var t;const n=((t=e==null?void 0:e.result)==null?void 0:t.skippedLockedRolloutFiles)??(e==null?void 0:e.skippedLockedRolloutFiles)??[];return Array.isArray(n)?n.filter(Boolean):[]}function pi(e,{successTitle:n,partialTitle:t,message:r}){var u;const l=Cp(e);if(!(((u=e==null?void 0:e.result)==null?void 0:u.outcome)==="partial"||(e==null?void 0:e.outcome)==="partial"||l.length>0))return{tone:"success",title:n,message:r};const s=l.length?`已跳过 ${l.length} 个被占用的 rollout 文件:${l.join("、")}`:"部分项目未完成;请查看活动日志后重试。";return{tone:"warning",title:t,message:[r,s].filter(Boolean).join(";")}}function Np(e,n){const t=String(e??"").replaceAll("\\","/").replace(/\/{2,}/g,"/").replace(/\/$/,"");return n==="win32"?t.toLowerCase():t}function Ep(e=[],{platform:n=typeof process<"u"?process.platform:"browser"}={}){const t=new Set;return e.filter((r,l)=>{const i=(r==null?void 0:r.threadId)??(r==null?void 0:r.id),s=(r==null?void 0:r.rolloutPath)??(r==null?void 0:r.filePath)??(r==null?void 0:r.rolloutFile)??(r==null?void 0:r.path),u=i?`thread:${i}`:s?`rollout:${Np(s,n)}`:`item:${l}`;return t.has(u)?!1:(t.add(u),!0)})}function xu(e,{caseInsensitive:n=!1}={}){const t=String(e??"").replace(/[\\/]+$/,"").replaceAll("\\","/");return n?t.toLowerCase():t}function Mc(e,n,t){return!!(e&&n&&xu(e,t)===xu(n,t))}function Pp(e){const n=String(e??"").replace(/[\\/]+$/,""),t=Math.max(n.lastIndexOf("/"),n.lastIndexOf("\\"));return t<0?"":t===0?n.slice(0,1):t===2&&/^[A-Za-z]:/.test(n)?n.slice(0,3):n.slice(0,t)}function _p(e,n){var i;const t=(i=e==null?void 0:e.stateDbLocation)==null?void 0:i.path;if(t)return Pp(t);const r=n==null?void 0:n.metadata,l={caseInsensitive:(e==null?void 0:e.pathComparisonCaseInsensitive)===!0};return Number(r==null?void 0:r.version)>=2&&(e==null?void 0:e.sqliteHomeSource)==="default"&&Mc(r==null?void 0:r.sqliteHome,e==null?void 0:e.codexHome,l)?e.codexHome:(e==null?void 0:e.sqliteHome)??""}function zp({backup:e,profile:n,targetSqliteHome:t,restoreDatabase:r,restoreConfig:l,sqliteSupported:i,pathComparisonCaseInsensitive:s=!1}){var h,x;const u=(h=e==null?void 0:e.metadata)==null?void 0:h.sqliteHome,a=((x=n==null?void 0:n.sqliteHome)==null?void 0:x.trim())??"",d=!!(r&&u&&t&&!Mc(u,t,{caseInsensitive:s})),v=d&&!a,m=d&&l;return{requiresRelocation:d,missingExplicitTarget:v,configRestoreConflict:m,canSubmit:!!i&&!v&&!m}}function yt(e){return{profileId:e||"default"}}function Rp({fetchStatus:e,fetchBackups:n,gate:t=oo()}){const r=async({profileId:l,showLoading:i=!0,onLoading:s,onResult:u,onError:a})=>{const{controller:d,sequence:v}=t.begin();i&&(s==null||s(!0));try{const m=yt(l),[h,x]=await Promise.all([e(m,{signal:d.signal}),n(m,{signal:d.signal})]);return t.isLatest(v)?(u==null||u({profileId:l,status:h.status,backups:x}),!0):!1}catch(m){return(m==null?void 0:m.name)==="AbortError"||!t.isLatest(v)||a==null||a(m),!1}finally{t.isLatest(v)&&(s==null||s(!1))}};return r.cancel=()=>t.cancel(),r}function Qe({children:e,size:n=18,className:t=""}){return o.jsx("svg",{className:t,width:n,height:n,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:e})}const Kn=e=>o.jsxs(Qe,{...e,children:[o.jsx("path",{d:"M20 6v5h-5"}),o.jsx("path",{d:"M4 18v-5h5"}),o.jsx("path",{d:"M18.3 9A7 7 0 0 0 6.7 6.7L4 11"}),o.jsx("path",{d:"M5.7 15A7 7 0 0 0 17.3 17.3L20 13"})]}),ss=e=>o.jsxs(Qe,{...e,children:[o.jsx("ellipse",{cx:"12",cy:"5",rx:"8",ry:"3"}),o.jsx("path",{d:"M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5"}),o.jsx("path",{d:"M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6"})]}),Yn=e=>o.jsxs(Qe,{...e,children:[o.jsx("path",{d:"M3 12a9 9 0 1 0 3-6.7L3 8"}),o.jsx("path",{d:"M3 3v5h5"}),o.jsx("path",{d:"M12 7v5l3 2"})]}),Lp=e=>o.jsx(Qe,{...e,children:o.jsx("path",{d:"M3 12h4l2-7 4 14 2-7h6"})}),Tp=e=>o.jsxs(Qe,{...e,children:[o.jsx("rect",{x:"3",y:"3",width:"7",height:"7",rx:"1"}),o.jsx("rect",{x:"14",y:"3",width:"7",height:"7",rx:"1"}),o.jsx("rect",{x:"3",y:"14",width:"7",height:"7",rx:"1"}),o.jsx("rect",{x:"14",y:"14",width:"7",height:"7",rx:"1"})]}),so=e=>o.jsxs(Qe,{...e,children:[o.jsx("path",{d:"M12 3 4.5 6v5.3c0 4.6 3.2 8 7.5 9.7 4.3-1.7 7.5-5.1 7.5-9.7V6L12 3Z"}),o.jsx("path",{d:"m9 12 2 2 4-4"})]}),Mp=e=>o.jsx(Qe,{...e,children:o.jsx("path",{d:"m9 18 6-6-6-6"})}),Ic=e=>o.jsx(Qe,{...e,children:o.jsx("path",{d:"m6 6 12 12M18 6 6 18"})}),us=e=>o.jsx(Qe,{...e,children:o.jsx("path",{d:"m5 12 4 4L19 6"})}),Be=e=>o.jsxs(Qe,{...e,children:[o.jsx("path",{d:"M12 3 2.8 19h18.4L12 3Z"}),o.jsx("path",{d:"M12 9v4M12 17h.01"})]}),as=e=>o.jsx(Qe,{...e,children:o.jsx("path",{d:"M3 6.5h6l2 2h10v9.5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6.5Z"})}),Ip=[{id:"overview",label:"概览",icon:Tp},{id:"history",label:"聊天记录",icon:Yn},{id:"backups",label:"备份",icon:Yn},{id:"activity",label:"活动",icon:Lp}],Op={backupRoot:"",backups:[]};function Jt(e){return new Intl.NumberFormat("zh-CN").format(Number(e)||0)}function vr(e){const n=["B","KB","MB","GB","TB"];let t=Number(e)||0,r=0;for(;t>=1024&&r=10?1:2).replace(/\.0$/,"")} ${n[r]}`}function Et(e){return e?new Intl.DateTimeFormat("zh-CN",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).format(new Date(e)):"未知时间"}function Dp(e,n){return e.split(/(`[^`]+`|\*\*[^*]+\*\*|\*[^*]+\*)/g).map((r,l)=>r.startsWith("`")&&r.endsWith("`")?o.jsx("code",{children:r.slice(1,-1)},`${n}-code-${l}`):r.startsWith("**")&&r.endsWith("**")?o.jsx("strong",{children:r.slice(2,-2)},`${n}-strong-${l}`):r.startsWith("*")&&r.endsWith("*")?o.jsx("em",{children:r.slice(1,-1)},`${n}-em-${l}`):o.jsx(ho.Fragment,{children:r},`${n}-text-${l}`))}function Fp({text:e}){return String(e??"").split(/(```[^\n]*\n[\s\S]*?```)/g).map((t,r)=>{if(t.startsWith("```")&&t.endsWith("```")){const l=t.slice(3,-3).replace(/^\w*\n/,"");return o.jsx("pre",{children:o.jsx("code",{children:l})},`block-${r}`)}return t.split(` -`).map((l,i,s)=>o.jsxs(ho.Fragment,{children:[Dp(l,`${r}-${i}`),i{for(const d of u??[]){if(!d||d==="(missing)")continue;const v=n.get(d)??new Set;v.add(a),n.set(d,v)}};return t(e.configuredProviders,"config"),t(Object.keys(((r=e.rolloutCounts)==null?void 0:r.sessions)??{}),"rollout"),t(Object.keys(((l=e.rolloutCounts)==null?void 0:l.archived_sessions)??{}),"rollout"),t(Object.keys(((i=e.sqliteCounts)==null?void 0:i.sessions)??{}),"sqlite"),t(Object.keys(((s=e.sqliteCounts)==null?void 0:s.archived_sessions)??{}),"sqlite"),t([e.currentProvider],"config"),[...n.entries()].map(([u,a])=>{var d;return{id:u,sources:[...a],configured:(d=e.configuredProviders)==null?void 0:d.includes(u),current:u===e.currentProvider}}).sort((u,a)=>Number(a.current)-Number(u.current)||u.id.localeCompare(a.id))}function Oc({tone:e="neutral"}){return o.jsx("span",{className:`status-dot status-dot--${e}`,"aria-hidden":"true"})}function $p({status:e,busy:n,onRefresh:t}){var l,i;const r=((l=e==null?void 0:e.sqliteAccess)==null?void 0:l.supported)!==!1&&!((i=e==null?void 0:e.sqliteCounts)!=null&&i.unreadable);return o.jsxs("header",{className:"app-header",children:[o.jsxs("div",{className:"brand",children:[o.jsx("div",{className:"brand-mark",children:o.jsx(ss,{size:19})}),o.jsxs("div",{children:[o.jsx("div",{className:"brand-name",children:"Codex Provider Sync"}),o.jsx("div",{className:"brand-subtitle",children:"本机元数据一致性工具"})]})]}),o.jsxs("div",{className:"header-actions",children:[o.jsxs("div",{className:"service-state",children:[o.jsx(Oc,{tone:n?"warning":r?"success":"danger"}),o.jsx("span",{children:n?"操作执行中":r?"本地服务就绪":"需要检查"})]}),o.jsxs("button",{className:"button button--secondary button--compact",type:"button",onClick:t,disabled:n,children:[o.jsx(Kn,{size:16}),"刷新"]})]})]})}function Ap({view:e,setView:n,status:t,onForgetBrowser:r}){return o.jsxs("aside",{className:"sidebar",children:[o.jsx("nav",{className:"navigation","aria-label":"主导航",children:Ip.map(l=>{const i=l.icon;return o.jsxs("button",{className:`nav-item ${e===l.id?"nav-item--active":""}`,type:"button",onClick:()=>n(l.id),children:[o.jsx(i,{size:17}),o.jsx("span",{children:l.label})]},l.id)})}),o.jsxs("div",{className:"sidebar-foot",children:[o.jsx("div",{className:"sidebar-provider-label",children:"当前 Provider"}),o.jsxs("div",{className:"sidebar-provider-value",children:[o.jsx(Oc,{tone:"success"}),o.jsx("span",{children:(t==null?void 0:t.currentProvider)??"未读取"})]}),o.jsx("div",{className:"sidebar-version",children:"Web UI · localhost only"}),o.jsx("button",{className:"button button--quiet button--compact",type:"button",onClick:r,children:"忘记此浏览器"})]})]})}function Up({profiles:e,profileId:n,setProfileId:t,status:r,onAddProfile:l,onDeleteProfile:i,onRefresh:s,loading:u,profileSwitchDisabled:a}){return o.jsxs("section",{className:"storage-bar","aria-label":"存储位置",children:[o.jsxs("label",{className:"path-field path-field--wide",children:[o.jsx("span",{children:"存储配置"}),o.jsxs("div",{className:"path-input-wrap",children:[o.jsx(as,{size:16}),o.jsx("select",{value:n,onChange:d=>t(d.target.value),disabled:a,children:e.map(d=>o.jsx("option",{value:d.id,children:d.name},d.id))})]})]}),o.jsxs("label",{className:"path-field",children:[o.jsxs("span",{children:["当前路径 ",o.jsx("small",{children:"由服务端解析"})]}),o.jsxs("div",{className:"path-input-wrap",children:[o.jsx(ss,{size:16}),o.jsx("input",{value:(r==null?void 0:r.codexHome)??"",readOnly:!0,placeholder:"读取状态后显示"})]})]}),o.jsx("button",{className:"button button--secondary storage-refresh",type:"button",onClick:l,children:"新增配置"}),n!=="default"?o.jsx("button",{className:"button button--quiet storage-refresh",type:"button",onClick:i,children:"删除配置"}):null,o.jsxs("button",{className:"button button--secondary storage-refresh",type:"button",onClick:s,disabled:u,children:[o.jsx(Kn,{size:16,className:u?"spin":""}),"读取状态"]})]})}function Ar({title:e,counts:n,currentProvider:t}){const r=Object.entries(n??{}).sort((i,s)=>s[1]-i[1]),l=r.reduce((i,[,s])=>i+s,0);return o.jsxs("div",{className:"distribution-block",children:[o.jsxs("div",{className:"distribution-heading",children:[o.jsx("span",{children:e}),o.jsx("strong",{children:Jt(l)})]}),o.jsx("div",{className:"distribution-list",children:r.length===0?o.jsx("div",{className:"empty-inline",children:"无记录"}):r.map(([i,s])=>o.jsxs("div",{className:"distribution-row",children:[o.jsxs("div",{className:"distribution-meta",children:[o.jsx("span",{className:"provider-name",children:i}),o.jsx("span",{children:Jt(s)})]}),o.jsx("div",{className:"bar-track",children:o.jsx("span",{className:i===t?"bar-fill bar-fill--current":"bar-fill",style:{width:`${Math.max(5,l?s/l*100:0)}%`}})})]},i))})]})}function Hp({status:e,loading:n}){var i,s,u,a,d,v,m,h,x,j,S,D,f;const t=Object.values(((i=e==null?void 0:e.rolloutCounts)==null?void 0:i.sessions)??{}).reduce((c,p)=>c+p,0)+Object.values(((s=e==null?void 0:e.rolloutCounts)==null?void 0:s.archived_sessions)??{}).reduce((c,p)=>c+p,0),r=Object.values(((u=e==null?void 0:e.sqliteCounts)==null?void 0:u.sessions)??{}).reduce((c,p)=>c+p,0)+Object.values(((a=e==null?void 0:e.sqliteCounts)==null?void 0:a.archived_sessions)??{}).reduce((c,p)=>c+p,0),l=(d=e==null?void 0:e.alignment)==null?void 0:d.aligned;return o.jsxs("section",{className:"status-panel",children:[o.jsxs("div",{className:"section-title-row",children:[o.jsxs("div",{children:[o.jsx("h2",{children:"状态总览"}),o.jsx("p",{children:"比较 rollout 文件、SQLite 线程索引和当前 Provider。"})]}),o.jsxs("div",{className:`alignment-state ${l?"alignment-state--success":"alignment-state--warning"}`,children:[n?o.jsx(Kn,{size:16,className:"spin"}):l?o.jsx(us,{size:16}):o.jsx(Be,{size:16}),o.jsx("span",{children:n?"正在检查":l?"Provider 元数据已对齐":"发现不一致"})]})]}),o.jsxs("div",{className:"summary-strip",children:[o.jsxs("div",{className:"summary-item",children:[o.jsx("span",{children:"当前 Provider"}),o.jsx("strong",{children:(e==null?void 0:e.currentProvider)??"—"}),o.jsx("small",{children:e!=null&&e.currentProviderImplicit?"隐式默认":"config.toml 根级配置"})]}),o.jsxs("div",{className:"summary-item",children:[o.jsx("span",{children:"Rollout 文件"}),o.jsx("strong",{children:Jt(t)}),o.jsx("small",{children:"sessions + archived"})]}),o.jsxs("div",{className:"summary-item",children:[o.jsx("span",{children:"SQLite threads"}),o.jsx("strong",{children:(v=e==null?void 0:e.sqliteCounts)!=null&&v.unreadable?"不可读":Jt(r)}),o.jsx("small",{children:((m=e==null?void 0:e.stateDbLocation)==null?void 0:m.source)??"未定位数据库"})]}),o.jsxs("div",{className:"summary-item",children:[o.jsx("span",{children:"托管备份"}),o.jsx("strong",{children:Jt((h=e==null?void 0:e.backupSummary)==null?void 0:h.count)}),o.jsx("small",{children:vr((x=e==null?void 0:e.backupSummary)==null?void 0:x.totalBytes)})]})]}),o.jsxs("div",{className:"distribution-grid",children:[o.jsxs("div",{className:"distribution-column",children:[o.jsxs("div",{className:"column-label",children:[o.jsx(as,{size:16})," Rollout files"]}),o.jsx(Ar,{title:"sessions",counts:(j=e==null?void 0:e.rolloutCounts)==null?void 0:j.sessions,currentProvider:e==null?void 0:e.currentProvider}),o.jsx(Ar,{title:"archived_sessions",counts:(S=e==null?void 0:e.rolloutCounts)==null?void 0:S.archived_sessions,currentProvider:e==null?void 0:e.currentProvider})]}),o.jsx("div",{className:"distribution-divider"}),o.jsxs("div",{className:"distribution-column",children:[o.jsxs("div",{className:"column-label",children:[o.jsx(ss,{size:16})," SQLite state"]}),o.jsx(Ar,{title:"sessions",counts:(D=e==null?void 0:e.sqliteCounts)==null?void 0:D.sessions,currentProvider:e==null?void 0:e.currentProvider}),o.jsx(Ar,{title:"archived_sessions",counts:(f=e==null?void 0:e.sqliteCounts)==null?void 0:f.archived_sessions,currentProvider:e==null?void 0:e.currentProvider})]})]})]})}function Bp({status:e}){var r,l,i;const n=[];((r=e==null?void 0:e.sqliteAccess)==null?void 0:r.supported)===!1&&n.push({tone:"danger",title:"SQLite 路径不可安全访问",detail:e.sqliteAccess.message}),(l=e==null?void 0:e.sqliteCounts)!=null&&l.unreadable&&n.push({tone:"danger",title:"SQLite 当前不可读",detail:e.sqliteCounts.error}),(i=e==null?void 0:e.lockedRolloutFiles)!=null&&i.length&&n.push({tone:"warning",title:`${e.lockedRolloutFiles.length} 个 rollout 文件正在使用`,detail:"同步会跳过这些活跃文件;会话结束后可再次执行。"}),e!=null&&e.encryptedContentWarning&&n.push({tone:"warning",title:"检测到 encrypted_content",detail:e.encryptedContentWarning});const t=e==null?void 0:e.sqliteRepairStats;return(t!=null&&t.userEventRowsNeedingRepair||t!=null&&t.cwdRowsNeedingRepair)&&n.push({tone:"info",title:"SQLite 有待修复字段",detail:`user-event ${t.userEventRowsNeedingRepair??0},cwd ${t.cwdRowsNeedingRepair??0}`}),n.length===0?null:o.jsx("section",{className:"warning-stack","aria-label":"诊断信息",children:n.map((s,u)=>o.jsxs("div",{className:`warning-row warning-row--${s.tone}`,children:[o.jsx(Be,{size:17}),o.jsxs("div",{children:[o.jsx("strong",{children:s.title}),o.jsx("span",{children:s.detail})]})]},`${s.title}-${u}`))})}function Vp({projects:e=[]}){return o.jsxs("section",{className:"data-section",children:[o.jsx("div",{className:"section-title-row section-title-row--compact",children:o.jsxs("div",{children:[o.jsx("h2",{children:"项目可见性"}),o.jsx("p",{children:"检查 Desktop 项目路径、全局排序和首屏 50 条命中。"})]})}),o.jsx("div",{className:"table-scroll",children:o.jsxs("table",{className:"data-table",children:[o.jsx("thead",{children:o.jsxs("tr",{children:[o.jsx("th",{children:"项目根目录"}),o.jsx("th",{children:"交互会话"}),o.jsx("th",{children:"首屏"}),o.jsx("th",{children:"Ranks"}),o.jsx("th",{children:"CWD 精确匹配"}),o.jsx("th",{children:"Provider"})]})}),o.jsx("tbody",{children:e.length===0?o.jsx("tr",{children:o.jsx("td",{colSpan:"6",className:"table-empty",children:"没有可显示的项目诊断。"})}):e.map(n=>o.jsxs("tr",{children:[o.jsx("td",{className:"path-cell",children:n.root}),o.jsx("td",{children:n.interactiveThreads}),o.jsxs("td",{children:[n.firstPageThreads,"/50"]}),o.jsx("td",{children:n.rankPreview||"—"}),o.jsxs("td",{children:[n.exactCwdMatches,"/",n.interactiveThreads]}),o.jsx("td",{children:Object.entries(n.providerCounts??{}).map(([t,r])=>`${t} ${r}`).join(" · ")||"—"})]},n.root))})]})})]})}function Qp({value:e,onChange:n,disabled:t}){return o.jsxs("div",{className:"segmented",role:"radiogroup","aria-label":"执行模式",children:[o.jsxs("button",{type:"button",className:e==="sync"?"segmented-option segmented-option--active":"segmented-option",onClick:()=>n("sync"),disabled:t,children:[o.jsx("span",{children:"仅同步元数据"}),o.jsx("small",{children:"不修改 config.toml"})]}),o.jsxs("button",{type:"button",className:e==="switch"?"segmented-option segmented-option--active":"segmented-option",onClick:()=>n("switch"),disabled:t,children:[o.jsx("span",{children:"切换 Provider 并同步"}),o.jsx("small",{children:"更新根级配置"})]})]})}function Wp({status:e,providers:n,selectedProvider:t,setSelectedProvider:r,onAddManualProvider:l,onRemoveManualProvider:i,onRequestExecute:s,busy:u}){var N,_,I;const[a,d]=An("cps.web.mode","sync"),[v,m]=An("cps.web.modelMode","auto"),[h,x]=An("cps.web.customModel",""),[j,S]=An("cps.web.keepCount",5),[D,f]=E.useState(""),c=n.find(z=>z.id===t),p=c==null?void 0:c.configured,g=/^[A-Za-z0-9_.-]+$/.test(D.trim()),C=((N=e==null?void 0:e.sqliteAccess)==null?void 0:N.supported)===!1,y=u||!t||C||((_=e==null?void 0:e.sqliteCounts)==null?void 0:_.unreadable);return o.jsxs("section",{className:"execution-panel",children:[o.jsxs("div",{className:"execution-head",children:[o.jsxs("div",{children:[o.jsx("h2",{children:"执行同步"}),o.jsx("p",{children:"所有写操作都会先创建备份。执行前请关闭 Codex CLI、App 和 app-server。"})]}),o.jsx(so,{size:22})]}),o.jsx(Qp,{value:a,onChange:d,disabled:u}),o.jsxs("div",{className:"form-grid",children:[o.jsxs("label",{className:"form-field",children:[o.jsx("span",{children:"目标 Provider"}),o.jsx("select",{value:t,onChange:z=>r(z.target.value),disabled:u,children:n.map(z=>o.jsxs("option",{value:z.id,children:[z.id,z.current?"(当前)":""]},z.id))}),a==="switch"&&!p?o.jsx("small",{className:"field-error",children:"切换模式要求该 Provider 已定义在 config.toml。"}):null]}),o.jsxs("label",{className:"form-field form-field--short",children:[o.jsx("span",{children:"保留备份数"}),o.jsx("input",{type:"number",min:"1",max:"100000",value:j,onChange:z=>S(Number(z.target.value)),disabled:u}),o.jsx("small",{children:"同步后自动清理"})]})]}),o.jsxs("div",{className:"manual-provider-row",children:[o.jsx("input",{type:"text",value:D,onChange:z=>f(z.target.value),placeholder:"手动添加 Provider ID",spellCheck:"false",disabled:u}),o.jsx("button",{className:"button button--quiet button--compact",type:"button",disabled:u||!g,onClick:()=>{l(D.trim()),f("")},children:"添加"}),c!=null&&c.manual?o.jsx("button",{className:"manual-remove",type:"button",onClick:()=>i(t),disabled:u,children:"删除当前手动项"}):null]}),a==="switch"?o.jsxs("fieldset",{className:"model-options",disabled:u,children:[o.jsx("legend",{children:"根级 model"}),o.jsxs("label",{children:[o.jsx("input",{type:"radio",name:"model-mode",checked:v==="auto",onChange:()=>m("auto")}),o.jsxs("span",{children:[o.jsx("strong",{children:"跟随 Provider 配置"}),o.jsxs("small",{children:["采用 `[model_providers.",t,"]` 中的 model"]})]})]}),o.jsxs("label",{children:[o.jsx("input",{type:"radio",name:"model-mode",checked:v==="keep",onChange:()=>m("keep")}),o.jsxs("span",{children:[o.jsx("strong",{children:"保留当前根级 model"}),o.jsx("small",{children:"只切换 model_provider"})]})]}),o.jsxs("label",{className:"custom-model-option",children:[o.jsx("input",{type:"radio",name:"model-mode",checked:v==="custom",onChange:()=>m("custom")}),o.jsxs("span",{children:[o.jsx("strong",{children:"自定义 model"}),o.jsx("input",{type:"text",value:h,onFocus:()=>m("custom"),onChange:z=>x(z.target.value),placeholder:"例如 MiniMax-M3"})]})]})]}):null,C?o.jsxs("div",{className:"modal-callout modal-callout--danger",children:[o.jsx(Be,{size:18}),o.jsxs("div",{children:[o.jsx("strong",{children:"此 SQLite 布局仅供诊断"}),o.jsx("span",{children:((I=e==null?void 0:e.sqliteAccess)==null?void 0:I.message)||"当前 SQLite 路径不可由 Web UI 安全写入,因此已禁用执行同步。"})]})]}):null,o.jsxs("div",{className:"backup-assurance",children:[o.jsx(us,{size:16}),o.jsx("span",{children:"修改前创建 metadata v2 备份,并记录 SQLite Home"})]}),o.jsxs("button",{className:"button button--primary execute-button",type:"button",disabled:y||a==="switch"&&!p||a==="switch"&&v==="custom"&&!h.trim(),onClick:()=>s({mode:a,modelMode:v,model:h.trim(),keepCount:j}),children:[u?o.jsx(Kn,{size:17,className:"spin"}):o.jsx(so,{size:17}),u?"正在执行…":a==="switch"?"切换并同步":"执行同步"]})]})}function qp({backups:e,onViewAll:n,onRestore:t,restoreDisabled:r}){return o.jsxs("section",{className:"recent-backups",children:[o.jsxs("div",{className:"section-title-row section-title-row--compact",children:[o.jsxs("div",{children:[o.jsx("h2",{children:"最近备份"}),o.jsx("p",{children:e.backupRoot||"同步后将在 Codex Home 下创建备份"})]}),o.jsxs("button",{type:"button",className:"text-button",onClick:n,children:["查看全部 ",o.jsx(Mp,{size:14})]})]}),o.jsx("div",{className:"backup-rows",children:e.backups.length===0?o.jsx("div",{className:"empty-state",children:"尚无由本工具创建的备份。"}):e.backups.slice(0,3).map(l=>o.jsxs("div",{className:"backup-row",children:[o.jsx("div",{className:"backup-icon",children:o.jsx(Yn,{size:17})}),o.jsxs("div",{className:"backup-main",children:[o.jsx("strong",{children:Et(l.metadata.createdAt)}),o.jsxs("span",{children:[l.metadata.targetProvider," · ",l.metadata.changedSessionFiles??0," 个 rollout"]})]}),o.jsx("div",{className:"backup-size",children:vr(l.sizeBytes)}),o.jsx("button",{className:"button button--quiet button--compact",type:"button",disabled:r,title:r?"当前 SQLite 路径仅供诊断,不能恢复":void 0,onClick:()=>t(l),children:"恢复"})]},l.id))})]})}function Kp({status:e,backups:n,providers:t,selectedProvider:r,setSelectedProvider:l,onAddManualProvider:i,onRemoveManualProvider:s,onExecute:u,onRestore:a,setView:d,busy:v,loading:m}){var h;return o.jsxs("div",{className:"view-content",children:[o.jsx(Hp,{status:e,loading:m}),o.jsx(Bp,{status:e}),o.jsxs("div",{className:"overview-lower-grid",children:[o.jsxs("div",{className:"overview-main-column",children:[o.jsx(Vp,{projects:(e==null?void 0:e.projectThreadVisibility)??[]}),o.jsx(qp,{backups:n,onViewAll:()=>d("backups"),onRestore:a,restoreDisabled:((h=e==null?void 0:e.sqliteAccess)==null?void 0:h.supported)===!1})]}),o.jsx(Wp,{status:e,providers:t,selectedProvider:r,setSelectedProvider:l,onAddManualProvider:i,onRemoveManualProvider:s,onRequestExecute:u,busy:v})]})]})}function Yp({backups:e,status:n,busy:t,onRestore:r,onPrune:l}){var a;const[i,s]=An("cps.web.keepCount",5),u=((a=n==null?void 0:n.sqliteAccess)==null?void 0:a.supported)===!1;return o.jsxs("div",{className:"view-content",children:[o.jsxs("section",{className:"page-intro",children:[o.jsxs("div",{children:[o.jsx("h1",{children:"备份"}),o.jsx("p",{children:"管理当前 Codex Home 下由本工具创建的 metadata v2 备份。"})]}),o.jsxs("div",{className:"prune-control",children:[o.jsxs("label",{children:["保留最近 ",o.jsx("input",{type:"number",min:"0",max:"100000",value:i,onChange:d=>s(Number(d.target.value))})," 份"]}),o.jsx("button",{className:"button button--secondary",type:"button",disabled:t,onClick:()=>l(i),children:"清理旧备份"})]})]}),o.jsxs("section",{className:"backup-list-section",children:[o.jsxs("div",{className:"backup-root-line",children:[o.jsx(as,{size:16}),o.jsx("span",{children:e.backupRoot||(n==null?void 0:n.backupRoot)||"—"}),o.jsxs("strong",{children:[e.backups.length," 份 · ",vr(e.backups.reduce((d,v)=>d+v.sizeBytes,0))]})]}),o.jsx("div",{className:"full-backup-list",children:e.backups.length===0?o.jsxs("div",{className:"large-empty",children:[o.jsx(Yn,{size:26}),o.jsx("strong",{children:"还没有备份"}),o.jsx("span",{children:"执行一次同步或切换后,备份会显示在这里。"})]}):e.backups.map(d=>{var v;return o.jsxs("article",{className:"full-backup-row",children:[o.jsxs("div",{className:"backup-date",children:[o.jsx("strong",{children:Et(d.metadata.createdAt)}),o.jsx("span",{children:d.id})]}),o.jsxs("div",{className:"backup-facts",children:[o.jsxs("span",{children:["Provider ",o.jsx("strong",{children:d.metadata.targetProvider})]}),o.jsxs("span",{children:["Rollout ",o.jsx("strong",{children:d.metadata.changedSessionFiles??0})]}),o.jsxs("span",{children:["SQLite ",o.jsx("strong",{children:(v=d.metadata.sqliteDbFiles)!=null&&v.length?"已包含":"未包含"})]})]}),o.jsxs("div",{className:"backup-source",children:[o.jsx("span",{children:"SQLite Home"}),o.jsx("code",{children:d.metadata.sqliteHome??"旧版 metadata 未记录"})]}),o.jsxs("div",{className:"backup-row-actions",children:[o.jsx("span",{children:vr(d.sizeBytes)}),o.jsx("button",{className:"button button--secondary button--compact",type:"button",disabled:t||u,title:u?"当前 SQLite 路径仅供诊断,不能恢复":void 0,onClick:()=>r(d),children:"恢复"})]})]},d.id)})})]})]})}function Xp({activity:e,activeOperation:n}){return o.jsxs("div",{className:"view-content",children:[o.jsxs("section",{className:"page-intro",children:[o.jsxs("div",{children:[o.jsx("h1",{children:"活动日志"}),o.jsx("p",{children:"当前 Web UI 会话中的状态刷新、同步阶段和操作结果。"})]}),n?o.jsxs("div",{className:"live-operation",children:[o.jsx(Kn,{size:16,className:"spin"})," ",n.kind]}):null]}),o.jsxs("section",{className:"activity-console",children:[o.jsxs("div",{className:"console-head",children:[o.jsx("span",{children:"Activity log"}),o.jsxs("span",{children:[e.length," entries"]})]}),o.jsx("div",{className:"console-body",children:e.length===0?o.jsx("div",{className:"console-empty",children:"等待操作…"}):e.map(t=>o.jsxs("div",{className:`console-row console-row--${t.level}`,children:[o.jsx("time",{children:Et(t.timestamp)}),o.jsx("span",{className:"console-level",children:t.level}),o.jsx("span",{className:"console-message",children:t.message}),typeof t.detail=="string"?o.jsx("span",{className:"console-detail",children:t.detail}):null]},t.id))})]})]})}function Gp({profileId:e,status:n}){const[t,r]=E.useState(""),[l,i]=E.useState(""),[s,u]=E.useState(""),[a,d]=E.useState(""),[v,m]=E.useState("all"),[h,x]=E.useState(1),[j,S]=E.useState({sessions:[],total:0,pageSize:50,hasNextPage:!1}),[D,f]=E.useState(""),[c,p]=E.useState(null),[g,C]=E.useState(!1),[y,N]=E.useState(!1),[_,I]=E.useState(""),z=E.useRef(null),G=E.useRef(null);z.current||(z.current=oo()),G.current||(G.current=oo());const We=uo(n),Ze=[...new Set(((n==null?void 0:n.projectThreadVisibility)??[]).map(M=>M.root))];E.useEffect(()=>{z.current.cancel(),G.current.cancel(),r(""),i(""),u(""),d(""),m("all"),x(1),S({sessions:[],total:0,pageSize:50,hasNextPage:!1}),f(""),p(null),I("")},[e]),E.useEffect(()=>Sp(()=>i(t),300,window),[t]);const Je=E.useCallback(async()=>{var k;const{controller:M,sequence:ie}=z.current.begin();C(!0),I("");try{const R=await wp({...yt(e),page:h,pageSize:50,query:l,provider:s,project:a,archived:v},{signal:M.signal});if(!z.current.isLatest(ie))return;const T={...R.history,sessions:Ep((k=R.history)==null?void 0:k.sessions)};S(T),f(A=>{var q;return T.sessions.some(pn=>pn.id===A)?A:((q=T.sessions[0])==null?void 0:q.id)??""})}catch(R){R.name!=="AbortError"&&z.current.isLatest(ie)&&I(R.message)}finally{z.current.isLatest(ie)&&C(!1)}},[e,h,l,s,a,v]);E.useEffect(()=>(Je(),()=>z.current.cancel()),[Je]),E.useEffect(()=>{if(G.current.cancel(),!D){p(null),N(!1);return}const{controller:M,sequence:ie}=G.current.begin();return p(null),N(!0),I(""),jp({...yt(e),sessionId:D},{signal:M.signal}).then(k=>{G.current.isLatest(ie)&&p(k.history)}).catch(k=>{k.name!=="AbortError"&&G.current.isLatest(ie)&&I(k.message)}).finally(()=>{G.current.isLatest(ie)&&N(!1)}),()=>M.abort()},[e,D]);const fn=M=>ie=>{M(ie.target.value),x(1)};return o.jsxs("div",{className:"view-content history-view",children:[o.jsxs("section",{className:"page-intro",children:[o.jsxs("div",{children:[o.jsx("h1",{children:"聊天记录"}),o.jsx("p",{children:"从 rollout 文件读取历史会话,只读查看,不修改本地数据。"})]}),o.jsxs("button",{className:"button button--secondary",type:"button",onClick:Je,disabled:g,children:[o.jsx(Kn,{size:16,className:g?"spin":""}),"刷新"]})]}),o.jsxs("section",{className:"history-toolbar",children:[o.jsx("input",{value:t,onChange:fn(r),onKeyDown:M=>{M.key==="Enter"&&(i(t),x(1))},placeholder:"搜索标题、项目、Provider 或消息内容"}),o.jsxs("select",{value:s,onChange:fn(u),children:[o.jsx("option",{value:"",children:"全部 Provider"}),We.map(M=>o.jsx("option",{value:M.id,children:M.id},M.id))]}),o.jsxs("select",{value:a,onChange:fn(d),children:[o.jsx("option",{value:"",children:"全部项目"}),Ze.map(M=>o.jsx("option",{value:M,children:M},M))]}),o.jsxs("select",{value:v,onChange:fn(m),children:[o.jsx("option",{value:"all",children:"全部会话"}),o.jsx("option",{value:"active",children:"活跃会话"}),o.jsx("option",{value:"archived",children:"已归档"})]})]}),_?o.jsxs("div",{className:"history-error",children:[o.jsx(Be,{size:16}),_]}):null,o.jsxs("section",{className:"history-layout",children:[o.jsxs("div",{className:"history-list-panel",children:[o.jsxs("div",{className:"history-list-head",children:[o.jsxs("strong",{children:[j.total," 个会话"]}),o.jsxs("span",{children:["第 ",j.page," 页"]})]}),o.jsxs("div",{className:"history-list",children:[g&&!j.sessions.length?o.jsx("div",{className:"large-empty",children:"读取中…"}):null,!g&&!j.sessions.length?o.jsxs("div",{className:"large-empty",children:[o.jsx(Yn,{size:24}),o.jsx("strong",{children:"没有匹配的会话"})]}):null,j.sessions.map(M=>o.jsxs("button",{type:"button",className:`history-session-row ${M.id===D?"history-session-row--selected":""}`,onClick:()=>f(M.id),children:[o.jsxs("div",{className:"history-session-top",children:[o.jsx("strong",{children:M.title}),o.jsx("time",{children:Et(M.updatedAt)})]}),o.jsx("p",{children:M.firstUserMessage||"没有可读的用户消息"}),o.jsxs("div",{className:"history-session-meta",children:[o.jsx("span",{children:M.provider}),o.jsxs("span",{children:[M.messageCount," 条消息"]}),o.jsx("span",{children:M.archived?"已归档":"活跃"})]})]},M.id))]}),o.jsxs("div",{className:"history-pagination",children:[o.jsx("button",{className:"button button--quiet button--compact",type:"button",disabled:h<=1||g,onClick:()=>x(M=>M-1),children:"上一页"}),o.jsx("span",{children:h}),o.jsx("button",{className:"button button--quiet button--compact",type:"button",disabled:!j.hasNextPage||g,onClick:()=>x(M=>M+1),children:"下一页"})]})]}),o.jsx("div",{className:"history-detail-panel",children:y?o.jsxs("div",{className:"large-empty",children:[o.jsx(Kn,{size:24,className:"spin"}),o.jsx("strong",{children:"正在读取会话"})]}):c?o.jsxs(o.Fragment,{children:[o.jsxs("div",{className:"history-detail-head",children:[o.jsxs("div",{children:[o.jsx("h2",{children:c.session.title}),o.jsxs("p",{children:[c.session.cwd||"未知项目"," · ",c.session.provider," · ",c.session.messageCount," 条消息"]})]}),o.jsx("span",{children:c.session.archived?"已归档":"活跃"})]}),c.truncated?o.jsxs("div",{className:"history-truncated",children:[o.jsx(Be,{size:15}),"仅显示最近 ",c.returnedMessageCount," 条消息。"]}):null,o.jsx("div",{className:"message-stream",children:c.messages.map(M=>o.jsxs("article",{className:`chat-message chat-message--${M.role}`,children:[o.jsxs("div",{className:"chat-message-label",children:[M.role==="user"?"你":"Codex",o.jsx("time",{children:Et(M.timestamp)})]}),o.jsx("div",{className:"chat-message-body",children:o.jsx(Fp,{text:M.text})})]},`${M.sequence}-${M.timestamp}`))})]}):o.jsxs("div",{className:"large-empty",children:[o.jsx(Yn,{size:28}),o.jsx("strong",{children:"选择一个会话"}),o.jsx("span",{children:"聊天内容将在这里显示。"})]})})]})]})}function Ul({title:e,children:n,confirmLabel:t,onConfirm:r,onCancel:l,tone:i="primary",confirmDisabled:s=!1}){return o.jsx("div",{className:"modal-backdrop",role:"presentation",onMouseDown:u=>u.target===u.currentTarget&&l(),children:o.jsxs("section",{className:"modal",role:"dialog","aria-modal":"true","aria-labelledby":"modal-title",children:[o.jsxs("div",{className:"modal-head",children:[o.jsx("h2",{id:"modal-title",children:e}),o.jsx("button",{type:"button",className:"icon-button",onClick:l,"aria-label":"关闭",children:o.jsx(Ic,{size:18})})]}),o.jsx("div",{className:"modal-body",children:n}),o.jsxs("div",{className:"modal-actions",children:[o.jsx("button",{className:"button button--secondary",type:"button",onClick:l,children:"取消"}),o.jsx("button",{className:`button button--${i}`,type:"button",disabled:s,onClick:r,children:t})]})]})})}function Zp({plan:e,status:n,selectedProvider:t,onCancel:r,onConfirm:l}){return o.jsxs(Ul,{title:e.mode==="switch"?"确认切换并同步":"确认同步元数据",confirmLabel:e.mode==="switch"?"确认切换并同步":"确认执行同步",onCancel:r,onConfirm:l,children:[o.jsxs("div",{className:"modal-callout",children:[o.jsx(Be,{size:18}),o.jsxs("div",{children:[o.jsx("strong",{children:"请确认 Codex 已完全关闭"}),o.jsx("span",{children:"关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。"})]})]}),o.jsxs("dl",{className:"operation-scope",children:[o.jsxs("div",{children:[o.jsx("dt",{children:"Codex Home"}),o.jsx("dd",{children:n==null?void 0:n.codexHome})]}),o.jsxs("div",{children:[o.jsx("dt",{children:"SQLite Home"}),o.jsxs("dd",{children:[n==null?void 0:n.sqliteHome," ",o.jsxs("small",{children:["(",n==null?void 0:n.sqliteHomeSource,")"]})]})]}),o.jsxs("div",{children:[o.jsx("dt",{children:"当前 Provider"}),o.jsx("dd",{children:n==null?void 0:n.currentProvider})]}),o.jsxs("div",{children:[o.jsx("dt",{children:"目标 Provider"}),o.jsx("dd",{children:t})]}),o.jsxs("div",{children:[o.jsx("dt",{children:"配置变更"}),o.jsx("dd",{children:e.mode==="switch"?"更新 config.toml 根级 model_provider":"不修改 config.toml"})]}),o.jsxs("div",{children:[o.jsx("dt",{children:"Model 策略"}),o.jsx("dd",{children:e.mode!=="switch"?"跟随当前根级 model":e.modelMode==="auto"?"跟随目标 Provider 配置":e.modelMode==="keep"?"保留当前根级 model":`设置为 ${e.model}`})]}),o.jsxs("div",{children:[o.jsx("dt",{children:"备份策略"}),o.jsxs("dd",{children:["修改前创建备份,保留最近 ",e.keepCount," 份"]})]})]})]})}function Jp({backup:e,status:n,profile:t,onCancel:r,onConfirm:l}){var x,j;const[i,s]=E.useState(!1),[u,a]=E.useState(!0),[d,v]=E.useState(!0),m=_p(n,e),h=zp({backup:e,profile:t,targetSqliteHome:m,restoreDatabase:u,restoreConfig:i,sqliteSupported:((x=n==null?void 0:n.sqliteAccess)==null?void 0:x.supported)!==!1,pathComparisonCaseInsensitive:(n==null?void 0:n.pathComparisonCaseInsensitive)===!0});return o.jsxs(Ul,{title:"恢复备份",confirmLabel:"覆盖当前元数据",tone:"danger",onCancel:r,confirmDisabled:!i&&!u&&!d||!h.canSubmit,onConfirm:()=>l({restoreConfig:i,restoreDatabase:u,restoreSessions:d,allowSqliteHomeRelocation:h.requiresRelocation}),children:[o.jsxs("div",{className:"restore-summary",children:[o.jsx(Yn,{size:20}),o.jsxs("div",{children:[o.jsxs("strong",{children:[Et(e.metadata.createdAt)," · ",e.metadata.targetProvider]}),o.jsx("code",{children:e.path})]})]}),o.jsxs("fieldset",{className:"restore-options",children:[o.jsx("legend",{children:"选择要覆盖的内容"}),o.jsxs("label",{children:[o.jsx("input",{type:"checkbox",checked:i,onChange:S=>s(S.target.checked)}),o.jsxs("span",{children:[o.jsx("strong",{children:"config.toml 与 global state"}),o.jsx("small",{children:"恢复 Provider 配置和 Desktop workspace roots"})]})]}),o.jsxs("label",{children:[o.jsx("input",{type:"checkbox",checked:u,onChange:S=>a(S.target.checked)}),o.jsxs("span",{children:[o.jsx("strong",{children:"SQLite 线程数据库"}),o.jsx("small",{children:"恢复 state_5.sqlite 及备份中的 WAL/SHM"})]})]}),o.jsxs("label",{children:[o.jsx("input",{type:"checkbox",checked:d,onChange:S=>v(S.target.checked)}),o.jsxs("span",{children:[o.jsx("strong",{children:"Rollout 元数据"}),o.jsx("small",{children:"恢复 session_meta 和被修改的 turn_context.model"})]})]})]}),((j=n==null?void 0:n.sqliteAccess)==null?void 0:j.supported)===!1?o.jsxs("div",{className:"modal-callout modal-callout--danger",children:[o.jsx(Be,{size:18}),o.jsxs("div",{children:[o.jsx("strong",{children:"当前 SQLite 路径仅供诊断"}),o.jsx("span",{children:n.sqliteAccess.message||"不能从 Web UI 执行恢复。"})]})]}):null,h.requiresRelocation?o.jsxs("div",{className:`modal-callout ${h.missingExplicitTarget||h.configRestoreConflict?"modal-callout--danger":"modal-callout--warning"}`,children:[o.jsx(Be,{size:18}),o.jsxs("div",{children:[o.jsx("strong",{children:"SQLite Home 与备份来源不同"}),o.jsxs("span",{children:["来源:",e.metadata.sqliteHome,o.jsx("br",{}),"目标:",m,o.jsx("br",{}),h.missingExplicitTarget?"当前 Profile 未明确配置 SQLite Home,不能提交数据库迁移恢复。":h.configRestoreConflict?"迁移数据库时不能同时恢复旧 config.toml。":"确认后数据库将恢复到当前 Profile 明确配置的目标位置。"]})]})]}):null,o.jsxs("div",{className:"modal-callout",children:[o.jsx(Be,{size:18}),o.jsxs("div",{children:[o.jsx("strong",{children:"恢复前请关闭 Codex"}),o.jsx("span",{children:"该操作将覆盖所选的当前元数据;请确认 Codex CLI、App 和 app-server 已关闭。"})]})]})]})}function bp({keepCount:e,backups:n,onCancel:t,onConfirm:r}){const l=Math.max(0,n.backups.length-e);return o.jsxs(Ul,{title:"清理旧备份",confirmLabel:`删除 ${l} 份旧备份`,tone:"danger",onCancel:t,onConfirm:r,confirmDisabled:l===0,children:[o.jsxs("div",{className:"modal-callout modal-callout--warning",children:[o.jsx(Be,{size:18}),o.jsxs("div",{children:[o.jsx("strong",{children:"被删除的备份无法直接恢复"}),o.jsx("span",{children:"只处理当前 Codex Home 下由本工具管理的备份目录。"})]})]}),o.jsxs("dl",{className:"operation-scope",children:[o.jsxs("div",{children:[o.jsx("dt",{children:"当前备份"}),o.jsxs("dd",{children:[n.backups.length," 份"]})]}),o.jsxs("div",{children:[o.jsx("dt",{children:"保留"}),o.jsxs("dd",{children:["最近 ",e," 份"]})]}),o.jsxs("div",{children:[o.jsx("dt",{children:"将删除"}),o.jsxs("dd",{children:[l," 份"]})]})]})]})}function eh({onCancel:e,onConfirm:n}){const[t,r]=E.useState(""),[l,i]=E.useState(""),[s,u]=E.useState(""),[a,d]=E.useState(""),v=/^[A-Za-z0-9_.-]{1,80}$/.test(t)&&l.trim()&&s.trim();return o.jsx(Ul,{title:"新增存储配置",confirmLabel:"保存配置",onCancel:e,confirmDisabled:!v,onConfirm:()=>n({profileId:t,name:l,codexHome:s,sqliteHome:a}),children:o.jsxs("div",{className:"profile-form",children:[o.jsxs("label",{children:[o.jsx("span",{children:"配置 ID"}),o.jsx("input",{value:t,onChange:m=>r(m.target.value),placeholder:"work",spellCheck:"false"})]}),o.jsxs("label",{children:[o.jsx("span",{children:"显示名称"}),o.jsx("input",{value:l,onChange:m=>i(m.target.value),placeholder:"工作环境"})]}),o.jsxs("label",{children:[o.jsx("span",{children:"Codex Home"}),o.jsx("input",{value:s,onChange:m=>u(m.target.value),placeholder:"/home/user/.codex",spellCheck:"false"})]}),o.jsxs("label",{children:[o.jsx("span",{children:"SQLite Home(可选)"}),o.jsx("input",{value:a,onChange:m=>d(m.target.value),placeholder:"留空时由服务端按配置解析",spellCheck:"false"})]})]})})}function nh({toast:e,onClose:n}){return E.useEffect(()=>{if(!e)return;const t=window.setTimeout(n,6e3);return()=>window.clearTimeout(t)},[e,n]),e?o.jsxs("div",{className:`toast toast--${e.tone}`,children:[o.jsxs("div",{children:[e.tone==="success"?o.jsx(us,{size:18}):o.jsx(Be,{size:18}),o.jsxs("span",{children:[o.jsx("strong",{children:e.title}),e.message?o.jsx("small",{children:e.message}):null]})]}),o.jsx("button",{type:"button",onClick:n,"aria-label":"关闭通知",children:o.jsx(Ic,{size:16})})]}):null}function th(){const[e,n]=E.useState("overview"),[t,r]=E.useState("checking"),[l,i]=E.useState(""),[s,u]=An("cps.web.profileId","default"),[a,d]=E.useState([]),[v,m]=An("cps.web.manualProviders",[]),[h,x]=E.useState(null),[j,S]=E.useState(Op),[D,f]=E.useState(""),[c,p]=E.useState(!0),[g,C]=E.useState(!1),[y,N]=E.useState(null),[_,I]=E.useState(null),[z,G]=E.useState([]),[We,Ze]=E.useState(null),Je=E.useRef(0),fn=E.useMemo(()=>{const L=uo(h),O=new Set(L.map(Q=>Q.id));return[...L.map(Q=>({...Q,manual:v.includes(Q.id)})),...v.filter(Q=>!O.has(Q)).map(Q=>({id:Q,sources:["manual"],configured:!1,current:!1,manual:!0}))]},[h,v]),M=a.find(L=>L.id===s)??null,ie=E.useRef(null);ie.current||(ie.current=Rp({fetchStatus:(L,O)=>Fe("/api/status",L,O),fetchBackups:(L,O)=>Fe("/api/backups",L,O)}));const k=E.useCallback(async({quiet:L=!1}={})=>{await ie.current({profileId:s,showLoading:!L,onLoading:p,onResult:({status:O,backups:Q})=>{x(O),S(Q),f(b=>b&&uo(O).some(oe=>oe.id===b)?b:O.currentProvider)},onError:O=>{I({tone:"error",title:"状态读取失败",message:O.message})}})},[s]),R=E.useCallback(async()=>{const L=await yp();d(L.profiles),u(O=>L.profiles.some(Q=>Q.id===O)?O:"default")},[u]),T=E.useCallback(async()=>{N(null);try{await R(),await k({quiet:!0})}catch{}I({tone:"warning",title:"配置已变更,请重新确认",message:"已刷新存储配置和当前状态;未自动重试原操作。"})},[k,R]),A=E.useCallback(L=>{const O=kp(M,L,h);if(!O){I({tone:"warning",title:"配置需要刷新",message:"没有可用的配置版本,请刷新后重新确认操作。"}),R().catch(()=>{});return}N(O)},[R,M,h]);E.useEffect(()=>{let L=!1;return mp().then(async O=>{if(!O)throw new Sl;await R(),L||r("ready")}).catch(O=>{L||(r(O instanceof Sl?"required":"error"),i(O.message))}),()=>{L=!0}},[R]),E.useEffect(()=>{t==="ready"&&k()},[t,s]),E.useEffect(()=>{const L=O=>{r("required"),i(O.detail||"设备凭证已失效。请重新运行 codex-provider web。")};return window.addEventListener("cps:pairing-required",L),()=>window.removeEventListener("cps:pairing-required",L)},[]),E.useEffect(()=>{if(t!=="ready")return;let L=!1;const O=async()=>{var b;try{const oe=await gp(Je.current);if(L)return;(b=oe.activity)!=null&&b.length&&(Je.current=oe.activity[oe.activity.length-1].id,G(Ac=>[...Ac,...oe.activity].slice(-250))),Ze(oe.activeOperation??null)}catch{}};O();const Q=window.setInterval(O,900);return()=>{L=!0,window.clearInterval(Q)}},[t]);const q=E.useCallback(async()=>{var Q;const L=y.plan,O=y.profileId;N(null),C(!0),n("activity");try{const b={...yt(O),profileRevision:y.profileRevision,storageRevision:y.storageRevision,provider:y.selectedProvider,keepCount:L.keepCount},oe=L.mode==="switch"?await Fe("/api/switch",{...b,model:L.modelMode==="custom"?L.model:void 0,keepRootModel:L.modelMode==="keep"}):await Fe("/api/sync",b);I(pi(oe,{successTitle:L.mode==="switch"?"切换并同步完成":"同步完成",partialTitle:L.mode==="switch"?"切换并同步部分完成":"同步部分完成",message:`备份:${((Q=oe.result)==null?void 0:Q.backupDir)??"已创建"}`})),await k({quiet:!0})}catch(b){if(b instanceof bn){await T();return}I({tone:"error",title:"操作失败",message:b.message})}finally{C(!1)}},[T,y,k]),pn=E.useCallback(async L=>{const O=y.backup,Q=y.profileId;N(null),C(!0),n("activity");try{const b=await Fe("/api/restore",{...yt(Q),profileRevision:y.profileRevision,storageRevision:y.storageRevision,backupId:O.id,...L});I(pi(b,{successTitle:"备份恢复完成",partialTitle:"备份恢复部分完成",message:O.id})),await k({quiet:!0})}catch(b){if(b instanceof bn){await T();return}I({tone:"error",title:"恢复失败",message:b.message})}finally{C(!1)}},[T,y,k]),be=E.useCallback(async()=>{var Q,b;const L=y.keepCount,O=y.profileId;N(null),C(!0);try{const oe=await Fe("/api/prune",{...yt(O),profileRevision:y.profileRevision,storageRevision:y.storageRevision,keepCount:L});I(pi(oe,{successTitle:"旧备份清理完成",partialTitle:"旧备份清理部分完成",message:`删除 ${((Q=oe.result)==null?void 0:Q.deletedCount)??0} 份,释放 ${vr((b=oe.result)==null?void 0:b.freedBytes)}`})),await k({quiet:!0})}catch(oe){if(oe instanceof bn){await T();return}I({tone:"error",title:"备份清理失败",message:oe.message})}finally{C(!1)}},[T,y,k]),Rt=E.useCallback(()=>I(null),[]),en=E.useCallback(async L=>{try{const O=await Fe("/api/profiles/save",L.revision?{...L,profileRevision:L.revision}:L);N(null),await R(),u(O.profile.id),I({tone:"success",title:"存储配置已保存",message:O.profile.name})}catch(O){if(O instanceof bn){await T();return}I({tone:"error",title:"配置保存失败",message:O.message})}},[T,R,u]),Zn=E.useCallback(async()=>{try{await Fe("/api/profiles/delete",{profileId:s,profileRevision:M==null?void 0:M.revision}),u("default"),await R()}catch(L){if(L instanceof bn){await T();return}I({tone:"error",title:"配置删除失败",message:L.message})}},[T,s,R,M==null?void 0:M.revision,u]),Dc=E.useCallback(async()=>{await xp().catch(()=>{}),r("required"),i("此浏览器的设备凭证已失效。重新运行 codex-provider web 即可自动配对。")},[]),Fc=E.useCallback(L=>{m(O=>[...new Set([...O,L])].sort()),f(L)},[m]),$c=E.useCallback(L=>{m(O=>O.filter(Q=>Q!==L)),f((h==null?void 0:h.currentProvider)??"")},[m,h==null?void 0:h.currentProvider]);return t!=="ready"?o.jsxs("div",{className:"access-gate",children:[o.jsx(so,{size:32}),o.jsx("h1",{children:t==="checking"?"正在完成安全配对":"需要重新配对"}),o.jsx("p",{children:t==="checking"?"请稍候…":l||"请重新运行 codex-provider web。"}),t!=="checking"?o.jsx("code",{children:"codex-provider web"}):null]}):o.jsxs("div",{className:"app-shell",children:[o.jsx($p,{status:h,busy:g||!!We,onRefresh:()=>k()}),o.jsx(Ap,{view:e,setView:n,status:h,onForgetBrowser:Dc}),o.jsxs("main",{className:"main-area",children:[o.jsx(Up,{profiles:a,profileId:s,setProfileId:u,status:h,onAddProfile:()=>N({type:"profile"}),onDeleteProfile:Zn,onRefresh:()=>k(),loading:c,profileSwitchDisabled:g||!!y}),e==="overview"?o.jsx(Kp,{status:h,backups:j,providers:fn,selectedProvider:D,setSelectedProvider:f,onAddManualProvider:Fc,onRemoveManualProvider:$c,onExecute:L=>A({type:"execute",plan:L,selectedProvider:D}),onRestore:L=>A({type:"restore",backup:L}),setView:n,busy:g,loading:c}):null,e==="history"?o.jsx(Gp,{profileId:s,status:h}):null,e==="backups"?o.jsx(Yp,{backups:j,status:h,busy:g,onRestore:L=>A({type:"restore",backup:L}),onPrune:L=>A({type:"prune",keepCount:L})}):null,e==="activity"?o.jsx(Xp,{activity:z,activeOperation:We}):null]}),(y==null?void 0:y.type)==="execute"?o.jsx(Zp,{plan:y.plan,status:y.status,selectedProvider:y.selectedProvider,onCancel:()=>N(null),onConfirm:q}):null,(y==null?void 0:y.type)==="restore"?o.jsx(Jp,{backup:y.backup,status:y.status,profile:y.profile,onCancel:()=>N(null),onConfirm:pn}):null,(y==null?void 0:y.type)==="prune"?o.jsx(bp,{keepCount:y.keepCount,backups:j,onCancel:()=>N(null),onConfirm:be}):null,(y==null?void 0:y.type)==="profile"?o.jsx(eh,{onCancel:()=>N(null),onConfirm:en}):null,o.jsx(nh,{toast:_,onClose:Rt})]})}Tc(document.getElementById("root")).render(o.jsx(ho.StrictMode,{children:o.jsx(th,{})})); -//# sourceMappingURL=index-aed55189.js.map diff --git a/web/dist/assets/index-aed55189.js.map b/web/dist/assets/index-aed55189.js.map deleted file mode 100644 index df8638c..0000000 --- a/web/dist/assets/index-aed55189.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index-aed55189.js","sources":["../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/react/jsx-runtime.js","../../../node_modules/scheduler/cjs/scheduler.production.min.js","../../../node_modules/scheduler/index.js","../../../node_modules/react-dom/cjs/react-dom.production.min.js","../../../node_modules/react-dom/index.js","../../../node_modules/react-dom/client.js","../../src/api.js","../../src/hooks.js","../../src/history-requests.js","../../src/operation-state.js","../../src/profile-refresh.js","../../src/icons.jsx","../../src/App.jsx","../../src/main.jsx"],"sourcesContent":["/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1>>1,e=a[d];if(0>>1;dg(C,c))ng(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(ng(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Qa||125d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;cb}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"\")&&(k=k.replace(\"\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e\"+b.valueOf().toString()+\"\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a>=g;e-=g;rg=1<<32-oc(b)+e|c<w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;ww?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&Ng(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=Lg(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Tg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Rg(f.type,f.key,f.props,null,a.mode,h),h.ref=Lg(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=Sg(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);Mg(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=Qg(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Ug=Og(!0),Vg=Og(!1),Wg=Uf(null),Xg=null,Yg=null,Zg=null;function $g(){Zg=Yg=Xg=null}function ah(a){var b=Wg.current;E(Wg);a._currentValue=b}function bh(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}\nfunction ch(a,b){Xg=a;Zg=Yg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(dh=!0),a.firstContext=null)}function eh(a){var b=a._currentValue;if(Zg!==a)if(a={context:a,memoizedValue:b,next:null},null===Yg){if(null===Xg)throw Error(p(308));Yg=a;Xg.dependencies={lanes:0,firstContext:a}}else Yg=Yg.next=a;return b}var fh=null;function gh(a){null===fh?fh=[a]:fh.push(a)}\nfunction hh(a,b,c,d){var e=b.interleaved;null===e?(c.next=c,gh(b)):(c.next=e.next,e.next=c);b.interleaved=c;return ih(a,d)}function ih(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}var jh=!1;function kh(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}\nfunction lh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function mh(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}\nfunction nh(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(K&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return ih(a,c)}e=d.interleaved;null===e?(b.next=b,gh(d)):(b.next=e.next,e.next=b);d.interleaved=b;return ih(a,c)}function oh(a,b,c){b=b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nfunction ph(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction qh(a,b,c,d){var e=a.updateQueue;jh=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var m=a.alternate;null!==m&&(m=m.updateQueue,h=m.lastBaseUpdate,h!==g&&(null===h?m.firstBaseUpdate=l:h.next=l,m.lastBaseUpdate=k))}if(null!==f){var q=e.baseState;g=0;m=l=k=null;h=f;do{var r=h.lane,y=h.eventTime;if((d&r)===r){null!==m&&(m=m.next={eventTime:y,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,\nnext:null});a:{var n=a,t=h;r=b;y=c;switch(t.tag){case 1:n=t.payload;if(\"function\"===typeof n){q=n.call(y,q,r);break a}q=n;break a;case 3:n.flags=n.flags&-65537|128;case 0:n=t.payload;r=\"function\"===typeof n?n.call(y,q,r):n;if(null===r||void 0===r)break a;q=A({},q,r);break a;case 2:jh=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=[h]:r.push(h))}else y={eventTime:y,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===m?(l=m=y,k=q):m=m.next=y,g|=r;\nh=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===m&&(k=q);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=m;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);rh|=g;a.lanes=g;a.memoizedState=q}}\nfunction sh(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;bc?c:4;a(!0);var d=Gh.transition;Gh.transition={};try{a(!1),b()}finally{C=c,Gh.transition=d}}function wi(){return Uh().memoizedState}\nfunction xi(a,b,c){var d=yi(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,c);else if(c=hh(a,b,c,d),null!==c){var e=R();gi(c,a,d,e);Bi(c,b,d)}}\nfunction ii(a,b,c){var d=yi(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,gh(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=hh(a,b,e,d);null!==c&&(e=R(),gi(c,a,d,e),Bi(c,b,d))}}\nfunction zi(a){var b=a.alternate;return a===M||null!==b&&b===M}function Ai(a,b){Jh=Ih=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Bi(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar Rh={readContext:eh,useCallback:P,useContext:P,useEffect:P,useImperativeHandle:P,useInsertionEffect:P,useLayoutEffect:P,useMemo:P,useReducer:P,useRef:P,useState:P,useDebugValue:P,useDeferredValue:P,useTransition:P,useMutableSource:P,useSyncExternalStore:P,useId:P,unstable_isNewReconciler:!1},Oh={readContext:eh,useCallback:function(a,b){Th().memoizedState=[a,void 0===b?null:b];return a},useContext:eh,useEffect:mi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ki(4194308,\n4,pi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ki(4194308,4,a,b)},useInsertionEffect:function(a,b){return ki(4,2,a,b)},useMemo:function(a,b){var c=Th();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=xi.bind(null,M,a);return[d.memoizedState,a]},useRef:function(a){var b=\nTh();a={current:a};return b.memoizedState=a},useState:hi,useDebugValue:ri,useDeferredValue:function(a){return Th().memoizedState=a},useTransition:function(){var a=hi(!1),b=a[0];a=vi.bind(null,a[1]);Th().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=M,e=Th();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===Q)throw Error(p(349));0!==(Hh&30)||di(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;mi(ai.bind(null,d,\nf,a),[a]);d.flags|=2048;bi(9,ci.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=Th(),b=Q.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Kh++;0\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;zj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;eGj&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304)}else{if(!d)if(a=Ch(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Dj(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Gj&&1073741824!==c&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=L.current,G(L,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Hj(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(fj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Ij(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return zh(),E(Wf),E(H),Eh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Bh(b),null;case 13:E(L);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(L),null;case 4:return zh(),null;case 10:return ah(b.type._context),null;case 22:case 23:return Hj(),\nnull;case 24:return null;default:return null}}var Jj=!1,U=!1,Kj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Lj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Mj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Nj=!1;\nfunction Oj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Ci(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Nj;Nj=!1;return n}\nfunction Pj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Mj(b,c,f)}e=e.next}while(e!==d)}}function Qj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Rj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Sj(a){var b=a.alternate;null!==b&&(a.alternate=null,Sj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Tj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Uj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Tj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Vj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Vj(a,b,c),a=a.sibling;null!==a;)Vj(a,b,c),a=a.sibling}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}var X=null,Xj=!1;function Yj(a,b,c){for(c=c.child;null!==c;)Zj(a,b,c),c=c.sibling}\nfunction Zj(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Lj(c,b);case 6:var d=X,e=Xj;X=null;Yj(a,b,c);X=d;Xj=e;null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Xj;X=c.stateNode.containerInfo;Xj=!0;\nYj(a,b,c);X=d;Xj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Mj(c,b,g):0!==(f&4)&&Mj(c,b,g));e=e.next}while(e!==d)}Yj(a,b,c);break;case 1:if(!U&&(Lj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Yj(a,b,c);break;case 21:Yj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Yj(a,b,c),U=d):Yj(a,b,c);break;default:Yj(a,b,c)}}function ak(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Kj);b.forEach(function(b){var d=bk.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction ck(a,b){var c=b.deletions;if(null!==c)for(var d=0;de&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*lk(d/1960))-d;if(10a?16:a;if(null===wk)var d=!1;else{a=wk;wk=null;xk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;kB()-fk?Kk(a,0):rk|=c);Dk(a,b)}function Yk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=R();a=ih(a,b);null!==a&&(Ac(a,b,c),Dk(a,c))}function uj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Yk(a,c)}\nfunction bk(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Yk(a,c)}var Vk;\nVk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)dh=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return dh=!1,yj(a,b,c);dh=0!==(a.flags&131072)?!0:!1}else dh=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;ij(a,b);a=b.pendingProps;var e=Yf(b,H.current);ch(b,c);e=Nh(null,b,d,a,e,c);var f=Sh();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,kh(b),e.updater=Ei,b.stateNode=e,e._reactInternals=b,Ii(b,d,a,c),b=jj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Xi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{ij(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=Zk(d);a=Ci(d,a);switch(e){case 0:b=cj(null,b,d,a,c);break a;case 1:b=hj(null,b,d,a,c);break a;case 11:b=Yi(null,b,d,a,c);break a;case 14:b=$i(null,b,d,Ci(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),cj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),hj(a,b,d,e,c);case 3:a:{kj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;lh(a,b);qh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ji(Error(p(423)),b);b=lj(a,b,d,c,e);break a}else if(d!==e){e=Ji(Error(p(424)),b);b=lj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Vg(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=Zi(a,b,c);break a}Xi(a,b,d,c)}b=b.child}return b;case 5:return Ah(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\ngj(a,b),Xi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return oj(a,b,c);case 4:return yh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Ug(b,null,d,c):Xi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),Yi(a,b,d,e,c);case 7:return Xi(a,b,b.pendingProps,c),b.child;case 8:return Xi(a,b,b.pendingProps.children,c),b.child;case 12:return Xi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Wg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=Zi(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=mh(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);bh(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);bh(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Xi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,ch(b,c),e=eh(e),d=d(e),b.flags|=1,Xi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Ci(d,b.pendingProps),e=Ci(d.type,e),$i(a,b,d,e,c);case 15:return bj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),ij(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,ch(b,c),Gi(b,d,e),Ii(b,d,e,c),jj(null,b,d,!0,a,c);case 19:return xj(a,b,c);case 22:return dj(a,b,c)}throw Error(p(156,b.tag));};function Fk(a,b){return ac(a,b)}\nfunction $k(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new $k(a,b,c,d)}function aj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction Zk(a){if(\"function\"===typeof a)return aj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction Pg(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Rg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)aj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Tg(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return pj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Tg(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function pj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function Qg(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction Sg(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction al(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function bl(a,b,c,d,e,f,g,h,k){a=new al(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};kh(f);return a}function cl(a,b,c){var d=3 ({}));\r\n if (!response.ok || !payload.deviceCredential) {\r\n throw new PairingRequiredError(payload.error ?? \"配对链接无效、已过期或已被使用。请重新运行 codex-provider web。\");\r\n }\r\n window.localStorage.setItem(DEVICE_STORAGE_KEY, payload.deviceCredential);\r\n window.history.replaceState(null, \"\", `${window.location.pathname}${window.location.search}`);\r\n return true;\r\n}\r\n\r\nfunction deviceHeaders() {\r\n return { \"X-Codex-Provider-Device\": window.localStorage.getItem(DEVICE_STORAGE_KEY) ?? \"\" };\r\n}\r\n\r\nexport function toRequestError(payload, status, fallback) {\n if (status === 409 && [\n \"PROFILE_REVISION_REQUIRED\",\n \"PROFILE_CHANGED\",\n \"STORAGE_REVISION_REQUIRED\",\n \"STORAGE_CHANGED\"\n ].includes(payload.code)) {\n return new ProfileRevisionError(payload.code, payload.error, payload.profile);\n }\n return new Error(payload.error ?? fallback);\r\n}\r\n\r\nasync function parseResponse(response, fallback) {\r\n const payload = await response.json().catch(() => ({}));\r\n if (!response.ok) {\r\n if (payload.code === \"PAIRING_REQUIRED\") {\r\n window.dispatchEvent(new CustomEvent(\"cps:pairing-required\", { detail: payload.error }));\r\n throw new PairingRequiredError(payload.error);\r\n }\r\n throw toRequestError(payload, response.status, fallback);\r\n }\r\n return payload;\r\n}\r\n\r\nexport async function apiRequest(path, body = {}, { signal } = {}) {\r\n const response = await fetch(path, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n ...deviceHeaders()\r\n },\r\n body: JSON.stringify(body),\r\n signal\r\n });\r\n return parseResponse(response, `Request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function getActivity(after = 0) {\r\n const response = await fetch(`/api/activity?after=${after}`, {\r\n headers: deviceHeaders()\r\n });\r\n return parseResponse(response, `Activity request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function getProfiles() {\r\n const response = await fetch(\"/api/profiles\", { headers: deviceHeaders() });\r\n return parseResponse(response, `Profile request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function forgetThisBrowser() {\r\n try {\r\n await apiRequest(\"/api/access/forget\");\r\n } finally {\r\n window.localStorage.removeItem(DEVICE_STORAGE_KEY);\r\n }\r\n}\r\n\r\nexport async function getHistory(body = {}, options = {}) {\r\n return apiRequest(\"/api/history\", body, options);\r\n}\r\n\r\nexport async function getHistorySession(body = {}, options = {}) {\r\n return apiRequest(\"/api/history/session\", body, options);\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\nexport function usePersistentState(key, initialValue) {\r\n const [value, setValue] = useState(() => {\r\n try {\r\n const stored = window.localStorage.getItem(key);\r\n return stored ? JSON.parse(stored) : initialValue;\r\n } catch {\r\n return initialValue;\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n window.localStorage.setItem(key, JSON.stringify(value));\r\n }, [key, value]);\r\n\r\n return [value, setValue];\r\n}\r\n","export function createLatestRequestGate() {\r\n let sequence = 0;\r\n let controller = null;\r\n return {\r\n begin() {\r\n controller?.abort();\r\n controller = new AbortController();\r\n sequence += 1;\r\n return { sequence, controller, signal: controller.signal };\r\n },\r\n isLatest(candidate) {\r\n return candidate === sequence;\r\n },\r\n cancel() {\r\n controller?.abort();\r\n sequence += 1;\r\n }\r\n };\r\n}\r\n\r\nexport function scheduleDebounced(callback, delay = 300, timers = globalThis) {\r\n const id = timers.setTimeout(callback, delay);\r\n return () => timers.clearTimeout(id);\r\n}\r\n","export function captureProfileOperation(profile, operation, status) {\n if (!profile?.id\n || !profile?.revision\n || status?.profileId !== profile.id\n || status?.profileRevision !== profile.revision\n || !status?.storageRevision) return null;\n return {\n ...operation,\n profile: { ...profile },\n profileId: profile.id,\n profileRevision: profile.revision,\n storageRevision: status.storageRevision,\n status: { ...status }\n };\n}\n\r\nexport function skippedLockedRolloutFiles(payload) {\r\n const files = payload?.result?.skippedLockedRolloutFiles ?? payload?.skippedLockedRolloutFiles ?? [];\r\n return Array.isArray(files) ? files.filter(Boolean) : [];\r\n}\r\n\r\nexport function operationToast(payload, { successTitle, partialTitle, message }) {\r\n const skipped = skippedLockedRolloutFiles(payload);\r\n const partial = payload?.result?.outcome === \"partial\" || payload?.outcome === \"partial\" || skipped.length > 0;\r\n if (!partial) return { tone: \"success\", title: successTitle, message };\r\n const skippedDetail = skipped.length\r\n ? `已跳过 ${skipped.length} 个被占用的 rollout 文件:${skipped.join(\"、\")}`\r\n : \"部分项目未完成;请查看活动日志后重试。\";\r\n return {\r\n tone: \"warning\",\r\n title: partialTitle,\r\n message: [message, skippedDetail].filter(Boolean).join(\";\")\r\n };\r\n}\r\n\r\nfunction normalizeHistoryPath(path, platform) {\r\n const normalized = String(path ?? \"\").replaceAll(\"\\\\\", \"/\").replace(/\\/{2,}/g, \"/\").replace(/\\/$/, \"\");\r\n return platform === \"win32\" ? normalized.toLowerCase() : normalized;\r\n}\r\n\r\nexport function dedupeHistorySessions(sessions = [], { platform = typeof process !== \"undefined\" ? process.platform : \"browser\" } = {}) {\n const seen = new Set();\r\n return sessions.filter((session, index) => {\r\n const threadId = session?.threadId ?? session?.id;\r\n const rolloutPath = session?.rolloutPath ?? session?.filePath ?? session?.rolloutFile ?? session?.path;\r\n const key = threadId ? `thread:${threadId}` : rolloutPath ? `rollout:${normalizeHistoryPath(rolloutPath, platform)}` : `item:${index}`;\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\n}\n\nfunction normalizeStoragePath(value, { caseInsensitive = false } = {}) {\n const normalized = String(value ?? \"\").replace(/[\\\\/]+$/, \"\").replaceAll(\"\\\\\", \"/\");\n return caseInsensitive ? normalized.toLowerCase() : normalized;\n}\n\nfunction storagePathsEqual(left, right, options) {\n return Boolean(left && right && normalizeStoragePath(left, options) === normalizeStoragePath(right, options));\n}\n\nfunction storageParentPath(value) {\n const normalized = String(value ?? \"\").replace(/[\\\\/]+$/, \"\");\n const separatorIndex = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\n if (separatorIndex < 0) return \"\";\n if (separatorIndex === 0) return normalized.slice(0, 1);\n if (separatorIndex === 2 && /^[A-Za-z]:/.test(normalized)) return normalized.slice(0, 3);\n return normalized.slice(0, separatorIndex);\n}\n\nexport function resolveRestoreTargetSqliteHome(status, backup) {\n const currentDatabasePath = status?.stateDbLocation?.path;\n if (currentDatabasePath) return storageParentPath(currentDatabasePath);\n const backupMetadata = backup?.metadata;\n const comparison = { caseInsensitive: status?.pathComparisonCaseInsensitive === true };\n if (Number(backupMetadata?.version) >= 2\n && status?.sqliteHomeSource === \"default\"\n && storagePathsEqual(backupMetadata?.sqliteHome, status?.codexHome, comparison)) {\n return status.codexHome;\n }\n return status?.sqliteHome ?? \"\";\n}\n\nexport function restoreRelocationState({ backup, profile, targetSqliteHome, restoreDatabase, restoreConfig, sqliteSupported, pathComparisonCaseInsensitive = false }) {\n const sourceSqliteHome = backup?.metadata?.sqliteHome;\n const explicitSqliteHome = profile?.sqliteHome?.trim() ?? \"\";\n const requiresRelocation = Boolean(\n restoreDatabase\n && sourceSqliteHome\n && targetSqliteHome\n && !storagePathsEqual(sourceSqliteHome, targetSqliteHome, { caseInsensitive: pathComparisonCaseInsensitive })\n );\n const missingExplicitTarget = requiresRelocation && !explicitSqliteHome;\r\n const configRestoreConflict = requiresRelocation && restoreConfig;\r\n return {\r\n requiresRelocation,\r\n missingExplicitTarget,\r\n configRestoreConflict,\r\n canSubmit: Boolean(sqliteSupported) && !missingExplicitTarget && !configRestoreConflict\r\n };\r\n}\r\n","import { createLatestRequestGate } from \"./history-requests.js\";\r\n\r\nexport function storagePayload(profileId) {\r\n return { profileId: profileId || \"default\" };\r\n}\r\n\r\n// Loads status and backups for a storage profile while guaranteeing that only\r\n// the most recently started refresh may touch the UI. A stale request — for\r\n// example one started for profile A before the user switched to profile B —\r\n// is aborted and its results, errors, and loading transitions are discarded,\r\n// even when it finishes after the newer request.\r\nexport function createProfileRefresh({ fetchStatus, fetchBackups, gate = createLatestRequestGate() }) {\r\n const refresh = async ({ profileId, showLoading = true, onLoading, onResult, onError }) => {\r\n const { controller, sequence } = gate.begin();\r\n if (showLoading) onLoading?.(true);\r\n try {\r\n const storage = storagePayload(profileId);\r\n const [statusPayload, backupPayload] = await Promise.all([\r\n fetchStatus(storage, { signal: controller.signal }),\r\n fetchBackups(storage, { signal: controller.signal })\r\n ]);\r\n if (!gate.isLatest(sequence)) return false;\r\n onResult?.({ profileId, status: statusPayload.status, backups: backupPayload });\r\n return true;\r\n } catch (error) {\r\n if (error?.name === \"AbortError\" || !gate.isLatest(sequence)) return false;\r\n onError?.(error);\r\n return false;\r\n } finally {\r\n if (gate.isLatest(sequence)) onLoading?.(false);\r\n }\r\n };\r\n refresh.cancel = () => gate.cancel();\r\n return refresh;\r\n}\r\n","import React from \"react\";\r\n\r\nfunction Icon({ children, size = 18, className = \"\" }) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nexport const RefreshIcon = (props) => ;\r\nexport const DatabaseIcon = (props) => ;\r\nexport const HistoryIcon = (props) => ;\r\nexport const ActivityIcon = (props) => ;\r\nexport const OverviewIcon = (props) => ;\r\nexport const ShieldIcon = (props) => ;\r\nexport const ChevronIcon = (props) => ;\r\nexport const XIcon = (props) => ;\r\nexport const CheckIcon = (props) => ;\r\nexport const AlertIcon = (props) => ;\r\nexport const FolderIcon = (props) => ;\r\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nimport {\r\n PairingRequiredError,\r\n ProfileRevisionError,\r\n apiRequest,\r\n forgetThisBrowser,\r\n getActivity,\r\n getHistory,\r\n getHistorySession,\r\n getProfiles,\r\n initializeAccess\r\n} from \"./api.js\";\r\nimport { usePersistentState } from \"./hooks.js\";\r\nimport { createLatestRequestGate, scheduleDebounced } from \"./history-requests.js\";\r\nimport { captureProfileOperation, dedupeHistorySessions, operationToast, resolveRestoreTargetSqliteHome, restoreRelocationState } from \"./operation-state.js\";\nimport { createProfileRefresh, storagePayload } from \"./profile-refresh.js\";\r\nimport {\r\n ActivityIcon,\r\n AlertIcon,\r\n CheckIcon,\r\n ChevronIcon,\r\n DatabaseIcon,\r\n FolderIcon,\r\n HistoryIcon,\r\n OverviewIcon,\r\n RefreshIcon,\r\n ShieldIcon,\r\n XIcon\r\n} from \"./icons.jsx\";\r\n\r\nconst NAV_ITEMS = [\r\n { id: \"overview\", label: \"概览\", icon: OverviewIcon },\r\n { id: \"history\", label: \"聊天记录\", icon: HistoryIcon },\r\n { id: \"backups\", label: \"备份\", icon: HistoryIcon },\r\n { id: \"activity\", label: \"活动\", icon: ActivityIcon }\r\n];\r\n\r\nconst EMPTY_BACKUPS = { backupRoot: \"\", backups: [] };\r\n\r\nfunction formatNumber(value) {\r\n return new Intl.NumberFormat(\"zh-CN\").format(Number(value) || 0);\r\n}\r\n\r\nfunction formatBytes(bytes) {\r\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\r\n let value = Number(bytes) || 0;\r\n let index = 0;\r\n while (value >= 1024 && index < units.length - 1) {\r\n value /= 1024;\r\n index += 1;\r\n }\r\n return index === 0 ? `${value} B` : `${value.toFixed(value >= 10 ? 1 : 2).replace(/\\.0$/, \"\")} ${units[index]}`;\r\n}\r\n\r\nfunction formatDate(value) {\r\n if (!value) return \"未知时间\";\r\n return new Intl.DateTimeFormat(\"zh-CN\", {\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n hour12: false\r\n }).format(new Date(value));\r\n}\r\n\r\nfunction renderInlineMarkdown(text, keyPrefix) {\r\n const parts = text.split(/(`[^`]+`|\\*\\*[^*]+\\*\\*|\\*[^*]+\\*)/g);\r\n return parts.map((part, index) => {\r\n if (part.startsWith(\"`\") && part.endsWith(\"`\")) return {part.slice(1, -1)};\r\n if (part.startsWith(\"**\") && part.endsWith(\"**\")) return {part.slice(2, -2)};\r\n if (part.startsWith(\"*\") && part.endsWith(\"*\")) return {part.slice(1, -1)};\r\n return {part};\r\n });\r\n}\r\n\r\nfunction SafeMarkdown({ text }) {\r\n const blocks = String(text ?? \"\").split(/(```[^\\n]*\\n[\\s\\S]*?```)/g);\r\n return blocks.map((block, index) => {\r\n if (block.startsWith(\"```\") && block.endsWith(\"```\")) {\r\n const lines = block.slice(3, -3).replace(/^\\w*\\n/, \"\");\r\n return
{lines}
;\r\n }\r\n return block.split(\"\\n\").map((line, lineIndex, lines) => {renderInlineMarkdown(line, `${index}-${lineIndex}`)}{lineIndex < lines.length - 1 ?
: null}
);\r\n });\r\n}\r\n\r\nfunction providersFromStatus(status) {\n if (!status) return [];\r\n const sources = new Map();\r\n const add = (values, source) => {\r\n for (const value of values ?? []) {\r\n if (!value || value === \"(missing)\") continue;\r\n const bucket = sources.get(value) ?? new Set();\r\n bucket.add(source);\r\n sources.set(value, bucket);\r\n }\r\n };\r\n add(status.configuredProviders, \"config\");\r\n add(Object.keys(status.rolloutCounts?.sessions ?? {}), \"rollout\");\r\n add(Object.keys(status.rolloutCounts?.archived_sessions ?? {}), \"rollout\");\r\n add(Object.keys(status.sqliteCounts?.sessions ?? {}), \"sqlite\");\r\n add(Object.keys(status.sqliteCounts?.archived_sessions ?? {}), \"sqlite\");\r\n add([status.currentProvider], \"config\");\r\n return [...sources.entries()]\r\n .map(([id, providerSources]) => ({\r\n id,\r\n sources: [...providerSources],\r\n configured: status.configuredProviders?.includes(id),\r\n current: id === status.currentProvider\r\n }))\r\n .sort((left, right) => Number(right.current) - Number(left.current) || left.id.localeCompare(right.id));\r\n}\r\n\r\nfunction StatusDot({ tone = \"neutral\" }) {\r\n return ;\r\n}\r\n\r\nfunction AppHeader({ status, busy, onRefresh }) {\r\n const healthy = status?.sqliteAccess?.supported !== false && !status?.sqliteCounts?.unreadable;\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
Codex Provider Sync
\r\n
本机元数据一致性工具
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {busy ? \"操作执行中\" : healthy ? \"本地服务就绪\" : \"需要检查\"}\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Sidebar({ view, setView, status, onForgetBrowser }) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction StorageBar({ profiles, profileId, setProfileId, status, onAddProfile, onDeleteProfile, onRefresh, loading, profileSwitchDisabled }) {\r\n return (\r\n
\r\n \r\n \r\n \r\n {profileId !== \"default\" ? : null}\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction ProviderBars({ title, counts, currentProvider }) {\r\n const entries = Object.entries(counts ?? {}).sort((left, right) => right[1] - left[1]);\r\n const total = entries.reduce((sum, [, count]) => sum + count, 0);\r\n return (\r\n
\r\n
\r\n {title}\r\n {formatNumber(total)}\r\n
\r\n
\r\n {entries.length === 0 ?
无记录
: entries.map(([provider, count]) => (\r\n
\r\n
\r\n {provider}\r\n {formatNumber(count)}\r\n
\r\n
\r\n \r\n
\r\n
\r\n ))}\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction StatusPanel({ status, loading }) {\r\n const rolloutTotal = Object.values(status?.rolloutCounts?.sessions ?? {}).reduce((sum, value) => sum + value, 0)\r\n + Object.values(status?.rolloutCounts?.archived_sessions ?? {}).reduce((sum, value) => sum + value, 0);\r\n const sqliteTotal = Object.values(status?.sqliteCounts?.sessions ?? {}).reduce((sum, value) => sum + value, 0)\r\n + Object.values(status?.sqliteCounts?.archived_sessions ?? {}).reduce((sum, value) => sum + value, 0);\r\n const aligned = status?.alignment?.aligned;\r\n return (\r\n
\r\n
\r\n
\r\n

状态总览

\r\n

比较 rollout 文件、SQLite 线程索引和当前 Provider。

\r\n
\r\n
\r\n {loading ? : aligned ? : }\r\n {loading ? \"正在检查\" : aligned ? \"Provider 元数据已对齐\" : \"发现不一致\"}\n
\r\n
\r\n\r\n
\r\n
\r\n 当前 Provider\r\n {status?.currentProvider ?? \"—\"}\r\n {status?.currentProviderImplicit ? \"隐式默认\" : \"config.toml 根级配置\"}\r\n
\r\n
\r\n Rollout 文件\r\n {formatNumber(rolloutTotal)}\r\n sessions + archived\r\n
\r\n
\r\n SQLite threads\r\n {status?.sqliteCounts?.unreadable ? \"不可读\" : formatNumber(sqliteTotal)}\r\n {status?.stateDbLocation?.source ?? \"未定位数据库\"}\r\n
\r\n
\r\n 托管备份\r\n {formatNumber(status?.backupSummary?.count)}\r\n {formatBytes(status?.backupSummary?.totalBytes)}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Rollout files
\r\n \r\n \r\n
\r\n
\r\n
\r\n
SQLite state
\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Warnings({ status }) {\r\n const items = [];\r\n if (status?.sqliteAccess?.supported === false) {\r\n items.push({ tone: \"danger\", title: \"SQLite 路径不可安全访问\", detail: status.sqliteAccess.message });\r\n }\r\n if (status?.sqliteCounts?.unreadable) {\r\n items.push({ tone: \"danger\", title: \"SQLite 当前不可读\", detail: status.sqliteCounts.error });\r\n }\r\n if (status?.lockedRolloutFiles?.length) {\r\n items.push({ tone: \"warning\", title: `${status.lockedRolloutFiles.length} 个 rollout 文件正在使用`, detail: \"同步会跳过这些活跃文件;会话结束后可再次执行。\" });\r\n }\r\n if (status?.encryptedContentWarning) {\r\n items.push({ tone: \"warning\", title: \"检测到 encrypted_content\", detail: status.encryptedContentWarning });\r\n }\r\n const repairs = status?.sqliteRepairStats;\r\n if (repairs?.userEventRowsNeedingRepair || repairs?.cwdRowsNeedingRepair) {\r\n items.push({ tone: \"info\", title: \"SQLite 有待修复字段\", detail: `user-event ${repairs.userEventRowsNeedingRepair ?? 0},cwd ${repairs.cwdRowsNeedingRepair ?? 0}` });\r\n }\r\n if (items.length === 0) return null;\r\n return (\r\n
\r\n {items.map((item, index) => (\r\n
\r\n \r\n
{item.title}{item.detail}
\r\n
\r\n ))}\r\n
\r\n );\r\n}\r\n\r\nfunction ProjectVisibility({ projects = [] }) {\r\n return (\r\n
\r\n
\r\n

项目可见性

检查 Desktop 项目路径、全局排序和首屏 50 条命中。

\r\n
\r\n
\r\n \r\n \r\n \r\n {projects.length === 0 ? (\r\n \r\n ) : projects.map((project) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
项目根目录交互会话首屏RanksCWD 精确匹配Provider
没有可显示的项目诊断。
{project.root}{project.interactiveThreads}{project.firstPageThreads}/50{project.rankPreview || \"—\"}{project.exactCwdMatches}/{project.interactiveThreads}{Object.entries(project.providerCounts ?? {}).map(([provider, count]) => `${provider} ${count}`).join(\" · \") || \"—\"}
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction SegmentedControl({ value, onChange, disabled }) {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nfunction ExecutionPanel({ status, providers, selectedProvider, setSelectedProvider, onAddManualProvider, onRemoveManualProvider, onRequestExecute, busy }) {\r\n const [mode, setMode] = usePersistentState(\"cps.web.mode\", \"sync\");\r\n const [modelMode, setModelMode] = usePersistentState(\"cps.web.modelMode\", \"auto\");\r\n const [customModel, setCustomModel] = usePersistentState(\"cps.web.customModel\", \"\");\r\n const [keepCount, setKeepCount] = usePersistentState(\"cps.web.keepCount\", 5);\r\n const [manualProvider, setManualProvider] = useState(\"\");\r\n const selectedOption = providers.find((provider) => provider.id === selectedProvider);\r\n const switchAllowed = selectedOption?.configured;\r\n const validManualProvider = /^[A-Za-z0-9_.-]+$/.test(manualProvider.trim());\r\n const sqliteUnsupported = status?.sqliteAccess?.supported === false;\r\n const executeDisabled = busy || !selectedProvider || sqliteUnsupported || status?.sqliteCounts?.unreadable;\r\n\r\n return (\r\n
\r\n
\r\n

执行同步

所有写操作都会先创建备份。执行前请关闭 Codex CLI、App 和 app-server。

\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n setManualProvider(event.target.value)}\r\n placeholder=\"手动添加 Provider ID\"\r\n spellCheck=\"false\"\r\n disabled={busy}\r\n />\r\n {\r\n onAddManualProvider(manualProvider.trim());\r\n setManualProvider(\"\");\r\n }}\r\n >\r\n 添加\r\n \r\n {selectedOption?.manual ? : null}\r\n
\r\n\r\n {mode === \"switch\" ? (\r\n
\r\n 根级 model\r\n \r\n \r\n \r\n
\r\n ) : null}\r\n\r\n {sqliteUnsupported ?
此 SQLite 布局仅供诊断{status?.sqliteAccess?.message || \"当前 SQLite 路径不可由 Web UI 安全写入,因此已禁用执行同步。\"}
: null}\r\n\r\n
修改前创建 metadata v2 备份,并记录 SQLite Home
\r\n onRequestExecute({ mode, modelMode, model: customModel.trim(), keepCount })}\r\n >\r\n {busy ? : }\r\n {busy ? \"正在执行…\" : mode === \"switch\" ? \"切换并同步\" : \"执行同步\"}\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction RecentBackups({ backups, onViewAll, onRestore, restoreDisabled }) {\r\n return (\r\n
\r\n
\r\n

最近备份

{backups.backupRoot || \"同步后将在 Codex Home 下创建备份\"}

\r\n \r\n
\r\n
\r\n {backups.backups.length === 0 ?
尚无由本工具创建的备份。
: backups.backups.slice(0, 3).map((backup) => (\r\n
\r\n
\r\n
{formatDate(backup.metadata.createdAt)}{backup.metadata.targetProvider} · {backup.metadata.changedSessionFiles ?? 0} 个 rollout
\r\n
{formatBytes(backup.sizeBytes)}
\r\n \r\n
\r\n ))}\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Overview({ status, backups, providers, selectedProvider, setSelectedProvider, onAddManualProvider, onRemoveManualProvider, onExecute, onRestore, setView, busy, loading }) {\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n setView(\"backups\")} onRestore={onRestore} restoreDisabled={status?.sqliteAccess?.supported === false} />\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction BackupsView({ backups, status, busy, onRestore, onPrune }) {\r\n const [keepCount, setKeepCount] = usePersistentState(\"cps.web.keepCount\", 5);\r\n const restoreDisabled = status?.sqliteAccess?.supported === false;\r\n return (\r\n
\r\n
\r\n

备份

管理当前 Codex Home 下由本工具创建的 metadata v2 备份。

\r\n
\r\n
\r\n
\r\n
{backups.backupRoot || status?.backupRoot || \"—\"}{backups.backups.length} 份 · {formatBytes(backups.backups.reduce((sum, backup) => sum + backup.sizeBytes, 0))}
\r\n
\r\n {backups.backups.length === 0 ?
还没有备份执行一次同步或切换后,备份会显示在这里。
: backups.backups.map((backup) => (\r\n
\r\n
{formatDate(backup.metadata.createdAt)}{backup.id}
\r\n
Provider {backup.metadata.targetProvider}Rollout {backup.metadata.changedSessionFiles ?? 0}SQLite {backup.metadata.sqliteDbFiles?.length ? \"已包含\" : \"未包含\"}
\r\n
SQLite Home{backup.metadata.sqliteHome ?? \"旧版 metadata 未记录\"}
\r\n
{formatBytes(backup.sizeBytes)}
\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction ActivityView({ activity, activeOperation }) {\r\n return (\r\n
\r\n

活动日志

当前 Web UI 会话中的状态刷新、同步阶段和操作结果。

{activeOperation ?
{activeOperation.kind}
: null}
\r\n
\r\n
Activity log{activity.length} entries
\r\n
\r\n {activity.length === 0 ?
等待操作…
: activity.map((entry) => (\r\n
\r\n \r\n {entry.level}\r\n {entry.message}\r\n {typeof entry.detail === \"string\" ? {entry.detail} : null}\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction HistoryView({ profileId, status }) {\r\n const [query, setQuery] = useState(\"\");\r\n const [committedQuery, setCommittedQuery] = useState(\"\");\r\n const [provider, setProvider] = useState(\"\");\r\n const [project, setProject] = useState(\"\");\r\n const [archived, setArchived] = useState(\"all\");\r\n const [page, setPage] = useState(1);\r\n const [history, setHistory] = useState({ sessions: [], total: 0, pageSize: 50, hasNextPage: false });\r\n const [selectedId, setSelectedId] = useState(\"\");\r\n const [detail, setDetail] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [detailLoading, setDetailLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n const listRequest = useRef(null);\r\n const detailRequest = useRef(null);\r\n if (!listRequest.current) listRequest.current = createLatestRequestGate();\r\n if (!detailRequest.current) detailRequest.current = createLatestRequestGate();\r\n const providers = providersFromStatus(status);\r\n const projects = [...new Set((status?.projectThreadVisibility ?? []).map((item) => item.root))];\r\n\r\n useEffect(() => {\r\n listRequest.current.cancel();\r\n detailRequest.current.cancel();\r\n setQuery(\"\");\r\n setCommittedQuery(\"\");\r\n setProvider(\"\");\r\n setProject(\"\");\r\n setArchived(\"all\");\r\n setPage(1);\r\n setHistory({ sessions: [], total: 0, pageSize: 50, hasNextPage: false });\r\n setSelectedId(\"\");\r\n setDetail(null);\r\n setError(\"\");\r\n }, [profileId]);\r\n\r\n useEffect(() => {\r\n return scheduleDebounced(() => setCommittedQuery(query), 300, window);\r\n }, [query]);\r\n\r\n const loadList = useCallback(async () => {\r\n const { controller, sequence } = listRequest.current.begin();\r\n setLoading(true); setError(\"\");\r\n try {\r\n const payload = await getHistory({ ...storagePayload(profileId), page, pageSize: 50, query: committedQuery, provider, project, archived }, { signal: controller.signal });\r\n if (!listRequest.current.isLatest(sequence)) return;\r\n const nextHistory = { ...payload.history, sessions: dedupeHistorySessions(payload.history?.sessions) };\r\n setHistory(nextHistory);\r\n setSelectedId((current) => nextHistory.sessions.some((session) => session.id === current) ? current : nextHistory.sessions[0]?.id ?? \"\");\r\n } catch (requestError) {\r\n if (requestError.name !== \"AbortError\" && listRequest.current.isLatest(sequence)) setError(requestError.message);\r\n } finally {\r\n if (listRequest.current.isLatest(sequence)) setLoading(false);\r\n }\r\n }, [profileId, page, committedQuery, provider, project, archived]);\r\n\r\n useEffect(() => {\r\n loadList();\r\n return () => listRequest.current.cancel();\r\n }, [loadList]);\r\n useEffect(() => {\r\n detailRequest.current.cancel();\r\n if (!selectedId) { setDetail(null); setDetailLoading(false); return undefined; }\r\n const { controller, sequence } = detailRequest.current.begin();\r\n setDetail(null);\r\n setDetailLoading(true);\r\n setError(\"\");\r\n getHistorySession({ ...storagePayload(profileId), sessionId: selectedId }, { signal: controller.signal })\r\n .then((payload) => { if (detailRequest.current.isLatest(sequence)) setDetail(payload.history); })\r\n .catch((requestError) => { if (requestError.name !== \"AbortError\" && detailRequest.current.isLatest(sequence)) setError(requestError.message); })\r\n .finally(() => { if (detailRequest.current.isLatest(sequence)) setDetailLoading(false); });\r\n return () => controller.abort();\r\n }, [profileId, selectedId]);\r\n\r\n const updateFilter = (setter) => (event) => { setter(event.target.value); setPage(1); };\r\n return (\r\n
\r\n

聊天记录

从 rollout 文件读取历史会话,只读查看,不修改本地数据。

\r\n
\r\n { if (event.key === \"Enter\") { setCommittedQuery(query); setPage(1); } }} placeholder=\"搜索标题、项目、Provider 或消息内容\" />\r\n \r\n \r\n \r\n
\r\n {error ?
{error}
: null}\r\n
\r\n
\r\n
{history.total} 个会话第 {history.page} 页
\r\n
\r\n {loading && !history.sessions.length ?
读取中…
: null}\r\n {!loading && !history.sessions.length ?
没有匹配的会话
: null}\r\n {history.sessions.map((session) => )}\r\n
\r\n
{page}
\r\n
\r\n
\r\n {detailLoading ?
正在读取会话
: !detail ?
选择一个会话聊天内容将在这里显示。
: <>

{detail.session.title}

{detail.session.cwd || \"未知项目\"} · {detail.session.provider} · {detail.session.messageCount} 条消息

{detail.session.archived ? \"已归档\" : \"活跃\"}
{detail.truncated ?
仅显示最近 {detail.returnedMessageCount} 条消息。
: null}
{detail.messages.map((message) =>
{message.role === \"user\" ? \"你\" : \"Codex\"}
)}
}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Modal({ title, children, confirmLabel, onConfirm, onCancel, tone = \"primary\", confirmDisabled = false }) {\r\n return (\r\n
event.target === event.currentTarget && onCancel()}>\r\n
\r\n

{title}

\r\n
{children}
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction ExecuteModal({ plan, status, selectedProvider, onCancel, onConfirm }) {\r\n return (\r\n \r\n
请确认 Codex 已完全关闭关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。
\r\n
\r\n
Codex Home
{status?.codexHome}
\r\n
SQLite Home
{status?.sqliteHome} ({status?.sqliteHomeSource})
\r\n
当前 Provider
{status?.currentProvider}
\r\n
目标 Provider
{selectedProvider}
\r\n
配置变更
{plan.mode === \"switch\" ? \"更新 config.toml 根级 model_provider\" : \"不修改 config.toml\"}
\r\n
Model 策略
{plan.mode !== \"switch\" ? \"跟随当前根级 model\" : plan.modelMode === \"auto\" ? \"跟随目标 Provider 配置\" : plan.modelMode === \"keep\" ? \"保留当前根级 model\" : `设置为 ${plan.model}`}
\r\n
备份策略
修改前创建备份,保留最近 {plan.keepCount} 份
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction RestoreModal({ backup, status, profile, onCancel, onConfirm }) {\r\n const [restoreConfig, setRestoreConfig] = useState(false);\r\n const [restoreDatabase, setRestoreDatabase] = useState(true);\r\n const [restoreSessions, setRestoreSessions] = useState(true);\r\n const targetSqliteHome = resolveRestoreTargetSqliteHome(status, backup);\n const relocation = restoreRelocationState({\r\n backup,\r\n profile,\r\n targetSqliteHome,\n restoreDatabase,\n restoreConfig,\n sqliteSupported: status?.sqliteAccess?.supported !== false,\n pathComparisonCaseInsensitive: status?.pathComparisonCaseInsensitive === true\n });\n return (\r\n onConfirm({ restoreConfig, restoreDatabase, restoreSessions, allowSqliteHomeRelocation: relocation.requiresRelocation })}\r\n >\r\n
{formatDate(backup.metadata.createdAt)} · {backup.metadata.targetProvider}{backup.path}
\r\n
\r\n 选择要覆盖的内容\r\n \r\n \r\n \r\n
\r\n {status?.sqliteAccess?.supported === false ?
当前 SQLite 路径仅供诊断{status.sqliteAccess.message || \"不能从 Web UI 执行恢复。\"}
: null}\r\n {relocation.requiresRelocation ?
SQLite Home 与备份来源不同来源:{backup.metadata.sqliteHome}
目标:{targetSqliteHome}
{relocation.missingExplicitTarget ? \"当前 Profile 未明确配置 SQLite Home,不能提交数据库迁移恢复。\" : relocation.configRestoreConflict ? \"迁移数据库时不能同时恢复旧 config.toml。\" : \"确认后数据库将恢复到当前 Profile 明确配置的目标位置。\"}
: null}\r\n
恢复前请关闭 Codex该操作将覆盖所选的当前元数据;请确认 Codex CLI、App 和 app-server 已关闭。
\r\n \r\n );\r\n}\r\n\r\nfunction PruneModal({ keepCount, backups, onCancel, onConfirm }) {\r\n const deleteCount = Math.max(0, backups.backups.length - keepCount);\r\n return (\r\n \r\n
被删除的备份无法直接恢复只处理当前 Codex Home 下由本工具管理的备份目录。
\r\n
当前备份
{backups.backups.length} 份
保留
最近 {keepCount} 份
将删除
{deleteCount} 份
\r\n
\r\n );\r\n}\r\n\r\nfunction ProfileModal({ onCancel, onConfirm }) {\r\n const [profileId, setProfileId] = useState(\"\");\r\n const [name, setName] = useState(\"\");\r\n const [codexHome, setCodexHome] = useState(\"\");\r\n const [sqliteHome, setSqliteHome] = useState(\"\");\r\n const valid = /^[A-Za-z0-9_.-]{1,80}$/.test(profileId) && name.trim() && codexHome.trim();\r\n return (\r\n onConfirm({ profileId, name, codexHome, sqliteHome })}>\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Toast({ toast, onClose }) {\r\n useEffect(() => {\r\n if (!toast) return undefined;\r\n const timer = window.setTimeout(onClose, 6000);\r\n return () => window.clearTimeout(timer);\r\n }, [toast, onClose]);\r\n if (!toast) return null;\r\n return
{toast.tone === \"success\" ? : }{toast.title}{toast.message ? {toast.message} : null}
;\r\n}\r\n\r\nexport default function App() {\r\n const [view, setView] = useState(\"overview\");\r\n const [accessState, setAccessState] = useState(\"checking\");\r\n const [accessMessage, setAccessMessage] = useState(\"\");\r\n const [profileId, setProfileId] = usePersistentState(\"cps.web.profileId\", \"default\");\r\n const [profiles, setProfiles] = useState([]);\r\n const [manualProviders, setManualProviders] = usePersistentState(\"cps.web.manualProviders\", []);\r\n const [status, setStatus] = useState(null);\r\n const [backups, setBackups] = useState(EMPTY_BACKUPS);\r\n const [selectedProvider, setSelectedProvider] = useState(\"\");\r\n const [loading, setLoading] = useState(true);\r\n const [busy, setBusy] = useState(false);\r\n const [modal, setModal] = useState(null);\r\n const [toast, setToast] = useState(null);\r\n const [activity, setActivity] = useState([]);\r\n const [activeOperation, setActiveOperation] = useState(null);\r\n const lastActivityId = useRef(0);\r\n\r\n const providers = useMemo(() => {\r\n const detected = providersFromStatus(status);\r\n const detectedIds = new Set(detected.map((provider) => provider.id));\r\n return [\r\n ...detected.map((provider) => ({\r\n ...provider,\r\n manual: manualProviders.includes(provider.id)\r\n })),\r\n ...manualProviders\r\n .filter((provider) => !detectedIds.has(provider))\r\n .map((id) => ({ id, sources: [\"manual\"], configured: false, current: false, manual: true }))\r\n ];\r\n }, [status, manualProviders]);\r\n const selectedProfile = profiles.find((profile) => profile.id === profileId) ?? null;\r\n\r\n const profileRefreshRef = useRef(null);\r\n if (!profileRefreshRef.current) {\r\n profileRefreshRef.current = createProfileRefresh({\r\n fetchStatus: (storage, options) => apiRequest(\"/api/status\", storage, options),\r\n fetchBackups: (storage, options) => apiRequest(\"/api/backups\", storage, options)\r\n });\r\n }\r\n\r\n // Only the latest request for the current profile may update status,\r\n // backups, selectedProvider, loading, and error toasts. Switching profiles\r\n // starts a newer request, which aborts and invalidates the older one even\r\n // if the older one finishes last.\r\n const refresh = useCallback(async ({ quiet = false } = {}) => {\r\n await profileRefreshRef.current({\r\n profileId,\r\n showLoading: !quiet,\r\n onLoading: setLoading,\r\n onResult: ({ status: nextStatus, backups: nextBackups }) => {\r\n setStatus(nextStatus);\r\n setBackups(nextBackups);\r\n setSelectedProvider((current) => current && providersFromStatus(nextStatus).some((provider) => provider.id === current)\r\n ? current\r\n : nextStatus.currentProvider);\r\n },\r\n onError: (error) => {\r\n setToast({ tone: \"error\", title: \"状态读取失败\", message: error.message });\r\n }\r\n });\r\n }, [profileId]);\r\n\r\n const refreshProfiles = useCallback(async () => {\r\n const payload = await getProfiles();\r\n setProfiles(payload.profiles);\r\n setProfileId((current) => payload.profiles.some((profile) => profile.id === current) ? current : \"default\");\r\n }, [setProfileId]);\r\n\r\n const handleProfileConflict = useCallback(async () => {\r\n setModal(null);\r\n try {\r\n await refreshProfiles();\r\n await refresh({ quiet: true });\r\n } catch {\r\n // The user can still retry after the next explicit refresh.\r\n }\r\n setToast({ tone: \"warning\", title: \"配置已变更,请重新确认\", message: \"已刷新存储配置和当前状态;未自动重试原操作。\" });\r\n }, [refresh, refreshProfiles]);\r\n\r\n const openProfileOperation = useCallback((operation) => {\n const captured = captureProfileOperation(selectedProfile, operation, status);\n if (!captured) {\r\n setToast({ tone: \"warning\", title: \"配置需要刷新\", message: \"没有可用的配置版本,请刷新后重新确认操作。\" });\r\n refreshProfiles().catch(() => {});\r\n return;\r\n }\r\n setModal(captured);\r\n }, [refreshProfiles, selectedProfile, status]);\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n initializeAccess()\r\n .then(async (paired) => {\r\n if (!paired) throw new PairingRequiredError();\r\n await refreshProfiles();\r\n if (!cancelled) setAccessState(\"ready\");\r\n })\r\n .catch((error) => {\r\n if (cancelled) return;\r\n setAccessState(error instanceof PairingRequiredError ? \"required\" : \"error\");\r\n setAccessMessage(error.message);\r\n });\r\n return () => { cancelled = true; };\r\n }, [refreshProfiles]);\r\n\r\n useEffect(() => {\r\n if (accessState === \"ready\") refresh();\r\n }, [accessState, profileId]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n const requirePairing = (event) => {\r\n setAccessState(\"required\");\r\n setAccessMessage(event.detail || \"设备凭证已失效。请重新运行 codex-provider web。\");\r\n };\r\n window.addEventListener(\"cps:pairing-required\", requirePairing);\r\n return () => window.removeEventListener(\"cps:pairing-required\", requirePairing);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (accessState !== \"ready\") return undefined;\r\n let stopped = false;\r\n const poll = async () => {\r\n try {\r\n const payload = await getActivity(lastActivityId.current);\r\n if (stopped) return;\r\n if (payload.activity?.length) {\r\n lastActivityId.current = payload.activity[payload.activity.length - 1].id;\r\n setActivity((current) => [...current, ...payload.activity].slice(-250));\r\n }\r\n setActiveOperation(payload.activeOperation ?? null);\r\n } catch {\r\n // A transient poll failure should not interrupt a running operation.\r\n }\r\n };\r\n poll();\r\n const timer = window.setInterval(poll, 900);\r\n return () => { stopped = true; window.clearInterval(timer); };\r\n }, [accessState]);\r\n\r\n const execute = useCallback(async () => {\r\n const plan = modal.plan;\r\n const targetProfileId = modal.profileId;\r\n setModal(null);\r\n setBusy(true);\r\n setView(\"activity\");\r\n try {\r\n const common = { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, provider: modal.selectedProvider, keepCount: plan.keepCount };\n const payload = plan.mode === \"switch\"\r\n ? await apiRequest(\"/api/switch\", { ...common, model: plan.modelMode === \"custom\" ? plan.model : undefined, keepRootModel: plan.modelMode === \"keep\" })\r\n : await apiRequest(\"/api/sync\", common);\r\n setToast(operationToast(payload, {\r\n successTitle: plan.mode === \"switch\" ? \"切换并同步完成\" : \"同步完成\",\r\n partialTitle: plan.mode === \"switch\" ? \"切换并同步部分完成\" : \"同步部分完成\",\r\n message: `备份:${payload.result?.backupDir ?? \"已创建\"}`\r\n }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"操作失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const restore = useCallback(async (options) => {\r\n const backup = modal.backup;\r\n const targetProfileId = modal.profileId;\r\n setModal(null);\r\n setBusy(true);\r\n setView(\"activity\");\r\n try {\r\n const payload = await apiRequest(\"/api/restore\", { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, backupId: backup.id, ...options });\n setToast(operationToast(payload, { successTitle: \"备份恢复完成\", partialTitle: \"备份恢复部分完成\", message: backup.id }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"恢复失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const prune = useCallback(async () => {\r\n const keepCount = modal.keepCount;\r\n const targetProfileId = modal.profileId;\r\n setModal(null);\r\n setBusy(true);\r\n try {\r\n const payload = await apiRequest(\"/api/prune\", { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, keepCount });\n setToast(operationToast(payload, {\r\n successTitle: \"旧备份清理完成\",\r\n partialTitle: \"旧备份清理部分完成\",\r\n message: `删除 ${payload.result?.deletedCount ?? 0} 份,释放 ${formatBytes(payload.result?.freedBytes)}`\r\n }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"备份清理失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const closeToast = useCallback(() => setToast(null), []);\r\n const saveProfile = useCallback(async (profile) => {\r\n try {\r\n const payload = await apiRequest(\"/api/profiles/save\", profile.revision ? { ...profile, profileRevision: profile.revision } : profile);\r\n setModal(null);\r\n await refreshProfiles();\r\n setProfileId(payload.profile.id);\r\n setToast({ tone: \"success\", title: \"存储配置已保存\", message: payload.profile.name });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"配置保存失败\", message: error.message });\r\n }\r\n }, [handleProfileConflict, refreshProfiles, setProfileId]);\r\n const deleteProfile = useCallback(async () => {\r\n try {\r\n await apiRequest(\"/api/profiles/delete\", { profileId, profileRevision: selectedProfile?.revision });\r\n setProfileId(\"default\");\r\n await refreshProfiles();\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"配置删除失败\", message: error.message });\r\n }\r\n }, [handleProfileConflict, profileId, refreshProfiles, selectedProfile?.revision, setProfileId]);\r\n const forgetBrowser = useCallback(async () => {\r\n await forgetThisBrowser().catch(() => {});\r\n setAccessState(\"required\");\r\n setAccessMessage(\"此浏览器的设备凭证已失效。重新运行 codex-provider web 即可自动配对。\");\r\n }, []);\r\n const addManualProvider = useCallback((provider) => {\r\n setManualProviders((current) => [...new Set([...current, provider])].sort());\r\n setSelectedProvider(provider);\r\n }, [setManualProviders]);\r\n const removeManualProvider = useCallback((provider) => {\r\n setManualProviders((current) => current.filter((item) => item !== provider));\r\n setSelectedProvider(status?.currentProvider ?? \"\");\r\n }, [setManualProviders, status?.currentProvider]);\r\n\r\n if (accessState !== \"ready\") {\r\n return

{accessState === \"checking\" ? \"正在完成安全配对\" : \"需要重新配对\"}

{accessState === \"checking\" ? \"请稍候…\" : accessMessage || \"请重新运行 codex-provider web。\"}

{accessState !== \"checking\" ? codex-provider web : null}
;\r\n }\r\n\r\n return (\r\n
\r\n refresh()} />\r\n \r\n
\r\n setModal({ type: \"profile\" })} onDeleteProfile={deleteProfile} onRefresh={() => refresh()} loading={loading} profileSwitchDisabled={busy || Boolean(modal)} />\r\n {view === \"overview\" ? openProfileOperation({ type: \"execute\", plan, selectedProvider })} onRestore={(backup) => openProfileOperation({ type: \"restore\", backup })} setView={setView} busy={busy} loading={loading} /> : null}\r\n {view === \"history\" ? : null}\r\n {view === \"backups\" ? openProfileOperation({ type: \"restore\", backup })} onPrune={(keepCount) => openProfileOperation({ type: \"prune\", keepCount })} /> : null}\r\n {view === \"activity\" ? : null}\r\n
\r\n {modal?.type === \"execute\" ? setModal(null)} onConfirm={execute} /> : null}\n {modal?.type === \"restore\" ? setModal(null)} onConfirm={restore} /> : null}\n {modal?.type === \"prune\" ? setModal(null)} onConfirm={prune} /> : null}\r\n {modal?.type === \"profile\" ? setModal(null)} onConfirm={saveProfile} /> : null}\r\n \r\n
\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\n\r\nimport App from \"./App.jsx\";\r\nimport \"./styles.css\";\r\n\r\ncreateRoot(document.getElementById(\"root\")).render(\r\n \r\n \r\n \r\n);\r\n"],"names":["l","n","p","q","r","t","u","v","w","x","y","z","A","a","B","C","D","E","b","e","F","G","H","I","J","K","L","M","d","c","k","h","g","f","m","N","O","escape","P","Q","R","S","T","U","V","W","X","react_production_min","reactModule","require$$0","reactJsxRuntime_production_min","jsxRuntimeModule","exports","schedulerModule","aa","ca","require$$1","da","ea","fa","ha","ia","ja","ka","la","ma","oa","pa","qa","ra","sa","ta","ua","va","wa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","Ka","La","Ma","Na","Oa","Pa","Qa","Ra","Sa","Ta","Ua","Va","Wa","Xa","Ya","Za","ab","bb","cb","db","eb","fb","gb","hb","ib","jb","kb","lb","mb","nb","ob","pb","qb","rb","sb","tb","ub","vb","wb","xb","yb","zb","Ab","Bb","Cb","Db","Eb","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","Nb","Ob","Pb","Qb","Rb","Sb","Tb","Ub","Vb","Wb","Xb","Yb","Zb","$b","ac","bc","cc","dc","ec","fc","gc","hc","ic","jc","kc","lc","mc","oc","nc","pc","qc","rc","sc","tc","uc","vc","wc","xc","yc","zc","Ac","Bc","Cc","Dc","Ec","Fc","Gc","Hc","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Pc","Qc","Rc","Sc","Tc","Uc","Vc","Wc","Xc","Yc","Zc","$c","ad","bd","cd","dd","ed","fd","gd","hd","id","jd","kd","ld","md","nd","od","pd","qd","rd","sd","td","ud","vd","wd","xd","yd","Ad","zd","Bd","Cd","Dd","Ed","Fd","Gd","Hd","Id","Jd","Kd","Ld","Md","Nd","Od","Pd","Qd","Rd","Sd","Td","Ud","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","de","ee","fe","ge","he","ie","je","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","xe","ye","ze","Ae","Be","Ce","De","Ee","Fe","Ge","He","Ie","Je","Ke","Le","Me","Ne","Oe","Pe","Qe","Re","Se","Te","Ue","Ve","We","Xe","Ye","Ze","$e","af","bf","cf","df","ef","ff","gf","hf","jf","kf","lf","mf","nf","of","pf","qf","rf","sf","tf","uf","vf","wf","na","xa","$a","ba","xf","yf","zf","Af","Bf","Cf","Df","Ef","Ff","Gf","Hf","Jf","If","Kf","Lf","Mf","Nf","Of","Pf","Qf","Rf","Sf","Tf","Uf","Vf","Wf","Xf","Yf","Zf","$f","ag","bg","cg","dg","eg","fg","gg","hg","ig","jg","kg","lg","mg","ng","og","pg","qg","rg","sg","tg","ug","vg","wg","xg","yg","zg","Ag","Bg","Cg","Dg","Eg","Fg","Gg","Hg","Ig","Jg","Kg","Lg","Mg","Ng","Og","Pg","Qg","Rg","Sg","Tg","Ug","Vg","Wg","Xg","Yg","Zg","$g","ah","bh","ch","dh","eh","fh","gh","hh","ih","jh","kh","lh","mh","nh","oh","ph","qh","rh","sh","th","uh","vh","wh","xh","yh","zh","Ah","Bh","Ch","Dh","Eh","Fh","Gh","Hh","Ih","Jh","Kh","Lh","Mh","Nh","Oh","Ph","Qh","Rh","Sh","Th","Uh","Vh","Wh","Xh","Yh","Zh","$h","ai","bi","ci","di","ei","fi","gi","hi","ii","ji","ki","li","mi","ni","oi","pi","qi","ri","si","ti","ui","vi","wi","xi","yi","zi","Ai","Bi","Ci","Di","Ei","Fi","Gi","Hi","Ii","Ji","Ki","Li","Mi","Ni","Oi","Pi","Qi","Ri","Si","Ti","Ui","Vi","Wi","Xi","Yi","Zi","$i","aj","bj","cj","dj","ej","fj","gj","hj","ij","jj","kj","lj","mj","nj","oj","pj","qj","rj","sj","tj","uj","vj","wj","xj","yj","zj","Aj","Bj","Cj","Dj","Ej","Fj","Gj","Hj","Ij","Jj","Kj","Lj","Mj","Nj","Oj","Pj","Qj","Rj","Sj","Tj","Uj","Vj","Wj","Xj","Yj","Zj","ak","bk","ck","dk","ek","fk","gk","hk","ik","jk","kk","lk","mk","nk","ok","Y","Z","pk","qk","rk","sk","tk","uk","vk","wk","xk","yk","zk","Ak","Bk","Ck","Dk","Ek","Fk","Gk","Hk","Ik","Jk","Kk","Lk","Mk","Nk","Ok","Pk","Qk","Rk","Sk","Tk","Uk","Vk","Wk","Xk","Yk","Zk","$k","al","bl","cl","dl","el","fl","gl","hl","il","jl","kl","ll","ml","nl","ol","pl","ql","rl","sl","tl","ul","vl","reactDom_production_min","checkDCE","err","reactDomModule","createRoot","DEVICE_STORAGE_KEY","PairingRequiredError","message","ProfileRevisionError","code","profile","hasDeviceCredential","initializeAccess","pairingToken","response","payload","deviceHeaders","toRequestError","status","fallback","parseResponse","apiRequest","path","body","signal","getActivity","after","getProfiles","forgetThisBrowser","getHistory","options","getHistorySession","usePersistentState","key","initialValue","value","setValue","useState","stored","useEffect","createLatestRequestGate","sequence","controller","candidate","scheduleDebounced","callback","delay","timers","captureProfileOperation","operation","skippedLockedRolloutFiles","files","_a","operationToast","successTitle","partialTitle","skipped","skippedDetail","normalizeHistoryPath","platform","normalized","dedupeHistorySessions","sessions","seen","session","index","threadId","rolloutPath","normalizeStoragePath","caseInsensitive","storagePathsEqual","left","right","storageParentPath","separatorIndex","resolveRestoreTargetSqliteHome","backup","currentDatabasePath","backupMetadata","comparison","restoreRelocationState","targetSqliteHome","restoreDatabase","restoreConfig","sqliteSupported","pathComparisonCaseInsensitive","sourceSqliteHome","explicitSqliteHome","_b","requiresRelocation","missingExplicitTarget","configRestoreConflict","storagePayload","profileId","createProfileRefresh","fetchStatus","fetchBackups","gate","refresh","showLoading","onLoading","onResult","onError","storage","statusPayload","backupPayload","error","Icon","children","size","className","jsx","RefreshIcon","props","jsxs","DatabaseIcon","HistoryIcon","ActivityIcon","OverviewIcon","ShieldIcon","ChevronIcon","XIcon","CheckIcon","AlertIcon","FolderIcon","NAV_ITEMS","EMPTY_BACKUPS","formatNumber","formatBytes","bytes","units","formatDate","renderInlineMarkdown","text","keyPrefix","part","React","SafeMarkdown","block","lines","line","lineIndex","providersFromStatus","sources","add","values","source","bucket","_c","_d","providerSources","StatusDot","tone","AppHeader","busy","onRefresh","healthy","Sidebar","view","setView","onForgetBrowser","item","StorageBar","profiles","setProfileId","onAddProfile","onDeleteProfile","loading","profileSwitchDisabled","event","ProviderBars","title","counts","currentProvider","entries","total","sum","count","provider","StatusPanel","rolloutTotal","sqliteTotal","aligned","_e","_f","_g","_h","_i","_j","_k","_l","_m","Warnings","items","repairs","ProjectVisibility","projects","project","SegmentedControl","onChange","disabled","ExecutionPanel","providers","selectedProvider","setSelectedProvider","onAddManualProvider","onRemoveManualProvider","onRequestExecute","mode","setMode","modelMode","setModelMode","customModel","setCustomModel","keepCount","setKeepCount","manualProvider","setManualProvider","selectedOption","switchAllowed","validManualProvider","sqliteUnsupported","executeDisabled","RecentBackups","backups","onViewAll","onRestore","restoreDisabled","Overview","onExecute","BackupsView","onPrune","ActivityView","activity","activeOperation","entry","HistoryView","query","setQuery","committedQuery","setCommittedQuery","setProvider","setProject","archived","setArchived","page","setPage","history","setHistory","selectedId","setSelectedId","detail","setDetail","setLoading","detailLoading","setDetailLoading","setError","listRequest","useRef","detailRequest","loadList","useCallback","nextHistory","current","requestError","updateFilter","setter","Fragment","Modal","confirmLabel","onConfirm","onCancel","confirmDisabled","ExecuteModal","plan","RestoreModal","setRestoreConfig","setRestoreDatabase","restoreSessions","setRestoreSessions","relocation","PruneModal","deleteCount","ProfileModal","name","setName","codexHome","setCodexHome","sqliteHome","setSqliteHome","valid","Toast","toast","onClose","timer","App","accessState","setAccessState","accessMessage","setAccessMessage","setProfiles","manualProviders","setManualProviders","setStatus","setBackups","setBusy","modal","setModal","setToast","setActivity","setActiveOperation","lastActivityId","useMemo","detected","detectedIds","selectedProfile","profileRefreshRef","quiet","nextStatus","nextBackups","refreshProfiles","handleProfileConflict","openProfileOperation","captured","cancelled","paired","requirePairing","stopped","poll","execute","targetProfileId","common","restore","prune","closeToast","saveProfile","deleteProfile","forgetBrowser","addManualProvider","removeManualProvider"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8]} \ No newline at end of file diff --git a/web/dist/index.html b/web/dist/index.html index 300e3d4..a10cf3b 100644 --- a/web/dist/index.html +++ b/web/dist/index.html @@ -1,4 +1,4 @@ - + @@ -6,11 +6,10 @@ Codex Provider Sync - - + +
- diff --git a/web/index.html b/web/index.html index c4f650d..119eace 100644 --- a/web/index.html +++ b/web/index.html @@ -1,4 +1,4 @@ - + From f008d0ea277b57fd1d027068bfab9c4f80c5ae3a Mon Sep 17 00:00:00 2001 From: "DAL\\Administrator" <3452720699@qq.com> Date: Tue, 25 Aug 2026 15:08:53 +0800 Subject: [PATCH 02/50] refactor(core): checkpoint C1 public API and errors --- .../VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md | 4 +- .../C1_PUBLIC_API_ERRORS_2026-08-25.md | 50 +++ src/cli-presenter.js | 95 +++++ src/cli.js | 29 +- src/core-error.js | 202 ++++++++++ src/history.js | 41 +- src/locking.js | 355 +++++++++++++----- src/public-api.js | 31 ++ src/service.js | 191 ++++------ src/sqlite-state.js | 44 ++- src/storage-layout.js | 25 +- src/transaction-journal.js | 10 +- src/watch.js | 43 ++- src/web-server.js | 36 +- test/core-error.test.js | 130 +++++++ test/entrypoint-import-contract.test.js | 73 ++++ test/history.test.js | 15 + test/locking.test.js | 93 ++++- test/public-api-contract.test.js | 53 +++ test/sqlite-error-contract.test.js | 50 +++ test/sync-service.test.js | 63 +++- test/watch.test.js | 30 +- test/web-server.test.js | 38 ++ 23 files changed, 1405 insertions(+), 296 deletions(-) create mode 100644 docs/migration/evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md create mode 100644 src/cli-presenter.js create mode 100644 src/core-error.js create mode 100644 src/public-api.js create mode 100644 test/core-error.test.js create mode 100644 test/entrypoint-import-contract.test.js create mode 100644 test/public-api-contract.test.js create mode 100644 test/sqlite-error-contract.test.js diff --git a/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md b/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md index 21367c4..f08dac5 100644 --- a/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md +++ b/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md @@ -161,7 +161,7 @@ | Checkpoint | 内容 | 依赖 | 最终合入前必须保留的证据 | V1 状态 | | --- | --- | --- | --- | --- | | C0 | 治理、基线与依赖安全 | 阶段 0 | ADR-0011~0013、合同导航、基线测试、Vite 审计告警清零 | In Progress(V1) | -| C1 | Core Public API 与结构化错误 | C0 | CLI/Web 仅走 Public API;Canonical/Legacy Adapter;错误合同测试 | Pending | +| C1 | Core Public API 与结构化错误 | C0 | CLI/Web 仅走 Public API;Canonical/Legacy Adapter;错误合同测试 | In Progress(V1,本地门禁通过) | | C2 | CLI `--json` | C1 | stdout 单一 JSON、stderr 日志、JSON Exit Code 与 Schema 合同 | Pending | | C3 | Prepare/Apply、协调器与双层锁 | C1、C2 | Revision/Plan/Apply、Node/.NET 双层资源锁、真实争锁证据 | Pending | | C4 | Workspace、Core、Contracts、CoreClient | C1~C3(Phase 1 全部门槛已验证) | 不搬高风险算法;根 npm CLI tarball/Node 16 兼容 | Pending | @@ -217,4 +217,4 @@ Node 与 .NET 在同一 Fixture 上不一致时,PR 必须记录: ## 8. 本 PR 完成后的下一步 -V1 的下一项是 `C1`:新增 `src/public-api.js`,让 CLI 与 Web 经单一公开入口调用现有 Node 行为,并建立结构化错误边界。该 checkpoint 不移动 Core、不改同步算法,也不同时引入 `--json`、TypeScript 或 Electron;其验证不使 Phase 1 在最终 PR 合入前 Completed。 +V1 的下一项是 `C2`:在保持 Human 输出与 `0/1` 兼容的前提下实现严格单对象 CLI JSON 契约和退出码矩阵。C1 的本地证据见 [C1 Public API 与结构化错误证据](evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md);其验证不使 Phase 1 在最终 PR 合入前 Completed。 diff --git a/docs/migration/evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md b/docs/migration/evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md new file mode 100644 index 0000000..86897a5 --- /dev/null +++ b/docs/migration/evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md @@ -0,0 +1,50 @@ +# C1 Public API 与结构化错误证据(2026-08-25) + +状态:本地门禁通过,等待远端 CI。输入 checkpoint 为 `29c84ec`;C1 最终 commit SHA 在本 checkpoint 提交后及 C10 evidence bundle 中索引。 + +## 边界 + +- `src/public-api.js` 是产品入口使用 Node Core 的唯一公开入口;CLI 与 Web 不再深度导入 Core 实现模块,Watch 的延迟同步调用也经该入口。 +- `runSync`、`runSwitch`、`runRestore`、`runWatch` 仅作为已标记弃用的迁移兼容适配器保留;本 checkpoint 不把它们定义为 Renderer API,也不声称 C3 Prepare/Apply 已实现。 +- Status 的 Human 呈现从业务 service 移到 `cli-presenter.js`,避免公共 Core 方法携带 CLI 输出职责。 +- 未移动同步算法,未改变备份优先、事务、回滚、locked rollout partial 或 WSL UNC 阻断规则。 +- 未读取真实 Codex Home、认证信息、凭据、token 或消息正文;未创建 tag 或执行发布动作。 + +## 公共错误边界 + +- `CoreError` 固化 canonical code、severity、retryable、recoveryRequired、operationId、details 和 suggestedAction;DTO 不包含 stack、cause 或任意异常属性。 +- 新增并测试 `PLAN_EXPIRED`、`STALE_STATE`、`LOCK_UNVERIFIABLE`;`OPERATION_BUSY` 必须携带可信 `busyScope`,`LOCK_UNVERIFIABLE` 必须携带可信 `lockScope`。 +- 普通异常即使伪造 canonical `code` 也不能把任意 `details`、operationId、token 或消息正文注入 DTO;details 在规范化后递归冻结。 +- 公共写入兼容入口、History 与 Watch 的确定输入错误使用 `INVALID_INPUT`;既有确认快照漂移暂用合同中的 `PLAN_STALE`,C3 的正式 Apply revision 复核使用 `STALE_STATE`。 +- SQLite 分类只依赖 driver primary result code 或明确 symbolic code,不依赖英文 message;Web 保持旧 `{error, code?}` 形状,仅对真实 `CoreError` 追加安全 `coreError` DTO。 +- Restore 的未完成事务覆盖不足使用 `RECOVERY_REQUIRED`;文件/目录访问拒绝使用 `PERMISSION_DENIED`。 + +## 锁协议增量 + +- 协议 v2 owner 可选记录 `scope`;当前 Home 锁为 `codex-home`,资源锁入口可显式使用 `state-db`,旧读取器可忽略该字段。 +- 已确认 live owner 返回 `OPERATION_BUSY`;进程代际、目录身份、owner 或 cleanup 无法可靠证明时 fail-closed 返回 `LOCK_UNVERIFIABLE`。 +- 本 checkpoint 只建立 scope/error 基础和跨运行时不确定性判定;真实 State DB identity、固定顺序双层获取与 Node/.NET 同时持锁仍属于 C3,本文不声称已完成。 + +## 本地验证 + +环境:Windows x64,Node `v24.11.1`,npm `11.10.0`。 + +| 命令 | 结果 | +| --- | --- | +| `npm test` | 283 passed,0 failed,0 skipped | +| `npm run web:build` | Vite 8.2.2 production build 成功,21 modules transformed | +| `npm audit --omit=dev --audit-level=moderate` | 0 vulnerabilities | +| `npm audit --audit-level=high` | 0 vulnerabilities | +| `npm pack --dry-run --json` | 成功;新 public API、CoreError 与 presenter 均进入根 npm tarball | +| `dotnet test desktop/CodexProviderSync.Core.Tests/CodexProviderSync.Core.Tests.csproj --filter FullyQualifiedName~LockServiceTests --configuration Release` | 28 passed,0 failed,0 skipped | +| `git diff --check` | 通过,仅有既有 Windows CRLF 工作区提示 | + +另进行了三轮独立只读复审;最终结论无 P0/P1/P2 阻断。复审提出的 DTO 任意属性泄漏、跨运行时 owner 不确定性误分 busy、Restore/Web 未类型化、lock scope 丢失、cleanup AggregateError 丢码及权限错误分类均已修复并有回归覆盖。 + +## 已知未闭合项 + +- CLI 严格单对象 JSON stdout 与退出码矩阵属于 C2,当前 Human CLI 兼容行为保持不变。 +- Plan ledger、10 分钟 TTL、单次消费、revision、双层锁和 operation snapshot 属于 C3。 +- Node 16.20.2 tarball 的 Windows/Ubuntu 真正安装执行仍由后续兼容 CI 证明;本地 Node 24 结果不能替代该证据。 +- 当前 npm/Web dist 仍包含既有 source map;Electron/发布产物必须在 C9 排除并扫描证明。 +- 只有最终 PR 的所有必需 job 成功并合入受保护分支后,对应 Phase 才能标记 Completed。 diff --git a/src/cli-presenter.js b/src/cli-presenter.js new file mode 100644 index 0000000..b5fca42 --- /dev/null +++ b/src/cli-presenter.js @@ -0,0 +1,95 @@ +// Human-readable CLI presentation is deliberately outside the Core public +// API. These helpers have no storage or mutation authority. + +export function formatCounts(counts) { + return Object.entries(counts ?? {}) + .map(([provider, count]) => `${provider}: ${count}`) + .join(", ") || "(none)"; +} + +export function formatBytes(bytes) { + const units = ["B", "KB", "MB", "GB", "TB"]; + let value = bytes; + let unitIndex = 0; + while (value >= 1024 && unitIndex < units.length - 1) { + value /= 1024; + unitIndex += 1; + } + return unitIndex === 0 ? `${bytes} B` : `${value.toFixed(value >= 10 ? 1 : 2).replace(/\.0$/, "")} ${units[unitIndex]}`; +} + +export function renderStatus(status) { + const lines = [ + `Codex home: ${status.codexHome}`, + `SQLite home: ${status.sqliteHome} (source: ${status.sqliteHomeSource})`, + `Current provider: ${status.currentProvider}${status.currentProviderImplicit ? " (implicit default)" : ""}`, + `Configured providers: ${status.configuredProviders.join(", ")}`, + `Backups: ${status.backupSummary.count} (${formatBytes(status.backupSummary.totalBytes)})`, + `Backup root: ${status.backupRoot}` + ]; + + if (status.pendingTransactions?.length) { + lines.push(""); + lines.push("Recovery required:"); + for (const transaction of status.pendingTransactions) { + lines.push(` ${transaction.state}: ${transaction.backupDir}`); + } + lines.push(" Run restore with the listed backup before the next write operation."); + } + + lines.push(""); + lines.push("Rollout files:"); + lines.push(` sessions: ${formatCounts(status.rolloutCounts.sessions)}`); + lines.push(` archived_sessions: ${formatCounts(status.rolloutCounts.archived_sessions)}`); + if (status.encryptedContentCounts) { + lines.push(` encrypted_content sessions: ${formatCounts(status.encryptedContentCounts.sessions)}`); + lines.push(` encrypted_content archived_sessions: ${formatCounts(status.encryptedContentCounts.archived_sessions)}`); + } + if (status.encryptedContentWarning) { + lines.push(` ${status.encryptedContentWarning}`); + } + if (status.lockedRolloutFiles?.length) { + lines.push(` Locked rollout files skipped during status scan: ${status.lockedRolloutFiles.length}`); + } + + lines.push(""); + lines.push("SQLite state:"); + if (!status.sqliteAccess?.supported) { + lines.push(` ${status.sqliteAccess.message}`); + return lines.join("\n"); + } + if (status.stateDbLocation) { + const legacyNote = status.stateDbLocation.source === "legacy-root" ? " (legacy root)" : ""; + lines.push(` database: ${status.stateDbLocation.path}${legacyNote}`); + } else { + lines.push(` database: not found (checked ${status.checkedStateDbPaths.join(", ")})`); + } + if (status.sqliteCounts?.unreadable) { + lines.push(` ${status.sqliteCounts.error ?? "state_5.sqlite is malformed or unreadable"}`); + } else if (!status.sqliteCounts) { + lines.push(" state_5.sqlite not found"); + } else { + lines.push(` sessions: ${formatCounts(status.sqliteCounts.sessions)}`); + lines.push(` archived_sessions: ${formatCounts(status.sqliteCounts.archived_sessions)}`); + if (status.sqliteRepairStats?.userEventRowsNeedingRepair) { + lines.push(` user-event flags needing repair: ${status.sqliteRepairStats.userEventRowsNeedingRepair}`); + } + if (status.sqliteRepairStats?.cwdRowsNeedingRepair) { + lines.push(` cwd paths needing repair: ${status.sqliteRepairStats.cwdRowsNeedingRepair}`); + } + } + + if (status.projectThreadVisibility?.length) { + lines.push(""); + lines.push("Project visibility:"); + for (const project of status.projectThreadVisibility) { + const providers = formatCounts(project.providerCounts); + const rankText = project.rankPreview || "(none)"; + lines.push( + ` ${project.root}: interactive ${project.interactiveThreads}, first page ${project.firstPageThreads}/50, ranks ${rankText}, exact cwd ${project.exactCwdMatches}/${project.interactiveThreads}, verbatim cwd ${project.verbatimCwdRows}, providers ${providers}` + ); + } + } + + return lines.join("\n"); +} diff --git a/src/cli.js b/src/cli.js index 271b28d..01e3d8a 100755 --- a/src/cli.js +++ b/src/cli.js @@ -3,12 +3,13 @@ import path from "node:path"; import { DEFAULT_BACKUP_RETENTION_COUNT } from "./constants.js"; +import { formatBytes, renderStatus } from "./cli-presenter.js"; import { installWindowsLauncher } from "./launcher.js"; import { assertSupportedNodeVersion } from "./node-version.js"; -async function loadService() { +async function loadCore() { assertSupportedNodeVersion(); - return import("./service.js"); + return import("./public-api.js"); } function printHelp() { @@ -120,17 +121,6 @@ function summarizePrune(result) { ].join("\n"); } -function formatBytes(bytes) { - const units = ["B", "KB", "MB", "GB", "TB"]; - let value = bytes; - let unitIndex = 0; - while (value >= 1024 && unitIndex < units.length - 1) { - value /= 1024; - unitIndex += 1; - } - return unitIndex === 0 ? `${bytes} B` : `${value.toFixed(value >= 10 ? 1 : 2).replace(/\.0$/, "")} ${units[unitIndex]}`; -} - function formatDuration(durationMs) { if (!Number.isFinite(durationMs) || durationMs < 1000) { return `${Math.max(0, Math.round(durationMs ?? 0))} ms`; @@ -207,7 +197,7 @@ async function main() { assertSupportedNodeVersion(); if (command === "status") { - const { getStatus, renderStatus } = await loadService(); + const { getStatus } = await loadCore(); const status = await getStatus({ codexHome: flags["codex-home"], sqliteHome: flags["sqlite-home"] @@ -217,9 +207,8 @@ async function main() { } if (command === "sync") { - const { runSync } = await loadService(); + const { runSync, readConfigText, readRootModelFromConfigText } = await loadCore(); const { defaultCodexHome } = await import("./constants.js"); - const { readConfigText, readRootModelFromConfigText } = await import("./config-file.js"); const codexHome = path.resolve( flags["codex-home"] ?? process.env.CODEX_HOME ?? defaultCodexHome() ); @@ -245,7 +234,7 @@ async function main() { } if (command === "switch") { - const { runSwitch } = await loadService(); + const { runSwitch } = await loadCore(); const provider = positionals[1] ?? flags.provider; const result = await runSwitch({ codexHome: flags["codex-home"], @@ -271,7 +260,7 @@ async function main() { } if (command === "prune-backups") { - const { runPruneBackups } = await loadService(); + const { runPruneBackups } = await loadCore(); const result = await runPruneBackups({ codexHome: flags["codex-home"], keepCount: parseKeepCount(flags.keep, { allowZero: true }) @@ -281,7 +270,7 @@ async function main() { } if (command === "watch") { - const { runWatch } = await import("./watch.js"); + const { runWatch } = await loadCore(); const debounceMs = flags["debounce-ms"] !== undefined ? parseKeepCount(flags["debounce-ms"], { allowZero: true }) : undefined; @@ -359,7 +348,7 @@ async function main() { } if (command === "restore") { - const { runRestore } = await loadService(); + const { runRestore } = await loadCore(); const backupDir = positionals[1] ?? flags.backup; const result = await runRestore({ codexHome: flags["codex-home"], diff --git a/src/core-error.js b/src/core-error.js new file mode 100644 index 0000000..3986a05 --- /dev/null +++ b/src/core-error.js @@ -0,0 +1,202 @@ +const ERROR_DEFINITIONS = Object.freeze({ + INVALID_INPUT: { severity: "error", retryable: true, recoveryRequired: false }, + PROFILE_CHANGED: { severity: "warning", retryable: true, recoveryRequired: false }, + STORAGE_CHANGED: { severity: "warning", retryable: true, recoveryRequired: false }, + PLAN_STALE: { severity: "warning", retryable: true, recoveryRequired: false }, + PLAN_EXPIRED: { severity: "warning", retryable: true, recoveryRequired: false }, + STALE_STATE: { severity: "warning", retryable: true, recoveryRequired: false }, + CODEX_HOME_NOT_FOUND: { severity: "error", retryable: true, recoveryRequired: false }, + STATE_DB_NOT_FOUND: { severity: "error", retryable: true, recoveryRequired: false }, + SQLITE_UNSUPPORTED_PATH: { severity: "error", retryable: true, recoveryRequired: false }, + SQLITE_BUSY: { severity: "warning", retryable: true, recoveryRequired: false }, + SQLITE_UNREADABLE: { severity: "error", retryable: true, recoveryRequired: false }, + ROLLOUT_LOCKED: { severity: "warning", retryable: true, recoveryRequired: false }, + ROLLOUT_CHANGED: { severity: "warning", retryable: true, recoveryRequired: false }, + PENDING_TRANSACTION: { severity: "error", retryable: true, recoveryRequired: true }, + BACKUP_FAILED: { severity: "error", retryable: true, recoveryRequired: false }, + SYNC_FAILED_ROLLED_BACK: { severity: "error", retryable: true, recoveryRequired: false }, + RECOVERY_REQUIRED: { severity: "error", retryable: true, recoveryRequired: true }, + RESTORE_VALIDATION_FAILED: { severity: "error", retryable: true, recoveryRequired: false }, + PERMISSION_DENIED: { severity: "error", retryable: true, recoveryRequired: false }, + OPERATION_BUSY: { severity: "warning", retryable: true, recoveryRequired: false }, + LOCK_UNVERIFIABLE: { severity: "error", retryable: true, recoveryRequired: false }, + OPERATION_CANCELLED: { severity: "info", retryable: true, recoveryRequired: false }, + CORE_RUNTIME_CRASHED: { severity: "fatal", retryable: true, recoveryRequired: false }, + PROTOCOL_VERSION_MISMATCH: { severity: "error", retryable: true, recoveryRequired: false }, + INTERNAL_ERROR: { severity: "fatal", retryable: false, recoveryRequired: false } +}); + +const SEVERITIES = new Set(["info", "warning", "error", "fatal"]); +const LOCK_SCOPES = new Set(["codex-home", "state-db"]); +const CORE_ERROR_CODE_SET = new Set(Object.keys(ERROR_DEFINITIONS)); + +export const CORE_ERROR_CODES = Object.freeze(Object.keys(ERROR_DEFINITIONS)); + +function cloneJsonValue(value, fieldName, depth = 0) { + if (depth > 12) { + throw new TypeError(`${fieldName} exceeds the maximum supported nesting depth.`); + } + if (value === null || typeof value === "string" || typeof value === "boolean") { + return value; + } + if (typeof value === "number") { + if (!Number.isFinite(value)) { + throw new TypeError(`${fieldName} may only contain finite numbers.`); + } + return value; + } + if (Array.isArray(value)) { + return value.map((entry) => cloneJsonValue(entry, fieldName, depth + 1)); + } + if (typeof value === "object" && Object.getPrototypeOf(value) === Object.prototype) { + const result = {}; + for (const [key, entry] of Object.entries(value)) { + if (entry !== undefined) { + result[key] = cloneJsonValue(entry, fieldName, depth + 1); + } + } + return result; + } + throw new TypeError(`${fieldName} must be JSON-serializable plain data.`); +} + +function deepFreezeJsonValue(value) { + if (value && typeof value === "object") { + for (const entry of Object.values(value)) { + deepFreezeJsonValue(entry); + } + Object.freeze(value); + } + return value; +} + +function normalizeDetails(details) { + if (details === undefined) return undefined; + const normalized = cloneJsonValue(details, "CoreError details"); + if (normalized === null || Array.isArray(normalized) || typeof normalized !== "object") { + throw new TypeError("CoreError details must be a plain object."); + } + return deepFreezeJsonValue(normalized); +} + +function validateScopedError(code, details) { + if (code === "OPERATION_BUSY" && !LOCK_SCOPES.has(details?.busyScope)) { + throw new TypeError("OPERATION_BUSY requires details.busyScope to be codex-home or state-db."); + } + if (code === "LOCK_UNVERIFIABLE" && !LOCK_SCOPES.has(details?.lockScope)) { + throw new TypeError("LOCK_UNVERIFIABLE requires details.lockScope to be codex-home or state-db."); + } +} + +function normalizeCode(code) { + if (!CORE_ERROR_CODE_SET.has(code)) { + throw new TypeError(`Unknown CoreError code: ${String(code)}`); + } + return code; +} + +function optionalString(value, fieldName) { + if (value === undefined) return undefined; + if (typeof value !== "string" || !value) { + throw new TypeError(`${fieldName} must be a non-empty string when provided.`); + } + return value; +} + +export class CoreError extends Error { + constructor(code, message, options = {}) { + const normalizedCode = normalizeCode(code); + if (typeof message !== "string" || !message) { + throw new TypeError("CoreError message must be a non-empty string."); + } + const details = normalizeDetails(options.details); + validateScopedError(normalizedCode, details); + super(message, options.cause === undefined ? undefined : { cause: options.cause }); + + const defaults = ERROR_DEFINITIONS[normalizedCode]; + const severity = options.severity ?? defaults.severity; + if (!SEVERITIES.has(severity)) { + throw new TypeError(`Invalid CoreError severity: ${String(severity)}`); + } + if (options.retryable !== undefined && typeof options.retryable !== "boolean") { + throw new TypeError("CoreError retryable must be boolean when provided."); + } + if (options.recoveryRequired !== undefined && typeof options.recoveryRequired !== "boolean") { + throw new TypeError("CoreError recoveryRequired must be boolean when provided."); + } + + this.name = "CoreError"; + this.code = normalizedCode; + this.severity = severity; + this.retryable = options.retryable ?? defaults.retryable; + this.recoveryRequired = options.recoveryRequired ?? defaults.recoveryRequired; + this.operationId = optionalString(options.operationId, "CoreError operationId"); + this.details = details; + this.suggestedAction = optionalString(options.suggestedAction, "CoreError suggestedAction"); + } + + toDto() { + return { + code: this.code, + message: this.message, + severity: this.severity, + retryable: this.retryable, + recoveryRequired: this.recoveryRequired, + ...(this.operationId ? { operationId: this.operationId } : {}), + ...(this.details ? { details: this.details } : {}), + ...(this.suggestedAction ? { suggestedAction: this.suggestedAction } : {}) + }; + } +} + +function safeCauseCode(error) { + return typeof error?.code === "string" && error.code && error.code.length <= 120 + ? error.code + : undefined; +} + +function mappedCode(error, fallbackCode) { + if (error?.name === "AbortError" && error?.code === "ABORT_ERR") { + return "OPERATION_CANCELLED"; + } + if (CORE_ERROR_CODE_SET.has(error?.code)) { + return error.code; + } + if (error?.code === "EACCES" || error?.code === "EPERM") { + return "PERMISSION_DENIED"; + } + return normalizeCode(fallbackCode); +} + +export function toCoreErrorDto(error, { + fallbackCode = "INTERNAL_ERROR", + operationId, + details, + suggestedAction +} = {}) { + if (error instanceof CoreError) { + return error.toDto(); + } + + const message = error instanceof Error ? error.message : String(error); + const causeCode = safeCauseCode(error); + const normalizedDetails = { + ...(details ?? {}), + ...(causeCode && !CORE_ERROR_CODE_SET.has(causeCode) ? { causeCode } : {}) + }; + const code = mappedCode(error, fallbackCode); + try { + return new CoreError(code, message || "An unknown Core error occurred.", { + operationId, + details: Object.keys(normalizedDetails).length > 0 ? normalizedDetails : undefined, + suggestedAction, + cause: error instanceof Error ? error : undefined + }).toDto(); + } catch (conversionError) { + if (code === "INTERNAL_ERROR") throw conversionError; + return new CoreError("INTERNAL_ERROR", message || "An unknown Core error occurred.", { + details: causeCode ? { causeCode } : undefined, + cause: error instanceof Error ? error : conversionError + }).toDto(); + } +} diff --git a/src/history.js b/src/history.js index 065932a..bf96b36 100644 --- a/src/history.js +++ b/src/history.js @@ -5,11 +5,22 @@ import path from "node:path"; import readline from "node:readline"; import { SESSION_DIRS } from "./constants.js"; +import { CoreError } from "./core-error.js"; const DEFAULT_PAGE_SIZE = 50; const MAX_PAGE_SIZE = 100; const DEFAULT_MESSAGE_LIMIT = 200; +function historyFileError(error, action) { + if (error?.code === "EACCES" || error?.code === "EPERM") { + return new CoreError("PERMISSION_DENIED", `Permission denied while ${action}.`, { + cause: error, + details: { causeCode: error.code } + }); + } + return error; +} + function normalizedRolloutPath(rolloutPath) { const absolutePath = path.resolve(rolloutPath); return process.platform === "win32" ? absolutePath.toLowerCase() : absolutePath; @@ -77,7 +88,7 @@ async function listRolloutFiles(root) { entries = await fs.readdir(directory, { withFileTypes: true }); } catch (error) { if (error?.code === "ENOENT") return; - throw error; + throw historyFileError(error, "scanning history rollouts"); } for (const entry of entries) { const fullPath = path.join(directory, entry.name); @@ -149,7 +160,7 @@ async function collectHistory(codexHome) { session = await readRollout(filePath, dirName === "archived_sessions"); } catch (error) { if (error?.code === "ENOENT") continue; - throw error; + throw historyFileError(error, "reading a history rollout"); } if (session) sessions.push(session); } @@ -185,8 +196,15 @@ function publicSession(session) { export function validateHistoryPage(pageValue, pageSizeValue = DEFAULT_PAGE_SIZE) { const page = pageValue === undefined ? 1 : Number(pageValue); const pageSize = pageSizeValue === undefined ? DEFAULT_PAGE_SIZE : Number(pageSizeValue); - if (!Number.isInteger(page) || page < 1) throw new Error("page must be a positive integer."); - if (!Number.isInteger(pageSize) || pageSize < 10 || pageSize > MAX_PAGE_SIZE) throw new Error(`pageSize must be an integer between 10 and ${MAX_PAGE_SIZE}.`); + if (!Number.isInteger(page) || page < 1) { + throw new CoreError("INVALID_INPUT", "page must be a positive integer."); + } + if (!Number.isInteger(pageSize) || pageSize < 10 || pageSize > MAX_PAGE_SIZE) { + throw new CoreError( + "INVALID_INPUT", + `pageSize must be an integer between 10 and ${MAX_PAGE_SIZE}.` + ); + } return { page, pageSize }; } @@ -196,7 +214,9 @@ export async function listHistory(codexHome, options = {}) { const project = normalizeText(options.project).toLowerCase(); const provider = normalizeText(options.provider); const archived = options.archived ?? "all"; - if (!["all", "active", "archived"].includes(archived)) throw new Error("archived must be all, active, or archived."); + if (!["all", "active", "archived"].includes(archived)) { + throw new CoreError("INVALID_INPUT", "archived must be all, active, or archived."); + } const sessions = await collectHistory(codexHome); const filtered = sessions.filter((session) => { if (provider && session.provider !== provider) return false; @@ -213,10 +233,17 @@ export async function listHistory(codexHome, options = {}) { } export async function getHistorySession(codexHome, sessionId, { messageLimit = DEFAULT_MESSAGE_LIMIT } = {}) { - if (typeof sessionId !== "string" || !sessionId.trim()) throw new Error("sessionId is required."); + if (typeof sessionId !== "string" || !sessionId.trim()) { + throw new CoreError("INVALID_INPUT", "sessionId is required."); + } const sessions = await collectHistory(codexHome); const session = sessions.find((item) => item.id === sessionId); - if (!session) throw new Error("The selected session was not found in this Codex Home."); + if (!session) { + throw new CoreError( + "INVALID_INPUT", + "The selected session was not found in this Codex Home." + ); + } const safeLimit = Number.isInteger(messageLimit) && messageLimit > 0 ? Math.min(messageLimit, DEFAULT_MESSAGE_LIMIT) : DEFAULT_MESSAGE_LIMIT; const messages = session.messages.slice(-safeLimit); return { session: publicSession(session), messages, truncated: messages.length < session.messages.length, returnedMessageCount: messages.length }; diff --git a/src/locking.js b/src/locking.js index b90ab30..db3dada 100644 --- a/src/locking.js +++ b/src/locking.js @@ -6,11 +6,13 @@ import { promisify } from "node:util"; import { DEFAULT_LOCK_NAME } from "./constants.js"; import { syncDirectory } from "./atomic-file.js"; +import { CoreError } from "./core-error.js"; const execFileAsync = promisify(execFile); const DEFAULT_LOCK_CREATE_RETRY_COUNT = 3; const DEFAULT_LOCK_CREATE_RETRY_DELAY_MS = 75; const DEFAULT_STALE_RECLAIM_ATTEMPT_LIMIT = 8; +const LOCK_SCOPES = new Set(["codex-home", "state-db"]); function isTransientLockCreateError(error) { return error?.code === "EPERM" || error?.code === "EACCES"; @@ -80,10 +82,33 @@ async function getProcessStartMarker(pid) { return marker ? `${process.platform}:${marker}` : null; } -function lockExistsError(lockDir, reason) { - return new Error( - `Lock already exists at ${lockDir}. ${reason} Close Codex/App and retry; do not remove it unless the recorded owner is known to be gone.` - ); +function lockUnverifiableError( + lockDir, + message, + { cause, causeCode, lockScope = "codex-home" } = {} +) { + return new CoreError("LOCK_UNVERIFIABLE", message, { + cause, + details: { + lockScope, + ...(causeCode ? { causeCode } : {}) + } + }); +} + +function lockExistsError( + lockDir, + reason, + { busy = false, cause, causeCode, lockScope = "codex-home" } = {} +) { + const message = `Lock already exists at ${lockDir}. ${reason} Close Codex/App and retry; do not remove it unless the recorded owner is known to be gone.`; + if (busy) { + return new CoreError("OPERATION_BUSY", message, { + cause, + details: { busyScope: lockScope } + }); + } + return lockUnverifiableError(lockDir, message, { cause, causeCode, lockScope }); } function processStartedAtFromMarker(marker) { @@ -137,35 +162,7 @@ function ownerMatchesExpected(actual, expected) { && actual.processStartedAt === expected.processStartedAt; } -function liveIdentityMatchesOwner(liveMarker, liveStartedAt, owner) { - if (!liveMarker) { - return false; - } - if (owner.processStartMarker - && (owner.runtime === "node" || owner.protocolVersion !== 2)) { - return liveMarker === owner.processStartMarker; - } - if (owner.protocolVersion >= 2 && owner.processStartedAt) { - if (!liveStartedAt) { - // A live PID whose start time cannot be compared safely is retained. - // This is preferable to reclaiming another runtime's active lock. - return true; - } - return Math.abs(Date.parse(liveStartedAt) - Date.parse(owner.processStartedAt)) < 1000; - } - if (owner.processStartMarker) { - return liveMarker === owner.processStartMarker; - } - if (owner.processStartedAt) { - if (!liveStartedAt) { - return true; - } - return Math.abs(Date.parse(liveStartedAt) - Date.parse(owner.processStartedAt)) < 1000; - } - return true; -} - -async function readLockOwner(ownerPath, fsImpl) { +async function readLockOwner(ownerPath, fsImpl, lockScope = "codex-home") { let text; try { text = await fsImpl.readFile(ownerPath, "utf8"); @@ -173,9 +170,9 @@ async function readLockOwner(ownerPath, fsImpl) { if (error?.code === "ENOENT") { const missingOwner = lockExistsError( path.dirname(ownerPath), - "owner.json is not visible yet, so ownership cannot be proven safely." + "owner.json is not visible yet, so ownership cannot be proven safely.", + { cause: error, causeCode: "ENOENT", lockScope } ); - missingOwner.code = "ENOENT"; throw missingOwner; } throw error; @@ -184,20 +181,29 @@ async function readLockOwner(ownerPath, fsImpl) { try { owner = JSON.parse(text); } catch { - throw lockExistsError(path.dirname(ownerPath), "owner.json is malformed, so the lock is retained fail-closed."); + throw lockExistsError( + path.dirname(ownerPath), + "owner.json is malformed, so the lock is retained fail-closed.", + { lockScope } + ); } const protocolVersion = owner?.protocolVersion; if (protocolVersion !== undefined && (!Number.isInteger(protocolVersion) || protocolVersion < 1 || protocolVersion > 2)) { throw lockExistsError( path.dirname(ownerPath), - `owner.json uses unsupported lock protocol ${String(protocolVersion)}.` + `owner.json uses unsupported lock protocol ${String(protocolVersion)}.`, + { lockScope } ); } const hasPid = Number.isInteger(owner?.pid); const hasProcessId = Number.isInteger(owner?.processId); if (hasPid && hasProcessId && owner.pid !== owner.processId) { - throw lockExistsError(path.dirname(ownerPath), "owner.json has conflicting pid and processId values."); + throw lockExistsError( + path.dirname(ownerPath), + "owner.json has conflicting pid and processId values.", + { lockScope } + ); } const pid = hasPid ? owner.pid : owner?.processId; const processStartMarker = typeof owner?.processStartMarker === "string" @@ -215,13 +221,18 @@ async function readLockOwner(ownerPath, fsImpl) { && (!hasPid || !hasProcessId || !processStartedAt || !instanceId)) { throw lockExistsError( path.dirname(ownerPath), - "owner.json is missing required version 2 identity fields." + "owner.json is missing required version 2 identity fields.", + { lockScope } ); } if (!Number.isInteger(pid) || pid <= 0 || (!processStartMarker && !processStartedAt && !Number.isInteger(owner?.processId))) { - throw lockExistsError(path.dirname(ownerPath), "owner.json lacks a verifiable process identity."); + throw lockExistsError( + path.dirname(ownerPath), + "owner.json lacks a verifiable process identity.", + { lockScope } + ); } return { ...owner, @@ -253,16 +264,24 @@ async function lstatOrNull(targetPath, fsImpl) { } } -async function inspectCanonicalDirectory(lockDir, fsImpl) { +async function inspectCanonicalDirectory(lockDir, fsImpl, lockScope = "codex-home") { const stats = await lstatOrNull(lockDir, fsImpl); if (!stats) { return null; } if (stats.isSymbolicLink()) { - throw lockExistsError(lockDir, "The canonical lock path is a symbolic link and is retained fail-closed."); + throw lockExistsError( + lockDir, + "The canonical lock path is a symbolic link and is retained fail-closed.", + { lockScope } + ); } if (!stats.isDirectory()) { - throw lockExistsError(lockDir, "The canonical lock path is not a directory and is retained fail-closed."); + throw lockExistsError( + lockDir, + "The canonical lock path is not a directory and is retained fail-closed.", + { lockScope } + ); } return directoryIdentity(stats); } @@ -272,18 +291,19 @@ async function restoreQuarantinedOwner( lockDir, fsImpl, syncDirectoryImpl, - platform + platform, + lockScope ) { const parentDir = path.dirname(lockDir); let reservationIdentity = null; try { await fsImpl.mkdir(lockDir, { mode: 0o700 }); - reservationIdentity = await inspectCanonicalDirectory(lockDir, fsImpl); + reservationIdentity = await inspectCanonicalDirectory(lockDir, fsImpl, lockScope); await fsImpl.link( path.join(sourceDir, "owner.json"), path.join(lockDir, "owner.json") ); - const publishedIdentity = await inspectCanonicalDirectory(lockDir, fsImpl); + const publishedIdentity = await inspectCanonicalDirectory(lockDir, fsImpl, lockScope); if (!sameDirectoryIdentity(reservationIdentity, publishedIdentity)) { return false; } @@ -303,7 +323,8 @@ async function quarantineStaleLock( expectedDirectoryIdentity, fsImpl, syncDirectoryImpl, - platform + platform, + lockScope ) { const quarantinePath = `${lockDir}.stale.${Date.now()}.${randomUUID()}`; try { @@ -317,14 +338,19 @@ async function quarantineStaleLock( let quarantinedOwner; try { - quarantinedOwner = await readLockOwner(path.join(quarantinePath, "owner.json"), fsImpl); + quarantinedOwner = await readLockOwner( + path.join(quarantinePath, "owner.json"), + fsImpl, + lockScope + ); } catch (error) { await restoreQuarantinedOwner( quarantinePath, lockDir, fsImpl, syncDirectoryImpl, - platform + platform, + lockScope ); throw error; } @@ -339,13 +365,15 @@ async function quarantineStaleLock( lockDir, fsImpl, syncDirectoryImpl, - platform + platform, + lockScope ); throw lockExistsError( lockDir, restored ? "The lock generation changed during stale-lock reclamation, so its owner was restored without replacing another directory." - : `The owner changed during stale-lock reclamation; its lock is preserved at ${quarantinePath}.` + : `The owner changed during stale-lock reclamation; its lock is preserved at ${quarantinePath}.`, + { lockScope } ); } await fsImpl.rm(quarantinePath, { recursive: true, force: true }); @@ -375,16 +403,25 @@ async function removeOwnedCanonical( syncDirectoryImpl, platform, expectedDirectoryIdentity, + lockScope, suffix = "release" ) { const parentDir = path.dirname(lockDir); const removalPath = `${lockDir}.${suffix}.${process.pid}.${randomUUID()}`; - const currentDirectoryIdentity = await inspectCanonicalDirectory(lockDir, fsImpl); + const currentDirectoryIdentity = await inspectCanonicalDirectory(lockDir, fsImpl, lockScope); if (!sameDirectoryIdentity(currentDirectoryIdentity, expectedDirectoryIdentity)) { - throw new Error(`Refusing to remove lock ${lockDir} because its directory identity changed.`); + throw lockUnverifiableError( + lockDir, + `Refusing to remove lock ${lockDir} because its directory identity changed.`, + { lockScope } + ); } await fsImpl.rename(lockDir, removalPath); - const currentOwner = await readLockOwner(path.join(removalPath, "owner.json"), fsImpl); + const currentOwner = await readLockOwner( + path.join(removalPath, "owner.json"), + fsImpl, + lockScope + ); const removalStats = await lstatOrNull(removalPath, fsImpl); const removalIdentity = removalStats?.isDirectory() ? directoryIdentity(removalStats) @@ -396,12 +433,15 @@ async function removeOwnedCanonical( lockDir, fsImpl, syncDirectoryImpl, - platform + platform, + lockScope ); - throw new Error( + throw lockUnverifiableError( + lockDir, restored ? `Refusing to remove lock ${lockDir} because its generation changed; its owner was restored safely.` - : `Refusing to remove lock ${lockDir}; the changed owner is preserved at ${removalPath}.` + : `Refusing to remove lock ${lockDir}; the changed owner is preserved at ${removalPath}.`, + { lockScope } ); } await fsImpl.rm(removalPath, { recursive: true, force: true }); @@ -436,15 +476,32 @@ async function isOwnerLive(owner, getProcessIdentity, getProcessStartedAtIdentit if (!liveMarker) { return false; } - let liveStartedAt = null; + + // A Node owner publishes the exact platform process-start marker, so this + // comparison proves both liveness and generation without a second probe. + if (owner.processStartMarker + && (owner.runtime === "node" || owner.protocolVersion !== 2)) { + return liveMarker === owner.processStartMarker; + } + + let liveStartedAt; try { liveStartedAt = await getProcessStartedAtIdentity(owner.pid, liveMarker); - } catch { - // The exact Node process marker remains sufficient for legacy/current - // Node owners. Cross-runtime owners fail closed if their start time cannot - // be inspected. + } catch (error) { + throw new Error(`Unable to verify the recorded owner's process start time for PID ${owner.pid}.`, { + cause: error + }); + } + if (!liveStartedAt) { + throw new Error(`Unable to verify the recorded owner's process start time for PID ${owner.pid}.`); + } + if (owner.processStartedAt) { + return Math.abs(Date.parse(liveStartedAt) - Date.parse(owner.processStartedAt)) < 1000; + } + if (owner.processStartMarker) { + return liveMarker === owner.processStartMarker; } - return liveIdentityMatchesOwner(liveMarker, liveStartedAt, owner); + throw new Error(`The live PID ${owner.pid} has no comparable process generation identity.`); } async function establishUniqueClaim({ @@ -455,7 +512,8 @@ async function establishUniqueClaim({ getProcessIdentity, getProcessStartedAtIdentity, syncDirectoryImpl, - platform + platform, + lockScope }) { for (let scan = 0; scan < 2; scan += 1) { const entries = await fsImpl.readdir(claimsDir, { withFileTypes: true }); @@ -468,9 +526,13 @@ async function establishUniqueClaim({ if (path.resolve(otherPath) === path.resolve(claimPath)) { continue; } - const otherOwner = await readLockOwner(otherPath, fsImpl); + const otherOwner = await readLockOwner(otherPath, fsImpl, lockScope); if (!otherOwner.instanceId || entry.name !== `${otherOwner.instanceId}.json`) { - throw lockExistsError(claimsDir, `Claim ${otherPath} has no matching immutable instance identity.`); + throw lockExistsError( + claimsDir, + `Claim ${otherPath} has no matching immutable instance identity.`, + { lockScope } + ); } let live; try { @@ -478,11 +540,16 @@ async function establishUniqueClaim({ } catch (identityError) { throw lockExistsError( claimsDir, - `Claim ${otherPath} could not be verified (${identityError.message}).` + `Claim ${otherPath} could not be verified (${identityError.message}).`, + { lockScope } ); } if (live) { - throw lockExistsError(claimsDir, `PID ${otherOwner.pid} holds live claim ${entry.name}.`); + throw lockExistsError( + claimsDir, + `PID ${otherOwner.pid} holds live claim ${entry.name}.`, + { busy: true, lockScope } + ); } // The filename is a never-reused instance generation. Removing this one // stale file cannot delete a newer claimant's record. @@ -491,24 +558,39 @@ async function establishUniqueClaim({ } } - const currentOwner = await readLockOwner(claimPath, fsImpl); + const currentOwner = await readLockOwner(claimPath, fsImpl, lockScope); if (currentOwner.instanceId !== owner.instanceId) { - throw new Error(`Refusing to use claim ${claimPath} because its owner identity changed.`); + throw lockUnverifiableError( + claimPath, + `Refusing to use claim ${claimPath} because its owner identity changed.`, + { lockScope } + ); } } -async function removeOwnedClaim(claimPath, owner, fsImpl, syncDirectoryImpl, platform) { +async function removeOwnedClaim( + claimPath, + owner, + fsImpl, + syncDirectoryImpl, + platform, + lockScope +) { let currentOwner; try { - currentOwner = await readLockOwner(claimPath, fsImpl); + currentOwner = await readLockOwner(claimPath, fsImpl, lockScope); } catch (error) { - if (error?.code === "ENOENT") { + if (error?.details?.causeCode === "ENOENT") { return; } throw error; } if (currentOwner.instanceId !== owner.instanceId) { - throw new Error(`Refusing to remove claim ${claimPath} because its owner identity changed.`); + throw lockUnverifiableError( + claimPath, + `Refusing to remove claim ${claimPath} because its owner identity changed.`, + { lockScope } + ); } await fsImpl.rm(claimPath, { force: true }); await syncDirectoryImpl(path.dirname(claimPath), { fsImpl, platform }); @@ -534,9 +616,13 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o syncDirectoryImpl = syncDirectory, onCandidateReady, onBeforeStaleReclaim, - platform = process.platform + platform = process.platform, + scope = "codex-home" } = options; const lockDir = path.resolve(lockPath); + if (!LOCK_SCOPES.has(scope)) { + throw new TypeError(`scope must be one of: ${[...LOCK_SCOPES].join(", ")}.`); + } if (!Number.isInteger(staleReclaimAttemptLimit) || staleReclaimAttemptLimit < 0) { throw new TypeError("staleReclaimAttemptLimit must be a non-negative integer."); } @@ -547,16 +633,53 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o parentDir, `.${path.basename(lockDir)}.candidate.${process.pid}.${randomUUID()}` ); - await fsImpl.mkdir(parentDir, { recursive: true }); - await fsImpl.mkdir(claimsDir, { recursive: true, mode: 0o700 }); - const processStartMarker = await getProcessIdentity(process.pid); + try { + await fsImpl.mkdir(parentDir, { recursive: true }); + await fsImpl.mkdir(claimsDir, { recursive: true, mode: 0o700 }); + } catch (error) { + if (error?.code === "EACCES" || error?.code === "EPERM") { + throw new CoreError( + "PERMISSION_DENIED", + `Permission denied while preparing ${scope} lock storage at ${parentDir}.`, + { cause: error, details: { causeCode: error.code, lockScope: scope } } + ); + } + throw error; + } + let processStartMarker; + try { + processStartMarker = await getProcessIdentity(process.pid); + } catch (error) { + throw lockUnverifiableError( + lockDir, + `Unable to establish the current process identity for lock ${lockDir}.`, + { cause: error, causeCode: error?.code, lockScope: scope } + ); + } if (!processStartMarker) { - throw new Error(`Unable to establish the current process identity for lock ${lockDir}.`); + throw lockUnverifiableError( + lockDir, + `Unable to establish the current process identity for lock ${lockDir}.`, + { lockScope: scope } + ); } - const processStartedAt = await getProcessStartedAtIdentity(process.pid, processStartMarker); + let processStartedAt; + try { + processStartedAt = await getProcessStartedAtIdentity(process.pid, processStartMarker); + } catch (error) { + throw lockUnverifiableError( + lockDir, + `Unable to establish the current process start time for lock ${lockDir}.`, + { cause: error, causeCode: error?.code, lockScope: scope } + ); + } if (!processStartedAt) { - throw new Error(`Unable to establish the current process start time for lock ${lockDir}.`); + throw lockUnverifiableError( + lockDir, + `Unable to establish the current process start time for lock ${lockDir}.`, + { lockScope: scope } + ); } const owner = { protocolVersion: 2, @@ -567,6 +690,7 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o processStartedAt: toUtcSecond(processStartedAt), instanceId: randomUUID(), startedAt: new Date().toISOString(), + scope, label, cwd: process.cwd(), currentDirectory: process.cwd() @@ -592,7 +716,8 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o getProcessIdentity, getProcessStartedAtIdentity, syncDirectoryImpl, - platform + platform, + lockScope: scope }); await createCandidateDirectory( candidateDir, @@ -621,14 +746,15 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o // then publish the already-durable owner inode with a no-replace link. await fsImpl.mkdir(lockDir, { mode: 0o700 }); canonicalReserved = true; - canonicalDirectoryIdentity = await inspectCanonicalDirectory(lockDir, fsImpl); + canonicalDirectoryIdentity = await inspectCanonicalDirectory(lockDir, fsImpl, scope); await fsImpl.link(candidateOwnerPath, ownerPath); ownerLinked = true; - const publishedDirectoryIdentity = await inspectCanonicalDirectory(lockDir, fsImpl); + const publishedDirectoryIdentity = await inspectCanonicalDirectory(lockDir, fsImpl, scope); if (!sameDirectoryIdentity(canonicalDirectoryIdentity, publishedDirectoryIdentity)) { throw lockExistsError( lockDir, - "The canonical reservation changed identity while owner.json was being published; the live claim is retained because publication is uncertain." + "The canonical reservation changed identity while owner.json was being published; the live claim is retained because publication is uncertain.", + { lockScope: scope } ); } published = true; @@ -640,9 +766,9 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o if (canonicalReserved) { throw error; } - const existingDirectoryIdentity = await inspectCanonicalDirectory(lockDir, fsImpl); + const existingDirectoryIdentity = await inspectCanonicalDirectory(lockDir, fsImpl, scope); if (existingDirectoryIdentity !== null) { - const existingOwner = await readLockOwner(ownerPath, fsImpl); + const existingOwner = await readLockOwner(ownerPath, fsImpl, scope); let live; try { live = await isOwnerLive( @@ -651,15 +777,24 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o getProcessStartedAtIdentity ); } catch (identityError) { - throw lockExistsError(lockDir, `The recorded owner could not be verified (${identityError.message}).`); + throw lockExistsError( + lockDir, + `The recorded owner could not be verified (${identityError.message}).`, + { lockScope: scope } + ); } if (live) { - throw lockExistsError(lockDir, `PID ${existingOwner.pid} is still the verified owner.`); + throw lockExistsError( + lockDir, + `PID ${existingOwner.pid} is still the verified owner.`, + { busy: true, lockScope: scope } + ); } if (staleReclaimAttempts >= staleReclaimAttemptLimit) { throw lockExistsError( lockDir, - `Stale-lock reclamation exceeded the bounded limit of ${staleReclaimAttemptLimit} attempts.` + `Stale-lock reclamation exceeded the bounded limit of ${staleReclaimAttemptLimit} attempts.`, + { lockScope: scope } ); } staleReclaimAttempts += 1; @@ -670,7 +805,8 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o existingDirectoryIdentity, fsImpl, syncDirectoryImpl, - platform + platform, + scope )) { await syncDirectoryImpl(parentDir, { fsImpl, platform }); } @@ -695,6 +831,7 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o syncDirectoryImpl, platform, canonicalDirectoryIdentity, + scope, "acquire-failed" ); canonicalCleanupSafe = true; @@ -706,10 +843,12 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o // rmdir is intentionally non-recursive: if another runtime populated // the reserved directory, preserve it. Since link never succeeded, our // independent claim can still be released safely below. - const cleanupDirectoryIdentity = await inspectCanonicalDirectory(lockDir, fsImpl); + const cleanupDirectoryIdentity = await inspectCanonicalDirectory(lockDir, fsImpl, scope); if (!sameDirectoryIdentity(cleanupDirectoryIdentity, canonicalDirectoryIdentity)) { - throw new Error( - `Refusing to remove empty reservation ${lockDir} because its directory identity changed.` + throw lockUnverifiableError( + lockDir, + `Refusing to remove empty reservation ${lockDir} because its directory identity changed.`, + { lockScope: scope } ); } await fsImpl.rmdir(lockDir); @@ -726,17 +865,29 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o } if (claimPath && (canonicalCleanupSafe || !ownerLinked)) { try { - await removeOwnedClaim(claimPath, owner, fsImpl, syncDirectoryImpl, platform); + await removeOwnedClaim( + claimPath, + owner, + fsImpl, + syncDirectoryImpl, + platform, + scope + ); } catch (cleanupError) { cleanupFailures.push(cleanupError); } } if (cleanupFailures.length > 0) { - throw new AggregateError( + const aggregate = new AggregateError( [error, ...cleanupFailures], `Lock acquisition failed and cleanup was incomplete: ${error.message}`, { cause: error } ); + throw lockUnverifiableError(lockDir, aggregate.message, { + cause: aggregate, + causeCode: error?.code, + lockScope: scope + }); } throw error; } @@ -752,9 +903,17 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o fsImpl, syncDirectoryImpl, platform, - canonicalDirectoryIdentity + canonicalDirectoryIdentity, + scope + ); + await removeOwnedClaim( + claimPath, + owner, + fsImpl, + syncDirectoryImpl, + platform, + scope ); - await removeOwnedClaim(claimPath, owner, fsImpl, syncDirectoryImpl, platform); released = true; }; } diff --git a/src/public-api.js b/src/public-api.js new file mode 100644 index 0000000..d2398c2 --- /dev/null +++ b/src/public-api.js @@ -0,0 +1,31 @@ +// The only supported Node Core import surface for product entry points. +// +// This is intentionally a thin facade during the staged vNext migration: the +// current implementation stays in its existing modules, while CLI, Web, and +// future desktop transports depend on this stable boundary rather than those +// implementation details. +// +// The runSync/runSwitch/runRestore/runWatch exports are migration adapters. +// New transports must use the prepare/apply APIs once those land in C3; the +// adapters are retained here only for CLI/Web compatibility during migration. + +export { CORE_ERROR_CODES, CoreError, toCoreErrorDto } from "./core-error.js"; + +export { + getStatus, + runPruneBackups, + runRestore, + runSwitch, + runSync +} from "./service.js"; + +export { listBackups } from "./backup.js"; +export { getHistorySession, listHistory } from "./history.js"; +export { readConfigText, readRootModelFromConfigText } from "./config-file.js"; +export { detectStateDb } from "./sqlite-state.js"; +export { + ensureCodexHome, + resolveStorageLayout, + withStateDbLocation +} from "./storage-layout.js"; +export { runWatch } from "./watch.js"; diff --git a/src/service.js b/src/service.js index d524be5..6c603f5 100644 --- a/src/service.js +++ b/src/service.js @@ -6,6 +6,7 @@ import { DEFAULT_PROVIDER, defaultBackupRoot } from "./constants.js"; +import { CoreError } from "./core-error.js"; import { configDeclaresProvider, listConfiguredProviderIds, @@ -81,7 +82,7 @@ function uniqueResolvedPaths(values) { return [...pathsByKey.values()]; } -export class SyncTransactionError extends Error { +export class SyncTransactionError extends CoreError { constructor( originalError, rollbackErrors, @@ -90,12 +91,19 @@ export class SyncTransactionError extends Error { uncompletedTargets, { rollbackStatus = "incomplete", recoveryRequired = true } = {} ) { + const code = recoveryRequired ? "RECOVERY_REQUIRED" : "SYNC_FAILED_ROLLED_BACK"; const message = recoveryRequired ? `Failed to restore state after sync error. Original error: ${originalError.message}. Restore error: ${rollbackErrors.join("; ")}` : `Provider sync failed and all observed changes were rolled back. Original error: ${originalError.message}`; - super(message, { cause: originalError }); + const recoveryInstructions = recoveryRequired + ? `Restore the managed backup at ${backupDir}, inspect the pending transaction journal, then retry.` + : "No manual recovery is required. Inspect the original error, correct its cause, and retry."; + super(code, message, { + cause: originalError, + recoveryRequired, + suggestedAction: recoveryInstructions + }); this.name = "SyncTransactionError"; - this.code = recoveryRequired ? "RECOVERY_REQUIRED" : "SYNC_FAILED_ROLLED_BACK"; this.originalError = originalError; this.rollbackErrors = rollbackErrors; this.backupDir = backupDir; @@ -103,9 +111,7 @@ export class SyncTransactionError extends Error { this.uncompletedTargets = uncompletedTargets; this.rollbackStatus = rollbackStatus; this.recoveryRequired = recoveryRequired; - this.recoveryInstructions = recoveryRequired - ? `Restore the managed backup at ${backupDir}, inspect the pending transaction journal, then retry.` - : "No manual recovery is required. Inspect the original error, correct its cause, and retry."; + this.recoveryInstructions = recoveryInstructions; } } @@ -132,23 +138,6 @@ async function prepareStorage({ codexHome: explicitCodexHome, sqliteHome, config return withStateDbLocation(layout, await detectStateDb(layout)); } -function formatCounts(counts) { - return Object.entries(counts ?? {}) - .map(([provider, count]) => `${provider}: ${count}`) - .join(", ") || "(none)"; -} - -function formatBytes(bytes) { - const units = ["B", "KB", "MB", "GB", "TB"]; - let value = bytes; - let unitIndex = 0; - while (value >= 1024 && unitIndex < units.length - 1) { - value /= 1024; - unitIndex += 1; - } - return unitIndex === 0 ? `${bytes} B` : `${value.toFixed(value >= 10 ? 1 : 2).replace(/\.0$/, "")} ${units[unitIndex]}`; -} - function emitProgress(onProgress, event) { if (typeof onProgress !== "function") { return; @@ -329,82 +318,7 @@ export async function getStatus({ }; } -export function renderStatus(status) { - const lines = [ - `Codex home: ${status.codexHome}`, - `SQLite home: ${status.sqliteHome} (source: ${status.sqliteHomeSource})`, - `Current provider: ${status.currentProvider}${status.currentProviderImplicit ? " (implicit default)" : ""}`, - `Configured providers: ${status.configuredProviders.join(", ")}`, - `Backups: ${status.backupSummary.count} (${formatBytes(status.backupSummary.totalBytes)})`, - `Backup root: ${status.backupRoot}` - ]; - - if (status.pendingTransactions?.length) { - lines.push(""); - lines.push("Recovery required:"); - for (const transaction of status.pendingTransactions) { - lines.push(` ${transaction.state}: ${transaction.backupDir}`); - } - lines.push(" Run restore with the listed backup before the next write operation."); - } - - lines.push(""); - lines.push("Rollout files:"); - lines.push(` sessions: ${formatCounts(status.rolloutCounts.sessions)}`); - lines.push(` archived_sessions: ${formatCounts(status.rolloutCounts.archived_sessions)}`); - if (status.encryptedContentCounts) { - lines.push(` encrypted_content sessions: ${formatCounts(status.encryptedContentCounts.sessions)}`); - lines.push(` encrypted_content archived_sessions: ${formatCounts(status.encryptedContentCounts.archived_sessions)}`); - } - if (status.encryptedContentWarning) { - lines.push(` ${status.encryptedContentWarning}`); - } - if (status.lockedRolloutFiles?.length) { - lines.push(` Locked rollout files skipped during status scan: ${status.lockedRolloutFiles.length}`); - } - - lines.push(""); - lines.push("SQLite state:"); - if (!status.sqliteAccess?.supported) { - lines.push(` ${status.sqliteAccess.message}`); - return lines.join("\n"); - } - if (status.stateDbLocation) { - const legacyNote = status.stateDbLocation.source === "legacy-root" ? " (legacy root)" : ""; - lines.push(` database: ${status.stateDbLocation.path}${legacyNote}`); - } else { - lines.push(` database: not found (checked ${status.checkedStateDbPaths.join(", ")})`); - } - if (status.sqliteCounts?.unreadable) { - lines.push(` ${status.sqliteCounts.error ?? "state_5.sqlite is malformed or unreadable"}`); - } else if (!status.sqliteCounts) { - lines.push(" state_5.sqlite not found"); - } else { - lines.push(` sessions: ${formatCounts(status.sqliteCounts.sessions)}`); - lines.push(` archived_sessions: ${formatCounts(status.sqliteCounts.archived_sessions)}`); - if (status.sqliteRepairStats?.userEventRowsNeedingRepair) { - lines.push(` user-event flags needing repair: ${status.sqliteRepairStats.userEventRowsNeedingRepair}`); - } - if (status.sqliteRepairStats?.cwdRowsNeedingRepair) { - lines.push(` cwd paths needing repair: ${status.sqliteRepairStats.cwdRowsNeedingRepair}`); - } - } - - if (status.projectThreadVisibility?.length) { - lines.push(""); - lines.push("Project visibility:"); - for (const project of status.projectThreadVisibility) { - const providers = formatCounts(project.providerCounts); - const rankText = project.rankPreview || "(none)"; - lines.push( - ` ${project.root}: interactive ${project.interactiveThreads}, first page ${project.firstPageThreads}/50, ranks ${rankText}, exact cwd ${project.exactCwdMatches}/${project.interactiveThreads}, verbatim cwd ${project.verbatimCwdRows}, providers ${providers}` - ); - } - } - - return lines.join("\n"); -} - +/** @deprecated Compatibility adapter. New transports must use prepareSync/applySync once available. */ export async function runSync(options = {}) { return runSyncCore(options); } @@ -425,7 +339,10 @@ async function runSyncCore({ signal } = {}, { afterBackup } = {}) { if (!Number.isInteger(keepCount) || keepCount < 1) { - throw new Error(`Invalid automatic keep count: ${keepCount}. Expected an integer greater than or equal to 1.`); + throw new CoreError( + "INVALID_INPUT", + `Invalid automatic keep count: ${keepCount}. Expected an integer greater than or equal to 1.` + ); } const codexHome = providedStorage?.codexHome ?? normalizeCodexHome(explicitCodexHome); @@ -439,10 +356,16 @@ async function runSyncCore({ throwIfAborted(signal); const configText = await readConfigText(configPath); if (expectedConfigText !== undefined && configText !== expectedConfigText) { - throw new Error("config.toml changed after the operation was confirmed. Refresh and retry."); + throw new CoreError( + "PLAN_STALE", + "config.toml changed after the operation was confirmed. Refresh and retry." + ); } if (configBackupText !== undefined && configText !== configBackupText) { - throw new Error("config.toml changed before the switch operation acquired its lock. Refresh and retry."); + throw new CoreError( + "PLAN_STALE", + "config.toml changed before the switch operation acquired its lock. Refresh and retry." + ); } const storage = await prepareStorage({ codexHome, sqliteHome, configText, storage: providedStorage, platform }); assertSqliteAccessSupported(storage, "sync"); @@ -871,6 +794,7 @@ async function runSyncCore({ } } +/** @deprecated Compatibility adapter. New transports must use prepareSwitch/applySwitch once available. */ export async function runSwitch({ codexHome: explicitCodexHome, sqliteHome, @@ -886,14 +810,20 @@ export async function runSwitch({ signal }) { if (!provider) { - throw new Error("Missing provider id. Usage: codex-provider switch "); + throw new CoreError( + "INVALID_INPUT", + "Missing provider id. Usage: codex-provider switch " + ); } const codexHome = providedStorage?.codexHome ?? normalizeCodexHome(explicitCodexHome); const configPath = path.join(codexHome, "config.toml"); const originalConfigText = await readConfigText(configPath); if (expectedConfigText !== undefined && originalConfigText !== expectedConfigText) { - throw new Error("config.toml changed after the operation was confirmed. Refresh and retry."); + throw new CoreError( + "PLAN_STALE", + "config.toml changed after the operation was confirmed. Refresh and retry." + ); } const storage = await prepareStorage({ codexHome, sqliteHome, configText: originalConfigText, storage: providedStorage, platform }); assertSqliteAccessSupported(storage, "switch"); @@ -901,11 +831,14 @@ export async function runSwitch({ throw missingConfiguredStateDbError(storage); } if (!configDeclaresProvider(originalConfigText, provider)) { - throw new Error(`Provider "${provider}" is not available in config.toml. Configure it first or use one of: ${listConfiguredProviderIds(originalConfigText).join(", ")}`); + throw new CoreError( + "INVALID_INPUT", + `Provider "${provider}" is not available in config.toml. Configure it first or use one of: ${listConfiguredProviderIds(originalConfigText).join(", ")}` + ); } if (model !== undefined && model !== null && keepRootModel) { - throw new Error("--model and --keep-root-model are mutually exclusive. Pick one."); + throw new CoreError("INVALID_INPUT", "--model and --keep-root-model are mutually exclusive. Pick one."); } let nextConfigText = setRootProviderInConfigText(originalConfigText, provider); @@ -913,7 +846,10 @@ export async function runSwitch({ if (model !== undefined && model !== null) { if (typeof model !== "string" || model.length === 0) { - throw new Error(`Invalid --model value: ${model}. Expected a non-empty string.`); + throw new CoreError( + "INVALID_INPUT", + `Invalid --model value: ${model}. Expected a non-empty string.` + ); } nextConfigText = setRootModelInConfigText(nextConfigText, model); modelSync = { applied: true, source: "explicit", model, warning: null }; @@ -975,6 +911,7 @@ export async function runSwitch({ }; } +/** @deprecated Compatibility adapter. New transports must use prepareRestore/applyRestore once available. */ export async function runRestore({ codexHome: explicitCodexHome, sqliteHome, @@ -989,17 +926,26 @@ export async function runRestore({ faultInjector }) { if (!backupDir) { - throw new Error("Missing backup path. Usage: codex-provider restore "); + throw new CoreError( + "INVALID_INPUT", + "Missing backup path. Usage: codex-provider restore " + ); } const codexHome = providedStorage?.codexHome ?? normalizeCodexHome(explicitCodexHome); if (allowSqliteHomeRelocation && !(typeof sqliteHome === "string" && sqliteHome.trim())) { - throw new Error("--allow-sqlite-home-relocation requires an explicit --sqlite-home path."); + throw new CoreError( + "INVALID_INPUT", + "--allow-sqlite-home-relocation requires an explicit --sqlite-home path." + ); } const releaseLock = await acquireLock(codexHome, "restore"); try { const configText = await readConfigText(path.join(codexHome, "config.toml")); if (expectedConfigText !== undefined && configText !== expectedConfigText) { - throw new Error("config.toml changed after the operation was confirmed. Refresh and retry."); + throw new CoreError( + "PLAN_STALE", + "config.toml changed after the operation was confirmed. Refresh and retry." + ); } const storage = await prepareStorage({ codexHome, sqliteHome, configText, storage: providedStorage, platform }); assertSqliteAccessSupported(storage, "restore"); @@ -1024,9 +970,16 @@ export async function runRestore({ try { conservativeCoverage = await getBackupRecoveryCoverage(normalizedBackupDir, storage); } catch (coverageError) { - coverageError.code = "RECOVERY_REQUIRED"; - coverageError.backupDir = normalizedBackupDir; - throw coverageError; + const recoveryError = new CoreError( + "RECOVERY_REQUIRED", + coverageError instanceof Error ? coverageError.message : String(coverageError), + { + cause: coverageError instanceof Error ? coverageError : undefined, + suggestedAction: "Restore the complete transaction-bound backup before retrying." + } + ); + recoveryError.backupDir = normalizedBackupDir; + throw recoveryError; } } const missingKinds = []; @@ -1047,10 +1000,11 @@ export async function runRestore({ missingKinds.push("global state"); } if (missingKinds.length > 0) { - const error = new Error( - `Partial restore would leave a pending transaction unresolved. Include: ${missingKinds.join(", ")}.` + const error = new CoreError( + "RECOVERY_REQUIRED", + `Partial restore would leave a pending transaction unresolved. Include: ${missingKinds.join(", ")}.`, + { suggestedAction: "Include every affected target kind in the explicit recovery restore." } ); - error.code = "RECOVERY_REQUIRED"; error.backupDir = normalizedBackupDir; error.missingRestoreKinds = missingKinds; throw error; @@ -1085,7 +1039,10 @@ export async function runPruneBackups({ keepCount = DEFAULT_BACKUP_RETENTION_COUNT } = {}) { if (!Number.isInteger(keepCount) || keepCount < 0) { - throw new Error(`Invalid keep count: ${keepCount}. Expected a non-negative integer.`); + throw new CoreError( + "INVALID_INPUT", + `Invalid keep count: ${keepCount}. Expected a non-negative integer.` + ); } const codexHome = normalizeCodexHome(explicitCodexHome); diff --git a/src/sqlite-state.js b/src/sqlite-state.js index 513aaf7..c68a7df 100644 --- a/src/sqlite-state.js +++ b/src/sqlite-state.js @@ -3,6 +3,7 @@ import path from "node:path"; import { syncDirectory } from "./atomic-file.js"; import { DB_FILE_BASENAME, SESSION_DIRS, SQLITE_DIR_BASENAME } from "./constants.js"; +import { CoreError } from "./core-error.js"; import { openDatabase } from "./sqlite.js"; import { resolveStorageLayout } from "./storage-layout.js"; @@ -196,25 +197,43 @@ export function configureSqliteWriteDurability(db) { return { synchronous: "full", value: synchronous }; } +function sqlitePrimaryResultCode(error) { + return Number.isInteger(error?.errcode) ? error.errcode & 0xff : null; +} + function isSqliteBusyError(error) { - const message = `${error?.code ?? ""} ${error?.message ?? ""}`.toLowerCase(); - return message.includes("database is locked") || message.includes("sqlite_busy") || message.includes("busy"); + if (error instanceof CoreError) return error.code === "SQLITE_BUSY"; + const primaryCode = sqlitePrimaryResultCode(error); + return error?.code === "SQLITE_BUSY" + || error?.code === "SQLITE_LOCKED" + || (error?.code === "ERR_SQLITE_ERROR" && (primaryCode === 5 || primaryCode === 6)); } function isSqliteMalformedError(error) { - const message = `${error?.code ?? ""} ${error?.message ?? ""}`.toLowerCase(); - return message.includes("database disk image is malformed") - || message.includes("sqlite_corrupt") - || message.includes("malformed") - || message.includes("not a database"); + if (error instanceof CoreError) return error.code === "SQLITE_UNREADABLE"; + const primaryCode = sqlitePrimaryResultCode(error); + return error?.code === "SQLITE_CORRUPT" + || error?.code === "SQLITE_NOTADB" + || (error?.code === "ERR_SQLITE_ERROR" && (primaryCode === 11 || primaryCode === 26)); +} + +function sqliteErrorDetails(error) { + const primaryCode = sqlitePrimaryResultCode(error); + return { + ...(typeof error?.code === "string" ? { causeCode: error.code } : {}), + ...(primaryCode !== null ? { sqlitePrimaryCode: primaryCode } : {}) + }; } export function wrapSqliteBusyError(error, action) { if (!isSqliteBusyError(error)) { return error; } - return new Error( - `Unable to ${action} because state_5.sqlite is currently in use. Close Codex and the Codex app, then retry. Original error: ${error.message}` + if (error instanceof CoreError) return error; + return new CoreError( + "SQLITE_BUSY", + `Unable to ${action} because state_5.sqlite is currently in use. Close Codex and the Codex app, then retry. Original error: ${error.message}`, + { cause: error, details: sqliteErrorDetails(error) } ); } @@ -222,8 +241,11 @@ export function wrapSqliteMalformedError(error, action) { if (!isSqliteMalformedError(error)) { return error; } - return new Error( - `Unable to ${action} because state_5.sqlite is malformed or unreadable. Close Codex, back up or repair the database, then retry. Original error: ${error.message}` + if (error instanceof CoreError) return error; + return new CoreError( + "SQLITE_UNREADABLE", + `Unable to ${action} because state_5.sqlite is malformed or unreadable. Close Codex, back up or repair the database, then retry. Original error: ${error.message}`, + { cause: error, details: sqliteErrorDetails(error) } ); } diff --git a/src/storage-layout.js b/src/storage-layout.js index c1eba31..2845840 100644 --- a/src/storage-layout.js +++ b/src/storage-layout.js @@ -2,6 +2,7 @@ import fs from "node:fs/promises"; import path from "node:path"; import { DB_FILE_BASENAME, defaultCodexHome } from "./constants.js"; +import { CoreError } from "./core-error.js"; import { readSqliteHomeFromConfigText } from "./config-file.js"; function resolvePath(value, cwd) { @@ -82,8 +83,18 @@ export function resolveStorageLayout({ } export async function ensureCodexHome(storage) { - await fs.access(storage.codexHome).catch(() => { - throw new Error(`Codex home not found at ${storage.codexHome}`); + await fs.access(storage.codexHome).catch((error) => { + const permissionDenied = error?.code === "EACCES" || error?.code === "EPERM"; + throw new CoreError( + permissionDenied ? "PERMISSION_DENIED" : "CODEX_HOME_NOT_FOUND", + permissionDenied + ? `Permission denied while accessing Codex home at ${storage.codexHome}` + : `Codex home not found at ${storage.codexHome}`, + { + cause: error, + details: typeof error?.code === "string" ? { causeCode: error.code } : undefined + } + ); }); } @@ -97,12 +108,16 @@ export function isConfiguredSqliteHome(storage) { export function assertSqliteAccessSupported(storage, operation) { if (storage.sqliteAccess?.supported === false) { - throw new Error(`Cannot ${operation}: ${storage.sqliteAccess.message}`); + throw new CoreError("SQLITE_UNSUPPORTED_PATH", `Cannot ${operation}: ${storage.sqliteAccess.message}`, { + details: storage.sqliteAccess.reason ? { reason: storage.sqliteAccess.reason } : undefined + }); } } export function missingConfiguredStateDbError(storage) { - return new Error( - `state_5.sqlite not found in configured SQLite home ${storage.sqliteHome} (source: ${storage.sqliteHomeSource}).` + return new CoreError( + "STATE_DB_NOT_FOUND", + `state_5.sqlite not found in configured SQLite home ${storage.sqliteHome} (source: ${storage.sqliteHomeSource}).`, + { details: { sqliteHomeSource: storage.sqliteHomeSource } } ); } diff --git a/src/transaction-journal.js b/src/transaction-journal.js index 65ee655..70c6104 100644 --- a/src/transaction-journal.js +++ b/src/transaction-journal.js @@ -4,6 +4,7 @@ import { randomUUID } from "node:crypto"; import { defaultBackupRoot } from "./constants.js"; import { writeFileAtomic, syncDirectory } from "./atomic-file.js"; +import { CoreError } from "./core-error.js"; export const TRANSACTION_JOURNAL_BASENAME = "transaction-journal.jsonl"; const TERMINAL_STATES = new Set(["committed", "rolledBack"]); @@ -386,12 +387,15 @@ export async function findPendingTransactions(codexHome) { return pending.sort((left, right) => left.filePath.localeCompare(right.filePath)); } -export class RecoveryRequiredError extends Error { +export class RecoveryRequiredError extends CoreError { constructor(pendingTransactions) { const backups = pendingTransactions.map((item) => item.backupDir).join(", "); - super(`An unfinished provider-sync transaction requires recovery before another write. Restore the bound backup, then retry. Backup(s): ${backups}`); + super( + "RECOVERY_REQUIRED", + `An unfinished provider-sync transaction requires recovery before another write. Restore the bound backup, then retry. Backup(s): ${backups}`, + { suggestedAction: "Restore the transaction-bound managed backup before starting another write." } + ); this.name = "RecoveryRequiredError"; - this.code = "RECOVERY_REQUIRED"; this.pendingTransactions = pendingTransactions; } } diff --git a/src/watch.js b/src/watch.js index 5265b5a..7539545 100644 --- a/src/watch.js +++ b/src/watch.js @@ -14,6 +14,7 @@ import fs from "node:fs"; import fsp from "node:fs/promises"; import path from "node:path"; +import { CoreError } from "./core-error.js"; import { detectStateDb } from "./sqlite-state.js"; import { readConfigText, readRootModelFromConfigText } from "./config-file.js"; import { @@ -53,6 +54,7 @@ function makeDebouncer(delayMs, run) { }; } +/** @deprecated Compatibility adapter. New transports must use startWatch/stopWatch/getWatchStatus once available. */ export async function runWatch({ codexHome: explicitCodexHome, sqliteHome: explicitSqliteHome, @@ -65,19 +67,40 @@ export async function runWatch({ runSyncImpl, signal, sleepImpl, - platform + platform, + accessImpl = fsp.access } = {}) { if (!Number.isInteger(debounceMs) || debounceMs < 0) { - throw new Error(`Invalid --debounce-ms value: ${debounceMs}. Expected a non-negative integer.`); + throw new CoreError( + "INVALID_INPUT", + `Invalid --debounce-ms value: ${debounceMs}. Expected a non-negative integer.` + ); } const codexHome = normalizeCodexHome(explicitCodexHome); const configPath = path.join(codexHome, "config.toml"); - await fsp.access(codexHome).catch(() => { - throw new Error(`Codex home not found at ${codexHome}`); + await accessImpl(codexHome).catch((error) => { + if (error?.code === "EACCES" || error?.code === "EPERM") { + throw new CoreError("PERMISSION_DENIED", `Permission denied while accessing Codex home at ${codexHome}.`, { + cause: error, + details: { causeCode: error.code } + }); + } + throw new CoreError("CODEX_HOME_NOT_FOUND", `Codex home not found at ${codexHome}`, { + cause: error + }); }); - await fsp.access(configPath).catch(() => { - throw new Error(`config.toml not found at ${configPath}`); + await accessImpl(configPath).catch((error) => { + if (error?.code === "EACCES" || error?.code === "EPERM") { + throw new CoreError("PERMISSION_DENIED", `Permission denied while accessing ${configPath}.`, { + cause: error, + details: { causeCode: error.code } + }); + } + throw new CoreError("CODEX_HOME_NOT_FOUND", `config.toml not found at ${configPath}`, { + cause: error, + details: { missing: "config.toml" } + }); }); const log = (message) => { @@ -120,8 +143,8 @@ export async function runWatch({ if (typeof runSyncImpl === "function") { return runSyncImpl({ codexHome, sqliteHome: storage.sqliteHome, storage, reason, model: rootModel }); } - // Lazy import to avoid pulling in the full service module until needed. - const { runSync } = await import("./service.js"); + // Lazy import to avoid pulling in the public Core boundary until needed. + const { runSync } = await import("./public-api.js"); return runSync({ codexHome, storage, @@ -197,7 +220,9 @@ export async function runWatch({ const message = error instanceof Error ? error.message : String(error); // SQLite being in use is a normal transient condition while Codex // is actively writing. Don't crash; just retry on the next event. - if (/state_5\.sqlite is currently in use/i.test(message)) { + const isTypedSqliteBusy = error?.code === "SQLITE_BUSY"; + const isLegacySqliteBusy = !error?.code && /state_5\.sqlite is currently in use/i.test(message); + if (isTypedSqliteBusy || isLegacySqliteBusy) { log(`[${new Date().toISOString()}] Sync skipped: ${message} (will retry on next change)`); // Busy is normal — reset the consecutive-failure counter // so a long-running Codex session that keeps the DB open diff --git a/src/web-server.js b/src/web-server.js index 9bf5d55..3e793e1 100644 --- a/src/web-server.js +++ b/src/web-server.js @@ -5,13 +5,25 @@ import path from "node:path"; import { spawn } from "node:child_process"; import { fileURLToPath } from "node:url"; -import { listBackups } from "./backup.js"; -import { readConfigText, readRootModelFromConfigText } from "./config-file.js"; import { defaultCodexHome } from "./constants.js"; -import { getHistorySession, listHistory } from "./history.js"; -import { getStatus, runPruneBackups, runRestore, runSwitch, runSync } from "./service.js"; -import { detectStateDb } from "./sqlite-state.js"; -import { ensureCodexHome, resolveStorageLayout, withStateDbLocation } from "./storage-layout.js"; +import { + CoreError, + detectStateDb, + ensureCodexHome, + getHistorySession, + getStatus, + listBackups, + listHistory, + readConfigText, + readRootModelFromConfigText, + resolveStorageLayout, + runPruneBackups, + runRestore, + runSwitch, + runSync, + toCoreErrorDto, + withStateDbLocation +} from "./public-api.js"; import { createMemoryWebUiState, ProfileRevisionConflictError, WebUiStateStore } from "./web-state.js"; const DEFAULT_PORT = 8791; @@ -53,7 +65,11 @@ function sendJson(response, statusCode, value) { function sendError(response, statusCode, error, code) { const message = error instanceof Error ? error.message : String(error); - sendJson(response, statusCode, { error: message, ...(code ? { code } : {}) }); + sendJson(response, statusCode, { + error: message, + ...(code ? { code } : {}), + ...(error instanceof CoreError ? { coreError: toCoreErrorDto(error) } : {}) + }); } async function readJsonBody(request) { @@ -546,7 +562,11 @@ export function createWebUiServer({ const assertWebOperationStorage = (storage, operation) => { if (storage.sqliteAccess.supported === false) { - throw new Error(`Cannot ${operation}: ${storage.sqliteAccess.message}`); + throw new CoreError( + "SQLITE_UNSUPPORTED_PATH", + `Cannot ${operation}: ${storage.sqliteAccess.message}`, + { details: storage.sqliteAccess.reason ? { reason: storage.sqliteAccess.reason } : undefined } + ); } return storage; }; diff --git a/test/core-error.test.js b/test/core-error.test.js new file mode 100644 index 0000000..7e74dd3 --- /dev/null +++ b/test/core-error.test.js @@ -0,0 +1,130 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { CORE_ERROR_CODES, CoreError, toCoreErrorDto } from "../src/core-error.js"; + +test("CoreError exposes the canonical serializable DTO shape", () => { + const error = new CoreError("STALE_STATE", "The prepared state changed.", { + operationId: "operation-1", + details: { reason: "rollout", revision: 4 }, + suggestedAction: "Prepare the operation again." + }); + + assert.deepEqual(error.toDto(), { + code: "STALE_STATE", + message: "The prepared state changed.", + severity: "warning", + retryable: true, + recoveryRequired: false, + operationId: "operation-1", + details: { reason: "rollout", revision: 4 }, + suggestedAction: "Prepare the operation again." + }); + assert.doesNotThrow(() => JSON.stringify(error.toDto())); + assert.equal(Object.hasOwn(error.toDto(), "stack"), false); + assert.equal(Object.hasOwn(error.toDto(), "cause"), false); +}); + +test("the C1 canonical code set includes expiry, stale state, and unverifiable locks", () => { + assert.ok(CORE_ERROR_CODES.includes("PLAN_EXPIRED")); + assert.ok(CORE_ERROR_CODES.includes("STALE_STATE")); + assert.ok(CORE_ERROR_CODES.includes("LOCK_UNVERIFIABLE")); + assert.ok(Object.isFrozen(CORE_ERROR_CODES)); +}); + +test("scoped lock errors require an explicit trusted resource scope", () => { + assert.throws( + () => new CoreError("OPERATION_BUSY", "busy"), + /details\.busyScope/ + ); + assert.throws( + () => new CoreError("OPERATION_BUSY", "busy", { details: { busyScope: "unknown" } }), + /details\.busyScope/ + ); + assert.throws( + () => new CoreError("LOCK_UNVERIFIABLE", "uncertain"), + /details\.lockScope/ + ); + + assert.equal( + new CoreError("OPERATION_BUSY", "busy", { details: { busyScope: "state-db" } }).toDto().details.busyScope, + "state-db" + ); + assert.equal( + new CoreError("LOCK_UNVERIFIABLE", "uncertain", { details: { lockScope: "codex-home" } }).toDto().details.lockScope, + "codex-home" + ); +}); + +test("unknown exceptions become INTERNAL_ERROR without copying arbitrary properties", () => { + const error = new Error("unexpected failure"); + error.code = "EUNEXPECTED"; + error.authToken = "must-not-be-copied"; + error.details = { messageBody: "must-not-be-copied" }; + + const dto = toCoreErrorDto(error); + assert.deepEqual(dto, { + code: "INTERNAL_ERROR", + message: "unexpected failure", + severity: "fatal", + retryable: false, + recoveryRequired: false, + details: { causeCode: "EUNEXPECTED" } + }); + assert.doesNotMatch(JSON.stringify(dto), /must-not-be-copied/); +}); + +test("canonical-looking plain errors cannot inject transport details", () => { + const error = new Error("recovery failed"); + error.code = "RECOVERY_REQUIRED"; + error.operationId = "untrusted-operation"; + error.recoveryRequired = false; + error.details = { + authToken: "must-not-be-copied", + messageBody: "must-not-be-copied" + }; + + const dto = toCoreErrorDto(error); + assert.deepEqual(dto, { + code: "RECOVERY_REQUIRED", + message: "recovery failed", + severity: "error", + retryable: true, + recoveryRequired: true + }); + assert.doesNotMatch(JSON.stringify(dto), /must-not-be-copied|untrusted-operation/); +}); + +test("CoreError recursively freezes its normalized details", () => { + const input = { nested: { values: ["safe"] } }; + const error = new CoreError("STALE_STATE", "state changed", { details: input }); + + assert.notEqual(error.details, input); + assert.ok(Object.isFrozen(error.details)); + assert.ok(Object.isFrozen(error.details.nested)); + assert.ok(Object.isFrozen(error.details.nested.values)); + assert.throws(() => error.details.nested.values.push("changed"), TypeError); + assert.deepEqual(error.toDto().details, { nested: { values: ["safe"] } }); +}); + +test("typed legacy cancellation and permission errors map without parsing messages", () => { + const cancelled = new Error("localized cancellation text"); + cancelled.name = "AbortError"; + cancelled.code = "ABORT_ERR"; + assert.equal(toCoreErrorDto(cancelled).code, "OPERATION_CANCELLED"); + + const permission = new Error("localized permission text"); + permission.code = "EACCES"; + const dto = toCoreErrorDto(permission); + assert.equal(dto.code, "PERMISSION_DENIED"); + assert.deepEqual(dto.details, { causeCode: "EACCES" }); +}); + +test("malformed structured errors fail closed as INTERNAL_ERROR during DTO conversion", () => { + const malformed = new Error("busy without a trusted scope"); + malformed.code = "OPERATION_BUSY"; + + const dto = toCoreErrorDto(malformed); + assert.equal(dto.code, "INTERNAL_ERROR"); + assert.deepEqual(dto.details, { causeCode: "OPERATION_BUSY" }); +}); diff --git a/test/entrypoint-import-contract.test.js b/test/entrypoint-import-contract.test.js new file mode 100644 index 0000000..fd1fd41 --- /dev/null +++ b/test/entrypoint-import-contract.test.js @@ -0,0 +1,73 @@ +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import path from "node:path"; +import test from "node:test"; +import { fileURLToPath } from "node:url"; + +const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const coreInternalModules = [ + "backup.js", + "config-file.js", + "core-error.js", + "history.js", + "service.js", + "sqlite-state.js", + "storage-layout.js" +]; + +async function readRepositoryFile(relativePath) { + return fs.readFile(path.join(repositoryRoot, relativePath), "utf8"); +} + +function assertNoDeepCoreImports(source, filePath) { + for (const internalModule of coreInternalModules) { + assert.doesNotMatch( + source, + new RegExp("(?:from|import)\\s*\\(?[\\\"'][^\\\"']*" + internalModule.replace(".", "\\.") + "[\\\"']"), + filePath + " must use src/public-api.js instead of " + internalModule + ); + } +} + +async function collectDesktopEntryPoints(relativeDirectory) { + const absoluteDirectory = path.join(repositoryRoot, relativeDirectory); + let entries; + try { + entries = await fs.readdir(absoluteDirectory, { withFileTypes: true }); + } catch (error) { + if (error?.code === "ENOENT") return []; + throw error; + } + + const files = []; + for (const entry of entries) { + const relativePath = path.join(relativeDirectory, entry.name); + if (entry.isDirectory()) { + files.push(...await collectDesktopEntryPoints(relativePath)); + } else if (/\.(?:[cm]?js|tsx?)$/.test(entry.name)) { + files.push(relativePath); + } + } + return files; +} + +test("CLI and Web entry points import Core behavior only through the public API", async () => { + for (const entryPoint of ["src/cli.js", "src/web-server.js"]) { + const source = await readRepositoryFile(entryPoint); + assert.match(source, /["']\.\/public-api\.js["']/); + assertNoDeepCoreImports(source, entryPoint); + } +}); + +test("watch lazy-loads sync through the public API", async () => { + const source = await readRepositoryFile("src/watch.js"); + assert.match(source, /import\(["']\.\/public-api\.js["']\)/); + assert.doesNotMatch(source, /import\(["']\.\/service\.js["']\)/); +}); + +test("present and future desktop entry points do not deep-import Core internals", async () => { + const desktopFiles = await collectDesktopEntryPoints("apps/desktop"); + for (const entryPoint of desktopFiles) { + assertNoDeepCoreImports(await readRepositoryFile(entryPoint), entryPoint); + } +}); diff --git a/test/history.test.js b/test/history.test.js index 85ae837..bfe4bf2 100644 --- a/test/history.test.js +++ b/test/history.test.js @@ -6,6 +6,21 @@ import test from "node:test"; import { getHistorySession, listHistory } from "../src/history.js"; +test("history public inputs fail with typed invalid-input errors", async () => { + await assert.rejects( + () => listHistory("unused", { page: 0 }), + (error) => error?.code === "INVALID_INPUT" && /page must/.test(error.message) + ); + await assert.rejects( + () => listHistory("unused", { archived: "unknown" }), + (error) => error?.code === "INVALID_INPUT" && /archived must/.test(error.message) + ); + await assert.rejects( + () => getHistorySession("unused", ""), + (error) => error?.code === "INVALID_INPUT" && /sessionId is required/.test(error.message) + ); +}); + async function fixture() { const home = await fs.mkdtemp(path.join(os.tmpdir(), "codex-history-")); const file = path.join(home, "sessions", "2026", "08", "04", "rollout-one.jsonl"); diff --git a/test/locking.test.js b/test/locking.test.js index 16e3e55..7e4c15c 100644 --- a/test/locking.test.js +++ b/test/locking.test.js @@ -66,7 +66,12 @@ test("acquireLock publishes a complete versioned owner and holds a unique claim" assert.equal(typeof owner.instanceId, "string"); assert.deepEqual(await fs.readdir(claimsDir), [`${owner.instanceId}.json`]); - await assert.rejects(acquireLock(codexHome, "other", lockOptions()), /live claim|Lock already exists/); + await assert.rejects( + acquireLock(codexHome, "other", lockOptions()), + (error) => error?.code === "OPERATION_BUSY" + && error.details?.busyScope === "codex-home" + && /live claim|Lock already exists/.test(error.message) + ); await release(); await assert.rejects(fs.access(lockDir), { code: "ENOENT" }); assert.deepEqual(await fs.readdir(claimsDir), []); @@ -106,6 +111,30 @@ test("acquireLock retries transient candidate creation failures", async (t) => { await release(); }); +test("lock storage permission failures are typed before ownership is published", async (t) => { + const codexHome = await makeLockHome(t); + const fsImpl = new Proxy(fs, { + get(target, property) { + if (property === "mkdir") { + return async () => { + const error = new Error("permission denied fixture"); + error.code = "EACCES"; + throw error; + }; + } + const value = target[property]; + return typeof value === "function" ? value.bind(target) : value; + } + }); + + await assert.rejects( + acquireLock(codexHome, "sync", lockOptions({ fsImpl })), + (error) => error?.code === "PERMISSION_DENIED" + && error.details?.lockScope === "codex-home" + && error.details?.causeCode === "EACCES" + ); +}); + test("owner publication failure removes its empty canonical reservation and claim", async (t) => { const codexHome = await makeLockHome(t); const lockDir = path.join(codexHome, "tmp", DEFAULT_LOCK_NAME); @@ -215,7 +244,9 @@ test("link failure does not remove a swapped empty reservation and still release await assert.rejects( acquireLock(codexHome, "sync", lockOptions({ fsImpl })), - /cleanup was incomplete/ + (error) => error?.code === "LOCK_UNVERIFIABLE" + && error.details?.lockScope === "codex-home" + && /cleanup was incomplete/.test(error.message) ); assert.equal((await fs.lstat(lockDir)).isDirectory(), true); assert.equal((await fs.lstat(displacedReservation)).isDirectory(), true); @@ -225,10 +256,17 @@ test("link failure does not remove a swapped empty reservation and still release test("acquirePathLock supports an arbitrary future SQLite resource path", async (t) => { const root = await makeLockHome(t); const lockPath = path.join(root, "resource-locks", "state-db.lock"); - const release = await acquirePathLock(lockPath, "sqlite-resource", lockOptions()); + const resourceOptions = lockOptions({ scope: "state-db" }); + const release = await acquirePathLock(lockPath, "sqlite-resource", resourceOptions); const owner = JSON.parse(await fs.readFile(path.join(lockPath, "owner.json"), "utf8")); assert.equal(owner.label, "sqlite-resource"); + assert.equal(owner.scope, "state-db"); assert.deepEqual(await fs.readdir(`${lockPath}.claims`), [`${owner.instanceId}.json`]); + await assert.rejects( + acquirePathLock(lockPath, "sqlite-resource-2", resourceOptions), + (error) => error?.code === "OPERATION_BUSY" + && error.details?.busyScope === "state-db" + ); await release(); await assert.rejects(fs.access(lockPath), { code: "ENOENT" }); }); @@ -240,8 +278,10 @@ test("acquirePathLock rejects a canonical file with an explicit diagnostic", asy await fs.writeFile(lockPath, "foreign", "utf8"); await assert.rejects( - acquirePathLock(lockPath, "sqlite-resource", lockOptions()), - /canonical lock path is not a directory/ + acquirePathLock(lockPath, "sqlite-resource", lockOptions({ scope: "state-db" })), + (error) => error?.code === "LOCK_UNVERIFIABLE" + && error.details?.lockScope === "state-db" + && /canonical lock path is not a directory/.test(error.message) ); assert.equal(await fs.readFile(lockPath, "utf8"), "foreign"); assert.deepEqual(await fs.readdir(`${lockPath}.claims`), []); @@ -312,6 +352,38 @@ test("acquireLock recognizes a live version 2 .NET owner from UTC-second identit assert.deepEqual(await fs.readdir(`${lockDir}.claims`), []); }); +test("cross-runtime start-time uncertainty is LOCK_UNVERIFIABLE, not OPERATION_BUSY", async (t) => { + const codexHome = await makeLockHome(t); + let startTimeProbeCount = 0; + const lockDir = await writeCanonicalOwner(codexHome, { + protocolVersion: 2, + runtime: "dotnet", + pid: process.pid, + processId: process.pid, + processStartedAt: TEST_STARTED_AT, + instanceId: "dotnet-v2-unverifiable", + startedAt: TEST_STARTED_AT, + label: "dotnet", + cwd: codexHome + }); + + await assert.rejects( + acquireLock(codexHome, "node", lockOptions({ + getProcessStartedAtIdentity: async () => { + startTimeProbeCount += 1; + if (startTimeProbeCount === 1) { + return TEST_STARTED_AT; + } + throw new Error("injected cross-runtime identity failure"); + } + })), + (error) => error?.code === "LOCK_UNVERIFIABLE" + && error.details?.lockScope === "codex-home" + && /could not be verified/.test(error.message) + ); + assert.deepEqual(await fs.readdir(`${lockDir}.claims`), []); +}); + test("same-second PID reuse is rejected by the exact Node start marker", async (t) => { const codexHome = await makeLockHome(t); const lockDir = await writeCanonicalOwner(codexHome, { @@ -571,7 +643,9 @@ test("acquireLock fails closed while a legacy canonical owner is missing", async await fs.mkdir(lockDir, { recursive: true }); await assert.rejects( acquireLock(codexHome, "sync", lockOptions()), - /owner\.json is not visible yet/ + (error) => error?.code === "LOCK_UNVERIFIABLE" + && error.details?.lockScope === "codex-home" + && /owner\.json is not visible yet/.test(error.message) ); assert.deepEqual(await fs.readdir(`${lockDir}.claims`), []); }); @@ -604,7 +678,12 @@ test("acquireLock fails closed for future protocols and conflicting cross-runtim await t.test(fixture.name, async (subtest) => { const codexHome = await makeLockHome(subtest); const lockDir = await writeCanonicalOwner(codexHome, fixture.owner); - await assert.rejects(acquireLock(codexHome, "sync", lockOptions()), fixture.expected); + await assert.rejects( + acquireLock(codexHome, "sync", lockOptions()), + (error) => error?.code === "LOCK_UNVERIFIABLE" + && error.details?.lockScope === "codex-home" + && fixture.expected.test(error.message) + ); assert.deepEqual(await fs.readdir(`${lockDir}.claims`), []); assert.deepEqual( JSON.parse(await fs.readFile(path.join(lockDir, "owner.json"), "utf8")), diff --git a/test/public-api-contract.test.js b/test/public-api-contract.test.js new file mode 100644 index 0000000..0a3a99e --- /dev/null +++ b/test/public-api-contract.test.js @@ -0,0 +1,53 @@ +import assert from "node:assert/strict"; +import path from "node:path"; +import test from "node:test"; + +import * as publicApi from "../src/public-api.js"; + +const EXPECTED_EXPORTS = [ + "CORE_ERROR_CODES", + "CoreError", + "detectStateDb", + "ensureCodexHome", + "getHistorySession", + "getStatus", + "listBackups", + "listHistory", + "readConfigText", + "readRootModelFromConfigText", + "resolveStorageLayout", + "runPruneBackups", + "runRestore", + "runSwitch", + "runSync", + "runWatch", + "toCoreErrorDto", + "withStateDbLocation" +]; + +test("public Core API has the exact C1 export surface", () => { + assert.deepEqual(Object.keys(publicApi).sort(), EXPECTED_EXPORTS); + for (const name of EXPECTED_EXPORTS) { + if (name !== "CORE_ERROR_CODES") { + assert.equal(typeof publicApi[name], "function", name + " must be callable"); + } + } + assert.ok(Object.isFrozen(publicApi.CORE_ERROR_CODES)); + assert.ok(publicApi.CORE_ERROR_CODES.includes("STALE_STATE")); +}); + +test("public Core helper adapters retain their current callable behavior", () => { + assert.equal( + publicApi.readRootModelFromConfigText( + 'model = "gpt-5"\n[model_providers.example]\nmodel = "ignored"\n' + ), + "gpt-5" + ); + + const layout = publicApi.resolveStorageLayout({ + codexHome: "/tmp/codex-provider-sync-public-api", + configText: "" + }); + assert.equal(layout.codexHome, path.resolve("/tmp/codex-provider-sync-public-api")); + assert.equal(typeof publicApi.withStateDbLocation(layout, null), "object"); +}); diff --git a/test/sqlite-error-contract.test.js b/test/sqlite-error-contract.test.js new file mode 100644 index 0000000..cdb395f --- /dev/null +++ b/test/sqlite-error-contract.test.js @@ -0,0 +1,50 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { CoreError } from "../src/core-error.js"; +import { wrapSqliteBusyError, wrapSqliteMalformedError } from "../src/sqlite-state.js"; + +function sqliteError({ code = "ERR_SQLITE_ERROR", errcode, message = "driver failure" } = {}) { + const error = new Error(message); + error.code = code; + if (errcode !== undefined) error.errcode = errcode; + return error; +} + +test("SQLite driver primary result codes 5 and 6 map to SQLITE_BUSY", () => { + for (const errcode of [5, 6, 261, 262]) { + const error = wrapSqliteBusyError(sqliteError({ errcode }), "write test data"); + assert.ok(error instanceof CoreError); + assert.equal(error.code, "SQLITE_BUSY"); + assert.equal(error.details.sqlitePrimaryCode, errcode & 0xff); + assert.equal(error.cause.errcode, errcode); + } +}); + +test("SQLite driver primary result codes 11 and 26 map to SQLITE_UNREADABLE", () => { + for (const errcode of [11, 26, 267]) { + const error = wrapSqliteMalformedError(sqliteError({ errcode }), "read test data"); + assert.ok(error instanceof CoreError); + assert.equal(error.code, "SQLITE_UNREADABLE"); + assert.equal(error.details.sqlitePrimaryCode, errcode & 0xff); + } +}); + +test("explicit SQLite symbolic codes map without depending on English text", () => { + assert.equal( + wrapSqliteBusyError(sqliteError({ code: "SQLITE_LOCKED", message: "localized" }), "write").code, + "SQLITE_BUSY" + ); + assert.equal( + wrapSqliteMalformedError(sqliteError({ code: "SQLITE_NOTADB", message: "localized" }), "read").code, + "SQLITE_UNREADABLE" + ); +}); + +test("message-only lookalikes are not treated as stable SQLite classifications", () => { + const busyLookalike = new Error("database is locked"); + const malformedLookalike = new Error("file is not a database"); + + assert.equal(wrapSqliteBusyError(busyLookalike, "write"), busyLookalike); + assert.equal(wrapSqliteMalformedError(malformedLookalike, "read"), malformedLookalike); +}); diff --git a/test/sync-service.test.js b/test/sync-service.test.js index b64794a..843f75a 100644 --- a/test/sync-service.test.js +++ b/test/sync-service.test.js @@ -13,7 +13,8 @@ import { restoreBackup, updateSessionBackupManifest } from "../src/backup.js"; -import { getStatus, renderStatus, runRestore, runSwitch, runSync } from "../src/service.js"; +import { getStatus, runPruneBackups, runRestore, runSwitch, runSync } from "../src/service.js"; +import { renderStatus } from "../src/cli-presenter.js"; import { DB_FILE_BASENAME, DEFAULT_BACKUP_RETENTION_COUNT, SQLITE_DIR_BASENAME } from "../src/constants.js"; import { getUnsupportedNodeVersionMessage } from "../src/node-version.js"; import { @@ -31,6 +32,58 @@ import { syncDirectory, writeFileAtomic } from "../src/atomic-file.js"; delete process.env.CODEX_SQLITE_HOME; +test("public write adapters expose typed invalid-input errors", async () => { + const cases = [ + () => runSync({ keepCount: 0 }), + () => runSwitch({}), + () => runRestore({}), + () => runPruneBackups({ keepCount: -1 }) + ]; + + for (const invoke of cases) { + await assert.rejects( + invoke, + (error) => error?.code === "INVALID_INPUT" + && typeof error.toDto === "function" + ); + } +}); + +test("public write adapters expose typed validation and stale-confirmation errors", async () => { + const { codexHome } = await makeTempCodexHome(); + await writeConfig(codexHome); + + await assert.rejects( + () => runSwitch({ codexHome, provider: "apigather", model: "" }), + (error) => error?.code === "INVALID_INPUT" && /Invalid --model value/.test(error.message) + ); + await assert.rejects( + () => runRestore({ + codexHome, + backupDir: path.join(codexHome, "unused-backup"), + allowSqliteHomeRelocation: true + }), + (error) => error?.code === "INVALID_INPUT" + && /requires an explicit --sqlite-home/.test(error.message) + ); + + const staleCalls = [ + () => runSync({ codexHome, expectedConfigText: "stale" }), + () => runSwitch({ codexHome, provider: "apigather", expectedConfigText: "stale" }), + () => runRestore({ + codexHome, + backupDir: path.join(codexHome, "unused-backup"), + expectedConfigText: "stale" + }) + ]; + for (const invoke of staleCalls) { + await assert.rejects( + invoke, + (error) => error?.code === "PLAN_STALE" && typeof error.toDto === "function" + ); + } +}); + test("runSync rolls back the first rollout when a later target fails (#69)", async () => { const { codexHome } = await makeTempCodexHome(); await writeConfig(codexHome, 'model_provider = "openai"'); @@ -1153,6 +1206,7 @@ test("partial restore cannot clear a pending SQLite transaction", async () => { restoreSessions: false }), (error) => error?.code === "RECOVERY_REQUIRED" + && typeof error.toDto === "function" && error.missingRestoreKinds.includes("SQLite database") ); assert.equal(await readProvider(codexHome, "thread-partial-restore"), "openai"); @@ -2448,7 +2502,8 @@ test("runSwitch rejects --model and --keep-root-model together", async () => { await assert.rejects( () => runSwitch({ codexHome, provider: "apigather", model: "X", keepRootModel: true }), - /--model and --keep-root-model are mutually exclusive/ + (error) => error?.code === "INVALID_INPUT" + && /--model and --keep-root-model are mutually exclusive/.test(error.message) ); // Confirm the file on disk was not mutated by the failed call. @@ -3085,7 +3140,8 @@ test("runSwitch rejects unknown custom providers", async () => { await writeConfig(codexHome); await assert.rejects( () => runSwitch({ codexHome, provider: "missing" }), - /Provider "missing" is not available/ + (error) => error?.code === "INVALID_INPUT" + && /Provider "missing" is not available/.test(error.message) ); }); @@ -3937,6 +3993,7 @@ test("runRestore rejects all-disabled recovery when the first journal record is }), (error) => { assert.equal(error.code, "RECOVERY_REQUIRED"); + assert.equal(typeof error.toDto, "function"); assert.deepEqual( new Set(error.missingRestoreKinds), new Set(["rollout sessions", "SQLite database", "config.toml", "global state"]) diff --git a/test/watch.test.js b/test/watch.test.js index 0ec9ec5..46894af 100644 --- a/test/watch.test.js +++ b/test/watch.test.js @@ -49,7 +49,8 @@ test("runWatch rejects invalid debounce-ms values", async () => { const { codexHome } = await makeTempCodexHome(); await assert.rejects( () => runWatch({ codexHome, debounceMs: -1 }), - /Invalid --debounce-ms value/ + (error) => error?.code === "INVALID_INPUT" + && /Invalid --debounce-ms value/.test(error.message) ); await fs.rm(codexHome, { recursive: true, force: true }); }); @@ -58,17 +59,32 @@ test("runWatch rejects when codex home or config.toml is missing", async () => { const root = await fs.mkdtemp(path.join(testTempDir, "codex-provider-sync-watch-")); await assert.rejects( () => runWatch({ codexHome: path.join(root, "does-not-exist") }), - /Codex home not found/ + (error) => error?.code === "CODEX_HOME_NOT_FOUND" + && /Codex home not found/.test(error.message) ); const codexHome = path.join(root, ".codex"); await fs.mkdir(codexHome, { recursive: true }); await assert.rejects( () => runWatch({ codexHome }), - /config\.toml not found/ + (error) => error?.code === "CODEX_HOME_NOT_FOUND" + && /config\.toml not found/.test(error.message) ); await fs.rm(root, { recursive: true, force: true }); }); +test("runWatch distinguishes access denial from a missing Codex home", async () => { + const denied = new Error("permission denied fixture"); + denied.code = "EACCES"; + await assert.rejects( + () => runWatch({ + codexHome: path.join(testTempDir, "permission-denied-codex-home"), + accessImpl: async () => { throw denied; } + }), + (error) => error?.code === "PERMISSION_DENIED" + && error.details?.causeCode === "EACCES" + ); +}); + test("runWatch blocks Windows WSL UNC SQLite homes before creating watchers", async () => { const { root, codexHome } = await makeTempCodexHome(); let handle; @@ -133,7 +149,7 @@ test("runWatch invokes the injected sync handler when config.toml changes and st await fs.rm(codexHome, { recursive: true, force: true }); }); -test("runWatch swallows 'sqlite in use' errors and keeps watching", async () => { +test("runWatch uses the typed SQLITE_BUSY code and keeps watching", async () => { const { codexHome } = await makeTempCodexHome(); const configPath = path.join(codexHome, "config.toml"); @@ -145,7 +161,9 @@ test("runWatch swallows 'sqlite in use' errors and keeps watching", async () => includeStateDb: false, onSync: async () => { firstSyncCalls += 1; - throw new Error("state_5.sqlite is currently in use by another process"); + const error = new Error("localized busy diagnostic"); + error.code = "SQLITE_BUSY"; + throw error; }, onLog: (line) => logs.push(line) }); @@ -155,7 +173,7 @@ test("runWatch swallows 'sqlite in use' errors and keeps watching", async () => assert.ok(firstSyncCalls >= 1, "first sync should have been attempted"); assert.ok( - logs.some((line) => /state_5\.sqlite is currently in use/.test(line)), + logs.some((line) => /Sync skipped: localized busy diagnostic/.test(line)), "the locked-sqlite error should have been logged as a soft skip" ); diff --git a/test/web-server.test.js b/test/web-server.test.js index 922bdf3..af6c554 100644 --- a/test/web-server.test.js +++ b/test/web-server.test.js @@ -6,6 +6,7 @@ import os from "node:os"; import path from "node:path"; import test from "node:test"; +import { CoreError } from "../src/public-api.js"; import { createWebUiServer, startWebUi } from "../src/web-server.js"; import { createMemoryWebUiState, WebUiStateStore } from "../src/web-state.js"; @@ -341,6 +342,7 @@ test("Web UI sync delegates only server-resolved storage to the shared service", const { credential } = await handle.pair(); const invalid = await api(handle, "/api/sync", { profileId: "default", provider: "bad provider", keepCount: 5 }, credential); assert.equal(invalid.status, 400); + assert.equal(invalid.payload.coreError, undefined); const response = await api(handle, "/api/sync", { profileId: "default", provider: "openai", keepCount: 5 }, credential); assert.equal(response.status, 200); assert.equal(calls.length, 1); @@ -354,6 +356,40 @@ test("Web UI sync delegates only server-resolved storage to the shared service", } }); +test("Web UI appends a safe CoreError DTO without changing the legacy error shape", async () => { + const handle = await startFixture({ + readConfigText: async () => 'model_provider = "openai"\n', + runSync: async () => { + throw new CoreError("SQLITE_BUSY", "The state database is busy.", { + details: { causeCode: "SQLITE_BUSY" } + }); + } + }); + try { + const { credential } = await handle.pair(); + const response = await api( + handle, + "/api/sync", + { profileId: "default", provider: "openai", keepCount: 5 }, + credential + ); + + assert.equal(response.status, 400); + assert.equal(response.payload.error, "The state database is busy."); + assert.equal(response.payload.code, undefined); + assert.deepEqual(response.payload.coreError, { + code: "SQLITE_BUSY", + message: "The state database is busy.", + severity: "warning", + retryable: true, + recoveryRequired: false, + details: { causeCode: "SQLITE_BUSY" } + }); + } finally { + await handle.close(); + } +}); + test("Web UI rejects an operation when config changes the effective SQLite target after confirmation", async () => { let configText = 'model_provider = "openai"\nsqlite_home = "sqlite-a"\n'; const syncCalls = []; @@ -1015,6 +1051,8 @@ test("Web UI restore requires an explicit SQLite Home for relocation and rejects const rejected = await api(wslHandle, "/api/sync", { profileId: "default", provider: "openai", keepCount: 5 }, credential); assert.equal(rejected.status, 400); assert.match(rejected.payload.error, /Windows cannot safely access SQLite through the WSL UNC path/); + assert.equal(rejected.payload.coreError.code, "SQLITE_UNSUPPORTED_PATH"); + assert.deepEqual(rejected.payload.coreError.details, { reason: "windows-wsl-unc" }); assert.equal(restoreCalls, 0); } finally { await wslHandle.close(); From 13163f510a1ac0c245ac992f7a10027f30195300 Mon Sep 17 00:00:00 2001 From: "DAL\\Administrator" <3452720699@qq.com> Date: Tue, 25 Aug 2026 16:10:50 +0800 Subject: [PATCH 03/50] feat(cli): checkpoint C2 JSON contract --- CHANGELOG.md | 17 + README.md | 10 + .../architecture/contracts/CLI_CONTRACT_ZH.md | 87 ++- docs/architecture/contracts/ERROR_CODES_ZH.md | 27 +- docs/migration/BEHAVIOR_FIXTURES_ZH.md | 23 +- .../VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md | 6 +- .../evidence/C2_CLI_JSON_2026-08-25.md | 44 ++ src/cli-json.js | 591 ++++++++++++++++++ src/cli.js | 540 +++++++++++++--- test-support/cli-json-driver.js | 95 +++ test/cli-json-contract.test.js | 364 +++++++++++ test/cli-json.test.js | 256 ++++++++ test/sync-service.test.js | 128 ++++ 13 files changed, 2057 insertions(+), 131 deletions(-) create mode 100644 docs/migration/evidence/C2_CLI_JSON_2026-08-25.md create mode 100644 src/cli-json.js create mode 100644 test-support/cli-json-driver.js create mode 100644 test/cli-json-contract.test.js create mode 100644 test/cli-json.test.js diff --git a/CHANGELOG.md b/CHANGELOG.md index bdee749..15f729b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,23 @@ 本文件记录面向用户和集成方的重要变化。完整的发布叙事、升级说明和下载入口见对应版本的中文发布说明;实现证据和测试门禁见技术发布说明。 +## [Unreleased] + +### 新增 + +- 有限 CLI 命令新增 opt-in `--json`,stdout 固定为一个 schema v1 终态对象;帮助、输入失败、成功、partial、recovery、busy 和取消共享同一顶层结构。 +- JSON Mode 固化 `0/1/2/3/4/5/130` 退出码矩阵,并使用 Canonical Core Error Code。 + +### 兼容性 + +- 未传入 `--json` 时继续使用既有 Human 输出和 `0/1` 行为;partial sync 在 Human Mode 仍为成功退出。 +- `watch` 与 `web` 暂不提供单文档 JSON 模式,并在创建长运行资源前返回结构化 `INVALID_INPUT`;未来流式机器接口需要独立协议。 + +### 安全 + +- JSON 进度只写 stderr 且不报告 backup path;固定错误文案、命令级 result allowlist 和枚举化 details 会阻止非法参数值、未知异常、底层 warning、凭据样式字段、prompt 与消息正文进入 stdout。 +- stdout broken pipe 只尝试一次终态写入;stderr observer 失败不能改变已启动业务操作的结果。 + ## [0.5.0] - 2026-08-15 ### 新增 diff --git a/README.md b/README.md index 7e78d4c..50f92de 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,16 @@ codex-provider sync `switch` 默认会在目标 Provider section 定义了 `model` 时同步根级 `model`。使用 `--keep-root-model` 保留当前值,或使用 `--model ` 显式指定。 +有限命令可使用 `--json` 供自动化读取。stdout 只输出一个 schema v1 终态对象,进度和运行时诊断进入 stderr;JSON Mode 使用 `0/1/2/3/4/5/130` 细分退出码,Human Mode 继续保持既有 `0/1` 行为。例如: + +```bash +codex-provider status --json +codex-provider sync --json +codex-provider switch openai --json +``` + +`watch` 和 `web` 是长运行命令,当前不支持单文档 JSON Mode;传入 `--json` 会在启动 watcher/server 前返回结构化输入错误。完整合同见 [CLI 命令兼容合同](docs/architecture/contracts/CLI_CONTRACT_ZH.md)。 + SQLite Home 解析顺序:`--sqlite-home` → `config.toml` 根级 `sqlite_home` → `CODEX_SQLITE_HOME` → `/sqlite`。只有默认布局会回退到 `/state_5.sqlite`。 ## 当前架构 diff --git a/docs/architecture/contracts/CLI_CONTRACT_ZH.md b/docs/architecture/contracts/CLI_CONTRACT_ZH.md index 219bb45..dff534e 100644 --- a/docs/architecture/contracts/CLI_CONTRACT_ZH.md +++ b/docs/architecture/contracts/CLI_CONTRACT_ZH.md @@ -1,10 +1,10 @@ # CLI 命令兼容合同 -> 状态:Phase 0 兼容基线 +> 状态:Accepted(Phase 0 Human 兼容基线;C2 JSON 合同已实现) > > 基线版本:`@dailin521/codex-provider-sync` v0.5.0 > -> 冻结日期:2026-08-24 +> 冻结日期:2026-08-24;C2 增量:2026-08-25 > > 适用入口:`codex-provider` @@ -12,10 +12,11 @@ 本文冻结 vNext 迁移开始时已经存在的 Node CLI 外部行为,防止提取 Node Core、增加 Electron、重组仓库或迁移到 TypeScript 时无意破坏现有用户和自动化脚本。 -本文同时明确区分三类内容: +本文同时明确区分四类内容: - **v0.5 当前合同**:当前已发布且迁移期间必须兼容的行为; - **legacy tolerated 行为**:当前宽松实现碰巧接受,但不升级为长期公开承诺的行为; +- **vNext C2 当前合同**:V1 分支已实现并由真实子进程测试冻结、但尚未公开发布的 opt-in JSON 行为; - **vNext 目标**:需要后续独立设计、测试和发布说明才能生效的新增合同。 目标架构文档中的建议不自动覆盖本文记录的 v0.5 事实。只有对应迁移阶段通过退出条件并更新合同测试后,才能修改当前合同。 @@ -106,6 +107,16 @@ codex-provider --help 当前没有稳定的 `--version` 或短选项 `-h` 合同。 +### 4.3 vNext C2 JSON 入口 + +以下有限命令支持 opt-in `--json`: + +- `status`、`sync`、`switch`、`restore`; +- `prune-backups`、`install-windows-launcher`; +- 全局帮助或命令帮助。 + +`--json` 可置于命令前或后。`watch` 与 `web` 是长运行接口,不适用“stdout 只写一个终态 JSON 文档”的合同;C2 在创建 watcher、server、runtime descriptor 或浏览器进程前,以结构化 `INVALID_INPUT` 拒绝二者。若未来需要流式机器接口,必须使用独立协议,不能把日志行混入本合同。 + ## 5. `status` ### 5.1 语法 @@ -379,9 +390,9 @@ codex-provider install-windows-launcher [--dir PATH] [--codex-home PATH] [--sqli ## 13. stdout、stderr 与退出码 -### 13.1 v0.5 当前合同 +### 13.1 Human Mode 兼容合同 -当前 CLI 是人类可读接口,没有 `--json`。 +未传入 `--json` 时继续使用 v0.5 人类可读接口,并保持原有 `0/1` 退出行为。 | 场景 | stdout | stderr | Exit Code | | --- | --- | --- | --- | @@ -395,14 +406,58 @@ codex-provider install-windows-launcher [--dir PATH] [--codex-home PATH] [--sqli 错误默认不输出 JavaScript stack。 -**当前不存在 `2`、`3`、`4`、`5`、`130` 的稳定退出码。** 目标架构中关于参数错误、partial、recovery、busy 和取消的细分退出码是 vNext 建议,不是 v0.5 事实。 +Human Mode 不采用 JSON 模式的 `2`、`3`、`4`、`5`、`130`;partial 仍为 `0`,其余既有失败仍为 `1`。这一区分防止现有脚本因 opt-in JSON 能力而改变行为。 + +### 13.2 vNext C2 JSON 合同 + +JSON Mode 的 stdout 必须恰好包含一个 UTF-8 JSON 文档和结尾换行;进度、运行时 warning 与诊断只能进入 stderr。顶层字段始终全部存在、顺序固定,且不得增加未版本化字段: + +```json +{ + "schemaVersion": 1, + "command": "sync", + "ok": true, + "outcome": "completed", + "result": {}, + "warnings": [], + "error": null +} +``` + +字段合同: + +| 字段 | 合同 | +| --- | --- | +| `schemaVersion` | 固定为整数 `1` | +| `command` | 规范化命令名;全局帮助为 `help` | +| `ok` | 业务调用是否得到成功 Result;`partial` 仍为 `true` | +| `outcome` | `completed`、`noop`、`partial`、`failed`、`failed_rolled_back`、`recovery_required`、`cancelled` 或 `stale` | +| `result` | 成功时为命令结果对象,失败时为 `null` | +| `warnings` | 字符串数组;没有 warning 时为空数组 | +| `error` | 失败时为安全的 `CoreErrorDto`,成功时为 `null`;不得包含 stack、cause、凭据、Token 或消息正文 | + +所有 Canonical Error Code 在 JSON 中使用固定安全 message;未知异常统一输出稳定的 `INTERNAL_ERROR`,不回显参数值或底层 message。Error details 只允许经审计且枚举/格式受限的 scope、reason、SQLite source/cause 字段;operationId 只接受 UUID,suggestedAction 不直接透传。成功 result 按命令使用字段 allowlist,只保留产品 DTO 中已审计的状态、计数、Provider/model 与路径字段,并移除凭据、Token、secret、stack/cause、prompt 和消息正文;底层 warning message 归一为稳定摘要。JSON 参数解析为严格模式:未知 flag、重复 flag、缺值、多余位置参数、布尔 flag 带值和 `--json=` 均以 `INVALID_INPUT` 失败;第 14 节的宽松行为只为 Human Mode 保留。 + +JSON Mode 退出码固定为: + +| Exit Code | 含义 | +| --- | --- | +| `0` | 成功或 noop | +| `1` | 普通失败,包含已安全回滚的失败 | +| `2` | 输入无效、Plan 过期或状态漂移 | +| `3` | partial success | +| `4` | recovery required 或 pending transaction | +| `5` | operation busy、SQLite busy 或 lock unverifiable | +| `130` | cancelled | + +CLI Exit Code 与 Error Code 是两层合同:多个 Canonical Error Code 可以映射到同一退出码。`--help --json` 返回 `ok:true` 的 schema v1 帮助结果;不存在稳定的 `--version` JSON 合同。 -### 13.2 vNext 变更规则 +### 13.3 后续变更规则 -新增细分退出码前必须: +以后新增或重映射退出码前必须: 1. 调查现有脚本是否依赖 `0/1`; -2. 明确旧人类模式与新 `--json` 模式是否共享退出码; +2. 明确 Human Mode 与 JSON Mode 是否改变各自退出码; 3. 增加真实子进程 Contract Test; 4. 在 CHANGELOG 和发布说明中声明; 5. 不把 partial、busy 或 recovery 的退出码变化混入无关重构。 @@ -431,14 +486,12 @@ codex-provider install-windows-launcher [--dir PATH] [--codex-home PATH] [--sqli ## 15. vNext 目标合同 -以下内容是目标,不是 v0.5 当前合同: +以下内容是 V1 后续目标;其中 C2 已实现的合同是后续阶段必须保持的不变量: - CLI、Local Web UI 与 Electron Desktop 调用同一个 Core Public API; - Desktop 不启动 CLI,也不解析 CLI 人类文本; -- 新增 opt-in `--json`; -- JSON stdout 使用稳定的 `schemaVersion`; -- JSON 模式 stdout 只含一个结构化结果,日志和进度进入 stderr; -- 建立明确的参数错误、partial、recovery required、busy 和取消退出码; +- 保持 C2 已实现的 opt-in JSON schema、stdout/stderr 分工和退出码矩阵; +- 在 Prepare/Apply 落地后,让 JSON 命令使用相同的 Plan/Result DTO,而不暴露内部适配器; - 使用稳定 Error Code,同时保留现有人类错误提示的核心语义; - 支持取消时使用安全取消点,而不是强制中止事务。 @@ -459,7 +512,11 @@ Phase 0 之后的 CLI 改造至少必须覆盖: - SQLite Home 优先级与 default-only legacy fallback; - Web 默认端口、回环绑定与复用; - Watch 默认 750 ms、once 成功退出与连续失败停止; -- npm `bin`、`engines` 与发布包包含 CLI/Web 运行所需文件。 +- npm `bin`、`engines` 与发布包包含 CLI/Web 运行所需文件; +- JSON help、输入错误、成功、noop、partial、rolled-back、stale、recovery、busy、lock unverifiable 与 cancelled 均为单一 stdout 文档; +- JSON progress 只进入 stderr,未知异常、底层 warning 与序列化失败不泄漏 stack、cause、凭据、Token、secret 或消息正文; +- `watch --json` 与 `web --json` 在任何长运行副作用前被拒绝; +- Human Mode 的帮助、进度、partial 和 `0/1` 行为保持既有回归。 ## 17. 变更控制 diff --git a/docs/architecture/contracts/ERROR_CODES_ZH.md b/docs/architecture/contracts/ERROR_CODES_ZH.md index 6592de3..9aae292 100644 --- a/docs/architecture/contracts/ERROR_CODES_ZH.md +++ b/docs/architecture/contracts/ERROR_CODES_ZH.md @@ -1,8 +1,8 @@ # vNext Error Code 合同 -> **状态:Accepted(阶段 0 合同;代码适配尚未实施)** +> **状态:Accepted(阶段 0 合同;V1 C1 Core DTO 与 C2 CLI Adapter 已实施)** > -> **日期:2026-08-24** +> **日期:2026-08-24;实现增量:2026-08-25** > > **适用范围:Node Core、CLI、Local Web UI、Electron 与迁移期 .NET 适配层** > @@ -12,7 +12,7 @@ 本文冻结 vNext 的错误分类、兼容映射和演进规则,使调用方依据稳定的 `code` 决策,而不是解析自然语言 `message`、异常类型名或堆栈。 -本文不表示当前代码已经完成统一。当前 Node、Web 与 .NET 仍存在不同大小写、命名和结构;这些现状被列为 Legacy Surface,由后续结构化错误 PR 通过 Adapter 渐进收口。 +V1 的 Node Public API 已实现 Canonical `CoreError`/DTO,CLI JSON Adapter 已按 Canonical Code 输出;Web 与迁移期 .NET 仍存在不同大小写、命名和结构,这些现状继续列为 Legacy Surface,并由后续 Adapter 渐进收口。 ## 2. 稳定边界 @@ -156,8 +156,23 @@ Adapter 必须按 typed exception、明确属性和调用上下文映射。禁 ### CLI - 当前 Human Mode 保留现有人类提示兼容性。 -- 未来 `--json` 只输出 Canonical Code;stdout 为单一 JSON,日志进入 stderr。 +- C2 `--json` 只输出 Canonical Code;stdout 为单一 schema v1 JSON 文档,日志和进度进入 stderr。 - CLI Exit Code 与 Error Code 是两层合同,不一一等同。 +- CLI JSON presenter 不透传 Core/系统原始 message:每个 Canonical Code 使用固定安全文案,details 使用枚举/格式 allowlist,suggestedAction 不直接透传,operationId 只接受 UUID。 + +JSON Mode 的当前映射为: + +| Exit Code | Canonical Code / Result | +| --- | --- | +| `0` | completed 或 noop | +| `1` | 其他普通失败,包括 `SYNC_FAILED_ROLLED_BACK` | +| `2` | `INVALID_INPUT`、`PLAN_EXPIRED`、`PLAN_STALE`、`STALE_STATE` 及迁移期 revision 漂移码 | +| `3` | partial Result | +| `4` | `RECOVERY_REQUIRED`、`PENDING_TRANSACTION`,或 DTO 标记 `recoveryRequired:true` | +| `5` | `OPERATION_BUSY`、`SQLITE_BUSY`、`LOCK_UNVERIFIABLE` | +| `130` | `OPERATION_CANCELLED` | + +未知或不可信异常必须收口为稳定的 `INTERNAL_ERROR` 文案;CLI JSON 不回显 stack、cause 或任意未知异常 message。Human Mode 的既有 `0/1` 行为不随该表改变。 ### Local Web UI @@ -178,6 +193,6 @@ Adapter 必须按 typed exception、明确属性和调用上下文映射。禁 - 修改 `retryable` 或 `recoveryRequired`:视为合同变更,必须补充故障注入测试。 - Legacy Adapter 可新增映射;不得让已知 Legacy Code 回退为字符串解析。 -## 8. 阶段 0 验收边界 +## 8. 阶段实现边界 -阶段 0 只冻结分类与映射,不修改异常类、CLI 退出码、Web 响应或 .NET protocol 0.4。统一实现、`--json` 与 Contract Test 分别在后续 PR 完成。 +阶段 0 冻结分类与映射;V1 C1 已实现 Node 异常类和安全 DTO,C2 已实现 opt-in CLI JSON/退出码与真实子进程 Contract Test。Web 响应和 .NET protocol 0.4 仍保持迁移期兼容,尚不能据此声称跨入口错误合同已经全部统一。 diff --git a/docs/migration/BEHAVIOR_FIXTURES_ZH.md b/docs/migration/BEHAVIOR_FIXTURES_ZH.md index ced7935..b064f68 100644 --- a/docs/migration/BEHAVIOR_FIXTURES_ZH.md +++ b/docs/migration/BEHAVIOR_FIXTURES_ZH.md @@ -1,6 +1,6 @@ # vNext 行为兼容 Fixture 清单 -> **状态:Accepted(阶段 0 语义清单;共享 Corpus 尚未创建)** +> **状态:Accepted(阶段 0 语义清单;C2 动态 CLI Fixture 已实现,共享 Corpus 尚未创建)** > > **日期:2026-08-24** > @@ -106,7 +106,22 @@ Fixture 不是用户数据样本,严禁从真实 `~/.codex`、认证文件或 | `workspace-roots` | global state、rollout cwd 与 SQLite cwd 不一致,含跨平台路径形式 | 只修复合同允许的 workspace/cwd 元数据;路径规范化一致;Backup/Restore 覆盖 global state | | `history-safe-content` | user/event/response-item 重复消息、无 thread id、同 id 多 rollout | 列表选择稳定会话;详情只在用户主动读取时返回安全消息;正文不进入日志、诊断包或应用数据库 | -## 8. 未来 Corpus 建议结构 +## 8. CLI JSON 动态 Fixture + +C2 使用真实 Node 子进程和完全位于临时目录的最小 Core fixture 固化 JSON Mode;这些 harness 不含真实 Codex Home、凭据或消息正文。 + +| Fixture ID | 运行方式 | 关键预期 | +| --- | --- | --- | +| `cli-json-envelope-v1` | 对所有有限命令启动真实 CLI/组合入口 | stdout 恰好一个 JSON 文档,顶层键固定为 schemaVersion/command/ok/outcome/result/warnings/error | +| `cli-json-exit-matrix` | 子进程注入 success/noop/partial/rolled-back/stale/recovery/busy/lock/cancel | 退出码固定为 `0/1/2/3/4/5/130`,且与 Error Code 分层 | +| `cli-json-progress-isolation` | 真实 Sync 与受控 progress observer | 进度仅进入 stderr;stdout 不含阶段文本或 backup path | +| `cli-json-daemon-rejection` | `watch --json`、`web --json` | 在创建长运行状态、runtime descriptor 或浏览器进程前返回 `INVALID_INPUT`/exit 2 | +| `cli-json-redaction` | 非法参数值、unknown/typed error、恶意 details、越权 result 字段、循环结果、stdout EPIPE | 固定错误文案与命令级字段 allowlist 不泄漏 stack/cause/secret/token/prompt/message body;terminal writer 最多尝试一次 stdout | +| `cli-human-compat` | 不传 `--json` 运行既有 help/input/sync 路径 | Human 输出和既有 `0/1`、partial 行为不变 | + +这些用例当前由 `test/cli-json-contract.test.js`、`test/cli-json.test.js`、`test-support/cli-json-driver.js` 和真实 Core Sync 回归承载;未来迁入 `packages/test-fixtures` 时必须保持同一外部合同。 + +## 9. 未来 Corpus 建议结构 本节只定义目标,不表示目录已经存在: @@ -126,7 +141,7 @@ packages/test-fixtures/ SQLite live WAL、真实文件锁、跨进程 crash 和 WSL UNC 不能作为静态字节目录伪造,必须由受控 Builder/Harness 在临时目录创建。静态部分只保存最小、无敏感内容、可审计的源输入。 -## 9. Node / .NET 对照与差异登记 +## 10. Node / .NET 对照与差异登记 每个双运行时 Fixture 使用两份相同输入副本: @@ -136,6 +151,6 @@ SQLite live WAL、真实文件锁、跨进程 crash 和 WSL UNC 不能作为静 4. 差异必须记录“Node 行为 / .NET 行为 / 权威选择 / 安全理由 / 对应测试”; 5. Node 是 vNext 目标核心,但不能以“新实现”为理由静默覆盖更安全的既有行为。 -## 10. 阶段 0 验收边界 +## 11. 阶段验收边界 阶段 0 的完成标志是本文场景、预期和安全门槛获得确认。实际 Corpus、Schema、Builder、跨运行时 Harness 和 CI Matrix 均属于后续阶段;在它们真正通过之前,文档不得宣称行为等价。 diff --git a/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md b/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md index f08dac5..1adb254 100644 --- a/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md +++ b/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md @@ -71,7 +71,7 @@ - 新增 `src/public-api.js`,CLI/Web 不再导入 Core 内部实现; - 展示逻辑与业务结果分离,现有用户可见语义不变; -- C1~C3 均已完成:Public API/结构化错误、CLI `--json`、Prepare/Apply 与双层锁已分别落地; +- 最终 PR 合入前,C1~C3 的 checkpoint 门槛必须全部通过:Public API/结构化错误、CLI `--json`、Prepare/Apply 与双层锁分别落地; - CLI `--json` 是 opt-in 加法;默认 Human Mode、命令语义和 v0.5 兼容行为保持不变; - 原 Node 测试全绿,新增 Public API Contract Test; - 真实 Node↔.NET 对同一 Codex Home 的 protocol v2 操作锁争用通过:恰有一个写者,败方无副作用; @@ -162,7 +162,7 @@ | --- | --- | --- | --- | --- | | C0 | 治理、基线与依赖安全 | 阶段 0 | ADR-0011~0013、合同导航、基线测试、Vite 审计告警清零 | In Progress(V1) | | C1 | Core Public API 与结构化错误 | C0 | CLI/Web 仅走 Public API;Canonical/Legacy Adapter;错误合同测试 | In Progress(V1,本地门禁通过) | -| C2 | CLI `--json` | C1 | stdout 单一 JSON、stderr 日志、JSON Exit Code 与 Schema 合同 | Pending | +| C2 | CLI `--json` | C1 | stdout 单一 JSON、stderr 日志、JSON Exit Code 与 Schema 合同 | In Progress(V1,本地门禁通过) | | C3 | Prepare/Apply、协调器与双层锁 | C1、C2 | Revision/Plan/Apply、Node/.NET 双层资源锁、真实争锁证据 | Pending | | C4 | Workspace、Core、Contracts、CoreClient | C1~C3(Phase 1 全部门槛已验证) | 不搬高风险算法;根 npm CLI tarball/Node 16 兼容 | Pending | | C5 | 共享 React UI 与 Web | C4 | AppShell/Features/HttpCoreClient;Web 安全与功能等价;阶段 2 门槛 | Pending | @@ -217,4 +217,4 @@ Node 与 .NET 在同一 Fixture 上不一致时,PR 必须记录: ## 8. 本 PR 完成后的下一步 -V1 的下一项是 `C2`:在保持 Human 输出与 `0/1` 兼容的前提下实现严格单对象 CLI JSON 契约和退出码矩阵。C1 的本地证据见 [C1 Public API 与结构化错误证据](evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md);其验证不使 Phase 1 在最终 PR 合入前 Completed。 +V1 的下一项是 `C3`:实现统一 Prepare/Apply、10 分钟单次消费 Plan ledger、revision 复核、协调器与 Node/.NET 双层资源锁。C1 的本地证据见 [C1 Public API 与结构化错误证据](evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md),C2 证据见 [C2 CLI JSON 合同证据](evidence/C2_CLI_JSON_2026-08-25.md);这些本地验证不使 Phase 1 在最终 PR 合入前 Completed。 diff --git a/docs/migration/evidence/C2_CLI_JSON_2026-08-25.md b/docs/migration/evidence/C2_CLI_JSON_2026-08-25.md new file mode 100644 index 0000000..83ccbc8 --- /dev/null +++ b/docs/migration/evidence/C2_CLI_JSON_2026-08-25.md @@ -0,0 +1,44 @@ +# C2 CLI JSON 契约证据(2026-08-25) + +状态:本地门禁通过,等待远端 CI。输入 checkpoint 为 `f008d0e`;C2 最终 commit SHA 在本 checkpoint 提交后及 C10 evidence bundle 中索引。 + +## 冻结边界 + +- Human 模式保持既有文本输出和成功/失败 `0/1` 兼容;本 checkpoint 未改变既有业务操作、备份、事务、回滚、WSL 或 locked rollout 语义。 +- `status`、`sync`、`switch`、`restore`、`prune-backups`、`install-windows-launcher` 与 `help` 支持有限终态 JSON;`watch`、`web` 在加载 Core 或创建长运行状态前拒绝 `--json`。 +- JSON stdout 严格只写一个以换行结束的终态对象,固定顶层键为 `{schemaVersion, command, ok, outcome, result, warnings, error}`;进度只写 stderr,stderr observer/EPIPE 失败不改变已完成事务结果或触发第二次 stdout 写入。 +- JSON 退出码冻结为:`0` completed/noop、`1` 普通失败或已回滚、`2` 输入无效/计划失效、`3` partial、`4` recovery required、`5` busy/lock unverifiable、`130` cancelled。 + +## 安全与兼容性 + +- JSON 参数使用逐命令 allowlist、精确 positional 数量、单次 flag 和 value/boolean 类型规则;未知命令归一为固定 `command: "unknown"`,输入错误使用固定文案,不回显命令、参数值或路径。 +- flags/counts 使用 null-prototype map,契约和 canonical error message 查找只接受 own property;`__proto__`、`constructor`、`toString` 等原型键不能绕过校验或伪装错误码。 +- `--flag=value` 按首个 `=` 切分,保留值中后续全部 `=`;真实 status 子进程已覆盖包含 `=` 的 Codex Home。 +- 成功 result、warnings 和错误 details 均按产品 DTO 字段 allowlist 重新构造;任意 message、stack、cause、suggestedAction、token、消息正文及未知嵌套属性均不能穿透 JSON envelope。 +- `OPERATION_BUSY` 保留可信 `busyScope`;SQLite busy 与 `LOCK_UNVERIFIABLE` 均映射 exit `5`。真实 Core 子进程覆盖正常 sync、pending journal/recovery、SQLite busy-before-backup 与 Windows locked-rollout partial。 + +## 本地验证 + +环境:Windows x64,Node `v24.11.1`,npm `11.10.0`;输入 SHA `f008d0ea277b57fd1d027068bfab9c4f80c5ae3a`。 + +| 命令 | 结果 | +| --- | --- | +| `node --test test/cli-json.test.js test/cli-json-contract.test.js` | 22 passed,0 failed,0 skipped | +| `npm exec --yes --package=node@16.20.2 -- node --test test/cli-json.test.js test/cli-json-contract.test.js` | 实际 Node `v16.20.2`;2 个目标测试文件通过,0 failed/skipped | +| `npm test` | 309 passed,0 failed,0 skipped | +| `npm run web:build` | Vite 8.2.2 production build 成功,21 modules transformed | +| `npm audit --omit=dev --audit-level=moderate` | 0 vulnerabilities | +| `npm audit --audit-level=high` | 0 vulnerabilities | +| `npm pack --dry-run --json` | 成功;`src/cli-json.js` 与 C2 evidence 进入根 tarball,`test-support` 未进入;候选产物哈希留待 C9/C10 的不可变 artifact 记录 | +| `dotnet test desktop/CodexProviderSync.Core.Tests/CodexProviderSync.Core.Tests.csproj --filter FullyQualifiedName~LockServiceTests --configuration Release` | 28 passed,0 failed,0 skipped | +| `git diff --check` | 通过,仅有 Windows CRLF 工作区提示 | + +两轮独立最终只读复审均确认无 P0/P1 阻断;复审发现的未知命令回显、内联值截断、原型键 flag 绕过和错误码原型属性误判均已修复并补回归。 + +## 已知未闭合项 + +- C3 的正式 Plan/Apply ledger、10 分钟 TTL、单次消费、revision 复核、双层资源锁和 operation snapshot 尚未实现;C2 只冻结对应未来错误/退出语义。 +- 本地 Node 16.20.2 验证运行了 C2 目标测试,但 Windows/Ubuntu 根 tarball 安装执行仍需后续兼容 CI 证明。 +- 当前 npm/Web dist 仍包含既有 source map;Electron/发布产物必须在 C9 排除并扫描证明。 +- Web/Electron 共享客户端、现代 UI 与桌面 transport 尚未迁移;本 checkpoint 不声称这些目标已完成。 +- 未创建 tag,未发布 npm/GitHub Release,未签名、公证或写更新通道;只有最终 PR 的全部必需 job 成功并合入受保护分支后,对应 Phase 才能标记 Completed。 diff --git a/src/cli-json.js b/src/cli-json.js new file mode 100644 index 0000000..f9e113c --- /dev/null +++ b/src/cli-json.js @@ -0,0 +1,591 @@ +export const CLI_JSON_SCHEMA_VERSION = 1; + +const SUCCESS_OUTCOMES = new Set(["completed", "noop", "partial"]); +const FAILURE_OUTCOMES = new Set([ + "failed", + "failed_rolled_back", + "recovery_required", + "cancelled", + "stale" +]); +const STALE_CODES = new Set([ + "INVALID_INPUT", + "PLAN_EXPIRED", + "PLAN_STALE", + "STALE_STATE", + "PROFILE_CHANGED", + "STORAGE_CHANGED" +]); +const RECOVERY_CODES = new Set(["RECOVERY_REQUIRED", "PENDING_TRANSACTION"]); +const BUSY_CODES = new Set(["OPERATION_BUSY", "LOCK_UNVERIFIABLE", "SQLITE_BUSY"]); +const SEVERITIES = new Set(["info", "warning", "error", "fatal"]); +const WARNING_ERROR_CODES = new Set([ + "PROFILE_CHANGED", + "STORAGE_CHANGED", + "PLAN_STALE", + "PLAN_EXPIRED", + "STALE_STATE", + "SQLITE_BUSY", + "ROLLOUT_LOCKED", + "ROLLOUT_CHANGED", + "OPERATION_BUSY" +]); +const LOCK_SCOPES = new Set(["codex-home", "state-db"]); +const SAFE_REASONS = new Set([ + "profile", + "config", + "storage", + "rollout", + "state-db", + "windows-wsl-unc" +]); +const SQLITE_HOME_SOURCES = new Set(["cli", "config", "env", "default"]); +const OPERATION_KINDS = new Set(["sync", "switch", "restore", "prune-backups", "watch"]); +const PENDING_STATES = new Set([ + "prepared", + "applying", + "committing", + "committed", + "committed-pending-ack", + "rollback-pending", + "rollingBack", + "rolledBack", + "rolled-back", + "recoveryRequired", + "recovery-required" +]); +const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; +const SAFE_CAUSE_CODES = new Set([ + "ENOENT", + "EACCES", + "EPERM", + "EIO", + "EBUSY", + "SQLITE_BUSY", + "SQLITE_LOCKED", + "SQLITE_CORRUPT", + "SQLITE_NOTADB", + "ERR_SQLITE_ERROR" +]); + +const CLI_ERROR_MESSAGES = Object.freeze({ + INVALID_INPUT: "The command input is invalid.", + PROFILE_CHANGED: "The selected profile changed. Prepare the operation again.", + STORAGE_CHANGED: "The resolved storage changed. Prepare the operation again.", + PLAN_STALE: "The prepared operation is stale. Prepare it again.", + PLAN_EXPIRED: "The prepared operation expired. Prepare it again.", + STALE_STATE: "The protected state changed. Prepare the operation again.", + CODEX_HOME_NOT_FOUND: "The selected Codex Home was not found.", + STATE_DB_NOT_FOUND: "The selected state database was not found.", + SQLITE_UNSUPPORTED_PATH: "The selected SQLite path is not supported by this runtime.", + SQLITE_BUSY: "The state database is busy. Close Codex processes and retry.", + SQLITE_UNREADABLE: "The state database is unreadable or malformed.", + ROLLOUT_LOCKED: "One or more rollout files are locked.", + ROLLOUT_CHANGED: "One or more rollout files changed during the operation.", + PENDING_TRANSACTION: "An unfinished transaction must be resolved before another write.", + BACKUP_FAILED: "The required backup could not be completed.", + SYNC_FAILED_ROLLED_BACK: "The operation failed and its changes were rolled back.", + RECOVERY_REQUIRED: "The operation requires explicit recovery.", + RESTORE_VALIDATION_FAILED: "The selected backup or restore target failed validation.", + PERMISSION_DENIED: "The operation does not have permission to access a required resource.", + OPERATION_BUSY: "Another write operation is using the protected resource.", + LOCK_UNVERIFIABLE: "The lock owner or protected resource identity cannot be verified.", + OPERATION_CANCELLED: "The operation was cancelled.", + CORE_RUNTIME_CRASHED: "The Core runtime stopped unexpectedly.", + PROTOCOL_VERSION_MISMATCH: "The client and Core protocol versions are incompatible.", + INTERNAL_ERROR: "An internal error occurred." +}); + +const WARNING_MESSAGES = Object.freeze({ + warnings: "The operation completed with a warning.", + encryptedContentWarning: "Existing encrypted content may not be usable with the target provider.", + autoPruneWarning: "Automatic backup cleanup did not complete.", + backupInventoryWarning: "Backup inventory refresh did not complete.", + modelWarning: "The selected provider has no default model; the root model was not changed." +}); + +function assertPlainJsonData(value, seen = new WeakSet(), depth = 0) { + if (depth > 16) throw new TypeError("CLI JSON data exceeds the maximum nesting depth."); + if (value === undefined || value === null + || typeof value === "string" || typeof value === "boolean") return; + if (typeof value === "number" && Number.isFinite(value)) return; + if (typeof value !== "object") throw new TypeError("CLI JSON data must be plain JSON data."); + if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype) { + throw new TypeError("CLI JSON objects must use the plain object prototype."); + } + if (seen.has(value)) throw new TypeError("CLI JSON data must not contain cycles."); + seen.add(value); + for (const entry of Array.isArray(value) ? value : Object.values(value)) { + assertPlainJsonData(entry, seen, depth + 1); + } + seen.delete(value); +} + +function uniqueStrings(values) { + return [...new Set(values.filter((value) => typeof value === "string" && value))]; +} + +function safeString(value, maxLength = 4096, { allowEmpty = false } = {}) { + return typeof value === "string" + && value.length <= maxLength + && (allowEmpty || value.length > 0) + ? value + : undefined; +} + +function safeNumber(value, { integer = false, minimum = Number.NEGATIVE_INFINITY } = {}) { + return typeof value === "number" + && Number.isFinite(value) + && (!integer || Number.isInteger(value)) + && value >= minimum + ? value + : undefined; +} + +function safeBoolean(value) { + return typeof value === "boolean" ? value : undefined; +} + +function safeUuid(value) { + return typeof value === "string" && UUID_PATTERN.test(value) ? value : undefined; +} + +function put(target, key, value) { + if (value !== undefined) target[key] = value; +} + +function putNullable(target, key, value, normalize) { + if (value === null) target[key] = null; + else put(target, key, normalize(value)); +} + +function sanitizeStringArray(value, maxLength = 32768) { + if (!Array.isArray(value)) return undefined; + return value + .map((entry) => safeString(entry, maxLength, { allowEmpty: true })) + .filter((entry) => entry !== undefined); +} + +function sanitizeNumberArray(value) { + if (!Array.isArray(value)) return undefined; + return value + .map((entry) => safeNumber(entry, { integer: true, minimum: 0 })) + .filter((entry) => entry !== undefined); +} + +function sanitizeCountMap(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) return undefined; + const result = {}; + for (const [key, count] of Object.entries(value)) { + if (!safeString(key, 256) || key.includes("\0")) continue; + const normalized = safeNumber(count, { integer: true, minimum: 0 }); + if (normalized !== undefined) result[key] = normalized; + } + return result; +} + +function sanitizeDistribution(value, { includeReadState = false } = {}) { + if (!value || typeof value !== "object" || Array.isArray(value)) return undefined; + const result = {}; + put(result, "sessions", sanitizeCountMap(value.sessions)); + put(result, "archived_sessions", sanitizeCountMap(value.archived_sessions)); + if (includeReadState) { + put(result, "unreadable", safeBoolean(value.unreadable)); + if (value.error) result.error = "state_5.sqlite is unavailable."; + } + return result; +} + +function sanitizePruneResult(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) return undefined; + const result = {}; + put(result, "backupRoot", safeString(value.backupRoot, 32768)); + put(result, "deletedCount", safeNumber(value.deletedCount, { integer: true, minimum: 0 })); + put(result, "remainingCount", safeNumber(value.remainingCount, { integer: true, minimum: 0 })); + put(result, "freedBytes", safeNumber(value.freedBytes, { integer: true, minimum: 0 })); + return result; +} + +function sanitizeBackupInfo(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) return undefined; + const result = {}; + put(result, "backupId", safeString(value.backupId, 256)); + put(result, "backupDir", safeString(value.backupDir, 32768)); + put(result, "createdAt", safeString(value.createdAt, 64)); + put(result, "sizeBytes", safeNumber(value.sizeBytes, { integer: true, minimum: 0 })); + put(result, "fileCount", safeNumber(value.fileCount, { integer: true, minimum: 0 })); + return result; +} + +function sanitizeModelSync(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) return undefined; + const result = {}; + put(result, "applied", safeBoolean(value.applied)); + put(result, "source", safeString(value.source, 64)); + putNullable(result, "model", value.model, (entry) => safeString(entry, 512, { allowEmpty: true })); + putNullable( + result, + "warning", + value.warning, + () => WARNING_MESSAGES.modelWarning + ); + return result; +} + +function sanitizeSyncResult(value) { + const result = {}; + for (const key of ["codexHome", "sqliteHome", "backupDir"]) { + put(result, key, safeString(value[key], 32768)); + } + for (const key of ["sqliteHomeSource", "targetProvider", "previousProvider"]) { + putNullable(result, key, value[key], (entry) => safeString(entry, 512, { allowEmpty: true })); + } + for (const key of [ + "backupDurationMs", + "changedSessionFiles", + "sqliteRowsUpdated", + "sqliteProviderRowsUpdated", + "sqliteUserEventRowsUpdated", + "sqliteCwdRowsUpdated", + "updatedWorkspaceRoots", + "savedWorkspaceRootCount" + ]) { + put(result, key, safeNumber(value[key], { integer: true, minimum: 0 })); + } + put(result, "sqlitePresent", safeBoolean(value.sqlitePresent)); + put(result, "skippedLockedRolloutFiles", sanitizeStringArray(value.skippedLockedRolloutFiles)); + put(result, "rolloutCountsBefore", sanitizeDistribution(value.rolloutCountsBefore)); + put(result, "encryptedContentCounts", sanitizeDistribution(value.encryptedContentCounts)); + if (value.encryptedContentWarning) { + result.encryptedContentWarning = WARNING_MESSAGES.encryptedContentWarning; + } else if (value.encryptedContentWarning === null) { + result.encryptedContentWarning = null; + } + putNullable(result, "autoPruneResult", value.autoPruneResult, sanitizePruneResult); + if (value.autoPruneWarning) result.autoPruneWarning = WARNING_MESSAGES.autoPruneWarning; + else if (value.autoPruneWarning === null) result.autoPruneWarning = null; + put(result, "modelSync", sanitizeModelSync(value.modelSync)); + put(result, "noop", safeBoolean(value.noop)); + put(result, "operationId", safeUuid(value.operationId)); + put(result, "backup", sanitizeBackupInfo(value.backup)); + if (Array.isArray(value.warnings)) { + result.warnings = value.warnings.length > 0 ? [WARNING_MESSAGES.warnings] : []; + } + return result; +} + +function sanitizeStatusResult(value) { + const result = {}; + put(result, "schemaVersion", safeNumber(value.schemaVersion, { integer: true, minimum: 1 })); + put(result, "snapshotAt", safeString(value.snapshotAt, 64)); + put(result, "storageRevision", safeString(value.storageRevision, 256)); + put(result, "codexHome", safeString(value.codexHome, 32768)); + put(result, "sqliteHome", safeString(value.sqliteHome, 32768)); + put(result, "sqliteHomeSource", SQLITE_HOME_SOURCES.has(value.sqliteHomeSource) + ? value.sqliteHomeSource + : undefined); + if (value.sqliteAccess && typeof value.sqliteAccess === "object") { + const sqliteAccess = {}; + put(sqliteAccess, "supported", safeBoolean(value.sqliteAccess.supported)); + putNullable(sqliteAccess, "reason", value.sqliteAccess.reason, (entry) => ( + SAFE_REASONS.has(entry) ? entry : undefined + )); + result.sqliteAccess = sqliteAccess; + } + put(result, "checkedStateDbPaths", sanitizeStringArray(value.checkedStateDbPaths)); + put(result, "currentProvider", safeString(value.currentProvider, 512)); + put(result, "currentProviderImplicit", safeBoolean(value.currentProviderImplicit)); + put(result, "configuredProviders", sanitizeStringArray(value.configuredProviders, 512)); + put(result, "rolloutCounts", sanitizeDistribution(value.rolloutCounts)); + put(result, "lockedRolloutFiles", sanitizeStringArray(value.lockedRolloutFiles)); + put(result, "encryptedContentCounts", sanitizeDistribution(value.encryptedContentCounts)); + if (value.encryptedContentWarning) { + result.encryptedContentWarning = WARNING_MESSAGES.encryptedContentWarning; + } else if (value.encryptedContentWarning === null) { + result.encryptedContentWarning = null; + } + putNullable(result, "sqliteCounts", value.sqliteCounts, (entry) => ( + sanitizeDistribution(entry, { includeReadState: true }) + )); + if (value.stateDbLocation && typeof value.stateDbLocation === "object") { + const location = {}; + put(location, "path", safeString(value.stateDbLocation.path, 32768)); + put(location, "relativePath", safeString(value.stateDbLocation.relativePath, 32768)); + put(location, "source", safeString(value.stateDbLocation.source, 64)); + result.stateDbLocation = location; + } else if (value.stateDbLocation === null) { + result.stateDbLocation = null; + } + if (value.sqliteRepairStats && typeof value.sqliteRepairStats === "object") { + const stats = {}; + put(stats, "userEventRowsNeedingRepair", safeNumber( + value.sqliteRepairStats.userEventRowsNeedingRepair, + { integer: true, minimum: 0 } + )); + put(stats, "cwdRowsNeedingRepair", safeNumber( + value.sqliteRepairStats.cwdRowsNeedingRepair, + { integer: true, minimum: 0 } + )); + result.sqliteRepairStats = stats; + } else if (value.sqliteRepairStats === null) { + result.sqliteRepairStats = null; + } + if (Array.isArray(value.projectThreadVisibility)) { + result.projectThreadVisibility = value.projectThreadVisibility.map((project) => { + const item = {}; + if (!project || typeof project !== "object" || Array.isArray(project)) return item; + put(item, "root", safeString(project.root, 32768)); + for (const key of [ + "interactiveThreads", + "firstPageThreads", + "exactCwdMatches", + "verbatimCwdRows", + "topRank" + ]) { + putNullable(item, key, project[key], (entry) => ( + safeNumber(entry, { integer: true, minimum: 0 }) + )); + } + put(item, "ranks", sanitizeNumberArray(project.ranks)); + put(item, "rankPreview", safeString(project.rankPreview, 2048, { allowEmpty: true })); + put(item, "providerCounts", sanitizeCountMap(project.providerCounts)); + return item; + }); + } + put(result, "backupRoot", safeString(value.backupRoot, 32768)); + if (value.backupSummary && typeof value.backupSummary === "object") { + const summary = {}; + put(summary, "count", safeNumber(value.backupSummary.count, { integer: true, minimum: 0 })); + put(summary, "totalBytes", safeNumber(value.backupSummary.totalBytes, { integer: true, minimum: 0 })); + result.backupSummary = summary; + } + if (Array.isArray(value.pendingTransactions)) { + result.pendingTransactions = value.pendingTransactions.map((transaction) => { + const item = {}; + if (!transaction || typeof transaction !== "object" || Array.isArray(transaction)) return item; + putNullable(item, "operationId", transaction.operationId, safeUuid); + put(item, "state", PENDING_STATES.has(transaction.state) ? transaction.state : undefined); + put(item, "backupDir", safeString(transaction.backupDir, 32768)); + put(item, "journalPath", safeString(transaction.journalPath, 32768)); + return item; + }); + } + put(result, "operationInProgress", safeBoolean(value.operationInProgress)); + put(result, "rolloutScanComplete", safeBoolean(value.rolloutScanComplete)); + return result; +} + +function sanitizeBooleanMap(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) return undefined; + const result = {}; + for (const [key, present] of Object.entries(value)) { + const normalizedKey = safeString(key, 128); + const normalizedValue = safeBoolean(present); + if (normalizedKey && normalizedValue !== undefined) result[normalizedKey] = normalizedValue; + } + return result; +} + +function sanitizeRestoreResult(value) { + const result = {}; + put(result, "version", safeNumber(value.version, { integer: true, minimum: 1 })); + put(result, "namespace", value.namespace === "provider-sync" ? value.namespace : undefined); + for (const key of ["codexHome", "sqliteHome", "backupDir"]) { + put(result, key, safeString(value[key], 32768)); + } + put(result, "targetProvider", safeString(value.targetProvider, 512)); + put(result, "createdAt", safeString(value.createdAt, 64)); + put(result, "dbFiles", sanitizeStringArray(value.dbFiles)); + put(result, "sqliteDbFiles", sanitizeStringArray(value.sqliteDbFiles)); + put(result, "globalStateFiles", sanitizeBooleanMap(value.globalStateFiles)); + put(result, "changedSessionFiles", safeNumber(value.changedSessionFiles, { integer: true, minimum: 0 })); + put(result, "sizeBytes", safeNumber(value.sizeBytes, { integer: true, minimum: 0 })); + put(result, "fileCount", safeNumber(value.fileCount, { integer: true, minimum: 0 })); + if (value.backupInventoryWarning) { + result.backupInventoryWarning = WARNING_MESSAGES.backupInventoryWarning; + } + put(result, "operationId", safeUuid(value.operationId)); + put(result, "backup", sanitizeBackupInfo(value.backup)); + if (Array.isArray(value.warnings)) { + result.warnings = value.warnings.length > 0 ? [WARNING_MESSAGES.warnings] : []; + } + return result; +} + +function sanitizeLauncherResult(value) { + const result = {}; + for (const key of ["targetDir", "cmdPath", "vbsPath"]) { + put(result, key, safeString(value[key], 32768)); + } + putNullable(result, "codexHome", value.codexHome, (entry) => safeString(entry, 32768)); + putNullable(result, "sqliteHome", value.sqliteHome, (entry) => safeString(entry, 32768)); + return result; +} + +function sanitizeCommandResult(command, value) { + if (!value || typeof value !== "object" || Array.isArray(value)) return {}; + if (command === "help") { + const result = {}; + put(result, "text", safeString(value.text, 65536, { allowEmpty: true })); + putNullable(result, "requestedCommand", value.requestedCommand, (entry) => safeString(entry, 128)); + return result; + } + if (command === "status") return sanitizeStatusResult(value); + if (command === "sync" || command === "switch") return sanitizeSyncResult(value); + if (command === "restore") return sanitizeRestoreResult(value); + if (command === "prune-backups") return sanitizePruneResult(value) ?? {}; + if (command === "install-windows-launcher") return sanitizeLauncherResult(value); + throw new TypeError(`Unsupported CLI JSON command result: ${String(command)}`); +} + +export function collectCliWarnings(result) { + if (!result || typeof result !== "object") return []; + return uniqueStrings([ + ...(Array.isArray(result.warnings) && result.warnings.length > 0 + ? [WARNING_MESSAGES.warnings] + : []), + result.encryptedContentWarning ? WARNING_MESSAGES.encryptedContentWarning : null, + result.autoPruneWarning ? WARNING_MESSAGES.autoPruneWarning : null, + result.backupInventoryWarning ? WARNING_MESSAGES.backupInventoryWarning : null, + result.modelSync?.warning ? WARNING_MESSAGES.modelWarning : null + ]); +} + +export function inferCliSuccessOutcome(result) { + if (SUCCESS_OUTCOMES.has(result?.outcome)) return result.outcome; + if (Array.isArray(result?.skippedLockedRolloutFiles) + && result.skippedLockedRolloutFiles.length > 0) return "partial"; + if (result?.noop === true) return "noop"; + return "completed"; +} + +export function createCliSuccessEnvelope(command, result, options = {}) { + assertPlainJsonData(result); + const outcome = options.outcome ?? inferCliSuccessOutcome(result); + if (!SUCCESS_OUTCOMES.has(outcome)) { + throw new TypeError(`Invalid successful CLI outcome: ${String(outcome)}`); + } + const warnings = options.warnings === undefined + ? collectCliWarnings(result) + : (Array.isArray(options.warnings) && options.warnings.length > 0 + ? [WARNING_MESSAGES.warnings] + : []); + return { + schemaVersion: CLI_JSON_SCHEMA_VERSION, + command, + ok: true, + outcome, + result: sanitizeCommandResult(command, result ?? {}), + warnings, + error: null + }; +} + +function internalErrorDto() { + return { + code: "INTERNAL_ERROR", + message: CLI_ERROR_MESSAGES.INTERNAL_ERROR, + severity: "fatal", + retryable: false, + recoveryRequired: false + }; +} + +function canonicalErrorSeverity(code) { + if (code === "OPERATION_CANCELLED") return "info"; + if (code === "CORE_RUNTIME_CRASHED") return "fatal"; + if (WARNING_ERROR_CODES.has(code)) return "warning"; + return "error"; +} + +function normalizePublicDetails(details) { + if (!details || typeof details !== "object" || Array.isArray(details)) return undefined; + const normalized = {}; + if (LOCK_SCOPES.has(details.busyScope)) normalized.busyScope = details.busyScope; + if (LOCK_SCOPES.has(details.lockScope)) normalized.lockScope = details.lockScope; + if (SAFE_CAUSE_CODES.has(details.causeCode)) { + normalized.causeCode = details.causeCode; + } + if (SAFE_REASONS.has(details.reason)) normalized.reason = details.reason; + if (details.missing === "config.toml" || details.missing === "state_5.sqlite") { + normalized.missing = details.missing; + } + if (SQLITE_HOME_SOURCES.has(details.sqliteHomeSource)) { + normalized.sqliteHomeSource = details.sqliteHomeSource; + } + for (const key of ["sqlitePrimaryCode", "sqliteExtendedCode"]) { + const code = safeNumber(details[key], { integer: true, minimum: 0 }); + if (code !== undefined && code <= 0xffff) normalized[key] = code; + } + if (OPERATION_KINDS.has(details.operationKind)) normalized.operationKind = details.operationKind; + return Object.keys(normalized).length > 0 ? normalized : undefined; +} + +export function normalizeCliErrorDto(dto) { + try { + assertPlainJsonData(dto); + if (!dto || typeof dto !== "object" || Array.isArray(dto)) return internalErrorDto(); + const code = dto.code; + const message = typeof code === "string" && Object.hasOwn(CLI_ERROR_MESSAGES, code) + ? CLI_ERROR_MESSAGES[code] + : undefined; + if (typeof message !== "string" + || typeof dto.message !== "string" + || !dto.message + || !SEVERITIES.has(dto.severity) + || typeof dto.retryable !== "boolean" + || typeof dto.recoveryRequired !== "boolean") { + return internalErrorDto(); + } + if (code === "INTERNAL_ERROR") return internalErrorDto(); + const details = normalizePublicDetails(dto.details); + const operationId = safeUuid(dto.operationId); + return { + code, + message, + severity: canonicalErrorSeverity(code), + retryable: true, + recoveryRequired: RECOVERY_CODES.has(code), + ...(operationId ? { operationId } : {}), + ...(details ? { details } : {}) + }; + } catch { + return internalErrorDto(); + } +} + +export function inferCliFailureOutcome(errorDto) { + const code = errorDto?.code; + if (code === "OPERATION_CANCELLED") return "cancelled"; + if (RECOVERY_CODES.has(code) || errorDto?.recoveryRequired === true) return "recovery_required"; + if (code === "SYNC_FAILED_ROLLED_BACK") return "failed_rolled_back"; + if (["PLAN_EXPIRED", "PLAN_STALE", "STALE_STATE", "PROFILE_CHANGED", "STORAGE_CHANGED"].includes(code)) { + return "stale"; + } + return "failed"; +} + +export function createCliFailureEnvelope(command, dto) { + const error = normalizeCliErrorDto(dto); + const outcome = inferCliFailureOutcome(error); + if (!FAILURE_OUTCOMES.has(outcome)) throw new TypeError("Invalid CLI failure outcome."); + return { + schemaVersion: CLI_JSON_SCHEMA_VERSION, + command, + ok: false, + outcome, + result: null, + warnings: [], + error + }; +} + +export function cliJsonExitCode(envelope) { + if (envelope?.ok) return envelope.outcome === "partial" ? 3 : 0; + const code = envelope?.error?.code; + if (code === "OPERATION_CANCELLED") return 130; + if (RECOVERY_CODES.has(code) || envelope?.error?.recoveryRequired === true) return 4; + if (BUSY_CODES.has(code)) return 5; + if (STALE_CODES.has(code)) return 2; + return 1; +} diff --git a/src/cli.js b/src/cli.js index 01e3d8a..e3ab3a9 100755 --- a/src/cli.js +++ b/src/cli.js @@ -1,7 +1,14 @@ #!/usr/bin/env node +import fs from "node:fs/promises"; import path from "node:path"; +import { pathToFileURL } from "node:url"; +import { + cliJsonExitCode, + createCliFailureEnvelope, + createCliSuccessEnvelope +} from "./cli-json.js"; import { DEFAULT_BACKUP_RETENTION_COUNT } from "./constants.js"; import { formatBytes, renderStatus } from "./cli-presenter.js"; import { installWindowsLauncher } from "./launcher.js"; @@ -12,18 +19,21 @@ async function loadCore() { return import("./public-api.js"); } -function printHelp() { - console.log(`codex-provider +const HELP_TEXT = `codex-provider Usage: - codex-provider status [--codex-home PATH] [--sqlite-home PATH] - codex-provider sync [--provider ID] [--keep N] [--codex-home PATH] [--sqlite-home PATH] - codex-provider switch [--model NAME] [--keep-root-model] [--keep N] [--codex-home PATH] [--sqlite-home PATH] + codex-provider status [--json] [--codex-home PATH] [--sqlite-home PATH] + codex-provider sync [--json] [--provider ID] [--keep N] [--codex-home PATH] [--sqlite-home PATH] + codex-provider switch [--json] [--model NAME] [--keep-root-model] [--keep N] [--codex-home PATH] [--sqlite-home PATH] codex-provider watch [--codex-home PATH] [--sqlite-home PATH] [--debounce-ms N] [--once] [--no-state-db] codex-provider web [--port N] [--no-open] [--reset-access] [--codex-home PATH] [--sqlite-home PATH] - codex-provider prune-backups [--keep N] [--codex-home PATH] - codex-provider restore [--no-config] [--no-db] [--no-sessions] [--allow-sqlite-home-relocation] [--codex-home PATH] [--sqlite-home PATH] - codex-provider install-windows-launcher [--dir PATH] [--codex-home PATH] [--sqlite-home PATH] + codex-provider prune-backups [--json] [--keep N] [--codex-home PATH] + codex-provider restore [--json] [--no-config] [--no-db] [--no-sessions] [--allow-sqlite-home-relocation] [--codex-home PATH] [--sqlite-home PATH] + codex-provider install-windows-launcher [--json] [--dir PATH] [--codex-home PATH] [--sqlite-home PATH] + +JSON mode: + --json emit one schemaVersion 1 envelope on stdout; progress goes to stderr + (not supported by long-running watch or web commands) switch flags: --model NAME override root-level model field with NAME (e.g. "MiniMax-M3") @@ -42,12 +52,16 @@ web flags: --reset-access invalidate all paired browsers before creating a new pairing --codex-home PATH set the default server-managed storage profile --sqlite-home PATH set the default profile SQLite Home override -`); +`; + +function printHelp(writeLine) { + writeLine(HELP_TEXT); } function parseArgs(argv) { const positionals = []; - const flags = {}; + const flags = Object.create(null); + const flagCounts = Object.create(null); for (let index = 0; index < argv.length; index += 1) { const value = argv[index]; @@ -55,12 +69,19 @@ function parseArgs(argv) { positionals.push(value); continue; } - const [flagName, inlineValue] = value.split("=", 2); + const separatorIndex = value.indexOf("="); + const flagName = separatorIndex >= 0 ? value.slice(0, separatorIndex) : value; + const inlineValue = separatorIndex >= 0 ? value.slice(separatorIndex + 1) : undefined; const normalizedName = flagName.slice(2); + flagCounts[normalizedName] = (flagCounts[normalizedName] ?? 0) + 1; if (inlineValue !== undefined) { flags[normalizedName] = inlineValue; continue; } + if (normalizedName === "json") { + flags[normalizedName] = true; + continue; + } const nextValue = argv[index + 1]; if (nextValue && !nextValue.startsWith("--")) { flags[normalizedName] = nextValue; @@ -70,7 +91,120 @@ function parseArgs(argv) { } } - return { positionals, flags }; + return { positionals, flags, flagCounts }; +} + +const JSON_COMMAND_CONTRACTS = Object.freeze({ + status: { + flags: ["json", "help", "codex-home", "sqlite-home"], + valueFlags: ["codex-home", "sqlite-home"], + booleanFlags: ["json", "help"], + positionalCount: 1 + }, + sync: { + flags: ["json", "help", "provider", "keep", "codex-home", "sqlite-home"], + valueFlags: ["provider", "keep", "codex-home", "sqlite-home"], + booleanFlags: ["json", "help"], + positionalCount: 1 + }, + switch: { + flags: ["json", "help", "model", "keep-root-model", "keep", "codex-home", "sqlite-home"], + valueFlags: ["model", "keep", "codex-home", "sqlite-home"], + booleanFlags: ["json", "help", "keep-root-model"], + positionalCount: 2 + }, + "prune-backups": { + flags: ["json", "help", "keep", "codex-home"], + valueFlags: ["keep", "codex-home"], + booleanFlags: ["json", "help"], + positionalCount: 1 + }, + restore: { + flags: [ + "json", + "help", + "no-config", + "no-db", + "no-sessions", + "allow-sqlite-home-relocation", + "codex-home", + "sqlite-home" + ], + valueFlags: ["codex-home", "sqlite-home"], + booleanFlags: [ + "json", + "help", + "no-config", + "no-db", + "no-sessions", + "allow-sqlite-home-relocation" + ], + positionalCount: 2 + }, + "install-windows-launcher": { + flags: ["json", "help", "dir", "codex-home", "sqlite-home"], + valueFlags: ["dir", "codex-home", "sqlite-home"], + booleanFlags: ["json", "help"], + positionalCount: 1 + } +}); + +const JSON_KNOWN_COMMANDS = new Set([ + ...Object.keys(JSON_COMMAND_CONTRACTS), + "watch", + "web", + "help" +]); + +function invalidInputError(message) { + const error = new Error(message); + error.code = "INVALID_INPUT"; + return error; +} + +function validateJsonFlag(flags) { + if (Object.hasOwn(flags, "json") && flags.json !== true) { + throw invalidInputError("--json is a standalone boolean flag and does not accept a value."); + } +} + +function validateJsonCommandArgs(command, parsed) { + const contract = Object.hasOwn(JSON_COMMAND_CONTRACTS, command) + ? JSON_COMMAND_CONTRACTS[command] + : undefined; + if (!contract) { + if (command === "watch" || command === "web") { + throw invalidInputError( + `${command} does not support --json because it is a long-running command. Use Human mode.` + ); + } + throw invalidInputError(`Unknown command: ${command}`); + } + + const allowedFlags = new Set(contract.flags); + const valueFlags = new Set(contract.valueFlags); + const booleanFlags = new Set(contract.booleanFlags); + for (const [name, count] of Object.entries(parsed.flagCounts)) { + if (!allowedFlags.has(name)) { + throw invalidInputError(`Unknown option for ${command}: --${name}`); + } + if (count !== 1) { + throw invalidInputError(`Option --${name} may only be specified once in JSON mode.`); + } + if (valueFlags.has(name) + && (parsed.flags[name] === true || String(parsed.flags[name]).length === 0)) { + throw invalidInputError(`Option --${name} requires a value.`); + } + if (booleanFlags.has(name) && parsed.flags[name] !== true) { + throw invalidInputError(`Option --${name} is a boolean flag and does not accept a value.`); + } + } + if (parsed.positionals.length !== contract.positionalCount) { + const expected = contract.positionalCount - 1; + throw invalidInputError( + `${command} expects exactly ${expected} positional argument${expected === 1 ? "" : "s"}.` + ); + } } function summarizeSync(result, label) { @@ -149,22 +283,26 @@ const SYNC_PROGRESS_STAGE_INDEX = new Map( SYNC_PROGRESS_STAGES.map(([stage], index) => [stage, index + 1]) ); -function createSyncProgressReporter() { +function createSyncProgressReporter(writeLine, { includeBackupPath = true } = {}) { return (event) => { if (event?.stage === "update_config" && event.status === "start") { - console.log(`Updating config.toml root model_provider to ${event.provider}...`); + writeLine(includeBackupPath + ? `Updating config.toml root model_provider to ${event.provider}...` + : "Updating config.toml root model_provider..."); return; } const stageIndex = SYNC_PROGRESS_STAGE_INDEX.get(event?.stage); if (!stageIndex || event.status !== "start") { if (event?.stage === "create_backup" && event.status === "complete") { - console.log(` Backup created in ${formatDuration(event.durationMs)}: ${event.backupDir}`); + writeLine(includeBackupPath + ? ` Backup created in ${formatDuration(event.durationMs)}: ${event.backupDir}` + : ` Backup created in ${formatDuration(event.durationMs)}`); } return; } - console.log(`[${stageIndex}/${SYNC_PROGRESS_STAGES.length}] ${SYNC_PROGRESS_STAGES[stageIndex - 1][1]}`); + writeLine(`[${stageIndex}/${SYNC_PROGRESS_STAGES.length}] ${SYNC_PROGRESS_STAGES[stageIndex - 1][1]}`); }; } @@ -175,42 +313,154 @@ function parseKeepCount(rawValue, { allowZero = false } = {}) { const normalized = String(rawValue).trim(); if (!/^\d+$/.test(normalized)) { const minimum = allowZero ? 0 : 1; - throw new Error(`Invalid --keep value: ${rawValue}. Expected an integer greater than or equal to ${minimum}.`); + throw invalidInputError(`Invalid --keep value: ${rawValue}. Expected an integer greater than or equal to ${minimum}.`); } const keepCount = Number.parseInt(normalized, 10); const minimum = allowZero ? 0 : 1; if (!Number.isInteger(keepCount) || keepCount < minimum) { - throw new Error(`Invalid --keep value: ${rawValue}. Expected an integer greater than or equal to ${minimum}.`); + throw invalidInputError(`Invalid --keep value: ${rawValue}. Expected an integer greater than or equal to ${minimum}.`); } return keepCount; } -async function main() { - const { positionals, flags } = parseArgs(process.argv.slice(2)); - const command = positionals[0]; +function createLineWriter(stream) { + return (value) => stream.write(`${String(value)}\n`); +} + +const BEST_EFFORT_STREAMS = new WeakSet(); - if (!command || command === "help" || flags.help) { - printHelp(); - return; +function createBestEffortLineWriter(stream) { + if (stream && typeof stream === "object" + && typeof stream.on === "function" + && !BEST_EFFORT_STREAMS.has(stream)) { + stream.on("error", () => {}); + BEST_EFFORT_STREAMS.add(stream); } + return (value) => { + try { + stream.write(`${String(value)}\n`, () => {}); + } catch { + // Progress and diagnostics are observer output and cannot change the operation result. + } + }; +} - assertSupportedNodeVersion(); +function writeJsonDocument(stream, serialized) { + const document = `${serialized}\n`; + if (typeof stream.once !== "function" + || typeof stream.removeListener !== "function" + || stream.write.length < 2) { + stream.write(document); + return Promise.resolve(); + } + + return new Promise((resolve, reject) => { + let settled = false; + const removeErrorListener = () => stream.removeListener("error", onError); + const finish = (error) => { + if (settled) return; + settled = true; + setImmediate(removeErrorListener); + if (error) reject(error); + else resolve(); + }; + const onError = (error) => finish(error); + stream.once("error", onError); + try { + stream.write(document, (error) => finish(error)); + } catch (error) { + finish(error); + } + }); +} + +function validateJsonHelpArgs(parsed) { + if (parsed.positionals.length > 1 + || (parsed.positionals[0] && !JSON_KNOWN_COMMANDS.has(parsed.positionals[0]))) { + throw invalidInputError("Unknown command in JSON help request."); + } + for (const [name, count] of Object.entries(parsed.flagCounts)) { + if (!new Set(["json", "help"]).has(name)) { + throw invalidInputError(`Unknown option in JSON help request: --${name}`); + } + if (count !== 1 || parsed.flags[name] !== true) { + throw invalidInputError(`Option --${name} must be a standalone flag specified once.`); + } + } +} + +function fallbackCliErrorDto(error) { + if (error?.code === "INVALID_INPUT") { + return { + code: "INVALID_INPUT", + message: error instanceof Error ? error.message : "Invalid CLI input.", + severity: "error", + retryable: true, + recoveryRequired: false + }; + } + if (error?.name === "AbortError" && error?.code === "ABORT_ERR") { + return { + code: "OPERATION_CANCELLED", + message: "The operation was cancelled.", + severity: "info", + retryable: true, + recoveryRequired: false + }; + } + return { + code: "INTERNAL_ERROR", + message: "An internal error occurred.", + severity: "fatal", + retryable: false, + recoveryRequired: false + }; +} + +async function cliErrorDto(error, loadCoreImpl) { + if (error?.code === "INVALID_INPUT" + || (error?.name === "AbortError" && error?.code === "ABORT_ERR")) { + return fallbackCliErrorDto(error); + } + try { + const core = await loadCoreImpl(); + if (typeof core.toCoreErrorDto !== "function") { + return fallbackCliErrorDto(error); + } + return core.toCoreErrorDto(error); + } catch { + return fallbackCliErrorDto(error); + } +} + +async function executeCommand({ positionals, flags }, context) { + const { + command, + jsonMode, + stdoutLine, + stderrLine, + environment, + signalTarget, + loadCoreImpl, + startWebUiImpl, + installWindowsLauncherImpl + } = context; if (command === "status") { - const { getStatus } = await loadCore(); + const { getStatus } = await loadCoreImpl(); const status = await getStatus({ codexHome: flags["codex-home"], sqliteHome: flags["sqlite-home"] }); - console.log(renderStatus(status)); - return; + if (!jsonMode) stdoutLine(renderStatus(status)); + return status; } if (command === "sync") { - const { runSync, readConfigText, readRootModelFromConfigText } = await loadCore(); + const { runSync, readConfigText, readRootModelFromConfigText } = await loadCoreImpl(); const { defaultCodexHome } = await import("./constants.js"); const codexHome = path.resolve( - flags["codex-home"] ?? process.env.CODEX_HOME ?? defaultCodexHome() + flags["codex-home"] ?? environment.CODEX_HOME ?? defaultCodexHome() ); const configPath = path.join(codexHome, "config.toml"); let rootModel = null; @@ -218,23 +468,24 @@ async function main() { const cfg = await readConfigText(configPath); rootModel = readRootModelFromConfigText(cfg); } catch { - // config may be missing in degraded scenarios; carry on without a - // model rewrite so the rest of the sync still runs. + // Degraded compatibility path: continue without a per-thread model rewrite. } const result = await runSync({ codexHome: flags["codex-home"], sqliteHome: flags["sqlite-home"], provider: flags.provider, keepCount: parseKeepCount(flags.keep), - onProgress: createSyncProgressReporter(), + onProgress: createSyncProgressReporter(jsonMode ? stderrLine : stdoutLine, { + includeBackupPath: !jsonMode + }), model: rootModel }); - console.log(summarizeSync(result, "Synchronized")); - return; + if (!jsonMode) stdoutLine(summarizeSync(result, "Synchronized")); + return result; } if (command === "switch") { - const { runSwitch } = await loadCore(); + const { runSwitch } = await loadCoreImpl(); const provider = positionals[1] ?? flags.provider; const result = await runSwitch({ codexHome: flags["codex-home"], @@ -243,34 +494,38 @@ async function main() { model: flags.model, keepRootModel: Boolean(flags["keep-root-model"]), keepCount: parseKeepCount(flags.keep), - onProgress: createSyncProgressReporter() + onProgress: createSyncProgressReporter(jsonMode ? stderrLine : stdoutLine, { + includeBackupPath: !jsonMode + }) }); - console.log(summarizeSync(result, "Switched to")); - if (result.modelSync) { - const { applied, source, model, warning } = result.modelSync; - if (applied) { - console.log(`Root-level model: ${model} (source: ${source})`); - } else if (warning) { - console.log(`Root-level model: unchanged (${warning})`); - } else { - console.log("Root-level model: unchanged (keep-root-model flag set)"); + if (!jsonMode) { + stdoutLine(summarizeSync(result, "Switched to")); + if (result.modelSync) { + const { applied, source, model, warning } = result.modelSync; + if (applied) { + stdoutLine(`Root-level model: ${model} (source: ${source})`); + } else if (warning) { + stdoutLine(`Root-level model: unchanged (${warning})`); + } else { + stdoutLine("Root-level model: unchanged (keep-root-model flag set)"); + } } } - return; + return result; } if (command === "prune-backups") { - const { runPruneBackups } = await loadCore(); + const { runPruneBackups } = await loadCoreImpl(); const result = await runPruneBackups({ codexHome: flags["codex-home"], keepCount: parseKeepCount(flags.keep, { allowZero: true }) }); - console.log(summarizePrune(result)); - return; + if (!jsonMode) stdoutLine(summarizePrune(result)); + return result; } if (command === "watch") { - const { runWatch } = await loadCore(); + const { runWatch } = await loadCoreImpl(); const debounceMs = flags["debounce-ms"] !== undefined ? parseKeepCount(flags["debounce-ms"], { allowZero: true }) : undefined; @@ -281,24 +536,15 @@ async function main() { includeStateDb: !flags["no-state-db"], once: Boolean(flags.once) }); - // Race the watcher's own `done` promise (which resolves when - // `--once` completes or the consecutive-failure auto-shutdown - // fires) against the external SIGINT/SIGTERM handler. Whichever - // wins, we stop the watcher cleanly and let the process exit. - // Without this race, the CLI sits in the event loop forever - // after a `--once` run, because Node only exits on its own - // when there are no more pending handles. await new Promise((resolve) => { let settled = false; const finish = async (source) => { - if (settled) { - return; - } + if (settled) return; settled = true; try { await handle.stop(); } catch { - // best effort: stop() may already be in flight + // Best effort: stop() may already be in flight. } resolve(source); }; @@ -306,14 +552,14 @@ async function main() { if (handle.signalPromise) { handle.signalPromise.then(() => finish("signal"), () => finish("signal-rejected")); } - process.once("SIGINT", () => finish("SIGINT")); - process.once("SIGTERM", () => finish("SIGTERM")); + signalTarget.once("SIGINT", () => finish("SIGINT")); + signalTarget.once("SIGTERM", () => finish("SIGTERM")); }); - return; + return {}; } if (command === "web") { - const { startWebUi } = await import("./web-server.js"); + const startWebUi = startWebUiImpl ?? (await import("./web-server.js")).startWebUi; const port = flags.port === undefined ? 8791 : parseKeepCount(flags.port, { allowZero: true }); const handle = await startWebUi({ port, @@ -322,33 +568,31 @@ async function main() { codexHome: flags["codex-home"], sqliteHome: flags["sqlite-home"] }); - console.log(`Codex Provider Sync Web UI: ${handle.url}`); + stdoutLine(`Codex Provider Sync Web UI: ${handle.url}`); if (flags["no-open"] || !handle.browserOpened) { - console.log(`One-time pairing link: ${handle.pairingUrl}`); + stdoutLine(`One-time pairing link: ${handle.pairingUrl}`); } if (handle.reused) { - console.log("Opened the existing Codex Provider Sync Web UI instance."); - return; + stdoutLine("Opened the existing Codex Provider Sync Web UI instance."); + return {}; } - console.log("The server only listens on 127.0.0.1. Press Ctrl+C to stop it."); + stdoutLine("The server only listens on 127.0.0.1. Press Ctrl+C to stop it."); await new Promise((resolve) => { let closing = false; const close = async () => { - if (closing) { - return; - } + if (closing) return; closing = true; await handle.close().catch(() => {}); resolve(); }; - process.once("SIGINT", close); - process.once("SIGTERM", close); + signalTarget.once("SIGINT", close); + signalTarget.once("SIGTERM", close); }); - return; + return {}; } if (command === "restore") { - const { runRestore } = await loadCore(); + const { runRestore } = await loadCoreImpl(); const backupDir = positionals[1] ?? flags.backup; const result = await runRestore({ codexHome: flags["codex-home"], @@ -359,42 +603,132 @@ async function main() { restoreSessions: !flags["no-sessions"], allowSqliteHomeRelocation: Boolean(flags["allow-sqlite-home-relocation"]) }); - console.log(`Restored backup from ${path.resolve(backupDir)}`); - console.log(`Codex home: ${result.codexHome}`); - console.log(`Provider at backup time: ${result.targetProvider}`); - if (result.backupInventoryWarning) { - console.log(`Backup inventory warning: ${result.backupInventoryWarning}`); + const jsonResult = { ...result, backupDir: path.resolve(backupDir) }; + if (!jsonMode) { + stdoutLine(`Restored backup from ${path.resolve(backupDir)}`); + stdoutLine(`Codex home: ${result.codexHome}`); + stdoutLine(`Provider at backup time: ${result.targetProvider}`); + if (result.backupInventoryWarning) { + stdoutLine(`Backup inventory warning: ${result.backupInventoryWarning}`); + } } - return; + return jsonResult; } if (command === "install-windows-launcher") { - const result = await installWindowsLauncher({ + const result = await installWindowsLauncherImpl({ dir: flags.dir, codexHome: flags["codex-home"], sqliteHome: flags["sqlite-home"] }); - console.log("Installed Windows launcher files:"); - console.log(` Hidden double-click launcher: ${result.vbsPath}`); - console.log(` Visible console launcher: ${result.cmdPath}`); - console.log(` Target directory: ${result.targetDir}`); - if (result.codexHome) { - console.log(` Fixed CODEX_HOME: ${result.codexHome}`); - } else { - console.log(" CODEX_HOME: default current environment / ~/.codex"); + if (!jsonMode) { + stdoutLine("Installed Windows launcher files:"); + stdoutLine(` Hidden double-click launcher: ${result.vbsPath}`); + stdoutLine(` Visible console launcher: ${result.cmdPath}`); + stdoutLine(` Target directory: ${result.targetDir}`); + if (result.codexHome) { + stdoutLine(` Fixed CODEX_HOME: ${result.codexHome}`); + } else { + stdoutLine(" CODEX_HOME: default current environment / ~/.codex"); + } + if (result.sqliteHome) { + stdoutLine(` Fixed SQLite home: ${result.sqliteHome}`); + } else { + stdoutLine(" SQLite home: config / environment / Codex default"); + } } - if (result.sqliteHome) { - console.log(` Fixed SQLite home: ${result.sqliteHome}`); - } else { - console.log(" SQLite home: config / environment / Codex default"); + return result; + } + + throw invalidInputError(`Unknown command: ${command}`); +} + +export async function runCli(argv, options = {}) { + const stdout = options.stdout ?? process.stdout; + const stderr = options.stderr ?? process.stderr; + const parsed = parseArgs(argv); + const jsonMode = Object.hasOwn(parsed.flags, "json"); + const stdoutLine = createLineWriter(stdout); + const stderrLine = jsonMode + ? createBestEffortLineWriter(stderr) + : createLineWriter(stderr); + const requestedCommand = parsed.positionals[0]; + let command = requestedCommand ?? "help"; + if (jsonMode && !JSON_KNOWN_COMMANDS.has(command)) command = "unknown"; + let terminalWritten = false; + const loadCoreImpl = options.loadCoreImpl ?? loadCore; + + const writeEnvelope = async (envelope) => { + const serialized = JSON.stringify(envelope); + if (terminalWritten) { + throw new Error("CLI JSON terminal envelope was already written."); } - return; + terminalWritten = true; + await writeJsonDocument(stdout, serialized); + }; + + try { + validateJsonFlag(parsed.flags); + if (!requestedCommand || requestedCommand === "help" || parsed.flags.help) { + command = "help"; + if (jsonMode) { + validateJsonHelpArgs(parsed); + const envelope = createCliSuccessEnvelope("help", { + text: HELP_TEXT.trimEnd(), + requestedCommand: requestedCommand && requestedCommand !== "help" + ? requestedCommand + : null + }); + await writeEnvelope(envelope); + return cliJsonExitCode(envelope); + } + printHelp(stdoutLine); + return 0; + } + + assertSupportedNodeVersion(); + if (jsonMode) validateJsonCommandArgs(command, parsed); + const result = await executeCommand(parsed, { + command, + jsonMode, + stdoutLine, + stderrLine, + environment: options.environment ?? process.env, + signalTarget: options.signalTarget ?? process, + loadCoreImpl, + startWebUiImpl: options.startWebUiImpl, + installWindowsLauncherImpl: options.installWindowsLauncherImpl ?? installWindowsLauncher + }); + if (jsonMode) { + const envelope = createCliSuccessEnvelope(command, result); + await writeEnvelope(envelope); + return cliJsonExitCode(envelope); + } + return 0; + } catch (error) { + if (!jsonMode) { + stderrLine(error instanceof Error ? error.message : String(error)); + return 1; + } + const envelope = createCliFailureEnvelope(command, await cliErrorDto(error, loadCoreImpl)); + if (!terminalWritten) await writeEnvelope(envelope); + return cliJsonExitCode(envelope); } +} - throw new Error(`Unknown command: ${command}`); +async function isDirectExecution() { + if (!process.argv[1]) return false; + try { + return pathToFileURL(await fs.realpath(process.argv[1])).href === import.meta.url; + } catch { + return pathToFileURL(path.resolve(process.argv[1])).href === import.meta.url; + } } -main().catch((error) => { - console.error(error instanceof Error ? error.message : String(error)); - process.exitCode = 1; -}); +if (await isDirectExecution()) { + try { + process.exitCode = await runCli(process.argv.slice(2)); + } catch { + process.exitCode = 1; + } +} diff --git a/test-support/cli-json-driver.js b/test-support/cli-json-driver.js new file mode 100644 index 0000000..a9455a9 --- /dev/null +++ b/test-support/cli-json-driver.js @@ -0,0 +1,95 @@ +import { CoreError, toCoreErrorDto } from "../src/public-api.js"; +import { runCli } from "../src/cli.js"; + +const scenario = process.env.CODEX_PROVIDER_SYNC_CLI_SCENARIO ?? "completed"; + +function errorForScenario() { + if (scenario === "error-secret-details") { + return new CoreError("OPERATION_BUSY", "The operation is busy.", { + details: { + busyScope: "codex-home", + authToken: "fixture-secret-token", + messageBody: "fixture secret body" + } + }); + } + const code = scenario.startsWith("error:") ? scenario.slice("error:".length) : null; + if (!code) return null; + const details = code === "OPERATION_BUSY" + ? { busyScope: "codex-home" } + : code === "LOCK_UNVERIFIABLE" + ? { lockScope: "state-db" } + : undefined; + return new CoreError(code, `${code} fixture`, { details }); +} + +function completedSyncResult() { + return { + targetProvider: "openai", + codexHome: "C:\\fixture\\.codex", + sqliteHome: "C:\\fixture\\.codex\\sqlite", + sqliteHomeSource: "default", + backupDir: "C:\\fixture\\.codex\\backups_state\\provider-sync\\fixture", + backupDurationMs: 25, + changedSessionFiles: 1, + sqliteRowsUpdated: 1, + sqlitePresent: true, + skippedLockedRolloutFiles: scenario === "partial" ? ["locked-rollout.jsonl"] : [], + autoPruneWarning: scenario === "warning" ? "cleanup warning" : null + }; +} + +const core = { + toCoreErrorDto, + readConfigText: async () => 'model_provider = "openai"\n', + readRootModelFromConfigText: () => null, + getStatus: async () => ({ + schemaVersion: 1, + currentProvider: "openai", + codexHome: "C:\\fixture\\.codex" + }), + runSync: async ({ onProgress }) => { + onProgress?.({ stage: "scan_rollout_files", status: "start" }); + onProgress?.({ + stage: "create_backup", + status: "complete", + durationMs: 25, + backupDir: "C:\\fixture\\secret-backup-path" + }); + const error = errorForScenario(); + if (error) throw error; + if (scenario === "cyclic-result") { + const result = {}; + result.self = result; + return result; + } + return completedSyncResult(); + }, + runSwitch: async () => ({ + ...completedSyncResult(), + modelSync: { applied: true, source: "explicit", model: "fixture-model", warning: null } + }), + runPruneBackups: async () => ({ + backupRoot: "C:\\fixture\\backups", + deletedCount: 0, + remainingCount: 1, + freedBytes: 0 + }), + runRestore: async () => ({ + codexHome: "C:\\fixture\\.codex", + targetProvider: "openai", + backupInventoryWarning: scenario === "warning" ? "inventory warning" : null + }) +}; + +const exitCode = await runCli(process.argv.slice(2), { + loadCoreImpl: async () => core, + installWindowsLauncherImpl: async () => ({ + vbsPath: "C:\\fixture\\Codex Provider Sync.vbs", + cmdPath: "C:\\fixture\\Codex Provider Sync.cmd", + targetDir: "C:\\fixture", + codexHome: null, + sqliteHome: null + }) +}); +process.exitCode = exitCode; diff --git a/test/cli-json-contract.test.js b/test/cli-json-contract.test.js new file mode 100644 index 0000000..80c9e71 --- /dev/null +++ b/test/cli-json-contract.test.js @@ -0,0 +1,364 @@ +import { spawn } from "node:child_process"; +import assert from "node:assert/strict"; +import { EventEmitter } from "node:events"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; +import { fileURLToPath } from "node:url"; + +import { runCli } from "../src/cli.js"; + +const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const cliPath = path.join(repositoryRoot, "src", "cli.js"); +const driverPath = path.join(repositoryRoot, "test-support", "cli-json-driver.js"); +const ENVELOPE_KEYS = [ + "schemaVersion", + "command", + "ok", + "outcome", + "result", + "warnings", + "error" +]; + +async function runNode(scriptPath, args, { scenario, env = {} } = {}) { + return new Promise((resolve, reject) => { + const child = spawn(process.execPath, [scriptPath, ...args], { + cwd: repositoryRoot, + env: { + ...process.env, + ...env, + ...(scenario ? { CODEX_PROVIDER_SYNC_CLI_SCENARIO: scenario } : {}) + }, + stdio: ["ignore", "pipe", "pipe"], + windowsHide: true + }); + let stdout = ""; + let stderr = ""; + child.stdout.setEncoding("utf8"); + child.stderr.setEncoding("utf8"); + child.stdout.on("data", (chunk) => { stdout += chunk; }); + child.stderr.on("data", (chunk) => { stderr += chunk; }); + child.once("error", reject); + child.once("exit", (code, signal) => resolve({ code, signal, stdout, stderr })); + }); +} + +function parseSingleEnvelope(stdout) { + assert.ok(stdout.endsWith("\n"), "stdout must end with exactly one JSON line terminator"); + assert.equal((stdout.match(/\n/g) ?? []).length, 1, stdout); + const envelope = JSON.parse(stdout); + assert.deepEqual(Object.keys(envelope), ENVELOPE_KEYS); + assert.equal(envelope.schemaVersion, 1); + assert.equal(/\x1b\[/.test(stdout), false, "stdout must not contain ANSI sequences"); + return envelope; +} + +test("real CLI emits schema help JSON and keeps Human help unchanged", async () => { + const json = await runNode(cliPath, ["--json"]); + assert.equal(json.code, 0); + assert.equal(json.signal, null); + assert.equal(json.stderr, ""); + const envelope = parseSingleEnvelope(json.stdout); + assert.equal(envelope.command, "help"); + assert.equal(envelope.ok, true); + assert.match(envelope.result.text, /^codex-provider\n\nUsage:/); + + const human = await runNode(cliPath, ["--help"]); + assert.equal(human.code, 0); + assert.equal(human.stderr, ""); + assert.match(human.stdout, /^codex-provider\r?\n\r?\nUsage:/); + assert.doesNotMatch(human.stdout, /"schemaVersion"/); +}); + +test("real CLI JSON input failures use one stdout document and exit 2", async () => { + const cases = [ + ["unknown", "--json"], + ["sync", "--json", "--keep", "1.5"], + ["status", "--json", "--unknown"], + ["status", "--json", "--json"], + ["status", "--json=false"] + ]; + for (const args of cases) { + const result = await runNode(cliPath, args); + assert.equal(result.code, 2, args.join(" ")); + assert.equal(result.stderr, "", args.join(" ")); + const envelope = parseSingleEnvelope(result.stdout); + assert.equal(envelope.ok, false); + assert.equal(envelope.error.code, "INVALID_INPUT"); + if (args[0] === "unknown") assert.equal(envelope.command, "unknown"); + } + + const human = await runNode(cliPath, ["unknown"]); + assert.equal(human.code, 1); + assert.equal(human.stdout, ""); + assert.match(human.stderr, /^Unknown command: unknown\r?\n$/); +}); + +test("JSON input and storage errors never echo untrusted values", async () => { + const secretCommand = "fixtureSecretCommandValue"; + const unknownCommand = await runNode(cliPath, [secretCommand, "--json"]); + assert.equal(unknownCommand.code, 2); + assert.equal(parseSingleEnvelope(unknownCommand.stdout).command, "unknown"); + assert.doesNotMatch(`${unknownCommand.stdout}${unknownCommand.stderr}`, new RegExp(secretCommand)); + + const secretProto = "fixtureSecretProto"; + const prototypeFlag = await runNode(cliPath, ["status", "--json", `--__proto__=${secretProto}`]); + assert.equal(prototypeFlag.code, 2); + assert.equal(parseSingleEnvelope(prototypeFlag.stdout).error.code, "INVALID_INPUT"); + assert.doesNotMatch(`${prototypeFlag.stdout}${prototypeFlag.stderr}`, new RegExp(secretProto)); + + const secretKeep = "fixtureSecretToken123"; + const invalidKeep = await runNode(cliPath, ["sync", "--json", "--keep", secretKeep]); + assert.equal(invalidKeep.code, 2); + assert.equal(parseSingleEnvelope(invalidKeep.stdout).error.message, "The command input is invalid."); + assert.doesNotMatch(`${invalidKeep.stdout}${invalidKeep.stderr}`, new RegExp(secretKeep)); + + const missingHome = path.join(os.tmpdir(), "fixture-secret-home-value", "missing"); + const missing = await runNode(cliPath, ["status", "--json", "--codex-home", missingHome]); + assert.equal(missing.code, 1); + const envelope = parseSingleEnvelope(missing.stdout); + assert.equal(envelope.error.code, "INTERNAL_ERROR"); + assert.equal(envelope.error.message, "An internal error occurred."); + assert.doesNotMatch(`${missing.stdout}${missing.stderr}`, /fixture-secret-home-value/); +}); + +test("real CLI status JSON returns Core status without writing Human text", async () => { + const parent = await fs.mkdtemp(path.join(os.tmpdir(), "codex-provider-sync-cli-status-")); + const root = path.join(parent, "codex=tail"); + try { + await fs.mkdir(path.join(root, "sessions"), { recursive: true }); + await fs.writeFile(path.join(root, "config.toml"), 'model_provider = "openai"\n', "utf8"); + const result = await runNode(cliPath, ["status", "--json", `--codex-home=${root}`]); + assert.equal(result.code, 0); + assert.equal(result.stderr, ""); + const envelope = parseSingleEnvelope(result.stdout); + assert.equal(envelope.command, "status"); + assert.equal(envelope.ok, true); + assert.equal(envelope.result.codexHome, path.resolve(root)); + assert.equal(envelope.result.currentProvider, "openai"); + assert.equal(envelope.error, null); + assert.doesNotMatch(result.stdout, /^Codex home:/); + } finally { + await fs.rm(parent, { recursive: true, force: true }); + } +}); + +test("every finite JSON command returns the same top-level envelope", async () => { + const cases = [ + ["status", ["status", "--json"]], + ["sync", ["sync", "--json"]], + ["switch", ["switch", "openai", "--model", "fixture-model", "--json"]], + ["prune-backups", ["prune-backups", "--keep", "0", "--json"]], + ["restore", ["restore", "C:\\fixture\\backup", "--no-config", "--json"]], + ["install-windows-launcher", ["install-windows-launcher", "--json"]] + ]; + + for (const [command, args] of cases) { + const result = await runNode(driverPath, args); + assert.equal(result.code, 0, command); + const envelope = parseSingleEnvelope(result.stdout); + assert.equal(envelope.command, command); + assert.equal(envelope.ok, true); + assert.equal(envelope.outcome, "completed"); + assert.equal(envelope.error, null); + } +}); + +test("JSON sync progress goes only to stderr and redacts the backup path", async () => { + const result = await runNode(driverPath, ["sync", "--json"], { scenario: "warning" }); + assert.equal(result.code, 0); + const envelope = parseSingleEnvelope(result.stdout); + assert.equal(envelope.command, "sync"); + assert.deepEqual(envelope.warnings, ["Automatic backup cleanup did not complete."]); + assert.match(result.stderr, /\[1\/6\] Scanning rollout files/); + assert.match(result.stderr, /Backup created in 25 ms/); + assert.doesNotMatch(result.stderr, /secret-backup-path/); + assert.doesNotMatch(result.stdout, /\[1\/6\]|secret-backup-path/); +}); + +test("JSON subprocess exit matrix covers partial and canonical failures", async () => { + const cases = [ + ["partial", 3, true, "partial", null], + ["error:SYNC_FAILED_ROLLED_BACK", 1, false, "failed_rolled_back", "SYNC_FAILED_ROLLED_BACK"], + ["error:INVALID_INPUT", 2, false, "failed", "INVALID_INPUT"], + ["error:PLAN_EXPIRED", 2, false, "stale", "PLAN_EXPIRED"], + ["error:STALE_STATE", 2, false, "stale", "STALE_STATE"], + ["error:RECOVERY_REQUIRED", 4, false, "recovery_required", "RECOVERY_REQUIRED"], + ["error:PENDING_TRANSACTION", 4, false, "recovery_required", "PENDING_TRANSACTION"], + ["error:OPERATION_BUSY", 5, false, "failed", "OPERATION_BUSY"], + ["error:LOCK_UNVERIFIABLE", 5, false, "failed", "LOCK_UNVERIFIABLE"], + ["error:SQLITE_BUSY", 5, false, "failed", "SQLITE_BUSY"], + ["error:OPERATION_CANCELLED", 130, false, "cancelled", "OPERATION_CANCELLED"] + ]; + + for (const [scenario, code, ok, outcome, errorCode] of cases) { + const result = await runNode(driverPath, ["sync", "--json"], { scenario }); + assert.equal(result.code, code, scenario); + const envelope = parseSingleEnvelope(result.stdout); + assert.equal(envelope.ok, ok, scenario); + assert.equal(envelope.outcome, outcome, scenario); + assert.equal(envelope.error?.code ?? null, errorCode, scenario); + } +}); + +test("serialization failure still emits one redacted INTERNAL_ERROR envelope", async () => { + const result = await runNode(driverPath, ["sync", "--json"], { scenario: "cyclic-result" }); + assert.equal(result.code, 1); + const envelope = parseSingleEnvelope(result.stdout); + assert.equal(envelope.ok, false); + assert.equal(envelope.error.code, "INTERNAL_ERROR"); + assert.equal(envelope.error.message, "An internal error occurred."); + assert.doesNotMatch(result.stdout, /circular|stack|cause/i); +}); + +test("typed Core errors cannot inject unapproved details into JSON", async () => { + const result = await runNode(driverPath, ["sync", "--json"], { + scenario: "error-secret-details" + }); + assert.equal(result.code, 5); + const envelope = parseSingleEnvelope(result.stdout); + assert.equal(envelope.error.code, "OPERATION_BUSY"); + assert.deepEqual(envelope.error.details, { busyScope: "codex-home" }); + assert.doesNotMatch(`${result.stdout}${result.stderr}`, /fixture-secret-token|fixture secret body/); +}); + +test("watch and web reject JSON before creating long-running state", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "codex-provider-sync-cli-json-")); + try { + for (const command of ["watch", "web"]) { + const result = await runNode(cliPath, [command, "--json", "--codex-home", root]); + assert.equal(result.code, 2, command); + assert.equal(result.stderr, "", command); + const envelope = parseSingleEnvelope(result.stdout); + assert.equal(envelope.error.code, "INVALID_INPUT"); + assert.equal(envelope.error.message, "The command input is invalid."); + } + assert.deepEqual(await fs.readdir(root), []); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } +}); + +test("watch and web JSON validation does not load Core or start Web", async () => { + for (const args of [ + ["watch", "--once", "--json"], + ["web", "--no-open", "--json"] + ]) { + let coreLoads = 0; + let webStarts = 0; + const stdoutChunks = []; + const exitCode = await runCli(args, { + stdout: { + write(document) { + stdoutChunks.push(document); + } + }, + stderr: { write() {} }, + loadCoreImpl: async () => { + coreLoads += 1; + return {}; + }, + startWebUiImpl: async () => { + webStarts += 1; + } + }); + + assert.equal(exitCode, 2, args[0]); + assert.equal(coreLoads, 0, args[0]); + assert.equal(webStarts, 0, args[0]); + assert.equal(parseSingleEnvelope(stdoutChunks.join("")).error.code, "INVALID_INPUT"); + } +}); + +test("JSON terminal writer attempts stdout at most once when the pipe closes", async () => { + let stdoutWrites = 0; + let stderrWrites = 0; + + const exitCode = await runCli(["--json"], { + stdout: { + write() { + stdoutWrites += 1; + const error = new Error("pipe closed"); + error.code = "EPIPE"; + throw error; + } + }, + stderr: { + write() { + stderrWrites += 1; + } + } + }); + + assert.equal(exitCode, 1); + assert.equal(stdoutWrites, 1); + assert.equal(stderrWrites, 0); +}); + +test("JSON terminal writer handles asynchronous EPIPE without a second write", async () => { + const stdout = new EventEmitter(); + let stdoutWrites = 0; + let stderrWrites = 0; + stdout.write = (_document, callback) => { + stdoutWrites += 1; + process.nextTick(() => { + const error = new Error("pipe closed asynchronously"); + error.code = "EPIPE"; + stdout.emit("error", error); + callback(error); + }); + return true; + }; + + const exitCode = await runCli(["--json"], { + stdout, + stderr: { + write() { + stderrWrites += 1; + } + } + }); + + assert.equal(exitCode, 1); + assert.equal(stdoutWrites, 1); + assert.equal(stderrWrites, 0); +}); + +test("JSON progress stream failures cannot change the operation result", async () => { + const stdoutChunks = []; + const stderr = new EventEmitter(); + let stderrWrites = 0; + stderr.write = (_document, callback) => { + stderrWrites += 1; + const error = new Error("diagnostic pipe closed"); + error.code = "EPIPE"; + stderr.emit("error", error); + callback?.(error); + return false; + }; + + const exitCode = await runCli(["sync", "--json"], { + stdout: { + write(document) { + stdoutChunks.push(document); + } + }, + stderr, + loadCoreImpl: async () => ({ + readConfigText: async () => "", + readRootModelFromConfigText: () => null, + runSync: async ({ onProgress }) => { + onProgress({ stage: "scan_rollout_files", status: "start" }); + return { targetProvider: "openai", skippedLockedRolloutFiles: [] }; + } + }) + }); + + assert.equal(exitCode, 0); + assert.equal(stderrWrites, 1); + const envelope = parseSingleEnvelope(stdoutChunks.join("")); + assert.equal(envelope.ok, true); + assert.equal(envelope.outcome, "completed"); +}); diff --git a/test/cli-json.test.js b/test/cli-json.test.js new file mode 100644 index 0000000..57fc539 --- /dev/null +++ b/test/cli-json.test.js @@ -0,0 +1,256 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { + CLI_JSON_SCHEMA_VERSION, + cliJsonExitCode, + collectCliWarnings, + createCliFailureEnvelope, + createCliSuccessEnvelope, + inferCliSuccessOutcome, + normalizeCliErrorDto +} from "../src/cli-json.js"; + +const ENVELOPE_KEYS = [ + "schemaVersion", + "command", + "ok", + "outcome", + "result", + "warnings", + "error" +]; + +function dto(code, overrides = {}) { + return { + code, + message: `${code} fixture`, + severity: "error", + retryable: true, + recoveryRequired: false, + ...overrides + }; +} + +test("CLI JSON success envelope has the exact schema v1 top-level shape", () => { + const result = { + targetProvider: "openai", + skippedLockedRolloutFiles: ["locked.jsonl"], + encryptedContentWarning: "encrypted warning", + autoPruneWarning: "prune warning" + }; + const envelope = createCliSuccessEnvelope("sync", result); + + assert.equal(CLI_JSON_SCHEMA_VERSION, 1); + assert.deepEqual(Object.keys(envelope), ENVELOPE_KEYS); + assert.equal(envelope.schemaVersion, 1); + assert.equal(envelope.ok, true); + assert.equal(envelope.outcome, "partial"); + assert.notEqual(envelope.result, result); + assert.equal( + envelope.result.encryptedContentWarning, + "Existing encrypted content may not be usable with the target provider." + ); + assert.equal(envelope.result.autoPruneWarning, "Automatic backup cleanup did not complete."); + assert.deepEqual(envelope.warnings, [ + "Existing encrypted content may not be usable with the target provider.", + "Automatic backup cleanup did not complete." + ]); + assert.equal(envelope.error, null); + assert.equal(cliJsonExitCode(envelope), 3); +}); + +test("CLI JSON success outcome and warning inference is deterministic", () => { + assert.equal(inferCliSuccessOutcome({ noop: true }), "noop"); + assert.equal(inferCliSuccessOutcome({}), "completed"); + assert.deepEqual(collectCliWarnings({ + warnings: ["one", "one", null], + backupInventoryWarning: "two", + modelSync: { warning: "three" } + }), [ + "The operation completed with a warning.", + "Backup inventory refresh did not complete.", + "The selected provider has no default model; the root model was not changed." + ]); + assert.equal(cliJsonExitCode(createCliSuccessEnvelope("status", {})), 0); +}); + +test("CLI JSON failure exit codes follow the frozen matrix", () => { + const cases = [ + ["INVALID_INPUT", 2, "failed"], + ["PLAN_EXPIRED", 2, "stale"], + ["PLAN_STALE", 2, "stale"], + ["STALE_STATE", 2, "stale"], + ["PROFILE_CHANGED", 2, "stale"], + ["STORAGE_CHANGED", 2, "stale"], + ["SYNC_FAILED_ROLLED_BACK", 1, "failed_rolled_back"], + ["RECOVERY_REQUIRED", 4, "recovery_required"], + ["PENDING_TRANSACTION", 4, "recovery_required"], + ["OPERATION_BUSY", 5, "failed"], + ["LOCK_UNVERIFIABLE", 5, "failed"], + ["SQLITE_BUSY", 5, "failed"], + ["OPERATION_CANCELLED", 130, "cancelled"], + ["PERMISSION_DENIED", 1, "failed"], + ["INTERNAL_ERROR", 1, "failed"] + ]; + + for (const [code, exitCode, outcome] of cases) { + const overrides = code === "RECOVERY_REQUIRED" || code === "PENDING_TRANSACTION" + ? { recoveryRequired: true } + : {}; + const envelope = createCliFailureEnvelope("sync", dto(code, overrides)); + assert.deepEqual(Object.keys(envelope), ENVELOPE_KEYS, code); + assert.equal(envelope.ok, false, code); + assert.equal(envelope.outcome, outcome, code); + assert.equal(envelope.result, null, code); + assert.deepEqual(envelope.warnings, [], code); + assert.equal(cliJsonExitCode(envelope), exitCode, code); + } +}); + +test("CLI JSON hides arbitrary internal error text and optional properties", () => { + const normalized = normalizeCliErrorDto({ + code: "INTERNAL_ERROR", + message: "authToken=secret and message body", + severity: "fatal", + retryable: false, + recoveryRequired: false, + details: { authToken: "secret" }, + operationId: "secret-operation" + }); + assert.deepEqual(normalized, { + code: "INTERNAL_ERROR", + message: "An internal error occurred.", + severity: "fatal", + retryable: false, + recoveryRequired: false + }); + assert.doesNotMatch(JSON.stringify(normalized), /secret|message body/); +}); + +test("CLI JSON rejects inherited error-code property names", () => { + for (const code of ["__proto__", "constructor", "toString"]) { + const normalized = normalizeCliErrorDto(dto(code)); + assert.deepEqual(normalized, { + code: "INTERNAL_ERROR", + message: "An internal error occurred.", + severity: "fatal", + retryable: false, + recoveryRequired: false + }, code); + } +}); + +test("CLI JSON allowlists typed error details and result fields", () => { + const envelope = createCliFailureEnvelope("sync", dto("OPERATION_BUSY", { + message: "token=secret-token", + operationId: "secret-operation", + suggestedAction: "Use token=secret-token", + details: { + busyScope: "codex-home", + causeCode: "SQLITE_BUSY", + authToken: "secret-token", + messageBody: "secret body", + reason: "secret-reason", + revision: "secret-revision" + } + })); + assert.equal(envelope.error.message, "Another write operation is using the protected resource."); + assert.deepEqual(envelope.error.details, { + busyScope: "codex-home", + causeCode: "SQLITE_BUSY" + }); + assert.equal(Object.hasOwn(envelope.error, "operationId"), false); + assert.equal(Object.hasOwn(envelope.error, "suggestedAction"), false); + + const success = createCliSuccessEnvelope("sync", { + changedSessionFiles: 1, + authToken: "secret-token", + apiKey: "secret-api-key", + accessKey: "secret-access-key", + cookie: "secret-cookie", + prompt: "secret-prompt", + message: "secret-message", + text: "secret-text", + encrypted_content: "secret-content", + nested: { + messageBody: "secret body", + cause: { stack: "secret stack" } + }, + warnings: ["C:\\private\\path\\token.txt"] + }); + assert.deepEqual(success.result, { + changedSessionFiles: 1, + warnings: ["The operation completed with a warning."] + }); + assert.doesNotMatch( + JSON.stringify(success), + /secret-token|secret-api|secret-access|secret-cookie|secret-prompt|secret-message|secret-text|secret-content|secret body|secret stack|private/ + ); +}); + +test("CLI JSON malformed DTOs fail closed without invoking hostile getters", () => { + const cyclic = {}; + cyclic.self = cyclic; + assert.equal(createCliFailureEnvelope("sync", dto("OPERATION_BUSY", { + details: { busyScope: "codex-home", reason: cyclic } + })).error.code, "INTERNAL_ERROR"); + + const hostile = new Proxy({}, { + get() { + throw new Error("secret getter text"); + }, + ownKeys() { + throw new Error("secret getter text"); + } + }); + const normalized = normalizeCliErrorDto(hostile); + assert.equal(normalized.code, "INTERNAL_ERROR"); + assert.doesNotMatch(JSON.stringify(normalized), /secret getter/); +}); + +test("CLI JSON command result schemas expose only audited fields", () => { + const status = createCliSuccessEnvelope("status", { + currentProvider: "openai", + sqliteAccess: { + supported: false, + reason: "windows-wsl-unc", + message: "secret diagnostic text" + }, + rolloutCounts: { + sessions: { openai: 2 }, + archived_sessions: { openai: 1 } + }, + prompt: "secret prompt", + message: "secret message" + }); + assert.deepEqual(status.result, { + sqliteAccess: { supported: false, reason: "windows-wsl-unc" }, + currentProvider: "openai", + rolloutCounts: { + sessions: { openai: 2 }, + archived_sessions: { openai: 1 } + } + }); + + const restore = createCliSuccessEnvelope("restore", { + version: 2, + namespace: "provider-sync", + codexHome: "C:\\fixture\\.codex", + targetProvider: "openai", + sqliteDbFiles: ["state_5.sqlite"], + changedSessionFiles: 2, + apiKey: "secret api key", + metadata: { prompt: "secret prompt" } + }); + assert.deepEqual(restore.result, { + version: 2, + namespace: "provider-sync", + codexHome: "C:\\fixture\\.codex", + targetProvider: "openai", + sqliteDbFiles: ["state_5.sqlite"], + changedSessionFiles: 2 + }); + assert.doesNotMatch(JSON.stringify({ status, restore }), /secret/); + assert.throws(() => createCliSuccessEnvelope("unknown-command", {}), /Unsupported CLI JSON/); +}); diff --git a/test/sync-service.test.js b/test/sync-service.test.js index 843f75a..d4af1e5 100644 --- a/test/sync-service.test.js +++ b/test/sync-service.test.js @@ -3939,6 +3939,134 @@ test("cli sync prints stage progress and backup timing", async () => { assert.match(result.stdout, /Backup creation time: /); }); +test("real cli sync JSON keeps the terminal envelope on stdout and progress on stderr", async () => { + const { codexHome } = await makeTempCodexHome(); + await writeConfig(codexHome, 'model_provider = "openai"'); + const sessionPath = path.join(codexHome, "sessions", "2026", "03", "19", "rollout-json.jsonl"); + await writeRollout(sessionPath, "thread-json", "apigather"); + await writeStateDb(codexHome, [ + { id: "thread-json", model_provider: "apigather", archived: false } + ]); + + const result = await runCli(["sync", "--json", "--codex-home", codexHome]); + assert.equal(result.code, 0); + assert.equal((result.stdout.match(/\n/g) ?? []).length, 1); + const envelope = JSON.parse(result.stdout); + assert.deepEqual(Object.keys(envelope), [ + "schemaVersion", + "command", + "ok", + "outcome", + "result", + "warnings", + "error" + ]); + assert.equal(envelope.command, "sync"); + assert.equal(envelope.ok, true); + assert.equal(envelope.outcome, "completed"); + assert.equal(envelope.result.changedSessionFiles, 1); + assert.equal(envelope.result.sqliteRowsUpdated, 1); + assert.equal(envelope.error, null); + assert.doesNotMatch(result.stdout, /\[1\/6\]/); + assert.match(result.stderr, /\[1\/6\] Scanning rollout files/); + assert.match(result.stderr, /\[6\/6\] Cleaning backups/); +}); + +test("real cli sync JSON returns exit 4 for an unfinished transaction without a new backup", async () => { + const { codexHome } = await makeTempCodexHome(); + await writeConfig(codexHome, 'model_provider = "openai"'); + await writeStateDb(codexHome, [{ id: "thread-json-pending", model_provider: "openai" }]); + const configPath = path.join(codexHome, "config.toml"); + const backupDir = await createBackup({ + codexHome, + targetProvider: "openai", + sessionChanges: [], + configPath + }); + await TransactionJournal.create(backupDir, { + codexHome, + targetProvider: "openai", + potentialTargets: [configPath] + }); + + const beforeBackups = await fs.readdir(backupRoot(codexHome)); + const result = await runCli(["sync", "--json", "--codex-home", codexHome]); + assert.equal(result.code, 4); + assert.equal((result.stdout.match(/\n/g) ?? []).length, 1); + const envelope = JSON.parse(result.stdout); + assert.equal(envelope.ok, false); + assert.equal(envelope.outcome, "recovery_required"); + assert.equal(envelope.error.code, "RECOVERY_REQUIRED"); + assert.equal(envelope.error.recoveryRequired, true); + assert.deepEqual(await fs.readdir(backupRoot(codexHome)), beforeBackups); +}); + +test("real cli sync JSON returns exit 5 before backup when SQLite is busy", async () => { + const { codexHome } = await makeTempCodexHome(); + await writeConfig(codexHome, 'model_provider = "openai"'); + const sessionPath = path.join(codexHome, "sessions", "2026", "03", "19", "rollout-json-busy.jsonl"); + await writeRollout(sessionPath, "thread-json-busy", "apigather"); + await writeStateDb(codexHome, [ + { id: "thread-json-busy", model_provider: "apigather", archived: false } + ]); + const rolloutBefore = await fs.readFile(sessionPath, "utf8"); + + const lockDb = await openDatabase(stateDbPath(codexHome)); + let result; + try { + lockDb.exec("BEGIN IMMEDIATE"); + result = await runCli(["sync", "--json", "--codex-home", codexHome]); + } finally { + try { + lockDb.exec("ROLLBACK"); + } catch { + // Ignore cleanup failures in tests. + } + lockDb.close(); + } + + assert.equal(result.code, 5); + assert.equal((result.stdout.match(/\n/g) ?? []).length, 1); + const envelope = JSON.parse(result.stdout); + assert.equal(envelope.ok, false); + assert.equal(envelope.error.code, "SQLITE_BUSY"); + assert.equal(await fs.readFile(sessionPath, "utf8"), rolloutBefore); + await assert.rejects(() => fs.access(backupRoot(codexHome))); +}); + +test("real cli sync JSON reports a locked rollout as partial", { + skip: process.platform !== "win32" +}, async () => { + const { codexHome } = await makeTempCodexHome(); + await writeConfig(codexHome, 'model_provider = "openai"'); + const sessionPath = path.join(codexHome, "sessions", "2026", "03", "19", "rollout-json-locked.jsonl"); + await writeRollout(sessionPath, "thread-json-locked", "apigather"); + await writeStateDb(codexHome, [ + { id: "thread-json-locked", model_provider: "apigather", archived: false } + ]); + + const lockProcess = await lockRolloutFile(sessionPath); + let result; + try { + result = await runCli(["sync", "--json", "--codex-home", codexHome]); + } finally { + lockProcess.kill(); + if (lockProcess.exitCode === null) { + await new Promise((resolve) => lockProcess.once("exit", resolve)); + } + } + + assert.equal(result.code, 3); + assert.equal((result.stdout.match(/\n/g) ?? []).length, 1); + const envelope = JSON.parse(result.stdout); + assert.equal(envelope.ok, true); + assert.equal(envelope.outcome, "partial"); + assert.deepEqual(envelope.result.skippedLockedRolloutFiles, [sessionPath]); + assert.equal(envelope.result.sqliteRowsUpdated, 1); + assert.match(result.stderr, /\[1\/6\] Scanning rollout files/); + assert.equal(await readProvider(codexHome, "thread-json-locked"), "openai"); +}); + test("syncDirectory only downgrades known unsupported flush errors on Windows", async () => { const permissionError = Object.assign(new Error("directory flush denied"), { code: "EPERM" }); const unsupportedFs = { From 166f6ff94aa27c029e546b5e98d145dd4915bee4 Mon Sep 17 00:00:00 2001 From: "DAL\\Administrator" <3452720699@qq.com> Date: Tue, 25 Aug 2026 18:08:02 +0800 Subject: [PATCH 04/50] feat(core): checkpoint C3 plan apply and dual locks --- .../ApplicationServiceTests.cs | 11 +- .../ApplicationService.cs | 20 +- .../CoreApplicationWritePort.cs | 7 + .../AutomationHostTests.cs | 9 +- .../AutomationHost.cs | 2 +- .../CoreIntegrationTests.cs | 33 +- .../CrossRuntimeStateDbLockTests.cs | 292 +++++ .../DualResourceLockIntegrationTests.cs | 68 ++ .../LockServiceTests.cs | 54 +- .../StateDbLockResourceTests.cs | 98 ++ .../StatusCoordinationTests.cs | 98 ++ .../CodexProviderSync.Core/BackupService.cs | 71 +- .../CodexSyncService.cs | 530 ++++++++- desktop/CodexProviderSync.Core/LockService.cs | 574 +++++++++- desktop/CodexProviderSync.Core/Models.cs | 21 + .../StateDbLockResource.cs | 228 ++++ .../CodexProviderSync.Core/TextFormatter.cs | 18 + docs/adr/0012-dual-resource-lock-contract.md | 8 +- .../contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md | 21 +- docs/architecture/contracts/ERROR_CODES_ZH.md | 6 +- docs/migration/BEHAVIOR_FIXTURES_ZH.md | 6 + .../VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md | 4 +- .../C3_PLAN_APPLY_DUAL_LOCK_2026-08-25.md | 53 + src/backup.js | 11 + src/cli-json.js | 24 +- src/diagnostics.js | 49 + src/locking.js | 141 ++- src/operation-coordinator.js | 121 ++ src/operation-revision.js | 256 +++++ src/plan-ledger.js | 109 ++ src/public-api.js | 11 +- src/service.js | 1019 +++++++++++++++-- src/state-db-lock.js | 114 ++ src/watch.js | 208 +++- src/web-server.js | 317 +++-- test/diagnostics.test.js | 56 + test/locking.test.js | 8 +- test/operation-revision.test.js | 88 ++ test/plan-apply.test.js | 412 +++++++ test/plan-ledger.test.js | 77 ++ test/public-api-contract.test.js | 13 +- test/state-db-lock.test.js | 135 +++ test/status-coordination.test.js | 276 +++++ test/watch.test.js | 188 ++- test/web-server.test.js | 422 ++++--- web/dist/assets/index-BhSMcRqW.js.map | 1 - .../{index-BhSMcRqW.js => index-CAZ7Ulmk.js} | 6 +- web/dist/assets/index-CAZ7Ulmk.js.map | 1 + web/dist/index.html | 2 +- web/src/App.jsx | 114 +- web/src/api.js | 7 +- web/src/api.test.js | 10 + web/src/operation-state.js | 9 +- web/src/operation-state.test.js | 17 +- 54 files changed, 5863 insertions(+), 591 deletions(-) create mode 100644 desktop/CodexProviderSync.Core.Tests/CrossRuntimeStateDbLockTests.cs create mode 100644 desktop/CodexProviderSync.Core.Tests/DualResourceLockIntegrationTests.cs create mode 100644 desktop/CodexProviderSync.Core.Tests/StateDbLockResourceTests.cs create mode 100644 desktop/CodexProviderSync.Core.Tests/StatusCoordinationTests.cs create mode 100644 desktop/CodexProviderSync.Core/StateDbLockResource.cs create mode 100644 docs/migration/evidence/C3_PLAN_APPLY_DUAL_LOCK_2026-08-25.md create mode 100644 src/diagnostics.js create mode 100644 src/operation-coordinator.js create mode 100644 src/operation-revision.js create mode 100644 src/plan-ledger.js create mode 100644 src/state-db-lock.js create mode 100644 test/diagnostics.test.js create mode 100644 test/operation-revision.test.js create mode 100644 test/plan-apply.test.js create mode 100644 test/plan-ledger.test.js create mode 100644 test/state-db-lock.test.js create mode 100644 test/status-coordination.test.js delete mode 100644 web/dist/assets/index-BhSMcRqW.js.map rename web/dist/assets/{index-BhSMcRqW.js => index-CAZ7Ulmk.js} (86%) create mode 100644 web/dist/assets/index-CAZ7Ulmk.js.map diff --git a/desktop/CodexProviderSync.Application.Tests/ApplicationServiceTests.cs b/desktop/CodexProviderSync.Application.Tests/ApplicationServiceTests.cs index 93835a4..b9d767b 100644 --- a/desktop/CodexProviderSync.Application.Tests/ApplicationServiceTests.cs +++ b/desktop/CodexProviderSync.Application.Tests/ApplicationServiceTests.cs @@ -208,7 +208,7 @@ public async Task Apply_RejectsMissingMismatchedTamperedAndExpiredPlansWithoutEx } [Fact] - public async Task ConcurrentOperation_IsRejectedImmediatelyWithoutReplacingTheActivePlan() + public async Task ConcurrentStatus_BypassesTheWriteGateAndUsesTheReadOnlyCoreGuard() { TestRig rig = new(); TaskCompletionSource pending = new(TaskCreationOptions.RunContinuationsAsynchronously); @@ -222,12 +222,13 @@ public async Task ConcurrentOperation_IsRejectedImmediatelyWithoutReplacingTheAc Task> active = rig.Service.CreatePlanAsync( new CreateApplicationPlanRequest(new SyncIntent("/first", null, "relay"))); await started.Task; - ApplicationOutcome rejected = await rig.Service.GetStatusAsync( + ApplicationOutcome status = await rig.Service.GetStatusAsync( new ApplicationStatusRequest("/second")); - Assert.Equal(ApplicationOperationLifecycle.Rejected, rejected.Lifecycle); - Assert.Equal("operation_busy", Assert.Single(rejected.Errors).Code); - Assert.Empty(rig.Status.Requests); + Assert.Equal(ApplicationOperationLifecycle.Succeeded, status.Lifecycle); + Assert.Equal("/second", status.Data!.CodexHome); + Assert.Empty(status.Errors); + Assert.Single(rig.Status.Requests); pending.SetResult(rig.Write.CreatePreview(new SyncIntent("/first", null, "relay"))); ApplicationOutcome completed = await active; diff --git a/desktop/CodexProviderSync.Application/ApplicationService.cs b/desktop/CodexProviderSync.Application/ApplicationService.cs index ff20254..446c741 100644 --- a/desktop/CodexProviderSync.Application/ApplicationService.cs +++ b/desktop/CodexProviderSync.Application/ApplicationService.cs @@ -75,7 +75,8 @@ public Task> GetStatusAsync( token); return OperationResult.Succeeded(status); }, - cancellationToken); + cancellationToken, + useExclusiveGate: false); } public Task> CreatePlanAsync( @@ -265,7 +266,7 @@ private Task>> RunWriteAsync< } catch (ApplicationPortException error) when ( !error.RecoveryRequired - && (error.Code == "target_busy" + && (error.Code is "target_busy" or "lock_unverifiable" || error.Code.StartsWith("plan_", StringComparison.Ordinal))) { await TryCompletePlanAsync(plan.PlanId, ApplicationOperationLifecycle.Rejected); @@ -421,13 +422,16 @@ private ApplicationOperationPlan ValidateApplyAuthorization( private async Task> RunExclusiveAsync( ApplicationOperationKind operation, Func>> run, - CancellationToken cancellationToken) + CancellationToken cancellationToken, + bool useExclusiveGate = true) where T : class { string operationId = NewId(); DateTimeOffset startedAt = _timeProvider.GetUtcNow(); OperationContext context = new(operationId, startedAt, _timeProvider); - if (Interlocked.CompareExchange(ref _operationInProgress, 1, 0) != 0) + bool gateAcquired = false; + if (useExclusiveGate + && Interlocked.CompareExchange(ref _operationInProgress, 1, 0) != 0) { context.MoveTo(ApplicationOperationLifecycle.Rejected); return BuildOutcome( @@ -438,6 +442,7 @@ private async Task> RunExclusiveAsync( [], [new ApplicationError("operation_busy", "Another Application operation is already in progress.")]); } + gateAcquired = useExclusiveGate; try { @@ -533,7 +538,7 @@ [new ApplicationError( { ApplicationOperationLifecycle lifecycle = error.RecoveryRequired ? ApplicationOperationLifecycle.RecoveryRequired - : error.Code == "target_busy" + : error.Code is "target_busy" or "lock_unverifiable" || error.Code.StartsWith("plan_", StringComparison.Ordinal) ? ApplicationOperationLifecycle.Rejected : ApplicationOperationLifecycle.Failed; @@ -563,7 +568,10 @@ [new ApplicationError( } finally { - Volatile.Write(ref _operationInProgress, 0); + if (gateAcquired) + { + Volatile.Write(ref _operationInProgress, 0); + } } } diff --git a/desktop/CodexProviderSync.Application/CoreApplicationWritePort.cs b/desktop/CodexProviderSync.Application/CoreApplicationWritePort.cs index a0f284c..abe5fab 100644 --- a/desktop/CodexProviderSync.Application/CoreApplicationWritePort.cs +++ b/desktop/CodexProviderSync.Application/CoreApplicationWritePort.cs @@ -294,5 +294,12 @@ private static async Task MapCoreFailuresAsync(Func> operation) error.Message, innerException: error); } + catch (InvalidOperationException error) when (LockService.IsLockUnverifiable(error)) + { + throw new ApplicationPortException( + "lock_unverifiable", + error.Message, + innerException: error); + } } } diff --git a/desktop/CodexProviderSync.Automation.Tests/AutomationHostTests.cs b/desktop/CodexProviderSync.Automation.Tests/AutomationHostTests.cs index 7f6e274..a145fbc 100644 --- a/desktop/CodexProviderSync.Automation.Tests/AutomationHostTests.cs +++ b/desktop/CodexProviderSync.Automation.Tests/AutomationHostTests.cs @@ -130,7 +130,7 @@ public async Task TamperedMalformedAndExpiredPlans_AreRejectedBeforeCoreExecutio } [Fact] - public async Task TimeoutAndConcurrentUse_HaveStableExitCodes() + public async Task TimeoutAndConcurrentStatus_HaveStableExitCodes() { using TemporaryDirectory temporary = new(); string ledger = Path.Combine(temporary.Path, "ledger"); @@ -163,15 +163,16 @@ public async Task TimeoutAndConcurrentUse_HaveStableExitCodes() "--provider", "relay", "--ledger-root", Path.Combine(temporary.Path, "busy-ledger") ]); await started.Task; - AutomationRunResult busy = await busyHost.RunAsync( + AutomationRunResult status = await busyHost.RunAsync( ["status", "--codex-home", temporary.Path]); pending.SetResult(busyFactory.Write.Preview(new SyncIntent(temporary.Path, null, "relay"))); await active; Assert.Equal(AutomationExitCodes.CancelledOrTimedOut, timedOut.ExitCode); Assert.Equal("timeout", Assert.Single(timedOut.Response.Errors).Code); - Assert.Equal(AutomationExitCodes.Busy, busy.ExitCode); - Assert.Equal("operation_busy", Assert.Single(busy.Response.Errors).Code); + Assert.Equal(AutomationExitCodes.Success, status.ExitCode); + Assert.Equal("succeeded", status.Response.Lifecycle); + Assert.Empty(status.Response.Errors); } [Fact] diff --git a/desktop/CodexProviderSync.Automation/AutomationHost.cs b/desktop/CodexProviderSync.Automation/AutomationHost.cs index 8d942ec..bcc6b9d 100644 --- a/desktop/CodexProviderSync.Automation/AutomationHost.cs +++ b/desktop/CodexProviderSync.Automation/AutomationHost.cs @@ -302,7 +302,7 @@ private static int ExitCodeFor(ApplicationOutcome outcome, bool timedOut) ApplicationOperationLifecycle.RecoveryRequired => AutomationExitCodes.RecoveryRequired, ApplicationOperationLifecycle.Failed => ExitCodeForFailedOutcome(outcome), ApplicationOperationLifecycle.Rejected when outcome.Errors.Any(static error => - error.Code is "operation_busy" or "target_busy") => AutomationExitCodes.Busy, + error.Code is "operation_busy" or "target_busy" or "lock_unverifiable") => AutomationExitCodes.Busy, ApplicationOperationLifecycle.Rejected when outcome.Errors.Any(static error => error.Code.StartsWith("plan_", StringComparison.Ordinal)) => AutomationExitCodes.InvalidPlan, ApplicationOperationLifecycle.Rejected => AutomationExitCodes.ValidationOrUsage, diff --git a/desktop/CodexProviderSync.Core.Tests/CoreIntegrationTests.cs b/desktop/CodexProviderSync.Core.Tests/CoreIntegrationTests.cs index 8e21897..a4c26ca 100644 --- a/desktop/CodexProviderSync.Core.Tests/CoreIntegrationTests.cs +++ b/desktop/CodexProviderSync.Core.Tests/CoreIntegrationTests.cs @@ -2746,7 +2746,7 @@ await service.RunRestoreAsync( } [Fact] - public async Task RestoreVersionOne_RebuildsMissingDefaultSqliteDatabase() + public async Task RestoreVersionOne_MissingDefaultSqliteParentFailsBeforeMutation() { TestCodexHomeFixture fixture = await TestCodexHomeFixture.CreateAsync(); await fixture.WriteConfigAsync("model_provider = \"openai\""); @@ -2769,18 +2769,29 @@ await fixture.WriteStateDbAtAsync( }); await File.WriteAllTextAsync(Path.Combine(backupDir, "metadata.json"), metadata); + string configPath = Path.Combine(fixture.CodexHome, "config.toml"); + string configBefore = await File.ReadAllTextAsync(configPath); + string metadataBefore = await File.ReadAllTextAsync(Path.Combine(backupDir, "metadata.json")); + CodexSyncService service = new(); - await service.RunRestoreAsync( - fixture.CodexHome, - backupDir, - new RestoreBackupOptions - { - RestoreConfig = false, - RestoreDatabase = true, - RestoreSessions = false - }); + InvalidOperationException error = await Assert.ThrowsAsync(() => + service.RunRestoreAsync( + fixture.CodexHome, + backupDir, + new RestoreBackupOptions + { + RestoreConfig = false, + RestoreDatabase = true, + RestoreSessions = false + })); - Assert.Equal("custom", await ReadProviderAsync(fixture.StateDbPath(), "thread-v1-missing")); + Assert.True(LockService.IsLockUnverifiable(error)); + Assert.Equal("state-db", error.Data["codex-provider-sync/lock-scope"]); + Assert.False(File.Exists(fixture.StateDbPath())); + Assert.False(Directory.Exists(Path.GetDirectoryName(fixture.StateDbPath()))); + Assert.Equal(configBefore, await File.ReadAllTextAsync(configPath)); + Assert.Equal(metadataBefore, await File.ReadAllTextAsync(Path.Combine(backupDir, "metadata.json"))); + Assert.Empty(Directory.EnumerateFiles(backupDir, "transaction.json", SearchOption.AllDirectories)); } [Fact] diff --git a/desktop/CodexProviderSync.Core.Tests/CrossRuntimeStateDbLockTests.cs b/desktop/CodexProviderSync.Core.Tests/CrossRuntimeStateDbLockTests.cs new file mode 100644 index 0000000..9cc40f2 --- /dev/null +++ b/desktop/CodexProviderSync.Core.Tests/CrossRuntimeStateDbLockTests.cs @@ -0,0 +1,292 @@ +using System.Diagnostics; +using System.Text.Json; +using CodexProviderSync.Core; +using Microsoft.Data.Sqlite; + +namespace CodexProviderSync.Core.Tests; + +public sealed class CrossRuntimeStateDbLockTests +{ + [Fact] + public async Task DotNetOwner_BlocksARealNodeContenderWithTheSameResourceKey() + { + using StateDbTempDirectory temporary = new(); + string stateDbPath = await CreateStateDbFixtureAsync(temporary.Path); + StateDbLockResource resource = await StateDbLockResource.ResolveAsync(stateDbPath); + await using LockHandle held = await new LockService().AcquireStateDbLockAsync(resource, "dotnet-winner"); + + ProcessResult result = await RunNodeAsync($$""" + import { acquireStateDbLock } from {{JsonSerializer.Serialize(ModuleUrl())}}; + try { + const held = await acquireStateDbLock({{JsonSerializer.Serialize(stateDbPath)}}, "node-contender"); + await held.release(); + console.log(JSON.stringify({ code: "ACQUIRED", resourceKey: held.resource.resourceKey })); + process.exit(0); + } catch (error) { + console.log(JSON.stringify({ code: error?.code, busyScope: error?.details?.busyScope })); + process.exit(5); + } + """); + + Assert.Equal(5, result.ExitCode); + using JsonDocument payload = JsonDocument.Parse(result.StdOut.Trim()); + Assert.Equal("OPERATION_BUSY", payload.RootElement.GetProperty("code").GetString()); + Assert.Equal("state-db", payload.RootElement.GetProperty("busyScope").GetString()); + } + + [Fact] + public async Task NodeOwner_BlocksADotNetContenderWithTheSameResourceKey() + { + using StateDbTempDirectory temporary = new(); + string stateDbPath = await CreateStateDbFixtureAsync(temporary.Path); + StateDbLockResource resource = await StateDbLockResource.ResolveAsync(stateDbPath); + string script = $$""" + import { acquireStateDbLock } from {{JsonSerializer.Serialize(ModuleUrl())}}; + const held = await acquireStateDbLock({{JsonSerializer.Serialize(stateDbPath)}}, "node-winner"); + console.log(JSON.stringify({ ready: true, resourceKey: held.resource.resourceKey })); + await new Promise((resolve) => process.stdin.once("data", resolve)); + await held.release(); + """; + using Process child = StartNode(script); + string readyLine = await ReadLineWithTimeoutAsync(child.StandardOutput, TimeSpan.FromSeconds(15)); + using JsonDocument ready = JsonDocument.Parse(readyLine); + Assert.True(ready.RootElement.GetProperty("ready").GetBoolean()); + Assert.Equal(resource.ResourceKey, ready.RootElement.GetProperty("resourceKey").GetString()); + + try + { + InvalidOperationException error = await Assert.ThrowsAsync( + () => new LockService().AcquireStateDbLockAsync(resource, "dotnet-contender")); + Assert.True(LockService.IsOperationBusy(error)); + Assert.Equal("state-db", error.Data["codex-provider-sync/lock-scope"]); + } + finally + { + await child.StandardInput.WriteLineAsync("release"); + child.StandardInput.Close(); + using CancellationTokenSource timeout = new(TimeSpan.FromSeconds(15)); + await child.WaitForExitAsync(timeout.Token); + Assert.Equal(0, child.ExitCode); + } + } + + [Fact] + public async Task RealNodeOwner_MakesDotNetStatusReturnItsLastCompleteSnapshot() + { + TestCodexHomeFixture fixture = await TestCodexHomeFixture.CreateAsync(); + await fixture.WriteConfigAsync("model_provider = \"openai\""); + await fixture.WriteStateDbAsync([("thread-node-status", "relay", false)]); + CodexSyncService service = new(); + StatusSnapshot baseline = await service.GetStatusAsync(fixture.CodexHome); + Assert.Equal(1, baseline.SqliteCounts!.Sessions["relay"]); + + string script = $$""" + import { acquireStateDbLock } from {{JsonSerializer.Serialize(ModuleUrl())}}; + const held = await acquireStateDbLock({{JsonSerializer.Serialize(fixture.StateDbPath())}}, "node-status-writer"); + console.log(JSON.stringify({ ready: true, resourceKey: held.resource.resourceKey })); + await new Promise((resolve) => process.stdin.once("data", resolve)); + await held.release(); + """; + using Process child = StartNode(script); + string readyLine = await ReadLineWithTimeoutAsync(child.StandardOutput, TimeSpan.FromSeconds(15)); + using JsonDocument ready = JsonDocument.Parse(readyLine); + Assert.True(ready.RootElement.GetProperty("ready").GetBoolean()); + + try + { + await using SqliteConnection connection = fixture.OpenSqliteConnection(); + await connection.OpenAsync(); + SqliteCommand update = connection.CreateCommand(); + update.CommandText = "UPDATE threads SET model_provider = 'external' WHERE id = 'thread-node-status'"; + Assert.Equal(1, await update.ExecuteNonQueryAsync()); + + StatusSnapshot blocked = await new CodexSyncService().GetStatusAsync(fixture.CodexHome); + Assert.Equal(1, blocked.SqliteCounts!.Sessions["relay"]); + Assert.False(blocked.SqliteCounts.Sessions.ContainsKey("external")); + Assert.Equal("state-db", blocked.OperationInProgress!.BusyScope); + Assert.Equal("node", blocked.OperationInProgress.Runtime); + Assert.Equal("node-status-writer", blocked.OperationInProgress.Operation); + } + finally + { + await child.StandardInput.WriteLineAsync("release"); + child.StandardInput.Close(); + using CancellationTokenSource timeout = new(TimeSpan.FromSeconds(15)); + await child.WaitForExitAsync(timeout.Token); + Assert.Equal(0, child.ExitCode); + } + + StatusSnapshot refreshed = await service.GetStatusAsync(fixture.CodexHome); + Assert.Equal(1, refreshed.SqliteCounts!.Sessions["external"]); + } + + [Fact] + public async Task RealNodeHomeOwner_MakesDotNetStatusReturnItsLastCompleteSnapshot() + { + TestCodexHomeFixture fixture = await TestCodexHomeFixture.CreateAsync(); + await fixture.WriteConfigAsync("model_provider = \"apigather\""); + await fixture.WriteStateDbAsync([("thread-node-home-status", "apigather", false)]); + CodexSyncService service = new(); + StatusSnapshot baseline = await service.GetStatusAsync(fixture.CodexHome); + Assert.Equal("apigather", baseline.CurrentProvider.Provider); + + string script = $$""" + import { acquireLock } from {{JsonSerializer.Serialize(LockingModuleUrl())}}; + const release = await acquireLock({{JsonSerializer.Serialize(fixture.CodexHome)}}, "node-home-status-writer"); + console.log(JSON.stringify({ ready: true })); + await new Promise((resolve) => process.stdin.once("data", resolve)); + await release(); + """; + using Process child = StartNode(script); + string readyLine = await ReadLineWithTimeoutAsync(child.StandardOutput, TimeSpan.FromSeconds(15)); + using JsonDocument ready = JsonDocument.Parse(readyLine); + Assert.True(ready.RootElement.GetProperty("ready").GetBoolean()); + + try + { + await fixture.WriteConfigAsync("model_provider = \"openai\""); + StatusSnapshot blocked = await new CodexSyncService().GetStatusAsync(fixture.CodexHome); + Assert.Equal("apigather", blocked.CurrentProvider.Provider); + Assert.Equal("codex-home", blocked.OperationInProgress!.BusyScope); + Assert.Equal("node", blocked.OperationInProgress.Runtime); + Assert.Equal("node-home-status-writer", blocked.OperationInProgress.Operation); + } + finally + { + await child.StandardInput.WriteLineAsync("release"); + child.StandardInput.Close(); + using CancellationTokenSource timeout = new(TimeSpan.FromSeconds(15)); + await child.WaitForExitAsync(timeout.Token); + Assert.Equal(0, child.ExitCode); + } + + Assert.Equal("openai", (await service.GetStatusAsync(fixture.CodexHome)).CurrentProvider.Provider); + } + + [Fact] + public async Task DifferentHomeStatus_SharingNodeLockedStateDb_UsesItsOwnCachedSnapshot() + { + TestCodexHomeFixture first = await TestCodexHomeFixture.CreateAsync(); + TestCodexHomeFixture second = await TestCodexHomeFixture.CreateAsync(); + await first.WriteConfigAsync("model_provider = \"openai\""); + await second.WriteConfigAsync("model_provider = \"openai\""); + string sharedSqliteHome = Path.Combine(first.Root, "shared-status-sqlite"); + string sharedStateDb = Path.Combine(sharedSqliteHome, AppConstants.DbFileBasename); + await first.WriteStateDbAtAsync( + sharedStateDb, + [("thread-shared-status", "relay", false)], + model: null); + CodexSyncService service = new(); + StatusSnapshot baseline = await service.GetStatusAsync(second.CodexHome, sharedSqliteHome); + Assert.Equal(1, baseline.SqliteCounts!.Sessions["relay"]); + + string script = $$""" + import { acquireStateDbLock } from {{JsonSerializer.Serialize(ModuleUrl())}}; + const held = await acquireStateDbLock({{JsonSerializer.Serialize(sharedStateDb)}}, "node-shared-db-writer"); + console.log(JSON.stringify({ ready: true, resourceKey: held.resource.resourceKey })); + await new Promise((resolve) => process.stdin.once("data", resolve)); + await held.release(); + """; + using Process child = StartNode(script); + string readyLine = await ReadLineWithTimeoutAsync(child.StandardOutput, TimeSpan.FromSeconds(15)); + using JsonDocument ready = JsonDocument.Parse(readyLine); + Assert.True(ready.RootElement.GetProperty("ready").GetBoolean()); + + try + { + await using SqliteConnection connection = new($"Data Source={sharedStateDb};Pooling=False"); + await connection.OpenAsync(); + SqliteCommand update = connection.CreateCommand(); + update.CommandText = "UPDATE threads SET model_provider = 'external' WHERE id = 'thread-shared-status'"; + Assert.Equal(1, await update.ExecuteNonQueryAsync()); + + StatusSnapshot blocked = await new CodexSyncService().GetStatusAsync( + second.CodexHome, + sharedSqliteHome); + Assert.Equal(1, blocked.SqliteCounts!.Sessions["relay"]); + Assert.False(blocked.SqliteCounts.Sessions.ContainsKey("external")); + Assert.Equal("state-db", blocked.OperationInProgress!.BusyScope); + Assert.Equal("node-shared-db-writer", blocked.OperationInProgress.Operation); + } + finally + { + await child.StandardInput.WriteLineAsync("release"); + child.StandardInput.Close(); + using CancellationTokenSource timeout = new(TimeSpan.FromSeconds(15)); + await child.WaitForExitAsync(timeout.Token); + Assert.Equal(0, child.ExitCode); + } + + StatusSnapshot refreshed = await service.GetStatusAsync(second.CodexHome, sharedSqliteHome); + Assert.Equal(1, refreshed.SqliteCounts!.Sessions["external"]); + } + + private static async Task CreateStateDbFixtureAsync(string root) + { + string sqliteHome = Path.Combine(root, "sqlite"); + Directory.CreateDirectory(sqliteHome); + string stateDbPath = Path.Combine(sqliteHome, AppConstants.DbFileBasename); + await File.WriteAllTextAsync(stateDbPath, "fixture"); + return stateDbPath; + } + + private static string ModuleUrl() => new Uri( + Path.Combine(FindRepositoryRoot(), "src", "state-db-lock.js")).AbsoluteUri; + + private static string LockingModuleUrl() => new Uri( + Path.Combine(FindRepositoryRoot(), "src", "locking.js")).AbsoluteUri; + + private static string FindRepositoryRoot() + { + foreach (string start in new[] { Environment.CurrentDirectory, AppContext.BaseDirectory }) + { + DirectoryInfo? current = new(Path.GetFullPath(start)); + while (current is not null) + { + if (File.Exists(Path.Combine(current.FullName, "src", "state-db-lock.js"))) + { + return current.FullName; + } + current = current.Parent; + } + } + throw new DirectoryNotFoundException("Cannot locate the repository root for the Node lock parity test."); + } + + private static Process StartNode(string script) + { + ProcessStartInfo startInfo = new("node") + { + RedirectStandardInput = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + WorkingDirectory = FindRepositoryRoot() + }; + startInfo.ArgumentList.Add("--input-type=module"); + startInfo.ArgumentList.Add("-e"); + startInfo.ArgumentList.Add(script); + return Process.Start(startInfo) + ?? throw new InvalidOperationException("Failed to start the Node lock parity process."); + } + + private static async Task RunNodeAsync(string script) + { + using Process process = StartNode(script); + Task stdout = process.StandardOutput.ReadToEndAsync(); + Task stderr = process.StandardError.ReadToEndAsync(); + using CancellationTokenSource timeout = new(TimeSpan.FromSeconds(20)); + await process.WaitForExitAsync(timeout.Token); + return new ProcessResult(process.ExitCode, await stdout, await stderr); + } + + private static async Task ReadLineWithTimeoutAsync(StreamReader reader, TimeSpan timeout) + { + using CancellationTokenSource cancellation = new(timeout); + return await reader.ReadLineAsync(cancellation.Token) + ?? throw new InvalidOperationException("Node lock parity process exited before publishing readiness."); + } + + private sealed record ProcessResult(int ExitCode, string StdOut, string StdErr); +} diff --git a/desktop/CodexProviderSync.Core.Tests/DualResourceLockIntegrationTests.cs b/desktop/CodexProviderSync.Core.Tests/DualResourceLockIntegrationTests.cs new file mode 100644 index 0000000..912319b --- /dev/null +++ b/desktop/CodexProviderSync.Core.Tests/DualResourceLockIntegrationTests.cs @@ -0,0 +1,68 @@ +using CodexProviderSync.Core; + +namespace CodexProviderSync.Core.Tests; + +public sealed class DualResourceLockIntegrationTests +{ + [Fact] + public async Task DifferentCodexHomes_SharingOneStateDb_ContendBeforeTheLosingBackup() + { + TestCodexHomeFixture firstFixture = await TestCodexHomeFixture.CreateAsync(); + TestCodexHomeFixture secondFixture = await TestCodexHomeFixture.CreateAsync(); + await firstFixture.WriteConfigAsync("model_provider = \"openai\""); + await secondFixture.WriteConfigAsync("model_provider = \"openai\""); + string firstRollout = firstFixture.RolloutPath("sessions", "rollout-shared-a.jsonl"); + string secondRollout = secondFixture.RolloutPath("sessions", "rollout-shared-b.jsonl"); + await firstFixture.WriteRolloutAsync(firstRollout, "thread-shared-a", "custom"); + await secondFixture.WriteRolloutAsync(secondRollout, "thread-shared-b", "custom"); + string sharedSqliteHome = Path.Combine(firstFixture.Root, "shared-sqlite"); + string sharedStateDb = Path.Combine(sharedSqliteHome, AppConstants.DbFileBasename); + await firstFixture.WriteStateDbAtAsync( + sharedStateDb, + [ + ("thread-shared-a", "custom", false), + ("thread-shared-b", "custom", false) + ], + model: null); + byte[] losingConfigBefore = await File.ReadAllBytesAsync( + Path.Combine(secondFixture.CodexHome, "config.toml")); + byte[] losingRolloutBefore = await File.ReadAllBytesAsync(secondRollout); + + TaskCompletionSource entered = new(TaskCreationOptions.RunContinuationsAsynchronously); + TaskCompletionSource release = new(TaskCreationOptions.RunContinuationsAsynchronously); + CodexSyncService winner = new(); + winner.FaultInjector = async (point, _, _) => + { + if (point == "before_backup") + { + entered.TrySetResult(); + await release.Task; + } + }; + Task winnerTask = winner.RunSyncAsync( + firstFixture.CodexHome, + provider: "openai", + explicitSqliteHome: sharedSqliteHome); + await entered.Task.WaitAsync(TimeSpan.FromSeconds(15)); + + try + { + InvalidOperationException busy = await Assert.ThrowsAsync( + () => new CodexSyncService().RunSyncAsync( + secondFixture.CodexHome, + provider: "openai", + explicitSqliteHome: sharedSqliteHome)); + Assert.True(LockService.IsOperationBusy(busy)); + Assert.Equal("state-db", busy.Data["codex-provider-sync/lock-scope"]); + Assert.False(Directory.Exists(AppConstants.DefaultBackupRoot(secondFixture.CodexHome))); + Assert.Equal(losingConfigBefore, await File.ReadAllBytesAsync( + Path.Combine(secondFixture.CodexHome, "config.toml"))); + Assert.Equal(losingRolloutBefore, await File.ReadAllBytesAsync(secondRollout)); + } + finally + { + release.TrySetResult(); + await winnerTask; + } + } +} diff --git a/desktop/CodexProviderSync.Core.Tests/LockServiceTests.cs b/desktop/CodexProviderSync.Core.Tests/LockServiceTests.cs index de6a410..380d00e 100644 --- a/desktop/CodexProviderSync.Core.Tests/LockServiceTests.cs +++ b/desktop/CodexProviderSync.Core.Tests/LockServiceTests.cs @@ -47,6 +47,46 @@ public async Task AcquireLockAsync_PublishesVersionedOwnerAndClaim_ThenReleasesO Assert.Empty(Directory.EnumerateFiles(claimsPath, "*.json")); } + [Fact] + public async Task InspectLockAsync_IsReadOnlyAndReportsTheVerifiedActiveOwner() + { + string codexHome = CreateTempDirectory(); + LockService service = new(); + LockInspection before = await service.InspectLockAsync(codexHome); + Assert.True(before.IsAbsent); + + await using (LockHandle held = await service.AcquireLockAsync(codexHome, "status-fixture")) + { + LockInspection active = await new LockService().InspectLockAsync(codexHome); + Assert.Equal("active", active.State); + Assert.Equal("codex-home", active.Scope); + Assert.Equal(held.InstanceId, active.Owner!.InstanceId); + Assert.Equal("dotnet", active.Owner.Runtime); + Assert.Equal("status-fixture", active.Owner.Label); + Assert.NotEmpty(active.ObservationRevision); + } + + LockInspection after = await service.InspectLockAsync(codexHome); + Assert.True(after.IsAbsent); + Assert.False(Directory.Exists(AppConstants.LockPath(codexHome))); + } + + [Fact] + public async Task InspectLockAsync_PreservesMalformedOwnerFailClosed() + { + string codexHome = CreateTempDirectory(); + string lockPath = AppConstants.LockPath(codexHome); + Directory.CreateDirectory(lockPath); + await File.WriteAllTextAsync(Path.Combine(lockPath, "owner.json"), "not-json"); + + LockInspection inspection = await new LockService().InspectLockAsync(codexHome); + + Assert.Equal("unverifiable", inspection.State); + Assert.Equal(LockService.LockUnverifiableErrorCode, inspection.ErrorCode); + Assert.True(Directory.Exists(lockPath)); + Assert.Equal("not-json", await File.ReadAllTextAsync(Path.Combine(lockPath, "owner.json"))); + } + [Fact] public async Task AcquirePathLockAsync_SupportsArbitraryExplicitResourcePath() { @@ -75,7 +115,7 @@ public async Task AcquirePathLockAsync_RejectsCanonicalFileWithBusyDiagnostic() () => new LockService().AcquirePathLockAsync(lockPath, "sqlite")); Assert.Contains("not a directory", error.Message); - Assert.True(LockService.IsOperationBusy(error)); + Assert.True(LockService.IsLockUnverifiable(error)); Assert.Equal("foreign", await File.ReadAllTextAsync(lockPath)); Assert.Empty(Directory.EnumerateFiles(lockPath + ".claims", "*.json")); } @@ -98,7 +138,7 @@ public async Task AcquirePathLockAsync_RejectsCanonicalSymbolicLinkWithoutFollow () => new LockService().AcquirePathLockAsync(lockPath, "sqlite")); Assert.Contains("symbolic link or reparse point", error.Message); - Assert.True(LockService.IsOperationBusy(error)); + Assert.True(LockService.IsLockUnverifiable(error)); Assert.Empty(Directory.EnumerateFileSystemEntries(targetPath)); Assert.Empty(Directory.EnumerateFiles(lockPath + ".claims", "*.json")); } @@ -121,7 +161,7 @@ public async Task AcquireLockAsync_HardLinkFailurePreservesForeignPopulationAndR InvalidOperationException error = await Assert.ThrowsAsync( () => service.AcquireLockAsync(codexHome, "injected")); - Assert.True(LockService.IsOperationBusy(error)); + Assert.True(LockService.IsLockUnverifiable(error)); Assert.Equal("foreign-owner", await File.ReadAllTextAsync(Path.Combine(lockPath, "owner.json"))); Assert.Equal("keep", await File.ReadAllTextAsync(Path.Combine(lockPath, "foreign.txt"))); Assert.Empty(Directory.EnumerateFiles(lockPath + ".claims", "*.json")); @@ -148,7 +188,7 @@ public async Task AcquireLockAsync_ReservationAbaRetainsUncertainClaimAndForeign () => service.AcquireLockAsync(codexHome, "aba")); Assert.Contains("reservation changed identity", error.Message); - Assert.True(LockService.IsOperationBusy(error)); + Assert.True(LockService.IsLockUnverifiable(error)); Assert.Equal("keep", await File.ReadAllTextAsync(Path.Combine(lockPath, "foreign.txt"))); Assert.Single(Directory.EnumerateFiles(lockPath + ".claims", "*.json")); Assert.True(Directory.Exists(displacedPath)); @@ -661,10 +701,10 @@ public async Task CreateLockDirectoryAsync_ThrowsWhenLockAlreadyExists() @"C:\temp\provider-sync.lock", tryCreateDirectory: _ => 183)); - Assert.Contains("Lock already exists", error.Message); - Assert.True(LockService.IsOperationBusy(error)); + Assert.Contains("cannot be verified", error.Message); + Assert.True(LockService.IsLockUnverifiable(error)); Assert.Equal( - LockService.OperationBusyErrorCode, + LockService.LockUnverifiableErrorCode, error.Data["codex-provider-sync/error-code"]); } diff --git a/desktop/CodexProviderSync.Core.Tests/StateDbLockResourceTests.cs b/desktop/CodexProviderSync.Core.Tests/StateDbLockResourceTests.cs new file mode 100644 index 0000000..120dea3 --- /dev/null +++ b/desktop/CodexProviderSync.Core.Tests/StateDbLockResourceTests.cs @@ -0,0 +1,98 @@ +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; +using CodexProviderSync.Core; + +namespace CodexProviderSync.Core.Tests; + +public sealed class StateDbLockResourceTests +{ + [Fact] + public async Task ResolveAsync_UsesNulDelimitedPhysicalIdentityAndLowerSha256() + { + using StateDbTempDirectory temporary = new(); + string sqliteHome = Path.Combine(temporary.Path, "sqlite"); + Directory.CreateDirectory(sqliteHome); + string stateDbPath = Path.Combine(sqliteHome, AppConstants.DbFileBasename); + await File.WriteAllTextAsync(stateDbPath, "fixture"); + + StateDbLockResource resource = await StateDbLockResource.ResolveAsync(stateDbPath); + string parent = resource.RealDbParent; + string expectedIdentity = (OperatingSystem.IsWindows() ? parent.ToLowerInvariant() : parent) + + "\0" + + (OperatingSystem.IsWindows() ? AppConstants.DbFileBasename.ToLowerInvariant() : AppConstants.DbFileBasename); + string expectedKey = Convert.ToHexString( + SHA256.HashData(Encoding.UTF8.GetBytes(expectedIdentity))).ToLowerInvariant(); + + Assert.Equal(expectedIdentity, resource.Identity); + Assert.Equal(expectedKey, resource.ResourceKey); + Assert.Equal( + Path.Combine(parent, ".codex-provider-sync", "locks", expectedKey + ".lock"), + resource.LockPath); + } + + [Fact] + public async Task AcquireStateDbLockAsync_PublishesResourceFieldsAndReportsVerifiedBusy() + { + using StateDbTempDirectory temporary = new(); + string sqliteHome = Path.Combine(temporary.Path, "sqlite"); + Directory.CreateDirectory(sqliteHome); + string stateDbPath = Path.Combine(sqliteHome, AppConstants.DbFileBasename); + await File.WriteAllTextAsync(stateDbPath, "fixture"); + StateDbLockResource resource = await StateDbLockResource.ResolveAsync(stateDbPath); + LockService service = new(); + + await using LockHandle first = await service.AcquireStateDbLockAsync(resource, "first"); + using JsonDocument owner = JsonDocument.Parse( + await File.ReadAllTextAsync(Path.Combine(resource.LockPath, "owner.json"))); + Assert.Equal("state-db", owner.RootElement.GetProperty("scope").GetString()); + Assert.Equal(resource.ResourceKey, owner.RootElement.GetProperty("resourceKey").GetString()); + + InvalidOperationException error = await Assert.ThrowsAsync( + () => service.AcquireStateDbLockAsync(resource, "second")); + Assert.True(LockService.IsOperationBusy(error)); + Assert.Equal("state-db", error.Data["codex-provider-sync/lock-scope"]); + Assert.Equal(resource.ResourceKey, error.Data["codex-provider-sync/resource-key"]); + } + + [Fact] + public async Task ResolveAsync_AllowsMissingDatabaseOnlyWithVerifiedParent() + { + using StateDbTempDirectory temporary = new(); + string sqliteHome = Path.Combine(temporary.Path, "sqlite"); + Directory.CreateDirectory(sqliteHome); + StateDbLockResource resource = await StateDbLockResource.ResolveAsync( + Path.Combine(sqliteHome, AppConstants.DbFileBasename)); + Assert.Matches("^[a-f0-9]{64}$", resource.ResourceKey); + + InvalidOperationException error = await Assert.ThrowsAsync( + () => StateDbLockResource.ResolveAsync( + Path.Combine(temporary.Path, "missing", AppConstants.DbFileBasename))); + Assert.True(LockService.IsLockUnverifiable(error)); + } +} + +internal sealed class StateDbTempDirectory : IDisposable +{ + public StateDbTempDirectory() + { + Path = System.IO.Path.Combine( + System.IO.Path.GetTempPath(), + $"codex-provider-sync-state-lock-{Guid.NewGuid():N}"); + Directory.CreateDirectory(Path); + } + + public string Path { get; } + + public void Dispose() + { + try + { + Directory.Delete(Path, recursive: true); + } + catch + { + // Best-effort test cleanup on Windows antivirus/indexer races. + } + } +} diff --git a/desktop/CodexProviderSync.Core.Tests/StatusCoordinationTests.cs b/desktop/CodexProviderSync.Core.Tests/StatusCoordinationTests.cs new file mode 100644 index 0000000..476acc2 --- /dev/null +++ b/desktop/CodexProviderSync.Core.Tests/StatusCoordinationTests.cs @@ -0,0 +1,98 @@ +using CodexProviderSync.Core; +using Microsoft.Data.Sqlite; + +namespace CodexProviderSync.Core.Tests; + +public sealed class StatusCoordinationTests +{ + [Fact] + public async Task ActiveHomeLock_ReturnsLastCompleteSnapshotWithOperationMarker() + { + TestCodexHomeFixture fixture = await TestCodexHomeFixture.CreateAsync(); + await fixture.WriteConfigAsync("model_provider = \"apigather\""); + await fixture.WriteStateDbAsync([("thread-home-status", "apigather", false)]); + CodexSyncService service = new(); + StatusSnapshot baseline = await service.GetStatusAsync(fixture.CodexHome); + Assert.Equal("apigather", baseline.CurrentProvider.Provider); + + await using (LockHandle held = await new LockService().AcquireLockAsync( + fixture.CodexHome, + "home-status-fixture")) + { + await fixture.WriteConfigAsync("model_provider = \"openai\""); + + StatusSnapshot blocked = await new CodexSyncService().GetStatusAsync(fixture.CodexHome); + + Assert.Equal("apigather", blocked.CurrentProvider.Provider); + Assert.Equal(baseline.StorageRevision, blocked.StorageRevision); + Assert.Equal("codex-home", blocked.OperationInProgress!.BusyScope); + Assert.Equal("home-status-fixture", blocked.OperationInProgress.Operation); + Assert.Equal("active", blocked.OperationInProgress.LockState); + Assert.Equal("codex-home-lock", blocked.StatusReadBlocked!.Reason); + Assert.Contains("last complete snapshot", TextFormatter.FormatStatus(blocked)); + } + + StatusSnapshot refreshed = await service.GetStatusAsync(fixture.CodexHome); + Assert.Equal("openai", refreshed.CurrentProvider.Provider); + Assert.Null(refreshed.OperationInProgress); + } + + [Fact] + public async Task ActiveSharedStateDbLock_DoesNotExposeIntermediateSqliteRows() + { + TestCodexHomeFixture fixture = await TestCodexHomeFixture.CreateAsync(); + await fixture.WriteConfigAsync("model_provider = \"openai\""); + await fixture.WriteStateDbAsync([("thread-state-status", "relay", false)]); + CodexSyncService service = new(); + StatusSnapshot baseline = await service.GetStatusAsync(fixture.CodexHome); + Assert.Equal(1, baseline.SqliteCounts!.Sessions["relay"]); + baseline.SqliteCounts.Sessions["relay"] = 999; + baseline.RolloutCounts.Sessions["caller-poison"] = 999; + + StateDbLockResource resource = await StateDbLockResource.ResolveAsync(fixture.StateDbPath()); + await using (LockHandle held = await new LockService().AcquireStateDbLockAsync( + resource, + "state-status-fixture")) + { + await using SqliteConnection connection = fixture.OpenSqliteConnection(); + await connection.OpenAsync(); + SqliteCommand update = connection.CreateCommand(); + update.CommandText = "UPDATE threads SET model_provider = 'external' WHERE id = 'thread-state-status'"; + Assert.Equal(1, await update.ExecuteNonQueryAsync()); + + StatusSnapshot blocked = await new CodexSyncService().GetStatusAsync(fixture.CodexHome); + + Assert.Equal(1, blocked.SqliteCounts!.Sessions["relay"]); + Assert.False(blocked.SqliteCounts.Sessions.ContainsKey("external")); + Assert.False(blocked.RolloutCounts.Sessions.ContainsKey("caller-poison")); + Assert.Equal("state-db", blocked.OperationInProgress!.BusyScope); + Assert.Equal("state-status-fixture", blocked.OperationInProgress.Operation); + Assert.Equal(resource.ResourceKey, (await new LockService() + .InspectStateDbLockAsync(resource)).ResourceKey); + } + + StatusSnapshot refreshed = await service.GetStatusAsync(fixture.CodexHome); + Assert.Equal(1, refreshed.SqliteCounts!.Sessions["external"]); + Assert.Null(refreshed.OperationInProgress); + } + + [Fact] + public async Task UnverifiableHomeLock_ReturnsAnExplicitlyIncompleteSnapshotWithoutMutation() + { + TestCodexHomeFixture fixture = await TestCodexHomeFixture.CreateAsync(); + await fixture.WriteConfigAsync("model_provider = \"openai\""); + string lockPath = AppConstants.LockPath(fixture.CodexHome); + Directory.CreateDirectory(lockPath); + string ownerPath = Path.Combine(lockPath, "owner.json"); + await File.WriteAllTextAsync(ownerPath, "malformed-owner"); + + StatusSnapshot status = await new CodexSyncService().GetStatusAsync(fixture.CodexHome); + + Assert.Equal("unknown", status.CurrentProvider.Provider); + Assert.False(status.RolloutScanComplete); + Assert.Equal("unverifiable", status.OperationInProgress!.LockState); + Assert.Equal(LockService.LockUnverifiableErrorCode, status.OperationInProgress.ErrorCode); + Assert.Equal("malformed-owner", await File.ReadAllTextAsync(ownerPath)); + Assert.True(Directory.Exists(lockPath)); + } +} diff --git a/desktop/CodexProviderSync.Core/BackupService.cs b/desktop/CodexProviderSync.Core/BackupService.cs index 8322717..908d9ff 100644 --- a/desktop/CodexProviderSync.Core/BackupService.cs +++ b/desktop/CodexProviderSync.Core/BackupService.cs @@ -158,7 +158,8 @@ public async Task RestoreBackupAsync( public async Task RestoreBackupAsync( string backupDir, CodexStorageLayout storage, - RestoreBackupOptions? options = null) + RestoreBackupOptions? options = null, + string? expectedStateDbTargetPath = null) { storage.EnsureSqliteAccessSupported("restore"); options ??= new RestoreBackupOptions(); @@ -264,6 +265,13 @@ await _sessionRolloutService.AssertSessionFilesWritableAsync( databaseRestorePlan = (sourcePath, targetPath); } } + if (expectedStateDbTargetPath is not null + && (databaseRestorePlan is null + || !PathsEqual(databaseRestorePlan.Value.TargetPath, expectedStateDbTargetPath))) + { + throw new InvalidOperationException( + "The resolved State DB restore target changed after its resource lock was selected."); + } } if (options.RestoreConfig) @@ -297,6 +305,67 @@ await _sqliteStateService.RestoreSqliteOnlineBackupAsync( }; } + internal async Task ResolveRestoreStateDbTargetPathAsync( + string backupDir, + CodexStorageLayout storage, + RestoreBackupOptions options) + { + storage.EnsureSqliteAccessSupported("restore"); + string normalizedBackupDir = Path.GetFullPath(backupDir); + string metadataPath = Path.Combine(normalizedBackupDir, "metadata.json"); + BackupMetadataFile metadata = JsonSerializer.Deserialize( + await File.ReadAllTextAsync(metadataPath), + JsonOptions()) ?? throw new InvalidOperationException($"Backup metadata is invalid: {backupDir}"); + if (!string.Equals(metadata.Namespace, AppConstants.BackupNamespace, StringComparison.Ordinal) + || metadata.Version is not (1 or 2)) + { + throw new InvalidOperationException($"Unsupported backup metadata in {metadataPath}."); + } + if (!PathsEqual(metadata.CodexHome, storage.CodexHome)) + { + throw new InvalidOperationException( + $"Backup was created for {metadata.CodexHome}, not {storage.CodexHome}."); + } + + StateDbLocation? stateDb = storage.StateDbLocation ?? _sqliteStateService.DetectStateDb(storage); + if (stateDb is null && storage.HasConfiguredSqliteHome) + { + throw new InvalidOperationException( + $"state_5.sqlite not found in SQLite home {storage.SqliteHome}."); + } + string targetSqliteHome = ResolveRestoreSqliteHome(storage, metadata, stateDb); + bool sqliteHomeRelocation = metadata.Version >= 2 + && !string.IsNullOrWhiteSpace(metadata.SqliteHome) + && !PathsEqual(metadata.SqliteHome, targetSqliteHome); + if (sqliteHomeRelocation && !options.AllowSqliteHomeRelocation) + { + throw new InvalidOperationException( + $"Backup SQLite home is {metadata.SqliteHome}, but the current target is {targetSqliteHome}. " + + "Confirm SQLite Home relocation before restoring to a different location."); + } + if (sqliteHomeRelocation && options.RestoreConfig) + { + throw new InvalidOperationException( + "Cannot restore config.toml while relocating SQLite home. " + + "Disable config restore to preserve the current target configuration."); + } + + IReadOnlyList databaseFiles = metadata.Version >= 2 + ? metadata.SqliteDbFiles ?? [] + : metadata.DbFiles ?? []; + string[] mainFiles = databaseFiles + .Where(static fileName => Path.GetFileName(fileName) == AppConstants.DbFileBasename) + .ToArray(); + if (mainFiles.Length != 1) + { + throw new InvalidOperationException( + "Backup must contain exactly one state_5.sqlite restore source."); + } + return metadata.Version >= 2 + ? RestoreSqliteTargetPath(targetSqliteHome, mainFiles[0]) + : RestoreDbTargetPath(storage.CodexHome, mainFiles[0]); + } + public async Task UpdateSessionBackupManifestAsync(string backupDir, IReadOnlyList sessionChanges) { string normalizedBackupDir = Path.GetFullPath(backupDir); diff --git a/desktop/CodexProviderSync.Core/CodexSyncService.cs b/desktop/CodexProviderSync.Core/CodexSyncService.cs index 6a7bc2b..48b5da7 100644 --- a/desktop/CodexProviderSync.Core/CodexSyncService.cs +++ b/desktop/CodexProviderSync.Core/CodexSyncService.cs @@ -1,9 +1,12 @@ +using System.Collections.Concurrent; using System.Diagnostics; namespace CodexProviderSync.Core; public sealed class CodexSyncService { + private static readonly ConcurrentDictionary LastCompleteStatus = new( + OperatingSystem.IsWindows() ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal); private readonly CodexHomeService _codexHomeService; private readonly ConfigFileService _configFileService; private readonly SessionRolloutService _sessionRolloutService; @@ -55,8 +58,167 @@ public async Task GetStatusAsync( long totalStarted = Stopwatch.GetTimestamp(); string codexHome = _codexHomeService.NormalizeCodexHome(explicitCodexHome); await _codexHomeService.EnsureCodexHomeAsync(codexHome); + string cacheKey = BuildStatusCacheKey(codexHome, explicitSqliteHome); + LockInspection homeBefore = await _lockService.InspectLockAsync(codexHome); + if (!homeBefore.IsAbsent) + { + return BuildBlockedStatus( + cacheKey, + codexHome, + explicitSqliteHome, + homeBefore, + "codex-home-lock"); + } + string configText = await _configFileService.ReadConfigTextAsync(_codexHomeService.ConfigPath(codexHome)); CodexStorageLayout storage = await PrepareStorageAsync(codexHome, explicitSqliteHome, configText); + LockInspection homeResolved = await _lockService.InspectLockAsync(codexHome); + if (!SameAbsentObservation(homeBefore, homeResolved)) + { + return BuildBlockedStatus( + cacheKey, + codexHome, + explicitSqliteHome, + homeResolved, + "codex-home-lock"); + } + + StateDbLockResource? stateResource = null; + LockInspection? stateBefore = null; + if (storage.StateDbLocation is { } stateDbLocation) + { + try + { + stateResource = await StateDbLockResource.ResolveAsync(stateDbLocation.Path); + stateBefore = await _lockService.InspectStateDbLockAsync(stateResource); + } + catch (Exception error) when (error is InvalidOperationException + or IOException + or UnauthorizedAccessException) + { + return BuildBlockedStatus( + cacheKey, + codexHome, + explicitSqliteHome, + SyntheticUnverifiableInspection("state-db", error), + "state-db-lock"); + } + if (!stateBefore.IsAbsent) + { + return BuildBlockedStatus( + cacheKey, + codexHome, + explicitSqliteHome, + stateBefore, + "state-db-lock"); + } + } + + CoreWritePlanSnapshot revisionBefore; + try + { + revisionBefore = await BuildStatusRevisionAsync(codexHome, storage); + } + catch (Exception error) when (error is IOException + or UnauthorizedAccessException + or CoreWritePlanStaleException) + { + return BuildBlockedStatus( + cacheKey, + codexHome, + explicitSqliteHome, + SyntheticUnverifiableInspection("codex-home", error), + "revision-unverifiable"); + } + + StatusSnapshot snapshot = await ScanStatusAsync( + codexHome, + configText, + storage, + revisionBefore.StateFingerprint, + totalStarted); + + LockInspection homeAfter = await _lockService.InspectLockAsync(codexHome); + if (!SameAbsentObservation(homeBefore, homeAfter)) + { + return BuildBlockedStatus( + cacheKey, + codexHome, + explicitSqliteHome, + homeAfter, + "codex-home-lock"); + } + LockInspection? stateAfter = null; + if (stateResource is not null) + { + stateAfter = await _lockService.InspectStateDbLockAsync(stateResource); + if (!SameAbsentObservation(stateBefore!, stateAfter)) + { + return BuildBlockedStatus( + cacheKey, + codexHome, + explicitSqliteHome, + stateAfter, + "state-db-lock"); + } + } + + try + { + CoreWritePlanSnapshot revisionAfter = await BuildStatusRevisionAsync(codexHome, storage); + CoreWriteSnapshotBuilder.AssertExactMatch(revisionBefore, revisionAfter); + } + catch (Exception error) when (error is IOException + or UnauthorizedAccessException + or CoreWritePlanStaleException) + { + return BuildBlockedStatus( + cacheKey, + codexHome, + explicitSqliteHome, + SyntheticUnverifiableInspection("codex-home", error), + "state-changed-during-status", + revisionBefore.StateFingerprint); + } + + LockInspection homeFinal = await _lockService.InspectLockAsync(codexHome); + if (!SameAbsentObservation(homeBefore, homeFinal)) + { + return BuildBlockedStatus( + cacheKey, + codexHome, + explicitSqliteHome, + homeFinal, + "codex-home-lock"); + } + if (stateResource is not null) + { + LockInspection stateFinal = await _lockService.InspectStateDbLockAsync(stateResource); + if (!SameAbsentObservation(stateBefore!, stateFinal)) + { + return BuildBlockedStatus( + cacheKey, + codexHome, + explicitSqliteHome, + stateFinal, + "state-db-lock"); + } + } + + // Keep the cache isolated from mutable DTO collections returned to + // callers. A consumer must never be able to poison the safety snapshot + // that is served while a write lock is active. + LastCompleteStatus[cacheKey] = CopyStatusSnapshot(snapshot); + return snapshot; + } + + private async Task ScanStatusAsync( + string codexHome, + string configText, + CodexStorageLayout storage, + string storageRevision, + long totalStarted) + { CurrentProviderInfo currentProvider = _configFileService.ReadCurrentProviderFromConfigText(configText); IReadOnlyList configuredProviders = _configFileService.ListConfiguredProviderIds(configText); long rolloutScanStarted = Stopwatch.GetTimestamp(); @@ -83,6 +245,8 @@ public async Task GetStatusAsync( return new StatusSnapshot { + SnapshotAt = DateTimeOffset.UtcNow, + StorageRevision = storageRevision, CodexHome = codexHome, SqliteHome = storage.SqliteHome, SqliteHomeSource = storage.SqliteHomeSource, @@ -108,6 +272,8 @@ public async Task GetStatusAsync( item.BackupDir, item.JournalPath)) .ToArray(), + RolloutScanComplete = rolloutInfo.LockedPaths.Count == 0 + && rolloutInfo.UnreadablePaths.Count == 0, PerformanceMetrics = new StatusPerformanceMetrics { TotalDurationMs = ElapsedMilliseconds(totalStarted), @@ -118,6 +284,242 @@ public async Task GetStatusAsync( }; } + private async Task BuildStatusRevisionAsync( + string codexHome, + CodexStorageLayout storage) + { + List targets = + [ + new(_codexHomeService.ConfigPath(codexHome), "read"), + new( + Path.Combine(codexHome, "sessions"), + "scan", + CoreWriteFingerprintMode.RecursiveInventory), + new( + Path.Combine(codexHome, "archived_sessions"), + "scan", + CoreWriteFingerprintMode.RecursiveInventory), + new(_globalStateService.StatePath(codexHome), "read-if-present"), + new(_globalStateService.BackupPath(codexHome), "read-if-present"), + new( + _codexHomeService.BackupRoot(codexHome), + "inventory", + CoreWriteFingerprintMode.RecursiveInventory) + ]; + if (storage.StateDbLocation is { } stateDb) + { + targets.Add(new CoreWriteTargetSpec( + stateDb.Path, + "read", + CoreWriteFingerprintMode.SqliteMainContent)); + targets.Add(new CoreWriteTargetSpec( + stateDb.Path + "-wal", + "read-if-present", + CoreWriteFingerprintMode.SqliteWalContent)); + } + + string binding = System.Text.Json.JsonSerializer.Serialize(new + { + codexHome, + storage.SqliteHome, + storage.SqliteHomeSource, + stateDbPath = storage.StateDbLocation?.Path, + storage.SqliteAccess.Supported, + storage.SqliteAccess.Reason + }); + return await CoreWriteSnapshotBuilder.BuildAsync( + "status", + binding, + targets); + } + + private StatusSnapshot BuildBlockedStatus( + string cacheKey, + string codexHome, + string? explicitSqliteHome, + LockInspection inspection, + string reason, + string? revision = null) + { + StatusOperationInfo operation = new( + inspection.Owner?.InstanceId, + string.IsNullOrWhiteSpace(inspection.Owner?.Label) ? "unknown" : inspection.Owner.Label!, + "external", + inspection.Owner?.Runtime, + inspection.Owner?.StartedAt, + inspection.Scope, + inspection.State == "active" ? "active" : "unverifiable", + inspection.ErrorCode); + StatusReadBlockedInfo blocked = new( + reason, + operation.LockState, + revision); + if (LastCompleteStatus.TryGetValue(cacheKey, out StatusSnapshot? cached)) + { + return CopyStatusSnapshot(cached, operation, blocked); + } + return CreateUnavailableStatus( + codexHome, + explicitSqliteHome, + operation, + blocked); + } + + private static StatusSnapshot CopyStatusSnapshot( + StatusSnapshot source, + StatusOperationInfo? operation = null, + StatusReadBlockedInfo? blocked = null) + { + return new StatusSnapshot + { + SchemaVersion = source.SchemaVersion, + SnapshotAt = source.SnapshotAt, + StorageRevision = source.StorageRevision, + CodexHome = source.CodexHome, + SqliteHome = source.SqliteHome, + SqliteHomeSource = source.SqliteHomeSource, + SqliteAccess = source.SqliteAccess with { }, + CheckedStateDbPaths = source.CheckedStateDbPaths.ToArray(), + CurrentProvider = source.CurrentProvider with { }, + ConfiguredProviders = source.ConfiguredProviders.ToArray(), + RolloutCounts = CopyProviderCounts(source.RolloutCounts), + LockedRolloutFiles = source.LockedRolloutFiles.ToArray(), + UnreadableRolloutFiles = source.UnreadableRolloutFiles.ToArray(), + EncryptedContentCounts = CopyProviderCounts(source.EncryptedContentCounts), + EncryptedContentWarning = source.EncryptedContentWarning, + SqliteCounts = source.SqliteCounts is null ? null : CopyProviderCounts(source.SqliteCounts), + StateDbLocation = source.StateDbLocation is null ? null : source.StateDbLocation with { }, + SqliteRepairStats = source.SqliteRepairStats is null + ? null + : new SqliteRepairStats + { + UserEventRowsNeedingRepair = source.SqliteRepairStats.UserEventRowsNeedingRepair, + CwdRowsNeedingRepair = source.SqliteRepairStats.CwdRowsNeedingRepair + }, + ProjectThreadVisibility = source.ProjectThreadVisibility + .Select(static item => new ProjectThreadVisibility + { + Root = item.Root, + InteractiveThreads = item.InteractiveThreads, + FirstPageThreads = item.FirstPageThreads, + ExactCwdMatches = item.ExactCwdMatches, + VerbatimCwdRows = item.VerbatimCwdRows, + Ranks = item.Ranks.ToArray(), + RankPreview = item.RankPreview, + ProviderCounts = new Dictionary(item.ProviderCounts, StringComparer.Ordinal) + }) + .ToArray(), + BackupRoot = source.BackupRoot, + BackupSummary = new BackupSummary + { + Count = source.BackupSummary.Count, + TotalBytes = source.BackupSummary.TotalBytes + }, + PendingTransactions = source.PendingTransactions.Select(static item => item with { }).ToArray(), + OperationInProgress = operation, + StatusReadBlocked = blocked, + RolloutScanComplete = source.RolloutScanComplete, + PerformanceMetrics = new StatusPerformanceMetrics + { + TotalDurationMs = source.PerformanceMetrics.TotalDurationMs, + RolloutScanDurationMs = source.PerformanceMetrics.RolloutScanDurationMs, + BackupSummaryDurationMs = source.PerformanceMetrics.BackupSummaryDurationMs, + RolloutScan = new SessionScanMetrics + { + EnumeratedRolloutFiles = source.PerformanceMetrics.RolloutScan.EnumeratedRolloutFiles, + ParsedSessionFiles = source.PerformanceMetrics.RolloutScan.ParsedSessionFiles, + ContentScanPasses = source.PerformanceMetrics.RolloutScan.ContentScanPasses, + ModelScanFiles = source.PerformanceMetrics.RolloutScan.ModelScanFiles, + DurationMs = source.PerformanceMetrics.RolloutScan.DurationMs + } + } + }; + } + + private static ProviderCounts CopyProviderCounts(ProviderCounts source) + { + return new ProviderCounts + { + Sessions = new Dictionary(source.Sessions, StringComparer.Ordinal), + ArchivedSessions = new Dictionary(source.ArchivedSessions, StringComparer.Ordinal), + Unreadable = source.Unreadable, + Error = source.Error + }; + } + + private StatusSnapshot CreateUnavailableStatus( + string codexHome, + string? explicitSqliteHome, + StatusOperationInfo operation, + StatusReadBlockedInfo blocked) + { + string sqliteHome = string.IsNullOrWhiteSpace(explicitSqliteHome) + ? string.Empty + : Path.GetFullPath(explicitSqliteHome.Trim()); + ProviderCounts unavailableCounts = new() + { + Unreadable = true, + Error = "Status scanning is blocked by an active or unverifiable write lock." + }; + return new StatusSnapshot + { + SnapshotAt = DateTimeOffset.UtcNow, + CodexHome = codexHome, + SqliteHome = sqliteHome, + SqliteHomeSource = string.IsNullOrWhiteSpace(explicitSqliteHome) ? "unresolved" : "explicit", + SqliteAccess = new SqliteAccessInfo( + false, + "status-blocked", + "Status scanning is blocked by an active or unverifiable write lock."), + CurrentProvider = new CurrentProviderInfo("unknown", false), + ConfiguredProviders = [], + RolloutCounts = unavailableCounts, + LockedRolloutFiles = [], + UnreadableRolloutFiles = [], + EncryptedContentCounts = new ProviderCounts + { + Unreadable = true, + Error = unavailableCounts.Error + }, + SqliteCounts = null, + BackupRoot = _codexHomeService.BackupRoot(codexHome), + BackupSummary = new BackupSummary { Count = 0, TotalBytes = 0 }, + OperationInProgress = operation, + StatusReadBlocked = blocked, + RolloutScanComplete = false + }; + } + + private static string BuildStatusCacheKey(string codexHome, string? explicitSqliteHome) + { + string selector = string.IsNullOrWhiteSpace(explicitSqliteHome) + ? "" + : Path.GetFullPath(explicitSqliteHome.Trim()); + return Path.GetFullPath(codexHome) + "\0" + selector; + } + + private static bool SameAbsentObservation(LockInspection left, LockInspection right) + { + return left.IsAbsent + && right.IsAbsent + && string.Equals( + left.ObservationRevision, + right.ObservationRevision, + StringComparison.Ordinal); + } + + private static LockInspection SyntheticUnverifiableInspection(string scope, Exception error) + { + return new LockInspection( + "unverifiable", + scope, + null, + string.Empty, + null, + LockService.LockUnverifiableErrorCode, + error.Message); + } + public IReadOnlyList BuildProviderOptions(StatusSnapshot status, AppSettings settings) { return _providerDiscoveryService.BuildProviderOptions(status, settings); @@ -164,7 +566,6 @@ public async Task CreateSyncPlanSnapshotAsync( ValidateAutomaticRetention(keepCount); string codexHome = _codexHomeService.NormalizeCodexHome(explicitCodexHome); await _codexHomeService.EnsureCodexHomeAsync(codexHome); - await using LockHandle _ = await _lockService.AcquireLockAsync(codexHome, "plan-sync"); await FileTransactionJournal.AssertNoPendingAsync(codexHome); SyncPreparation preparation = await PrepareSyncAsync( codexHome, @@ -395,7 +796,11 @@ private async Task RunSyncCoreAsync( string codexHome = _codexHomeService.NormalizeCodexHome(explicitCodexHome); await _codexHomeService.EnsureCodexHomeAsync(codexHome); - await using LockHandle _ = await _lockService.AcquireLockAsync(codexHome, "sync"); + await using LockHandle homeLock = await _lockService.AcquireLockAsync(codexHome, "sync"); + string operationLabel = switchPreparationFactory is null ? "sync" : "switch"; + (StateDbLockResource? lockedStateDb, LockHandle? stateDbHandle) = + await AcquireCurrentStateDbLockAsync(codexHome, explicitSqliteHome, operationLabel, cancellationToken); + await using LockHandle? stateDbLock = stateDbHandle; await FileTransactionJournal.AssertNoPendingAsync(codexHome); long preparationStarted = Stopwatch.GetTimestamp(); SyncPreparation preparation = await PrepareSyncAsync( @@ -406,6 +811,7 @@ private async Task RunSyncCoreAsync( explicitSqliteHome, switchPreparationFactory, cancellationToken); + await AssertStateDbLockMatchesAsync(preparation.Storage, lockedStateDb, cancellationToken); long preparationDurationMs = ElapsedMilliseconds(preparationStarted); string configPath = preparation.ConfigPath; string configText = preparation.ConfigText; @@ -988,7 +1394,6 @@ public async Task CreateSwitchPlanSnapshotAsync( ValidateAutomaticRetention(keepCount); string codexHome = _codexHomeService.NormalizeCodexHome(explicitCodexHome); await _codexHomeService.EnsureCodexHomeAsync(codexHome); - await using LockHandle _ = await _lockService.AcquireLockAsync(codexHome, "plan-switch"); await FileTransactionJournal.AssertNoPendingAsync(codexHome); SyncPreparation preparation = await PrepareSyncAsync( codexHome, @@ -1148,7 +1553,6 @@ public async Task CreateRestorePlanSnapshotAsync( ValidateRestoreRequest(backupDir, options); string codexHome = _codexHomeService.NormalizeCodexHome(explicitCodexHome); await _codexHomeService.EnsureCodexHomeAsync(codexHome); - await using LockHandle _ = await _lockService.AcquireLockAsync(codexHome, "plan-restore"); RestorePreparation preparation = await PrepareRestoreAsync( codexHome, backupDir, @@ -1191,13 +1595,38 @@ private async Task RunRestoreCoreAsync( string codexHome = _codexHomeService.NormalizeCodexHome(explicitCodexHome); await _codexHomeService.EnsureCodexHomeAsync(codexHome); - await using LockHandle _ = await _lockService.AcquireLockAsync(codexHome, "restore"); + await using LockHandle homeLock = await _lockService.AcquireLockAsync(codexHome, "restore"); + StateDbLockResource? lockedStateDb = null; + LockHandle? stateDbHandle = null; + if (options.RestoreDatabase) + { + string lockConfigText = await _configFileService.ReadConfigTextAsync( + _codexHomeService.ConfigPath(codexHome)); + CodexStorageLayout lockStorage = await PrepareStorageAsync( + codexHome, + explicitSqliteHome, + lockConfigText); + lockStorage.EnsureSqliteAccessSupported("restore"); + string stateDbTargetPath = await _backupService.ResolveRestoreStateDbTargetPathAsync( + backupDir, + lockStorage, + options); + lockedStateDb = await StateDbLockResource.ResolveAsync( + stateDbTargetPath, + cancellationToken); + stateDbHandle = await _lockService.AcquireStateDbLockAsync(lockedStateDb, "restore"); + } + await using LockHandle? stateDbLock = stateDbHandle; RestorePreparation preparation = await PrepareRestoreAsync( codexHome, backupDir, options, explicitSqliteHome, cancellationToken); + await AssertStateDbTargetLockMatchesAsync( + preparation.StateDbTargetPath, + lockedStateDb, + cancellationToken); if (expectedSnapshot is not null) { AssertSnapshotFresh(snapshotExpiresAtUtc); @@ -1215,7 +1644,8 @@ private async Task RunRestoreCoreAsync( RestoreResult result = await _backupService.RestoreBackupAsync( preparation.BackupDirectory, preparation.Storage, - preparation.Options); + preparation.Options, + expectedStateDbTargetPath: preparation.StateDbTargetPath); await FileTransactionJournal.MarkBackupRolledBackAsync( preparation.BackupDirectory, codexHome, @@ -1256,6 +1686,12 @@ private async Task PrepareRestoreAsync( CodexStorageLayout storage = await PrepareStorageAsync(codexHome, explicitSqliteHome, configText); storage.EnsureSqliteAccessSupported("restore"); string normalizedBackupDir = Path.GetFullPath(backupDir); + string? stateDbTargetPath = options.RestoreDatabase + ? await _backupService.ResolveRestoreStateDbTargetPathAsync( + normalizedBackupDir, + storage, + options) + : null; IReadOnlyList pending = await FileTransactionJournal.FindPendingAsync(codexHome); PendingTransactionInfo[] foreignPending = pending .Where(transaction => !PathComparer.Equals( @@ -1277,7 +1713,8 @@ private async Task PrepareRestoreAsync( configPath, normalizedBackupDir, options, - storage); + storage, + stateDbTargetPath); } private async Task BuildRestorePlanSnapshotAsync( @@ -1311,8 +1748,8 @@ private async Task BuildRestorePlanSnapshotAsync( } if (preparation.Options.RestoreDatabase) { - string databasePath = preparation.Storage.StateDbLocation?.Path - ?? Path.Combine(preparation.Storage.SqliteHome, AppConstants.DbFileBasename); + string databasePath = preparation.StateDbTargetPath + ?? throw new InvalidOperationException("Restore preparation did not resolve a State DB target."); targets.Add(new CoreWriteTargetSpec( databasePath, "restore", @@ -1578,6 +2015,78 @@ private async Task PrepareStorageAsync( return storage with { StateDbLocation = stateDb }; } + private async Task<(StateDbLockResource? Resource, LockHandle? Handle)> AcquireCurrentStateDbLockAsync( + string codexHome, + string? explicitSqliteHome, + string label, + CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + string configText = await _configFileService.ReadConfigTextAsync( + _codexHomeService.ConfigPath(codexHome)); + CodexStorageLayout storage = await PrepareStorageAsync(codexHome, explicitSqliteHome, configText); + storage.EnsureSqliteAccessSupported(label); + EnsureWritableStorage(storage); + if (storage.StateDbLocation is null) + { + return (null, null); + } + StateDbLockResource resource = await StateDbLockResource.ResolveAsync( + storage.StateDbLocation.Path, + cancellationToken); + LockHandle handle = await _lockService.AcquireStateDbLockAsync(resource, label); + return (resource, handle); + } + + private static async Task AssertStateDbLockMatchesAsync( + CodexStorageLayout storage, + StateDbLockResource? lockedResource, + CancellationToken cancellationToken) + { + if (storage.StateDbLocation is null) + { + if (lockedResource is null) return; + throw StateDbLockChanged(); + } + StateDbLockResource current = await StateDbLockResource.ResolveAsync( + storage.StateDbLocation.Path, + cancellationToken); + if (lockedResource is null + || !string.Equals(current.ResourceKey, lockedResource.ResourceKey, StringComparison.Ordinal)) + { + throw StateDbLockChanged(); + } + } + + private static async Task AssertStateDbTargetLockMatchesAsync( + string? stateDbTargetPath, + StateDbLockResource? lockedResource, + CancellationToken cancellationToken) + { + if (stateDbTargetPath is null) + { + if (lockedResource is null) return; + throw StateDbLockChanged(); + } + StateDbLockResource current = await StateDbLockResource.ResolveAsync( + stateDbTargetPath, + cancellationToken); + if (lockedResource is null + || !string.Equals(current.ResourceKey, lockedResource.ResourceKey, StringComparison.Ordinal)) + { + throw StateDbLockChanged(); + } + } + + private static InvalidOperationException StateDbLockChanged() + { + InvalidOperationException error = new( + "The resolved State DB resource changed while the write operation was acquiring its locks."); + error.Data["codex-provider-sync/error-code"] = LockService.LockUnverifiableErrorCode; + error.Data["codex-provider-sync/lock-scope"] = "state-db"; + return error; + } + private static void EnsureWritableStorage(CodexStorageLayout storage) { if (storage.StateDbLocation is null && storage.HasConfiguredSqliteHome) @@ -1627,5 +2136,6 @@ private sealed record RestorePreparation( string ConfigPath, string BackupDirectory, RestoreBackupOptions Options, - CodexStorageLayout Storage); + CodexStorageLayout Storage, + string? StateDbTargetPath); } diff --git a/desktop/CodexProviderSync.Core/LockService.cs b/desktop/CodexProviderSync.Core/LockService.cs index 47dcf62..b09e570 100644 --- a/desktop/CodexProviderSync.Core/LockService.cs +++ b/desktop/CodexProviderSync.Core/LockService.cs @@ -1,8 +1,10 @@ using System.Diagnostics; using System.Globalization; using System.Runtime.InteropServices; +using System.Security.Cryptography; using System.Text; using System.Text.Json; +using System.Text.Json.Serialization; namespace CodexProviderSync.Core; @@ -17,11 +19,15 @@ public sealed class LockService private const int DefaultLockCreateRetryDelayMs = 75; private const int DefaultOwnedClaimDeleteRetryCount = 3; private const int DefaultOwnedClaimDeleteRetryDelayMs = 75; - private const string BusyErrorDataKey = "codex-provider-sync/error-code"; - public const string OperationBusyErrorCode = "TARGET_BUSY"; + private const string ErrorCodeDataKey = "codex-provider-sync/error-code"; + private const string LockScopeDataKey = "codex-provider-sync/lock-scope"; + private const string ResourceKeyDataKey = "codex-provider-sync/resource-key"; + public const string OperationBusyErrorCode = "OPERATION_BUSY"; + public const string LockUnverifiableErrorCode = "LOCK_UNVERIFIABLE"; private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web) { - WriteIndented = true + WriteIndented = true, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; private readonly Func? _testHook; @@ -39,7 +45,35 @@ public Task AcquireLockAsync( string codexHome, string label = "codex-provider-sync") { - return AcquirePathLockAsync(AppConstants.LockPath(codexHome), label); + return AcquirePathLockAsync(AppConstants.LockPath(codexHome), label, "codex-home"); + } + + public Task AcquireStateDbLockAsync( + StateDbLockResource resource, + string label = "codex-provider-sync") + { + ArgumentNullException.ThrowIfNull(resource); + return AcquirePathLockAsync(resource.LockPath, label, "state-db", resource.ResourceKey); + } + + /// + /// Observes the Home lock without creating, reclaiming, or deleting any + /// protocol resource. Status uses this fail-closed probe so it never scans + /// files while another runtime may be mutating them. + /// + public Task InspectLockAsync(string codexHome) + { + return InspectPathLockAsync(AppConstants.LockPath(codexHome), "codex-home", null); + } + + /// + /// Observes the resolved State DB lock without acquiring it. The supplied + /// resource identity must be the same physical identity used by writers. + /// + public Task InspectStateDbLockAsync(StateDbLockResource resource) + { + ArgumentNullException.ThrowIfNull(resource); + return InspectPathLockAsync(resource.LockPath, "state-db", resource.ResourceKey); } /// @@ -49,8 +83,20 @@ public Task AcquireLockAsync( /// public async Task AcquirePathLockAsync( string lockPath, - string label = "codex-provider-sync") + string label = "codex-provider-sync", + string scope = "codex-home", + string? resourceKey = null) { + if (scope is not ("codex-home" or "state-db")) + { + throw new ArgumentOutOfRangeException(nameof(scope), scope, "Lock scope must be codex-home or state-db."); + } + if (scope == "state-db" + && (resourceKey is null || resourceKey.Length != 64 + || resourceKey.Any(static value => !((value >= '0' && value <= '9') || (value >= 'a' && value <= 'f'))))) + { + throw new ArgumentException("State DB resourceKey must be a 64-character SHA-256 hex value.", nameof(resourceKey)); + } string canonicalPath = Path.GetFullPath(lockPath); string parentPath = Path.GetDirectoryName(canonicalPath) ?? throw new InvalidOperationException($"Cannot resolve the parent directory for lock {canonicalPath}."); @@ -59,7 +105,7 @@ public async Task AcquirePathLockAsync( Directory.CreateDirectory(claimsPath); SetOwnerOnlyDirectoryMode(claimsPath); - LockOwner owner = CreateCurrentOwner(label); + LockOwner owner = CreateCurrentOwner(label, scope, resourceKey); string claimPath = Path.Combine(claimsPath, owner.InstanceId + ".json"); string candidatePath = $"{canonicalPath}.candidate.{owner.ProcessId}.{owner.InstanceId}"; string reservationMarkerPath = ReservationMarkerPath(canonicalPath, owner.InstanceId); @@ -76,13 +122,13 @@ public async Task AcquirePathLockAsync( await _testHook("claim-published", owner.InstanceId); } - await AssertSoleLiveClaimAsync(canonicalPath, claimsPath, claimPath, owner); - await ReclaimCanonicalIfStaleAsync(canonicalPath); + await AssertSoleLiveClaimAsync(canonicalPath, claimsPath, claimPath, owner, scope, resourceKey); + await ReclaimCanonicalIfStaleAsync(canonicalPath, scope, resourceKey); // A contender can publish while a stale canonical lock is being // quarantined. Re-check immediately before publishing ours. A new // protocol contender will see this live claim and withdraw. - await AssertSoleLiveClaimAsync(canonicalPath, claimsPath, claimPath, owner); + await AssertSoleLiveClaimAsync(canonicalPath, claimsPath, claimPath, owner, scope, resourceKey); Directory.CreateDirectory(candidatePath); SetOwnerOnlyDirectoryMode(candidatePath); @@ -106,23 +152,30 @@ await AtomicFile.WriteAllTextAsync( } catch (IOException error) when (IsAlreadyExistsError(error)) { - throw LockAlreadyExists( + throw LockUnverifiable( canonicalPath, "another owner populated the canonical reservation before owner.json could be published"); } ownerLinked = true; if (!await ReservationMarkerMatchesAsync(reservationMarkerPath, owner.InstanceId)) { - throw LockAlreadyExists( + throw LockUnverifiable( canonicalPath, "the canonical reservation changed identity while owner.json was being published"); } TryDeleteDirectory(candidatePath); - return new LockHandle(canonicalPath, claimsPath, claimPath, owner.InstanceId); + return new LockHandle( + canonicalPath, + claimsPath, + claimPath, + owner.InstanceId, + scope, + resourceKey); } catch (Exception acquisitionError) { + AnnotateLockError(acquisitionError, scope, resourceKey); TryDeleteDirectory(candidatePath); if (canonicalReserved && !ownerLinked) { @@ -145,24 +198,289 @@ await AtomicFile.WriteAllTextAsync( } catch (Exception cleanupError) { - throw new AggregateException( + AggregateException aggregate = new( $"Lock acquisition failed and owned-claim cleanup threw unexpectedly: {acquisitionError.Message} Cleanup failure: {cleanupError.Message}", acquisitionError, cleanupError); + MarkLockUnverifiable(aggregate, scope, resourceKey); + throw aggregate; } if (!cleanup.Succeeded) { - throw new AggregateException( + AggregateException aggregate = new( $"Lock acquisition failed and owned-claim cleanup was incomplete: {acquisitionError.Message} Cleanup failure: {cleanup.Failure!.Message}", acquisitionError, cleanup.Failure!); + MarkLockUnverifiable(aggregate, scope, resourceKey); + throw aggregate; } } throw; } } - private static LockOwner CreateCurrentOwner(string label) + private static async Task InspectPathLockAsync( + string lockPath, + string scope, + string? resourceKey) + { + string canonicalPath; + string claimsPath; + try + { + canonicalPath = Path.GetFullPath(lockPath); + claimsPath = canonicalPath + ".claims"; + } + catch (Exception error) + { + return LockInspection.Unverifiable(scope, resourceKey, string.Empty, error.Message); + } + + try + { + string observationBefore = CaptureLockObservation(canonicalPath, claimsPath); + FileAttributes? canonicalAttributes = TryGetPathAttributes(canonicalPath); + if (canonicalAttributes is not null) + { + if ((canonicalAttributes.Value & FileAttributes.ReparsePoint) != 0) + { + return LockInspection.Unverifiable( + scope, + resourceKey, + observationBefore, + "the canonical lock path is a symbolic link or reparse point"); + } + if ((canonicalAttributes.Value & FileAttributes.Directory) == 0) + { + return LockInspection.Unverifiable( + scope, + resourceKey, + observationBefore, + "the canonical lock path is not a directory"); + } + + string ownerPath = Path.Combine(canonicalPath, "owner.json"); + OwnerReadResult first = await ReadOwnerAsync( + ownerPath, + requireVersionTwo: false, + scope, + resourceKey); + if (!first.Valid) + { + return LockInspection.Unverifiable( + scope, + resourceKey, + observationBefore, + $"owner.json cannot be verified: {first.Error ?? "unknown owner-read failure"}"); + } + if (!IsOwnerLive(first.Owner!)) + { + return LockInspection.Unverifiable( + scope, + resourceKey, + observationBefore, + "the canonical owner is stale and is preserved fail-closed"); + } + + OwnerReadResult second = await ReadOwnerAsync( + ownerPath, + requireVersionTwo: false, + scope, + resourceKey); + string observationAfter = CaptureLockObservation(canonicalPath, claimsPath); + if (!second.Valid + || !SameOwnerGeneration(first.Owner!, second.Owner!) + || !string.Equals(observationBefore, observationAfter, StringComparison.Ordinal)) + { + return LockInspection.Unverifiable( + scope, + resourceKey, + observationAfter, + "the canonical lock identity changed during read-only inspection"); + } + return LockInspection.Active( + scope, + resourceKey, + observationAfter, + ToInspectionOwner(first.Owner!)); + } + + FileAttributes? claimsAttributes = TryGetPathAttributes(claimsPath); + if (claimsAttributes is not null) + { + if ((claimsAttributes.Value & FileAttributes.ReparsePoint) != 0 + || (claimsAttributes.Value & FileAttributes.Directory) == 0) + { + return LockInspection.Unverifiable( + scope, + resourceKey, + observationBefore, + "the claims path is not a verified regular directory"); + } + + string[] claims = Directory + .EnumerateFiles(claimsPath, "*.json", SearchOption.TopDirectoryOnly) + .Order(StringComparer.Ordinal) + .ToArray(); + if (claims.Length > 1) + { + return LockInspection.Unverifiable( + scope, + resourceKey, + observationBefore, + "multiple protocol claims are present"); + } + if (claims.Length == 1) + { + OwnerReadResult claim = await ReadOwnerAsync( + claims[0], + requireVersionTwo: true, + scope, + resourceKey); + if (!claim.Valid + || !string.Equals( + Path.GetFileNameWithoutExtension(claims[0]), + claim.Owner?.InstanceId, + StringComparison.OrdinalIgnoreCase)) + { + return LockInspection.Unverifiable( + scope, + resourceKey, + observationBefore, + $"the protocol claim cannot be verified: {claim.Error ?? "owner identity mismatch"}"); + } + if (!IsOwnerLive(claim.Owner!)) + { + return LockInspection.Unverifiable( + scope, + resourceKey, + observationBefore, + "the protocol claim is stale and is preserved fail-closed"); + } + + OwnerReadResult verified = await ReadOwnerAsync( + claims[0], + requireVersionTwo: true, + scope, + resourceKey); + string observationAfter = CaptureLockObservation(canonicalPath, claimsPath); + if (!verified.Valid + || !SameOwnerGeneration(claim.Owner!, verified.Owner!) + || !string.Equals(observationBefore, observationAfter, StringComparison.Ordinal)) + { + return LockInspection.Unverifiable( + scope, + resourceKey, + observationAfter, + "the protocol claim changed during read-only inspection"); + } + return LockInspection.Active( + scope, + resourceKey, + observationAfter, + ToInspectionOwner(claim.Owner!)); + } + } + + if (TryGetPathAttributes(canonicalPath) is not null) + { + return LockInspection.Unverifiable( + scope, + resourceKey, + observationBefore, + "a canonical lock appeared during read-only inspection"); + } + string finalObservation = CaptureLockObservation(canonicalPath, claimsPath); + if (!string.Equals(observationBefore, finalObservation, StringComparison.Ordinal)) + { + return LockInspection.Unverifiable( + scope, + resourceKey, + finalObservation, + "the lock protocol resources changed during read-only inspection"); + } + return LockInspection.Absent(scope, resourceKey, finalObservation); + } + catch (Exception error) when (error is IOException + or UnauthorizedAccessException + or System.Security.SecurityException + or InvalidOperationException) + { + string observation; + try + { + observation = CaptureLockObservation(canonicalPath, claimsPath); + } + catch + { + observation = string.Empty; + } + return LockInspection.Unverifiable(scope, resourceKey, observation, error.Message); + } + } + + private static LockInspectionOwner ToInspectionOwner(LockOwnerSnapshot owner) + { + return new LockInspectionOwner( + owner.ProcessId, + owner.InstanceId, + owner.Runtime, + owner.Label, + owner.StartedAt); + } + + private static string CaptureLockObservation(string canonicalPath, string claimsPath) + { + StringBuilder canonical = new(); + AppendPathObservation(canonical, "canonical", canonicalPath, includeChildren: true); + AppendPathObservation(canonical, "claims", claimsPath, includeChildren: true); + return Convert.ToHexString( + SHA256.HashData(Encoding.UTF8.GetBytes(canonical.ToString()))) + .ToLowerInvariant(); + } + + private static void AppendPathObservation( + StringBuilder destination, + string label, + string observedPath, + bool includeChildren) + { + FileAttributes? attributes = TryGetPathAttributes(observedPath); + destination.Append(label).Append('|').Append(observedPath).Append('|'); + if (attributes is null) + { + destination.Append("missing\n"); + return; + } + + destination.Append((int)attributes.Value).Append('|') + .Append(File.GetLastWriteTimeUtc(observedPath).Ticks).Append('\n'); + if (!includeChildren || (attributes.Value & FileAttributes.Directory) == 0) + { + if ((attributes.Value & FileAttributes.Directory) == 0) + { + destination.Append(new FileInfo(observedPath).Length).Append('\n'); + } + return; + } + + foreach (string entry in Directory + .EnumerateFileSystemEntries(observedPath, "*", SearchOption.TopDirectoryOnly) + .Order(StringComparer.Ordinal)) + { + FileAttributes entryAttributes = File.GetAttributes(entry); + destination.Append(Path.GetFileName(entry)).Append('|') + .Append((int)entryAttributes).Append('|') + .Append(File.GetLastWriteTimeUtc(entry).Ticks).Append('|'); + if ((entryAttributes & FileAttributes.Directory) == 0) + { + destination.Append(new FileInfo(entry).Length); + } + destination.Append('\n'); + } + } + + private static LockOwner CreateCurrentOwner(string label, string scope, string? resourceKey) { using Process process = Process.GetCurrentProcess(); string processStartedAt = FormatUtcSecond(process.StartTime.ToUniversalTime()); @@ -177,7 +495,9 @@ private static LockOwner CreateCurrentOwner(string label) StartedAt = FormatUtcSecond(DateTime.UtcNow), Label = label, Cwd = Environment.CurrentDirectory, - CurrentDirectory = Environment.CurrentDirectory + CurrentDirectory = Environment.CurrentDirectory, + Scope = scope, + ResourceKey = resourceKey }; } @@ -221,7 +541,9 @@ private static async Task AssertSoleLiveClaimAsync( string canonicalPath, string claimsPath, string ownClaimPath, - LockOwner ownOwner) + LockOwner ownOwner, + string expectedScope, + string? expectedResourceKey) { foreach (string candidate in Directory .EnumerateFiles(claimsPath, "*.json", SearchOption.TopDirectoryOnly) @@ -229,26 +551,34 @@ private static async Task AssertSoleLiveClaimAsync( { if (PathComparer.Equals(Path.GetFullPath(candidate), Path.GetFullPath(ownClaimPath))) { - OwnerReadResult ownRead = await ReadOwnerAsync(candidate, requireVersionTwo: true); + OwnerReadResult ownRead = await ReadOwnerAsync( + candidate, + requireVersionTwo: true, + expectedScope, + expectedResourceKey); if (!ownRead.Valid || !string.Equals(ownRead.Owner!.InstanceId, ownOwner.InstanceId, StringComparison.OrdinalIgnoreCase)) { - throw LockAlreadyExists(canonicalPath, "this process's claim identity changed before acquisition"); + throw LockUnverifiable(canonicalPath, "this process's claim identity changed before acquisition"); } continue; } - OwnerReadResult read = await ReadOwnerAsync(candidate, requireVersionTwo: true); + OwnerReadResult read = await ReadOwnerAsync( + candidate, + requireVersionTwo: true, + expectedScope, + expectedResourceKey); if (!read.Valid) { - throw LockAlreadyExists(canonicalPath, $"claim {candidate} cannot be verified and is retained fail-closed"); + throw LockUnverifiable(canonicalPath, $"claim {candidate} cannot be verified and is retained fail-closed"); } if (!string.Equals( Path.GetFileNameWithoutExtension(candidate), read.Owner!.InstanceId, StringComparison.OrdinalIgnoreCase)) { - throw LockAlreadyExists(canonicalPath, $"claim {candidate} does not match its owner instanceId"); + throw LockUnverifiable(canonicalPath, $"claim {candidate} does not match its owner instanceId"); } if (IsOwnerLive(read.Owner)) @@ -258,7 +588,7 @@ private static async Task AssertSoleLiveClaimAsync( if (!await TryQuarantineAndDeleteStaleClaimAsync(candidate, read.Owner!)) { - throw LockAlreadyExists(canonicalPath, $"stale claim {candidate} changed while it was being reclaimed"); + throw LockUnverifiable(canonicalPath, $"stale claim {candidate} changed while it was being reclaimed"); } } @@ -272,7 +602,7 @@ private static async Task AssertSoleLiveClaimAsync( Path.GetFullPath(ownClaimPath))); if (otherClaim is not null) { - throw LockAlreadyExists(canonicalPath, $"a concurrent claim appeared at {otherClaim}"); + throw LockUnverifiable(canonicalPath, $"a concurrent claim appeared at {otherClaim}"); } } @@ -309,7 +639,10 @@ private static async Task TryQuarantineAndDeleteStaleClaimAsync( return !File.Exists(quarantinePath); } - private async Task ReclaimCanonicalIfStaleAsync(string canonicalPath) + private async Task ReclaimCanonicalIfStaleAsync( + string canonicalPath, + string expectedScope, + string? expectedResourceKey) { FileAttributes? attributes = TryGetPathAttributes(canonicalPath); if (attributes is null) @@ -318,18 +651,22 @@ private async Task ReclaimCanonicalIfStaleAsync(string canonicalPath) } if ((attributes.Value & FileAttributes.ReparsePoint) != 0) { - throw LockAlreadyExists(canonicalPath, "the canonical lock path is a symbolic link or reparse point"); + throw LockUnverifiable(canonicalPath, "the canonical lock path is a symbolic link or reparse point"); } if ((attributes.Value & FileAttributes.Directory) == 0) { - throw LockAlreadyExists(canonicalPath, "the canonical lock path is not a directory"); + throw LockUnverifiable(canonicalPath, "the canonical lock path is not a directory"); } string ownerPath = Path.Combine(canonicalPath, "owner.json"); - OwnerReadResult read = await ReadOwnerAsync(ownerPath, requireVersionTwo: false); + OwnerReadResult read = await ReadOwnerAsync( + ownerPath, + requireVersionTwo: false, + expectedScope, + expectedResourceKey); if (!read.Valid) { - throw LockAlreadyExists(canonicalPath, "owner.json cannot be verified and is retained fail-closed"); + throw LockUnverifiable(canonicalPath, "owner.json cannot be verified and is retained fail-closed"); } if (IsOwnerLive(read.Owner!)) { @@ -351,19 +688,21 @@ private async Task ReclaimCanonicalIfStaleAsync(string canonicalPath) } catch (Exception error) when (error is IOException or UnauthorizedAccessException) { - throw LockAlreadyExists(canonicalPath, "the canonical lock changed during stale-owner reclamation"); + throw LockUnverifiable(canonicalPath, "the canonical lock changed during stale-owner reclamation"); } OwnerReadResult moved = await ReadOwnerAsync( Path.Combine(quarantinePath, "owner.json"), - requireVersionTwo: false); + requireVersionTwo: false, + expectedScope, + expectedResourceKey); if (!moved.Valid || !SameOwnerGeneration(moved.Owner!, read.Owner!)) { bool restored = await TryRestoreQuarantinedOwnerAsync( quarantinePath, canonicalPath, moved.Owner?.InstanceId); - throw LockAlreadyExists( + throw LockUnverifiable( canonicalPath, restored ? "the owner changed during reclamation, so the moved lock was restored" @@ -379,7 +718,9 @@ private async Task ReclaimCanonicalIfStaleAsync(string canonicalPath) private static async Task ReadOwnerAsync( string ownerPath, - bool requireVersionTwo) + bool requireVersionTwo, + string? expectedScope = null, + string? expectedResourceKey = null) { string text; try @@ -409,6 +750,11 @@ private static async Task ReadOwnerAsync( } string? instanceId = TryReadString(root, "instanceId"); + string? runtime = TryReadString(root, "runtime"); + string? label = TryReadString(root, "label"); + string? startedAt = TryReadString(root, "startedAt"); + string? scope = TryReadString(root, "scope"); + string? resourceKey = TryReadString(root, "resourceKey"); string? processStartedAtText = TryReadString(root, "processStartedAt"); DateTimeOffset? processStartedAt = null; if (processStartedAtText is not null) @@ -442,6 +788,19 @@ private static async Task ReadOwnerAsync( { return new OwnerReadResult(null, "version 2 owner identity is incomplete"); } + if (expectedScope is not null) + { + if (scope is not null && !string.Equals(scope, expectedScope, StringComparison.Ordinal)) + { + return new OwnerReadResult(null, "owner lock scope does not match the requested resource"); + } + if (expectedScope == "state-db" + && (!string.Equals(scope, expectedScope, StringComparison.Ordinal) + || !string.Equals(resourceKey, expectedResourceKey, StringComparison.Ordinal))) + { + return new OwnerReadResult(null, "State DB owner scope or resourceKey is missing or mismatched"); + } + } if (processStartedAt is null && string.IsNullOrWhiteSpace(processStartMarker)) { // Legacy records without a process start identity can only be @@ -456,6 +815,11 @@ private static async Task ReadOwnerAsync( processStartedAt, processStartMarker, instanceId, + runtime, + label, + startedAt, + scope, + resourceKey, text), null); } catch (Exception error) when (error is JsonException or InvalidOperationException) @@ -592,7 +956,12 @@ private static bool SameOwnerGeneration(LockOwnerSnapshot left, LockOwnerSnapsho return string.Equals(left.InstanceId, right.InstanceId, StringComparison.OrdinalIgnoreCase) && left.ProcessId == right.ProcessId && left.ProcessStartedAt == right.ProcessStartedAt - && string.Equals(left.ProcessStartMarker, right.ProcessStartMarker, StringComparison.Ordinal); + && string.Equals(left.ProcessStartMarker, right.ProcessStartMarker, StringComparison.Ordinal) + && string.Equals(left.Runtime, right.Runtime, StringComparison.Ordinal) + && string.Equals(left.Label, right.Label, StringComparison.Ordinal) + && string.Equals(left.StartedAt, right.StartedAt, StringComparison.Ordinal) + && string.Equals(left.Scope, right.Scope, StringComparison.Ordinal) + && string.Equals(left.ResourceKey, right.ResourceKey, StringComparison.Ordinal); } return string.Equals(left.RawText, right.RawText, StringComparison.Ordinal); } @@ -754,21 +1123,69 @@ internal static async ValueTask ReleaseAsync( public static bool IsOperationBusy(Exception error) { - return error is InvalidOperationException - && string.Equals( - error.Data[BusyErrorDataKey] as string, + return string.Equals( + error.Data[ErrorCodeDataKey] as string, OperationBusyErrorCode, StringComparison.Ordinal); } + public static bool IsLockUnverifiable(Exception error) + { + return string.Equals( + error.Data[ErrorCodeDataKey] as string, + LockUnverifiableErrorCode, + StringComparison.Ordinal); + } + private static InvalidOperationException LockAlreadyExists(string lockPath, string reason) { InvalidOperationException error = new( $"Lock already exists at {lockPath}: {reason}. Close Codex/App and retry; do not remove it unless the recorded owner is known to be gone."); - error.Data[BusyErrorDataKey] = OperationBusyErrorCode; + error.Data[ErrorCodeDataKey] = OperationBusyErrorCode; return error; } + private static InvalidOperationException LockUnverifiable(string lockPath, string reason) + { + InvalidOperationException error = new( + $"Lock ownership cannot be verified at {lockPath}: {reason}. The resource was preserved fail-closed."); + error.Data[ErrorCodeDataKey] = LockUnverifiableErrorCode; + return error; + } + + private static void AnnotateLockError(Exception error, string scope, string? resourceKey) + { + if (error.Data.Contains(ErrorCodeDataKey)) + { + error.Data[LockScopeDataKey] = scope; + if (resourceKey is not null) + { + error.Data[ResourceKeyDataKey] = resourceKey; + } + } + if (error is AggregateException aggregate) + { + foreach (Exception inner in aggregate.InnerExceptions) + { + AnnotateLockError(inner, scope, resourceKey); + } + } + } + + internal static void MarkLockUnverifiable( + Exception error, + string scope, + string? resourceKey) + { + error.Data[ErrorCodeDataKey] = LockUnverifiableErrorCode; + error.Data[LockScopeDataKey] = scope; + if (resourceKey is not null) + { + error.Data[ResourceKeyDataKey] = resourceKey; + } + AnnotateLockError(error, scope, resourceKey); + } + private static int? TryReadInt(JsonElement root, string name) { return root.TryGetProperty(name, out JsonElement value) @@ -1076,7 +1493,7 @@ internal static async Task CreateLockDirectoryAsync( if (errorCode == Win32ErrorAlreadyExists) { - throw LockAlreadyExists(lockPath, "the canonical directory already exists"); + throw LockUnverifiable(lockPath, "the canonical directory already exists"); } if (!IsTransientLockCreateError(errorCode) || attempts >= retryCount) @@ -1149,6 +1566,8 @@ private sealed class LockOwner public required string Label { get; init; } public required string Cwd { get; init; } public required string CurrentDirectory { get; init; } + public string? Scope { get; init; } + public string? ResourceKey { get; init; } } private sealed record LockOwnerSnapshot( @@ -1157,6 +1576,11 @@ private sealed record LockOwnerSnapshot( DateTimeOffset? ProcessStartedAt, string? ProcessStartMarker, string? InstanceId, + string? Runtime, + string? Label, + string? StartedAt, + string? Scope, + string? ResourceKey, string RawText); private sealed record OwnerReadResult(LockOwnerSnapshot? Owner, string? Error) @@ -1172,24 +1596,76 @@ private sealed record OwnedClaimDeleteResult(bool Succeeded, Exception? Failure) } } +public sealed record LockInspectionOwner( + int ProcessId, + string? InstanceId, + string? Runtime, + string? Label, + string? StartedAt); + +public sealed record LockInspection( + string State, + string Scope, + string? ResourceKey, + string ObservationRevision, + LockInspectionOwner? Owner, + string? ErrorCode, + string? Error) +{ + public bool IsAbsent => string.Equals(State, "absent", StringComparison.Ordinal); + + internal static LockInspection Absent( + string scope, + string? resourceKey, + string observationRevision) => + new("absent", scope, resourceKey, observationRevision, null, null, null); + + internal static LockInspection Active( + string scope, + string? resourceKey, + string observationRevision, + LockInspectionOwner owner) => + new("active", scope, resourceKey, observationRevision, owner, null, null); + + internal static LockInspection Unverifiable( + string scope, + string? resourceKey, + string observationRevision, + string error) => + new( + "unverifiable", + scope, + resourceKey, + observationRevision, + null, + LockService.LockUnverifiableErrorCode, + error); +} + public sealed class LockHandle : IAsyncDisposable { private readonly string _canonicalPath; private readonly string _claimsPath; private readonly string _claimPath; private readonly string _instanceId; + private readonly string _scope; + private readonly string? _resourceKey; private bool _released; internal LockHandle( string canonicalPath, string claimsPath, string claimPath, - string instanceId) + string instanceId, + string scope, + string? resourceKey) { _canonicalPath = canonicalPath; _claimsPath = claimsPath; _claimPath = claimPath; _instanceId = instanceId; + _scope = scope; + _resourceKey = resourceKey; } public string LockPath => _canonicalPath; @@ -1203,11 +1679,19 @@ public async ValueTask DisposeAsync() return; } - await LockService.ReleaseAsync( - _canonicalPath, - _claimsPath, - _claimPath, - _instanceId); + try + { + await LockService.ReleaseAsync( + _canonicalPath, + _claimsPath, + _claimPath, + _instanceId); + } + catch (Exception error) + { + LockService.MarkLockUnverifiable(error, _scope, _resourceKey); + throw; + } _released = true; } } diff --git a/desktop/CodexProviderSync.Core/Models.cs b/desktop/CodexProviderSync.Core/Models.cs index e7158b7..b0bc81c 100644 --- a/desktop/CodexProviderSync.Core/Models.cs +++ b/desktop/CodexProviderSync.Core/Models.cs @@ -18,6 +18,9 @@ public sealed class ProviderCounts public sealed class StatusSnapshot { + public int SchemaVersion { get; init; } = 1; + public DateTimeOffset SnapshotAt { get; init; } = DateTimeOffset.UtcNow; + public string StorageRevision { get; init; } = string.Empty; public required string CodexHome { get; init; } public string SqliteHome { get; init; } = string.Empty; public string SqliteHomeSource { get; init; } = "default"; @@ -37,10 +40,28 @@ public sealed class StatusSnapshot public required string BackupRoot { get; init; } public required BackupSummary BackupSummary { get; init; } public IReadOnlyList PendingTransactions { get; init; } = []; + public StatusOperationInfo? OperationInProgress { get; init; } + public StatusReadBlockedInfo? StatusReadBlocked { get; init; } + public bool RolloutScanComplete { get; init; } = true; [JsonIgnore] public StatusPerformanceMetrics PerformanceMetrics { get; init; } = new(); } +public sealed record StatusOperationInfo( + string? OperationId, + string Operation, + string Actor, + string? Runtime, + string? StartedAt, + string BusyScope, + string LockState, + string? ErrorCode = null); + +public sealed record StatusReadBlockedInfo( + string Reason, + string LockState, + string? Revision = null); + public sealed class StatusPerformanceMetrics { public long TotalDurationMs { get; init; } diff --git a/desktop/CodexProviderSync.Core/StateDbLockResource.cs b/desktop/CodexProviderSync.Core/StateDbLockResource.cs new file mode 100644 index 0000000..a558f07 --- /dev/null +++ b/desktop/CodexProviderSync.Core/StateDbLockResource.cs @@ -0,0 +1,228 @@ +using System.ComponentModel; +using System.Runtime.InteropServices; +using System.Security.Cryptography; +using System.Text; +using Microsoft.Win32.SafeHandles; + +namespace CodexProviderSync.Core; + +public sealed record StateDbLockResource( + string Identity, + string ResourceKey, + string RealDbParent, + string StateDbPath, + string LockPath) +{ + private const string ErrorCodeDataKey = "codex-provider-sync/error-code"; + private const string LockScopeDataKey = "codex-provider-sync/lock-scope"; + private const uint FileShareRead = 0x00000001; + private const uint FileShareWrite = 0x00000002; + private const uint FileShareDelete = 0x00000004; + private const uint OpenExisting = 3; + private const uint FileFlagBackupSemantics = 0x02000000; + + public static Task ResolveAsync( + string stateDbTargetPath, + CancellationToken cancellationToken = default) + { + cancellationToken.ThrowIfCancellationRequested(); + if (string.IsNullOrWhiteSpace(stateDbTargetPath)) + { + throw Unverifiable("The State DB resource path is missing or invalid."); + } + + string lexicalPath = Path.GetFullPath(stateDbTargetPath); + if (!string.Equals( + Path.GetFileName(lexicalPath), + AppConstants.DbFileBasename, + StringComparison.OrdinalIgnoreCase)) + { + throw Unverifiable("The State DB resource filename is not canonical."); + } + + string lexicalParent = Path.GetDirectoryName(lexicalPath) + ?? throw Unverifiable("The State DB resource parent cannot be resolved."); + string realParent; + try + { + realParent = ResolveExistingPhysicalPath(lexicalParent, directory: true); + string verifiedParent = ResolveExistingPhysicalPath(lexicalParent, directory: true); + if (!PathEquals(realParent, verifiedParent)) + { + throw Unverifiable("The State DB physical parent changed while its identity was resolved."); + } + } + catch (UnauthorizedAccessException error) + { + throw PermissionDenied("Permission denied while resolving the State DB resource identity.", error); + } + catch (InvalidOperationException error) when (IsTyped(error)) + { + throw; + } + catch (Exception error) when (error is IOException or Win32Exception) + { + throw Unverifiable("The State DB physical parent identity cannot be verified.", error); + } + + string physicalFileName = AppConstants.DbFileBasename; + try + { + FileAttributes attributes = File.GetAttributes(lexicalPath); + if ((attributes & FileAttributes.Directory) != 0) + { + throw Unverifiable("The State DB target is not a regular file."); + } + string realFile = ResolveExistingPhysicalPath(lexicalPath, directory: false); + physicalFileName = Path.GetFileName(realFile); + realParent = Path.GetDirectoryName(realFile) + ?? throw Unverifiable("The State DB physical parent cannot be resolved."); + if (!string.Equals(physicalFileName, AppConstants.DbFileBasename, StringComparison.OrdinalIgnoreCase)) + { + throw Unverifiable("The State DB physical filename is not canonical."); + } + } + catch (FileNotFoundException) + { + // A missing database is valid for Restore only after its physical + // parent has been verified above. + } + catch (DirectoryNotFoundException error) + { + throw Unverifiable("The State DB physical parent identity cannot be verified.", error); + } + catch (UnauthorizedAccessException error) + { + throw PermissionDenied("Permission denied while resolving the State DB physical target.", error); + } + catch (InvalidOperationException error) when (IsTyped(error)) + { + throw; + } + catch (Exception error) when (error is IOException or Win32Exception) + { + throw Unverifiable("The State DB physical target identity cannot be verified.", error); + } + + string normalizedParent = NormalizeIdentityPart(Path.GetFullPath(realParent)); + string normalizedFileName = NormalizeIdentityPart(physicalFileName); + string identity = normalizedParent + "\0" + normalizedFileName; + string resourceKey = Convert.ToHexString( + SHA256.HashData(Encoding.UTF8.GetBytes(identity))).ToLowerInvariant(); + string lockPath = Path.Combine( + Path.GetFullPath(realParent), + ".codex-provider-sync", + "locks", + resourceKey + ".lock"); + return Task.FromResult(new StateDbLockResource( + identity, + resourceKey, + Path.GetFullPath(realParent), + Path.Combine(Path.GetFullPath(realParent), physicalFileName), + lockPath)); + } + + private static string NormalizeIdentityPart(string value) => + OperatingSystem.IsWindows() ? value.ToLowerInvariant() : value; + + private static bool PathEquals(string left, string right) => string.Equals( + Path.GetFullPath(left), + Path.GetFullPath(right), + OperatingSystem.IsWindows() ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal); + + private static string ResolveExistingPhysicalPath(string path, bool directory) + { + if (OperatingSystem.IsWindows()) + { + using SafeFileHandle handle = CreateFileW( + path, + 0, + FileShareRead | FileShareWrite | FileShareDelete, + IntPtr.Zero, + OpenExisting, + directory ? FileFlagBackupSemantics : 0, + IntPtr.Zero); + if (handle.IsInvalid) + { + throw new Win32Exception(Marshal.GetLastPInvokeError()); + } + StringBuilder buffer = new(32768); + uint length = GetFinalPathNameByHandleW(handle, buffer, (uint)buffer.Capacity, 0); + if (length == 0 || length >= buffer.Capacity) + { + throw new Win32Exception(Marshal.GetLastPInvokeError()); + } + return NormalizeWindowsDevicePath(buffer.ToString()); + } + + IntPtr resolved = realpath(path, IntPtr.Zero); + if (resolved == IntPtr.Zero) + { + throw new Win32Exception(Marshal.GetLastPInvokeError()); + } + try + { + return Marshal.PtrToStringUTF8(resolved) + ?? throw new IOException("realpath returned an empty path."); + } + finally + { + free(resolved); + } + } + + private static string NormalizeWindowsDevicePath(string path) + { + const string uncPrefix = @"\\?\UNC\"; + const string devicePrefix = @"\\?\"; + if (path.StartsWith(uncPrefix, StringComparison.OrdinalIgnoreCase)) + { + return @"\\" + path[uncPrefix.Length..]; + } + return path.StartsWith(devicePrefix, StringComparison.OrdinalIgnoreCase) + ? path[devicePrefix.Length..] + : path; + } + + private static InvalidOperationException Unverifiable(string message, Exception? inner = null) + { + InvalidOperationException error = new(message, inner); + error.Data[ErrorCodeDataKey] = LockService.LockUnverifiableErrorCode; + error.Data[LockScopeDataKey] = "state-db"; + return error; + } + + private static InvalidOperationException PermissionDenied(string message, Exception inner) + { + InvalidOperationException error = new(message, inner); + error.Data[ErrorCodeDataKey] = "PERMISSION_DENIED"; + error.Data[LockScopeDataKey] = "state-db"; + return error; + } + + private static bool IsTyped(Exception error) => + error.Data.Contains(ErrorCodeDataKey); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern SafeFileHandle CreateFileW( + string fileName, + uint desiredAccess, + uint shareMode, + IntPtr securityAttributes, + uint creationDisposition, + uint flagsAndAttributes, + IntPtr templateFile); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern uint GetFinalPathNameByHandleW( + SafeFileHandle file, + StringBuilder filePath, + uint filePathLength, + uint flags); + + [DllImport("libc", SetLastError = true)] + private static extern IntPtr realpath(string path, IntPtr resolvedPath); + + [DllImport("libc")] + private static extern void free(IntPtr pointer); +} diff --git a/desktop/CodexProviderSync.Core/TextFormatter.cs b/desktop/CodexProviderSync.Core/TextFormatter.cs index b58da7c..36a4e1f 100644 --- a/desktop/CodexProviderSync.Core/TextFormatter.cs +++ b/desktop/CodexProviderSync.Core/TextFormatter.cs @@ -178,6 +178,15 @@ private static string FormatStatusEnglish(StatusSnapshot status) } lines.Insert(6, "Recovery required:"); } + if (status.OperationInProgress is { } operation) + { + lines.Insert( + 6, + $"Status read blocked; showing the last complete snapshot ({status.StatusReadBlocked?.Reason ?? "write-operation"})."); + lines.Insert( + 6, + $"Operation in progress: {operation.Operation} (scope: {operation.BusyScope}; lock: {operation.LockState})"); + } AppendSqliteStatus(lines, status, chinese: false); AppendProjectVisibility(lines, status, chinese: false); @@ -230,6 +239,15 @@ private static string FormatStatusChinese(StatusSnapshot status) } lines.Insert(6, "需要恢复:"); } + if (status.OperationInProgress is { } operation) + { + lines.Insert( + 6, + $"状态读取已阻断;当前显示最后一次完整快照({status.StatusReadBlocked?.Reason ?? "write-operation"})。"); + lines.Insert( + 6, + $"进行中的操作: {operation.Operation}(范围: {operation.BusyScope};锁状态: {operation.LockState})"); + } AppendSqliteStatus(lines, status, chinese: true); AppendProjectVisibility(lines, status, chinese: true); diff --git a/docs/adr/0012-dual-resource-lock-contract.md b/docs/adr/0012-dual-resource-lock-contract.md index e420e6f..51d8ec4 100644 --- a/docs/adr/0012-dual-resource-lock-contract.md +++ b/docs/adr/0012-dual-resource-lock-contract.md @@ -2,7 +2,7 @@ - Status: Accepted - Date: 2026-08-25 -- Scope: vNext target lock contract; not implemented by v0.5 +- Scope: vNext lock contract; implemented by the V1/C3 checkpoint, not yet released or merged ## Context @@ -40,11 +40,13 @@ Node、迁移期 .NET、CLI、Web、Electron Runtime 必须使用相同锁路径 - 锁不是 backup 或 journal 的替代物;获得两锁不允许跳过 Plan、Revision、Backup-first、transaction journal 或验证。 - 同一 State DB 的败方不得创建 backup、journal、config/rollout/SQLite/global-state mutation,且所有原始 Hash 保持不变。 - 任一正式入口不得自行发明锁路径、只靠 UI 禁用按钮,或在持有 State DB resource lock 后再以相反顺序等待 Codex Home lock。 -- 当前 v0.5 单层行为仍是现状事实;本文不声称它已实现双层锁。 +- 已发布的 v0.5 仍是单层锁;V1/C3 的 Node 与迁移期 .NET 实现已采用双层锁,但在最终 PR 合入、完整 CI 与 release evidence 完成前不把它描述为已发布能力。 ## Migration and Validation -实现前必须完成 `node-dotnet-lock-contention`、`shared-sqlite-home-contention`、双层 lock-order/deadlock、`lock-unverifiable` 和 Windows UNC 无写入 Fixture。真实 Node/.NET 进程必须在同一临时资源上争锁;Mock 不足以证明兼容。任何旧协议的兼容读取或拒绝策略必须有独立 Fixture 和差异登记。 +V1/C3 已建立 `node-dotnet-lock-contention`、`shared-sqlite-home-contention`、双层 lock-order、`lock-unverifiable` 与跨进程 Status Fixture。真实 Node/.NET 进程在同一临时 State DB resource key 上完成双向争锁,Node/.NET 各自验证两个 Home 共享 DB 时败方零 Backup/零业务变更。Windows WSL UNC 全 Hash 门槛仍按执行索引在 Electron 写能力开放前继续保留。任何旧协议的兼容读取或拒绝策略必须有独立 Fixture 和差异登记。 + +缺失数据库只在其物理父目录已经存在且能被 `realpath` 可靠证明时生成 resource identity;不得以 Codex Home lock 替代 State DB lock。Metadata v1 Restore 若目标父目录不存在,Node 与 .NET 均在任何 Backup、Journal 或目标 mutation 前返回 `LOCK_UNVERIFIABLE(state-db)`。 ## Related diff --git a/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md b/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md index ac13282..f290a0f 100644 --- a/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md +++ b/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md @@ -890,6 +890,9 @@ pruneBackups listHistory getHistorySession startWatch +stopWatch +getWatchStatus +getDiagnostics ``` 目标原则: @@ -903,7 +906,23 @@ startWatch - `--json` 是外部自动化合同,不是 Electron IPC; - Public API 可以新增 schemaVersion,但迁移适配器必须保持本文中的 v0.5 用户行为。 -这些目标在对应实现和测试完成前,不得用来否认当前一次性 `runSync/runSwitch/runRestore` 接口的兼容责任。 +V1/C3 已实现上述边界;`runSync/runSwitch/runRestore/runWatch` 仍作为 CLI 和旧调用方的弃用兼容适配器保留,不得供 Renderer 或新的 HTTP/IPC transport 使用。实现完成不等于已发布:已发布版本的兼容责任持续到对应迁移门槛和最终 PR 合入完成。 + +### 16.1 C3 Plan / Apply 合同 + +- `prepareSync/prepareSwitch/prepareRestore` 返回不可变 `PlanSummary` schema v1。`planId` 为 32-byte 随机不透明标识;TTL 固定 10 分钟;ledger 仅驻留当前进程并单次消费,重启、过期、重放和跨 operation 使用均返回 `PLAN_EXPIRED`。 +- `applySync/applySwitch/applyRestore` 只接受精确的 `{schemaVersion: 1, planId}`。任何附加路径、Provider、model、backupId 或 mutation 参数都返回 `INVALID_INPUT`,且不消费合法 Plan。 +- Apply 在 Home→State DB 双锁内重新读取可信 Profile、config、rollout inventory、State DB main/WAL/SHM 与 Restore source backup revision;任一漂移统一返回 `STALE_STATE`,且在 Backup/Journal/mutation 前停止。 +- Web 只公开 `*/prepare` 与 `*/apply`。旧 `/api/sync`、`/api/switch`、`/api/restore` 固定返回 `410 PLAN_REQUIRED`,不得调用兼容 `run*` 写入口。 +- Switch Plan 固定表达 `provider-default`、`keep-root-model`、`explicit` 三种 model intent;Apply 不再接收 model 参数。 + +### 16.2 协调、Status 与 Watch + +- 本进程协调器为同一 Codex Home 生成 operationId,并缓存最近一次完整 Status。写操作期间 Status 返回该完整 snapshot 加 `operationInProgress`;无缓存时返回 `rolloutScanComplete:false` 的保守快照。 +- Status 不获取写锁,而是只读检查 Home 与解析后的 State DB protocol lock,并在扫描前后核对 config/rollout/State DB revision。外部 Node/.NET 写者活跃或锁不可验证时不得扫描业务中间态;`LOCK_UNVERIFIABLE` 状态不得显示 aligned/healthy。Pending Journal 仍可作为恢复证据读取。 +- `ProgressEvent` observer 的异常不能改变 transaction result。成功 OperationResult 的 `outcome` 为 `completed` 或 locked-rollout `partial`;失败通过结构化 Core Error/transport envelope 返回。 +- Watch 保持单飞、合并重复事件,每次重新 Prepare/Apply 并获取双锁。遇到本进程人工操作时保留当前事件批次、等待 operation completion 后只运行一次合并 follow-up;外部 Busy/不可验证锁不轮询、不计入连续业务失败,并等待新的受保护文件事件。 +- Diagnostics 只返回有界安全元数据;不得读取、复制或序列化 `auth.json`、token、凭据或消息正文。 ## 17. Phase 1 提取要求 diff --git a/docs/architecture/contracts/ERROR_CODES_ZH.md b/docs/architecture/contracts/ERROR_CODES_ZH.md index 9aae292..b5d568b 100644 --- a/docs/architecture/contracts/ERROR_CODES_ZH.md +++ b/docs/architecture/contracts/ERROR_CODES_ZH.md @@ -71,7 +71,7 @@ interface CoreErrorDto { ### 3.2 阶段 0 补充项 -以下代码补充了架构基线已经描述、但初始错误码列表没有单独命名的语义。它们从本合同起属于 vNext Canonical Code;当前实现尚未统一发出这些代码。 +以下代码补充了架构基线已经描述、但初始错误码列表没有单独命名的语义。它们属于 vNext Canonical Code;V1/C1~C3 的 Node 边界及迁移期 .NET 锁入口已经统一发出这些代码,但尚未作为已发布版本合同对外宣称。 | Code | 补充原因 | Severity | Retryable | Recovery Required | | --- | --- | --- | --- | --- | @@ -81,7 +81,7 @@ interface CoreErrorDto { `LOCK_UNVERIFIABLE` 必须 fail closed。只有确认存在活跃冲突所有者时才使用 `OPERATION_BUSY`;未来协议、损坏 owner、身份读取失败或 ABA/目录身份不确定均使用 `LOCK_UNVERIFIABLE`。用户提示不得建议盲目删除锁目录。 -ADR-0012 的双层资源锁实现后,`OPERATION_BUSY.details.busyScope` 必须为 `codex-home` 或 `state-db`,`LOCK_UNVERIFIABLE.details.lockScope` 必须标示同一范围;SQLite 引擎在资源锁已获得后仍 busy 时继续使用 `SQLITE_BUSY`。这些字段是 vNext 目标,不表示当前入口已发出它们。 +V1/C3 的双层资源锁已要求 `OPERATION_BUSY.details.busyScope` 为 `codex-home` 或 `state-db`,`LOCK_UNVERIFIABLE.details.lockScope` 标示同一范围;SQLite 引擎在资源锁已获得后仍 busy 时继续使用 `SQLITE_BUSY`。Lock owner protocol v2 可带 `scope/resourceKey`,旧 Home-lock owner 仍按兼容读取规则处理。 vNext Prepare/Apply 对任何加锁后 revision 漂移只发出 `STALE_STATE`,并可用安全的 `details.reason=profile|config|storage|rollout|state-db` 说明维度。`PLAN_STALE`、`PROFILE_CHANGED` 与 `STORAGE_CHANGED` 在旧 Web/适配器完成迁移前仍可读取,但不得成为新 CoreClient/IPC 的稳定写操作结果。 @@ -97,7 +97,7 @@ ADR-0013 的 Restore v2 实现后,非 terminal restore operation journal 使 | `SYNC_FAILED_ROLLED_BACK` | `SyncTransactionError` | 已与 Canonical 同名 | | `ABORT_ERR` | Node 取消路径 | Node 习惯码,不作为 vNext Canonical Code | | Node/OS `ENOENT`、`EACCES`、`EPERM` 等 | 普通 `Error` 或系统调用 | 只能作为底层 cause;当前大量错误还没有稳定业务码 | -| 无稳定 code 的锁错误 | Node `locking.js` | 后续必须按“已证明 Busy”或“不可验证”结构化,禁止解析 message | +| `OPERATION_BUSY` / `LOCK_UNVERIFIABLE` | Node `locking.js`、State DB resource lock | V1/C3 已按“已证明 Busy”或“不可验证”结构化,并携带 scope;禁止解析 message | 当前 CLI 只把错误 `message` 写入 stderr 并以 `1` 退出。本文不把当前人类提示提升为机器协议。 diff --git a/docs/migration/BEHAVIOR_FIXTURES_ZH.md b/docs/migration/BEHAVIOR_FIXTURES_ZH.md index b064f68..4988d9b 100644 --- a/docs/migration/BEHAVIOR_FIXTURES_ZH.md +++ b/docs/migration/BEHAVIOR_FIXTURES_ZH.md @@ -75,7 +75,11 @@ Fixture 不是用户数据样本,严禁从真实 `~/.codex`、认证文件或 | `shared-sqlite-home-contention` | 两个不同 Codex Home 指向同一 SQLite Home,并发写 | 不能因 Codex Home 锁不同而同时写同一 DB;阶段 1 必须验证/裁决共享资源锁,在通过前不得开放 Electron 写能力 | | `dual-resource-lock-order` | 两个 Codex Home 与一个 SQLite Home 由 Node/.NET 交叉并发写 | 两层 lock 路径和顺序一致;不死锁;恰有一个 SQLite writer;败方无 Backup、Journal 或业务 mutation | | `sqlite-resource-lock-unverifiable` | State DB resource lock 的 owner、协议、物理路径 identity 或 ABA 状态不可验证 | fail closed,返回 `LOCK_UNVERIFIABLE` 且范围为 state-db;不得自动删除或降级为 Busy | +| `restore-missing-state-db-parent` | Metadata v1/v2 Restore 指向缺失 DB,且其物理父目录也不存在 | Node/.NET 都在任何 Backup、Journal、config/rollout/DB mutation 前返回 `LOCK_UNVERIFIABLE(state-db)`;不得用 Home lock 代替资源锁 | | `lock-unverifiable` | future protocol、损坏 owner、进程启动身份不可读、ABA/目录身份变化 | fail closed,返回 `LOCK_UNVERIFIABLE`;不得误报普通 Busy,不得自动删除不可证明归属的锁 | +| `external-write-status-snapshot` | 真实第二进程持有 Home→State 双锁,或另一 Home 只持共享 State DB 锁,并在锁内改变 config/SQLite | Core 与 Local Web 不扫描中间态;有缓存时逐字段保留最后完整 snapshot 并附 operation,无缓存时 `rolloutScanComplete:false`;不可验证锁不得显示 aligned/healthy | +| `plan-ledger-replay-expiry` | Plan 过期、重放、跨 operation、重启失效、篡改 apply payload | 只允许当前进程内 10 分钟单次消费;失效返回 `PLAN_EXPIRED`,附加字段返回 `INVALID_INPUT`,均无 Backup/Journal/mutation | +| `watch-manual-priority` | 单一文件事件触发 Watch,但人工 Apply 已持有本进程协调器;等待期间继续产生重复事件 | Watch 不并发、不计失败;保留并合并 reasons,人工 operation completion 后恰运行一次 follow-up;stop 后 callback 不再 Apply | | `pending-journal` | Managed Backup 中存在未终结 Journal | Status 可读并暴露恢复证据;Sync/Switch 被 `PENDING_TRANSACTION`/`RECOVERY_REQUIRED` 阻断。Prune 仍可作为 recovery-safe maintenance 执行,但必须保护所有 Pending Journal 引用的备份 | | `foreign-pending-restore` | Node 创建 Pending Journal/Backup 后由 .NET Restore,及反方向 | 两个方向都只按受管清单恢复,清除 Pending 前必须落入合法 terminal;差异需显式裁决 | | `restore-mid-failure` | Restore 在某一目标已替换后注入失败 | 不能报告成功;必须完整补偿,或保留可操作证据并返回 `RECOVERY_REQUIRED`,不得留下无 Journal 的半恢复状态 | @@ -89,6 +93,8 @@ Fixture 不是用户数据样本,严禁从真实 `~/.codex`、认证文件或 真实跨运行时测试不能用 Mock 代替进程争锁。Node 与 .NET 必须在同一临时目标上运行,并以文件/SQLite 最终效果作为独立证据。 +V1/C3 的 executable mapping:Plan/revision 见 `test/plan-ledger.test.js`、`test/operation-revision.test.js`、`test/plan-apply.test.js`;Node 锁与外部 Status 见 `test/state-db-lock.test.js`、`test/status-coordination.test.js`;Watch 见 `test/watch.test.js`;Web transport 见 `test/web-server.test.js`;.NET 与跨运行时锁见 `StateDbLockResourceTests`、`DualResourceLockIntegrationTests`、`CrossRuntimeStateDbLockTests`、`LockServiceTests`。完整命令与结果记录在 `evidence/C3_PLAN_APPLY_DUAL_LOCK_2026-08-25.md`。 + ## 6. Restore、Backup 与 Prune | Fixture ID | 输入语义 | 关键预期 | diff --git a/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md b/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md index 1adb254..c0aba94 100644 --- a/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md +++ b/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md @@ -163,7 +163,7 @@ | C0 | 治理、基线与依赖安全 | 阶段 0 | ADR-0011~0013、合同导航、基线测试、Vite 审计告警清零 | In Progress(V1) | | C1 | Core Public API 与结构化错误 | C0 | CLI/Web 仅走 Public API;Canonical/Legacy Adapter;错误合同测试 | In Progress(V1,本地门禁通过) | | C2 | CLI `--json` | C1 | stdout 单一 JSON、stderr 日志、JSON Exit Code 与 Schema 合同 | In Progress(V1,本地门禁通过) | -| C3 | Prepare/Apply、协调器与双层锁 | C1、C2 | Revision/Plan/Apply、Node/.NET 双层资源锁、真实争锁证据 | Pending | +| C3 | Prepare/Apply、协调器与双层锁 | C1、C2 | Revision/Plan/Apply、Node/.NET 双层资源锁、真实争锁证据 | In Progress(V1,本地门禁通过) | | C4 | Workspace、Core、Contracts、CoreClient | C1~C3(Phase 1 全部门槛已验证) | 不搬高风险算法;根 npm CLI tarball/Node 16 兼容 | Pending | | C5 | 共享 React UI 与 Web | C4 | AppShell/Features/HttpCoreClient;Web 安全与功能等价;阶段 2 门槛 | Pending | | C6 | Electron 安全骨架、Utility Runtime、只读能力 | C5(Phase 2 全部门槛已验证) | 安全窗口/IPC、握手、crash recovery、三平台只读 smoke | Pending | @@ -217,4 +217,4 @@ Node 与 .NET 在同一 Fixture 上不一致时,PR 必须记录: ## 8. 本 PR 完成后的下一步 -V1 的下一项是 `C3`:实现统一 Prepare/Apply、10 分钟单次消费 Plan ledger、revision 复核、协调器与 Node/.NET 双层资源锁。C1 的本地证据见 [C1 Public API 与结构化错误证据](evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md),C2 证据见 [C2 CLI JSON 合同证据](evidence/C2_CLI_JSON_2026-08-25.md);这些本地验证不使 Phase 1 在最终 PR 合入前 Completed。 +V1 的下一项是 `C4`:建立 Workspace、Contracts/CoreClient 与包边界,同时保持根 npm CLI 的 Node 16 合同。C1 的本地证据见 [C1 Public API 与结构化错误证据](evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md),C2 证据见 [C2 CLI JSON 合同证据](evidence/C2_CLI_JSON_2026-08-25.md),C3 证据见 [C3 Plan/Apply 与双层锁证据](evidence/C3_PLAN_APPLY_DUAL_LOCK_2026-08-25.md);这些本地验证不使 Phase 1 在最终 PR 合入前 Completed。 diff --git a/docs/migration/evidence/C3_PLAN_APPLY_DUAL_LOCK_2026-08-25.md b/docs/migration/evidence/C3_PLAN_APPLY_DUAL_LOCK_2026-08-25.md new file mode 100644 index 0000000..b9ae08b --- /dev/null +++ b/docs/migration/evidence/C3_PLAN_APPLY_DUAL_LOCK_2026-08-25.md @@ -0,0 +1,53 @@ +# C3 Plan/Apply、双层锁与协调状态证据(2026-08-25) + +状态:本地门禁通过,等待远端 CI。输入 checkpoint 为 `13163f5`;C3 最终 commit SHA 在本 checkpoint 提交后及 C10 evidence bundle 中索引。 + +## 已实现边界 + +- Node Core 的 Sync、Switch、Restore 已提供 `prepare*/apply*`;Plan 使用 32-byte 随机不透明 ID、schema v1、10 分钟 TTL、进程内单次消费 ledger。Apply 的公共输入严格为 `{schemaVersion: 1, planId}`,旧 `runSync/runSwitch/runRestore/runWatch` 只保留同进程兼容适配。 +- Plan 绑定可信 profile、config、storage、完整 rollout inventory、SQLite main/WAL/SHM 与受管 backup revision;Apply 在取得最终锁后重新解析 storage 并精确复核,任何漂移在创建备份或修改目标前返回 `STALE_STATE`。 +- 写锁顺序固定为 `Codex Home -> State DB`。State DB identity 为物理父目录 realpath、NUL 分隔的规范文件名及 Windows 大小写归一,锁路径为 `/.codex-provider-sync/locks/.lock`。协议 v2 owner/claim 增加 `scope/resourceKey`,旧读取器兼容。 +- Node 与仍受支持的 .NET Core 均实现同一 State DB 资源锁协议;真实 Node/.NET 子进程双向竞争和两个 Codex Home 共用一个 DB 的零备份败方已验证。Restore 目标父目录不能可靠解析时返回 `LOCK_UNVERIFIABLE`,不回退到 Home-only 锁。 +- Status/History 保持只读。Node 与 .NET Status 都在外部 Home/State DB 写锁期间返回最后完整快照和 operation marker;无缓存或锁不可验证时返回显式不完整状态,绝不扫描中间态。锁协议观测与状态 revision 在扫描前后及最终返回前复核;.NET 缓存对所有可变嵌套 DTO defensive clone。 +- Web direct-write 路由固定返回 `410 PLAN_REQUIRED` 且不调用 writer;现代 Prepare 只接收产品输入,Apply 只接收 plan ID。Web Status 直接转发 Core 快照,不混入 live profile/storage revision。 +- Watch 合并 in-flight/busy 事件、不与人工操作重叠;人工操作完成后只重放一个合并 batch,停止 Watch 会取消 completion subscription。observer/progress 失败不改变事务结果。 +- `OPERATION_BUSY` 携带 `busyScope`;`LOCK_UNVERIFIABLE` 携带 lock scope/resource key。Prune 仍只持有 Home 锁;本 checkpoint 未提前改变 C8 Restore journal 状态机。 + +## 关键行为证据 + +- Plan ledger:过期、篡改、跨 operation、重启失效、单次消费、并发双 Apply 仅一方执行。 +- 状态漂移:config、profile、storage、rollout、SQLite main/WAL、backup manifest 漂移均在备份前拒绝;Switch 锁前/锁内候选 DB 发生变化时,锁内重新 detect 并返回 `STALE_STATE(storage)`。 +- 锁:Node↔Node、Node↔.NET、不同 Home 共用 DB、Home/State busyScope、stale/malformed owner、缺失 Restore 父目录、败方零 mutation。 +- Status:真实外部 Node Home 锁、真实 Node State DB 锁、两个 Home 共用 Node-locked DB、.NET Home/State 锁、malformed owner;均返回缓存或显式不完整状态,不报告中间 Provider/SQLite 行为健康。 +- Watch:busy batch 保留、人工优先、合并一次、停止取消订阅、既有连续失败与 watcher rebind 行为不回归。 +- Web:旧直写无副作用;Prepare/Apply、profile revision、managed backup、Restore relocation、WSL UNC、partial 与安全 CoreError DTO 均有契约测试。 + +## 本地验证 + +环境:Windows x64,Node `v24.11.1`,npm `11.10.0`,.NET SDK `10.0.400`;输入 SHA `13163f510a1ac0c245ac992f7a10027f30195300`。 + +| 命令 | 结果 | +| --- | --- | +| `npm test` | 339 passed,0 failed,0 skipped | +| `node --test web/src/api.test.js web/src/operation-state.test.js` | 14 passed,0 failed,0 skipped | +| `npm run web:build` | Vite 8.2.2 production build 成功,21 modules transformed | +| `npm exec --yes --package=node@16.20.2 -- node --test test/plan-ledger.test.js test/operation-revision.test.js test/state-db-lock.test.js test/public-api-contract.test.js` | 实际 Node `v16.20.2`;4 个目标文件通过,0 failed/skipped | +| `npm audit --omit=dev --audit-level=moderate` | 0 vulnerabilities | +| `npm audit --audit-level=high` | 0 vulnerabilities | +| `npm pack --dry-run --json` | 成功;C3 Core 模块、Web dist 与文档进入根 tarball,Electron 依赖不存在 | +| `dotnet build CodexProviderSync.sln --configuration Release` | 13 projects build 成功,0 warnings/errors | +| `dotnet test desktop/CodexProviderSync.Core.Tests/CodexProviderSync.Core.Tests.csproj --configuration Release --no-build` | 220 passed,1 个真实 WSL 条件测试 skipped,0 failed | +| `dotnet test desktop/CodexProviderSync.Application.Tests/CodexProviderSync.Application.Tests.csproj --configuration Release --no-build` | 49 passed,0 failed/skipped | +| `dotnet test desktop/CodexProviderSync.Automation.Tests/CodexProviderSync.Automation.Tests.csproj --configuration Release` | 27 passed,0 failed/skipped | +| `dotnet test desktop/CodexProviderSync.App.Tests/CodexProviderSync.App.Tests.csproj --configuration Release --no-build` | 67 passed,0 failed/skipped | +| `dotnet test desktop/CodexProviderSync.GuiE2E.Tests/CodexProviderSync.GuiE2E.Tests.csproj --configuration Release --no-build` | 36 passed,0 failed/skipped | +| `git diff --check` | 通过,仅有 Windows CRLF 工作区提示 | + +两轮独立只读复审确认无剩余 P0/P1;复审发现并推动修复了 Web status live/cache 混合、外部锁绕过、Watch busy 丢事件、旧 Web 直写、.NET Restore Home-only 降级、.NET Status 中间态扫描、last-complete cache 可变引用污染,以及 Switch 复用锁前 State DB selection 的 TOCTOU。 + +## 已知未闭合项 + +- Windows/Ubuntu/macOS 远端矩阵、Linux Node↔.NET lock contract 与真实 WSL 场景仍由 CI/C10 汇总证明;本地的 Windows 结果不能替代其他平台证据。 +- C8 的 Restore v2 独立快照、完整状态机、启动恢复与 update 安装阻断尚未实现;C3 继续使用现有安全 journal/rollback 合同。 +- 当前根 npm/Web dist 仍包含既有 source map;C9 必须从生产包排除并扫描。Electron、workspace、共享 UI/CoreClient 与平台产物尚未进入本 checkpoint。 +- 未创建 tag,未发布 npm/GitHub Release,未签名、公证或写更新通道;只有最终 PR 的全部必需 job 成功并合入受保护分支后,对应阶段才可标记 Completed。 diff --git a/src/backup.js b/src/backup.js index fbbc20e..81c6f9a 100644 --- a/src/backup.js +++ b/src/backup.js @@ -186,6 +186,17 @@ function resolveRestoreSqliteHome(storage, metadata, stateDb) { return storage.sqliteHome; } +export async function resolveRestoreStateDbTargetPath(backupDir, storage) { + const metadata = await readValidatedBackupMetadata(backupDir, storage.codexHome); + const stateDb = Object.hasOwn(storage, "stateDbLocation") + ? storage.stateDbLocation + : await detectStateDb(storage); + if (!stateDb && storage.sqliteHomeSource !== "default") { + throw new Error(`state_5.sqlite not found in SQLite home ${storage.sqliteHome}.`); + } + return path.join(resolveRestoreSqliteHome(storage, metadata, stateDb), DB_FILE_BASENAME); +} + async function removeIfPresent(targetPath) { await fs.rm(targetPath, { force: true }); } diff --git a/src/cli-json.js b/src/cli-json.js index f9e113c..6876b27 100644 --- a/src/cli-json.js +++ b/src/cli-json.js @@ -279,6 +279,12 @@ function sanitizeStatusResult(value) { put(result, "schemaVersion", safeNumber(value.schemaVersion, { integer: true, minimum: 1 })); put(result, "snapshotAt", safeString(value.snapshotAt, 64)); put(result, "storageRevision", safeString(value.storageRevision, 256)); + if (value.profile && typeof value.profile === "object" && !Array.isArray(value.profile)) { + const profile = {}; + put(profile, "id", safeString(value.profile.id, 80)); + put(profile, "revision", safeString(value.profile.revision, 256)); + result.profile = profile; + } put(result, "codexHome", safeString(value.codexHome, 32768)); put(result, "sqliteHome", safeString(value.sqliteHome, 32768)); put(result, "sqliteHomeSource", SQLITE_HOME_SOURCES.has(value.sqliteHomeSource) @@ -352,6 +358,7 @@ function sanitizeStatusResult(value) { return item; }); } + put(result, "projectThreadVisibilityAvailable", safeBoolean(value.projectThreadVisibilityAvailable)); put(result, "backupRoot", safeString(value.backupRoot, 32768)); if (value.backupSummary && typeof value.backupSummary === "object") { const summary = {}; @@ -370,7 +377,22 @@ function sanitizeStatusResult(value) { return item; }); } - put(result, "operationInProgress", safeBoolean(value.operationInProgress)); + put(result, "pendingRecovery", safeBoolean(value.pendingRecovery)); + if (value.operationInProgress && typeof value.operationInProgress === "object" + && !Array.isArray(value.operationInProgress)) { + const operation = {}; + put(operation, "operationId", safeUuid(value.operationInProgress.operationId)); + put(operation, "operation", OPERATION_KINDS.has(value.operationInProgress.operation) + ? value.operationInProgress.operation + : undefined); + put(operation, "actor", new Set(["manual", "watch"]).has(value.operationInProgress.actor) + ? value.operationInProgress.actor + : undefined); + put(operation, "startedAt", safeString(value.operationInProgress.startedAt, 64)); + result.operationInProgress = operation; + } else if (value.operationInProgress === null) { + result.operationInProgress = null; + } put(result, "rolloutScanComplete", safeBoolean(value.rolloutScanComplete)); return result; } diff --git a/src/diagnostics.js b/src/diagnostics.js new file mode 100644 index 0000000..43c5291 --- /dev/null +++ b/src/diagnostics.js @@ -0,0 +1,49 @@ +import { getStatus } from "./service.js"; + +function countDistribution(distribution) { + return Object.fromEntries(Object.entries(distribution ?? {}).map(([scope, counts]) => [ + scope, + Object.values(counts ?? {}).reduce((total, count) => total + (Number.isSafeInteger(count) ? count : 0), 0) + ])); +} + +export async function getDiagnostics(options = {}) { + const status = await getStatus(options); + return { + schemaVersion: 1, + generatedAt: new Date().toISOString(), + runtime: { + node: process.version, + platform: process.platform, + arch: process.arch + }, + storage: { + codexHome: status.codexHome, + sqliteHome: status.sqliteHome, + sqliteHomeSource: status.sqliteHomeSource, + stateDbLocation: status.stateDbLocation, + sqliteAccess: status.sqliteAccess + }, + provider: { + current: status.currentProvider, + implicit: status.currentProviderImplicit, + configured: status.configuredProviders, + rolloutCounts: status.rolloutCounts, + sqliteCounts: status.sqliteCounts, + rolloutTotals: countDistribution(status.rolloutCounts), + sqliteTotals: countDistribution(status.sqliteCounts) + }, + safety: { + storageRevision: status.storageRevision, + pendingRecovery: status.pendingRecovery, + pendingTransactions: (status.pendingTransactions ?? []).map((transaction) => ({ + operationId: transaction.operationId, + state: transaction.state + })), + operationInProgress: status.operationInProgress, + rolloutScanComplete: status.rolloutScanComplete, + lockedRolloutCount: status.lockedRolloutFiles?.length ?? 0, + projectThreadVisibilityAvailable: status.projectThreadVisibilityAvailable + } + }; +} diff --git a/src/locking.js b/src/locking.js index db3dada..f317816 100644 --- a/src/locking.js +++ b/src/locking.js @@ -162,6 +162,24 @@ function ownerMatchesExpected(actual, expected) { && actual.processStartedAt === expected.processStartedAt; } +function assertOwnerResource(owner, lockDir, lockScope, resourceKey = null) { + if (owner.scope !== undefined && owner.scope !== lockScope) { + throw lockExistsError( + lockDir, + `owner.json declares scope ${String(owner.scope)} instead of ${lockScope}.`, + { lockScope } + ); + } + if (lockScope === "state-db" + && (owner.scope !== "state-db" || owner.resourceKey !== resourceKey)) { + throw lockExistsError( + lockDir, + "owner.json is missing the expected State DB scope/resourceKey identity.", + { lockScope } + ); + } +} + async function readLockOwner(ownerPath, fsImpl, lockScope = "codex-home") { let text; try { @@ -513,7 +531,8 @@ async function establishUniqueClaim({ getProcessStartedAtIdentity, syncDirectoryImpl, platform, - lockScope + lockScope, + resourceKey }) { for (let scan = 0; scan < 2; scan += 1) { const entries = await fsImpl.readdir(claimsDir, { withFileTypes: true }); @@ -527,6 +546,7 @@ async function establishUniqueClaim({ continue; } const otherOwner = await readLockOwner(otherPath, fsImpl, lockScope); + assertOwnerResource(otherOwner, otherPath, lockScope, resourceKey); if (!otherOwner.instanceId || entry.name !== `${otherOwner.instanceId}.json`) { throw lockExistsError( claimsDir, @@ -617,12 +637,17 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o onCandidateReady, onBeforeStaleReclaim, platform = process.platform, - scope = "codex-home" + scope = "codex-home", + resourceKey = null } = options; const lockDir = path.resolve(lockPath); if (!LOCK_SCOPES.has(scope)) { throw new TypeError(`scope must be one of: ${[...LOCK_SCOPES].join(", ")}.`); } + if (resourceKey !== null + && (scope !== "state-db" || typeof resourceKey !== "string" || !/^[a-f0-9]{64}$/.test(resourceKey))) { + throw new TypeError("resourceKey must be a lowercase SHA-256 hex string for a state-db lock."); + } if (!Number.isInteger(staleReclaimAttemptLimit) || staleReclaimAttemptLimit < 0) { throw new TypeError("staleReclaimAttemptLimit must be a non-negative integer."); } @@ -691,6 +716,7 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o instanceId: randomUUID(), startedAt: new Date().toISOString(), scope, + ...(resourceKey ? { resourceKey } : {}), label, cwd: process.cwd(), currentDirectory: process.cwd() @@ -717,7 +743,8 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o getProcessStartedAtIdentity, syncDirectoryImpl, platform, - lockScope: scope + lockScope: scope, + resourceKey }); await createCandidateDirectory( candidateDir, @@ -769,6 +796,7 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o const existingDirectoryIdentity = await inspectCanonicalDirectory(lockDir, fsImpl, scope); if (existingDirectoryIdentity !== null) { const existingOwner = await readLockOwner(ownerPath, fsImpl, scope); + assertOwnerResource(existingOwner, lockDir, scope, resourceKey); let live; try { live = await isOwnerLive( @@ -917,3 +945,110 @@ export async function acquirePathLock(lockPath, label = "codex-provider-sync", o released = true; }; } + +/** + * Read-only inspection of a protocol lock. This never reclaims or removes a + * stale/ambiguous owner: callers use it to avoid observing protected state + * while another runtime may be mutating it. + */ +export async function inspectPathLock(lockPath, options = {}) { + const { + fsImpl = fs, + getProcessIdentity = getProcessStartMarker, + getProcessStartedAtIdentity = getProcessStartedAt, + scope = "codex-home", + resourceKey = null + } = options; + if (!LOCK_SCOPES.has(scope)) { + throw new TypeError(`scope must be one of: ${[...LOCK_SCOPES].join(", ")}.`); + } + if (scope === "state-db" + && (typeof resourceKey !== "string" || !/^[a-f0-9]{64}$/.test(resourceKey))) { + throw new TypeError("resourceKey must be a lowercase SHA-256 hex string for a state-db lock."); + } + + const lockDir = path.resolve(lockPath); + const claimsDir = `${lockDir}.claims`; + const inspectOwner = async (ownerPath) => { + const owner = await readLockOwner(ownerPath, fsImpl, scope); + assertOwnerResource(owner, lockDir, scope, resourceKey); + let live; + try { + live = await isOwnerLive(owner, getProcessIdentity, getProcessStartedAtIdentity); + } catch (error) { + throw lockExistsError( + lockDir, + `The recorded owner could not be verified (${error.message}).`, + { lockScope: scope } + ); + } + if (!live) { + throw lockExistsError( + lockDir, + "The recorded owner is stale; read-only inspection preserves it fail-closed.", + { lockScope: scope } + ); + } + return owner; + }; + + const canonicalIdentity = await inspectCanonicalDirectory(lockDir, fsImpl, scope); + if (canonicalIdentity !== null) { + const owner = await inspectOwner(path.join(lockDir, "owner.json")); + const verifiedIdentity = await inspectCanonicalDirectory(lockDir, fsImpl, scope); + if (!sameDirectoryIdentity(canonicalIdentity, verifiedIdentity)) { + throw lockExistsError( + lockDir, + "The canonical lock identity changed during read-only inspection.", + { lockScope: scope } + ); + } + const verifiedOwner = await readLockOwner(path.join(lockDir, "owner.json"), fsImpl, scope); + assertOwnerResource(verifiedOwner, lockDir, scope, resourceKey); + if (!ownerMatchesExpected(verifiedOwner, owner)) { + throw lockExistsError( + lockDir, + "The canonical owner identity changed during read-only inspection.", + { lockScope: scope } + ); + } + return Object.freeze({ state: "active", scope, resourceKey, owner }); + } + + let entries = []; + try { + entries = await fsImpl.readdir(claimsDir, { withFileTypes: true }); + } catch (error) { + if (error?.code !== "ENOENT") { + throw lockExistsError( + claimsDir, + "The claims directory cannot be inspected safely.", + { cause: error, causeCode: error?.code, lockScope: scope } + ); + } + } + const claims = entries + .filter((entry) => entry.isFile() && entry.name.endsWith(".json")) + .sort((left, right) => left.name.localeCompare(right.name)); + if (claims.length > 0) { + const owner = await inspectOwner(path.join(claimsDir, claims[0].name)); + if (!owner.instanceId || claims[0].name !== `${owner.instanceId}.json`) { + throw lockExistsError( + claimsDir, + "A live claim has no matching immutable instance identity.", + { lockScope: scope } + ); + } + return Object.freeze({ state: "active", scope, resourceKey, owner }); + } + + const finalIdentity = await inspectCanonicalDirectory(lockDir, fsImpl, scope); + if (finalIdentity !== null) { + throw lockExistsError( + lockDir, + "A lock appeared during read-only inspection.", + { lockScope: scope } + ); + } + return Object.freeze({ state: "absent", scope, resourceKey, owner: null }); +} diff --git a/src/operation-coordinator.js b/src/operation-coordinator.js new file mode 100644 index 0000000..e55143f --- /dev/null +++ b/src/operation-coordinator.js @@ -0,0 +1,121 @@ +import { randomUUID } from "node:crypto"; +import path from "node:path"; + +import { CoreError } from "./core-error.js"; + +function homeKey(codexHome, platform = process.platform) { + const resolved = path.resolve(codexHome); + return platform === "win32" ? resolved.toLowerCase() : resolved; +} + +function clone(value) { + return value === null || value === undefined + ? value + : JSON.parse(JSON.stringify(value)); +} + +export class OperationCoordinator { + constructor({ randomOperationId = randomUUID, now = () => Date.now() } = {}) { + this.randomOperationId = randomOperationId; + this.now = now; + this.active = new Map(); + this.snapshots = new Map(); + this.endListeners = new Map(); + } + + cacheStatus(codexHome, snapshot, platform = process.platform) { + this.snapshots.set(homeKey(codexHome, platform), clone(snapshot)); + } + + statusDuringWrite(codexHome, platform = process.platform, expectedProfile = null) { + const key = homeKey(codexHome, platform); + const operation = this.active.get(key); + if (!operation) return null; + return this.statusForBlockedWrite(codexHome, operation, platform, expectedProfile); + } + + statusForBlockedWrite(codexHome, operation, platform = process.platform, expectedProfile = null) { + const key = homeKey(codexHome, platform); + const candidate = this.snapshots.get(key); + const cached = candidate + && (!expectedProfile + || (candidate.profileId === expectedProfile.id + && candidate.profileRevision === expectedProfile.publicRevision)) + ? candidate + : null; + if (!cached) { + return { + schemaVersion: 1, + snapshotAt: new Date(this.now()).toISOString(), + codexHome: path.resolve(codexHome), + operationInProgress: clone(operation), + rolloutScanComplete: false, + lockedRolloutFiles: [] + }; + } + return { + ...clone(cached), + operationInProgress: clone(operation) + }; + } + + begin(codexHome, operation, { actor = "manual", platform = process.platform } = {}) { + const key = homeKey(codexHome, platform); + if (this.active.has(key)) { + throw new CoreError("OPERATION_BUSY", "Lock already exists for this Codex Home; another write operation is active.", { + details: { busyScope: "codex-home" } + }); + } + const active = Object.freeze({ + operationId: this.randomOperationId(), + operation, + actor, + startedAt: new Date(this.now()).toISOString() + }); + this.active.set(key, active); + return active; + } + + end(codexHome, operationId, platform = process.platform) { + const key = homeKey(codexHome, platform); + if (this.active.get(key)?.operationId !== operationId) return; + const completed = this.active.get(key); + this.active.delete(key); + const listeners = this.endListeners.get(key); + if (!listeners) return; + this.endListeners.delete(key); + for (const listener of listeners) { + queueMicrotask(() => listener(clone(completed))); + } + } + + waitForManualOperation(codexHome, platform = process.platform) { + const key = homeKey(codexHome, platform); + if (this.active.get(key)?.actor !== "manual") return null; + let listener; + const promise = new Promise((resolve) => { + listener = resolve; + const listeners = this.endListeners.get(key) ?? new Set(); + listeners.add(listener); + this.endListeners.set(key, listeners); + }); + return { + promise, + cancel: () => { + const listeners = this.endListeners.get(key); + listeners?.delete(listener); + if (listeners?.size === 0) this.endListeners.delete(key); + } + }; + } + + hasManualOperation(codexHome, platform = process.platform) { + return this.active.get(homeKey(codexHome, platform))?.actor === "manual"; + } + + isActive(codexHome, platform = process.platform) { + return this.active.has(homeKey(codexHome, platform)); + } +} + +export const sharedOperationCoordinator = new OperationCoordinator(); diff --git a/src/operation-revision.js b/src/operation-revision.js new file mode 100644 index 0000000..3b0af85 --- /dev/null +++ b/src/operation-revision.js @@ -0,0 +1,256 @@ +import { createHash } from "node:crypto"; +import fs from "node:fs/promises"; +import path from "node:path"; + +import { CoreError } from "./core-error.js"; + +const SESSION_SCOPES = ["sessions", "archived_sessions"]; +const LOCKED_FILE_CODES = new Set(["EACCES", "EBUSY", "EPERM", "ETXTBSY"]); + +function canonicalJsonValue(value) { + if (Array.isArray(value)) return value.map(canonicalJsonValue); + if (value && typeof value === "object") { + return Object.fromEntries( + Object.keys(value).sort().map((key) => [key, canonicalJsonValue(value[key])]) + ); + } + return value; +} + +export function stableStringify(value) { + return JSON.stringify(canonicalJsonValue(value)); +} + +export function sha256Revision(value) { + const bytes = Buffer.isBuffer(value) ? value : Buffer.from(String(value), "utf8"); + return createHash("sha256").update(bytes).digest("base64url"); +} + +function comparablePath(value, platform) { + if (typeof value !== "string") return null; + const resolved = path.resolve(value); + return platform === "win32" ? resolved.toLowerCase() : resolved; +} + +async function statOrNull(filePath, fsImpl) { + try { + return await fsImpl.stat(filePath, { bigint: true }); + } catch (error) { + if (error?.code === "ENOENT") return null; + throw error; + } +} + +function statIdentity(stats) { + return { + size: stats.size.toString(), + mtimeNs: stats.mtimeNs.toString(), + ctimeNs: stats.ctimeNs.toString() + }; +} + +function sameStat(left, right) { + return left && right + && left.size === right.size + && left.mtimeNs === right.mtimeNs + && left.ctimeNs === right.ctimeNs; +} + +async function captureStableFile(filePath, fsImpl, { allowLocked = false } = {}) { + for (let attempt = 0; attempt < 2; attempt += 1) { + const beforeStats = await statOrNull(filePath, fsImpl); + if (!beforeStats) return { present: false }; + if (!beforeStats.isFile()) { + throw new CoreError("STALE_STATE", "A revision target is not a regular file.", { + details: { reason: "storage" } + }); + } + const before = statIdentity(beforeStats); + try { + const bytes = await fsImpl.readFile(filePath); + const afterStats = await statOrNull(filePath, fsImpl); + const after = afterStats ? statIdentity(afterStats) : null; + if (sameStat(before, after)) { + return { present: true, ...after, sha256: sha256Revision(bytes) }; + } + } catch (error) { + if (allowLocked && LOCKED_FILE_CODES.has(error?.code)) { + return { + present: true, + ...before, + locked: true, + causeCode: error.code + }; + } + throw error; + } + } + throw new CoreError("STALE_STATE", "A revision target changed while it was being captured.", { + details: { reason: "storage" } + }); +} + +async function listRolloutFiles(rootDir, fsImpl) { + let entries; + try { + entries = await fsImpl.readdir(rootDir, { withFileTypes: true }); + } catch (error) { + if (error?.code === "ENOENT") return []; + throw error; + } + entries.sort((left, right) => left.name.localeCompare(right.name)); + const files = []; + for (const entry of entries) { + const fullPath = path.join(rootDir, entry.name); + if (entry.isDirectory()) { + files.push(...await listRolloutFiles(fullPath, fsImpl)); + } else if (entry.isFile() && entry.name.startsWith("rollout-") && entry.name.endsWith(".jsonl")) { + files.push(fullPath); + } else if (entry.isSymbolicLink()) { + throw new CoreError("STALE_STATE", "A rollout revision contains an unsupported symbolic link.", { + details: { reason: "rollout" } + }); + } + } + return files; +} + +export async function captureRolloutRevision(codexHome, { fsImpl = fs } = {}) { + const manifest = []; + const lockedRolloutFiles = []; + for (const scope of SESSION_SCOPES) { + const scopeRoot = path.join(codexHome, scope); + for (const filePath of await listRolloutFiles(scopeRoot, fsImpl)) { + const relativePath = path.relative(codexHome, filePath).split(path.sep).join("/"); + const revision = await captureStableFile(filePath, fsImpl, { allowLocked: true }); + manifest.push({ path: relativePath, ...revision }); + if (revision.locked) lockedRolloutFiles.push(relativePath); + } + } + manifest.sort((left, right) => left.path.localeCompare(right.path)); + return { + revision: sha256Revision(stableStringify(manifest)), + fileCount: manifest.length, + rolloutScanComplete: lockedRolloutFiles.length === 0, + lockedRolloutFiles + }; +} + +export async function captureStateDbRevision(storage, { fsImpl = fs, platform = process.platform } = {}) { + const stateDbPath = storage.stateDbLocation?.path ?? null; + if (!stateDbPath) { + return sha256Revision(stableStringify({ stateDb: null })); + } + const manifest = []; + for (const suffix of ["", "-wal", "-shm"]) { + manifest.push({ + path: suffix || "state_5.sqlite", + revision: await captureStableFile(`${stateDbPath}${suffix}`, fsImpl) + }); + } + return sha256Revision(stableStringify({ + stateDbPath: comparablePath(stateDbPath, platform), + source: storage.stateDbLocation.source, + manifest + })); +} + +async function listDirectoryFiles(rootDir, currentDir, fsImpl) { + let entries = await fsImpl.readdir(currentDir, { withFileTypes: true }); + entries = entries.sort((left, right) => left.name.localeCompare(right.name)); + const files = []; + for (const entry of entries) { + const fullPath = path.join(currentDir, entry.name); + if (entry.isDirectory()) { + files.push(...await listDirectoryFiles(rootDir, fullPath, fsImpl)); + } else if (entry.isFile()) { + files.push({ + path: path.relative(rootDir, fullPath).split(path.sep).join("/"), + revision: await captureStableFile(fullPath, fsImpl) + }); + } else { + throw new CoreError("RESTORE_VALIDATION_FAILED", "A managed backup contains an unsupported linked target."); + } + } + return files; +} + +export async function captureBackupRevision(backupDir, { fsImpl = fs } = {}) { + const root = path.resolve(backupDir); + const stats = await statOrNull(root, fsImpl); + if (!stats?.isDirectory()) { + throw new CoreError("RESTORE_VALIDATION_FAILED", "The selected managed backup is unavailable."); + } + const files = await listDirectoryFiles(root, root, fsImpl); + files.sort((left, right) => left.path.localeCompare(right.path)); + return sha256Revision(stableStringify(files)); +} + +export function captureConfigRevision(configText) { + return sha256Revision(Buffer.from(configText, "utf8")); +} + +export function captureStorageRevision({ profileRevision, configRevision, storage, platform = process.platform }) { + return sha256Revision(stableStringify({ + schemaVersion: 1, + profileRevision, + configRevision, + codexHome: comparablePath(storage.codexHome, platform), + sqliteHome: comparablePath(storage.sqliteHome, platform), + sqliteHomeSource: storage.sqliteHomeSource, + sqliteAccess: { + supported: storage.sqliteAccess?.supported !== false, + reason: storage.sqliteAccess?.reason ?? null + }, + allowLegacyRootFallback: Boolean(storage.allowLegacyRootFallback), + stateDbLocation: storage.stateDbLocation + ? { + path: comparablePath(storage.stateDbLocation.path, platform), + source: storage.stateDbLocation.source + } + : null + })); +} + +export async function captureOperationRevisions({ + codexHome, + profileRevision, + configText, + storage, + backupDir = null, + platform = process.platform, + fsImpl = fs +}) { + const configRevision = captureConfigRevision(configText); + const [rollout, stateDbRevision, backupRevision] = await Promise.all([ + captureRolloutRevision(codexHome, { fsImpl }), + captureStateDbRevision(storage, { fsImpl, platform }), + backupDir ? captureBackupRevision(backupDir, { fsImpl }) : Promise.resolve(null) + ]); + return { + profileRevision, + configRevision, + storageRevision: captureStorageRevision({ profileRevision, configRevision, storage, platform }), + rolloutRevision: rollout.revision, + stateDbRevision, + ...(backupRevision ? { backupRevision } : {}), + rolloutScanComplete: rollout.rolloutScanComplete, + lockedRolloutFiles: rollout.lockedRolloutFiles, + rolloutFileCount: rollout.fileCount + }; +} + +export function revisionMismatch(expected, actual) { + for (const [field, reason] of [ + ["profileRevision", "profile"], + ["configRevision", "config"], + ["storageRevision", "storage"], + ["rolloutRevision", "rollout"], + ["stateDbRevision", "state-db"], + ["backupRevision", "backup"] + ]) { + if ((expected[field] ?? null) !== (actual[field] ?? null)) return reason; + } + return null; +} + diff --git a/src/plan-ledger.js b/src/plan-ledger.js new file mode 100644 index 0000000..e5b19ae --- /dev/null +++ b/src/plan-ledger.js @@ -0,0 +1,109 @@ +import { randomBytes } from "node:crypto"; + +import { CoreError } from "./core-error.js"; + +export const PLAN_SCHEMA_VERSION = 1; +export const DEFAULT_PLAN_TTL_MS = 10 * 60 * 1000; + +const OPERATIONS = new Set(["sync", "switch", "restore"]); + +function cloneJson(value) { + return JSON.parse(JSON.stringify(value)); +} + +function deepFreeze(value) { + if (!value || typeof value !== "object" || Object.isFrozen(value)) return value; + for (const entry of Object.values(value)) deepFreeze(entry); + return Object.freeze(value); +} + +function invalidPlanInput(message) { + return new CoreError("INVALID_INPUT", message); +} + +function unavailablePlan() { + return new CoreError( + "PLAN_EXPIRED", + "The prepared operation is no longer available. Prepare and confirm it again." + ); +} + +export class PlanLedger { + constructor({ + now = () => Date.now(), + randomId = () => randomBytes(32).toString("base64url"), + ttlMs = DEFAULT_PLAN_TTL_MS + } = {}) { + if (typeof now !== "function" || typeof randomId !== "function") { + throw new TypeError("PlanLedger clock and random id source must be functions."); + } + if (!Number.isInteger(ttlMs) || ttlMs <= 0) { + throw new TypeError("PlanLedger ttlMs must be a positive integer."); + } + this.now = now; + this.randomId = randomId; + this.ttlMs = ttlMs; + this.entries = new Map(); + } + + issue(operation, summary, internal) { + if (!OPERATIONS.has(operation)) { + throw new TypeError(`Unsupported plan operation: ${String(operation)}`); + } + const createdAtMs = this.now(); + const planId = this.randomId(); + if (typeof planId !== "string" || !/^[A-Za-z0-9_-]{32,128}$/.test(planId)) { + throw new TypeError("Plan id source returned an invalid opaque id."); + } + if (this.entries.has(planId)) { + throw new CoreError("INTERNAL_ERROR", "The plan id source produced a duplicate id."); + } + const issuedSummary = deepFreeze({ + ...cloneJson(summary), + schemaVersion: PLAN_SCHEMA_VERSION, + planId, + operation, + createdAt: new Date(createdAtMs).toISOString(), + expiresAt: new Date(createdAtMs + this.ttlMs).toISOString(), + requiresConfirmation: true + }); + this.entries.set(planId, { + operation, + expiresAtMs: createdAtMs + this.ttlMs, + summary: issuedSummary, + internal + }); + return issuedSummary; + } + + consume(input, expectedOperation) { + if (!input || typeof input !== "object" || Array.isArray(input)) { + throw invalidPlanInput("Apply requires a schemaVersion and planId object."); + } + const keys = Object.keys(input).sort(); + if (keys.length !== 2 || keys[0] !== "planId" || keys[1] !== "schemaVersion") { + throw invalidPlanInput("Apply accepts only schemaVersion and planId."); + } + if (input.schemaVersion !== PLAN_SCHEMA_VERSION + || typeof input.planId !== "string" + || !/^[A-Za-z0-9_-]{32,128}$/.test(input.planId)) { + throw invalidPlanInput("Apply requires schemaVersion 1 and a valid opaque planId."); + } + if (!OPERATIONS.has(expectedOperation)) { + throw new TypeError(`Unsupported plan operation: ${String(expectedOperation)}`); + } + const entry = this.entries.get(input.planId); + if (!entry || entry.operation !== expectedOperation) throw unavailablePlan(); + + // Consumption is deliberately atomic and happens before waiting for any + // filesystem lock. A failed, stale, busy, or cancelled Apply cannot replay + // an old confirmation. + this.entries.delete(input.planId); + if (this.now() >= entry.expiresAtMs) throw unavailablePlan(); + return entry; + } + + get size() { + return this.entries.size; + } +} diff --git a/src/public-api.js b/src/public-api.js index d2398c2..f7e696c 100644 --- a/src/public-api.js +++ b/src/public-api.js @@ -12,13 +12,22 @@ export { CORE_ERROR_CODES, CoreError, toCoreErrorDto } from "./core-error.js"; export { + applyRestore, + applySwitch, + applySync, getStatus, + pruneBackups, + prepareRestore, + prepareSwitch, + prepareSync, runPruneBackups, runRestore, runSwitch, runSync } from "./service.js"; +export { getDiagnostics } from "./diagnostics.js"; + export { listBackups } from "./backup.js"; export { getHistorySession, listHistory } from "./history.js"; export { readConfigText, readRootModelFromConfigText } from "./config-file.js"; @@ -28,4 +37,4 @@ export { resolveStorageLayout, withStateDbLocation } from "./storage-layout.js"; -export { runWatch } from "./watch.js"; +export { getWatchStatus, runWatch, startWatch, stopWatch } from "./watch.js"; diff --git a/src/service.js b/src/service.js index 6c603f5..11d0a7e 100644 --- a/src/service.js +++ b/src/service.js @@ -3,6 +3,7 @@ import fs from "node:fs/promises"; import { DEFAULT_BACKUP_RETENTION_COUNT, + DEFAULT_LOCK_NAME, DEFAULT_PROVIDER, defaultBackupRoot } from "./constants.js"; @@ -22,12 +23,24 @@ import { createBackup, getBackupRecoveryCoverage, getBackupSummary, - pruneBackups, + listBackups, + pruneBackups as pruneManagedBackups, refreshBackupInventory, + resolveRestoreStateDbTargetPath, restoreBackup, restoreGlobalStateFilesFromBackup } from "./backup.js"; -import { acquireLock } from "./locking.js"; +import { acquireLock, inspectPathLock } from "./locking.js"; +import { acquireStateDbLock, resolveStateDbLockResource } from "./state-db-lock.js"; +import { PlanLedger } from "./plan-ledger.js"; +import { sharedOperationCoordinator as operationCoordinator } from "./operation-coordinator.js"; +import { + captureOperationRevisions, + captureStorageRevision, + revisionMismatch, + sha256Revision, + stableStringify +} from "./operation-revision.js"; import { applySessionChanges, collectSessionChanges, @@ -65,6 +78,8 @@ import { markBackupTransactionRolledBack } from "./transaction-journal.js"; +const planLedger = new PlanLedger(); + function pathComparisonKey(value) { const resolved = path.resolve(value); return process.platform === "win32" ? resolved.toLowerCase() : resolved; @@ -138,6 +153,26 @@ async function prepareStorage({ codexHome: explicitCodexHome, sqliteHome, config return withStateDbLocation(layout, await detectStateDb(layout)); } +async function releaseWriteLocks(releaseStateDbLock, releaseHomeLock) { + const failures = []; + if (releaseStateDbLock) { + try { + await releaseStateDbLock(); + } catch (error) { + failures.push(error); + } + } + try { + await releaseHomeLock(); + } catch (error) { + failures.push(error); + } + if (failures.length === 1) throw failures[0]; + if (failures.length > 1) { + throw new AggregateError(failures, "Failed to release one or more write-operation locks."); + } +} + function emitProgress(onProgress, event) { if (typeof onProgress !== "function") { return; @@ -241,6 +276,68 @@ function sumCounts(counts) { return Object.values(counts ?? {}).reduce((total, value) => total + value, 0); } +function normalizeProfileId(value) { + const profileId = value ?? "default"; + if (typeof profileId !== "string" || !/^[A-Za-z0-9._-]{1,80}$/.test(profileId)) { + throw new CoreError("INVALID_INPUT", "The storage profile id is invalid."); + } + return profileId; +} + +function comparableProfilePath(value, platform) { + if (typeof value !== "string" || !value) return null; + const resolved = path.resolve(value); + return platform === "win32" ? resolved.toLowerCase() : resolved; +} + +function createProfileSnapshot({ + profileId, + suppliedRevision, + codexHome, + sqliteHome, + platform = process.platform +}) { + if (suppliedRevision !== undefined && suppliedRevision !== null + && (typeof suppliedRevision !== "string" || !suppliedRevision || suppliedRevision.length > 512)) { + throw new CoreError("INVALID_INPUT", "The storage profile revision is invalid."); + } + const id = normalizeProfileId(profileId); + const revision = sha256Revision(stableStringify({ + schemaVersion: 1, + id, + suppliedRevision: suppliedRevision ?? null, + codexHome: comparableProfilePath(codexHome, platform), + sqliteHome: comparableProfilePath(sqliteHome, platform) + })); + return Object.freeze({ + id, + revision, + suppliedRevision: suppliedRevision ?? null, + codexHome: path.resolve(codexHome), + sqliteHome: typeof sqliteHome === "string" && sqliteHome ? path.resolve(sqliteHome) : null + }); +} + +function profileFromOptions(options, codexHome, sqliteHome, platform) { + return createProfileSnapshot({ + profileId: options.profile?.id ?? options.profileId, + suppliedRevision: options.profile?.revision ?? options.profileRevision, + codexHome, + sqliteHome, + platform + }); +} + +function explicitSqliteHomeFromOptions(options) { + if (typeof options.sqliteHome === "string" && options.sqliteHome.trim()) return options.sqliteHome; + if (options.storage?.sqliteHomeSource !== "default" + && typeof options.storage?.sqliteHome === "string" + && options.storage.sqliteHome.trim()) { + return options.storage.sqliteHome; + } + return undefined; +} + function buildEncryptedContentWarning(encryptedContentCounts, targetProvider) { const riskyProviders = new Set(); for (const scope of ["sessions", "archived_sessions"]) { @@ -257,11 +354,14 @@ function buildEncryptedContentWarning(encryptedContentCounts, targetProvider) { return `Encrypted content warning: ${total} rollout file(s) contain encrypted_content from provider(s) ${[...riskyProviders].sort().join(", ")}. Visibility metadata can be synchronized to ${targetProvider}, but continuing or compacting those histories may fail with invalid_encrypted_content. Return to the original provider/account or start a new session if you need reliable continuation.`; } -export async function getStatus({ +async function scanStatus({ codexHome: explicitCodexHome, sqliteHome, storage: providedStorage, configText: providedConfigText, + profile, + profileId, + profileRevision, platform } = {}) { const codexHome = providedStorage?.codexHome ?? normalizeCodexHome(explicitCodexHome); @@ -284,13 +384,46 @@ export async function getStatus({ const sqliteRepairStats = sqliteCounts && !sqliteCounts.unreadable ? await readSqliteRepairStats(storage, { userEventThreadIds, threadCwdById }) : null; - const projectThreadVisibility = !storage.sqliteAccess.supported || sqliteCounts?.unreadable - ? [] - : await readProjectThreadVisibility(storage); + let projectThreadVisibility = []; + let projectThreadVisibilityAvailable = storage.sqliteAccess.supported && !sqliteCounts?.unreadable; + if (storage.sqliteAccess.supported && !sqliteCounts?.unreadable) { + try { + projectThreadVisibility = await readProjectThreadVisibility(storage); + } catch { + // Project visibility is an optional diagnostic projection. Older/minimal + // Codex schemas may not expose every column it needs; that must not block + // Status, Plan preparation, or a safe provider sync. + projectThreadVisibility = []; + projectThreadVisibilityAvailable = false; + } + } const backupSummary = await getBackupSummary(codexHome); const pendingTransactions = await findPendingTransactions(codexHome); + const trustedProfile = createProfileSnapshot({ + profileId: profile?.id ?? profileId, + suppliedRevision: profile?.revision ?? profileRevision, + codexHome, + // Profile identity is the trusted caller/server selection. Effective + // config-derived SQLite storage belongs in storageRevision, not here. + sqliteHome, + platform + }); + const configRevision = sha256Revision(Buffer.from(configText, "utf8")); + const resolvedStorageRevision = captureStorageRevision({ + profileRevision: trustedProfile.revision, + configRevision, + storage, + platform + }); return { + schemaVersion: 1, + snapshotAt: new Date().toISOString(), + storageRevision: resolvedStorageRevision, + profile: { id: trustedProfile.id, revision: trustedProfile.revision }, + profileId: trustedProfile.id, + profileRevision: trustedProfile.suppliedRevision ?? trustedProfile.revision, + pathComparisonCaseInsensitive: (platform ?? process.platform) === "win32", codexHome, sqliteHome: storage.sqliteHome, sqliteHomeSource: storage.sqliteHomeSource, @@ -307,8 +440,12 @@ export async function getStatus({ stateDbLocation, sqliteRepairStats, projectThreadVisibility, + projectThreadVisibilityAvailable, backupRoot: defaultBackupRoot(codexHome), backupSummary, + pendingRecovery: pendingTransactions.length > 0, + operationInProgress: null, + rolloutScanComplete: lockedPaths.length === 0, pendingTransactions: pendingTransactions.map((transaction) => ({ operationId: transaction.operationId ?? null, state: transaction.state, @@ -318,9 +455,311 @@ export async function getStatus({ }; } -/** @deprecated Compatibility adapter. New transports must use prepareSync/applySync once available. */ -export async function runSync(options = {}) { - return runSyncCore(options); +function publicProfileMetadata(profile) { + return { + id: profile.id, + publicRevision: profile.suppliedRevision ?? profile.revision + }; +} + +function externalOperationFromLock({ inspection = null, error = null, scope }) { + const owner = inspection?.owner ?? null; + return { + operationId: owner?.instanceId ?? null, + operation: typeof owner?.label === "string" && owner.label ? owner.label : "unknown", + actor: "external", + runtime: typeof owner?.runtime === "string" ? owner.runtime : null, + startedAt: typeof owner?.startedAt === "string" ? owner.startedAt : null, + busyScope: scope, + lockState: inspection?.state === "active" ? "active" : "unverifiable", + ...(error?.code ? { errorCode: error.code } : {}) + }; +} + +async function inspectStatusLock(lockPath, options) { + try { + return { inspection: await inspectPathLock(lockPath, options), error: null }; + } catch (error) { + if (error?.code === "LOCK_UNVERIFIABLE" + || error?.code === "OPERATION_BUSY" + || error?.code === "PERMISSION_DENIED") { + return { inspection: null, error }; + } + throw error; + } +} + +async function blockedStatus(codexHome, profile, operation, platform, details = null) { + const status = operationCoordinator.statusForBlockedWrite( + codexHome, + operation, + platform, + publicProfileMetadata(profile) + ); + if (!status.profile) { + status.profile = { id: profile.id, revision: profile.revision }; + status.profileId = profile.id; + status.profileRevision = profile.suppliedRevision ?? profile.revision; + status.pathComparisonCaseInsensitive = (platform ?? process.platform) === "win32"; + } + status.statusReadBlocked = details ?? { reason: "write-operation" }; + if (operation.lockState === "unverifiable") { + status.rolloutScanComplete = false; + try { + const pendingTransactions = await findPendingTransactions(codexHome); + status.pendingTransactions = pendingTransactions.map((transaction) => ({ + operationId: transaction.operationId ?? null, + state: transaction.state, + backupDir: transaction.backupDir, + journalPath: transaction.filePath + })); + status.pendingRecovery = pendingTransactions.length > 0; + } catch { + status.pendingTransactions ??= []; + status.pendingRecovery = true; + } + } + return status; +} + +export async function getStatus(options = {}) { + const codexHome = options.storage?.codexHome ?? normalizeCodexHome(options.codexHome); + const platform = options.platform ?? process.platform; + const sqliteHome = explicitSqliteHomeFromOptions(options); + const profile = profileFromOptions(options, codexHome, sqliteHome, platform); + const activeSnapshot = operationCoordinator.statusDuringWrite( + codexHome, + platform, + publicProfileMetadata(profile) + ); + if (activeSnapshot) return activeSnapshot; + + const homeLockPath = path.join(codexHome, "tmp", DEFAULT_LOCK_NAME); + const homeBefore = await inspectStatusLock(homeLockPath, { scope: "codex-home", platform }); + if (homeBefore.error || homeBefore.inspection.state !== "absent") { + const operation = externalOperationFromLock({ + inspection: homeBefore.inspection, + error: homeBefore.error, + scope: "codex-home" + }); + return blockedStatus(codexHome, profile, operation, platform, { + reason: "codex-home-lock", + lockState: operation.lockState + }); + } + + const configPath = path.join(codexHome, "config.toml"); + const configText = options.configText ?? await readConfigText(configPath); + const storage = await prepareStorage({ + codexHome, + sqliteHome, + configText, + storage: options.storage, + platform + }); + let stateResource = null; + if (storage.stateDbLocation?.path) { + stateResource = await resolveStateDbLockResource(storage.stateDbLocation.path, { platform }); + const stateBefore = await inspectStatusLock(stateResource.lockPath, { + scope: "state-db", + resourceKey: stateResource.resourceKey, + platform + }); + if (stateBefore.error || stateBefore.inspection.state !== "absent") { + const operation = externalOperationFromLock({ + inspection: stateBefore.inspection, + error: stateBefore.error, + scope: "state-db" + }); + return blockedStatus(codexHome, profile, operation, platform, { + reason: "state-db-lock", + lockState: operation.lockState + }); + } + } + + let beforeRevision; + try { + beforeRevision = await captureOperationRevisions({ + codexHome, + profileRevision: profile.revision, + configText, + storage, + platform + }); + } catch (error) { + return blockedStatus( + codexHome, + profile, + externalOperationFromLock({ error, scope: "codex-home" }), + platform, + { reason: "revision-unverifiable" } + ); + } + + let snapshot = await scanStatus({ + ...options, + codexHome, + sqliteHome, + storage, + configText, + profileId: profile.id, + profileRevision: profile.suppliedRevision, + platform + }); + + const homeAfter = await inspectStatusLock(homeLockPath, { scope: "codex-home", platform }); + let stateAfter = { inspection: { state: "absent" }, error: null }; + if (!homeAfter.error && homeAfter.inspection.state === "absent" && stateResource) { + stateAfter = await inspectStatusLock(stateResource.lockPath, { + scope: "state-db", + resourceKey: stateResource.resourceKey, + platform + }); + } + if (homeAfter.error || homeAfter.inspection.state !== "absent" + || stateAfter.error || stateAfter.inspection.state !== "absent") { + const source = homeAfter.error || homeAfter.inspection.state !== "absent" + ? { ...homeAfter, scope: "codex-home" } + : { ...stateAfter, scope: "state-db" }; + const operation = externalOperationFromLock(source); + return blockedStatus(codexHome, profile, operation, platform, { + reason: `${source.scope}-lock`, + lockState: operation.lockState + }); + } + + let afterRevision; + try { + const latestConfigText = await readConfigText(configPath); + afterRevision = await captureOperationRevisions({ + codexHome, + profileRevision: profile.revision, + configText: latestConfigText, + storage, + platform + }); + } catch (error) { + return blockedStatus( + codexHome, + profile, + externalOperationFromLock({ error, scope: "codex-home" }), + platform, + { reason: "revision-unverifiable" } + ); + } + let driftReason = revisionMismatch(beforeRevision, afterRevision); + if (driftReason === "state-db" || driftReason === "rollout") { + // Opening a WAL database for read-only Status can legitimately create or + // refresh its SHM sidecar. Retry once from that new complete baseline; a + // real concurrent writer will either expose its lock or drift again. + snapshot = await scanStatus({ + ...options, + codexHome, + sqliteHome, + storage, + configText, + profileId: profile.id, + profileRevision: profile.suppliedRevision, + platform + }); + const retryConfigText = await readConfigText(configPath); + const retryRevision = await captureOperationRevisions({ + codexHome, + profileRevision: profile.revision, + configText: retryConfigText, + storage, + platform + }); + driftReason = revisionMismatch(afterRevision, retryRevision); + afterRevision = retryRevision; + } + if (driftReason) { + return blockedStatus( + codexHome, + profile, + externalOperationFromLock({ scope: driftReason === "state-db" ? "state-db" : "codex-home" }), + platform, + { reason: "state-changed-during-status", revision: driftReason } + ); + } + + const homeFinal = await inspectStatusLock(homeLockPath, { scope: "codex-home", platform }); + if (homeFinal.error || homeFinal.inspection.state !== "absent") { + const operation = externalOperationFromLock({ + inspection: homeFinal.inspection, + error: homeFinal.error, + scope: "codex-home" + }); + return blockedStatus(codexHome, profile, operation, platform, { + reason: "codex-home-lock", + lockState: operation.lockState + }); + } + if (stateResource) { + const stateFinal = await inspectStatusLock(stateResource.lockPath, { + scope: "state-db", + resourceKey: stateResource.resourceKey, + platform + }); + if (stateFinal.error || stateFinal.inspection.state !== "absent") { + const operation = externalOperationFromLock({ + inspection: stateFinal.inspection, + error: stateFinal.error, + scope: "state-db" + }); + return blockedStatus(codexHome, profile, operation, platform, { + reason: "state-db-lock", + lockState: operation.lockState + }); + } + } + + operationCoordinator.cacheStatus(codexHome, snapshot, platform); + return snapshot; +} + +async function verifyExpectedPlanState({ + expectedPlanState, + codexHome, + configText, + storage, + platform, + backupDir = null +}) { + if (!expectedPlanState) return; + let currentProfile = expectedPlanState.profile; + if (typeof expectedPlanState.profileResolver === "function") { + try { + const resolved = await expectedPlanState.profileResolver(expectedPlanState.profile.id); + currentProfile = createProfileSnapshot({ + profileId: resolved?.id, + suppliedRevision: resolved?.revision, + codexHome: resolved?.codexHome, + sqliteHome: resolved?.sqliteHome, + platform + }); + } catch (error) { + throw new CoreError("STALE_STATE", "The selected storage profile changed after preparation.", { + cause: error instanceof Error ? error : undefined, + details: { reason: "profile" } + }); + } + } + const actual = await captureOperationRevisions({ + codexHome, + profileRevision: currentProfile.revision, + configText, + storage, + backupDir, + platform + }); + const reason = revisionMismatch(expectedPlanState.revisions, actual); + if (reason) { + throw new CoreError("STALE_STATE", "Protected state changed after the operation was prepared.", { + details: { reason } + }); + } } async function runSyncCore({ @@ -336,7 +775,8 @@ async function runSyncCore({ model = null, platform, faultInjector, - signal + signal, + expectedPlanState } = {}, { afterBackup } = {}) { if (!Number.isInteger(keepCount) || keepCount < 1) { throw new CoreError( @@ -348,20 +788,20 @@ async function runSyncCore({ const codexHome = providedStorage?.codexHome ?? normalizeCodexHome(explicitCodexHome); const configPath = path.join(codexHome, "config.toml"); const releaseLock = await acquireLock(codexHome, "sync"); + let releaseStateDbLock = null; let backupDir = null; let journal = null; let backupDurationMs = 0; try { - await assertNoPendingTransactions(codexHome); throwIfAborted(signal); const configText = await readConfigText(configPath); - if (expectedConfigText !== undefined && configText !== expectedConfigText) { + if (!expectedPlanState && expectedConfigText !== undefined && configText !== expectedConfigText) { throw new CoreError( "PLAN_STALE", "config.toml changed after the operation was confirmed. Refresh and retry." ); } - if (configBackupText !== undefined && configText !== configBackupText) { + if (!expectedPlanState && configBackupText !== undefined && configText !== configBackupText) { throw new CoreError( "PLAN_STALE", "config.toml changed before the switch operation acquired its lock. Refresh and retry." @@ -372,6 +812,21 @@ async function runSyncCore({ if (!storage.stateDbLocation && isConfiguredSqliteHome(storage)) { throw missingConfiguredStateDbError(storage); } + if (storage.stateDbLocation?.path) { + ({ release: releaseStateDbLock } = await acquireStateDbLock( + storage.stateDbLocation.path, + "sync", + { platform } + )); + } + await assertNoPendingTransactions(codexHome); + await verifyExpectedPlanState({ + expectedPlanState, + codexHome, + configText, + storage, + platform + }); const current = readCurrentProviderFromConfigText(configText); const targetProvider = provider ?? current.provider ?? DEFAULT_PROVIDER; emitProgress(onProgress, { stage: "scan_rollout_files", status: "start" }); @@ -610,7 +1065,7 @@ async function runSyncCore({ keepCount }); try { - autoPruneResult = await pruneBackups(codexHome, keepCount); + autoPruneResult = await pruneManagedBackups(codexHome, keepCount); } catch (pruneError) { autoPruneWarning = `Automatic backup cleanup failed: ${pruneError instanceof Error ? pruneError.message : String(pruneError)}`; } @@ -790,60 +1245,23 @@ async function runSyncCore({ ); } } finally { - await releaseLock(); + await releaseWriteLocks(releaseStateDbLock, releaseLock); } } -/** @deprecated Compatibility adapter. New transports must use prepareSwitch/applySwitch once available. */ -export async function runSwitch({ - codexHome: explicitCodexHome, - sqliteHome, - storage: providedStorage, - expectedConfigText, - provider, - model, - keepRootModel = false, - keepCount = DEFAULT_BACKUP_RETENTION_COUNT, - onProgress, - platform, - faultInjector, - signal -}) { - if (!provider) { - throw new CoreError( - "INVALID_INPUT", - "Missing provider id. Usage: codex-provider switch " - ); - } - - const codexHome = providedStorage?.codexHome ?? normalizeCodexHome(explicitCodexHome); - const configPath = path.join(codexHome, "config.toml"); - const originalConfigText = await readConfigText(configPath); - if (expectedConfigText !== undefined && originalConfigText !== expectedConfigText) { - throw new CoreError( - "PLAN_STALE", - "config.toml changed after the operation was confirmed. Refresh and retry." - ); - } - const storage = await prepareStorage({ codexHome, sqliteHome, configText: originalConfigText, storage: providedStorage, platform }); - assertSqliteAccessSupported(storage, "switch"); - if (!storage.stateDbLocation && isConfiguredSqliteHome(storage)) { - throw missingConfiguredStateDbError(storage); - } +function buildSwitchIntent(originalConfigText, provider, model, keepRootModel) { if (!configDeclaresProvider(originalConfigText, provider)) { throw new CoreError( "INVALID_INPUT", `Provider "${provider}" is not available in config.toml. Configure it first or use one of: ${listConfiguredProviderIds(originalConfigText).join(", ")}` ); } - if (model !== undefined && model !== null && keepRootModel) { throw new CoreError("INVALID_INPUT", "--model and --keep-root-model are mutually exclusive. Pick one."); } let nextConfigText = setRootProviderInConfigText(originalConfigText, provider); let modelSync = { applied: false, source: "none", model: null, warning: null }; - if (model !== undefined && model !== null) { if (typeof model !== "string" || model.length === 0) { throw new CoreError( @@ -867,26 +1285,71 @@ export async function runSwitch({ }; } } + const modelForThreads = modelSync.applied && modelSync.model + ? modelSync.model + : readRootModelFromConfigText(nextConfigText); + return { nextConfigText, modelSync, modelForThreads }; +} - // `nextConfigText` has the final root-level `model` value. Use that to - // drive the per-thread rewrite so old sessions match new sessions. - let modelForThreads = null; - if (modelSync.applied && modelSync.model) { - modelForThreads = modelSync.model; - } else { - modelForThreads = readRootModelFromConfigText(nextConfigText); +async function runSwitchCore({ + codexHome: explicitCodexHome, + sqliteHome, + storage: providedStorage, + expectedConfigText, + provider, + model, + keepRootModel = false, + keepCount = DEFAULT_BACKUP_RETENTION_COUNT, + onProgress, + platform, + faultInjector, + signal, + expectedPlanState +}) { + if (!provider) { + throw new CoreError( + "INVALID_INPUT", + "Missing provider id. Usage: codex-provider switch " + ); + } + + const codexHome = providedStorage?.codexHome ?? normalizeCodexHome(explicitCodexHome); + const configPath = path.join(codexHome, "config.toml"); + const originalConfigText = await readConfigText(configPath); + if (expectedConfigText !== undefined && originalConfigText !== expectedConfigText) { + throw new CoreError( + "PLAN_STALE", + "config.toml changed after the operation was confirmed. Refresh and retry." + ); + } + const storage = await prepareStorage({ codexHome, sqliteHome, configText: originalConfigText, storage: providedStorage, platform }); + assertSqliteAccessSupported(storage, "switch"); + if (!storage.stateDbLocation && isConfiguredSqliteHome(storage)) { + throw missingConfiguredStateDbError(storage); } + await faultInjector?.({ + point: "after_switch_storage_preflight", + stateDbPath: storage.stateDbLocation?.path ?? null + }); + const { nextConfigText, modelSync, modelForThreads } = buildSwitchIntent( + originalConfigText, + provider, + model, + keepRootModel + ); const syncResult = await runSyncCore( { codexHome, - storage, + sqliteHome, provider, configBackupText: originalConfigText, keepCount, onProgress, model: modelForThreads, faultInjector, - signal + signal, + expectedPlanState, + platform }, { afterBackup: async () => { @@ -911,8 +1374,7 @@ export async function runSwitch({ }; } -/** @deprecated Compatibility adapter. New transports must use prepareRestore/applyRestore once available. */ -export async function runRestore({ +async function runRestoreCore({ codexHome: explicitCodexHome, sqliteHome, storage: providedStorage, @@ -923,7 +1385,8 @@ export async function runRestore({ restoreSessions = true, allowSqliteHomeRelocation = false, platform, - faultInjector + faultInjector, + expectedPlanState }) { if (!backupDir) { throw new CoreError( @@ -939,9 +1402,10 @@ export async function runRestore({ ); } const releaseLock = await acquireLock(codexHome, "restore"); + let releaseStateDbLock = null; try { const configText = await readConfigText(path.join(codexHome, "config.toml")); - if (expectedConfigText !== undefined && configText !== expectedConfigText) { + if (!expectedPlanState && expectedConfigText !== undefined && configText !== expectedConfigText) { throw new CoreError( "PLAN_STALE", "config.toml changed after the operation was confirmed. Refresh and retry." @@ -953,6 +1417,31 @@ export async function runRestore({ throw missingConfiguredStateDbError(storage); } const normalizedBackupDir = path.resolve(backupDir); + if (restoreDatabase) { + const stateDbTargetPath = await resolveRestoreStateDbTargetPath(normalizedBackupDir, storage); + ({ release: releaseStateDbLock } = await acquireStateDbLock( + stateDbTargetPath, + "restore", + { platform } + )); + } + const foreignPending = (await findPendingTransactions(codexHome)) + .filter((transaction) => pathComparisonKey(transaction.backupDir) !== pathComparisonKey(normalizedBackupDir)); + if (foreignPending.length > 0) { + throw new CoreError( + "RECOVERY_REQUIRED", + "An unrelated unfinished transaction must be resolved before this restore.", + { suggestedAction: "Restore the transaction-bound managed backup before starting another write." } + ); + } + await verifyExpectedPlanState({ + expectedPlanState, + codexHome, + configText, + storage, + platform, + backupDir: normalizedBackupDir + }); let boundJournal = null; try { boundJournal = await readTransactionJournal( @@ -1030,8 +1519,398 @@ export async function runRestore({ } return result; } finally { - await releaseLock(); + await releaseWriteLocks(releaseStateDbLock, releaseLock); + } +} + +function sqliteRowsToChange(sqliteCounts, targetProvider, sqliteRepairStats) { + let count = 0; + for (const scope of ["sessions", "archived_sessions"]) { + for (const [provider, providerCount] of Object.entries(sqliteCounts?.[scope] ?? {})) { + if (provider !== targetProvider && Number.isSafeInteger(providerCount)) count += providerCount; + } + } + count += sqliteRepairStats?.userEventRowsNeedingRepair ?? 0; + count += sqliteRepairStats?.cwdRowsNeedingRepair ?? 0; + return count; +} + +async function preparePlanContext(options, operation, { backupDir = null } = {}) { + const codexHome = options.storage?.codexHome ?? normalizeCodexHome(options.codexHome); + if (operationCoordinator.isActive(codexHome, options.platform)) { + throw new CoreError("OPERATION_BUSY", "Lock already exists for this Codex Home; another write operation is active.", { + details: { busyScope: "codex-home" } + }); + } + const sqliteHome = explicitSqliteHomeFromOptions(options); + const configPath = path.join(codexHome, "config.toml"); + const configText = await readConfigText(configPath); + if (options.expectedConfigText !== undefined && configText !== options.expectedConfigText) { + throw new CoreError( + "PLAN_STALE", + "config.toml changed after the operation was confirmed. Refresh and retry." + ); + } + const storage = await prepareStorage({ codexHome, sqliteHome, configText, platform: options.platform }); + assertSqliteAccessSupported(storage, operation); + const profile = profileFromOptions(options, codexHome, sqliteHome, options.platform); + const status = await scanStatus({ + codexHome, + sqliteHome, + storage, + configText, + profileId: profile.id, + profileRevision: profile.suppliedRevision, + platform: options.platform + }); + // Capture the executable revision after all read-only status queries have + // closed their SQLite handles; opening a WAL database may legitimately + // update its SHM sidecar. + const revisions = await captureOperationRevisions({ + codexHome, + profileRevision: profile.revision, + configText, + storage, + backupDir, + platform: options.platform + }); + operationCoordinator.cacheStatus(codexHome, status, options.platform); + return { codexHome, sqliteHome, configText, storage, profile, revisions, status }; +} + +async function issueSyncLikePlan(operation, options, switchIntent = null) { + const keepCount = options.keepCount ?? DEFAULT_BACKUP_RETENTION_COUNT; + if (!Number.isInteger(keepCount) || keepCount < 1) { + throw new CoreError( + "INVALID_INPUT", + `Invalid automatic keep count: ${keepCount}. Expected an integer greater than or equal to 1.` + ); + } + const context = await preparePlanContext(options, operation); + if (!context.storage.stateDbLocation && isConfiguredSqliteHome(context.storage)) { + throw missingConfiguredStateDbError(context.storage); + } + const current = readCurrentProviderFromConfigText(context.configText); + const targetProvider = switchIntent?.provider + ?? options.provider + ?? current.provider + ?? DEFAULT_PROVIDER; + const targetModel = switchIntent?.modelForThreads ?? options.model ?? null; + if (targetModel !== null && targetModel !== undefined + && (typeof targetModel !== "string" || !targetModel)) { + throw new CoreError("INVALID_INPUT", "The target model must be a non-empty string or null."); + } + const scan = await collectSessionChanges(context.codexHome, targetProvider, { + skipLockedReads: true, + targetModel + }); + const { lockedChanges } = await splitLockedSessionChanges(scan.changes); + const lockedCount = new Set([ + ...scan.lockedPaths, + ...lockedChanges.map((change) => change.path) + ]).size; + const warnings = []; + if (!context.status.projectThreadVisibilityAvailable) { + warnings.push("Project visibility diagnostics are unavailable; the write operation will still validate and protect the global state with backup-first recovery."); } + const encryptedWarning = buildEncryptedContentWarning(scan.encryptedContentCounts, targetProvider); + if (encryptedWarning) warnings.push(encryptedWarning); + if (lockedCount > 0) { + warnings.push(`${lockedCount} rollout file(s) are currently locked and may produce a partial result.`); + } + if (switchIntent?.modelSync.warning) warnings.push(switchIntent.modelSync.warning); + + const summary = { + profile: { id: context.profile.id, revision: context.profile.revision }, + storageRevision: context.revisions.storageRevision, + configRevision: context.revisions.configRevision, + rolloutRevision: context.revisions.rolloutRevision, + stateDbRevision: context.revisions.stateDbRevision, + target: { + provider: targetProvider, + model: targetModel, + ...(switchIntent ? { modelMode: switchIntent.modelMode } : {}) + }, + impact: { + rolloutFilesToChange: scan.changes.length, + sqliteRowsToChange: sqliteRowsToChange( + context.status.sqliteCounts, + targetProvider, + context.status.sqliteRepairStats + ), + workspaceRootsToChange: context.status.sqliteRepairStats?.cwdRowsNeedingRepair ?? 0, + lockedRolloutFiles: context.revisions.lockedRolloutFiles, + backupExpected: true + }, + warnings + }; + const executionOptions = operation === "switch" + ? { + codexHome: context.codexHome, + ...(context.sqliteHome ? { sqliteHome: context.sqliteHome } : {}), + provider: switchIntent.provider, + model: options.model, + keepRootModel: Boolean(options.keepRootModel), + keepCount, + onProgress: options.onProgress, + platform: options.platform, + faultInjector: options.faultInjector, + signal: options.signal + } + : { + codexHome: context.codexHome, + ...(context.sqliteHome ? { sqliteHome: context.sqliteHome } : {}), + provider: targetProvider, + keepCount, + sqliteBusyTimeoutMs: options.sqliteBusyTimeoutMs, + onProgress: options.onProgress, + model: targetModel, + platform: options.platform, + faultInjector: options.faultInjector, + signal: options.signal + }; + return planLedger.issue(operation, summary, { + codexHome: context.codexHome, + platform: options.platform, + actor: options.__actor === "watch" ? "watch" : "manual", + executionOptions, + expectedPlanState: { + profile: context.profile, + profileResolver: options.profileResolver, + revisions: context.revisions + }, + statusOptions: { + codexHome: context.codexHome, + ...(context.sqliteHome ? { sqliteHome: context.sqliteHome } : {}), + profileId: context.profile.id, + profileRevision: context.profile.suppliedRevision, + platform: options.platform + } + }); +} + +export async function prepareSync(options = {}) { + return issueSyncLikePlan("sync", options); +} + +export async function prepareSwitch(options = {}) { + if (!options.provider) { + throw new CoreError("INVALID_INPUT", "Missing provider id. Usage: codex-provider switch "); + } + const codexHome = options.storage?.codexHome ?? normalizeCodexHome(options.codexHome); + if (operationCoordinator.isActive(codexHome, options.platform)) { + throw new CoreError("OPERATION_BUSY", "Lock already exists for this Codex Home; another write operation is active.", { + details: { busyScope: "codex-home" } + }); + } + const configText = await readConfigText(path.join(codexHome, "config.toml")); + if (options.expectedConfigText !== undefined && configText !== options.expectedConfigText) { + throw new CoreError("PLAN_STALE", "config.toml changed after the operation was confirmed. Refresh and retry."); + } + const intent = buildSwitchIntent(configText, options.provider, options.model, Boolean(options.keepRootModel)); + return issueSyncLikePlan("switch", options, { + provider: options.provider, + modelForThreads: intent.modelForThreads, + modelSync: intent.modelSync, + modelMode: options.model !== undefined && options.model !== null + ? "explicit" + : (options.keepRootModel ? "keep-root-model" : "provider-default") + }); +} + +async function resolvePreparedBackup(options, codexHome) { + if (typeof options.backupId === "string" && options.backupId) { + const inventory = await listBackups(codexHome); + const selected = inventory.backups.find((backup) => backup.id === options.backupId); + if (!selected) { + throw new CoreError("RESTORE_VALIDATION_FAILED", "The selected managed backup is unavailable."); + } + return { backupId: selected.id, backupDir: selected.path, metadata: selected.metadata }; + } + if (typeof options.backupDir === "string" && options.backupDir) { + return { + backupId: path.basename(path.resolve(options.backupDir)), + backupDir: path.resolve(options.backupDir), + metadata: null + }; + } + throw new CoreError("INVALID_INPUT", "A managed backupId is required for Restore preparation."); +} + +export async function prepareRestore(options = {}) { + const restoreConfig = options.restoreConfig !== false; + const restoreDatabase = options.restoreDatabase !== false; + const restoreSessions = options.restoreSessions !== false; + if (options.allowSqliteHomeRelocation + && !(typeof options.sqliteHome === "string" && options.sqliteHome.trim())) { + throw new CoreError( + "INVALID_INPUT", + "--allow-sqlite-home-relocation requires an explicit --sqlite-home path." + ); + } + const codexHome = options.storage?.codexHome ?? normalizeCodexHome(options.codexHome); + if (operationCoordinator.isActive(codexHome, options.platform)) { + throw new CoreError("OPERATION_BUSY", "Lock already exists for this Codex Home; another write operation is active.", { + details: { busyScope: "codex-home" } + }); + } + const backup = await resolvePreparedBackup(options, codexHome); + const context = await preparePlanContext(options, "restore", { backupDir: backup.backupDir }); + if (restoreDatabase && !context.storage.stateDbLocation && isConfiguredSqliteHome(context.storage)) { + throw missingConfiguredStateDbError(context.storage); + } + if (restoreDatabase) { + await resolveRestoreStateDbTargetPath(backup.backupDir, context.storage); + } + const warnings = []; + if (options.allowSqliteHomeRelocation) { + warnings.push("SQLite Home relocation is explicit; config.toml will not be restored."); + } + const summary = { + profile: { id: context.profile.id, revision: context.profile.revision }, + storageRevision: context.revisions.storageRevision, + configRevision: context.revisions.configRevision, + rolloutRevision: context.revisions.rolloutRevision, + stateDbRevision: context.revisions.stateDbRevision, + backupRevision: context.revisions.backupRevision, + target: { + backupId: backup.backupId, + restoreConfig, + restoreDatabase, + restoreSessions, + allowSqliteHomeRelocation: Boolean(options.allowSqliteHomeRelocation) + }, + impact: { + rolloutFilesToChange: restoreSessions ? (backup.metadata?.changedSessionFiles ?? 0) : 0, + stateDbFilesToChange: restoreDatabase ? 1 : 0, + configFilesToChange: restoreConfig ? 1 : 0, + lockedRolloutFiles: context.revisions.lockedRolloutFiles, + backupExpected: false + }, + warnings + }; + return planLedger.issue("restore", summary, { + codexHome: context.codexHome, + platform: options.platform, + actor: "manual", + executionOptions: { + codexHome: context.codexHome, + ...(context.sqliteHome ? { sqliteHome: context.sqliteHome } : {}), + backupDir: backup.backupDir, + restoreConfig, + restoreDatabase, + restoreSessions, + allowSqliteHomeRelocation: Boolean(options.allowSqliteHomeRelocation), + platform: options.platform, + faultInjector: options.faultInjector + }, + expectedPlanState: { + profile: context.profile, + profileResolver: options.profileResolver, + revisions: context.revisions + }, + sourceBackup: { backupId: backup.backupId, backupDir: backup.backupDir }, + statusOptions: { + codexHome: context.codexHome, + ...(context.sqliteHome ? { sqliteHome: context.sqliteHome } : {}), + profileId: context.profile.id, + profileRevision: context.profile.suppliedRevision, + platform: options.platform + } + }); +} + +function operationWarnings(result) { + return [ + result?.encryptedContentWarning, + result?.autoPruneWarning, + result?.backupInventoryWarning, + result?.modelSync?.warning + ].filter((warning) => typeof warning === "string" && warning.trim()); +} + +function operationResult(operation, operationId, result, sourceBackup = null) { + const partial = Array.isArray(result?.skippedLockedRolloutFiles) + && result.skippedLockedRolloutFiles.length > 0; + const backupDir = result?.backupDir ?? sourceBackup?.backupDir ?? null; + return { + schemaVersion: 1, + operationId, + operation, + outcome: partial ? "partial" : "completed", + backup: backupDir + ? { + backupId: operation === "restore" ? sourceBackup?.backupId : path.basename(backupDir), + path: backupDir + } + : null, + warnings: operationWarnings(result), + result + }; +} + +async function applyPrepared(input, operation, execute) { + const entry = planLedger.consume(input, operation); + const internal = entry.internal; + const active = operationCoordinator.begin(internal.codexHome, operation, { + actor: internal.actor, + platform: internal.platform + }); + try { + const result = await execute({ + ...internal.executionOptions, + expectedPlanState: internal.expectedPlanState + }); + return operationResult(operation, active.operationId, result, internal.sourceBackup); + } finally { + operationCoordinator.end(internal.codexHome, active.operationId, internal.platform); + try { + await getStatus(internal.statusOptions); + } catch { + // Keep the last complete snapshot. A status refresh is observational and + // cannot change the transaction result or replace it with partial state. + } + } +} + +export async function applySync(input) { + return applyPrepared(input, "sync", (options) => runSyncCore(options)); +} + +export async function applySwitch(input) { + return applyPrepared(input, "switch", (options) => runSwitchCore(options)); +} + +export async function applyRestore(input) { + return applyPrepared(input, "restore", (options) => runRestoreCore(options)); +} + +// Internal scheduler hook used by Watch. It exposes completion only for a +// same-process manual operation; external writers remain event-driven and are +// never polled or queued behind. +export function waitForManualOperationEnd({ codexHome, platform } = {}) { + return operationCoordinator.waitForManualOperation( + normalizeCodexHome(codexHome), + platform ?? process.platform + ); +} + +/** @deprecated Compatibility adapter. New transports must use prepareSync/applySync. */ +export async function runSync(options = {}) { + const plan = await prepareSync(options); + return (await applySync({ schemaVersion: 1, planId: plan.planId })).result; +} + +/** @deprecated Compatibility adapter. New transports must use prepareSwitch/applySwitch. */ +export async function runSwitch(options = {}) { + const plan = await prepareSwitch(options); + return (await applySwitch({ schemaVersion: 1, planId: plan.planId })).result; +} + +/** @deprecated Compatibility adapter. New transports must use prepareRestore/applyRestore. */ +export async function runRestore(options = {}) { + const plan = await prepareRestore(options); + return (await applyRestore({ schemaVersion: 1, planId: plan.planId })).result; } export async function runPruneBackups({ @@ -1049,8 +1928,12 @@ export async function runPruneBackups({ await ensureCodexHome(resolveStorageLayout({ codexHome, env: {} })); const releaseLock = await acquireLock(codexHome, "prune-backups"); try { - return await pruneBackups(codexHome, keepCount); + return await pruneManagedBackups(codexHome, keepCount); } finally { await releaseLock(); } } + +export async function pruneBackups(options = {}) { + return runPruneBackups(options); +} diff --git a/src/state-db-lock.js b/src/state-db-lock.js new file mode 100644 index 0000000..bdaa34d --- /dev/null +++ b/src/state-db-lock.js @@ -0,0 +1,114 @@ +import { createHash } from "node:crypto"; +import fs from "node:fs/promises"; +import path from "node:path"; + +import { DB_FILE_BASENAME } from "./constants.js"; +import { CoreError } from "./core-error.js"; +import { acquirePathLock } from "./locking.js"; + +function unverifiable(message, cause) { + return new CoreError("LOCK_UNVERIFIABLE", message, { + cause, + details: { + lockScope: "state-db", + ...(typeof cause?.code === "string" ? { causeCode: cause.code } : {}) + } + }); +} + +function permissionDenied(message, cause) { + return new CoreError("PERMISSION_DENIED", message, { + cause, + details: { + lockScope: "state-db", + ...(typeof cause?.code === "string" ? { causeCode: cause.code } : {}) + } + }); +} + +function normalizeIdentityPart(value, platform) { + return platform === "win32" ? value.toLowerCase() : value; +} + +export async function resolveStateDbLockResource( + stateDbPath, + { fsImpl = fs, platform = process.platform } = {} +) { + if (typeof stateDbPath !== "string" || !stateDbPath.trim()) { + throw unverifiable("The State DB resource path is missing or invalid."); + } + const lexicalPath = path.resolve(stateDbPath); + if (path.basename(lexicalPath).toLowerCase() !== DB_FILE_BASENAME.toLowerCase()) { + throw unverifiable("The State DB resource filename is not canonical."); + } + const lexicalParent = path.dirname(lexicalPath); + let realParent; + try { + realParent = await fsImpl.realpath(lexicalParent); + const parentStats = await fsImpl.stat(realParent); + if (!parentStats.isDirectory()) { + throw unverifiable("The State DB physical parent is not a directory."); + } + const verifiedParent = await fsImpl.realpath(lexicalParent); + if (normalizeIdentityPart(realParent, platform) !== normalizeIdentityPart(verifiedParent, platform)) { + throw unverifiable("The State DB physical parent changed while its identity was resolved."); + } + } catch (error) { + if (error instanceof CoreError) throw error; + if (error?.code === "EACCES" || error?.code === "EPERM") { + throw permissionDenied("Permission denied while resolving the State DB resource identity.", error); + } + throw unverifiable("The State DB physical parent identity cannot be verified.", error); + } + + let physicalFileName = DB_FILE_BASENAME; + try { + const realFile = await fsImpl.realpath(lexicalPath); + physicalFileName = path.basename(realFile); + realParent = path.dirname(realFile); + const fileStats = await fsImpl.stat(realFile); + if (!fileStats.isFile()) throw unverifiable("The State DB target is not a regular file."); + if (physicalFileName.toLowerCase() !== DB_FILE_BASENAME.toLowerCase()) { + throw unverifiable("The State DB physical filename is not canonical."); + } + } catch (error) { + if (error instanceof CoreError) throw error; + if (error?.code !== "ENOENT") { + if (error?.code === "EACCES" || error?.code === "EPERM") { + throw permissionDenied("Permission denied while resolving the State DB physical target.", error); + } + throw unverifiable("The State DB physical target identity cannot be verified.", error); + } + } + + const normalizedParent = normalizeIdentityPart(path.resolve(realParent), platform); + const normalizedFileName = normalizeIdentityPart(physicalFileName, platform); + // NUL cannot occur in a filesystem path and therefore gives an unambiguous, + // cross-runtime identity serialization. + const identity = `${normalizedParent}\0${normalizedFileName}`; + const resourceKey = createHash("sha256").update(identity, "utf8").digest("hex"); + const lockPath = path.join( + path.resolve(realParent), + ".codex-provider-sync", + "locks", + `${resourceKey}.lock` + ); + return Object.freeze({ + identity, + resourceKey, + realDbParent: path.resolve(realParent), + stateDbPath: path.join(path.resolve(realParent), physicalFileName), + lockPath + }); +} + +export async function acquireStateDbLock(stateDbPath, label = "codex-provider-sync", options = {}) { + const resource = await resolveStateDbLockResource(stateDbPath, options); + const release = await acquirePathLock(resource.lockPath, label, { + ...options, + scope: "state-db", + resourceKey: resource.resourceKey + }); + return { resource, release }; +} + diff --git a/src/watch.js b/src/watch.js index 7539545..d7b719d 100644 --- a/src/watch.js +++ b/src/watch.js @@ -13,8 +13,10 @@ import fs from "node:fs"; import fsp from "node:fs/promises"; import path from "node:path"; +import { randomUUID } from "node:crypto"; import { CoreError } from "./core-error.js"; +import { sharedOperationCoordinator } from "./operation-coordinator.js"; import { detectStateDb } from "./sqlite-state.js"; import { readConfigText, readRootModelFromConfigText } from "./config-file.js"; import { @@ -26,6 +28,8 @@ import { withStateDbLocation } from "./storage-layout.js"; +const watchRegistry = new Map(); + function defaultDebounceMs() { return 750; } @@ -34,26 +38,6 @@ function describeEvent(eventType, filename) { return `${eventType ?? "change"}${filename ? `:${filename}` : ""}`; } -function makeDebouncer(delayMs, run) { - let timer = null; - let pending = null; - - const fire = () => { - timer = null; - const args = pending; - pending = null; - run(...args); - }; - - return function schedule(...args) { - pending = args; - if (timer) { - clearTimeout(timer); - } - timer = setTimeout(fire, delayMs); - }; -} - /** @deprecated Compatibility adapter. New transports must use startWatch/stopWatch/getWatchStatus once available. */ export async function runWatch({ codexHome: explicitCodexHome, @@ -68,6 +52,7 @@ export async function runWatch({ signal, sleepImpl, platform, + manualOperationWaiter, accessImpl = fsp.access } = {}) { if (!Number.isInteger(debounceMs) || debounceMs < 0) { @@ -123,7 +108,7 @@ export async function runWatch({ return withStateDbLocation(layout, await detectStateDb(layout)); }; - const invokeSync = async (reason, storage) => { + const invokeSync = async (reason, reasons, storage) => { // Read the current root-level model on every fire so the per-thread // model rewrite picks up the latest value the user has in config.toml. // We only consider the top-level (root) `model = "..."` line — anything @@ -138,23 +123,38 @@ export async function runWatch({ // Missing/unreadable config; carry on with a null model. } if (typeof onSync === "function") { - return onSync({ reason, codexHome, sqliteHome: storage.sqliteHome, storage, model: rootModel }); + return onSync({ reason, reasons, codexHome, sqliteHome: storage.sqliteHome, storage, model: rootModel }); } if (typeof runSyncImpl === "function") { - return runSyncImpl({ codexHome, sqliteHome: storage.sqliteHome, storage, reason, model: rootModel }); + return runSyncImpl({ codexHome, sqliteHome: storage.sqliteHome, storage, reason, reasons, model: rootModel }); } // Lazy import to avoid pulling in the public Core boundary until needed. - const { runSync } = await import("./public-api.js"); - return runSync({ + const { prepareSync, applySync } = await import("./public-api.js"); + const plan = await prepareSync({ codexHome, storage, model: rootModel, + __actor: "watch", onProgress: (event) => { if (event?.stage && event.status === "start") { log(` · ${event.stage}`); } } }); + // Yield one event-loop turn after the read-only plan so an already queued + // user confirmation can declare the manual Apply first. + await new Promise((resolve) => setImmediate(resolve)); + return (await applySync({ schemaVersion: 1, planId: plan.planId })).result; + }; + + const getManualOperationWait = async () => { + if (typeof manualOperationWaiter === "function") { + return manualOperationWaiter({ codexHome, platform }); + } + return sharedOperationCoordinator.waitForManualOperation( + codexHome, + platform ?? process.platform + ); }; let stopped = false; @@ -163,6 +163,11 @@ export async function runWatch({ let stateWatchGeneration = 0; let stateDbInfo = null; let activeStorage = null; + let debounceTimer = null; + const pendingReasons = new Set(); + let rerunRequested = false; + let busyWaitTicket = null; + let waitingForExternalChange = false; // Track the currently-running sync (if any) so that stop()/SIGINT can // wait for it to drain instead of yanking the watcher out from under // a half-written SQLite transaction. @@ -189,15 +194,35 @@ export async function runWatch({ resolveDone = resolve; }); - const debouncedSync = makeDebouncer(debounceMs, (reason) => { + const scheduleSync = (reason) => { if (stopped) { return; } + pendingReasons.add(reason); + if (busyWaitTicket) return; + waitingForExternalChange = false; + if (debounceTimer) clearTimeout(debounceTimer); + debounceTimer = setTimeout(() => { + debounceTimer = null; + void launchPendingSync(); + }, debounceMs); + }; + + const launchPendingSync = () => { + if (stopped || pendingReasons.size === 0) return; + if (inFlight) { + rerunRequested = true; + return; + } + const reasons = [...pendingReasons].sort(); + pendingReasons.clear(); + rerunRequested = false; + const reason = reasons.includes("config.toml") ? "config.toml" : reasons[0]; log(`[${new Date().toISOString()}] Detected change (${reason}); running sync...`); const task = (async () => { try { const nextStorage = await resolveCurrentStorage(); - if (includeStateDb && reason === "config.toml") { + if (includeStateDb && reasons.includes("config.toml")) { await rebindStateWatchers(nextStorage); } else { activeStorage = nextStorage; @@ -207,7 +232,7 @@ export async function runWatch({ consecutiveNonBusyFailures = 0; return; } - const result = await invokeSync(reason, nextStorage); + const result = await invokeSync(reason, reasons, nextStorage); log(`[${new Date().toISOString()}] Sync complete: provider=${result.targetProvider}, rollout_files=${result.changedSessionFiles}, sqlite_rows=${result.sqliteRowsUpdated}${result.skippedLockedRolloutFiles?.length ? `, skipped_locked=${result.skippedLockedRolloutFiles.length}` : ""}`); // A successful sync resets the consecutive-failure counter // so a transient error followed by recovery does not @@ -221,9 +246,39 @@ export async function runWatch({ // SQLite being in use is a normal transient condition while Codex // is actively writing. Don't crash; just retry on the next event. const isTypedSqliteBusy = error?.code === "SQLITE_BUSY"; + const isOperationBusy = error?.code === "OPERATION_BUSY"; + const isLockUnverifiable = error?.code === "LOCK_UNVERIFIABLE"; const isLegacySqliteBusy = !error?.code && /state_5\.sqlite is currently in use/i.test(message); - if (isTypedSqliteBusy || isLegacySqliteBusy) { - log(`[${new Date().toISOString()}] Sync skipped: ${message} (will retry on next change)`); + if (isTypedSqliteBusy || isLegacySqliteBusy || isOperationBusy || isLockUnverifiable) { + const disposition = isOperationBusy + ? "yielded to an active manual operation" + : (isLockUnverifiable ? "lock ownership could not be verified" : "SQLite is busy"); + log(`[${new Date().toISOString()}] Sync skipped: ${message} (${disposition}; will retry on the next change)`); + for (const retainedReason of reasons) pendingReasons.add(retainedReason); + if (isOperationBusy) { + const ticket = await getManualOperationWait(); + if (ticket?.promise && typeof ticket.promise.then === "function") { + busyWaitTicket = ticket; + void ticket.promise.then(() => { + if (busyWaitTicket !== ticket) return; + busyWaitTicket = null; + if (stopped || pendingReasons.size === 0 || debounceTimer) return; + debounceTimer = setTimeout(() => { + debounceTimer = null; + void launchPendingSync(); + }, debounceMs); + }).catch(() => { + if (busyWaitTicket === ticket) { + busyWaitTicket = null; + waitingForExternalChange = true; + } + }); + } else { + waitingForExternalChange = true; + } + } else { + waitingForExternalChange = true; + } // Busy is normal — reset the consecutive-failure counter // so a long-running Codex session that keeps the DB open // for many seconds does not push us toward the auto-shutdown @@ -250,10 +305,21 @@ export async function runWatch({ if (inFlight === task) { inFlight = null; } + if (!stopped + && !busyWaitTicket + && !waitingForExternalChange + && (rerunRequested || pendingReasons.size > 0) + && !debounceTimer) { + rerunRequested = false; + debounceTimer = setTimeout(() => { + debounceTimer = null; + void launchPendingSync(); + }, debounceMs); + } } })(); inFlight = task; - }); + }; const initialStorage = await resolveCurrentStorage(); @@ -262,7 +328,7 @@ export async function runWatch({ return; } log(`[${new Date().toISOString()}] config.toml ${describeEvent(eventType, filename)}`); - debouncedSync("config.toml"); + scheduleSync("config.toml"); }); watchers.push(configWatcher); @@ -283,6 +349,15 @@ export async function runWatch({ return; } stopped = true; + pendingReasons.clear(); + rerunRequested = false; + waitingForExternalChange = false; + busyWaitTicket?.cancel?.(); + busyWaitTicket = null; + if (debounceTimer) { + clearTimeout(debounceTimer); + debounceTimer = null; + } stateWatchGeneration += 1; for (const watcher of watchers) { try { @@ -413,7 +488,7 @@ export async function runWatch({ // re-opened. Either way a sync should run. void filename; log(`[${new Date().toISOString()}] ${reasonLabel} change${filename ? `:${filename}` : ""}`); - debouncedSync(reasonLabel); + scheduleSync(reasonLabel); }); } catch (error) { // Path may have gone away. Wait a moment and try again; @@ -444,3 +519,70 @@ export async function runWatch({ done: donePromise }; } + +function watchSnapshot(entry) { + return { + schemaVersion: 1, + watchId: entry.watchId, + status: entry.status, + startedAt: entry.startedAt, + stoppedAt: entry.stoppedAt, + stopReason: entry.stopReason, + includeStateDb: entry.includeStateDb, + once: entry.once + }; +} + +export async function startWatch(options = {}) { + const handle = await runWatch(options); + const entry = { + watchId: randomUUID(), + status: "running", + startedAt: new Date().toISOString(), + stoppedAt: null, + stopReason: null, + includeStateDb: options.includeStateDb !== false, + once: Boolean(options.once), + handle + }; + watchRegistry.set(entry.watchId, entry); + void handle.done.then((reason) => { + entry.status = "stopped"; + entry.stoppedAt = new Date().toISOString(); + entry.stopReason = typeof reason === "string" ? reason : "unknown"; + }); + return watchSnapshot(entry); +} + +function requireWatchEntry(input) { + if (!input || typeof input !== "object" || Array.isArray(input) + || Object.keys(input).length !== 1 || typeof input.watchId !== "string") { + throw new CoreError("INVALID_INPUT", "Expected exactly { watchId } for this Watch operation."); + } + const entry = watchRegistry.get(input.watchId); + if (!entry) { + throw new CoreError("INVALID_INPUT", "The requested Watch operation is unavailable."); + } + return entry; +} + +export async function stopWatch(input) { + const entry = requireWatchEntry(input); + if (entry.status === "running") { + entry.status = "stopping"; + await entry.handle.stop(); + } else if (entry.status === "stopping") { + await entry.handle.done; + } + return watchSnapshot(entry); +} + +export function getWatchStatus(input = null) { + if (input === null || input === undefined) { + return { + schemaVersion: 1, + watches: [...watchRegistry.values()].map(watchSnapshot) + }; + } + return watchSnapshot(requireWatchEntry(input)); +} diff --git a/src/web-server.js b/src/web-server.js index 3e793e1..6b2cdcd 100644 --- a/src/web-server.js +++ b/src/web-server.js @@ -7,22 +7,22 @@ import { fileURLToPath } from "node:url"; import { defaultCodexHome } from "./constants.js"; import { + applyRestore, + applySwitch, + applySync, CoreError, - detectStateDb, - ensureCodexHome, getHistorySession, getStatus, listBackups, listHistory, + prepareRestore, + prepareSwitch, + prepareSync, readConfigText, readRootModelFromConfigText, resolveStorageLayout, runPruneBackups, - runRestore, - runSwitch, - runSync, toCoreErrorDto, - withStateDbLocation } from "./public-api.js"; import { createMemoryWebUiState, ProfileRevisionConflictError, WebUiStateStore } from "./web-state.js"; @@ -72,6 +72,17 @@ function sendError(response, statusCode, error, code) { }); } +function coreErrorHttpStatus(error, fallback) { + if (!(error instanceof CoreError)) return fallback; + if (error.code === "INVALID_INPUT" + || error.code === "RESTORE_VALIDATION_FAILED" + || error.code === "SQLITE_UNSUPPORTED_PATH") return 400; + if (error.code === "PLAN_EXPIRED" || error.code === "STALE_STATE" + || error.code === "OPERATION_BUSY" || error.code === "LOCK_UNVERIFIABLE" + || error.code === "RECOVERY_REQUIRED") return 409; + return fallback; +} + async function readJsonBody(request) { const chunks = []; let received = 0; @@ -175,35 +186,6 @@ function captureStorageProfile(input, stateStore, response) { return Object.freeze(snapshot); } -function comparableStoragePath(value, platform) { - if (typeof value !== "string") return null; - return platform === "win32" ? value.toLowerCase() : value; -} - -function storageRevision(profile, storage, configText, platform) { - const canonical = JSON.stringify({ - version: 2, - profileId: profile.profileId ?? profile.id, - profileRevision: profile.profileRevision ?? profile.revision, - configRevision: crypto.createHash("sha256").update(configText, "utf8").digest("base64url"), - codexHome: comparableStoragePath(storage.codexHome, platform), - sqliteHome: comparableStoragePath(storage.sqliteHome, platform), - sqliteHomeSource: storage.sqliteHomeSource, - sqliteAccess: { - supported: storage.sqliteAccess?.supported !== false, - reason: storage.sqliteAccess?.reason ?? null - }, - allowLegacyRootFallback: Boolean(storage.allowLegacyRootFallback), - stateDbLocation: storage.stateDbLocation - ? { - path: comparableStoragePath(storage.stateDbLocation.path, platform), - source: storage.stateDbLocation.source - } - : null - }); - return crypto.createHash("sha256").update(canonical, "utf8").digest("base64url"); -} - function serializeStatus(status) { const rollout = status.rolloutCounts ?? { sessions: {}, archived_sessions: {} }; const sqlite = status.sqliteCounts; @@ -212,12 +194,15 @@ function serializeStatus(status) { Object.entries(distribution?.[scope] ?? {}).every(([provider, count]) => count === 0 || provider === targetProvider) )); const sqliteReadable = Boolean(sqlite && !sqlite.unreadable); - const rolloutScanComplete = !status.lockedRolloutFiles?.length; + const rolloutScanComplete = status.rolloutScanComplete !== false + && !status.lockedRolloutFiles?.length; return { ...status, alignment: { aligned: Boolean( targetProvider + && !status.operationInProgress + && !status.statusReadBlocked && sqliteReadable && rolloutScanComplete && matchesTargetProvider(rollout) @@ -432,11 +417,14 @@ export function createWebUiServer({ environment = process.env } = {}) { const api = { + applyRestore: services.applyRestore ?? applyRestore, + applySwitch: services.applySwitch ?? applySwitch, + applySync: services.applySync ?? applySync, getStatus: services.getStatus ?? getStatus, listBackups: services.listBackups ?? listBackups, - runSync: services.runSync ?? runSync, - runSwitch: services.runSwitch ?? runSwitch, - runRestore: services.runRestore ?? runRestore, + prepareRestore: services.prepareRestore ?? prepareRestore, + prepareSwitch: services.prepareSwitch ?? prepareSwitch, + prepareSync: services.prepareSync ?? prepareSync, runPruneBackups: services.runPruneBackups ?? runPruneBackups, readConfigText: services.readConfigText ?? readConfigText, readRootModelFromConfigText: services.readRootModelFromConfigText ?? readRootModelFromConfigText, @@ -492,83 +480,55 @@ export function createWebUiServer({ record("info", `${kind} started`); try { const result = await operation(); - const outcome = Array.isArray(result?.skippedLockedRolloutFiles) && result.skippedLockedRolloutFiles.length > 0 - ? "partial" - : "success"; + const outcome = typeof result?.outcome === "string" + ? result.outcome + : (Array.isArray(result?.skippedLockedRolloutFiles) && result.skippedLockedRolloutFiles.length > 0 + ? "partial" + : "success"); record(outcome === "partial" ? "warning" : "success", `${kind} completed`); sendJson(response, 200, { result: { ...result, outcome } }); } catch (error) { record("error", `${kind} failed`, error instanceof Error ? error.message : String(error)); - sendError(response, 400, error); + sendError(response, coreErrorHttpStatus(error, 400), error); } finally { activeOperation = null; } }; - const resolveOperationStorage = async (profile) => { - let configText = ""; - try { - configText = await api.readConfigText(path.join(profile.codexHome, "config.toml")); - } catch (error) { - if (error?.code !== "ENOENT") throw error; - } - const layout = resolveStorageLayout({ - codexHome: profile.codexHome, - sqliteHome: profile.sqliteHome, - configText, - env: environment, - platform - }); - await ensureCodexHome(layout); - const storage = layout.sqliteAccess.supported === false - ? withStateDbLocation(layout, null) - : withStateDbLocation(layout, await detectStateDb(layout)); - return { configText, storage }; - }; - - const captureOperationStorage = async (input, response) => { + const capturePrepareProfile = (input, response) => { if (Object.hasOwn(input ?? {}, "codexHome") || Object.hasOwn(input ?? {}, "sqliteHome")) { throw new Error("Storage paths must be selected through a server-managed profileId."); } const profileId = requireString(input?.profileId ?? "default", "profileId", { maxLength: 80 }); const profile = captureProfileRevision(profileId, input?.profileRevision, stateStore, response); if (!profile) return null; - if (typeof input?.storageRevision !== "string" || !input.storageRevision) { - sendJson(response, 409, { - error: "This operation requires the confirmed SQLite storage revision. Refresh and confirm again.", - code: "STORAGE_REVISION_REQUIRED", - profile - }); - return null; - } - const prepared = await resolveOperationStorage(profile); - if (input.storageRevision !== storageRevision(profile, prepared.storage, prepared.configText, platform)) { - sendJson(response, 409, { - error: "The configuration or effective SQLite storage changed after this operation was prepared. Refresh and confirm again.", - code: "STORAGE_CHANGED", - profile - }); - return null; - } + return Object.freeze({ + id: profile.id, + revision: profile.revision, + codexHome: profile.codexHome, + ...(profile.sqliteHome ? { sqliteHome: profile.sqliteHome } : {}) + }); + }; + + const resolveCurrentProfile = async (profileId) => { + const profile = stateStore.getProfile(profileId); return { - profile: Object.freeze({ - profileId: profile.id, - codexHome: profile.codexHome, - ...(profile.sqliteHome ? { sqliteHome: profile.sqliteHome } : {}) - }), - ...prepared + id: profile.id, + revision: profile.revision, + codexHome: profile.codexHome, + ...(profile.sqliteHome ? { sqliteHome: profile.sqliteHome } : {}) }; }; - const assertWebOperationStorage = (storage, operation) => { - if (storage.sqliteAccess.supported === false) { - throw new CoreError( - "SQLITE_UNSUPPORTED_PATH", - `Cannot ${operation}: ${storage.sqliteAccess.message}`, - { details: storage.sqliteAccess.reason ? { reason: storage.sqliteAccess.reason } : undefined } - ); + const requirePlanApply = (input) => { + if (!input || typeof input !== "object" || Array.isArray(input) + || Object.keys(input).sort().join(",") !== "planId,schemaVersion" + || input.schemaVersion !== 1 + || typeof input.planId !== "string" + || !input.planId) { + throw new CoreError("INVALID_INPUT", "Apply accepts exactly { schemaVersion: 1, planId }."); } - return storage; + return { schemaVersion: 1, planId: input.planId }; }; const server = http.createServer(async (request, response) => { @@ -722,16 +682,7 @@ export function createWebUiServer({ if (pathname === "/api/status") { const profile = resolveStorageProfile(body, stateStore); - const prepared = await resolveOperationStorage(profile); - const status = serializeStatus(await api.getStatus({ - ...profile, - storage: prepared.storage, - configText: prepared.configText - })); - status.pathComparisonCaseInsensitive = platform === "win32"; - status.profileId = profile.profileId; - status.profileRevision = profile.profileRevision; - status.storageRevision = storageRevision(profile, prepared.storage, prepared.configText, platform); + const status = serializeStatus(await api.getStatus({ ...profile, platform })); record("info", "Status refreshed", status.codexHome, null); sendJson(response, 200, { status }); return; @@ -758,80 +709,102 @@ export function createWebUiServer({ return; } - if (pathname === "/api/sync") { - const operationStorage = await captureOperationStorage(body, response); - if (!operationStorage) return; - await withOperation("sync", response, async () => { - assertWebOperationStorage(operationStorage.storage, "sync"); - const provider = requireProvider(body.provider); - const keepCount = requireKeepCount(body.keepCount); - const model = api.readRootModelFromConfigText(operationStorage.configText); - return api.runSync({ - ...operationStorage.profile, - storage: operationStorage.storage, - expectedConfigText: operationStorage.configText, - provider, - keepCount, - model, - onProgress: (event) => record("progress", stageMessage(event), event) - }); + if (pathname === "/api/sync/prepare") { + const profile = capturePrepareProfile(body, response); + if (!profile) return; + const configText = await api.readConfigText(path.join(profile.codexHome, "config.toml")); + const plan = await api.prepareSync({ + codexHome: profile.codexHome, + ...(profile.sqliteHome ? { sqliteHome: profile.sqliteHome } : {}), + profile: { id: profile.id, revision: profile.revision }, + profileResolver: resolveCurrentProfile, + provider: requireProvider(body.provider), + model: api.readRootModelFromConfigText(configText), + keepCount: requireKeepCount(body.keepCount), + platform }); + sendJson(response, 200, { plan }); return; } - if (pathname === "/api/switch") { - const operationStorage = await captureOperationStorage(body, response); - if (!operationStorage) return; - await withOperation("switch", response, async () => { - assertWebOperationStorage(operationStorage.storage, "switch"); - const provider = requireProvider(body.provider); - const keepCount = requireKeepCount(body.keepCount); - const model = requireString(body.model, "model", { optional: true, maxLength: 500 }); - return api.runSwitch({ - ...operationStorage.profile, - storage: operationStorage.storage, - expectedConfigText: operationStorage.configText, - provider, - keepCount, - model, - keepRootModel: Boolean(body.keepRootModel), - onProgress: (event) => record("progress", stageMessage(event), event) - }); + if (pathname === "/api/sync/apply") { + await withOperation("sync", response, () => api.applySync(requirePlanApply(body))); + return; + } + + if (pathname === "/api/switch/prepare") { + const profile = capturePrepareProfile(body, response); + if (!profile) return; + const modelMode = body.modelMode ?? (body.keepRootModel ? "keep-root-model" : (body.model ? "explicit" : "provider-default")); + if (!["provider-default", "keep-root-model", "explicit"].includes(modelMode)) { + throw new CoreError("INVALID_INPUT", "modelMode must be provider-default, keep-root-model, or explicit."); + } + const model = modelMode === "explicit" + ? requireString(body.model, "model", { maxLength: 500 }) + : undefined; + if (modelMode !== "explicit" && body.model !== undefined && body.model !== null && body.model !== "") { + throw new CoreError("INVALID_INPUT", "model is only accepted when modelMode is explicit."); + } + const plan = await api.prepareSwitch({ + codexHome: profile.codexHome, + ...(profile.sqliteHome ? { sqliteHome: profile.sqliteHome } : {}), + profile: { id: profile.id, revision: profile.revision }, + profileResolver: resolveCurrentProfile, + provider: requireProvider(body.provider), + model, + keepRootModel: modelMode === "keep-root-model", + keepCount: requireKeepCount(body.keepCount), + platform }); + sendJson(response, 200, { plan }); return; } - if (pathname === "/api/restore") { - const operationStorage = await captureOperationStorage(body, response); - if (!operationStorage) return; - await withOperation("restore", response, async () => { - assertWebOperationStorage(operationStorage.storage, "restore"); - const backupId = requireString(body.backupId, "backupId", { maxLength: 300 }); - const listed = await api.listBackups(operationStorage.profile.codexHome); - const backup = listed.backups.find((entry) => entry.id === backupId); - if (!backup) { - throw new Error("The selected backup is not a managed backup for this Codex Home."); - } - const restoreConfig = Boolean(body.restoreConfig); - const restoreDatabase = Boolean(body.restoreDatabase); - const restoreSessions = Boolean(body.restoreSessions); - if (!restoreConfig && !restoreDatabase && !restoreSessions) { - throw new Error("Select at least one backup content type to restore."); - } - if (body.allowSqliteHomeRelocation && !operationStorage.profile.sqliteHome) { - throw new Error("SQLite Home relocation requires a storage profile with an explicit SQLite Home target."); - } - return api.runRestore({ - ...operationStorage.profile, - storage: operationStorage.storage, - expectedConfigText: operationStorage.configText, - backupDir: backup.path, - restoreConfig, - restoreDatabase, - restoreSessions, - allowSqliteHomeRelocation: Boolean(body.allowSqliteHomeRelocation) - }); + if (pathname === "/api/switch/apply") { + await withOperation("switch", response, () => api.applySwitch(requirePlanApply(body))); + return; + } + + if (pathname === "/api/restore/prepare") { + const profile = capturePrepareProfile(body, response); + if (!profile) return; + const restoreConfig = Boolean(body.restoreConfig); + const restoreDatabase = Boolean(body.restoreDatabase); + const restoreSessions = Boolean(body.restoreSessions); + if (!restoreConfig && !restoreDatabase && !restoreSessions) { + throw new CoreError("INVALID_INPUT", "Select at least one backup content type to restore."); + } + if (body.allowSqliteHomeRelocation && !profile.sqliteHome) { + throw new CoreError("INVALID_INPUT", "SQLite Home relocation requires a storage profile with an explicit SQLite Home target."); + } + const plan = await api.prepareRestore({ + codexHome: profile.codexHome, + ...(profile.sqliteHome ? { sqliteHome: profile.sqliteHome } : {}), + profile: { id: profile.id, revision: profile.revision }, + profileResolver: resolveCurrentProfile, + backupId: requireString(body.backupId, "backupId", { maxLength: 300 }), + restoreConfig, + restoreDatabase, + restoreSessions, + allowSqliteHomeRelocation: Boolean(body.allowSqliteHomeRelocation), + platform }); + sendJson(response, 200, { plan }); + return; + } + + if (pathname === "/api/restore/apply") { + await withOperation("restore", response, () => api.applyRestore(requirePlanApply(body))); + return; + } + + if (pathname === "/api/sync" || pathname === "/api/switch" || pathname === "/api/restore") { + sendError( + response, + 410, + `Direct write endpoint ${pathname} is retired. Use ${pathname}/prepare, show the returned plan, then submit only { schemaVersion, planId } to ${pathname}/apply.`, + "PLAN_REQUIRED" + ); return; } @@ -854,7 +827,7 @@ export function createWebUiServer({ } await serveStatic(response, pathname, webRoot); } catch (error) { - sendError(response, 500, error); + sendError(response, coreErrorHttpStatus(error, 500), error); } }); diff --git a/test/diagnostics.test.js b/test/diagnostics.test.js new file mode 100644 index 0000000..6f7274a --- /dev/null +++ b/test/diagnostics.test.js @@ -0,0 +1,56 @@ +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; + +import { getDiagnostics } from "../src/diagnostics.js"; +import { openDatabase } from "../src/sqlite.js"; + +test("getDiagnostics reports bounded safety metadata without credentials or message bodies", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-diagnostics-")); + const codexHome = path.join(root, ".codex"); + const rolloutPath = path.join(codexHome, "sessions", "2026", "08", "25", "rollout.jsonl"); + const secret = "credential-and-message-secret-fixture"; + try { + await fs.mkdir(path.dirname(rolloutPath), { recursive: true }); + await fs.mkdir(path.join(codexHome, "archived_sessions"), { recursive: true }); + await fs.mkdir(path.join(codexHome, "sqlite"), { recursive: true }); + await fs.writeFile(path.join(codexHome, "config.toml"), 'model_provider = "openai"\n', "utf8"); + await fs.writeFile(path.join(codexHome, "auth.json"), JSON.stringify({ token: secret }), "utf8"); + const database = await openDatabase(path.join(codexHome, "sqlite", "state_5.sqlite")); + try { + database.exec(` + CREATE TABLE threads ( + id TEXT PRIMARY KEY, + model_provider TEXT, + cwd TEXT NOT NULL DEFAULT '', + archived INTEGER NOT NULL DEFAULT 0, + first_user_message TEXT NOT NULL DEFAULT '', + model TEXT + ) + `); + database.prepare("INSERT INTO threads (id, model_provider, cwd, archived, first_user_message) VALUES (?, ?, ?, ?, ?)") + .run("thread-a", "openai", "C:\\AITemp", 0, "redacted"); + } finally { + database.close(); + } + await fs.writeFile(rolloutPath, [ + JSON.stringify({ + timestamp: "2026-08-25T00:00:00.000Z", + type: "session_meta", + payload: { id: "thread-a", model_provider: "openai", cwd: "C:\\AITemp" } + }), + JSON.stringify({ type: "event_msg", payload: { type: "user_message", message: secret } }) + ].join("\n") + "\n", "utf8"); + + const diagnostics = await getDiagnostics({ codexHome }); + const serialized = JSON.stringify(diagnostics); + assert.equal(diagnostics.schemaVersion, 1); + assert.equal(diagnostics.safety.lockedRolloutCount, 0); + assert.doesNotMatch(serialized, new RegExp(secret)); + assert.doesNotMatch(serialized, /auth\.json|token/i); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } +}); diff --git a/test/locking.test.js b/test/locking.test.js index 7e4c15c..eab3b92 100644 --- a/test/locking.test.js +++ b/test/locking.test.js @@ -256,11 +256,12 @@ test("link failure does not remove a swapped empty reservation and still release test("acquirePathLock supports an arbitrary future SQLite resource path", async (t) => { const root = await makeLockHome(t); const lockPath = path.join(root, "resource-locks", "state-db.lock"); - const resourceOptions = lockOptions({ scope: "state-db" }); + const resourceOptions = lockOptions({ scope: "state-db", resourceKey: "a".repeat(64) }); const release = await acquirePathLock(lockPath, "sqlite-resource", resourceOptions); const owner = JSON.parse(await fs.readFile(path.join(lockPath, "owner.json"), "utf8")); assert.equal(owner.label, "sqlite-resource"); assert.equal(owner.scope, "state-db"); + assert.equal(owner.resourceKey, "a".repeat(64)); assert.deepEqual(await fs.readdir(`${lockPath}.claims`), [`${owner.instanceId}.json`]); await assert.rejects( acquirePathLock(lockPath, "sqlite-resource-2", resourceOptions), @@ -278,7 +279,10 @@ test("acquirePathLock rejects a canonical file with an explicit diagnostic", asy await fs.writeFile(lockPath, "foreign", "utf8"); await assert.rejects( - acquirePathLock(lockPath, "sqlite-resource", lockOptions({ scope: "state-db" })), + acquirePathLock(lockPath, "sqlite-resource", lockOptions({ + scope: "state-db", + resourceKey: "b".repeat(64) + })), (error) => error?.code === "LOCK_UNVERIFIABLE" && error.details?.lockScope === "state-db" && /canonical lock path is not a directory/.test(error.message) diff --git a/test/operation-revision.test.js b/test/operation-revision.test.js new file mode 100644 index 0000000..a82972a --- /dev/null +++ b/test/operation-revision.test.js @@ -0,0 +1,88 @@ +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; + +import { + captureBackupRevision, + captureConfigRevision, + captureOperationRevisions, + captureRolloutRevision, + captureStateDbRevision, + revisionMismatch +} from "../src/operation-revision.js"; + +async function fixture() { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-revision-")); + const codexHome = path.join(root, ".codex"); + const sqliteHome = path.join(codexHome, "sqlite"); + const stateDbPath = path.join(sqliteHome, "state_5.sqlite"); + const rolloutPath = path.join(codexHome, "sessions", "2026", "08", "rollout-a.jsonl"); + await fs.mkdir(path.dirname(rolloutPath), { recursive: true }); + await fs.mkdir(sqliteHome, { recursive: true }); + await fs.writeFile(rolloutPath, '{"type":"session_meta"}\n', "utf8"); + await fs.writeFile(stateDbPath, "db-one", "utf8"); + const storage = { + codexHome, + sqliteHome, + sqliteHomeSource: "default", + sqliteAccess: { supported: true, reason: null }, + allowLegacyRootFallback: true, + stateDbLocation: { path: stateDbPath, source: "sqlite-dir" } + }; + return { root, codexHome, rolloutPath, stateDbPath, storage }; +} + +test("operation revisions detect exact config, rollout, and State DB drift", async () => { + const value = await fixture(); + try { + const first = await captureOperationRevisions({ + codexHome: value.codexHome, + profileRevision: "profile-r1", + configText: 'model_provider = "openai"\n', + storage: value.storage + }); + assert.equal(first.rolloutScanComplete, true); + assert.equal(first.rolloutFileCount, 1); + + await fs.writeFile(value.rolloutPath, '{"type":"session_meta","changed":true}\n', "utf8"); + const rolloutChanged = await captureOperationRevisions({ + codexHome: value.codexHome, + profileRevision: "profile-r1", + configText: 'model_provider = "openai"\n', + storage: value.storage + }); + assert.equal(revisionMismatch(first, rolloutChanged), "rollout"); + + const configChanged = { ...first, configRevision: captureConfigRevision("changed") }; + assert.equal(revisionMismatch(first, configChanged), "config"); + + const dbBefore = await captureStateDbRevision(value.storage); + await fs.writeFile(value.stateDbPath, "db-two", "utf8"); + const dbAfter = await captureStateDbRevision(value.storage); + assert.notEqual(dbAfter, dbBefore); + } finally { + await fs.rm(value.root, { recursive: true, force: true }); + } +}); + +test("rollout and managed backup revisions are deterministic and content-bound", async () => { + const value = await fixture(); + const backupDir = path.join(value.codexHome, "backups_state", "provider-sync", "fixture"); + try { + const rolloutOne = await captureRolloutRevision(value.codexHome); + const rolloutTwo = await captureRolloutRevision(value.codexHome); + assert.deepEqual(rolloutTwo, rolloutOne); + + await fs.mkdir(backupDir, { recursive: true }); + await fs.writeFile(path.join(backupDir, "metadata.json"), '{"namespace":"provider-sync"}', "utf8"); + const backupOne = await captureBackupRevision(backupDir); + await fs.writeFile(path.join(backupDir, "metadata.json"), '{"namespace":"provider-sync","changed":true}', "utf8"); + const backupTwo = await captureBackupRevision(backupDir); + assert.notEqual(backupTwo, backupOne); + } finally { + await fs.rm(value.root, { recursive: true, force: true }); + } +}); + diff --git a/test/plan-apply.test.js b/test/plan-apply.test.js new file mode 100644 index 0000000..3028561 --- /dev/null +++ b/test/plan-apply.test.js @@ -0,0 +1,412 @@ +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; + +import { + applyRestore, + applySwitch, + applySync, + getStatus, + prepareRestore, + prepareSwitch, + prepareSync +} from "../src/service.js"; +import { listBackups } from "../src/backup.js"; +import { openDatabase } from "../src/sqlite.js"; + +async function makeFixture() { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-plan-apply-")); + const codexHome = path.join(root, ".codex"); + const rolloutPath = path.join(codexHome, "sessions", "2026", "08", "25", "rollout-a.jsonl"); + const stateDbPath = path.join(codexHome, "sqlite", "state_5.sqlite"); + await fs.mkdir(path.dirname(rolloutPath), { recursive: true }); + await fs.mkdir(path.join(codexHome, "archived_sessions"), { recursive: true }); + await fs.mkdir(path.dirname(stateDbPath), { recursive: true }); + await fs.writeFile( + path.join(codexHome, "config.toml"), + 'model_provider = "openai"\nmodel = "gpt-5"\n', + "utf8" + ); + const meta = { + id: "thread-a", + timestamp: "2026-08-25T00:00:00.000Z", + cwd: "C:\\AITemp", + source: "cli", + cli_version: "0.115.0", + model_provider: "custom" + }; + await fs.writeFile( + rolloutPath, + `${JSON.stringify({ timestamp: meta.timestamp, type: "session_meta", payload: meta })}\n`, + "utf8" + ); + const db = await openDatabase(stateDbPath); + try { + db.exec(` + CREATE TABLE threads ( + id TEXT PRIMARY KEY, + model_provider TEXT, + cwd TEXT NOT NULL DEFAULT '', + archived INTEGER NOT NULL DEFAULT 0, + first_user_message TEXT NOT NULL DEFAULT '', + model TEXT + ) + `); + db.prepare("INSERT INTO threads (id, model_provider, cwd, archived, first_user_message, model) VALUES (?, ?, ?, ?, ?, ?)") + .run("thread-a", "custom", "C:\\AITemp", 0, "hello", "old-model"); + } finally { + db.close(); + } + return { root, codexHome, rolloutPath, stateDbPath }; +} + +function backupRoot(codexHome) { + return path.join(codexHome, "backups_state", "provider-sync"); +} + +async function backupCount(codexHome) { + try { + return (await fs.readdir(backupRoot(codexHome))).length; + } catch (error) { + if (error?.code === "ENOENT") return 0; + throw error; + } +} + +test("prepareSync returns schema v1 summary and applySync consumes it exactly once", async () => { + const value = await makeFixture(); + try { + const plan = await prepareSync({ codexHome: value.codexHome, provider: "openai", model: "gpt-5" }); + assert.equal(plan.schemaVersion, 1); + assert.equal(plan.operation, "sync"); + assert.equal(plan.requiresConfirmation, true); + assert.equal(plan.target.provider, "openai"); + assert.equal(plan.impact.rolloutFilesToChange, 1); + assert.match(plan.planId, /^[A-Za-z0-9_-]{32,128}$/); + + const applied = await applySync({ schemaVersion: 1, planId: plan.planId }); + assert.equal(applied.schemaVersion, 1); + assert.equal(applied.operation, "sync"); + assert.equal(applied.outcome, "completed"); + assert.match(applied.operationId, /^[0-9a-f-]{36}$/); + assert.equal(applied.result.targetProvider, "openai"); + assert.equal(await backupCount(value.codexHome), 1); + + await assert.rejects( + applySync({ schemaVersion: 1, planId: plan.planId }), + (error) => error?.code === "PLAN_EXPIRED" + ); + } finally { + await fs.rm(value.root, { recursive: true, force: true }); + } +}); + +test("applySync rejects config drift under the write locks before backup", async () => { + const value = await makeFixture(); + try { + const plan = await prepareSync({ codexHome: value.codexHome }); + await fs.appendFile(path.join(value.codexHome, "config.toml"), "# changed\n", "utf8"); + await assert.rejects( + applySync({ schemaVersion: 1, planId: plan.planId }), + (error) => error?.code === "STALE_STATE" && error?.details?.reason === "config" + ); + assert.equal(await backupCount(value.codexHome), 0); + } finally { + await fs.rm(value.root, { recursive: true, force: true }); + } +}); + +test("applySync rejects rollout and State DB drift before backup", async () => { + for (const drift of ["rollout", "state-db"]) { + const value = await makeFixture(); + try { + const plan = await prepareSync({ codexHome: value.codexHome }); + if (drift === "rollout") { + await fs.appendFile(value.rolloutPath, '{"type":"event_msg"}\n', "utf8"); + } else { + const db = await openDatabase(value.stateDbPath); + try { + db.prepare("UPDATE threads SET first_user_message = ? WHERE id = ?").run("changed", "thread-a"); + } finally { + db.close(); + } + } + await assert.rejects( + applySync({ schemaVersion: 1, planId: plan.planId }), + (error) => error?.code === "STALE_STATE" && error?.details?.reason === drift, + drift + ); + assert.equal(await backupCount(value.codexHome), 0, drift); + } finally { + await fs.rm(value.root, { recursive: true, force: true }); + } + } +}); + +test("profile revision drift is checked after preparation and consumes the plan", async () => { + const value = await makeFixture(); + try { + let revision = "profile-r1"; + const plan = await prepareSync({ + codexHome: value.codexHome, + profileId: "work", + profileRevision: revision, + profileResolver: async () => ({ + id: "work", + revision, + codexHome: value.codexHome + }) + }); + revision = "profile-r2"; + await assert.rejects( + applySync({ schemaVersion: 1, planId: plan.planId }), + (error) => error?.code === "STALE_STATE" && error?.details?.reason === "profile" + ); + await assert.rejects( + applySync({ schemaVersion: 1, planId: plan.planId }), + (error) => error?.code === "PLAN_EXPIRED" + ); + assert.equal(await backupCount(value.codexHome), 0); + } finally { + await fs.rm(value.root, { recursive: true, force: true }); + } +}); + +test("status returns the last complete snapshot with operation metadata while Apply is paused", async () => { + const value = await makeFixture(); + let entered; + let release; + const enteredPromise = new Promise((resolve) => { entered = resolve; }); + const releasePromise = new Promise((resolve) => { release = resolve; }); + try { + const plan = await prepareSync({ + codexHome: value.codexHome, + faultInjector: async ({ point }) => { + if (point === "before_backup") { + entered(); + await releasePromise; + } + } + }); + const applyPromise = applySync({ schemaVersion: 1, planId: plan.planId }); + await enteredPromise; + const status = await getStatus({ codexHome: value.codexHome }); + assert.equal(status.rolloutScanComplete, true); + assert.equal(status.operationInProgress.operation, "sync"); + assert.equal(status.operationInProgress.actor, "manual"); + assert.match(status.operationInProgress.operationId, /^[0-9a-f-]{36}$/); + release(); + await applyPromise; + assert.equal((await getStatus({ codexHome: value.codexHome })).operationInProgress, null); + } finally { + release?.(); + await fs.rm(value.root, { recursive: true, force: true }); + } +}); + +test("two concurrent Apply calls for one plan start exactly one operation", async () => { + const value = await makeFixture(); + try { + const plan = await prepareSync({ codexHome: value.codexHome }); + const settled = await Promise.allSettled([ + applySync({ schemaVersion: 1, planId: plan.planId }), + applySync({ schemaVersion: 1, planId: plan.planId }) + ]); + assert.equal(settled.filter((entry) => entry.status === "fulfilled").length, 1); + const rejected = settled.find((entry) => entry.status === "rejected"); + assert.equal(rejected.reason.code, "PLAN_EXPIRED"); + assert.equal(await backupCount(value.codexHome), 1); + } finally { + await fs.rm(value.root, { recursive: true, force: true }); + } +}); + +test("different Codex Homes sharing one State DB contend before the losing backup", async () => { + const value = await makeFixture(); + const secondHome = path.join(value.root, "second-codex-home"); + const secondRollout = path.join(secondHome, "sessions", "2026", "08", "25", "rollout-b.jsonl"); + let entered; + let release; + const enteredPromise = new Promise((resolve) => { entered = resolve; }); + const releasePromise = new Promise((resolve) => { release = resolve; }); + try { + await fs.mkdir(path.dirname(secondRollout), { recursive: true }); + await fs.mkdir(path.join(secondHome, "archived_sessions"), { recursive: true }); + await fs.writeFile( + path.join(secondHome, "config.toml"), + `model_provider = "openai"\nsqlite_home = ${JSON.stringify(path.dirname(value.stateDbPath))}\n`, + "utf8" + ); + await fs.writeFile(secondRollout, `${JSON.stringify({ + timestamp: "2026-08-25T00:00:00.000Z", + type: "session_meta", + payload: { + id: "thread-b", + timestamp: "2026-08-25T00:00:00.000Z", + cwd: "C:\\AITemp", + source: "cli", + cli_version: "0.115.0", + model_provider: "custom" + } + })}\n`, "utf8"); + const secondConfigBefore = await fs.readFile(path.join(secondHome, "config.toml")); + const secondRolloutBefore = await fs.readFile(secondRollout); + + const firstPlan = await prepareSync({ + codexHome: value.codexHome, + faultInjector: async ({ point }) => { + if (point === "before_backup") { + entered(); + await releasePromise; + } + } + }); + const firstApply = applySync({ schemaVersion: 1, planId: firstPlan.planId }); + await enteredPromise; + + const secondPlan = await prepareSync({ codexHome: secondHome }); + await assert.rejects( + applySync({ schemaVersion: 1, planId: secondPlan.planId }), + (error) => error?.code === "OPERATION_BUSY" && error?.details?.busyScope === "state-db" + ); + assert.equal(await backupCount(secondHome), 0); + assert.deepEqual(await fs.readFile(path.join(secondHome, "config.toml")), secondConfigBefore); + assert.deepEqual(await fs.readFile(secondRollout), secondRolloutBefore); + + release(); + await firstApply; + } finally { + release?.(); + await fs.rm(value.root, { recursive: true, force: true }); + } +}); + +test("prepareSwitch/applySwitch preserves all three model-mode intents in consumed plans", async () => { + for (const fixture of [ + { expectedMode: "provider-default", options: {}, expectedModel: "relay-model" }, + { expectedMode: "keep-root-model", options: { keepRootModel: true }, expectedModel: "gpt-5" }, + { expectedMode: "explicit", options: { model: "explicit-model" }, expectedModel: "explicit-model" } + ]) { + const value = await makeFixture(); + try { + await fs.appendFile( + path.join(value.codexHome, "config.toml"), + '\n[model_providers.relay]\nmodel = "relay-model"\nbase_url = "https://example.invalid"\n', + "utf8" + ); + const plan = await prepareSwitch({ + codexHome: value.codexHome, + provider: "relay", + ...fixture.options + }); + assert.equal(plan.operation, "switch"); + assert.equal(plan.target.modelMode, fixture.expectedMode); + const applied = await applySwitch({ schemaVersion: 1, planId: plan.planId }); + assert.equal(applied.outcome, "completed"); + const configText = await fs.readFile(path.join(value.codexHome, "config.toml"), "utf8"); + assert.match(configText, /^model_provider = "relay"/m); + assert.match(configText, new RegExp(`^model = "${fixture.expectedModel}"`, "m")); + } finally { + await fs.rm(value.root, { recursive: true, force: true }); + } + } +}); + +test("Switch re-resolves the authoritative State DB under the Home lock", async () => { + const value = await makeFixture(); + const legacyStateDbPath = path.join(value.codexHome, "state_5.sqlite"); + let newDefaultBytes = null; + try { + await fs.appendFile( + path.join(value.codexHome, "config.toml"), + '\n[model_providers.relay]\nmodel = "relay-model"\nbase_url = "https://example.invalid"\n', + "utf8" + ); + await fs.rename(value.stateDbPath, legacyStateDbPath); + await fs.rm(path.dirname(value.stateDbPath), { recursive: true, force: true }); + assert.equal( + (await getStatus({ codexHome: value.codexHome })).stateDbLocation.path, + legacyStateDbPath + ); + const configBefore = await fs.readFile(path.join(value.codexHome, "config.toml")); + const rolloutBefore = await fs.readFile(value.rolloutPath); + const legacyBefore = await fs.readFile(legacyStateDbPath); + + const plan = await prepareSwitch({ + codexHome: value.codexHome, + provider: "relay", + faultInjector: async ({ point }) => { + if (point !== "after_switch_storage_preflight") return; + await fs.mkdir(path.dirname(value.stateDbPath), { recursive: true }); + await fs.copyFile(legacyStateDbPath, value.stateDbPath); + newDefaultBytes = await fs.readFile(value.stateDbPath); + } + }); + + await assert.rejects( + applySwitch({ schemaVersion: 1, planId: plan.planId }), + (error) => error?.code === "STALE_STATE" && error?.details?.reason === "storage" + ); + assert.equal(await backupCount(value.codexHome), 0); + assert.deepEqual(await fs.readFile(path.join(value.codexHome, "config.toml")), configBefore); + assert.deepEqual(await fs.readFile(value.rolloutPath), rolloutBefore); + assert.deepEqual(await fs.readFile(legacyStateDbPath), legacyBefore); + assert.deepEqual(await fs.readFile(value.stateDbPath), newDefaultBytes); + } finally { + await fs.rm(value.root, { recursive: true, force: true }); + } +}); + +test("prepareRestore/applyRestore binds a managed backup and rejects backup drift before mutation", async () => { + const value = await makeFixture(); + try { + const syncPlan = await prepareSync({ codexHome: value.codexHome, provider: "openai" }); + await applySync({ schemaVersion: 1, planId: syncPlan.planId }); + const inventory = await listBackups(value.codexHome); + const backup = inventory.backups[0]; + assert.ok(backup?.id); + + const stalePlan = await prepareRestore({ + codexHome: value.codexHome, + backupId: backup.id, + restoreConfig: false, + restoreDatabase: true, + restoreSessions: true + }); + await fs.appendFile(path.join(backup.path, "metadata.json"), "\n", "utf8"); + await assert.rejects( + applyRestore({ schemaVersion: 1, planId: stalePlan.planId }), + (error) => error?.code === "STALE_STATE" && error?.details?.reason === "backup" + ); + const dbBefore = await fs.readFile(value.stateDbPath); + + // Restore the exact metadata bytes from the immutable source plan fixture, + // then prepare a fresh plan and apply it. + const metadataText = await fs.readFile(path.join(backup.path, "metadata.json"), "utf8"); + await fs.writeFile(path.join(backup.path, "metadata.json"), metadataText.trimEnd(), "utf8"); + const freshPlan = await prepareRestore({ + codexHome: value.codexHome, + backupId: backup.id, + restoreConfig: false, + restoreDatabase: true, + restoreSessions: true + }); + const restored = await applyRestore({ schemaVersion: 1, planId: freshPlan.planId }); + assert.equal(restored.operation, "restore"); + assert.equal(restored.outcome, "completed"); + assert.notDeepEqual(await fs.readFile(value.stateDbPath), dbBefore); + const db = await openDatabase(value.stateDbPath); + try { + assert.equal( + db.prepare("SELECT model_provider FROM threads WHERE id = ?").get("thread-a").model_provider, + "custom" + ); + } finally { + db.close(); + } + } finally { + await fs.rm(value.root, { recursive: true, force: true }); + } +}); diff --git a/test/plan-ledger.test.js b/test/plan-ledger.test.js new file mode 100644 index 0000000..e706823 --- /dev/null +++ b/test/plan-ledger.test.js @@ -0,0 +1,77 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { + DEFAULT_PLAN_TTL_MS, + PLAN_SCHEMA_VERSION, + PlanLedger +} from "../src/plan-ledger.js"; + +function fixtureLedger() { + let now = Date.parse("2026-08-25T00:00:00.000Z"); + let sequence = 0; + const ledger = new PlanLedger({ + now: () => now, + randomId: () => `fixture_${String(sequence += 1).padStart(40, "0")}` + }); + return { ledger, advance: (milliseconds) => { now += milliseconds; } }; +} + +test("PlanLedger issues immutable schema v1 summaries with a ten-minute TTL", () => { + const { ledger } = fixtureLedger(); + const summary = ledger.issue("sync", { + schemaVersion: 999, + planId: "attacker", + operation: "restore", + profile: { id: "default", revision: "profile-r1" }, + target: { provider: "openai" }, + impact: {}, + warnings: [] + }, { trusted: true }); + + assert.equal(summary.schemaVersion, PLAN_SCHEMA_VERSION); + assert.equal(summary.operation, "sync"); + assert.match(summary.planId, /^fixture_/); + assert.equal( + Date.parse(summary.expiresAt) - Date.parse(summary.createdAt), + DEFAULT_PLAN_TTL_MS + ); + assert.equal(summary.requiresConfirmation, true); + assert.equal(Object.isFrozen(summary), true); + assert.equal(Object.isFrozen(summary.profile), true); +}); + +test("PlanLedger consumes a plan once and fails closed for replay or cross-operation use", () => { + const { ledger } = fixtureLedger(); + const plan = ledger.issue("switch", { profile: {}, target: {}, impact: {}, warnings: [] }, { marker: 1 }); + + assert.equal(ledger.consume({ schemaVersion: 1, planId: plan.planId }, "switch").internal.marker, 1); + assert.throws( + () => ledger.consume({ schemaVersion: 1, planId: plan.planId }, "switch"), + (error) => error?.code === "PLAN_EXPIRED" + ); + + const restore = ledger.issue("restore", { profile: {}, target: {}, impact: {}, warnings: [] }, {}); + assert.throws( + () => ledger.consume({ schemaVersion: 1, planId: restore.planId }, "sync"), + (error) => error?.code === "PLAN_EXPIRED" + ); +}); + +test("PlanLedger expires plans and rejects tampered Apply payloads without consuming valid input", () => { + const { ledger, advance } = fixtureLedger(); + const plan = ledger.issue("sync", { profile: {}, target: {}, impact: {}, warnings: [] }, {}); + assert.throws( + () => ledger.consume({ schemaVersion: 1, planId: plan.planId, provider: "attacker" }, "sync"), + (error) => error?.code === "INVALID_INPUT" + ); + assert.equal(ledger.size, 1); + + advance(DEFAULT_PLAN_TTL_MS); + assert.throws( + () => ledger.consume({ schemaVersion: 1, planId: plan.planId }, "sync"), + (error) => error?.code === "PLAN_EXPIRED" + ); + assert.equal(ledger.size, 0); +}); + diff --git a/test/public-api-contract.test.js b/test/public-api-contract.test.js index 0a3a99e..b4c19b1 100644 --- a/test/public-api-contract.test.js +++ b/test/public-api-contract.test.js @@ -7,12 +7,21 @@ import * as publicApi from "../src/public-api.js"; const EXPECTED_EXPORTS = [ "CORE_ERROR_CODES", "CoreError", + "applyRestore", + "applySwitch", + "applySync", "detectStateDb", "ensureCodexHome", + "getDiagnostics", "getHistorySession", "getStatus", + "getWatchStatus", "listBackups", "listHistory", + "prepareRestore", + "prepareSwitch", + "prepareSync", + "pruneBackups", "readConfigText", "readRootModelFromConfigText", "resolveStorageLayout", @@ -21,11 +30,13 @@ const EXPECTED_EXPORTS = [ "runSwitch", "runSync", "runWatch", + "startWatch", + "stopWatch", "toCoreErrorDto", "withStateDbLocation" ]; -test("public Core API has the exact C1 export surface", () => { +test("public Core API has the exact C3 export surface", () => { assert.deepEqual(Object.keys(publicApi).sort(), EXPECTED_EXPORTS); for (const name of EXPECTED_EXPORTS) { if (name !== "CORE_ERROR_CODES") { diff --git a/test/state-db-lock.test.js b/test/state-db-lock.test.js new file mode 100644 index 0000000..34287c9 --- /dev/null +++ b/test/state-db-lock.test.js @@ -0,0 +1,135 @@ +import { createHash } from "node:crypto"; +import { spawn } from "node:child_process"; +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; +import { createInterface } from "node:readline"; +import { pathToFileURL } from "node:url"; + +import { + acquireStateDbLock, + resolveStateDbLockResource +} from "../src/state-db-lock.js"; + +test("State DB resource identity uses the real parent, NUL delimiter, and SHA-256 lock path", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-state-lock-")); + const sqliteHome = path.join(root, "sqlite"); + const stateDbPath = path.join(sqliteHome, "state_5.sqlite"); + try { + await fs.mkdir(sqliteHome, { recursive: true }); + await fs.writeFile(stateDbPath, "fixture", "utf8"); + const resource = await resolveStateDbLockResource(stateDbPath); + const realParent = await fs.realpath(sqliteHome); + const expectedIdentity = `${process.platform === "win32" ? realParent.toLowerCase() : realParent}\0state_5.sqlite`; + const expectedKey = createHash("sha256").update(expectedIdentity, "utf8").digest("hex"); + assert.equal(resource.identity, expectedIdentity); + assert.equal(resource.resourceKey, expectedKey); + assert.equal( + resource.lockPath, + path.join(await fs.realpath(sqliteHome), ".codex-provider-sync", "locks", `${expectedKey}.lock`) + ); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } +}); + +test("State DB locks publish scope/resourceKey and report state-db contention", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-state-lock-")); + const sqliteHome = path.join(root, "sqlite"); + const stateDbPath = path.join(sqliteHome, "state_5.sqlite"); + try { + await fs.mkdir(sqliteHome, { recursive: true }); + await fs.writeFile(stateDbPath, "fixture", "utf8"); + const first = await acquireStateDbLock(stateDbPath, "fixture-one"); + try { + const owner = JSON.parse(await fs.readFile(path.join(first.resource.lockPath, "owner.json"), "utf8")); + assert.equal(owner.scope, "state-db"); + assert.equal(owner.resourceKey, first.resource.resourceKey); + await assert.rejects( + acquireStateDbLock(stateDbPath, "fixture-two"), + (error) => error?.code === "OPERATION_BUSY" && error?.details?.busyScope === "state-db" + ); + } finally { + await first.release(); + } + } finally { + await fs.rm(root, { recursive: true, force: true }); + } +}); + +test("State DB resource identity supports a missing database only when its parent is verifiable", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-state-lock-")); + try { + const sqliteHome = path.join(root, "sqlite"); + await fs.mkdir(sqliteHome); + const resource = await resolveStateDbLockResource(path.join(sqliteHome, "state_5.sqlite")); + assert.match(resource.resourceKey, /^[a-f0-9]{64}$/); + + await assert.rejects( + resolveStateDbLockResource(path.join(root, "missing", "state_5.sqlite")), + (error) => error?.code === "LOCK_UNVERIFIABLE" + && error?.details?.lockScope === "state-db" + ); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } +}); + +test("a real Node process publishes a State DB lock that blocks another process", async () => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-state-lock-process-")); + const sqliteHome = path.join(root, "sqlite"); + const stateDbPath = path.join(sqliteHome, "state_5.sqlite"); + let child; + let childExit; + try { + await fs.mkdir(sqliteHome, { recursive: true }); + await fs.writeFile(stateDbPath, "fixture", "utf8"); + const moduleUrl = pathToFileURL(path.resolve("src/state-db-lock.js")).href; + const script = ` + import { acquireStateDbLock } from ${JSON.stringify(moduleUrl)}; + const held = await acquireStateDbLock(${JSON.stringify(stateDbPath)}, "child-winner"); + console.log(JSON.stringify({ ready: true, resourceKey: held.resource.resourceKey })); + await new Promise((resolve) => process.stdin.once("data", resolve)); + await held.release(); + `; + child = spawn(process.execPath, ["--input-type=module", "-e", script], { + cwd: path.resolve("."), + stdio: ["pipe", "pipe", "pipe"] + }); + childExit = new Promise((resolve, reject) => { + child.once("error", reject); + child.once("exit", resolve); + }); + const lines = createInterface({ input: child.stdout }); + const readyLine = await new Promise((resolve, reject) => { + const timeout = setTimeout( + () => reject(new Error("child State DB lock did not become ready")), + 15000 + ); + lines.once("line", (line) => { + clearTimeout(timeout); + resolve(line); + }); + }); + const ready = JSON.parse(readyLine); + const resource = await resolveStateDbLockResource(stateDbPath); + assert.equal(ready.resourceKey, resource.resourceKey); + await assert.rejects( + acquireStateDbLock(stateDbPath, "parent-contender"), + (error) => error?.code === "OPERATION_BUSY" && error?.details?.busyScope === "state-db" + ); + lines.close(); + child.stdin.end("release\n"); + const exitCode = await childExit; + assert.equal(exitCode, 0); + child = null; + } finally { + if (child) { + child.stdin.end("release\n"); + await childExit; + } + await fs.rm(root, { recursive: true, force: true }); + } +}); diff --git a/test/status-coordination.test.js b/test/status-coordination.test.js new file mode 100644 index 0000000..76eced8 --- /dev/null +++ b/test/status-coordination.test.js @@ -0,0 +1,276 @@ +import assert from "node:assert/strict"; +import { spawn } from "node:child_process"; +import fs from "node:fs/promises"; +import http from "node:http"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; + +import { getStatus } from "../src/service.js"; +import { openDatabase } from "../src/sqlite.js"; +import { createWebUiServer } from "../src/web-server.js"; +import { createMemoryWebUiState } from "../src/web-state.js"; + +async function request(origin, pathname, body, headers = {}) { + return new Promise((resolve, reject) => { + const target = new URL(origin); + const serialized = body === undefined ? null : JSON.stringify(body); + const client = http.request({ + hostname: target.hostname, + port: target.port, + path: pathname, + method: "POST", + headers: { + ...(serialized ? { + "Content-Type": "application/json", + "Content-Length": Buffer.byteLength(serialized) + } : {}), + ...headers + } + }, (response) => { + const chunks = []; + response.on("data", (chunk) => chunks.push(chunk)); + response.on("end", () => { + const text = Buffer.concat(chunks).toString("utf8"); + resolve({ status: response.statusCode, payload: JSON.parse(text) }); + }); + }); + client.once("error", reject); + if (serialized) client.write(serialized); + client.end(); + }); +} + +async function makeFixture() { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-status-lock-")); + const codexHome = path.join(root, ".codex"); + const sqliteHome = path.join(root, "shared-sqlite"); + const stateDbPath = path.join(sqliteHome, "state_5.sqlite"); + const rolloutPath = path.join(codexHome, "sessions", "2026", "08", "25", "rollout-status.jsonl"); + await fs.mkdir(path.dirname(rolloutPath), { recursive: true }); + await fs.mkdir(path.join(codexHome, "archived_sessions"), { recursive: true }); + await fs.mkdir(sqliteHome, { recursive: true }); + const configText = (provider) => [ + `model_provider = "${provider}"`, + `sqlite_home = ${JSON.stringify(sqliteHome)}`, + "" + ].join("\n"); + await fs.writeFile(path.join(codexHome, "config.toml"), configText("openai"), "utf8"); + await fs.writeFile(rolloutPath, `${JSON.stringify({ + timestamp: "2026-08-25T00:00:00.000Z", + type: "session_meta", + payload: { + id: "status-thread", + model_provider: "openai", + cwd: "C:\\AITemp" + } + })}\n`, "utf8"); + const database = await openDatabase(stateDbPath); + try { + database.exec(` + CREATE TABLE threads ( + id TEXT PRIMARY KEY, + model_provider TEXT, + cwd TEXT NOT NULL DEFAULT '', + archived INTEGER NOT NULL DEFAULT 0, + first_user_message TEXT NOT NULL DEFAULT '', + model TEXT + ) + `); + database.prepare("INSERT INTO threads (id, model_provider, cwd, archived, first_user_message) VALUES (?, ?, ?, ?, ?)") + .run("status-thread", "openai", "C:\\AITemp", 0, "redacted"); + } finally { + database.close(); + } + return { root, codexHome, sqliteHome, stateDbPath, configText }; +} + +async function startRealWeb(codexHome, webRoot) { + await fs.mkdir(webRoot, { recursive: true }); + await fs.writeFile(path.join(webRoot, "index.html"), "status", "utf8"); + const stateStore = createMemoryWebUiState({ codexHome }); + const handle = createWebUiServer({ webRoot, stateStore }); + await new Promise((resolve, reject) => { + handle.server.once("error", reject); + handle.server.listen(0, "127.0.0.1", resolve); + }); + const address = handle.server.address(); + const origin = `http://127.0.0.1:${address.port}`; + handle.setBaseUrl(origin); + const paired = await request(origin, "/api/pair", undefined, { + Origin: origin, + "X-Codex-Provider-Pairing": handle.issuePairing() + }); + assert.equal(paired.status, 200); + const credential = paired.payload.deviceCredential; + return { + handle, + stateStore, + origin, + async status() { + return request(origin, "/api/status", { profileId: "default" }, { + Origin: origin, + "X-Codex-Provider-Device": credential + }); + }, + async close() { + await new Promise((resolve, reject) => handle.server.close((error) => error ? reject(error) : resolve())); + } + }; +} + +async function startHolder({ mode, codexHome, stateDbPath, configText = "" }) { + const lockingUrl = new URL("../src/locking.js", import.meta.url).href; + const stateLockUrl = new URL("../src/state-db-lock.js", import.meta.url).href; + const sqliteUrl = new URL("../src/sqlite.js", import.meta.url).href; + const script = ` + import fs from "node:fs/promises"; + import path from "node:path"; + import { once } from "node:events"; + import { acquireLock } from ${JSON.stringify(lockingUrl)}; + import { acquireStateDbLock } from ${JSON.stringify(stateLockUrl)}; + import { openDatabase } from ${JSON.stringify(sqliteUrl)}; + const mode = process.env.STATUS_HOLDER_MODE; + const codexHome = process.env.STATUS_CODEX_HOME; + const stateDbPath = process.env.STATUS_STATE_DB; + const releaseHome = mode === "home" ? await acquireLock(codexHome, "external-status-home") : null; + const heldState = await acquireStateDbLock(stateDbPath, mode === "home" ? "external-status-home" : "external-status-db"); + try { + if (mode === "home") { + await fs.writeFile(path.join(codexHome, "config.toml"), process.env.STATUS_CONFIG_TEXT, "utf8"); + } else { + const database = await openDatabase(stateDbPath); + try { + database.prepare("UPDATE threads SET model_provider = ? WHERE id = ?").run("external", "status-thread"); + } finally { + database.close(); + } + } + process.stdout.write(JSON.stringify({ ready: true }) + "\\n"); + await once(process.stdin, "data"); + } finally { + await heldState.release(); + if (releaseHome) await releaseHome(); + } + `; + const child = spawn(process.execPath, ["--input-type=module", "-e", script], { + cwd: process.cwd(), + env: { + ...process.env, + STATUS_HOLDER_MODE: mode, + STATUS_CODEX_HOME: codexHome, + STATUS_STATE_DB: stateDbPath, + STATUS_CONFIG_TEXT: configText + }, + stdio: ["pipe", "pipe", "pipe"] + }); + let stderr = ""; + child.stderr.setEncoding("utf8"); + child.stderr.on("data", (chunk) => { stderr += chunk; }); + const ready = await new Promise((resolve, reject) => { + let stdout = ""; + child.stdout.setEncoding("utf8"); + child.stdout.on("data", (chunk) => { + stdout += chunk; + const lineEnd = stdout.indexOf("\n"); + if (lineEnd < 0) return; + try { + resolve(JSON.parse(stdout.slice(0, lineEnd))); + } catch (error) { + reject(error); + } + }); + child.once("error", reject); + child.once("exit", (code) => { + if (code !== null) reject(new Error(`Status lock holder exited ${code} before ready: ${stderr}`)); + }); + }); + assert.equal(ready.ready, true); + return async () => { + child.stdin.end("release\n"); + const code = await new Promise((resolve) => child.once("exit", resolve)); + assert.equal(code, 0, stderr); + }; +} + +function asLastComplete(status) { + const value = structuredClone(status); + value.operationInProgress = null; + delete value.statusReadBlocked; + return value; +} + +test("Core and Web Status preserve the last complete snapshot under external Home and shared State DB locks", async () => { + const fixture = await makeFixture(); + const web = await startRealWeb(fixture.codexHome, path.join(fixture.root, "web")); + let releaseHolder = null; + try { + const profileRevision = web.stateStore.getProfile("default").revision; + const statusOptions = { + codexHome: fixture.codexHome, + profileId: "default", + profileRevision + }; + const baselineWebResponse = await web.status(); + assert.equal(baselineWebResponse.status, 200); + const baselineCore = await getStatus(statusOptions); + + releaseHolder = await startHolder({ + mode: "home", + codexHome: fixture.codexHome, + stateDbPath: fixture.stateDbPath, + configText: fixture.configText("external") + }); + const blockedCore = await getStatus(statusOptions); + const blockedWebResponse = await web.status(); + assert.equal(blockedCore.operationInProgress.actor, "external"); + assert.equal(blockedCore.operationInProgress.busyScope, "codex-home"); + assert.equal(blockedCore.statusReadBlocked.reason, "codex-home-lock"); + assert.deepEqual(asLastComplete(blockedCore), baselineCore); + assert.equal(blockedWebResponse.status, 200); + assert.equal(blockedWebResponse.payload.status.alignment.aligned, false); + assert.equal(blockedWebResponse.payload.status.operationInProgress.busyScope, "codex-home"); + const blockedWebWithoutAlignment = structuredClone(blockedWebResponse.payload.status); + delete blockedWebWithoutAlignment.alignment; + assert.deepEqual(asLastComplete(blockedWebWithoutAlignment), baselineCore); + await releaseHolder(); + releaseHolder = null; + assert.equal((await getStatus(statusOptions)).currentProvider, "external"); + + await fs.writeFile(path.join(fixture.codexHome, "config.toml"), fixture.configText("openai"), "utf8"); + assert.equal((await web.status()).status, 200); + const stateBaselineCore = await getStatus(statusOptions); + releaseHolder = await startHolder({ + mode: "state-db", + codexHome: fixture.codexHome, + stateDbPath: fixture.stateDbPath + }); + const stateBlockedCore = await getStatus(statusOptions); + const stateBlockedWeb = (await web.status()).payload.status; + assert.equal(stateBlockedCore.operationInProgress.busyScope, "state-db"); + assert.equal(stateBlockedCore.statusReadBlocked.reason, "state-db-lock"); + assert.deepEqual(asLastComplete(stateBlockedCore), stateBaselineCore); + assert.equal(stateBlockedWeb.alignment.aligned, false); + assert.equal(stateBlockedWeb.operationInProgress.busyScope, "state-db"); + const stateBlockedWebWithoutAlignment = structuredClone(stateBlockedWeb); + delete stateBlockedWebWithoutAlignment.alignment; + assert.deepEqual(asLastComplete(stateBlockedWebWithoutAlignment), stateBaselineCore); + await releaseHolder(); + releaseHolder = null; + const refreshed = await getStatus(statusOptions); + assert.equal(refreshed.sqliteCounts.sessions.external, 1); + + const lockDir = path.join(fixture.codexHome, "tmp", "provider-sync.lock"); + await fs.mkdir(lockDir, { recursive: true }); + await fs.writeFile(path.join(lockDir, "owner.json"), "{malformed", "utf8"); + const unverifiable = await getStatus(statusOptions); + assert.equal(unverifiable.operationInProgress.lockState, "unverifiable"); + assert.equal(unverifiable.rolloutScanComplete, false); + assert.ok(unverifiable.statusReadBlocked); + await fs.rm(lockDir, { recursive: true, force: true }); + } finally { + await releaseHolder?.().catch(() => {}); + await web.close(); + await fs.rm(fixture.root, { recursive: true, force: true }); + } +}); diff --git a/test/watch.test.js b/test/watch.test.js index 46894af..07f72d6 100644 --- a/test/watch.test.js +++ b/test/watch.test.js @@ -4,7 +4,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; -import { runWatch } from "../src/watch.js"; +import { getWatchStatus, runWatch, startWatch, stopWatch } from "../src/watch.js"; delete process.env.CODEX_SQLITE_HOME; @@ -188,6 +188,192 @@ test("runWatch uses the typed SQLITE_BUSY code and keeps watching", async () => await fs.rm(codexHome, { recursive: true, force: true }); }); +test("runWatch coalesces in-flight events and never overlaps applies", async () => { + const { root, codexHome } = await makeTempCodexHome(); + const configPath = path.join(codexHome, "config.toml"); + const firstStarted = deferred(); + const releaseFirst = deferred(); + let calls = 0; + let concurrent = 0; + let maxConcurrent = 0; + const observedReasons = []; + const handle = await runWatch({ + codexHome, + debounceMs: 20, + includeStateDb: false, + onLog: () => {}, + onSync: async ({ reasons }) => { + calls += 1; + concurrent += 1; + maxConcurrent = Math.max(maxConcurrent, concurrent); + observedReasons.push(reasons); + if (calls === 1) { + firstStarted.resolve(); + await releaseFirst.promise; + } + concurrent -= 1; + return { targetProvider: "openai", changedSessionFiles: 0, sqliteRowsUpdated: 0 }; + } + }); + + try { + await fs.writeFile(configPath, 'model_provider = "first"\n', "utf8"); + await firstStarted.promise; + await fs.writeFile(configPath, 'model_provider = "second"\n', "utf8"); + await fs.writeFile(configPath, 'model_provider = "third"\n', "utf8"); + await new Promise((resolve) => setTimeout(resolve, 80)); + assert.equal(calls, 1, "an in-flight Apply must not be overlapped"); + releaseFirst.resolve(); + await waitUntil(() => calls === 2, "coalesced follow-up Apply did not run"); + await new Promise((resolve) => setTimeout(resolve, 100)); + assert.equal(calls, 2, "all in-flight events must merge into exactly one follow-up Apply"); + assert.equal(maxConcurrent, 1); + assert.ok(observedReasons.every((reasons) => Array.isArray(reasons) && reasons.includes("config.toml"))); + } finally { + releaseFirst.resolve(); + await handle.stop(); + await fs.rm(root, { recursive: true, force: true }); + } +}); + +test("runWatch yields on OPERATION_BUSY without counting consecutive failures", async () => { + const { root, codexHome } = await makeTempCodexHome(); + const configPath = path.join(codexHome, "config.toml"); + const logs = []; + let attempts = 0; + let shutdownReason = null; + const handle = await runWatch({ + codexHome, + debounceMs: 10, + includeStateDb: false, + onLog: (line) => logs.push(line), + onShutdown: (reason) => { shutdownReason = reason; }, + onSync: async () => { + attempts += 1; + const error = new Error("manual operation owns the lock"); + error.code = "OPERATION_BUSY"; + error.details = { busyScope: "codex-home" }; + throw error; + } + }); + + try { + for (let index = 0; index < 6; index += 1) { + await fs.writeFile(configPath, `model_provider = "busy-${index}"\n`, "utf8"); + await new Promise((resolve) => setTimeout(resolve, 60)); + } + assert.ok(attempts >= 5, `expected repeated event-driven attempts, got ${attempts}`); + assert.equal(shutdownReason, null); + assert.ok(logs.some((line) => /yielded to an active manual operation/.test(line))); + assert.ok(!logs.some((line) => /giving up after/.test(line))); + } finally { + await handle.stop(); + await fs.rm(root, { recursive: true, force: true }); + } +}); + +test("runWatch retains a busy batch and applies it exactly once after a local manual operation ends", async () => { + const { root, codexHome } = await makeTempCodexHome(); + const configPath = path.join(codexHome, "config.toml"); + const manualCompleted = deferred(); + let attempts = 0; + let cancelled = 0; + const handle = await runWatch({ + codexHome, + debounceMs: 15, + includeStateDb: false, + onLog: () => {}, + manualOperationWaiter: () => ({ + promise: manualCompleted.promise, + cancel: () => { cancelled += 1; } + }), + onSync: async () => { + attempts += 1; + if (attempts === 1) { + const error = new Error("manual operation owns the lock"); + error.code = "OPERATION_BUSY"; + error.details = { busyScope: "codex-home" }; + throw error; + } + return { targetProvider: "openai", changedSessionFiles: 0, sqliteRowsUpdated: 0 }; + } + }); + + try { + await fs.writeFile(configPath, 'model_provider = "manual-busy"\n', "utf8"); + await waitUntil(() => attempts === 1, "Watch did not yield to the manual operation"); + await fs.writeFile(configPath, 'model_provider = "coalesced-a"\n', "utf8"); + await fs.writeFile(configPath, 'model_provider = "coalesced-b"\n', "utf8"); + await new Promise((resolve) => setTimeout(resolve, 80)); + assert.equal(attempts, 1, "events must remain queued while the manual operation is active"); + + manualCompleted.resolve(); + await waitUntil(() => attempts === 2, "Watch did not retry after manual completion"); + await new Promise((resolve) => setTimeout(resolve, 100)); + assert.equal(attempts, 2, "the retained busy batch must merge into one follow-up Apply"); + assert.equal(cancelled, 0); + } finally { + manualCompleted.resolve(); + await handle.stop(); + await fs.rm(root, { recursive: true, force: true }); + } +}); + +test("runWatch cancels its manual-completion subscription when stopped", async () => { + const { root, codexHome } = await makeTempCodexHome(); + const configPath = path.join(codexHome, "config.toml"); + const manualCompleted = deferred(); + let attempts = 0; + let cancelled = 0; + const handle = await runWatch({ + codexHome, + debounceMs: 10, + includeStateDb: false, + onLog: () => {}, + manualOperationWaiter: () => ({ + promise: manualCompleted.promise, + cancel: () => { cancelled += 1; } + }), + onSync: async () => { + attempts += 1; + const error = new Error("manual operation owns the lock"); + error.code = "OPERATION_BUSY"; + error.details = { busyScope: "codex-home" }; + throw error; + } + }); + + await fs.writeFile(configPath, 'model_provider = "manual-stop"\n', "utf8"); + await waitUntil(() => attempts === 1, "Watch did not enter the busy wait"); + await handle.stop(); + assert.equal(cancelled, 1); + manualCompleted.resolve(); + await new Promise((resolve) => setTimeout(resolve, 80)); + assert.equal(attempts, 1, "a stopped watcher must not apply after completion notification"); + await fs.rm(root, { recursive: true, force: true }); +}); + +test("startWatch exposes registry status and stopWatch is idempotent", async () => { + const { root, codexHome } = await makeTempCodexHome(); + try { + const started = await startWatch({ + codexHome, + includeStateDb: false, + onLog: () => {}, + onSync: async () => ({ targetProvider: "openai", changedSessionFiles: 0, sqliteRowsUpdated: 0 }) + }); + assert.equal(started.schemaVersion, 1); + assert.equal(started.status, "running"); + assert.equal(getWatchStatus({ watchId: started.watchId }).status, "running"); + const stopped = await stopWatch({ watchId: started.watchId }); + assert.equal(stopped.status, "stopped"); + assert.equal((await stopWatch({ watchId: started.watchId })).status, "stopped"); + assert.ok(getWatchStatus().watches.some((watch) => watch.watchId === started.watchId)); + } finally { + await fs.rm(root, { recursive: true, force: true }); + } +}); + test("runWatch stops itself after consecutive non-busy sync failures and resolves done", async () => { // Regression guard for B11: when the sync handler keeps // throwing something other than `state_5.sqlite is currently diff --git a/test/web-server.test.js b/test/web-server.test.js index af6c554..6e72b76 100644 --- a/test/web-server.test.js +++ b/test/web-server.test.js @@ -90,28 +90,14 @@ async function startFixture(services = {}, options = {}) { } async function api(handle, pathname, body = {}, credential, { originHeader = handle.origin, hostHeader } = {}) { - const profileRevisionEndpoints = new Set(["/api/sync", "/api/switch", "/api/restore", "/api/prune"]); - const storageRevisionEndpoints = new Set(["/api/sync", "/api/switch", "/api/restore"]); + const profileRevisionEndpoints = new Set([ + "/api/prune", + "/api/sync/prepare", "/api/switch/prepare", "/api/restore/prepare" + ]); const profile = profileRevisionEndpoints.has(pathname) && body.profileId && !Object.hasOwn(body, "profileRevision") ? handle.stateStore.getProfile(body.profileId) : null; - let preparedBody = profile ? { ...body, profileRevision: profile.revision } : body; - if (storageRevisionEndpoints.has(pathname) && !Object.hasOwn(preparedBody, "storageRevision")) { - const status = await request({ - origin: handle.origin, - pathname: "/api/status", - method: "POST", - body: { profileId: preparedBody.profileId ?? "default" }, - hostHeader, - headers: { - Origin: originHeader, - "X-Codex-Provider-Device": credential ?? "" - } - }); - if (status.payload?.status?.storageRevision) { - preparedBody = { ...preparedBody, storageRevision: status.payload.status.storageRevision }; - } - } + const preparedBody = profile ? { ...body, profileRevision: profile.revision } : body; return request({ origin: handle.origin, pathname, @@ -145,6 +131,7 @@ function statusFixture(overrides = {}) { projectThreadVisibility: [], backupRoot: "/tmp/.codex/backups_state/provider-sync", backupSummary: { count: 0, totalBytes: 0 }, + pathComparisonCaseInsensitive: process.platform === "win32", ...overrides }; } @@ -330,36 +317,161 @@ test("server-managed profiles reject per-operation paths and resolve profileId", } }); -test("Web UI sync delegates only server-resolved storage to the shared service", async () => { - const calls = []; +test("legacy Web direct-write routes require Plan/Apply and never invoke a writer", async () => { + let calls = 0; + const handle = await startFixture({ + prepareSync: async () => { calls += 1; }, + applySync: async () => { calls += 1; }, + prepareSwitch: async () => { calls += 1; }, + applySwitch: async () => { calls += 1; }, + prepareRestore: async () => { calls += 1; }, + applyRestore: async () => { calls += 1; } + }); + try { + const configPath = path.join(handle.root, "config.toml"); + await fs.writeFile(configPath, 'model_provider = "openai"\n', "utf8"); + const before = await fs.readFile(configPath); + const { credential } = await handle.pair(); + for (const [endpoint, body] of [ + ["/api/sync", { profileId: "default", provider: "openai", keepCount: 5 }], + ["/api/switch", { profileId: "default", provider: "openai", keepCount: 5 }], + ["/api/restore", { profileId: "default", backupId: "managed", restoreSessions: true }] + ]) { + const response = await api(handle, endpoint, body, credential); + assert.equal(response.status, 410); + assert.equal(response.payload.code, "PLAN_REQUIRED"); + } + assert.equal(calls, 0); + assert.deepEqual(await fs.readFile(configPath), before); + await assert.rejects(() => fs.access(path.join(handle.root, "backups_state")), { code: "ENOENT" }); + } finally { + await handle.close(); + } +}); + +test("Web Prepare/Apply keeps trusted profile paths server-side and Apply accepts only planId", async () => { + const prepareCalls = []; + const applyCalls = []; const handle = await startFixture({ readConfigText: async () => 'model_provider = "openai"\nmodel = "gpt-5"\n', readRootModelFromConfigText: () => "gpt-5", - runSync: async (options) => { calls.push(options); options.onProgress({ stage: "create_backup", status: "start" }); return { targetProvider: options.provider, backupDir: "/tmp/backup" }; } + prepareSync: async (options) => { + prepareCalls.push(options); + return { + schemaVersion: 1, + planId: "opaque-plan", + operation: "sync", + requiresConfirmation: true + }; + }, + applySync: async (input) => { + applyCalls.push(input); + return { + schemaVersion: 1, + operationId: "11111111-1111-4111-8111-111111111111", + operation: "sync", + outcome: "completed", + backup: null, + warnings: [], + result: { targetProvider: "openai" } + }; + } }); try { - await fs.writeFile(path.join(handle.root, "state_5.sqlite"), "not-a-real-db"); const { credential } = await handle.pair(); - const invalid = await api(handle, "/api/sync", { profileId: "default", provider: "bad provider", keepCount: 5 }, credential); + const prepared = await api( + handle, + "/api/sync/prepare", + { profileId: "default", provider: "openai", keepCount: 5 }, + credential + ); + assert.equal(prepared.status, 200); + assert.equal(prepared.payload.plan.planId, "opaque-plan"); + assert.equal(prepareCalls.length, 1); + assert.equal(prepareCalls[0].codexHome, path.resolve(handle.root)); + assert.equal(prepareCalls[0].profile.id, "default"); + assert.equal(prepareCalls[0].model, "gpt-5"); + assert.equal(typeof prepareCalls[0].profileResolver, "function"); + + const rejected = await api( + handle, + "/api/sync/apply", + { schemaVersion: 1, planId: "opaque-plan", provider: "attacker" }, + credential + ); + assert.equal(rejected.status, 400); + assert.equal(rejected.payload.coreError.code, "INVALID_INPUT"); + assert.equal(applyCalls.length, 0); + + const applied = await api( + handle, + "/api/sync/apply", + { schemaVersion: 1, planId: "opaque-plan" }, + credential + ); + assert.equal(applied.status, 200); + assert.deepEqual(applyCalls, [{ schemaVersion: 1, planId: "opaque-plan" }]); + assert.equal(applied.payload.result.outcome, "completed"); + } finally { + await handle.close(); + } +}); + +test("Web Prepare validates Switch model modes and passes Restore only a managed backupId", async () => { + const switchCalls = []; + const restoreCalls = []; + const handle = await startFixture({ + prepareSwitch: async (options) => { + switchCalls.push(options); + return { schemaVersion: 1, planId: `switch-${switchCalls.length}`, operation: "switch" }; + }, + prepareRestore: async (options) => { + restoreCalls.push(options); + return { schemaVersion: 1, planId: "restore-1", operation: "restore" }; + } + }); + try { + const { credential } = await handle.pair(); + const explicit = await api(handle, "/api/switch/prepare", { + profileId: "default", + provider: "relay", + keepCount: 5, + modelMode: "explicit", + model: "model-x" + }, credential); + assert.equal(explicit.status, 200); + assert.equal(switchCalls[0].model, "model-x"); + assert.equal(switchCalls[0].keepRootModel, false); + + const invalid = await api(handle, "/api/switch/prepare", { + profileId: "default", + provider: "relay", + keepCount: 5, + modelMode: "keep-root-model", + model: "must-not-pass" + }, credential); assert.equal(invalid.status, 400); - assert.equal(invalid.payload.coreError, undefined); - const response = await api(handle, "/api/sync", { profileId: "default", provider: "openai", keepCount: 5 }, credential); - assert.equal(response.status, 200); - assert.equal(calls.length, 1); - assert.equal(calls[0].codexHome, path.resolve(handle.root)); - assert.equal(calls[0].model, "gpt-5"); - assert.equal(calls[0].storage.stateDbLocation.source, "legacy-root"); - assert.equal(calls[0].storage.stateDbLocation.path, path.join(handle.root, "state_5.sqlite")); - assert.ok(handle.getActivity().some((entry) => entry.message === "Creating backup")); + assert.equal(invalid.payload.coreError.code, "INVALID_INPUT"); + + const restore = await api(handle, "/api/restore/prepare", { + profileId: "default", + backupId: "managed-backup-1", + restoreConfig: true, + restoreDatabase: false, + restoreSessions: true + }, credential); + assert.equal(restore.status, 200); + assert.equal(restoreCalls.length, 1); + assert.equal(restoreCalls[0].backupId, "managed-backup-1"); + assert.equal(Object.hasOwn(restoreCalls[0], "backupDir"), false); } finally { await handle.close(); } }); -test("Web UI appends a safe CoreError DTO without changing the legacy error shape", async () => { +test("Web Apply appends a safe CoreError DTO without leaking transport internals", async () => { const handle = await startFixture({ - readConfigText: async () => 'model_provider = "openai"\n', - runSync: async () => { + applySync: async () => { throw new CoreError("SQLITE_BUSY", "The state database is busy.", { details: { causeCode: "SQLITE_BUSY" } }); @@ -369,8 +481,8 @@ test("Web UI appends a safe CoreError DTO without changing the legacy error shap const { credential } = await handle.pair(); const response = await api( handle, - "/api/sync", - { profileId: "default", provider: "openai", keepCount: 5 }, + "/api/sync/apply", + { schemaVersion: 1, planId: "opaque-plan" }, credential ); @@ -390,156 +502,85 @@ test("Web UI appends a safe CoreError DTO without changing the legacy error shap } }); -test("Web UI rejects an operation when config changes the effective SQLite target after confirmation", async () => { - let configText = 'model_provider = "openai"\nsqlite_home = "sqlite-a"\n'; - const syncCalls = []; +test("Web status forwards the Core last-complete snapshot without reading or mixing live storage", async () => { + let configReads = 0; + const coreStatus = statusFixture({ + schemaVersion: 1, + snapshotAt: "2026-08-25T00:00:00.000Z", + storageRevision: "cached-storage-revision", + profile: { id: "default", revision: "trusted-profile-revision" }, + profileId: "default", + profileRevision: "server-profile-revision", + currentProvider: "openai", + operationInProgress: { + operationId: "external-operation", + operation: "sync", + actor: "external", + busyScope: "codex-home" + } + }); const handle = await startFixture({ - readConfigText: async () => configText, - readRootModelFromConfigText: () => null, - getStatus: async ({ storage }) => statusFixture({ - codexHome: storage.codexHome, - sqliteHome: storage.sqliteHome, - sqliteHomeSource: storage.sqliteHomeSource, - sqliteAccess: storage.sqliteAccess, - stateDbLocation: storage.stateDbLocation, - checkedStateDbPaths: storage.stateDbCandidates.map((candidate) => candidate.path) - }), - runSync: async (options) => { syncCalls.push(options); return {}; } + readConfigText: async () => { configReads += 1; throw new Error("status must not read config in Web"); }, + getStatus: async () => structuredClone(coreStatus) }); try { const { credential } = await handle.pair(); - const profile = handle.stateStore.getProfile("default"); - const confirmed = await api(handle, "/api/status", { profileId: "default" }, credential); - assert.equal(confirmed.status, 200); - - const missing = await request({ - origin: handle.origin, - pathname: "/api/sync", - method: "POST", - body: { profileId: "default", profileRevision: profile.revision, provider: "openai", keepCount: 5 }, - headers: { Origin: handle.origin, "X-Codex-Provider-Device": credential } - }); - assert.equal(missing.status, 409); - assert.equal(missing.payload.code, "STORAGE_REVISION_REQUIRED"); - - configText = 'model_provider = "openai"\nsqlite_home = "sqlite-b"\n'; - const changed = await request({ - origin: handle.origin, - pathname: "/api/sync", - method: "POST", - body: { - profileId: "default", - profileRevision: profile.revision, - storageRevision: confirmed.payload.status.storageRevision, - provider: "openai", - keepCount: 5 - }, - headers: { Origin: handle.origin, "X-Codex-Provider-Device": credential } - }); - assert.equal(changed.status, 409); - assert.equal(changed.payload.code, "STORAGE_CHANGED"); - assert.equal(syncCalls.length, 0); - - const refreshed = await api(handle, "/api/status", { profileId: "default" }, credential); - const accepted = await request({ - origin: handle.origin, - pathname: "/api/sync", - method: "POST", - body: { - profileId: "default", - profileRevision: profile.revision, - storageRevision: refreshed.payload.status.storageRevision, - provider: "openai", - keepCount: 5 - }, - headers: { Origin: handle.origin, "X-Codex-Provider-Device": credential } - }); - assert.equal(accepted.status, 200); - assert.equal(syncCalls.length, 1); - assert.equal(syncCalls[0].storage.sqliteHome, path.resolve("sqlite-b")); - assert.equal(syncCalls[0].storage.sqliteHomeSource, "config"); - assert.equal(syncCalls[0].expectedConfigText, configText); + const response = await api(handle, "/api/status", { profileId: "default" }, credential); + assert.equal(response.status, 200); + assert.equal(configReads, 0); + assert.equal(response.payload.status.storageRevision, coreStatus.storageRevision); + assert.deepEqual(response.payload.status.operationInProgress, coreStatus.operationInProgress); + assert.equal(response.payload.status.currentProvider, "openai"); } finally { await handle.close(); } }); -test("Web UI binds confirmed operations to config contents even when storage is unchanged", async () => { - let configText = 'model_provider = "openai"\nmodel = "gpt-5"\n'; - const syncCalls = []; +test("Web Switch and Restore Apply reject every field beyond schemaVersion and planId", async () => { + let switchCalls = 0; + let restoreCalls = 0; const handle = await startFixture({ - readConfigText: async () => configText, - readRootModelFromConfigText: (text) => /^model = "([^"]+)"$/m.exec(text)?.[1] ?? null, - getStatus: async ({ storage }) => statusFixture({ - codexHome: storage.codexHome, - sqliteHome: storage.sqliteHome, - sqliteHomeSource: storage.sqliteHomeSource, - sqliteAccess: storage.sqliteAccess, - stateDbLocation: storage.stateDbLocation, - checkedStateDbPaths: storage.stateDbCandidates.map((candidate) => candidate.path) - }), - runSync: async (options) => { syncCalls.push(options); return {}; } + applySwitch: async () => { switchCalls += 1; }, + applyRestore: async () => { restoreCalls += 1; } }); try { const { credential } = await handle.pair(); - const profile = handle.stateStore.getProfile("default"); - const confirmed = await api(handle, "/api/status", { profileId: "default" }, credential); - assert.equal(confirmed.status, 200); - - configText = 'model_provider = "openai"\nmodel = "gpt-5.2"\n'; - const changed = await request({ - origin: handle.origin, - pathname: "/api/sync", - method: "POST", - body: { - profileId: "default", - profileRevision: profile.revision, - storageRevision: confirmed.payload.status.storageRevision, - provider: "openai", - keepCount: 5 - }, - headers: { Origin: handle.origin, "X-Codex-Provider-Device": credential } - }); - assert.equal(changed.status, 409); - assert.equal(changed.payload.code, "STORAGE_CHANGED"); - assert.match(changed.payload.error, /configuration or effective SQLite storage changed/); - assert.equal(syncCalls.length, 0); - - const refreshed = await api(handle, "/api/status", { profileId: "default" }, credential); - assert.notEqual(refreshed.payload.status.storageRevision, confirmed.payload.status.storageRevision); - const accepted = await request({ - origin: handle.origin, - pathname: "/api/sync", - method: "POST", - body: { - profileId: "default", - profileRevision: profile.revision, - storageRevision: refreshed.payload.status.storageRevision, - provider: "openai", - keepCount: 5 - }, - headers: { Origin: handle.origin, "X-Codex-Provider-Device": credential } - }); - assert.equal(accepted.status, 200); - assert.equal(syncCalls.length, 1); - assert.equal(syncCalls[0].expectedConfigText, configText); - assert.equal(syncCalls[0].model, "gpt-5.2"); + const switchResponse = await api(handle, "/api/switch/apply", { + schemaVersion: 1, + planId: "switch-plan", + provider: "attacker" + }, credential); + const restoreResponse = await api(handle, "/api/restore/apply", { + schemaVersion: 1, + planId: "restore-plan", + backupId: "attacker" + }, credential); + assert.equal(switchResponse.status, 400); + assert.equal(restoreResponse.status, 400); + assert.equal(switchResponse.payload.coreError.code, "INVALID_INPUT"); + assert.equal(restoreResponse.payload.coreError.code, "INVALID_INPUT"); + assert.equal(switchCalls, 0); + assert.equal(restoreCalls, 0); } finally { await handle.close(); } }); -test("Web UI restore only accepts managed backups for the selected profile", async () => { - let restored = false; +test("Web Restore preparation delegates managed backup membership validation to Core", async () => { + let applies = 0; const handle = await startFixture({ - listBackups: async () => ({ backupRoot: "/tmp/.codex/backups_state/provider-sync", backups: [{ id: "known", path: "/tmp/.codex/backups_state/provider-sync/known", metadata: {} }] }), - runRestore: async () => { restored = true; return { targetProvider: "openai" }; } + prepareRestore: async ({ backupId }) => { + assert.equal(backupId, "../../outside"); + throw new CoreError("RESTORE_VALIDATION_FAILED", "The selected backup is not managed by this Codex Home."); + }, + applyRestore: async () => { applies += 1; } }); try { const { credential } = await handle.pair(); - const response = await api(handle, "/api/restore", { profileId: "default", backupId: "../../outside", restoreDatabase: true, restoreSessions: true }, credential); + const response = await api(handle, "/api/restore/prepare", { profileId: "default", backupId: "../../outside", restoreDatabase: true }, credential); assert.equal(response.status, 400); - assert.equal(restored, false); + assert.equal(response.payload.coreError.code, "RESTORE_VALIDATION_FAILED"); + assert.equal(applies, 0); } finally { await handle.close(); } @@ -847,8 +888,8 @@ test("startWebUi reports occupied ports clearly and handles unavailable or headl }); test("Web UI operations require a current profile revision and preserve a captured profile snapshot", async () => { - let syncCalls = 0; - const handle = await startFixture({ runSync: async () => { syncCalls += 1; return {}; } }); + let prepareCalls = 0; + const handle = await startFixture({ prepareSync: async () => { prepareCalls += 1; return {}; } }); try { const first = await handle.pair(); const second = await handle.pair(); @@ -867,7 +908,7 @@ test("Web UI operations require a current profile revision and preserve a captur const changed = await request({ origin: handle.origin, - pathname: "/api/sync", + pathname: "/api/sync/prepare", method: "POST", body: { profileId: "work", profileRevision: stale.revision, provider: "openai", keepCount: 5 }, headers: { Origin: handle.origin, "X-Codex-Provider-Device": first.credential } @@ -875,18 +916,18 @@ test("Web UI operations require a current profile revision and preserve a captur assert.equal(changed.status, 409); assert.equal(changed.payload.code, "PROFILE_CHANGED"); assert.equal(changed.payload.profile.codexHome, path.resolve("/tmp/work-after")); - assert.equal(syncCalls, 0); + assert.equal(prepareCalls, 0); const required = await request({ origin: handle.origin, - pathname: "/api/sync", + pathname: "/api/sync/prepare", method: "POST", body: { profileId: "work", provider: "openai", keepCount: 5 }, headers: { Origin: handle.origin, "X-Codex-Provider-Device": first.credential } }); assert.equal(required.status, 409); assert.equal(required.payload.code, "PROFILE_REVISION_REQUIRED"); - assert.equal(syncCalls, 0); + assert.equal(prepareCalls, 0); } finally { await handle.close(); } @@ -998,13 +1039,19 @@ test("Web UI state profile saves apply revision checks after asynchronous valida test("Web UI marks skipped locked rollout files as a partial operation outcome", async () => { const handle = await startFixture({ - readConfigText: async () => 'model = "gpt-5"\n', - readRootModelFromConfigText: () => "gpt-5", - runSync: async () => ({ skippedLockedRolloutFiles: ["rollout-active.jsonl"] }) + applySync: async () => ({ + schemaVersion: 1, + operationId: "partial-operation", + operation: "sync", + outcome: "partial", + backup: null, + warnings: [], + result: { skippedLockedRolloutFiles: ["rollout-active.jsonl"] } + }) }); try { const { credential } = await handle.pair(); - const response = await api(handle, "/api/sync", { profileId: "default", provider: "openai", keepCount: 5 }, credential); + const response = await api(handle, "/api/sync/apply", { schemaVersion: 1, planId: "partial-plan" }, credential); assert.equal(response.status, 200); assert.equal(response.payload.result.outcome, "partial"); } finally { @@ -1013,12 +1060,11 @@ test("Web UI marks skipped locked rollout files as a partial operation outcome", }); test("Web UI restore requires an explicit SQLite Home for relocation and rejects WSL UNC storage", async () => { - let restoreCalls = 0; - const backups = { backupRoot: "/tmp/.codex/backups_state/provider-sync", backups: [{ id: "known", path: "/tmp/.codex/backups_state/provider-sync/known", metadata: {} }] }; - const handle = await startFixture({ listBackups: async () => backups, runRestore: async () => { restoreCalls += 1; return {}; } }); + let restorePrepareCalls = 0; + const handle = await startFixture({ prepareRestore: async () => { restorePrepareCalls += 1; return {}; } }); try { const { credential } = await handle.pair(); - const relocation = await api(handle, "/api/restore", { + const relocation = await api(handle, "/api/restore/prepare", { profileId: "default", backupId: "known", restoreDatabase: true, @@ -1026,7 +1072,7 @@ test("Web UI restore requires an explicit SQLite Home for relocation and rejects }, credential); assert.equal(relocation.status, 400); assert.match(relocation.payload.error, /explicit SQLite Home target/); - assert.equal(restoreCalls, 0); + assert.equal(restorePrepareCalls, 0); } finally { await handle.close(); } @@ -1042,18 +1088,28 @@ test("Web UI restore requires an explicit SQLite Home for relocation and rejects }; assert.equal(wslStore.getProfile("default").sqliteHome, rawWslUnc); + let wslPrepareCalls = 0; const wslHandle = await startFixture( - { runSync: async () => { restoreCalls += 1; return {}; } }, + { + readConfigText: async () => 'model_provider = "openai"\n', + prepareSync: async (options) => { + wslPrepareCalls += 1; + assert.equal(options.sqliteHome, rawWslUnc); + throw new CoreError("SQLITE_UNSUPPORTED_PATH", "Windows cannot safely access SQLite through the WSL UNC path.", { + details: { reason: "windows-wsl-unc" } + }); + } + }, { platform: "win32", stateStore: wslStore } ); try { const { credential } = await wslHandle.pair(); - const rejected = await api(wslHandle, "/api/sync", { profileId: "default", provider: "openai", keepCount: 5 }, credential); + const rejected = await api(wslHandle, "/api/sync/prepare", { profileId: "default", provider: "openai", keepCount: 5 }, credential); assert.equal(rejected.status, 400); assert.match(rejected.payload.error, /Windows cannot safely access SQLite through the WSL UNC path/); assert.equal(rejected.payload.coreError.code, "SQLITE_UNSUPPORTED_PATH"); assert.deepEqual(rejected.payload.coreError.details, { reason: "windows-wsl-unc" }); - assert.equal(restoreCalls, 0); + assert.equal(wslPrepareCalls, 1); } finally { await wslHandle.close(); await fs.rm(wslCodexHome, { recursive: true, force: true }); diff --git a/web/dist/assets/index-BhSMcRqW.js.map b/web/dist/assets/index-BhSMcRqW.js.map deleted file mode 100644 index 78b651f..0000000 --- a/web/dist/assets/index-BhSMcRqW.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index-BhSMcRqW.js","names":[],"sources":["../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/scheduler/cjs/scheduler.production.min.js","../../../node_modules/scheduler/index.js","../../../node_modules/react-dom/cjs/react-dom.production.min.js","../../../node_modules/react-dom/index.js","../../../node_modules/react-dom/client.js","../../src/api.js","../../src/hooks.js","../../src/history-requests.js","../../src/operation-state.js","../../src/profile-refresh.js","../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/react/jsx-runtime.js","../../src/icons.jsx","../../src/App.jsx","../../src/main.jsx"],"sourcesContent":["/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1>>1,e=a[d];if(0>>1;dg(C,c))ng(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(ng(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Qa||125d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;cb}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"\")&&(k=k.replace(\"\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e\"+b.valueOf().toString()+\"\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a>=g;e-=g;rg=1<<32-oc(b)+e|c<w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;ww?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&Ng(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=Lg(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Tg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Rg(f.type,f.key,f.props,null,a.mode,h),h.ref=Lg(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=Sg(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);Mg(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=Qg(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Ug=Og(!0),Vg=Og(!1),Wg=Uf(null),Xg=null,Yg=null,Zg=null;function $g(){Zg=Yg=Xg=null}function ah(a){var b=Wg.current;E(Wg);a._currentValue=b}function bh(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}\nfunction ch(a,b){Xg=a;Zg=Yg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(dh=!0),a.firstContext=null)}function eh(a){var b=a._currentValue;if(Zg!==a)if(a={context:a,memoizedValue:b,next:null},null===Yg){if(null===Xg)throw Error(p(308));Yg=a;Xg.dependencies={lanes:0,firstContext:a}}else Yg=Yg.next=a;return b}var fh=null;function gh(a){null===fh?fh=[a]:fh.push(a)}\nfunction hh(a,b,c,d){var e=b.interleaved;null===e?(c.next=c,gh(b)):(c.next=e.next,e.next=c);b.interleaved=c;return ih(a,d)}function ih(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}var jh=!1;function kh(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}\nfunction lh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function mh(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}\nfunction nh(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(K&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return ih(a,c)}e=d.interleaved;null===e?(b.next=b,gh(d)):(b.next=e.next,e.next=b);d.interleaved=b;return ih(a,c)}function oh(a,b,c){b=b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nfunction ph(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction qh(a,b,c,d){var e=a.updateQueue;jh=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var m=a.alternate;null!==m&&(m=m.updateQueue,h=m.lastBaseUpdate,h!==g&&(null===h?m.firstBaseUpdate=l:h.next=l,m.lastBaseUpdate=k))}if(null!==f){var q=e.baseState;g=0;m=l=k=null;h=f;do{var r=h.lane,y=h.eventTime;if((d&r)===r){null!==m&&(m=m.next={eventTime:y,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,\nnext:null});a:{var n=a,t=h;r=b;y=c;switch(t.tag){case 1:n=t.payload;if(\"function\"===typeof n){q=n.call(y,q,r);break a}q=n;break a;case 3:n.flags=n.flags&-65537|128;case 0:n=t.payload;r=\"function\"===typeof n?n.call(y,q,r):n;if(null===r||void 0===r)break a;q=A({},q,r);break a;case 2:jh=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=[h]:r.push(h))}else y={eventTime:y,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===m?(l=m=y,k=q):m=m.next=y,g|=r;\nh=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===m&&(k=q);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=m;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);rh|=g;a.lanes=g;a.memoizedState=q}}\nfunction sh(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;bc?c:4;a(!0);var d=Gh.transition;Gh.transition={};try{a(!1),b()}finally{C=c,Gh.transition=d}}function wi(){return Uh().memoizedState}\nfunction xi(a,b,c){var d=yi(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,c);else if(c=hh(a,b,c,d),null!==c){var e=R();gi(c,a,d,e);Bi(c,b,d)}}\nfunction ii(a,b,c){var d=yi(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,gh(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=hh(a,b,e,d);null!==c&&(e=R(),gi(c,a,d,e),Bi(c,b,d))}}\nfunction zi(a){var b=a.alternate;return a===M||null!==b&&b===M}function Ai(a,b){Jh=Ih=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Bi(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar Rh={readContext:eh,useCallback:P,useContext:P,useEffect:P,useImperativeHandle:P,useInsertionEffect:P,useLayoutEffect:P,useMemo:P,useReducer:P,useRef:P,useState:P,useDebugValue:P,useDeferredValue:P,useTransition:P,useMutableSource:P,useSyncExternalStore:P,useId:P,unstable_isNewReconciler:!1},Oh={readContext:eh,useCallback:function(a,b){Th().memoizedState=[a,void 0===b?null:b];return a},useContext:eh,useEffect:mi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ki(4194308,\n4,pi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ki(4194308,4,a,b)},useInsertionEffect:function(a,b){return ki(4,2,a,b)},useMemo:function(a,b){var c=Th();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=xi.bind(null,M,a);return[d.memoizedState,a]},useRef:function(a){var b=\nTh();a={current:a};return b.memoizedState=a},useState:hi,useDebugValue:ri,useDeferredValue:function(a){return Th().memoizedState=a},useTransition:function(){var a=hi(!1),b=a[0];a=vi.bind(null,a[1]);Th().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=M,e=Th();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===Q)throw Error(p(349));0!==(Hh&30)||di(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;mi(ai.bind(null,d,\nf,a),[a]);d.flags|=2048;bi(9,ci.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=Th(),b=Q.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Kh++;0\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;zj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;eGj&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304)}else{if(!d)if(a=Ch(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Dj(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Gj&&1073741824!==c&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=L.current,G(L,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Hj(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(fj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Ij(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return zh(),E(Wf),E(H),Eh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Bh(b),null;case 13:E(L);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(L),null;case 4:return zh(),null;case 10:return ah(b.type._context),null;case 22:case 23:return Hj(),\nnull;case 24:return null;default:return null}}var Jj=!1,U=!1,Kj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Lj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Mj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Nj=!1;\nfunction Oj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Ci(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Nj;Nj=!1;return n}\nfunction Pj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Mj(b,c,f)}e=e.next}while(e!==d)}}function Qj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Rj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Sj(a){var b=a.alternate;null!==b&&(a.alternate=null,Sj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Tj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Uj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Tj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Vj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Vj(a,b,c),a=a.sibling;null!==a;)Vj(a,b,c),a=a.sibling}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}var X=null,Xj=!1;function Yj(a,b,c){for(c=c.child;null!==c;)Zj(a,b,c),c=c.sibling}\nfunction Zj(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Lj(c,b);case 6:var d=X,e=Xj;X=null;Yj(a,b,c);X=d;Xj=e;null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Xj;X=c.stateNode.containerInfo;Xj=!0;\nYj(a,b,c);X=d;Xj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Mj(c,b,g):0!==(f&4)&&Mj(c,b,g));e=e.next}while(e!==d)}Yj(a,b,c);break;case 1:if(!U&&(Lj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Yj(a,b,c);break;case 21:Yj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Yj(a,b,c),U=d):Yj(a,b,c);break;default:Yj(a,b,c)}}function ak(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Kj);b.forEach(function(b){var d=bk.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction ck(a,b){var c=b.deletions;if(null!==c)for(var d=0;de&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*lk(d/1960))-d;if(10a?16:a;if(null===wk)var d=!1;else{a=wk;wk=null;xk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;kB()-fk?Kk(a,0):rk|=c);Dk(a,b)}function Yk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=R();a=ih(a,b);null!==a&&(Ac(a,b,c),Dk(a,c))}function uj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Yk(a,c)}\nfunction bk(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Yk(a,c)}var Vk;\nVk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)dh=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return dh=!1,yj(a,b,c);dh=0!==(a.flags&131072)?!0:!1}else dh=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;ij(a,b);a=b.pendingProps;var e=Yf(b,H.current);ch(b,c);e=Nh(null,b,d,a,e,c);var f=Sh();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,kh(b),e.updater=Ei,b.stateNode=e,e._reactInternals=b,Ii(b,d,a,c),b=jj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Xi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{ij(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=Zk(d);a=Ci(d,a);switch(e){case 0:b=cj(null,b,d,a,c);break a;case 1:b=hj(null,b,d,a,c);break a;case 11:b=Yi(null,b,d,a,c);break a;case 14:b=$i(null,b,d,Ci(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),cj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),hj(a,b,d,e,c);case 3:a:{kj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;lh(a,b);qh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ji(Error(p(423)),b);b=lj(a,b,d,c,e);break a}else if(d!==e){e=Ji(Error(p(424)),b);b=lj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Vg(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=Zi(a,b,c);break a}Xi(a,b,d,c)}b=b.child}return b;case 5:return Ah(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\ngj(a,b),Xi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return oj(a,b,c);case 4:return yh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Ug(b,null,d,c):Xi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),Yi(a,b,d,e,c);case 7:return Xi(a,b,b.pendingProps,c),b.child;case 8:return Xi(a,b,b.pendingProps.children,c),b.child;case 12:return Xi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Wg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=Zi(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=mh(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);bh(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);bh(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Xi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,ch(b,c),e=eh(e),d=d(e),b.flags|=1,Xi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Ci(d,b.pendingProps),e=Ci(d.type,e),$i(a,b,d,e,c);case 15:return bj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),ij(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,ch(b,c),Gi(b,d,e),Ii(b,d,e,c),jj(null,b,d,!0,a,c);case 19:return xj(a,b,c);case 22:return dj(a,b,c)}throw Error(p(156,b.tag));};function Fk(a,b){return ac(a,b)}\nfunction $k(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new $k(a,b,c,d)}function aj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction Zk(a){if(\"function\"===typeof a)return aj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction Pg(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Rg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)aj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Tg(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return pj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Tg(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function pj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function Qg(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction Sg(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction al(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function bl(a,b,c,d,e,f,g,h,k){a=new al(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};kh(f);return a}function cl(a,b,c){var d=3 ({}));\r\n if (!response.ok || !payload.deviceCredential) {\r\n throw new PairingRequiredError(payload.error ?? \"配对链接无效、已过期或已被使用。请重新运行 codex-provider web。\");\r\n }\r\n window.localStorage.setItem(DEVICE_STORAGE_KEY, payload.deviceCredential);\r\n window.history.replaceState(null, \"\", `${window.location.pathname}${window.location.search}`);\r\n return true;\r\n}\r\n\r\nfunction deviceHeaders() {\r\n return { \"X-Codex-Provider-Device\": window.localStorage.getItem(DEVICE_STORAGE_KEY) ?? \"\" };\r\n}\r\n\r\nexport function toRequestError(payload, status, fallback) {\r\n if (status === 409 && [\r\n \"PROFILE_REVISION_REQUIRED\",\r\n \"PROFILE_CHANGED\",\r\n \"STORAGE_REVISION_REQUIRED\",\r\n \"STORAGE_CHANGED\"\r\n ].includes(payload.code)) {\r\n return new ProfileRevisionError(payload.code, payload.error, payload.profile);\r\n }\r\n return new Error(payload.error ?? fallback);\r\n}\r\n\r\nasync function parseResponse(response, fallback) {\r\n const payload = await response.json().catch(() => ({}));\r\n if (!response.ok) {\r\n if (payload.code === \"PAIRING_REQUIRED\") {\r\n window.dispatchEvent(new CustomEvent(\"cps:pairing-required\", { detail: payload.error }));\r\n throw new PairingRequiredError(payload.error);\r\n }\r\n throw toRequestError(payload, response.status, fallback);\r\n }\r\n return payload;\r\n}\r\n\r\nexport async function apiRequest(path, body = {}, { signal } = {}) {\r\n const response = await fetch(path, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n ...deviceHeaders()\r\n },\r\n body: JSON.stringify(body),\r\n signal\r\n });\r\n return parseResponse(response, `Request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function getActivity(after = 0) {\r\n const response = await fetch(`/api/activity?after=${after}`, {\r\n headers: deviceHeaders()\r\n });\r\n return parseResponse(response, `Activity request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function getProfiles() {\r\n const response = await fetch(\"/api/profiles\", { headers: deviceHeaders() });\r\n return parseResponse(response, `Profile request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function forgetThisBrowser() {\r\n try {\r\n await apiRequest(\"/api/access/forget\");\r\n } finally {\r\n window.localStorage.removeItem(DEVICE_STORAGE_KEY);\r\n }\r\n}\r\n\r\nexport async function getHistory(body = {}, options = {}) {\r\n return apiRequest(\"/api/history\", body, options);\r\n}\r\n\r\nexport async function getHistorySession(body = {}, options = {}) {\r\n return apiRequest(\"/api/history/session\", body, options);\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\nexport function usePersistentState(key, initialValue) {\r\n const [value, setValue] = useState(() => {\r\n try {\r\n const stored = window.localStorage.getItem(key);\r\n return stored ? JSON.parse(stored) : initialValue;\r\n } catch {\r\n return initialValue;\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n window.localStorage.setItem(key, JSON.stringify(value));\r\n }, [key, value]);\r\n\r\n return [value, setValue];\r\n}\r\n","export function createLatestRequestGate() {\r\n let sequence = 0;\r\n let controller = null;\r\n return {\r\n begin() {\r\n controller?.abort();\r\n controller = new AbortController();\r\n sequence += 1;\r\n return { sequence, controller, signal: controller.signal };\r\n },\r\n isLatest(candidate) {\r\n return candidate === sequence;\r\n },\r\n cancel() {\r\n controller?.abort();\r\n sequence += 1;\r\n }\r\n };\r\n}\r\n\r\nexport function scheduleDebounced(callback, delay = 300, timers = globalThis) {\r\n const id = timers.setTimeout(callback, delay);\r\n return () => timers.clearTimeout(id);\r\n}\r\n","export function captureProfileOperation(profile, operation, status) {\r\n if (!profile?.id\r\n || !profile?.revision\r\n || status?.profileId !== profile.id\r\n || status?.profileRevision !== profile.revision\r\n || !status?.storageRevision) return null;\r\n return {\r\n ...operation,\r\n profile: { ...profile },\r\n profileId: profile.id,\r\n profileRevision: profile.revision,\r\n storageRevision: status.storageRevision,\r\n status: { ...status }\r\n };\r\n}\r\n\r\nexport function skippedLockedRolloutFiles(payload) {\r\n const files = payload?.result?.skippedLockedRolloutFiles ?? payload?.skippedLockedRolloutFiles ?? [];\r\n return Array.isArray(files) ? files.filter(Boolean) : [];\r\n}\r\n\r\nexport function operationToast(payload, { successTitle, partialTitle, message }) {\r\n const skipped = skippedLockedRolloutFiles(payload);\r\n const partial = payload?.result?.outcome === \"partial\" || payload?.outcome === \"partial\" || skipped.length > 0;\r\n if (!partial) return { tone: \"success\", title: successTitle, message };\r\n const skippedDetail = skipped.length\r\n ? `已跳过 ${skipped.length} 个被占用的 rollout 文件:${skipped.join(\"、\")}`\r\n : \"部分项目未完成;请查看活动日志后重试。\";\r\n return {\r\n tone: \"warning\",\r\n title: partialTitle,\r\n message: [message, skippedDetail].filter(Boolean).join(\";\")\r\n };\r\n}\r\n\r\nfunction normalizeHistoryPath(path, platform) {\r\n const normalized = String(path ?? \"\").replaceAll(\"\\\\\", \"/\").replace(/\\/{2,}/g, \"/\").replace(/\\/$/, \"\");\r\n return platform === \"win32\" ? normalized.toLowerCase() : normalized;\r\n}\r\n\r\nexport function dedupeHistorySessions(sessions = [], { platform = typeof process !== \"undefined\" ? process.platform : \"browser\" } = {}) {\r\n const seen = new Set();\r\n return sessions.filter((session, index) => {\r\n const threadId = session?.threadId ?? session?.id;\r\n const rolloutPath = session?.rolloutPath ?? session?.filePath ?? session?.rolloutFile ?? session?.path;\r\n const key = threadId ? `thread:${threadId}` : rolloutPath ? `rollout:${normalizeHistoryPath(rolloutPath, platform)}` : `item:${index}`;\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n}\r\n\r\nfunction normalizeStoragePath(value, { caseInsensitive = false } = {}) {\r\n const normalized = String(value ?? \"\").replace(/[\\\\/]+$/, \"\").replaceAll(\"\\\\\", \"/\");\r\n return caseInsensitive ? normalized.toLowerCase() : normalized;\r\n}\r\n\r\nfunction storagePathsEqual(left, right, options) {\r\n return Boolean(left && right && normalizeStoragePath(left, options) === normalizeStoragePath(right, options));\r\n}\r\n\r\nfunction storageParentPath(value) {\r\n const normalized = String(value ?? \"\").replace(/[\\\\/]+$/, \"\");\r\n const separatorIndex = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\r\n if (separatorIndex < 0) return \"\";\r\n if (separatorIndex === 0) return normalized.slice(0, 1);\r\n if (separatorIndex === 2 && /^[A-Za-z]:/.test(normalized)) return normalized.slice(0, 3);\r\n return normalized.slice(0, separatorIndex);\r\n}\r\n\r\nexport function resolveRestoreTargetSqliteHome(status, backup) {\r\n const currentDatabasePath = status?.stateDbLocation?.path;\r\n if (currentDatabasePath) return storageParentPath(currentDatabasePath);\r\n const backupMetadata = backup?.metadata;\r\n const comparison = { caseInsensitive: status?.pathComparisonCaseInsensitive === true };\r\n if (Number(backupMetadata?.version) >= 2\r\n && status?.sqliteHomeSource === \"default\"\r\n && storagePathsEqual(backupMetadata?.sqliteHome, status?.codexHome, comparison)) {\r\n return status.codexHome;\r\n }\r\n return status?.sqliteHome ?? \"\";\r\n}\r\n\r\nexport function restoreRelocationState({ backup, profile, targetSqliteHome, restoreDatabase, restoreConfig, sqliteSupported, pathComparisonCaseInsensitive = false }) {\r\n const sourceSqliteHome = backup?.metadata?.sqliteHome;\r\n const explicitSqliteHome = profile?.sqliteHome?.trim() ?? \"\";\r\n const requiresRelocation = Boolean(\r\n restoreDatabase\r\n && sourceSqliteHome\r\n && targetSqliteHome\r\n && !storagePathsEqual(sourceSqliteHome, targetSqliteHome, { caseInsensitive: pathComparisonCaseInsensitive })\r\n );\r\n const missingExplicitTarget = requiresRelocation && !explicitSqliteHome;\r\n const configRestoreConflict = requiresRelocation && restoreConfig;\r\n return {\r\n requiresRelocation,\r\n missingExplicitTarget,\r\n configRestoreConflict,\r\n canSubmit: Boolean(sqliteSupported) && !missingExplicitTarget && !configRestoreConflict\r\n };\r\n}\r\n","import { createLatestRequestGate } from \"./history-requests.js\";\r\n\r\nexport function storagePayload(profileId) {\r\n return { profileId: profileId || \"default\" };\r\n}\r\n\r\n// Loads status and backups for a storage profile while guaranteeing that only\r\n// the most recently started refresh may touch the UI. A stale request — for\r\n// example one started for profile A before the user switched to profile B —\r\n// is aborted and its results, errors, and loading transitions are discarded,\r\n// even when it finishes after the newer request.\r\nexport function createProfileRefresh({ fetchStatus, fetchBackups, gate = createLatestRequestGate() }) {\r\n const refresh = async ({ profileId, showLoading = true, onLoading, onResult, onError }) => {\r\n const { controller, sequence } = gate.begin();\r\n if (showLoading) onLoading?.(true);\r\n try {\r\n const storage = storagePayload(profileId);\r\n const [statusPayload, backupPayload] = await Promise.all([\r\n fetchStatus(storage, { signal: controller.signal }),\r\n fetchBackups(storage, { signal: controller.signal })\r\n ]);\r\n if (!gate.isLatest(sequence)) return false;\r\n onResult?.({ profileId, status: statusPayload.status, backups: backupPayload });\r\n return true;\r\n } catch (error) {\r\n if (error?.name === \"AbortError\" || !gate.isLatest(sequence)) return false;\r\n onError?.(error);\r\n return false;\r\n } finally {\r\n if (gate.isLatest(sequence)) onLoading?.(false);\r\n }\r\n };\r\n refresh.cancel = () => gate.cancel();\r\n return refresh;\r\n}\r\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from \"react\";\r\n\r\nfunction Icon({ children, size = 18, className = \"\" }) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nexport const RefreshIcon = (props) => ;\r\nexport const DatabaseIcon = (props) => ;\r\nexport const HistoryIcon = (props) => ;\r\nexport const ActivityIcon = (props) => ;\r\nexport const OverviewIcon = (props) => ;\r\nexport const ShieldIcon = (props) => ;\r\nexport const ChevronIcon = (props) => ;\r\nexport const XIcon = (props) => ;\r\nexport const CheckIcon = (props) => ;\r\nexport const AlertIcon = (props) => ;\r\nexport const FolderIcon = (props) => ;\r\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nimport {\r\n PairingRequiredError,\r\n ProfileRevisionError,\r\n apiRequest,\r\n forgetThisBrowser,\r\n getActivity,\r\n getHistory,\r\n getHistorySession,\r\n getProfiles,\r\n initializeAccess\r\n} from \"./api.js\";\r\nimport { usePersistentState } from \"./hooks.js\";\r\nimport { createLatestRequestGate, scheduleDebounced } from \"./history-requests.js\";\r\nimport { captureProfileOperation, dedupeHistorySessions, operationToast, resolveRestoreTargetSqliteHome, restoreRelocationState } from \"./operation-state.js\";\r\nimport { createProfileRefresh, storagePayload } from \"./profile-refresh.js\";\r\nimport {\r\n ActivityIcon,\r\n AlertIcon,\r\n CheckIcon,\r\n ChevronIcon,\r\n DatabaseIcon,\r\n FolderIcon,\r\n HistoryIcon,\r\n OverviewIcon,\r\n RefreshIcon,\r\n ShieldIcon,\r\n XIcon\r\n} from \"./icons.jsx\";\r\n\r\nconst NAV_ITEMS = [\r\n { id: \"overview\", label: \"概览\", icon: OverviewIcon },\r\n { id: \"history\", label: \"聊天记录\", icon: HistoryIcon },\r\n { id: \"backups\", label: \"备份\", icon: HistoryIcon },\r\n { id: \"activity\", label: \"活动\", icon: ActivityIcon }\r\n];\r\n\r\nconst EMPTY_BACKUPS = { backupRoot: \"\", backups: [] };\r\n\r\nfunction formatNumber(value) {\r\n return new Intl.NumberFormat(\"zh-CN\").format(Number(value) || 0);\r\n}\r\n\r\nfunction formatBytes(bytes) {\r\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\r\n let value = Number(bytes) || 0;\r\n let index = 0;\r\n while (value >= 1024 && index < units.length - 1) {\r\n value /= 1024;\r\n index += 1;\r\n }\r\n return index === 0 ? `${value} B` : `${value.toFixed(value >= 10 ? 1 : 2).replace(/\\.0$/, \"\")} ${units[index]}`;\r\n}\r\n\r\nfunction formatDate(value) {\r\n if (!value) return \"未知时间\";\r\n return new Intl.DateTimeFormat(\"zh-CN\", {\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n hour12: false\r\n }).format(new Date(value));\r\n}\r\n\r\nfunction renderInlineMarkdown(text, keyPrefix) {\r\n const parts = text.split(/(`[^`]+`|\\*\\*[^*]+\\*\\*|\\*[^*]+\\*)/g);\r\n return parts.map((part, index) => {\r\n if (part.startsWith(\"`\") && part.endsWith(\"`\")) return {part.slice(1, -1)};\r\n if (part.startsWith(\"**\") && part.endsWith(\"**\")) return {part.slice(2, -2)};\r\n if (part.startsWith(\"*\") && part.endsWith(\"*\")) return {part.slice(1, -1)};\r\n return {part};\r\n });\r\n}\r\n\r\nfunction SafeMarkdown({ text }) {\r\n const blocks = String(text ?? \"\").split(/(```[^\\n]*\\n[\\s\\S]*?```)/g);\r\n return blocks.map((block, index) => {\r\n if (block.startsWith(\"```\") && block.endsWith(\"```\")) {\r\n const lines = block.slice(3, -3).replace(/^\\w*\\n/, \"\");\r\n return
{lines}
;\r\n }\r\n return block.split(\"\\n\").map((line, lineIndex, lines) => {renderInlineMarkdown(line, `${index}-${lineIndex}`)}{lineIndex < lines.length - 1 ?
: null}
);\r\n });\r\n}\r\n\r\nfunction providersFromStatus(status) {\r\n if (!status) return [];\r\n const sources = new Map();\r\n const add = (values, source) => {\r\n for (const value of values ?? []) {\r\n if (!value || value === \"(missing)\") continue;\r\n const bucket = sources.get(value) ?? new Set();\r\n bucket.add(source);\r\n sources.set(value, bucket);\r\n }\r\n };\r\n add(status.configuredProviders, \"config\");\r\n add(Object.keys(status.rolloutCounts?.sessions ?? {}), \"rollout\");\r\n add(Object.keys(status.rolloutCounts?.archived_sessions ?? {}), \"rollout\");\r\n add(Object.keys(status.sqliteCounts?.sessions ?? {}), \"sqlite\");\r\n add(Object.keys(status.sqliteCounts?.archived_sessions ?? {}), \"sqlite\");\r\n add([status.currentProvider], \"config\");\r\n return [...sources.entries()]\r\n .map(([id, providerSources]) => ({\r\n id,\r\n sources: [...providerSources],\r\n configured: status.configuredProviders?.includes(id),\r\n current: id === status.currentProvider\r\n }))\r\n .sort((left, right) => Number(right.current) - Number(left.current) || left.id.localeCompare(right.id));\r\n}\r\n\r\nfunction StatusDot({ tone = \"neutral\" }) {\r\n return ;\r\n}\r\n\r\nfunction AppHeader({ status, busy, onRefresh }) {\r\n const healthy = status?.sqliteAccess?.supported !== false && !status?.sqliteCounts?.unreadable;\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
Codex Provider Sync
\r\n
本机元数据一致性工具
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {busy ? \"操作执行中\" : healthy ? \"本地服务就绪\" : \"需要检查\"}\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Sidebar({ view, setView, status, onForgetBrowser }) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction StorageBar({ profiles, profileId, setProfileId, status, onAddProfile, onDeleteProfile, onRefresh, loading, profileSwitchDisabled }) {\r\n return (\r\n
\r\n \r\n \r\n \r\n {profileId !== \"default\" ? : null}\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction ProviderBars({ title, counts, currentProvider }) {\r\n const entries = Object.entries(counts ?? {}).sort((left, right) => right[1] - left[1]);\r\n const total = entries.reduce((sum, [, count]) => sum + count, 0);\r\n return (\r\n
\r\n
\r\n {title}\r\n {formatNumber(total)}\r\n
\r\n
\r\n {entries.length === 0 ?
无记录
: entries.map(([provider, count]) => (\r\n
\r\n
\r\n {provider}\r\n {formatNumber(count)}\r\n
\r\n
\r\n \r\n
\r\n
\r\n ))}\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction StatusPanel({ status, loading }) {\r\n const rolloutTotal = Object.values(status?.rolloutCounts?.sessions ?? {}).reduce((sum, value) => sum + value, 0)\r\n + Object.values(status?.rolloutCounts?.archived_sessions ?? {}).reduce((sum, value) => sum + value, 0);\r\n const sqliteTotal = Object.values(status?.sqliteCounts?.sessions ?? {}).reduce((sum, value) => sum + value, 0)\r\n + Object.values(status?.sqliteCounts?.archived_sessions ?? {}).reduce((sum, value) => sum + value, 0);\r\n const aligned = status?.alignment?.aligned;\r\n return (\r\n
\r\n
\r\n
\r\n

状态总览

\r\n

比较 rollout 文件、SQLite 线程索引和当前 Provider。

\r\n
\r\n
\r\n {loading ? : aligned ? : }\r\n {loading ? \"正在检查\" : aligned ? \"Provider 元数据已对齐\" : \"发现不一致\"}\r\n
\r\n
\r\n\r\n
\r\n
\r\n 当前 Provider\r\n {status?.currentProvider ?? \"—\"}\r\n {status?.currentProviderImplicit ? \"隐式默认\" : \"config.toml 根级配置\"}\r\n
\r\n
\r\n Rollout 文件\r\n {formatNumber(rolloutTotal)}\r\n sessions + archived\r\n
\r\n
\r\n SQLite threads\r\n {status?.sqliteCounts?.unreadable ? \"不可读\" : formatNumber(sqliteTotal)}\r\n {status?.stateDbLocation?.source ?? \"未定位数据库\"}\r\n
\r\n
\r\n 托管备份\r\n {formatNumber(status?.backupSummary?.count)}\r\n {formatBytes(status?.backupSummary?.totalBytes)}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Rollout files
\r\n \r\n \r\n
\r\n
\r\n
\r\n
SQLite state
\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Warnings({ status }) {\r\n const items = [];\r\n if (status?.sqliteAccess?.supported === false) {\r\n items.push({ tone: \"danger\", title: \"SQLite 路径不可安全访问\", detail: status.sqliteAccess.message });\r\n }\r\n if (status?.sqliteCounts?.unreadable) {\r\n items.push({ tone: \"danger\", title: \"SQLite 当前不可读\", detail: status.sqliteCounts.error });\r\n }\r\n if (status?.lockedRolloutFiles?.length) {\r\n items.push({ tone: \"warning\", title: `${status.lockedRolloutFiles.length} 个 rollout 文件正在使用`, detail: \"同步会跳过这些活跃文件;会话结束后可再次执行。\" });\r\n }\r\n if (status?.encryptedContentWarning) {\r\n items.push({ tone: \"warning\", title: \"检测到 encrypted_content\", detail: status.encryptedContentWarning });\r\n }\r\n const repairs = status?.sqliteRepairStats;\r\n if (repairs?.userEventRowsNeedingRepair || repairs?.cwdRowsNeedingRepair) {\r\n items.push({ tone: \"info\", title: \"SQLite 有待修复字段\", detail: `user-event ${repairs.userEventRowsNeedingRepair ?? 0},cwd ${repairs.cwdRowsNeedingRepair ?? 0}` });\r\n }\r\n if (items.length === 0) return null;\r\n return (\r\n
\r\n {items.map((item, index) => (\r\n
\r\n \r\n
{item.title}{item.detail}
\r\n
\r\n ))}\r\n
\r\n );\r\n}\r\n\r\nfunction ProjectVisibility({ projects = [] }) {\r\n return (\r\n
\r\n
\r\n

项目可见性

检查 Desktop 项目路径、全局排序和首屏 50 条命中。

\r\n
\r\n
\r\n \r\n \r\n \r\n {projects.length === 0 ? (\r\n \r\n ) : projects.map((project) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
项目根目录交互会话首屏RanksCWD 精确匹配Provider
没有可显示的项目诊断。
{project.root}{project.interactiveThreads}{project.firstPageThreads}/50{project.rankPreview || \"—\"}{project.exactCwdMatches}/{project.interactiveThreads}{Object.entries(project.providerCounts ?? {}).map(([provider, count]) => `${provider} ${count}`).join(\" · \") || \"—\"}
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction SegmentedControl({ value, onChange, disabled }) {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nfunction ExecutionPanel({ status, providers, selectedProvider, setSelectedProvider, onAddManualProvider, onRemoveManualProvider, onRequestExecute, busy }) {\r\n const [mode, setMode] = usePersistentState(\"cps.web.mode\", \"sync\");\r\n const [modelMode, setModelMode] = usePersistentState(\"cps.web.modelMode\", \"auto\");\r\n const [customModel, setCustomModel] = usePersistentState(\"cps.web.customModel\", \"\");\r\n const [keepCount, setKeepCount] = usePersistentState(\"cps.web.keepCount\", 5);\r\n const [manualProvider, setManualProvider] = useState(\"\");\r\n const selectedOption = providers.find((provider) => provider.id === selectedProvider);\r\n const switchAllowed = selectedOption?.configured;\r\n const validManualProvider = /^[A-Za-z0-9_.-]+$/.test(manualProvider.trim());\r\n const sqliteUnsupported = status?.sqliteAccess?.supported === false;\r\n const executeDisabled = busy || !selectedProvider || sqliteUnsupported || status?.sqliteCounts?.unreadable;\r\n\r\n return (\r\n
\r\n
\r\n

执行同步

所有写操作都会先创建备份。执行前请关闭 Codex CLI、App 和 app-server。

\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n setManualProvider(event.target.value)}\r\n placeholder=\"手动添加 Provider ID\"\r\n spellCheck=\"false\"\r\n disabled={busy}\r\n />\r\n {\r\n onAddManualProvider(manualProvider.trim());\r\n setManualProvider(\"\");\r\n }}\r\n >\r\n 添加\r\n \r\n {selectedOption?.manual ? : null}\r\n
\r\n\r\n {mode === \"switch\" ? (\r\n
\r\n 根级 model\r\n \r\n \r\n \r\n
\r\n ) : null}\r\n\r\n {sqliteUnsupported ?
此 SQLite 布局仅供诊断{status?.sqliteAccess?.message || \"当前 SQLite 路径不可由 Web UI 安全写入,因此已禁用执行同步。\"}
: null}\r\n\r\n
修改前创建 metadata v2 备份,并记录 SQLite Home
\r\n onRequestExecute({ mode, modelMode, model: customModel.trim(), keepCount })}\r\n >\r\n {busy ? : }\r\n {busy ? \"正在执行…\" : mode === \"switch\" ? \"切换并同步\" : \"执行同步\"}\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction RecentBackups({ backups, onViewAll, onRestore, restoreDisabled }) {\r\n return (\r\n
\r\n
\r\n

最近备份

{backups.backupRoot || \"同步后将在 Codex Home 下创建备份\"}

\r\n \r\n
\r\n
\r\n {backups.backups.length === 0 ?
尚无由本工具创建的备份。
: backups.backups.slice(0, 3).map((backup) => (\r\n
\r\n
\r\n
{formatDate(backup.metadata.createdAt)}{backup.metadata.targetProvider} · {backup.metadata.changedSessionFiles ?? 0} 个 rollout
\r\n
{formatBytes(backup.sizeBytes)}
\r\n \r\n
\r\n ))}\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Overview({ status, backups, providers, selectedProvider, setSelectedProvider, onAddManualProvider, onRemoveManualProvider, onExecute, onRestore, setView, busy, loading }) {\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n setView(\"backups\")} onRestore={onRestore} restoreDisabled={status?.sqliteAccess?.supported === false} />\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction BackupsView({ backups, status, busy, onRestore, onPrune }) {\r\n const [keepCount, setKeepCount] = usePersistentState(\"cps.web.keepCount\", 5);\r\n const restoreDisabled = status?.sqliteAccess?.supported === false;\r\n return (\r\n
\r\n
\r\n

备份

管理当前 Codex Home 下由本工具创建的 metadata v2 备份。

\r\n
\r\n
\r\n
\r\n
{backups.backupRoot || status?.backupRoot || \"—\"}{backups.backups.length} 份 · {formatBytes(backups.backups.reduce((sum, backup) => sum + backup.sizeBytes, 0))}
\r\n
\r\n {backups.backups.length === 0 ?
还没有备份执行一次同步或切换后,备份会显示在这里。
: backups.backups.map((backup) => (\r\n
\r\n
{formatDate(backup.metadata.createdAt)}{backup.id}
\r\n
Provider {backup.metadata.targetProvider}Rollout {backup.metadata.changedSessionFiles ?? 0}SQLite {backup.metadata.sqliteDbFiles?.length ? \"已包含\" : \"未包含\"}
\r\n
SQLite Home{backup.metadata.sqliteHome ?? \"旧版 metadata 未记录\"}
\r\n
{formatBytes(backup.sizeBytes)}
\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction ActivityView({ activity, activeOperation }) {\r\n return (\r\n
\r\n

活动日志

当前 Web UI 会话中的状态刷新、同步阶段和操作结果。

{activeOperation ?
{activeOperation.kind}
: null}
\r\n
\r\n
Activity log{activity.length} entries
\r\n
\r\n {activity.length === 0 ?
等待操作…
: activity.map((entry) => (\r\n
\r\n \r\n {entry.level}\r\n {entry.message}\r\n {typeof entry.detail === \"string\" ? {entry.detail} : null}\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction HistoryView({ profileId, status }) {\r\n const [query, setQuery] = useState(\"\");\r\n const [committedQuery, setCommittedQuery] = useState(\"\");\r\n const [provider, setProvider] = useState(\"\");\r\n const [project, setProject] = useState(\"\");\r\n const [archived, setArchived] = useState(\"all\");\r\n const [page, setPage] = useState(1);\r\n const [history, setHistory] = useState({ sessions: [], total: 0, pageSize: 50, hasNextPage: false });\r\n const [selectedId, setSelectedId] = useState(\"\");\r\n const [detail, setDetail] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [detailLoading, setDetailLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n const listRequest = useRef(null);\r\n const detailRequest = useRef(null);\r\n if (!listRequest.current) listRequest.current = createLatestRequestGate();\r\n if (!detailRequest.current) detailRequest.current = createLatestRequestGate();\r\n const providers = providersFromStatus(status);\r\n const projects = [...new Set((status?.projectThreadVisibility ?? []).map((item) => item.root))];\r\n\r\n useEffect(() => {\r\n listRequest.current.cancel();\r\n detailRequest.current.cancel();\r\n setQuery(\"\");\r\n setCommittedQuery(\"\");\r\n setProvider(\"\");\r\n setProject(\"\");\r\n setArchived(\"all\");\r\n setPage(1);\r\n setHistory({ sessions: [], total: 0, pageSize: 50, hasNextPage: false });\r\n setSelectedId(\"\");\r\n setDetail(null);\r\n setError(\"\");\r\n }, [profileId]);\r\n\r\n useEffect(() => {\r\n return scheduleDebounced(() => setCommittedQuery(query), 300, window);\r\n }, [query]);\r\n\r\n const loadList = useCallback(async () => {\r\n const { controller, sequence } = listRequest.current.begin();\r\n setLoading(true); setError(\"\");\r\n try {\r\n const payload = await getHistory({ ...storagePayload(profileId), page, pageSize: 50, query: committedQuery, provider, project, archived }, { signal: controller.signal });\r\n if (!listRequest.current.isLatest(sequence)) return;\r\n const nextHistory = { ...payload.history, sessions: dedupeHistorySessions(payload.history?.sessions) };\r\n setHistory(nextHistory);\r\n setSelectedId((current) => nextHistory.sessions.some((session) => session.id === current) ? current : nextHistory.sessions[0]?.id ?? \"\");\r\n } catch (requestError) {\r\n if (requestError.name !== \"AbortError\" && listRequest.current.isLatest(sequence)) setError(requestError.message);\r\n } finally {\r\n if (listRequest.current.isLatest(sequence)) setLoading(false);\r\n }\r\n }, [profileId, page, committedQuery, provider, project, archived]);\r\n\r\n useEffect(() => {\r\n loadList();\r\n return () => listRequest.current.cancel();\r\n }, [loadList]);\r\n useEffect(() => {\r\n detailRequest.current.cancel();\r\n if (!selectedId) { setDetail(null); setDetailLoading(false); return undefined; }\r\n const { controller, sequence } = detailRequest.current.begin();\r\n setDetail(null);\r\n setDetailLoading(true);\r\n setError(\"\");\r\n getHistorySession({ ...storagePayload(profileId), sessionId: selectedId }, { signal: controller.signal })\r\n .then((payload) => { if (detailRequest.current.isLatest(sequence)) setDetail(payload.history); })\r\n .catch((requestError) => { if (requestError.name !== \"AbortError\" && detailRequest.current.isLatest(sequence)) setError(requestError.message); })\r\n .finally(() => { if (detailRequest.current.isLatest(sequence)) setDetailLoading(false); });\r\n return () => controller.abort();\r\n }, [profileId, selectedId]);\r\n\r\n const updateFilter = (setter) => (event) => { setter(event.target.value); setPage(1); };\r\n return (\r\n
\r\n

聊天记录

从 rollout 文件读取历史会话,只读查看,不修改本地数据。

\r\n
\r\n { if (event.key === \"Enter\") { setCommittedQuery(query); setPage(1); } }} placeholder=\"搜索标题、项目、Provider 或消息内容\" />\r\n \r\n \r\n \r\n
\r\n {error ?
{error}
: null}\r\n
\r\n
\r\n
{history.total} 个会话第 {history.page} 页
\r\n
\r\n {loading && !history.sessions.length ?
读取中…
: null}\r\n {!loading && !history.sessions.length ?
没有匹配的会话
: null}\r\n {history.sessions.map((session) => )}\r\n
\r\n
{page}
\r\n
\r\n
\r\n {detailLoading ?
正在读取会话
: !detail ?
选择一个会话聊天内容将在这里显示。
: <>

{detail.session.title}

{detail.session.cwd || \"未知项目\"} · {detail.session.provider} · {detail.session.messageCount} 条消息

{detail.session.archived ? \"已归档\" : \"活跃\"}
{detail.truncated ?
仅显示最近 {detail.returnedMessageCount} 条消息。
: null}
{detail.messages.map((message) =>
{message.role === \"user\" ? \"你\" : \"Codex\"}
)}
}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Modal({ title, children, confirmLabel, onConfirm, onCancel, tone = \"primary\", confirmDisabled = false }) {\r\n return (\r\n
event.target === event.currentTarget && onCancel()}>\r\n
\r\n

{title}

\r\n
{children}
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction ExecuteModal({ plan, status, selectedProvider, onCancel, onConfirm }) {\r\n return (\r\n \r\n
请确认 Codex 已完全关闭关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。
\r\n
\r\n
Codex Home
{status?.codexHome}
\r\n
SQLite Home
{status?.sqliteHome} ({status?.sqliteHomeSource})
\r\n
当前 Provider
{status?.currentProvider}
\r\n
目标 Provider
{selectedProvider}
\r\n
配置变更
{plan.mode === \"switch\" ? \"更新 config.toml 根级 model_provider\" : \"不修改 config.toml\"}
\r\n
Model 策略
{plan.mode !== \"switch\" ? \"跟随当前根级 model\" : plan.modelMode === \"auto\" ? \"跟随目标 Provider 配置\" : plan.modelMode === \"keep\" ? \"保留当前根级 model\" : `设置为 ${plan.model}`}
\r\n
备份策略
修改前创建备份,保留最近 {plan.keepCount} 份
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction RestoreModal({ backup, status, profile, onCancel, onConfirm }) {\r\n const [restoreConfig, setRestoreConfig] = useState(false);\r\n const [restoreDatabase, setRestoreDatabase] = useState(true);\r\n const [restoreSessions, setRestoreSessions] = useState(true);\r\n const targetSqliteHome = resolveRestoreTargetSqliteHome(status, backup);\r\n const relocation = restoreRelocationState({\r\n backup,\r\n profile,\r\n targetSqliteHome,\r\n restoreDatabase,\r\n restoreConfig,\r\n sqliteSupported: status?.sqliteAccess?.supported !== false,\r\n pathComparisonCaseInsensitive: status?.pathComparisonCaseInsensitive === true\r\n });\r\n return (\r\n onConfirm({ restoreConfig, restoreDatabase, restoreSessions, allowSqliteHomeRelocation: relocation.requiresRelocation })}\r\n >\r\n
{formatDate(backup.metadata.createdAt)} · {backup.metadata.targetProvider}{backup.path}
\r\n
\r\n 选择要覆盖的内容\r\n \r\n \r\n \r\n
\r\n {status?.sqliteAccess?.supported === false ?
当前 SQLite 路径仅供诊断{status.sqliteAccess.message || \"不能从 Web UI 执行恢复。\"}
: null}\r\n {relocation.requiresRelocation ?
SQLite Home 与备份来源不同来源:{backup.metadata.sqliteHome}
目标:{targetSqliteHome}
{relocation.missingExplicitTarget ? \"当前 Profile 未明确配置 SQLite Home,不能提交数据库迁移恢复。\" : relocation.configRestoreConflict ? \"迁移数据库时不能同时恢复旧 config.toml。\" : \"确认后数据库将恢复到当前 Profile 明确配置的目标位置。\"}
: null}\r\n
恢复前请关闭 Codex该操作将覆盖所选的当前元数据;请确认 Codex CLI、App 和 app-server 已关闭。
\r\n \r\n );\r\n}\r\n\r\nfunction PruneModal({ keepCount, backups, onCancel, onConfirm }) {\r\n const deleteCount = Math.max(0, backups.backups.length - keepCount);\r\n return (\r\n \r\n
被删除的备份无法直接恢复只处理当前 Codex Home 下由本工具管理的备份目录。
\r\n
当前备份
{backups.backups.length} 份
保留
最近 {keepCount} 份
将删除
{deleteCount} 份
\r\n
\r\n );\r\n}\r\n\r\nfunction ProfileModal({ onCancel, onConfirm }) {\r\n const [profileId, setProfileId] = useState(\"\");\r\n const [name, setName] = useState(\"\");\r\n const [codexHome, setCodexHome] = useState(\"\");\r\n const [sqliteHome, setSqliteHome] = useState(\"\");\r\n const valid = /^[A-Za-z0-9_.-]{1,80}$/.test(profileId) && name.trim() && codexHome.trim();\r\n return (\r\n onConfirm({ profileId, name, codexHome, sqliteHome })}>\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Toast({ toast, onClose }) {\r\n useEffect(() => {\r\n if (!toast) return undefined;\r\n const timer = window.setTimeout(onClose, 6000);\r\n return () => window.clearTimeout(timer);\r\n }, [toast, onClose]);\r\n if (!toast) return null;\r\n return
{toast.tone === \"success\" ? : }{toast.title}{toast.message ? {toast.message} : null}
;\r\n}\r\n\r\nexport default function App() {\r\n const [view, setView] = useState(\"overview\");\r\n const [accessState, setAccessState] = useState(\"checking\");\r\n const [accessMessage, setAccessMessage] = useState(\"\");\r\n const [profileId, setProfileId] = usePersistentState(\"cps.web.profileId\", \"default\");\r\n const [profiles, setProfiles] = useState([]);\r\n const [manualProviders, setManualProviders] = usePersistentState(\"cps.web.manualProviders\", []);\r\n const [status, setStatus] = useState(null);\r\n const [backups, setBackups] = useState(EMPTY_BACKUPS);\r\n const [selectedProvider, setSelectedProvider] = useState(\"\");\r\n const [loading, setLoading] = useState(true);\r\n const [busy, setBusy] = useState(false);\r\n const [modal, setModal] = useState(null);\r\n const [toast, setToast] = useState(null);\r\n const [activity, setActivity] = useState([]);\r\n const [activeOperation, setActiveOperation] = useState(null);\r\n const lastActivityId = useRef(0);\r\n\r\n const providers = useMemo(() => {\r\n const detected = providersFromStatus(status);\r\n const detectedIds = new Set(detected.map((provider) => provider.id));\r\n return [\r\n ...detected.map((provider) => ({\r\n ...provider,\r\n manual: manualProviders.includes(provider.id)\r\n })),\r\n ...manualProviders\r\n .filter((provider) => !detectedIds.has(provider))\r\n .map((id) => ({ id, sources: [\"manual\"], configured: false, current: false, manual: true }))\r\n ];\r\n }, [status, manualProviders]);\r\n const selectedProfile = profiles.find((profile) => profile.id === profileId) ?? null;\r\n\r\n const profileRefreshRef = useRef(null);\r\n if (!profileRefreshRef.current) {\r\n profileRefreshRef.current = createProfileRefresh({\r\n fetchStatus: (storage, options) => apiRequest(\"/api/status\", storage, options),\r\n fetchBackups: (storage, options) => apiRequest(\"/api/backups\", storage, options)\r\n });\r\n }\r\n\r\n // Only the latest request for the current profile may update status,\r\n // backups, selectedProvider, loading, and error toasts. Switching profiles\r\n // starts a newer request, which aborts and invalidates the older one even\r\n // if the older one finishes last.\r\n const refresh = useCallback(async ({ quiet = false } = {}) => {\r\n await profileRefreshRef.current({\r\n profileId,\r\n showLoading: !quiet,\r\n onLoading: setLoading,\r\n onResult: ({ status: nextStatus, backups: nextBackups }) => {\r\n setStatus(nextStatus);\r\n setBackups(nextBackups);\r\n setSelectedProvider((current) => current && providersFromStatus(nextStatus).some((provider) => provider.id === current)\r\n ? current\r\n : nextStatus.currentProvider);\r\n },\r\n onError: (error) => {\r\n setToast({ tone: \"error\", title: \"状态读取失败\", message: error.message });\r\n }\r\n });\r\n }, [profileId]);\r\n\r\n const refreshProfiles = useCallback(async () => {\r\n const payload = await getProfiles();\r\n setProfiles(payload.profiles);\r\n setProfileId((current) => payload.profiles.some((profile) => profile.id === current) ? current : \"default\");\r\n }, [setProfileId]);\r\n\r\n const handleProfileConflict = useCallback(async () => {\r\n setModal(null);\r\n try {\r\n await refreshProfiles();\r\n await refresh({ quiet: true });\r\n } catch {\r\n // The user can still retry after the next explicit refresh.\r\n }\r\n setToast({ tone: \"warning\", title: \"配置已变更,请重新确认\", message: \"已刷新存储配置和当前状态;未自动重试原操作。\" });\r\n }, [refresh, refreshProfiles]);\r\n\r\n const openProfileOperation = useCallback((operation) => {\r\n const captured = captureProfileOperation(selectedProfile, operation, status);\r\n if (!captured) {\r\n setToast({ tone: \"warning\", title: \"配置需要刷新\", message: \"没有可用的配置版本,请刷新后重新确认操作。\" });\r\n refreshProfiles().catch(() => {});\r\n return;\r\n }\r\n setModal(captured);\r\n }, [refreshProfiles, selectedProfile, status]);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n initializeAccess()\r\n .then(async (paired) => {\r\n if (!paired) throw new PairingRequiredError();\r\n await refreshProfiles();\r\n if (!cancelled) setAccessState(\"ready\");\r\n })\r\n .catch((error) => {\r\n if (cancelled) return;\r\n setAccessState(error instanceof PairingRequiredError ? \"required\" : \"error\");\r\n setAccessMessage(error.message);\r\n });\r\n return () => { cancelled = true; };\r\n }, [refreshProfiles]);\r\n\r\n useEffect(() => {\r\n if (accessState === \"ready\") refresh();\r\n }, [accessState, profileId]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n const requirePairing = (event) => {\r\n setAccessState(\"required\");\r\n setAccessMessage(event.detail || \"设备凭证已失效。请重新运行 codex-provider web。\");\r\n };\r\n window.addEventListener(\"cps:pairing-required\", requirePairing);\r\n return () => window.removeEventListener(\"cps:pairing-required\", requirePairing);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (accessState !== \"ready\") return undefined;\r\n let stopped = false;\r\n const poll = async () => {\r\n try {\r\n const payload = await getActivity(lastActivityId.current);\r\n if (stopped) return;\r\n if (payload.activity?.length) {\r\n lastActivityId.current = payload.activity[payload.activity.length - 1].id;\r\n setActivity((current) => [...current, ...payload.activity].slice(-250));\r\n }\r\n setActiveOperation(payload.activeOperation ?? null);\r\n } catch {\r\n // A transient poll failure should not interrupt a running operation.\r\n }\r\n };\r\n poll();\r\n const timer = window.setInterval(poll, 900);\r\n return () => { stopped = true; window.clearInterval(timer); };\r\n }, [accessState]);\r\n\r\n const execute = useCallback(async () => {\r\n const plan = modal.plan;\r\n const targetProfileId = modal.profileId;\r\n setModal(null);\r\n setBusy(true);\r\n setView(\"activity\");\r\n try {\r\n const common = { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, provider: modal.selectedProvider, keepCount: plan.keepCount };\r\n const payload = plan.mode === \"switch\"\r\n ? await apiRequest(\"/api/switch\", { ...common, model: plan.modelMode === \"custom\" ? plan.model : undefined, keepRootModel: plan.modelMode === \"keep\" })\r\n : await apiRequest(\"/api/sync\", common);\r\n setToast(operationToast(payload, {\r\n successTitle: plan.mode === \"switch\" ? \"切换并同步完成\" : \"同步完成\",\r\n partialTitle: plan.mode === \"switch\" ? \"切换并同步部分完成\" : \"同步部分完成\",\r\n message: `备份:${payload.result?.backupDir ?? \"已创建\"}`\r\n }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"操作失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const restore = useCallback(async (options) => {\r\n const backup = modal.backup;\r\n const targetProfileId = modal.profileId;\r\n setModal(null);\r\n setBusy(true);\r\n setView(\"activity\");\r\n try {\r\n const payload = await apiRequest(\"/api/restore\", { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, backupId: backup.id, ...options });\r\n setToast(operationToast(payload, { successTitle: \"备份恢复完成\", partialTitle: \"备份恢复部分完成\", message: backup.id }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"恢复失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const prune = useCallback(async () => {\r\n const keepCount = modal.keepCount;\r\n const targetProfileId = modal.profileId;\r\n setModal(null);\r\n setBusy(true);\r\n try {\r\n const payload = await apiRequest(\"/api/prune\", { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, keepCount });\r\n setToast(operationToast(payload, {\r\n successTitle: \"旧备份清理完成\",\r\n partialTitle: \"旧备份清理部分完成\",\r\n message: `删除 ${payload.result?.deletedCount ?? 0} 份,释放 ${formatBytes(payload.result?.freedBytes)}`\r\n }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"备份清理失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const closeToast = useCallback(() => setToast(null), []);\r\n const saveProfile = useCallback(async (profile) => {\r\n try {\r\n const payload = await apiRequest(\"/api/profiles/save\", profile.revision ? { ...profile, profileRevision: profile.revision } : profile);\r\n setModal(null);\r\n await refreshProfiles();\r\n setProfileId(payload.profile.id);\r\n setToast({ tone: \"success\", title: \"存储配置已保存\", message: payload.profile.name });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"配置保存失败\", message: error.message });\r\n }\r\n }, [handleProfileConflict, refreshProfiles, setProfileId]);\r\n const deleteProfile = useCallback(async () => {\r\n try {\r\n await apiRequest(\"/api/profiles/delete\", { profileId, profileRevision: selectedProfile?.revision });\r\n setProfileId(\"default\");\r\n await refreshProfiles();\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"配置删除失败\", message: error.message });\r\n }\r\n }, [handleProfileConflict, profileId, refreshProfiles, selectedProfile?.revision, setProfileId]);\r\n const forgetBrowser = useCallback(async () => {\r\n await forgetThisBrowser().catch(() => {});\r\n setAccessState(\"required\");\r\n setAccessMessage(\"此浏览器的设备凭证已失效。重新运行 codex-provider web 即可自动配对。\");\r\n }, []);\r\n const addManualProvider = useCallback((provider) => {\r\n setManualProviders((current) => [...new Set([...current, provider])].sort());\r\n setSelectedProvider(provider);\r\n }, [setManualProviders]);\r\n const removeManualProvider = useCallback((provider) => {\r\n setManualProviders((current) => current.filter((item) => item !== provider));\r\n setSelectedProvider(status?.currentProvider ?? \"\");\r\n }, [setManualProviders, status?.currentProvider]);\r\n\r\n if (accessState !== \"ready\") {\r\n return

{accessState === \"checking\" ? \"正在完成安全配对\" : \"需要重新配对\"}

{accessState === \"checking\" ? \"请稍候…\" : accessMessage || \"请重新运行 codex-provider web。\"}

{accessState !== \"checking\" ? codex-provider web : null}
;\r\n }\r\n\r\n return (\r\n
\r\n refresh()} />\r\n \r\n
\r\n setModal({ type: \"profile\" })} onDeleteProfile={deleteProfile} onRefresh={() => refresh()} loading={loading} profileSwitchDisabled={busy || Boolean(modal)} />\r\n {view === \"overview\" ? openProfileOperation({ type: \"execute\", plan, selectedProvider })} onRestore={(backup) => openProfileOperation({ type: \"restore\", backup })} setView={setView} busy={busy} loading={loading} /> : null}\r\n {view === \"history\" ? : null}\r\n {view === \"backups\" ? openProfileOperation({ type: \"restore\", backup })} onPrune={(keepCount) => openProfileOperation({ type: \"prune\", keepCount })} /> : null}\r\n {view === \"activity\" ? : null}\r\n
\r\n {modal?.type === \"execute\" ? setModal(null)} onConfirm={execute} /> : null}\r\n {modal?.type === \"restore\" ? setModal(null)} onConfirm={restore} /> : null}\r\n {modal?.type === \"prune\" ? setModal(null)} onConfirm={prune} /> : null}\r\n {modal?.type === \"profile\" ? setModal(null)} onConfirm={saveProfile} /> : null}\r\n \r\n
\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\n\r\nimport App from \"./App.jsx\";\r\nimport \"./styles.css\";\r\n\r\ncreateRoot(document.getElementById(\"root\")).render(\r\n \r\n \r\n \r\n);\r\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,12,13],"mappings":"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"} \ No newline at end of file diff --git a/web/dist/assets/index-BhSMcRqW.js b/web/dist/assets/index-CAZ7Ulmk.js similarity index 86% rename from web/dist/assets/index-BhSMcRqW.js rename to web/dist/assets/index-CAZ7Ulmk.js index 6d4f452..3a40d2a 100644 --- a/web/dist/assets/index-BhSMcRqW.js +++ b/web/dist/assets/index-CAZ7Ulmk.js @@ -5,6 +5,6 @@ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r= `+i[o].replace(` at new `,` at `);return e.displayName&&c.includes(``)&&(c=c.replace(``,e.displayName)),c}while(1<=o&&0<=s);break}}}finally{de=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:``)?ue(e):``}function pe(e){switch(e.tag){case 5:return ue(e.type);case 16:return ue(`Lazy`);case 13:return ue(`Suspense`);case 19:return ue(`SuspenseList`);case 0:case 2:case 15:return e=fe(e.type,!1),e;case 11:return e=fe(e.type.render,!1),e;case 1:return e=fe(e.type,!0),e;default:return``}}function me(e){if(e==null)return null;if(typeof e==`function`)return e.displayName||e.name||null;if(typeof e==`string`)return e;switch(e){case T:return`Fragment`;case w:return`Portal`;case ne:return`Profiler`;case te:return`StrictMode`;case O:return`Suspense`;case ie:return`SuspenseList`}if(typeof e==`object`)switch(e.$$typeof){case E:return(e.displayName||`Context`)+`.Consumer`;case re:return(e._context.displayName||`Context`)+`.Provider`;case D:var t=e.render;return e=e.displayName,e||=(e=t.displayName||t.name||``,e===``?`ForwardRef`:`ForwardRef(`+e+`)`),e;case k:return t=e.displayName||null,t===null?me(e.type)||`Memo`:t;case ae:t=e._payload,e=e._init;try{return me(e(t))}catch{}}return null}function he(e){var t=e.type;switch(e.tag){case 24:return`Cache`;case 9:return(t.displayName||`Context`)+`.Consumer`;case 10:return(t._context.displayName||`Context`)+`.Provider`;case 18:return`DehydratedFragment`;case 11:return e=t.render,e=e.displayName||e.name||``,t.displayName||(e===``?`ForwardRef`:`ForwardRef(`+e+`)`);case 7:return`Fragment`;case 5:return t;case 4:return`Portal`;case 3:return`Root`;case 6:return`Text`;case 16:return me(t);case 8:return t===te?`StrictMode`:`Mode`;case 22:return`Offscreen`;case 12:return`Profiler`;case 21:return`Scope`;case 13:return`Suspense`;case 19:return`SuspenseList`;case 25:return`TracingMarker`;case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t==`function`)return t.displayName||t.name||null;if(typeof t==`string`)return t}return null}function j(e){switch(typeof e){case`boolean`:case`number`:case`string`:case`undefined`:return e;case`object`:return e;default:return``}}function M(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()===`input`&&(t===`checkbox`||t===`radio`)}function N(e){var t=M(e)?`checked`:`value`,n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=``+e[t];if(!e.hasOwnProperty(t)&&n!==void 0&&typeof n.get==`function`&&typeof n.set==`function`){var i=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(e){r=``+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=``+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function P(e){e._valueTracker||=N(e)}function ge(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r=``;return e&&(r=M(e)?e.checked?`true`:`false`:e.value),e=r,e!==n&&(t.setValue(e),!0)}function _e(e){if(e||=typeof document<`u`?document:void 0,e===void 0)return null;try{return e.activeElement||e.body}catch{return e.body}}function ve(e,t){var n=t.checked;return A({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function ye(e,t){var n=t.defaultValue==null?``:t.defaultValue,r=t.checked==null?t.defaultChecked:t.checked;n=j(t.value==null?n:t.value),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type===`checkbox`||t.type===`radio`?t.checked!=null:t.value!=null}}function be(e,t){t=t.checked,t!=null&&ee(e,`checked`,t,!1)}function xe(e,t){be(e,t);var n=j(t.value),r=t.type;if(n!=null)r===`number`?(n===0&&e.value===``||e.value!=n)&&(e.value=``+n):e.value!==``+n&&(e.value=``+n);else if(r===`submit`||r===`reset`){e.removeAttribute(`value`);return}t.hasOwnProperty(`value`)?Ce(e,t.type,n):t.hasOwnProperty(`defaultValue`)&&Ce(e,t.type,j(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Se(e,t,n){if(t.hasOwnProperty(`value`)||t.hasOwnProperty(`defaultValue`)){var r=t.type;if(!(r!==`submit`&&r!==`reset`||t.value!==void 0&&t.value!==null))return;t=``+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==``&&(e.name=``),e.defaultChecked=!!e._wrapperState.initialChecked,n!==``&&(e.name=n)}function Ce(e,t,n){(t!==`number`||_e(e.ownerDocument)!==e)&&(n==null?e.defaultValue=``+e._wrapperState.initialValue:e.defaultValue!==``+n&&(e.defaultValue=``+n))}var F=Array.isArray;function we(e,t,n,r){if(e=e.options,t){t={};for(var i=0;i`+t.valueOf().toString()+``,t=je.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ne(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Pe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Fe=[`Webkit`,`ms`,`Moz`,`O`];Object.keys(Pe).forEach(function(e){Fe.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Pe[t]=Pe[e]})});function Ie(e,t,n){return t==null||typeof t==`boolean`||t===``?``:n||typeof t!=`number`||t===0||Pe.hasOwnProperty(e)&&Pe[e]?(``+t).trim():t+`px`}function Le(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=n.indexOf(`--`)===0,i=Ie(n,t[n],r);n===`float`&&(n=`cssFloat`),r?e.setProperty(n,i):e[n]=i}}var Re=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ze(e,t){if(t){if(Re[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(r(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(r(60));if(typeof t.dangerouslySetInnerHTML!=`object`||!(`__html`in t.dangerouslySetInnerHTML))throw Error(r(61))}if(t.style!=null&&typeof t.style!=`object`)throw Error(r(62))}}function Be(e,t){if(e.indexOf(`-`)===-1)return typeof t.is==`string`;switch(e){case`annotation-xml`:case`color-profile`:case`font-face`:case`font-face-src`:case`font-face-uri`:case`font-face-format`:case`font-face-name`:case`missing-glyph`:return!1;default:return!0}}var Ve=null;function He(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Ue=null,We=null,Ge=null;function Ke(e){if(e=Wi(e)){if(typeof Ue!=`function`)throw Error(r(280));var t=e.stateNode;t&&(t=Ki(t),Ue(e.stateNode,e.type,t))}}function qe(e){We?Ge?Ge.push(e):Ge=[e]:We=e}function Je(){if(We){var e=We,t=Ge;if(Ge=We=null,Ke(e),t)for(e=0;e>>=0,e===0?32:31-(At(e)/jt|0)|0}var Nt=64,Pt=4194304;function Ft(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function It(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,i=e.suspendedLanes,a=e.pingedLanes,o=n&268435455;if(o!==0){var s=o&~i;s===0?(a&=o,a!==0&&(r=Ft(a))):r=Ft(s)}else o=n&~i,o===0?a!==0&&(r=Ft(a)):r=Ft(o);if(r===0)return 0;if(t!==0&&t!==r&&(t&i)===0&&(i=r&-r,a=t&-t,i>=a||i===16&&a&4194240))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Ht(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-kt(t),e[t]=n}function Ut(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=ir),sr=` `,cr=!1;function lr(e,t){switch(e){case`keyup`:return nr.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function ur(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var dr=!1;function fr(e,t){switch(e){case`compositionend`:return ur(t);case`keypress`:return t.which===32?(cr=!0,sr):null;case`textInput`:return e=t.data,e===sr&&cr?null:e;default:return null}}function pr(e,t){if(dr)return e===`compositionend`||!rr&&lr(e,t)?(e=Dn(),En=Tn=wn=null,dr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Fr(n)}}function Lr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Lr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Rr(){for(var e=window,t=_e();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=_e(e.document)}return t}function zr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}function Br(e){var t=Rr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Lr(n.ownerDocument.documentElement,n)){if(r!==null&&zr(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),`selectionStart`in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=n.textContent.length,a=Math.min(r.start,i);r=r.end===void 0?a:Math.min(r.end,i),!e.extend&&a>r&&(i=r,r=a,a=i),i=Ir(n,a);var o=Ir(n,r);i&&o&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),a>r?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus==`function`&&n.focus(),n=0;n=document.documentMode,Hr=null,Ur=null,Wr=null,Gr=!1;function Kr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Gr||Hr==null||Hr!==_e(r)||(r=Hr,`selectionStart`in r&&zr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Wr&&Pr(Wr,r)||(Wr=r,r=_i(Ur,`onSelect`),0Ji||(e.current=qi[Ji],qi[Ji]=null,Ji--)}function B(e,t){Ji++,qi[Ji]=e.current,e.current=t}var Xi={},Zi=Yi(Xi),Qi=Yi(!1),$i=Xi;function ea(e,t){var n=e.type.contextTypes;if(!n)return Xi;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i={},a;for(a in n)i[a]=t[a];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function ta(e){return e=e.childContextTypes,e!=null}function na(){z(Qi),z(Zi)}function ra(e,t,n){if(Zi.current!==Xi)throw Error(r(168));B(Zi,t),B(Qi,n)}function ia(e,t,n){var i=e.stateNode;if(t=t.childContextTypes,typeof i.getChildContext!=`function`)return n;for(var a in i=i.getChildContext(),i)if(!(a in t))throw Error(r(108,he(e)||`Unknown`,a));return A({},n,i)}function aa(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Xi,$i=Zi.current,B(Zi,e),B(Qi,Qi.current),!0}function oa(e,t,n){var i=e.stateNode;if(!i)throw Error(r(169));n?(e=ia(e,t,$i),i.__reactInternalMemoizedMergedChildContext=e,z(Qi),z(Zi),B(Zi,e)):z(Qi),B(Qi,n)}var sa=null,ca=!1,la=!1;function ua(e){sa===null?sa=[e]:sa.push(e)}function da(e){ca=!0,ua(e)}function fa(){if(!la&&sa!==null){la=!0;var e=0,t=L;try{var n=sa;for(L=1;e>=o,i-=o,ba=1<<32-kt(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(r,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(r,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(r,d),V&&Sa(r,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),V&&Sa(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return V&&Sa(a,g),u}for(h=i(a,h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),V&&Sa(a,g),u}function _(e,r,i,o){if(typeof i==`object`&&i&&i.type===T&&i.key===null&&(i=i.props.children),typeof i==`object`&&i){switch(i.$$typeof){case C:a:{for(var c=i.key,l=r;l!==null;){if(l.key===c){if(c=i.type,c===T){if(l.tag===7){n(e,l.sibling),r=a(l,i.props.children),r.return=e,e=r;break a}}else if(l.elementType===c||typeof c==`object`&&c&&c.$$typeof===ae&&Va(c)===l.type){n(e,l.sibling),r=a(l,i.props),r.ref=za(e,l,i),r.return=e,e=r;break a}n(e,l);break}t(e,l),l=l.sibling}i.type===T?(r=Zl(i.props.children,e.mode,o,i.key),r.return=e,e=r):(o=Xl(i.type,i.key,i.props,null,e.mode,o),o.ref=za(e,r,i),o.return=e,e=o)}return s(e);case w:a:{for(l=i.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===i.containerInfo&&r.stateNode.implementation===i.implementation){n(e,r.sibling),r=a(r,i.children||[]),r.return=e,e=r;break a}n(e,r);break}t(e,r),r=r.sibling}r=eu(i,e.mode,o),r.return=e,e=r}return s(e);case ae:return l=i._init,_(e,r,l(i._payload),o)}if(F(i))return h(e,r,i,o);if(ce(i))return g(e,r,i,o);Ba(e,i)}return typeof i==`string`&&i!==``||typeof i==`number`?(i=``+i,r!==null&&r.tag===6?(n(e,r.sibling),r=a(r,i),r.return=e,e=r):(n(e,r),r=$l(i,e.mode,o),r.return=e,e=r),s(e)):n(e,r)}return _}var Ua=Ha(!0),Wa=Ha(!1),Ga=Yi(null),Ka=null,qa=null,Ja=null;function Ya(){Ja=qa=Ka=null}function Xa(e){var t=Ga.current;z(Ga),e._currentValue=t}function Za(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)===t?r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t):(e.childLanes|=t,r!==null&&(r.childLanes|=t)),e===n)break;e=e.return}}function Qa(e,t){Ka=e,Ja=qa=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(Rs=!0),e.firstContext=null)}function $a(e){var t=e._currentValue;if(Ja!==e){if(e={context:e,memoizedValue:t,next:null},qa===null){if(Ka===null)throw Error(r(308));qa=e,Ka.dependencies={lanes:0,firstContext:e}}else qa=qa.next=e}return t}var eo=null;function to(e){eo===null?eo=[e]:eo.push(e)}function no(e,t,n,r){var i=t.interleaved;return i===null?(n.next=n,to(t)):(n.next=i.next,i.next=n),t.interleaved=n,ro(e,r)}function ro(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var io=!1;function ao(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function oo(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function so(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function co(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,J&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,ro(e,n)}return i=r.interleaved,i===null?(t.next=t,to(r)):(t.next=i.next,i.next=t),r.interleaved=t,ro(e,n)}function lo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194240)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Wt(e,n)}}function uo(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function fo(e,t,n,r){var i=e.updateQueue;io=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane,p=s.eventTime;if((r&f)===f){u!==null&&(u=u.next={eventTime:p,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});a:{var m=e,h=s;switch(f=t,p=n,h.tag){case 1:if(m=h.payload,typeof m==`function`){d=m.call(p,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=h.payload,f=typeof m==`function`?m.call(p,d,f):m,f==null)break a;d=A({},d,f);break a;case 2:io=!0}}s.callback!==null&&s.lane!==0&&(e.flags|=64,f=i.effects,f===null?i.effects=[s]:f.push(s))}else p={eventTime:p,lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;f=s,s=f.next,f.next=null,i.lastBaseUpdate=f,i.shared.pending=null}}while(1);if(u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,t=i.shared.interleaved,t!==null){i=t;do o|=i.lane,i=i.next;while(i!==t)}else a===null&&(i.shared.lanes=0);Yc|=o,e.lanes=o,e.memoizedState=d}}function po(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=Do.transition;Do.transition={};try{e(!1),t()}finally{L=n,Do.transition=r}}function ds(){return Ro().memoizedState}function fs(e,t,n){var r=ml(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},ms(e))hs(t,n);else if(n=no(e,t,n,r),n!==null){var i=pl();hl(n,e,r,i),gs(n,t,r)}}function ps(e,t,n){var r=ml(e),i={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(ms(e))hs(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Nr(s,o)){var c=t.interleaved;c===null?(i.next=i,to(t)):(i.next=c.next,c.next=i),t.interleaved=i;return}}catch{}n=no(e,t,i,r),n!==null&&(i=pl(),hl(n,e,r,i),gs(n,t,r))}}function ms(e){var t=e.alternate;return e===U||t!==null&&t===U}function hs(e,t){Ao=ko=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function gs(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Wt(e,n)}}var _s={readContext:$a,useCallback:No,useContext:No,useEffect:No,useImperativeHandle:No,useInsertionEffect:No,useLayoutEffect:No,useMemo:No,useReducer:No,useRef:No,useState:No,useDebugValue:No,useDeferredValue:No,useTransition:No,useMutableSource:No,useSyncExternalStore:No,useId:No,unstable_isNewReconciler:!1},vs={readContext:$a,useCallback:function(e,t){return Lo().memoizedState=[e,t===void 0?null:t],e},useContext:$a,useEffect:es,useImperativeHandle:function(e,t,n){return n=n==null?null:n.concat([e]),Qo(4194308,4,is.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Qo(4194308,4,e,t)},useInsertionEffect:function(e,t){return Qo(4,2,e,t)},useMemo:function(e,t){var n=Lo();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Lo();return t=n===void 0?t:n(t),r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=fs.bind(null,U,e),[r.memoizedState,e]},useRef:function(e){var t=Lo();return e={current:e},t.memoizedState=e},useState:Yo,useDebugValue:os,useDeferredValue:function(e){return Lo().memoizedState=e},useTransition:function(){var e=Yo(!1),t=e[0];return e=us.bind(null,e[1]),Lo().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var i=U,a=Lo();if(V){if(n===void 0)throw Error(r(407));n=n()}else{if(n=t(),Y===null)throw Error(r(349));Oo&30||Wo(i,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,es(Ko.bind(null,i,o,e),[e]),i.flags|=2048,Xo(9,Go.bind(null,i,o,n,t),void 0,null),n},useId:function(){var e=Lo(),t=Y.identifierPrefix;if(V){var n=xa,r=ba;n=(r&~(1<<32-kt(r)-1)).toString(32)+n,t=`:`+t+`R`+n,n=jo++,0<\/script>`,e=e.removeChild(e.firstChild)):typeof i.is==`string`?e=c.createElement(n,{is:i.is}):(e=c.createElement(n),n===`select`&&(c=e,i.multiple?c.multiple=!0:i.size&&(c.size=i.size))):e=c.createElementNS(e,n),e[Li]=t,e[Ri]=i,cc(e,t,!1,!1),t.stateNode=e;a:{switch(c=Be(n,i),n){case`dialog`:R(`cancel`,e),R(`close`,e),o=i;break;case`iframe`:case`object`:case`embed`:R(`load`,e),o=i;break;case`video`:case`audio`:for(o=0;otl&&(t.flags|=128,i=!0,dc(s,!1),t.lanes=4194304)}}else{if(!i){if(e=Co(c),e!==null){if(t.flags|=128,i=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),dc(s,!0),s.tail===null&&s.tailMode===`hidden`&&!c.alternate&&!V)return fc(t),null}else 2*I()-s.renderingStartTime>tl&&n!==1073741824&&(t.flags|=128,i=!0,dc(s,!1),t.lanes=4194304)}s.isBackwards?(c.sibling=t.child,t.child=c):(n=s.last,n===null?t.child=c:n.sibling=c,s.last=c)}return s.tail===null?(fc(t),null):(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=I(),t.sibling=null,n=H.current,B(H,i?n&1|2:n&1),t);case 22:case 23:return Tl(),i=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==i&&(t.flags|=8192),i&&t.mode&1?Kc&1073741824&&(fc(t),t.subtreeFlags&6&&(t.flags|=8192)):fc(t),null;case 24:return null;case 25:return null}throw Error(r(156,t.tag))}function mc(e,t){switch(Ta(t),t.tag){case 1:return ta(t.type)&&na(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return bo(),z(Qi),z(Zi),To(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return So(t),null;case 13:if(z(H),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));Ia()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return z(H),null;case 4:return bo(),null;case 10:return Xa(t.type._context),null;case 22:case 23:return Tl(),null;case 24:return null;default:return null}}var hc=!1,gc=!1,_c=typeof WeakSet==`function`?WeakSet:Set,K=null;function vc(e,t){var n=e.ref;if(n!==null){if(typeof n==`function`)try{n(null)}catch(n){$(e,t,n)}else n.current=null}}function yc(e,t,n){try{n()}catch(n){$(e,t,n)}}var bc=!1;function xc(e,t){if(Ti=_n,e=Rr(),zr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var i=n.getSelection&&n.getSelection();if(i&&i.rangeCount!==0){n=i.anchorNode;var a=i.anchorOffset,o=i.focusNode;i=i.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||i!==0&&f.nodeType!==3||(l=s+i),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===i&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(Ei={focusedElem:e,selectionRange:n},_n=!1,K=t;K!==null;)if(t=K,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,K=e;else for(;K!==null;){t=K;try{var h=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(h!==null){var g=h.memoizedProps,_=h.memoizedState,v=t.stateNode;v.__reactInternalSnapshotBeforeUpdate=v.getSnapshotBeforeUpdate(t.elementType===t.type?g:xs(t.type,g),_)}break;case 3:var y=t.stateNode.containerInfo;y.nodeType===1?y.textContent=``:y.nodeType===9&&y.documentElement&&y.removeChild(y.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(e){$(t,t.return,e)}if(e=t.sibling,e!==null){e.return=t.return,K=e;break}K=t.return}return h=bc,bc=!1,h}function Sc(e,t,n){var r=t.updateQueue;if(r=r===null?null:r.lastEffect,r!==null){var i=r=r.next;do{if((i.tag&e)===e){var a=i.destroy;i.destroy=void 0,a!==void 0&&yc(t,n,a)}i=i.next}while(i!==r)}}function Cc(e,t){if(t=t.updateQueue,t=t===null?null:t.lastEffect,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function wc(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t==`function`?t(e):t.current=e}}function Tc(e){var t=e.alternate;t!==null&&(e.alternate=null,Tc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Li],delete t[Ri],delete t[Bi],delete t[Vi],delete t[Hi])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ec(e){return e.tag===5||e.tag===3||e.tag===4}function Dc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Ec(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Oc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=wi));else if(r!==4&&(e=e.child,e!==null))for(Oc(e,t,n),e=e.sibling;e!==null;)Oc(e,t,n),e=e.sibling}function kc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(kc(e,t,n),e=e.sibling;e!==null;)kc(e,t,n),e=e.sibling}var q=null,Ac=!1;function jc(e,t,n){for(n=n.child;n!==null;)Mc(e,t,n),n=n.sibling}function Mc(e,t,n){if(Dt&&typeof Dt.onCommitFiberUnmount==`function`)try{Dt.onCommitFiberUnmount(Et,n)}catch{}switch(n.tag){case 5:gc||vc(n,t);case 6:var r=q,i=Ac;q=null,jc(e,t,n),q=r,Ac=i,q!==null&&(Ac?(e=q,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):q.removeChild(n.stateNode));break;case 18:q!==null&&(Ac?(e=q,n=n.stateNode,e.nodeType===8?Ni(e.parentNode,n):e.nodeType===1&&Ni(e,n),hn(e)):Ni(q,n.stateNode));break;case 4:r=q,i=Ac,q=n.stateNode.containerInfo,Ac=!0,jc(e,t,n),q=r,Ac=i;break;case 0:case 11:case 14:case 15:if(!gc&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){i=r=r.next;do{var a=i,o=a.destroy;a=a.tag,o!==void 0&&(a&2||a&4)&&yc(n,t,o),i=i.next}while(i!==r)}jc(e,t,n);break;case 1:if(!gc&&(vc(n,t),r=n.stateNode,typeof r.componentWillUnmount==`function`))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(e){$(n,t,e)}jc(e,t,n);break;case 21:jc(e,t,n);break;case 22:n.mode&1?(gc=(r=gc)||n.memoizedState!==null,jc(e,t,n),gc=r):jc(e,t,n);break;default:jc(e,t,n)}}function Nc(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new _c),t.forEach(function(t){var r=Hl.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))})}}function Pc(e,t){var n=t.deletions;if(n!==null)for(var i=0;ia&&(a=s),i&=~o}if(i=a,i=I()-i,i=(120>i?120:480>i?480:1080>i?1080:1920>i?1920:3e3>i?3e3:4320>i?4320:1960*Hc(i/1960))-i,10e?16:e,sl===null)var i=!1;else{if(e=sl,sl=null,cl=0,J&6)throw Error(r(331));var a=J;for(J|=4,K=e.current;K!==null;){var o=K,s=o.child;if(K.flags&16){var c=o.deletions;if(c!==null){for(var l=0;lI()-el?El(e,0):Zc|=n),gl(e,t)}function Bl(e,t){t===0&&(e.mode&1?(t=Pt,Pt<<=1,!(Pt&130023424)&&(Pt=4194304)):t=1);var n=pl();e=ro(e,t),e!==null&&(Ht(e,t,n),gl(e,n))}function Vl(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Bl(e,n)}function Hl(e,t){var n=0;switch(e.tag){case 13:var i=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:i=e.stateNode;break;default:throw Error(r(314))}i!==null&&i.delete(t),Bl(e,n)}var Ul=function(e,t,n){if(e!==null){if(e.memoizedProps!==t.pendingProps||Qi.current)Rs=!0;else{if((e.lanes&n)===0&&!(t.flags&128))return Rs=!1,sc(e,t,n);Rs=!!(e.flags&131072)}}else Rs=!1,V&&t.flags&1048576&&Ca(t,ga,t.index);switch(t.lanes=0,t.tag){case 2:var i=t.type;ac(e,t),e=t.pendingProps;var a=ea(t,Zi.current);Qa(t,n),a=Fo(null,t,i,e,a,n);var o=Io();return t.flags|=1,typeof a==`object`&&a&&typeof a.render==`function`&&a.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,ta(i)?(o=!0,aa(t)):o=!1,t.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,ao(t),a.updater=Cs,t.stateNode=a,a._reactInternals=t,Ds(t,i,e,n),t=qs(null,t,i,!0,o,n)):(t.tag=0,V&&o&&wa(t),zs(null,t,a,n),t=t.child),t;case 16:i=t.elementType;a:{switch(ac(e,t),e=t.pendingProps,a=i._init,i=a(i._payload),t.type=i,a=t.tag=Jl(i),e=xs(i,e),a){case 0:t=Gs(null,t,i,e,n);break a;case 1:t=Ks(null,t,i,e,n);break a;case 11:t=Bs(null,t,i,e,n);break a;case 14:t=Vs(null,t,i,xs(i.type,e),n);break a}throw Error(r(306,i,``))}return t;case 0:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),Gs(e,t,i,a,n);case 1:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),Ks(e,t,i,a,n);case 3:a:{if(Js(t),e===null)throw Error(r(387));i=t.pendingProps,o=t.memoizedState,a=o.element,oo(e,t),fo(t,i,null,n);var s=t.memoizedState;if(i=s.element,o.isDehydrated){if(o={element:i,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){a=Os(Error(r(423)),t),t=Ys(e,t,i,n,a);break a}if(i!==a){a=Os(Error(r(424)),t),t=Ys(e,t,i,n,a);break a}for(Da=Pi(t.stateNode.containerInfo.firstChild),Ea=t,V=!0,Oa=null,n=Wa(t,null,i,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling}else{if(Ia(),i===a){t=oc(e,t,n);break a}zs(e,t,i,n)}t=t.child}return t;case 5:return xo(t),e===null&&Ma(t),i=t.type,a=t.pendingProps,o=e===null?null:e.memoizedProps,s=a.children,Di(i,a)?s=null:o!==null&&Di(i,o)&&(t.flags|=32),Ws(e,t),zs(e,t,s,n),t.child;case 6:return e===null&&Ma(t),null;case 13:return Qs(e,t,n);case 4:return yo(t,t.stateNode.containerInfo),i=t.pendingProps,e===null?t.child=Ua(t,null,i,n):zs(e,t,i,n),t.child;case 11:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),Bs(e,t,i,a,n);case 7:return zs(e,t,t.pendingProps,n),t.child;case 8:return zs(e,t,t.pendingProps.children,n),t.child;case 12:return zs(e,t,t.pendingProps.children,n),t.child;case 10:a:{if(i=t.type._context,a=t.pendingProps,o=t.memoizedProps,s=a.value,B(Ga,i._currentValue),i._currentValue=s,o!==null){if(Nr(o.value,s)){if(o.children===a.children&&!Qi.current){t=oc(e,t,n);break a}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var c=o.dependencies;if(c!==null){s=o.child;for(var l=c.firstContext;l!==null;){if(l.context===i){if(o.tag===1){l=so(-1,n&-n),l.tag=2;var u=o.updateQueue;if(u!==null){u=u.shared;var d=u.pending;d===null?l.next=l:(l.next=d.next,d.next=l),u.pending=l}}o.lanes|=n,l=o.alternate,l!==null&&(l.lanes|=n),Za(o.return,n,t),c.lanes|=n;break}l=l.next}}else if(o.tag===10)s=o.type===t.type?null:o.child;else if(o.tag===18){if(s=o.return,s===null)throw Error(r(341));s.lanes|=n,c=s.alternate,c!==null&&(c.lanes|=n),Za(s,n,t),s=o.sibling}else s=o.child;if(s!==null)s.return=o;else for(s=o;s!==null;){if(s===t){s=null;break}if(o=s.sibling,o!==null){o.return=s.return,s=o;break}s=s.return}o=s}}zs(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,i=t.pendingProps.children,Qa(t,n),a=$a(a),i=i(a),t.flags|=1,zs(e,t,i,n),t.child;case 14:return i=t.type,a=xs(i,t.pendingProps),a=xs(i.type,a),Vs(e,t,i,a,n);case 15:return Hs(e,t,t.type,t.pendingProps,n);case 17:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),ac(e,t),t.tag=1,ta(i)?(e=!0,aa(t)):e=!1,Qa(t,n),Ts(t,i,a),Ds(t,i,a,n),qs(null,t,i,!0,e,n);case 19:return ic(e,t,n);case 22:return Us(e,t,n)}throw Error(r(156,t.tag))};function Wl(e,t){return gt(e,t)}function Gl(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Kl(e,t,n,r){return new Gl(e,t,n,r)}function ql(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Jl(e){if(typeof e==`function`)return+!!ql(e);if(e!=null){if(e=e.$$typeof,e===D)return 11;if(e===k)return 14}return 2}function Yl(e,t){var n=e.alternate;return n===null?(n=Kl(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Xl(e,t,n,i,a,o){var s=2;if(i=e,typeof e==`function`)ql(e)&&(s=1);else if(typeof e==`string`)s=5;else a:switch(e){case T:return Zl(n.children,a,o,t);case te:s=8,a|=8;break;case ne:return e=Kl(12,n,t,a|2),e.elementType=ne,e.lanes=o,e;case O:return e=Kl(13,n,t,a),e.elementType=O,e.lanes=o,e;case ie:return e=Kl(19,n,t,a),e.elementType=ie,e.lanes=o,e;case oe:return Ql(n,a,o,t);default:if(typeof e==`object`&&e)switch(e.$$typeof){case re:s=10;break a;case E:s=9;break a;case D:s=11;break a;case k:s=14;break a;case ae:s=16,i=null;break a}throw Error(r(130,e==null?e:typeof e,``))}return t=Kl(s,n,t,a),t.elementType=e,t.type=i,t.lanes=o,t}function Zl(e,t,n,r){return e=Kl(7,e,r,t),e.lanes=n,e}function Ql(e,t,n,r){return e=Kl(22,e,r,t),e.elementType=oe,e.lanes=n,e.stateNode={isHidden:!1},e}function $l(e,t,n){return e=Kl(6,e,null,t),e.lanes=n,e}function eu(e,t,n){return t=Kl(4,e.children===null?[]:e.children,e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function tu(e,t,n,r,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Vt(0),this.expirationTimes=Vt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Vt(0),this.identifierPrefix=r,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function nu(e,t,n,r,i,a,o,s,c){return e=new tu(e,t,n,s,c),t===1?(t=1,!0===a&&(t|=8)):t=0,a=Kl(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},ao(a),e}function ru(e,t,n){var r=3{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=m();e.createRoot=t.createRoot,e.hydrateRoot=t.hydrateRoot})),g=c(u(),1),_=h(),v=`cps.web.deviceCredential`,y=class extends Error{constructor(e=`此浏览器需要重新配对。请重新运行 codex-provider web。`){super(e),this.name=`PairingRequiredError`}},b=class extends Error{constructor(e,t,n){super(t||`配置已变更,请重新确认。`),this.name=`ProfileRevisionError`,this.code=e,this.profile=n}};function x(){return!!window.localStorage.getItem(v)}async function ee(){let e=new URLSearchParams(window.location.hash.replace(/^#/,``)).get(`pair`);if(!e)return x();let t=await fetch(`/api/pair`,{method:`POST`,headers:{"X-Codex-Provider-Pairing":e}}),n=await t.json().catch(()=>({}));if(!t.ok||!n.deviceCredential)throw new y(n.error??`配对链接无效、已过期或已被使用。请重新运行 codex-provider web。`);return window.localStorage.setItem(v,n.deviceCredential),window.history.replaceState(null,``,`${window.location.pathname}${window.location.search}`),!0}function S(){return{"X-Codex-Provider-Device":window.localStorage.getItem(v)??``}}function C(e,t,n){return t===409&&[`PROFILE_REVISION_REQUIRED`,`PROFILE_CHANGED`,`STORAGE_REVISION_REQUIRED`,`STORAGE_CHANGED`].includes(e.code)?new b(e.code,e.error,e.profile):Error(e.error??n)}async function w(e,t){let n=await e.json().catch(()=>({}));if(!e.ok)throw n.code===`PAIRING_REQUIRED`?(window.dispatchEvent(new CustomEvent(`cps:pairing-required`,{detail:n.error})),new y(n.error)):C(n,e.status,t);return n}async function T(e,t={},{signal:n}={}){let r=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`,...S()},body:JSON.stringify(t),signal:n});return w(r,`Request failed with HTTP ${r.status}.`)}async function te(e=0){let t=await fetch(`/api/activity?after=${e}`,{headers:S()});return w(t,`Activity request failed with HTTP ${t.status}.`)}async function ne(){let e=await fetch(`/api/profiles`,{headers:S()});return w(e,`Profile request failed with HTTP ${e.status}.`)}async function re(){try{await T(`/api/access/forget`)}finally{window.localStorage.removeItem(v)}}async function E(e={},t={}){return T(`/api/history`,e,t)}async function D(e={},t={}){return T(`/api/history/session`,e,t)}function O(e,t){let[n,r]=(0,g.useState)(()=>{try{let n=window.localStorage.getItem(e);return n?JSON.parse(n):t}catch{return t}});return(0,g.useEffect)(()=>{window.localStorage.setItem(e,JSON.stringify(n))},[e,n]),[n,r]}function ie(){let e=0,t=null;return{begin(){return t?.abort(),t=new AbortController,e+=1,{sequence:e,controller:t,signal:t.signal}},isLatest(t){return t===e},cancel(){t?.abort(),e+=1}}}function k(e,t=300,n=globalThis){let r=n.setTimeout(e,t);return()=>n.clearTimeout(r)}function ae(e,t,n){return!e?.id||!e?.revision||n?.profileId!==e.id||n?.profileRevision!==e.revision||!n?.storageRevision?null:{...t,profile:{...e},profileId:e.id,profileRevision:e.revision,storageRevision:n.storageRevision,status:{...n}}}function oe(e){let t=e?.result?.skippedLockedRolloutFiles??e?.skippedLockedRolloutFiles??[];return Array.isArray(t)?t.filter(Boolean):[]}function se(e,{successTitle:t,partialTitle:n,message:r}){let i=oe(e);return e?.result?.outcome===`partial`||e?.outcome===`partial`||i.length>0?{tone:`warning`,title:n,message:[r,i.length?`已跳过 ${i.length} 个被占用的 rollout 文件:${i.join(`、`)}`:`部分项目未完成;请查看活动日志后重试。`].filter(Boolean).join(`;`)}:{tone:`success`,title:t,message:r}}function ce(e,t){let n=String(e??``).replaceAll(`\\`,`/`).replace(/\/{2,}/g,`/`).replace(/\/$/,``);return t===`win32`?n.toLowerCase():n}function A(e=[],{platform:t=typeof process<`u`?process.platform:`browser`}={}){let n=new Set;return e.filter((e,r)=>{let i=e?.threadId??e?.id,a=e?.rolloutPath??e?.filePath??e?.rolloutFile??e?.path,o=i?`thread:${i}`:a?`rollout:${ce(a,t)}`:`item:${r}`;return!n.has(o)&&(n.add(o),!0)})}function le(e,{caseInsensitive:t=!1}={}){let n=String(e??``).replace(/[\\/]+$/,``).replaceAll(`\\`,`/`);return t?n.toLowerCase():n}function ue(e,t,n){return!!(e&&t&&le(e,n)===le(t,n))}function de(e){let t=String(e??``).replace(/[\\/]+$/,``),n=Math.max(t.lastIndexOf(`/`),t.lastIndexOf(`\\`));return n<0?``:n===0?t.slice(0,1):n===2&&/^[A-Za-z]:/.test(t)?t.slice(0,3):t.slice(0,n)}function fe(e,t){let n=e?.stateDbLocation?.path;if(n)return de(n);let r=t?.metadata,i={caseInsensitive:e?.pathComparisonCaseInsensitive===!0};return Number(r?.version)>=2&&e?.sqliteHomeSource==="default"&&ue(r?.sqliteHome,e?.codexHome,i)?e.codexHome:e?.sqliteHome??``}function pe({backup:e,profile:t,targetSqliteHome:n,restoreDatabase:r,restoreConfig:i,sqliteSupported:a,pathComparisonCaseInsensitive:o=!1}){let s=e?.metadata?.sqliteHome,c=t?.sqliteHome?.trim()??``,l=!!(r&&s&&n&&!ue(s,n,{caseInsensitive:o})),u=l&&!c,d=l&&i;return{requiresRelocation:l,missingExplicitTarget:u,configRestoreConflict:d,canSubmit:!!a&&!u&&!d}}function me(e){return{profileId:e||`default`}}function he({fetchStatus:e,fetchBackups:t,gate:n=ie()}){let r=async({profileId:r,showLoading:i=!0,onLoading:a,onResult:o,onError:s})=>{let{controller:c,sequence:l}=n.begin();i&&a?.(!0);try{let i=me(r),[a,s]=await Promise.all([e(i,{signal:c.signal}),t(i,{signal:c.signal})]);return n.isLatest(l)?(o?.({profileId:r,status:a.status,backups:s}),!0):!1}catch(e){return e?.name===`AbortError`||!n.isLatest(l)||s?.(e),!1}finally{n.isLatest(l)&&a?.(!1)}};return r.cancel=()=>n.cancel(),r}var j=o((e=>{var t=u(),n=Symbol.for(`react.element`),r=Symbol.for(`react.fragment`),i=Object.prototype.hasOwnProperty,a=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,o={key:!0,ref:!0,__self:!0,__source:!0};function s(e,t,r){var s,c={},l=null,u=null;for(s in r!==void 0&&(l=``+r),t.key!==void 0&&(l=``+t.key),t.ref!==void 0&&(u=t.ref),t)i.call(t,s)&&!o.hasOwnProperty(s)&&(c[s]=t[s]);if(e&&e.defaultProps)for(s in t=e.defaultProps,t)c[s]===void 0&&(c[s]=t[s]);return{$$typeof:n,type:e,key:l,ref:u,props:c,_owner:a.current}}e.Fragment=r,e.jsx=s,e.jsxs=s})),M=o(((e,t)=>{t.exports=j()}))();function N({children:e,size:t=18,className:n=``}){return(0,M.jsx)(`svg`,{className:n,width:t,height:t,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:e})}var P=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M20 6v5h-5`}),(0,M.jsx)(`path`,{d:`M4 18v-5h5`}),(0,M.jsx)(`path`,{d:`M18.3 9A7 7 0 0 0 6.7 6.7L4 11`}),(0,M.jsx)(`path`,{d:`M5.7 15A7 7 0 0 0 17.3 17.3L20 13`})]}),ge=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`ellipse`,{cx:`12`,cy:`5`,rx:`8`,ry:`3`}),(0,M.jsx)(`path`,{d:`M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5`}),(0,M.jsx)(`path`,{d:`M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6`})]}),_e=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M3 12a9 9 0 1 0 3-6.7L3 8`}),(0,M.jsx)(`path`,{d:`M3 3v5h5`}),(0,M.jsx)(`path`,{d:`M12 7v5l3 2`})]}),ve=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`M3 12h4l2-7 4 14 2-7h6`})}),ye=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`,rx:`1`}),(0,M.jsx)(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`,rx:`1`}),(0,M.jsx)(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1`}),(0,M.jsx)(`rect`,{x:`14`,y:`14`,width:`7`,height:`7`,rx:`1`})]}),be=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M12 3 4.5 6v5.3c0 4.6 3.2 8 7.5 9.7 4.3-1.7 7.5-5.1 7.5-9.7V6L12 3Z`}),(0,M.jsx)(`path`,{d:`m9 12 2 2 4-4`})]}),xe=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`m9 18 6-6-6-6`})}),Se=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`m6 6 12 12M18 6 6 18`})}),Ce=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`m5 12 4 4L19 6`})}),F=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M12 3 2.8 19h18.4L12 3Z`}),(0,M.jsx)(`path`,{d:`M12 9v4M12 17h.01`})]}),we=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`M3 6.5h6l2 2h10v9.5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6.5Z`})}),Te=[{id:`overview`,label:`概览`,icon:ye},{id:`history`,label:`聊天记录`,icon:_e},{id:`backups`,label:`备份`,icon:_e},{id:`activity`,label:`活动`,icon:ve}],Ee={backupRoot:``,backups:[]};function De(e){return new Intl.NumberFormat(`zh-CN`).format(Number(e)||0)}function Oe(e){let t=[`B`,`KB`,`MB`,`GB`,`TB`],n=Number(e)||0,r=0;for(;n>=1024&&r=10?1:2).replace(/\.0$/,``)} ${t[r]}`}function ke(e){return e?new Intl.DateTimeFormat(`zh-CN`,{month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}).format(new Date(e)):`未知时间`}function Ae(e,t){return e.split(/(`[^`]+`|\*\*[^*]+\*\*|\*[^*]+\*)/g).map((e,n)=>e.startsWith("`")&&e.endsWith("`")?(0,M.jsx)(`code`,{children:e.slice(1,-1)},`${t}-code-${n}`):e.startsWith(`**`)&&e.endsWith(`**`)?(0,M.jsx)(`strong`,{children:e.slice(2,-2)},`${t}-strong-${n}`):e.startsWith(`*`)&&e.endsWith(`*`)?(0,M.jsx)(`em`,{children:e.slice(1,-1)},`${t}-em-${n}`):(0,M.jsx)(g.Fragment,{children:e},`${t}-text-${n}`))}function je({text:e}){return String(e??``).split(/(```[^\n]*\n[\s\S]*?```)/g).map((e,t)=>{if(e.startsWith("```")&&e.endsWith("```")){let n=e.slice(3,-3).replace(/^\w*\n/,``);return(0,M.jsx)(`pre`,{children:(0,M.jsx)(`code`,{children:n})},`block-${t}`)}return e.split(` -`).map((e,n,r)=>(0,M.jsxs)(g.Fragment,{children:[Ae(e,`${t}-${n}`),n{for(let r of e??[]){if(!r||r===`(missing)`)continue;let e=t.get(r)??new Set;e.add(n),t.set(r,e)}};return n(e.configuredProviders,`config`),n(Object.keys(e.rolloutCounts?.sessions??{}),`rollout`),n(Object.keys(e.rolloutCounts?.archived_sessions??{}),`rollout`),n(Object.keys(e.sqliteCounts?.sessions??{}),`sqlite`),n(Object.keys(e.sqliteCounts?.archived_sessions??{}),`sqlite`),n([e.currentProvider],`config`),[...t.entries()].map(([t,n])=>({id:t,sources:[...n],configured:e.configuredProviders?.includes(t),current:t===e.currentProvider})).sort((e,t)=>Number(t.current)-Number(e.current)||e.id.localeCompare(t.id))}function Ne({tone:e=`neutral`}){return(0,M.jsx)(`span`,{className:`status-dot status-dot--${e}`,"aria-hidden":`true`})}function Pe({status:e,busy:t,onRefresh:n}){let r=e?.sqliteAccess?.supported!==!1&&!e?.sqliteCounts?.unreadable;return(0,M.jsxs)(`header`,{className:`app-header`,children:[(0,M.jsxs)(`div`,{className:`brand`,children:[(0,M.jsx)(`div`,{className:`brand-mark`,children:(0,M.jsx)(ge,{size:19})}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`brand-name`,children:`Codex Provider Sync`}),(0,M.jsx)(`div`,{className:`brand-subtitle`,children:`本机元数据一致性工具`})]})]}),(0,M.jsxs)(`div`,{className:`header-actions`,children:[(0,M.jsxs)(`div`,{className:`service-state`,children:[(0,M.jsx)(Ne,{tone:t?`warning`:r?`success`:`danger`}),(0,M.jsx)(`span`,{children:t?`操作执行中`:r?`本地服务就绪`:`需要检查`})]}),(0,M.jsxs)(`button`,{className:`button button--secondary button--compact`,type:`button`,onClick:n,disabled:t,children:[(0,M.jsx)(P,{size:16}),`刷新`]})]})]})}function Fe({view:e,setView:t,status:n,onForgetBrowser:r}){return(0,M.jsxs)(`aside`,{className:`sidebar`,children:[(0,M.jsx)(`nav`,{className:`navigation`,"aria-label":`主导航`,children:Te.map(n=>{let r=n.icon;return(0,M.jsxs)(`button`,{className:`nav-item ${e===n.id?`nav-item--active`:``}`,type:`button`,onClick:()=>t(n.id),children:[(0,M.jsx)(r,{size:17}),(0,M.jsx)(`span`,{children:n.label})]},n.id)})}),(0,M.jsxs)(`div`,{className:`sidebar-foot`,children:[(0,M.jsx)(`div`,{className:`sidebar-provider-label`,children:`当前 Provider`}),(0,M.jsxs)(`div`,{className:`sidebar-provider-value`,children:[(0,M.jsx)(Ne,{tone:`success`}),(0,M.jsx)(`span`,{children:n?.currentProvider??`未读取`})]}),(0,M.jsx)(`div`,{className:`sidebar-version`,children:`Web UI · localhost only`}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,onClick:r,children:`忘记此浏览器`})]})]})}function Ie({profiles:e,profileId:t,setProfileId:n,status:r,onAddProfile:i,onDeleteProfile:a,onRefresh:o,loading:s,profileSwitchDisabled:c}){return(0,M.jsxs)(`section`,{className:`storage-bar`,"aria-label":`存储位置`,children:[(0,M.jsxs)(`label`,{className:`path-field path-field--wide`,children:[(0,M.jsx)(`span`,{children:`存储配置`}),(0,M.jsxs)(`div`,{className:`path-input-wrap`,children:[(0,M.jsx)(we,{size:16}),(0,M.jsx)(`select`,{value:t,onChange:e=>n(e.target.value),disabled:c,children:e.map(e=>(0,M.jsx)(`option`,{value:e.id,children:e.name},e.id))})]})]}),(0,M.jsxs)(`label`,{className:`path-field`,children:[(0,M.jsxs)(`span`,{children:[`当前路径 `,(0,M.jsx)(`small`,{children:`由服务端解析`})]}),(0,M.jsxs)(`div`,{className:`path-input-wrap`,children:[(0,M.jsx)(ge,{size:16}),(0,M.jsx)(`input`,{value:r?.codexHome??``,readOnly:!0,placeholder:`读取状态后显示`})]})]}),(0,M.jsx)(`button`,{className:`button button--secondary storage-refresh`,type:`button`,onClick:i,children:`新增配置`}),t==="default"?null:(0,M.jsx)(`button`,{className:`button button--quiet storage-refresh`,type:`button`,onClick:a,children:`删除配置`}),(0,M.jsxs)(`button`,{className:`button button--secondary storage-refresh`,type:`button`,onClick:o,disabled:s,children:[(0,M.jsx)(P,{size:16,className:s?`spin`:``}),`读取状态`]})]})}function Le({title:e,counts:t,currentProvider:n}){let r=Object.entries(t??{}).sort((e,t)=>t[1]-e[1]),i=r.reduce((e,[,t])=>e+t,0);return(0,M.jsxs)(`div`,{className:`distribution-block`,children:[(0,M.jsxs)(`div`,{className:`distribution-heading`,children:[(0,M.jsx)(`span`,{children:e}),(0,M.jsx)(`strong`,{children:De(i)})]}),(0,M.jsx)(`div`,{className:`distribution-list`,children:r.length===0?(0,M.jsx)(`div`,{className:`empty-inline`,children:`无记录`}):r.map(([e,t])=>(0,M.jsxs)(`div`,{className:`distribution-row`,children:[(0,M.jsxs)(`div`,{className:`distribution-meta`,children:[(0,M.jsx)(`span`,{className:`provider-name`,children:e}),(0,M.jsx)(`span`,{children:De(t)})]}),(0,M.jsx)(`div`,{className:`bar-track`,children:(0,M.jsx)(`span`,{className:e===n?`bar-fill bar-fill--current`:`bar-fill`,style:{width:`${Math.max(5,i?t/i*100:0)}%`}})})]},e))})]})}function Re({status:e,loading:t}){let n=Object.values(e?.rolloutCounts?.sessions??{}).reduce((e,t)=>e+t,0)+Object.values(e?.rolloutCounts?.archived_sessions??{}).reduce((e,t)=>e+t,0),r=Object.values(e?.sqliteCounts?.sessions??{}).reduce((e,t)=>e+t,0)+Object.values(e?.sqliteCounts?.archived_sessions??{}).reduce((e,t)=>e+t,0),i=e?.alignment?.aligned;return(0,M.jsxs)(`section`,{className:`status-panel`,children:[(0,M.jsxs)(`div`,{className:`section-title-row`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`状态总览`}),(0,M.jsx)(`p`,{children:`比较 rollout 文件、SQLite 线程索引和当前 Provider。`})]}),(0,M.jsxs)(`div`,{className:`alignment-state ${i?`alignment-state--success`:`alignment-state--warning`}`,children:[t?(0,M.jsx)(P,{size:16,className:`spin`}):i?(0,M.jsx)(Ce,{size:16}):(0,M.jsx)(F,{size:16}),(0,M.jsx)(`span`,{children:t?`正在检查`:i?`Provider 元数据已对齐`:`发现不一致`})]})]}),(0,M.jsxs)(`div`,{className:`summary-strip`,children:[(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`当前 Provider`}),(0,M.jsx)(`strong`,{children:e?.currentProvider??`—`}),(0,M.jsx)(`small`,{children:e?.currentProviderImplicit?`隐式默认`:`config.toml 根级配置`})]}),(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`Rollout 文件`}),(0,M.jsx)(`strong`,{children:De(n)}),(0,M.jsx)(`small`,{children:`sessions + archived`})]}),(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`SQLite threads`}),(0,M.jsx)(`strong`,{children:e?.sqliteCounts?.unreadable?`不可读`:De(r)}),(0,M.jsx)(`small`,{children:e?.stateDbLocation?.source??`未定位数据库`})]}),(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`托管备份`}),(0,M.jsx)(`strong`,{children:De(e?.backupSummary?.count)}),(0,M.jsx)(`small`,{children:Oe(e?.backupSummary?.totalBytes)})]})]}),(0,M.jsxs)(`div`,{className:`distribution-grid`,children:[(0,M.jsxs)(`div`,{className:`distribution-column`,children:[(0,M.jsxs)(`div`,{className:`column-label`,children:[(0,M.jsx)(we,{size:16}),` Rollout files`]}),(0,M.jsx)(Le,{title:`sessions`,counts:e?.rolloutCounts?.sessions,currentProvider:e?.currentProvider}),(0,M.jsx)(Le,{title:`archived_sessions`,counts:e?.rolloutCounts?.archived_sessions,currentProvider:e?.currentProvider})]}),(0,M.jsx)(`div`,{className:`distribution-divider`}),(0,M.jsxs)(`div`,{className:`distribution-column`,children:[(0,M.jsxs)(`div`,{className:`column-label`,children:[(0,M.jsx)(ge,{size:16}),` SQLite state`]}),(0,M.jsx)(Le,{title:`sessions`,counts:e?.sqliteCounts?.sessions,currentProvider:e?.currentProvider}),(0,M.jsx)(Le,{title:`archived_sessions`,counts:e?.sqliteCounts?.archived_sessions,currentProvider:e?.currentProvider})]})]})]})}function ze({status:e}){let t=[];e?.sqliteAccess?.supported===!1&&t.push({tone:`danger`,title:`SQLite 路径不可安全访问`,detail:e.sqliteAccess.message}),e?.sqliteCounts?.unreadable&&t.push({tone:`danger`,title:`SQLite 当前不可读`,detail:e.sqliteCounts.error}),e?.lockedRolloutFiles?.length&&t.push({tone:`warning`,title:`${e.lockedRolloutFiles.length} 个 rollout 文件正在使用`,detail:`同步会跳过这些活跃文件;会话结束后可再次执行。`}),e?.encryptedContentWarning&&t.push({tone:`warning`,title:`检测到 encrypted_content`,detail:e.encryptedContentWarning});let n=e?.sqliteRepairStats;return(n?.userEventRowsNeedingRepair||n?.cwdRowsNeedingRepair)&&t.push({tone:`info`,title:`SQLite 有待修复字段`,detail:`user-event ${n.userEventRowsNeedingRepair??0},cwd ${n.cwdRowsNeedingRepair??0}`}),t.length===0?null:(0,M.jsx)(`section`,{className:`warning-stack`,"aria-label":`诊断信息`,children:t.map((e,t)=>(0,M.jsxs)(`div`,{className:`warning-row warning-row--${e.tone}`,children:[(0,M.jsx)(F,{size:17}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:e.title}),(0,M.jsx)(`span`,{children:e.detail})]})]},`${e.title}-${t}`))})}function Be({projects:e=[]}){return(0,M.jsxs)(`section`,{className:`data-section`,children:[(0,M.jsx)(`div`,{className:`section-title-row section-title-row--compact`,children:(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`项目可见性`}),(0,M.jsx)(`p`,{children:`检查 Desktop 项目路径、全局排序和首屏 50 条命中。`})]})}),(0,M.jsx)(`div`,{className:`table-scroll`,children:(0,M.jsxs)(`table`,{className:`data-table`,children:[(0,M.jsx)(`thead`,{children:(0,M.jsxs)(`tr`,{children:[(0,M.jsx)(`th`,{children:`项目根目录`}),(0,M.jsx)(`th`,{children:`交互会话`}),(0,M.jsx)(`th`,{children:`首屏`}),(0,M.jsx)(`th`,{children:`Ranks`}),(0,M.jsx)(`th`,{children:`CWD 精确匹配`}),(0,M.jsx)(`th`,{children:`Provider`})]})}),(0,M.jsx)(`tbody`,{children:e.length===0?(0,M.jsx)(`tr`,{children:(0,M.jsx)(`td`,{colSpan:`6`,className:`table-empty`,children:`没有可显示的项目诊断。`})}):e.map(e=>(0,M.jsxs)(`tr`,{children:[(0,M.jsx)(`td`,{className:`path-cell`,children:e.root}),(0,M.jsx)(`td`,{children:e.interactiveThreads}),(0,M.jsxs)(`td`,{children:[e.firstPageThreads,`/50`]}),(0,M.jsx)(`td`,{children:e.rankPreview||`—`}),(0,M.jsxs)(`td`,{children:[e.exactCwdMatches,`/`,e.interactiveThreads]}),(0,M.jsx)(`td`,{children:Object.entries(e.providerCounts??{}).map(([e,t])=>`${e} ${t}`).join(` · `)||`—`})]},e.root))})]})})]})}function Ve({value:e,onChange:t,disabled:n}){return(0,M.jsxs)(`div`,{className:`segmented`,role:`radiogroup`,"aria-label":`执行模式`,children:[(0,M.jsxs)(`button`,{type:`button`,className:e===`sync`?`segmented-option segmented-option--active`:`segmented-option`,onClick:()=>t(`sync`),disabled:n,children:[(0,M.jsx)(`span`,{children:`仅同步元数据`}),(0,M.jsx)(`small`,{children:`不修改 config.toml`})]}),(0,M.jsxs)(`button`,{type:`button`,className:e===`switch`?`segmented-option segmented-option--active`:`segmented-option`,onClick:()=>t(`switch`),disabled:n,children:[(0,M.jsx)(`span`,{children:`切换 Provider 并同步`}),(0,M.jsx)(`small`,{children:`更新根级配置`})]})]})}function He({status:e,providers:t,selectedProvider:n,setSelectedProvider:r,onAddManualProvider:i,onRemoveManualProvider:a,onRequestExecute:o,busy:s}){let[c,l]=O(`cps.web.mode`,`sync`),[u,d]=O(`cps.web.modelMode`,`auto`),[f,p]=O(`cps.web.customModel`,``),[m,h]=O(`cps.web.keepCount`,5),[_,v]=(0,g.useState)(``),y=t.find(e=>e.id===n),b=y?.configured,x=/^[A-Za-z0-9_.-]+$/.test(_.trim()),ee=e?.sqliteAccess?.supported===!1,S=s||!n||ee||e?.sqliteCounts?.unreadable;return(0,M.jsxs)(`section`,{className:`execution-panel`,children:[(0,M.jsxs)(`div`,{className:`execution-head`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`执行同步`}),(0,M.jsx)(`p`,{children:`所有写操作都会先创建备份。执行前请关闭 Codex CLI、App 和 app-server。`})]}),(0,M.jsx)(be,{size:22})]}),(0,M.jsx)(Ve,{value:c,onChange:l,disabled:s}),(0,M.jsxs)(`div`,{className:`form-grid`,children:[(0,M.jsxs)(`label`,{className:`form-field`,children:[(0,M.jsx)(`span`,{children:`目标 Provider`}),(0,M.jsx)(`select`,{value:n,onChange:e=>r(e.target.value),disabled:s,children:t.map(e=>(0,M.jsxs)(`option`,{value:e.id,children:[e.id,e.current?`(当前)`:``]},e.id))}),c===`switch`&&!b?(0,M.jsx)(`small`,{className:`field-error`,children:`切换模式要求该 Provider 已定义在 config.toml。`}):null]}),(0,M.jsxs)(`label`,{className:`form-field form-field--short`,children:[(0,M.jsx)(`span`,{children:`保留备份数`}),(0,M.jsx)(`input`,{type:`number`,min:`1`,max:`100000`,value:m,onChange:e=>h(Number(e.target.value)),disabled:s}),(0,M.jsx)(`small`,{children:`同步后自动清理`})]})]}),(0,M.jsxs)(`div`,{className:`manual-provider-row`,children:[(0,M.jsx)(`input`,{type:`text`,value:_,onChange:e=>v(e.target.value),placeholder:`手动添加 Provider ID`,spellCheck:`false`,disabled:s}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:s||!x,onClick:()=>{i(_.trim()),v(``)},children:`添加`}),y?.manual?(0,M.jsx)(`button`,{className:`manual-remove`,type:`button`,onClick:()=>a(n),disabled:s,children:`删除当前手动项`}):null]}),c===`switch`?(0,M.jsxs)(`fieldset`,{className:`model-options`,disabled:s,children:[(0,M.jsx)(`legend`,{children:`根级 model`}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`auto`,onChange:()=>d(`auto`)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`跟随 Provider 配置`}),(0,M.jsxs)(`small`,{children:["采用 `[model_providers.",n,"]` 中的 model"]})]})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`keep`,onChange:()=>d(`keep`)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`保留当前根级 model`}),(0,M.jsx)(`small`,{children:`只切换 model_provider`})]})]}),(0,M.jsxs)(`label`,{className:`custom-model-option`,children:[(0,M.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`custom`,onChange:()=>d(`custom`)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`自定义 model`}),(0,M.jsx)(`input`,{type:`text`,value:f,onFocus:()=>d(`custom`),onChange:e=>p(e.target.value),placeholder:`例如 MiniMax-M3`})]})]})]}):null,ee?(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`此 SQLite 布局仅供诊断`}),(0,M.jsx)(`span`,{children:e?.sqliteAccess?.message||`当前 SQLite 路径不可由 Web UI 安全写入,因此已禁用执行同步。`})]})]}):null,(0,M.jsxs)(`div`,{className:`backup-assurance`,children:[(0,M.jsx)(Ce,{size:16}),(0,M.jsx)(`span`,{children:`修改前创建 metadata v2 备份,并记录 SQLite Home`})]}),(0,M.jsxs)(`button`,{className:`button button--primary execute-button`,type:`button`,disabled:S||c===`switch`&&!b||c===`switch`&&u===`custom`&&!f.trim(),onClick:()=>o({mode:c,modelMode:u,model:f.trim(),keepCount:m}),children:[s?(0,M.jsx)(P,{size:17,className:`spin`}):(0,M.jsx)(be,{size:17}),s?`正在执行…`:c===`switch`?`切换并同步`:`执行同步`]})]})}function Ue({backups:e,onViewAll:t,onRestore:n,restoreDisabled:r}){return(0,M.jsxs)(`section`,{className:`recent-backups`,children:[(0,M.jsxs)(`div`,{className:`section-title-row section-title-row--compact`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`最近备份`}),(0,M.jsx)(`p`,{children:e.backupRoot||`同步后将在 Codex Home 下创建备份`})]}),(0,M.jsxs)(`button`,{type:`button`,className:`text-button`,onClick:t,children:[`查看全部 `,(0,M.jsx)(xe,{size:14})]})]}),(0,M.jsx)(`div`,{className:`backup-rows`,children:e.backups.length===0?(0,M.jsx)(`div`,{className:`empty-state`,children:`尚无由本工具创建的备份。`}):e.backups.slice(0,3).map(e=>(0,M.jsxs)(`div`,{className:`backup-row`,children:[(0,M.jsx)(`div`,{className:`backup-icon`,children:(0,M.jsx)(_e,{size:17})}),(0,M.jsxs)(`div`,{className:`backup-main`,children:[(0,M.jsx)(`strong`,{children:ke(e.metadata.createdAt)}),(0,M.jsxs)(`span`,{children:[e.metadata.targetProvider,` · `,e.metadata.changedSessionFiles??0,` 个 rollout`]})]}),(0,M.jsx)(`div`,{className:`backup-size`,children:Oe(e.sizeBytes)}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:r,title:r?`当前 SQLite 路径仅供诊断,不能恢复`:void 0,onClick:()=>n(e),children:`恢复`})]},e.id))})]})}function We({status:e,backups:t,providers:n,selectedProvider:r,setSelectedProvider:i,onAddManualProvider:a,onRemoveManualProvider:o,onExecute:s,onRestore:c,setView:l,busy:u,loading:d}){return(0,M.jsxs)(`div`,{className:`view-content`,children:[(0,M.jsx)(Re,{status:e,loading:d}),(0,M.jsx)(ze,{status:e}),(0,M.jsxs)(`div`,{className:`overview-lower-grid`,children:[(0,M.jsxs)(`div`,{className:`overview-main-column`,children:[(0,M.jsx)(Be,{projects:e?.projectThreadVisibility??[]}),(0,M.jsx)(Ue,{backups:t,onViewAll:()=>l(`backups`),onRestore:c,restoreDisabled:e?.sqliteAccess?.supported===!1})]}),(0,M.jsx)(He,{status:e,providers:n,selectedProvider:r,setSelectedProvider:i,onAddManualProvider:a,onRemoveManualProvider:o,onRequestExecute:s,busy:u})]})]})}function Ge({backups:e,status:t,busy:n,onRestore:r,onPrune:i}){let[a,o]=O(`cps.web.keepCount`,5),s=t?.sqliteAccess?.supported===!1;return(0,M.jsxs)(`div`,{className:`view-content`,children:[(0,M.jsxs)(`section`,{className:`page-intro`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h1`,{children:`备份`}),(0,M.jsx)(`p`,{children:`管理当前 Codex Home 下由本工具创建的 metadata v2 备份。`})]}),(0,M.jsxs)(`div`,{className:`prune-control`,children:[(0,M.jsxs)(`label`,{children:[`保留最近 `,(0,M.jsx)(`input`,{type:`number`,min:`0`,max:`100000`,value:a,onChange:e=>o(Number(e.target.value))}),` 份`]}),(0,M.jsx)(`button`,{className:`button button--secondary`,type:`button`,disabled:n,onClick:()=>i(a),children:`清理旧备份`})]})]}),(0,M.jsxs)(`section`,{className:`backup-list-section`,children:[(0,M.jsxs)(`div`,{className:`backup-root-line`,children:[(0,M.jsx)(we,{size:16}),(0,M.jsx)(`span`,{children:e.backupRoot||t?.backupRoot||`—`}),(0,M.jsxs)(`strong`,{children:[e.backups.length,` 份 · `,Oe(e.backups.reduce((e,t)=>e+t.sizeBytes,0))]})]}),(0,M.jsx)(`div`,{className:`full-backup-list`,children:e.backups.length===0?(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(_e,{size:26}),(0,M.jsx)(`strong`,{children:`还没有备份`}),(0,M.jsx)(`span`,{children:`执行一次同步或切换后,备份会显示在这里。`})]}):e.backups.map(e=>(0,M.jsxs)(`article`,{className:`full-backup-row`,children:[(0,M.jsxs)(`div`,{className:`backup-date`,children:[(0,M.jsx)(`strong`,{children:ke(e.metadata.createdAt)}),(0,M.jsx)(`span`,{children:e.id})]}),(0,M.jsxs)(`div`,{className:`backup-facts`,children:[(0,M.jsxs)(`span`,{children:[`Provider `,(0,M.jsx)(`strong`,{children:e.metadata.targetProvider})]}),(0,M.jsxs)(`span`,{children:[`Rollout `,(0,M.jsx)(`strong`,{children:e.metadata.changedSessionFiles??0})]}),(0,M.jsxs)(`span`,{children:[`SQLite `,(0,M.jsx)(`strong`,{children:e.metadata.sqliteDbFiles?.length?`已包含`:`未包含`})]})]}),(0,M.jsxs)(`div`,{className:`backup-source`,children:[(0,M.jsx)(`span`,{children:`SQLite Home`}),(0,M.jsx)(`code`,{children:e.metadata.sqliteHome??`旧版 metadata 未记录`})]}),(0,M.jsxs)(`div`,{className:`backup-row-actions`,children:[(0,M.jsx)(`span`,{children:Oe(e.sizeBytes)}),(0,M.jsx)(`button`,{className:`button button--secondary button--compact`,type:`button`,disabled:n||s,title:s?`当前 SQLite 路径仅供诊断,不能恢复`:void 0,onClick:()=>r(e),children:`恢复`})]})]},e.id))})]})]})}function Ke({activity:e,activeOperation:t}){return(0,M.jsxs)(`div`,{className:`view-content`,children:[(0,M.jsxs)(`section`,{className:`page-intro`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h1`,{children:`活动日志`}),(0,M.jsx)(`p`,{children:`当前 Web UI 会话中的状态刷新、同步阶段和操作结果。`})]}),t?(0,M.jsxs)(`div`,{className:`live-operation`,children:[(0,M.jsx)(P,{size:16,className:`spin`}),` `,t.kind]}):null]}),(0,M.jsxs)(`section`,{className:`activity-console`,children:[(0,M.jsxs)(`div`,{className:`console-head`,children:[(0,M.jsx)(`span`,{children:`Activity log`}),(0,M.jsxs)(`span`,{children:[e.length,` entries`]})]}),(0,M.jsx)(`div`,{className:`console-body`,children:e.length===0?(0,M.jsx)(`div`,{className:`console-empty`,children:`等待操作…`}):e.map(e=>(0,M.jsxs)(`div`,{className:`console-row console-row--${e.level}`,children:[(0,M.jsx)(`time`,{children:ke(e.timestamp)}),(0,M.jsx)(`span`,{className:`console-level`,children:e.level}),(0,M.jsx)(`span`,{className:`console-message`,children:e.message}),typeof e.detail==`string`?(0,M.jsx)(`span`,{className:`console-detail`,children:e.detail}):null]},e.id))})]})]})}function qe({profileId:e,status:t}){let[n,r]=(0,g.useState)(``),[i,a]=(0,g.useState)(``),[o,s]=(0,g.useState)(``),[c,l]=(0,g.useState)(``),[u,d]=(0,g.useState)(`all`),[f,p]=(0,g.useState)(1),[m,h]=(0,g.useState)({sessions:[],total:0,pageSize:50,hasNextPage:!1}),[_,v]=(0,g.useState)(``),[y,b]=(0,g.useState)(null),[x,ee]=(0,g.useState)(!1),[S,C]=(0,g.useState)(!1),[w,T]=(0,g.useState)(``),te=(0,g.useRef)(null),ne=(0,g.useRef)(null);te.current||=ie(),ne.current||=ie();let re=Me(t),O=[...new Set((t?.projectThreadVisibility??[]).map(e=>e.root))];(0,g.useEffect)(()=>{te.current.cancel(),ne.current.cancel(),r(``),a(``),s(``),l(``),d(`all`),p(1),h({sessions:[],total:0,pageSize:50,hasNextPage:!1}),v(``),b(null),T(``)},[e]),(0,g.useEffect)(()=>k(()=>a(n),300,window),[n]);let ae=(0,g.useCallback)(async()=>{let{controller:t,sequence:n}=te.current.begin();ee(!0),T(``);try{let r=await E({...me(e),page:f,pageSize:50,query:i,provider:o,project:c,archived:u},{signal:t.signal});if(!te.current.isLatest(n))return;let a={...r.history,sessions:A(r.history?.sessions)};h(a),v(e=>a.sessions.some(t=>t.id===e)?e:a.sessions[0]?.id??``)}catch(e){e.name!==`AbortError`&&te.current.isLatest(n)&&T(e.message)}finally{te.current.isLatest(n)&&ee(!1)}},[e,f,i,o,c,u]);(0,g.useEffect)(()=>(ae(),()=>te.current.cancel()),[ae]),(0,g.useEffect)(()=>{if(ne.current.cancel(),!_){b(null),C(!1);return}let{controller:t,sequence:n}=ne.current.begin();return b(null),C(!0),T(``),D({...me(e),sessionId:_},{signal:t.signal}).then(e=>{ne.current.isLatest(n)&&b(e.history)}).catch(e=>{e.name!==`AbortError`&&ne.current.isLatest(n)&&T(e.message)}).finally(()=>{ne.current.isLatest(n)&&C(!1)}),()=>t.abort()},[e,_]);let oe=e=>t=>{e(t.target.value),p(1)};return(0,M.jsxs)(`div`,{className:`view-content history-view`,children:[(0,M.jsxs)(`section`,{className:`page-intro`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h1`,{children:`聊天记录`}),(0,M.jsx)(`p`,{children:`从 rollout 文件读取历史会话,只读查看,不修改本地数据。`})]}),(0,M.jsxs)(`button`,{className:`button button--secondary`,type:`button`,onClick:ae,disabled:x,children:[(0,M.jsx)(P,{size:16,className:x?`spin`:``}),`刷新`]})]}),(0,M.jsxs)(`section`,{className:`history-toolbar`,children:[(0,M.jsx)(`input`,{value:n,onChange:oe(r),onKeyDown:e=>{e.key===`Enter`&&(a(n),p(1))},placeholder:`搜索标题、项目、Provider 或消息内容`}),(0,M.jsxs)(`select`,{value:o,onChange:oe(s),children:[(0,M.jsx)(`option`,{value:``,children:`全部 Provider`}),re.map(e=>(0,M.jsx)(`option`,{value:e.id,children:e.id},e.id))]}),(0,M.jsxs)(`select`,{value:c,onChange:oe(l),children:[(0,M.jsx)(`option`,{value:``,children:`全部项目`}),O.map(e=>(0,M.jsx)(`option`,{value:e,children:e},e))]}),(0,M.jsxs)(`select`,{value:u,onChange:oe(d),children:[(0,M.jsx)(`option`,{value:`all`,children:`全部会话`}),(0,M.jsx)(`option`,{value:`active`,children:`活跃会话`}),(0,M.jsx)(`option`,{value:`archived`,children:`已归档`})]})]}),w?(0,M.jsxs)(`div`,{className:`history-error`,children:[(0,M.jsx)(F,{size:16}),w]}):null,(0,M.jsxs)(`section`,{className:`history-layout`,children:[(0,M.jsxs)(`div`,{className:`history-list-panel`,children:[(0,M.jsxs)(`div`,{className:`history-list-head`,children:[(0,M.jsxs)(`strong`,{children:[m.total,` 个会话`]}),(0,M.jsxs)(`span`,{children:[`第 `,m.page,` 页`]})]}),(0,M.jsxs)(`div`,{className:`history-list`,children:[x&&!m.sessions.length?(0,M.jsx)(`div`,{className:`large-empty`,children:`读取中…`}):null,!x&&!m.sessions.length?(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(_e,{size:24}),(0,M.jsx)(`strong`,{children:`没有匹配的会话`})]}):null,m.sessions.map(e=>(0,M.jsxs)(`button`,{type:`button`,className:`history-session-row ${e.id===_?`history-session-row--selected`:``}`,onClick:()=>v(e.id),children:[(0,M.jsxs)(`div`,{className:`history-session-top`,children:[(0,M.jsx)(`strong`,{children:e.title}),(0,M.jsx)(`time`,{children:ke(e.updatedAt)})]}),(0,M.jsx)(`p`,{children:e.firstUserMessage||`没有可读的用户消息`}),(0,M.jsxs)(`div`,{className:`history-session-meta`,children:[(0,M.jsx)(`span`,{children:e.provider}),(0,M.jsxs)(`span`,{children:[e.messageCount,` 条消息`]}),(0,M.jsx)(`span`,{children:e.archived?`已归档`:`活跃`})]})]},e.id))]}),(0,M.jsxs)(`div`,{className:`history-pagination`,children:[(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:f<=1||x,onClick:()=>p(e=>e-1),children:`上一页`}),(0,M.jsx)(`span`,{children:f}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:!m.hasNextPage||x,onClick:()=>p(e=>e+1),children:`下一页`})]})]}),(0,M.jsx)(`div`,{className:`history-detail-panel`,children:S?(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(P,{size:24,className:`spin`}),(0,M.jsx)(`strong`,{children:`正在读取会话`})]}):y?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`div`,{className:`history-detail-head`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:y.session.title}),(0,M.jsxs)(`p`,{children:[y.session.cwd||`未知项目`,` · `,y.session.provider,` · `,y.session.messageCount,` 条消息`]})]}),(0,M.jsx)(`span`,{children:y.session.archived?`已归档`:`活跃`})]}),y.truncated?(0,M.jsxs)(`div`,{className:`history-truncated`,children:[(0,M.jsx)(F,{size:15}),`仅显示最近 `,y.returnedMessageCount,` 条消息。`]}):null,(0,M.jsx)(`div`,{className:`message-stream`,children:y.messages.map(e=>(0,M.jsxs)(`article`,{className:`chat-message chat-message--${e.role}`,children:[(0,M.jsxs)(`div`,{className:`chat-message-label`,children:[e.role===`user`?`你`:`Codex`,(0,M.jsx)(`time`,{children:ke(e.timestamp)})]}),(0,M.jsx)(`div`,{className:`chat-message-body`,children:(0,M.jsx)(je,{text:e.text})})]},`${e.sequence}-${e.timestamp}`))})]}):(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(_e,{size:28}),(0,M.jsx)(`strong`,{children:`选择一个会话`}),(0,M.jsx)(`span`,{children:`聊天内容将在这里显示。`})]})})]})]})}function Je({title:e,children:t,confirmLabel:n,onConfirm:r,onCancel:i,tone:a=`primary`,confirmDisabled:o=!1}){return(0,M.jsx)(`div`,{className:`modal-backdrop`,role:`presentation`,onMouseDown:e=>e.target===e.currentTarget&&i(),children:(0,M.jsxs)(`section`,{className:`modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`modal-title`,children:[(0,M.jsxs)(`div`,{className:`modal-head`,children:[(0,M.jsx)(`h2`,{id:`modal-title`,children:e}),(0,M.jsx)(`button`,{type:`button`,className:`icon-button`,onClick:i,"aria-label":`关闭`,children:(0,M.jsx)(Se,{size:18})})]}),(0,M.jsx)(`div`,{className:`modal-body`,children:t}),(0,M.jsxs)(`div`,{className:`modal-actions`,children:[(0,M.jsx)(`button`,{className:`button button--secondary`,type:`button`,onClick:i,children:`取消`}),(0,M.jsx)(`button`,{className:`button button--${a}`,type:`button`,disabled:o,onClick:r,children:n})]})]})})}function Ye({plan:e,status:t,selectedProvider:n,onCancel:r,onConfirm:i}){return(0,M.jsxs)(Je,{title:e.mode===`switch`?`确认切换并同步`:`确认同步元数据`,confirmLabel:e.mode===`switch`?`确认切换并同步`:`确认执行同步`,onCancel:r,onConfirm:i,children:[(0,M.jsxs)(`div`,{className:`modal-callout`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`请确认 Codex 已完全关闭`}),(0,M.jsx)(`span`,{children:`关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。`})]})]}),(0,M.jsxs)(`dl`,{className:`operation-scope`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`Codex Home`}),(0,M.jsx)(`dd`,{children:t?.codexHome})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`SQLite Home`}),(0,M.jsxs)(`dd`,{children:[t?.sqliteHome,` `,(0,M.jsxs)(`small`,{children:[`(`,t?.sqliteHomeSource,`)`]})]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`当前 Provider`}),(0,M.jsx)(`dd`,{children:t?.currentProvider})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`目标 Provider`}),(0,M.jsx)(`dd`,{children:n})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`配置变更`}),(0,M.jsx)(`dd`,{children:e.mode===`switch`?`更新 config.toml 根级 model_provider`:`不修改 config.toml`})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`Model 策略`}),(0,M.jsx)(`dd`,{children:e.mode===`switch`?e.modelMode===`auto`?`跟随目标 Provider 配置`:e.modelMode===`keep`?`保留当前根级 model`:`设置为 ${e.model}`:`跟随当前根级 model`})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`备份策略`}),(0,M.jsxs)(`dd`,{children:[`修改前创建备份,保留最近 `,e.keepCount,` 份`]})]})]})]})}function Xe({backup:e,status:t,profile:n,onCancel:r,onConfirm:i}){let[a,o]=(0,g.useState)(!1),[s,c]=(0,g.useState)(!0),[l,u]=(0,g.useState)(!0),d=fe(t,e),f=pe({backup:e,profile:n,targetSqliteHome:d,restoreDatabase:s,restoreConfig:a,sqliteSupported:t?.sqliteAccess?.supported!==!1,pathComparisonCaseInsensitive:t?.pathComparisonCaseInsensitive===!0});return(0,M.jsxs)(Je,{title:`恢复备份`,confirmLabel:`覆盖当前元数据`,tone:`danger`,onCancel:r,confirmDisabled:!a&&!s&&!l||!f.canSubmit,onConfirm:()=>i({restoreConfig:a,restoreDatabase:s,restoreSessions:l,allowSqliteHomeRelocation:f.requiresRelocation}),children:[(0,M.jsxs)(`div`,{className:`restore-summary`,children:[(0,M.jsx)(_e,{size:20}),(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`strong`,{children:[ke(e.metadata.createdAt),` · `,e.metadata.targetProvider]}),(0,M.jsx)(`code`,{children:e.path})]})]}),(0,M.jsxs)(`fieldset`,{className:`restore-options`,children:[(0,M.jsx)(`legend`,{children:`选择要覆盖的内容`}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:a,onChange:e=>o(e.target.checked)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`config.toml 与 global state`}),(0,M.jsx)(`small`,{children:`恢复 Provider 配置和 Desktop workspace roots`})]})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:s,onChange:e=>c(e.target.checked)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`SQLite 线程数据库`}),(0,M.jsx)(`small`,{children:`恢复 state_5.sqlite 及备份中的 WAL/SHM`})]})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:l,onChange:e=>u(e.target.checked)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`Rollout 元数据`}),(0,M.jsx)(`small`,{children:`恢复 session_meta 和被修改的 turn_context.model`})]})]})]}),t?.sqliteAccess?.supported===!1?(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`当前 SQLite 路径仅供诊断`}),(0,M.jsx)(`span`,{children:t.sqliteAccess.message||`不能从 Web UI 执行恢复。`})]})]}):null,f.requiresRelocation?(0,M.jsxs)(`div`,{className:`modal-callout ${f.missingExplicitTarget||f.configRestoreConflict?`modal-callout--danger`:`modal-callout--warning`}`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`SQLite Home 与备份来源不同`}),(0,M.jsxs)(`span`,{children:[`来源:`,e.metadata.sqliteHome,(0,M.jsx)(`br`,{}),`目标:`,d,(0,M.jsx)(`br`,{}),f.missingExplicitTarget?`当前 Profile 未明确配置 SQLite Home,不能提交数据库迁移恢复。`:f.configRestoreConflict?`迁移数据库时不能同时恢复旧 config.toml。`:`确认后数据库将恢复到当前 Profile 明确配置的目标位置。`]})]})]}):null,(0,M.jsxs)(`div`,{className:`modal-callout`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`恢复前请关闭 Codex`}),(0,M.jsx)(`span`,{children:`该操作将覆盖所选的当前元数据;请确认 Codex CLI、App 和 app-server 已关闭。`})]})]})]})}function Ze({keepCount:e,backups:t,onCancel:n,onConfirm:r}){let i=Math.max(0,t.backups.length-e);return(0,M.jsxs)(Je,{title:`清理旧备份`,confirmLabel:`删除 ${i} 份旧备份`,tone:`danger`,onCancel:n,onConfirm:r,confirmDisabled:i===0,children:[(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--warning`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`被删除的备份无法直接恢复`}),(0,M.jsx)(`span`,{children:`只处理当前 Codex Home 下由本工具管理的备份目录。`})]})]}),(0,M.jsxs)(`dl`,{className:`operation-scope`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`当前备份`}),(0,M.jsxs)(`dd`,{children:[t.backups.length,` 份`]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`保留`}),(0,M.jsxs)(`dd`,{children:[`最近 `,e,` 份`]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`将删除`}),(0,M.jsxs)(`dd`,{children:[i,` 份`]})]})]})]})}function Qe({onCancel:e,onConfirm:t}){let[n,r]=(0,g.useState)(``),[i,a]=(0,g.useState)(``),[o,s]=(0,g.useState)(``),[c,l]=(0,g.useState)(``),u=/^[A-Za-z0-9_.-]{1,80}$/.test(n)&&i.trim()&&o.trim();return(0,M.jsx)(Je,{title:`新增存储配置`,confirmLabel:`保存配置`,onCancel:e,confirmDisabled:!u,onConfirm:()=>t({profileId:n,name:i,codexHome:o,sqliteHome:c}),children:(0,M.jsxs)(`div`,{className:`profile-form`,children:[(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`配置 ID`}),(0,M.jsx)(`input`,{value:n,onChange:e=>r(e.target.value),placeholder:`work`,spellCheck:`false`})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`显示名称`}),(0,M.jsx)(`input`,{value:i,onChange:e=>a(e.target.value),placeholder:`工作环境`})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`Codex Home`}),(0,M.jsx)(`input`,{value:o,onChange:e=>s(e.target.value),placeholder:`/home/user/.codex`,spellCheck:`false`})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`SQLite Home(可选)`}),(0,M.jsx)(`input`,{value:c,onChange:e=>l(e.target.value),placeholder:`留空时由服务端按配置解析`,spellCheck:`false`})]})]})})}function $e({toast:e,onClose:t}){return(0,g.useEffect)(()=>{if(!e)return;let n=window.setTimeout(t,6e3);return()=>window.clearTimeout(n)},[e,t]),e?(0,M.jsxs)(`div`,{className:`toast toast--${e.tone}`,children:[(0,M.jsxs)(`div`,{children:[e.tone===`success`?(0,M.jsx)(Ce,{size:18}):(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:e.title}),e.message?(0,M.jsx)(`small`,{children:e.message}):null]})]}),(0,M.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`关闭通知`,children:(0,M.jsx)(Se,{size:16})})]}):null}function et(){let[e,t]=(0,g.useState)(`overview`),[n,r]=(0,g.useState)(`checking`),[i,a]=(0,g.useState)(``),[o,s]=O(`cps.web.profileId`,`default`),[c,l]=(0,g.useState)([]),[u,d]=O(`cps.web.manualProviders`,[]),[f,p]=(0,g.useState)(null),[m,h]=(0,g.useState)(Ee),[_,v]=(0,g.useState)(``),[x,S]=(0,g.useState)(!0),[C,w]=(0,g.useState)(!1),[E,D]=(0,g.useState)(null),[ie,k]=(0,g.useState)(null),[oe,ce]=(0,g.useState)([]),[A,le]=(0,g.useState)(null),ue=(0,g.useRef)(0),de=(0,g.useMemo)(()=>{let e=Me(f),t=new Set(e.map(e=>e.id));return[...e.map(e=>({...e,manual:u.includes(e.id)})),...u.filter(e=>!t.has(e)).map(e=>({id:e,sources:[`manual`],configured:!1,current:!1,manual:!0}))]},[f,u]),fe=c.find(e=>e.id===o)??null,pe=(0,g.useRef)(null);pe.current||=he({fetchStatus:(e,t)=>T(`/api/status`,e,t),fetchBackups:(e,t)=>T(`/api/backups`,e,t)});let j=(0,g.useCallback)(async({quiet:e=!1}={})=>{await pe.current({profileId:o,showLoading:!e,onLoading:S,onResult:({status:e,backups:t})=>{p(e),h(t),v(t=>t&&Me(e).some(e=>e.id===t)?t:e.currentProvider)},onError:e=>{k({tone:`error`,title:`状态读取失败`,message:e.message})}})},[o]),N=(0,g.useCallback)(async()=>{let e=await ne();l(e.profiles),s(t=>e.profiles.some(e=>e.id===t)?t:`default`)},[s]),P=(0,g.useCallback)(async()=>{D(null);try{await N(),await j({quiet:!0})}catch{}k({tone:`warning`,title:`配置已变更,请重新确认`,message:`已刷新存储配置和当前状态;未自动重试原操作。`})},[j,N]),ge=(0,g.useCallback)(e=>{let t=ae(fe,e,f);if(!t){k({tone:`warning`,title:`配置需要刷新`,message:`没有可用的配置版本,请刷新后重新确认操作。`}),N().catch(()=>{});return}D(t)},[N,fe,f]);(0,g.useEffect)(()=>{let e=!1;return ee().then(async t=>{if(!t)throw new y;await N(),e||r(`ready`)}).catch(t=>{e||(r(t instanceof y?`required`:`error`),a(t.message))}),()=>{e=!0}},[N]),(0,g.useEffect)(()=>{n===`ready`&&j()},[n,o]),(0,g.useEffect)(()=>{let e=e=>{r(`required`),a(e.detail||`设备凭证已失效。请重新运行 codex-provider web。`)};return window.addEventListener(`cps:pairing-required`,e),()=>window.removeEventListener(`cps:pairing-required`,e)},[]),(0,g.useEffect)(()=>{if(n!==`ready`)return;let e=!1,t=async()=>{try{let t=await te(ue.current);if(e)return;t.activity?.length&&(ue.current=t.activity[t.activity.length-1].id,ce(e=>[...e,...t.activity].slice(-250))),le(t.activeOperation??null)}catch{}};t();let r=window.setInterval(t,900);return()=>{e=!0,window.clearInterval(r)}},[n]);let _e=(0,g.useCallback)(async()=>{let e=E.plan,n=E.profileId;D(null),w(!0),t(`activity`);try{let t={...me(n),profileRevision:E.profileRevision,storageRevision:E.storageRevision,provider:E.selectedProvider,keepCount:e.keepCount},r=e.mode===`switch`?await T(`/api/switch`,{...t,model:e.modelMode===`custom`?e.model:void 0,keepRootModel:e.modelMode===`keep`}):await T(`/api/sync`,t);k(se(r,{successTitle:e.mode===`switch`?`切换并同步完成`:`同步完成`,partialTitle:e.mode===`switch`?`切换并同步部分完成`:`同步部分完成`,message:`备份:${r.result?.backupDir??`已创建`}`})),await j({quiet:!0})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`操作失败`,message:e.message})}finally{w(!1)}},[P,E,j]),ve=(0,g.useCallback)(async e=>{let n=E.backup,r=E.profileId;D(null),w(!0),t(`activity`);try{let t=await T(`/api/restore`,{...me(r),profileRevision:E.profileRevision,storageRevision:E.storageRevision,backupId:n.id,...e});k(se(t,{successTitle:`备份恢复完成`,partialTitle:`备份恢复部分完成`,message:n.id})),await j({quiet:!0})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`恢复失败`,message:e.message})}finally{w(!1)}},[P,E,j]),ye=(0,g.useCallback)(async()=>{let e=E.keepCount,t=E.profileId;D(null),w(!0);try{let n=await T(`/api/prune`,{...me(t),profileRevision:E.profileRevision,storageRevision:E.storageRevision,keepCount:e});k(se(n,{successTitle:`旧备份清理完成`,partialTitle:`旧备份清理部分完成`,message:`删除 ${n.result?.deletedCount??0} 份,释放 ${Oe(n.result?.freedBytes)}`})),await j({quiet:!0})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`备份清理失败`,message:e.message})}finally{w(!1)}},[P,E,j]),xe=(0,g.useCallback)(()=>k(null),[]),Se=(0,g.useCallback)(async e=>{try{let t=await T(`/api/profiles/save`,e.revision?{...e,profileRevision:e.revision}:e);D(null),await N(),s(t.profile.id),k({tone:`success`,title:`存储配置已保存`,message:t.profile.name})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`配置保存失败`,message:e.message})}},[P,N,s]),Ce=(0,g.useCallback)(async()=>{try{await T(`/api/profiles/delete`,{profileId:o,profileRevision:fe?.revision}),s(`default`),await N()}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`配置删除失败`,message:e.message})}},[P,o,N,fe?.revision,s]),F=(0,g.useCallback)(async()=>{await re().catch(()=>{}),r(`required`),a(`此浏览器的设备凭证已失效。重新运行 codex-provider web 即可自动配对。`)},[]),we=(0,g.useCallback)(e=>{d(t=>[...new Set([...t,e])].sort()),v(e)},[d]),Te=(0,g.useCallback)(e=>{d(t=>t.filter(t=>t!==e)),v(f?.currentProvider??``)},[d,f?.currentProvider]);return n===`ready`?(0,M.jsxs)(`div`,{className:`app-shell`,children:[(0,M.jsx)(Pe,{status:f,busy:C||!!A,onRefresh:()=>j()}),(0,M.jsx)(Fe,{view:e,setView:t,status:f,onForgetBrowser:F}),(0,M.jsxs)(`main`,{className:`main-area`,children:[(0,M.jsx)(Ie,{profiles:c,profileId:o,setProfileId:s,status:f,onAddProfile:()=>D({type:`profile`}),onDeleteProfile:Ce,onRefresh:()=>j(),loading:x,profileSwitchDisabled:C||!!E}),e===`overview`?(0,M.jsx)(We,{status:f,backups:m,providers:de,selectedProvider:_,setSelectedProvider:v,onAddManualProvider:we,onRemoveManualProvider:Te,onExecute:e=>ge({type:`execute`,plan:e,selectedProvider:_}),onRestore:e=>ge({type:`restore`,backup:e}),setView:t,busy:C,loading:x}):null,e===`history`?(0,M.jsx)(qe,{profileId:o,status:f}):null,e===`backups`?(0,M.jsx)(Ge,{backups:m,status:f,busy:C,onRestore:e=>ge({type:`restore`,backup:e}),onPrune:e=>ge({type:`prune`,keepCount:e})}):null,e===`activity`?(0,M.jsx)(Ke,{activity:oe,activeOperation:A}):null]}),E?.type===`execute`?(0,M.jsx)(Ye,{plan:E.plan,status:E.status,selectedProvider:E.selectedProvider,onCancel:()=>D(null),onConfirm:_e}):null,E?.type===`restore`?(0,M.jsx)(Xe,{backup:E.backup,status:E.status,profile:E.profile,onCancel:()=>D(null),onConfirm:ve}):null,E?.type===`prune`?(0,M.jsx)(Ze,{keepCount:E.keepCount,backups:m,onCancel:()=>D(null),onConfirm:ye}):null,E?.type===`profile`?(0,M.jsx)(Qe,{onCancel:()=>D(null),onConfirm:Se}):null,(0,M.jsx)($e,{toast:ie,onClose:xe})]}):(0,M.jsxs)(`div`,{className:`access-gate`,children:[(0,M.jsx)(be,{size:32}),(0,M.jsx)(`h1`,{children:n===`checking`?`正在完成安全配对`:`需要重新配对`}),(0,M.jsx)(`p`,{children:n===`checking`?`请稍候…`:i||`请重新运行 codex-provider web。`}),n===`checking`?null:(0,M.jsx)(`code`,{children:`codex-provider web`})]})}(0,_.createRoot)(document.getElementById(`root`)).render((0,M.jsx)(g.StrictMode,{children:(0,M.jsx)(et,{})})); -//# sourceMappingURL=index-BhSMcRqW.js.map \ No newline at end of file +`+e.stack}return{value:e,source:t,stack:i,digest:null}}function ks(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function As(e,t){try{console.error(t.value)}catch(e){setTimeout(function(){throw e})}}var js=typeof WeakMap==`function`?WeakMap:Map;function Ms(e,t,n){n=so(-1,n),n.tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){rl||(rl=!0,il=r),As(e,t)},n}function Ns(e,t,n){n=so(-1,n),n.tag=3;var r=e.type.getDerivedStateFromError;if(typeof r==`function`){var i=t.value;n.payload=function(){return r(i)},n.callback=function(){As(e,t)}}var a=e.stateNode;return a!==null&&typeof a.componentDidCatch==`function`&&(n.callback=function(){As(e,t),typeof r!=`function`&&(al===null?al=new Set([this]):al.add(this));var n=t.stack;this.componentDidCatch(t.value,{componentStack:n===null?``:n})}),n}function Ps(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new js;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(i.add(n),e=zl.bind(null,e,t,n),t.then(e,e))}function Fs(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t===null||t.dehydrated!==null),t)return e;e=e.return}while(e!==null);return null}function Is(e,t,n,r,i){return e.mode&1?(e.flags|=65536,e.lanes=i,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,n.tag===1&&(n.alternate===null?n.tag=17:(t=so(-1,1),t.tag=2,co(n,t,1))),n.lanes|=1),e)}var Ls=S.ReactCurrentOwner,Rs=!1;function zs(e,t,n,r){t.child=e===null?Wa(t,null,n,r):Ua(t,e.child,n,r)}function Bs(e,t,n,r,i){n=n.render;var a=t.ref;return Qa(t,i),r=Fo(e,t,n,r,a,i),n=Io(),e!==null&&!Rs?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~i,oc(e,t,i)):(V&&n&&wa(t),t.flags|=1,zs(e,t,r,i),t.child)}function Vs(e,t,n,r,i){if(e===null){var a=n.type;return typeof a==`function`&&!ql(a)&&a.defaultProps===void 0&&n.compare===null&&n.defaultProps===void 0?(t.tag=15,t.type=a,Hs(e,t,a,r,i)):(e=Xl(n.type,null,r,t,t.mode,i),e.ref=t.ref,e.return=t,t.child=e)}if(a=e.child,(e.lanes&i)===0){var o=a.memoizedProps;if(n=n.compare,n=n===null?Pr:n,n(o,r)&&e.ref===t.ref)return oc(e,t,i)}return t.flags|=1,e=Yl(a,r),e.ref=t.ref,e.return=t,t.child=e}function Hs(e,t,n,r,i){if(e!==null){var a=e.memoizedProps;if(Pr(a,r)&&e.ref===t.ref){if(Rs=!1,t.pendingProps=r=a,(e.lanes&i)!==0)e.flags&131072&&(Rs=!0);else return t.lanes=e.lanes,oc(e,t,i)}}return Gs(e,t,n,r,i)}function Us(e,t,n){var r=t.pendingProps,i=r.children,a=e===null?null:e.memoizedState;if(r.mode===`hidden`){if(!(t.mode&1))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},B(qc,Kc),Kc|=n;else{if(!(n&1073741824))return e=a===null?n:a.baseLanes|n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,B(qc,Kc),Kc|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=a===null?n:a.baseLanes,B(qc,Kc),Kc|=r}}else a===null?r=n:(r=a.baseLanes|n,t.memoizedState=null),B(qc,Kc),Kc|=r;return zs(e,t,i,n),t.child}function Ws(e,t){var n=t.ref;(e===null&&n!==null||e!==null&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Gs(e,t,n,r,i){var a=ta(n)?$i:Zi.current;return a=ea(t,a),Qa(t,i),n=Fo(e,t,n,r,a,i),r=Io(),e!==null&&!Rs?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~i,oc(e,t,i)):(V&&r&&wa(t),t.flags|=1,zs(e,t,n,i),t.child)}function Ks(e,t,n,r,i){if(ta(n)){var a=!0;aa(t)}else a=!1;if(Qa(t,i),t.stateNode===null)ac(e,t),Ts(t,n,r),Ds(t,n,r,i),r=!0;else if(e===null){var o=t.stateNode,s=t.memoizedProps;o.props=s;var c=o.context,l=n.contextType;typeof l==`object`&&l?l=$a(l):(l=ta(n)?$i:Zi.current,l=ea(t,l));var u=n.getDerivedStateFromProps,d=typeof u==`function`||typeof o.getSnapshotBeforeUpdate==`function`;d||typeof o.UNSAFE_componentWillReceiveProps!=`function`&&typeof o.componentWillReceiveProps!=`function`||(s!==r||c!==l)&&Es(t,o,r,l),io=!1;var f=t.memoizedState;o.state=f,fo(t,r,o,i),c=t.memoizedState,s!==r||f!==c||Qi.current||io?(typeof u==`function`&&(Ss(t,n,u,r),c=t.memoizedState),(s=io||ws(t,n,s,r,f,c,l))?(d||typeof o.UNSAFE_componentWillMount!=`function`&&typeof o.componentWillMount!=`function`||(typeof o.componentWillMount==`function`&&o.componentWillMount(),typeof o.UNSAFE_componentWillMount==`function`&&o.UNSAFE_componentWillMount()),typeof o.componentDidMount==`function`&&(t.flags|=4194308)):(typeof o.componentDidMount==`function`&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=c),o.props=r,o.state=c,o.context=l,r=s):(typeof o.componentDidMount==`function`&&(t.flags|=4194308),r=!1)}else{o=t.stateNode,oo(e,t),s=t.memoizedProps,l=t.type===t.elementType?s:xs(t.type,s),o.props=l,d=t.pendingProps,f=o.context,c=n.contextType,typeof c==`object`&&c?c=$a(c):(c=ta(n)?$i:Zi.current,c=ea(t,c));var p=n.getDerivedStateFromProps;(u=typeof p==`function`||typeof o.getSnapshotBeforeUpdate==`function`)||typeof o.UNSAFE_componentWillReceiveProps!=`function`&&typeof o.componentWillReceiveProps!=`function`||(s!==d||f!==c)&&Es(t,o,r,c),io=!1,f=t.memoizedState,o.state=f,fo(t,r,o,i);var m=t.memoizedState;s!==d||f!==m||Qi.current||io?(typeof p==`function`&&(Ss(t,n,p,r),m=t.memoizedState),(l=io||ws(t,n,l,r,f,m,c)||!1)?(u||typeof o.UNSAFE_componentWillUpdate!=`function`&&typeof o.componentWillUpdate!=`function`||(typeof o.componentWillUpdate==`function`&&o.componentWillUpdate(r,m,c),typeof o.UNSAFE_componentWillUpdate==`function`&&o.UNSAFE_componentWillUpdate(r,m,c)),typeof o.componentDidUpdate==`function`&&(t.flags|=4),typeof o.getSnapshotBeforeUpdate==`function`&&(t.flags|=1024)):(typeof o.componentDidUpdate!=`function`||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!=`function`||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=m),o.props=r,o.state=m,o.context=c,r=l):(typeof o.componentDidUpdate!=`function`||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),typeof o.getSnapshotBeforeUpdate!=`function`||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return qs(e,t,n,r,a,i)}function qs(e,t,n,r,i,a){Ws(e,t);var o=!!(t.flags&128);if(!r&&!o)return i&&oa(t,n,!1),oc(e,t,a);r=t.stateNode,Ls.current=t;var s=o&&typeof n.getDerivedStateFromError!=`function`?null:r.render();return t.flags|=1,e!==null&&o?(t.child=Ua(t,e.child,null,a),t.child=Ua(t,null,s,a)):zs(e,t,s,a),t.memoizedState=r.state,i&&oa(t,n,!0),t.child}function Js(e){var t=e.stateNode;t.pendingContext?ra(e,t.pendingContext,t.pendingContext!==t.context):t.context&&ra(e,t.context,!1),yo(e,t.containerInfo)}function Ys(e,t,n,r,i){return Ia(),La(i),t.flags|=256,zs(e,t,n,r),t.child}var Xs={dehydrated:null,treeContext:null,retryLane:0};function Zs(e){return{baseLanes:e,cachePool:null,transitions:null}}function Qs(e,t,n){var r=t.pendingProps,i=H.current,a=!1,o=!!(t.flags&128),s;if((s=o)||(s=e!==null&&e.memoizedState===null?!1:!!(i&2)),s?(a=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(i|=1),B(H,i&1),e===null)return Ma(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?(t.lanes=t.mode&1?e.data===`$!`?8:1073741824:1,null):(o=r.children,e=r.fallback,a?(r=t.mode,a=t.child,o={mode:`hidden`,children:o},!(r&1)&&a!==null?(a.childLanes=0,a.pendingProps=o):a=Ql(o,r,0,null),e=Zl(e,r,n,null),a.return=t,e.return=t,a.sibling=e,t.child=a,t.child.memoizedState=Zs(n),t.memoizedState=Xs,e):$s(t,o));if(i=e.memoizedState,i!==null&&(s=i.dehydrated,s!==null))return tc(e,t,o,r,s,i,n);if(a){a=r.fallback,o=t.mode,i=e.child,s=i.sibling;var c={mode:`hidden`,children:r.children};return!(o&1)&&t.child!==i?(r=t.child,r.childLanes=0,r.pendingProps=c,t.deletions=null):(r=Yl(i,c),r.subtreeFlags=i.subtreeFlags&14680064),s===null?(a=Zl(a,o,n,null),a.flags|=2):a=Yl(s,a),a.return=t,r.return=t,r.sibling=a,t.child=r,r=a,a=t.child,o=e.child.memoizedState,o=o===null?Zs(n):{baseLanes:o.baseLanes|n,cachePool:null,transitions:o.transitions},a.memoizedState=o,a.childLanes=e.childLanes&~n,t.memoizedState=Xs,r}return a=e.child,e=a.sibling,r=Yl(a,{mode:`visible`,children:r.children}),!(t.mode&1)&&(r.lanes=n),r.return=t,r.sibling=null,e!==null&&(n=t.deletions,n===null?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=r,t.memoizedState=null,r}function $s(e,t){return t=Ql({mode:`visible`,children:t},e.mode,0,null),t.return=e,e.child=t}function ec(e,t,n,r){return r!==null&&La(r),Ua(t,e.child,null,n),e=$s(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function tc(e,t,n,i,a,o,s){if(n)return t.flags&256?(t.flags&=-257,i=ks(Error(r(422))),ec(e,t,s,i)):t.memoizedState===null?(o=i.fallback,a=t.mode,i=Ql({mode:`visible`,children:i.children},a,0,null),o=Zl(o,a,s,null),o.flags|=2,i.return=t,o.return=t,i.sibling=o,t.child=i,t.mode&1&&Ua(t,e.child,null,s),t.child.memoizedState=Zs(s),t.memoizedState=Xs,o):(t.child=e.child,t.flags|=128,null);if(!(t.mode&1))return ec(e,t,s,null);if(a.data===`$!`){if(i=a.nextSibling&&a.nextSibling.dataset,i)var c=i.dgst;return i=c,o=Error(r(419)),i=ks(o,i,void 0),ec(e,t,s,i)}if(c=(s&e.childLanes)!==0,Rs||c){if(i=Y,i!==null){switch(s&-s){case 4:a=2;break;case 16:a=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:a=32;break;case 536870912:a=268435456;break;default:a=0}a=(a&(i.suspendedLanes|s))===0?a:0,a!==0&&a!==o.retryLane&&(o.retryLane=a,ro(e,a),hl(i,e,a,-1))}return kl(),i=ks(Error(r(421))),ec(e,t,s,i)}return a.data===`$?`?(t.flags|=128,t.child=e.child,t=Vl.bind(null,e),a._reactRetry=t,null):(e=o.treeContext,Da=Pi(a.nextSibling),Ea=t,V=!0,Oa=null,e!==null&&(_a[va++]=ba,_a[va++]=xa,_a[va++]=ya,ba=e.id,xa=e.overflow,ya=t),t=$s(t,i.children),t.flags|=4096,t)}function nc(e,t,n){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),Za(e.return,t,n)}function rc(e,t,n,r,i){var a=e.memoizedState;a===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:i}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=i)}function ic(e,t,n){var r=t.pendingProps,i=r.revealOrder,a=r.tail;if(zs(e,t,r.children,n),r=H.current,r&2)r=r&1|2,t.flags|=128;else{if(e!==null&&e.flags&128)a:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&nc(e,n,t);else if(e.tag===19)nc(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break a;for(;e.sibling===null;){if(e.return===null||e.return===t)break a;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(B(H,r),!(t.mode&1))t.memoizedState=null;else switch(i){case`forwards`:for(n=t.child,i=null;n!==null;)e=n.alternate,e!==null&&Co(e)===null&&(i=n),n=n.sibling;n=i,n===null?(i=t.child,t.child=null):(i=n.sibling,n.sibling=null),rc(t,!1,i,n,a);break;case`backwards`:for(n=null,i=t.child,t.child=null;i!==null;){if(e=i.alternate,e!==null&&Co(e)===null){t.child=i;break}e=i.sibling,i.sibling=n,n=i,i=e}rc(t,!0,n,null,a);break;case`together`:rc(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function ac(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function oc(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),Yc|=t.lanes,(n&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(r(153));if(t.child!==null){for(e=t.child,n=Yl(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=Yl(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function sc(e,t,n){switch(t.tag){case 3:Js(t),Ia();break;case 5:xo(t);break;case 1:ta(t.type)&&aa(t);break;case 4:yo(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,i=t.memoizedProps.value;B(Ga,r._currentValue),r._currentValue=i;break;case 13:if(r=t.memoizedState,r!==null)return r.dehydrated===null?(n&t.child.childLanes)===0?(B(H,H.current&1),e=oc(e,t,n),e===null?null:e.sibling):Qs(e,t,n):(B(H,H.current&1),t.flags|=128,null);B(H,H.current&1);break;case 19:if(r=(n&t.childLanes)!==0,e.flags&128){if(r)return ic(e,t,n);t.flags|=128}if(i=t.memoizedState,i!==null&&(i.rendering=null,i.tail=null,i.lastEffect=null),B(H,H.current),r)break;return null;case 22:case 23:return t.lanes=0,Us(e,t,n)}return oc(e,t,n)}var cc=function(e,t){for(var n=t.child;n!==null;){if(n.tag===5||n.tag===6)e.appendChild(n.stateNode);else if(n.tag!==4&&n.child!==null){n.child.return=n,n=n.child;continue}if(n===t)break;for(;n.sibling===null;){if(n.return===null||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},lc=function(e,t,n,r){var i=e.memoizedProps;if(i!==r){e=t.stateNode,vo(ho.current);var o=null;switch(n){case`input`:i=ve(e,i),r=ve(e,r),o=[];break;case`select`:i=A({},i,{value:void 0}),r=A({},r,{value:void 0}),o=[];break;case`textarea`:i=Te(e,i),r=Te(e,r),o=[];break;default:typeof i.onClick!=`function`&&typeof r.onClick==`function`&&(e.onclick=wi)}ze(n,r);var s;for(u in n=null,i)if(!r.hasOwnProperty(u)&&i.hasOwnProperty(u)&&i[u]!=null){if(u===`style`){var c=i[u];for(s in c)c.hasOwnProperty(s)&&(n||={},n[s]=``)}else u!==`dangerouslySetInnerHTML`&&u!==`children`&&u!==`suppressContentEditableWarning`&&u!==`suppressHydrationWarning`&&u!==`autoFocus`&&(a.hasOwnProperty(u)?o||=[]:(o||=[]).push(u,null))}for(u in r){var l=r[u];if(c=i?.[u],r.hasOwnProperty(u)&&l!==c&&(l!=null||c!=null)){if(u===`style`){if(c){for(s in c)!c.hasOwnProperty(s)||l&&l.hasOwnProperty(s)||(n||={},n[s]=``);for(s in l)l.hasOwnProperty(s)&&c[s]!==l[s]&&(n||={},n[s]=l[s])}else n||(o||=[],o.push(u,n)),n=l}else u===`dangerouslySetInnerHTML`?(l=l?l.__html:void 0,c=c?c.__html:void 0,l!=null&&c!==l&&(o||=[]).push(u,l)):u===`children`?typeof l!=`string`&&typeof l!=`number`||(o||=[]).push(u,``+l):u!==`suppressContentEditableWarning`&&u!==`suppressHydrationWarning`&&(a.hasOwnProperty(u)?(l!=null&&u===`onScroll`&&R(`scroll`,e),o||c===l||(o=[])):(o||=[]).push(u,l))}}n&&(o||=[]).push(`style`,n);var u=o;(t.updateQueue=u)&&(t.flags|=4)}},uc=function(e,t,n,r){n!==r&&(t.flags|=4)};function dc(e,t){if(!V)switch(e.tailMode){case`hidden`:t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case`collapsed`:n=e.tail;for(var r=null;n!==null;)n.alternate!==null&&(r=n),n=n.sibling;r===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function fc(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,r=0;if(t)for(var i=e.child;i!==null;)n|=i.lanes|i.childLanes,r|=i.subtreeFlags&14680064,r|=i.flags&14680064,i.return=e,i=i.sibling;else for(i=e.child;i!==null;)n|=i.lanes|i.childLanes,r|=i.subtreeFlags,r|=i.flags,i.return=e,i=i.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function pc(e,t,n){var i=t.pendingProps;switch(Ta(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return fc(t),null;case 1:return ta(t.type)&&na(),fc(t),null;case 3:return i=t.stateNode,bo(),z(Qi),z(Zi),To(),i.pendingContext&&(i.context=i.pendingContext,i.pendingContext=null),(e===null||e.child===null)&&(Pa(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,Oa!==null&&(yl(Oa),Oa=null))),fc(t),null;case 5:So(t);var o=vo(_o.current);if(n=t.type,e!==null&&t.stateNode!=null)lc(e,t,n,i,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!i){if(t.stateNode===null)throw Error(r(166));return fc(t),null}if(e=vo(ho.current),Pa(t)){i=t.stateNode,n=t.type;var s=t.memoizedProps;switch(i[Li]=t,i[Ri]=s,e=!!(t.mode&1),n){case`dialog`:R(`cancel`,i),R(`close`,i);break;case`iframe`:case`object`:case`embed`:R(`load`,i);break;case`video`:case`audio`:for(o=0;o<\/script>`,e=e.removeChild(e.firstChild)):typeof i.is==`string`?e=c.createElement(n,{is:i.is}):(e=c.createElement(n),n===`select`&&(c=e,i.multiple?c.multiple=!0:i.size&&(c.size=i.size))):e=c.createElementNS(e,n),e[Li]=t,e[Ri]=i,cc(e,t,!1,!1),t.stateNode=e;a:{switch(c=Be(n,i),n){case`dialog`:R(`cancel`,e),R(`close`,e),o=i;break;case`iframe`:case`object`:case`embed`:R(`load`,e),o=i;break;case`video`:case`audio`:for(o=0;otl&&(t.flags|=128,i=!0,dc(s,!1),t.lanes=4194304)}}else{if(!i){if(e=Co(c),e!==null){if(t.flags|=128,i=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),dc(s,!0),s.tail===null&&s.tailMode===`hidden`&&!c.alternate&&!V)return fc(t),null}else 2*I()-s.renderingStartTime>tl&&n!==1073741824&&(t.flags|=128,i=!0,dc(s,!1),t.lanes=4194304)}s.isBackwards?(c.sibling=t.child,t.child=c):(n=s.last,n===null?t.child=c:n.sibling=c,s.last=c)}return s.tail===null?(fc(t),null):(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=I(),t.sibling=null,n=H.current,B(H,i?n&1|2:n&1),t);case 22:case 23:return Tl(),i=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==i&&(t.flags|=8192),i&&t.mode&1?Kc&1073741824&&(fc(t),t.subtreeFlags&6&&(t.flags|=8192)):fc(t),null;case 24:return null;case 25:return null}throw Error(r(156,t.tag))}function mc(e,t){switch(Ta(t),t.tag){case 1:return ta(t.type)&&na(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return bo(),z(Qi),z(Zi),To(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return So(t),null;case 13:if(z(H),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));Ia()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return z(H),null;case 4:return bo(),null;case 10:return Xa(t.type._context),null;case 22:case 23:return Tl(),null;case 24:return null;default:return null}}var hc=!1,gc=!1,_c=typeof WeakSet==`function`?WeakSet:Set,K=null;function vc(e,t){var n=e.ref;if(n!==null){if(typeof n==`function`)try{n(null)}catch(n){$(e,t,n)}else n.current=null}}function yc(e,t,n){try{n()}catch(n){$(e,t,n)}}var bc=!1;function xc(e,t){if(Ti=_n,e=Rr(),zr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var i=n.getSelection&&n.getSelection();if(i&&i.rangeCount!==0){n=i.anchorNode;var a=i.anchorOffset,o=i.focusNode;i=i.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||i!==0&&f.nodeType!==3||(l=s+i),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===i&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(Ei={focusedElem:e,selectionRange:n},_n=!1,K=t;K!==null;)if(t=K,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,K=e;else for(;K!==null;){t=K;try{var h=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(h!==null){var g=h.memoizedProps,_=h.memoizedState,v=t.stateNode;v.__reactInternalSnapshotBeforeUpdate=v.getSnapshotBeforeUpdate(t.elementType===t.type?g:xs(t.type,g),_)}break;case 3:var y=t.stateNode.containerInfo;y.nodeType===1?y.textContent=``:y.nodeType===9&&y.documentElement&&y.removeChild(y.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(e){$(t,t.return,e)}if(e=t.sibling,e!==null){e.return=t.return,K=e;break}K=t.return}return h=bc,bc=!1,h}function Sc(e,t,n){var r=t.updateQueue;if(r=r===null?null:r.lastEffect,r!==null){var i=r=r.next;do{if((i.tag&e)===e){var a=i.destroy;i.destroy=void 0,a!==void 0&&yc(t,n,a)}i=i.next}while(i!==r)}}function Cc(e,t){if(t=t.updateQueue,t=t===null?null:t.lastEffect,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function wc(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t==`function`?t(e):t.current=e}}function Tc(e){var t=e.alternate;t!==null&&(e.alternate=null,Tc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Li],delete t[Ri],delete t[Bi],delete t[Vi],delete t[Hi])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ec(e){return e.tag===5||e.tag===3||e.tag===4}function Dc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Ec(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Oc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=wi));else if(r!==4&&(e=e.child,e!==null))for(Oc(e,t,n),e=e.sibling;e!==null;)Oc(e,t,n),e=e.sibling}function kc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(kc(e,t,n),e=e.sibling;e!==null;)kc(e,t,n),e=e.sibling}var q=null,Ac=!1;function jc(e,t,n){for(n=n.child;n!==null;)Mc(e,t,n),n=n.sibling}function Mc(e,t,n){if(Dt&&typeof Dt.onCommitFiberUnmount==`function`)try{Dt.onCommitFiberUnmount(Et,n)}catch{}switch(n.tag){case 5:gc||vc(n,t);case 6:var r=q,i=Ac;q=null,jc(e,t,n),q=r,Ac=i,q!==null&&(Ac?(e=q,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):q.removeChild(n.stateNode));break;case 18:q!==null&&(Ac?(e=q,n=n.stateNode,e.nodeType===8?Ni(e.parentNode,n):e.nodeType===1&&Ni(e,n),hn(e)):Ni(q,n.stateNode));break;case 4:r=q,i=Ac,q=n.stateNode.containerInfo,Ac=!0,jc(e,t,n),q=r,Ac=i;break;case 0:case 11:case 14:case 15:if(!gc&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){i=r=r.next;do{var a=i,o=a.destroy;a=a.tag,o!==void 0&&(a&2||a&4)&&yc(n,t,o),i=i.next}while(i!==r)}jc(e,t,n);break;case 1:if(!gc&&(vc(n,t),r=n.stateNode,typeof r.componentWillUnmount==`function`))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(e){$(n,t,e)}jc(e,t,n);break;case 21:jc(e,t,n);break;case 22:n.mode&1?(gc=(r=gc)||n.memoizedState!==null,jc(e,t,n),gc=r):jc(e,t,n);break;default:jc(e,t,n)}}function Nc(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new _c),t.forEach(function(t){var r=Hl.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))})}}function Pc(e,t){var n=t.deletions;if(n!==null)for(var i=0;ia&&(a=s),i&=~o}if(i=a,i=I()-i,i=(120>i?120:480>i?480:1080>i?1080:1920>i?1920:3e3>i?3e3:4320>i?4320:1960*Hc(i/1960))-i,10e?16:e,sl===null)var i=!1;else{if(e=sl,sl=null,cl=0,J&6)throw Error(r(331));var a=J;for(J|=4,K=e.current;K!==null;){var o=K,s=o.child;if(K.flags&16){var c=o.deletions;if(c!==null){for(var l=0;lI()-el?El(e,0):Zc|=n),gl(e,t)}function Bl(e,t){t===0&&(e.mode&1?(t=Pt,Pt<<=1,!(Pt&130023424)&&(Pt=4194304)):t=1);var n=pl();e=ro(e,t),e!==null&&(Ht(e,t,n),gl(e,n))}function Vl(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Bl(e,n)}function Hl(e,t){var n=0;switch(e.tag){case 13:var i=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:i=e.stateNode;break;default:throw Error(r(314))}i!==null&&i.delete(t),Bl(e,n)}var Ul=function(e,t,n){if(e!==null){if(e.memoizedProps!==t.pendingProps||Qi.current)Rs=!0;else{if((e.lanes&n)===0&&!(t.flags&128))return Rs=!1,sc(e,t,n);Rs=!!(e.flags&131072)}}else Rs=!1,V&&t.flags&1048576&&Ca(t,ga,t.index);switch(t.lanes=0,t.tag){case 2:var i=t.type;ac(e,t),e=t.pendingProps;var a=ea(t,Zi.current);Qa(t,n),a=Fo(null,t,i,e,a,n);var o=Io();return t.flags|=1,typeof a==`object`&&a&&typeof a.render==`function`&&a.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,ta(i)?(o=!0,aa(t)):o=!1,t.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,ao(t),a.updater=Cs,t.stateNode=a,a._reactInternals=t,Ds(t,i,e,n),t=qs(null,t,i,!0,o,n)):(t.tag=0,V&&o&&wa(t),zs(null,t,a,n),t=t.child),t;case 16:i=t.elementType;a:{switch(ac(e,t),e=t.pendingProps,a=i._init,i=a(i._payload),t.type=i,a=t.tag=Jl(i),e=xs(i,e),a){case 0:t=Gs(null,t,i,e,n);break a;case 1:t=Ks(null,t,i,e,n);break a;case 11:t=Bs(null,t,i,e,n);break a;case 14:t=Vs(null,t,i,xs(i.type,e),n);break a}throw Error(r(306,i,``))}return t;case 0:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),Gs(e,t,i,a,n);case 1:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),Ks(e,t,i,a,n);case 3:a:{if(Js(t),e===null)throw Error(r(387));i=t.pendingProps,o=t.memoizedState,a=o.element,oo(e,t),fo(t,i,null,n);var s=t.memoizedState;if(i=s.element,o.isDehydrated){if(o={element:i,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){a=Os(Error(r(423)),t),t=Ys(e,t,i,n,a);break a}if(i!==a){a=Os(Error(r(424)),t),t=Ys(e,t,i,n,a);break a}for(Da=Pi(t.stateNode.containerInfo.firstChild),Ea=t,V=!0,Oa=null,n=Wa(t,null,i,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling}else{if(Ia(),i===a){t=oc(e,t,n);break a}zs(e,t,i,n)}t=t.child}return t;case 5:return xo(t),e===null&&Ma(t),i=t.type,a=t.pendingProps,o=e===null?null:e.memoizedProps,s=a.children,Di(i,a)?s=null:o!==null&&Di(i,o)&&(t.flags|=32),Ws(e,t),zs(e,t,s,n),t.child;case 6:return e===null&&Ma(t),null;case 13:return Qs(e,t,n);case 4:return yo(t,t.stateNode.containerInfo),i=t.pendingProps,e===null?t.child=Ua(t,null,i,n):zs(e,t,i,n),t.child;case 11:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),Bs(e,t,i,a,n);case 7:return zs(e,t,t.pendingProps,n),t.child;case 8:return zs(e,t,t.pendingProps.children,n),t.child;case 12:return zs(e,t,t.pendingProps.children,n),t.child;case 10:a:{if(i=t.type._context,a=t.pendingProps,o=t.memoizedProps,s=a.value,B(Ga,i._currentValue),i._currentValue=s,o!==null){if(Nr(o.value,s)){if(o.children===a.children&&!Qi.current){t=oc(e,t,n);break a}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var c=o.dependencies;if(c!==null){s=o.child;for(var l=c.firstContext;l!==null;){if(l.context===i){if(o.tag===1){l=so(-1,n&-n),l.tag=2;var u=o.updateQueue;if(u!==null){u=u.shared;var d=u.pending;d===null?l.next=l:(l.next=d.next,d.next=l),u.pending=l}}o.lanes|=n,l=o.alternate,l!==null&&(l.lanes|=n),Za(o.return,n,t),c.lanes|=n;break}l=l.next}}else if(o.tag===10)s=o.type===t.type?null:o.child;else if(o.tag===18){if(s=o.return,s===null)throw Error(r(341));s.lanes|=n,c=s.alternate,c!==null&&(c.lanes|=n),Za(s,n,t),s=o.sibling}else s=o.child;if(s!==null)s.return=o;else for(s=o;s!==null;){if(s===t){s=null;break}if(o=s.sibling,o!==null){o.return=s.return,s=o;break}s=s.return}o=s}}zs(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,i=t.pendingProps.children,Qa(t,n),a=$a(a),i=i(a),t.flags|=1,zs(e,t,i,n),t.child;case 14:return i=t.type,a=xs(i,t.pendingProps),a=xs(i.type,a),Vs(e,t,i,a,n);case 15:return Hs(e,t,t.type,t.pendingProps,n);case 17:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),ac(e,t),t.tag=1,ta(i)?(e=!0,aa(t)):e=!1,Qa(t,n),Ts(t,i,a),Ds(t,i,a,n),qs(null,t,i,!0,e,n);case 19:return ic(e,t,n);case 22:return Us(e,t,n)}throw Error(r(156,t.tag))};function Wl(e,t){return gt(e,t)}function Gl(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Kl(e,t,n,r){return new Gl(e,t,n,r)}function ql(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Jl(e){if(typeof e==`function`)return+!!ql(e);if(e!=null){if(e=e.$$typeof,e===D)return 11;if(e===k)return 14}return 2}function Yl(e,t){var n=e.alternate;return n===null?(n=Kl(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Xl(e,t,n,i,a,o){var s=2;if(i=e,typeof e==`function`)ql(e)&&(s=1);else if(typeof e==`string`)s=5;else a:switch(e){case T:return Zl(n.children,a,o,t);case te:s=8,a|=8;break;case ne:return e=Kl(12,n,t,a|2),e.elementType=ne,e.lanes=o,e;case O:return e=Kl(13,n,t,a),e.elementType=O,e.lanes=o,e;case ie:return e=Kl(19,n,t,a),e.elementType=ie,e.lanes=o,e;case oe:return Ql(n,a,o,t);default:if(typeof e==`object`&&e)switch(e.$$typeof){case re:s=10;break a;case E:s=9;break a;case D:s=11;break a;case k:s=14;break a;case ae:s=16,i=null;break a}throw Error(r(130,e==null?e:typeof e,``))}return t=Kl(s,n,t,a),t.elementType=e,t.type=i,t.lanes=o,t}function Zl(e,t,n,r){return e=Kl(7,e,r,t),e.lanes=n,e}function Ql(e,t,n,r){return e=Kl(22,e,r,t),e.elementType=oe,e.lanes=n,e.stateNode={isHidden:!1},e}function $l(e,t,n){return e=Kl(6,e,null,t),e.lanes=n,e}function eu(e,t,n){return t=Kl(4,e.children===null?[]:e.children,e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function tu(e,t,n,r,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Vt(0),this.expirationTimes=Vt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Vt(0),this.identifierPrefix=r,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function nu(e,t,n,r,i,a,o,s,c){return e=new tu(e,t,n,s,c),t===1?(t=1,!0===a&&(t|=8)):t=0,a=Kl(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},ao(a),e}function ru(e,t,n){var r=3{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=m();e.createRoot=t.createRoot,e.hydrateRoot=t.hydrateRoot})),g=c(u(),1),_=h(),v=`cps.web.deviceCredential`,y=class extends Error{constructor(e=`此浏览器需要重新配对。请重新运行 codex-provider web。`){super(e),this.name=`PairingRequiredError`}},b=class extends Error{constructor(e,t,n){super(t||`配置已变更,请重新确认。`),this.name=`ProfileRevisionError`,this.code=e,this.profile=n}};function x(){return!!window.localStorage.getItem(v)}async function ee(){let e=new URLSearchParams(window.location.hash.replace(/^#/,``)).get(`pair`);if(!e)return x();let t=await fetch(`/api/pair`,{method:`POST`,headers:{"X-Codex-Provider-Pairing":e}}),n=await t.json().catch(()=>({}));if(!t.ok||!n.deviceCredential)throw new y(n.error??`配对链接无效、已过期或已被使用。请重新运行 codex-provider web。`);return window.localStorage.setItem(v,n.deviceCredential),window.history.replaceState(null,``,`${window.location.pathname}${window.location.search}`),!0}function S(){return{"X-Codex-Provider-Device":window.localStorage.getItem(v)??``}}function C(e,t,n){let r=e.code??e.coreError?.code;return t===409&&([`PROFILE_REVISION_REQUIRED`,`PROFILE_CHANGED`,`STORAGE_REVISION_REQUIRED`,`STORAGE_CHANGED`].includes(r)||[`PLAN_EXPIRED`,`STALE_STATE`].includes(r))?new b(r,e.error,e.profile):Error(e.error??n)}async function w(e,t){let n=await e.json().catch(()=>({}));if(!e.ok)throw n.code===`PAIRING_REQUIRED`?(window.dispatchEvent(new CustomEvent(`cps:pairing-required`,{detail:n.error})),new y(n.error)):C(n,e.status,t);return n}async function T(e,t={},{signal:n}={}){let r=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`,...S()},body:JSON.stringify(t),signal:n});return w(r,`Request failed with HTTP ${r.status}.`)}async function te(e=0){let t=await fetch(`/api/activity?after=${e}`,{headers:S()});return w(t,`Activity request failed with HTTP ${t.status}.`)}async function ne(){let e=await fetch(`/api/profiles`,{headers:S()});return w(e,`Profile request failed with HTTP ${e.status}.`)}async function re(){try{await T(`/api/access/forget`)}finally{window.localStorage.removeItem(v)}}async function E(e={},t={}){return T(`/api/history`,e,t)}async function D(e={},t={}){return T(`/api/history/session`,e,t)}function O(e,t){let[n,r]=(0,g.useState)(()=>{try{let n=window.localStorage.getItem(e);return n?JSON.parse(n):t}catch{return t}});return(0,g.useEffect)(()=>{window.localStorage.setItem(e,JSON.stringify(n))},[e,n]),[n,r]}function ie(){let e=0,t=null;return{begin(){return t?.abort(),t=new AbortController,e+=1,{sequence:e,controller:t,signal:t.signal}},isLatest(t){return t===e},cancel(){t?.abort(),e+=1}}}function k(e,t=300,n=globalThis){let r=n.setTimeout(e,t);return()=>n.clearTimeout(r)}function ae(e,t,n){return!e?.id||!e?.revision||n?.profileId!==e.id||n?.profileRevision!==e.revision?null:{...t,profile:{...e},profileId:e.id,profileRevision:e.revision,status:{...n}}}function oe(e){let t=e?.result?.result?.skippedLockedRolloutFiles??e?.result?.skippedLockedRolloutFiles??e?.skippedLockedRolloutFiles??[];return Array.isArray(t)?t.filter(Boolean):[]}function se(e,{successTitle:t,partialTitle:n,message:r}){let i=oe(e);return e?.result?.outcome===`partial`||e?.outcome===`partial`||i.length>0?{tone:`warning`,title:n,message:[r,i.length?`已跳过 ${i.length} 个被占用的 rollout 文件:${i.join(`、`)}`:`部分项目未完成;请查看活动日志后重试。`].filter(Boolean).join(`;`)}:{tone:`success`,title:t,message:r}}function ce(e,t){let n=String(e??``).replaceAll(`\\`,`/`).replace(/\/{2,}/g,`/`).replace(/\/$/,``);return t===`win32`?n.toLowerCase():n}function A(e=[],{platform:t=typeof process<`u`?process.platform:`browser`}={}){let n=new Set;return e.filter((e,r)=>{let i=e?.threadId??e?.id,a=e?.rolloutPath??e?.filePath??e?.rolloutFile??e?.path,o=i?`thread:${i}`:a?`rollout:${ce(a,t)}`:`item:${r}`;return!n.has(o)&&(n.add(o),!0)})}function le(e,{caseInsensitive:t=!1}={}){let n=String(e??``).replace(/[\\/]+$/,``).replaceAll(`\\`,`/`);return t?n.toLowerCase():n}function ue(e,t,n){return!!(e&&t&&le(e,n)===le(t,n))}function de(e){let t=String(e??``).replace(/[\\/]+$/,``),n=Math.max(t.lastIndexOf(`/`),t.lastIndexOf(`\\`));return n<0?``:n===0?t.slice(0,1):n===2&&/^[A-Za-z]:/.test(t)?t.slice(0,3):t.slice(0,n)}function fe(e,t){let n=e?.stateDbLocation?.path;if(n)return de(n);let r=t?.metadata,i={caseInsensitive:e?.pathComparisonCaseInsensitive===!0};return Number(r?.version)>=2&&e?.sqliteHomeSource==="default"&&ue(r?.sqliteHome,e?.codexHome,i)?e.codexHome:e?.sqliteHome??``}function pe({backup:e,profile:t,targetSqliteHome:n,restoreDatabase:r,restoreConfig:i,sqliteSupported:a,pathComparisonCaseInsensitive:o=!1}){let s=e?.metadata?.sqliteHome,c=t?.sqliteHome?.trim()??``,l=!!(r&&s&&n&&!ue(s,n,{caseInsensitive:o})),u=l&&!c,d=l&&i;return{requiresRelocation:l,missingExplicitTarget:u,configRestoreConflict:d,canSubmit:!!a&&!u&&!d}}function me(e){return{profileId:e||`default`}}function he({fetchStatus:e,fetchBackups:t,gate:n=ie()}){let r=async({profileId:r,showLoading:i=!0,onLoading:a,onResult:o,onError:s})=>{let{controller:c,sequence:l}=n.begin();i&&a?.(!0);try{let i=me(r),[a,s]=await Promise.all([e(i,{signal:c.signal}),t(i,{signal:c.signal})]);return n.isLatest(l)?(o?.({profileId:r,status:a.status,backups:s}),!0):!1}catch(e){return e?.name===`AbortError`||!n.isLatest(l)||s?.(e),!1}finally{n.isLatest(l)&&a?.(!1)}};return r.cancel=()=>n.cancel(),r}var j=o((e=>{var t=u(),n=Symbol.for(`react.element`),r=Symbol.for(`react.fragment`),i=Object.prototype.hasOwnProperty,a=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,o={key:!0,ref:!0,__self:!0,__source:!0};function s(e,t,r){var s,c={},l=null,u=null;for(s in r!==void 0&&(l=``+r),t.key!==void 0&&(l=``+t.key),t.ref!==void 0&&(u=t.ref),t)i.call(t,s)&&!o.hasOwnProperty(s)&&(c[s]=t[s]);if(e&&e.defaultProps)for(s in t=e.defaultProps,t)c[s]===void 0&&(c[s]=t[s]);return{$$typeof:n,type:e,key:l,ref:u,props:c,_owner:a.current}}e.Fragment=r,e.jsx=s,e.jsxs=s})),M=o(((e,t)=>{t.exports=j()}))();function N({children:e,size:t=18,className:n=``}){return(0,M.jsx)(`svg`,{className:n,width:t,height:t,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:e})}var P=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M20 6v5h-5`}),(0,M.jsx)(`path`,{d:`M4 18v-5h5`}),(0,M.jsx)(`path`,{d:`M18.3 9A7 7 0 0 0 6.7 6.7L4 11`}),(0,M.jsx)(`path`,{d:`M5.7 15A7 7 0 0 0 17.3 17.3L20 13`})]}),ge=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`ellipse`,{cx:`12`,cy:`5`,rx:`8`,ry:`3`}),(0,M.jsx)(`path`,{d:`M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5`}),(0,M.jsx)(`path`,{d:`M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6`})]}),_e=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M3 12a9 9 0 1 0 3-6.7L3 8`}),(0,M.jsx)(`path`,{d:`M3 3v5h5`}),(0,M.jsx)(`path`,{d:`M12 7v5l3 2`})]}),ve=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`M3 12h4l2-7 4 14 2-7h6`})}),ye=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`,rx:`1`}),(0,M.jsx)(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`,rx:`1`}),(0,M.jsx)(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1`}),(0,M.jsx)(`rect`,{x:`14`,y:`14`,width:`7`,height:`7`,rx:`1`})]}),be=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M12 3 4.5 6v5.3c0 4.6 3.2 8 7.5 9.7 4.3-1.7 7.5-5.1 7.5-9.7V6L12 3Z`}),(0,M.jsx)(`path`,{d:`m9 12 2 2 4-4`})]}),xe=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`m9 18 6-6-6-6`})}),Se=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`m6 6 12 12M18 6 6 18`})}),Ce=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`m5 12 4 4L19 6`})}),F=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M12 3 2.8 19h18.4L12 3Z`}),(0,M.jsx)(`path`,{d:`M12 9v4M12 17h.01`})]}),we=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`M3 6.5h6l2 2h10v9.5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6.5Z`})}),Te=[{id:`overview`,label:`概览`,icon:ye},{id:`history`,label:`聊天记录`,icon:_e},{id:`backups`,label:`备份`,icon:_e},{id:`activity`,label:`活动`,icon:ve}],Ee={backupRoot:``,backups:[]};function De(e){return new Intl.NumberFormat(`zh-CN`).format(Number(e)||0)}function Oe(e){let t=[`B`,`KB`,`MB`,`GB`,`TB`],n=Number(e)||0,r=0;for(;n>=1024&&r=10?1:2).replace(/\.0$/,``)} ${t[r]}`}function ke(e){return e?new Intl.DateTimeFormat(`zh-CN`,{month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}).format(new Date(e)):`未知时间`}function Ae(e,t){return e.split(/(`[^`]+`|\*\*[^*]+\*\*|\*[^*]+\*)/g).map((e,n)=>e.startsWith("`")&&e.endsWith("`")?(0,M.jsx)(`code`,{children:e.slice(1,-1)},`${t}-code-${n}`):e.startsWith(`**`)&&e.endsWith(`**`)?(0,M.jsx)(`strong`,{children:e.slice(2,-2)},`${t}-strong-${n}`):e.startsWith(`*`)&&e.endsWith(`*`)?(0,M.jsx)(`em`,{children:e.slice(1,-1)},`${t}-em-${n}`):(0,M.jsx)(g.Fragment,{children:e},`${t}-text-${n}`))}function je({text:e}){return String(e??``).split(/(```[^\n]*\n[\s\S]*?```)/g).map((e,t)=>{if(e.startsWith("```")&&e.endsWith("```")){let n=e.slice(3,-3).replace(/^\w*\n/,``);return(0,M.jsx)(`pre`,{children:(0,M.jsx)(`code`,{children:n})},`block-${t}`)}return e.split(` +`).map((e,n,r)=>(0,M.jsxs)(g.Fragment,{children:[Ae(e,`${t}-${n}`),n{for(let r of e??[]){if(!r||r===`(missing)`)continue;let e=t.get(r)??new Set;e.add(n),t.set(r,e)}};return n(e.configuredProviders,`config`),n(Object.keys(e.rolloutCounts?.sessions??{}),`rollout`),n(Object.keys(e.rolloutCounts?.archived_sessions??{}),`rollout`),n(Object.keys(e.sqliteCounts?.sessions??{}),`sqlite`),n(Object.keys(e.sqliteCounts?.archived_sessions??{}),`sqlite`),n([e.currentProvider],`config`),[...t.entries()].map(([t,n])=>({id:t,sources:[...n],configured:e.configuredProviders?.includes(t),current:t===e.currentProvider})).sort((e,t)=>Number(t.current)-Number(e.current)||e.id.localeCompare(t.id))}function Ne({tone:e=`neutral`}){return(0,M.jsx)(`span`,{className:`status-dot status-dot--${e}`,"aria-hidden":`true`})}function Pe({status:e,busy:t,onRefresh:n}){let r=e?.sqliteAccess?.supported!==!1&&!e?.sqliteCounts?.unreadable;return(0,M.jsxs)(`header`,{className:`app-header`,children:[(0,M.jsxs)(`div`,{className:`brand`,children:[(0,M.jsx)(`div`,{className:`brand-mark`,children:(0,M.jsx)(ge,{size:19})}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`brand-name`,children:`Codex Provider Sync`}),(0,M.jsx)(`div`,{className:`brand-subtitle`,children:`本机元数据一致性工具`})]})]}),(0,M.jsxs)(`div`,{className:`header-actions`,children:[(0,M.jsxs)(`div`,{className:`service-state`,children:[(0,M.jsx)(Ne,{tone:t?`warning`:r?`success`:`danger`}),(0,M.jsx)(`span`,{children:t?`操作执行中`:r?`本地服务就绪`:`需要检查`})]}),(0,M.jsxs)(`button`,{className:`button button--secondary button--compact`,type:`button`,onClick:n,disabled:t,children:[(0,M.jsx)(P,{size:16}),`刷新`]})]})]})}function Fe({view:e,setView:t,status:n,onForgetBrowser:r}){return(0,M.jsxs)(`aside`,{className:`sidebar`,children:[(0,M.jsx)(`nav`,{className:`navigation`,"aria-label":`主导航`,children:Te.map(n=>{let r=n.icon;return(0,M.jsxs)(`button`,{className:`nav-item ${e===n.id?`nav-item--active`:``}`,type:`button`,onClick:()=>t(n.id),children:[(0,M.jsx)(r,{size:17}),(0,M.jsx)(`span`,{children:n.label})]},n.id)})}),(0,M.jsxs)(`div`,{className:`sidebar-foot`,children:[(0,M.jsx)(`div`,{className:`sidebar-provider-label`,children:`当前 Provider`}),(0,M.jsxs)(`div`,{className:`sidebar-provider-value`,children:[(0,M.jsx)(Ne,{tone:`success`}),(0,M.jsx)(`span`,{children:n?.currentProvider??`未读取`})]}),(0,M.jsx)(`div`,{className:`sidebar-version`,children:`Web UI · localhost only`}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,onClick:r,children:`忘记此浏览器`})]})]})}function Ie({profiles:e,profileId:t,setProfileId:n,status:r,onAddProfile:i,onDeleteProfile:a,onRefresh:o,loading:s,profileSwitchDisabled:c}){return(0,M.jsxs)(`section`,{className:`storage-bar`,"aria-label":`存储位置`,children:[(0,M.jsxs)(`label`,{className:`path-field path-field--wide`,children:[(0,M.jsx)(`span`,{children:`存储配置`}),(0,M.jsxs)(`div`,{className:`path-input-wrap`,children:[(0,M.jsx)(we,{size:16}),(0,M.jsx)(`select`,{value:t,onChange:e=>n(e.target.value),disabled:c,children:e.map(e=>(0,M.jsx)(`option`,{value:e.id,children:e.name},e.id))})]})]}),(0,M.jsxs)(`label`,{className:`path-field`,children:[(0,M.jsxs)(`span`,{children:[`当前路径 `,(0,M.jsx)(`small`,{children:`由服务端解析`})]}),(0,M.jsxs)(`div`,{className:`path-input-wrap`,children:[(0,M.jsx)(ge,{size:16}),(0,M.jsx)(`input`,{value:r?.codexHome??``,readOnly:!0,placeholder:`读取状态后显示`})]})]}),(0,M.jsx)(`button`,{className:`button button--secondary storage-refresh`,type:`button`,onClick:i,children:`新增配置`}),t==="default"?null:(0,M.jsx)(`button`,{className:`button button--quiet storage-refresh`,type:`button`,onClick:a,children:`删除配置`}),(0,M.jsxs)(`button`,{className:`button button--secondary storage-refresh`,type:`button`,onClick:o,disabled:s,children:[(0,M.jsx)(P,{size:16,className:s?`spin`:``}),`读取状态`]})]})}function Le({title:e,counts:t,currentProvider:n}){let r=Object.entries(t??{}).sort((e,t)=>t[1]-e[1]),i=r.reduce((e,[,t])=>e+t,0);return(0,M.jsxs)(`div`,{className:`distribution-block`,children:[(0,M.jsxs)(`div`,{className:`distribution-heading`,children:[(0,M.jsx)(`span`,{children:e}),(0,M.jsx)(`strong`,{children:De(i)})]}),(0,M.jsx)(`div`,{className:`distribution-list`,children:r.length===0?(0,M.jsx)(`div`,{className:`empty-inline`,children:`无记录`}):r.map(([e,t])=>(0,M.jsxs)(`div`,{className:`distribution-row`,children:[(0,M.jsxs)(`div`,{className:`distribution-meta`,children:[(0,M.jsx)(`span`,{className:`provider-name`,children:e}),(0,M.jsx)(`span`,{children:De(t)})]}),(0,M.jsx)(`div`,{className:`bar-track`,children:(0,M.jsx)(`span`,{className:e===n?`bar-fill bar-fill--current`:`bar-fill`,style:{width:`${Math.max(5,i?t/i*100:0)}%`}})})]},e))})]})}function Re({status:e,loading:t}){let n=Object.values(e?.rolloutCounts?.sessions??{}).reduce((e,t)=>e+t,0)+Object.values(e?.rolloutCounts?.archived_sessions??{}).reduce((e,t)=>e+t,0),r=Object.values(e?.sqliteCounts?.sessions??{}).reduce((e,t)=>e+t,0)+Object.values(e?.sqliteCounts?.archived_sessions??{}).reduce((e,t)=>e+t,0),i=e?.alignment?.aligned;return(0,M.jsxs)(`section`,{className:`status-panel`,children:[(0,M.jsxs)(`div`,{className:`section-title-row`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`状态总览`}),(0,M.jsx)(`p`,{children:`比较 rollout 文件、SQLite 线程索引和当前 Provider。`})]}),(0,M.jsxs)(`div`,{className:`alignment-state ${i?`alignment-state--success`:`alignment-state--warning`}`,children:[t?(0,M.jsx)(P,{size:16,className:`spin`}):i?(0,M.jsx)(Ce,{size:16}):(0,M.jsx)(F,{size:16}),(0,M.jsx)(`span`,{children:t?`正在检查`:i?`Provider 元数据已对齐`:`发现不一致`})]})]}),(0,M.jsxs)(`div`,{className:`summary-strip`,children:[(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`当前 Provider`}),(0,M.jsx)(`strong`,{children:e?.currentProvider??`—`}),(0,M.jsx)(`small`,{children:e?.currentProviderImplicit?`隐式默认`:`config.toml 根级配置`})]}),(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`Rollout 文件`}),(0,M.jsx)(`strong`,{children:De(n)}),(0,M.jsx)(`small`,{children:`sessions + archived`})]}),(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`SQLite threads`}),(0,M.jsx)(`strong`,{children:e?.sqliteCounts?.unreadable?`不可读`:De(r)}),(0,M.jsx)(`small`,{children:e?.stateDbLocation?.source??`未定位数据库`})]}),(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`托管备份`}),(0,M.jsx)(`strong`,{children:De(e?.backupSummary?.count)}),(0,M.jsx)(`small`,{children:Oe(e?.backupSummary?.totalBytes)})]})]}),(0,M.jsxs)(`div`,{className:`distribution-grid`,children:[(0,M.jsxs)(`div`,{className:`distribution-column`,children:[(0,M.jsxs)(`div`,{className:`column-label`,children:[(0,M.jsx)(we,{size:16}),` Rollout files`]}),(0,M.jsx)(Le,{title:`sessions`,counts:e?.rolloutCounts?.sessions,currentProvider:e?.currentProvider}),(0,M.jsx)(Le,{title:`archived_sessions`,counts:e?.rolloutCounts?.archived_sessions,currentProvider:e?.currentProvider})]}),(0,M.jsx)(`div`,{className:`distribution-divider`}),(0,M.jsxs)(`div`,{className:`distribution-column`,children:[(0,M.jsxs)(`div`,{className:`column-label`,children:[(0,M.jsx)(ge,{size:16}),` SQLite state`]}),(0,M.jsx)(Le,{title:`sessions`,counts:e?.sqliteCounts?.sessions,currentProvider:e?.currentProvider}),(0,M.jsx)(Le,{title:`archived_sessions`,counts:e?.sqliteCounts?.archived_sessions,currentProvider:e?.currentProvider})]})]})]})}function ze({status:e}){let t=[];e?.sqliteAccess?.supported===!1&&t.push({tone:`danger`,title:`SQLite 路径不可安全访问`,detail:e.sqliteAccess.message}),e?.sqliteCounts?.unreadable&&t.push({tone:`danger`,title:`SQLite 当前不可读`,detail:e.sqliteCounts.error}),e?.lockedRolloutFiles?.length&&t.push({tone:`warning`,title:`${e.lockedRolloutFiles.length} 个 rollout 文件正在使用`,detail:`同步会跳过这些活跃文件;会话结束后可再次执行。`}),e?.encryptedContentWarning&&t.push({tone:`warning`,title:`检测到 encrypted_content`,detail:e.encryptedContentWarning});let n=e?.sqliteRepairStats;return(n?.userEventRowsNeedingRepair||n?.cwdRowsNeedingRepair)&&t.push({tone:`info`,title:`SQLite 有待修复字段`,detail:`user-event ${n.userEventRowsNeedingRepair??0},cwd ${n.cwdRowsNeedingRepair??0}`}),t.length===0?null:(0,M.jsx)(`section`,{className:`warning-stack`,"aria-label":`诊断信息`,children:t.map((e,t)=>(0,M.jsxs)(`div`,{className:`warning-row warning-row--${e.tone}`,children:[(0,M.jsx)(F,{size:17}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:e.title}),(0,M.jsx)(`span`,{children:e.detail})]})]},`${e.title}-${t}`))})}function Be({projects:e=[]}){return(0,M.jsxs)(`section`,{className:`data-section`,children:[(0,M.jsx)(`div`,{className:`section-title-row section-title-row--compact`,children:(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`项目可见性`}),(0,M.jsx)(`p`,{children:`检查 Desktop 项目路径、全局排序和首屏 50 条命中。`})]})}),(0,M.jsx)(`div`,{className:`table-scroll`,children:(0,M.jsxs)(`table`,{className:`data-table`,children:[(0,M.jsx)(`thead`,{children:(0,M.jsxs)(`tr`,{children:[(0,M.jsx)(`th`,{children:`项目根目录`}),(0,M.jsx)(`th`,{children:`交互会话`}),(0,M.jsx)(`th`,{children:`首屏`}),(0,M.jsx)(`th`,{children:`Ranks`}),(0,M.jsx)(`th`,{children:`CWD 精确匹配`}),(0,M.jsx)(`th`,{children:`Provider`})]})}),(0,M.jsx)(`tbody`,{children:e.length===0?(0,M.jsx)(`tr`,{children:(0,M.jsx)(`td`,{colSpan:`6`,className:`table-empty`,children:`没有可显示的项目诊断。`})}):e.map(e=>(0,M.jsxs)(`tr`,{children:[(0,M.jsx)(`td`,{className:`path-cell`,children:e.root}),(0,M.jsx)(`td`,{children:e.interactiveThreads}),(0,M.jsxs)(`td`,{children:[e.firstPageThreads,`/50`]}),(0,M.jsx)(`td`,{children:e.rankPreview||`—`}),(0,M.jsxs)(`td`,{children:[e.exactCwdMatches,`/`,e.interactiveThreads]}),(0,M.jsx)(`td`,{children:Object.entries(e.providerCounts??{}).map(([e,t])=>`${e} ${t}`).join(` · `)||`—`})]},e.root))})]})})]})}function Ve({value:e,onChange:t,disabled:n}){return(0,M.jsxs)(`div`,{className:`segmented`,role:`radiogroup`,"aria-label":`执行模式`,children:[(0,M.jsxs)(`button`,{type:`button`,className:e===`sync`?`segmented-option segmented-option--active`:`segmented-option`,onClick:()=>t(`sync`),disabled:n,children:[(0,M.jsx)(`span`,{children:`仅同步元数据`}),(0,M.jsx)(`small`,{children:`不修改 config.toml`})]}),(0,M.jsxs)(`button`,{type:`button`,className:e===`switch`?`segmented-option segmented-option--active`:`segmented-option`,onClick:()=>t(`switch`),disabled:n,children:[(0,M.jsx)(`span`,{children:`切换 Provider 并同步`}),(0,M.jsx)(`small`,{children:`更新根级配置`})]})]})}function He({status:e,providers:t,selectedProvider:n,setSelectedProvider:r,onAddManualProvider:i,onRemoveManualProvider:a,onRequestExecute:o,busy:s}){let[c,l]=O(`cps.web.mode`,`sync`),[u,d]=O(`cps.web.modelMode`,`auto`),[f,p]=O(`cps.web.customModel`,``),[m,h]=O(`cps.web.keepCount`,5),[_,v]=(0,g.useState)(``),y=t.find(e=>e.id===n),b=y?.configured,x=/^[A-Za-z0-9_.-]+$/.test(_.trim()),ee=e?.sqliteAccess?.supported===!1,S=s||!n||ee||e?.sqliteCounts?.unreadable;return(0,M.jsxs)(`section`,{className:`execution-panel`,children:[(0,M.jsxs)(`div`,{className:`execution-head`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`执行同步`}),(0,M.jsx)(`p`,{children:`所有写操作都会先创建备份。执行前请关闭 Codex CLI、App 和 app-server。`})]}),(0,M.jsx)(be,{size:22})]}),(0,M.jsx)(Ve,{value:c,onChange:l,disabled:s}),(0,M.jsxs)(`div`,{className:`form-grid`,children:[(0,M.jsxs)(`label`,{className:`form-field`,children:[(0,M.jsx)(`span`,{children:`目标 Provider`}),(0,M.jsx)(`select`,{value:n,onChange:e=>r(e.target.value),disabled:s,children:t.map(e=>(0,M.jsxs)(`option`,{value:e.id,children:[e.id,e.current?`(当前)`:``]},e.id))}),c===`switch`&&!b?(0,M.jsx)(`small`,{className:`field-error`,children:`切换模式要求该 Provider 已定义在 config.toml。`}):null]}),(0,M.jsxs)(`label`,{className:`form-field form-field--short`,children:[(0,M.jsx)(`span`,{children:`保留备份数`}),(0,M.jsx)(`input`,{type:`number`,min:`1`,max:`100000`,value:m,onChange:e=>h(Number(e.target.value)),disabled:s}),(0,M.jsx)(`small`,{children:`同步后自动清理`})]})]}),(0,M.jsxs)(`div`,{className:`manual-provider-row`,children:[(0,M.jsx)(`input`,{type:`text`,value:_,onChange:e=>v(e.target.value),placeholder:`手动添加 Provider ID`,spellCheck:`false`,disabled:s}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:s||!x,onClick:()=>{i(_.trim()),v(``)},children:`添加`}),y?.manual?(0,M.jsx)(`button`,{className:`manual-remove`,type:`button`,onClick:()=>a(n),disabled:s,children:`删除当前手动项`}):null]}),c===`switch`?(0,M.jsxs)(`fieldset`,{className:`model-options`,disabled:s,children:[(0,M.jsx)(`legend`,{children:`根级 model`}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`auto`,onChange:()=>d(`auto`)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`跟随 Provider 配置`}),(0,M.jsxs)(`small`,{children:["采用 `[model_providers.",n,"]` 中的 model"]})]})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`keep`,onChange:()=>d(`keep`)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`保留当前根级 model`}),(0,M.jsx)(`small`,{children:`只切换 model_provider`})]})]}),(0,M.jsxs)(`label`,{className:`custom-model-option`,children:[(0,M.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`custom`,onChange:()=>d(`custom`)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`自定义 model`}),(0,M.jsx)(`input`,{type:`text`,value:f,onFocus:()=>d(`custom`),onChange:e=>p(e.target.value),placeholder:`例如 MiniMax-M3`})]})]})]}):null,ee?(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`此 SQLite 布局仅供诊断`}),(0,M.jsx)(`span`,{children:e?.sqliteAccess?.message||`当前 SQLite 路径不可由 Web UI 安全写入,因此已禁用执行同步。`})]})]}):null,(0,M.jsxs)(`div`,{className:`backup-assurance`,children:[(0,M.jsx)(Ce,{size:16}),(0,M.jsx)(`span`,{children:`修改前创建 metadata v2 备份,并记录 SQLite Home`})]}),(0,M.jsxs)(`button`,{className:`button button--primary execute-button`,type:`button`,disabled:S||c===`switch`&&!b||c===`switch`&&u===`custom`&&!f.trim(),onClick:()=>o({mode:c,modelMode:u,model:f.trim(),keepCount:m}),children:[s?(0,M.jsx)(P,{size:17,className:`spin`}):(0,M.jsx)(be,{size:17}),s?`正在执行…`:c===`switch`?`切换并同步`:`执行同步`]})]})}function Ue({backups:e,onViewAll:t,onRestore:n,restoreDisabled:r}){return(0,M.jsxs)(`section`,{className:`recent-backups`,children:[(0,M.jsxs)(`div`,{className:`section-title-row section-title-row--compact`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`最近备份`}),(0,M.jsx)(`p`,{children:e.backupRoot||`同步后将在 Codex Home 下创建备份`})]}),(0,M.jsxs)(`button`,{type:`button`,className:`text-button`,onClick:t,children:[`查看全部 `,(0,M.jsx)(xe,{size:14})]})]}),(0,M.jsx)(`div`,{className:`backup-rows`,children:e.backups.length===0?(0,M.jsx)(`div`,{className:`empty-state`,children:`尚无由本工具创建的备份。`}):e.backups.slice(0,3).map(e=>(0,M.jsxs)(`div`,{className:`backup-row`,children:[(0,M.jsx)(`div`,{className:`backup-icon`,children:(0,M.jsx)(_e,{size:17})}),(0,M.jsxs)(`div`,{className:`backup-main`,children:[(0,M.jsx)(`strong`,{children:ke(e.metadata.createdAt)}),(0,M.jsxs)(`span`,{children:[e.metadata.targetProvider,` · `,e.metadata.changedSessionFiles??0,` 个 rollout`]})]}),(0,M.jsx)(`div`,{className:`backup-size`,children:Oe(e.sizeBytes)}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:r,title:r?`当前 SQLite 路径仅供诊断,不能恢复`:void 0,onClick:()=>n(e),children:`恢复`})]},e.id))})]})}function We({status:e,backups:t,providers:n,selectedProvider:r,setSelectedProvider:i,onAddManualProvider:a,onRemoveManualProvider:o,onExecute:s,onRestore:c,setView:l,busy:u,loading:d}){return(0,M.jsxs)(`div`,{className:`view-content`,children:[(0,M.jsx)(Re,{status:e,loading:d}),(0,M.jsx)(ze,{status:e}),(0,M.jsxs)(`div`,{className:`overview-lower-grid`,children:[(0,M.jsxs)(`div`,{className:`overview-main-column`,children:[(0,M.jsx)(Be,{projects:e?.projectThreadVisibility??[]}),(0,M.jsx)(Ue,{backups:t,onViewAll:()=>l(`backups`),onRestore:c,restoreDisabled:e?.sqliteAccess?.supported===!1})]}),(0,M.jsx)(He,{status:e,providers:n,selectedProvider:r,setSelectedProvider:i,onAddManualProvider:a,onRemoveManualProvider:o,onRequestExecute:s,busy:u})]})]})}function Ge({backups:e,status:t,busy:n,onRestore:r,onPrune:i}){let[a,o]=O(`cps.web.keepCount`,5),s=t?.sqliteAccess?.supported===!1;return(0,M.jsxs)(`div`,{className:`view-content`,children:[(0,M.jsxs)(`section`,{className:`page-intro`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h1`,{children:`备份`}),(0,M.jsx)(`p`,{children:`管理当前 Codex Home 下由本工具创建的 metadata v2 备份。`})]}),(0,M.jsxs)(`div`,{className:`prune-control`,children:[(0,M.jsxs)(`label`,{children:[`保留最近 `,(0,M.jsx)(`input`,{type:`number`,min:`0`,max:`100000`,value:a,onChange:e=>o(Number(e.target.value))}),` 份`]}),(0,M.jsx)(`button`,{className:`button button--secondary`,type:`button`,disabled:n,onClick:()=>i(a),children:`清理旧备份`})]})]}),(0,M.jsxs)(`section`,{className:`backup-list-section`,children:[(0,M.jsxs)(`div`,{className:`backup-root-line`,children:[(0,M.jsx)(we,{size:16}),(0,M.jsx)(`span`,{children:e.backupRoot||t?.backupRoot||`—`}),(0,M.jsxs)(`strong`,{children:[e.backups.length,` 份 · `,Oe(e.backups.reduce((e,t)=>e+t.sizeBytes,0))]})]}),(0,M.jsx)(`div`,{className:`full-backup-list`,children:e.backups.length===0?(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(_e,{size:26}),(0,M.jsx)(`strong`,{children:`还没有备份`}),(0,M.jsx)(`span`,{children:`执行一次同步或切换后,备份会显示在这里。`})]}):e.backups.map(e=>(0,M.jsxs)(`article`,{className:`full-backup-row`,children:[(0,M.jsxs)(`div`,{className:`backup-date`,children:[(0,M.jsx)(`strong`,{children:ke(e.metadata.createdAt)}),(0,M.jsx)(`span`,{children:e.id})]}),(0,M.jsxs)(`div`,{className:`backup-facts`,children:[(0,M.jsxs)(`span`,{children:[`Provider `,(0,M.jsx)(`strong`,{children:e.metadata.targetProvider})]}),(0,M.jsxs)(`span`,{children:[`Rollout `,(0,M.jsx)(`strong`,{children:e.metadata.changedSessionFiles??0})]}),(0,M.jsxs)(`span`,{children:[`SQLite `,(0,M.jsx)(`strong`,{children:e.metadata.sqliteDbFiles?.length?`已包含`:`未包含`})]})]}),(0,M.jsxs)(`div`,{className:`backup-source`,children:[(0,M.jsx)(`span`,{children:`SQLite Home`}),(0,M.jsx)(`code`,{children:e.metadata.sqliteHome??`旧版 metadata 未记录`})]}),(0,M.jsxs)(`div`,{className:`backup-row-actions`,children:[(0,M.jsx)(`span`,{children:Oe(e.sizeBytes)}),(0,M.jsx)(`button`,{className:`button button--secondary button--compact`,type:`button`,disabled:n||s,title:s?`当前 SQLite 路径仅供诊断,不能恢复`:void 0,onClick:()=>r(e),children:`恢复`})]})]},e.id))})]})]})}function Ke({activity:e,activeOperation:t}){return(0,M.jsxs)(`div`,{className:`view-content`,children:[(0,M.jsxs)(`section`,{className:`page-intro`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h1`,{children:`活动日志`}),(0,M.jsx)(`p`,{children:`当前 Web UI 会话中的状态刷新、同步阶段和操作结果。`})]}),t?(0,M.jsxs)(`div`,{className:`live-operation`,children:[(0,M.jsx)(P,{size:16,className:`spin`}),` `,t.kind]}):null]}),(0,M.jsxs)(`section`,{className:`activity-console`,children:[(0,M.jsxs)(`div`,{className:`console-head`,children:[(0,M.jsx)(`span`,{children:`Activity log`}),(0,M.jsxs)(`span`,{children:[e.length,` entries`]})]}),(0,M.jsx)(`div`,{className:`console-body`,children:e.length===0?(0,M.jsx)(`div`,{className:`console-empty`,children:`等待操作…`}):e.map(e=>(0,M.jsxs)(`div`,{className:`console-row console-row--${e.level}`,children:[(0,M.jsx)(`time`,{children:ke(e.timestamp)}),(0,M.jsx)(`span`,{className:`console-level`,children:e.level}),(0,M.jsx)(`span`,{className:`console-message`,children:e.message}),typeof e.detail==`string`?(0,M.jsx)(`span`,{className:`console-detail`,children:e.detail}):null]},e.id))})]})]})}function qe({profileId:e,status:t}){let[n,r]=(0,g.useState)(``),[i,a]=(0,g.useState)(``),[o,s]=(0,g.useState)(``),[c,l]=(0,g.useState)(``),[u,d]=(0,g.useState)(`all`),[f,p]=(0,g.useState)(1),[m,h]=(0,g.useState)({sessions:[],total:0,pageSize:50,hasNextPage:!1}),[_,v]=(0,g.useState)(``),[y,b]=(0,g.useState)(null),[x,ee]=(0,g.useState)(!1),[S,C]=(0,g.useState)(!1),[w,T]=(0,g.useState)(``),te=(0,g.useRef)(null),ne=(0,g.useRef)(null);te.current||=ie(),ne.current||=ie();let re=Me(t),O=[...new Set((t?.projectThreadVisibility??[]).map(e=>e.root))];(0,g.useEffect)(()=>{te.current.cancel(),ne.current.cancel(),r(``),a(``),s(``),l(``),d(`all`),p(1),h({sessions:[],total:0,pageSize:50,hasNextPage:!1}),v(``),b(null),T(``)},[e]),(0,g.useEffect)(()=>k(()=>a(n),300,window),[n]);let ae=(0,g.useCallback)(async()=>{let{controller:t,sequence:n}=te.current.begin();ee(!0),T(``);try{let r=await E({...me(e),page:f,pageSize:50,query:i,provider:o,project:c,archived:u},{signal:t.signal});if(!te.current.isLatest(n))return;let a={...r.history,sessions:A(r.history?.sessions)};h(a),v(e=>a.sessions.some(t=>t.id===e)?e:a.sessions[0]?.id??``)}catch(e){e.name!==`AbortError`&&te.current.isLatest(n)&&T(e.message)}finally{te.current.isLatest(n)&&ee(!1)}},[e,f,i,o,c,u]);(0,g.useEffect)(()=>(ae(),()=>te.current.cancel()),[ae]),(0,g.useEffect)(()=>{if(ne.current.cancel(),!_){b(null),C(!1);return}let{controller:t,sequence:n}=ne.current.begin();return b(null),C(!0),T(``),D({...me(e),sessionId:_},{signal:t.signal}).then(e=>{ne.current.isLatest(n)&&b(e.history)}).catch(e=>{e.name!==`AbortError`&&ne.current.isLatest(n)&&T(e.message)}).finally(()=>{ne.current.isLatest(n)&&C(!1)}),()=>t.abort()},[e,_]);let oe=e=>t=>{e(t.target.value),p(1)};return(0,M.jsxs)(`div`,{className:`view-content history-view`,children:[(0,M.jsxs)(`section`,{className:`page-intro`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h1`,{children:`聊天记录`}),(0,M.jsx)(`p`,{children:`从 rollout 文件读取历史会话,只读查看,不修改本地数据。`})]}),(0,M.jsxs)(`button`,{className:`button button--secondary`,type:`button`,onClick:ae,disabled:x,children:[(0,M.jsx)(P,{size:16,className:x?`spin`:``}),`刷新`]})]}),(0,M.jsxs)(`section`,{className:`history-toolbar`,children:[(0,M.jsx)(`input`,{value:n,onChange:oe(r),onKeyDown:e=>{e.key===`Enter`&&(a(n),p(1))},placeholder:`搜索标题、项目、Provider 或消息内容`}),(0,M.jsxs)(`select`,{value:o,onChange:oe(s),children:[(0,M.jsx)(`option`,{value:``,children:`全部 Provider`}),re.map(e=>(0,M.jsx)(`option`,{value:e.id,children:e.id},e.id))]}),(0,M.jsxs)(`select`,{value:c,onChange:oe(l),children:[(0,M.jsx)(`option`,{value:``,children:`全部项目`}),O.map(e=>(0,M.jsx)(`option`,{value:e,children:e},e))]}),(0,M.jsxs)(`select`,{value:u,onChange:oe(d),children:[(0,M.jsx)(`option`,{value:`all`,children:`全部会话`}),(0,M.jsx)(`option`,{value:`active`,children:`活跃会话`}),(0,M.jsx)(`option`,{value:`archived`,children:`已归档`})]})]}),w?(0,M.jsxs)(`div`,{className:`history-error`,children:[(0,M.jsx)(F,{size:16}),w]}):null,(0,M.jsxs)(`section`,{className:`history-layout`,children:[(0,M.jsxs)(`div`,{className:`history-list-panel`,children:[(0,M.jsxs)(`div`,{className:`history-list-head`,children:[(0,M.jsxs)(`strong`,{children:[m.total,` 个会话`]}),(0,M.jsxs)(`span`,{children:[`第 `,m.page,` 页`]})]}),(0,M.jsxs)(`div`,{className:`history-list`,children:[x&&!m.sessions.length?(0,M.jsx)(`div`,{className:`large-empty`,children:`读取中…`}):null,!x&&!m.sessions.length?(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(_e,{size:24}),(0,M.jsx)(`strong`,{children:`没有匹配的会话`})]}):null,m.sessions.map(e=>(0,M.jsxs)(`button`,{type:`button`,className:`history-session-row ${e.id===_?`history-session-row--selected`:``}`,onClick:()=>v(e.id),children:[(0,M.jsxs)(`div`,{className:`history-session-top`,children:[(0,M.jsx)(`strong`,{children:e.title}),(0,M.jsx)(`time`,{children:ke(e.updatedAt)})]}),(0,M.jsx)(`p`,{children:e.firstUserMessage||`没有可读的用户消息`}),(0,M.jsxs)(`div`,{className:`history-session-meta`,children:[(0,M.jsx)(`span`,{children:e.provider}),(0,M.jsxs)(`span`,{children:[e.messageCount,` 条消息`]}),(0,M.jsx)(`span`,{children:e.archived?`已归档`:`活跃`})]})]},e.id))]}),(0,M.jsxs)(`div`,{className:`history-pagination`,children:[(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:f<=1||x,onClick:()=>p(e=>e-1),children:`上一页`}),(0,M.jsx)(`span`,{children:f}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:!m.hasNextPage||x,onClick:()=>p(e=>e+1),children:`下一页`})]})]}),(0,M.jsx)(`div`,{className:`history-detail-panel`,children:S?(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(P,{size:24,className:`spin`}),(0,M.jsx)(`strong`,{children:`正在读取会话`})]}):y?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`div`,{className:`history-detail-head`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:y.session.title}),(0,M.jsxs)(`p`,{children:[y.session.cwd||`未知项目`,` · `,y.session.provider,` · `,y.session.messageCount,` 条消息`]})]}),(0,M.jsx)(`span`,{children:y.session.archived?`已归档`:`活跃`})]}),y.truncated?(0,M.jsxs)(`div`,{className:`history-truncated`,children:[(0,M.jsx)(F,{size:15}),`仅显示最近 `,y.returnedMessageCount,` 条消息。`]}):null,(0,M.jsx)(`div`,{className:`message-stream`,children:y.messages.map(e=>(0,M.jsxs)(`article`,{className:`chat-message chat-message--${e.role}`,children:[(0,M.jsxs)(`div`,{className:`chat-message-label`,children:[e.role===`user`?`你`:`Codex`,(0,M.jsx)(`time`,{children:ke(e.timestamp)})]}),(0,M.jsx)(`div`,{className:`chat-message-body`,children:(0,M.jsx)(je,{text:e.text})})]},`${e.sequence}-${e.timestamp}`))})]}):(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(_e,{size:28}),(0,M.jsx)(`strong`,{children:`选择一个会话`}),(0,M.jsx)(`span`,{children:`聊天内容将在这里显示。`})]})})]})]})}function Je({title:e,children:t,confirmLabel:n,onConfirm:r,onCancel:i,tone:a=`primary`,confirmDisabled:o=!1}){return(0,M.jsx)(`div`,{className:`modal-backdrop`,role:`presentation`,onMouseDown:e=>e.target===e.currentTarget&&i(),children:(0,M.jsxs)(`section`,{className:`modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`modal-title`,children:[(0,M.jsxs)(`div`,{className:`modal-head`,children:[(0,M.jsx)(`h2`,{id:`modal-title`,children:e}),(0,M.jsx)(`button`,{type:`button`,className:`icon-button`,onClick:i,"aria-label":`关闭`,children:(0,M.jsx)(Se,{size:18})})]}),(0,M.jsx)(`div`,{className:`modal-body`,children:t}),(0,M.jsxs)(`div`,{className:`modal-actions`,children:[(0,M.jsx)(`button`,{className:`button button--secondary`,type:`button`,onClick:i,children:`取消`}),(0,M.jsx)(`button`,{className:`button button--${a}`,type:`button`,disabled:o,onClick:r,children:n})]})]})})}function Ye({plan:e}){if(!e)return null;let t=e.impact??{};return(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`dl`,{className:`operation-scope`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`计划有效期`}),(0,M.jsx)(`dd`,{children:ke(e.expiresAt)})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`Rollout 变更`}),(0,M.jsx)(`dd`,{children:t.rolloutFilesToChange??0})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`SQLite 行变更`}),(0,M.jsx)(`dd`,{children:t.sqliteRowsToChange??0})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`当前锁定 Rollout`}),(0,M.jsx)(`dd`,{children:Array.isArray(t.lockedRolloutFiles)?t.lockedRolloutFiles.length:t.lockedRolloutFiles??0})]})]}),e.warnings?.map(e=>(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--warning`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`计划警告`}),(0,M.jsx)(`span`,{children:e})]})]},e))]})}function Xe({plan:e,corePlan:t,status:n,selectedProvider:r,onCancel:i,onConfirm:a}){return(0,M.jsxs)(Je,{title:e.mode===`switch`?`确认切换并同步`:`确认同步元数据`,confirmLabel:e.mode===`switch`?`确认切换并同步`:`确认执行同步`,onCancel:i,onConfirm:a,children:[(0,M.jsxs)(`div`,{className:`modal-callout`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`请确认 Codex 已完全关闭`}),(0,M.jsx)(`span`,{children:`关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。`})]})]}),(0,M.jsxs)(`dl`,{className:`operation-scope`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`Codex Home`}),(0,M.jsx)(`dd`,{children:n?.codexHome})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`SQLite Home`}),(0,M.jsxs)(`dd`,{children:[n?.sqliteHome,` `,(0,M.jsxs)(`small`,{children:[`(`,n?.sqliteHomeSource,`)`]})]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`当前 Provider`}),(0,M.jsx)(`dd`,{children:n?.currentProvider})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`目标 Provider`}),(0,M.jsx)(`dd`,{children:r})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`配置变更`}),(0,M.jsx)(`dd`,{children:e.mode===`switch`?`更新 config.toml 根级 model_provider`:`不修改 config.toml`})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`Model 策略`}),(0,M.jsx)(`dd`,{children:e.mode===`switch`?e.modelMode===`auto`?`跟随目标 Provider 配置`:e.modelMode===`keep`?`保留当前根级 model`:`设置为 ${e.model}`:`跟随当前根级 model`})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`备份策略`}),(0,M.jsxs)(`dd`,{children:[`修改前创建备份,保留最近 `,e.keepCount,` 份`]})]})]}),(0,M.jsx)(Ye,{plan:t})]})}function Ze({backup:e,status:t,profile:n,onCancel:r,onConfirm:i}){let[a,o]=(0,g.useState)(!1),[s,c]=(0,g.useState)(!0),[l,u]=(0,g.useState)(!0),d=fe(t,e),f=pe({backup:e,profile:n,targetSqliteHome:d,restoreDatabase:s,restoreConfig:a,sqliteSupported:t?.sqliteAccess?.supported!==!1,pathComparisonCaseInsensitive:t?.pathComparisonCaseInsensitive===!0});return(0,M.jsxs)(Je,{title:`恢复备份`,confirmLabel:`覆盖当前元数据`,tone:`danger`,onCancel:r,confirmDisabled:!a&&!s&&!l||!f.canSubmit,onConfirm:()=>i({restoreConfig:a,restoreDatabase:s,restoreSessions:l,allowSqliteHomeRelocation:f.requiresRelocation}),children:[(0,M.jsxs)(`div`,{className:`restore-summary`,children:[(0,M.jsx)(_e,{size:20}),(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`strong`,{children:[ke(e.metadata.createdAt),` · `,e.metadata.targetProvider]}),(0,M.jsx)(`code`,{children:e.path})]})]}),(0,M.jsxs)(`fieldset`,{className:`restore-options`,children:[(0,M.jsx)(`legend`,{children:`选择要覆盖的内容`}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:a,onChange:e=>o(e.target.checked)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`config.toml 与 global state`}),(0,M.jsx)(`small`,{children:`恢复 Provider 配置和 Desktop workspace roots`})]})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:s,onChange:e=>c(e.target.checked)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`SQLite 线程数据库`}),(0,M.jsx)(`small`,{children:`恢复 state_5.sqlite 及备份中的 WAL/SHM`})]})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:l,onChange:e=>u(e.target.checked)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`Rollout 元数据`}),(0,M.jsx)(`small`,{children:`恢复 session_meta 和被修改的 turn_context.model`})]})]})]}),t?.sqliteAccess?.supported===!1?(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`当前 SQLite 路径仅供诊断`}),(0,M.jsx)(`span`,{children:t.sqliteAccess.message||`不能从 Web UI 执行恢复。`})]})]}):null,f.requiresRelocation?(0,M.jsxs)(`div`,{className:`modal-callout ${f.missingExplicitTarget||f.configRestoreConflict?`modal-callout--danger`:`modal-callout--warning`}`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`SQLite Home 与备份来源不同`}),(0,M.jsxs)(`span`,{children:[`来源:`,e.metadata.sqliteHome,(0,M.jsx)(`br`,{}),`目标:`,d,(0,M.jsx)(`br`,{}),f.missingExplicitTarget?`当前 Profile 未明确配置 SQLite Home,不能提交数据库迁移恢复。`:f.configRestoreConflict?`迁移数据库时不能同时恢复旧 config.toml。`:`确认后数据库将恢复到当前 Profile 明确配置的目标位置。`]})]})]}):null,(0,M.jsxs)(`div`,{className:`modal-callout`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`恢复前请关闭 Codex`}),(0,M.jsx)(`span`,{children:`该操作将覆盖所选的当前元数据;请确认 Codex CLI、App 和 app-server 已关闭。`})]})]})]})}function Qe({backup:e,corePlan:t,onCancel:n,onConfirm:r}){return(0,M.jsxs)(Je,{title:`确认恢复计划`,confirmLabel:`按计划恢复`,tone:`danger`,onCancel:n,onConfirm:r,children:[(0,M.jsxs)(`div`,{className:`restore-summary`,children:[(0,M.jsx)(_e,{size:20}),(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`strong`,{children:[ke(e.metadata.createdAt),` · `,e.metadata.targetProvider]}),(0,M.jsx)(`code`,{children:e.id})]})]}),(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`Apply 仅使用一次性 planId`}),(0,M.jsx)(`span`,{children:`任何 Profile、配置、Rollout、SQLite 或备份漂移都会使本计划失效,且不会创建新写入。`})]})]}),(0,M.jsx)(Ye,{plan:t})]})}function $e({keepCount:e,backups:t,onCancel:n,onConfirm:r}){let i=Math.max(0,t.backups.length-e);return(0,M.jsxs)(Je,{title:`清理旧备份`,confirmLabel:`删除 ${i} 份旧备份`,tone:`danger`,onCancel:n,onConfirm:r,confirmDisabled:i===0,children:[(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--warning`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`被删除的备份无法直接恢复`}),(0,M.jsx)(`span`,{children:`只处理当前 Codex Home 下由本工具管理的备份目录。`})]})]}),(0,M.jsxs)(`dl`,{className:`operation-scope`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`当前备份`}),(0,M.jsxs)(`dd`,{children:[t.backups.length,` 份`]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`保留`}),(0,M.jsxs)(`dd`,{children:[`最近 `,e,` 份`]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`将删除`}),(0,M.jsxs)(`dd`,{children:[i,` 份`]})]})]})]})}function et({onCancel:e,onConfirm:t}){let[n,r]=(0,g.useState)(``),[i,a]=(0,g.useState)(``),[o,s]=(0,g.useState)(``),[c,l]=(0,g.useState)(``),u=/^[A-Za-z0-9_.-]{1,80}$/.test(n)&&i.trim()&&o.trim();return(0,M.jsx)(Je,{title:`新增存储配置`,confirmLabel:`保存配置`,onCancel:e,confirmDisabled:!u,onConfirm:()=>t({profileId:n,name:i,codexHome:o,sqliteHome:c}),children:(0,M.jsxs)(`div`,{className:`profile-form`,children:[(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`配置 ID`}),(0,M.jsx)(`input`,{value:n,onChange:e=>r(e.target.value),placeholder:`work`,spellCheck:`false`})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`显示名称`}),(0,M.jsx)(`input`,{value:i,onChange:e=>a(e.target.value),placeholder:`工作环境`})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`Codex Home`}),(0,M.jsx)(`input`,{value:o,onChange:e=>s(e.target.value),placeholder:`/home/user/.codex`,spellCheck:`false`})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`SQLite Home(可选)`}),(0,M.jsx)(`input`,{value:c,onChange:e=>l(e.target.value),placeholder:`留空时由服务端按配置解析`,spellCheck:`false`})]})]})})}function tt({toast:e,onClose:t}){return(0,g.useEffect)(()=>{if(!e)return;let n=window.setTimeout(t,6e3);return()=>window.clearTimeout(n)},[e,t]),e?(0,M.jsxs)(`div`,{className:`toast toast--${e.tone}`,children:[(0,M.jsxs)(`div`,{children:[e.tone===`success`?(0,M.jsx)(Ce,{size:18}):(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:e.title}),e.message?(0,M.jsx)(`small`,{children:e.message}):null]})]}),(0,M.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`关闭通知`,children:(0,M.jsx)(Se,{size:16})})]}):null}function nt(){let[e,t]=(0,g.useState)(`overview`),[n,r]=(0,g.useState)(`checking`),[i,a]=(0,g.useState)(``),[o,s]=O(`cps.web.profileId`,`default`),[c,l]=(0,g.useState)([]),[u,d]=O(`cps.web.manualProviders`,[]),[f,p]=(0,g.useState)(null),[m,h]=(0,g.useState)(Ee),[_,v]=(0,g.useState)(``),[x,S]=(0,g.useState)(!0),[C,w]=(0,g.useState)(!1),[E,D]=(0,g.useState)(null),[ie,k]=(0,g.useState)(null),[oe,ce]=(0,g.useState)([]),[A,le]=(0,g.useState)(null),ue=(0,g.useRef)(0),de=(0,g.useMemo)(()=>{let e=Me(f),t=new Set(e.map(e=>e.id));return[...e.map(e=>({...e,manual:u.includes(e.id)})),...u.filter(e=>!t.has(e)).map(e=>({id:e,sources:[`manual`],configured:!1,current:!1,manual:!0}))]},[f,u]),fe=c.find(e=>e.id===o)??null,pe=(0,g.useRef)(null);pe.current||=he({fetchStatus:(e,t)=>T(`/api/status`,e,t),fetchBackups:(e,t)=>T(`/api/backups`,e,t)});let j=(0,g.useCallback)(async({quiet:e=!1}={})=>{await pe.current({profileId:o,showLoading:!e,onLoading:S,onResult:({status:e,backups:t})=>{p(e),h(t),v(t=>t&&Me(e).some(e=>e.id===t)?t:e.currentProvider)},onError:e=>{k({tone:`error`,title:`状态读取失败`,message:e.message})}})},[o]),N=(0,g.useCallback)(async()=>{let e=await ne();l(e.profiles),s(t=>e.profiles.some(e=>e.id===t)?t:`default`)},[s]),P=(0,g.useCallback)(async()=>{D(null);try{await N(),await j({quiet:!0})}catch{}k({tone:`warning`,title:`配置已变更,请重新确认`,message:`已刷新存储配置和当前状态;未自动重试原操作。`})},[j,N]),ge=(0,g.useCallback)(async e=>{let t=ae(fe,e,f);if(!t){k({tone:`warning`,title:`配置需要刷新`,message:`没有可用的配置版本,请刷新后重新确认操作。`}),N().catch(()=>{});return}if(e.type!==`execute`){D(t);return}w(!0);try{let e={...me(t.profileId),profileRevision:t.profileRevision,provider:t.selectedProvider,keepCount:t.plan.keepCount},n=await T(t.plan.mode===`switch`?`/api/switch/prepare`:`/api/sync/prepare`,t.plan.mode===`switch`?{...e,modelMode:t.plan.modelMode===`auto`?`provider-default`:t.plan.modelMode===`keep`?`keep-root-model`:`explicit`,model:t.plan.modelMode===`custom`?t.plan.model:void 0}:e);D({...t,corePlan:n.plan})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`计划生成失败`,message:e.message})}finally{w(!1)}},[P,N,fe,f]);(0,g.useEffect)(()=>{let e=!1;return ee().then(async t=>{if(!t)throw new y;await N(),e||r(`ready`)}).catch(t=>{e||(r(t instanceof y?`required`:`error`),a(t.message))}),()=>{e=!0}},[N]),(0,g.useEffect)(()=>{n===`ready`&&j()},[n,o]),(0,g.useEffect)(()=>{let e=e=>{r(`required`),a(e.detail||`设备凭证已失效。请重新运行 codex-provider web。`)};return window.addEventListener(`cps:pairing-required`,e),()=>window.removeEventListener(`cps:pairing-required`,e)},[]),(0,g.useEffect)(()=>{if(n!==`ready`)return;let e=!1,t=async()=>{try{let t=await te(ue.current);if(e)return;t.activity?.length&&(ue.current=t.activity[t.activity.length-1].id,ce(e=>[...e,...t.activity].slice(-250))),le(t.activeOperation??null)}catch{}};t();let r=window.setInterval(t,900);return()=>{e=!0,window.clearInterval(r)}},[n]);let _e=(0,g.useCallback)(async()=>{let e=E.plan,n=E.corePlan;D(null),w(!0),t(`activity`);try{let t=await T(e.mode===`switch`?`/api/switch/apply`:`/api/sync/apply`,{schemaVersion:n.schemaVersion,planId:n.planId});k(se(t,{successTitle:e.mode===`switch`?`切换并同步完成`:`同步完成`,partialTitle:e.mode===`switch`?`切换并同步部分完成`:`同步部分完成`,message:`备份:${t.result?.backup?.path??t.result?.result?.backupDir??`已创建`}`})),await j({quiet:!0})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`操作失败`,message:e.message})}finally{w(!1)}},[P,E,j]),ve=(0,g.useCallback)(async e=>{let t=E.backup,n=E.profileId;w(!0);try{let r=await T(`/api/restore/prepare`,{...me(n),profileRevision:E.profileRevision,backupId:t.id,...e});D({...E,type:`restoreApply`,restoreOptions:e,corePlan:r.plan})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`恢复计划生成失败`,message:e.message})}finally{w(!1)}},[P,E]),ye=(0,g.useCallback)(async()=>{let e=E.backup,n=E.corePlan;D(null),w(!0),t(`activity`);try{let t=await T(`/api/restore/apply`,{schemaVersion:n.schemaVersion,planId:n.planId});k(se(t,{successTitle:`备份恢复完成`,partialTitle:`备份恢复部分完成`,message:e.id})),await j({quiet:!0})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`恢复失败`,message:e.message})}finally{w(!1)}},[P,E,j]),xe=(0,g.useCallback)(async()=>{let e=E.keepCount,t=E.profileId;D(null),w(!0);try{let n=await T(`/api/prune`,{...me(t),profileRevision:E.profileRevision,storageRevision:E.storageRevision,keepCount:e});k(se(n,{successTitle:`旧备份清理完成`,partialTitle:`旧备份清理部分完成`,message:`删除 ${n.result?.deletedCount??0} 份,释放 ${Oe(n.result?.freedBytes)}`})),await j({quiet:!0})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`备份清理失败`,message:e.message})}finally{w(!1)}},[P,E,j]),Se=(0,g.useCallback)(()=>k(null),[]),Ce=(0,g.useCallback)(async e=>{try{let t=await T(`/api/profiles/save`,e.revision?{...e,profileRevision:e.revision}:e);D(null),await N(),s(t.profile.id),k({tone:`success`,title:`存储配置已保存`,message:t.profile.name})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`配置保存失败`,message:e.message})}},[P,N,s]),F=(0,g.useCallback)(async()=>{try{await T(`/api/profiles/delete`,{profileId:o,profileRevision:fe?.revision}),s(`default`),await N()}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`配置删除失败`,message:e.message})}},[P,o,N,fe?.revision,s]),we=(0,g.useCallback)(async()=>{await re().catch(()=>{}),r(`required`),a(`此浏览器的设备凭证已失效。重新运行 codex-provider web 即可自动配对。`)},[]),Te=(0,g.useCallback)(e=>{d(t=>[...new Set([...t,e])].sort()),v(e)},[d]),De=(0,g.useCallback)(e=>{d(t=>t.filter(t=>t!==e)),v(f?.currentProvider??``)},[d,f?.currentProvider]);return n===`ready`?(0,M.jsxs)(`div`,{className:`app-shell`,children:[(0,M.jsx)(Pe,{status:f,busy:C||!!A,onRefresh:()=>j()}),(0,M.jsx)(Fe,{view:e,setView:t,status:f,onForgetBrowser:we}),(0,M.jsxs)(`main`,{className:`main-area`,children:[(0,M.jsx)(Ie,{profiles:c,profileId:o,setProfileId:s,status:f,onAddProfile:()=>D({type:`profile`}),onDeleteProfile:F,onRefresh:()=>j(),loading:x,profileSwitchDisabled:C||!!E}),e===`overview`?(0,M.jsx)(We,{status:f,backups:m,providers:de,selectedProvider:_,setSelectedProvider:v,onAddManualProvider:Te,onRemoveManualProvider:De,onExecute:e=>ge({type:`execute`,plan:e,selectedProvider:_}),onRestore:e=>ge({type:`restore`,backup:e}),setView:t,busy:C,loading:x}):null,e===`history`?(0,M.jsx)(qe,{profileId:o,status:f}):null,e===`backups`?(0,M.jsx)(Ge,{backups:m,status:f,busy:C,onRestore:e=>ge({type:`restore`,backup:e}),onPrune:e=>ge({type:`prune`,keepCount:e})}):null,e===`activity`?(0,M.jsx)(Ke,{activity:oe,activeOperation:A}):null]}),E?.type===`execute`?(0,M.jsx)(Xe,{plan:E.plan,corePlan:E.corePlan,status:E.status,selectedProvider:E.selectedProvider,onCancel:()=>D(null),onConfirm:_e}):null,E?.type===`restore`?(0,M.jsx)(Ze,{backup:E.backup,status:E.status,profile:E.profile,onCancel:()=>D(null),onConfirm:ve}):null,E?.type===`restoreApply`?(0,M.jsx)(Qe,{backup:E.backup,corePlan:E.corePlan,onCancel:()=>D(null),onConfirm:ye}):null,E?.type===`prune`?(0,M.jsx)($e,{keepCount:E.keepCount,backups:m,onCancel:()=>D(null),onConfirm:xe}):null,E?.type===`profile`?(0,M.jsx)(et,{onCancel:()=>D(null),onConfirm:Ce}):null,(0,M.jsx)(tt,{toast:ie,onClose:Se})]}):(0,M.jsxs)(`div`,{className:`access-gate`,children:[(0,M.jsx)(be,{size:32}),(0,M.jsx)(`h1`,{children:n===`checking`?`正在完成安全配对`:`需要重新配对`}),(0,M.jsx)(`p`,{children:n===`checking`?`请稍候…`:i||`请重新运行 codex-provider web。`}),n===`checking`?null:(0,M.jsx)(`code`,{children:`codex-provider web`})]})}(0,_.createRoot)(document.getElementById(`root`)).render((0,M.jsx)(g.StrictMode,{children:(0,M.jsx)(nt,{})})); +//# sourceMappingURL=index-CAZ7Ulmk.js.map \ No newline at end of file diff --git a/web/dist/assets/index-CAZ7Ulmk.js.map b/web/dist/assets/index-CAZ7Ulmk.js.map new file mode 100644 index 0000000..b836fde --- /dev/null +++ b/web/dist/assets/index-CAZ7Ulmk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-CAZ7Ulmk.js","names":[],"sources":["../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/scheduler/cjs/scheduler.production.min.js","../../../node_modules/scheduler/index.js","../../../node_modules/react-dom/cjs/react-dom.production.min.js","../../../node_modules/react-dom/index.js","../../../node_modules/react-dom/client.js","../../src/api.js","../../src/hooks.js","../../src/history-requests.js","../../src/operation-state.js","../../src/profile-refresh.js","../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/react/jsx-runtime.js","../../src/icons.jsx","../../src/App.jsx","../../src/main.jsx"],"sourcesContent":["/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1>>1,e=a[d];if(0>>1;dg(C,c))ng(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(ng(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Qa||125d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;cb}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"\")&&(k=k.replace(\"\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e\"+b.valueOf().toString()+\"\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a>=g;e-=g;rg=1<<32-oc(b)+e|c<w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;ww?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&Ng(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=Lg(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Tg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Rg(f.type,f.key,f.props,null,a.mode,h),h.ref=Lg(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=Sg(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);Mg(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=Qg(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Ug=Og(!0),Vg=Og(!1),Wg=Uf(null),Xg=null,Yg=null,Zg=null;function $g(){Zg=Yg=Xg=null}function ah(a){var b=Wg.current;E(Wg);a._currentValue=b}function bh(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}\nfunction ch(a,b){Xg=a;Zg=Yg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(dh=!0),a.firstContext=null)}function eh(a){var b=a._currentValue;if(Zg!==a)if(a={context:a,memoizedValue:b,next:null},null===Yg){if(null===Xg)throw Error(p(308));Yg=a;Xg.dependencies={lanes:0,firstContext:a}}else Yg=Yg.next=a;return b}var fh=null;function gh(a){null===fh?fh=[a]:fh.push(a)}\nfunction hh(a,b,c,d){var e=b.interleaved;null===e?(c.next=c,gh(b)):(c.next=e.next,e.next=c);b.interleaved=c;return ih(a,d)}function ih(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}var jh=!1;function kh(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}\nfunction lh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function mh(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}\nfunction nh(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(K&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return ih(a,c)}e=d.interleaved;null===e?(b.next=b,gh(d)):(b.next=e.next,e.next=b);d.interleaved=b;return ih(a,c)}function oh(a,b,c){b=b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nfunction ph(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction qh(a,b,c,d){var e=a.updateQueue;jh=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var m=a.alternate;null!==m&&(m=m.updateQueue,h=m.lastBaseUpdate,h!==g&&(null===h?m.firstBaseUpdate=l:h.next=l,m.lastBaseUpdate=k))}if(null!==f){var q=e.baseState;g=0;m=l=k=null;h=f;do{var r=h.lane,y=h.eventTime;if((d&r)===r){null!==m&&(m=m.next={eventTime:y,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,\nnext:null});a:{var n=a,t=h;r=b;y=c;switch(t.tag){case 1:n=t.payload;if(\"function\"===typeof n){q=n.call(y,q,r);break a}q=n;break a;case 3:n.flags=n.flags&-65537|128;case 0:n=t.payload;r=\"function\"===typeof n?n.call(y,q,r):n;if(null===r||void 0===r)break a;q=A({},q,r);break a;case 2:jh=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=[h]:r.push(h))}else y={eventTime:y,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===m?(l=m=y,k=q):m=m.next=y,g|=r;\nh=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===m&&(k=q);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=m;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);rh|=g;a.lanes=g;a.memoizedState=q}}\nfunction sh(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;bc?c:4;a(!0);var d=Gh.transition;Gh.transition={};try{a(!1),b()}finally{C=c,Gh.transition=d}}function wi(){return Uh().memoizedState}\nfunction xi(a,b,c){var d=yi(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,c);else if(c=hh(a,b,c,d),null!==c){var e=R();gi(c,a,d,e);Bi(c,b,d)}}\nfunction ii(a,b,c){var d=yi(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,gh(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=hh(a,b,e,d);null!==c&&(e=R(),gi(c,a,d,e),Bi(c,b,d))}}\nfunction zi(a){var b=a.alternate;return a===M||null!==b&&b===M}function Ai(a,b){Jh=Ih=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Bi(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar Rh={readContext:eh,useCallback:P,useContext:P,useEffect:P,useImperativeHandle:P,useInsertionEffect:P,useLayoutEffect:P,useMemo:P,useReducer:P,useRef:P,useState:P,useDebugValue:P,useDeferredValue:P,useTransition:P,useMutableSource:P,useSyncExternalStore:P,useId:P,unstable_isNewReconciler:!1},Oh={readContext:eh,useCallback:function(a,b){Th().memoizedState=[a,void 0===b?null:b];return a},useContext:eh,useEffect:mi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ki(4194308,\n4,pi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ki(4194308,4,a,b)},useInsertionEffect:function(a,b){return ki(4,2,a,b)},useMemo:function(a,b){var c=Th();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=xi.bind(null,M,a);return[d.memoizedState,a]},useRef:function(a){var b=\nTh();a={current:a};return b.memoizedState=a},useState:hi,useDebugValue:ri,useDeferredValue:function(a){return Th().memoizedState=a},useTransition:function(){var a=hi(!1),b=a[0];a=vi.bind(null,a[1]);Th().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=M,e=Th();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===Q)throw Error(p(349));0!==(Hh&30)||di(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;mi(ai.bind(null,d,\nf,a),[a]);d.flags|=2048;bi(9,ci.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=Th(),b=Q.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Kh++;0\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;zj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;eGj&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304)}else{if(!d)if(a=Ch(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Dj(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Gj&&1073741824!==c&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=L.current,G(L,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Hj(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(fj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Ij(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return zh(),E(Wf),E(H),Eh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Bh(b),null;case 13:E(L);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(L),null;case 4:return zh(),null;case 10:return ah(b.type._context),null;case 22:case 23:return Hj(),\nnull;case 24:return null;default:return null}}var Jj=!1,U=!1,Kj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Lj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Mj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Nj=!1;\nfunction Oj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Ci(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Nj;Nj=!1;return n}\nfunction Pj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Mj(b,c,f)}e=e.next}while(e!==d)}}function Qj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Rj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Sj(a){var b=a.alternate;null!==b&&(a.alternate=null,Sj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Tj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Uj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Tj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Vj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Vj(a,b,c),a=a.sibling;null!==a;)Vj(a,b,c),a=a.sibling}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}var X=null,Xj=!1;function Yj(a,b,c){for(c=c.child;null!==c;)Zj(a,b,c),c=c.sibling}\nfunction Zj(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Lj(c,b);case 6:var d=X,e=Xj;X=null;Yj(a,b,c);X=d;Xj=e;null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Xj;X=c.stateNode.containerInfo;Xj=!0;\nYj(a,b,c);X=d;Xj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Mj(c,b,g):0!==(f&4)&&Mj(c,b,g));e=e.next}while(e!==d)}Yj(a,b,c);break;case 1:if(!U&&(Lj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Yj(a,b,c);break;case 21:Yj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Yj(a,b,c),U=d):Yj(a,b,c);break;default:Yj(a,b,c)}}function ak(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Kj);b.forEach(function(b){var d=bk.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction ck(a,b){var c=b.deletions;if(null!==c)for(var d=0;de&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*lk(d/1960))-d;if(10a?16:a;if(null===wk)var d=!1;else{a=wk;wk=null;xk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;kB()-fk?Kk(a,0):rk|=c);Dk(a,b)}function Yk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=R();a=ih(a,b);null!==a&&(Ac(a,b,c),Dk(a,c))}function uj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Yk(a,c)}\nfunction bk(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Yk(a,c)}var Vk;\nVk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)dh=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return dh=!1,yj(a,b,c);dh=0!==(a.flags&131072)?!0:!1}else dh=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;ij(a,b);a=b.pendingProps;var e=Yf(b,H.current);ch(b,c);e=Nh(null,b,d,a,e,c);var f=Sh();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,kh(b),e.updater=Ei,b.stateNode=e,e._reactInternals=b,Ii(b,d,a,c),b=jj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Xi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{ij(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=Zk(d);a=Ci(d,a);switch(e){case 0:b=cj(null,b,d,a,c);break a;case 1:b=hj(null,b,d,a,c);break a;case 11:b=Yi(null,b,d,a,c);break a;case 14:b=$i(null,b,d,Ci(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),cj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),hj(a,b,d,e,c);case 3:a:{kj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;lh(a,b);qh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ji(Error(p(423)),b);b=lj(a,b,d,c,e);break a}else if(d!==e){e=Ji(Error(p(424)),b);b=lj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Vg(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=Zi(a,b,c);break a}Xi(a,b,d,c)}b=b.child}return b;case 5:return Ah(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\ngj(a,b),Xi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return oj(a,b,c);case 4:return yh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Ug(b,null,d,c):Xi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),Yi(a,b,d,e,c);case 7:return Xi(a,b,b.pendingProps,c),b.child;case 8:return Xi(a,b,b.pendingProps.children,c),b.child;case 12:return Xi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Wg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=Zi(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=mh(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);bh(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);bh(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Xi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,ch(b,c),e=eh(e),d=d(e),b.flags|=1,Xi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Ci(d,b.pendingProps),e=Ci(d.type,e),$i(a,b,d,e,c);case 15:return bj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),ij(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,ch(b,c),Gi(b,d,e),Ii(b,d,e,c),jj(null,b,d,!0,a,c);case 19:return xj(a,b,c);case 22:return dj(a,b,c)}throw Error(p(156,b.tag));};function Fk(a,b){return ac(a,b)}\nfunction $k(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new $k(a,b,c,d)}function aj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction Zk(a){if(\"function\"===typeof a)return aj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction Pg(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Rg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)aj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Tg(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return pj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Tg(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function pj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function Qg(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction Sg(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction al(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function bl(a,b,c,d,e,f,g,h,k){a=new al(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};kh(f);return a}function cl(a,b,c){var d=3 ({}));\r\n if (!response.ok || !payload.deviceCredential) {\r\n throw new PairingRequiredError(payload.error ?? \"配对链接无效、已过期或已被使用。请重新运行 codex-provider web。\");\r\n }\r\n window.localStorage.setItem(DEVICE_STORAGE_KEY, payload.deviceCredential);\r\n window.history.replaceState(null, \"\", `${window.location.pathname}${window.location.search}`);\r\n return true;\r\n}\r\n\r\nfunction deviceHeaders() {\r\n return { \"X-Codex-Provider-Device\": window.localStorage.getItem(DEVICE_STORAGE_KEY) ?? \"\" };\r\n}\r\n\r\nexport function toRequestError(payload, status, fallback) {\n const errorCode = payload.code ?? payload.coreError?.code;\n if (status === 409 && ([\n \"PROFILE_REVISION_REQUIRED\",\n \"PROFILE_CHANGED\",\n \"STORAGE_REVISION_REQUIRED\",\n \"STORAGE_CHANGED\"\n ].includes(errorCode) || [\"PLAN_EXPIRED\", \"STALE_STATE\"].includes(errorCode))) {\n return new ProfileRevisionError(errorCode, payload.error, payload.profile);\n }\n return new Error(payload.error ?? fallback);\r\n}\r\n\r\nasync function parseResponse(response, fallback) {\r\n const payload = await response.json().catch(() => ({}));\r\n if (!response.ok) {\r\n if (payload.code === \"PAIRING_REQUIRED\") {\r\n window.dispatchEvent(new CustomEvent(\"cps:pairing-required\", { detail: payload.error }));\r\n throw new PairingRequiredError(payload.error);\r\n }\r\n throw toRequestError(payload, response.status, fallback);\r\n }\r\n return payload;\r\n}\r\n\r\nexport async function apiRequest(path, body = {}, { signal } = {}) {\r\n const response = await fetch(path, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n ...deviceHeaders()\r\n },\r\n body: JSON.stringify(body),\r\n signal\r\n });\r\n return parseResponse(response, `Request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function getActivity(after = 0) {\r\n const response = await fetch(`/api/activity?after=${after}`, {\r\n headers: deviceHeaders()\r\n });\r\n return parseResponse(response, `Activity request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function getProfiles() {\r\n const response = await fetch(\"/api/profiles\", { headers: deviceHeaders() });\r\n return parseResponse(response, `Profile request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function forgetThisBrowser() {\r\n try {\r\n await apiRequest(\"/api/access/forget\");\r\n } finally {\r\n window.localStorage.removeItem(DEVICE_STORAGE_KEY);\r\n }\r\n}\r\n\r\nexport async function getHistory(body = {}, options = {}) {\r\n return apiRequest(\"/api/history\", body, options);\r\n}\r\n\r\nexport async function getHistorySession(body = {}, options = {}) {\r\n return apiRequest(\"/api/history/session\", body, options);\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\nexport function usePersistentState(key, initialValue) {\r\n const [value, setValue] = useState(() => {\r\n try {\r\n const stored = window.localStorage.getItem(key);\r\n return stored ? JSON.parse(stored) : initialValue;\r\n } catch {\r\n return initialValue;\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n window.localStorage.setItem(key, JSON.stringify(value));\r\n }, [key, value]);\r\n\r\n return [value, setValue];\r\n}\r\n","export function createLatestRequestGate() {\r\n let sequence = 0;\r\n let controller = null;\r\n return {\r\n begin() {\r\n controller?.abort();\r\n controller = new AbortController();\r\n sequence += 1;\r\n return { sequence, controller, signal: controller.signal };\r\n },\r\n isLatest(candidate) {\r\n return candidate === sequence;\r\n },\r\n cancel() {\r\n controller?.abort();\r\n sequence += 1;\r\n }\r\n };\r\n}\r\n\r\nexport function scheduleDebounced(callback, delay = 300, timers = globalThis) {\r\n const id = timers.setTimeout(callback, delay);\r\n return () => timers.clearTimeout(id);\r\n}\r\n","export function captureProfileOperation(profile, operation, status) {\n if (!profile?.id\n || !profile?.revision\n || status?.profileId !== profile.id\n || status?.profileRevision !== profile.revision) return null;\n return {\n ...operation,\r\n profile: { ...profile },\r\n profileId: profile.id,\n profileRevision: profile.revision,\n status: { ...status }\n };\n}\n\r\nexport function skippedLockedRolloutFiles(payload) {\n const files = payload?.result?.result?.skippedLockedRolloutFiles\n ?? payload?.result?.skippedLockedRolloutFiles\n ?? payload?.skippedLockedRolloutFiles\n ?? [];\n return Array.isArray(files) ? files.filter(Boolean) : [];\r\n}\r\n\r\nexport function operationToast(payload, { successTitle, partialTitle, message }) {\r\n const skipped = skippedLockedRolloutFiles(payload);\r\n const partial = payload?.result?.outcome === \"partial\" || payload?.outcome === \"partial\" || skipped.length > 0;\r\n if (!partial) return { tone: \"success\", title: successTitle, message };\r\n const skippedDetail = skipped.length\r\n ? `已跳过 ${skipped.length} 个被占用的 rollout 文件:${skipped.join(\"、\")}`\r\n : \"部分项目未完成;请查看活动日志后重试。\";\r\n return {\r\n tone: \"warning\",\r\n title: partialTitle,\r\n message: [message, skippedDetail].filter(Boolean).join(\";\")\r\n };\r\n}\r\n\r\nfunction normalizeHistoryPath(path, platform) {\r\n const normalized = String(path ?? \"\").replaceAll(\"\\\\\", \"/\").replace(/\\/{2,}/g, \"/\").replace(/\\/$/, \"\");\r\n return platform === \"win32\" ? normalized.toLowerCase() : normalized;\r\n}\r\n\r\nexport function dedupeHistorySessions(sessions = [], { platform = typeof process !== \"undefined\" ? process.platform : \"browser\" } = {}) {\r\n const seen = new Set();\r\n return sessions.filter((session, index) => {\r\n const threadId = session?.threadId ?? session?.id;\r\n const rolloutPath = session?.rolloutPath ?? session?.filePath ?? session?.rolloutFile ?? session?.path;\r\n const key = threadId ? `thread:${threadId}` : rolloutPath ? `rollout:${normalizeHistoryPath(rolloutPath, platform)}` : `item:${index}`;\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n}\r\n\r\nfunction normalizeStoragePath(value, { caseInsensitive = false } = {}) {\r\n const normalized = String(value ?? \"\").replace(/[\\\\/]+$/, \"\").replaceAll(\"\\\\\", \"/\");\r\n return caseInsensitive ? normalized.toLowerCase() : normalized;\r\n}\r\n\r\nfunction storagePathsEqual(left, right, options) {\r\n return Boolean(left && right && normalizeStoragePath(left, options) === normalizeStoragePath(right, options));\r\n}\r\n\r\nfunction storageParentPath(value) {\r\n const normalized = String(value ?? \"\").replace(/[\\\\/]+$/, \"\");\r\n const separatorIndex = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\r\n if (separatorIndex < 0) return \"\";\r\n if (separatorIndex === 0) return normalized.slice(0, 1);\r\n if (separatorIndex === 2 && /^[A-Za-z]:/.test(normalized)) return normalized.slice(0, 3);\r\n return normalized.slice(0, separatorIndex);\r\n}\r\n\r\nexport function resolveRestoreTargetSqliteHome(status, backup) {\r\n const currentDatabasePath = status?.stateDbLocation?.path;\r\n if (currentDatabasePath) return storageParentPath(currentDatabasePath);\r\n const backupMetadata = backup?.metadata;\r\n const comparison = { caseInsensitive: status?.pathComparisonCaseInsensitive === true };\r\n if (Number(backupMetadata?.version) >= 2\r\n && status?.sqliteHomeSource === \"default\"\r\n && storagePathsEqual(backupMetadata?.sqliteHome, status?.codexHome, comparison)) {\r\n return status.codexHome;\r\n }\r\n return status?.sqliteHome ?? \"\";\r\n}\r\n\r\nexport function restoreRelocationState({ backup, profile, targetSqliteHome, restoreDatabase, restoreConfig, sqliteSupported, pathComparisonCaseInsensitive = false }) {\r\n const sourceSqliteHome = backup?.metadata?.sqliteHome;\r\n const explicitSqliteHome = profile?.sqliteHome?.trim() ?? \"\";\r\n const requiresRelocation = Boolean(\r\n restoreDatabase\r\n && sourceSqliteHome\r\n && targetSqliteHome\r\n && !storagePathsEqual(sourceSqliteHome, targetSqliteHome, { caseInsensitive: pathComparisonCaseInsensitive })\r\n );\r\n const missingExplicitTarget = requiresRelocation && !explicitSqliteHome;\r\n const configRestoreConflict = requiresRelocation && restoreConfig;\r\n return {\r\n requiresRelocation,\r\n missingExplicitTarget,\r\n configRestoreConflict,\r\n canSubmit: Boolean(sqliteSupported) && !missingExplicitTarget && !configRestoreConflict\r\n };\r\n}\r\n","import { createLatestRequestGate } from \"./history-requests.js\";\r\n\r\nexport function storagePayload(profileId) {\r\n return { profileId: profileId || \"default\" };\r\n}\r\n\r\n// Loads status and backups for a storage profile while guaranteeing that only\r\n// the most recently started refresh may touch the UI. A stale request — for\r\n// example one started for profile A before the user switched to profile B —\r\n// is aborted and its results, errors, and loading transitions are discarded,\r\n// even when it finishes after the newer request.\r\nexport function createProfileRefresh({ fetchStatus, fetchBackups, gate = createLatestRequestGate() }) {\r\n const refresh = async ({ profileId, showLoading = true, onLoading, onResult, onError }) => {\r\n const { controller, sequence } = gate.begin();\r\n if (showLoading) onLoading?.(true);\r\n try {\r\n const storage = storagePayload(profileId);\r\n const [statusPayload, backupPayload] = await Promise.all([\r\n fetchStatus(storage, { signal: controller.signal }),\r\n fetchBackups(storage, { signal: controller.signal })\r\n ]);\r\n if (!gate.isLatest(sequence)) return false;\r\n onResult?.({ profileId, status: statusPayload.status, backups: backupPayload });\r\n return true;\r\n } catch (error) {\r\n if (error?.name === \"AbortError\" || !gate.isLatest(sequence)) return false;\r\n onError?.(error);\r\n return false;\r\n } finally {\r\n if (gate.isLatest(sequence)) onLoading?.(false);\r\n }\r\n };\r\n refresh.cancel = () => gate.cancel();\r\n return refresh;\r\n}\r\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from \"react\";\r\n\r\nfunction Icon({ children, size = 18, className = \"\" }) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nexport const RefreshIcon = (props) => ;\r\nexport const DatabaseIcon = (props) => ;\r\nexport const HistoryIcon = (props) => ;\r\nexport const ActivityIcon = (props) => ;\r\nexport const OverviewIcon = (props) => ;\r\nexport const ShieldIcon = (props) => ;\r\nexport const ChevronIcon = (props) => ;\r\nexport const XIcon = (props) => ;\r\nexport const CheckIcon = (props) => ;\r\nexport const AlertIcon = (props) => ;\r\nexport const FolderIcon = (props) => ;\r\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nimport {\r\n PairingRequiredError,\r\n ProfileRevisionError,\r\n apiRequest,\r\n forgetThisBrowser,\r\n getActivity,\r\n getHistory,\r\n getHistorySession,\r\n getProfiles,\r\n initializeAccess\r\n} from \"./api.js\";\r\nimport { usePersistentState } from \"./hooks.js\";\r\nimport { createLatestRequestGate, scheduleDebounced } from \"./history-requests.js\";\r\nimport { captureProfileOperation, dedupeHistorySessions, operationToast, resolveRestoreTargetSqliteHome, restoreRelocationState } from \"./operation-state.js\";\r\nimport { createProfileRefresh, storagePayload } from \"./profile-refresh.js\";\r\nimport {\r\n ActivityIcon,\r\n AlertIcon,\r\n CheckIcon,\r\n ChevronIcon,\r\n DatabaseIcon,\r\n FolderIcon,\r\n HistoryIcon,\r\n OverviewIcon,\r\n RefreshIcon,\r\n ShieldIcon,\r\n XIcon\r\n} from \"./icons.jsx\";\r\n\r\nconst NAV_ITEMS = [\r\n { id: \"overview\", label: \"概览\", icon: OverviewIcon },\r\n { id: \"history\", label: \"聊天记录\", icon: HistoryIcon },\r\n { id: \"backups\", label: \"备份\", icon: HistoryIcon },\r\n { id: \"activity\", label: \"活动\", icon: ActivityIcon }\r\n];\r\n\r\nconst EMPTY_BACKUPS = { backupRoot: \"\", backups: [] };\r\n\r\nfunction formatNumber(value) {\r\n return new Intl.NumberFormat(\"zh-CN\").format(Number(value) || 0);\r\n}\r\n\r\nfunction formatBytes(bytes) {\r\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\r\n let value = Number(bytes) || 0;\r\n let index = 0;\r\n while (value >= 1024 && index < units.length - 1) {\r\n value /= 1024;\r\n index += 1;\r\n }\r\n return index === 0 ? `${value} B` : `${value.toFixed(value >= 10 ? 1 : 2).replace(/\\.0$/, \"\")} ${units[index]}`;\r\n}\r\n\r\nfunction formatDate(value) {\r\n if (!value) return \"未知时间\";\r\n return new Intl.DateTimeFormat(\"zh-CN\", {\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n hour12: false\r\n }).format(new Date(value));\r\n}\r\n\r\nfunction renderInlineMarkdown(text, keyPrefix) {\r\n const parts = text.split(/(`[^`]+`|\\*\\*[^*]+\\*\\*|\\*[^*]+\\*)/g);\r\n return parts.map((part, index) => {\r\n if (part.startsWith(\"`\") && part.endsWith(\"`\")) return {part.slice(1, -1)};\r\n if (part.startsWith(\"**\") && part.endsWith(\"**\")) return {part.slice(2, -2)};\r\n if (part.startsWith(\"*\") && part.endsWith(\"*\")) return {part.slice(1, -1)};\r\n return {part};\r\n });\r\n}\r\n\r\nfunction SafeMarkdown({ text }) {\r\n const blocks = String(text ?? \"\").split(/(```[^\\n]*\\n[\\s\\S]*?```)/g);\r\n return blocks.map((block, index) => {\r\n if (block.startsWith(\"```\") && block.endsWith(\"```\")) {\r\n const lines = block.slice(3, -3).replace(/^\\w*\\n/, \"\");\r\n return
{lines}
;\r\n }\r\n return block.split(\"\\n\").map((line, lineIndex, lines) => {renderInlineMarkdown(line, `${index}-${lineIndex}`)}{lineIndex < lines.length - 1 ?
: null}
);\r\n });\r\n}\r\n\r\nfunction providersFromStatus(status) {\r\n if (!status) return [];\r\n const sources = new Map();\r\n const add = (values, source) => {\r\n for (const value of values ?? []) {\r\n if (!value || value === \"(missing)\") continue;\r\n const bucket = sources.get(value) ?? new Set();\r\n bucket.add(source);\r\n sources.set(value, bucket);\r\n }\r\n };\r\n add(status.configuredProviders, \"config\");\r\n add(Object.keys(status.rolloutCounts?.sessions ?? {}), \"rollout\");\r\n add(Object.keys(status.rolloutCounts?.archived_sessions ?? {}), \"rollout\");\r\n add(Object.keys(status.sqliteCounts?.sessions ?? {}), \"sqlite\");\r\n add(Object.keys(status.sqliteCounts?.archived_sessions ?? {}), \"sqlite\");\r\n add([status.currentProvider], \"config\");\r\n return [...sources.entries()]\r\n .map(([id, providerSources]) => ({\r\n id,\r\n sources: [...providerSources],\r\n configured: status.configuredProviders?.includes(id),\r\n current: id === status.currentProvider\r\n }))\r\n .sort((left, right) => Number(right.current) - Number(left.current) || left.id.localeCompare(right.id));\r\n}\r\n\r\nfunction StatusDot({ tone = \"neutral\" }) {\r\n return ;\r\n}\r\n\r\nfunction AppHeader({ status, busy, onRefresh }) {\r\n const healthy = status?.sqliteAccess?.supported !== false && !status?.sqliteCounts?.unreadable;\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
Codex Provider Sync
\r\n
本机元数据一致性工具
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {busy ? \"操作执行中\" : healthy ? \"本地服务就绪\" : \"需要检查\"}\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Sidebar({ view, setView, status, onForgetBrowser }) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction StorageBar({ profiles, profileId, setProfileId, status, onAddProfile, onDeleteProfile, onRefresh, loading, profileSwitchDisabled }) {\r\n return (\r\n
\r\n \r\n \r\n \r\n {profileId !== \"default\" ? : null}\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction ProviderBars({ title, counts, currentProvider }) {\r\n const entries = Object.entries(counts ?? {}).sort((left, right) => right[1] - left[1]);\r\n const total = entries.reduce((sum, [, count]) => sum + count, 0);\r\n return (\r\n
\r\n
\r\n {title}\r\n {formatNumber(total)}\r\n
\r\n
\r\n {entries.length === 0 ?
无记录
: entries.map(([provider, count]) => (\r\n
\r\n
\r\n {provider}\r\n {formatNumber(count)}\r\n
\r\n
\r\n \r\n
\r\n
\r\n ))}\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction StatusPanel({ status, loading }) {\r\n const rolloutTotal = Object.values(status?.rolloutCounts?.sessions ?? {}).reduce((sum, value) => sum + value, 0)\r\n + Object.values(status?.rolloutCounts?.archived_sessions ?? {}).reduce((sum, value) => sum + value, 0);\r\n const sqliteTotal = Object.values(status?.sqliteCounts?.sessions ?? {}).reduce((sum, value) => sum + value, 0)\r\n + Object.values(status?.sqliteCounts?.archived_sessions ?? {}).reduce((sum, value) => sum + value, 0);\r\n const aligned = status?.alignment?.aligned;\r\n return (\r\n
\r\n
\r\n
\r\n

状态总览

\r\n

比较 rollout 文件、SQLite 线程索引和当前 Provider。

\r\n
\r\n
\r\n {loading ? : aligned ? : }\r\n {loading ? \"正在检查\" : aligned ? \"Provider 元数据已对齐\" : \"发现不一致\"}\r\n
\r\n
\r\n\r\n
\r\n
\r\n 当前 Provider\r\n {status?.currentProvider ?? \"—\"}\r\n {status?.currentProviderImplicit ? \"隐式默认\" : \"config.toml 根级配置\"}\r\n
\r\n
\r\n Rollout 文件\r\n {formatNumber(rolloutTotal)}\r\n sessions + archived\r\n
\r\n
\r\n SQLite threads\r\n {status?.sqliteCounts?.unreadable ? \"不可读\" : formatNumber(sqliteTotal)}\r\n {status?.stateDbLocation?.source ?? \"未定位数据库\"}\r\n
\r\n
\r\n 托管备份\r\n {formatNumber(status?.backupSummary?.count)}\r\n {formatBytes(status?.backupSummary?.totalBytes)}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Rollout files
\r\n \r\n \r\n
\r\n
\r\n
\r\n
SQLite state
\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Warnings({ status }) {\r\n const items = [];\r\n if (status?.sqliteAccess?.supported === false) {\r\n items.push({ tone: \"danger\", title: \"SQLite 路径不可安全访问\", detail: status.sqliteAccess.message });\r\n }\r\n if (status?.sqliteCounts?.unreadable) {\r\n items.push({ tone: \"danger\", title: \"SQLite 当前不可读\", detail: status.sqliteCounts.error });\r\n }\r\n if (status?.lockedRolloutFiles?.length) {\r\n items.push({ tone: \"warning\", title: `${status.lockedRolloutFiles.length} 个 rollout 文件正在使用`, detail: \"同步会跳过这些活跃文件;会话结束后可再次执行。\" });\r\n }\r\n if (status?.encryptedContentWarning) {\r\n items.push({ tone: \"warning\", title: \"检测到 encrypted_content\", detail: status.encryptedContentWarning });\r\n }\r\n const repairs = status?.sqliteRepairStats;\r\n if (repairs?.userEventRowsNeedingRepair || repairs?.cwdRowsNeedingRepair) {\r\n items.push({ tone: \"info\", title: \"SQLite 有待修复字段\", detail: `user-event ${repairs.userEventRowsNeedingRepair ?? 0},cwd ${repairs.cwdRowsNeedingRepair ?? 0}` });\r\n }\r\n if (items.length === 0) return null;\r\n return (\r\n
\r\n {items.map((item, index) => (\r\n
\r\n \r\n
{item.title}{item.detail}
\r\n
\r\n ))}\r\n
\r\n );\r\n}\r\n\r\nfunction ProjectVisibility({ projects = [] }) {\r\n return (\r\n
\r\n
\r\n

项目可见性

检查 Desktop 项目路径、全局排序和首屏 50 条命中。

\r\n
\r\n
\r\n \r\n \r\n \r\n {projects.length === 0 ? (\r\n \r\n ) : projects.map((project) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
项目根目录交互会话首屏RanksCWD 精确匹配Provider
没有可显示的项目诊断。
{project.root}{project.interactiveThreads}{project.firstPageThreads}/50{project.rankPreview || \"—\"}{project.exactCwdMatches}/{project.interactiveThreads}{Object.entries(project.providerCounts ?? {}).map(([provider, count]) => `${provider} ${count}`).join(\" · \") || \"—\"}
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction SegmentedControl({ value, onChange, disabled }) {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nfunction ExecutionPanel({ status, providers, selectedProvider, setSelectedProvider, onAddManualProvider, onRemoveManualProvider, onRequestExecute, busy }) {\r\n const [mode, setMode] = usePersistentState(\"cps.web.mode\", \"sync\");\r\n const [modelMode, setModelMode] = usePersistentState(\"cps.web.modelMode\", \"auto\");\r\n const [customModel, setCustomModel] = usePersistentState(\"cps.web.customModel\", \"\");\r\n const [keepCount, setKeepCount] = usePersistentState(\"cps.web.keepCount\", 5);\r\n const [manualProvider, setManualProvider] = useState(\"\");\r\n const selectedOption = providers.find((provider) => provider.id === selectedProvider);\r\n const switchAllowed = selectedOption?.configured;\r\n const validManualProvider = /^[A-Za-z0-9_.-]+$/.test(manualProvider.trim());\r\n const sqliteUnsupported = status?.sqliteAccess?.supported === false;\r\n const executeDisabled = busy || !selectedProvider || sqliteUnsupported || status?.sqliteCounts?.unreadable;\r\n\r\n return (\r\n
\r\n
\r\n

执行同步

所有写操作都会先创建备份。执行前请关闭 Codex CLI、App 和 app-server。

\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n setManualProvider(event.target.value)}\r\n placeholder=\"手动添加 Provider ID\"\r\n spellCheck=\"false\"\r\n disabled={busy}\r\n />\r\n {\r\n onAddManualProvider(manualProvider.trim());\r\n setManualProvider(\"\");\r\n }}\r\n >\r\n 添加\r\n \r\n {selectedOption?.manual ? : null}\r\n
\r\n\r\n {mode === \"switch\" ? (\r\n
\r\n 根级 model\r\n \r\n \r\n \r\n
\r\n ) : null}\r\n\r\n {sqliteUnsupported ?
此 SQLite 布局仅供诊断{status?.sqliteAccess?.message || \"当前 SQLite 路径不可由 Web UI 安全写入,因此已禁用执行同步。\"}
: null}\r\n\r\n
修改前创建 metadata v2 备份,并记录 SQLite Home
\r\n onRequestExecute({ mode, modelMode, model: customModel.trim(), keepCount })}\r\n >\r\n {busy ? : }\r\n {busy ? \"正在执行…\" : mode === \"switch\" ? \"切换并同步\" : \"执行同步\"}\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction RecentBackups({ backups, onViewAll, onRestore, restoreDisabled }) {\r\n return (\r\n
\r\n
\r\n

最近备份

{backups.backupRoot || \"同步后将在 Codex Home 下创建备份\"}

\r\n \r\n
\r\n
\r\n {backups.backups.length === 0 ?
尚无由本工具创建的备份。
: backups.backups.slice(0, 3).map((backup) => (\r\n
\r\n
\r\n
{formatDate(backup.metadata.createdAt)}{backup.metadata.targetProvider} · {backup.metadata.changedSessionFiles ?? 0} 个 rollout
\r\n
{formatBytes(backup.sizeBytes)}
\r\n \r\n
\r\n ))}\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Overview({ status, backups, providers, selectedProvider, setSelectedProvider, onAddManualProvider, onRemoveManualProvider, onExecute, onRestore, setView, busy, loading }) {\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n setView(\"backups\")} onRestore={onRestore} restoreDisabled={status?.sqliteAccess?.supported === false} />\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction BackupsView({ backups, status, busy, onRestore, onPrune }) {\r\n const [keepCount, setKeepCount] = usePersistentState(\"cps.web.keepCount\", 5);\r\n const restoreDisabled = status?.sqliteAccess?.supported === false;\r\n return (\r\n
\r\n
\r\n

备份

管理当前 Codex Home 下由本工具创建的 metadata v2 备份。

\r\n
\r\n
\r\n
\r\n
{backups.backupRoot || status?.backupRoot || \"—\"}{backups.backups.length} 份 · {formatBytes(backups.backups.reduce((sum, backup) => sum + backup.sizeBytes, 0))}
\r\n
\r\n {backups.backups.length === 0 ?
还没有备份执行一次同步或切换后,备份会显示在这里。
: backups.backups.map((backup) => (\r\n
\r\n
{formatDate(backup.metadata.createdAt)}{backup.id}
\r\n
Provider {backup.metadata.targetProvider}Rollout {backup.metadata.changedSessionFiles ?? 0}SQLite {backup.metadata.sqliteDbFiles?.length ? \"已包含\" : \"未包含\"}
\r\n
SQLite Home{backup.metadata.sqliteHome ?? \"旧版 metadata 未记录\"}
\r\n
{formatBytes(backup.sizeBytes)}
\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction ActivityView({ activity, activeOperation }) {\r\n return (\r\n
\r\n

活动日志

当前 Web UI 会话中的状态刷新、同步阶段和操作结果。

{activeOperation ?
{activeOperation.kind}
: null}
\r\n
\r\n
Activity log{activity.length} entries
\r\n
\r\n {activity.length === 0 ?
等待操作…
: activity.map((entry) => (\r\n
\r\n \r\n {entry.level}\r\n {entry.message}\r\n {typeof entry.detail === \"string\" ? {entry.detail} : null}\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction HistoryView({ profileId, status }) {\r\n const [query, setQuery] = useState(\"\");\r\n const [committedQuery, setCommittedQuery] = useState(\"\");\r\n const [provider, setProvider] = useState(\"\");\r\n const [project, setProject] = useState(\"\");\r\n const [archived, setArchived] = useState(\"all\");\r\n const [page, setPage] = useState(1);\r\n const [history, setHistory] = useState({ sessions: [], total: 0, pageSize: 50, hasNextPage: false });\r\n const [selectedId, setSelectedId] = useState(\"\");\r\n const [detail, setDetail] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [detailLoading, setDetailLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n const listRequest = useRef(null);\r\n const detailRequest = useRef(null);\r\n if (!listRequest.current) listRequest.current = createLatestRequestGate();\r\n if (!detailRequest.current) detailRequest.current = createLatestRequestGate();\r\n const providers = providersFromStatus(status);\r\n const projects = [...new Set((status?.projectThreadVisibility ?? []).map((item) => item.root))];\r\n\r\n useEffect(() => {\r\n listRequest.current.cancel();\r\n detailRequest.current.cancel();\r\n setQuery(\"\");\r\n setCommittedQuery(\"\");\r\n setProvider(\"\");\r\n setProject(\"\");\r\n setArchived(\"all\");\r\n setPage(1);\r\n setHistory({ sessions: [], total: 0, pageSize: 50, hasNextPage: false });\r\n setSelectedId(\"\");\r\n setDetail(null);\r\n setError(\"\");\r\n }, [profileId]);\r\n\r\n useEffect(() => {\r\n return scheduleDebounced(() => setCommittedQuery(query), 300, window);\r\n }, [query]);\r\n\r\n const loadList = useCallback(async () => {\r\n const { controller, sequence } = listRequest.current.begin();\r\n setLoading(true); setError(\"\");\r\n try {\r\n const payload = await getHistory({ ...storagePayload(profileId), page, pageSize: 50, query: committedQuery, provider, project, archived }, { signal: controller.signal });\r\n if (!listRequest.current.isLatest(sequence)) return;\r\n const nextHistory = { ...payload.history, sessions: dedupeHistorySessions(payload.history?.sessions) };\r\n setHistory(nextHistory);\r\n setSelectedId((current) => nextHistory.sessions.some((session) => session.id === current) ? current : nextHistory.sessions[0]?.id ?? \"\");\r\n } catch (requestError) {\r\n if (requestError.name !== \"AbortError\" && listRequest.current.isLatest(sequence)) setError(requestError.message);\r\n } finally {\r\n if (listRequest.current.isLatest(sequence)) setLoading(false);\r\n }\r\n }, [profileId, page, committedQuery, provider, project, archived]);\r\n\r\n useEffect(() => {\r\n loadList();\r\n return () => listRequest.current.cancel();\r\n }, [loadList]);\r\n useEffect(() => {\r\n detailRequest.current.cancel();\r\n if (!selectedId) { setDetail(null); setDetailLoading(false); return undefined; }\r\n const { controller, sequence } = detailRequest.current.begin();\r\n setDetail(null);\r\n setDetailLoading(true);\r\n setError(\"\");\r\n getHistorySession({ ...storagePayload(profileId), sessionId: selectedId }, { signal: controller.signal })\r\n .then((payload) => { if (detailRequest.current.isLatest(sequence)) setDetail(payload.history); })\r\n .catch((requestError) => { if (requestError.name !== \"AbortError\" && detailRequest.current.isLatest(sequence)) setError(requestError.message); })\r\n .finally(() => { if (detailRequest.current.isLatest(sequence)) setDetailLoading(false); });\r\n return () => controller.abort();\r\n }, [profileId, selectedId]);\r\n\r\n const updateFilter = (setter) => (event) => { setter(event.target.value); setPage(1); };\r\n return (\r\n
\r\n

聊天记录

从 rollout 文件读取历史会话,只读查看,不修改本地数据。

\r\n
\r\n { if (event.key === \"Enter\") { setCommittedQuery(query); setPage(1); } }} placeholder=\"搜索标题、项目、Provider 或消息内容\" />\r\n \r\n \r\n \r\n
\r\n {error ?
{error}
: null}\r\n
\r\n
\r\n
{history.total} 个会话第 {history.page} 页
\r\n
\r\n {loading && !history.sessions.length ?
读取中…
: null}\r\n {!loading && !history.sessions.length ?
没有匹配的会话
: null}\r\n {history.sessions.map((session) => )}\r\n
\r\n
{page}
\r\n
\r\n
\r\n {detailLoading ?
正在读取会话
: !detail ?
选择一个会话聊天内容将在这里显示。
: <>

{detail.session.title}

{detail.session.cwd || \"未知项目\"} · {detail.session.provider} · {detail.session.messageCount} 条消息

{detail.session.archived ? \"已归档\" : \"活跃\"}
{detail.truncated ?
仅显示最近 {detail.returnedMessageCount} 条消息。
: null}
{detail.messages.map((message) =>
{message.role === \"user\" ? \"你\" : \"Codex\"}
)}
}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Modal({ title, children, confirmLabel, onConfirm, onCancel, tone = \"primary\", confirmDisabled = false }) {\r\n return (\r\n
event.target === event.currentTarget && onCancel()}>\r\n
\r\n

{title}

\r\n
{children}
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction CorePlanDetails({ plan }) {\n if (!plan) return null;\n const impact = plan.impact ?? {};\n return (\n <>\n
\n
计划有效期
{formatDate(plan.expiresAt)}
\n
Rollout 变更
{impact.rolloutFilesToChange ?? 0}
\n
SQLite 行变更
{impact.sqliteRowsToChange ?? 0}
\n
当前锁定 Rollout
{Array.isArray(impact.lockedRolloutFiles) ? impact.lockedRolloutFiles.length : (impact.lockedRolloutFiles ?? 0)}
\n
\n {plan.warnings?.map((warning) =>
计划警告{warning}
)}\n \n );\n}\n\nfunction ExecuteModal({ plan, corePlan, status, selectedProvider, onCancel, onConfirm }) {\n return (\n \r\n
请确认 Codex 已完全关闭关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。
\r\n
\r\n
Codex Home
{status?.codexHome}
\r\n
SQLite Home
{status?.sqliteHome} ({status?.sqliteHomeSource})
\r\n
当前 Provider
{status?.currentProvider}
\r\n
目标 Provider
{selectedProvider}
\r\n
配置变更
{plan.mode === \"switch\" ? \"更新 config.toml 根级 model_provider\" : \"不修改 config.toml\"}
\r\n
Model 策略
{plan.mode !== \"switch\" ? \"跟随当前根级 model\" : plan.modelMode === \"auto\" ? \"跟随目标 Provider 配置\" : plan.modelMode === \"keep\" ? \"保留当前根级 model\" : `设置为 ${plan.model}`}
\r\n
备份策略
修改前创建备份,保留最近 {plan.keepCount} 份
\n
\n \n
\n );\n}\n\r\nfunction RestoreModal({ backup, status, profile, onCancel, onConfirm }) {\n const [restoreConfig, setRestoreConfig] = useState(false);\r\n const [restoreDatabase, setRestoreDatabase] = useState(true);\r\n const [restoreSessions, setRestoreSessions] = useState(true);\r\n const targetSqliteHome = resolveRestoreTargetSqliteHome(status, backup);\r\n const relocation = restoreRelocationState({\r\n backup,\r\n profile,\r\n targetSqliteHome,\r\n restoreDatabase,\r\n restoreConfig,\r\n sqliteSupported: status?.sqliteAccess?.supported !== false,\r\n pathComparisonCaseInsensitive: status?.pathComparisonCaseInsensitive === true\r\n });\r\n return (\r\n onConfirm({ restoreConfig, restoreDatabase, restoreSessions, allowSqliteHomeRelocation: relocation.requiresRelocation })}\r\n >\r\n
{formatDate(backup.metadata.createdAt)} · {backup.metadata.targetProvider}{backup.path}
\r\n
\r\n 选择要覆盖的内容\r\n \r\n \r\n \r\n
\r\n {status?.sqliteAccess?.supported === false ?
当前 SQLite 路径仅供诊断{status.sqliteAccess.message || \"不能从 Web UI 执行恢复。\"}
: null}\r\n {relocation.requiresRelocation ?
SQLite Home 与备份来源不同来源:{backup.metadata.sqliteHome}
目标:{targetSqliteHome}
{relocation.missingExplicitTarget ? \"当前 Profile 未明确配置 SQLite Home,不能提交数据库迁移恢复。\" : relocation.configRestoreConflict ? \"迁移数据库时不能同时恢复旧 config.toml。\" : \"确认后数据库将恢复到当前 Profile 明确配置的目标位置。\"}
: null}\r\n
恢复前请关闭 Codex该操作将覆盖所选的当前元数据;请确认 Codex CLI、App 和 app-server 已关闭。
\r\n \r\n );\r\n}\n\nfunction RestoreApplyModal({ backup, corePlan, onCancel, onConfirm }) {\n return (\n \n
{formatDate(backup.metadata.createdAt)} · {backup.metadata.targetProvider}{backup.id}
\n
Apply 仅使用一次性 planId任何 Profile、配置、Rollout、SQLite 或备份漂移都会使本计划失效,且不会创建新写入。
\n \n
\n );\n}\n\r\nfunction PruneModal({ keepCount, backups, onCancel, onConfirm }) {\r\n const deleteCount = Math.max(0, backups.backups.length - keepCount);\r\n return (\r\n \r\n
被删除的备份无法直接恢复只处理当前 Codex Home 下由本工具管理的备份目录。
\r\n
当前备份
{backups.backups.length} 份
保留
最近 {keepCount} 份
将删除
{deleteCount} 份
\r\n
\r\n );\r\n}\r\n\r\nfunction ProfileModal({ onCancel, onConfirm }) {\r\n const [profileId, setProfileId] = useState(\"\");\r\n const [name, setName] = useState(\"\");\r\n const [codexHome, setCodexHome] = useState(\"\");\r\n const [sqliteHome, setSqliteHome] = useState(\"\");\r\n const valid = /^[A-Za-z0-9_.-]{1,80}$/.test(profileId) && name.trim() && codexHome.trim();\r\n return (\r\n onConfirm({ profileId, name, codexHome, sqliteHome })}>\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Toast({ toast, onClose }) {\r\n useEffect(() => {\r\n if (!toast) return undefined;\r\n const timer = window.setTimeout(onClose, 6000);\r\n return () => window.clearTimeout(timer);\r\n }, [toast, onClose]);\r\n if (!toast) return null;\r\n return
{toast.tone === \"success\" ? : }{toast.title}{toast.message ? {toast.message} : null}
;\r\n}\r\n\r\nexport default function App() {\r\n const [view, setView] = useState(\"overview\");\r\n const [accessState, setAccessState] = useState(\"checking\");\r\n const [accessMessage, setAccessMessage] = useState(\"\");\r\n const [profileId, setProfileId] = usePersistentState(\"cps.web.profileId\", \"default\");\r\n const [profiles, setProfiles] = useState([]);\r\n const [manualProviders, setManualProviders] = usePersistentState(\"cps.web.manualProviders\", []);\r\n const [status, setStatus] = useState(null);\r\n const [backups, setBackups] = useState(EMPTY_BACKUPS);\r\n const [selectedProvider, setSelectedProvider] = useState(\"\");\r\n const [loading, setLoading] = useState(true);\r\n const [busy, setBusy] = useState(false);\r\n const [modal, setModal] = useState(null);\r\n const [toast, setToast] = useState(null);\r\n const [activity, setActivity] = useState([]);\r\n const [activeOperation, setActiveOperation] = useState(null);\r\n const lastActivityId = useRef(0);\r\n\r\n const providers = useMemo(() => {\r\n const detected = providersFromStatus(status);\r\n const detectedIds = new Set(detected.map((provider) => provider.id));\r\n return [\r\n ...detected.map((provider) => ({\r\n ...provider,\r\n manual: manualProviders.includes(provider.id)\r\n })),\r\n ...manualProviders\r\n .filter((provider) => !detectedIds.has(provider))\r\n .map((id) => ({ id, sources: [\"manual\"], configured: false, current: false, manual: true }))\r\n ];\r\n }, [status, manualProviders]);\r\n const selectedProfile = profiles.find((profile) => profile.id === profileId) ?? null;\r\n\r\n const profileRefreshRef = useRef(null);\r\n if (!profileRefreshRef.current) {\r\n profileRefreshRef.current = createProfileRefresh({\r\n fetchStatus: (storage, options) => apiRequest(\"/api/status\", storage, options),\r\n fetchBackups: (storage, options) => apiRequest(\"/api/backups\", storage, options)\r\n });\r\n }\r\n\r\n // Only the latest request for the current profile may update status,\r\n // backups, selectedProvider, loading, and error toasts. Switching profiles\r\n // starts a newer request, which aborts and invalidates the older one even\r\n // if the older one finishes last.\r\n const refresh = useCallback(async ({ quiet = false } = {}) => {\r\n await profileRefreshRef.current({\r\n profileId,\r\n showLoading: !quiet,\r\n onLoading: setLoading,\r\n onResult: ({ status: nextStatus, backups: nextBackups }) => {\r\n setStatus(nextStatus);\r\n setBackups(nextBackups);\r\n setSelectedProvider((current) => current && providersFromStatus(nextStatus).some((provider) => provider.id === current)\r\n ? current\r\n : nextStatus.currentProvider);\r\n },\r\n onError: (error) => {\r\n setToast({ tone: \"error\", title: \"状态读取失败\", message: error.message });\r\n }\r\n });\r\n }, [profileId]);\r\n\r\n const refreshProfiles = useCallback(async () => {\r\n const payload = await getProfiles();\r\n setProfiles(payload.profiles);\r\n setProfileId((current) => payload.profiles.some((profile) => profile.id === current) ? current : \"default\");\r\n }, [setProfileId]);\r\n\r\n const handleProfileConflict = useCallback(async () => {\r\n setModal(null);\r\n try {\r\n await refreshProfiles();\r\n await refresh({ quiet: true });\r\n } catch {\r\n // The user can still retry after the next explicit refresh.\r\n }\r\n setToast({ tone: \"warning\", title: \"配置已变更,请重新确认\", message: \"已刷新存储配置和当前状态;未自动重试原操作。\" });\r\n }, [refresh, refreshProfiles]);\r\n\r\n const openProfileOperation = useCallback(async (operation) => {\n const captured = captureProfileOperation(selectedProfile, operation, status);\n if (!captured) {\n setToast({ tone: \"warning\", title: \"配置需要刷新\", message: \"没有可用的配置版本,请刷新后重新确认操作。\" });\r\n refreshProfiles().catch(() => {});\r\n return;\n }\n if (operation.type !== \"execute\") {\n setModal(captured);\n return;\n }\n setBusy(true);\n try {\n const common = {\n ...storagePayload(captured.profileId),\n profileRevision: captured.profileRevision,\n provider: captured.selectedProvider,\n keepCount: captured.plan.keepCount\n };\n const endpoint = captured.plan.mode === \"switch\" ? \"/api/switch/prepare\" : \"/api/sync/prepare\";\n const request = captured.plan.mode === \"switch\"\n ? {\n ...common,\n modelMode: captured.plan.modelMode === \"auto\"\n ? \"provider-default\"\n : (captured.plan.modelMode === \"keep\" ? \"keep-root-model\" : \"explicit\"),\n model: captured.plan.modelMode === \"custom\" ? captured.plan.model : undefined\n }\n : common;\n const payload = await apiRequest(endpoint, request);\n setModal({ ...captured, corePlan: payload.plan });\n } catch (error) {\n if (error instanceof ProfileRevisionError) {\n await handleProfileConflict();\n return;\n }\n setToast({ tone: \"error\", title: \"计划生成失败\", message: error.message });\n } finally {\n setBusy(false);\n }\n }, [handleProfileConflict, refreshProfiles, selectedProfile, status]);\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n initializeAccess()\r\n .then(async (paired) => {\r\n if (!paired) throw new PairingRequiredError();\r\n await refreshProfiles();\r\n if (!cancelled) setAccessState(\"ready\");\r\n })\r\n .catch((error) => {\r\n if (cancelled) return;\r\n setAccessState(error instanceof PairingRequiredError ? \"required\" : \"error\");\r\n setAccessMessage(error.message);\r\n });\r\n return () => { cancelled = true; };\r\n }, [refreshProfiles]);\r\n\r\n useEffect(() => {\r\n if (accessState === \"ready\") refresh();\r\n }, [accessState, profileId]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n const requirePairing = (event) => {\r\n setAccessState(\"required\");\r\n setAccessMessage(event.detail || \"设备凭证已失效。请重新运行 codex-provider web。\");\r\n };\r\n window.addEventListener(\"cps:pairing-required\", requirePairing);\r\n return () => window.removeEventListener(\"cps:pairing-required\", requirePairing);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (accessState !== \"ready\") return undefined;\r\n let stopped = false;\r\n const poll = async () => {\r\n try {\r\n const payload = await getActivity(lastActivityId.current);\r\n if (stopped) return;\r\n if (payload.activity?.length) {\r\n lastActivityId.current = payload.activity[payload.activity.length - 1].id;\r\n setActivity((current) => [...current, ...payload.activity].slice(-250));\r\n }\r\n setActiveOperation(payload.activeOperation ?? null);\r\n } catch {\r\n // A transient poll failure should not interrupt a running operation.\r\n }\r\n };\r\n poll();\r\n const timer = window.setInterval(poll, 900);\r\n return () => { stopped = true; window.clearInterval(timer); };\r\n }, [accessState]);\r\n\r\n const execute = useCallback(async () => {\n const plan = modal.plan;\n const corePlan = modal.corePlan;\n setModal(null);\n setBusy(true);\r\n setView(\"activity\");\n try {\n const payload = await apiRequest(\n plan.mode === \"switch\" ? \"/api/switch/apply\" : \"/api/sync/apply\",\n { schemaVersion: corePlan.schemaVersion, planId: corePlan.planId }\n );\n setToast(operationToast(payload, {\n successTitle: plan.mode === \"switch\" ? \"切换并同步完成\" : \"同步完成\",\r\n partialTitle: plan.mode === \"switch\" ? \"切换并同步部分完成\" : \"同步部分完成\",\r\n message: `备份:${payload.result?.backup?.path ?? payload.result?.result?.backupDir ?? \"已创建\"}`\n }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"操作失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const prepareRestoreOperation = useCallback(async (options) => {\n const backup = modal.backup;\n const targetProfileId = modal.profileId;\n setBusy(true);\n try {\n const payload = await apiRequest(\"/api/restore/prepare\", {\n ...storagePayload(targetProfileId),\n profileRevision: modal.profileRevision,\n backupId: backup.id,\n ...options\n });\n setModal({ ...modal, type: \"restoreApply\", restoreOptions: options, corePlan: payload.plan });\n } catch (error) {\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"恢复计划生成失败\", message: error.message });\n } finally {\n setBusy(false);\n }\n }, [handleProfileConflict, modal]);\n\n const applyRestoreOperation = useCallback(async () => {\n const backup = modal.backup;\n const corePlan = modal.corePlan;\n setModal(null);\n setBusy(true);\n setView(\"activity\");\n try {\n const payload = await apiRequest(\"/api/restore/apply\", {\n schemaVersion: corePlan.schemaVersion,\n planId: corePlan.planId\n });\n setToast(operationToast(payload, { successTitle: \"备份恢复完成\", partialTitle: \"备份恢复部分完成\", message: backup.id }));\n await refresh({ quiet: true });\n } catch (error) {\n if (error instanceof ProfileRevisionError) {\n await handleProfileConflict();\n return;\n }\n setToast({ tone: \"error\", title: \"恢复失败\", message: error.message });\n } finally {\n setBusy(false);\n }\n }, [handleProfileConflict, modal, refresh]);\n\r\n const prune = useCallback(async () => {\r\n const keepCount = modal.keepCount;\r\n const targetProfileId = modal.profileId;\r\n setModal(null);\r\n setBusy(true);\r\n try {\r\n const payload = await apiRequest(\"/api/prune\", { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, keepCount });\r\n setToast(operationToast(payload, {\r\n successTitle: \"旧备份清理完成\",\r\n partialTitle: \"旧备份清理部分完成\",\r\n message: `删除 ${payload.result?.deletedCount ?? 0} 份,释放 ${formatBytes(payload.result?.freedBytes)}`\r\n }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"备份清理失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const closeToast = useCallback(() => setToast(null), []);\r\n const saveProfile = useCallback(async (profile) => {\r\n try {\r\n const payload = await apiRequest(\"/api/profiles/save\", profile.revision ? { ...profile, profileRevision: profile.revision } : profile);\r\n setModal(null);\r\n await refreshProfiles();\r\n setProfileId(payload.profile.id);\r\n setToast({ tone: \"success\", title: \"存储配置已保存\", message: payload.profile.name });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"配置保存失败\", message: error.message });\r\n }\r\n }, [handleProfileConflict, refreshProfiles, setProfileId]);\r\n const deleteProfile = useCallback(async () => {\r\n try {\r\n await apiRequest(\"/api/profiles/delete\", { profileId, profileRevision: selectedProfile?.revision });\r\n setProfileId(\"default\");\r\n await refreshProfiles();\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"配置删除失败\", message: error.message });\r\n }\r\n }, [handleProfileConflict, profileId, refreshProfiles, selectedProfile?.revision, setProfileId]);\r\n const forgetBrowser = useCallback(async () => {\r\n await forgetThisBrowser().catch(() => {});\r\n setAccessState(\"required\");\r\n setAccessMessage(\"此浏览器的设备凭证已失效。重新运行 codex-provider web 即可自动配对。\");\r\n }, []);\r\n const addManualProvider = useCallback((provider) => {\r\n setManualProviders((current) => [...new Set([...current, provider])].sort());\r\n setSelectedProvider(provider);\r\n }, [setManualProviders]);\r\n const removeManualProvider = useCallback((provider) => {\r\n setManualProviders((current) => current.filter((item) => item !== provider));\r\n setSelectedProvider(status?.currentProvider ?? \"\");\r\n }, [setManualProviders, status?.currentProvider]);\r\n\r\n if (accessState !== \"ready\") {\r\n return

{accessState === \"checking\" ? \"正在完成安全配对\" : \"需要重新配对\"}

{accessState === \"checking\" ? \"请稍候…\" : accessMessage || \"请重新运行 codex-provider web。\"}

{accessState !== \"checking\" ? codex-provider web : null}
;\r\n }\r\n\r\n return (\r\n
\r\n refresh()} />\r\n \r\n
\r\n setModal({ type: \"profile\" })} onDeleteProfile={deleteProfile} onRefresh={() => refresh()} loading={loading} profileSwitchDisabled={busy || Boolean(modal)} />\r\n {view === \"overview\" ? openProfileOperation({ type: \"execute\", plan, selectedProvider })} onRestore={(backup) => openProfileOperation({ type: \"restore\", backup })} setView={setView} busy={busy} loading={loading} /> : null}\r\n {view === \"history\" ? : null}\r\n {view === \"backups\" ? openProfileOperation({ type: \"restore\", backup })} onPrune={(keepCount) => openProfileOperation({ type: \"prune\", keepCount })} /> : null}\r\n {view === \"activity\" ? : null}\r\n
\r\n {modal?.type === \"execute\" ? setModal(null)} onConfirm={execute} /> : null}\n {modal?.type === \"restore\" ? setModal(null)} onConfirm={prepareRestoreOperation} /> : null}\n {modal?.type === \"restoreApply\" ? setModal(null)} onConfirm={applyRestoreOperation} /> : null}\n {modal?.type === \"prune\" ? setModal(null)} onConfirm={prune} /> : null}\r\n {modal?.type === \"profile\" ? setModal(null)} onConfirm={saveProfile} /> : null}\r\n \r\n
\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\n\r\nimport App from \"./App.jsx\";\r\nimport \"./styles.css\";\r\n\r\ncreateRoot(document.getElementById(\"root\")).render(\r\n \r\n \r\n \r\n);\r\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,12,13],"mappings":"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"} \ No newline at end of file diff --git a/web/dist/index.html b/web/dist/index.html index a10cf3b..fbc3855 100644 --- a/web/dist/index.html +++ b/web/dist/index.html @@ -6,7 +6,7 @@ Codex Provider Sync - + diff --git a/web/src/App.jsx b/web/src/App.jsx index fd25458..c9165d0 100644 --- a/web/src/App.jsx +++ b/web/src/App.jsx @@ -652,7 +652,23 @@ function Modal({ title, children, confirmLabel, onConfirm, onCancel, tone = "pri ); } -function ExecuteModal({ plan, status, selectedProvider, onCancel, onConfirm }) { +function CorePlanDetails({ plan }) { + if (!plan) return null; + const impact = plan.impact ?? {}; + return ( + <> +
+
计划有效期
{formatDate(plan.expiresAt)}
+
Rollout 变更
{impact.rolloutFilesToChange ?? 0}
+
SQLite 行变更
{impact.sqliteRowsToChange ?? 0}
+
当前锁定 Rollout
{Array.isArray(impact.lockedRolloutFiles) ? impact.lockedRolloutFiles.length : (impact.lockedRolloutFiles ?? 0)}
+
+ {plan.warnings?.map((warning) =>
计划警告{warning}
)} + + ); +} + +function ExecuteModal({ plan, corePlan, status, selectedProvider, onCancel, onConfirm }) { return (
请确认 Codex 已完全关闭关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。
@@ -665,6 +681,7 @@ function ExecuteModal({ plan, status, selectedProvider, onCancel, onConfirm }) {
Model 策略
{plan.mode !== "switch" ? "跟随当前根级 model" : plan.modelMode === "auto" ? "跟随目标 Provider 配置" : plan.modelMode === "keep" ? "保留当前根级 model" : `设置为 ${plan.model}`}
备份策略
修改前创建备份,保留最近 {plan.keepCount} 份
+
); } @@ -706,6 +723,16 @@ function RestoreModal({ backup, status, profile, onCancel, onConfirm }) { ); } +function RestoreApplyModal({ backup, corePlan, onCancel, onConfirm }) { + return ( + +
{formatDate(backup.metadata.createdAt)} · {backup.metadata.targetProvider}{backup.id}
+
Apply 仅使用一次性 planId任何 Profile、配置、Rollout、SQLite 或备份漂移都会使本计划失效,且不会创建新写入。
+ +
+ ); +} + function PruneModal({ keepCount, backups, onCancel, onConfirm }) { const deleteCount = Math.max(0, backups.backups.length - keepCount); return ( @@ -824,15 +851,47 @@ export default function App() { setToast({ tone: "warning", title: "配置已变更,请重新确认", message: "已刷新存储配置和当前状态;未自动重试原操作。" }); }, [refresh, refreshProfiles]); - const openProfileOperation = useCallback((operation) => { + const openProfileOperation = useCallback(async (operation) => { const captured = captureProfileOperation(selectedProfile, operation, status); if (!captured) { setToast({ tone: "warning", title: "配置需要刷新", message: "没有可用的配置版本,请刷新后重新确认操作。" }); refreshProfiles().catch(() => {}); return; } - setModal(captured); - }, [refreshProfiles, selectedProfile, status]); + if (operation.type !== "execute") { + setModal(captured); + return; + } + setBusy(true); + try { + const common = { + ...storagePayload(captured.profileId), + profileRevision: captured.profileRevision, + provider: captured.selectedProvider, + keepCount: captured.plan.keepCount + }; + const endpoint = captured.plan.mode === "switch" ? "/api/switch/prepare" : "/api/sync/prepare"; + const request = captured.plan.mode === "switch" + ? { + ...common, + modelMode: captured.plan.modelMode === "auto" + ? "provider-default" + : (captured.plan.modelMode === "keep" ? "keep-root-model" : "explicit"), + model: captured.plan.modelMode === "custom" ? captured.plan.model : undefined + } + : common; + const payload = await apiRequest(endpoint, request); + setModal({ ...captured, corePlan: payload.plan }); + } catch (error) { + if (error instanceof ProfileRevisionError) { + await handleProfileConflict(); + return; + } + setToast({ tone: "error", title: "计划生成失败", message: error.message }); + } finally { + setBusy(false); + } + }, [handleProfileConflict, refreshProfiles, selectedProfile, status]); useEffect(() => { let cancelled = false; @@ -886,19 +945,19 @@ export default function App() { const execute = useCallback(async () => { const plan = modal.plan; - const targetProfileId = modal.profileId; + const corePlan = modal.corePlan; setModal(null); setBusy(true); setView("activity"); try { - const common = { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, provider: modal.selectedProvider, keepCount: plan.keepCount }; - const payload = plan.mode === "switch" - ? await apiRequest("/api/switch", { ...common, model: plan.modelMode === "custom" ? plan.model : undefined, keepRootModel: plan.modelMode === "keep" }) - : await apiRequest("/api/sync", common); + const payload = await apiRequest( + plan.mode === "switch" ? "/api/switch/apply" : "/api/sync/apply", + { schemaVersion: corePlan.schemaVersion, planId: corePlan.planId } + ); setToast(operationToast(payload, { successTitle: plan.mode === "switch" ? "切换并同步完成" : "同步完成", partialTitle: plan.mode === "switch" ? "切换并同步部分完成" : "同步部分完成", - message: `备份:${payload.result?.backupDir ?? "已创建"}` + message: `备份:${payload.result?.backup?.path ?? payload.result?.result?.backupDir ?? "已创建"}` })); await refresh({ quiet: true }); } catch (error) { @@ -912,14 +971,40 @@ export default function App() { } }, [handleProfileConflict, modal, refresh]); - const restore = useCallback(async (options) => { + const prepareRestoreOperation = useCallback(async (options) => { const backup = modal.backup; const targetProfileId = modal.profileId; + setBusy(true); + try { + const payload = await apiRequest("/api/restore/prepare", { + ...storagePayload(targetProfileId), + profileRevision: modal.profileRevision, + backupId: backup.id, + ...options + }); + setModal({ ...modal, type: "restoreApply", restoreOptions: options, corePlan: payload.plan }); + } catch (error) { + if (error instanceof ProfileRevisionError) { + await handleProfileConflict(); + return; + } + setToast({ tone: "error", title: "恢复计划生成失败", message: error.message }); + } finally { + setBusy(false); + } + }, [handleProfileConflict, modal]); + + const applyRestoreOperation = useCallback(async () => { + const backup = modal.backup; + const corePlan = modal.corePlan; setModal(null); setBusy(true); setView("activity"); try { - const payload = await apiRequest("/api/restore", { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, backupId: backup.id, ...options }); + const payload = await apiRequest("/api/restore/apply", { + schemaVersion: corePlan.schemaVersion, + planId: corePlan.planId + }); setToast(operationToast(payload, { successTitle: "备份恢复完成", partialTitle: "备份恢复部分完成", message: backup.id })); await refresh({ quiet: true }); } catch (error) { @@ -1015,8 +1100,9 @@ export default function App() { {view === "backups" ? openProfileOperation({ type: "restore", backup })} onPrune={(keepCount) => openProfileOperation({ type: "prune", keepCount })} /> : null} {view === "activity" ? : null} - {modal?.type === "execute" ? setModal(null)} onConfirm={execute} /> : null} - {modal?.type === "restore" ? setModal(null)} onConfirm={restore} /> : null} + {modal?.type === "execute" ? setModal(null)} onConfirm={execute} /> : null} + {modal?.type === "restore" ? setModal(null)} onConfirm={prepareRestoreOperation} /> : null} + {modal?.type === "restoreApply" ? setModal(null)} onConfirm={applyRestoreOperation} /> : null} {modal?.type === "prune" ? setModal(null)} onConfirm={prune} /> : null} {modal?.type === "profile" ? setModal(null)} onConfirm={saveProfile} /> : null} diff --git a/web/src/api.js b/web/src/api.js index d0ebafd..3f6b55d 100644 --- a/web/src/api.js +++ b/web/src/api.js @@ -43,13 +43,14 @@ function deviceHeaders() { } export function toRequestError(payload, status, fallback) { - if (status === 409 && [ + const errorCode = payload.code ?? payload.coreError?.code; + if (status === 409 && ([ "PROFILE_REVISION_REQUIRED", "PROFILE_CHANGED", "STORAGE_REVISION_REQUIRED", "STORAGE_CHANGED" - ].includes(payload.code)) { - return new ProfileRevisionError(payload.code, payload.error, payload.profile); + ].includes(errorCode) || ["PLAN_EXPIRED", "STALE_STATE"].includes(errorCode))) { + return new ProfileRevisionError(errorCode, payload.error, payload.profile); } return new Error(payload.error ?? fallback); } diff --git a/web/src/api.test.js b/web/src/api.test.js index e5752ba..b491d06 100644 --- a/web/src/api.test.js +++ b/web/src/api.test.js @@ -25,3 +25,13 @@ test("turns storage revision conflicts into the same refresh-required error", () assert.ok(error instanceof ProfileRevisionError); assert.equal(error.code, "STORAGE_CHANGED"); }); + +test("turns Core stale plans into the same refresh-required error", () => { + const error = toRequestError({ + error: "Protected state changed.", + coreError: { code: "STALE_STATE" } + }, 409, "fallback"); + + assert.ok(error instanceof ProfileRevisionError); + assert.equal(error.code, "STALE_STATE"); +}); diff --git a/web/src/operation-state.js b/web/src/operation-state.js index 46f2a88..498fecb 100644 --- a/web/src/operation-state.js +++ b/web/src/operation-state.js @@ -2,20 +2,21 @@ export function captureProfileOperation(profile, operation, status) { if (!profile?.id || !profile?.revision || status?.profileId !== profile.id - || status?.profileRevision !== profile.revision - || !status?.storageRevision) return null; + || status?.profileRevision !== profile.revision) return null; return { ...operation, profile: { ...profile }, profileId: profile.id, profileRevision: profile.revision, - storageRevision: status.storageRevision, status: { ...status } }; } export function skippedLockedRolloutFiles(payload) { - const files = payload?.result?.skippedLockedRolloutFiles ?? payload?.skippedLockedRolloutFiles ?? []; + const files = payload?.result?.result?.skippedLockedRolloutFiles + ?? payload?.result?.skippedLockedRolloutFiles + ?? payload?.skippedLockedRolloutFiles + ?? []; return Array.isArray(files) ? files.filter(Boolean) : []; } diff --git a/web/src/operation-state.test.js b/web/src/operation-state.test.js index eb22515..4918a1c 100644 --- a/web/src/operation-state.test.js +++ b/web/src/operation-state.test.js @@ -16,7 +16,7 @@ test("captures the profile revision used by a confirmation", () => { assert.deepEqual(operation.profileId, "work"); assert.deepEqual(operation.profileRevision, "rev-1"); - assert.equal(operation.storageRevision, "storage-1"); + assert.equal(Object.hasOwn(operation, "storageRevision"), false); assert.equal(operation.selectedProvider, "provider-a"); assert.equal(operation.profile.revision, "rev-1"); assert.equal(operation.profile.sqliteHome, "/data/sqlite"); @@ -36,6 +36,21 @@ test("marks locked rollout results as partial instead of success", () => { assert.match(toast.message, /live\.jsonl/); }); +test("reads locked rollout details from the C3 OperationResult envelope", () => { + const toast = operationToast({ + result: { + outcome: "partial", + result: { skippedLockedRolloutFiles: ["/sessions/c3-live.jsonl"] } + } + }, { + successTitle: "同步完成", + partialTitle: "同步部分完成", + message: "备份已创建" + }); + assert.equal(toast.tone, "warning"); + assert.match(toast.message, /c3-live\.jsonl/); +}); + test("requires an explicit profile SQLite home for relocation", () => { const state = restoreRelocationState({ backup: { metadata: { sqliteHome: "/backup/sqlite" } }, From d6b0fef593968d402b290f0dff180c84b0fc9325 Mon Sep 17 00:00:00 2001 From: "DAL\\Administrator" <3452720699@qq.com> Date: Tue, 25 Aug 2026 19:13:06 +0800 Subject: [PATCH 05/50] refactor(vnext): checkpoint C4 workspace and core clients --- .github/workflows/ci.yml | 53 +- .github/workflows/publish-npm.yml | 22 +- .github/workflows/publish.yml | 19 + .gitignore | 4 + CHANGELOG.md | 1 + apps/cli/checks/ownership.contract.mjs | 13 + apps/cli/package.json | 13 + apps/cli/src/ownership.js | 7 + apps/desktop/checks/ownership.contract.mjs | 8 + apps/desktop/package.json | 23 + apps/desktop/src/index.ts | 17 + apps/desktop/tsconfig.json | 15 + apps/web/package.json | 18 + docs/VNEXT_ELECTRON_NODE_ARCHITECTURE_ZH.md | 5 +- ...npm-workspace-and-dependency-boundaries.md | 71 ++ .../architecture/contracts/CLI_CONTRACT_ZH.md | 6 + .../contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md | 8 + docs/architecture/contracts/ERROR_CODES_ZH.md | 11 +- docs/migration/BEHAVIOR_FIXTURES_ZH.md | 7 +- .../VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md | 6 +- .../C4_WORKSPACE_CORE_CLIENT_2026-08-25.md | 55 ++ package-lock.json | 576 +++++++++++++++-- package.json | 21 +- packages/app-ui/checks/surface.contract.mjs | 18 + packages/app-ui/package.json | 24 + packages/app-ui/src/index.ts | 26 + packages/app-ui/tsconfig.json | 16 + .../contracts/checks/contracts.contract.mjs | 187 ++++++ packages/contracts/package.json | 19 + packages/contracts/src/dto.ts | 269 ++++++++ packages/contracts/src/errors.ts | 235 +++++++ packages/contracts/src/index.ts | 4 + packages/contracts/src/json.ts | 3 + packages/contracts/src/protocol.ts | 609 ++++++++++++++++++ packages/contracts/tsconfig.json | 11 + .../checks/core-client.contract.mjs | 183 ++++++ packages/core-client/package.json | 22 + packages/core-client/src/client.ts | 197 ++++++ packages/core-client/src/http.ts | 109 ++++ packages/core-client/src/index.ts | 3 + packages/core-client/src/mock.ts | 82 +++ packages/core-client/tsconfig.json | 14 + .../core/checks/core-surface.contract.mjs | 112 ++++ packages/core/package.json | 22 + packages/core/src/index.d.ts | 57 ++ packages/core/src/index.js | 383 +++++++++++ packages/core/tsconfig.json | 13 + .../design-system/checks/surface.contract.mjs | 14 + packages/design-system/package.json | 19 + packages/design-system/src/index.ts | 11 + packages/design-system/tsconfig.json | 11 + .../test-fixtures/checks/runner.contract.mjs | 157 +++++ packages/test-fixtures/package.json | 13 + .../schema/difference.schema.json | 25 + .../test-fixtures/schema/fixture.schema.json | 31 + packages/test-fixtures/src/index.js | 255 ++++++++ scripts/smoke-root-tarball.js | 164 +++++ scripts/verify-node16-runtime.js | 35 + scripts/verify-root-production-tree.js | 24 + scripts/verify-workspace-boundaries.js | 100 +++ src/cli.js | 21 +- src/public-api.d.ts | 58 ++ test/workspace-boundaries.test.js | 69 ++ tsconfig.base.json | 20 + tsconfig.workspaces.json | 10 + web/dist/assets/index-CAZ7Ulmk.js | 10 - web/dist/assets/index-CAZ7Ulmk.js.map | 1 - web/dist/assets/index-DAOqepUV.js | 11 + web/dist/assets/index-DAOqepUV.js.map | 1 + web/dist/index.html | 2 +- 70 files changed, 4576 insertions(+), 83 deletions(-) create mode 100644 apps/cli/checks/ownership.contract.mjs create mode 100644 apps/cli/package.json create mode 100644 apps/cli/src/ownership.js create mode 100644 apps/desktop/checks/ownership.contract.mjs create mode 100644 apps/desktop/package.json create mode 100644 apps/desktop/src/index.ts create mode 100644 apps/desktop/tsconfig.json create mode 100644 apps/web/package.json create mode 100644 docs/adr/0014-npm-workspace-and-dependency-boundaries.md create mode 100644 docs/migration/evidence/C4_WORKSPACE_CORE_CLIENT_2026-08-25.md create mode 100644 packages/app-ui/checks/surface.contract.mjs create mode 100644 packages/app-ui/package.json create mode 100644 packages/app-ui/src/index.ts create mode 100644 packages/app-ui/tsconfig.json create mode 100644 packages/contracts/checks/contracts.contract.mjs create mode 100644 packages/contracts/package.json create mode 100644 packages/contracts/src/dto.ts create mode 100644 packages/contracts/src/errors.ts create mode 100644 packages/contracts/src/index.ts create mode 100644 packages/contracts/src/json.ts create mode 100644 packages/contracts/src/protocol.ts create mode 100644 packages/contracts/tsconfig.json create mode 100644 packages/core-client/checks/core-client.contract.mjs create mode 100644 packages/core-client/package.json create mode 100644 packages/core-client/src/client.ts create mode 100644 packages/core-client/src/http.ts create mode 100644 packages/core-client/src/index.ts create mode 100644 packages/core-client/src/mock.ts create mode 100644 packages/core-client/tsconfig.json create mode 100644 packages/core/checks/core-surface.contract.mjs create mode 100644 packages/core/package.json create mode 100644 packages/core/src/index.d.ts create mode 100644 packages/core/src/index.js create mode 100644 packages/core/tsconfig.json create mode 100644 packages/design-system/checks/surface.contract.mjs create mode 100644 packages/design-system/package.json create mode 100644 packages/design-system/src/index.ts create mode 100644 packages/design-system/tsconfig.json create mode 100644 packages/test-fixtures/checks/runner.contract.mjs create mode 100644 packages/test-fixtures/package.json create mode 100644 packages/test-fixtures/schema/difference.schema.json create mode 100644 packages/test-fixtures/schema/fixture.schema.json create mode 100644 packages/test-fixtures/src/index.js create mode 100644 scripts/smoke-root-tarball.js create mode 100644 scripts/verify-node16-runtime.js create mode 100644 scripts/verify-root-production-tree.js create mode 100644 scripts/verify-workspace-boundaries.js create mode 100644 src/public-api.d.ts create mode 100644 test/workspace-boundaries.test.js create mode 100644 tsconfig.base.json create mode 100644 tsconfig.workspaces.json delete mode 100644 web/dist/assets/index-CAZ7Ulmk.js delete mode 100644 web/dist/assets/index-CAZ7Ulmk.js.map create mode 100644 web/dist/assets/index-DAOqepUV.js create mode 100644 web/dist/assets/index-DAOqepUV.js.map diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee04efd..bcbeb04 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,9 +27,54 @@ jobs: with: node-version: ${{ matrix.node-version }} cache: "npm" - - run: npm ci + - name: Install root production tree for Node 16 compatibility + if: matrix.node-version == '16.20.2' + run: npm ci --workspaces=false --omit=dev + - name: Verify the frozen Node 16 and npm 8 toolchain + if: matrix.node-version == '16.20.2' + run: npm run runtime:verify-node16 + - name: Install complete workspace tree on Node 24 + if: matrix.node-version == '24' + run: npm ci - run: npm test + workspace-contract: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - windows-latest + - ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: "24" + cache: "npm" + - run: npm ci + - run: npm run workspaces:check + + root-package-compat: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: + - windows-latest + - ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: "16.20.2" + cache: "npm" + - run: npm ci --workspaces=false --omit=dev + - run: npm run runtime:verify-node16 + - run: npm run package:verify-root-tree + - run: npm run package:smoke + - run: npm run package:smoke:lifecycle + web-build: runs-on: ${{ matrix.os }} strategy: @@ -101,6 +146,8 @@ jobs: if: ${{ always() }} needs: - test + - workspace-contract + - root-package-compat - web-build - dependency-audit - desktop-test @@ -111,6 +158,8 @@ jobs: - name: Verify required jobs env: NODE_TEST_RESULT: ${{ needs.test.result }} + WORKSPACE_CONTRACT_RESULT: ${{ needs.workspace-contract.result }} + ROOT_PACKAGE_COMPAT_RESULT: ${{ needs.root-package-compat.result }} WEB_BUILD_RESULT: ${{ needs.web-build.result }} DEPENDENCY_AUDIT_RESULT: ${{ needs.dependency-audit.result }} DESKTOP_TEST_RESULT: ${{ needs.desktop-test.result }} @@ -118,6 +167,8 @@ jobs: LINUX_LOCK_RESULT: ${{ needs.desktop-linux-lock.result }} run: | if [ "$NODE_TEST_RESULT" != "success" ] || + [ "$WORKSPACE_CONTRACT_RESULT" != "success" ] || + [ "$ROOT_PACKAGE_COMPAT_RESULT" != "success" ] || [ "$WEB_BUILD_RESULT" != "success" ] || [ "$DEPENDENCY_AUDIT_RESULT" != "success" ] || [ "$DESKTOP_TEST_RESULT" != "success" ] || diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml index dbd5d6f..0a741ab 100644 --- a/.github/workflows/publish-npm.yml +++ b/.github/workflows/publish-npm.yml @@ -35,7 +35,27 @@ jobs: package-manager-cache: false - run: npm ci + - run: npm run workspaces:check - run: npm run web:build - run: npm test - - run: npm pack --dry-run --json + - run: npm run package:smoke + - run: npm audit --omit=dev --audit-level=moderate + - run: npm audit --audit-level=high + + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: "16.20.2" + package-manager-cache: false + + - run: npm ci --workspaces=false --omit=dev + - run: npm run runtime:verify-node16 + - run: npm run package:verify-root-tree + - run: npm run package:smoke:lifecycle + + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: "24" + registry-url: "https://registry.npmjs.org" + package-manager-cache: false + - run: npm publish --access public diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 082faf1..48b6324 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -45,8 +45,27 @@ jobs: dotnet-version: "10.0.x" - run: npm ci + - run: npm run workspaces:check - run: npm run web:build - run: npm test + - run: npm run package:smoke + + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: "16.20.2" + cache: npm + + - run: npm ci --workspaces=false --omit=dev + - run: npm run runtime:verify-node16 + - run: npm run package:verify-root-tree + - run: npm run package:smoke:lifecycle + + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: "24" + cache: npm + + - run: npm ci - run: dotnet build CodexProviderSync.sln --configuration Release - run: dotnet test desktop/CodexProviderSync.Core.Tests/CodexProviderSync.Core.Tests.csproj --configuration Release --no-build - run: dotnet test desktop/CodexProviderSync.Application.Tests/CodexProviderSync.Application.Tests.csproj --configuration Release --no-build diff --git a/.gitignore b/.gitignore index 638c30b..dea073d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,8 @@ node_modules/ +apps/*/dist/ +packages/*/dist/ +apps/*/*.tsbuildinfo +packages/*/*.tsbuildinfo coverage/ *.tgz artifacts/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 15f729b..fa257d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ - 未传入 `--json` 时继续使用既有 Human 输出和 `0/1` 行为;partial sync 在 Human Mode 仍为成功退出。 - `watch` 与 `web` 暂不提供单文档 JSON 模式,并在创建长运行资源前返回结构化 `INVALID_INPUT`;未来流式机器接口需要独立协议。 +- npm tarball 或 Windows npm shim 使用短路径、长路径或符号链接形式启动 CLI 时,会对入口两侧做物理路径规范化,避免已安装的 `codex-provider` 被误判为模块导入而静默退出。 ### 安全 diff --git a/apps/cli/checks/ownership.contract.mjs b/apps/cli/checks/ownership.contract.mjs new file mode 100644 index 0000000..3e149db --- /dev/null +++ b/apps/cli/checks/ownership.contract.mjs @@ -0,0 +1,13 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { CLI_MIGRATION_STATE } from "../src/ownership.js"; + +test("CLI workspace records root-package compatibility ownership", () => { + assert.deepEqual(CLI_MIGRATION_STATE, { + compatibilityEntrypoint: "src/cli.js", + owner: "apps/cli", + implementationMoved: false + }); + assert.ok(Object.isFrozen(CLI_MIGRATION_STATE)); +}); diff --git a/apps/cli/package.json b/apps/cli/package.json new file mode 100644 index 0000000..2ab56c8 --- /dev/null +++ b/apps/cli/package.json @@ -0,0 +1,13 @@ +{ + "name": "@codex-provider-sync/cli", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": "./src/ownership.js", + "scripts": { + "test": "node --test checks/ownership.contract.mjs" + }, + "engines": { + "node": ">=16.20.2" + } +} diff --git a/apps/cli/src/ownership.js b/apps/cli/src/ownership.js new file mode 100644 index 0000000..ebc21c8 --- /dev/null +++ b/apps/cli/src/ownership.js @@ -0,0 +1,7 @@ +// C4 establishes package ownership without moving the compatibility binary. +// The published root package must continue to execute src/cli.js on Node 16. +export const CLI_MIGRATION_STATE = Object.freeze({ + compatibilityEntrypoint: "src/cli.js", + owner: "apps/cli", + implementationMoved: false +}); diff --git a/apps/desktop/checks/ownership.contract.mjs b/apps/desktop/checks/ownership.contract.mjs new file mode 100644 index 0000000..bc5708f --- /dev/null +++ b/apps/desktop/checks/ownership.contract.mjs @@ -0,0 +1,8 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { DESKTOP_RUNTIME_STATE } from "../dist/index.js"; + +test("desktop workspace cannot be mistaken for an enabled Electron runtime", () => { + assert.equal(DESKTOP_RUNTIME_STATE, "not-enabled-c4"); +}); diff --git a/apps/desktop/package.json b/apps/desktop/package.json new file mode 100644 index 0000000..03c5607 --- /dev/null +++ b/apps/desktop/package.json @@ -0,0 +1,23 @@ +{ + "name": "@codex-provider-sync/desktop", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "tsc -b", + "test": "node --test checks/ownership.contract.mjs" + }, + "engines": { + "node": ">=24" + }, + "dependencies": { + "@codex-provider-sync/contracts": "0.0.0", + "@codex-provider-sync/core-client": "0.0.0" + } +} diff --git a/apps/desktop/src/index.ts b/apps/desktop/src/index.ts new file mode 100644 index 0000000..6c7fda4 --- /dev/null +++ b/apps/desktop/src/index.ts @@ -0,0 +1,17 @@ +import type { CoreClient, CoreTransport } from "@codex-provider-sync/core-client"; +import type { CoreProtocolVersion } from "@codex-provider-sync/contracts"; + +export const DESKTOP_RUNTIME_STATE = "not-enabled-c4" as const; + +export interface DesktopHandshakeContract { + appVersion: string; + coreVersion: string; + protocolVersion: CoreProtocolVersion; +} + +export interface DesktopHostBoundary { + createClient(transport: CoreTransport): CoreClient; +} + +// Electron, BrowserWindow, Preload, IPC and Utility Process are deliberately +// absent until C6 establishes and tests those security boundaries. diff --git a/apps/desktop/tsconfig.json b/apps/desktop/tsconfig.json new file mode 100644 index 0000000..659b7ed --- /dev/null +++ b/apps/desktop/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "dist" + }, + "include": [ + "src/**/*.ts" + ], + "references": [ + { "path": "../../packages/contracts" }, + { "path": "../../packages/core-client" } + ] +} diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..9ba7451 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,18 @@ +{ + "name": "@codex-provider-sync/web", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "build": "vite build --config ../../web/vite.config.js" + }, + "engines": { + "node": ">=24" + }, + "devDependencies": { + "@vitejs/plugin-react": "6.1.0", + "react": "19.2.8", + "react-dom": "19.2.8", + "vite": "8.2.2" + } +} diff --git a/docs/VNEXT_ELECTRON_NODE_ARCHITECTURE_ZH.md b/docs/VNEXT_ELECTRON_NODE_ARCHITECTURE_ZH.md index fb0fdd3..a9904b9 100644 --- a/docs/VNEXT_ELECTRON_NODE_ARCHITECTURE_ZH.md +++ b/docs/VNEXT_ELECTRON_NODE_ARCHITECTURE_ZH.md @@ -2576,7 +2576,7 @@ Electron 只开放: ## 35. ADR 清单 -本文件确认总方向;以下细分决策在阶段 0 建立并逐项 Accepted: +本文件确认总方向;以下细分决策在阶段 0 和对应迁移 checkpoint 建立并逐项 Accepted: ```text docs/adr/ @@ -2592,7 +2592,8 @@ docs/adr/ ├─ 0010-electron-vite-and-electron-builder.md ├─ 0011-v1-single-branch-single-final-pr.md ├─ 0012-dual-resource-lock-contract.md -└─ 0013-restore-v2-recovery-state-machine.md +├─ 0013-restore-v2-recovery-state-machine.md +└─ 0014-npm-workspace-and-dependency-boundaries.md ``` ADR 一旦 Accepted,不应通过普通重构 PR 静默推翻。 diff --git a/docs/adr/0014-npm-workspace-and-dependency-boundaries.md b/docs/adr/0014-npm-workspace-and-dependency-boundaries.md new file mode 100644 index 0000000..7454e0f --- /dev/null +++ b/docs/adr/0014-npm-workspace-and-dependency-boundaries.md @@ -0,0 +1,71 @@ +# vNext/ADR-0014:npm Workspace、根发布包与依赖边界 + +- Status: Accepted +- Date: 2026-08-25 +- Scope: vNext C4 workspace and dependency baseline + +## Context + +vNext 需要让 CLI、Web、Electron、Core、Contracts、CoreClient 与共享 UI 各自拥有明确包边界,同时继续发布现有根包 `@dailin521/codex-provider-sync`、原 `codex-provider` bin 和 Node `>=16.20.2` 运行合同。若根 CLI 在迁移期依赖 workspace symlink,开发仓库可能正常而发布 tarball 会缺包;若 Node 24 的 Vite/Electron 工具链进入根生产树,Node 16 安装合同也会被间接破坏。 + +## Decision + +仓库使用 npm workspaces 和一个根 `package-lock.json`,不引入第二套包管理器。工作区固定为 `apps/*` 与 `packages/*`,初始所有内部包均为 `private: true`;根包继续是唯一 npm 发布面。 + +C4 建立以下依赖方向: + +```text +contracts <- core +contracts <- core-client <- app-ui <- apps/web / apps/desktop +design-system -----------^ +test-fixtures(仅测试,不进入产品依赖图) +``` + +`packages/core` 在 C4 仅通过一个已审计例外导入根 `src/public-api.js`,不移动或翻译锁、备份、journal、SQLite、rollout 和 service 算法。包本身只导出 `createCoreFacade({resolveProfile})`;可信 Host 解析 profile ID/revision 为路径后,facade 实例才提供 vNext 固定方法,不导出 `runSync/runSwitch/runRestore/runWatch` 兼容适配器或存储辅助函数。Core workspace 保持 ESM JavaScript;C4 的 JSDoc、`checkJs`、`tsc --noEmit` 只覆盖该可信边界 bridge,仍在根 `src/` 的高风险算法继续由既有 JS 与集成测试约束,后续迁入时逐模块加入 checkJs。Contracts、CoreClient、App UI 边界和 Desktop 边界使用 TypeScript。 + +根包不得运行时导入任一 workspace,不得声明 React、Vite、TypeScript 或 Electron 生产依赖;根 `files` allowlist 不包含 `apps/`、`packages/`、Fixture 或 workspace build output。当前尚未搬迁的 `web/` 源由 `apps/web` 的精确 devDependencies 构建;React 静态打包依赖也归该私有 workspace,根 manifest 不重复声明。这样 npm 8 读取单一 workspace lockfile 并执行 `npm ci --workspaces=false --omit=dev` 时,根生产树不会因 hoisted production 标记误装 React。 + +## Dependency Resolution + +2026-08-25 通过 npm registry 的 `latest`、`engines` 和 `peerDependencies` 元数据解析 C4 实际引入或迁移的依赖: + +| Dependency | Exact version | Resolution | +| --- | --- | --- | +| TypeScript | `7.0.2` | 最新 stable,非 beta/rc/next;workspace 构建固定 Node 24 | +| `@types/node` | `24.13.3` | Node 24 类型线的最新 stable;仅用于 Core bridge 的 Node 内置模块 checkJs | +| Vite | `8.2.2` | 最新 stable;要求 Node `^20.19.0 || >=22.12.0`,由 Node 24 job 执行 | +| `@vitejs/plugin-react` | `6.1.0` | 最新 stable;peer `vite ^8.0.0`,与 Vite 8.2.2 相容 | +| React / React DOM | `19.2.8` | 最新 stable;React DOM peer `react ^19.2.8` 闭合 | +| `better-sqlite3` | `8.7.0` | 保留现有根 optional fallback;更新版本不满足根 Node 16 合同,不在 C4 强升 | + +所有直接 dependency/devDependency/optionalDependency/peerDependency 使用精确版本,不使用 `^`、`~`、`workspace:*`、`file:` 或未锁定 URL。传递依赖由唯一 lockfile 锁定。候选经 `npm audit --omit=dev --audit-level=moderate` 与全树 `npm audit --audit-level=high` 检查;任一不合格候选不得进入 checkpoint。 + +Electron、electron-vite、electron-builder、现代 UI 库和 native fallback 的具体版本不在 C4 提前解析:分别在 C5/C6/C9 按同一规则选择并记录。尤其不得为了“先搭骨架”把 Electron 写入根 manifest。 + +## Invariants + +- 根 package name、bin、Node engine 和公开 CLI 文件闭包保持兼容; +- Node 16 job 只安装根生产树并运行现有 Node 测试;现代 workspace、Web 和未来 Electron 只在 Node 24 构建; +- `contracts` 不依赖 Node、DOM、React 或 Electron;`core-client` 只依赖 contracts;App UI 不依赖 Node/Electron;Renderer 将来不得导入 Core; +- HTTP、Desktop 和 Mock transport 使用同一版本化 request/response/progress envelope;协议不兼容先于业务失败; +- Apply transport 输入严格为 `{schemaVersion: 1, planId}`;Legacy error adapter 按结构化 code/DTO 分类,不解析 message; +- 根 tarball 必须在真实临时目录安装并执行 help/status,而不是只依赖 workspace 开发环境或 pack 预览。 + +## Consequences + +现代应用可逐步迁移到共享包而不同时搬动高风险 Core;根 CLI 仍能独立安装。代价是 C4 到 C5 期间存在一个明确记录的 `web/` 源目录和 `apps/web` 依赖所有权分离状态。该过渡只允许持续到 C5 的 Web 迁移,不能形成第二套业务实现。 + +## Validation + +- Node 24:完整 `npm ci`、TypeScript build、Core checkJs、workspace contract tests、Web production build; +- Node 16.20.2 + npm 8:根 production-only `npm ci` 无 workspace/UI 链接;根 tarball 分别完成无 lifecycle 内容检查与正常 lifecycle 安装,实际 bin help、synthetic SQLite 创建/打开和显式临时 Codex Home `status --json`; +- packlist:不存在 `apps/`、`packages/`、workspace dist、Electron 或 Fixture; +- import contract:除 `packages/core -> src/public-api.js` 的单一过渡例外外,禁止深度导入; +- security:生产树 moderate/high/critical 为零,全树 high/critical 为零。 + +## Related + +- [保留 Node CLI 合同](0003-preserve-node-cli-contract.md) +- [共享 UI 通过 CoreClient](0007-shared-ui-through-core-client.md) +- [渐进迁移](0008-incremental-migration-no-big-bang-rewrite.md) +- [Electron 构建选择](0010-electron-vite-and-electron-builder.md) diff --git a/docs/architecture/contracts/CLI_CONTRACT_ZH.md b/docs/architecture/contracts/CLI_CONTRACT_ZH.md index dff534e..2789d71 100644 --- a/docs/architecture/contracts/CLI_CONTRACT_ZH.md +++ b/docs/architecture/contracts/CLI_CONTRACT_ZH.md @@ -54,6 +54,12 @@ - 若未来提高最低 Node.js 版本,必须独立评估 SemVer、发布说明和安装失败体验。 - npm 包仍应提供可直接运行的 JavaScript;CLI 用户不需要安装 TypeScript。 +### 2.3 vNext C4 安装入口兼容 + +根 npm tarball 仍以 `src/cli.js` 作为 bin 目标。判断该模块是否为直接执行入口时,必须分别规范化 `process.argv[1]` 与 `import.meta.url` 对应文件的物理路径;Windows 比较不区分大小写。这样可兼容 npm shim、临时安装目录、8.3 短路径与符号链接解析后的长路径。 + +该规范化只用于判断是否启动 CLI,不参与 Codex Home、SQLite Home 或任意业务目标解析。无法取得物理路径时可退回绝对词法路径,但不得因为两侧一种是短路径、另一种是长路径而静默跳过 CLI。已打包 tarball 的 `help` 和显式临时 Codex Home `status --json` 是该行为的可执行合同。 + ## 3. Codex Home 与 SQLite Home ### 3.1 Codex Home diff --git a/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md b/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md index f290a0f..994795e 100644 --- a/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md +++ b/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md @@ -924,6 +924,14 @@ V1/C3 已实现上述边界;`runSync/runSwitch/runRestore/runWatch` 仍作为 - Watch 保持单飞、合并重复事件,每次重新 Prepare/Apply 并获取双锁。遇到本进程人工操作时保留当前事件批次、等待 operation completion 后只运行一次合并 follow-up;外部 Busy/不可验证锁不轮询、不计入连续业务失败,并等待新的受保护文件事件。 - Diagnostics 只返回有界安全元数据;不得读取、复制或序列化 `auth.json`、token、凭据或消息正文。 +### 16.3 C4 Trusted Profile Facade 与 CoreClient + +- `packages/core` 的模块导出仅为 `createCoreFacade({resolveProfile})`;factory 返回对象的业务方法集合精确等于本节 15 个目标方法。根 `src/public-api.js` 继续承载 CLI 与迁移适配器,不被描述为 Renderer 稳定 API。 +- `resolveProfile({profileId, profileRevision?})` 只能由 Local Web Host、Electron Main/Utility Host 或测试 Host 注入,返回可信的 `{id, revision, codexHome, sqliteHome?}`。Facade 必须验证 ID、revision 和绝对路径;selector revision 漂移时 fail closed,不能回退到 `CODEX_HOME` 或默认用户目录。 +- UI/HTTP/IPC 产品输入只包含 profile ID/revision、Provider/model mode、受管 backupId 等产品字段;不得携带 `codexHome`、`sqliteHome`、backup path 或底层 apply 参数。Apply 仍精确只收 schemaVersion/planId。 +- 备份列表在 facade 处移除 backup root、绝对 path 与 metadata 中的存储路径,只返回 `backupId`、size 和有界展示元数据;History 列表移除 rollout path 与首条消息预览,正文只能由用户明确调用详情方法后读取。 +- `TransportCoreClient` 对成功 payload 执行按方法的最小 runtime guard;协议版本不兼容映射为固定 `PROTOCOL_VERSION_MISMATCH`,其他畸形 envelope/result 收口为固定 `INTERNAL_ERROR`。HTTP 非 2xx 不得携带成功 envelope。 + ## 17. Phase 1 提取要求 Phase 1 只提取边界,不改变算法或结果: diff --git a/docs/architecture/contracts/ERROR_CODES_ZH.md b/docs/architecture/contracts/ERROR_CODES_ZH.md index b5d568b..05eb5e5 100644 --- a/docs/architecture/contracts/ERROR_CODES_ZH.md +++ b/docs/architecture/contracts/ERROR_CODES_ZH.md @@ -1,6 +1,6 @@ # vNext Error Code 合同 -> **状态:Accepted(阶段 0 合同;V1 C1 Core DTO 与 C2 CLI Adapter 已实施)** +> **状态:Accepted(阶段 0 合同;V1 C1 Core DTO、C2 CLI Adapter 与 C4 CoreClient 公共净化已实施)** > > **日期:2026-08-24;实现增量:2026-08-25** > @@ -27,15 +27,15 @@ interface CoreErrorDto { recoveryRequired: boolean; operationId?: string; details?: Record; - suggestedAction?: string; } ``` 稳定性规则: - `code` 是程序判断依据;Canonical Code 使用大写蛇形命名。 -- `message`、`suggestedAction` 可以改进、翻译或因平台而不同,不是机器合同。 -- `details` 只承载结构化诊断,不得包含认证信息、Token、消息正文或未脱敏的敏感内容。 +- C4 CoreClient/HTTP/IPC 公共边界的 `message` 按 code 使用固定安全文案;UI 本地化只依据 code,不能回显内部异常原文。Core 内部异常仍可携带操作建议,但 `suggestedAction` 不进入公共 DTO。 +- 公共 `details` 只允许 `busyScope`、`lockScope`、`causeCode`、`reason`、`missing`、`sqliteHomeSource`、SQLite 整数错误码和 `operationKind` 的固定枚举/范围;未知 key、路径、认证信息、Token、消息正文或任意建议文本全部丢弃。 +- 公共 `operationId` 只接受 UUID;不可信值不得透传。 - 普通用户默认不接收 Error Stack;诊断日志也必须遵守相同的隐私边界。 - 一个失败只选择一个最能指导恢复动作的顶层 Canonical Code;底层 OS/SQLite Code 可放入安全的 `details.causeCode`。 - Partial Result 可以携带 warning 级错误码,但不能把未完成写入伪装成完整成功。 @@ -150,6 +150,7 @@ Adapter 必须按 typed exception、明确属性和调用上下文映射。禁 ### Core / Core Runtime - 返回 Canonical Code 和稳定 DTO。 +- CoreClient transport 会重新验证固定文案、severity/retryable/recoveryRequired、UUID 与 details 白名单;畸形错误或成功 payload 统一收口为安全 `INTERNAL_ERROR`,protocolVersion 不兼容单独为 `PROTOCOL_VERSION_MISMATCH`。 - Runtime Crash 与业务失败分开;重启后首先检查 Pending Journal。 - Progress Event 失败不能替换最终业务错误。 @@ -195,4 +196,4 @@ JSON Mode 的当前映射为: ## 8. 阶段实现边界 -阶段 0 冻结分类与映射;V1 C1 已实现 Node 异常类和安全 DTO,C2 已实现 opt-in CLI JSON/退出码与真实子进程 Contract Test。Web 响应和 .NET protocol 0.4 仍保持迁移期兼容,尚不能据此声称跨入口错误合同已经全部统一。 +阶段 0 冻结分类与映射;V1 C1 已实现 Node 异常类和 DTO,C2 已实现 opt-in CLI JSON/退出码与真实子进程 Contract Test,C4 已实现 Contracts/CoreClient 的公共错误净化与 runtime guard。现有 Web 路由要到 C5 接入统一 envelope,.NET protocol 0.4 仍保持迁移期兼容,尚不能据此声称跨入口错误合同已经全部统一。 diff --git a/docs/migration/BEHAVIOR_FIXTURES_ZH.md b/docs/migration/BEHAVIOR_FIXTURES_ZH.md index 4988d9b..74633df 100644 --- a/docs/migration/BEHAVIOR_FIXTURES_ZH.md +++ b/docs/migration/BEHAVIOR_FIXTURES_ZH.md @@ -1,6 +1,6 @@ # vNext 行为兼容 Fixture 清单 -> **状态:Accepted(阶段 0 语义清单;C2 动态 CLI Fixture 已实现,共享 Corpus 尚未创建)** +> **状态:Accepted(阶段 0 语义清单;C2 动态 CLI Fixture 与 C4 安全 Runner/Schema 已实现,共享静态 Corpus 尚未创建)** > > **日期:2026-08-24** > @@ -12,7 +12,7 @@ 本文冻结需要被共享 Fixture 表达的场景、输入语义和验收结果,用于迁移期间比较 Node 与 .NET,并为 Node 单核心提供长期回归证据。 -阶段 0 **不创建** `packages/test-fixtures/`,也不提交伪造的 SQLite、锁文件或平台专属二进制。当前 Node 测试使用临时目录动态构造输入,.NET 测试使用 `TestCodexHomeFixture` 和 GUI E2E `IsolatedFixture`;后续实现共享 Corpus 时应复用这些已验证的构造能力。 +阶段 0 没有创建 `packages/test-fixtures/`。C4 已建立私有 workspace、严格 schema 和只向临时目录复制的安全 Runner,但尚未检入共享静态 Corpus、SQLite 二进制、锁文件或平台专属二进制。当前 Node 测试继续使用临时目录动态构造输入,.NET 测试使用 `TestCodexHomeFixture` 和 GUI E2E `IsolatedFixture`;后续共享 Corpus 应复用这些已验证的构造能力。 Fixture 不是用户数据样本,严禁从真实 `~/.codex`、认证文件或私人会话复制内容。 @@ -124,12 +124,13 @@ C2 使用真实 Node 子进程和完全位于临时目录的最小 Core fixture | `cli-json-daemon-rejection` | `watch --json`、`web --json` | 在创建长运行状态、runtime descriptor 或浏览器进程前返回 `INVALID_INPUT`/exit 2 | | `cli-json-redaction` | 非法参数值、unknown/typed error、恶意 details、越权 result 字段、循环结果、stdout EPIPE | 固定错误文案与命令级字段 allowlist 不泄漏 stack/cause/secret/token/prompt/message body;terminal writer 最多尝试一次 stdout | | `cli-human-compat` | 不传 `--json` 运行既有 help/input/sync 路径 | Human 输出和既有 `0/1`、partial 行为不变 | +| `installed-root-entrypoint` | 从真实根 npm tarball 安装后,经 npm bin shim/Windows 规范化路径运行 `help` 与临时 Home `status --json` | CLI 必须实际执行并返回合同输出;不得因 `process.argv[1]` 与模块 URL 的短/长路径、大小写或链接形式不同而静默退出 | 这些用例当前由 `test/cli-json-contract.test.js`、`test/cli-json.test.js`、`test-support/cli-json-driver.js` 和真实 Core Sync 回归承载;未来迁入 `packages/test-fixtures` 时必须保持同一外部合同。 ## 9. 未来 Corpus 建议结构 -本节只定义目标,不表示目录已经存在: +目录骨架、Schema 和安全 Runner 已在 C4 存在;`static/` 与 `builders/` 仍是目标,不表示共享 Corpus 已经检入: ```text packages/test-fixtures/ diff --git a/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md b/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md index c0aba94..d3226ac 100644 --- a/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md +++ b/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md @@ -57,7 +57,7 @@ 退出门槛: -- ADR-0001~ADR-0013 均为 Accepted,历史 v0.4 ADR 不与 vNext 编号混淆; +- 阶段 0 的 ADR-0001~ADR-0013 均为 Accepted,后续 checkpoint ADR 不追溯改变该冻结证据,历史 v0.4 ADR 不与 vNext 编号混淆; - Core 外部行为、CLI、Error Code、Fixture 和本索引可互相导航; - 每份文档明确“当前已实现”与“vNext 目标”; - 本阶段不修改运行代码、CLI 输出、Error Class 或运行代码目录结构; @@ -164,7 +164,7 @@ | C1 | Core Public API 与结构化错误 | C0 | CLI/Web 仅走 Public API;Canonical/Legacy Adapter;错误合同测试 | In Progress(V1,本地门禁通过) | | C2 | CLI `--json` | C1 | stdout 单一 JSON、stderr 日志、JSON Exit Code 与 Schema 合同 | In Progress(V1,本地门禁通过) | | C3 | Prepare/Apply、协调器与双层锁 | C1、C2 | Revision/Plan/Apply、Node/.NET 双层资源锁、真实争锁证据 | In Progress(V1,本地门禁通过) | -| C4 | Workspace、Core、Contracts、CoreClient | C1~C3(Phase 1 全部门槛已验证) | 不搬高风险算法;根 npm CLI tarball/Node 16 兼容 | Pending | +| C4 | Workspace、Core、Contracts、CoreClient | C1~C3(Phase 1 全部门槛已验证) | 不搬高风险算法;根 npm CLI tarball/Node 16 兼容 | In Progress(V1,本地门禁通过) | | C5 | 共享 React UI 与 Web | C4 | AppShell/Features/HttpCoreClient;Web 安全与功能等价;阶段 2 门槛 | Pending | | C6 | Electron 安全骨架、Utility Runtime、只读能力 | C5(Phase 2 全部门槛已验证) | 安全窗口/IPC、握手、crash recovery、三平台只读 smoke | Pending | | C7 | Electron Sync/Switch | C6(Phase 3 全部门槛已验证) | Prepare/Apply、Busy/Partial/Cancel、Backup/Restore 回环 | Pending | @@ -217,4 +217,4 @@ Node 与 .NET 在同一 Fixture 上不一致时,PR 必须记录: ## 8. 本 PR 完成后的下一步 -V1 的下一项是 `C4`:建立 Workspace、Contracts/CoreClient 与包边界,同时保持根 npm CLI 的 Node 16 合同。C1 的本地证据见 [C1 Public API 与结构化错误证据](evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md),C2 证据见 [C2 CLI JSON 合同证据](evidence/C2_CLI_JSON_2026-08-25.md),C3 证据见 [C3 Plan/Apply 与双层锁证据](evidence/C3_PLAN_APPLY_DUAL_LOCK_2026-08-25.md);这些本地验证不使 Phase 1 在最终 PR 合入前 Completed。 +V1 的下一项是 `C5`:把现有 Web 迁入共享 React AppShell/Feature 边界并实际接入 `HttpCoreClient`,同时闭合阶段 2 的跨运行时 Fixture 门槛。C1 的本地证据见 [C1 Public API 与结构化错误证据](evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md),C2 证据见 [C2 CLI JSON 合同证据](evidence/C2_CLI_JSON_2026-08-25.md),C3 证据见 [C3 Plan/Apply 与双层锁证据](evidence/C3_PLAN_APPLY_DUAL_LOCK_2026-08-25.md),C4 证据见 [C4 Workspace、Core 与 CoreClient 证据](evidence/C4_WORKSPACE_CORE_CLIENT_2026-08-25.md);这些本地验证不使对应 Phase 在最终 PR 合入前 Completed。 diff --git a/docs/migration/evidence/C4_WORKSPACE_CORE_CLIENT_2026-08-25.md b/docs/migration/evidence/C4_WORKSPACE_CORE_CLIENT_2026-08-25.md new file mode 100644 index 0000000..bed32be --- /dev/null +++ b/docs/migration/evidence/C4_WORKSPACE_CORE_CLIENT_2026-08-25.md @@ -0,0 +1,55 @@ +# C4 Workspace、Core、Contracts 与 CoreClient 证据(2026-08-25) + +状态:本地门禁通过,等待远端 CI。输入 checkpoint 为 `166f6ff`;C4 最终 commit SHA 在本 checkpoint 提交后及 C10 evidence bundle 中索引。 + +## 已实现边界 + +- 根启用 npm workspaces 和单一 lockfile,建立 `apps/cli`、`apps/web`、`apps/desktop`、`packages/core`、`packages/contracts`、`packages/core-client`、`packages/app-ui`、`packages/design-system`、`packages/test-fixtures`。所有内部包均 private,根包仍是唯一 npm 发布面。 +- `packages/core` 是可导入、可测试、checkJs 的 ESM JavaScript bridge,只允许导入 `src/public-api.js`;模块只导出 `createCoreFacade({resolveProfile})`,由可信 Host 将 profile ID/revision 解析为绝对路径,facade 实例精确提供 15 个 Core 方法。无效/mismatched profile 在接触 Core 路径前 fail closed,显式测试证明即使进程 `CODEX_HOME` 指向另一目录也只读取已选 profile。没有搬迁或复制锁、备份、journal、SQLite、rollout 与 service 算法。 +- `packages/contracts` 用 TypeScript 固化 schema/protocol v1、Core Error DTO、Status/Plan/Operation/Progress DTO、固定方法集合以及 request/response/progress envelope。所有产品输入拒绝任意路径/未知字段;Apply 只接受 planId;成功 payload 有按方法 runtime guard;ProgressEvent 拒绝消息正文、路径和诊断扩展字段。 +- `packages/core-client` 用同一接口实现 `TransportCoreClient`、`HttpCoreClient` 与 `MockCoreClient`;HTTP request 上限为 64 KiB,响应必须匹配 protocolVersion/requestId,非 2xx 不能返回成功 envelope。公共错误使用固定 code 文案、canonical severity/retryability、UUID 和 details 白名单;未知异常文本、路径、Token、消息正文和 suggestedAction 不透传,畸形 payload 收口为安全 `INTERNAL_ERROR`。 +- `packages/test-fixtures` 落地 schema v1、严格字段/安全 ID、无真实用户数据标记、临时复制并自动清理的 runner;源根和树拒绝 symlink/reparse、敏感文件名和越界输入,复制后重新验证 staged tree/manifest,callback 失败仍清理。Node/.NET 未裁决差异固定为 `blocked`。 +- `app-ui`、`design-system` 和 `desktop` 是可编译/可测试的受限 ownership boundary。它们明确标为 C4 contract/tokens/not-enabled 状态;没有提前声称 React 页面、Electron BrowserWindow/IPC/Utility Process 或写能力已实现。 +- 根 Web 依赖迁移到 `apps/web` 的精确 devDependencies;根不再声明 React。尚未搬迁的 `web/` 源仍由该 workspace 构建;根 production-only npm 8 安装树不含 React/Vite/TypeScript/Electron,tarball 不依赖 workspace symlink。 +- 真实 tarball smoke 暴露并修复了 Windows 安装目录 8.3 short-path 导致 CLI direct-execution 判断失效的问题;入口现在比较两侧 realpath,并由安装态 help/status 长期回归。 + +## 依赖与安全证据 + +依赖选择和兼容理由记录于 [ADR-0014](../../adr/0014-npm-workspace-and-dependency-boundaries.md):TypeScript `7.0.2`、`@types/node 24.13.3`、Vite `8.2.2`、React plugin `6.1.0`、React/React DOM `19.2.8`,全部为 2026-08-25 对应稳定线的 exact version。现有 `better-sqlite3 8.7.0` 为根 Node 16 optional fallback,未强升到不兼容版本。 + +- 全部仓库直接依赖版本由静态门禁拒绝 `^`、`~`、`workspace:*` 和 `file:`;传递树由单一 lockfile 锁定。 +- `npm audit --omit=dev --audit-level=moderate`:0 vulnerabilities。 +- `npm audit --audit-level=high`:0 vulnerabilities。 +- 根 packlist 为 90 entries;不存在 `apps/`、`packages/`、workspace dist、node_modules 或 Electron runtime。当前既有 Web source map 仍在 packlist,按计划由 C9 移除。 + +## 本地验证 + +环境:Windows x64,Node `v24.11.1`,npm `11.10.0`,Node 16 smoke 使用 Node `v16.20.2` + npm `8.19.4`;输入 SHA `166f6ff`。 + +| 命令 | 结果 | +| --- | --- | +| `npm run workspaces:build` | TypeScript project references 与 Core checkJs 通过,0 errors | +| `npm run workspaces:test` | 29 passed,0 failed/skipped;覆盖可信 Profile facade、Contracts 输入/输出/error guard、HTTP/Mock Client、Fixture hardening 与 ownership boundary | +| `node scripts/verify-workspace-boundaries.js` | package、direct dependency、import direction、root publish allowlist 全部通过 | +| `npm test` | 343 passed,0 failed/skipped | +| `npm run web:build` | Vite 8.2.2 + React 19.2.8 production build 成功,22 modules transformed | +| `npx --yes --package node@16.20.2 node --test test/workspace-boundaries.test.js test/public-api-contract.test.js test/cli-json.test.js` | 实际 Node `v16.20.2`;3 个目标文件通过 | +| Node 16.20.2 + npm 8.19.4:`npm ci --workspaces=false --omit=dev`、`runtime:verify-node16`、`package:verify-root-tree` | 真正 root-only production install 通过;无 React/Vite/TypeScript/Electron/workspace link | +| Node 16.20.2 + npm 8.19.4:`npm run package:smoke:lifecycle` | tarball 正常 lifecycle 安装;真实 bin shim help、`better-sqlite3` 创建/打开 synthetic State DB、显式临时 Home `status --json` 通过 | +| `npm run package:smoke` | Node 24 tarball 安装态 smoke 通过 | +| `npm audit --omit=dev --audit-level=moderate` | 0 vulnerabilities | +| `npm audit --audit-level=high` | 0 vulnerabilities | +| `npm pack --dry-run --json` | 90 entries;无 workspace/Electron/Fixture;既有 source map 已登记为 C9 gap | +| `dotnet build CodexProviderSync.sln --configuration Release` | 13 projects;0 warnings / 0 errors | +| `dotnet test desktop/CodexProviderSync.Core.Tests/... --no-build` | 220 passed,1 个 Windows WSL safety 测试按平台预期 skipped | +| `dotnet test`(Application / Automation / App / GUI E2E,Release `--no-build`) | 49 / 27 / 67 / 36 passed,0 failed/skipped | + +CI 新增 Windows/Ubuntu Node 24 workspace contract job,以及 Windows/Ubuntu Node 16.20.2 + npm 8 root-only install、正常 tarball lifecycle、SQLite driver/bin smoke;所有 job 被 `ci-gate` 视为 required,失败、取消或跳过都会阻断。npm publish 与 tag release workflow 也在任何发布动作前复用 workspace/root package 门禁;本 checkpoint 没有触发发布。 + +## 已知未闭合项 + +- C4 只建立共享 UI ownership 和 CoreClient transport;现有 Web 尚未通过 `HttpCoreClient`,现代页面、i18n/theme/accessibility 与 Web 安全等价属于 C5。C4 不使 Phase 2 Completed。 +- `HttpCoreClient` 当前通过 fake transport 契约验证;Local Web Host 的统一 `/api/core` envelope handler 与现有 pairing/profile/storage 安全规则接入属于 C5,不能把当前 client package 描述为已上线 Web transport。 +- 双向 Node/.NET Backup Round-trip 和 cross-runtime Foreign Pending Restore 的共享 Fixture 证据仍是 Phase 2 退出门槛,必须在 C5 结束前闭合;目前只有 schema/runner/difference format 落地,未宣称运行时等价。 +- `apps/desktop` 不含 Electron 依赖和可运行 runtime;安全 BrowserWindow、Preload、IPC、Utility Process 与只读能力属于 C6。 +- 根 tarball 的既有 Web source map 仍存在,必须在 C9 的包内容扫描中移除;没有 tag、npm/GitHub Release、签名、公证或更新通道写入。 diff --git a/package-lock.json b/package-lock.json index 4388ec3..d2141c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,16 +8,16 @@ "name": "@dailin521/codex-provider-sync", "version": "0.5.0", "license": "MIT", - "dependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, + "workspaces": [ + "apps/*", + "packages/*" + ], "bin": { "codex-provider": "src/cli.js" }, "devDependencies": { - "@vitejs/plugin-react": "6.1.0", - "vite": "8.2.2" + "@types/node": "24.13.3", + "typescript": "7.0.2" }, "engines": { "node": ">=16.20.2" @@ -26,6 +26,73 @@ "better-sqlite3": "8.7.0" } }, + "apps/cli": { + "name": "@codex-provider-sync/cli", + "version": "0.0.0", + "engines": { + "node": ">=16.20.2" + } + }, + "apps/desktop": { + "name": "@codex-provider-sync/desktop", + "version": "0.0.0", + "dependencies": { + "@codex-provider-sync/contracts": "0.0.0", + "@codex-provider-sync/core-client": "0.0.0" + }, + "engines": { + "node": ">=24" + } + }, + "apps/web": { + "name": "@codex-provider-sync/web", + "version": "0.0.0", + "devDependencies": { + "@vitejs/plugin-react": "6.1.0", + "react": "19.2.8", + "react-dom": "19.2.8", + "vite": "8.2.2" + }, + "engines": { + "node": ">=24" + } + }, + "node_modules/@codex-provider-sync/app-ui": { + "resolved": "packages/app-ui", + "link": true + }, + "node_modules/@codex-provider-sync/cli": { + "resolved": "apps/cli", + "link": true + }, + "node_modules/@codex-provider-sync/contracts": { + "resolved": "packages/contracts", + "link": true + }, + "node_modules/@codex-provider-sync/core": { + "resolved": "packages/core", + "link": true + }, + "node_modules/@codex-provider-sync/core-client": { + "resolved": "packages/core-client", + "link": true + }, + "node_modules/@codex-provider-sync/design-system": { + "resolved": "packages/design-system", + "link": true + }, + "node_modules/@codex-provider-sync/desktop": { + "resolved": "apps/desktop", + "link": true + }, + "node_modules/@codex-provider-sync/test-fixtures": { + "resolved": "packages/test-fixtures", + "link": true + }, + "node_modules/@codex-provider-sync/web": { + "resolved": "apps/web", + "link": true + }, "node_modules/@oxc-project/types": { "version": "0.146.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", @@ -298,6 +365,356 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/@vitejs/plugin-react": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", @@ -543,12 +960,6 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "optional": true }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, "node_modules/lightningcss": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", @@ -810,18 +1221,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -997,28 +1396,26 @@ } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "dev": true, "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "dev": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.2.8" } }, "node_modules/readable-stream": { @@ -1090,13 +1487,11 @@ "optional": true }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "dev": true, + "license": "MIT" }, "node_modules/semver": { "version": "7.8.4", @@ -1240,6 +1635,48 @@ "node": "*" } }, + "node_modules/typescript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc" + }, + "engines": { + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -1329,6 +1766,59 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "optional": true + }, + "packages/app-ui": { + "name": "@codex-provider-sync/app-ui", + "version": "0.0.0", + "dependencies": { + "@codex-provider-sync/contracts": "0.0.0", + "@codex-provider-sync/core-client": "0.0.0", + "@codex-provider-sync/design-system": "0.0.0" + }, + "engines": { + "node": ">=24" + } + }, + "packages/contracts": { + "name": "@codex-provider-sync/contracts", + "version": "0.0.0", + "engines": { + "node": ">=24" + } + }, + "packages/core": { + "name": "@codex-provider-sync/core", + "version": "0.0.0", + "dependencies": { + "@codex-provider-sync/contracts": "0.0.0" + }, + "engines": { + "node": ">=24" + } + }, + "packages/core-client": { + "name": "@codex-provider-sync/core-client", + "version": "0.0.0", + "dependencies": { + "@codex-provider-sync/contracts": "0.0.0" + }, + "engines": { + "node": ">=24" + } + }, + "packages/design-system": { + "name": "@codex-provider-sync/design-system", + "version": "0.0.0", + "engines": { + "node": ">=24" + } + }, + "packages/test-fixtures": { + "name": "@codex-provider-sync/test-fixtures", + "version": "0.0.0", + "engines": { + "node": ">=24" + } } } } diff --git a/package.json b/package.json index e030549..a242403 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,10 @@ "version": "0.5.0", "description": "Synchronize Codex session provider metadata across rollout files and SQLite state.", "type": "module", + "workspaces": [ + "apps/*", + "packages/*" + ], "files": [ "README.md", "CHANGELOG.md", @@ -19,8 +23,15 @@ }, "scripts": { "test": "node --test", - "web:build": "vite build --config web/vite.config.js", + "web:build": "npm run build --workspace @codex-provider-sync/web", "web:start": "node src/cli.js web", + "workspaces:build": "tsc -b tsconfig.workspaces.json && tsc -p packages/core/tsconfig.json", + "workspaces:test": "npm run test --workspaces --if-present", + "workspaces:check": "npm run workspaces:build && npm run workspaces:test && node scripts/verify-workspace-boundaries.js", + "package:smoke": "node scripts/smoke-root-tarball.js", + "package:smoke:lifecycle": "node scripts/smoke-root-tarball.js --install-lifecycle", + "package:verify-root-tree": "node scripts/verify-root-production-tree.js", + "runtime:verify-node16": "node scripts/verify-node16-runtime.js", "publish:npm": "node scripts/publish-npm.js" }, "engines": { @@ -48,13 +59,9 @@ "optionalDependencies": { "better-sqlite3": "8.7.0" }, - "dependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, "devDependencies": { - "@vitejs/plugin-react": "6.1.0", - "vite": "8.2.2" + "@types/node": "24.13.3", + "typescript": "7.0.2" }, "overrides": { "node-releases": "2.0.18" diff --git a/packages/app-ui/checks/surface.contract.mjs b/packages/app-ui/checks/surface.contract.mjs new file mode 100644 index 0000000..9414359 --- /dev/null +++ b/packages/app-ui/checks/surface.contract.mjs @@ -0,0 +1,18 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { APP_ROUTES, APP_UI_MIGRATION_STATE } from "../dist/index.js"; + +test("app-ui owns the complete target navigation vocabulary", () => { + assert.deepEqual(APP_ROUTES, [ + "overview", + "sync", + "switch-provider", + "backups-restore", + "history", + "profiles", + "diagnostics", + "settings" + ]); + assert.equal(APP_UI_MIGRATION_STATE, "contract-only-c4"); +}); diff --git a/packages/app-ui/package.json b/packages/app-ui/package.json new file mode 100644 index 0000000..ef73971 --- /dev/null +++ b/packages/app-ui/package.json @@ -0,0 +1,24 @@ +{ + "name": "@codex-provider-sync/app-ui", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "tsc -b", + "test": "node --test checks/surface.contract.mjs" + }, + "engines": { + "node": ">=24" + }, + "dependencies": { + "@codex-provider-sync/contracts": "0.0.0", + "@codex-provider-sync/core-client": "0.0.0", + "@codex-provider-sync/design-system": "0.0.0" + } +} diff --git a/packages/app-ui/src/index.ts b/packages/app-ui/src/index.ts new file mode 100644 index 0000000..c0e79fb --- /dev/null +++ b/packages/app-ui/src/index.ts @@ -0,0 +1,26 @@ +import type { CoreClient } from "@codex-provider-sync/core-client"; +import type { SupportedLocale, ThemeMode } from "@codex-provider-sync/design-system"; + +export const APP_ROUTES = [ + "overview", + "sync", + "switch-provider", + "backups-restore", + "history", + "profiles", + "diagnostics", + "settings" +] as const; + +export type AppRoute = typeof APP_ROUTES[number]; + +export interface AppShellDependencies { + core: CoreClient; + locale: SupportedLocale; + theme: ThemeMode; +} + +export const APP_UI_MIGRATION_STATE = "contract-only-c4" as const; + +// C5 supplies React, routing, queries, forms, validation and rendered pages. +// This package intentionally has no Electron or Node dependency. diff --git a/packages/app-ui/tsconfig.json b/packages/app-ui/tsconfig.json new file mode 100644 index 0000000..9c115ef --- /dev/null +++ b/packages/app-ui/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "dist" + }, + "include": [ + "src/**/*.ts" + ], + "references": [ + { "path": "../contracts" }, + { "path": "../core-client" }, + { "path": "../design-system" } + ] +} diff --git a/packages/contracts/checks/contracts.contract.mjs b/packages/contracts/checks/contracts.contract.mjs new file mode 100644 index 0000000..2ae4f75 --- /dev/null +++ b/packages/contracts/checks/contracts.contract.mjs @@ -0,0 +1,187 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { + CORE_METHODS, + ContractValidationError, + assertApplyPlanInput, + assertCoreErrorDto, + assertCoreMethodInput, + assertCoreMethodOutput, + assertCoreRequestEnvelope, + assertCoreResponseEnvelope, + assertProgressEvent, + createPublicCoreErrorDto, + createCoreRequestEnvelope +} from "../dist/index.js"; + +test("contract exposes the complete stable CoreClient method set", () => { + assert.deepEqual(CORE_METHODS, [ + "getStatus", + "prepareSync", + "applySync", + "prepareSwitch", + "applySwitch", + "listBackups", + "prepareRestore", + "applyRestore", + "pruneBackups", + "listHistory", + "getHistorySession", + "startWatch", + "stopWatch", + "getWatchStatus", + "getDiagnostics" + ]); +}); + +test("Apply input is opaque, versioned and exact", () => { + assert.doesNotThrow(() => assertApplyPlanInput({ schemaVersion: 1, planId: "opaque" })); + assert.throws( + () => assertApplyPlanInput({ schemaVersion: 1, planId: "opaque", provider: "openai" }), + ContractValidationError + ); +}); + +test("product inputs cannot carry paths or arbitrary apply/watch fields", () => { + assert.doesNotThrow(() => assertCoreMethodInput("startWatch", { + profile: { profileId: "default", profileRevision: "r1" }, + includeStateDb: true, + debounceMs: 0, + once: true + })); + assert.throws(() => assertCoreMethodInput("getStatus", { + profile: { profileId: "default" }, + codexHome: "C:/private" + })); + assert.throws(() => assertCoreMethodInput("prepareRestore", { + profile: { profileId: "default" }, + backupId: "managed", + restoreConfig: true, + restoreDatabase: true, + restoreSessions: true, + backupDir: "C:/private" + })); +}); + +test("protocol mismatch fails before request business validation", () => { + assert.throws( + () => assertCoreRequestEnvelope({ + protocolVersion: 2, + requestId: "request-1", + method: "getStatus", + payload: null + }), + (error) => error instanceof ContractValidationError + && error.code === "PROTOCOL_VERSION_MISMATCH" + ); +}); + +test("request and response envelopes preserve request correlation", () => { + const request = createCoreRequestEnvelope( + "getStatus", + { profile: { profileId: "default" } }, + "request-1" + ); + assert.doesNotThrow(() => assertCoreRequestEnvelope(request)); + assert.doesNotThrow(() => assertCoreResponseEnvelope({ + protocolVersion: 1, + requestId: "request-1", + ok: true, + result: {} + }, "request-1")); + assert.throws(() => assertCoreResponseEnvelope({ + protocolVersion: 1, + requestId: "request-2", + ok: true, + result: {} + }, "request-1")); +}); + +test("public errors use fixed messages and allowlisted details", () => { + const busy = createPublicCoreErrorDto("OPERATION_BUSY", { + details: { + busyScope: "state-db", + token: "must-not-cross", + path: "C:/private" + } + }); + assert.deepEqual(busy, { + code: "OPERATION_BUSY", + message: "Another write operation is using the protected resource.", + severity: "warning", + retryable: true, + recoveryRequired: false, + details: { busyScope: "state-db" } + }); + assert.doesNotThrow(() => assertCoreErrorDto(busy)); + assert.throws(() => assertCoreErrorDto({ ...busy, message: "private path" })); + assert.throws(() => assertCoreErrorDto({ ...busy, suggestedAction: "token=secret" })); + assert.throws(() => assertCoreErrorDto({ ...busy, details: { busyScope: "state-db", path: "private" } })); +}); + +test("method output guards reject structurally invalid successes", () => { + const status = { + schemaVersion: 1, + snapshotAt: "2026-08-25T00:00:00.000Z", + storageRevision: "storage", + profile: { id: "default", revision: "r1" }, + currentProvider: "openai", + rolloutCounts: { openai: 1 }, + sqliteCounts: { openai: 1 }, + codexHome: "redacted", + sqliteHome: "redacted", + sqliteHomeSource: "default", + backupSummary: { count: 0, totalBytes: 0 }, + pendingRecovery: false, + pendingTransactions: [], + operationInProgress: null, + rolloutScanComplete: true, + lockedRolloutFiles: [] + }; + assert.throws(() => assertCoreMethodOutput("getStatus", null)); + assert.throws(() => assertCoreMethodOutput("getStatus", { + schemaVersion: 1, + snapshotAt: "2026-08-25T00:00:00.000Z", + storageRevision: "storage", + profile: { id: "default", revision: "r1" }, + currentProvider: "openai", + lockedRolloutFiles: [] + })); + assert.throws(() => assertCoreMethodOutput("prepareSync", { schemaVersion: 1 })); + assert.throws(() => assertCoreMethodOutput("listBackups", { backups: [{ backupId: "b", sizeBytes: -1, metadata: {} }] })); + assert.throws(() => assertCoreMethodOutput("getStatus", { + ...status, + pendingTransactions: [{ leak: () => "private" }] + })); + assert.throws(() => assertCoreMethodOutput("getStatus", { + ...status, + operationInProgress: { leak: () => "private" } + })); + assert.throws(() => assertCoreMethodOutput("getDiagnostics", { + schemaVersion: 1, + generatedAt: "2026-08-25T00:00:00.000Z", + runtime: { leak: () => "private" }, + storage: {}, + provider: {}, + safety: {} + })); + assert.doesNotThrow(() => assertCoreMethodOutput("getWatchStatus", { + schemaVersion: 1, + watches: [] + })); +}); + +test("ProgressEvent cannot carry messages, paths or diagnostics", () => { + assert.doesNotThrow(() => assertProgressEvent({ + stage: "sqlite", + status: "running", + progress: 0.5, + count: 2 + })); + assert.throws(() => assertProgressEvent({ + stage: "history", + status: "running", + messageBody: "must not cross the progress channel" + })); +}); diff --git a/packages/contracts/package.json b/packages/contracts/package.json new file mode 100644 index 0000000..6b4c3e7 --- /dev/null +++ b/packages/contracts/package.json @@ -0,0 +1,19 @@ +{ + "name": "@codex-provider-sync/contracts", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "tsc -b", + "test": "node --test checks/contracts.contract.mjs" + }, + "engines": { + "node": ">=24" + } +} diff --git a/packages/contracts/src/dto.ts b/packages/contracts/src/dto.ts new file mode 100644 index 0000000..284b58e --- /dev/null +++ b/packages/contracts/src/dto.ts @@ -0,0 +1,269 @@ +import type { JsonObject, JsonValue } from "./json.js"; + +export const CONTRACT_SCHEMA_VERSION = 1 as const; +export const CORE_PROTOCOL_VERSION = 1 as const; + +export type ContractSchemaVersion = typeof CONTRACT_SCHEMA_VERSION; +export type CoreProtocolVersion = typeof CORE_PROTOCOL_VERSION; +export type OperationKind = "sync" | "switch" | "restore" | "prune" | "watch"; +export type OperationOutcome = + | "completed" + | "partial" + | "failed_rolled_back" + | "recovery_required" + | "cancelled" + | "stale"; + +export interface ProfileSelector { + profileId: string; + profileRevision?: string; +} + +export interface GetStatusInput { + profile: ProfileSelector; +} + +export interface PrepareSyncInput extends GetStatusInput { + keepCount?: number; +} + +export type SwitchModelMode = "provider-default" | "keep-root-model" | "explicit"; + +export interface PrepareSwitchInput extends GetStatusInput { + provider: string; + modelMode: SwitchModelMode; + model?: string; + keepCount?: number; +} + +export interface ApplyPlanInput { + schemaVersion: ContractSchemaVersion; + planId: string; +} + +export interface ListBackupsInput extends GetStatusInput {} + +export interface PrepareRestoreInput extends GetStatusInput { + backupId: string; + restoreConfig: boolean; + restoreDatabase: boolean; + restoreSessions: boolean; + allowSqliteHomeRelocation?: boolean; + relocationTargetProfileId?: string; +} + +export interface PruneBackupsInput extends GetStatusInput { + keepCount: number; +} + +export interface ListHistoryInput extends GetStatusInput { + page?: number; + pageSize?: number; + query?: string; + project?: string; + provider?: string; + archived?: "all" | "active" | "archived"; +} + +export interface GetHistorySessionInput extends GetStatusInput { + sessionId: string; + messageLimit?: number; +} + +export interface StartWatchInput extends GetStatusInput { + includeStateDb?: boolean; + debounceMs?: number; + once?: boolean; +} + +export interface WatchReferenceInput { + watchId: string; +} + +export interface GetWatchStatusInput { + watchId?: string; +} + +export interface GetDiagnosticsInput extends GetStatusInput {} + +export type ProviderDistribution = Record>; + +export interface StatusSnapshot { + schemaVersion: ContractSchemaVersion; + snapshotAt: string; + storageRevision: string; + profile: { + id: string; + revision: string; + }; + currentProvider: string; + currentModel?: string | null; + rolloutCounts: ProviderDistribution; + modelCounts?: ProviderDistribution; + sqliteCounts: JsonValue; + codexHome: string; + sqliteHome: string; + sqliteHomeSource: string; + backupSummary: { + count: number; + totalBytes: number; + }; + pendingRecovery: boolean; + pendingTransactions: JsonObject[]; + operationInProgress: JsonObject | null; + rolloutScanComplete: boolean; + lockedRolloutFiles: string[]; + [extension: string]: JsonValue | undefined; +} + +export interface PlanSummary { + schemaVersion: ContractSchemaVersion; + planId: string; + operation: "sync" | "switch" | "restore"; + createdAt: string; + expiresAt: string; + profile: { + id: string; + revision: string; + }; + storageRevision: string; + configRevision: string; + rolloutRevision: string; + stateDbRevision: string; + backupRevision?: string; + target: JsonObject; + impact: JsonObject; + warnings: string[]; + requiresConfirmation: boolean; +} + +export interface ManagedBackup { + backupId: string; + createdAt?: string; + sizeBytes: number; + metadata: JsonObject; +} + +export interface BackupList { + backups: ManagedBackup[]; +} + +export interface OperationResult { + schemaVersion: ContractSchemaVersion; + operationId: string; + operation: "sync" | "switch" | "restore"; + outcome: OperationOutcome; + backup: { backupId: string } | null; + warnings: string[]; + result: Result; +} + +export interface PruneBackupsResult { + deletedCount: number; + remainingCount: number; + freedBytes: number; +} + +export interface HistorySessionSummary { + id: string; + title: string; + cwd: string; + provider: string; + model?: string | null; + archived: boolean; + createdAt?: string; + updatedAt: string; + messageCount: number; +} + +export interface HistoryPage { + page: number; + pageSize: number; + total: number; + hasNextPage: boolean; + sessions: HistorySessionSummary[]; +} + +export interface HistoryMessage { + role: string; + text: string; + timestamp?: string; + sequence: number; +} + +export interface HistorySessionDetail { + session: HistorySessionSummary; + messages: HistoryMessage[]; + truncated: boolean; + returnedMessageCount: number; +} + +export interface WatchSnapshot { + schemaVersion: ContractSchemaVersion; + watchId: string; + status: "running" | "stopping" | "stopped"; + startedAt: string; + stoppedAt: string | null; + stopReason: string | null; + includeStateDb: boolean; + once: boolean; +} + +export interface WatchStatusList { + schemaVersion: ContractSchemaVersion; + watches: WatchSnapshot[]; +} + +export interface DiagnosticsSnapshot { + schemaVersion: ContractSchemaVersion; + generatedAt: string; + runtime: JsonObject; + storage: JsonObject; + provider: JsonObject; + safety: JsonObject; +} + +export interface ProgressEvent { + stage: string; + status: string; + progress?: number; + count?: number; +} + +export const CORE_METHODS = [ + "getStatus", + "prepareSync", + "applySync", + "prepareSwitch", + "applySwitch", + "listBackups", + "prepareRestore", + "applyRestore", + "pruneBackups", + "listHistory", + "getHistorySession", + "startWatch", + "stopWatch", + "getWatchStatus", + "getDiagnostics" +] as const; + +export type CoreMethodName = typeof CORE_METHODS[number]; + +export interface CoreMethodMap { + getStatus: { input: GetStatusInput; output: StatusSnapshot }; + prepareSync: { input: PrepareSyncInput; output: PlanSummary }; + applySync: { input: ApplyPlanInput; output: OperationResult }; + prepareSwitch: { input: PrepareSwitchInput; output: PlanSummary }; + applySwitch: { input: ApplyPlanInput; output: OperationResult }; + listBackups: { input: ListBackupsInput; output: BackupList }; + prepareRestore: { input: PrepareRestoreInput; output: PlanSummary }; + applyRestore: { input: ApplyPlanInput; output: OperationResult }; + pruneBackups: { input: PruneBackupsInput; output: PruneBackupsResult }; + listHistory: { input: ListHistoryInput; output: HistoryPage }; + getHistorySession: { input: GetHistorySessionInput; output: HistorySessionDetail }; + startWatch: { input: StartWatchInput; output: WatchSnapshot }; + stopWatch: { input: WatchReferenceInput; output: WatchSnapshot }; + getWatchStatus: { input: GetWatchStatusInput; output: WatchSnapshot | WatchStatusList }; + getDiagnostics: { input: GetDiagnosticsInput; output: DiagnosticsSnapshot }; +} diff --git a/packages/contracts/src/errors.ts b/packages/contracts/src/errors.ts new file mode 100644 index 0000000..190a5ff --- /dev/null +++ b/packages/contracts/src/errors.ts @@ -0,0 +1,235 @@ +import type { JsonObject } from "./json.js"; + +export const CORE_ERROR_CODES = [ + "INVALID_INPUT", + "PROFILE_CHANGED", + "STORAGE_CHANGED", + "PLAN_STALE", + "PLAN_EXPIRED", + "STALE_STATE", + "CODEX_HOME_NOT_FOUND", + "STATE_DB_NOT_FOUND", + "SQLITE_UNSUPPORTED_PATH", + "SQLITE_BUSY", + "SQLITE_UNREADABLE", + "ROLLOUT_LOCKED", + "ROLLOUT_CHANGED", + "PENDING_TRANSACTION", + "BACKUP_FAILED", + "SYNC_FAILED_ROLLED_BACK", + "RECOVERY_REQUIRED", + "RESTORE_VALIDATION_FAILED", + "PERMISSION_DENIED", + "OPERATION_BUSY", + "LOCK_UNVERIFIABLE", + "OPERATION_CANCELLED", + "CORE_RUNTIME_CRASHED", + "PROTOCOL_VERSION_MISMATCH", + "INTERNAL_ERROR" +] as const; + +export type CoreErrorCode = typeof CORE_ERROR_CODES[number]; +export type CoreErrorSeverity = "info" | "warning" | "error" | "fatal"; + +export interface CoreErrorDto { + code: CoreErrorCode; + message: string; + severity: CoreErrorSeverity; + retryable: boolean; + recoveryRequired: boolean; + operationId?: string; + details?: JsonObject; +} + +export const PUBLIC_CORE_ERROR_MESSAGES: Readonly> = Object.freeze({ + INVALID_INPUT: "The command input is invalid.", + PROFILE_CHANGED: "The selected profile changed. Prepare the operation again.", + STORAGE_CHANGED: "The resolved storage changed. Prepare the operation again.", + PLAN_STALE: "The prepared operation is stale. Prepare it again.", + PLAN_EXPIRED: "The prepared operation expired. Prepare it again.", + STALE_STATE: "The protected state changed. Prepare the operation again.", + CODEX_HOME_NOT_FOUND: "The selected Codex Home was not found.", + STATE_DB_NOT_FOUND: "The selected state database was not found.", + SQLITE_UNSUPPORTED_PATH: "The selected SQLite path is not supported by this runtime.", + SQLITE_BUSY: "The state database is busy. Close Codex processes and retry.", + SQLITE_UNREADABLE: "The state database is unreadable or malformed.", + ROLLOUT_LOCKED: "One or more rollout files are locked.", + ROLLOUT_CHANGED: "One or more rollout files changed during the operation.", + PENDING_TRANSACTION: "An unfinished transaction must be resolved before another write.", + BACKUP_FAILED: "The required backup could not be completed.", + SYNC_FAILED_ROLLED_BACK: "The operation failed and its changes were rolled back.", + RECOVERY_REQUIRED: "The operation requires explicit recovery.", + RESTORE_VALIDATION_FAILED: "The selected backup or restore target failed validation.", + PERMISSION_DENIED: "The operation does not have permission to access a required resource.", + OPERATION_BUSY: "Another write operation is using the protected resource.", + LOCK_UNVERIFIABLE: "The lock owner or protected resource identity cannot be verified.", + OPERATION_CANCELLED: "The operation was cancelled.", + CORE_RUNTIME_CRASHED: "The Core runtime stopped unexpectedly.", + PROTOCOL_VERSION_MISMATCH: "The client and Core protocol versions are incompatible.", + INTERNAL_ERROR: "An internal error occurred." +}); + +const WARNING_CODES = new Set([ + "PROFILE_CHANGED", + "STORAGE_CHANGED", + "PLAN_STALE", + "PLAN_EXPIRED", + "STALE_STATE", + "SQLITE_BUSY", + "ROLLOUT_LOCKED", + "ROLLOUT_CHANGED", + "OPERATION_BUSY" +]); +const RECOVERY_CODES = new Set(["PENDING_TRANSACTION", "RECOVERY_REQUIRED"]); +const LOCK_SCOPES = new Set(["codex-home", "state-db"]); +const SAFE_REASONS = new Set([ + "profile", + "config", + "storage", + "rollout", + "state-db", + "windows-wsl-unc" +]); +const SAFE_CAUSE_CODES = new Set([ + "ENOENT", + "EACCES", + "EPERM", + "EIO", + "EBUSY", + "SQLITE_BUSY", + "SQLITE_LOCKED", + "SQLITE_CORRUPT", + "SQLITE_NOTADB", + "ERR_SQLITE_ERROR" +]); +const SQLITE_HOME_SOURCES = new Set(["cli", "config", "env", "default"]); +const OPERATION_KINDS = new Set(["sync", "switch", "restore", "prune-backups", "watch"]); +const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; +const CORE_ERROR_CODE_SET = new Set(CORE_ERROR_CODES); + +function objectRecord(value: unknown): Record | null { + return value !== null && typeof value === "object" && !Array.isArray(value) + ? value as Record + : null; +} + +function record(value: unknown): Record | null { + if (value === null || typeof value !== "object" || Array.isArray(value)) return null; + const prototype = Object.getPrototypeOf(value); + return prototype === Object.prototype || prototype === null + ? value as Record + : null; +} + +function ownValue(source: Record | null, key: string): unknown { + if (!source) return undefined; + const descriptor = Object.getOwnPropertyDescriptor(source, key); + return descriptor && "value" in descriptor ? descriptor.value : undefined; +} + +function publicSeverity(code: CoreErrorCode): CoreErrorSeverity { + if (code === "OPERATION_CANCELLED") return "info"; + if (code === "CORE_RUNTIME_CRASHED" || code === "INTERNAL_ERROR") return "fatal"; + return WARNING_CODES.has(code) ? "warning" : "error"; +} + +function sanitizeDetails(value: unknown): JsonObject | undefined { + const source = record(value); + if (!source) return undefined; + const details: JsonObject = {}; + const busyScope = ownValue(source, "busyScope"); + const lockScope = ownValue(source, "lockScope"); + const causeCode = ownValue(source, "causeCode"); + const reason = ownValue(source, "reason"); + const missing = ownValue(source, "missing"); + const sqliteHomeSource = ownValue(source, "sqliteHomeSource"); + const operationKind = ownValue(source, "operationKind"); + if (LOCK_SCOPES.has(String(busyScope))) details.busyScope = String(busyScope); + if (LOCK_SCOPES.has(String(lockScope))) details.lockScope = String(lockScope); + if (SAFE_CAUSE_CODES.has(String(causeCode))) details.causeCode = String(causeCode); + if (SAFE_REASONS.has(String(reason))) details.reason = String(reason); + if (missing === "config.toml" || missing === "state_5.sqlite") details.missing = missing; + if (SQLITE_HOME_SOURCES.has(String(sqliteHomeSource))) { + details.sqliteHomeSource = String(sqliteHomeSource); + } + for (const key of ["sqlitePrimaryCode", "sqliteExtendedCode"] as const) { + const candidate = ownValue(source, key); + if (Number.isInteger(candidate) && Number(candidate) >= 0 && Number(candidate) <= 0xffff) { + details[key] = Number(candidate); + } + } + if (OPERATION_KINDS.has(String(operationKind))) details.operationKind = String(operationKind); + return Object.keys(details).length > 0 ? details : undefined; +} + +export function createPublicCoreErrorDto( + code: CoreErrorCode, + options: { operationId?: unknown; details?: unknown } = {} +): CoreErrorDto { + if (!CORE_ERROR_CODE_SET.has(code)) code = "INTERNAL_ERROR"; + if (code === "INTERNAL_ERROR") { + return { + code, + message: PUBLIC_CORE_ERROR_MESSAGES[code], + severity: "fatal", + retryable: false, + recoveryRequired: false + }; + } + const details = sanitizeDetails(options.details); + if ((code === "OPERATION_BUSY" && details?.busyScope === undefined) + || (code === "LOCK_UNVERIFIABLE" && details?.lockScope === undefined)) { + return createPublicCoreErrorDto("INTERNAL_ERROR"); + } + const operationId = typeof options.operationId === "string" && UUID_PATTERN.test(options.operationId) + ? options.operationId + : undefined; + return { + code, + message: PUBLIC_CORE_ERROR_MESSAGES[code], + severity: publicSeverity(code), + retryable: true, + recoveryRequired: RECOVERY_CODES.has(code), + ...(operationId ? { operationId } : {}), + ...(details ? { details } : {}) + }; +} + +export function sanitizePublicCoreErrorDto(value: unknown): CoreErrorDto { + const source = objectRecord(value); + const candidate = ownValue(source, "code"); + const code = typeof candidate === "string" && CORE_ERROR_CODE_SET.has(candidate) + ? candidate as CoreErrorCode + : "INTERNAL_ERROR"; + return createPublicCoreErrorDto(code, { + operationId: ownValue(source, "operationId"), + details: ownValue(source, "details") + }); +} + +export function isCanonicalPublicCoreErrorDto(value: unknown): value is CoreErrorDto { + const source = record(value); + if (!source) return false; + const code = ownValue(source, "code"); + if (typeof code !== "string" || !CORE_ERROR_CODE_SET.has(code)) return false; + const expected = sanitizePublicCoreErrorDto(source); + const sourceKeys = Object.keys(source).sort(); + const expectedKeys = Object.keys(expected).sort(); + if (sourceKeys.length !== expectedKeys.length + || sourceKeys.some((key, index) => key !== expectedKeys[index])) return false; + for (const key of expectedKeys) { + if (key === "details") continue; + if (ownValue(source, key) !== expected[key as keyof CoreErrorDto]) return false; + } + const actualDetails = record(ownValue(source, "details")); + const expectedDetails = expected.details; + if (expectedDetails === undefined) return actualDetails === null; + if (!actualDetails) return false; + const actualDetailKeys = Object.keys(actualDetails).sort(); + const expectedDetailKeys = Object.keys(expectedDetails).sort(); + return actualDetailKeys.length === expectedDetailKeys.length + && actualDetailKeys.every((key, index) => ( + key === expectedDetailKeys[index] + && ownValue(actualDetails, key) === expectedDetails[key] + )); +} diff --git a/packages/contracts/src/index.ts b/packages/contracts/src/index.ts new file mode 100644 index 0000000..5fcb9fd --- /dev/null +++ b/packages/contracts/src/index.ts @@ -0,0 +1,4 @@ +export * from "./dto.js"; +export * from "./errors.js"; +export * from "./json.js"; +export * from "./protocol.js"; diff --git a/packages/contracts/src/json.ts b/packages/contracts/src/json.ts new file mode 100644 index 0000000..ca82299 --- /dev/null +++ b/packages/contracts/src/json.ts @@ -0,0 +1,3 @@ +export type JsonPrimitive = null | boolean | number | string; +export type JsonValue = JsonPrimitive | JsonValue[] | JsonObject; +export type JsonObject = { [key: string]: JsonValue }; diff --git a/packages/contracts/src/protocol.ts b/packages/contracts/src/protocol.ts new file mode 100644 index 0000000..760d1d8 --- /dev/null +++ b/packages/contracts/src/protocol.ts @@ -0,0 +1,609 @@ +import { + CORE_METHODS, + CORE_PROTOCOL_VERSION, + type ApplyPlanInput, + type CoreMethodMap, + type CoreMethodName, + type CoreProtocolVersion, + type ProgressEvent +} from "./dto.js"; +import { + CORE_ERROR_CODES, + isCanonicalPublicCoreErrorDto, + type CoreErrorCode, + type CoreErrorDto, + type CoreErrorSeverity +} from "./errors.js"; + +export interface CoreRequestEnvelope { + protocolVersion: CoreProtocolVersion; + requestId: string; + operationId?: string; + method: M; + payload: CoreMethodMap[M]["input"]; +} + +export type CoreResponseEnvelope = + | { + protocolVersion: CoreProtocolVersion; + requestId: string; + operationId?: string; + ok: true; + result: CoreMethodMap[M]["output"]; + } + | { + protocolVersion: CoreProtocolVersion; + requestId: string; + operationId?: string; + ok: false; + error: CoreErrorDto; + }; + +export interface CoreProgressEnvelope { + protocolVersion: CoreProtocolVersion; + requestId: string; + operationId: string; + event: "progress"; + progress: ProgressEvent; +} + +const METHOD_SET = new Set(CORE_METHODS); +const ERROR_CODE_SET = new Set(CORE_ERROR_CODES); +const SEVERITY_SET = new Set(["info", "warning", "error", "fatal"]); + +function isRecord(value: unknown): value is Record { + return value !== null && typeof value === "object" && !Array.isArray(value); +} + +function isNonEmptyString(value: unknown): value is string { + return typeof value === "string" && value.length > 0; +} + +function exactObjectKeys(value: Record, allowed: readonly string[]): boolean { + const allowedSet = new Set(allowed); + return Object.keys(value).every((key) => allowedSet.has(key)); +} + +function assertProfileSelector(value: unknown): void { + if (!isRecord(value) + || !exactObjectKeys(value, ["profileId", "profileRevision"]) + || typeof value.profileId !== "string" + || !/^[A-Za-z0-9._-]{1,80}$/.test(value.profileId) + || (value.profileRevision !== undefined + && (!isNonEmptyString(value.profileRevision) || value.profileRevision.length > 512))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid profile selector."); + } +} + +function assertProfileInput( + value: unknown, + allowed: readonly string[] +): asserts value is Record { + if (!isRecord(value) + || !exactObjectKeys(value, ["profile", ...allowed])) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Core method input."); + } + assertProfileSelector(value.profile); +} + +export class ContractValidationError extends Error { + readonly code: "INVALID_INPUT" | "PROTOCOL_VERSION_MISMATCH"; + + constructor( + code: "INVALID_INPUT" | "PROTOCOL_VERSION_MISMATCH", + message: string + ) { + super(message); + this.name = "ContractValidationError"; + this.code = code; + } +} + +export function assertProtocolVersion(value: unknown): asserts value is CoreProtocolVersion { + if (value !== CORE_PROTOCOL_VERSION) { + throw new ContractValidationError( + "PROTOCOL_VERSION_MISMATCH", + `Unsupported Core protocol version: ${String(value)}.` + ); + } +} + +export function assertApplyPlanInput(value: unknown): asserts value is ApplyPlanInput { + if (!isRecord(value) + || Object.keys(value).sort().join(",") !== "planId,schemaVersion" + || value.schemaVersion !== 1 + || !isNonEmptyString(value.planId)) { + throw new ContractValidationError( + "INVALID_INPUT", + "Apply accepts exactly { schemaVersion: 1, planId }." + ); + } +} + +export function assertCoreMethodInput( + method: M, + value: unknown +): asserts value is CoreMethodMap[M]["input"] { + switch (method) { + case "applySync": + case "applySwitch": + case "applyRestore": + assertApplyPlanInput(value); + return; + case "getStatus": + case "listBackups": + case "getDiagnostics": + assertProfileInput(value, []); + return; + case "prepareSync": + assertProfileInput(value, ["keepCount"]); + if (value.keepCount !== undefined + && (!Number.isSafeInteger(value.keepCount) || Number(value.keepCount) < 1)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Sync retention count."); + } + return; + case "prepareSwitch": + assertProfileInput(value, ["provider", "modelMode", "model", "keepCount"]); + if (!isNonEmptyString(value.provider) + || !["provider-default", "keep-root-model", "explicit"].includes(String(value.modelMode)) + || (value.modelMode === "explicit" && !isNonEmptyString(value.model)) + || (value.modelMode !== "explicit" && value.model !== undefined) + || (value.keepCount !== undefined + && (!Number.isSafeInteger(value.keepCount) || Number(value.keepCount) < 1))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Switch Provider input."); + } + return; + case "prepareRestore": + assertProfileInput(value, [ + "backupId", + "restoreConfig", + "restoreDatabase", + "restoreSessions", + "allowSqliteHomeRelocation", + "relocationTargetProfileId" + ]); + if (!isNonEmptyString(value.backupId) + || typeof value.restoreConfig !== "boolean" + || typeof value.restoreDatabase !== "boolean" + || typeof value.restoreSessions !== "boolean" + || (value.allowSqliteHomeRelocation !== undefined + && typeof value.allowSqliteHomeRelocation !== "boolean") + || (value.relocationTargetProfileId !== undefined + && (typeof value.relocationTargetProfileId !== "string" + || !/^[A-Za-z0-9._-]{1,80}$/.test(value.relocationTargetProfileId))) + || (value.allowSqliteHomeRelocation === true + && (value.restoreConfig !== false || value.relocationTargetProfileId === undefined)) + || (value.relocationTargetProfileId !== undefined + && value.allowSqliteHomeRelocation !== true)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Restore input."); + } + return; + case "pruneBackups": + assertProfileInput(value, ["keepCount"]); + if (!Number.isSafeInteger(value.keepCount) || Number(value.keepCount) < 0) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Prune retention count."); + } + return; + case "listHistory": + assertProfileInput(value, ["page", "pageSize", "query", "project", "provider", "archived"]); + if ((value.page !== undefined && (!Number.isSafeInteger(value.page) || Number(value.page) < 1)) + || (value.pageSize !== undefined + && (!Number.isSafeInteger(value.pageSize) + || Number(value.pageSize) < 10 + || Number(value.pageSize) > 100)) + || ["query", "project", "provider"].some((key) => ( + value[key] !== undefined && typeof value[key] !== "string" + )) + || (value.archived !== undefined + && !["all", "active", "archived"].includes(String(value.archived)))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid History list input."); + } + return; + case "getHistorySession": + assertProfileInput(value, ["sessionId", "messageLimit"]); + if (!isNonEmptyString(value.sessionId) + || (value.messageLimit !== undefined + && (!Number.isSafeInteger(value.messageLimit) + || Number(value.messageLimit) < 1 + || Number(value.messageLimit) > 200))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid History detail input."); + } + return; + case "startWatch": + assertProfileInput(value, ["includeStateDb", "debounceMs", "once"]); + if ((value.includeStateDb !== undefined && typeof value.includeStateDb !== "boolean") + || (value.once !== undefined && typeof value.once !== "boolean") + || (value.debounceMs !== undefined + && (!Number.isSafeInteger(value.debounceMs) || Number(value.debounceMs) < 0))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Watch input."); + } + return; + case "stopWatch": + if (!isRecord(value) + || !exactObjectKeys(value, ["watchId"]) + || !isNonEmptyString(value.watchId)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Watch reference."); + } + return; + case "getWatchStatus": + if (!isRecord(value) + || !exactObjectKeys(value, ["watchId"]) + || (value.watchId !== undefined && !isNonEmptyString(value.watchId))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Watch status input."); + } + return; + default: + throw new ContractValidationError("INVALID_INPUT", "Unknown Core method input."); + } +} + +export function assertCoreErrorDto(value: unknown): asserts value is CoreErrorDto { + if (!isCanonicalPublicCoreErrorDto(value)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid public CoreErrorDto."); + } +} + +export function assertCoreRequestEnvelope( + value: unknown +): asserts value is CoreRequestEnvelope { + if (!isRecord(value)) { + throw new ContractValidationError("INVALID_INPUT", "Core request envelope must be an object."); + } + const allowedKeys = new Set(["protocolVersion", "requestId", "operationId", "method", "payload"]); + if (Object.keys(value).some((key) => !allowedKeys.has(key))) { + throw new ContractValidationError("INVALID_INPUT", "Core request envelope has unknown fields."); + } + assertProtocolVersion(value.protocolVersion); + if (!isNonEmptyString(value.requestId) + || !isNonEmptyString(value.method) + || !METHOD_SET.has(value.method) + || !isRecord(value.payload)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Core request envelope."); + } + if (value.operationId !== undefined && !isNonEmptyString(value.operationId)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Core request operationId."); + } + assertCoreMethodInput(value.method as M, value.payload); +} + +export function assertCoreResponseEnvelope( + value: unknown, + expectedRequestId?: string +): asserts value is CoreResponseEnvelope { + if (!isRecord(value)) { + throw new ContractValidationError("INVALID_INPUT", "Core response envelope must be an object."); + } + const allowedKeys = value.ok === true + ? new Set(["protocolVersion", "requestId", "operationId", "ok", "result"]) + : new Set(["protocolVersion", "requestId", "operationId", "ok", "error"]); + if (Object.keys(value).some((key) => !allowedKeys.has(key))) { + throw new ContractValidationError("INVALID_INPUT", "Core response envelope has unknown fields."); + } + assertProtocolVersion(value.protocolVersion); + if (!isNonEmptyString(value.requestId) + || (expectedRequestId !== undefined && value.requestId !== expectedRequestId) + || typeof value.ok !== "boolean") { + throw new ContractValidationError("INVALID_INPUT", "Invalid Core response envelope."); + } + if (value.operationId !== undefined && !isNonEmptyString(value.operationId)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Core response operationId."); + } + if (value.ok) { + if (!("result" in value) || "error" in value) { + throw new ContractValidationError("INVALID_INPUT", "Invalid successful Core response."); + } + } else { + if (!("error" in value) || "result" in value) { + throw new ContractValidationError("INVALID_INPUT", "Invalid failed Core response."); + } + assertCoreErrorDto(value.error); + } +} + +function requireSchemaObject(value: unknown, label: string): Record { + if (!isRecord(value) || value.schemaVersion !== 1) { + throw new ContractValidationError("INVALID_INPUT", `Invalid ${label}.`); + } + return value; +} + +function requireStringArray(value: unknown, label: string): asserts value is string[] { + if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string")) { + throw new ContractValidationError("INVALID_INPUT", `Invalid ${label}.`); + } +} + +function isNonNegativeInteger(value: unknown): boolean { + return Number.isSafeInteger(value) && Number(value) >= 0; +} + +function isNullableString(value: unknown): boolean { + return value === null || typeof value === "string"; +} + +function isJsonValue(value: unknown, depth = 0): boolean { + if (depth > 16) return false; + if (value === null || typeof value === "string" || typeof value === "boolean") return true; + if (typeof value === "number") return Number.isFinite(value); + if (Array.isArray(value)) return value.every((entry) => isJsonValue(entry, depth + 1)); + if (!isRecord(value)) return false; + return Object.values(value).every((entry) => isJsonValue(entry, depth + 1)); +} + +function isProviderDistribution(value: unknown): boolean { + if (!isRecord(value)) return false; + return Object.values(value).every((counts) => ( + isRecord(counts) && Object.values(counts).every(isNonNegativeInteger) + )); +} + +function isHistorySummary(value: unknown): boolean { + if (!isRecord(value)) return false; + return isNonEmptyString(value.id) + && typeof value.title === "string" + && typeof value.cwd === "string" + && isNonEmptyString(value.provider) + && typeof value.archived === "boolean" + && isNonEmptyString(value.updatedAt) + && isNonNegativeInteger(value.messageCount) + && (value.model === undefined || isNullableString(value.model)) + && (value.createdAt === undefined || isNonEmptyString(value.createdAt)); +} + +function assertWatchSnapshot(value: unknown): void { + const snapshot = requireSchemaObject(value, "WatchSnapshot"); + if (!isNonEmptyString(snapshot.watchId) + || !["running", "stopping", "stopped"].includes(String(snapshot.status)) + || !isNonEmptyString(snapshot.startedAt) + || !isNullableString(snapshot.stoppedAt) + || !isNullableString(snapshot.stopReason) + || typeof snapshot.includeStateDb !== "boolean" + || typeof snapshot.once !== "boolean") { + throw new ContractValidationError("INVALID_INPUT", "Invalid WatchSnapshot."); + } +} + +export function assertCoreMethodOutput( + method: M, + value: unknown +): asserts value is CoreMethodMap[M]["output"] { + switch (method) { + case "getStatus": { + const status = requireSchemaObject(value, "StatusSnapshot"); + const profile = isRecord(status.profile) ? status.profile : null; + if (!isNonEmptyString(status.snapshotAt) + || !isNonEmptyString(status.storageRevision) + || !profile + || !isNonEmptyString(profile.id) + || !isNonEmptyString(profile.revision) + || !isNonEmptyString(status.currentProvider) + || !isProviderDistribution(status.rolloutCounts) + || (status.modelCounts !== undefined && !isProviderDistribution(status.modelCounts)) + || !("sqliteCounts" in status) + || !isJsonValue(status.sqliteCounts) + || !isNonEmptyString(status.codexHome) + || !isNonEmptyString(status.sqliteHome) + || !isNonEmptyString(status.sqliteHomeSource) + || !isRecord(status.backupSummary) + || !isNonNegativeInteger(status.backupSummary.count) + || !isNonNegativeInteger(status.backupSummary.totalBytes) + || typeof status.pendingRecovery !== "boolean" + || !Array.isArray(status.pendingTransactions) + || status.pendingTransactions.some((entry) => !isRecord(entry) || !isJsonValue(entry)) + || !(status.operationInProgress === null + || (isRecord(status.operationInProgress) && isJsonValue(status.operationInProgress))) + || typeof status.rolloutScanComplete !== "boolean" + || !Array.isArray(status.lockedRolloutFiles) + || status.lockedRolloutFiles.some((entry) => typeof entry !== "string") + || (status.currentModel !== undefined && !isNullableString(status.currentModel))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid StatusSnapshot."); + } + return; + } + case "prepareSync": + case "prepareSwitch": + case "prepareRestore": { + const plan = requireSchemaObject(value, "PlanSummary"); + if (!isNonEmptyString(plan.planId) + || !["sync", "switch", "restore"].includes(String(plan.operation)) + || !isNonEmptyString(plan.createdAt) + || !isNonEmptyString(plan.expiresAt) + || !isRecord(plan.profile) + || !isNonEmptyString(plan.profile.id) + || !isNonEmptyString(plan.profile.revision) + || !isNonEmptyString(plan.storageRevision) + || !isNonEmptyString(plan.configRevision) + || !isNonEmptyString(plan.rolloutRevision) + || !isNonEmptyString(plan.stateDbRevision) + || (plan.backupRevision !== undefined && !isNonEmptyString(plan.backupRevision)) + || !isRecord(plan.target) + || !isJsonValue(plan.target) + || !isRecord(plan.impact) + || !isJsonValue(plan.impact) + || !Array.isArray(plan.warnings) + || plan.warnings.some((entry) => typeof entry !== "string") + || typeof plan.requiresConfirmation !== "boolean") { + throw new ContractValidationError("INVALID_INPUT", "Invalid PlanSummary."); + } + return; + } + case "applySync": + case "applySwitch": + case "applyRestore": { + const result = requireSchemaObject(value, "OperationResult"); + if (!isNonEmptyString(result.operationId) + || !["sync", "switch", "restore"].includes(String(result.operation)) + || !["completed", "partial", "failed_rolled_back", "recovery_required", "cancelled", "stale"].includes(String(result.outcome)) + || !(result.backup === null + || (isRecord(result.backup) && isNonEmptyString(result.backup.backupId)))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid OperationResult."); + } + requireStringArray(result.warnings, "OperationResult warnings"); + if (!("result" in result) || !isJsonValue(result.result)) { + throw new ContractValidationError("INVALID_INPUT", "OperationResult result is required."); + } + return; + } + case "listBackups": { + if (!isRecord(value) || !Array.isArray(value.backups) + || value.backups.some((entry) => { + const backup = isRecord(entry) ? entry : null; + return !backup + || !isNonEmptyString(backup.backupId) + || !isNonNegativeInteger(backup.sizeBytes) + || !isRecord(backup.metadata) + || !isJsonValue(backup.metadata) + || (backup.createdAt !== undefined && !isNonEmptyString(backup.createdAt)); + })) { + throw new ContractValidationError("INVALID_INPUT", "Invalid BackupList."); + } + return; + } + case "pruneBackups": { + if (!isRecord(value) + || !isNonNegativeInteger(value.deletedCount) + || !isNonNegativeInteger(value.remainingCount) + || !isNonNegativeInteger(value.freedBytes)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid PruneBackupsResult."); + } + return; + } + case "listHistory": { + if (!isRecord(value) + || !Number.isSafeInteger(value.page) + || Number(value.page) < 1 + || !Number.isSafeInteger(value.pageSize) + || Number(value.pageSize) < 1 + || !isNonNegativeInteger(value.total) + || typeof value.hasNextPage !== "boolean" + || !Array.isArray(value.sessions) + || value.sessions.some((entry) => !isHistorySummary(entry))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid HistoryPage."); + } + return; + } + case "getHistorySession": { + if (!isRecord(value) + || !isHistorySummary(value.session) + || !Array.isArray(value.messages) + || value.messages.some((entry) => { + const message = isRecord(entry) ? entry : null; + return !message + || !isNonEmptyString(message.role) + || typeof message.text !== "string" + || !isNonNegativeInteger(message.sequence) + || (message.timestamp !== undefined && !isNonEmptyString(message.timestamp)); + }) + || typeof value.truncated !== "boolean" + || !isNonNegativeInteger(value.returnedMessageCount) + || Number(value.returnedMessageCount) !== value.messages.length) { + throw new ContractValidationError("INVALID_INPUT", "Invalid HistorySessionDetail."); + } + return; + } + case "startWatch": + case "stopWatch": + assertWatchSnapshot(value); + return; + case "getWatchStatus": { + if (isRecord(value) && Array.isArray(value.watches)) { + requireSchemaObject(value, "WatchStatusList"); + value.watches.forEach(assertWatchSnapshot); + return; + } + assertWatchSnapshot(value); + return; + } + case "getDiagnostics": { + const diagnostics = requireSchemaObject(value, "DiagnosticsSnapshot"); + if (!isNonEmptyString(diagnostics.generatedAt) + || !isRecord(diagnostics.runtime) + || !isJsonValue(diagnostics.runtime) + || !isRecord(diagnostics.storage) + || !isJsonValue(diagnostics.storage) + || !isRecord(diagnostics.provider) + || !isJsonValue(diagnostics.provider) + || !isRecord(diagnostics.safety) + || !isJsonValue(diagnostics.safety)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid DiagnosticsSnapshot."); + } + return; + } + default: + throw new ContractValidationError("INVALID_INPUT", "Unknown Core method output."); + } +} + +export function assertProgressEvent(value: unknown): asserts value is ProgressEvent { + if (!isRecord(value)) { + throw new ContractValidationError("INVALID_INPUT", "Progress event must be an object."); + } + const allowed = new Set(["stage", "status", "progress", "count"]); + if (Object.keys(value).some((key) => !allowed.has(key)) + || !isNonEmptyString(value.stage) + || !isNonEmptyString(value.status) + || (value.progress !== undefined + && (typeof value.progress !== "number" || !Number.isFinite(value.progress))) + || (value.count !== undefined + && (typeof value.count !== "number" || !Number.isFinite(value.count)))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid ProgressEvent."); + } +} + +export function createCoreRequestEnvelope( + method: M, + payload: CoreMethodMap[M]["input"], + requestId: string, + operationId?: string +): CoreRequestEnvelope { + const envelope = { + protocolVersion: CORE_PROTOCOL_VERSION, + requestId, + ...(operationId ? { operationId } : {}), + method, + payload + } satisfies CoreRequestEnvelope; + assertCoreRequestEnvelope(envelope); + return envelope; +} + +export function createCoreSuccessEnvelope( + request: CoreRequestEnvelope, + result: CoreMethodMap[M]["output"], + operationId?: string +): CoreResponseEnvelope { + assertCoreMethodOutput(request.method, result); + return { + protocolVersion: CORE_PROTOCOL_VERSION, + requestId: request.requestId, + ...(operationId ?? request.operationId + ? { operationId: operationId ?? request.operationId } + : {}), + ok: true, + result + }; +} + +export function createCoreFailureEnvelope( + request: CoreRequestEnvelope, + error: CoreErrorDto +): CoreResponseEnvelope { + assertCoreErrorDto(error); + return { + protocolVersion: CORE_PROTOCOL_VERSION, + requestId: request.requestId, + ...(error.operationId ?? request.operationId + ? { operationId: error.operationId ?? request.operationId } + : {}), + ok: false, + error + }; +} + +export function isCoreErrorCode(value: unknown): value is CoreErrorCode { + return typeof value === "string" && ERROR_CODE_SET.has(value); +} + +export function isCoreErrorSeverity(value: unknown): value is CoreErrorSeverity { + return typeof value === "string" && SEVERITY_SET.has(value); +} diff --git a/packages/contracts/tsconfig.json b/packages/contracts/tsconfig.json new file mode 100644 index 0000000..c7a132f --- /dev/null +++ b/packages/contracts/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "dist" + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/core-client/checks/core-client.contract.mjs b/packages/core-client/checks/core-client.contract.mjs new file mode 100644 index 0000000..f9ec4b4 --- /dev/null +++ b/packages/core-client/checks/core-client.contract.mjs @@ -0,0 +1,183 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { + CoreClientError, + CoreTransportError, + HttpCoreClient, + MockCoreClient, + legacyErrorToDto +} from "../dist/index.js"; + +const profile = { profile: { profileId: "default", profileRevision: "r1" } }; + +test("MockCoreClient uses the same versioned request envelope", async () => { + const client = new MockCoreClient({ + getStatus: async () => ({ + schemaVersion: 1, + snapshotAt: "2026-08-25T00:00:00.000Z", + storageRevision: "storage", + profile: { id: "default", revision: "r1" }, + currentProvider: "openai", + rolloutCounts: {}, + sqliteCounts: null, + codexHome: "redacted", + sqliteHome: "redacted", + sqliteHomeSource: "default", + backupSummary: { count: 0, totalBytes: 0 }, + pendingRecovery: false, + pendingTransactions: [], + operationInProgress: null, + rolloutScanComplete: true, + lockedRolloutFiles: [] + }) + }, { requestIdFactory: () => "mock-request" }); + + const status = await client.getStatus(profile); + assert.equal(status.currentProvider, "openai"); + assert.deepEqual(client.requests[0], { + protocolVersion: 1, + requestId: "mock-request", + method: "getStatus", + payload: profile + }); +}); + +test("HttpCoreClient validates response correlation and sends one envelope", async () => { + let captured; + const client = new HttpCoreClient({ + baseUrl: "http://127.0.0.1:31337/", + requestIdFactory: () => "http-request", + fetch: async (_url, init) => { + captured = JSON.parse(String(init.body)); + return new Response(JSON.stringify({ + protocolVersion: 1, + requestId: "http-request", + ok: true, + result: { schemaVersion: 1, watches: [] } + }), { status: 200, headers: { "Content-Type": "application/json" } }); + } + }); + + const result = await client.getWatchStatus({}); + assert.deepEqual(result, { schemaVersion: 1, watches: [] }); + assert.deepEqual(captured, { + protocolVersion: 1, + requestId: "http-request", + method: "getWatchStatus", + payload: {} + }); +}); + +test("canonical failed envelopes become CoreClientError", async () => { + const client = new MockCoreClient({ + prepareSync: async () => { + throw Object.assign(new Error("busy"), { + code: "OPERATION_BUSY", + severity: "warning", + retryable: true, + recoveryRequired: false, + details: { busyScope: "codex-home" } + }); + } + }); + await assert.rejects( + client.prepareSync(profile), + (error) => error instanceof CoreClientError + && error.code === "OPERATION_BUSY" + && error.dto.details.busyScope === "codex-home" + ); +}); + +test("legacy error adapter classifies by code and never parses message text", () => { + const dto = legacyErrorToDto(new Error("OPERATION_BUSY and RECOVERY_REQUIRED are only words")); + assert.equal(dto.code, "INTERNAL_ERROR"); + assert.equal(dto.message, "An internal error occurred."); +}); + +test("legacy error adapter never leaks exception text or arbitrary details", () => { + const dto = legacyErrorToDto(Object.assign(new Error("token=secret C:/private message body"), { + code: "OPERATION_BUSY", + details: { + busyScope: "codex-home", + token: "secret", + path: "C:/private", + messageBody: "private" + }, + suggestedAction: "send token=secret" + })); + assert.deepEqual(dto, { + code: "OPERATION_BUSY", + message: "Another write operation is using the protected resource.", + severity: "warning", + retryable: true, + recoveryRequired: false, + details: { busyScope: "codex-home" } + }); + assert.doesNotMatch(JSON.stringify(dto), /secret|private|message body/i); +}); + +test("malformed protocol and success payloads become canonical client errors", async () => { + const protocolClient = new HttpCoreClient({ + baseUrl: "http://127.0.0.1:31337/", + requestIdFactory: () => "protocol-request", + fetch: async () => new Response(JSON.stringify({ + protocolVersion: 2, + requestId: "protocol-request", + ok: true, + result: { schemaVersion: 1, watches: [] } + }), { status: 200 }) + }); + await assert.rejects( + protocolClient.getWatchStatus({}), + (error) => error instanceof CoreClientError + && error.code === "PROTOCOL_VERSION_MISMATCH" + && error.message === "The client and Core protocol versions are incompatible." + ); + + const malformedClient = new MockCoreClient({ + getStatus: async () => null + }); + await assert.rejects( + malformedClient.getStatus(profile), + (error) => error instanceof CoreClientError + && error.code === "INTERNAL_ERROR" + && error.message === "An internal error occurred." + ); +}); + +test("HTTP status cannot turn a failed request into a success envelope", async () => { + const invalid = new HttpCoreClient({ + baseUrl: "http://127.0.0.1:31337/", + requestIdFactory: () => "invalid-http", + fetch: async () => new Response(JSON.stringify({ + protocolVersion: 1, + requestId: "invalid-http", + ok: true, + result: { schemaVersion: 1, watches: [] } + }), { status: 500 }) + }); + await assert.rejects(invalid.getWatchStatus({}), CoreTransportError); + + const busy = new HttpCoreClient({ + baseUrl: "http://127.0.0.1:31337/", + requestIdFactory: () => "busy-http", + fetch: async () => new Response(JSON.stringify({ + protocolVersion: 1, + requestId: "busy-http", + ok: false, + error: { + code: "OPERATION_BUSY", + message: "Another write operation is using the protected resource.", + severity: "warning", + retryable: true, + recoveryRequired: false, + details: { busyScope: "codex-home" } + } + }), { status: 409 }) + }); + await assert.rejects( + busy.getWatchStatus({}), + (error) => error instanceof CoreClientError && error.code === "OPERATION_BUSY" + ); +}); diff --git a/packages/core-client/package.json b/packages/core-client/package.json new file mode 100644 index 0000000..d8c2c72 --- /dev/null +++ b/packages/core-client/package.json @@ -0,0 +1,22 @@ +{ + "name": "@codex-provider-sync/core-client", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "tsc -b", + "test": "node --test checks/core-client.contract.mjs" + }, + "engines": { + "node": ">=24" + }, + "dependencies": { + "@codex-provider-sync/contracts": "0.0.0" + } +} diff --git a/packages/core-client/src/client.ts b/packages/core-client/src/client.ts new file mode 100644 index 0000000..e828ebc --- /dev/null +++ b/packages/core-client/src/client.ts @@ -0,0 +1,197 @@ +import { + ContractValidationError, + assertCoreErrorDto, + assertCoreMethodOutput, + assertCoreResponseEnvelope, + createPublicCoreErrorDto, + createCoreRequestEnvelope, + type ApplyPlanInput, + type BackupList, + type CoreErrorDto, + type CoreMethodMap, + type CoreMethodName, + type CoreRequestEnvelope, + type DiagnosticsSnapshot, + type GetDiagnosticsInput, + type GetHistorySessionInput, + type GetStatusInput, + type GetWatchStatusInput, + type HistoryPage, + type HistorySessionDetail, + type ListBackupsInput, + type ListHistoryInput, + type OperationResult, + type PlanSummary, + type PrepareRestoreInput, + type PrepareSwitchInput, + type PrepareSyncInput, + type PruneBackupsInput, + type PruneBackupsResult, + type StartWatchInput, + type StatusSnapshot, + type WatchReferenceInput, + type WatchSnapshot, + type WatchStatusList +} from "@codex-provider-sync/contracts"; + +export interface CoreCallOptions { + signal?: AbortSignal; + operationId?: string; + requestId?: string; +} + +export interface CoreTransport { + request( + envelope: CoreRequestEnvelope, + options?: Pick + ): Promise; +} + +export interface CoreClient { + getStatus(input: GetStatusInput, options?: CoreCallOptions): Promise; + prepareSync(input: PrepareSyncInput, options?: CoreCallOptions): Promise; + applySync(input: ApplyPlanInput, options?: CoreCallOptions): Promise; + prepareSwitch(input: PrepareSwitchInput, options?: CoreCallOptions): Promise; + applySwitch(input: ApplyPlanInput, options?: CoreCallOptions): Promise; + listBackups(input: ListBackupsInput, options?: CoreCallOptions): Promise; + prepareRestore(input: PrepareRestoreInput, options?: CoreCallOptions): Promise; + applyRestore(input: ApplyPlanInput, options?: CoreCallOptions): Promise; + pruneBackups(input: PruneBackupsInput, options?: CoreCallOptions): Promise; + listHistory(input: ListHistoryInput, options?: CoreCallOptions): Promise; + getHistorySession(input: GetHistorySessionInput, options?: CoreCallOptions): Promise; + startWatch(input: StartWatchInput, options?: CoreCallOptions): Promise; + stopWatch(input: WatchReferenceInput, options?: CoreCallOptions): Promise; + getWatchStatus(input: GetWatchStatusInput, options?: CoreCallOptions): Promise; + getDiagnostics(input: GetDiagnosticsInput, options?: CoreCallOptions): Promise; +} + +export class CoreClientError extends Error { + readonly dto: CoreErrorDto; + readonly code: CoreErrorDto["code"]; + + constructor(dto: CoreErrorDto) { + assertCoreErrorDto(dto); + super(dto.message); + this.name = "CoreClientError"; + this.dto = dto; + this.code = dto.code; + } +} + +export type RequestIdFactory = () => string; + +function defaultRequestIdFactory(): string { + return globalThis.crypto?.randomUUID?.() + ?? `request-${Date.now()}-${Math.random().toString(16).slice(2)}`; +} + +export class TransportCoreClient implements CoreClient { + readonly #transport: CoreTransport; + readonly #requestIdFactory: RequestIdFactory; + + constructor( + transport: CoreTransport, + { requestIdFactory = defaultRequestIdFactory }: { requestIdFactory?: RequestIdFactory } = {} + ) { + this.#transport = transport; + this.#requestIdFactory = requestIdFactory; + } + + async #invoke( + method: M, + payload: CoreMethodMap[M]["input"], + options: CoreCallOptions = {} + ): Promise { + const requestId = options.requestId ?? this.#requestIdFactory(); + const request = createCoreRequestEnvelope( + method, + payload, + requestId, + options.operationId + ); + const response = await this.#transport.request(request, { signal: options.signal }); + try { + assertCoreResponseEnvelope(response, requestId); + if (response.ok) assertCoreMethodOutput(method, response.result); + } catch (error) { + if (error instanceof ContractValidationError) { + const code = error.code === "PROTOCOL_VERSION_MISMATCH" + ? "PROTOCOL_VERSION_MISMATCH" + : "INTERNAL_ERROR"; + throw new CoreClientError(createPublicCoreErrorDto(code)); + } + throw error; + } + if (!response.ok) throw new CoreClientError(response.error); + return response.result; + } + + getStatus(input: GetStatusInput, options?: CoreCallOptions): Promise { + return this.#invoke("getStatus", input, options); + } + + prepareSync(input: PrepareSyncInput, options?: CoreCallOptions): Promise { + return this.#invoke("prepareSync", input, options); + } + + applySync(input: ApplyPlanInput, options?: CoreCallOptions): Promise { + return this.#invoke("applySync", input, options); + } + + prepareSwitch(input: PrepareSwitchInput, options?: CoreCallOptions): Promise { + return this.#invoke("prepareSwitch", input, options); + } + + applySwitch(input: ApplyPlanInput, options?: CoreCallOptions): Promise { + return this.#invoke("applySwitch", input, options); + } + + listBackups(input: ListBackupsInput, options?: CoreCallOptions): Promise { + return this.#invoke("listBackups", input, options); + } + + prepareRestore(input: PrepareRestoreInput, options?: CoreCallOptions): Promise { + return this.#invoke("prepareRestore", input, options); + } + + applyRestore(input: ApplyPlanInput, options?: CoreCallOptions): Promise { + return this.#invoke("applyRestore", input, options); + } + + pruneBackups(input: PruneBackupsInput, options?: CoreCallOptions): Promise { + return this.#invoke("pruneBackups", input, options); + } + + listHistory(input: ListHistoryInput, options?: CoreCallOptions): Promise { + return this.#invoke("listHistory", input, options); + } + + getHistorySession( + input: GetHistorySessionInput, + options?: CoreCallOptions + ): Promise { + return this.#invoke("getHistorySession", input, options); + } + + startWatch(input: StartWatchInput, options?: CoreCallOptions): Promise { + return this.#invoke("startWatch", input, options); + } + + stopWatch(input: WatchReferenceInput, options?: CoreCallOptions): Promise { + return this.#invoke("stopWatch", input, options); + } + + getWatchStatus( + input: GetWatchStatusInput, + options?: CoreCallOptions + ): Promise { + return this.#invoke("getWatchStatus", input, options); + } + + getDiagnostics( + input: GetDiagnosticsInput, + options?: CoreCallOptions + ): Promise { + return this.#invoke("getDiagnostics", input, options); + } +} diff --git a/packages/core-client/src/http.ts b/packages/core-client/src/http.ts new file mode 100644 index 0000000..5013f54 --- /dev/null +++ b/packages/core-client/src/http.ts @@ -0,0 +1,109 @@ +import type { + CoreMethodName, + CoreRequestEnvelope +} from "@codex-provider-sync/contracts"; + +import { + TransportCoreClient, + type CoreCallOptions, + type CoreTransport, + type RequestIdFactory +} from "./client.js"; + +export const MAX_CORE_REQUEST_BYTES = 64 * 1024; + +export class CoreTransportError extends Error { + readonly status: number | null; + + constructor(message: string, status: number | null = null) { + super(message); + this.name = "CoreTransportError"; + this.status = status; + } +} + +export interface HttpCoreTransportOptions { + baseUrl: string; + endpoint?: string; + fetch?: typeof globalThis.fetch; + headers?: Readonly>; +} + +export class HttpCoreTransport implements CoreTransport { + readonly #url: URL; + readonly #fetch: typeof globalThis.fetch; + readonly #headers: Readonly>; + + constructor({ + baseUrl, + endpoint = "/api/core", + fetch: fetchImplementation = globalThis.fetch, + headers = {} + }: HttpCoreTransportOptions) { + if (typeof fetchImplementation !== "function") { + throw new TypeError("HttpCoreTransport requires a Fetch implementation."); + } + this.#url = new URL(endpoint, baseUrl); + this.#fetch = fetchImplementation; + this.#headers = Object.freeze({ ...headers }); + } + + async request( + envelope: CoreRequestEnvelope, + options: Pick = {} + ): Promise { + const body = JSON.stringify(envelope); + if (new TextEncoder().encode(body).byteLength > MAX_CORE_REQUEST_BYTES) { + throw new CoreTransportError("Core request exceeds the 64 KiB transport limit."); + } + let response: Response; + try { + response = await this.#fetch(this.#url, { + method: "POST", + credentials: "same-origin", + redirect: "error", + headers: { + "Content-Type": "application/json", + ...this.#headers + }, + body, + signal: options.signal + }); + } catch { + throw new CoreTransportError("Core HTTP request failed."); + } + let payload: unknown; + try { + payload = await response.json(); + } catch { + throw new CoreTransportError( + "Core HTTP response was not valid JSON.", + response.status + ); + } + if (!response.ok) { + // A valid Core failure envelope still carries the canonical error DTO; + // TransportCoreClient performs the protocol and DTO checks. + if (payload === null + || typeof payload !== "object" + || Array.isArray(payload) + || !("ok" in payload) + || payload.ok !== false) { + throw new CoreTransportError("Core HTTP request failed.", response.status); + } + } + return payload; + } +} + +export interface HttpCoreClientOptions extends HttpCoreTransportOptions { + requestIdFactory?: RequestIdFactory; +} + +export class HttpCoreClient extends TransportCoreClient { + constructor(options: HttpCoreClientOptions) { + super(new HttpCoreTransport(options), { + requestIdFactory: options.requestIdFactory + }); + } +} diff --git a/packages/core-client/src/index.ts b/packages/core-client/src/index.ts new file mode 100644 index 0000000..358ff8d --- /dev/null +++ b/packages/core-client/src/index.ts @@ -0,0 +1,3 @@ +export * from "./client.js"; +export * from "./http.js"; +export * from "./mock.js"; diff --git a/packages/core-client/src/mock.ts b/packages/core-client/src/mock.ts new file mode 100644 index 0000000..ae996c3 --- /dev/null +++ b/packages/core-client/src/mock.ts @@ -0,0 +1,82 @@ +import { + createCoreFailureEnvelope, + createPublicCoreErrorDto, + createCoreSuccessEnvelope, + sanitizePublicCoreErrorDto, + type CoreErrorDto, + type CoreMethodMap, + type CoreMethodName, + type CoreRequestEnvelope +} from "@codex-provider-sync/contracts"; + +import { + TransportCoreClient, + type CoreCallOptions, + type CoreTransport, + type RequestIdFactory +} from "./client.js"; + +type MaybePromise = T | Promise; + +export type MockCoreHandler = ( + payload: CoreMethodMap[M]["input"], + request: CoreRequestEnvelope +) => MaybePromise; + +export type MockCoreHandlers = { + [M in CoreMethodName]?: MockCoreHandler; +}; + +export function legacyErrorToDto(error: unknown): CoreErrorDto { + return sanitizePublicCoreErrorDto(error); +} + +class MockCoreTransport implements CoreTransport { + readonly #handlers: MockCoreHandlers; + readonly requests: CoreRequestEnvelope[] = []; + + constructor(handlers: MockCoreHandlers) { + this.#handlers = { ...handlers }; + } + + async request( + request: CoreRequestEnvelope, + _options: Pick = {} + ): Promise { + this.requests.push(request); + const handler = this.#handlers[request.method] as MockCoreHandler | undefined; + if (!handler) { + return createCoreFailureEnvelope(request, createPublicCoreErrorDto("INTERNAL_ERROR")); + } + let result: CoreMethodMap[M]["output"]; + try { + result = await handler(request.payload, request); + } catch (error) { + return createCoreFailureEnvelope(request, legacyErrorToDto(error)); + } + const operationId = result !== null + && typeof result === "object" + && "operationId" in result + && typeof result.operationId === "string" + ? result.operationId + : undefined; + try { + return createCoreSuccessEnvelope(request, result, operationId); + } catch { + return createCoreFailureEnvelope(request, createPublicCoreErrorDto("INTERNAL_ERROR")); + } + } +} + +export class MockCoreClient extends TransportCoreClient { + readonly requests: readonly CoreRequestEnvelope[]; + + constructor( + handlers: MockCoreHandlers, + { requestIdFactory }: { requestIdFactory?: RequestIdFactory } = {} + ) { + const transport = new MockCoreTransport(handlers); + super(transport, { requestIdFactory }); + this.requests = transport.requests; + } +} diff --git a/packages/core-client/tsconfig.json b/packages/core-client/tsconfig.json new file mode 100644 index 0000000..935ab5f --- /dev/null +++ b/packages/core-client/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "dist" + }, + "include": [ + "src/**/*.ts" + ], + "references": [ + { "path": "../contracts" } + ] +} diff --git a/packages/core/checks/core-surface.contract.mjs b/packages/core/checks/core-surface.contract.mjs new file mode 100644 index 0000000..cbe7b07 --- /dev/null +++ b/packages/core/checks/core-surface.contract.mjs @@ -0,0 +1,112 @@ +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; + +import * as core from "../src/index.js"; + +const EXPECTED_METHODS = [ + "applyRestore", + "applySwitch", + "applySync", + "getDiagnostics", + "getHistorySession", + "getStatus", + "getWatchStatus", + "listBackups", + "listHistory", + "prepareRestore", + "prepareSwitch", + "prepareSync", + "pruneBackups", + "startWatch", + "stopWatch" +]; + +test("Core workspace exposes only the stable vNext method surface", () => { + assert.deepEqual(Object.keys(core), ["createCoreFacade"]); + const facade = core.createCoreFacade({ + resolveProfile: async ({ profileId }) => ({ + id: profileId, + revision: "r1", + codexHome: process.cwd() + }) + }); + assert.deepEqual(Object.keys(facade).sort(), EXPECTED_METHODS); + assert.equal("runSync" in core, false); + assert.equal("resolveStorageLayout" in core, false); +}); + +test("Core workspace bridge imports only the root public API", async () => { + const source = await fs.readFile(new URL("../src/index.js", import.meta.url), "utf8"); + const rootImports = [...source.matchAll(/from\s+["'](\.\.\/\.\.\/\.\.\/src\/[^"']+)["']/g)] + .map((match) => match[1]); + assert.deepEqual(rootImports, ["../../../src/public-api.js"]); + assert.doesNotMatch(source, /src\/(service|locking|backup|history|watch)\.js/); +}); + +test("profile resolution fails closed before a Core path can be selected", async () => { + let calls = 0; + const facade = core.createCoreFacade({ + resolveProfile: async ({ profileId }) => { + calls += 1; + return { + id: `${profileId}-wrong`, + revision: "r1", + codexHome: process.cwd() + }; + } + }); + await assert.rejects( + facade.getStatus({ profile: { profileId: "selected" } }), + (error) => error?.code === "INVALID_INPUT" + ); + assert.equal(calls, 1); +}); + +test("trusted profile selection never falls back to the process default Codex Home", async () => { + const testRoot = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-core-facade-")); + const defaultHome = path.join(testRoot, "default-home"); + const selectedHome = path.join(testRoot, "selected-home"); + const originalCodexHome = process.env.CODEX_HOME; + try { + for (const home of [defaultHome, selectedHome]) { + await fs.mkdir(path.join(home, "sessions"), { recursive: true }); + await fs.mkdir(path.join(home, "archived_sessions"), { recursive: true }); + await fs.mkdir(path.join(home, "sqlite"), { recursive: true }); + } + await fs.writeFile(path.join(defaultHome, "config.toml"), 'model_provider = "wrong-default"\n'); + await fs.writeFile(path.join(selectedHome, "config.toml"), 'model_provider = "openai"\n'); + process.env.CODEX_HOME = defaultHome; + const selectors = []; + const facade = core.createCoreFacade({ + resolveProfile: async (selector) => { + selectors.push(selector); + return { + id: "selected", + revision: "selected-r1", + codexHome: selectedHome + }; + } + }); + const input = { profile: { profileId: "selected", profileRevision: "selected-r1" } }; + const status = await facade.getStatus(input); + const backups = await facade.listBackups(input); + const history = await facade.listHistory(input); + const diagnostics = await facade.getDiagnostics(input); + const pruned = await facade.pruneBackups({ ...input, keepCount: 1 }); + assert.equal(status.currentProvider, "openai"); + assert.deepEqual(status.profile, { id: "selected", revision: "selected-r1" }); + assert.deepEqual(backups, { backups: [] }); + assert.deepEqual(history.sessions, []); + assert.equal(diagnostics.storage.codexHome, selectedHome); + assert.equal(pruned.deletedCount, 0); + assert.equal(selectors.length, 5); + assert.equal(selectors.every((selector) => selector.profileId === "selected"), true); + } finally { + if (originalCodexHome === undefined) delete process.env.CODEX_HOME; + else process.env.CODEX_HOME = originalCodexHome; + await fs.rm(testRoot, { recursive: true, force: true }); + } +}); diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 0000000..64ddf85 --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,22 @@ +{ + "name": "@codex-provider-sync/core", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { + ".": { + "types": "./src/index.d.ts", + "import": "./src/index.js" + } + }, + "scripts": { + "build": "tsc -p tsconfig.json", + "test": "node --test checks/core-surface.contract.mjs" + }, + "engines": { + "node": ">=24" + }, + "dependencies": { + "@codex-provider-sync/contracts": "0.0.0" + } +} diff --git a/packages/core/src/index.d.ts b/packages/core/src/index.d.ts new file mode 100644 index 0000000..3b722f6 --- /dev/null +++ b/packages/core/src/index.d.ts @@ -0,0 +1,57 @@ +import type { + ApplyPlanInput, + BackupList, + DiagnosticsSnapshot, + GetDiagnosticsInput, + GetHistorySessionInput, + GetStatusInput, + GetWatchStatusInput, + HistoryPage, + HistorySessionDetail, + ListBackupsInput, + ListHistoryInput, + OperationResult, + PlanSummary, + PrepareRestoreInput, + PrepareSwitchInput, + PrepareSyncInput, + ProfileSelector, + PruneBackupsInput, + PruneBackupsResult, + StartWatchInput, + StatusSnapshot, + WatchReferenceInput, + WatchSnapshot, + WatchStatusList +} from "@codex-provider-sync/contracts"; + +export interface ResolvedProfile { + id: string; + revision: string; + codexHome: string; + sqliteHome?: string; +} + +export type ProfileResolver = ( + selector: ProfileSelector +) => ResolvedProfile | Promise; + +export interface CoreFacade { + getStatus(input: GetStatusInput): Promise; + prepareSync(input: PrepareSyncInput): Promise; + applySync(input: ApplyPlanInput): Promise; + prepareSwitch(input: PrepareSwitchInput): Promise; + applySwitch(input: ApplyPlanInput): Promise; + listBackups(input: ListBackupsInput): Promise; + prepareRestore(input: PrepareRestoreInput): Promise; + applyRestore(input: ApplyPlanInput): Promise; + pruneBackups(input: PruneBackupsInput): Promise; + listHistory(input: ListHistoryInput): Promise; + getHistorySession(input: GetHistorySessionInput): Promise; + startWatch(input: StartWatchInput): Promise; + stopWatch(input: WatchReferenceInput): Promise; + getWatchStatus(input?: GetWatchStatusInput): Promise; + getDiagnostics(input: GetDiagnosticsInput): Promise; +} + +export function createCoreFacade(options: { resolveProfile: ProfileResolver }): CoreFacade; diff --git a/packages/core/src/index.js b/packages/core/src/index.js new file mode 100644 index 0000000..bf904fb --- /dev/null +++ b/packages/core/src/index.js @@ -0,0 +1,383 @@ +// @ts-check + +// C4 keeps the proven high-risk implementation in root src/. This factory is +// the only transitional import allowed to cross that boundary. Product inputs +// contain a profile selector only; trusted hosts resolve all filesystem paths. +import { createHash } from "node:crypto"; +import path from "node:path"; + +import { + CoreError, + applyRestore as applyRestoreInternal, + applySwitch as applySwitchInternal, + applySync as applySyncInternal, + getDiagnostics as getDiagnosticsInternal, + getHistorySession as getHistorySessionInternal, + getStatus as getStatusInternal, + getWatchStatus as getWatchStatusInternal, + listBackups as listBackupsInternal, + listHistory as listHistoryInternal, + prepareRestore as prepareRestoreInternal, + prepareSwitch as prepareSwitchInternal, + prepareSync as prepareSyncInternal, + pruneBackups as pruneBackupsInternal, + startWatch as startWatchInternal, + stopWatch as stopWatchInternal +} from "../../../src/public-api.js"; + +/** @typedef {{profileId: string, profileRevision?: string}} ProfileSelector */ +/** @typedef {{id: string, revision: string, codexHome: string, sqliteHome?: string}} ResolvedProfile */ +/** @typedef {(selector: ProfileSelector) => ResolvedProfile | Promise} ProfileResolver */ +/** @typedef {Record} JsonRecord */ +/** @typedef {{ + * getStatus: (input: JsonRecord) => Promise, + * prepareSync: (input: JsonRecord) => Promise, + * applySync: (input: JsonRecord) => Promise, + * prepareSwitch: (input: JsonRecord) => Promise, + * applySwitch: (input: JsonRecord) => Promise, + * listBackups: (input: JsonRecord) => Promise, + * prepareRestore: (input: JsonRecord) => Promise, + * applyRestore: (input: JsonRecord) => Promise, + * pruneBackups: (input: JsonRecord) => Promise, + * listHistory: (input: JsonRecord) => Promise, + * getHistorySession: (input: JsonRecord) => Promise, + * startWatch: (input: JsonRecord) => Promise, + * stopWatch: (input: JsonRecord) => Promise, + * getWatchStatus: (input?: JsonRecord) => Promise, + * getDiagnostics: (input: JsonRecord) => Promise + * }} CoreFacade */ + +const PROFILE_ID_PATTERN = /^[A-Za-z0-9._-]{1,80}$/; + +/** @param {unknown} value @returns {value is Record} */ +function isRecord(value) { + return value !== null && typeof value === "object" && !Array.isArray(value); +} + +/** @param {unknown} input */ +function requireProfileSelector(input) { + if (!isRecord(input) || !isRecord(input.profile)) { + throw new CoreError("INVALID_INPUT", "A trusted profile selector is required."); + } + const selector = input.profile; + const allowedKeys = new Set(["profileId", "profileRevision"]); + if (Object.keys(selector).some((key) => !allowedKeys.has(key)) + || typeof selector.profileId !== "string" + || !PROFILE_ID_PATTERN.test(selector.profileId) + || (selector.profileRevision !== undefined + && (typeof selector.profileRevision !== "string" + || !selector.profileRevision + || selector.profileRevision.length > 512))) { + throw new CoreError("INVALID_INPUT", "The profile selector is invalid."); + } + return /** @type {ProfileSelector} */ ({ + profileId: selector.profileId, + ...(selector.profileRevision === undefined + ? {} + : { profileRevision: selector.profileRevision }) + }); +} + +/** @param {ResolvedProfile} value @param {ProfileSelector} selector */ +function validateResolvedProfile(value, selector) { + if (!isRecord(value) + || typeof value.id !== "string" + || value.id !== selector.profileId + || !PROFILE_ID_PATTERN.test(value.id) + || typeof value.revision !== "string" + || !value.revision + || value.revision.length > 512 + || typeof value.codexHome !== "string" + || !path.isAbsolute(value.codexHome) + || (value.sqliteHome !== undefined + && (typeof value.sqliteHome !== "string" || !path.isAbsolute(value.sqliteHome)))) { + throw new CoreError("INVALID_INPUT", "The trusted profile resolver returned an invalid profile."); + } + if (selector.profileRevision !== undefined && selector.profileRevision !== value.revision) { + throw new CoreError("PROFILE_CHANGED", "The selected profile changed. Prepare the operation again."); + } + return Object.freeze({ + id: value.id, + revision: value.revision, + codexHome: path.resolve(value.codexHome), + ...(value.sqliteHome ? { sqliteHome: path.resolve(value.sqliteHome) } : {}) + }); +} + +/** @param {ResolvedProfile} profile @param {string} [revision] */ +function rootProfileInput(profile, revision = profile.revision) { + return { + codexHome: profile.codexHome, + ...(profile.sqliteHome ? { sqliteHome: profile.sqliteHome } : {}), + profileId: profile.id, + profileRevision: revision + }; +} + +/** @param {unknown} value @param {ResolvedProfile} profile */ +function withPublicProfile(value, profile) { + if (!isRecord(value)) return value; + return { ...value, profile: { id: profile.id, revision: profile.revision } }; +} + +/** @param {unknown} value */ +function publicOperationResult(value) { + if (!isRecord(value)) return value; + const backup = isRecord(value.backup) && typeof value.backup.backupId === "string" + ? { backupId: value.backup.backupId } + : null; + return { ...value, backup }; +} + +/** @param {unknown} value */ +function publicBackupMetadata(value) { + const metadata = isRecord(value) ? value : {}; + /** @type {Record} */ + const result = {}; + for (const key of ["version", "namespace", "targetProvider", "createdAt"] ) { + const candidate = metadata[key]; + if (typeof candidate === "string") result[key] = candidate; + else if (typeof candidate === "number" && Number.isSafeInteger(candidate)) result[key] = candidate; + } + for (const key of ["changedSessionFiles", "fileCount"] ) { + const candidate = metadata[key]; + if (Number.isSafeInteger(candidate) && Number(candidate) >= 0) result[key] = Number(candidate); + } + return result; +} + +/** @param {unknown} value */ +function publicHistorySummary(value) { + if (!isRecord(value)) return value; + return { + id: value.id, + title: value.title, + cwd: value.cwd, + provider: value.provider, + ...(value.model === undefined ? {} : { model: value.model }), + archived: value.archived, + ...(typeof value.createdAt === "string" ? { createdAt: value.createdAt } : {}), + updatedAt: value.updatedAt, + messageCount: value.messageCount + }; +} + +/** @param {string} value */ +function compositeRevision(value) { + return createHash("sha256").update(value, "utf8").digest("hex"); +} + +/** + * Create the shared Core facade for a trusted host. The resolver is the only + * component allowed to translate product profile identifiers into paths. + * @param {{resolveProfile: ProfileResolver}} options + */ +export function createCoreFacade({ resolveProfile }) { + if (typeof resolveProfile !== "function") { + throw new TypeError("createCoreFacade requires a trusted resolveProfile function."); + } + + /** @param {ProfileSelector} selector */ + async function resolveTrusted(selector) { + return validateResolvedProfile(await resolveProfile(selector), selector); + } + + function currentProfileResolver() { + /** @param {string} profileId */ + return async (profileId) => resolveTrusted({ profileId: String(profileId) }); + } + + /** @param {unknown} input */ + async function trustedInput(input) { + const selector = requireProfileSelector(input); + const profile = await resolveTrusted(selector); + return { input: /** @type {JsonRecord} */ (input), profile }; + } + + /** @type {CoreFacade} */ + const facade = { + async getStatus(input) { + const trusted = await trustedInput(input); + return withPublicProfile(await getStatusInternal(rootProfileInput(trusted.profile)), trusted.profile); + }, + + async prepareSync(input) { + const trusted = await trustedInput(input); + const plan = await prepareSyncInternal({ + ...rootProfileInput(trusted.profile), + ...(trusted.input.keepCount === undefined ? {} : { keepCount: trusted.input.keepCount }), + profileResolver: currentProfileResolver() + }); + return withPublicProfile(plan, trusted.profile); + }, + + async applySync(input) { + return publicOperationResult(await applySyncInternal(input)); + }, + + async prepareSwitch(input) { + const trusted = await trustedInput(input); + const provider = trusted.input.provider; + const modelMode = trusted.input.modelMode; + if (typeof provider !== "string" || !provider + || !["provider-default", "keep-root-model", "explicit"].includes(String(modelMode))) { + throw new CoreError("INVALID_INPUT", "The Switch Provider input is invalid."); + } + if ((modelMode === "explicit" && (typeof trusted.input.model !== "string" || !trusted.input.model)) + || (modelMode !== "explicit" && trusted.input.model !== undefined)) { + throw new CoreError("INVALID_INPUT", "The selected model mode and model are inconsistent."); + } + const plan = await prepareSwitchInternal({ + ...rootProfileInput(trusted.profile), + provider, + ...(modelMode === "explicit" ? { model: trusted.input.model } : {}), + ...(modelMode === "keep-root-model" ? { keepRootModel: true } : {}), + ...(trusted.input.keepCount === undefined ? {} : { keepCount: trusted.input.keepCount }), + profileResolver: currentProfileResolver() + }); + return withPublicProfile(plan, trusted.profile); + }, + + async applySwitch(input) { + return publicOperationResult(await applySwitchInternal(input)); + }, + + async listBackups(input) { + const trusted = await trustedInput(input); + const inventoryValue = await listBackupsInternal(trusted.profile.codexHome); + const inventory = isRecord(inventoryValue) ? inventoryValue : {}; + const backups = Array.isArray(inventory.backups) ? inventory.backups : []; + return { + backups: backups.filter(isRecord).map((backup) => ({ + backupId: backup.id, + sizeBytes: backup.sizeBytes, + metadata: publicBackupMetadata(backup.metadata) + })) + }; + }, + + async prepareRestore(input) { + const trusted = await trustedInput(input); + let executionProfile = trusted.profile; + let profileResolver = currentProfileResolver(); + if (trusted.input.relocationTargetProfileId !== undefined) { + if (trusted.input.allowSqliteHomeRelocation !== true + || trusted.input.restoreConfig !== false + || typeof trusted.input.relocationTargetProfileId !== "string") { + throw new CoreError("INVALID_INPUT", "SQLite relocation requires an explicit target and config restore disabled."); + } + const targetId = trusted.input.relocationTargetProfileId; + const target = await resolveTrusted({ profileId: targetId }); + if (!target.sqliteHome) { + throw new CoreError("INVALID_INPUT", "The relocation target profile has no explicit SQLite Home."); + } + const revision = compositeRevision(JSON.stringify([ + trusted.profile.id, + trusted.profile.revision, + target.id, + target.revision + ])); + executionProfile = { ...trusted.profile, sqliteHome: target.sqliteHome, revision }; + profileResolver = async (/** @type {string} */ profileId) => { + const [current, currentTarget] = await Promise.all([ + resolveTrusted({ profileId: String(profileId) }), + resolveTrusted({ profileId: targetId }) + ]); + if (!currentTarget.sqliteHome) { + throw new CoreError("PROFILE_CHANGED", "The relocation target profile changed."); + } + return { + ...current, + sqliteHome: currentTarget.sqliteHome, + revision: compositeRevision(JSON.stringify([ + current.id, + current.revision, + currentTarget.id, + currentTarget.revision + ])) + }; + }; + } + const plan = await prepareRestoreInternal({ + ...rootProfileInput(executionProfile), + backupId: trusted.input.backupId, + restoreConfig: trusted.input.restoreConfig, + restoreDatabase: trusted.input.restoreDatabase, + restoreSessions: trusted.input.restoreSessions, + ...(trusted.input.allowSqliteHomeRelocation === undefined + ? {} + : { allowSqliteHomeRelocation: trusted.input.allowSqliteHomeRelocation }), + profileResolver + }); + return withPublicProfile(plan, trusted.profile); + }, + + async applyRestore(input) { + return publicOperationResult(await applyRestoreInternal(input)); + }, + + async pruneBackups(input) { + const trusted = await trustedInput(input); + const result = await pruneBackupsInternal({ + codexHome: trusted.profile.codexHome, + keepCount: trusted.input.keepCount + }); + if (!isRecord(result)) return result; + return { deletedCount: result.deletedCount, remainingCount: result.remainingCount, freedBytes: result.freedBytes }; + }, + + async listHistory(input) { + const trusted = await trustedInput(input); + const { profile: _profile, ...options } = trusted.input; + const resultValue = await listHistoryInternal(trusted.profile.codexHome, options); + if (!isRecord(resultValue)) return resultValue; + return { + ...resultValue, + sessions: Array.isArray(resultValue.sessions) ? resultValue.sessions.map(publicHistorySummary) : [] + }; + }, + + async getHistorySession(input) { + const trusted = await trustedInput(input); + if (typeof trusted.input.sessionId !== "string" || !trusted.input.sessionId) { + throw new CoreError("INVALID_INPUT", "sessionId is required."); + } + const resultValue = await getHistorySessionInternal( + trusted.profile.codexHome, + trusted.input.sessionId, + trusted.input.messageLimit === undefined + ? {} + : { messageLimit: trusted.input.messageLimit } + ); + if (!isRecord(resultValue)) return resultValue; + return { ...resultValue, session: publicHistorySummary(resultValue.session) }; + }, + + async startWatch(input) { + const trusted = await trustedInput(input); + return startWatchInternal({ + ...rootProfileInput(trusted.profile), + ...(trusted.input.includeStateDb === undefined ? {} : { includeStateDb: trusted.input.includeStateDb }), + ...(trusted.input.debounceMs === undefined ? {} : { debounceMs: trusted.input.debounceMs }), + ...(trusted.input.once === undefined ? {} : { once: trusted.input.once }) + }); + }, + + async stopWatch(input) { + return stopWatchInternal(input); + }, + + async getWatchStatus(input = {}) { + return input.watchId + ? getWatchStatusInternal({ watchId: input.watchId }) + : getWatchStatusInternal(); + }, + + async getDiagnostics(input) { + const trusted = await trustedInput(input); + return getDiagnosticsInternal(rootProfileInput(trusted.profile)); + } + }; + + return Object.freeze(facade); +} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 0000000..f30a4bb --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "declaration": false, + "noEmit": true, + "types": ["node"] + }, + "include": [ + "src/**/*.js" + ] +} diff --git a/packages/design-system/checks/surface.contract.mjs b/packages/design-system/checks/surface.contract.mjs new file mode 100644 index 0000000..8e8d76d --- /dev/null +++ b/packages/design-system/checks/surface.contract.mjs @@ -0,0 +1,14 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { + DESIGN_SYSTEM_MIGRATION_STATE, + SUPPORTED_LOCALES, + THEME_MODES +} from "../dist/index.js"; + +test("design-system owns the frozen locale and theme vocabulary", () => { + assert.deepEqual(THEME_MODES, ["system", "light", "dark"]); + assert.deepEqual(SUPPORTED_LOCALES, ["zh-CN", "en"]); + assert.equal(DESIGN_SYSTEM_MIGRATION_STATE, "tokens-only-c4"); +}); diff --git a/packages/design-system/package.json b/packages/design-system/package.json new file mode 100644 index 0000000..6855f40 --- /dev/null +++ b/packages/design-system/package.json @@ -0,0 +1,19 @@ +{ + "name": "@codex-provider-sync/design-system", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + } + }, + "scripts": { + "build": "tsc -b", + "test": "node --test checks/surface.contract.mjs" + }, + "engines": { + "node": ">=24" + } +} diff --git a/packages/design-system/src/index.ts b/packages/design-system/src/index.ts new file mode 100644 index 0000000..1aaf545 --- /dev/null +++ b/packages/design-system/src/index.ts @@ -0,0 +1,11 @@ +export const THEME_MODES = ["system", "light", "dark"] as const; +export type ThemeMode = typeof THEME_MODES[number]; + +export const SUPPORTED_LOCALES = ["zh-CN", "en"] as const; +export type SupportedLocale = typeof SUPPORTED_LOCALES[number]; + +export const DESIGN_SYSTEM_MIGRATION_STATE = "tokens-only-c4" as const; + +// React components, Tailwind output and the checked-in Radix/shadcn-style +// component set are C5 deliverables. C4 only establishes the platform-neutral +// token and locale ownership boundary. diff --git a/packages/design-system/tsconfig.json b/packages/design-system/tsconfig.json new file mode 100644 index 0000000..c7a132f --- /dev/null +++ b/packages/design-system/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "dist" + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/test-fixtures/checks/runner.contract.mjs b/packages/test-fixtures/checks/runner.contract.mjs new file mode 100644 index 0000000..b75e0e9 --- /dev/null +++ b/packages/test-fixtures/checks/runner.contract.mjs @@ -0,0 +1,157 @@ +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; + +import { + createRuntimeDifference, + readFixtureManifest, + runFixtureInTemp, + validateFixtureManifest +} from "../src/index.js"; + +async function createMinimalFixture(parent, name = "source") { + const sourceRoot = path.join(parent, name); + const codexHome = path.join(sourceRoot, "codex-home"); + await fs.mkdir(codexHome, { recursive: true }); + await fs.writeFile(path.join(sourceRoot, "fixture.json"), JSON.stringify({ + schemaVersion: 1, + id: "minimal", + description: "Synthetic fixture", + containsRealUserData: false, + inputs: { codexHome: "codex-home" }, + expected: {} + })); + await fs.writeFile(path.join(codexHome, "config.toml"), 'model_provider = "openai"\n'); + return { sourceRoot, codexHome }; +} + +test("fixture runner copies only into a temporary directory and cleans it", async () => { + const testRoot = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-fixture-contract-")); + const { sourceRoot } = await createMinimalFixture(testRoot); + + let stagedRoot; + try { + const result = await runFixtureInTemp(sourceRoot, async (fixture) => { + stagedRoot = fixture.root; + assert.notEqual(fixture.root, sourceRoot); + assert.equal(await fs.readFile(path.join(fixture.codexHome, "config.toml"), "utf8"), 'model_provider = "openai"\n'); + return fixture.manifest.id; + }, { tempParent: testRoot }); + assert.equal(result, "minimal"); + await assert.rejects(fs.access(stagedRoot)); + } finally { + await fs.rm(testRoot, { recursive: true, force: true }); + } +}); + +test("fixture manifest validation is strict and rejects sensitive fields", () => { + const base = { + schemaVersion: 1, + id: "safe-fixture", + description: "Synthetic fixture", + containsRealUserData: false, + inputs: { codexHome: "codex-home" }, + expected: {} + }; + assert.doesNotThrow(() => validateFixtureManifest(base)); + assert.throws(() => validateFixtureManifest({ ...base, extra: true })); + assert.throws(() => validateFixtureManifest({ ...base, inputs: { ...base.inputs, path: "outside" } })); + assert.throws(() => validateFixtureManifest({ ...base, id: "Unsafe ID" })); + assert.throws(() => validateFixtureManifest({ ...base, inputs: { codexHome: "../outside" } })); + assert.throws(() => validateFixtureManifest({ ...base, expected: { messageBody: "private" } })); + assert.throws(() => validateFixtureManifest({ ...base, expected: { apiKey: "private" } })); + assert.throws(() => validateFixtureManifest({ ...base, expected: { apiToken: "private" } })); + assert.throws(() => validateFixtureManifest({ ...base, expected: { sessionCookie: "private" } })); + const { expected: _expected, ...withoutExpected } = base; + assert.throws(() => validateFixtureManifest(withoutExpected)); +}); + +test("fixture trees reject sensitive files and nested symbolic links", async () => { + const testRoot = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-fixture-safety-")); + try { + const sensitive = await createMinimalFixture(testRoot, "sensitive"); + await fs.writeFile(path.join(sensitive.codexHome, "access-token.json"), "{}"); + await assert.rejects(readFixtureManifest(sensitive.sourceRoot), /forbidden file/); + + const apiKey = await createMinimalFixture(testRoot, "api-key"); + await fs.writeFile(path.join(apiKey.codexHome, "api-key.json"), "{}"); + await assert.rejects(readFixtureManifest(apiKey.sourceRoot), /forbidden file/); + + const apiToken = await createMinimalFixture(testRoot, "api-token"); + await fs.writeFile(path.join(apiToken.codexHome, "openaiApiToken.json"), "{}"); + await assert.rejects(readFixtureManifest(apiToken.sourceRoot), /forbidden file/); + + const linked = await createMinimalFixture(testRoot, "linked"); + const outside = path.join(testRoot, "outside.txt"); + await fs.writeFile(outside, "outside"); + try { + await fs.symlink(outside, path.join(linked.codexHome, "linked.txt"), "file"); + await assert.rejects(readFixtureManifest(linked.sourceRoot), /symbolic links/); + } catch (error) { + if (error?.code !== "EPERM" && error?.code !== "EACCES") throw error; + } + } finally { + await fs.rm(testRoot, { recursive: true, force: true }); + } +}); + +test("fixture root itself cannot be a symbolic link or junction", async (t) => { + const testRoot = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-fixture-root-link-")); + try { + const { sourceRoot } = await createMinimalFixture(testRoot); + const linkRoot = path.join(testRoot, "source-link"); + try { + await fs.symlink(sourceRoot, linkRoot, process.platform === "win32" ? "junction" : "dir"); + } catch (error) { + if (error?.code === "EPERM" || error?.code === "EACCES") { + t.skip("Creating a directory link is not permitted on this host."); + return; + } + throw error; + } + await assert.rejects(readFixtureManifest(linkRoot), /real directory/); + } finally { + await fs.rm(testRoot, { recursive: true, force: true }); + } +}); + +test("fixture runner cleans staged data when the callback fails", async () => { + const testRoot = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-fixture-cleanup-")); + let stagedRoot; + const expected = new Error("synthetic callback failure"); + try { + const { sourceRoot } = await createMinimalFixture(testRoot); + await assert.rejects( + runFixtureInTemp(sourceRoot, async (fixture) => { + stagedRoot = fixture.root; + throw expected; + }, { tempParent: testRoot }), + (error) => error === expected + ); + assert.ok(stagedRoot); + await assert.rejects(fs.access(stagedRoot)); + } finally { + await fs.rm(testRoot, { recursive: true, force: true }); + } +}); + +test("difference records make unresolved runtime mismatches blocking", () => { + assert.deepEqual(createRuntimeDifference({ + fixtureId: "backup-roundtrip", + status: "blocked", + node: { hash: "node" }, + dotnet: { hash: "dotnet" }, + decision: "Do not enable the next write stage.", + notes: ["hash mismatch"] + }), { + schemaVersion: 1, + fixtureId: "backup-roundtrip", + status: "blocked", + node: { hash: "node" }, + dotnet: { hash: "dotnet" }, + decision: "Do not enable the next write stage.", + notes: ["hash mismatch"] + }); +}); diff --git a/packages/test-fixtures/package.json b/packages/test-fixtures/package.json new file mode 100644 index 0000000..373477e --- /dev/null +++ b/packages/test-fixtures/package.json @@ -0,0 +1,13 @@ +{ + "name": "@codex-provider-sync/test-fixtures", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": "./src/index.js", + "scripts": { + "test": "node --test checks/runner.contract.mjs" + }, + "engines": { + "node": ">=24" + } +} diff --git a/packages/test-fixtures/schema/difference.schema.json b/packages/test-fixtures/schema/difference.schema.json new file mode 100644 index 0000000..9ba9db4 --- /dev/null +++ b/packages/test-fixtures/schema/difference.schema.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://codex-provider-sync.local/contracts/runtime-difference.schema.json", + "title": "Node and .NET runtime difference record", + "type": "object", + "additionalProperties": false, + "required": [ + "schemaVersion", + "fixtureId", + "status", + "node", + "dotnet", + "decision", + "notes" + ], + "properties": { + "schemaVersion": { "const": 1 }, + "fixtureId": { "type": "string", "minLength": 1 }, + "status": { "enum": ["matched", "accepted", "blocked"] }, + "node": { "type": "object" }, + "dotnet": { "type": "object" }, + "decision": { "type": "string" }, + "notes": { "type": "array", "items": { "type": "string" } } + } +} diff --git a/packages/test-fixtures/schema/fixture.schema.json b/packages/test-fixtures/schema/fixture.schema.json new file mode 100644 index 0000000..0ad0d70 --- /dev/null +++ b/packages/test-fixtures/schema/fixture.schema.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://codex-provider-sync.local/contracts/fixture.schema.json", + "title": "Codex Provider Sync behavior fixture", + "type": "object", + "additionalProperties": false, + "required": [ + "schemaVersion", + "id", + "description", + "containsRealUserData", + "inputs", + "expected" + ], + "properties": { + "schemaVersion": { "const": 1 }, + "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{0,79}$" }, + "description": { "type": "string", "minLength": 1 }, + "containsRealUserData": { "const": false }, + "inputs": { + "type": "object", + "additionalProperties": false, + "required": ["codexHome"], + "properties": { + "codexHome": { "type": "string", "minLength": 1 }, + "sqliteHome": { "type": "string", "minLength": 1 } + } + }, + "expected": { "type": "object" } + } +} diff --git a/packages/test-fixtures/src/index.js b/packages/test-fixtures/src/index.js new file mode 100644 index 0000000..90514ee --- /dev/null +++ b/packages/test-fixtures/src/index.js @@ -0,0 +1,255 @@ +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; + +export const FIXTURE_SCHEMA_VERSION = 1; +export const DIFFERENCE_SCHEMA_VERSION = 1; + +const FORBIDDEN_NAMES = new Set(["auth.json", ".env"]); +const SENSITIVE_FILE_NAME = /(^|[._-])(auth|credentials?|tokens?|secrets?|api[._-]?keys?|access[._-]?keys?|private[._-]?keys?|keys?|passwords?|passwds?|cookies?)([._-]|$)/i; +const SENSITIVE_NORMALIZED_FRAGMENTS = [ + "authorization", + "credential", + "password", + "passwd", + "messagebody", + "message", + "secret", + "token", + "cookie", + "apikey", + "accesskey", + "privatekey" +]; +const SENSITIVE_MANIFEST_KEYS = new Set([ + "accesskey", + "accesskeys", + "apikey", + "apikeys", + "auth", + "authorization", + "body", + "cookie", + "cookies", + "credential", + "credentials", + "key", + "keys", + "message", + "messagebody", + "messages", + "password", + "passwords", + "passwd", + "privatekey", + "privatekeys", + "secret", + "secrets", + "token", + "tokens" +]); +const FIXTURE_ID_PATTERN = /^[a-z0-9][a-z0-9._-]{0,79}$/; + +function record(value) { + return value !== null && typeof value === "object" && !Array.isArray(value) + ? value + : null; +} + +function relativeFixturePath(value, field) { + if (typeof value !== "string" || !value || value.includes("\0") || path.isAbsolute(value)) { + throw new TypeError(`${field} must be a non-empty relative path.`); + } + const normalized = path.normalize(value); + if (normalized === ".." || normalized.startsWith(`..${path.sep}`)) { + throw new TypeError(`${field} must stay inside the fixture root.`); + } + return normalized; +} + +function exactKeys(value, allowed) { + return Object.keys(value).every((key) => allowed.has(key)); +} + +function normalizedSensitiveName(value) { + const normalized = value.toLowerCase().replaceAll(/[^a-z]/g, ""); + return SENSITIVE_MANIFEST_KEYS.has(normalized) + || SENSITIVE_NORMALIZED_FRAGMENTS.some((fragment) => normalized.includes(fragment)); +} + +function assertNoSensitiveManifestFields(value, currentPath = "manifest", depth = 0) { + if (depth > 16) throw new TypeError("Fixture manifest is too deeply nested."); + if (Array.isArray(value)) { + value.forEach((entry, index) => assertNoSensitiveManifestFields(entry, `${currentPath}[${index}]`, depth + 1)); + return; + } + const object = record(value); + if (!object) return; + for (const [key, entry] of Object.entries(object)) { + if (normalizedSensitiveName(key)) { + throw new TypeError(`Fixture manifest cannot contain sensitive field ${currentPath}.${key}.`); + } + assertNoSensitiveManifestFields(entry, `${currentPath}.${key}`, depth + 1); + } +} + +export function validateFixtureManifest(value) { + const manifest = record(value); + if (!manifest + || !exactKeys(manifest, new Set([ + "schemaVersion", + "id", + "description", + "containsRealUserData", + "inputs", + "expected" + ])) + || manifest.schemaVersion !== FIXTURE_SCHEMA_VERSION + || typeof manifest.id !== "string" + || !FIXTURE_ID_PATTERN.test(manifest.id) + || typeof manifest.description !== "string" + || !manifest.description.trim() + || manifest.containsRealUserData !== false) { + throw new TypeError("Invalid or unsafe fixture manifest."); + } + const inputs = record(manifest.inputs); + if (!inputs + || !exactKeys(inputs, new Set(["codexHome", "sqliteHome"]))) { + throw new TypeError("Fixture manifest inputs are invalid."); + } + const expected = record(manifest.expected); + if (!expected) throw new TypeError("Fixture manifest expected is required."); + assertNoSensitiveManifestFields(expected, "manifest.expected"); + const normalizedInputs = { + codexHome: relativeFixturePath(inputs.codexHome, "inputs.codexHome"), + ...(inputs.sqliteHome === undefined + ? {} + : { sqliteHome: relativeFixturePath(inputs.sqliteHome, "inputs.sqliteHome") }) + }; + return Object.freeze({ + schemaVersion: FIXTURE_SCHEMA_VERSION, + id: manifest.id, + description: manifest.description, + containsRealUserData: false, + inputs: Object.freeze(normalizedInputs), + expected: Object.freeze({ ...expected }) + }); +} + +async function assertFixtureRootSafe(root) { + const stat = await fs.lstat(root); + if (stat.isSymbolicLink() || !stat.isDirectory()) { + throw new TypeError("Fixture root must be a real directory, not a symbolic link or reparse point."); + } +} + +async function assertFixtureTreeSafe(current) { + const entries = await fs.readdir(current, { withFileTypes: true }); + for (const entry of entries) { + const entryPath = path.join(current, entry.name); + const stat = await fs.lstat(entryPath); + if (stat.isSymbolicLink()) { + throw new TypeError(`Fixture tree cannot contain symbolic links: ${entry.name}`); + } + if (FORBIDDEN_NAMES.has(entry.name.toLowerCase()) + || entry.name.toLowerCase().startsWith(".env.") + || SENSITIVE_FILE_NAME.test(entry.name) + || normalizedSensitiveName(path.parse(entry.name).name)) { + throw new TypeError(`Fixture tree contains a forbidden file: ${entry.name}`); + } + if (stat.isDirectory()) await assertFixtureTreeSafe(entryPath); + else if (!stat.isFile()) { + throw new TypeError(`Fixture tree contains an unsupported filesystem entry: ${entry.name}`); + } + } +} + +function pathIsWithin(root, target) { + const normalizedRoot = process.platform === "win32" ? root.toLowerCase() : root; + const normalizedTarget = process.platform === "win32" ? target.toLowerCase() : target; + const relative = path.relative(normalizedRoot, normalizedTarget); + return relative === "" || (relative !== ".." + && !relative.startsWith(`..${path.sep}`) + && !path.isAbsolute(relative)); +} + +async function assertFixtureInput(root, relativePath, field) { + const target = path.join(root, relativePath); + const [canonicalRoot, canonicalTarget, stat] = await Promise.all([ + fs.realpath(root), + fs.realpath(target), + fs.stat(target) + ]); + if (!pathIsWithin(canonicalRoot, canonicalTarget) || !stat.isDirectory()) { + throw new TypeError(`${field} must resolve to a directory inside the fixture root.`); + } +} + +export async function readFixtureManifest(fixtureRoot) { + const absoluteRoot = path.resolve(fixtureRoot); + await assertFixtureRootSafe(absoluteRoot); + const manifest = JSON.parse(await fs.readFile(path.join(absoluteRoot, "fixture.json"), "utf8")); + const validated = validateFixtureManifest(manifest); + await assertFixtureTreeSafe(absoluteRoot); + await assertFixtureInput(absoluteRoot, validated.inputs.codexHome, "inputs.codexHome"); + if (validated.inputs.sqliteHome) { + await assertFixtureInput(absoluteRoot, validated.inputs.sqliteHome, "inputs.sqliteHome"); + } + return validated; +} + +export async function runFixtureInTemp(fixtureRoot, run, { tempParent = os.tmpdir() } = {}) { + if (typeof run !== "function") throw new TypeError("Fixture runner callback is required."); + const sourceRoot = path.resolve(fixtureRoot); + const manifest = await readFixtureManifest(sourceRoot); + const tempRoot = await fs.mkdtemp(path.join(path.resolve(tempParent), "codex-provider-sync-fixture-")); + const stagedRoot = path.join(tempRoot, "fixture"); + try { + await fs.cp(sourceRoot, stagedRoot, { + recursive: true, + force: false, + errorOnExist: true, + dereference: false + }); + const stagedManifest = await readFixtureManifest(stagedRoot); + if (JSON.stringify(stagedManifest) !== JSON.stringify(manifest)) { + throw new TypeError("Fixture manifest changed while it was being staged."); + } + return await run({ + root: stagedRoot, + codexHome: path.join(stagedRoot, stagedManifest.inputs.codexHome), + sqliteHome: stagedManifest.inputs.sqliteHome + ? path.join(stagedRoot, stagedManifest.inputs.sqliteHome) + : null, + manifest: stagedManifest + }); + } finally { + await fs.rm(tempRoot, { recursive: true, force: true }); + } +} + +export function createRuntimeDifference({ + fixtureId, + status, + node, + dotnet, + decision, + notes = [] +}) { + if (typeof fixtureId !== "string" || !fixtureId) throw new TypeError("fixtureId is required."); + if (!["matched", "accepted", "blocked"].includes(status)) { + throw new TypeError("Difference status must be matched, accepted, or blocked."); + } + if (!Array.isArray(notes) || notes.some((entry) => typeof entry !== "string")) { + throw new TypeError("Difference notes must be strings."); + } + return { + schemaVersion: DIFFERENCE_SCHEMA_VERSION, + fixtureId, + status, + node: record(node) ?? {}, + dotnet: record(dotnet) ?? {}, + decision: typeof decision === "string" ? decision : "", + notes: [...notes] + }; +} diff --git a/scripts/smoke-root-tarball.js b/scripts/smoke-root-tarball.js new file mode 100644 index 0000000..dc3b02b --- /dev/null +++ b/scripts/smoke-root-tarball.js @@ -0,0 +1,164 @@ +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { spawnSync } from "node:child_process"; +import { fileURLToPath } from "node:url"; + +const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const installLifecycle = process.argv.slice(2).includes("--install-lifecycle"); +const npmCliPath = process.env.npm_execpath; +if (!npmCliPath) { + throw new Error("Run this smoke through npm so the exact npm CLI path is available."); +} + +function run(command, args, options = {}) { + const result = spawnSync(command, args, { + cwd: options.cwd ?? repositoryRoot, + encoding: "utf8", + windowsHide: true, + env: { ...process.env, NO_COLOR: "1", ...(options.env ?? {}) } + }); + if (result.status !== 0) { + throw new Error([ + `${command} ${args.join(" ")} failed with exit code ${String(result.status)}.`, + result.stdout, + result.stderr + ].filter(Boolean).join("\n")); + } + return result; +} + +function dependencyNames(tree, result = new Set()) { + for (const [name, metadata] of Object.entries(tree?.dependencies ?? {})) { + result.add(name); + dependencyNames(metadata, result); + } + return result; +} + +const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "codex-provider-sync-pack-smoke-")); +let tarballPath = null; +try { + const packed = run(process.execPath, [npmCliPath, "pack", "--json", "--ignore-scripts"]); + const packResult = JSON.parse(packed.stdout); + if (!Array.isArray(packResult) || packResult.length !== 1) { + throw new Error("npm pack did not return exactly one root package."); + } + const tarballCandidates = [ + path.resolve(repositoryRoot, packResult[0].filename), + path.join( + repositoryRoot, + `${packResult[0].name.replace(/^@/, "").replaceAll("/", "-")}-${packResult[0].version}.tgz` + ) + ]; + for (const candidate of tarballCandidates) { + try { + await fs.access(candidate); + tarballPath = candidate; + break; + } catch { + // npm 8 reports a scoped filename while writing a sanitized basename. + } + } + if (!tarballPath) throw new Error("Could not locate the npm pack tarball."); + const packedPaths = new Set(packResult[0].files.map((entry) => entry.path.replaceAll("\\", "/"))); + for (const required of ["src/cli.js", "src/public-api.js", "web/dist/index.html"] ) { + if (!packedPaths.has(required)) throw new Error(`Root tarball is missing ${required}.`); + } + for (const packedPath of packedPaths) { + if (packedPath.startsWith("apps/") + || packedPath.startsWith("packages/") + || packedPath.startsWith("node_modules/")) { + throw new Error(`Root tarball contains forbidden workspace/runtime content: ${packedPath}`); + } + } + + await fs.writeFile(path.join(tempRoot, "package.json"), JSON.stringify({ + name: "codex-provider-sync-pack-smoke", + version: "0.0.0", + private: true, + scripts: { provider: "codex-provider" } + })); + const installArgs = [npmCliPath, "install", "--omit=dev"]; + if (installLifecycle) installArgs.push("--ignore-scripts=false"); + else installArgs.push("--ignore-scripts"); + installArgs.push(tarballPath); + run(process.execPath, installArgs, { cwd: tempRoot }); + + const help = run(process.execPath, [ + npmCliPath, + "run", + "--silent", + "provider", + "--", + "help" + ], { cwd: tempRoot }); + if (!`${help.stdout}\n${help.stderr}`.includes("codex-provider status")) { + throw new Error(`Installed CLI help smoke failed. stdout=${JSON.stringify(help.stdout)} stderr=${JSON.stringify(help.stderr)}`); + } + + const codexHome = path.join(tempRoot, "synthetic-codex-home"); + await fs.mkdir(path.join(codexHome, "sessions"), { recursive: true }); + await fs.mkdir(path.join(codexHome, "archived_sessions"), { recursive: true }); + await fs.mkdir(path.join(codexHome, "sqlite"), { recursive: true }); + await fs.writeFile(path.join(codexHome, "config.toml"), 'model_provider = "openai"\n'); + if (installLifecycle) { + const stateDbPath = path.join(codexHome, "sqlite", "state_5.sqlite"); + const createDatabase = [ + 'const Database = require("better-sqlite3");', + 'const database = new Database(process.env.PROVIDER_SYNC_SMOKE_DB);', + 'database.exec(`CREATE TABLE threads (', + ' id TEXT PRIMARY KEY,', + ' model_provider TEXT,', + " cwd TEXT NOT NULL DEFAULT '',", + ' archived INTEGER NOT NULL DEFAULT 0,', + " first_user_message TEXT NOT NULL DEFAULT '',", + ' model TEXT', + ');`);', + 'database.prepare("INSERT INTO threads (id, model_provider, cwd, archived, first_user_message) VALUES (?, ?, ?, ?, ?)")', + ' .run("synthetic-thread", "openai", "synthetic", 0, "synthetic");', + 'database.close();' + ].join("\n"); + run(process.execPath, ["-e", createDatabase], { + cwd: tempRoot, + env: { PROVIDER_SYNC_SMOKE_DB: stateDbPath } + }); + } + const status = run(process.execPath, [ + npmCliPath, + "run", + "--silent", + "provider", + "--", + "status", + "--json", + "--codex-home", + codexHome + ], { cwd: tempRoot }); + const statusEnvelope = JSON.parse(status.stdout); + if (statusEnvelope.schemaVersion !== 1 + || statusEnvelope.command !== "status" + || statusEnvelope.ok !== true) { + throw new Error("Installed CLI JSON status smoke failed."); + } + if (installLifecycle + && (statusEnvelope.result?.sqliteCounts === null + || statusEnvelope.result?.sqliteCounts?.unreadable === true)) { + throw new Error("Installed CLI did not open the synthetic SQLite database."); + } + + const productionTree = JSON.parse(run(process.execPath, [npmCliPath, "ls", "--omit=dev", "--json"], { + cwd: tempRoot + }).stdout); + const installedNames = dependencyNames(productionTree); + for (const forbidden of ["react", "react-dom", "vite", "typescript", "electron"]) { + if (installedNames.has(forbidden)) throw new Error(`Root production tree contains ${forbidden}.`); + } + + process.stdout.write( + `Root tarball ${installLifecycle ? "lifecycle + SQLite" : "content"} smoke passed on Node ${process.version}.\n` + ); +} finally { + await fs.rm(tempRoot, { recursive: true, force: true }); + if (tarballPath) await fs.rm(tarballPath, { force: true }); +} diff --git a/scripts/verify-node16-runtime.js b/scripts/verify-node16-runtime.js new file mode 100644 index 0000000..6772b48 --- /dev/null +++ b/scripts/verify-node16-runtime.js @@ -0,0 +1,35 @@ +import fs from "node:fs"; +import path from "node:path"; + +const expectedNode = "v16.20.2"; + +function installedNpmVersion() { + const npmExecPath = process.env.npm_execpath; + if (!npmExecPath) return null; + let current = path.dirname(path.resolve(npmExecPath)); + for (let depth = 0; depth < 8; depth += 1) { + const manifestPath = path.join(current, "package.json"); + try { + const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8")); + if (manifest.name === "npm" && typeof manifest.version === "string") return manifest.version; + } catch { + // Continue toward the filesystem root. + } + const parent = path.dirname(current); + if (parent === current) break; + current = parent; + } + return null; +} + +const npmVersion = installedNpmVersion(); +const npmMajor = npmVersion?.split(".")[0]; + +if (process.version !== expectedNode || npmMajor !== "8") { + process.stderr.write( + `Expected Node ${expectedNode} with npm 8; found Node ${process.version} and npm ${npmVersion ?? "unknown"}.\n` + ); + process.exitCode = 1; +} else { + process.stdout.write(`Verified Node ${process.version} with npm ${npmVersion}.\n`); +} diff --git a/scripts/verify-root-production-tree.js b/scripts/verify-root-production-tree.js new file mode 100644 index 0000000..c79880d --- /dev/null +++ b/scripts/verify-root-production-tree.js @@ -0,0 +1,24 @@ +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const forbidden = [ + "react", + "react-dom", + "vite", + "typescript", + "electron", + "@codex-provider-sync/core", + "@codex-provider-sync/contracts", + "@codex-provider-sync/core-client" +]; + +for (const name of forbidden) { + const candidate = path.join(repositoryRoot, "node_modules", ...name.split("/")); + if (fs.existsSync(candidate)) { + throw new Error(`Root production install contains forbidden dependency or workspace link: ${name}.`); + } +} + +process.stdout.write("Root production install contains no modern UI, Electron, TypeScript, or workspace links.\n"); diff --git a/scripts/verify-workspace-boundaries.js b/scripts/verify-workspace-boundaries.js new file mode 100644 index 0000000..aba27fb --- /dev/null +++ b/scripts/verify-workspace-boundaries.js @@ -0,0 +1,100 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const REQUIRED_WORKSPACES = [ + "apps/cli", + "apps/web", + "apps/desktop", + "packages/core", + "packages/contracts", + "packages/core-client", + "packages/app-ui", + "packages/design-system", + "packages/test-fixtures" +]; +const DEPENDENCY_FIELDS = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"]; + +async function readJson(relativePath) { + return JSON.parse(await fs.readFile(path.join(repositoryRoot, relativePath), "utf8")); +} + +function assert(condition, message) { + if (!condition) throw new Error(message); +} + +function assertExactDependencies(manifest, label) { + for (const field of DEPENDENCY_FIELDS) { + for (const [name, specification] of Object.entries(manifest[field] ?? {})) { + assert( + typeof specification === "string" + && /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(specification), + `${label} ${field}.${name} must use an exact version; found ${String(specification)}.` + ); + } + } +} + +async function sourceFiles(relativeRoot) { + const root = path.join(repositoryRoot, relativeRoot); + const result = []; + async function visit(directory) { + for (const entry of await fs.readdir(directory, { withFileTypes: true })) { + const fullPath = path.join(directory, entry.name); + if (entry.isDirectory()) await visit(fullPath); + else if (/\.(?:js|mjs|ts|tsx)$/.test(entry.name)) result.push(fullPath); + } + } + await visit(root); + return result; +} + +const rootManifest = await readJson("package.json"); +assert(rootManifest.name === "@dailin521/codex-provider-sync", "Root npm package name changed."); +assert(rootManifest.bin?.["codex-provider"] === "src/cli.js", "Root CLI bin changed."); +assert(rootManifest.engines?.node === ">=16.20.2", "Root Node 16 compatibility contract changed."); +assert(Array.isArray(rootManifest.workspaces), "Root npm workspaces are not enabled."); +assert(rootManifest.workspaces.includes("apps/*") && rootManifest.workspaces.includes("packages/*"), "Root workspace globs are incomplete."); +assert(Object.keys(rootManifest.dependencies ?? {}).length === 0, "Root runtime dependencies must stay Core-only."); +assertExactDependencies(rootManifest, "root package"); + +for (const entry of rootManifest.files ?? []) { + assert(!entry.startsWith("apps") && !entry.startsWith("packages"), `Root tarball allowlist leaks workspace source: ${entry}`); +} + +const manifests = new Map(); +for (const workspace of REQUIRED_WORKSPACES) { + const manifest = await readJson(`${workspace}/package.json`); + manifests.set(workspace, manifest); + assert(manifest.private === true, `${workspace} must remain private.`); + assertExactDependencies(manifest, workspace); +} + +const coreSource = await fs.readFile(path.join(repositoryRoot, "packages/core/src/index.js"), "utf8"); +const rootImports = [...coreSource.matchAll(/from\s+["'](\.\.\/\.\.\/\.\.\/src\/[^"']+)["']/g)] + .map((match) => match[1]); +assert(rootImports.length === 1 && rootImports[0] === "../../../src/public-api.js", "Core bridge may import only root src/public-api.js."); + +for (const boundary of [ + "packages/contracts/src", + "packages/core-client/src", + "packages/app-ui/src", + "packages/design-system/src" +]) { + for (const filePath of await sourceFiles(boundary)) { + const source = await fs.readFile(filePath, "utf8"); + assert(!/from\s+["'](?:node:|electron)/.test(source), `${path.relative(repositoryRoot, filePath)} imports a forbidden platform module.`); + assert(!/\.\.\/.*src\//.test(source), `${path.relative(repositoryRoot, filePath)} deep-imports implementation source.`); + } +} + +const desktopManifest = manifests.get("apps/desktop"); +const desktopDependencies = { + ...(desktopManifest.dependencies ?? {}), + ...(desktopManifest.devDependencies ?? {}), + ...(desktopManifest.optionalDependencies ?? {}) +}; +assert(!Object.keys(desktopDependencies).some((name) => name === "electron" || name.startsWith("electron-")), "C4 must not enable Electron dependencies before C6."); + +process.stdout.write("Workspace package, dependency, import and root publish boundaries are valid.\n"); diff --git a/src/cli.js b/src/cli.js index e3ab3a9..b93a61d 100755 --- a/src/cli.js +++ b/src/cli.js @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import path from "node:path"; -import { pathToFileURL } from "node:url"; +import { fileURLToPath } from "node:url"; import { cliJsonExitCode, @@ -718,11 +718,20 @@ export async function runCli(argv, options = {}) { async function isDirectExecution() { if (!process.argv[1]) return false; - try { - return pathToFileURL(await fs.realpath(process.argv[1])).href === import.meta.url; - } catch { - return pathToFileURL(path.resolve(process.argv[1])).href === import.meta.url; - } + const canonicalPath = async (value) => { + try { + return await fs.realpath(value); + } catch { + return path.resolve(value); + } + }; + const [executedPath, modulePath] = await Promise.all([ + canonicalPath(process.argv[1]), + canonicalPath(fileURLToPath(import.meta.url)) + ]); + return process.platform === "win32" + ? executedPath.toLowerCase() === modulePath.toLowerCase() + : executedPath === modulePath; } if (await isDirectExecution()) { diff --git a/src/public-api.d.ts b/src/public-api.d.ts new file mode 100644 index 0000000..71f7505 --- /dev/null +++ b/src/public-api.d.ts @@ -0,0 +1,58 @@ +/** + * @internal Transitional declarations for the legacy root package boundary. + * New vNext hosts use @codex-provider-sync/core and its trusted profile facade. + */ +export const CORE_ERROR_CODES: readonly string[]; + +export class CoreError extends Error { + readonly code: string; + readonly severity: string; + readonly retryable: boolean; + readonly recoveryRequired: boolean; + readonly operationId?: string; + readonly details?: Record; + readonly suggestedAction?: string; + constructor(code: string, message: string, options?: Record); + toDto(): Record; +} + +export function toCoreErrorDto(error: unknown, options?: Record): Record; +export function getStatus(options?: Record): Promise; +export function prepareSync(options?: Record): Promise; +export function applySync(input: Record): Promise; +export function prepareSwitch(options?: Record): Promise; +export function applySwitch(input: Record): Promise; +export function prepareRestore(options?: Record): Promise; +export function applyRestore(input: Record): Promise; +export function pruneBackups(options?: Record): Promise; +export function listBackups(codexHome: string): Promise; +export function listHistory(codexHome: string, options?: Record): Promise; +export function getHistorySession(codexHome: string, sessionId: string, options?: Record): Promise; +export function startWatch(options?: Record): Promise; +export function stopWatch(input: Record): Promise; +export function getWatchStatus(input?: Record | null): unknown; +export function getDiagnostics(options?: Record): Promise; + +/** @deprecated Use prepareSync/applySync through the trusted Core facade. */ +export function runSync(options?: Record): Promise; +/** @deprecated Use prepareSwitch/applySwitch through the trusted Core facade. */ +export function runSwitch(options?: Record): Promise; +/** @deprecated Use prepareRestore/applyRestore through the trusted Core facade. */ +export function runRestore(options?: Record): Promise; +/** @deprecated Use pruneBackups through the trusted Core facade. */ +export function runPruneBackups(options?: Record): Promise; +/** @deprecated Use startWatch/stopWatch through the trusted Core facade. */ +export function runWatch(options?: Record): Promise; + +/** @internal Legacy root helper; not part of the vNext Core facade. */ +export function readConfigText(filePath: string): Promise; +/** @internal Legacy root helper; not part of the vNext Core facade. */ +export function readRootModelFromConfigText(text: string): string | null; +/** @internal Legacy root helper; not part of the vNext Core facade. */ +export function detectStateDb(input: unknown): Promise; +/** @internal Legacy root helper; not part of the vNext Core facade. */ +export function ensureCodexHome(input: unknown): Promise; +/** @internal Legacy root helper; not part of the vNext Core facade. */ +export function resolveStorageLayout(input: unknown): unknown; +/** @internal Legacy root helper; not part of the vNext Core facade. */ +export function withStateDbLocation(input: unknown, location: unknown): unknown; diff --git a/test/workspace-boundaries.test.js b/test/workspace-boundaries.test.js new file mode 100644 index 0000000..b336b75 --- /dev/null +++ b/test/workspace-boundaries.test.js @@ -0,0 +1,69 @@ +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import path from "node:path"; +import test from "node:test"; + +const repositoryRoot = path.resolve(new URL("..", import.meta.url).pathname.replace(/^\/(?:([A-Za-z]:))/, "$1")); +const workspacePaths = [ + "apps/cli", + "apps/web", + "apps/desktop", + "packages/core", + "packages/contracts", + "packages/core-client", + "packages/app-ui", + "packages/design-system", + "packages/test-fixtures" +]; +const dependencyFields = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"]; + +async function manifest(relativePath) { + return JSON.parse(await fs.readFile(path.join(repositoryRoot, relativePath, "package.json"), "utf8")); +} + +test("root npm package remains an independent Node 16 CLI tarball surface", async () => { + const root = await manifest(""); + assert.equal(root.name, "@dailin521/codex-provider-sync"); + assert.equal(root.engines.node, ">=16.20.2"); + assert.equal(root.bin["codex-provider"], "src/cli.js"); + assert.deepEqual(root.dependencies ?? {}, {}); + assert.ok(root.files.includes("src")); + assert.ok(root.files.includes("web/dist")); + assert.equal(root.files.some((entry) => entry.startsWith("apps") || entry.startsWith("packages")), false); +}); + +test("all C4 workspaces are private and direct dependency versions are exact", async () => { + for (const workspacePath of workspacePaths) { + const workspace = await manifest(workspacePath); + assert.equal(workspace.private, true, workspacePath); + for (const field of dependencyFields) { + for (const [name, specification] of Object.entries(workspace[field] ?? {})) { + assert.match(specification, /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/, `${workspacePath} ${field}.${name}`); + } + } + } +}); + +test("Core bridge has one explicit transition exception and no deep implementation import", async () => { + const source = await fs.readFile(path.join(repositoryRoot, "packages/core/src/index.js"), "utf8"); + const imports = [...source.matchAll(/from\s+["'](\.\.\/\.\.\/\.\.\/src\/[^"']+)["']/g)] + .map((match) => match[1]); + assert.deepEqual(imports, ["../../../src/public-api.js"]); + assert.doesNotMatch(source, /src\/(service|locking|backup|history|watch)\.js/); +}); + +test("transitional root declarations match runtime exports and mark legacy adapters", async () => { + const declarations = await fs.readFile(path.join(repositoryRoot, "src/public-api.d.ts"), "utf8"); + const declaredNames = [...declarations.matchAll(/export\s+(?:declare\s+)?(?:const|class|function)\s+([A-Za-z0-9_]+)/g)] + .map((match) => match[1]) + .sort(); + const runtime = await import("../src/public-api.js"); + assert.deepEqual(declaredNames, Object.keys(runtime).sort()); + for (const adapter of ["runSync", "runSwitch", "runRestore", "runPruneBackups", "runWatch"]) { + assert.match( + declarations, + new RegExp(`@deprecated[^]*?export function ${adapter}\\(`), + `${adapter} must remain explicitly deprecated during migration` + ); + } +}); diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..1c08b8c --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "lib": [ + "ES2022", + "DOM", + "DOM.Iterable" + ], + "strict": true, + "declaration": true, + "declarationMap": false, + "sourceMap": false, + "verbatimModuleSyntax": true, + "isolatedModules": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + } +} diff --git a/tsconfig.workspaces.json b/tsconfig.workspaces.json new file mode 100644 index 0000000..e2cef36 --- /dev/null +++ b/tsconfig.workspaces.json @@ -0,0 +1,10 @@ +{ + "files": [], + "references": [ + { "path": "packages/contracts" }, + { "path": "packages/core-client" }, + { "path": "packages/design-system" }, + { "path": "packages/app-ui" }, + { "path": "apps/desktop" } + ] +} diff --git a/web/dist/assets/index-CAZ7Ulmk.js b/web/dist/assets/index-CAZ7Ulmk.js deleted file mode 100644 index 3a40d2a..0000000 --- a/web/dist/assets/index-CAZ7Ulmk.js +++ /dev/null @@ -1,10 +0,0 @@ -var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.provider`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.iterator;function p(e){return typeof e!=`object`||!e?null:(e=f&&e[f]||e[`@@iterator`],typeof e==`function`?e:null)}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function _(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}_.prototype.isReactComponent={},_.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`setState(...): takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},_.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function v(){}v.prototype=_.prototype;function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}var b=y.prototype=new v;b.constructor=y,h(b,_.prototype),b.isPureReactComponent=!0;var x=Array.isArray,ee=Object.prototype.hasOwnProperty,S={current:null},C={key:!0,ref:!0,__self:!0,__source:!0};function w(e,n,r){var i,a={},o=null,s=null;if(n!=null)for(i in n.ref!==void 0&&(s=n.ref),n.key!==void 0&&(o=``+n.key),n)ee.call(n,i)&&!C.hasOwnProperty(i)&&(a[i]=n[i]);var c=arguments.length-2;if(c===1)a.children=r;else if(1{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=typeof setTimeout==`function`?setTimeout:null,_=typeof clearTimeout==`function`?clearTimeout:null,v=typeof setImmediate<`u`?setImmediate:null;typeof navigator<`u`&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function y(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function b(e){if(h=!1,y(e),!m){if(n(c)!==null)m=!0,O(x);else{var t=n(l);t!==null&&ie(b,t.startTime-e)}}}function x(t,i){m=!1,h&&(h=!1,_(C),C=-1),p=!0;var a=f;try{for(y(i),d=n(c);d!==null&&(!(d.expirationTime>i)||t&&!te());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=i);i=e.unstable_now(),typeof s==`function`?d.callback=s:d===n(c)&&r(c),y(i)}else r(c);d=n(c)}if(d!==null)var u=!0;else{var g=n(l);g!==null&&ie(b,g.startTime-i),u=!1}return u}finally{d=null,f=a,p=!1}}var ee=!1,S=null,C=-1,w=5,T=-1;function te(){return!(e.unstable_now()-Te||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(_(C),C=-1):h=!0,ie(b,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,O(x))),r},e.unstable_shouldYield=te,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u(),n=f();function r(e){for(var t=`https://reactjs.org/docs/error-decoder.html?invariant=`+e,n=1;n`u`||window.document===void 0||window.document.createElement===void 0),l=Object.prototype.hasOwnProperty,d=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,p={},m={};function h(e){return l.call(m,e)?!0:l.call(p,e)?!1:d.test(e)?m[e]=!0:(p[e]=!0,!1)}function g(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case`function`:case`symbol`:return!0;case`boolean`:return r?!1:n===null?(e=e.toLowerCase().slice(0,5),e!==`data-`&&e!==`aria-`):!n.acceptsBooleans;default:return!1}}function _(e,t,n,r){if(t==null||g(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function v(e,t,n,r,i,a,o){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=i,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=a,this.removeEmptyString=o}var y={};`children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style`.split(` `).forEach(function(e){y[e]=new v(e,0,!1,e,null,!1,!1)}),[[`acceptCharset`,`accept-charset`],[`className`,`class`],[`htmlFor`,`for`],[`httpEquiv`,`http-equiv`]].forEach(function(e){var t=e[0];y[t]=new v(t,1,!1,e[1],null,!1,!1)}),[`contentEditable`,`draggable`,`spellCheck`,`value`].forEach(function(e){y[e]=new v(e,2,!1,e.toLowerCase(),null,!1,!1)}),[`autoReverse`,`externalResourcesRequired`,`focusable`,`preserveAlpha`].forEach(function(e){y[e]=new v(e,2,!1,e,null,!1,!1)}),`allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope`.split(` `).forEach(function(e){y[e]=new v(e,3,!1,e.toLowerCase(),null,!1,!1)}),[`checked`,`multiple`,`muted`,`selected`].forEach(function(e){y[e]=new v(e,3,!0,e,null,!1,!1)}),[`capture`,`download`].forEach(function(e){y[e]=new v(e,4,!1,e,null,!1,!1)}),[`cols`,`rows`,`size`,`span`].forEach(function(e){y[e]=new v(e,6,!1,e,null,!1,!1)}),[`rowSpan`,`start`].forEach(function(e){y[e]=new v(e,5,!1,e.toLowerCase(),null,!1,!1)});var b=/[\-:]([a-z])/g;function x(e){return e[1].toUpperCase()}`accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height`.split(` `).forEach(function(e){var t=e.replace(b,x);y[t]=new v(t,1,!1,e,null,!1,!1)}),`xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type`.split(` `).forEach(function(e){var t=e.replace(b,x);y[t]=new v(t,1,!1,e,`http://www.w3.org/1999/xlink`,!1,!1)}),[`xml:base`,`xml:lang`,`xml:space`].forEach(function(e){var t=e.replace(b,x);y[t]=new v(t,1,!1,e,`http://www.w3.org/XML/1998/namespace`,!1,!1)}),[`tabIndex`,`crossOrigin`].forEach(function(e){y[e]=new v(e,1,!1,e.toLowerCase(),null,!1,!1)}),y.xlinkHref=new v(`xlinkHref`,1,!1,`xlink:href`,`http://www.w3.org/1999/xlink`,!0,!1),[`src`,`href`,`action`,`formAction`].forEach(function(e){y[e]=new v(e,1,!1,e.toLowerCase(),null,!0,!0)});function ee(e,t,n,r){var i=y.hasOwnProperty(t)?y[t]:null;(i===null?r||!(2s||i[o]!==a[s]){var c=` -`+i[o].replace(` at new `,` at `);return e.displayName&&c.includes(``)&&(c=c.replace(``,e.displayName)),c}while(1<=o&&0<=s);break}}}finally{de=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:``)?ue(e):``}function pe(e){switch(e.tag){case 5:return ue(e.type);case 16:return ue(`Lazy`);case 13:return ue(`Suspense`);case 19:return ue(`SuspenseList`);case 0:case 2:case 15:return e=fe(e.type,!1),e;case 11:return e=fe(e.type.render,!1),e;case 1:return e=fe(e.type,!0),e;default:return``}}function me(e){if(e==null)return null;if(typeof e==`function`)return e.displayName||e.name||null;if(typeof e==`string`)return e;switch(e){case T:return`Fragment`;case w:return`Portal`;case ne:return`Profiler`;case te:return`StrictMode`;case O:return`Suspense`;case ie:return`SuspenseList`}if(typeof e==`object`)switch(e.$$typeof){case E:return(e.displayName||`Context`)+`.Consumer`;case re:return(e._context.displayName||`Context`)+`.Provider`;case D:var t=e.render;return e=e.displayName,e||=(e=t.displayName||t.name||``,e===``?`ForwardRef`:`ForwardRef(`+e+`)`),e;case k:return t=e.displayName||null,t===null?me(e.type)||`Memo`:t;case ae:t=e._payload,e=e._init;try{return me(e(t))}catch{}}return null}function he(e){var t=e.type;switch(e.tag){case 24:return`Cache`;case 9:return(t.displayName||`Context`)+`.Consumer`;case 10:return(t._context.displayName||`Context`)+`.Provider`;case 18:return`DehydratedFragment`;case 11:return e=t.render,e=e.displayName||e.name||``,t.displayName||(e===``?`ForwardRef`:`ForwardRef(`+e+`)`);case 7:return`Fragment`;case 5:return t;case 4:return`Portal`;case 3:return`Root`;case 6:return`Text`;case 16:return me(t);case 8:return t===te?`StrictMode`:`Mode`;case 22:return`Offscreen`;case 12:return`Profiler`;case 21:return`Scope`;case 13:return`Suspense`;case 19:return`SuspenseList`;case 25:return`TracingMarker`;case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t==`function`)return t.displayName||t.name||null;if(typeof t==`string`)return t}return null}function j(e){switch(typeof e){case`boolean`:case`number`:case`string`:case`undefined`:return e;case`object`:return e;default:return``}}function M(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()===`input`&&(t===`checkbox`||t===`radio`)}function N(e){var t=M(e)?`checked`:`value`,n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=``+e[t];if(!e.hasOwnProperty(t)&&n!==void 0&&typeof n.get==`function`&&typeof n.set==`function`){var i=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(e){r=``+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=``+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function P(e){e._valueTracker||=N(e)}function ge(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r=``;return e&&(r=M(e)?e.checked?`true`:`false`:e.value),e=r,e!==n&&(t.setValue(e),!0)}function _e(e){if(e||=typeof document<`u`?document:void 0,e===void 0)return null;try{return e.activeElement||e.body}catch{return e.body}}function ve(e,t){var n=t.checked;return A({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function ye(e,t){var n=t.defaultValue==null?``:t.defaultValue,r=t.checked==null?t.defaultChecked:t.checked;n=j(t.value==null?n:t.value),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type===`checkbox`||t.type===`radio`?t.checked!=null:t.value!=null}}function be(e,t){t=t.checked,t!=null&&ee(e,`checked`,t,!1)}function xe(e,t){be(e,t);var n=j(t.value),r=t.type;if(n!=null)r===`number`?(n===0&&e.value===``||e.value!=n)&&(e.value=``+n):e.value!==``+n&&(e.value=``+n);else if(r===`submit`||r===`reset`){e.removeAttribute(`value`);return}t.hasOwnProperty(`value`)?Ce(e,t.type,n):t.hasOwnProperty(`defaultValue`)&&Ce(e,t.type,j(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Se(e,t,n){if(t.hasOwnProperty(`value`)||t.hasOwnProperty(`defaultValue`)){var r=t.type;if(!(r!==`submit`&&r!==`reset`||t.value!==void 0&&t.value!==null))return;t=``+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==``&&(e.name=``),e.defaultChecked=!!e._wrapperState.initialChecked,n!==``&&(e.name=n)}function Ce(e,t,n){(t!==`number`||_e(e.ownerDocument)!==e)&&(n==null?e.defaultValue=``+e._wrapperState.initialValue:e.defaultValue!==``+n&&(e.defaultValue=``+n))}var F=Array.isArray;function we(e,t,n,r){if(e=e.options,t){t={};for(var i=0;i`+t.valueOf().toString()+``,t=je.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ne(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Pe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Fe=[`Webkit`,`ms`,`Moz`,`O`];Object.keys(Pe).forEach(function(e){Fe.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Pe[t]=Pe[e]})});function Ie(e,t,n){return t==null||typeof t==`boolean`||t===``?``:n||typeof t!=`number`||t===0||Pe.hasOwnProperty(e)&&Pe[e]?(``+t).trim():t+`px`}function Le(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=n.indexOf(`--`)===0,i=Ie(n,t[n],r);n===`float`&&(n=`cssFloat`),r?e.setProperty(n,i):e[n]=i}}var Re=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ze(e,t){if(t){if(Re[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(r(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(r(60));if(typeof t.dangerouslySetInnerHTML!=`object`||!(`__html`in t.dangerouslySetInnerHTML))throw Error(r(61))}if(t.style!=null&&typeof t.style!=`object`)throw Error(r(62))}}function Be(e,t){if(e.indexOf(`-`)===-1)return typeof t.is==`string`;switch(e){case`annotation-xml`:case`color-profile`:case`font-face`:case`font-face-src`:case`font-face-uri`:case`font-face-format`:case`font-face-name`:case`missing-glyph`:return!1;default:return!0}}var Ve=null;function He(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Ue=null,We=null,Ge=null;function Ke(e){if(e=Wi(e)){if(typeof Ue!=`function`)throw Error(r(280));var t=e.stateNode;t&&(t=Ki(t),Ue(e.stateNode,e.type,t))}}function qe(e){We?Ge?Ge.push(e):Ge=[e]:We=e}function Je(){if(We){var e=We,t=Ge;if(Ge=We=null,Ke(e),t)for(e=0;e>>=0,e===0?32:31-(At(e)/jt|0)|0}var Nt=64,Pt=4194304;function Ft(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function It(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,i=e.suspendedLanes,a=e.pingedLanes,o=n&268435455;if(o!==0){var s=o&~i;s===0?(a&=o,a!==0&&(r=Ft(a))):r=Ft(s)}else o=n&~i,o===0?a!==0&&(r=Ft(a)):r=Ft(o);if(r===0)return 0;if(t!==0&&t!==r&&(t&i)===0&&(i=r&-r,a=t&-t,i>=a||i===16&&a&4194240))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Ht(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-kt(t),e[t]=n}function Ut(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=ir),sr=` `,cr=!1;function lr(e,t){switch(e){case`keyup`:return nr.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function ur(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var dr=!1;function fr(e,t){switch(e){case`compositionend`:return ur(t);case`keypress`:return t.which===32?(cr=!0,sr):null;case`textInput`:return e=t.data,e===sr&&cr?null:e;default:return null}}function pr(e,t){if(dr)return e===`compositionend`||!rr&&lr(e,t)?(e=Dn(),En=Tn=wn=null,dr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Fr(n)}}function Lr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Lr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Rr(){for(var e=window,t=_e();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=_e(e.document)}return t}function zr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}function Br(e){var t=Rr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Lr(n.ownerDocument.documentElement,n)){if(r!==null&&zr(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),`selectionStart`in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=n.textContent.length,a=Math.min(r.start,i);r=r.end===void 0?a:Math.min(r.end,i),!e.extend&&a>r&&(i=r,r=a,a=i),i=Ir(n,a);var o=Ir(n,r);i&&o&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==o.node||e.focusOffset!==o.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),a>r?(e.addRange(t),e.extend(o.node,o.offset)):(t.setEnd(o.node,o.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus==`function`&&n.focus(),n=0;n=document.documentMode,Hr=null,Ur=null,Wr=null,Gr=!1;function Kr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Gr||Hr==null||Hr!==_e(r)||(r=Hr,`selectionStart`in r&&zr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Wr&&Pr(Wr,r)||(Wr=r,r=_i(Ur,`onSelect`),0Ji||(e.current=qi[Ji],qi[Ji]=null,Ji--)}function B(e,t){Ji++,qi[Ji]=e.current,e.current=t}var Xi={},Zi=Yi(Xi),Qi=Yi(!1),$i=Xi;function ea(e,t){var n=e.type.contextTypes;if(!n)return Xi;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i={},a;for(a in n)i[a]=t[a];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function ta(e){return e=e.childContextTypes,e!=null}function na(){z(Qi),z(Zi)}function ra(e,t,n){if(Zi.current!==Xi)throw Error(r(168));B(Zi,t),B(Qi,n)}function ia(e,t,n){var i=e.stateNode;if(t=t.childContextTypes,typeof i.getChildContext!=`function`)return n;for(var a in i=i.getChildContext(),i)if(!(a in t))throw Error(r(108,he(e)||`Unknown`,a));return A({},n,i)}function aa(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Xi,$i=Zi.current,B(Zi,e),B(Qi,Qi.current),!0}function oa(e,t,n){var i=e.stateNode;if(!i)throw Error(r(169));n?(e=ia(e,t,$i),i.__reactInternalMemoizedMergedChildContext=e,z(Qi),z(Zi),B(Zi,e)):z(Qi),B(Qi,n)}var sa=null,ca=!1,la=!1;function ua(e){sa===null?sa=[e]:sa.push(e)}function da(e){ca=!0,ua(e)}function fa(){if(!la&&sa!==null){la=!0;var e=0,t=L;try{var n=sa;for(L=1;e>=o,i-=o,ba=1<<32-kt(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(r,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(r,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(r,d),V&&Sa(r,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),V&&Sa(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return V&&Sa(a,g),u}for(h=i(a,h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),V&&Sa(a,g),u}function _(e,r,i,o){if(typeof i==`object`&&i&&i.type===T&&i.key===null&&(i=i.props.children),typeof i==`object`&&i){switch(i.$$typeof){case C:a:{for(var c=i.key,l=r;l!==null;){if(l.key===c){if(c=i.type,c===T){if(l.tag===7){n(e,l.sibling),r=a(l,i.props.children),r.return=e,e=r;break a}}else if(l.elementType===c||typeof c==`object`&&c&&c.$$typeof===ae&&Va(c)===l.type){n(e,l.sibling),r=a(l,i.props),r.ref=za(e,l,i),r.return=e,e=r;break a}n(e,l);break}t(e,l),l=l.sibling}i.type===T?(r=Zl(i.props.children,e.mode,o,i.key),r.return=e,e=r):(o=Xl(i.type,i.key,i.props,null,e.mode,o),o.ref=za(e,r,i),o.return=e,e=o)}return s(e);case w:a:{for(l=i.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===i.containerInfo&&r.stateNode.implementation===i.implementation){n(e,r.sibling),r=a(r,i.children||[]),r.return=e,e=r;break a}n(e,r);break}t(e,r),r=r.sibling}r=eu(i,e.mode,o),r.return=e,e=r}return s(e);case ae:return l=i._init,_(e,r,l(i._payload),o)}if(F(i))return h(e,r,i,o);if(ce(i))return g(e,r,i,o);Ba(e,i)}return typeof i==`string`&&i!==``||typeof i==`number`?(i=``+i,r!==null&&r.tag===6?(n(e,r.sibling),r=a(r,i),r.return=e,e=r):(n(e,r),r=$l(i,e.mode,o),r.return=e,e=r),s(e)):n(e,r)}return _}var Ua=Ha(!0),Wa=Ha(!1),Ga=Yi(null),Ka=null,qa=null,Ja=null;function Ya(){Ja=qa=Ka=null}function Xa(e){var t=Ga.current;z(Ga),e._currentValue=t}function Za(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)===t?r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t):(e.childLanes|=t,r!==null&&(r.childLanes|=t)),e===n)break;e=e.return}}function Qa(e,t){Ka=e,Ja=qa=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(Rs=!0),e.firstContext=null)}function $a(e){var t=e._currentValue;if(Ja!==e){if(e={context:e,memoizedValue:t,next:null},qa===null){if(Ka===null)throw Error(r(308));qa=e,Ka.dependencies={lanes:0,firstContext:e}}else qa=qa.next=e}return t}var eo=null;function to(e){eo===null?eo=[e]:eo.push(e)}function no(e,t,n,r){var i=t.interleaved;return i===null?(n.next=n,to(t)):(n.next=i.next,i.next=n),t.interleaved=n,ro(e,r)}function ro(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var io=!1;function ao(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function oo(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function so(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function co(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,J&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,ro(e,n)}return i=r.interleaved,i===null?(t.next=t,to(r)):(t.next=i.next,i.next=t),r.interleaved=t,ro(e,n)}function lo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194240)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Wt(e,n)}}function uo(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function fo(e,t,n,r){var i=e.updateQueue;io=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane,p=s.eventTime;if((r&f)===f){u!==null&&(u=u.next={eventTime:p,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});a:{var m=e,h=s;switch(f=t,p=n,h.tag){case 1:if(m=h.payload,typeof m==`function`){d=m.call(p,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=h.payload,f=typeof m==`function`?m.call(p,d,f):m,f==null)break a;d=A({},d,f);break a;case 2:io=!0}}s.callback!==null&&s.lane!==0&&(e.flags|=64,f=i.effects,f===null?i.effects=[s]:f.push(s))}else p={eventTime:p,lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;f=s,s=f.next,f.next=null,i.lastBaseUpdate=f,i.shared.pending=null}}while(1);if(u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,t=i.shared.interleaved,t!==null){i=t;do o|=i.lane,i=i.next;while(i!==t)}else a===null&&(i.shared.lanes=0);Yc|=o,e.lanes=o,e.memoizedState=d}}function po(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=Do.transition;Do.transition={};try{e(!1),t()}finally{L=n,Do.transition=r}}function ds(){return Ro().memoizedState}function fs(e,t,n){var r=ml(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},ms(e))hs(t,n);else if(n=no(e,t,n,r),n!==null){var i=pl();hl(n,e,r,i),gs(n,t,r)}}function ps(e,t,n){var r=ml(e),i={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(ms(e))hs(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Nr(s,o)){var c=t.interleaved;c===null?(i.next=i,to(t)):(i.next=c.next,c.next=i),t.interleaved=i;return}}catch{}n=no(e,t,i,r),n!==null&&(i=pl(),hl(n,e,r,i),gs(n,t,r))}}function ms(e){var t=e.alternate;return e===U||t!==null&&t===U}function hs(e,t){Ao=ko=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function gs(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Wt(e,n)}}var _s={readContext:$a,useCallback:No,useContext:No,useEffect:No,useImperativeHandle:No,useInsertionEffect:No,useLayoutEffect:No,useMemo:No,useReducer:No,useRef:No,useState:No,useDebugValue:No,useDeferredValue:No,useTransition:No,useMutableSource:No,useSyncExternalStore:No,useId:No,unstable_isNewReconciler:!1},vs={readContext:$a,useCallback:function(e,t){return Lo().memoizedState=[e,t===void 0?null:t],e},useContext:$a,useEffect:es,useImperativeHandle:function(e,t,n){return n=n==null?null:n.concat([e]),Qo(4194308,4,is.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Qo(4194308,4,e,t)},useInsertionEffect:function(e,t){return Qo(4,2,e,t)},useMemo:function(e,t){var n=Lo();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Lo();return t=n===void 0?t:n(t),r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=fs.bind(null,U,e),[r.memoizedState,e]},useRef:function(e){var t=Lo();return e={current:e},t.memoizedState=e},useState:Yo,useDebugValue:os,useDeferredValue:function(e){return Lo().memoizedState=e},useTransition:function(){var e=Yo(!1),t=e[0];return e=us.bind(null,e[1]),Lo().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var i=U,a=Lo();if(V){if(n===void 0)throw Error(r(407));n=n()}else{if(n=t(),Y===null)throw Error(r(349));Oo&30||Wo(i,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,es(Ko.bind(null,i,o,e),[e]),i.flags|=2048,Xo(9,Go.bind(null,i,o,n,t),void 0,null),n},useId:function(){var e=Lo(),t=Y.identifierPrefix;if(V){var n=xa,r=ba;n=(r&~(1<<32-kt(r)-1)).toString(32)+n,t=`:`+t+`R`+n,n=jo++,0<\/script>`,e=e.removeChild(e.firstChild)):typeof i.is==`string`?e=c.createElement(n,{is:i.is}):(e=c.createElement(n),n===`select`&&(c=e,i.multiple?c.multiple=!0:i.size&&(c.size=i.size))):e=c.createElementNS(e,n),e[Li]=t,e[Ri]=i,cc(e,t,!1,!1),t.stateNode=e;a:{switch(c=Be(n,i),n){case`dialog`:R(`cancel`,e),R(`close`,e),o=i;break;case`iframe`:case`object`:case`embed`:R(`load`,e),o=i;break;case`video`:case`audio`:for(o=0;otl&&(t.flags|=128,i=!0,dc(s,!1),t.lanes=4194304)}}else{if(!i){if(e=Co(c),e!==null){if(t.flags|=128,i=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),dc(s,!0),s.tail===null&&s.tailMode===`hidden`&&!c.alternate&&!V)return fc(t),null}else 2*I()-s.renderingStartTime>tl&&n!==1073741824&&(t.flags|=128,i=!0,dc(s,!1),t.lanes=4194304)}s.isBackwards?(c.sibling=t.child,t.child=c):(n=s.last,n===null?t.child=c:n.sibling=c,s.last=c)}return s.tail===null?(fc(t),null):(t=s.tail,s.rendering=t,s.tail=t.sibling,s.renderingStartTime=I(),t.sibling=null,n=H.current,B(H,i?n&1|2:n&1),t);case 22:case 23:return Tl(),i=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==i&&(t.flags|=8192),i&&t.mode&1?Kc&1073741824&&(fc(t),t.subtreeFlags&6&&(t.flags|=8192)):fc(t),null;case 24:return null;case 25:return null}throw Error(r(156,t.tag))}function mc(e,t){switch(Ta(t),t.tag){case 1:return ta(t.type)&&na(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return bo(),z(Qi),z(Zi),To(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return So(t),null;case 13:if(z(H),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));Ia()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return z(H),null;case 4:return bo(),null;case 10:return Xa(t.type._context),null;case 22:case 23:return Tl(),null;case 24:return null;default:return null}}var hc=!1,gc=!1,_c=typeof WeakSet==`function`?WeakSet:Set,K=null;function vc(e,t){var n=e.ref;if(n!==null){if(typeof n==`function`)try{n(null)}catch(n){$(e,t,n)}else n.current=null}}function yc(e,t,n){try{n()}catch(n){$(e,t,n)}}var bc=!1;function xc(e,t){if(Ti=_n,e=Rr(),zr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var i=n.getSelection&&n.getSelection();if(i&&i.rangeCount!==0){n=i.anchorNode;var a=i.anchorOffset,o=i.focusNode;i=i.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||i!==0&&f.nodeType!==3||(l=s+i),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===i&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(Ei={focusedElem:e,selectionRange:n},_n=!1,K=t;K!==null;)if(t=K,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,K=e;else for(;K!==null;){t=K;try{var h=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(h!==null){var g=h.memoizedProps,_=h.memoizedState,v=t.stateNode;v.__reactInternalSnapshotBeforeUpdate=v.getSnapshotBeforeUpdate(t.elementType===t.type?g:xs(t.type,g),_)}break;case 3:var y=t.stateNode.containerInfo;y.nodeType===1?y.textContent=``:y.nodeType===9&&y.documentElement&&y.removeChild(y.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(e){$(t,t.return,e)}if(e=t.sibling,e!==null){e.return=t.return,K=e;break}K=t.return}return h=bc,bc=!1,h}function Sc(e,t,n){var r=t.updateQueue;if(r=r===null?null:r.lastEffect,r!==null){var i=r=r.next;do{if((i.tag&e)===e){var a=i.destroy;i.destroy=void 0,a!==void 0&&yc(t,n,a)}i=i.next}while(i!==r)}}function Cc(e,t){if(t=t.updateQueue,t=t===null?null:t.lastEffect,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function wc(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t==`function`?t(e):t.current=e}}function Tc(e){var t=e.alternate;t!==null&&(e.alternate=null,Tc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Li],delete t[Ri],delete t[Bi],delete t[Vi],delete t[Hi])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Ec(e){return e.tag===5||e.tag===3||e.tag===4}function Dc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Ec(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Oc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=wi));else if(r!==4&&(e=e.child,e!==null))for(Oc(e,t,n),e=e.sibling;e!==null;)Oc(e,t,n),e=e.sibling}function kc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(kc(e,t,n),e=e.sibling;e!==null;)kc(e,t,n),e=e.sibling}var q=null,Ac=!1;function jc(e,t,n){for(n=n.child;n!==null;)Mc(e,t,n),n=n.sibling}function Mc(e,t,n){if(Dt&&typeof Dt.onCommitFiberUnmount==`function`)try{Dt.onCommitFiberUnmount(Et,n)}catch{}switch(n.tag){case 5:gc||vc(n,t);case 6:var r=q,i=Ac;q=null,jc(e,t,n),q=r,Ac=i,q!==null&&(Ac?(e=q,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):q.removeChild(n.stateNode));break;case 18:q!==null&&(Ac?(e=q,n=n.stateNode,e.nodeType===8?Ni(e.parentNode,n):e.nodeType===1&&Ni(e,n),hn(e)):Ni(q,n.stateNode));break;case 4:r=q,i=Ac,q=n.stateNode.containerInfo,Ac=!0,jc(e,t,n),q=r,Ac=i;break;case 0:case 11:case 14:case 15:if(!gc&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){i=r=r.next;do{var a=i,o=a.destroy;a=a.tag,o!==void 0&&(a&2||a&4)&&yc(n,t,o),i=i.next}while(i!==r)}jc(e,t,n);break;case 1:if(!gc&&(vc(n,t),r=n.stateNode,typeof r.componentWillUnmount==`function`))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(e){$(n,t,e)}jc(e,t,n);break;case 21:jc(e,t,n);break;case 22:n.mode&1?(gc=(r=gc)||n.memoizedState!==null,jc(e,t,n),gc=r):jc(e,t,n);break;default:jc(e,t,n)}}function Nc(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new _c),t.forEach(function(t){var r=Hl.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))})}}function Pc(e,t){var n=t.deletions;if(n!==null)for(var i=0;ia&&(a=s),i&=~o}if(i=a,i=I()-i,i=(120>i?120:480>i?480:1080>i?1080:1920>i?1920:3e3>i?3e3:4320>i?4320:1960*Hc(i/1960))-i,10e?16:e,sl===null)var i=!1;else{if(e=sl,sl=null,cl=0,J&6)throw Error(r(331));var a=J;for(J|=4,K=e.current;K!==null;){var o=K,s=o.child;if(K.flags&16){var c=o.deletions;if(c!==null){for(var l=0;lI()-el?El(e,0):Zc|=n),gl(e,t)}function Bl(e,t){t===0&&(e.mode&1?(t=Pt,Pt<<=1,!(Pt&130023424)&&(Pt=4194304)):t=1);var n=pl();e=ro(e,t),e!==null&&(Ht(e,t,n),gl(e,n))}function Vl(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Bl(e,n)}function Hl(e,t){var n=0;switch(e.tag){case 13:var i=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:i=e.stateNode;break;default:throw Error(r(314))}i!==null&&i.delete(t),Bl(e,n)}var Ul=function(e,t,n){if(e!==null){if(e.memoizedProps!==t.pendingProps||Qi.current)Rs=!0;else{if((e.lanes&n)===0&&!(t.flags&128))return Rs=!1,sc(e,t,n);Rs=!!(e.flags&131072)}}else Rs=!1,V&&t.flags&1048576&&Ca(t,ga,t.index);switch(t.lanes=0,t.tag){case 2:var i=t.type;ac(e,t),e=t.pendingProps;var a=ea(t,Zi.current);Qa(t,n),a=Fo(null,t,i,e,a,n);var o=Io();return t.flags|=1,typeof a==`object`&&a&&typeof a.render==`function`&&a.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,ta(i)?(o=!0,aa(t)):o=!1,t.memoizedState=a.state!==null&&a.state!==void 0?a.state:null,ao(t),a.updater=Cs,t.stateNode=a,a._reactInternals=t,Ds(t,i,e,n),t=qs(null,t,i,!0,o,n)):(t.tag=0,V&&o&&wa(t),zs(null,t,a,n),t=t.child),t;case 16:i=t.elementType;a:{switch(ac(e,t),e=t.pendingProps,a=i._init,i=a(i._payload),t.type=i,a=t.tag=Jl(i),e=xs(i,e),a){case 0:t=Gs(null,t,i,e,n);break a;case 1:t=Ks(null,t,i,e,n);break a;case 11:t=Bs(null,t,i,e,n);break a;case 14:t=Vs(null,t,i,xs(i.type,e),n);break a}throw Error(r(306,i,``))}return t;case 0:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),Gs(e,t,i,a,n);case 1:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),Ks(e,t,i,a,n);case 3:a:{if(Js(t),e===null)throw Error(r(387));i=t.pendingProps,o=t.memoizedState,a=o.element,oo(e,t),fo(t,i,null,n);var s=t.memoizedState;if(i=s.element,o.isDehydrated){if(o={element:i,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){a=Os(Error(r(423)),t),t=Ys(e,t,i,n,a);break a}if(i!==a){a=Os(Error(r(424)),t),t=Ys(e,t,i,n,a);break a}for(Da=Pi(t.stateNode.containerInfo.firstChild),Ea=t,V=!0,Oa=null,n=Wa(t,null,i,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling}else{if(Ia(),i===a){t=oc(e,t,n);break a}zs(e,t,i,n)}t=t.child}return t;case 5:return xo(t),e===null&&Ma(t),i=t.type,a=t.pendingProps,o=e===null?null:e.memoizedProps,s=a.children,Di(i,a)?s=null:o!==null&&Di(i,o)&&(t.flags|=32),Ws(e,t),zs(e,t,s,n),t.child;case 6:return e===null&&Ma(t),null;case 13:return Qs(e,t,n);case 4:return yo(t,t.stateNode.containerInfo),i=t.pendingProps,e===null?t.child=Ua(t,null,i,n):zs(e,t,i,n),t.child;case 11:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),Bs(e,t,i,a,n);case 7:return zs(e,t,t.pendingProps,n),t.child;case 8:return zs(e,t,t.pendingProps.children,n),t.child;case 12:return zs(e,t,t.pendingProps.children,n),t.child;case 10:a:{if(i=t.type._context,a=t.pendingProps,o=t.memoizedProps,s=a.value,B(Ga,i._currentValue),i._currentValue=s,o!==null){if(Nr(o.value,s)){if(o.children===a.children&&!Qi.current){t=oc(e,t,n);break a}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var c=o.dependencies;if(c!==null){s=o.child;for(var l=c.firstContext;l!==null;){if(l.context===i){if(o.tag===1){l=so(-1,n&-n),l.tag=2;var u=o.updateQueue;if(u!==null){u=u.shared;var d=u.pending;d===null?l.next=l:(l.next=d.next,d.next=l),u.pending=l}}o.lanes|=n,l=o.alternate,l!==null&&(l.lanes|=n),Za(o.return,n,t),c.lanes|=n;break}l=l.next}}else if(o.tag===10)s=o.type===t.type?null:o.child;else if(o.tag===18){if(s=o.return,s===null)throw Error(r(341));s.lanes|=n,c=s.alternate,c!==null&&(c.lanes|=n),Za(s,n,t),s=o.sibling}else s=o.child;if(s!==null)s.return=o;else for(s=o;s!==null;){if(s===t){s=null;break}if(o=s.sibling,o!==null){o.return=s.return,s=o;break}s=s.return}o=s}}zs(e,t,a.children,n),t=t.child}return t;case 9:return a=t.type,i=t.pendingProps.children,Qa(t,n),a=$a(a),i=i(a),t.flags|=1,zs(e,t,i,n),t.child;case 14:return i=t.type,a=xs(i,t.pendingProps),a=xs(i.type,a),Vs(e,t,i,a,n);case 15:return Hs(e,t,t.type,t.pendingProps,n);case 17:return i=t.type,a=t.pendingProps,a=t.elementType===i?a:xs(i,a),ac(e,t),t.tag=1,ta(i)?(e=!0,aa(t)):e=!1,Qa(t,n),Ts(t,i,a),Ds(t,i,a,n),qs(null,t,i,!0,e,n);case 19:return ic(e,t,n);case 22:return Us(e,t,n)}throw Error(r(156,t.tag))};function Wl(e,t){return gt(e,t)}function Gl(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Kl(e,t,n,r){return new Gl(e,t,n,r)}function ql(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Jl(e){if(typeof e==`function`)return+!!ql(e);if(e!=null){if(e=e.$$typeof,e===D)return 11;if(e===k)return 14}return 2}function Yl(e,t){var n=e.alternate;return n===null?(n=Kl(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Xl(e,t,n,i,a,o){var s=2;if(i=e,typeof e==`function`)ql(e)&&(s=1);else if(typeof e==`string`)s=5;else a:switch(e){case T:return Zl(n.children,a,o,t);case te:s=8,a|=8;break;case ne:return e=Kl(12,n,t,a|2),e.elementType=ne,e.lanes=o,e;case O:return e=Kl(13,n,t,a),e.elementType=O,e.lanes=o,e;case ie:return e=Kl(19,n,t,a),e.elementType=ie,e.lanes=o,e;case oe:return Ql(n,a,o,t);default:if(typeof e==`object`&&e)switch(e.$$typeof){case re:s=10;break a;case E:s=9;break a;case D:s=11;break a;case k:s=14;break a;case ae:s=16,i=null;break a}throw Error(r(130,e==null?e:typeof e,``))}return t=Kl(s,n,t,a),t.elementType=e,t.type=i,t.lanes=o,t}function Zl(e,t,n,r){return e=Kl(7,e,r,t),e.lanes=n,e}function Ql(e,t,n,r){return e=Kl(22,e,r,t),e.elementType=oe,e.lanes=n,e.stateNode={isHidden:!1},e}function $l(e,t,n){return e=Kl(6,e,null,t),e.lanes=n,e}function eu(e,t,n){return t=Kl(4,e.children===null?[]:e.children,e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function tu(e,t,n,r,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Vt(0),this.expirationTimes=Vt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Vt(0),this.identifierPrefix=r,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function nu(e,t,n,r,i,a,o,s,c){return e=new tu(e,t,n,s,c),t===1?(t=1,!0===a&&(t|=8)):t=0,a=Kl(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},ao(a),e}function ru(e,t,n){var r=3{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=m();e.createRoot=t.createRoot,e.hydrateRoot=t.hydrateRoot})),g=c(u(),1),_=h(),v=`cps.web.deviceCredential`,y=class extends Error{constructor(e=`此浏览器需要重新配对。请重新运行 codex-provider web。`){super(e),this.name=`PairingRequiredError`}},b=class extends Error{constructor(e,t,n){super(t||`配置已变更,请重新确认。`),this.name=`ProfileRevisionError`,this.code=e,this.profile=n}};function x(){return!!window.localStorage.getItem(v)}async function ee(){let e=new URLSearchParams(window.location.hash.replace(/^#/,``)).get(`pair`);if(!e)return x();let t=await fetch(`/api/pair`,{method:`POST`,headers:{"X-Codex-Provider-Pairing":e}}),n=await t.json().catch(()=>({}));if(!t.ok||!n.deviceCredential)throw new y(n.error??`配对链接无效、已过期或已被使用。请重新运行 codex-provider web。`);return window.localStorage.setItem(v,n.deviceCredential),window.history.replaceState(null,``,`${window.location.pathname}${window.location.search}`),!0}function S(){return{"X-Codex-Provider-Device":window.localStorage.getItem(v)??``}}function C(e,t,n){let r=e.code??e.coreError?.code;return t===409&&([`PROFILE_REVISION_REQUIRED`,`PROFILE_CHANGED`,`STORAGE_REVISION_REQUIRED`,`STORAGE_CHANGED`].includes(r)||[`PLAN_EXPIRED`,`STALE_STATE`].includes(r))?new b(r,e.error,e.profile):Error(e.error??n)}async function w(e,t){let n=await e.json().catch(()=>({}));if(!e.ok)throw n.code===`PAIRING_REQUIRED`?(window.dispatchEvent(new CustomEvent(`cps:pairing-required`,{detail:n.error})),new y(n.error)):C(n,e.status,t);return n}async function T(e,t={},{signal:n}={}){let r=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`,...S()},body:JSON.stringify(t),signal:n});return w(r,`Request failed with HTTP ${r.status}.`)}async function te(e=0){let t=await fetch(`/api/activity?after=${e}`,{headers:S()});return w(t,`Activity request failed with HTTP ${t.status}.`)}async function ne(){let e=await fetch(`/api/profiles`,{headers:S()});return w(e,`Profile request failed with HTTP ${e.status}.`)}async function re(){try{await T(`/api/access/forget`)}finally{window.localStorage.removeItem(v)}}async function E(e={},t={}){return T(`/api/history`,e,t)}async function D(e={},t={}){return T(`/api/history/session`,e,t)}function O(e,t){let[n,r]=(0,g.useState)(()=>{try{let n=window.localStorage.getItem(e);return n?JSON.parse(n):t}catch{return t}});return(0,g.useEffect)(()=>{window.localStorage.setItem(e,JSON.stringify(n))},[e,n]),[n,r]}function ie(){let e=0,t=null;return{begin(){return t?.abort(),t=new AbortController,e+=1,{sequence:e,controller:t,signal:t.signal}},isLatest(t){return t===e},cancel(){t?.abort(),e+=1}}}function k(e,t=300,n=globalThis){let r=n.setTimeout(e,t);return()=>n.clearTimeout(r)}function ae(e,t,n){return!e?.id||!e?.revision||n?.profileId!==e.id||n?.profileRevision!==e.revision?null:{...t,profile:{...e},profileId:e.id,profileRevision:e.revision,status:{...n}}}function oe(e){let t=e?.result?.result?.skippedLockedRolloutFiles??e?.result?.skippedLockedRolloutFiles??e?.skippedLockedRolloutFiles??[];return Array.isArray(t)?t.filter(Boolean):[]}function se(e,{successTitle:t,partialTitle:n,message:r}){let i=oe(e);return e?.result?.outcome===`partial`||e?.outcome===`partial`||i.length>0?{tone:`warning`,title:n,message:[r,i.length?`已跳过 ${i.length} 个被占用的 rollout 文件:${i.join(`、`)}`:`部分项目未完成;请查看活动日志后重试。`].filter(Boolean).join(`;`)}:{tone:`success`,title:t,message:r}}function ce(e,t){let n=String(e??``).replaceAll(`\\`,`/`).replace(/\/{2,}/g,`/`).replace(/\/$/,``);return t===`win32`?n.toLowerCase():n}function A(e=[],{platform:t=typeof process<`u`?process.platform:`browser`}={}){let n=new Set;return e.filter((e,r)=>{let i=e?.threadId??e?.id,a=e?.rolloutPath??e?.filePath??e?.rolloutFile??e?.path,o=i?`thread:${i}`:a?`rollout:${ce(a,t)}`:`item:${r}`;return!n.has(o)&&(n.add(o),!0)})}function le(e,{caseInsensitive:t=!1}={}){let n=String(e??``).replace(/[\\/]+$/,``).replaceAll(`\\`,`/`);return t?n.toLowerCase():n}function ue(e,t,n){return!!(e&&t&&le(e,n)===le(t,n))}function de(e){let t=String(e??``).replace(/[\\/]+$/,``),n=Math.max(t.lastIndexOf(`/`),t.lastIndexOf(`\\`));return n<0?``:n===0?t.slice(0,1):n===2&&/^[A-Za-z]:/.test(t)?t.slice(0,3):t.slice(0,n)}function fe(e,t){let n=e?.stateDbLocation?.path;if(n)return de(n);let r=t?.metadata,i={caseInsensitive:e?.pathComparisonCaseInsensitive===!0};return Number(r?.version)>=2&&e?.sqliteHomeSource==="default"&&ue(r?.sqliteHome,e?.codexHome,i)?e.codexHome:e?.sqliteHome??``}function pe({backup:e,profile:t,targetSqliteHome:n,restoreDatabase:r,restoreConfig:i,sqliteSupported:a,pathComparisonCaseInsensitive:o=!1}){let s=e?.metadata?.sqliteHome,c=t?.sqliteHome?.trim()??``,l=!!(r&&s&&n&&!ue(s,n,{caseInsensitive:o})),u=l&&!c,d=l&&i;return{requiresRelocation:l,missingExplicitTarget:u,configRestoreConflict:d,canSubmit:!!a&&!u&&!d}}function me(e){return{profileId:e||`default`}}function he({fetchStatus:e,fetchBackups:t,gate:n=ie()}){let r=async({profileId:r,showLoading:i=!0,onLoading:a,onResult:o,onError:s})=>{let{controller:c,sequence:l}=n.begin();i&&a?.(!0);try{let i=me(r),[a,s]=await Promise.all([e(i,{signal:c.signal}),t(i,{signal:c.signal})]);return n.isLatest(l)?(o?.({profileId:r,status:a.status,backups:s}),!0):!1}catch(e){return e?.name===`AbortError`||!n.isLatest(l)||s?.(e),!1}finally{n.isLatest(l)&&a?.(!1)}};return r.cancel=()=>n.cancel(),r}var j=o((e=>{var t=u(),n=Symbol.for(`react.element`),r=Symbol.for(`react.fragment`),i=Object.prototype.hasOwnProperty,a=t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,o={key:!0,ref:!0,__self:!0,__source:!0};function s(e,t,r){var s,c={},l=null,u=null;for(s in r!==void 0&&(l=``+r),t.key!==void 0&&(l=``+t.key),t.ref!==void 0&&(u=t.ref),t)i.call(t,s)&&!o.hasOwnProperty(s)&&(c[s]=t[s]);if(e&&e.defaultProps)for(s in t=e.defaultProps,t)c[s]===void 0&&(c[s]=t[s]);return{$$typeof:n,type:e,key:l,ref:u,props:c,_owner:a.current}}e.Fragment=r,e.jsx=s,e.jsxs=s})),M=o(((e,t)=>{t.exports=j()}))();function N({children:e,size:t=18,className:n=``}){return(0,M.jsx)(`svg`,{className:n,width:t,height:t,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:e})}var P=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M20 6v5h-5`}),(0,M.jsx)(`path`,{d:`M4 18v-5h5`}),(0,M.jsx)(`path`,{d:`M18.3 9A7 7 0 0 0 6.7 6.7L4 11`}),(0,M.jsx)(`path`,{d:`M5.7 15A7 7 0 0 0 17.3 17.3L20 13`})]}),ge=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`ellipse`,{cx:`12`,cy:`5`,rx:`8`,ry:`3`}),(0,M.jsx)(`path`,{d:`M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5`}),(0,M.jsx)(`path`,{d:`M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6`})]}),_e=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M3 12a9 9 0 1 0 3-6.7L3 8`}),(0,M.jsx)(`path`,{d:`M3 3v5h5`}),(0,M.jsx)(`path`,{d:`M12 7v5l3 2`})]}),ve=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`M3 12h4l2-7 4 14 2-7h6`})}),ye=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`,rx:`1`}),(0,M.jsx)(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`,rx:`1`}),(0,M.jsx)(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1`}),(0,M.jsx)(`rect`,{x:`14`,y:`14`,width:`7`,height:`7`,rx:`1`})]}),be=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M12 3 4.5 6v5.3c0 4.6 3.2 8 7.5 9.7 4.3-1.7 7.5-5.1 7.5-9.7V6L12 3Z`}),(0,M.jsx)(`path`,{d:`m9 12 2 2 4-4`})]}),xe=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`m9 18 6-6-6-6`})}),Se=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`m6 6 12 12M18 6 6 18`})}),Ce=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`m5 12 4 4L19 6`})}),F=e=>(0,M.jsxs)(N,{...e,children:[(0,M.jsx)(`path`,{d:`M12 3 2.8 19h18.4L12 3Z`}),(0,M.jsx)(`path`,{d:`M12 9v4M12 17h.01`})]}),we=e=>(0,M.jsx)(N,{...e,children:(0,M.jsx)(`path`,{d:`M3 6.5h6l2 2h10v9.5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6.5Z`})}),Te=[{id:`overview`,label:`概览`,icon:ye},{id:`history`,label:`聊天记录`,icon:_e},{id:`backups`,label:`备份`,icon:_e},{id:`activity`,label:`活动`,icon:ve}],Ee={backupRoot:``,backups:[]};function De(e){return new Intl.NumberFormat(`zh-CN`).format(Number(e)||0)}function Oe(e){let t=[`B`,`KB`,`MB`,`GB`,`TB`],n=Number(e)||0,r=0;for(;n>=1024&&r=10?1:2).replace(/\.0$/,``)} ${t[r]}`}function ke(e){return e?new Intl.DateTimeFormat(`zh-CN`,{month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}).format(new Date(e)):`未知时间`}function Ae(e,t){return e.split(/(`[^`]+`|\*\*[^*]+\*\*|\*[^*]+\*)/g).map((e,n)=>e.startsWith("`")&&e.endsWith("`")?(0,M.jsx)(`code`,{children:e.slice(1,-1)},`${t}-code-${n}`):e.startsWith(`**`)&&e.endsWith(`**`)?(0,M.jsx)(`strong`,{children:e.slice(2,-2)},`${t}-strong-${n}`):e.startsWith(`*`)&&e.endsWith(`*`)?(0,M.jsx)(`em`,{children:e.slice(1,-1)},`${t}-em-${n}`):(0,M.jsx)(g.Fragment,{children:e},`${t}-text-${n}`))}function je({text:e}){return String(e??``).split(/(```[^\n]*\n[\s\S]*?```)/g).map((e,t)=>{if(e.startsWith("```")&&e.endsWith("```")){let n=e.slice(3,-3).replace(/^\w*\n/,``);return(0,M.jsx)(`pre`,{children:(0,M.jsx)(`code`,{children:n})},`block-${t}`)}return e.split(` -`).map((e,n,r)=>(0,M.jsxs)(g.Fragment,{children:[Ae(e,`${t}-${n}`),n{for(let r of e??[]){if(!r||r===`(missing)`)continue;let e=t.get(r)??new Set;e.add(n),t.set(r,e)}};return n(e.configuredProviders,`config`),n(Object.keys(e.rolloutCounts?.sessions??{}),`rollout`),n(Object.keys(e.rolloutCounts?.archived_sessions??{}),`rollout`),n(Object.keys(e.sqliteCounts?.sessions??{}),`sqlite`),n(Object.keys(e.sqliteCounts?.archived_sessions??{}),`sqlite`),n([e.currentProvider],`config`),[...t.entries()].map(([t,n])=>({id:t,sources:[...n],configured:e.configuredProviders?.includes(t),current:t===e.currentProvider})).sort((e,t)=>Number(t.current)-Number(e.current)||e.id.localeCompare(t.id))}function Ne({tone:e=`neutral`}){return(0,M.jsx)(`span`,{className:`status-dot status-dot--${e}`,"aria-hidden":`true`})}function Pe({status:e,busy:t,onRefresh:n}){let r=e?.sqliteAccess?.supported!==!1&&!e?.sqliteCounts?.unreadable;return(0,M.jsxs)(`header`,{className:`app-header`,children:[(0,M.jsxs)(`div`,{className:`brand`,children:[(0,M.jsx)(`div`,{className:`brand-mark`,children:(0,M.jsx)(ge,{size:19})}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`div`,{className:`brand-name`,children:`Codex Provider Sync`}),(0,M.jsx)(`div`,{className:`brand-subtitle`,children:`本机元数据一致性工具`})]})]}),(0,M.jsxs)(`div`,{className:`header-actions`,children:[(0,M.jsxs)(`div`,{className:`service-state`,children:[(0,M.jsx)(Ne,{tone:t?`warning`:r?`success`:`danger`}),(0,M.jsx)(`span`,{children:t?`操作执行中`:r?`本地服务就绪`:`需要检查`})]}),(0,M.jsxs)(`button`,{className:`button button--secondary button--compact`,type:`button`,onClick:n,disabled:t,children:[(0,M.jsx)(P,{size:16}),`刷新`]})]})]})}function Fe({view:e,setView:t,status:n,onForgetBrowser:r}){return(0,M.jsxs)(`aside`,{className:`sidebar`,children:[(0,M.jsx)(`nav`,{className:`navigation`,"aria-label":`主导航`,children:Te.map(n=>{let r=n.icon;return(0,M.jsxs)(`button`,{className:`nav-item ${e===n.id?`nav-item--active`:``}`,type:`button`,onClick:()=>t(n.id),children:[(0,M.jsx)(r,{size:17}),(0,M.jsx)(`span`,{children:n.label})]},n.id)})}),(0,M.jsxs)(`div`,{className:`sidebar-foot`,children:[(0,M.jsx)(`div`,{className:`sidebar-provider-label`,children:`当前 Provider`}),(0,M.jsxs)(`div`,{className:`sidebar-provider-value`,children:[(0,M.jsx)(Ne,{tone:`success`}),(0,M.jsx)(`span`,{children:n?.currentProvider??`未读取`})]}),(0,M.jsx)(`div`,{className:`sidebar-version`,children:`Web UI · localhost only`}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,onClick:r,children:`忘记此浏览器`})]})]})}function Ie({profiles:e,profileId:t,setProfileId:n,status:r,onAddProfile:i,onDeleteProfile:a,onRefresh:o,loading:s,profileSwitchDisabled:c}){return(0,M.jsxs)(`section`,{className:`storage-bar`,"aria-label":`存储位置`,children:[(0,M.jsxs)(`label`,{className:`path-field path-field--wide`,children:[(0,M.jsx)(`span`,{children:`存储配置`}),(0,M.jsxs)(`div`,{className:`path-input-wrap`,children:[(0,M.jsx)(we,{size:16}),(0,M.jsx)(`select`,{value:t,onChange:e=>n(e.target.value),disabled:c,children:e.map(e=>(0,M.jsx)(`option`,{value:e.id,children:e.name},e.id))})]})]}),(0,M.jsxs)(`label`,{className:`path-field`,children:[(0,M.jsxs)(`span`,{children:[`当前路径 `,(0,M.jsx)(`small`,{children:`由服务端解析`})]}),(0,M.jsxs)(`div`,{className:`path-input-wrap`,children:[(0,M.jsx)(ge,{size:16}),(0,M.jsx)(`input`,{value:r?.codexHome??``,readOnly:!0,placeholder:`读取状态后显示`})]})]}),(0,M.jsx)(`button`,{className:`button button--secondary storage-refresh`,type:`button`,onClick:i,children:`新增配置`}),t==="default"?null:(0,M.jsx)(`button`,{className:`button button--quiet storage-refresh`,type:`button`,onClick:a,children:`删除配置`}),(0,M.jsxs)(`button`,{className:`button button--secondary storage-refresh`,type:`button`,onClick:o,disabled:s,children:[(0,M.jsx)(P,{size:16,className:s?`spin`:``}),`读取状态`]})]})}function Le({title:e,counts:t,currentProvider:n}){let r=Object.entries(t??{}).sort((e,t)=>t[1]-e[1]),i=r.reduce((e,[,t])=>e+t,0);return(0,M.jsxs)(`div`,{className:`distribution-block`,children:[(0,M.jsxs)(`div`,{className:`distribution-heading`,children:[(0,M.jsx)(`span`,{children:e}),(0,M.jsx)(`strong`,{children:De(i)})]}),(0,M.jsx)(`div`,{className:`distribution-list`,children:r.length===0?(0,M.jsx)(`div`,{className:`empty-inline`,children:`无记录`}):r.map(([e,t])=>(0,M.jsxs)(`div`,{className:`distribution-row`,children:[(0,M.jsxs)(`div`,{className:`distribution-meta`,children:[(0,M.jsx)(`span`,{className:`provider-name`,children:e}),(0,M.jsx)(`span`,{children:De(t)})]}),(0,M.jsx)(`div`,{className:`bar-track`,children:(0,M.jsx)(`span`,{className:e===n?`bar-fill bar-fill--current`:`bar-fill`,style:{width:`${Math.max(5,i?t/i*100:0)}%`}})})]},e))})]})}function Re({status:e,loading:t}){let n=Object.values(e?.rolloutCounts?.sessions??{}).reduce((e,t)=>e+t,0)+Object.values(e?.rolloutCounts?.archived_sessions??{}).reduce((e,t)=>e+t,0),r=Object.values(e?.sqliteCounts?.sessions??{}).reduce((e,t)=>e+t,0)+Object.values(e?.sqliteCounts?.archived_sessions??{}).reduce((e,t)=>e+t,0),i=e?.alignment?.aligned;return(0,M.jsxs)(`section`,{className:`status-panel`,children:[(0,M.jsxs)(`div`,{className:`section-title-row`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`状态总览`}),(0,M.jsx)(`p`,{children:`比较 rollout 文件、SQLite 线程索引和当前 Provider。`})]}),(0,M.jsxs)(`div`,{className:`alignment-state ${i?`alignment-state--success`:`alignment-state--warning`}`,children:[t?(0,M.jsx)(P,{size:16,className:`spin`}):i?(0,M.jsx)(Ce,{size:16}):(0,M.jsx)(F,{size:16}),(0,M.jsx)(`span`,{children:t?`正在检查`:i?`Provider 元数据已对齐`:`发现不一致`})]})]}),(0,M.jsxs)(`div`,{className:`summary-strip`,children:[(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`当前 Provider`}),(0,M.jsx)(`strong`,{children:e?.currentProvider??`—`}),(0,M.jsx)(`small`,{children:e?.currentProviderImplicit?`隐式默认`:`config.toml 根级配置`})]}),(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`Rollout 文件`}),(0,M.jsx)(`strong`,{children:De(n)}),(0,M.jsx)(`small`,{children:`sessions + archived`})]}),(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`SQLite threads`}),(0,M.jsx)(`strong`,{children:e?.sqliteCounts?.unreadable?`不可读`:De(r)}),(0,M.jsx)(`small`,{children:e?.stateDbLocation?.source??`未定位数据库`})]}),(0,M.jsxs)(`div`,{className:`summary-item`,children:[(0,M.jsx)(`span`,{children:`托管备份`}),(0,M.jsx)(`strong`,{children:De(e?.backupSummary?.count)}),(0,M.jsx)(`small`,{children:Oe(e?.backupSummary?.totalBytes)})]})]}),(0,M.jsxs)(`div`,{className:`distribution-grid`,children:[(0,M.jsxs)(`div`,{className:`distribution-column`,children:[(0,M.jsxs)(`div`,{className:`column-label`,children:[(0,M.jsx)(we,{size:16}),` Rollout files`]}),(0,M.jsx)(Le,{title:`sessions`,counts:e?.rolloutCounts?.sessions,currentProvider:e?.currentProvider}),(0,M.jsx)(Le,{title:`archived_sessions`,counts:e?.rolloutCounts?.archived_sessions,currentProvider:e?.currentProvider})]}),(0,M.jsx)(`div`,{className:`distribution-divider`}),(0,M.jsxs)(`div`,{className:`distribution-column`,children:[(0,M.jsxs)(`div`,{className:`column-label`,children:[(0,M.jsx)(ge,{size:16}),` SQLite state`]}),(0,M.jsx)(Le,{title:`sessions`,counts:e?.sqliteCounts?.sessions,currentProvider:e?.currentProvider}),(0,M.jsx)(Le,{title:`archived_sessions`,counts:e?.sqliteCounts?.archived_sessions,currentProvider:e?.currentProvider})]})]})]})}function ze({status:e}){let t=[];e?.sqliteAccess?.supported===!1&&t.push({tone:`danger`,title:`SQLite 路径不可安全访问`,detail:e.sqliteAccess.message}),e?.sqliteCounts?.unreadable&&t.push({tone:`danger`,title:`SQLite 当前不可读`,detail:e.sqliteCounts.error}),e?.lockedRolloutFiles?.length&&t.push({tone:`warning`,title:`${e.lockedRolloutFiles.length} 个 rollout 文件正在使用`,detail:`同步会跳过这些活跃文件;会话结束后可再次执行。`}),e?.encryptedContentWarning&&t.push({tone:`warning`,title:`检测到 encrypted_content`,detail:e.encryptedContentWarning});let n=e?.sqliteRepairStats;return(n?.userEventRowsNeedingRepair||n?.cwdRowsNeedingRepair)&&t.push({tone:`info`,title:`SQLite 有待修复字段`,detail:`user-event ${n.userEventRowsNeedingRepair??0},cwd ${n.cwdRowsNeedingRepair??0}`}),t.length===0?null:(0,M.jsx)(`section`,{className:`warning-stack`,"aria-label":`诊断信息`,children:t.map((e,t)=>(0,M.jsxs)(`div`,{className:`warning-row warning-row--${e.tone}`,children:[(0,M.jsx)(F,{size:17}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:e.title}),(0,M.jsx)(`span`,{children:e.detail})]})]},`${e.title}-${t}`))})}function Be({projects:e=[]}){return(0,M.jsxs)(`section`,{className:`data-section`,children:[(0,M.jsx)(`div`,{className:`section-title-row section-title-row--compact`,children:(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`项目可见性`}),(0,M.jsx)(`p`,{children:`检查 Desktop 项目路径、全局排序和首屏 50 条命中。`})]})}),(0,M.jsx)(`div`,{className:`table-scroll`,children:(0,M.jsxs)(`table`,{className:`data-table`,children:[(0,M.jsx)(`thead`,{children:(0,M.jsxs)(`tr`,{children:[(0,M.jsx)(`th`,{children:`项目根目录`}),(0,M.jsx)(`th`,{children:`交互会话`}),(0,M.jsx)(`th`,{children:`首屏`}),(0,M.jsx)(`th`,{children:`Ranks`}),(0,M.jsx)(`th`,{children:`CWD 精确匹配`}),(0,M.jsx)(`th`,{children:`Provider`})]})}),(0,M.jsx)(`tbody`,{children:e.length===0?(0,M.jsx)(`tr`,{children:(0,M.jsx)(`td`,{colSpan:`6`,className:`table-empty`,children:`没有可显示的项目诊断。`})}):e.map(e=>(0,M.jsxs)(`tr`,{children:[(0,M.jsx)(`td`,{className:`path-cell`,children:e.root}),(0,M.jsx)(`td`,{children:e.interactiveThreads}),(0,M.jsxs)(`td`,{children:[e.firstPageThreads,`/50`]}),(0,M.jsx)(`td`,{children:e.rankPreview||`—`}),(0,M.jsxs)(`td`,{children:[e.exactCwdMatches,`/`,e.interactiveThreads]}),(0,M.jsx)(`td`,{children:Object.entries(e.providerCounts??{}).map(([e,t])=>`${e} ${t}`).join(` · `)||`—`})]},e.root))})]})})]})}function Ve({value:e,onChange:t,disabled:n}){return(0,M.jsxs)(`div`,{className:`segmented`,role:`radiogroup`,"aria-label":`执行模式`,children:[(0,M.jsxs)(`button`,{type:`button`,className:e===`sync`?`segmented-option segmented-option--active`:`segmented-option`,onClick:()=>t(`sync`),disabled:n,children:[(0,M.jsx)(`span`,{children:`仅同步元数据`}),(0,M.jsx)(`small`,{children:`不修改 config.toml`})]}),(0,M.jsxs)(`button`,{type:`button`,className:e===`switch`?`segmented-option segmented-option--active`:`segmented-option`,onClick:()=>t(`switch`),disabled:n,children:[(0,M.jsx)(`span`,{children:`切换 Provider 并同步`}),(0,M.jsx)(`small`,{children:`更新根级配置`})]})]})}function He({status:e,providers:t,selectedProvider:n,setSelectedProvider:r,onAddManualProvider:i,onRemoveManualProvider:a,onRequestExecute:o,busy:s}){let[c,l]=O(`cps.web.mode`,`sync`),[u,d]=O(`cps.web.modelMode`,`auto`),[f,p]=O(`cps.web.customModel`,``),[m,h]=O(`cps.web.keepCount`,5),[_,v]=(0,g.useState)(``),y=t.find(e=>e.id===n),b=y?.configured,x=/^[A-Za-z0-9_.-]+$/.test(_.trim()),ee=e?.sqliteAccess?.supported===!1,S=s||!n||ee||e?.sqliteCounts?.unreadable;return(0,M.jsxs)(`section`,{className:`execution-panel`,children:[(0,M.jsxs)(`div`,{className:`execution-head`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`执行同步`}),(0,M.jsx)(`p`,{children:`所有写操作都会先创建备份。执行前请关闭 Codex CLI、App 和 app-server。`})]}),(0,M.jsx)(be,{size:22})]}),(0,M.jsx)(Ve,{value:c,onChange:l,disabled:s}),(0,M.jsxs)(`div`,{className:`form-grid`,children:[(0,M.jsxs)(`label`,{className:`form-field`,children:[(0,M.jsx)(`span`,{children:`目标 Provider`}),(0,M.jsx)(`select`,{value:n,onChange:e=>r(e.target.value),disabled:s,children:t.map(e=>(0,M.jsxs)(`option`,{value:e.id,children:[e.id,e.current?`(当前)`:``]},e.id))}),c===`switch`&&!b?(0,M.jsx)(`small`,{className:`field-error`,children:`切换模式要求该 Provider 已定义在 config.toml。`}):null]}),(0,M.jsxs)(`label`,{className:`form-field form-field--short`,children:[(0,M.jsx)(`span`,{children:`保留备份数`}),(0,M.jsx)(`input`,{type:`number`,min:`1`,max:`100000`,value:m,onChange:e=>h(Number(e.target.value)),disabled:s}),(0,M.jsx)(`small`,{children:`同步后自动清理`})]})]}),(0,M.jsxs)(`div`,{className:`manual-provider-row`,children:[(0,M.jsx)(`input`,{type:`text`,value:_,onChange:e=>v(e.target.value),placeholder:`手动添加 Provider ID`,spellCheck:`false`,disabled:s}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:s||!x,onClick:()=>{i(_.trim()),v(``)},children:`添加`}),y?.manual?(0,M.jsx)(`button`,{className:`manual-remove`,type:`button`,onClick:()=>a(n),disabled:s,children:`删除当前手动项`}):null]}),c===`switch`?(0,M.jsxs)(`fieldset`,{className:`model-options`,disabled:s,children:[(0,M.jsx)(`legend`,{children:`根级 model`}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`auto`,onChange:()=>d(`auto`)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`跟随 Provider 配置`}),(0,M.jsxs)(`small`,{children:["采用 `[model_providers.",n,"]` 中的 model"]})]})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`keep`,onChange:()=>d(`keep`)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`保留当前根级 model`}),(0,M.jsx)(`small`,{children:`只切换 model_provider`})]})]}),(0,M.jsxs)(`label`,{className:`custom-model-option`,children:[(0,M.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`custom`,onChange:()=>d(`custom`)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`自定义 model`}),(0,M.jsx)(`input`,{type:`text`,value:f,onFocus:()=>d(`custom`),onChange:e=>p(e.target.value),placeholder:`例如 MiniMax-M3`})]})]})]}):null,ee?(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`此 SQLite 布局仅供诊断`}),(0,M.jsx)(`span`,{children:e?.sqliteAccess?.message||`当前 SQLite 路径不可由 Web UI 安全写入,因此已禁用执行同步。`})]})]}):null,(0,M.jsxs)(`div`,{className:`backup-assurance`,children:[(0,M.jsx)(Ce,{size:16}),(0,M.jsx)(`span`,{children:`修改前创建 metadata v2 备份,并记录 SQLite Home`})]}),(0,M.jsxs)(`button`,{className:`button button--primary execute-button`,type:`button`,disabled:S||c===`switch`&&!b||c===`switch`&&u===`custom`&&!f.trim(),onClick:()=>o({mode:c,modelMode:u,model:f.trim(),keepCount:m}),children:[s?(0,M.jsx)(P,{size:17,className:`spin`}):(0,M.jsx)(be,{size:17}),s?`正在执行…`:c===`switch`?`切换并同步`:`执行同步`]})]})}function Ue({backups:e,onViewAll:t,onRestore:n,restoreDisabled:r}){return(0,M.jsxs)(`section`,{className:`recent-backups`,children:[(0,M.jsxs)(`div`,{className:`section-title-row section-title-row--compact`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`最近备份`}),(0,M.jsx)(`p`,{children:e.backupRoot||`同步后将在 Codex Home 下创建备份`})]}),(0,M.jsxs)(`button`,{type:`button`,className:`text-button`,onClick:t,children:[`查看全部 `,(0,M.jsx)(xe,{size:14})]})]}),(0,M.jsx)(`div`,{className:`backup-rows`,children:e.backups.length===0?(0,M.jsx)(`div`,{className:`empty-state`,children:`尚无由本工具创建的备份。`}):e.backups.slice(0,3).map(e=>(0,M.jsxs)(`div`,{className:`backup-row`,children:[(0,M.jsx)(`div`,{className:`backup-icon`,children:(0,M.jsx)(_e,{size:17})}),(0,M.jsxs)(`div`,{className:`backup-main`,children:[(0,M.jsx)(`strong`,{children:ke(e.metadata.createdAt)}),(0,M.jsxs)(`span`,{children:[e.metadata.targetProvider,` · `,e.metadata.changedSessionFiles??0,` 个 rollout`]})]}),(0,M.jsx)(`div`,{className:`backup-size`,children:Oe(e.sizeBytes)}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:r,title:r?`当前 SQLite 路径仅供诊断,不能恢复`:void 0,onClick:()=>n(e),children:`恢复`})]},e.id))})]})}function We({status:e,backups:t,providers:n,selectedProvider:r,setSelectedProvider:i,onAddManualProvider:a,onRemoveManualProvider:o,onExecute:s,onRestore:c,setView:l,busy:u,loading:d}){return(0,M.jsxs)(`div`,{className:`view-content`,children:[(0,M.jsx)(Re,{status:e,loading:d}),(0,M.jsx)(ze,{status:e}),(0,M.jsxs)(`div`,{className:`overview-lower-grid`,children:[(0,M.jsxs)(`div`,{className:`overview-main-column`,children:[(0,M.jsx)(Be,{projects:e?.projectThreadVisibility??[]}),(0,M.jsx)(Ue,{backups:t,onViewAll:()=>l(`backups`),onRestore:c,restoreDisabled:e?.sqliteAccess?.supported===!1})]}),(0,M.jsx)(He,{status:e,providers:n,selectedProvider:r,setSelectedProvider:i,onAddManualProvider:a,onRemoveManualProvider:o,onRequestExecute:s,busy:u})]})]})}function Ge({backups:e,status:t,busy:n,onRestore:r,onPrune:i}){let[a,o]=O(`cps.web.keepCount`,5),s=t?.sqliteAccess?.supported===!1;return(0,M.jsxs)(`div`,{className:`view-content`,children:[(0,M.jsxs)(`section`,{className:`page-intro`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h1`,{children:`备份`}),(0,M.jsx)(`p`,{children:`管理当前 Codex Home 下由本工具创建的 metadata v2 备份。`})]}),(0,M.jsxs)(`div`,{className:`prune-control`,children:[(0,M.jsxs)(`label`,{children:[`保留最近 `,(0,M.jsx)(`input`,{type:`number`,min:`0`,max:`100000`,value:a,onChange:e=>o(Number(e.target.value))}),` 份`]}),(0,M.jsx)(`button`,{className:`button button--secondary`,type:`button`,disabled:n,onClick:()=>i(a),children:`清理旧备份`})]})]}),(0,M.jsxs)(`section`,{className:`backup-list-section`,children:[(0,M.jsxs)(`div`,{className:`backup-root-line`,children:[(0,M.jsx)(we,{size:16}),(0,M.jsx)(`span`,{children:e.backupRoot||t?.backupRoot||`—`}),(0,M.jsxs)(`strong`,{children:[e.backups.length,` 份 · `,Oe(e.backups.reduce((e,t)=>e+t.sizeBytes,0))]})]}),(0,M.jsx)(`div`,{className:`full-backup-list`,children:e.backups.length===0?(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(_e,{size:26}),(0,M.jsx)(`strong`,{children:`还没有备份`}),(0,M.jsx)(`span`,{children:`执行一次同步或切换后,备份会显示在这里。`})]}):e.backups.map(e=>(0,M.jsxs)(`article`,{className:`full-backup-row`,children:[(0,M.jsxs)(`div`,{className:`backup-date`,children:[(0,M.jsx)(`strong`,{children:ke(e.metadata.createdAt)}),(0,M.jsx)(`span`,{children:e.id})]}),(0,M.jsxs)(`div`,{className:`backup-facts`,children:[(0,M.jsxs)(`span`,{children:[`Provider `,(0,M.jsx)(`strong`,{children:e.metadata.targetProvider})]}),(0,M.jsxs)(`span`,{children:[`Rollout `,(0,M.jsx)(`strong`,{children:e.metadata.changedSessionFiles??0})]}),(0,M.jsxs)(`span`,{children:[`SQLite `,(0,M.jsx)(`strong`,{children:e.metadata.sqliteDbFiles?.length?`已包含`:`未包含`})]})]}),(0,M.jsxs)(`div`,{className:`backup-source`,children:[(0,M.jsx)(`span`,{children:`SQLite Home`}),(0,M.jsx)(`code`,{children:e.metadata.sqliteHome??`旧版 metadata 未记录`})]}),(0,M.jsxs)(`div`,{className:`backup-row-actions`,children:[(0,M.jsx)(`span`,{children:Oe(e.sizeBytes)}),(0,M.jsx)(`button`,{className:`button button--secondary button--compact`,type:`button`,disabled:n||s,title:s?`当前 SQLite 路径仅供诊断,不能恢复`:void 0,onClick:()=>r(e),children:`恢复`})]})]},e.id))})]})]})}function Ke({activity:e,activeOperation:t}){return(0,M.jsxs)(`div`,{className:`view-content`,children:[(0,M.jsxs)(`section`,{className:`page-intro`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h1`,{children:`活动日志`}),(0,M.jsx)(`p`,{children:`当前 Web UI 会话中的状态刷新、同步阶段和操作结果。`})]}),t?(0,M.jsxs)(`div`,{className:`live-operation`,children:[(0,M.jsx)(P,{size:16,className:`spin`}),` `,t.kind]}):null]}),(0,M.jsxs)(`section`,{className:`activity-console`,children:[(0,M.jsxs)(`div`,{className:`console-head`,children:[(0,M.jsx)(`span`,{children:`Activity log`}),(0,M.jsxs)(`span`,{children:[e.length,` entries`]})]}),(0,M.jsx)(`div`,{className:`console-body`,children:e.length===0?(0,M.jsx)(`div`,{className:`console-empty`,children:`等待操作…`}):e.map(e=>(0,M.jsxs)(`div`,{className:`console-row console-row--${e.level}`,children:[(0,M.jsx)(`time`,{children:ke(e.timestamp)}),(0,M.jsx)(`span`,{className:`console-level`,children:e.level}),(0,M.jsx)(`span`,{className:`console-message`,children:e.message}),typeof e.detail==`string`?(0,M.jsx)(`span`,{className:`console-detail`,children:e.detail}):null]},e.id))})]})]})}function qe({profileId:e,status:t}){let[n,r]=(0,g.useState)(``),[i,a]=(0,g.useState)(``),[o,s]=(0,g.useState)(``),[c,l]=(0,g.useState)(``),[u,d]=(0,g.useState)(`all`),[f,p]=(0,g.useState)(1),[m,h]=(0,g.useState)({sessions:[],total:0,pageSize:50,hasNextPage:!1}),[_,v]=(0,g.useState)(``),[y,b]=(0,g.useState)(null),[x,ee]=(0,g.useState)(!1),[S,C]=(0,g.useState)(!1),[w,T]=(0,g.useState)(``),te=(0,g.useRef)(null),ne=(0,g.useRef)(null);te.current||=ie(),ne.current||=ie();let re=Me(t),O=[...new Set((t?.projectThreadVisibility??[]).map(e=>e.root))];(0,g.useEffect)(()=>{te.current.cancel(),ne.current.cancel(),r(``),a(``),s(``),l(``),d(`all`),p(1),h({sessions:[],total:0,pageSize:50,hasNextPage:!1}),v(``),b(null),T(``)},[e]),(0,g.useEffect)(()=>k(()=>a(n),300,window),[n]);let ae=(0,g.useCallback)(async()=>{let{controller:t,sequence:n}=te.current.begin();ee(!0),T(``);try{let r=await E({...me(e),page:f,pageSize:50,query:i,provider:o,project:c,archived:u},{signal:t.signal});if(!te.current.isLatest(n))return;let a={...r.history,sessions:A(r.history?.sessions)};h(a),v(e=>a.sessions.some(t=>t.id===e)?e:a.sessions[0]?.id??``)}catch(e){e.name!==`AbortError`&&te.current.isLatest(n)&&T(e.message)}finally{te.current.isLatest(n)&&ee(!1)}},[e,f,i,o,c,u]);(0,g.useEffect)(()=>(ae(),()=>te.current.cancel()),[ae]),(0,g.useEffect)(()=>{if(ne.current.cancel(),!_){b(null),C(!1);return}let{controller:t,sequence:n}=ne.current.begin();return b(null),C(!0),T(``),D({...me(e),sessionId:_},{signal:t.signal}).then(e=>{ne.current.isLatest(n)&&b(e.history)}).catch(e=>{e.name!==`AbortError`&&ne.current.isLatest(n)&&T(e.message)}).finally(()=>{ne.current.isLatest(n)&&C(!1)}),()=>t.abort()},[e,_]);let oe=e=>t=>{e(t.target.value),p(1)};return(0,M.jsxs)(`div`,{className:`view-content history-view`,children:[(0,M.jsxs)(`section`,{className:`page-intro`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h1`,{children:`聊天记录`}),(0,M.jsx)(`p`,{children:`从 rollout 文件读取历史会话,只读查看,不修改本地数据。`})]}),(0,M.jsxs)(`button`,{className:`button button--secondary`,type:`button`,onClick:ae,disabled:x,children:[(0,M.jsx)(P,{size:16,className:x?`spin`:``}),`刷新`]})]}),(0,M.jsxs)(`section`,{className:`history-toolbar`,children:[(0,M.jsx)(`input`,{value:n,onChange:oe(r),onKeyDown:e=>{e.key===`Enter`&&(a(n),p(1))},placeholder:`搜索标题、项目、Provider 或消息内容`}),(0,M.jsxs)(`select`,{value:o,onChange:oe(s),children:[(0,M.jsx)(`option`,{value:``,children:`全部 Provider`}),re.map(e=>(0,M.jsx)(`option`,{value:e.id,children:e.id},e.id))]}),(0,M.jsxs)(`select`,{value:c,onChange:oe(l),children:[(0,M.jsx)(`option`,{value:``,children:`全部项目`}),O.map(e=>(0,M.jsx)(`option`,{value:e,children:e},e))]}),(0,M.jsxs)(`select`,{value:u,onChange:oe(d),children:[(0,M.jsx)(`option`,{value:`all`,children:`全部会话`}),(0,M.jsx)(`option`,{value:`active`,children:`活跃会话`}),(0,M.jsx)(`option`,{value:`archived`,children:`已归档`})]})]}),w?(0,M.jsxs)(`div`,{className:`history-error`,children:[(0,M.jsx)(F,{size:16}),w]}):null,(0,M.jsxs)(`section`,{className:`history-layout`,children:[(0,M.jsxs)(`div`,{className:`history-list-panel`,children:[(0,M.jsxs)(`div`,{className:`history-list-head`,children:[(0,M.jsxs)(`strong`,{children:[m.total,` 个会话`]}),(0,M.jsxs)(`span`,{children:[`第 `,m.page,` 页`]})]}),(0,M.jsxs)(`div`,{className:`history-list`,children:[x&&!m.sessions.length?(0,M.jsx)(`div`,{className:`large-empty`,children:`读取中…`}):null,!x&&!m.sessions.length?(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(_e,{size:24}),(0,M.jsx)(`strong`,{children:`没有匹配的会话`})]}):null,m.sessions.map(e=>(0,M.jsxs)(`button`,{type:`button`,className:`history-session-row ${e.id===_?`history-session-row--selected`:``}`,onClick:()=>v(e.id),children:[(0,M.jsxs)(`div`,{className:`history-session-top`,children:[(0,M.jsx)(`strong`,{children:e.title}),(0,M.jsx)(`time`,{children:ke(e.updatedAt)})]}),(0,M.jsx)(`p`,{children:e.firstUserMessage||`没有可读的用户消息`}),(0,M.jsxs)(`div`,{className:`history-session-meta`,children:[(0,M.jsx)(`span`,{children:e.provider}),(0,M.jsxs)(`span`,{children:[e.messageCount,` 条消息`]}),(0,M.jsx)(`span`,{children:e.archived?`已归档`:`活跃`})]})]},e.id))]}),(0,M.jsxs)(`div`,{className:`history-pagination`,children:[(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:f<=1||x,onClick:()=>p(e=>e-1),children:`上一页`}),(0,M.jsx)(`span`,{children:f}),(0,M.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:!m.hasNextPage||x,onClick:()=>p(e=>e+1),children:`下一页`})]})]}),(0,M.jsx)(`div`,{className:`history-detail-panel`,children:S?(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(P,{size:24,className:`spin`}),(0,M.jsx)(`strong`,{children:`正在读取会话`})]}):y?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`div`,{className:`history-detail-head`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:y.session.title}),(0,M.jsxs)(`p`,{children:[y.session.cwd||`未知项目`,` · `,y.session.provider,` · `,y.session.messageCount,` 条消息`]})]}),(0,M.jsx)(`span`,{children:y.session.archived?`已归档`:`活跃`})]}),y.truncated?(0,M.jsxs)(`div`,{className:`history-truncated`,children:[(0,M.jsx)(F,{size:15}),`仅显示最近 `,y.returnedMessageCount,` 条消息。`]}):null,(0,M.jsx)(`div`,{className:`message-stream`,children:y.messages.map(e=>(0,M.jsxs)(`article`,{className:`chat-message chat-message--${e.role}`,children:[(0,M.jsxs)(`div`,{className:`chat-message-label`,children:[e.role===`user`?`你`:`Codex`,(0,M.jsx)(`time`,{children:ke(e.timestamp)})]}),(0,M.jsx)(`div`,{className:`chat-message-body`,children:(0,M.jsx)(je,{text:e.text})})]},`${e.sequence}-${e.timestamp}`))})]}):(0,M.jsxs)(`div`,{className:`large-empty`,children:[(0,M.jsx)(_e,{size:28}),(0,M.jsx)(`strong`,{children:`选择一个会话`}),(0,M.jsx)(`span`,{children:`聊天内容将在这里显示。`})]})})]})]})}function Je({title:e,children:t,confirmLabel:n,onConfirm:r,onCancel:i,tone:a=`primary`,confirmDisabled:o=!1}){return(0,M.jsx)(`div`,{className:`modal-backdrop`,role:`presentation`,onMouseDown:e=>e.target===e.currentTarget&&i(),children:(0,M.jsxs)(`section`,{className:`modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`modal-title`,children:[(0,M.jsxs)(`div`,{className:`modal-head`,children:[(0,M.jsx)(`h2`,{id:`modal-title`,children:e}),(0,M.jsx)(`button`,{type:`button`,className:`icon-button`,onClick:i,"aria-label":`关闭`,children:(0,M.jsx)(Se,{size:18})})]}),(0,M.jsx)(`div`,{className:`modal-body`,children:t}),(0,M.jsxs)(`div`,{className:`modal-actions`,children:[(0,M.jsx)(`button`,{className:`button button--secondary`,type:`button`,onClick:i,children:`取消`}),(0,M.jsx)(`button`,{className:`button button--${a}`,type:`button`,disabled:o,onClick:r,children:n})]})]})})}function Ye({plan:e}){if(!e)return null;let t=e.impact??{};return(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`dl`,{className:`operation-scope`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`计划有效期`}),(0,M.jsx)(`dd`,{children:ke(e.expiresAt)})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`Rollout 变更`}),(0,M.jsx)(`dd`,{children:t.rolloutFilesToChange??0})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`SQLite 行变更`}),(0,M.jsx)(`dd`,{children:t.sqliteRowsToChange??0})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`当前锁定 Rollout`}),(0,M.jsx)(`dd`,{children:Array.isArray(t.lockedRolloutFiles)?t.lockedRolloutFiles.length:t.lockedRolloutFiles??0})]})]}),e.warnings?.map(e=>(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--warning`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`计划警告`}),(0,M.jsx)(`span`,{children:e})]})]},e))]})}function Xe({plan:e,corePlan:t,status:n,selectedProvider:r,onCancel:i,onConfirm:a}){return(0,M.jsxs)(Je,{title:e.mode===`switch`?`确认切换并同步`:`确认同步元数据`,confirmLabel:e.mode===`switch`?`确认切换并同步`:`确认执行同步`,onCancel:i,onConfirm:a,children:[(0,M.jsxs)(`div`,{className:`modal-callout`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`请确认 Codex 已完全关闭`}),(0,M.jsx)(`span`,{children:`关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。`})]})]}),(0,M.jsxs)(`dl`,{className:`operation-scope`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`Codex Home`}),(0,M.jsx)(`dd`,{children:n?.codexHome})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`SQLite Home`}),(0,M.jsxs)(`dd`,{children:[n?.sqliteHome,` `,(0,M.jsxs)(`small`,{children:[`(`,n?.sqliteHomeSource,`)`]})]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`当前 Provider`}),(0,M.jsx)(`dd`,{children:n?.currentProvider})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`目标 Provider`}),(0,M.jsx)(`dd`,{children:r})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`配置变更`}),(0,M.jsx)(`dd`,{children:e.mode===`switch`?`更新 config.toml 根级 model_provider`:`不修改 config.toml`})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`Model 策略`}),(0,M.jsx)(`dd`,{children:e.mode===`switch`?e.modelMode===`auto`?`跟随目标 Provider 配置`:e.modelMode===`keep`?`保留当前根级 model`:`设置为 ${e.model}`:`跟随当前根级 model`})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`备份策略`}),(0,M.jsxs)(`dd`,{children:[`修改前创建备份,保留最近 `,e.keepCount,` 份`]})]})]}),(0,M.jsx)(Ye,{plan:t})]})}function Ze({backup:e,status:t,profile:n,onCancel:r,onConfirm:i}){let[a,o]=(0,g.useState)(!1),[s,c]=(0,g.useState)(!0),[l,u]=(0,g.useState)(!0),d=fe(t,e),f=pe({backup:e,profile:n,targetSqliteHome:d,restoreDatabase:s,restoreConfig:a,sqliteSupported:t?.sqliteAccess?.supported!==!1,pathComparisonCaseInsensitive:t?.pathComparisonCaseInsensitive===!0});return(0,M.jsxs)(Je,{title:`恢复备份`,confirmLabel:`覆盖当前元数据`,tone:`danger`,onCancel:r,confirmDisabled:!a&&!s&&!l||!f.canSubmit,onConfirm:()=>i({restoreConfig:a,restoreDatabase:s,restoreSessions:l,allowSqliteHomeRelocation:f.requiresRelocation}),children:[(0,M.jsxs)(`div`,{className:`restore-summary`,children:[(0,M.jsx)(_e,{size:20}),(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`strong`,{children:[ke(e.metadata.createdAt),` · `,e.metadata.targetProvider]}),(0,M.jsx)(`code`,{children:e.path})]})]}),(0,M.jsxs)(`fieldset`,{className:`restore-options`,children:[(0,M.jsx)(`legend`,{children:`选择要覆盖的内容`}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:a,onChange:e=>o(e.target.checked)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`config.toml 与 global state`}),(0,M.jsx)(`small`,{children:`恢复 Provider 配置和 Desktop workspace roots`})]})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:s,onChange:e=>c(e.target.checked)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`SQLite 线程数据库`}),(0,M.jsx)(`small`,{children:`恢复 state_5.sqlite 及备份中的 WAL/SHM`})]})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:l,onChange:e=>u(e.target.checked)}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:`Rollout 元数据`}),(0,M.jsx)(`small`,{children:`恢复 session_meta 和被修改的 turn_context.model`})]})]})]}),t?.sqliteAccess?.supported===!1?(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`当前 SQLite 路径仅供诊断`}),(0,M.jsx)(`span`,{children:t.sqliteAccess.message||`不能从 Web UI 执行恢复。`})]})]}):null,f.requiresRelocation?(0,M.jsxs)(`div`,{className:`modal-callout ${f.missingExplicitTarget||f.configRestoreConflict?`modal-callout--danger`:`modal-callout--warning`}`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`SQLite Home 与备份来源不同`}),(0,M.jsxs)(`span`,{children:[`来源:`,e.metadata.sqliteHome,(0,M.jsx)(`br`,{}),`目标:`,d,(0,M.jsx)(`br`,{}),f.missingExplicitTarget?`当前 Profile 未明确配置 SQLite Home,不能提交数据库迁移恢复。`:f.configRestoreConflict?`迁移数据库时不能同时恢复旧 config.toml。`:`确认后数据库将恢复到当前 Profile 明确配置的目标位置。`]})]})]}):null,(0,M.jsxs)(`div`,{className:`modal-callout`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`恢复前请关闭 Codex`}),(0,M.jsx)(`span`,{children:`该操作将覆盖所选的当前元数据;请确认 Codex CLI、App 和 app-server 已关闭。`})]})]})]})}function Qe({backup:e,corePlan:t,onCancel:n,onConfirm:r}){return(0,M.jsxs)(Je,{title:`确认恢复计划`,confirmLabel:`按计划恢复`,tone:`danger`,onCancel:n,onConfirm:r,children:[(0,M.jsxs)(`div`,{className:`restore-summary`,children:[(0,M.jsx)(_e,{size:20}),(0,M.jsxs)(`div`,{children:[(0,M.jsxs)(`strong`,{children:[ke(e.metadata.createdAt),` · `,e.metadata.targetProvider]}),(0,M.jsx)(`code`,{children:e.id})]})]}),(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`Apply 仅使用一次性 planId`}),(0,M.jsx)(`span`,{children:`任何 Profile、配置、Rollout、SQLite 或备份漂移都会使本计划失效,且不会创建新写入。`})]})]}),(0,M.jsx)(Ye,{plan:t})]})}function $e({keepCount:e,backups:t,onCancel:n,onConfirm:r}){let i=Math.max(0,t.backups.length-e);return(0,M.jsxs)(Je,{title:`清理旧备份`,confirmLabel:`删除 ${i} 份旧备份`,tone:`danger`,onCancel:n,onConfirm:r,confirmDisabled:i===0,children:[(0,M.jsxs)(`div`,{className:`modal-callout modal-callout--warning`,children:[(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`strong`,{children:`被删除的备份无法直接恢复`}),(0,M.jsx)(`span`,{children:`只处理当前 Codex Home 下由本工具管理的备份目录。`})]})]}),(0,M.jsxs)(`dl`,{className:`operation-scope`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`当前备份`}),(0,M.jsxs)(`dd`,{children:[t.backups.length,` 份`]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`保留`}),(0,M.jsxs)(`dd`,{children:[`最近 `,e,` 份`]})]}),(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`dt`,{children:`将删除`}),(0,M.jsxs)(`dd`,{children:[i,` 份`]})]})]})]})}function et({onCancel:e,onConfirm:t}){let[n,r]=(0,g.useState)(``),[i,a]=(0,g.useState)(``),[o,s]=(0,g.useState)(``),[c,l]=(0,g.useState)(``),u=/^[A-Za-z0-9_.-]{1,80}$/.test(n)&&i.trim()&&o.trim();return(0,M.jsx)(Je,{title:`新增存储配置`,confirmLabel:`保存配置`,onCancel:e,confirmDisabled:!u,onConfirm:()=>t({profileId:n,name:i,codexHome:o,sqliteHome:c}),children:(0,M.jsxs)(`div`,{className:`profile-form`,children:[(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`配置 ID`}),(0,M.jsx)(`input`,{value:n,onChange:e=>r(e.target.value),placeholder:`work`,spellCheck:`false`})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`显示名称`}),(0,M.jsx)(`input`,{value:i,onChange:e=>a(e.target.value),placeholder:`工作环境`})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`Codex Home`}),(0,M.jsx)(`input`,{value:o,onChange:e=>s(e.target.value),placeholder:`/home/user/.codex`,spellCheck:`false`})]}),(0,M.jsxs)(`label`,{children:[(0,M.jsx)(`span`,{children:`SQLite Home(可选)`}),(0,M.jsx)(`input`,{value:c,onChange:e=>l(e.target.value),placeholder:`留空时由服务端按配置解析`,spellCheck:`false`})]})]})})}function tt({toast:e,onClose:t}){return(0,g.useEffect)(()=>{if(!e)return;let n=window.setTimeout(t,6e3);return()=>window.clearTimeout(n)},[e,t]),e?(0,M.jsxs)(`div`,{className:`toast toast--${e.tone}`,children:[(0,M.jsxs)(`div`,{children:[e.tone===`success`?(0,M.jsx)(Ce,{size:18}):(0,M.jsx)(F,{size:18}),(0,M.jsxs)(`span`,{children:[(0,M.jsx)(`strong`,{children:e.title}),e.message?(0,M.jsx)(`small`,{children:e.message}):null]})]}),(0,M.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`关闭通知`,children:(0,M.jsx)(Se,{size:16})})]}):null}function nt(){let[e,t]=(0,g.useState)(`overview`),[n,r]=(0,g.useState)(`checking`),[i,a]=(0,g.useState)(``),[o,s]=O(`cps.web.profileId`,`default`),[c,l]=(0,g.useState)([]),[u,d]=O(`cps.web.manualProviders`,[]),[f,p]=(0,g.useState)(null),[m,h]=(0,g.useState)(Ee),[_,v]=(0,g.useState)(``),[x,S]=(0,g.useState)(!0),[C,w]=(0,g.useState)(!1),[E,D]=(0,g.useState)(null),[ie,k]=(0,g.useState)(null),[oe,ce]=(0,g.useState)([]),[A,le]=(0,g.useState)(null),ue=(0,g.useRef)(0),de=(0,g.useMemo)(()=>{let e=Me(f),t=new Set(e.map(e=>e.id));return[...e.map(e=>({...e,manual:u.includes(e.id)})),...u.filter(e=>!t.has(e)).map(e=>({id:e,sources:[`manual`],configured:!1,current:!1,manual:!0}))]},[f,u]),fe=c.find(e=>e.id===o)??null,pe=(0,g.useRef)(null);pe.current||=he({fetchStatus:(e,t)=>T(`/api/status`,e,t),fetchBackups:(e,t)=>T(`/api/backups`,e,t)});let j=(0,g.useCallback)(async({quiet:e=!1}={})=>{await pe.current({profileId:o,showLoading:!e,onLoading:S,onResult:({status:e,backups:t})=>{p(e),h(t),v(t=>t&&Me(e).some(e=>e.id===t)?t:e.currentProvider)},onError:e=>{k({tone:`error`,title:`状态读取失败`,message:e.message})}})},[o]),N=(0,g.useCallback)(async()=>{let e=await ne();l(e.profiles),s(t=>e.profiles.some(e=>e.id===t)?t:`default`)},[s]),P=(0,g.useCallback)(async()=>{D(null);try{await N(),await j({quiet:!0})}catch{}k({tone:`warning`,title:`配置已变更,请重新确认`,message:`已刷新存储配置和当前状态;未自动重试原操作。`})},[j,N]),ge=(0,g.useCallback)(async e=>{let t=ae(fe,e,f);if(!t){k({tone:`warning`,title:`配置需要刷新`,message:`没有可用的配置版本,请刷新后重新确认操作。`}),N().catch(()=>{});return}if(e.type!==`execute`){D(t);return}w(!0);try{let e={...me(t.profileId),profileRevision:t.profileRevision,provider:t.selectedProvider,keepCount:t.plan.keepCount},n=await T(t.plan.mode===`switch`?`/api/switch/prepare`:`/api/sync/prepare`,t.plan.mode===`switch`?{...e,modelMode:t.plan.modelMode===`auto`?`provider-default`:t.plan.modelMode===`keep`?`keep-root-model`:`explicit`,model:t.plan.modelMode===`custom`?t.plan.model:void 0}:e);D({...t,corePlan:n.plan})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`计划生成失败`,message:e.message})}finally{w(!1)}},[P,N,fe,f]);(0,g.useEffect)(()=>{let e=!1;return ee().then(async t=>{if(!t)throw new y;await N(),e||r(`ready`)}).catch(t=>{e||(r(t instanceof y?`required`:`error`),a(t.message))}),()=>{e=!0}},[N]),(0,g.useEffect)(()=>{n===`ready`&&j()},[n,o]),(0,g.useEffect)(()=>{let e=e=>{r(`required`),a(e.detail||`设备凭证已失效。请重新运行 codex-provider web。`)};return window.addEventListener(`cps:pairing-required`,e),()=>window.removeEventListener(`cps:pairing-required`,e)},[]),(0,g.useEffect)(()=>{if(n!==`ready`)return;let e=!1,t=async()=>{try{let t=await te(ue.current);if(e)return;t.activity?.length&&(ue.current=t.activity[t.activity.length-1].id,ce(e=>[...e,...t.activity].slice(-250))),le(t.activeOperation??null)}catch{}};t();let r=window.setInterval(t,900);return()=>{e=!0,window.clearInterval(r)}},[n]);let _e=(0,g.useCallback)(async()=>{let e=E.plan,n=E.corePlan;D(null),w(!0),t(`activity`);try{let t=await T(e.mode===`switch`?`/api/switch/apply`:`/api/sync/apply`,{schemaVersion:n.schemaVersion,planId:n.planId});k(se(t,{successTitle:e.mode===`switch`?`切换并同步完成`:`同步完成`,partialTitle:e.mode===`switch`?`切换并同步部分完成`:`同步部分完成`,message:`备份:${t.result?.backup?.path??t.result?.result?.backupDir??`已创建`}`})),await j({quiet:!0})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`操作失败`,message:e.message})}finally{w(!1)}},[P,E,j]),ve=(0,g.useCallback)(async e=>{let t=E.backup,n=E.profileId;w(!0);try{let r=await T(`/api/restore/prepare`,{...me(n),profileRevision:E.profileRevision,backupId:t.id,...e});D({...E,type:`restoreApply`,restoreOptions:e,corePlan:r.plan})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`恢复计划生成失败`,message:e.message})}finally{w(!1)}},[P,E]),ye=(0,g.useCallback)(async()=>{let e=E.backup,n=E.corePlan;D(null),w(!0),t(`activity`);try{let t=await T(`/api/restore/apply`,{schemaVersion:n.schemaVersion,planId:n.planId});k(se(t,{successTitle:`备份恢复完成`,partialTitle:`备份恢复部分完成`,message:e.id})),await j({quiet:!0})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`恢复失败`,message:e.message})}finally{w(!1)}},[P,E,j]),xe=(0,g.useCallback)(async()=>{let e=E.keepCount,t=E.profileId;D(null),w(!0);try{let n=await T(`/api/prune`,{...me(t),profileRevision:E.profileRevision,storageRevision:E.storageRevision,keepCount:e});k(se(n,{successTitle:`旧备份清理完成`,partialTitle:`旧备份清理部分完成`,message:`删除 ${n.result?.deletedCount??0} 份,释放 ${Oe(n.result?.freedBytes)}`})),await j({quiet:!0})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`备份清理失败`,message:e.message})}finally{w(!1)}},[P,E,j]),Se=(0,g.useCallback)(()=>k(null),[]),Ce=(0,g.useCallback)(async e=>{try{let t=await T(`/api/profiles/save`,e.revision?{...e,profileRevision:e.revision}:e);D(null),await N(),s(t.profile.id),k({tone:`success`,title:`存储配置已保存`,message:t.profile.name})}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`配置保存失败`,message:e.message})}},[P,N,s]),F=(0,g.useCallback)(async()=>{try{await T(`/api/profiles/delete`,{profileId:o,profileRevision:fe?.revision}),s(`default`),await N()}catch(e){if(e instanceof b){await P();return}k({tone:`error`,title:`配置删除失败`,message:e.message})}},[P,o,N,fe?.revision,s]),we=(0,g.useCallback)(async()=>{await re().catch(()=>{}),r(`required`),a(`此浏览器的设备凭证已失效。重新运行 codex-provider web 即可自动配对。`)},[]),Te=(0,g.useCallback)(e=>{d(t=>[...new Set([...t,e])].sort()),v(e)},[d]),De=(0,g.useCallback)(e=>{d(t=>t.filter(t=>t!==e)),v(f?.currentProvider??``)},[d,f?.currentProvider]);return n===`ready`?(0,M.jsxs)(`div`,{className:`app-shell`,children:[(0,M.jsx)(Pe,{status:f,busy:C||!!A,onRefresh:()=>j()}),(0,M.jsx)(Fe,{view:e,setView:t,status:f,onForgetBrowser:we}),(0,M.jsxs)(`main`,{className:`main-area`,children:[(0,M.jsx)(Ie,{profiles:c,profileId:o,setProfileId:s,status:f,onAddProfile:()=>D({type:`profile`}),onDeleteProfile:F,onRefresh:()=>j(),loading:x,profileSwitchDisabled:C||!!E}),e===`overview`?(0,M.jsx)(We,{status:f,backups:m,providers:de,selectedProvider:_,setSelectedProvider:v,onAddManualProvider:Te,onRemoveManualProvider:De,onExecute:e=>ge({type:`execute`,plan:e,selectedProvider:_}),onRestore:e=>ge({type:`restore`,backup:e}),setView:t,busy:C,loading:x}):null,e===`history`?(0,M.jsx)(qe,{profileId:o,status:f}):null,e===`backups`?(0,M.jsx)(Ge,{backups:m,status:f,busy:C,onRestore:e=>ge({type:`restore`,backup:e}),onPrune:e=>ge({type:`prune`,keepCount:e})}):null,e===`activity`?(0,M.jsx)(Ke,{activity:oe,activeOperation:A}):null]}),E?.type===`execute`?(0,M.jsx)(Xe,{plan:E.plan,corePlan:E.corePlan,status:E.status,selectedProvider:E.selectedProvider,onCancel:()=>D(null),onConfirm:_e}):null,E?.type===`restore`?(0,M.jsx)(Ze,{backup:E.backup,status:E.status,profile:E.profile,onCancel:()=>D(null),onConfirm:ve}):null,E?.type===`restoreApply`?(0,M.jsx)(Qe,{backup:E.backup,corePlan:E.corePlan,onCancel:()=>D(null),onConfirm:ye}):null,E?.type===`prune`?(0,M.jsx)($e,{keepCount:E.keepCount,backups:m,onCancel:()=>D(null),onConfirm:xe}):null,E?.type===`profile`?(0,M.jsx)(et,{onCancel:()=>D(null),onConfirm:Ce}):null,(0,M.jsx)(tt,{toast:ie,onClose:Se})]}):(0,M.jsxs)(`div`,{className:`access-gate`,children:[(0,M.jsx)(be,{size:32}),(0,M.jsx)(`h1`,{children:n===`checking`?`正在完成安全配对`:`需要重新配对`}),(0,M.jsx)(`p`,{children:n===`checking`?`请稍候…`:i||`请重新运行 codex-provider web。`}),n===`checking`?null:(0,M.jsx)(`code`,{children:`codex-provider web`})]})}(0,_.createRoot)(document.getElementById(`root`)).render((0,M.jsx)(g.StrictMode,{children:(0,M.jsx)(nt,{})})); -//# sourceMappingURL=index-CAZ7Ulmk.js.map \ No newline at end of file diff --git a/web/dist/assets/index-CAZ7Ulmk.js.map b/web/dist/assets/index-CAZ7Ulmk.js.map deleted file mode 100644 index b836fde..0000000 --- a/web/dist/assets/index-CAZ7Ulmk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index-CAZ7Ulmk.js","names":[],"sources":["../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/scheduler/cjs/scheduler.production.min.js","../../../node_modules/scheduler/index.js","../../../node_modules/react-dom/cjs/react-dom.production.min.js","../../../node_modules/react-dom/index.js","../../../node_modules/react-dom/client.js","../../src/api.js","../../src/hooks.js","../../src/history-requests.js","../../src/operation-state.js","../../src/profile-refresh.js","../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","../../../node_modules/react/jsx-runtime.js","../../src/icons.jsx","../../src/App.jsx","../../src/main.jsx"],"sourcesContent":["/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1>>1,e=a[d];if(0>>1;dg(C,c))ng(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(ng(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Qa||125d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;cb}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"\")&&(k=k.replace(\"\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e\"+b.valueOf().toString()+\"\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a>=g;e-=g;rg=1<<32-oc(b)+e|c<w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;ww?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&Ng(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=Lg(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Tg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Rg(f.type,f.key,f.props,null,a.mode,h),h.ref=Lg(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=Sg(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);Mg(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=Qg(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Ug=Og(!0),Vg=Og(!1),Wg=Uf(null),Xg=null,Yg=null,Zg=null;function $g(){Zg=Yg=Xg=null}function ah(a){var b=Wg.current;E(Wg);a._currentValue=b}function bh(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}\nfunction ch(a,b){Xg=a;Zg=Yg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(dh=!0),a.firstContext=null)}function eh(a){var b=a._currentValue;if(Zg!==a)if(a={context:a,memoizedValue:b,next:null},null===Yg){if(null===Xg)throw Error(p(308));Yg=a;Xg.dependencies={lanes:0,firstContext:a}}else Yg=Yg.next=a;return b}var fh=null;function gh(a){null===fh?fh=[a]:fh.push(a)}\nfunction hh(a,b,c,d){var e=b.interleaved;null===e?(c.next=c,gh(b)):(c.next=e.next,e.next=c);b.interleaved=c;return ih(a,d)}function ih(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}var jh=!1;function kh(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}\nfunction lh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function mh(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}\nfunction nh(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(K&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return ih(a,c)}e=d.interleaved;null===e?(b.next=b,gh(d)):(b.next=e.next,e.next=b);d.interleaved=b;return ih(a,c)}function oh(a,b,c){b=b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nfunction ph(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction qh(a,b,c,d){var e=a.updateQueue;jh=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var m=a.alternate;null!==m&&(m=m.updateQueue,h=m.lastBaseUpdate,h!==g&&(null===h?m.firstBaseUpdate=l:h.next=l,m.lastBaseUpdate=k))}if(null!==f){var q=e.baseState;g=0;m=l=k=null;h=f;do{var r=h.lane,y=h.eventTime;if((d&r)===r){null!==m&&(m=m.next={eventTime:y,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,\nnext:null});a:{var n=a,t=h;r=b;y=c;switch(t.tag){case 1:n=t.payload;if(\"function\"===typeof n){q=n.call(y,q,r);break a}q=n;break a;case 3:n.flags=n.flags&-65537|128;case 0:n=t.payload;r=\"function\"===typeof n?n.call(y,q,r):n;if(null===r||void 0===r)break a;q=A({},q,r);break a;case 2:jh=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=[h]:r.push(h))}else y={eventTime:y,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===m?(l=m=y,k=q):m=m.next=y,g|=r;\nh=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===m&&(k=q);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=m;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);rh|=g;a.lanes=g;a.memoizedState=q}}\nfunction sh(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;bc?c:4;a(!0);var d=Gh.transition;Gh.transition={};try{a(!1),b()}finally{C=c,Gh.transition=d}}function wi(){return Uh().memoizedState}\nfunction xi(a,b,c){var d=yi(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,c);else if(c=hh(a,b,c,d),null!==c){var e=R();gi(c,a,d,e);Bi(c,b,d)}}\nfunction ii(a,b,c){var d=yi(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,gh(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=hh(a,b,e,d);null!==c&&(e=R(),gi(c,a,d,e),Bi(c,b,d))}}\nfunction zi(a){var b=a.alternate;return a===M||null!==b&&b===M}function Ai(a,b){Jh=Ih=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Bi(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar Rh={readContext:eh,useCallback:P,useContext:P,useEffect:P,useImperativeHandle:P,useInsertionEffect:P,useLayoutEffect:P,useMemo:P,useReducer:P,useRef:P,useState:P,useDebugValue:P,useDeferredValue:P,useTransition:P,useMutableSource:P,useSyncExternalStore:P,useId:P,unstable_isNewReconciler:!1},Oh={readContext:eh,useCallback:function(a,b){Th().memoizedState=[a,void 0===b?null:b];return a},useContext:eh,useEffect:mi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ki(4194308,\n4,pi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ki(4194308,4,a,b)},useInsertionEffect:function(a,b){return ki(4,2,a,b)},useMemo:function(a,b){var c=Th();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=xi.bind(null,M,a);return[d.memoizedState,a]},useRef:function(a){var b=\nTh();a={current:a};return b.memoizedState=a},useState:hi,useDebugValue:ri,useDeferredValue:function(a){return Th().memoizedState=a},useTransition:function(){var a=hi(!1),b=a[0];a=vi.bind(null,a[1]);Th().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=M,e=Th();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===Q)throw Error(p(349));0!==(Hh&30)||di(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;mi(ai.bind(null,d,\nf,a),[a]);d.flags|=2048;bi(9,ci.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=Th(),b=Q.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Kh++;0\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;zj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;eGj&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304)}else{if(!d)if(a=Ch(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Dj(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Gj&&1073741824!==c&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=L.current,G(L,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Hj(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(fj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Ij(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return zh(),E(Wf),E(H),Eh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Bh(b),null;case 13:E(L);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(L),null;case 4:return zh(),null;case 10:return ah(b.type._context),null;case 22:case 23:return Hj(),\nnull;case 24:return null;default:return null}}var Jj=!1,U=!1,Kj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Lj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Mj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Nj=!1;\nfunction Oj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Ci(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Nj;Nj=!1;return n}\nfunction Pj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Mj(b,c,f)}e=e.next}while(e!==d)}}function Qj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Rj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Sj(a){var b=a.alternate;null!==b&&(a.alternate=null,Sj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Tj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Uj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Tj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Vj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Vj(a,b,c),a=a.sibling;null!==a;)Vj(a,b,c),a=a.sibling}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}var X=null,Xj=!1;function Yj(a,b,c){for(c=c.child;null!==c;)Zj(a,b,c),c=c.sibling}\nfunction Zj(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Lj(c,b);case 6:var d=X,e=Xj;X=null;Yj(a,b,c);X=d;Xj=e;null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Xj;X=c.stateNode.containerInfo;Xj=!0;\nYj(a,b,c);X=d;Xj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Mj(c,b,g):0!==(f&4)&&Mj(c,b,g));e=e.next}while(e!==d)}Yj(a,b,c);break;case 1:if(!U&&(Lj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Yj(a,b,c);break;case 21:Yj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Yj(a,b,c),U=d):Yj(a,b,c);break;default:Yj(a,b,c)}}function ak(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Kj);b.forEach(function(b){var d=bk.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction ck(a,b){var c=b.deletions;if(null!==c)for(var d=0;de&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*lk(d/1960))-d;if(10a?16:a;if(null===wk)var d=!1;else{a=wk;wk=null;xk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;kB()-fk?Kk(a,0):rk|=c);Dk(a,b)}function Yk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=R();a=ih(a,b);null!==a&&(Ac(a,b,c),Dk(a,c))}function uj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Yk(a,c)}\nfunction bk(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Yk(a,c)}var Vk;\nVk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)dh=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return dh=!1,yj(a,b,c);dh=0!==(a.flags&131072)?!0:!1}else dh=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;ij(a,b);a=b.pendingProps;var e=Yf(b,H.current);ch(b,c);e=Nh(null,b,d,a,e,c);var f=Sh();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,kh(b),e.updater=Ei,b.stateNode=e,e._reactInternals=b,Ii(b,d,a,c),b=jj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Xi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{ij(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=Zk(d);a=Ci(d,a);switch(e){case 0:b=cj(null,b,d,a,c);break a;case 1:b=hj(null,b,d,a,c);break a;case 11:b=Yi(null,b,d,a,c);break a;case 14:b=$i(null,b,d,Ci(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),cj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),hj(a,b,d,e,c);case 3:a:{kj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;lh(a,b);qh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ji(Error(p(423)),b);b=lj(a,b,d,c,e);break a}else if(d!==e){e=Ji(Error(p(424)),b);b=lj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Vg(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=Zi(a,b,c);break a}Xi(a,b,d,c)}b=b.child}return b;case 5:return Ah(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\ngj(a,b),Xi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return oj(a,b,c);case 4:return yh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Ug(b,null,d,c):Xi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),Yi(a,b,d,e,c);case 7:return Xi(a,b,b.pendingProps,c),b.child;case 8:return Xi(a,b,b.pendingProps.children,c),b.child;case 12:return Xi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Wg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=Zi(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=mh(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);bh(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);bh(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Xi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,ch(b,c),e=eh(e),d=d(e),b.flags|=1,Xi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Ci(d,b.pendingProps),e=Ci(d.type,e),$i(a,b,d,e,c);case 15:return bj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),ij(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,ch(b,c),Gi(b,d,e),Ii(b,d,e,c),jj(null,b,d,!0,a,c);case 19:return xj(a,b,c);case 22:return dj(a,b,c)}throw Error(p(156,b.tag));};function Fk(a,b){return ac(a,b)}\nfunction $k(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new $k(a,b,c,d)}function aj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction Zk(a){if(\"function\"===typeof a)return aj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction Pg(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Rg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)aj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Tg(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return pj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Tg(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function pj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function Qg(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction Sg(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction al(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function bl(a,b,c,d,e,f,g,h,k){a=new al(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};kh(f);return a}function cl(a,b,c){var d=3 ({}));\r\n if (!response.ok || !payload.deviceCredential) {\r\n throw new PairingRequiredError(payload.error ?? \"配对链接无效、已过期或已被使用。请重新运行 codex-provider web。\");\r\n }\r\n window.localStorage.setItem(DEVICE_STORAGE_KEY, payload.deviceCredential);\r\n window.history.replaceState(null, \"\", `${window.location.pathname}${window.location.search}`);\r\n return true;\r\n}\r\n\r\nfunction deviceHeaders() {\r\n return { \"X-Codex-Provider-Device\": window.localStorage.getItem(DEVICE_STORAGE_KEY) ?? \"\" };\r\n}\r\n\r\nexport function toRequestError(payload, status, fallback) {\n const errorCode = payload.code ?? payload.coreError?.code;\n if (status === 409 && ([\n \"PROFILE_REVISION_REQUIRED\",\n \"PROFILE_CHANGED\",\n \"STORAGE_REVISION_REQUIRED\",\n \"STORAGE_CHANGED\"\n ].includes(errorCode) || [\"PLAN_EXPIRED\", \"STALE_STATE\"].includes(errorCode))) {\n return new ProfileRevisionError(errorCode, payload.error, payload.profile);\n }\n return new Error(payload.error ?? fallback);\r\n}\r\n\r\nasync function parseResponse(response, fallback) {\r\n const payload = await response.json().catch(() => ({}));\r\n if (!response.ok) {\r\n if (payload.code === \"PAIRING_REQUIRED\") {\r\n window.dispatchEvent(new CustomEvent(\"cps:pairing-required\", { detail: payload.error }));\r\n throw new PairingRequiredError(payload.error);\r\n }\r\n throw toRequestError(payload, response.status, fallback);\r\n }\r\n return payload;\r\n}\r\n\r\nexport async function apiRequest(path, body = {}, { signal } = {}) {\r\n const response = await fetch(path, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n ...deviceHeaders()\r\n },\r\n body: JSON.stringify(body),\r\n signal\r\n });\r\n return parseResponse(response, `Request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function getActivity(after = 0) {\r\n const response = await fetch(`/api/activity?after=${after}`, {\r\n headers: deviceHeaders()\r\n });\r\n return parseResponse(response, `Activity request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function getProfiles() {\r\n const response = await fetch(\"/api/profiles\", { headers: deviceHeaders() });\r\n return parseResponse(response, `Profile request failed with HTTP ${response.status}.`);\r\n}\r\n\r\nexport async function forgetThisBrowser() {\r\n try {\r\n await apiRequest(\"/api/access/forget\");\r\n } finally {\r\n window.localStorage.removeItem(DEVICE_STORAGE_KEY);\r\n }\r\n}\r\n\r\nexport async function getHistory(body = {}, options = {}) {\r\n return apiRequest(\"/api/history\", body, options);\r\n}\r\n\r\nexport async function getHistorySession(body = {}, options = {}) {\r\n return apiRequest(\"/api/history/session\", body, options);\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\nexport function usePersistentState(key, initialValue) {\r\n const [value, setValue] = useState(() => {\r\n try {\r\n const stored = window.localStorage.getItem(key);\r\n return stored ? JSON.parse(stored) : initialValue;\r\n } catch {\r\n return initialValue;\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n window.localStorage.setItem(key, JSON.stringify(value));\r\n }, [key, value]);\r\n\r\n return [value, setValue];\r\n}\r\n","export function createLatestRequestGate() {\r\n let sequence = 0;\r\n let controller = null;\r\n return {\r\n begin() {\r\n controller?.abort();\r\n controller = new AbortController();\r\n sequence += 1;\r\n return { sequence, controller, signal: controller.signal };\r\n },\r\n isLatest(candidate) {\r\n return candidate === sequence;\r\n },\r\n cancel() {\r\n controller?.abort();\r\n sequence += 1;\r\n }\r\n };\r\n}\r\n\r\nexport function scheduleDebounced(callback, delay = 300, timers = globalThis) {\r\n const id = timers.setTimeout(callback, delay);\r\n return () => timers.clearTimeout(id);\r\n}\r\n","export function captureProfileOperation(profile, operation, status) {\n if (!profile?.id\n || !profile?.revision\n || status?.profileId !== profile.id\n || status?.profileRevision !== profile.revision) return null;\n return {\n ...operation,\r\n profile: { ...profile },\r\n profileId: profile.id,\n profileRevision: profile.revision,\n status: { ...status }\n };\n}\n\r\nexport function skippedLockedRolloutFiles(payload) {\n const files = payload?.result?.result?.skippedLockedRolloutFiles\n ?? payload?.result?.skippedLockedRolloutFiles\n ?? payload?.skippedLockedRolloutFiles\n ?? [];\n return Array.isArray(files) ? files.filter(Boolean) : [];\r\n}\r\n\r\nexport function operationToast(payload, { successTitle, partialTitle, message }) {\r\n const skipped = skippedLockedRolloutFiles(payload);\r\n const partial = payload?.result?.outcome === \"partial\" || payload?.outcome === \"partial\" || skipped.length > 0;\r\n if (!partial) return { tone: \"success\", title: successTitle, message };\r\n const skippedDetail = skipped.length\r\n ? `已跳过 ${skipped.length} 个被占用的 rollout 文件:${skipped.join(\"、\")}`\r\n : \"部分项目未完成;请查看活动日志后重试。\";\r\n return {\r\n tone: \"warning\",\r\n title: partialTitle,\r\n message: [message, skippedDetail].filter(Boolean).join(\";\")\r\n };\r\n}\r\n\r\nfunction normalizeHistoryPath(path, platform) {\r\n const normalized = String(path ?? \"\").replaceAll(\"\\\\\", \"/\").replace(/\\/{2,}/g, \"/\").replace(/\\/$/, \"\");\r\n return platform === \"win32\" ? normalized.toLowerCase() : normalized;\r\n}\r\n\r\nexport function dedupeHistorySessions(sessions = [], { platform = typeof process !== \"undefined\" ? process.platform : \"browser\" } = {}) {\r\n const seen = new Set();\r\n return sessions.filter((session, index) => {\r\n const threadId = session?.threadId ?? session?.id;\r\n const rolloutPath = session?.rolloutPath ?? session?.filePath ?? session?.rolloutFile ?? session?.path;\r\n const key = threadId ? `thread:${threadId}` : rolloutPath ? `rollout:${normalizeHistoryPath(rolloutPath, platform)}` : `item:${index}`;\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n}\r\n\r\nfunction normalizeStoragePath(value, { caseInsensitive = false } = {}) {\r\n const normalized = String(value ?? \"\").replace(/[\\\\/]+$/, \"\").replaceAll(\"\\\\\", \"/\");\r\n return caseInsensitive ? normalized.toLowerCase() : normalized;\r\n}\r\n\r\nfunction storagePathsEqual(left, right, options) {\r\n return Boolean(left && right && normalizeStoragePath(left, options) === normalizeStoragePath(right, options));\r\n}\r\n\r\nfunction storageParentPath(value) {\r\n const normalized = String(value ?? \"\").replace(/[\\\\/]+$/, \"\");\r\n const separatorIndex = Math.max(normalized.lastIndexOf(\"/\"), normalized.lastIndexOf(\"\\\\\"));\r\n if (separatorIndex < 0) return \"\";\r\n if (separatorIndex === 0) return normalized.slice(0, 1);\r\n if (separatorIndex === 2 && /^[A-Za-z]:/.test(normalized)) return normalized.slice(0, 3);\r\n return normalized.slice(0, separatorIndex);\r\n}\r\n\r\nexport function resolveRestoreTargetSqliteHome(status, backup) {\r\n const currentDatabasePath = status?.stateDbLocation?.path;\r\n if (currentDatabasePath) return storageParentPath(currentDatabasePath);\r\n const backupMetadata = backup?.metadata;\r\n const comparison = { caseInsensitive: status?.pathComparisonCaseInsensitive === true };\r\n if (Number(backupMetadata?.version) >= 2\r\n && status?.sqliteHomeSource === \"default\"\r\n && storagePathsEqual(backupMetadata?.sqliteHome, status?.codexHome, comparison)) {\r\n return status.codexHome;\r\n }\r\n return status?.sqliteHome ?? \"\";\r\n}\r\n\r\nexport function restoreRelocationState({ backup, profile, targetSqliteHome, restoreDatabase, restoreConfig, sqliteSupported, pathComparisonCaseInsensitive = false }) {\r\n const sourceSqliteHome = backup?.metadata?.sqliteHome;\r\n const explicitSqliteHome = profile?.sqliteHome?.trim() ?? \"\";\r\n const requiresRelocation = Boolean(\r\n restoreDatabase\r\n && sourceSqliteHome\r\n && targetSqliteHome\r\n && !storagePathsEqual(sourceSqliteHome, targetSqliteHome, { caseInsensitive: pathComparisonCaseInsensitive })\r\n );\r\n const missingExplicitTarget = requiresRelocation && !explicitSqliteHome;\r\n const configRestoreConflict = requiresRelocation && restoreConfig;\r\n return {\r\n requiresRelocation,\r\n missingExplicitTarget,\r\n configRestoreConflict,\r\n canSubmit: Boolean(sqliteSupported) && !missingExplicitTarget && !configRestoreConflict\r\n };\r\n}\r\n","import { createLatestRequestGate } from \"./history-requests.js\";\r\n\r\nexport function storagePayload(profileId) {\r\n return { profileId: profileId || \"default\" };\r\n}\r\n\r\n// Loads status and backups for a storage profile while guaranteeing that only\r\n// the most recently started refresh may touch the UI. A stale request — for\r\n// example one started for profile A before the user switched to profile B —\r\n// is aborted and its results, errors, and loading transitions are discarded,\r\n// even when it finishes after the newer request.\r\nexport function createProfileRefresh({ fetchStatus, fetchBackups, gate = createLatestRequestGate() }) {\r\n const refresh = async ({ profileId, showLoading = true, onLoading, onResult, onError }) => {\r\n const { controller, sequence } = gate.begin();\r\n if (showLoading) onLoading?.(true);\r\n try {\r\n const storage = storagePayload(profileId);\r\n const [statusPayload, backupPayload] = await Promise.all([\r\n fetchStatus(storage, { signal: controller.signal }),\r\n fetchBackups(storage, { signal: controller.signal })\r\n ]);\r\n if (!gate.isLatest(sequence)) return false;\r\n onResult?.({ profileId, status: statusPayload.status, backups: backupPayload });\r\n return true;\r\n } catch (error) {\r\n if (error?.name === \"AbortError\" || !gate.isLatest(sequence)) return false;\r\n onError?.(error);\r\n return false;\r\n } finally {\r\n if (gate.isLatest(sequence)) onLoading?.(false);\r\n }\r\n };\r\n refresh.cancel = () => gate.cancel();\r\n return refresh;\r\n}\r\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from \"react\";\r\n\r\nfunction Icon({ children, size = 18, className = \"\" }) {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nexport const RefreshIcon = (props) => ;\r\nexport const DatabaseIcon = (props) => ;\r\nexport const HistoryIcon = (props) => ;\r\nexport const ActivityIcon = (props) => ;\r\nexport const OverviewIcon = (props) => ;\r\nexport const ShieldIcon = (props) => ;\r\nexport const ChevronIcon = (props) => ;\r\nexport const XIcon = (props) => ;\r\nexport const CheckIcon = (props) => ;\r\nexport const AlertIcon = (props) => ;\r\nexport const FolderIcon = (props) => ;\r\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nimport {\r\n PairingRequiredError,\r\n ProfileRevisionError,\r\n apiRequest,\r\n forgetThisBrowser,\r\n getActivity,\r\n getHistory,\r\n getHistorySession,\r\n getProfiles,\r\n initializeAccess\r\n} from \"./api.js\";\r\nimport { usePersistentState } from \"./hooks.js\";\r\nimport { createLatestRequestGate, scheduleDebounced } from \"./history-requests.js\";\r\nimport { captureProfileOperation, dedupeHistorySessions, operationToast, resolveRestoreTargetSqliteHome, restoreRelocationState } from \"./operation-state.js\";\r\nimport { createProfileRefresh, storagePayload } from \"./profile-refresh.js\";\r\nimport {\r\n ActivityIcon,\r\n AlertIcon,\r\n CheckIcon,\r\n ChevronIcon,\r\n DatabaseIcon,\r\n FolderIcon,\r\n HistoryIcon,\r\n OverviewIcon,\r\n RefreshIcon,\r\n ShieldIcon,\r\n XIcon\r\n} from \"./icons.jsx\";\r\n\r\nconst NAV_ITEMS = [\r\n { id: \"overview\", label: \"概览\", icon: OverviewIcon },\r\n { id: \"history\", label: \"聊天记录\", icon: HistoryIcon },\r\n { id: \"backups\", label: \"备份\", icon: HistoryIcon },\r\n { id: \"activity\", label: \"活动\", icon: ActivityIcon }\r\n];\r\n\r\nconst EMPTY_BACKUPS = { backupRoot: \"\", backups: [] };\r\n\r\nfunction formatNumber(value) {\r\n return new Intl.NumberFormat(\"zh-CN\").format(Number(value) || 0);\r\n}\r\n\r\nfunction formatBytes(bytes) {\r\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\r\n let value = Number(bytes) || 0;\r\n let index = 0;\r\n while (value >= 1024 && index < units.length - 1) {\r\n value /= 1024;\r\n index += 1;\r\n }\r\n return index === 0 ? `${value} B` : `${value.toFixed(value >= 10 ? 1 : 2).replace(/\\.0$/, \"\")} ${units[index]}`;\r\n}\r\n\r\nfunction formatDate(value) {\r\n if (!value) return \"未知时间\";\r\n return new Intl.DateTimeFormat(\"zh-CN\", {\r\n month: \"2-digit\",\r\n day: \"2-digit\",\r\n hour: \"2-digit\",\r\n minute: \"2-digit\",\r\n second: \"2-digit\",\r\n hour12: false\r\n }).format(new Date(value));\r\n}\r\n\r\nfunction renderInlineMarkdown(text, keyPrefix) {\r\n const parts = text.split(/(`[^`]+`|\\*\\*[^*]+\\*\\*|\\*[^*]+\\*)/g);\r\n return parts.map((part, index) => {\r\n if (part.startsWith(\"`\") && part.endsWith(\"`\")) return {part.slice(1, -1)};\r\n if (part.startsWith(\"**\") && part.endsWith(\"**\")) return {part.slice(2, -2)};\r\n if (part.startsWith(\"*\") && part.endsWith(\"*\")) return {part.slice(1, -1)};\r\n return {part};\r\n });\r\n}\r\n\r\nfunction SafeMarkdown({ text }) {\r\n const blocks = String(text ?? \"\").split(/(```[^\\n]*\\n[\\s\\S]*?```)/g);\r\n return blocks.map((block, index) => {\r\n if (block.startsWith(\"```\") && block.endsWith(\"```\")) {\r\n const lines = block.slice(3, -3).replace(/^\\w*\\n/, \"\");\r\n return
{lines}
;\r\n }\r\n return block.split(\"\\n\").map((line, lineIndex, lines) => {renderInlineMarkdown(line, `${index}-${lineIndex}`)}{lineIndex < lines.length - 1 ?
: null}
);\r\n });\r\n}\r\n\r\nfunction providersFromStatus(status) {\r\n if (!status) return [];\r\n const sources = new Map();\r\n const add = (values, source) => {\r\n for (const value of values ?? []) {\r\n if (!value || value === \"(missing)\") continue;\r\n const bucket = sources.get(value) ?? new Set();\r\n bucket.add(source);\r\n sources.set(value, bucket);\r\n }\r\n };\r\n add(status.configuredProviders, \"config\");\r\n add(Object.keys(status.rolloutCounts?.sessions ?? {}), \"rollout\");\r\n add(Object.keys(status.rolloutCounts?.archived_sessions ?? {}), \"rollout\");\r\n add(Object.keys(status.sqliteCounts?.sessions ?? {}), \"sqlite\");\r\n add(Object.keys(status.sqliteCounts?.archived_sessions ?? {}), \"sqlite\");\r\n add([status.currentProvider], \"config\");\r\n return [...sources.entries()]\r\n .map(([id, providerSources]) => ({\r\n id,\r\n sources: [...providerSources],\r\n configured: status.configuredProviders?.includes(id),\r\n current: id === status.currentProvider\r\n }))\r\n .sort((left, right) => Number(right.current) - Number(left.current) || left.id.localeCompare(right.id));\r\n}\r\n\r\nfunction StatusDot({ tone = \"neutral\" }) {\r\n return ;\r\n}\r\n\r\nfunction AppHeader({ status, busy, onRefresh }) {\r\n const healthy = status?.sqliteAccess?.supported !== false && !status?.sqliteCounts?.unreadable;\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
Codex Provider Sync
\r\n
本机元数据一致性工具
\r\n
\r\n
\r\n
\r\n
\r\n \r\n {busy ? \"操作执行中\" : healthy ? \"本地服务就绪\" : \"需要检查\"}\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Sidebar({ view, setView, status, onForgetBrowser }) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nfunction StorageBar({ profiles, profileId, setProfileId, status, onAddProfile, onDeleteProfile, onRefresh, loading, profileSwitchDisabled }) {\r\n return (\r\n
\r\n \r\n \r\n \r\n {profileId !== \"default\" ? : null}\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction ProviderBars({ title, counts, currentProvider }) {\r\n const entries = Object.entries(counts ?? {}).sort((left, right) => right[1] - left[1]);\r\n const total = entries.reduce((sum, [, count]) => sum + count, 0);\r\n return (\r\n
\r\n
\r\n {title}\r\n {formatNumber(total)}\r\n
\r\n
\r\n {entries.length === 0 ?
无记录
: entries.map(([provider, count]) => (\r\n
\r\n
\r\n {provider}\r\n {formatNumber(count)}\r\n
\r\n
\r\n \r\n
\r\n
\r\n ))}\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction StatusPanel({ status, loading }) {\r\n const rolloutTotal = Object.values(status?.rolloutCounts?.sessions ?? {}).reduce((sum, value) => sum + value, 0)\r\n + Object.values(status?.rolloutCounts?.archived_sessions ?? {}).reduce((sum, value) => sum + value, 0);\r\n const sqliteTotal = Object.values(status?.sqliteCounts?.sessions ?? {}).reduce((sum, value) => sum + value, 0)\r\n + Object.values(status?.sqliteCounts?.archived_sessions ?? {}).reduce((sum, value) => sum + value, 0);\r\n const aligned = status?.alignment?.aligned;\r\n return (\r\n
\r\n
\r\n
\r\n

状态总览

\r\n

比较 rollout 文件、SQLite 线程索引和当前 Provider。

\r\n
\r\n
\r\n {loading ? : aligned ? : }\r\n {loading ? \"正在检查\" : aligned ? \"Provider 元数据已对齐\" : \"发现不一致\"}\r\n
\r\n
\r\n\r\n
\r\n
\r\n 当前 Provider\r\n {status?.currentProvider ?? \"—\"}\r\n {status?.currentProviderImplicit ? \"隐式默认\" : \"config.toml 根级配置\"}\r\n
\r\n
\r\n Rollout 文件\r\n {formatNumber(rolloutTotal)}\r\n sessions + archived\r\n
\r\n
\r\n SQLite threads\r\n {status?.sqliteCounts?.unreadable ? \"不可读\" : formatNumber(sqliteTotal)}\r\n {status?.stateDbLocation?.source ?? \"未定位数据库\"}\r\n
\r\n
\r\n 托管备份\r\n {formatNumber(status?.backupSummary?.count)}\r\n {formatBytes(status?.backupSummary?.totalBytes)}\r\n
\r\n
\r\n\r\n
\r\n
\r\n
Rollout files
\r\n \r\n \r\n
\r\n
\r\n
\r\n
SQLite state
\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Warnings({ status }) {\r\n const items = [];\r\n if (status?.sqliteAccess?.supported === false) {\r\n items.push({ tone: \"danger\", title: \"SQLite 路径不可安全访问\", detail: status.sqliteAccess.message });\r\n }\r\n if (status?.sqliteCounts?.unreadable) {\r\n items.push({ tone: \"danger\", title: \"SQLite 当前不可读\", detail: status.sqliteCounts.error });\r\n }\r\n if (status?.lockedRolloutFiles?.length) {\r\n items.push({ tone: \"warning\", title: `${status.lockedRolloutFiles.length} 个 rollout 文件正在使用`, detail: \"同步会跳过这些活跃文件;会话结束后可再次执行。\" });\r\n }\r\n if (status?.encryptedContentWarning) {\r\n items.push({ tone: \"warning\", title: \"检测到 encrypted_content\", detail: status.encryptedContentWarning });\r\n }\r\n const repairs = status?.sqliteRepairStats;\r\n if (repairs?.userEventRowsNeedingRepair || repairs?.cwdRowsNeedingRepair) {\r\n items.push({ tone: \"info\", title: \"SQLite 有待修复字段\", detail: `user-event ${repairs.userEventRowsNeedingRepair ?? 0},cwd ${repairs.cwdRowsNeedingRepair ?? 0}` });\r\n }\r\n if (items.length === 0) return null;\r\n return (\r\n
\r\n {items.map((item, index) => (\r\n
\r\n \r\n
{item.title}{item.detail}
\r\n
\r\n ))}\r\n
\r\n );\r\n}\r\n\r\nfunction ProjectVisibility({ projects = [] }) {\r\n return (\r\n
\r\n
\r\n

项目可见性

检查 Desktop 项目路径、全局排序和首屏 50 条命中。

\r\n
\r\n
\r\n \r\n \r\n \r\n {projects.length === 0 ? (\r\n \r\n ) : projects.map((project) => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n
项目根目录交互会话首屏RanksCWD 精确匹配Provider
没有可显示的项目诊断。
{project.root}{project.interactiveThreads}{project.firstPageThreads}/50{project.rankPreview || \"—\"}{project.exactCwdMatches}/{project.interactiveThreads}{Object.entries(project.providerCounts ?? {}).map(([provider, count]) => `${provider} ${count}`).join(\" · \") || \"—\"}
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction SegmentedControl({ value, onChange, disabled }) {\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nfunction ExecutionPanel({ status, providers, selectedProvider, setSelectedProvider, onAddManualProvider, onRemoveManualProvider, onRequestExecute, busy }) {\r\n const [mode, setMode] = usePersistentState(\"cps.web.mode\", \"sync\");\r\n const [modelMode, setModelMode] = usePersistentState(\"cps.web.modelMode\", \"auto\");\r\n const [customModel, setCustomModel] = usePersistentState(\"cps.web.customModel\", \"\");\r\n const [keepCount, setKeepCount] = usePersistentState(\"cps.web.keepCount\", 5);\r\n const [manualProvider, setManualProvider] = useState(\"\");\r\n const selectedOption = providers.find((provider) => provider.id === selectedProvider);\r\n const switchAllowed = selectedOption?.configured;\r\n const validManualProvider = /^[A-Za-z0-9_.-]+$/.test(manualProvider.trim());\r\n const sqliteUnsupported = status?.sqliteAccess?.supported === false;\r\n const executeDisabled = busy || !selectedProvider || sqliteUnsupported || status?.sqliteCounts?.unreadable;\r\n\r\n return (\r\n
\r\n
\r\n

执行同步

所有写操作都会先创建备份。执行前请关闭 Codex CLI、App 和 app-server。

\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n setManualProvider(event.target.value)}\r\n placeholder=\"手动添加 Provider ID\"\r\n spellCheck=\"false\"\r\n disabled={busy}\r\n />\r\n {\r\n onAddManualProvider(manualProvider.trim());\r\n setManualProvider(\"\");\r\n }}\r\n >\r\n 添加\r\n \r\n {selectedOption?.manual ? : null}\r\n
\r\n\r\n {mode === \"switch\" ? (\r\n
\r\n 根级 model\r\n \r\n \r\n \r\n
\r\n ) : null}\r\n\r\n {sqliteUnsupported ?
此 SQLite 布局仅供诊断{status?.sqliteAccess?.message || \"当前 SQLite 路径不可由 Web UI 安全写入,因此已禁用执行同步。\"}
: null}\r\n\r\n
修改前创建 metadata v2 备份,并记录 SQLite Home
\r\n onRequestExecute({ mode, modelMode, model: customModel.trim(), keepCount })}\r\n >\r\n {busy ? : }\r\n {busy ? \"正在执行…\" : mode === \"switch\" ? \"切换并同步\" : \"执行同步\"}\r\n \r\n
\r\n );\r\n}\r\n\r\nfunction RecentBackups({ backups, onViewAll, onRestore, restoreDisabled }) {\r\n return (\r\n
\r\n
\r\n

最近备份

{backups.backupRoot || \"同步后将在 Codex Home 下创建备份\"}

\r\n \r\n
\r\n
\r\n {backups.backups.length === 0 ?
尚无由本工具创建的备份。
: backups.backups.slice(0, 3).map((backup) => (\r\n
\r\n
\r\n
{formatDate(backup.metadata.createdAt)}{backup.metadata.targetProvider} · {backup.metadata.changedSessionFiles ?? 0} 个 rollout
\r\n
{formatBytes(backup.sizeBytes)}
\r\n \r\n
\r\n ))}\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Overview({ status, backups, providers, selectedProvider, setSelectedProvider, onAddManualProvider, onRemoveManualProvider, onExecute, onRestore, setView, busy, loading }) {\r\n return (\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n setView(\"backups\")} onRestore={onRestore} restoreDisabled={status?.sqliteAccess?.supported === false} />\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction BackupsView({ backups, status, busy, onRestore, onPrune }) {\r\n const [keepCount, setKeepCount] = usePersistentState(\"cps.web.keepCount\", 5);\r\n const restoreDisabled = status?.sqliteAccess?.supported === false;\r\n return (\r\n
\r\n
\r\n

备份

管理当前 Codex Home 下由本工具创建的 metadata v2 备份。

\r\n
\r\n
\r\n
\r\n
{backups.backupRoot || status?.backupRoot || \"—\"}{backups.backups.length} 份 · {formatBytes(backups.backups.reduce((sum, backup) => sum + backup.sizeBytes, 0))}
\r\n
\r\n {backups.backups.length === 0 ?
还没有备份执行一次同步或切换后,备份会显示在这里。
: backups.backups.map((backup) => (\r\n
\r\n
{formatDate(backup.metadata.createdAt)}{backup.id}
\r\n
Provider {backup.metadata.targetProvider}Rollout {backup.metadata.changedSessionFiles ?? 0}SQLite {backup.metadata.sqliteDbFiles?.length ? \"已包含\" : \"未包含\"}
\r\n
SQLite Home{backup.metadata.sqliteHome ?? \"旧版 metadata 未记录\"}
\r\n
{formatBytes(backup.sizeBytes)}
\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction ActivityView({ activity, activeOperation }) {\r\n return (\r\n
\r\n

活动日志

当前 Web UI 会话中的状态刷新、同步阶段和操作结果。

{activeOperation ?
{activeOperation.kind}
: null}
\r\n
\r\n
Activity log{activity.length} entries
\r\n
\r\n {activity.length === 0 ?
等待操作…
: activity.map((entry) => (\r\n
\r\n \r\n {entry.level}\r\n {entry.message}\r\n {typeof entry.detail === \"string\" ? {entry.detail} : null}\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction HistoryView({ profileId, status }) {\r\n const [query, setQuery] = useState(\"\");\r\n const [committedQuery, setCommittedQuery] = useState(\"\");\r\n const [provider, setProvider] = useState(\"\");\r\n const [project, setProject] = useState(\"\");\r\n const [archived, setArchived] = useState(\"all\");\r\n const [page, setPage] = useState(1);\r\n const [history, setHistory] = useState({ sessions: [], total: 0, pageSize: 50, hasNextPage: false });\r\n const [selectedId, setSelectedId] = useState(\"\");\r\n const [detail, setDetail] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [detailLoading, setDetailLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n const listRequest = useRef(null);\r\n const detailRequest = useRef(null);\r\n if (!listRequest.current) listRequest.current = createLatestRequestGate();\r\n if (!detailRequest.current) detailRequest.current = createLatestRequestGate();\r\n const providers = providersFromStatus(status);\r\n const projects = [...new Set((status?.projectThreadVisibility ?? []).map((item) => item.root))];\r\n\r\n useEffect(() => {\r\n listRequest.current.cancel();\r\n detailRequest.current.cancel();\r\n setQuery(\"\");\r\n setCommittedQuery(\"\");\r\n setProvider(\"\");\r\n setProject(\"\");\r\n setArchived(\"all\");\r\n setPage(1);\r\n setHistory({ sessions: [], total: 0, pageSize: 50, hasNextPage: false });\r\n setSelectedId(\"\");\r\n setDetail(null);\r\n setError(\"\");\r\n }, [profileId]);\r\n\r\n useEffect(() => {\r\n return scheduleDebounced(() => setCommittedQuery(query), 300, window);\r\n }, [query]);\r\n\r\n const loadList = useCallback(async () => {\r\n const { controller, sequence } = listRequest.current.begin();\r\n setLoading(true); setError(\"\");\r\n try {\r\n const payload = await getHistory({ ...storagePayload(profileId), page, pageSize: 50, query: committedQuery, provider, project, archived }, { signal: controller.signal });\r\n if (!listRequest.current.isLatest(sequence)) return;\r\n const nextHistory = { ...payload.history, sessions: dedupeHistorySessions(payload.history?.sessions) };\r\n setHistory(nextHistory);\r\n setSelectedId((current) => nextHistory.sessions.some((session) => session.id === current) ? current : nextHistory.sessions[0]?.id ?? \"\");\r\n } catch (requestError) {\r\n if (requestError.name !== \"AbortError\" && listRequest.current.isLatest(sequence)) setError(requestError.message);\r\n } finally {\r\n if (listRequest.current.isLatest(sequence)) setLoading(false);\r\n }\r\n }, [profileId, page, committedQuery, provider, project, archived]);\r\n\r\n useEffect(() => {\r\n loadList();\r\n return () => listRequest.current.cancel();\r\n }, [loadList]);\r\n useEffect(() => {\r\n detailRequest.current.cancel();\r\n if (!selectedId) { setDetail(null); setDetailLoading(false); return undefined; }\r\n const { controller, sequence } = detailRequest.current.begin();\r\n setDetail(null);\r\n setDetailLoading(true);\r\n setError(\"\");\r\n getHistorySession({ ...storagePayload(profileId), sessionId: selectedId }, { signal: controller.signal })\r\n .then((payload) => { if (detailRequest.current.isLatest(sequence)) setDetail(payload.history); })\r\n .catch((requestError) => { if (requestError.name !== \"AbortError\" && detailRequest.current.isLatest(sequence)) setError(requestError.message); })\r\n .finally(() => { if (detailRequest.current.isLatest(sequence)) setDetailLoading(false); });\r\n return () => controller.abort();\r\n }, [profileId, selectedId]);\r\n\r\n const updateFilter = (setter) => (event) => { setter(event.target.value); setPage(1); };\r\n return (\r\n
\r\n

聊天记录

从 rollout 文件读取历史会话,只读查看,不修改本地数据。

\r\n
\r\n { if (event.key === \"Enter\") { setCommittedQuery(query); setPage(1); } }} placeholder=\"搜索标题、项目、Provider 或消息内容\" />\r\n \r\n \r\n \r\n
\r\n {error ?
{error}
: null}\r\n
\r\n
\r\n
{history.total} 个会话第 {history.page} 页
\r\n
\r\n {loading && !history.sessions.length ?
读取中…
: null}\r\n {!loading && !history.sessions.length ?
没有匹配的会话
: null}\r\n {history.sessions.map((session) => )}\r\n
\r\n
{page}
\r\n
\r\n
\r\n {detailLoading ?
正在读取会话
: !detail ?
选择一个会话聊天内容将在这里显示。
: <>

{detail.session.title}

{detail.session.cwd || \"未知项目\"} · {detail.session.provider} · {detail.session.messageCount} 条消息

{detail.session.archived ? \"已归档\" : \"活跃\"}
{detail.truncated ?
仅显示最近 {detail.returnedMessageCount} 条消息。
: null}
{detail.messages.map((message) =>
{message.role === \"user\" ? \"你\" : \"Codex\"}
)}
}\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Modal({ title, children, confirmLabel, onConfirm, onCancel, tone = \"primary\", confirmDisabled = false }) {\r\n return (\r\n
event.target === event.currentTarget && onCancel()}>\r\n
\r\n

{title}

\r\n
{children}
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction CorePlanDetails({ plan }) {\n if (!plan) return null;\n const impact = plan.impact ?? {};\n return (\n <>\n
\n
计划有效期
{formatDate(plan.expiresAt)}
\n
Rollout 变更
{impact.rolloutFilesToChange ?? 0}
\n
SQLite 行变更
{impact.sqliteRowsToChange ?? 0}
\n
当前锁定 Rollout
{Array.isArray(impact.lockedRolloutFiles) ? impact.lockedRolloutFiles.length : (impact.lockedRolloutFiles ?? 0)}
\n
\n {plan.warnings?.map((warning) =>
计划警告{warning}
)}\n \n );\n}\n\nfunction ExecuteModal({ plan, corePlan, status, selectedProvider, onCancel, onConfirm }) {\n return (\n \r\n
请确认 Codex 已完全关闭关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。
\r\n
\r\n
Codex Home
{status?.codexHome}
\r\n
SQLite Home
{status?.sqliteHome} ({status?.sqliteHomeSource})
\r\n
当前 Provider
{status?.currentProvider}
\r\n
目标 Provider
{selectedProvider}
\r\n
配置变更
{plan.mode === \"switch\" ? \"更新 config.toml 根级 model_provider\" : \"不修改 config.toml\"}
\r\n
Model 策略
{plan.mode !== \"switch\" ? \"跟随当前根级 model\" : plan.modelMode === \"auto\" ? \"跟随目标 Provider 配置\" : plan.modelMode === \"keep\" ? \"保留当前根级 model\" : `设置为 ${plan.model}`}
\r\n
备份策略
修改前创建备份,保留最近 {plan.keepCount} 份
\n
\n \n
\n );\n}\n\r\nfunction RestoreModal({ backup, status, profile, onCancel, onConfirm }) {\n const [restoreConfig, setRestoreConfig] = useState(false);\r\n const [restoreDatabase, setRestoreDatabase] = useState(true);\r\n const [restoreSessions, setRestoreSessions] = useState(true);\r\n const targetSqliteHome = resolveRestoreTargetSqliteHome(status, backup);\r\n const relocation = restoreRelocationState({\r\n backup,\r\n profile,\r\n targetSqliteHome,\r\n restoreDatabase,\r\n restoreConfig,\r\n sqliteSupported: status?.sqliteAccess?.supported !== false,\r\n pathComparisonCaseInsensitive: status?.pathComparisonCaseInsensitive === true\r\n });\r\n return (\r\n onConfirm({ restoreConfig, restoreDatabase, restoreSessions, allowSqliteHomeRelocation: relocation.requiresRelocation })}\r\n >\r\n
{formatDate(backup.metadata.createdAt)} · {backup.metadata.targetProvider}{backup.path}
\r\n
\r\n 选择要覆盖的内容\r\n \r\n \r\n \r\n
\r\n {status?.sqliteAccess?.supported === false ?
当前 SQLite 路径仅供诊断{status.sqliteAccess.message || \"不能从 Web UI 执行恢复。\"}
: null}\r\n {relocation.requiresRelocation ?
SQLite Home 与备份来源不同来源:{backup.metadata.sqliteHome}
目标:{targetSqliteHome}
{relocation.missingExplicitTarget ? \"当前 Profile 未明确配置 SQLite Home,不能提交数据库迁移恢复。\" : relocation.configRestoreConflict ? \"迁移数据库时不能同时恢复旧 config.toml。\" : \"确认后数据库将恢复到当前 Profile 明确配置的目标位置。\"}
: null}\r\n
恢复前请关闭 Codex该操作将覆盖所选的当前元数据;请确认 Codex CLI、App 和 app-server 已关闭。
\r\n \r\n );\r\n}\n\nfunction RestoreApplyModal({ backup, corePlan, onCancel, onConfirm }) {\n return (\n \n
{formatDate(backup.metadata.createdAt)} · {backup.metadata.targetProvider}{backup.id}
\n
Apply 仅使用一次性 planId任何 Profile、配置、Rollout、SQLite 或备份漂移都会使本计划失效,且不会创建新写入。
\n \n
\n );\n}\n\r\nfunction PruneModal({ keepCount, backups, onCancel, onConfirm }) {\r\n const deleteCount = Math.max(0, backups.backups.length - keepCount);\r\n return (\r\n \r\n
被删除的备份无法直接恢复只处理当前 Codex Home 下由本工具管理的备份目录。
\r\n
当前备份
{backups.backups.length} 份
保留
最近 {keepCount} 份
将删除
{deleteCount} 份
\r\n
\r\n );\r\n}\r\n\r\nfunction ProfileModal({ onCancel, onConfirm }) {\r\n const [profileId, setProfileId] = useState(\"\");\r\n const [name, setName] = useState(\"\");\r\n const [codexHome, setCodexHome] = useState(\"\");\r\n const [sqliteHome, setSqliteHome] = useState(\"\");\r\n const valid = /^[A-Za-z0-9_.-]{1,80}$/.test(profileId) && name.trim() && codexHome.trim();\r\n return (\r\n onConfirm({ profileId, name, codexHome, sqliteHome })}>\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nfunction Toast({ toast, onClose }) {\r\n useEffect(() => {\r\n if (!toast) return undefined;\r\n const timer = window.setTimeout(onClose, 6000);\r\n return () => window.clearTimeout(timer);\r\n }, [toast, onClose]);\r\n if (!toast) return null;\r\n return
{toast.tone === \"success\" ? : }{toast.title}{toast.message ? {toast.message} : null}
;\r\n}\r\n\r\nexport default function App() {\r\n const [view, setView] = useState(\"overview\");\r\n const [accessState, setAccessState] = useState(\"checking\");\r\n const [accessMessage, setAccessMessage] = useState(\"\");\r\n const [profileId, setProfileId] = usePersistentState(\"cps.web.profileId\", \"default\");\r\n const [profiles, setProfiles] = useState([]);\r\n const [manualProviders, setManualProviders] = usePersistentState(\"cps.web.manualProviders\", []);\r\n const [status, setStatus] = useState(null);\r\n const [backups, setBackups] = useState(EMPTY_BACKUPS);\r\n const [selectedProvider, setSelectedProvider] = useState(\"\");\r\n const [loading, setLoading] = useState(true);\r\n const [busy, setBusy] = useState(false);\r\n const [modal, setModal] = useState(null);\r\n const [toast, setToast] = useState(null);\r\n const [activity, setActivity] = useState([]);\r\n const [activeOperation, setActiveOperation] = useState(null);\r\n const lastActivityId = useRef(0);\r\n\r\n const providers = useMemo(() => {\r\n const detected = providersFromStatus(status);\r\n const detectedIds = new Set(detected.map((provider) => provider.id));\r\n return [\r\n ...detected.map((provider) => ({\r\n ...provider,\r\n manual: manualProviders.includes(provider.id)\r\n })),\r\n ...manualProviders\r\n .filter((provider) => !detectedIds.has(provider))\r\n .map((id) => ({ id, sources: [\"manual\"], configured: false, current: false, manual: true }))\r\n ];\r\n }, [status, manualProviders]);\r\n const selectedProfile = profiles.find((profile) => profile.id === profileId) ?? null;\r\n\r\n const profileRefreshRef = useRef(null);\r\n if (!profileRefreshRef.current) {\r\n profileRefreshRef.current = createProfileRefresh({\r\n fetchStatus: (storage, options) => apiRequest(\"/api/status\", storage, options),\r\n fetchBackups: (storage, options) => apiRequest(\"/api/backups\", storage, options)\r\n });\r\n }\r\n\r\n // Only the latest request for the current profile may update status,\r\n // backups, selectedProvider, loading, and error toasts. Switching profiles\r\n // starts a newer request, which aborts and invalidates the older one even\r\n // if the older one finishes last.\r\n const refresh = useCallback(async ({ quiet = false } = {}) => {\r\n await profileRefreshRef.current({\r\n profileId,\r\n showLoading: !quiet,\r\n onLoading: setLoading,\r\n onResult: ({ status: nextStatus, backups: nextBackups }) => {\r\n setStatus(nextStatus);\r\n setBackups(nextBackups);\r\n setSelectedProvider((current) => current && providersFromStatus(nextStatus).some((provider) => provider.id === current)\r\n ? current\r\n : nextStatus.currentProvider);\r\n },\r\n onError: (error) => {\r\n setToast({ tone: \"error\", title: \"状态读取失败\", message: error.message });\r\n }\r\n });\r\n }, [profileId]);\r\n\r\n const refreshProfiles = useCallback(async () => {\r\n const payload = await getProfiles();\r\n setProfiles(payload.profiles);\r\n setProfileId((current) => payload.profiles.some((profile) => profile.id === current) ? current : \"default\");\r\n }, [setProfileId]);\r\n\r\n const handleProfileConflict = useCallback(async () => {\r\n setModal(null);\r\n try {\r\n await refreshProfiles();\r\n await refresh({ quiet: true });\r\n } catch {\r\n // The user can still retry after the next explicit refresh.\r\n }\r\n setToast({ tone: \"warning\", title: \"配置已变更,请重新确认\", message: \"已刷新存储配置和当前状态;未自动重试原操作。\" });\r\n }, [refresh, refreshProfiles]);\r\n\r\n const openProfileOperation = useCallback(async (operation) => {\n const captured = captureProfileOperation(selectedProfile, operation, status);\n if (!captured) {\n setToast({ tone: \"warning\", title: \"配置需要刷新\", message: \"没有可用的配置版本,请刷新后重新确认操作。\" });\r\n refreshProfiles().catch(() => {});\r\n return;\n }\n if (operation.type !== \"execute\") {\n setModal(captured);\n return;\n }\n setBusy(true);\n try {\n const common = {\n ...storagePayload(captured.profileId),\n profileRevision: captured.profileRevision,\n provider: captured.selectedProvider,\n keepCount: captured.plan.keepCount\n };\n const endpoint = captured.plan.mode === \"switch\" ? \"/api/switch/prepare\" : \"/api/sync/prepare\";\n const request = captured.plan.mode === \"switch\"\n ? {\n ...common,\n modelMode: captured.plan.modelMode === \"auto\"\n ? \"provider-default\"\n : (captured.plan.modelMode === \"keep\" ? \"keep-root-model\" : \"explicit\"),\n model: captured.plan.modelMode === \"custom\" ? captured.plan.model : undefined\n }\n : common;\n const payload = await apiRequest(endpoint, request);\n setModal({ ...captured, corePlan: payload.plan });\n } catch (error) {\n if (error instanceof ProfileRevisionError) {\n await handleProfileConflict();\n return;\n }\n setToast({ tone: \"error\", title: \"计划生成失败\", message: error.message });\n } finally {\n setBusy(false);\n }\n }, [handleProfileConflict, refreshProfiles, selectedProfile, status]);\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n initializeAccess()\r\n .then(async (paired) => {\r\n if (!paired) throw new PairingRequiredError();\r\n await refreshProfiles();\r\n if (!cancelled) setAccessState(\"ready\");\r\n })\r\n .catch((error) => {\r\n if (cancelled) return;\r\n setAccessState(error instanceof PairingRequiredError ? \"required\" : \"error\");\r\n setAccessMessage(error.message);\r\n });\r\n return () => { cancelled = true; };\r\n }, [refreshProfiles]);\r\n\r\n useEffect(() => {\r\n if (accessState === \"ready\") refresh();\r\n }, [accessState, profileId]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n const requirePairing = (event) => {\r\n setAccessState(\"required\");\r\n setAccessMessage(event.detail || \"设备凭证已失效。请重新运行 codex-provider web。\");\r\n };\r\n window.addEventListener(\"cps:pairing-required\", requirePairing);\r\n return () => window.removeEventListener(\"cps:pairing-required\", requirePairing);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (accessState !== \"ready\") return undefined;\r\n let stopped = false;\r\n const poll = async () => {\r\n try {\r\n const payload = await getActivity(lastActivityId.current);\r\n if (stopped) return;\r\n if (payload.activity?.length) {\r\n lastActivityId.current = payload.activity[payload.activity.length - 1].id;\r\n setActivity((current) => [...current, ...payload.activity].slice(-250));\r\n }\r\n setActiveOperation(payload.activeOperation ?? null);\r\n } catch {\r\n // A transient poll failure should not interrupt a running operation.\r\n }\r\n };\r\n poll();\r\n const timer = window.setInterval(poll, 900);\r\n return () => { stopped = true; window.clearInterval(timer); };\r\n }, [accessState]);\r\n\r\n const execute = useCallback(async () => {\n const plan = modal.plan;\n const corePlan = modal.corePlan;\n setModal(null);\n setBusy(true);\r\n setView(\"activity\");\n try {\n const payload = await apiRequest(\n plan.mode === \"switch\" ? \"/api/switch/apply\" : \"/api/sync/apply\",\n { schemaVersion: corePlan.schemaVersion, planId: corePlan.planId }\n );\n setToast(operationToast(payload, {\n successTitle: plan.mode === \"switch\" ? \"切换并同步完成\" : \"同步完成\",\r\n partialTitle: plan.mode === \"switch\" ? \"切换并同步部分完成\" : \"同步部分完成\",\r\n message: `备份:${payload.result?.backup?.path ?? payload.result?.result?.backupDir ?? \"已创建\"}`\n }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"操作失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const prepareRestoreOperation = useCallback(async (options) => {\n const backup = modal.backup;\n const targetProfileId = modal.profileId;\n setBusy(true);\n try {\n const payload = await apiRequest(\"/api/restore/prepare\", {\n ...storagePayload(targetProfileId),\n profileRevision: modal.profileRevision,\n backupId: backup.id,\n ...options\n });\n setModal({ ...modal, type: \"restoreApply\", restoreOptions: options, corePlan: payload.plan });\n } catch (error) {\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"恢复计划生成失败\", message: error.message });\n } finally {\n setBusy(false);\n }\n }, [handleProfileConflict, modal]);\n\n const applyRestoreOperation = useCallback(async () => {\n const backup = modal.backup;\n const corePlan = modal.corePlan;\n setModal(null);\n setBusy(true);\n setView(\"activity\");\n try {\n const payload = await apiRequest(\"/api/restore/apply\", {\n schemaVersion: corePlan.schemaVersion,\n planId: corePlan.planId\n });\n setToast(operationToast(payload, { successTitle: \"备份恢复完成\", partialTitle: \"备份恢复部分完成\", message: backup.id }));\n await refresh({ quiet: true });\n } catch (error) {\n if (error instanceof ProfileRevisionError) {\n await handleProfileConflict();\n return;\n }\n setToast({ tone: \"error\", title: \"恢复失败\", message: error.message });\n } finally {\n setBusy(false);\n }\n }, [handleProfileConflict, modal, refresh]);\n\r\n const prune = useCallback(async () => {\r\n const keepCount = modal.keepCount;\r\n const targetProfileId = modal.profileId;\r\n setModal(null);\r\n setBusy(true);\r\n try {\r\n const payload = await apiRequest(\"/api/prune\", { ...storagePayload(targetProfileId), profileRevision: modal.profileRevision, storageRevision: modal.storageRevision, keepCount });\r\n setToast(operationToast(payload, {\r\n successTitle: \"旧备份清理完成\",\r\n partialTitle: \"旧备份清理部分完成\",\r\n message: `删除 ${payload.result?.deletedCount ?? 0} 份,释放 ${formatBytes(payload.result?.freedBytes)}`\r\n }));\r\n await refresh({ quiet: true });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"备份清理失败\", message: error.message });\r\n } finally {\r\n setBusy(false);\r\n }\r\n }, [handleProfileConflict, modal, refresh]);\r\n\r\n const closeToast = useCallback(() => setToast(null), []);\r\n const saveProfile = useCallback(async (profile) => {\r\n try {\r\n const payload = await apiRequest(\"/api/profiles/save\", profile.revision ? { ...profile, profileRevision: profile.revision } : profile);\r\n setModal(null);\r\n await refreshProfiles();\r\n setProfileId(payload.profile.id);\r\n setToast({ tone: \"success\", title: \"存储配置已保存\", message: payload.profile.name });\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"配置保存失败\", message: error.message });\r\n }\r\n }, [handleProfileConflict, refreshProfiles, setProfileId]);\r\n const deleteProfile = useCallback(async () => {\r\n try {\r\n await apiRequest(\"/api/profiles/delete\", { profileId, profileRevision: selectedProfile?.revision });\r\n setProfileId(\"default\");\r\n await refreshProfiles();\r\n } catch (error) {\r\n if (error instanceof ProfileRevisionError) {\r\n await handleProfileConflict();\r\n return;\r\n }\r\n setToast({ tone: \"error\", title: \"配置删除失败\", message: error.message });\r\n }\r\n }, [handleProfileConflict, profileId, refreshProfiles, selectedProfile?.revision, setProfileId]);\r\n const forgetBrowser = useCallback(async () => {\r\n await forgetThisBrowser().catch(() => {});\r\n setAccessState(\"required\");\r\n setAccessMessage(\"此浏览器的设备凭证已失效。重新运行 codex-provider web 即可自动配对。\");\r\n }, []);\r\n const addManualProvider = useCallback((provider) => {\r\n setManualProviders((current) => [...new Set([...current, provider])].sort());\r\n setSelectedProvider(provider);\r\n }, [setManualProviders]);\r\n const removeManualProvider = useCallback((provider) => {\r\n setManualProviders((current) => current.filter((item) => item !== provider));\r\n setSelectedProvider(status?.currentProvider ?? \"\");\r\n }, [setManualProviders, status?.currentProvider]);\r\n\r\n if (accessState !== \"ready\") {\r\n return

{accessState === \"checking\" ? \"正在完成安全配对\" : \"需要重新配对\"}

{accessState === \"checking\" ? \"请稍候…\" : accessMessage || \"请重新运行 codex-provider web。\"}

{accessState !== \"checking\" ? codex-provider web : null}
;\r\n }\r\n\r\n return (\r\n
\r\n refresh()} />\r\n \r\n
\r\n setModal({ type: \"profile\" })} onDeleteProfile={deleteProfile} onRefresh={() => refresh()} loading={loading} profileSwitchDisabled={busy || Boolean(modal)} />\r\n {view === \"overview\" ? openProfileOperation({ type: \"execute\", plan, selectedProvider })} onRestore={(backup) => openProfileOperation({ type: \"restore\", backup })} setView={setView} busy={busy} loading={loading} /> : null}\r\n {view === \"history\" ? : null}\r\n {view === \"backups\" ? openProfileOperation({ type: \"restore\", backup })} onPrune={(keepCount) => openProfileOperation({ type: \"prune\", keepCount })} /> : null}\r\n {view === \"activity\" ? : null}\r\n
\r\n {modal?.type === \"execute\" ? setModal(null)} onConfirm={execute} /> : null}\n {modal?.type === \"restore\" ? setModal(null)} onConfirm={prepareRestoreOperation} /> : null}\n {modal?.type === \"restoreApply\" ? setModal(null)} onConfirm={applyRestoreOperation} /> : null}\n {modal?.type === \"prune\" ? setModal(null)} onConfirm={prune} /> : null}\r\n {modal?.type === \"profile\" ? setModal(null)} onConfirm={saveProfile} /> : null}\r\n \r\n
\r\n );\r\n}\r\n","import React from \"react\";\r\nimport { createRoot } from \"react-dom/client\";\r\n\r\nimport App from \"./App.jsx\";\r\nimport \"./styles.css\";\r\n\r\ncreateRoot(document.getElementById(\"root\")).render(\r\n \r\n \r\n \r\n);\r\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,12,13],"mappings":"kuCASa,IAAI,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,OAAO,IAAI,cAAc,EAAE,EAAE,OAAO,IAAI,gBAAgB,EAAE,EAAE,OAAO,IAAI,mBAAmB,EAAE,EAAE,OAAO,IAAI,gBAAgB,EAAE,EAAE,OAAO,IAAI,gBAAgB,EAAE,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,OAAO,IAAI,mBAAmB,EAAE,EAAE,OAAO,IAAI,gBAAgB,EAAE,EAAE,OAAO,IAAI,YAAY,EAAE,EAAE,OAAO,IAAI,YAAY,EAAE,EAAE,OAAO,SAAS,SAAS,EAAE,EAAE,CAAyE,OAAhD,OAAO,GAAlB,WAAH,EAA8B,MAAK,EAAE,GAAG,EAAE,IAAI,EAAE,cAAiC,OAAO,GAApB,WAAsB,EAAE,KAAI,CAC1e,IAAI,EAAE,CAAC,UAAU,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,mBAAmB,UAAU,CAAC,EAAE,oBAAoB,UAAU,CAAC,EAAE,gBAAgB,UAAU,CAAC,CAAC,EAAE,EAAE,OAAO,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,GAAG,CAAC,CAAC,EAAE,UAAU,iBAAiB,CAAC,EACpQ,EAAE,UAAU,SAAS,SAAS,EAAE,EAAE,CAAC,GAAc,OAAO,GAAlB,UAAkC,OAAO,GAApB,YAA6B,GAAN,KAAQ,MAAM,MAAM,uHAAuH,EAAE,KAAK,QAAQ,gBAAgB,KAAK,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,UAAU,YAAY,SAAS,EAAE,CAAC,KAAK,QAAQ,mBAAmB,KAAK,EAAE,aAAa,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,UAAU,IAAI,EACrf,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,qBAAqB,CAAC,EAAE,IAAI,EAAE,MAAM,QAAQ,GAAE,OAAO,UAAU,eAAe,EAAE,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,EACxK,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,GAAS,GAAN,KAAQ,IAAI,KAAc,EAAE,MAAX,IAAK,KAAY,EAAE,EAAE,KAAc,EAAE,MAAX,IAAK,KAAY,EAAE,GAAG,EAAE,KAAK,EAAE,GAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,UAAU,OAAO,EAAE,GAAO,IAAJ,EAAM,EAAE,SAAS,OAAO,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,GAAG,GAAG,EAAE,aAAa,IAAI,IAAK,GAAE,EAAE,aAAa,EAAW,EAAE,KAAX,IAAK,KAAW,EAAE,GAAG,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAC7a,SAAS,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,OAAO,EAAE,MAAM,CAAC,CAAC,SAAS,GAAE,EAAE,CAAC,OAAiB,OAAO,GAAlB,YAA4B,GAAG,EAAE,WAAW,CAAC,CAAC,SAAS,GAAO,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,EAAE,MAAM,IAAI,EAAE,QAAQ,QAAQ,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAE,OAAO,SAAS,EAAE,EAAE,EAAE,CAAC,OAAiB,OAAO,GAAlB,UAA4B,GAAS,EAAE,KAAR,KAAY,GAAO,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,CAAC,CAC/W,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,GAAmB,IAAd,aAA6B,IAAZ,aAAc,EAAE,MAAK,IAAI,EAAE,CAAC,EAAE,GAAU,IAAP,KAAS,EAAE,CAAC,OAAO,OAAO,EAAP,CAAU,IAAK,SAAS,IAAK,SAAS,EAAE,CAAC,EAAE,MAAM,IAAK,SAAS,OAAO,EAAE,SAAT,CAAmB,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAO,GAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAO,IAAL,GAAO,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAS,GAAN,OAAU,EAAE,EAAE,QAAQ,GAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,GAAS,GAAN,OAAU,GAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,MAAM,EAAE,IAAI,IAAI,GAAG,EAAE,IAAA,CAAK,QAAQ,GAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAyB,GAAvB,EAAE,EAAE,EAAO,IAAL,GAAO,IAAI,EAAE,IAAO,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,EACrf,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,EAAe,OAAO,GAApB,WAAsB,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAA,CAAG,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,GAAc,IAAX,SAAa,KAAM,GAAE,OAAO,CAAC,EAAE,MAAM,mDAAuE,IAApB,kBAAsB,qBAAqB,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,GAAG,2EAA2E,EAAE,OAAO,CAAC,CACzZ,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,GAAS,GAAN,KAAQ,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAmD,OAAjD,EAAE,EAAE,EAAE,GAAG,GAAG,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,EAAS,CAAC,CAAC,SAAS,GAAE,EAAE,CAAC,GAAQ,EAAE,UAAP,GAAe,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,SAAS,EAAE,EAAQ,EAAE,UAAN,GAAoB,EAAE,UAAP,MAAe,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAC,EAAE,SAAS,EAAE,EAAQ,EAAE,UAAN,GAAoB,EAAE,UAAP,MAAe,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAC,CAAC,EAAO,EAAE,UAAP,KAAiB,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAO,EAAE,UAAN,EAAc,OAAO,EAAE,QAAQ,QAAQ,MAAM,EAAE,OAAQ,CAC5Z,IAAI,EAAE,CAAC,QAAQ,IAAI,EAAE,GAAE,CAAC,WAAW,IAAI,EAAE,GAAE,CAAC,uBAAuB,EAAE,wBAAwB,GAAE,kBAAkB,CAAC,EAAE,SAAS,IAAG,CAAC,MAAM,MAAM,0DAA0D,CAAE,CACzM,EAAQ,SAAS,CAAC,IAAI,EAAE,QAAQ,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,SAAS,EAAE,CAAC,IAAI,EAAE,EAAuB,OAArB,EAAE,EAAE,UAAU,CAAC,GAAG,CAAC,EAAS,CAAC,EAAE,QAAQ,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC,GAAG,CAAC,GAAE,CAAC,EAAE,MAAM,MAAM,uEAAuE,EAAE,OAAO,CAAC,CAAC,EAAE,EAAQ,UAAU,EAAE,EAAQ,SAAS,EAAE,EAAQ,SAAS,EAAE,EAAQ,cAAc,EAAE,EAAQ,WAAW,EAAE,EAAQ,SAAS,EAClc,EAAQ,mDAAmD,GAAE,EAAQ,IAAI,GACzE,EAAQ,aAAa,SAAS,EAAE,EAAE,EAAE,CAAC,GAAU,GAAP,KAAqB,MAAM,MAAM,iFAAiF,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,GAAS,GAAN,KAAQ,CAAoE,GAA1D,EAAE,MAAX,IAAK,KAAY,EAAE,EAAE,IAAI,EAAE,EAAE,SAAkB,EAAE,MAAX,IAAK,KAAY,EAAE,GAAG,EAAE,KAAQ,EAAE,MAAM,EAAE,KAAK,aAAa,IAAI,EAAE,EAAE,KAAK,aAAa,IAAI,KAAK,EAAE,GAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,IAAI,EAAE,GAAY,EAAE,KAAX,IAAK,IAAmB,IAAT,IAAK,GAAM,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,OAAO,EAAE,GAAO,IAAJ,EAAM,EAAE,SAAS,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,EACtf,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,EAAQ,cAAc,SAAS,EAAE,CAAmK,MAAlK,GAAE,CAAC,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,KAAK,SAAS,KAAK,cAAc,KAAK,YAAY,IAAI,EAAE,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,EAAS,EAAE,SAAS,CAAC,EAAE,EAAQ,cAAc,EAAE,EAAQ,cAAc,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,KAAK,CAAC,EAAW,MAAT,GAAE,KAAK,EAAS,CAAC,EAAE,EAAQ,UAAU,UAAU,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,EAC9d,EAAQ,WAAW,SAAS,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,EAAE,EAAQ,eAAe,GAAE,EAAQ,KAAK,SAAS,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAC,CAAC,EAAE,EAAQ,KAAK,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,QAAiB,IAAT,IAAK,GAAM,KAAK,CAAC,CAAC,EAAE,EAAQ,gBAAgB,SAAS,EAAE,CAAC,IAAI,EAAE,GAAE,WAAW,GAAE,WAAW,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAE,WAAW,CAAC,CAAC,EAAE,EAAQ,aAAa,GAAE,EAAQ,YAAY,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,YAAY,EAAE,CAAC,CAAC,EAAE,EAAQ,WAAW,SAAS,EAAE,CAAC,OAAO,EAAE,QAAQ,WAAW,CAAC,CAAC,EAC3f,EAAQ,cAAc,UAAU,CAAC,EAAE,EAAQ,iBAAiB,SAAS,EAAE,CAAC,OAAO,EAAE,QAAQ,iBAAiB,CAAC,CAAC,EAAE,EAAQ,UAAU,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,UAAU,EAAE,CAAC,CAAC,EAAE,EAAQ,MAAM,UAAU,CAAC,OAAO,EAAE,QAAQ,MAAM,CAAC,EAAE,EAAQ,oBAAoB,SAAS,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,oBAAoB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAQ,mBAAmB,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAQ,gBAAgB,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,gBAAgB,EAAE,CAAC,CAAC,EACzd,EAAQ,QAAQ,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAQ,WAAW,SAAS,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,EAAQ,OAAO,SAAS,EAAE,CAAC,OAAO,EAAE,QAAQ,OAAO,CAAC,CAAC,EAAE,EAAQ,SAAS,SAAS,EAAE,CAAC,OAAO,EAAE,QAAQ,SAAS,CAAC,CAAC,EAAE,EAAQ,qBAAqB,SAAS,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,qBAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,EAAQ,cAAc,UAAU,CAAC,OAAO,EAAE,QAAQ,cAAc,CAAC,EAAE,EAAQ,QAAQ,yBCtBla,EAAO,QAAA,EAAA,cCMI,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAW,EAAE,SAAN,EAAa,KAAK,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,GAAO,EAAE,SAAN,EAAa,OAAO,KAAK,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAC3c,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,UAAU,OAAW,IAAJ,EAAQ,EAAE,GAAG,EAAE,GAAT,CAAW,CAAC,GAAc,OAAO,aAAlB,UAA4C,OAAO,YAAY,KAAhC,WAAoC,CAAC,IAAI,EAAE,YAAY,EAAQ,aAAa,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAQ,aAAa,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAe,OAAO,YAApB,WAA+B,WAAW,KAAK,EAAe,OAAO,cAApB,WAAiC,aAAa,KAAK,EAAgB,OAAO,aAArB,IAAkC,aAAa,KACjd,OAAO,UAArB,KAAyC,UAAU,aAAnB,IAAK,IAAmC,UAAU,WAAW,iBAA9B,IAAK,IAAyC,UAAU,WAAW,eAAe,KAAK,UAAU,UAAU,EAAE,SAAS,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,EAAS,IAAP,MAAU,CAAC,GAAU,EAAE,WAAT,KAAkB,EAAE,CAAC,OAAO,GAAG,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE,CAAC,OAAO,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAW,GAAV,EAAE,CAAC,EAAE,EAAE,CAAC,EAAK,CAAC,EAAE,IAAU,EAAE,CAAC,IAAV,KAAY,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAS,IAAP,MAAU,GAAE,EAAE,EAAE,UAAU,CAAC,CAAC,EAAC,CACra,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAM,IAAL,EAAE,CAAC,EAAM,EAAE,EAAE,CAAC,EAAS,IAAP,OAAW,EAAE,EAAE,eAAe,IAAI,GAAG,CAAC,GAAE,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,GAAgB,OAAO,GAApB,WAAsB,CAAC,EAAE,SAAS,KAAK,EAAE,EAAE,cAAc,IAAI,EAAE,EAAE,EAAE,gBAAgB,CAAC,EAAE,EAAE,EAAQ,aAAa,EAAe,OAAO,GAApB,WAAsB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAU,IAAP,KAAS,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAS,IAAP,MAAU,GAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAE,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,GACtc,SAAS,IAAG,CAAC,MAAO,IAAQ,aAAa,EAAE,EAAE,EAAO,CAAC,SAAS,IAAG,CAAC,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAQ,aAAa,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAE,GAAG,GAAE,CAAC,EAAE,EAAE,KAAK,CAAC,KAAM,IAAE,CAAC,CAAC,CAAC,IAAI,GAAE,GAAgB,OAAO,GAApB,WAAsB,GAAE,UAAU,CAAC,EAAE,EAAC,CAAC,OAAO,GAAiB,OAAO,eAArB,IAAoC,CAAC,IAAI,EAAE,IAAI,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,UAAU,GAAE,GAAE,UAAU,CAAC,EAAE,YAAY,IAAI,CAAC,CAAC,KAAM,IAAE,UAAU,CAAC,EAAE,GAAE,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,KAAI,GAAE,CAAC,EAAE,GAAE,EAAE,CAAC,SAAS,GAAE,EAAE,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,EAAQ,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAC5d,EAAQ,sBAAsB,EAAE,EAAQ,2BAA2B,EAAE,EAAQ,qBAAqB,EAAE,EAAQ,wBAAwB,EAAE,EAAQ,mBAAmB,KAAK,EAAQ,8BAA8B,EAAE,EAAQ,wBAAwB,SAAS,EAAE,CAAC,EAAE,SAAS,IAAI,EAAE,EAAQ,2BAA2B,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAC1U,EAAQ,wBAAwB,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,MAAM,iHAAiH,EAAE,EAAE,EAAE,EAAE,KAAK,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,EAAQ,iCAAiC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAQ,8BAA8B,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAQ,cAAc,SAAS,EAAE,CAAC,OAAO,EAAP,CAAU,IAAK,GAAE,IAAK,GAAE,IAAK,GAAE,IAAI,EAAE,EAAE,MAAM,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,EAAQ,wBAAwB,UAAU,CAAC,EAC9f,EAAQ,sBAAsB,UAAU,CAAC,EAAE,EAAQ,yBAAyB,SAAS,EAAE,EAAE,CAAC,OAAO,EAAP,CAAU,IAAK,GAAE,IAAK,GAAE,IAAK,GAAE,IAAK,GAAE,IAAK,GAAE,MAAM,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAChM,EAAQ,0BAA0B,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAQ,aAAa,EAAiF,OAApE,OAAO,GAAlB,UAA4B,GAAG,EAAE,EAAE,MAAM,EAAa,OAAO,GAAlB,UAAqB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAS,EAAP,CAAU,IAAK,GAAE,IAAI,EAAE,GAAG,MAAM,IAAK,GAAE,EAAE,IAAI,MAAM,IAAK,GAAE,EAAE,WAAW,MAAM,IAAK,GAAE,EAAE,IAAI,MAAM,QAAQ,EAAE,GAAG,CAAgN,MAA/M,GAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,EAAS,EAAE,CAAC,IAAV,MAAa,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAE,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAW,CAAC,EACne,EAAQ,qBAAqB,GAAE,EAAQ,sBAAsB,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,kBCf7J,EAAO,QAAA,EAAA,cCSI,IAAI,EAAA,EAAA,EAAoB,EAAA,EAAA,EAAwB,SAAS,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,yDAAyD,EAAE,EAAE,EAAE,EAAE,UAAU,OAAO,IAAI,GAAG,WAAW,mBAAmB,UAAU,EAAE,EAAE,MAAM,yBAAyB,EAAE,WAAW,EAAE,gHAAgH,CAAC,IAAI,EAAG,IAAI,IAAI,EAAG,CAAC,EAAE,SAAS,EAAG,EAAE,EAAE,CAAC,EAAG,EAAE,CAAC,EAAE,EAAG,EAAE,UAAU,CAAC,CAAC,CACxb,SAAS,EAAG,EAAE,EAAE,CAAS,IAAR,EAAG,GAAG,EAAM,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,EAAG,IAAI,EAAE,EAAE,CAAC,CAC5D,IAAI,EAAG,EAAgB,OAAO,OAArB,KAAkD,OAAO,WAA5B,QAA2D,OAAO,SAAS,gBAArC,QAAoD,EAAG,OAAO,UAAU,eAAe,EAAG,8VAA8V,EACpgB,CAAC,EAAE,EAAG,CAAC,EAAE,SAAS,EAAG,EAAE,CAA4F,OAAxF,EAAG,KAAK,EAAG,CAAC,EAAQ,CAAC,EAAK,EAAG,KAAK,EAAG,CAAC,EAAQ,CAAC,EAAK,EAAG,KAAK,CAAC,EAAS,EAAG,GAAG,CAAC,GAAE,EAAG,GAAG,CAAC,EAAQ,CAAC,EAAC,CAAC,SAAS,EAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAU,IAAP,MAAc,EAAE,OAAN,EAAW,MAAM,CAAC,EAAE,OAAO,OAAO,EAAd,CAAiB,IAAK,WAAW,IAAK,SAAS,MAAM,CAAC,EAAE,IAAK,UAA0F,OAA7E,EAAQ,CAAC,EAAY,IAAP,MAAkC,EAAE,EAAE,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,EAAkB,IAAV,SAAuB,IAAV,SAAnE,CAAC,EAAE,gBAA4E,QAAQ,MAAM,CAAC,CAAC,CAAC,CACzX,SAAS,EAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAU,GAAP,MAAkC,EAAG,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,GAAU,IAAP,KAAS,OAAO,EAAE,KAAT,CAAe,IAAK,GAAE,MAAM,CAAC,EAAE,IAAK,GAAE,MAAM,CAAC,IAAI,EAAE,IAAK,GAAE,OAAO,MAAM,CAAC,EAAE,IAAK,GAAE,OAAO,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,gBAAoB,IAAJ,GAAW,IAAJ,GAAW,IAAJ,EAAM,KAAK,cAAc,EAAE,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,kBAAkB,CAAC,CAAC,IAAI,EAAE,CAAC,EACpb,uIAAuI,MAAM,GAAG,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,YAAY,OAAO,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,YAAY,YAAY,CAAC,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,YAAY,aAAa,OAAO,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAC3e,CAAC,cAAc,4BAA4B,YAAY,eAAe,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,8OAA8O,MAAM,GAAG,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EACzb,CAAC,UAAU,WAAW,QAAQ,UAAU,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,UAAU,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,OAAO,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAG,gBAAgB,SAAS,EAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,CACxZ,0jCAA0jC,MAAM,GAAG,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EACzmC,CAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,2EAA2E,MAAM,GAAG,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAG,CAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,+BAA+B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,WAAW,WAAW,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAG,CAAE,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,uCAAuC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,aAAa,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EACnd,EAAE,UAAU,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,+BAA+B,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,OAAO,SAAS,YAAY,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAC7L,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC,EAAE,EAAE,GAAG,MAAe,IAAP,KAAoB,GAAG,EAAE,EAAE,EAAE,SAAe,EAAE,KAAR,KAAkB,EAAE,KAAR,KAAkB,EAAE,KAAR,KAAkB,EAAE,KAAR,IAA7D,EAAE,OAAN,KAA4E,EAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,GAAU,IAAP,KAAS,EAAG,CAAC,IAAW,IAAP,KAAS,EAAE,gBAAgB,CAAC,EAAE,EAAE,aAAa,EAAE,GAAG,CAAC,GAAG,EAAE,gBAAgB,EAAE,EAAE,cAAqB,IAAP,KAAa,EAAE,OAAN,GAAc,GAAG,GAAG,EAAE,EAAE,cAAc,EAAE,EAAE,mBAA0B,IAAP,KAAS,EAAE,gBAAgB,CAAC,GAAG,EAAE,EAAE,KAAK,EAAM,IAAJ,GAAW,IAAJ,GAAO,CAAC,IAAI,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,IAAG,CACjd,IAAI,EAAG,EAAG,mDAAmD,EAAG,OAAO,IAAI,eAAe,EAAE,EAAG,OAAO,IAAI,cAAc,EAAE,EAAG,OAAO,IAAI,gBAAgB,EAAE,GAAG,OAAO,IAAI,mBAAmB,EAAE,GAAG,OAAO,IAAI,gBAAgB,EAAE,GAAG,OAAO,IAAI,gBAAgB,EAAE,EAAG,OAAO,IAAI,eAAe,EAAE,EAAG,OAAO,IAAI,mBAAmB,EAAE,EAAG,OAAO,IAAI,gBAAgB,EAAE,GAAG,OAAO,IAAI,qBAAqB,EAAE,EAAG,OAAO,IAAI,YAAY,EAAE,GAAG,OAAO,IAAI,YAAY,EACtb,GAAG,OAAO,IAAI,iBAAiB,EAAqG,GAAG,OAAO,SAAS,SAAS,GAAG,EAAE,CAA2E,OAAlD,OAAO,GAAlB,WAAH,EAA8B,MAAK,EAAE,IAAI,EAAE,KAAK,EAAE,cAAiC,OAAO,GAApB,WAAsB,EAAE,KAAI,CAAC,IAAI,EAAE,OAAO,OAAO,GAAG,SAAS,GAAG,EAAE,CAAC,GAAY,KAAT,IAAK,GAAO,GAAG,CAAC,MAAM,MAAM,CAAE,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,KAAK,CAAC,CAAC,MAAM,cAAc,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,MAAM;EAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,EAC1b,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,kBAAkB,MAAM,kBAAkB,IAAK,GAAE,GAAG,CAAC,GAAG,EAAE,IAAG,EAAE,UAAU,CAAC,MAAM,MAAM,CAAE,EAAE,OAAO,eAAe,EAAE,UAAU,QAAQ,CAAC,IAAI,UAAU,CAAC,MAAM,MAAM,CAAE,CAAC,CAAC,EAAa,OAAO,SAAlB,UAA2B,QAAQ,UAAU,CAAC,GAAG,CAAC,QAAQ,UAAU,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,MAAK,CAAC,GAAG,CAAC,MAAM,MAAM,CAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,GAAG,GAAc,OAAO,EAAE,OAApB,SAA0B,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,MAAM;CAAI,EACvf,EAAE,EAAE,MAAM,MAAM;CAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG,GAAG,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,GAAO,IAAJ,GAAW,IAAJ,EAAO,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE;EAAK,EAAE,EAAE,CAAC,QAAQ,WAAW,MAAM,EAAuF,OAArF,EAAE,aAAa,EAAE,SAAS,aAAa,IAAI,EAAE,EAAE,QAAQ,cAAc,EAAE,WAAW,GAAU,CAAC,OAAO,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,IAAI,GAAG,CAAC,EAAE,EAAE,CAC9Z,SAAS,GAAG,EAAE,CAAC,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,OAAO,GAAG,EAAE,IAAI,EAAE,IAAK,IAAG,OAAO,GAAG,MAAM,EAAE,IAAK,IAAG,OAAO,GAAG,UAAU,EAAE,IAAK,IAAG,OAAO,GAAG,cAAc,EAAE,IAAK,GAAE,IAAK,GAAE,IAAK,IAAG,MAAO,GAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,IAAK,IAAG,MAAO,GAAE,GAAG,EAAE,KAAK,OAAO,CAAC,CAAC,EAAE,EAAE,IAAK,GAAE,MAAO,GAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,QAAQ,MAAM,EAAE,CAAC,CACxR,SAAS,GAAG,EAAE,CAAC,GAAS,GAAN,KAAQ,OAAO,KAAK,GAAgB,OAAO,GAApB,WAAsB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,GAAc,OAAO,GAAlB,SAAoB,OAAO,EAAE,OAAO,EAAP,CAAU,KAAK,EAAG,MAAM,WAAW,KAAK,EAAG,MAAM,SAAS,KAAK,GAAG,MAAM,WAAW,KAAK,GAAG,MAAM,aAAa,KAAK,EAAG,MAAM,WAAW,KAAK,GAAG,MAAM,cAAc,CAAC,GAAc,OAAO,GAAlB,SAAoB,OAAO,EAAE,SAAT,CAAmB,KAAK,EAAG,OAAO,EAAE,aAAa,WAAW,YAAY,KAAK,GAAG,OAAO,EAAE,SAAS,aAAa,WAAW,YAAY,KAAK,EAAG,IAAI,EAAE,EAAE,OAC7Z,MADoa,GAAE,EAAE,YAAY,AAC/d,KADme,EAAE,EAAE,aAClf,EAAE,MAAM,GAAU,IAAL,GAA2B,aAApB,cAAc,EAAE,KAAyB,EAAE,KAAK,EAAG,MAAO,GAAE,EAAE,aAAa,KAAY,IAAP,KAAW,GAAG,EAAE,IAAI,GAAG,OAAd,EAAqB,KAAK,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,MAAS,CAAC,CAAC,CAAC,OAAO,IAAI,CAC3M,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,OAAO,EAAE,IAAT,CAAc,IAAK,IAAG,MAAM,QAAQ,IAAK,GAAE,OAAO,EAAE,aAAa,WAAW,YAAY,IAAK,IAAG,OAAO,EAAE,SAAS,aAAa,WAAW,YAAY,IAAK,IAAG,MAAM,qBAAqB,IAAK,IAAG,MAAO,GAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,EAAE,cAAmB,IAAL,GAA2B,aAApB,cAAc,EAAE,KAAkB,IAAK,GAAE,MAAM,WAAW,IAAK,GAAE,OAAO,EAAE,IAAK,GAAE,MAAM,SAAS,IAAK,GAAE,MAAM,OAAO,IAAK,GAAE,MAAM,OAAO,IAAK,IAAG,OAAO,GAAG,CAAC,EAAE,IAAK,GAAE,OAAO,IAAI,GAAG,aAAa,OAAO,IAAK,IAAG,MAAM,YACtf,IAAK,IAAG,MAAM,WAAW,IAAK,IAAG,MAAM,QAAQ,IAAK,IAAG,MAAM,WAAW,IAAK,IAAG,MAAM,eAAe,IAAK,IAAG,MAAM,gBAAgB,IAAK,GAAE,IAAK,GAAE,IAAK,IAAG,IAAK,GAAE,IAAK,IAAG,IAAK,IAAG,GAAgB,OAAO,GAApB,WAAsB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,GAAc,OAAO,GAAlB,SAAoB,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,EAAG,EAAE,CAAC,OAAO,OAAO,EAAd,CAAiB,IAAK,UAAU,IAAK,SAAS,IAAK,SAAS,IAAK,YAAY,OAAO,EAAE,IAAK,SAAS,OAAO,EAAE,QAAQ,MAAM,EAAE,CAAC,CACra,SAAS,EAAG,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,OAAO,EAAE,EAAE,WAAqB,EAAE,YAAY,IAAxB,UAAyC,IAAb,YAA0B,IAAV,QAAY,CAC1G,SAAS,EAAG,EAAE,CAAC,IAAI,EAAE,EAAG,CAAC,EAAE,UAAU,QAAQ,EAAE,OAAO,yBAAyB,EAAE,YAAY,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,eAAe,CAAC,GAAwB,IAArB,QAAqC,OAAO,EAAE,KAAtB,YAAwC,OAAO,EAAE,KAAtB,WAA0B,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAiL,OAA7K,OAAO,eAAe,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,UAAU,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,eAAe,EAAE,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC,EAAQ,CAAC,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,aAAa,UAAU,CAAC,EAAE,cACxf,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAG,EAAE,CAAC,AAAkB,EAAE,gBAAc,EAAG,CAAC,CAAE,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,cAAc,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAM,EAAE,GAAqD,OAAlD,IAAI,EAAE,EAAG,CAAC,EAAE,EAAE,QAAQ,OAAO,QAAQ,EAAE,OAAO,EAAE,EAAS,IAAI,IAAG,EAAE,SAAS,CAAC,EAAE,CAAC,EAAK,CAAC,SAAS,GAAG,EAAE,CAAsD,GAArD,IAAoB,OAAO,SAArB,IAA8B,SAAS,IAAK,GAA2B,IAArB,OAAuB,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,MAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CACpa,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,IAAK,GAAE,aAAa,IAAK,GAAE,MAAM,IAAK,GAAE,QAAc,GAAI,EAAE,cAAc,cAAc,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAQ,EAAE,cAAR,KAAqB,GAAG,EAAE,aAAa,EAAQ,EAAE,SAAR,KAA0B,EAAE,eAAZ,EAAE,QAAyB,EAAE,EAAS,EAAE,OAAR,KAAsB,EAAR,EAAE,KAAO,EAAE,EAAE,cAAc,CAAC,eAAe,EAAE,aAAa,EAAE,WAAwB,EAAE,OAAf,YAA+B,EAAE,OAAZ,QAAuB,EAAE,SAAR,KAAsB,EAAE,OAAR,IAAa,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,QAAc,GAAN,MAAS,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAC9d,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAS,GAAN,KAAsB,IAAX,UAAqB,IAAJ,GAAY,EAAE,QAAP,IAAc,EAAE,OAAO,KAAE,EAAE,MAAM,GAAG,GAAO,EAAE,QAAQ,GAAG,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAc,IAAX,UAAwB,IAAV,QAAY,CAAC,EAAE,gBAAgB,OAAO,EAAE,MAAM,CAAC,EAAE,eAAe,OAAO,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,eAAe,cAAc,GAAG,GAAG,EAAE,EAAE,KAAK,EAAG,EAAE,YAAY,CAAC,EAAQ,EAAE,SAAR,MAAuB,EAAE,gBAAR,OAAyB,EAAE,eAAe,CAAC,CAAC,EAAE,eAAe,CACla,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,eAAe,OAAO,GAAG,EAAE,eAAe,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,GAAG,EAAa,IAAX,UAAwB,IAAV,SAAsB,EAAE,QAAX,IAAK,IAAoB,EAAE,QAAT,MAAgB,OAAO,EAAE,GAAG,EAAE,cAAc,aAAa,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,EAAE,aAAa,CAAC,CAAC,EAAE,EAAE,KAAU,IAAL,KAAS,EAAE,KAAK,IAAI,EAAE,eAAe,CAAC,CAAC,EAAE,cAAc,eAAoB,IAAL,KAAS,EAAE,KAAK,EAAE,CACzV,SAAS,GAAG,EAAE,EAAE,EAAE,EAAe,IAAX,UAAc,GAAG,EAAE,aAAa,IAAI,KAAQ,GAAN,KAAQ,EAAE,aAAa,GAAG,EAAE,cAAc,aAAa,EAAE,eAAe,GAAG,IAAI,EAAE,aAAa,GAAG,GAAE,CAAC,IAAI,EAAG,MAAM,QAC7K,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAa,GAAZ,EAAE,EAAE,QAAW,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,eAAe,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,SAAS,GAAG,GAAG,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAmB,IAAlB,EAAE,GAAG,EAAG,CAAC,EAAE,EAAE,KAAS,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAQ,IAAP,MAAU,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,GAAG,CAAQ,IAAP,OAAW,EAAE,SAAS,CAAC,EAAE,CAAC,CACxY,SAAS,GAAG,EAAE,EAAE,CAAC,GAAS,EAAE,yBAAR,KAAgC,MAAM,MAAM,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,IAAK,GAAE,aAAa,IAAK,GAAE,SAAS,GAAG,EAAE,cAAc,YAAY,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,GAAS,GAAN,KAAQ,CAA+B,GAA9B,EAAE,EAAE,SAAS,EAAE,EAAE,aAAsB,GAAN,KAAQ,CAAC,GAAS,GAAN,KAAQ,MAAM,MAAM,EAAE,EAAE,CAAC,EAAE,GAAG,EAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,OAAO,MAAM,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,GAAI,EAAE,CAAC,CAAC,EAAE,cAAc,CAAC,aAAa,EAAG,CAAC,CAAC,CAAC,CACnY,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAG,EAAE,KAAK,EAAE,EAAE,EAAG,EAAE,YAAY,EAAQ,GAAN,OAAU,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAS,EAAE,cAAR,MAAsB,EAAE,eAAe,IAAI,EAAE,aAAa,IAAU,GAAN,OAAU,EAAE,aAAa,GAAG,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,YAAY,IAAI,EAAE,cAAc,cAAmB,IAAL,IAAe,IAAP,OAAW,EAAE,MAAM,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,OAAO,EAAP,CAAU,IAAK,MAAM,MAAM,6BAA6B,IAAK,OAAO,MAAM,qCAAqC,QAAQ,MAAM,8BAA8B,CAAC,CAC7c,SAAS,GAAG,EAAE,EAAE,CAAC,OAAa,GAAN,MAA0C,IAAjC,+BAAmC,GAAG,CAAC,EAAiC,IAA/B,8BAAoD,IAAlB,gBAAoB,+BAA+B,CAAC,CAChK,IAAI,GAAG,GAAG,SAAS,EAAE,CAAC,OAAoB,OAAO,MAArB,KAA4B,MAAM,wBAAwB,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,wBAAwB,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC,GAAkC,EAAE,eAAjC,8BAA+C,cAAc,EAAE,EAAE,UAAU,MAAM,CAA2F,IAA1F,KAAO,SAAS,cAAc,KAAK,EAAE,GAAG,UAAU,QAAQ,EAAE,QAAQ,CAAC,CAAC,SAAS,EAAE,SAAa,EAAE,GAAG,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,EACpd,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,WAAW,GAAG,GAAG,IAAI,EAAE,WAAe,EAAE,WAAN,EAAe,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,CACtH,IAAI,GAAG,CAAC,wBAAwB,CAAC,EAAE,YAAY,CAAC,EAAE,kBAAkB,CAAC,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,EAAE,QAAQ,CAAC,EAAE,aAAa,CAAC,EAAE,gBAAgB,CAAC,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE,aAAa,CAAC,EAAE,WAAW,CAAC,EAAE,aAAa,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,aAAa,CAAC,EAAE,WAAW,CAAC,EAAE,cAAc,CAAC,EAAE,eAAe,CAAC,EAAE,gBAAgB,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EACnf,KAAK,CAAC,EAAE,YAAY,CAAC,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,EAAE,gBAAgB,CAAC,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,EAAE,cAAc,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,KAAK,MAAM,GAAG,EAAE,OAAO,KAAK,EAAE,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,GAAG,QAAQ,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,UAAU,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,OAAa,GAAN,MAAqB,OAAO,GAAnB,WAA2B,IAAL,GAAO,GAAG,GAAc,OAAO,GAAlB,UAAyB,IAAJ,GAAO,GAAG,eAAe,CAAC,GAAG,GAAG,IAAI,GAAG,EAAA,CAAG,KAAK,EAAE,EAAE,IAAI,CACzb,SAAS,GAAG,EAAE,EAAE,CAAW,IAAI,IAAI,IAAlB,GAAE,EAAE,MAAmB,EAAE,GAAG,EAAE,eAAe,CAAC,EAAE,CAAC,IAAI,EAAM,EAAE,QAAQ,IAAI,IAAlB,EAAoB,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,EAAY,IAAV,UAAc,EAAE,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EACrT,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,KAAW,EAAE,UAAR,MAAwB,EAAE,yBAAR,MAAiC,MAAM,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,GAAS,EAAE,yBAAR,KAAgC,CAAC,GAAS,EAAE,UAAR,KAAiB,MAAM,MAAM,EAAE,EAAE,CAAC,EAAE,GAAc,OAAO,EAAE,yBAApB,UAA6C,EAAE,WAAW,EAAE,yBAAyB,MAAM,MAAM,EAAE,EAAE,CAAC,CAAE,CAAC,GAAS,EAAE,OAAR,MAA0B,OAAO,EAAE,OAApB,SAA0B,MAAM,MAAM,EAAE,EAAE,CAAC,CAAE,CAAC,CAClW,SAAS,GAAG,EAAE,EAAE,CAAC,GAAQ,EAAE,QAAQ,GAAG,IAAlB,GAAoB,OAAiB,OAAO,EAAE,IAApB,SAAuB,OAAO,EAAP,CAAU,IAAK,iBAAiB,IAAK,gBAAgB,IAAK,YAAY,IAAK,gBAAgB,IAAK,gBAAgB,IAAK,mBAAmB,IAAK,iBAAiB,IAAK,gBAAgB,MAAM,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,SAAS,GAAG,EAAE,CAA2F,MAA1F,GAAE,EAAE,QAAQ,EAAE,YAAY,OAAO,EAAE,0BAA0B,EAAE,EAAE,yBAAoC,EAAE,WAAN,EAAe,EAAE,WAAW,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KACpc,SAAS,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAgB,OAAO,IAApB,WAAuB,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,UAAU,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAoB,GAAjB,GAAG,GAAG,KAAK,GAAG,CAAC,EAAK,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAI,GAAG,CAAC,GAAS,KAAP,MAAkB,KAAP,QAAU,GAAG,EAAE,GAAG,EAAC,CAAC,CAChb,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,GAAU,IAAP,KAAS,OAAO,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,GAAU,IAAP,KAAS,OAAO,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,EAAP,CAAU,IAAK,UAAU,IAAK,iBAAiB,IAAK,gBAAgB,IAAK,uBAAuB,IAAK,cAAc,IAAK,qBAAqB,IAAK,cAAc,IAAK,qBAAqB,IAAK,YAAY,IAAK,mBAAmB,IAAK,gBAAgB,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAe,IAAX,UAAwB,IAAV,SAAwB,IAAX,UAA2B,IAAb,YAAiB,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,GAAG,GACte,OAAO,GADke,WAChe,MAAM,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,EAAG,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,OAAO,eAAe,GAAG,UAAU,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,iBAAiB,OAAO,GAAG,EAAE,EAAE,OAAO,oBAAoB,OAAO,GAAG,EAAE,CAAC,MAAS,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,UAAU,MAAM,KAAK,UAAU,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,QAAQ,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC,CACze,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAA0B,GAAzB,GAAG,MAAM,KAAK,SAAS,EAAK,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,MAAM,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,KAAK,EAAE,QAAQ,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,EAAG,GAAE,EAAO,EAAE,MAAM,OAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,CAAC,OAAW,EAAE,MAAN,EAAU,EAAE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,GAAQ,EAAE,MAAP,GAAW,CAAC,IAAI,EAAE,EAAE,cAAsE,GAAjD,IAAP,OAAW,EAAE,EAAE,UAAiB,IAAP,OAAW,EAAE,EAAE,gBAA0B,IAAP,KAAS,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CACjf,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,GAAG,CAAC,EAAE,CAAS,GAAR,EAAE,GAAG,CAAC,EAAY,IAAP,KAAS,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,IAAI,EAAO,EAAL,IAAM,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,GAAU,IAAP,KAAS,MAAM,IAAI,EAAE,EAAE,UAAU,GAAU,IAAP,KAAS,CAAY,GAAX,EAAE,EAAE,OAAiB,IAAP,KAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,IAC5f,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CAAC,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CAAC,GAAO,EAAE,MAAN,EAAU,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,UAAU,EAAE,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,CAAS,MAAR,GAAE,GAAG,CAAC,EAAgB,IAAP,KAAe,KAAN,GAAG,CAAC,CAAM,CAAC,SAAS,GAAG,EAAE,CAAC,GAAO,EAAE,MAAN,GAAe,EAAE,MAAN,EAAU,OAAO,EAAE,IAAI,EAAE,EAAE,MAAa,IAAP,MAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAU,IAAP,KAAS,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,CAC1X,IAAI,GAAG,EAAG,0BAA0B,GAAG,EAAG,wBAAwB,GAAG,EAAG,qBAAqB,GAAG,EAAG,sBAAsB,EAAE,EAAG,aAAa,GAAG,EAAG,iCAAiC,GAAG,EAAG,2BAA2B,GAAG,EAAG,8BAA8B,GAAG,EAAG,wBAAwB,GAAG,EAAG,qBAAqB,GAAG,EAAG,sBAAsB,GAAG,KAAK,GAAG,KAAK,SAAS,GAAG,EAAE,CAAC,GAAG,IAAiB,OAAO,GAAG,mBAAvB,WAAyC,GAAG,CAAC,GAAG,kBAAkB,GAAG,EAAE,IAAK,IAAS,EAAE,QAAQ,MAAM,MAAvB,GAA2B,CAAC,MAAS,CAAC,CAAC,CACve,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,GAAG,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,GAAG,EAAE,CAAQ,MAAP,MAAK,EAAa,IAAJ,EAAM,GAAG,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,QAC7H,SAAS,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAV,CAAa,IAAK,GAAE,MAAO,GAAE,IAAK,GAAE,MAAO,GAAE,IAAK,GAAE,MAAO,GAAE,IAAK,GAAE,MAAO,GAAE,IAAK,IAAG,MAAO,IAAG,IAAK,IAAG,MAAO,IAAG,IAAK,IAAG,IAAK,KAAI,IAAK,KAAI,IAAK,KAAI,IAAK,MAAK,IAAK,MAAK,IAAK,MAAK,IAAK,MAAK,IAAK,OAAM,IAAK,OAAM,IAAK,OAAM,IAAK,QAAO,IAAK,QAAO,IAAK,QAAO,IAAK,SAAQ,IAAK,SAAQ,OAAO,EAAE,QAAQ,IAAK,SAAQ,IAAK,SAAQ,IAAK,UAAS,IAAK,UAAS,IAAK,UAAS,OAAO,EAAE,UAAU,IAAK,WAAU,MAAO,WAAU,IAAK,WAAU,MAAO,WAAU,IAAK,WAAU,MAAO,WAAU,IAAK,YAAW,MAAO,YACzgB,QAAQ,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,aAAa,GAAO,IAAJ,EAAM,MAAO,GAAE,IAAI,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,YAAY,EAAE,EAAE,UAAU,GAAO,IAAJ,EAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAM,IAAJ,GAAe,GAAG,EAAM,IAAJ,IAAQ,EAAE,GAAG,CAAC,IAA5B,EAAE,GAAG,CAAC,CAAyB,KAAM,GAAE,EAAE,CAAC,EAAM,IAAJ,EAAkB,IAAJ,IAAQ,EAAE,GAAG,CAAC,GAAtB,EAAE,GAAG,CAAC,EAAmB,GAAO,IAAJ,EAAM,MAAO,GAAE,GAAO,IAAJ,GAAO,IAAI,IAAQ,EAAE,KAAP,IAAY,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAQ,IAAL,IAAa,EAAE,SAAU,OAAO,EAA0C,GAAnC,EAAE,IAAK,GAAG,EAAE,IAAI,EAAE,EAAE,eAAsB,IAAJ,EAAM,IAAI,EAAE,EAAE,cAAc,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,CACvc,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,EAAP,CAAU,IAAK,GAAE,IAAK,GAAE,IAAK,GAAE,OAAO,EAAE,IAAI,IAAK,GAAE,IAAK,IAAG,IAAK,IAAG,IAAK,IAAG,IAAK,KAAI,IAAK,KAAI,IAAK,KAAI,IAAK,MAAK,IAAK,MAAK,IAAK,MAAK,IAAK,MAAK,IAAK,OAAM,IAAK,OAAM,IAAK,OAAM,IAAK,QAAO,IAAK,QAAO,IAAK,QAAO,IAAK,SAAQ,IAAK,SAAQ,OAAO,EAAE,IAAI,IAAK,SAAQ,IAAK,SAAQ,IAAK,UAAS,IAAK,UAAS,IAAK,UAAS,MAAM,GAAG,IAAK,WAAU,IAAK,WAAU,IAAK,WAAU,IAAK,YAAW,MAAM,GAAG,QAAQ,MAAM,EAAE,CAAC,CAC/a,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,YAAY,EAAE,EAAE,gBAAgB,EAAE,EAAE,aAAa,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAW,IAAL,KAAgB,EAAE,KAAP,IAAgB,EAAE,KAAP,KAAU,EAAE,GAAG,GAAG,EAAE,CAAC,GAAO,GAAG,IAAI,EAAE,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAA8B,MAA7B,GAAE,EAAE,aAAa,YAAuB,IAAJ,EAAQ,EAAE,WAAW,WAAW,EAA1B,CAA2B,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,GAAoC,MAAjC,MAAK,EAAE,EAAK,GAAG,WAAW,GAAG,IAAW,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAC3a,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,cAAc,EAAc,IAAZ,YAAgB,EAAE,eAAe,EAAE,EAAE,YAAY,GAAG,EAAE,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,aAAa,EAAE,EAAE,eAAe,EAAE,EAAE,YAAY,EAAE,EAAE,cAAc,EAAE,EAAE,kBAAkB,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,cAAc,IAAI,EAAE,EAAE,WAAW,IAAI,EAAE,EAAE,gBAAgB,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CACzY,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,cAAc,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,GAAG,EAAE,CAAO,MAAN,IAAG,CAAC,EAAS,EAAE,EAAE,EAAE,EAAO,EAAE,UAAW,GAAG,UAAU,EAAE,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,CAAC,EAAE,GAAG,6PAA6P,MAAM,GAAG,EACniB,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,EAAP,CAAU,IAAK,UAAU,IAAK,WAAW,GAAG,KAAK,MAAM,IAAK,YAAY,IAAK,YAAY,GAAG,KAAK,MAAM,IAAK,YAAY,IAAK,WAAW,GAAG,KAAK,MAAM,IAAK,cAAc,IAAK,aAAa,GAAG,OAAO,EAAE,SAAS,EAAE,MAAM,IAAK,oBAAoB,IAAK,qBAAqB,GAAG,OAAO,EAAE,SAAS,CAAC,CAAC,CACnT,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAoP,OAAzO,IAAP,MAAU,EAAE,cAAc,GAAS,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAS,IAAP,OAAW,EAAE,GAAG,CAAC,EAAS,IAAP,MAAU,GAAG,CAAC,GAAG,IAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,iBAAwB,IAAP,MAAe,EAAE,QAAQ,CAAC,IAAhB,IAAmB,EAAE,KAAK,CAAC,EAAS,EAAC,CACpR,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,EAAP,CAAU,IAAK,UAAU,MAAO,IAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAK,YAAY,MAAO,IAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAK,YAAY,MAAO,IAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAK,cAAc,IAAI,EAAE,EAAE,UAAkD,OAAxC,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAQ,CAAC,EAAE,IAAK,oBAAoB,MAAO,GAAE,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CACnW,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAU,IAAP,KAAS,CAAG,GAAA,EAAE,EAAE,IAAS,IAAL,GAAW,IAAA,EAAE,GAAG,CAAC,EAAS,IAAP,KAAS,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,OAAO,GAAO,IAAJ,GAAO,EAAE,UAAU,QAAQ,cAAc,aAAa,CAAC,EAAE,UAAc,EAAE,MAAN,EAAU,EAAE,UAAU,cAAc,KAAK,MAAM,EAAC,CAAC,EAAE,UAAU,IAAI,CAClT,SAAS,GAAG,EAAE,CAAC,GAAU,EAAE,YAAT,KAAmB,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,iBAAiB,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,iBAAiB,EAAE,GAAG,EAAE,WAAW,EAAE,GAAU,IAAP,KAAS,CAAC,EAAE,EAAE,YAAY,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,cAAc,CAAC,EAAE,GAAG,IAAI,MAAM,MAAO,GAAE,GAAG,CAAC,EAAS,IAAP,MAAU,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,EAAS,KAAP,MAAW,GAAG,EAAE,IAAI,GAAG,MAAa,KAAP,MAAW,GAAG,EAAE,IAAI,GAAG,MAAa,KAAP,MAAW,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC,CACnf,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,YAAY,IAAI,EAAE,UAAU,KAAK,KAAK,GAAG,CAAC,EAAE,EAAG,0BAA0B,EAAG,wBAAwB,EAAE,GAAG,CAC5H,SAAS,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU,KAAK,CAAC,CAAyF,IAAjF,KAAP,MAAW,GAAG,GAAG,CAAC,EAAS,KAAP,MAAW,GAAG,GAAG,CAAC,EAAS,KAAP,MAAW,GAAG,GAAG,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAM,EAAE,EAAE,EAAE,GAAG,OAAO,IAAI,EAAE,GAAG,GAAG,EAAE,YAAY,IAAI,EAAE,UAAU,MAAM,KAAK,EAAE,GAAG,SAAS,EAAE,GAAG,GAAU,EAAE,YAAT,OAAqB,GAAG,CAAC,EAAS,EAAE,YAAT,MAAoB,GAAG,MAAM,CAAC,CAAC,IAAI,GAAG,EAAG,wBAAwB,GAAG,CAAC,EAC7a,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,WAAW,GAAG,WAAW,KAAK,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,WAAW,GAAG,WAAW,KAAK,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC,CACjO,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAU,IAAP,KAAS,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,gBAAgB,OAAO,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAY,IAAP,MAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAyD,GAAhD,IAAP,MAAU,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAS,IAAP,MAAU,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,EAAK,IAAI,EAAE,MAAM,EAAE,CAAC,CAAQ,IAAP,MAAU,EAAE,gBAAgB,CAAC,MAAM,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KACpU,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAyB,GAAxB,GAAG,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAY,IAAP,KAAS,IAAG,EAAE,GAAG,CAAC,EAAS,IAAP,KAAS,EAAE,UAAU,GAAG,EAAE,EAAE,IAAS,IAAL,GAAO,CAAS,GAAR,EAAE,GAAG,CAAC,EAAY,IAAP,KAAS,OAAO,EAAE,EAAE,IAAI,MAAM,GAAO,IAAJ,EAAM,CAAC,GAAG,EAAE,UAAU,QAAQ,cAAc,aAAa,OAAW,EAAE,MAAN,EAAU,EAAE,UAAU,cAAc,KAAK,EAAE,IAAI,MAAM,IAAI,IAAI,EAAE,KAAA,CAAW,MAAL,IAAG,EAAS,IAAI,CAC7S,SAAS,GAAG,EAAE,CAAC,OAAO,EAAP,CAAU,IAAK,SAAS,IAAK,QAAQ,IAAK,QAAQ,IAAK,cAAc,IAAK,OAAO,IAAK,MAAM,IAAK,WAAW,IAAK,WAAW,IAAK,UAAU,IAAK,YAAY,IAAK,OAAO,IAAK,UAAU,IAAK,WAAW,IAAK,QAAQ,IAAK,UAAU,IAAK,UAAU,IAAK,WAAW,IAAK,QAAQ,IAAK,YAAY,IAAK,UAAU,IAAK,QAAQ,IAAK,QAAQ,IAAK,OAAO,IAAK,gBAAgB,IAAK,cAAc,IAAK,YAAY,IAAK,aAAa,IAAK,QAAQ,IAAK,SAAS,IAAK,SAAS,IAAK,SAAS,IAAK,cAAc,IAAK,WAAW,IAAK,aAAa,IAAK,eAAe,IAAK,SAAS,IAAK,kBAAkB,IAAK,YAAY,IAAK,mBAAmB,IAAK,iBAAiB,IAAK,oBAAoB,IAAK,aAAa,IAAK,YAAY,IAAK,cAAc,IAAK,OAAO,IAAK,mBAAmB,IAAK,QAAQ,IAAK,aAAa,IAAK,WAAW,IAAK,SAAS,IAAK,cAAc,MAAO,GAAE,IAAK,OAAO,IAAK,YAAY,IAAK,WAAW,IAAK,YAAY,IAAK,WAAW,IAAK,YAAY,IAAK,WAAW,IAAK,YAAY,IAAK,cAAc,IAAK,aAAa,IAAK,cAAc,IAAK,SAAS,IAAK,SAAS,IAAK,YAAY,IAAK,QAAQ,IAAK,aAAa,IAAK,aAAa,IAAK,eAAe,IAAK,eAAe,MAAO,GACpqC,IAAK,UAAU,OAAO,GAAG,EAAV,CAAa,KAAK,GAAG,MAAO,GAAE,KAAK,GAAG,MAAO,GAAE,KAAK,GAAG,KAAK,GAAG,MAAO,IAAG,KAAK,GAAG,MAAO,WAAU,QAAQ,MAAO,GAAE,CAAC,QAAQ,MAAO,GAAE,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,GAAG,OAAO,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,UAAU,GAAG,GAAG,MAAM,GAAG,YAAY,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,MAAO,IAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,IAAK,EAAC,CAAC,CACxY,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,QAA+E,MAAvE,aAAa,GAAG,EAAE,EAAE,SAAa,IAAJ,GAAY,IAAL,KAAS,EAAE,KAAK,EAAE,EAAO,IAAL,KAAS,EAAE,IAAW,IAAI,GAAQ,IAAL,GAAO,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,CAC5K,SAAS,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAA2G,IAAI,IAAI,IAAlH,MAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,KAAK,cAAc,KAAkB,EAAE,EAAE,eAAe,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,IAAgI,MAA5H,MAAK,oBAA0B,EAAE,kBAAR,KAA4C,CAAC,IAAI,EAAE,YAA1B,EAAE,kBAAqC,GAAG,GAAG,KAAK,qBAAqB,GAAU,IAAI,CAC9E,OAD+E,EAAE,EAAE,UAAU,CAAC,eAAe,UAAU,CAAC,KAAK,iBAAiB,CAAC,EAAE,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,eAAe,EAAE,eAAe,EAAc,OAAO,EAAE,aAArB,YACxd,EAAE,YAAY,CAAC,GAAG,KAAK,mBAAmB,GAAG,EAAE,gBAAgB,UAAU,CAAC,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAc,OAAO,EAAE,cAArB,YAAoC,EAAE,aAAa,CAAC,GAAG,KAAK,qBAAqB,GAAG,EAAE,QAAQ,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC,EAAS,CAAC,CACjR,IAAI,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC,EAAE,iBAAiB,EAAE,UAAU,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,EAAE,QAAQ,EAAE,cAAc,SAAS,EAAE,CAAC,OAAgB,EAAE,gBAAX,IAAK,GAAoB,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,SAAS,EAAE,CAChX,MADoX,cAC3e,EAAS,EAAE,WAAU,IAAI,KAAK,IAAkB,EAAE,OAAhB,aAAsB,GAAG,EAAE,QAAQ,GAAG,QAAQ,GAAG,EAAE,QAAQ,GAAG,SAAS,GAAG,GAAG,EAAE,GAAG,GAAU,GAAE,EAAE,UAAU,SAAS,EAAE,CAAC,MAAM,cAAc,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,EAA+B,GAAG,GAA7B,EAAE,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,CAAU,CAAC,EAAgC,GAAG,GAA9B,EAAE,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAU,CAAC,EAA8D,GAAG,GAA5D,EAAE,CAAC,EAAE,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,cAAc,CAAC,CAAU,CAAC,EAA0G,GAAG,GAAxG,EAAE,CAAC,EAAE,GAAG,CAAC,cAAc,SAAS,EAAE,CAAC,MAAM,kBAAkB,EAAE,EAAE,cAAc,OAAO,aAAa,CAAC,CAAU,CAAC,EAAuB,GAAG,GAArB,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAU,CAAC,EAAE,GAAG,CAAC,IAAI,SACxf,SAAS,IAAI,KAAK,YAAY,GAAG,UAAU,MAAM,aAAa,KAAK,YAAY,IAAI,SAAS,IAAI,KAAK,KAAK,cAAc,KAAK,cAAc,OAAO,aAAa,gBAAgB,cAAc,EAAE,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KACtf,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,UAAU,IAAI,aAAa,IAAI,MAAM,EAAE,GAAG,CAAC,IAAI,SAAS,QAAQ,UAAU,KAAK,UAAU,MAAM,UAAU,EAAE,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,YAAY,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAChS,IACiE,GAAG,GAD7D,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAoB,IAAjB,eAAmB,OAAO,CAAC,CAAC,OAAmB,EAAE,OAAf,YAAqB,EAAE,GAAG,CAAC,EAAO,IAAL,GAAO,QAAQ,OAAO,aAAa,CAAC,GAAe,EAAE,OAAd,WAA8B,EAAE,OAAZ,QAAiB,GAAG,EAAE,UAAU,eAAe,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,SAAS,SAAS,EAAE,CAAC,OAAmB,EAAE,OAAf,WAAoB,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,SAAS,EAAE,CAAC,OAAkB,EAAE,OAAd,WAA8B,EAAE,OAAZ,QAAiB,EAAE,QAAQ,CAAC,EAAE,MAAM,SAAS,EAAE,CAAC,OACve,EAAE,OAD2e,WACte,GAAG,CAAC,EAAc,EAAE,OAAd,WAA8B,EAAE,OAAZ,QAAiB,EAAE,QAAQ,CAAC,CAAC,CAAU,CAAC,EAA+H,GAAG,GAA7H,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,CAAU,CAAC,EAAuH,GAAG,GAArH,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAU,CAAC,EAA6D,GAAG,GAA3D,EAAE,CAAC,EAAE,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,cAAc,CAAC,CAAU,CAAC,EAC3Q,GAAG,GAD6Q,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,SAAS,EAAE,CAAC,MAAM,WAAW,EAAE,EAAE,OAAO,gBAAgB,EAAE,CAAC,EAAE,YAAY,CAAC,EACnf,OAAO,SAAS,EAAE,CAAC,MAAM,WAAW,EAAE,EAAE,OAAO,gBAAgB,EAAE,CAAC,EAAE,YAAY,eAAe,EAAE,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,CAAU,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAI,qBAAqB,OAAO,GAAG,KAAK,GAAI,iBAAiB,WAAW,GAAG,SAAS,cAAc,IAAI,GAAG,GAAI,cAAc,QAAQ,CAAC,GAAG,GAAG,IAAK,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,IAAwB,GAAG,CAAC,EAC3W,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,EAAP,CAAU,IAAK,QAAQ,OAAW,GAAG,QAAQ,EAAE,OAAO,IAAzB,GAA2B,IAAK,UAAU,OAAa,EAAE,UAAR,IAAgB,IAAK,WAAW,IAAK,YAAY,IAAK,WAAW,MAAM,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAY,MAAX,GAAE,EAAE,OAAwB,OAAO,GAAlB,UAAqB,SAAS,EAAE,EAAE,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,EAAP,CAAU,IAAK,iBAAiB,OAAO,GAAG,CAAC,EAAE,IAAK,WAA6C,OAA1B,EAAE,QAAP,IAAyB,GAAG,CAAC,EAAS,IAAlB,KAAqB,IAAK,YAAY,MAAO,GAAE,EAAE,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,QAAQ,OAAO,IAAI,CAAC,CACld,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,OAAyB,IAAnB,kBAAsB,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,KAAK,OAAO,EAAP,CAAU,IAAK,QAAQ,OAAO,KAAK,IAAK,WAAW,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,OAAO,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,OAAO,aAAa,EAAE,KAAK,CAAC,CAAC,OAAO,KAAK,IAAK,iBAAiB,OAAO,IAAW,EAAE,SAAT,KAAgB,KAAK,EAAE,KAAK,QAAQ,OAAO,IAAI,CAAC,CACvY,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,YAAY,EAAE,OAAgB,IAAV,QAAY,CAAC,CAAC,GAAG,EAAE,MAAmB,IAAb,UAAoB,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,WAAW,SAAS,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,KAAK,GAAG,KAAK,SAAS,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAa,GAAG,GAAT,GAAG,CAAS,CAAC,EAAE,OAAO,CAAC,CACpe,SAAS,GAAG,EAAE,EAAE,CAAC,GAAc,IAAX,SAAa,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,EAAG,CAAC,IAAI,GAAG,GAAG,EAAG,CAAC,IAAI,GAAG,YAAY,SAAS,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,cAAc,KAAK,EAAE,GAAG,aAAa,UAAU,SAAS,EAAE,GAAgB,OAAO,GAAG,SAAvB,UAA8B,CAAC,GAAG,EAAE,KAAM,IAAG,CAAC,EAAE,GAAG,KAAK,CAAC,SAAS,cAAc,EAAE,SAAS,aAAa,CAAC,SAAS,IAAI,CAAC,KAAK,GAAG,YAAY,mBAAmB,EAAE,EAAE,GAAG,GAAG,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,GAAa,EAAE,eAAZ,SAA0B,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAC/b,SAAS,GAAG,EAAE,EAAE,EAAE,CAAa,IAAZ,WAAe,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,YAAY,mBAAmB,EAAE,GAAgB,IAAb,YAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,GAAuB,IAApB,mBAAiC,IAAV,SAAyB,IAAZ,UAAc,OAAO,GAAG,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,GAAa,IAAV,QAAY,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,GAAa,IAAV,SAAwB,IAAX,SAAa,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,IAAI,IAAQ,IAAJ,GAAO,EAAE,GAAI,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,GAAgB,OAAO,OAAO,IAA3B,WAA8B,OAAO,GAAG,GACtZ,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,GAAc,OAAO,GAAlB,WAA4B,GAAc,OAAO,GAAlB,WAA4B,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,CAAC,EAAE,EAAE,OAAO,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,CAAC,EAAG,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,KAAK,GAAG,EAAE,YAAY,EAAE,EAAE,WAAW,OAAO,CAAC,CACtU,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,GAAG,CAAC,GAAO,EAAE,WAAN,EAAe,CAA0B,GAAzB,EAAE,EAAE,EAAE,YAAY,OAAU,GAAG,GAAG,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,EAAE,YAAY,MAAM,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,IAAK,EAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,GAAO,EAAE,WAAN,EAAe,CAAC,EAAE,GAAO,EAAE,WAAN,EAAe,GAAG,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,wBAAwB,CAAC,EAAE,EAAE,wBAAwB,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAC9Z,SAAS,IAAI,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,mBAAmB,CAAC,GAAG,CAAC,IAAI,EAAa,OAAO,EAAE,cAAc,SAAS,MAA3C,QAA+C,MAAS,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,mBAAmB,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,YAAY,EAAE,OAAO,IAAc,IAAV,UAAuB,EAAE,OAAX,QAA4B,EAAE,OAAb,UAA2B,EAAE,OAAV,OAAwB,EAAE,OAAV,OAA6B,EAAE,OAAf,aAAmC,IAAb,YAAyB,EAAE,kBAAX,OAA2B,CACxa,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,eAAe,GAAG,IAAI,GAAG,GAAG,EAAE,eAAe,GAAG,EAAE,cAAc,gBAAgB,CAAC,EAAE,CAAC,GAAU,IAAP,MAAU,GAAG,CAAC,EAAE,CAAG,GAAA,EAAE,EAAE,MAAM,EAAE,EAAE,IAAa,IAAT,IAAK,KAAQ,EAAE,GAAG,mBAAmB,EAAE,EAAE,eAAe,EAAE,EAAE,aAAa,KAAK,IAAI,EAAE,EAAE,MAAM,MAAM,OAAO,GAAG,GAAG,EAAE,EAAE,eAAe,WAAW,EAAE,aAAa,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,YAAY,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,CAAC,EAAE,EAAW,EAAE,MAAX,IAAK,GAAU,EAAE,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EACvf,CAAC,EAAE,GAAG,IAAQ,EAAE,aAAN,GAAkB,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,GAAG,EAAM,IAAL,EAAE,CAAC,EAAM,EAAE,EAAE,EAAE,EAAE,YAAgB,EAAE,WAAN,GAAgB,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,IAAI,EAAE,SAAS,CAAC,EAAyC,IAA1B,OAAO,EAAE,OAAtB,YAA6B,EAAE,MAAM,EAAM,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,WAAW,EAAE,KAAK,EAAE,QAAQ,UAAU,EAAE,GAAG,CAAC,CACzf,IAAI,GAAG,GAAI,iBAAiB,UAAU,IAAI,SAAS,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,EAC5F,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,SAAa,EAAE,WAAN,EAAe,EAAE,EAAE,cAAc,IAAU,IAAN,MAAU,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,mBAAmB,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,eAAe,IAAI,EAAE,YAAY,GAAG,GAAG,EAAE,eAAe,EAAE,cAAc,aAAa,OAAA,CAAQ,aAAa,EAAE,EAAE,CAAC,WAAW,EAAE,WAAW,aAAa,EAAE,aAAa,UAAU,EAAE,UAAU,YAAY,EAAE,WAAW,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,GAAG,GAAG,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,WAAW,SAAS,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,OAAO,KAAK,CACtf,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAiF,MAA/E,GAAE,EAAE,YAAY,GAAG,EAAE,YAAY,EAAE,EAAE,SAAS,GAAG,SAAS,EAAE,EAAE,MAAM,GAAG,MAAM,EAAS,CAAC,CAAC,IAAI,GAAG,CAAC,aAAa,GAAG,YAAY,cAAc,EAAE,mBAAmB,GAAG,YAAY,oBAAoB,EAAE,eAAe,GAAG,YAAY,gBAAgB,EAAE,cAAc,GAAG,aAAa,eAAe,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EACxU,IAAK,GAAG,SAAS,cAAc,KAAK,CAAC,CAAC,MAAM,mBAAmB,SAAS,OAAO,GAAG,aAAa,UAAU,OAAO,GAAG,mBAAmB,UAAU,OAAO,GAAG,eAAe,WAAW,oBAAoB,QAAQ,OAAO,GAAG,cAAc,YAAY,SAAS,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,IAAI,KAAK,EAAE,GAAG,EAAE,eAAe,CAAC,GAAG,KAAK,GAAG,MAAO,IAAG,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,IAAI,GAAG,GAAG,cAAc,EAAE,GAAG,GAAG,oBAAoB,EAAE,GAAG,GAAG,gBAAgB,EAAE,GAAG,GAAG,eAAe,EAAE,GAAG,IAAI,IAAI,GAAG,smBAAsmB,MAAM,GAAG,EAClmC,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,GAAG,GAAG,OAAO,KAAK,CAAC,IAAI,GAAG,GAAG,IAA2D,GAApD,GAAG,YAAqD,EAAE,MAAtC,GAAG,EAAE,CAAC,YAAY,EAAE,GAAG,MAAM,CAAC,EAAe,CAAC,CAAC,GAAG,GAAG,gBAAgB,EAAE,GAAG,GAAG,sBAAsB,EAAE,GAAG,GAAG,kBAAkB,EAAE,GAAG,WAAW,eAAe,EAAE,GAAG,UAAU,SAAS,EAAE,GAAG,WAAW,QAAQ,EAAE,GAAG,GAAG,iBAAiB,EAAE,EAAG,eAAe,CAAC,WAAW,WAAW,CAAC,EAAE,EAAG,eAAe,CAAC,WAAW,WAAW,CAAC,EAAE,EAAG,iBAAiB,CAAC,aAAa,aAAa,CAAC,EAC3d,EAAG,iBAAiB,CAAC,aAAa,aAAa,CAAC,EAAE,EAAG,WAAW,oEAAoE,MAAM,GAAG,CAAC,EAAE,EAAG,WAAW,uFAAuF,MAAM,GAAG,CAAC,EAAE,EAAG,gBAAgB,CAAC,iBAAiB,WAAW,YAAY,OAAO,CAAC,EAAE,EAAG,mBAAmB,2DAA2D,MAAM,GAAG,CAAC,EAAE,EAAG,qBAAqB,6DAA6D,MAAM,GAAG,CAAC,EACngB,EAAG,sBAAsB,8DAA8D,MAAM,GAAG,CAAC,EAAE,IAAI,GAAG,6NAA6N,MAAM,GAAG,EAAE,GAAG,IAAI,IAAI,0CAA0C,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAC5Z,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,gBAAgB,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,IAAK,GAAE,CAAC,EAAE,EAAE,cAAc,IAAI,CACxG,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,GAAK,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,IAAI,EAAE,IAAK,GAAE,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,cAA2B,GAAb,EAAE,EAAE,SAAY,IAAI,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAoD,GAAnD,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,cAAc,EAAE,EAAE,SAAY,IAAI,GAAG,EAAE,qBAAqB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAM,GAAE,GAAG,GAAG,CAAC,EAAE,GAAG,KAAK,CAAE,CAC5a,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,IAAa,IAAT,IAAK,KAAQ,EAAE,EAAE,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,kBAAkB,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAG,QAAQ,SAAS,EAAE,CAAqB,IAApB,oBAAwB,GAAG,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAM,EAAE,WAAN,EAAe,EAAE,EAAE,cAAqB,IAAP,MAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CACjb,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,EAAX,CAAc,IAAK,GAAE,IAAI,EAAE,GAAG,MAAM,IAAK,GAAE,EAAE,GAAG,MAAM,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,IAAK,GAAE,CAAC,IAAmB,IAAf,cAAgC,IAAd,aAA2B,IAAV,UAAc,EAAE,CAAC,GAAG,EAAW,IAAT,IAAK,GAAqD,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC,EAAxE,EAAE,iBAAiB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAsC,IAAT,IAAK,GAA0C,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC,EAA7D,EAAE,iBAAiB,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAA4B,CAClV,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAK,EAAE,IAAI,EAAK,EAAE,IAAW,IAAP,KAAS,EAAE,OAAO,CAAC,GAAU,IAAP,KAAS,OAAO,IAAI,EAAE,EAAE,IAAI,GAAO,IAAJ,GAAW,IAAJ,EAAM,CAAC,IAAI,EAAE,EAAE,UAAU,cAAc,GAAG,IAAI,GAAO,EAAE,WAAN,GAAgB,EAAE,aAAa,EAAE,MAAM,GAAO,IAAJ,EAAM,IAAI,EAAE,EAAE,OAAc,IAAP,MAAU,CAAC,IAAI,EAAE,EAAE,IAAI,IAAO,IAAJ,GAAW,IAAJ,KAAS,EAAE,EAAE,UAAU,cAAc,IAAI,GAAO,EAAE,WAAN,GAAgB,EAAE,aAAa,GAAE,OAAO,EAAE,EAAE,MAAM,CAAC,KAAY,IAAP,MAAU,CAAS,GAAR,EAAE,GAAG,CAAC,EAAY,IAAP,KAAS,OAAe,GAAR,EAAE,EAAE,IAAW,IAAJ,GAAW,IAAJ,EAAM,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,EACrf,EAAE,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,GAAY,IAAT,IAAK,GAAM,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,EAAP,CAAU,IAAK,WAAW,GAAO,GAAG,CAAC,IAAR,EAAU,MAAM,EAAE,IAAK,UAAU,IAAK,QAAQ,EAAE,GAAG,MAAM,IAAK,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAK,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,IAAK,aAAa,IAAK,YAAY,EAAE,GAAG,MAAM,IAAK,QAAQ,GAAO,EAAE,SAAN,EAAa,MAAM,EAAE,IAAK,WAAW,IAAK,WAAW,IAAK,YAAY,IAAK,YAAY,IAAK,UAAU,IAAK,WAAW,IAAK,YAAY,IAAK,cAAc,EAAE,GAAG,MAAM,IAAK,OAAO,IAAK,UAAU,IAAK,YAAY,IAAK,WAAW,IAAK,YAAY,IAAK,WAAW,IAAK,YAAY,IAAK,OAAO,EAC1iB,GAAG,MAAM,IAAK,cAAc,IAAK,WAAW,IAAK,YAAY,IAAK,aAAa,EAAE,GAAG,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,GAAG,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,IAAK,SAAS,EAAE,GAAG,MAAM,IAAK,QAAQ,EAAE,GAAG,MAAM,IAAK,OAAO,IAAK,MAAM,IAAK,QAAQ,EAAE,GAAG,MAAM,IAAK,oBAAoB,IAAK,qBAAqB,IAAK,gBAAgB,IAAK,cAAc,IAAK,cAAc,IAAK,aAAa,IAAK,cAAc,IAAK,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE,GAAK,EAAE,GAAG,EAAE,CAAC,GAAc,IAAX,SAAa,EAAE,EAAS,IAAP,KAAqB,KAAZ,EAAE,UAAe,EAAE,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,EAC7e,IAD+e,MAC5e,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,UAAsF,GAAxE,EAAE,MAAN,GAAkB,IAAP,OAAW,EAAE,EAAS,IAAP,OAAW,EAAE,GAAG,EAAE,CAAC,EAAQ,GAAN,MAAS,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC,CAAC,IAAO,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAK,EAAE,GAAG,CAAC,EAAE,CAAyE,GAAxE,EAAgB,IAAd,aAAiC,IAAhB,cAAkB,EAAe,IAAb,YAA+B,IAAf,aAAoB,GAAG,IAAI,KAAK,EAAE,EAAE,eAAe,EAAE,eAAe,GAAG,CAAC,GAAG,EAAE,KAAK,MAAM,EAAE,IAAG,GAAG,KAAG,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,OAAU,GAAM,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,KAC1e,IAD+e,OAC3e,EAAE,GAAG,CAAC,EAAE,IAAI,GAAO,EAAE,MAAN,GAAe,EAAE,MAAN,KAAW,EAAE,QAAU,EAAE,KAAK,EAAE,GAAK,IAAI,GAAE,CAAgU,GAA/T,EAAE,GAAG,EAAE,eAAe,EAAE,eAAe,EAAE,SAA0B,IAAf,cAAkC,IAAhB,iBAAkB,EAAE,GAAG,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAU,EAAQ,GAAN,KAAQ,EAAE,GAAG,CAAC,EAAE,EAAQ,GAAN,KAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,EAAE,KAAK,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,EAAK,GAAG,EAAE,EAAE,CAAa,IAAZ,EAAE,EAAE,EAAE,EAAE,EAAE,EAAM,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,IAAQ,IAAJ,EAAE,EAAM,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,KAAK,EAAE,EAAE,GAAG,EACpf,GAAG,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,GAAG,IAAI,GAAU,IAAP,MAAU,IAAI,EAAE,UAAU,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,KAAM,GAAE,KAAY,IAAP,MAAU,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAS,IAAP,MAAiB,IAAP,MAAU,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAyD,GAAxD,EAAE,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,SAAS,YAAY,EAAgB,IAAX,UAAwB,IAAV,SAAsB,EAAE,OAAX,OAAgB,IAAI,EAAG,QAAQ,GAAG,GAAG,CAAC,EAAE,IAAG,GAAG,EAAG,OAAO,CAAC,EAAG,GAAG,IAAI,EAAG,EAAE,OAAM,EAAE,EAAE,WAAqB,EAAE,YAAY,IAAxB,UAAyC,EAAE,OAAf,YAA+B,EAAE,OAAZ,WAAoB,EAAG,IAAI,GAAG,AAAK,IAAG,EAAG,EAAE,CAAC,EAAG,CAAC,GAAG,EAAE,EAAG,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAI,EAAG,EAAE,EAAE,CAAC,EAAe,IAAb,aAAiB,EAAG,EAAE,gBAClf,EAAG,YAAuB,EAAE,OAAb,UAAmB,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAmB,OAAlB,EAAG,EAAE,GAAG,CAAC,EAAE,OAAc,EAAP,CAAU,IAAK,WAAa,GAAG,CAAE,GAAY,EAAG,kBAAZ,UAA4B,GAAG,EAAG,GAAG,EAAE,GAAG,MAAK,MAAM,IAAK,WAAW,GAAG,GAAG,GAAG,KAAK,MAAM,IAAK,YAAY,GAAG,CAAC,EAAE,MAAM,IAAK,cAAc,IAAK,UAAU,IAAK,UAAU,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,IAAK,kBAAkB,GAAG,GAAG,MAAM,IAAK,UAAU,IAAK,QAAQ,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAG,GAAG,GAAG,EAAE,CAAC,OAAO,EAAP,CAAU,IAAK,mBAAmB,IAAI,EAAG,qBAAqB,MAAM,EAAE,IAAK,iBAAiB,EAAG,mBACpe,MAAM,EAAE,IAAK,oBAAoB,EAAG,sBAAsB,MAAM,CAAC,CAAC,EAAG,IAAK,EAAC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,EAAG,oBAAgC,IAAZ,WAAqB,EAAE,UAAR,MAAkB,EAAG,sBAAsB,IAAK,IAAW,EAAE,SAAT,OAAkB,IAA2B,IAAvB,qBAA+C,IAArB,oBAAyB,KAAK,EAAG,GAAG,IAAI,GAAG,EAAE,GAAG,UAAU,GAAG,GAAG,MAAM,GAAG,YAAY,GAAG,CAAC,IAAI,EAAG,GAAG,EAAE,CAAE,EAAE,EAAE,EAAG,SAAS,EAAG,IAAI,GAAG,EAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAG,UAAU,CAAE,CAAC,EAAE,EAAG,EAAG,KAAK,GAAI,EAAG,GAAG,CAAC,EAAS,IAAP,OAAY,EAAG,KAAK,OAAU,EAAG,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAE,EAAE,GAAG,EAAE,eAAe,EAC1f,EAAE,EAAE,SAAS,EAAE,IAAI,GAAG,gBAAgB,cAAc,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,EAAS,IAAP,MAAU,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,UAAc,EAAE,MAAN,GAAkB,IAAP,OAAW,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAQ,GAAN,MAAS,EAAE,QAAQ,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAQ,GAAN,MAAS,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,GAAU,IAAP,KAAS,OAAO,KAAK,EAAG,GAAE,EAAE,aAAa,GAAO,EAAE,MAAN,GAAW,OAAO,GAAI,IAAI,CACnd,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,EAAS,IAAP,MAAU,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,UAAU,GAAU,IAAP,MAAU,IAAI,EAAE,MAAU,EAAE,MAAN,GAAkB,IAAP,OAAW,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAQ,GAAN,MAAS,EAAE,QAAQ,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,EAAQ,GAAN,MAAS,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,CAAK,EAAE,SAAN,GAAc,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,GAAG,iBAAiB,SAAS,GAAG,EAAE,CAAC,OAAkB,OAAO,GAAlB,SAAoB,EAAE,GAAG,EAAA,CAAG,QAAQ,GAAG;CAAI,CAAC,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAS,GAAR,EAAE,GAAG,CAAC,EAAK,GAAG,CAAC,IAAI,GAAG,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CAAC,SAAS,IAAI,CAAC,CAC9e,IAAI,GAAG,KAAK,GAAG,KAAK,SAAS,GAAG,EAAE,EAAE,CAAC,OAAmB,IAAb,YAA6B,IAAb,YAA2B,OAAO,EAAE,UAApB,UAAyC,OAAO,EAAE,UAApB,UAAyC,OAAO,EAAE,yBAApB,UAAoD,EAAE,0BAAT,MAAwC,EAAE,wBAAwB,QAAhC,IAAsC,CAC5P,IAAI,GAAgB,OAAO,YAApB,WAA+B,WAAW,IAAK,GAAE,GAAgB,OAAO,cAApB,WAAiC,aAAa,IAAK,GAAE,GAAgB,OAAO,SAApB,WAA4B,QAAQ,IAAK,GAAE,GAAgB,OAAO,gBAApB,WAAmC,eAAoC,KAArB,OAA+E,GAAvD,SAAS,EAAE,CAAC,OAAO,GAAG,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAK,SAAS,GAAG,EAAE,CAAC,WAAW,UAAU,CAAC,MAAM,CAAE,CAAC,CAAC,CACpV,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,YAA6B,GAAjB,EAAE,YAAY,CAAC,EAAK,GAAO,EAAE,WAAN,EAAe,IAAG,EAAE,EAAE,KAAY,IAAP,KAAS,CAAC,GAAO,IAAJ,EAAM,CAAC,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,MAAW,IAAN,KAAgB,IAAP,MAAiB,IAAP,MAAU,GAAA,CAAI,EAAE,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,KAAW,GAAN,KAAQ,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE,EAAE,SAAS,GAAO,IAAJ,GAAW,IAAJ,EAAM,MAAM,GAAO,IAAJ,EAAM,CAAU,GAAT,EAAE,EAAE,KAAc,IAAN,KAAgB,IAAP,MAAiB,IAAP,KAAS,MAAM,GAAU,IAAP,KAAS,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,CACjY,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,gBAAgB,IAAI,IAAI,EAAE,EAAE,GAAG,CAAC,GAAO,EAAE,WAAN,EAAe,CAAC,IAAI,EAAE,EAAE,KAAK,GAAS,IAAN,KAAgB,IAAP,MAAiB,IAAP,KAAS,CAAC,GAAO,IAAJ,EAAM,OAAO,EAAE,GAAG,MAAY,IAAP,MAAU,GAAG,CAAC,EAAE,EAAE,eAAe,CAAC,OAAO,IAAI,CAAC,IAAI,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,gBAAgB,GAAG,GAAG,gBAAgB,GAAG,GAAG,oBAAoB,GAAG,GAAG,iBAAiB,GAAG,GAAG,oBAAoB,GAAG,GAAG,kBAAkB,GAClX,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,WAAW,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAe,GAAd,EAAE,EAAE,UAAoB,EAAE,QAAT,MAAuB,IAAP,MAAiB,EAAE,QAAT,KAAe,IAAI,EAAE,GAAG,CAAC,EAAS,IAAP,MAAU,CAAC,GAAG,EAAE,EAAE,IAAI,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,SAAS,GAAG,EAAE,CAAgB,MAAf,GAAE,EAAE,KAAK,EAAE,IAAU,CAAC,GAAO,EAAE,MAAN,GAAe,EAAE,MAAN,GAAgB,EAAE,MAAP,IAAgB,EAAE,MAAN,EAAU,KAAK,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,GAAO,EAAE,MAAN,GAAe,EAAE,MAAN,EAAU,OAAO,EAAE,UAAU,MAAM,MAAM,EAAE,EAAE,CAAC,CAAE,CAAC,SAAS,GAAG,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CACve,SAAS,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,KAAK,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,GAAE,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,aAAa,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,EAAE,UAAU,GAAG,GAAG,EAAE,8CAA8C,EAAE,OAAO,EAAE,0CAA0C,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,KAAK,EAAE,EAAE,GAAG,EAAE,GAAoH,OAAjH,IAAI,EAAE,EAAE,UAAU,EAAE,4CAA4C,EAAE,EAAE,0CAA0C,GAAU,CAAC,CAC9d,SAAS,GAAG,EAAE,CAAuB,MAAtB,GAAE,EAAE,kBAAgC,GAAP,IAAoB,CAAC,SAAS,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,GAAE,UAAU,GAAG,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UAAgC,GAAtB,EAAE,EAAE,kBAAkC,OAAO,EAAE,iBAAtB,WAAsC,OAAO,EAAwB,IAAI,IAAI,IAA9B,GAAE,EAAE,gBAAgB,EAAe,EAAE,GAAG,EAAE,KAAK,GAAG,MAAM,MAAM,EAAE,IAAI,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CACxX,SAAS,GAAG,EAAE,CAAyG,MAAxG,IAAG,EAAE,EAAE,YAAY,EAAE,2CAA2C,GAAG,GAAG,GAAE,QAAQ,EAAE,GAAE,CAAC,EAAE,EAAE,GAAG,GAAG,OAAO,EAAQ,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,0CAA0C,EAAE,EAAE,EAAE,EAAE,EAAE,EAAC,EAAE,EAAE,GAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,GAAG,EAAE,CAAQ,KAAP,KAAU,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAC3X,SAAS,IAAI,CAAC,GAAG,CAAC,IAAW,KAAP,KAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAG,GAAE,EAAE,CAAC,CAAC,QAAe,IAAP,KAAS,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,MAAa,KAAP,OAAY,GAAG,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,CAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,GAAG,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,CACjV,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,EAAA,CAAG,SAAS,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,KAAM,IAAG,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,SAAS,GAAG,EAAE,CAAQ,EAAE,SAAT,OAAkB,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,GAAG,KACje,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,KAAK,CAAC,EAAE,EAAE,YAAY,UAAU,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAiB,IAAP,MAAU,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,OAAO,IAAI,EAAE,KAAK,CAAC,CAAC,CACxJ,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,IAAI,EAAE,EAAE,KAAyE,MAApE,GAAM,EAAE,WAAN,GAAgB,EAAE,YAAY,IAAI,EAAE,SAAS,YAAY,EAAE,KAAK,EAAgB,IAAP,OAAU,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,CAAC,GAAM,IAAK,GAAE,MAAO,GAAO,EAAE,eAAP,IAAyB,EAAE,WAAN,EAAe,KAAK,EAAS,IAAP,OAAU,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,GAAM,IAAK,IAAG,MAAO,GAAM,EAAE,WAAN,EAAoB,EAAL,KAAc,IAAP,OAAU,EAAS,KAAP,KAA8B,KAApB,CAAC,GAAG,GAAG,SAAS,EAAE,EAAO,EAAE,cAAc,CAAC,WAAW,EAAE,YAAY,EAAE,UAAU,UAAU,EAAE,EAAE,GAAG,GAAG,KAAK,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAClf,KAAK,CAAC,GAAM,QAAQ,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,MAAO,GAAK,EAAE,KAAK,IAAI,EAAK,EAAE,MAAM,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,OAAc,IAAP,MAAc,EAAE,MAAN,GAAe,EAAE,MAAN,GAAgB,EAAE,MAAP,IAAY,EAAE,EAAE,OAAO,GAAG,CAAC,CACha,SAAS,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAkG,IAA/F,EAAM,EAAE,MAAN,IAAY,EAAE,EAAM,EAAE,MAAN,KAAa,EAAE,EAAE,KAAK,EAAW,IAAT,QAAqB,IAAT,QAAY,CAAC,GAAG,EAAE,KAAK,EAAE,aAAa,GAAM,AAAI,IAAE,GAAI,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,CAAC,CAAO,GAAN,GAAG,CAAC,EAAU,EAAE,MAAP,GAAW,CAAgD,GAA/C,EAAE,EAAE,cAAc,EAAS,IAAP,KAAsB,KAAb,EAAE,WAAmB,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,CAAiB,IAAhB,EAAE,EAAE,YAAgB,EAAE,EAAE,GAAG,CAAC,GAAO,EAAE,WAAN,EAAe,CAAC,IAAI,EAAE,EAAE,KAAK,GAAU,IAAP,KAAS,CAAC,GAAO,IAAJ,EAAM,CAAC,GAAG,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,GAAG,MAAW,IAAN,KAAgB,IAAP,MAAiB,IAAP,MAAU,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,GACjgB,IAAI,CAAC,KAAM,IAAG,GAAG,GAAG,EAAE,UAAU,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,SAAS,IAAI,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAQ,KAAP,KAAU,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAG,wBAChM,SAAS,GAAG,EAAE,EAAE,EAAE,CAAS,GAAR,EAAE,EAAE,IAAc,IAAP,MAAuB,OAAO,GAApB,YAAkC,OAAO,GAAlB,SAAoB,CAAC,GAAG,EAAE,OAAO,CAAY,GAAX,EAAE,EAAE,OAAU,EAAE,CAAC,GAAO,EAAE,MAAN,EAAU,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAiK,OAArJ,IAAP,MAAiB,EAAE,MAAT,MAA2B,OAAO,EAAE,KAAtB,YAA2B,EAAE,IAAI,aAAa,EAAS,EAAE,KAAI,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,KAAY,IAAP,KAAS,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,WAAW,EAAS,EAAC,CAAC,GAAc,OAAO,GAAlB,SAAoB,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,MAAM,MAAM,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAC/c,SAAS,GAAG,EAAE,EAAE,CAAqC,KAApC,GAAE,OAAO,UAAU,SAAS,KAAK,CAAC,EAAQ,MAAM,EAAE,GAAuB,IAApB,kBAAsB,qBAAqB,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,OAAO,EAAE,EAAE,QAAQ,CAAC,CACrM,SAAS,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,UAAiB,IAAP,MAAU,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,OAAO,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,KAAY,IAAP,MAAU,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,IAAW,IAAP,MAAiB,EAAE,MAAT,KAA4B,EAAE,IAAI,EAAE,MAAM,CAAC,EAA9B,EAAE,IAAI,EAAE,IAAI,CAAC,EAAmB,EAAE,EAAE,QAAQ,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,CAAoC,MAAnC,GAAE,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,KAAY,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,CAAsH,MAArH,GAAE,MAAM,EAAM,GAA4B,EAAE,EAAE,UAAoB,IAAP,MAA+C,EAAE,OAAO,EAAS,IAAjD,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,KAAjF,EAAE,OAAO,QAAQ,EAAqF,CAAC,SAAS,EAAE,EAAE,CAC3d,OAD4d,GACtf,EAAE,YAAT,OAAqB,EAAE,OAAO,GAAU,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,CAAiF,OAAtE,IAAP,MAAc,EAAE,MAAN,GAAiB,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,IAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAS,EAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,KAA8Q,OAAtQ,IAAI,EAAU,EAAE,EAAE,EAAE,EAAE,MAAM,SAAS,EAAE,EAAE,GAAG,EAAY,IAAP,OAAW,EAAE,cAAc,GAAc,OAAO,GAAlB,UAA4B,GAAG,EAAE,WAAW,IAAI,GAAG,CAAC,IAAI,EAAE,OAAa,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAS,EAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,CAC5T,OADuU,IAAP,MAAc,EAAE,MAAN,GAC3e,EAAE,UAAU,gBAAgB,EAAE,eAAe,EAAE,UAAU,iBAAiB,EAAE,gBAAsB,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,IAAE,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,OAAO,EAAS,EAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAmF,OAAxE,IAAP,MAAc,EAAE,MAAN,GAAiB,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAS,EAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,GAAc,OAAO,GAAlB,UAA0B,IAAL,IAAmB,OAAO,GAAlB,SAAoB,MAAO,GAAE,GAAG,GAAG,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,GAAc,OAAO,GAAlB,UAA4B,EAAE,CAAC,OAAO,EAAE,SAAT,CAAmB,KAAK,EAAG,MAAO,GAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,EAAE,KAAK,CAAC,EACpf,EAAE,IAAI,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAG,MAAO,GAAE,GAAG,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,GAAG,IAAI,EAAE,EAAE,MAAM,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,EAAG,CAAC,GAAG,GAAG,CAAC,EAAE,MAAO,GAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAS,IAAP,KAAe,KAAN,EAAE,IAAS,GAAc,OAAO,GAAlB,UAA0B,IAAL,IAAmB,OAAO,GAAlB,SAAoB,OAAc,IAAP,KAAc,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAjB,KAAmB,GAAc,OAAO,GAAlB,UAA4B,EAAE,CAAC,OAAO,EAAE,SAAT,CAAmB,KAAK,EAAG,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,EAAG,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,GAAG,MAAO,GAAE,EAAE,MAAM,EAAE,EACpf,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,EAAG,CAAC,GAAG,GAAG,CAAC,EAAE,OAAc,IAAP,KAAc,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAnB,KAAqB,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAc,OAAO,GAAlB,UAA0B,IAAL,IAAmB,OAAO,GAAlB,SAAoB,MAAO,GAAE,EAAE,IAAI,CAAC,GAAG,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAc,OAAO,GAAlB,UAA4B,EAAE,CAAC,OAAO,EAAE,SAAT,CAAmB,KAAK,EAAG,MAAO,GAAE,EAAE,IAAW,EAAE,MAAT,KAAa,EAAE,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAG,MAAO,GAAE,EAAE,IAAW,EAAE,MAAT,KAAa,EAAE,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,EAAE,MAAM,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,EAAG,CAAC,GAAG,GAAG,CAAC,EAAE,MAAO,GAAE,EAAE,IAAI,CAAC,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAC9f,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAY,IAAP,MAAU,EAAE,EAAE,OAAO,IAAI,CAAC,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,GAAU,IAAP,KAAS,CAAQ,IAAP,OAAW,EAAE,GAAG,KAAK,CAAC,GAAG,GAAU,EAAE,YAAT,MAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAS,IAAP,KAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,OAAO,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,GAAU,IAAP,KAAS,CAAC,KAAK,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAS,IAAP,OAAW,EAAE,EAAE,EAAE,EAAE,CAAC,EAAS,IAAP,KAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAc,OAAX,GAAG,GAAG,EAAE,CAAC,EAAS,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAS,IAAP,OAAW,GAAU,EAAE,YAAT,MAAoB,EAAE,OAChf,EAAE,MADqf,KACjf,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAS,IAAP,KAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAuD,OAApD,GAAG,EAAE,QAAQ,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,EAAS,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAgB,OAAO,GAApB,WAAsB,MAAM,MAAM,EAAE,GAAG,CAAC,EAAc,GAAZ,EAAE,EAAE,KAAK,CAAC,EAAW,GAAN,KAAQ,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAS,IAAP,MAAU,CAAC,EAAE,KAAK,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,GAAU,IAAP,KAAS,CAAQ,IAAP,OAAW,EAAE,GAAG,KAAK,CAAC,GAAG,GAAU,EAAE,YAAT,MAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAS,IAAP,KAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,OAAO,EAAE,EACzf,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,GAAU,IAAP,KAAS,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAS,IAAP,OAAW,EAAE,EAAE,EAAE,EAAE,CAAC,EAAS,IAAP,KAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAc,OAAX,GAAG,GAAG,EAAE,CAAC,EAAS,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAS,IAAP,OAAW,GAAU,EAAE,YAAT,MAAoB,EAAE,OAAc,EAAE,MAAT,KAAa,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAS,IAAP,KAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAuD,OAApD,GAAG,EAAE,QAAQ,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,EAAS,CAAC,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,CAAgF,GAApE,OAAO,GAAlB,UAA4B,GAAG,EAAE,OAAO,GAAW,EAAE,MAAT,OAAe,EAAE,EAAE,MAAM,UAAwB,OAAO,GAAlB,UAA4B,EAAE,CAAC,OAAO,EAAE,SAAT,CAAmB,KAAK,EAAG,EAAE,CAAC,IAAI,IAAI,EAC7hB,EAAE,IAAI,EAAE,EAAS,IAAP,MAAU,CAAC,GAAG,EAAE,MAAM,EAAE,CAAU,GAAT,EAAE,EAAE,KAAQ,IAAI,EAAO,IAAI,EAAE,MAAN,EAAU,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,GAAG,EAAE,cAAc,GAAc,OAAO,GAAlB,UAA4B,GAAG,EAAE,WAAW,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,GAAI,EAAE,GAAG,EAAE,MAAM,SAAS,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAG,EAAE,CAAC,IAAI,EAAE,EAAE,IACrf,IADyf,MACtf,CAAC,GAAG,EAAE,MAAM,EAAE,IAAO,EAAE,MAAN,GAAW,EAAE,UAAU,gBAAgB,EAAE,eAAe,EAAE,UAAU,iBAAiB,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAM,EAAE,EAAE,CAAC,EAAE,KAAK,CAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,GAAG,MAAO,GAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,EAAG,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAiB,OAAO,GAAlB,UAA0B,IAAL,IAAmB,OAAO,GAAlB,UAAqB,EAAE,GAAG,EAAS,IAAP,MAAc,EAAE,MAAN,GAAW,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,IACnf,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,KAAY,IAAP,MAAU,CAAC,IAAI,EAAE,EAAE,UAA+H,IAApH,EAAE,WAAW,KAAK,EAAuD,IAAP,OAAW,EAAE,WAAW,KAAK,IAAI,EAAE,YAAY,IAA5F,EAAE,YAAY,EAAS,IAAP,OAAW,EAAE,YAAY,IAAyD,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CACnZ,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE,aAAoB,IAAP,MAAiB,EAAE,eAAT,QAA6B,EAAE,MAAM,KAAb,IAAkB,GAAG,CAAC,GAAG,EAAE,aAAa,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,cAAc,GAAG,KAAK,EAAE,IAAG,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,IAAI,EAAS,KAAP,KAAU,CAAC,GAAU,KAAP,KAAU,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,KAAM,IAAG,GAAG,KAAK,CAAA,CAAE,OAAO,CAAC,CAAC,IAAI,GAAG,KAAK,SAAS,GAAG,EAAE,CAAQ,KAAP,KAAU,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CACvY,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,YAA+E,OAA5D,IAAP,MAAU,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,YAAY,EAAS,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,UAAqC,IAApB,IAAP,OAAW,EAAE,OAAO,GAAG,EAAE,EAAM,EAAE,EAAE,OAAc,IAAP,MAAU,EAAE,YAAY,EAAE,EAAE,EAAE,UAAiB,IAAP,OAAW,EAAE,YAAY,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,OAAW,EAAE,MAAN,EAAU,EAAE,UAAU,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC,EAAE,YAAY,CAAC,UAAU,EAAE,cAAc,gBAAgB,KAAK,eAAe,KAAK,OAAO,CAAC,QAAQ,KAAK,YAAY,KAAK,MAAM,CAAC,EAAE,QAAQ,IAAI,CAAC,CAC/e,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,cAAc,IAAI,EAAE,YAAY,CAAC,UAAU,EAAE,UAAU,gBAAgB,EAAE,gBAAgB,eAAe,EAAE,eAAe,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,EAAE,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC,CACtR,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,YAAY,GAAU,IAAP,KAAS,OAAO,KAAgB,GAAX,EAAE,EAAE,OAAe,EAAE,EAAG,CAAC,IAAI,EAAE,EAAE,QAA+D,OAAhD,IAAP,KAAS,EAAE,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,QAAQ,EAAS,GAAG,EAAE,CAAC,CAAC,CAAoF,MAAnF,GAAE,EAAE,YAAmB,IAAP,MAAU,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,YAAY,EAAS,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAiB,GAAhB,EAAE,EAAE,YAAsB,IAAP,OAAW,EAAE,EAAE,OAAY,EAAE,SAAU,CAAC,IAAI,EAAE,EAAE,MAAM,GAAG,EAAE,aAAa,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CACrZ,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,UAAU,GAAU,IAAP,OAAW,EAAE,EAAE,YAAY,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAyB,GAApB,EAAE,EAAE,gBAA0B,IAAP,KAAS,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,EAAE,KAAK,IAAI,EAAE,IAAI,QAAQ,EAAE,QAAQ,SAAS,EAAE,SAAS,KAAK,IAAI,EAAS,IAAP,KAAS,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,OAAc,IAAP,MAAiB,IAAP,KAAS,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,KAAM,GAAE,EAAE,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,gBAAgB,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,EAAE,eAAsB,IAAP,KAAS,EAAE,gBAAgB,EAAE,EAAE,KACnf,EAAE,EAAE,eAAe,CAAC,CACpB,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,YAAY,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,EAAE,EAAE,eAAe,EAAE,EAAE,OAAO,QAAQ,GAAU,IAAP,KAAS,CAAC,EAAE,OAAO,QAAQ,KAAK,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,KAAY,IAAP,KAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,UAAiB,IAAP,OAAW,EAAE,EAAE,YAAY,EAAE,EAAE,eAAe,IAAI,IAAW,IAAP,KAAS,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,EAAE,eAAe,GAAG,CAAC,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,IAAI,EAAE,KAAK,EAAE,CAAQ,IAAP,OAAW,EAAE,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,QAAQ,SAAS,EAAE,SACvf,KAAK,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAU,OAAR,EAAE,EAAE,EAAE,EAAS,EAAE,IAAT,CAAc,IAAK,GAAc,GAAZ,EAAE,EAAE,QAAwB,OAAO,GAApB,WAAsB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAK,GAAE,EAAE,MAAM,EAAE,MAAM,OAAO,IAAI,IAAK,GAAsD,GAApD,EAAE,EAAE,QAAQ,EAAe,OAAO,GAApB,WAAsB,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAY,GAAP,KAAqB,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,IAAK,GAAE,GAAG,CAAC,CAAC,CAAC,CAAQ,EAAE,WAAT,MAAuB,EAAE,OAAN,IAAa,EAAE,OAAO,GAAG,EAAE,EAAE,QAAe,IAAP,KAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,KAAM,GAAE,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,QAAQ,SAAS,EAAE,SAAS,KAAK,IAAI,EAAS,IAAP,MAAU,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAC3e,GAAT,EAAE,EAAE,KAAe,IAAP,KAAS,IAAG,EAAE,EAAE,OAAO,QAAe,IAAP,KAAS,MAAW,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,eAAe,EAAE,EAAE,OAAO,QAAQ,IAAA,CAAI,OAAO,GAA+F,GAArF,IAAP,OAAW,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,gBAAgB,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,YAAsB,IAAP,KAAS,CAAC,EAAE,EAAE,EAAG,IAAG,EAAE,KAAK,EAAE,EAAE,WAAW,IAAI,EAAE,MAAa,IAAP,OAAW,EAAE,OAAO,MAAM,GAAG,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAC9V,SAAS,GAAG,EAAE,EAAE,EAAE,CAA4B,GAA3B,EAAE,EAAE,QAAQ,EAAE,QAAQ,KAAe,IAAP,KAAS,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,GAAU,IAAP,KAAS,CAAqB,GAApB,EAAE,SAAS,KAAK,EAAE,EAAkB,OAAO,GAApB,WAAsB,MAAM,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,SAAS,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CACnS,SAAS,GAAG,EAAE,EAAE,CAAuC,OAAtC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,SAAgB,EAAP,CAAU,IAAK,GAAE,IAAK,IAAG,GAAG,EAAE,EAAE,iBAAiB,EAAE,aAAa,GAAG,KAAK,EAAE,EAAE,MAAM,QAAQ,EAAM,IAAJ,EAAM,EAAE,WAAW,EAAE,EAAE,EAAE,cAAc,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,GAAG,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,EAAM,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,UAAU,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EACzZ,SAAS,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAS,IAAP,MAAU,CAAC,GAAQ,EAAE,MAAP,GAAW,CAAC,IAAI,EAAE,EAAE,cAAc,GAAU,IAAP,OAAW,EAAE,EAAE,WAAkB,IAAP,MAAiB,EAAE,OAAT,MAAsB,EAAE,OAAT,MAAe,OAAO,CAAC,MAAM,GAAQ,EAAE,MAAP,IAAqB,EAAE,cAAc,cAAzB,IAAK,GAAoC,IAAK,EAAE,MAAM,IAAK,OAAO,CAAA,MAAO,GAAU,EAAE,QAAT,KAAe,CAAC,EAAE,MAAM,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC,GAAG,IAAI,EAAE,MAAM,KAAY,EAAE,UAAT,MAAkB,CAAC,GAAU,EAAE,SAAT,MAAiB,EAAE,SAAS,EAAE,OAAO,KAAK,EAAE,EAAE,MAAM,CAAC,EAAE,QAAQ,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,GAAG,CAAC,EACtc,SAAS,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,IAAI,GAAG,EAAE,CAAC,8BAA8B,KAAK,GAAG,OAAO,CAAC,CAAC,IAAI,GAAG,EAAG,uBAAuB,GAAG,EAAG,wBAAwB,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,IAAG,CAAC,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,GAAU,IAAP,KAAS,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAChW,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAuH,GAAtH,GAAG,EAAE,EAAE,EAAE,EAAE,cAAc,KAAK,EAAE,YAAY,KAAK,EAAE,MAAM,EAAE,GAAG,QAAe,IAAP,MAAiB,EAAE,gBAAT,KAAuB,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,EAAK,GAAG,CAAC,EAAE,EAAE,EAAE,CAAY,GAAX,GAAG,CAAC,EAAE,GAAG,EAAK,IAAI,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,KAAK,GAAG,QAAQ,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,CAA+D,GAA9D,GAAG,QAAQ,GAAG,EAAS,IAAP,MAAiB,EAAE,OAAT,KAAc,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,CAAC,EAAK,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,EAAM,KAAJ,EAAY,MAAL,IAAG,EAAS,CAAC,CAC/Y,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,cAAc,KAAK,UAAU,KAAK,UAAU,KAAK,MAAM,KAAK,KAAK,IAAI,EAA0C,OAAjC,IAAP,KAAS,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,KAAK,EAAS,CAAC,CAAC,SAAS,IAAI,CAAC,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,UAAU,EAAS,IAAP,KAAyB,KAAhB,EAAE,aAAkB,KAAM,GAAE,EAAE,KAAK,IAAI,EAAS,IAAP,KAAS,EAAE,cAAc,EAAE,KAAK,GAAU,IAAP,KAAS,EAAE,EAAE,EAAE,MAAM,CAAC,GAAU,IAAP,KAAS,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,cAAc,EAAE,cAAc,UAAU,EAAE,UAAU,UAAU,EAAE,UAAU,MAAM,EAAE,MAAM,KAAK,IAAI,EAAS,IAAP,KAAS,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CACje,SAAS,GAAG,EAAE,EAAE,CAAC,OAAmB,OAAO,GAApB,WAAsB,EAAE,CAAC,EAAE,CAAC,CACnD,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,GAAU,IAAP,KAAS,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,QAAQ,GAAU,IAAP,KAAS,CAAC,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAU,IAAP,KAAS,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,IAAI,GAAG,KAAK,EAAS,IAAP,OAAW,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,cAAc,EAAE,cAAc,WAAW,EAAE,WAAW,KAAK,IAAI,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,cAAc,EAAE,cACngB,WAAW,EAAE,WAAW,KAAK,IAAI,EAAS,IAAP,MAAU,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,OAAc,IAAP,MAAU,IAAI,GAAU,IAAP,KAAS,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,aAAa,IAAI,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,kBAAkB,CAAC,CAAiB,GAAhB,EAAE,EAAE,YAAsB,IAAP,KAAS,CAAC,EAAE,EAAE,EAAG,GAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,IAAI,EAAE,MAAa,IAAP,OAAW,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAC9X,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,GAAU,IAAP,KAAS,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,cAAc,GAAU,IAAP,KAAS,CAAC,EAAE,QAAQ,KAAK,IAAI,EAAE,EAAE,EAAE,KAAK,EAAG,GAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,IAAI,GAAG,GAAG,EAAE,EAAE,aAAa,IAAI,GAAG,CAAC,GAAG,EAAE,cAAc,EAAS,EAAE,YAAT,OAAqB,EAAE,UAAU,GAAG,EAAE,kBAAkB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CACpW,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,cAAc,CAAC,EAAqE,GAAnE,IAAI,EAAE,cAAc,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,GAAG,KAAK,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAK,EAAE,cAAc,GAAG,GAAU,IAAP,MAAU,EAAE,cAAc,IAAI,EAAE,CAAuD,GAAtD,EAAE,OAAO,KAAK,GAAG,EAAE,GAAG,KAAK,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,IAAK,GAAE,IAAI,EAAY,IAAP,KAAS,MAAM,MAAM,EAAE,GAAG,CAAC,EAAO,GAAG,IAAK,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,YAAmB,IAAP,MAAU,EAAE,CAAC,WAAW,KAAK,OAAO,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,OAAc,IAAP,KAAS,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAClf,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,MAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAS,IAAP,MAAU,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAClQ,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAA2M,OAA5L,OAAO,GAApB,aAAwB,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,CAAC,QAAQ,KAAK,YAAY,KAAK,MAAM,EAAE,SAAS,KAAK,oBAAoB,GAAG,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,KAAK,KAAK,EAAE,CAAC,EAAQ,CAAC,EAAE,cAAc,CAAC,CAAC,CAC5P,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAA4O,MAA3O,GAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,YAAmB,IAAP,MAAU,EAAE,CAAC,WAAW,KAAK,OAAO,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,EAAE,WAAkB,IAAP,KAAS,EAAE,WAAW,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,IAAW,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,aAAa,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,cAAc,GAAG,EAAE,EAAE,EAAE,IAAK,GAAW,IAAT,IAAK,GAAM,KAAK,CAAC,CAAC,CAC9Y,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAW,IAAT,IAAK,GAAM,KAAK,EAAE,IAAI,EAAE,IAAK,GAAE,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,cAA0B,GAAZ,EAAE,EAAE,QAAkB,IAAP,MAAU,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,cAAc,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,cAAc,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAChX,SAAS,GAAG,EAAE,EAAE,CAAC,GAAgB,OAAO,GAApB,WAAsB,MAAO,GAAE,EAAE,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,EAAE,GAAU,GAAP,KAAqB,MAAO,GAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,QAAQ,IAAI,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAA2C,MAA1C,GAAS,GAAP,KAAmC,KAAd,EAAE,OAAO,CAAC,CAAC,CAAC,EAAc,GAAG,EAAE,EAAE,GAAG,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAW,IAAT,IAAK,GAAM,KAAK,EAAE,IAAI,EAAE,EAAE,cAAkF,OAA1D,IAAP,MAAiB,IAAP,MAAU,GAAG,EAAE,EAAE,EAAE,EAAS,EAAE,IAAG,EAAE,cAAc,CAAC,EAAE,CAAC,EAAS,EAAC,CAC7Z,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAW,IAAT,IAAK,GAAM,KAAK,EAAE,IAAI,EAAE,EAAE,cAAwF,OAAhE,IAAP,MAAiB,IAAP,MAAU,GAAG,EAAE,EAAE,EAAE,EAAS,EAAE,IAAG,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,EAAS,EAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAA+H,OAAtH,GAAG,IAAiE,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,UAAU,CAAC,GAAU,IAA/G,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,cAAc,EAA4D,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAM,IAAJ,GAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,WAAW,GAAG,WAAW,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,aAAa,CAC1d,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAiE,GAA/D,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,WAAW,KAAK,KAAK,IAAI,EAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAS,IAAP,KAAS,CAAC,IAAI,EAAE,GAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAC/K,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,WAAW,KAAK,KAAK,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,UAAU,GAAO,EAAE,QAAN,IAAqB,IAAP,MAAc,EAAE,QAAN,KAAe,EAAE,EAAE,oBAA2B,IAAP,MAAU,GAAG,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC,EAAoC,GAAlC,EAAE,cAAc,CAAC,EAAE,EAAE,WAAW,EAAK,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,YAAmB,IAAP,MAAU,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,MAAS,CAAC,CAAU,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAS,IAAP,OAAW,EAAE,GAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAC/c,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,OAAO,IAAI,GAAU,IAAP,MAAU,IAAI,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,QAAe,IAAP,KAAS,EAAE,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,QAAQ,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,GAAQ,EAAE,QAAS,CAAC,IAAI,EAAE,EAAE,MAAM,GAAG,EAAE,aAAa,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAC9P,IAAI,GAAG,CAAC,YAAY,GAAG,YAAY,GAAE,WAAW,GAAE,UAAU,GAAE,oBAAoB,GAAE,mBAAmB,GAAE,gBAAgB,GAAE,QAAQ,GAAE,WAAW,GAAE,OAAO,GAAE,SAAS,GAAE,cAAc,GAAE,iBAAiB,GAAE,cAAc,GAAE,iBAAiB,GAAE,qBAAqB,GAAE,MAAM,GAAE,yBAAyB,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY,GAAG,YAAY,SAAS,EAAE,EAAE,CAA0C,MAAzC,IAAG,CAAC,CAAC,cAAc,CAAC,EAAW,IAAT,IAAK,GAAM,KAAK,CAAC,EAAS,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,oBAAoB,SAAS,EAAE,EAAE,EAAE,CAA2C,MAA1C,GAAS,GAAP,KAAmC,KAAd,EAAE,OAAO,CAAC,CAAC,CAAC,EAAc,GAAG,QAC3f,EAAE,GAAG,KAAK,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB,SAAS,EAAE,EAAE,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,mBAAmB,SAAS,EAAE,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAkD,MAAhD,GAAW,IAAT,IAAK,GAAM,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,EAAS,CAAC,EAAE,WAAW,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAA+L,MAA7L,GAAW,IAAT,IAAK,GAAW,EAAL,EAAE,CAAC,EAAI,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,CAAC,QAAQ,KAAK,YAAY,KAAK,MAAM,EAAE,SAAS,KAAK,oBAAoB,EAAE,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,KAAK,KAAK,EAAE,CAAC,EAAQ,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,OAAO,SAAS,EAAE,CAAC,IAAI,EACrf,GAAG,EAAgB,MAAd,GAAE,CAAC,QAAQ,CAAC,EAAS,EAAE,cAAc,CAAC,EAAE,SAAS,GAAG,cAAc,GAAG,iBAAiB,SAAS,EAAE,CAAC,MAAO,IAAG,CAAC,CAAC,cAAc,CAAC,EAAE,cAAc,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,GAA6C,MAA1C,GAAE,GAAG,KAAK,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,cAAc,EAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,iBAAiB,UAAU,CAAC,EAAE,qBAAqB,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAY,IAAT,IAAK,GAAM,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAO,GAAN,EAAE,EAAE,EAAY,IAAP,KAAS,MAAM,MAAM,EAAE,GAAG,CAAC,EAAO,GAAG,IAAK,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,EACxZ,MAD0Z,GAAE,MAAM,EAAE,GAAG,GAAG,KAAK,KAAK,EACpf,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,KAAK,GAAG,EAAE,GAAG,KAAK,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,IAAK,GAAE,IAAI,EAAS,CAAC,EAAE,MAAM,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,iBAAiB,GAAG,EAAE,CAAC,IAAI,EAAE,GAAO,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE,GAAA,CAAI,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,SAAS,EAAE,GAAG,GAAG,GAAG,KAAM,GAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,MAAO,GAAE,cAAc,CAAC,EAAE,yBAAyB,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,oBAAoB,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC,EACrhB,cAAc,GAAG,iBAAiB,SAAS,EAAE,CAAY,OAAO,GAAZ,GAAe,EAAE,EAAE,cAAc,CAAC,CAAC,EAAE,cAAc,UAAU,CAAsC,MAAM,CAArC,GAAG,EAAE,CAAC,CAAC,GAAK,GAAG,CAAC,CAAC,aAAwB,CAAC,EAAE,iBAAiB,GAAG,qBAAqB,GAAG,MAAM,GAAG,yBAAyB,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,oBAAoB,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,cAAc,GAAG,iBAAiB,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,OAClf,IADyf,KACvf,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC,EAAE,cAAc,UAAU,CAAsC,MAAM,CAArC,GAAG,EAAE,CAAC,CAAC,GAAK,GAAG,CAAC,CAAC,aAAwB,CAAC,EAAE,iBAAiB,GAAG,qBAAqB,GAAG,MAAM,GAAG,yBAAyB,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,aAAa,CAA4B,IAAI,IAAI,IAAnC,GAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,aAA0B,EAAW,EAAE,KAAX,IAAK,KAAW,EAAE,GAAG,EAAE,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,EAAE,EAAS,GAAP,KAAqB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,EAAM,EAAE,QAAN,IAAc,EAAE,YAAY,UAAU,EAAE,CACrd,IAAI,GAAG,CAAC,UAAU,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,gBAAgB,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,gBAAgB,IAAI,EAAE,GAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAW,GAAG,OAAW,EAAE,SAAS,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAS,IAAP,OAAW,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,oBAAoB,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,gBAAgB,IAAI,EAAE,GAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAW,GAAG,OAAW,EAAE,SAAS,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAS,IAAP,OAAW,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,mBAAmB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,gBAAgB,IAAI,EAAE,GAAE,EAAE,EACnf,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAW,GAAG,OAAW,EAAE,SAAS,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAS,IAAP,OAAW,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAe,MAAd,GAAE,EAAE,UAA6B,OAAO,EAAE,uBAAtB,WAA4C,EAAE,sBAAsB,EAAE,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,UAAU,qBAAqB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAC1S,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAO,EAAE,EAAE,YAA2W,OAApV,OAAO,GAAlB,UAA4B,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAE,QAAQ,EAAE,EAAE,aAAa,GAAG,EAAS,GAAP,MAAsB,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,cAAqB,EAAE,QAAT,MAAyB,EAAE,QAAX,IAAK,GAAY,EAAE,MAAM,KAAK,EAAE,QAAQ,GAAG,EAAE,UAAU,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,4CAA4C,EAAE,EAAE,0CAA0C,GAAU,CAAC,CAC5Z,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAmB,OAAO,EAAE,2BAAtB,YAAiD,EAAE,0BAA0B,EAAE,CAAC,EAAe,OAAO,EAAE,kCAAtB,YAAwD,EAAE,iCAAiC,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,GAAG,oBAAoB,EAAE,EAAE,MAAM,IAAI,CAAC,CACpQ,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,YAAuB,OAAO,GAAlB,UAA4B,EAAE,EAAE,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAE,QAAQ,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,yBAAsC,OAAO,GAApB,aAAwB,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,eAA4B,OAAO,EAAE,0BAAtB,YAA6D,OAAO,EAAE,yBAAtB,YAA4D,OAAO,EAAE,2BAAtB,YAA8D,OAAO,EAAE,oBAAtB,aAA2C,EAAE,EAAE,MACxe,OAAO,EAAE,oBAAtB,YAA0C,EAAE,mBAAmB,EAAe,OAAO,EAAE,2BAAtB,YAAiD,EAAE,0BAA0B,EAAE,IAAI,EAAE,OAAO,GAAG,oBAAoB,EAAE,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,eAA4B,OAAO,EAAE,mBAAtB,aAA0C,EAAE,OAAO,QAAQ,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAG,IAAG,GAAG,CAAC,EAAE,EAAE,EAAE,aAAa,GAAG,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;0BAA6B,EAAE,QAAQ;EAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,CAAC,CAC1d,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,KAAK,MAAY,GAAI,KAAK,OAAa,GAAI,IAAI,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,WAAW,UAAU,CAAC,MAAM,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAgB,OAAO,SAApB,WAA4B,QAAQ,IAAI,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE,IAAI,EAAE,EAAE,MAAsD,MAAhD,GAAE,SAAS,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,EAAS,CAAC,CACrW,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,yBAAyB,GAAgB,OAAO,GAApB,WAAsB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,UAA8O,OAA7N,IAAP,MAAuB,OAAO,EAAE,mBAAtB,aAA0C,EAAE,SAAS,UAAU,CAAC,GAAG,EAAE,CAAC,EAAe,OAAO,GAApB,aAA+B,KAAP,KAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,EAAE,MAAM,KAAK,kBAAkB,EAAE,MAAM,CAAC,eAAsB,IAAP,KAAW,GAAF,CAAI,CAAC,CAAC,GAAU,CAAC,CACnb,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,GAAU,IAAP,KAAS,CAAC,EAAE,EAAE,UAAU,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,KAAM,GAAE,EAAE,IAAI,CAAC,EAAW,IAAT,IAAK,KAAQ,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,KAAK,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAA4E,IAAvE,EAAO,EAAE,MAAP,MAAW,EAAE,EAAE,cAAc,EAAS,IAAP,MAAgB,EAAE,aAAT,MAAgC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,OAAc,IAAP,MAAU,OAAO,IAAI,CAChW,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAA4M,OAAnM,EAAE,KAAK,GAAmK,EAAE,OAAO,MAAM,EAAE,MAAM,EAAS,IAAzL,IAAI,EAAE,EAAE,OAAO,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO,OAAO,EAAE,OAAO,OAAW,EAAE,MAAN,IAAmB,EAAE,YAAT,KAAmB,EAAE,IAAI,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,EAAmC,CAAC,IAAI,GAAG,EAAG,kBAAkB,GAAG,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,MAAa,IAAP,KAAS,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CACnV,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,IAAiK,OAA7J,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAY,IAAP,MAAU,CAAC,IAAU,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,IAAE,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAS,EAAE,MAAK,CACzN,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,KAAuM,OAAlL,OAAO,GAApB,YAAuB,CAAC,GAAG,CAAC,GAAY,EAAE,eAAX,IAAK,IAA2B,EAAE,UAAT,MAA2B,EAAE,eAAX,IAAK,IAA0B,EAAE,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAE,EAAE,GAAG,EAAE,KAAK,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAS,EAAE,MAAM,EAAC,CAAW,GAAV,EAAE,EAAE,OAAc,EAAE,MAAM,KAAb,EAAgB,CAAC,IAAI,EAAE,EAAE,cAA0C,GAA5B,EAAE,EAAE,QAAQ,EAAS,IAAP,KAAW,GAAF,EAAQ,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC,CAAC,CAA6C,MAA5C,GAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAS,EAAE,MAAM,CAAC,CAC1b,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,cAAc,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,IAAG,GAAG,CAAC,EAAE,EAAE,aAAa,EAAE,GAAO,EAAE,MAAM,KAAb,EAAqB,EAAE,MAAM,SAAU,GAAG,CAAC,QAAQ,MAAO,GAAE,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,CAAC,CAAA,CAAC,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CACxN,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,SAAS,EAAS,IAAP,KAAyB,KAAhB,EAAE,cAAmB,GAAc,EAAE,OAAb,SAAkB,IAAG,EAAK,EAAE,KAAK,GAAG,EAAE,cAAc,CAAC,UAAU,EAAE,UAAU,KAAK,YAAY,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,MAAM,CAAC,GAAG,EAAK,EAAE,YAAY,MAAO,GAAS,IAAP,KAAuB,EAAd,EAAE,UAAU,EAAI,EAAE,MAAM,EAAE,WAAW,WAAW,EAAE,cAAc,CAAC,UAAU,EAAE,UAAU,KAAK,YAAY,IAAI,EAAE,EAAE,YAAY,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,UAAU,EAAE,UAAU,KAAK,YAAY,IAAI,EAAE,EAAS,IAAP,KAAqB,EAAZ,EAAE,UAAY,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,OAChf,IADsf,KAC7c,EAAE,GAAxC,EAAE,EAAE,UAAU,EAAE,EAAE,cAAc,MAAU,EAAE,GAAG,EAAE,EAAE,IAAI,EAAc,OAAZ,GAAG,EAAE,EAAE,EAAE,CAAC,EAAS,EAAE,KAAK,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,KAAc,IAAP,MAAiB,IAAP,MAAiB,IAAP,MAAU,EAAE,MAAM,KAAE,EAAE,OAAO,IAAI,EAAE,OAAO,QAAO,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,GAAE,QAA+K,MAAvK,GAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAY,IAAP,MAAU,CAAC,IAAU,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,IAAE,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAS,EAAE,MAAK,CACla,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,KAAM,GAAE,CAAC,EAAU,GAAR,GAAG,EAAE,CAAC,EAAY,EAAE,YAAT,KAAmB,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,YAAuB,OAAO,GAAlB,UAA4B,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,yBAAyB,EAAe,OAAO,GAApB,YAAoC,OAAO,EAAE,yBAAtB,WAA8C,GAAgB,OAAO,EAAE,kCAAtB,YAAqE,OAAO,EAAE,2BAAtB,aACpc,IAAI,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,cAAc,IAAI,GAAG,IAAI,GAAG,GAAG,SAAS,IAAiB,OAAO,GAApB,aAAwB,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,GAAgB,OAAO,EAAE,2BAAtB,YAA8D,OAAO,EAAE,oBAAtB,aAAwD,OAAO,EAAE,oBAAtB,YAA0C,EAAE,mBAAmB,EAAe,OAAO,EAAE,2BAAtB,YAAiD,EAAE,0BAA0B,GAAgB,OAAO,EAAE,mBAAtB,aAA0C,EAAE,OAAO,WACre,OAAO,EAAE,mBAAtB,aAA0C,EAAE,OAAO,SAAS,EAAE,cAAc,EAAE,EAAE,cAAc,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAiB,OAAO,EAAE,mBAAtB,aAA0C,EAAE,OAAO,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,EAAE,YAAuB,OAAO,GAAlB,UAA4B,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,0BAA0B,EAAe,OAAO,GAApB,YAAoC,OAAO,EAAE,yBAAtB,aAC3c,OAAO,EAAE,kCAAtB,YAAqE,OAAO,EAAE,2BAAtB,aAAkD,IAAI,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,cAAc,IAAI,GAAG,IAAI,GAAG,GAAG,SAAS,IAAiB,OAAO,GAApB,aAAwB,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,GAAgB,OAAO,EAAE,4BAAtB,YAA+D,OAAO,EAAE,qBAAtB,aAAyD,OAAO,EAAE,qBAAtB,YAA2C,EAAE,oBAAoB,EAAE,EAAE,CAAC,EAAe,OAAO,EAAE,4BAAtB,YACte,EAAE,2BAA2B,EAAE,EAAE,CAAC,GAAgB,OAAO,EAAE,oBAAtB,aAA2C,EAAE,OAAO,GAAgB,OAAO,EAAE,yBAAtB,aAAgD,EAAE,OAAO,QAAqB,OAAO,EAAE,oBAAtB,YAA0C,IAAI,EAAE,eAAe,IAAI,EAAE,gBAAgB,EAAE,OAAO,GAAgB,OAAO,EAAE,yBAAtB,YAA+C,IAAI,EAAE,eAAe,IAAI,EAAE,gBAAgB,EAAE,OAAO,MAAM,EAAE,cAAc,EAAE,EAAE,cAAc,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAiB,OAAO,EAAE,oBAAtB,YAA0C,IAAI,EAAE,eAAe,IACjf,EAAE,gBAAgB,EAAE,OAAO,GAAgB,OAAO,EAAE,yBAAtB,YAA+C,IAAI,EAAE,eAAe,IAAI,EAAE,gBAAgB,EAAE,OAAO,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CACnK,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,GAAK,EAAE,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,GAAG,QAAQ,EAAE,IAAI,EAAE,GAAgB,OAAO,EAAE,0BAAtB,WAA+C,KAAK,EAAE,OAAO,EAAiI,MAA/H,GAAE,OAAO,EAAS,IAAP,MAAU,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,MAAM,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,EAAS,EAAE,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,eAAe,GAAG,EAAE,EAAE,eAAe,EAAE,iBAAiB,EAAE,OAAO,EAAE,EAAE,SAAS,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,aAAa,CAAC,CAC5e,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAqC,OAApC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC,EAAS,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,WAAW,KAAK,YAAY,KAAK,UAAU,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,KAAK,YAAY,IAAI,CAAC,CAClM,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAK,EAAE,MAAM,KAAK,EAA0I,IAAvI,EAAE,KAAK,EAAS,IAAP,MAAiB,EAAE,gBAAT,KAAuB,CAAC,EAAE,GAAK,EAAE,IAAO,GAAE,EAAE,CAAC,EAAE,EAAE,OAAO,OAAoB,IAAP,MAAiB,EAAE,gBAAT,QAAuB,GAAG,GAAE,EAAE,EAAE,EAAE,CAAC,EAAY,IAAP,KAAmL,OAAzK,GAAG,CAAC,EAAE,EAAE,EAAE,cAAwB,IAAP,OAAW,EAAE,EAAE,WAAkB,IAAP,OAAiB,AAAe,EAAE,MAAZ,EAAE,KAAK,EAAoB,EAAE,OAAT,KAAsB,EAAU,WAAlC,EAA6C,OAAK,EAAE,EAAE,SAAS,EAAE,EAAE,SAAgB,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,SAAS,SAAS,CAAC,EAAE,EAAK,EAAE,IAAW,IAAP,MAAU,EAAE,WAAW,EAAE,EAAE,aAC7e,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,cAAc,GAAG,CAAC,EAAE,EAAE,cAAc,GAAG,GAAG,GAAG,EAAE,CAAC,GAAoB,GAAlB,EAAE,EAAE,cAAwB,IAAP,OAAW,EAAE,EAAE,WAAkB,IAAP,MAAU,OAAO,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,IAAI,EAAE,CAAC,KAAK,SAAS,SAAS,EAAE,QAAQ,EACxF,MAD0F,EAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,aAAa,EAAE,EAAE,UAAU,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,aAAa,UAAiB,IAAP,MAAoB,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,GAArC,EAAE,GAAG,EAAE,CAAC,EAAgC,EAAE,OACnf,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,cAAc,EAAS,IAAP,KAAS,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,KAAK,YAAY,EAAE,WAAW,EAAE,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,cAAc,GAAU,CAAC,CAAoO,MAAnO,GAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,UAAU,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAK,EAAE,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,KAAY,IAAP,OAAW,EAAE,EAAE,UAAiB,IAAP,MAAU,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE,OAAO,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,cAAc,KAAY,CAAC,CACnd,SAAS,GAAG,EAAE,EAAE,CAA4D,MAA3D,GAAE,GAAG,CAAC,KAAK,UAAU,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAS,EAAE,MAAM,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAsG,OAA9F,IAAP,MAAU,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,MAAM,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,aAAa,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,cAAc,KAAY,CAAC,CAC/N,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAgX,OAA1W,EAAE,MAAM,KAAW,EAAE,OAAO,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAY,EAAE,gBAAT,MAAgE,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,UAAU,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAO,EAAE,KAAK,GAAI,GAAG,EAAE,EAAE,MAAM,KAAK,CAAC,EAAE,EAAE,MAAM,cAAc,GAAG,CAAC,EAAE,EAAE,cAAc,GAAU,IAA/Q,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,MAAoP,GAAG,EAAK,EAAE,KAAK,GAAG,OAAO,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAU,EAAE,OAAT,KAAc,CAChd,GADid,EAAE,EAAE,aAAa,EAAE,YAAY,QAC7e,EAAE,IAAI,EAAE,EAAE,KAA0C,MAArC,GAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,IAAK,EAAC,EAAS,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAwB,GAAvB,GAAO,EAAE,EAAE,cAAT,EAAwB,IAAI,EAAE,CAAK,GAAJ,EAAE,EAAY,IAAP,KAAS,CAAC,OAAO,EAAE,CAAC,EAAV,CAAa,IAAK,GAAE,EAAE,EAAE,MAAM,IAAK,IAAG,EAAE,EAAE,MAAM,IAAK,IAAG,IAAK,KAAI,IAAK,KAAI,IAAK,KAAI,IAAK,MAAK,IAAK,MAAK,IAAK,MAAK,IAAK,MAAK,IAAK,OAAM,IAAK,OAAM,IAAK,OAAM,IAAK,QAAO,IAAK,QAAO,IAAK,QAAO,IAAK,SAAQ,IAAK,SAAQ,IAAK,SAAQ,IAAK,SAAQ,IAAK,UAAS,IAAK,UAAS,IAAK,UAAS,EAAE,GAAG,MAAM,IAAK,WAAU,EAAE,UAAU,MAAM,QAAQ,EAAE,CAAC,CAAC,GAAO,GAAG,EAAE,eAAe,MAAzB,EAA+B,EAAF,EAC7e,IAAJ,GAAO,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAA0B,OAAzB,GAAG,EAAE,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,EAAS,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAgQ,OAArP,EAAE,OAAT,MAAqB,EAAE,OAAO,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,KAAK,CAAC,EAAE,EAAE,YAAY,EAAE,OAAK,EAAE,EAAE,YAAY,GAAG,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,KAAY,IAAP,OAAW,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAO,KAAY,EAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,UAAiB,IAAP,OAAW,EAAE,OAAO,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CACxc,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,cAAqB,IAAP,KAAS,EAAE,cAAc,CAAC,YAAY,EAAE,UAAU,KAAK,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,UAAU,KAAK,EAAE,mBAAmB,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,CAC3O,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,YAAY,EAAE,EAAE,KAAsC,GAAjC,GAAG,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,QAAgB,EAAE,EAAG,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,QAAQ,CAAC,GAAU,IAAP,MAAe,EAAE,MAAM,IAAK,EAAE,IAAI,EAAE,EAAE,MAAa,IAAP,MAAU,CAAC,GAAQ,EAAE,MAAP,GAAkB,EAAE,gBAAT,MAAwB,GAAG,EAAE,EAAE,CAAC,OAAO,GAAQ,EAAE,MAAP,GAAW,GAAG,EAAE,EAAE,CAAC,OAAO,GAAU,EAAE,QAAT,KAAe,CAAC,EAAE,MAAM,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,KAAY,EAAE,UAAT,MAAkB,CAAC,GAAU,EAAE,SAAT,MAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,QAAQ,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAQ,GAAP,EAAE,EAAE,CAAC,EAAK,EAAK,EAAE,KAAK,GAAG,EAAE,cAC/e,UAAU,OAAO,EAAP,CAAU,IAAK,WAAqB,IAAV,EAAE,EAAE,MAAU,EAAE,KAAY,IAAP,MAAU,EAAE,EAAE,UAAiB,IAAP,MAAiB,GAAG,CAAC,IAAX,OAAe,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAS,IAAP,MAAU,EAAE,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,IAAK,YAA6B,IAAjB,EAAE,KAAK,EAAE,EAAE,MAAU,EAAE,MAAM,KAAY,IAAP,MAAU,CAAe,GAAd,EAAE,EAAE,UAAoB,IAAP,MAAiB,GAAG,CAAC,IAAX,KAAa,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,IAAK,WAAW,GAAG,EAAE,CAAC,EAAE,KAAK,KAAK,IAAK,EAAC,EAAE,MAAM,QAAQ,EAAE,cAAc,IAAI,CAAC,OAAO,EAAE,KAAK,CAC7d,SAAS,GAAG,EAAE,EAAE,CAAC,EAAK,EAAE,KAAK,IAAW,IAAP,OAAW,EAAE,UAAU,KAAK,EAAE,UAAU,KAAK,EAAE,OAAO,EAAE,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAuD,GAA/C,IAAP,OAAW,EAAE,aAAa,EAAE,cAAc,IAAI,EAAE,OAAc,EAAE,EAAE,cAAT,EAAqB,OAAO,KAAK,GAAU,IAAP,MAAU,EAAE,QAAQ,EAAE,MAAM,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,GAAU,EAAE,QAAT,KAAe,CAA4C,IAA3C,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,EAAM,EAAE,OAAO,EAAS,EAAE,UAAT,MAAkB,EAAE,EAAE,QAAQ,EAAE,EAAE,QAAQ,GAAG,EAAE,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,QAAQ,IAAI,CAAC,OAAO,EAAE,KAAK,CAC9a,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,IAAK,GAAE,GAAG,CAAC,EAAE,MAAM,IAAK,GAAE,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC,EAAE,MAAM,IAAK,GAAE,GAAG,EAAE,EAAE,UAAU,aAAa,EAAE,MAAM,IAAK,IAAG,IAAI,EAAE,EAAE,KAAK,SAAS,EAAE,EAAE,cAAc,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,cAAc,EAAE,MAAM,IAAK,IAAqB,GAAlB,EAAE,EAAE,cAAwB,IAAP,KAAuJ,OAAnI,EAAE,aAAT,MAAsE,EAAE,EAAE,MAAM,cAAf,GAA4C,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAgB,IAAP,KAAmB,KAAV,EAAE,SAAzD,GAAG,EAAE,EAAE,CAAC,GAAhF,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,IAAI,MAAgH,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAK,IAC7d,GADge,GAAO,EACrf,EAAE,cAD8e,EAC1d,EAAE,MAAM,IAAK,CAAC,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,GAAG,CAA6F,GAA5F,EAAE,EAAE,cAAqB,IAAP,OAAW,EAAE,UAAU,KAAK,EAAE,KAAK,KAAK,EAAE,WAAW,MAAM,EAAE,EAAE,EAAE,OAAO,EAAK,EAAE,MAAW,OAAO,KAAK,IAAK,IAAG,IAAK,IAAG,MAAO,GAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAC5P,SAAS,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,MAAa,IAAP,MAAU,CAAC,GAAO,EAAE,MAAN,GAAe,EAAE,MAAN,EAAU,EAAE,YAAY,EAAE,SAAS,OAAO,GAAO,EAAE,MAAN,GAAkB,EAAE,QAAT,KAAe,CAAC,EAAE,MAAM,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC,GAAG,IAAI,EAAE,MAAM,KAAY,EAAE,UAAT,MAAkB,CAAC,GAAU,EAAE,SAAT,MAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,QAAQ,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EADnC,GAElQ,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,cAAc,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,UAAU,GAAG,GAAG,OAAO,EAAE,IAAI,EAAE,KAAK,OAAO,EAAP,CAAU,IAAK,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,IAAK,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,IAAK,EAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,IAAK,EAAC,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,IAAK,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,QAAqB,OAAO,EAAE,SAAtB,YAA4C,OAAO,EAAE,SAAtB,aAAgC,EAAE,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAS,IAAI,IAAX,GAAE,KAAc,EAAE,GAAG,CAAC,EAAE,eAAe,CAAC,GAAG,EAAE,eAAe,CAAC,GAAS,EAAE,IAAR,KAAW,IAAa,IAAV,QAAY,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,KAAK,EAAE,EAAE,eAAe,CAAC,IAClf,AAAI,IAAE,CAAC,EAAG,EAAE,GAAG,GAAG,MAAiC,IAA5B,2BAA4C,IAAb,YAAmD,IAAnC,kCAAmE,IAA7B,4BAA8C,IAAd,cAAkB,EAAG,eAAe,CAAC,EAAE,AAAI,IAAE,CAAC,GAAI,IAAK,CAAC,EAAA,CAAG,KAAK,EAAE,IAAI,EAAA,CAAG,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,GAAyB,GAAtB,EAAQ,IAAI,GAAa,EAAE,eAAe,CAAC,GAAG,IAAI,IAAU,GAAN,MAAe,GAAN,MAAS,IAAa,IAAV,QAAY,IAAG,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,eAAe,CAAC,GAAG,GAAG,EAAE,eAAe,CAAC,IAAI,AAAI,IAAE,CAAC,EAAG,EAAE,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,AAAI,IAAE,CAAC,EAAG,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,AAAI,IAAE,CAAC,EAAG,EAAE,KAAK,EACpf,CAAC,GAAG,EAAE,CAAA,MAAkC,IAA5B,2BAA+B,EAAE,EAAE,EAAE,OAAO,IAAK,GAAE,EAAE,EAAE,EAAE,OAAO,IAAK,GAAQ,GAAN,MAAS,IAAI,IAAI,IAAK,CAAC,EAAA,CAAG,KAAK,EAAE,CAAC,GAAgB,IAAb,WAA0B,OAAO,GAAlB,UAAgC,OAAO,GAAlB,WAAsB,IAAK,CAAC,EAAA,CAAG,KAAK,EAAE,GAAG,CAAC,EAAqC,IAAnC,kCAAmE,IAA7B,6BAAiC,EAAG,eAAe,CAAC,GAAS,GAAN,MAAsB,IAAb,YAAgB,EAAE,SAAS,CAAC,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,KAAK,IAAK,CAAC,EAAA,CAAG,KAAK,EAAE,CAAC,EAAA,CAAE,CAAC,IAAI,IAAK,CAAC,EAAA,CAAG,KAAK,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAK,EAAE,YAAY,KAAE,EAAE,OAAO,EAAC,CAAC,EAJ9K,GAImL,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,OAAO,EAAE,EAChe,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,SAAT,CAAmB,IAAK,SAAS,EAAE,EAAE,KAAK,IAAI,IAAI,EAAE,KAAY,IAAP,MAAiB,EAAE,YAAT,OAAqB,EAAE,GAAG,EAAE,EAAE,QAAe,IAAP,KAAS,EAAE,KAAK,KAAK,EAAE,QAAQ,KAAK,MAAM,IAAK,YAAY,EAAE,EAAE,KAAK,IAAI,IAAI,EAAE,KAAY,IAAP,MAAiB,EAAE,YAAT,OAAqB,EAAE,GAAG,EAAE,EAAE,QAAe,IAAP,KAAS,GAAU,EAAE,OAAT,KAAc,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,KAAK,EAAE,QAAQ,IAAI,CAAC,CAC5U,SAAS,GAAE,EAAE,CAAC,IAAI,EAAS,EAAE,YAAT,MAAoB,EAAE,UAAU,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,MAAa,IAAP,MAAU,GAAG,EAAE,MAAM,EAAE,WAAW,GAAG,EAAE,aAAa,SAAS,GAAG,EAAE,MAAM,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,aAAa,IAAI,EAAE,EAAE,MAAa,IAAP,MAAU,GAAG,EAAE,MAAM,EAAE,WAAW,GAAG,EAAE,aAAa,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,QAAyC,MAAjC,GAAE,cAAc,EAAE,EAAE,WAAW,EAAS,CAAC,CAC7V,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,aAAmB,OAAN,GAAG,CAAC,EAAS,EAAE,IAAT,CAAc,IAAK,GAAE,IAAK,IAAG,IAAK,IAAG,IAAK,GAAE,IAAK,IAAG,IAAK,GAAE,IAAK,GAAE,IAAK,IAAG,IAAK,GAAE,IAAK,IAAG,OAAO,GAAE,CAAC,EAAE,KAAK,IAAK,GAAE,OAAO,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE,KAAK,IAAK,GAA2Q,MAAzQ,GAAE,EAAE,UAAU,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAC,EAAE,GAAG,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,OAAgB,IAAP,MAAiB,EAAE,QAAT,QAAe,GAAG,CAAC,EAAE,EAAE,OAAO,EAAS,IAAP,MAAU,EAAE,cAAc,cAAc,EAAK,EAAE,MAAM,OAAO,EAAE,OAAO,KAAY,KAAP,OAAY,GAAG,EAAE,EAAE,GAAG,QAAe,GAAE,CAAC,EAAS,KAAK,IAAK,GAAE,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,EACpf,GAAT,EAAE,EAAE,KAAe,IAAP,MAAgB,EAAE,WAAR,KAAkB,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE,OAAO,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,GAAU,EAAE,YAAT,KAAmB,MAAM,MAAM,EAAE,GAAG,CAAC,EAAO,OAAL,GAAE,CAAC,EAAS,IAAI,CAAkB,GAAjB,EAAE,GAAG,GAAG,OAAO,EAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,cAA+C,OAAjC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,GAAK,EAAE,KAAK,GAAU,EAAP,CAAU,IAAK,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAK,SAAS,IAAK,SAAS,IAAK,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,IAAK,QAAQ,IAAK,QAAQ,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,MAAM,IAAK,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAK,MAAM,IAAK,QAAQ,IAAK,OAAO,EAAE,QACnhB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,IAAK,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,IAAK,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,IAAK,SAAS,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,IAAK,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAgB,IAAI,IAAI,KAAvB,GAAG,EAAE,CAAC,EAAE,EAAE,KAAkB,EAAE,GAAG,EAAE,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,GAAgB,IAAb,WAA0B,OAAO,GAAlB,SAAoB,EAAE,cAAc,IAAI,CAAC,IAAI,EAAE,0BAA0B,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAc,OAAO,GAAlB,UAAqB,EAAE,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,0BAA0B,GAAG,EAAE,YAC1e,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,GAAG,CAAC,GAAG,EAAG,eAAe,CAAC,GAAS,GAAN,MAAsB,IAAb,YAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,EAAP,CAAU,IAAK,QAAQ,EAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,IAAK,WAAW,EAAG,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,IAAK,SAAS,IAAK,SAAS,MAAM,QAAqB,OAAO,EAAE,SAAtB,aAAgC,EAAE,QAAQ,GAAG,CAAC,EAAE,EAAE,EAAE,YAAY,EAAS,IAAP,OAAW,EAAE,OAAO,EAAE,KAAK,CAAC,EAAM,EAAE,WAAN,EAAe,EAAE,EAAE,cAA+C,IAAjC,iCAAqC,EAAE,GAAG,CAAC,GAAoC,IAAjC,+BAA8C,IAAX,UAAc,EAAE,EAAE,cAAc,KAAK,EAAE,EAAE,UAAU,qBAAuB,EAAE,EAAE,YAAY,EAAE,UAAU,GAC9f,OAAO,EAAE,IAApB,SAAuB,EAAE,EAAE,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAa,IAAX,WAAe,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,CAAW,OAAV,EAAE,GAAG,EAAE,CAAC,EAAS,EAAP,CAAU,IAAK,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,IAAK,SAAS,IAAK,SAAS,IAAK,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,IAAK,QAAQ,IAAK,QAAQ,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,IAAK,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,IAAK,MAAM,IAAK,QAAQ,IAAK,OAAO,EAAE,QAClf,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,IAAK,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,IAAK,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,IAAK,SAAS,EAAE,EAAE,MAAM,IAAK,SAAS,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,IAAK,EAAC,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,IAAK,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,QAAQ,EAAE,CAAC,CAAa,IAAI,KAAhB,GAAG,EAAE,CAAC,EAAE,EAAE,EAAW,EAAE,GAAG,EAAE,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,GAAa,IAAV,QAAY,GAAG,EAAE,CAAC,EAA8B,IAA5B,2BAA+B,EAAE,EAAE,EAAE,OAAO,IAAK,GAAQ,GAAN,MAAS,GAAG,EAAE,CAAC,GAAgB,IAAb,WAA0B,OAAO,GAAlB,UACxd,IAD6e,YACre,IAAL,KAAS,GAAG,EAAE,CAAC,EAAa,OAAO,GAAlB,UAAqB,GAAG,EAAE,GAAG,CAAC,EAAqC,IAAnC,kCAAmE,IAA7B,4BAA8C,IAAd,cAAkB,EAAG,eAAe,CAAC,EAAQ,GAAN,MAAsB,IAAb,YAAgB,EAAE,SAAS,CAAC,EAAQ,GAAN,MAAS,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAP,CAAU,IAAK,QAAQ,EAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,IAAK,WAAW,EAAG,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,IAAK,SAAe,EAAE,OAAR,MAAe,EAAE,aAAa,QAAQ,GAAG,EAAG,EAAE,KAAK,CAAC,EAAE,MAAM,IAAK,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,MAAY,GAAN,KAAsC,EAAE,cAAR,MAAsB,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,aAClf,CAAC,CAAC,EAD8a,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAClc,MAAM,QAAqB,OAAO,EAAE,SAAtB,aAAgC,EAAE,QAAQ,GAAG,CAAC,OAAO,EAAP,CAAU,IAAK,SAAS,IAAK,QAAQ,IAAK,SAAS,IAAK,WAAW,EAAE,CAAC,CAAC,EAAE,UAAU,MAAM,EAAE,IAAK,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAQ,EAAE,MAAT,OAAe,EAAE,OAAO,IAAI,EAAE,OAAO,QAAQ,CAAM,OAAL,GAAE,CAAC,EAAS,KAAK,IAAK,GAAE,GAAG,GAAS,EAAE,WAAR,KAAkB,GAAG,EAAE,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC,GAAc,OAAO,GAAlB,UAA4B,EAAE,YAAT,KAAmB,MAAM,MAAM,EAAE,GAAG,CAAC,EAAkC,GAAhC,EAAE,GAAG,GAAG,OAAO,EAAE,GAAG,GAAG,OAAO,EAAK,GAAG,CAAC,EAAE,CAAyC,GAAxC,EAAE,EAAE,UAAU,EAAE,EAAE,cAAc,EAAE,IAAI,GAAK,EAAE,EAAE,YAAY,KAAK,EACvf,GAAU,IAAP,MAAS,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,GAAG,EAAE,UAAU,EAAE,GAAK,EAAE,KAAK,EAAE,EAAE,MAAM,IAAK,GAAE,CAAC,IAAI,EAAE,cAAc,0BAA0B,GAAG,EAAE,UAAU,EAAE,GAAK,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,KAAM,IAAO,EAAE,WAAN,EAAe,EAAE,EAAE,cAAA,CAAe,eAAe,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,UAAU,CAAC,CAAM,OAAL,GAAE,CAAC,EAAS,KAAK,IAAK,IAA0B,GAAvB,EAAE,CAAC,EAAE,EAAE,EAAE,cAAwB,IAAP,MAAiB,EAAE,gBAAT,MAA+B,EAAE,cAAc,aAAvB,KAAkC,CAAC,GAAG,GAAU,KAAP,MAAgB,EAAE,KAAK,GAAI,EAAK,EAAE,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,MAAM,EAAE,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,EAAS,IAAP,MAAiB,EAAE,aAAT,KAAoB,CAAC,GACzf,IAD4f,KAC1f,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAiD,GAA/C,EAAE,EAAE,cAAc,EAAS,IAAP,KAAsB,KAAb,EAAE,WAAmB,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,EAAK,EAAE,MAAM,OAAO,EAAE,cAAc,MAAM,EAAE,OAAO,EAAE,GAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAa,KAAP,OAAY,GAAG,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,MAAM,EAAE,IAAI,CAA6N,OAApN,EAAE,MAAM,KAAY,EAAE,MAAM,EAAE,IAAE,EAAS,IAAP,KAAS,KAAY,IAAP,MAAiB,EAAE,gBAAT,OAAyB,IAAI,EAAE,MAAM,OAAO,KAAU,EAAE,KAAK,IAAY,IAAP,MAAe,EAAE,QAAQ,EAAO,IAAJ,IAAQ,EAAE,GAAG,GAAG,IAAW,EAAE,cAAT,OAAuB,EAAE,OAAO,GAAG,GAAE,CAAC,EAAS,MAAK,IAAK,GAAE,OAAO,GAAG,EACze,IAAP,MAAU,GAAG,EAAE,UAAU,aAAa,EAAE,GAAE,CAAC,EAAE,KAAK,IAAK,IAAG,OAAO,GAAG,EAAE,KAAK,QAAQ,EAAE,GAAE,CAAC,EAAE,KAAK,IAAK,IAAG,OAAO,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,EAAE,KAAK,IAAK,IAA0B,GAAvB,EAAE,CAAC,EAAE,EAAE,EAAE,cAAwB,IAAP,KAAS,OAAO,GAAE,CAAC,EAAE,KAAuC,GAAlC,EAAE,GAAK,EAAE,MAAM,KAAK,EAAE,EAAE,UAAoB,IAAP,KAAS,IAAG,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,GAAO,IAAJ,GAAc,IAAP,MAAe,EAAE,MAAM,IAAK,IAAI,EAAE,EAAE,MAAa,IAAP,MAAU,CAAS,GAAR,EAAE,GAAG,CAAC,EAAY,IAAP,KAAS,CAAmG,IAAlG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,YAAmB,IAAP,OAAW,EAAE,YAAY,EAAE,EAAE,OAAO,GAAG,EAAE,aAAa,EAAE,EAAE,EAAM,EAAE,EAAE,MAAa,IAAP,MAAU,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,SAC7e,EAAE,EAAE,UAAiB,IAAP,MAAU,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,KAAK,EAAE,aAAa,EAAE,EAAE,cAAc,KAAK,EAAE,cAAc,KAAK,EAAE,YAAY,KAAK,EAAE,aAAa,KAAK,EAAE,UAAU,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,UAAU,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,aAAoB,IAAP,KAAS,KAAK,CAAC,MAAM,EAAE,MAAM,aAAa,EAAE,YAAY,GAAG,EAAE,EAAE,QAA2B,OAAnB,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAS,EAAE,KAAK,CAAC,EAClgB,EAAE,OAAO,CAAQ,EAAE,OAAT,MAAe,EAAE,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,QAAQ,MAAK,CAAC,GAAG,CAAC,EAAE,IAAG,EAAE,GAAG,CAAC,EAAS,IAAP,KAAa,IAAA,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,YAAmB,IAAP,OAAW,EAAE,YAAY,EAAE,EAAE,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC,EAAS,EAAE,OAAT,MAA0B,EAAE,WAAb,UAAuB,CAAC,EAAE,WAAW,CAAC,EAAE,OAAO,GAAE,CAAC,EAAE,IAAA,KAAU,GAAE,EAAE,EAAE,EAAE,mBAAmB,IAAiB,IAAb,aAAiB,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,QAAA,CAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,KAAY,IAAP,KAAqB,EAAE,MAAM,EAApB,EAAE,QAAQ,EAAY,EAAE,KAAK,EAAE,CAC3W,OADsX,EAAE,OAAT,MACpX,GAAE,CAAC,EAAS,OAD6X,EAAE,EAAE,KAAK,EAAE,UAC9e,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EAAE,EAAE,QAAQ,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAmB,IAAK,IAAG,IAAK,IAAG,OAAO,GAAG,EAAE,EAAS,EAAE,gBAAT,KAA8B,IAAP,MAAiB,EAAE,gBAAT,OAAyB,IAAI,EAAE,OAAO,MAAM,GAAQ,EAAE,KAAK,EAAQ,GAAG,aAAc,GAAE,CAAC,EAAE,EAAE,aAAa,IAAI,EAAE,OAAO,OAAO,GAAE,CAAC,EAAE,KAAK,IAAK,IAAG,OAAO,KAAK,IAAK,IAAG,OAAO,IAAI,CAAC,MAAM,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAE,CAClX,SAAS,GAAG,EAAE,EAAE,CAAO,OAAN,GAAG,CAAC,EAAS,EAAE,IAAT,CAAc,IAAK,GAAE,OAAO,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,KAAK,IAAK,GAAE,OAAO,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAC,EAAE,GAAG,EAAE,EAAE,EAAE,MAAW,EAAE,OAAQ,EAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,KAAK,IAAK,GAAE,OAAO,GAAG,CAAC,EAAE,KAAK,IAAK,IAA0B,GAAvB,EAAE,CAAC,EAAE,EAAE,EAAE,cAAwB,IAAP,MAAiB,EAAE,aAAT,KAAoB,CAAC,GAAU,EAAE,YAAT,KAAmB,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAW,MAAV,GAAE,EAAE,MAAa,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,GAAG,KAAK,IAAK,IAAG,OAAO,EAAE,CAAC,EAAE,KAAK,IAAK,GAAE,OAAO,GAAG,EAAE,KAAK,IAAK,IAAG,OAAO,GAAG,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAK,IAAG,IAAK,IAAG,OAAO,GAAG,EAC7gB,KAAK,IAAK,IAAG,OAAO,KAAK,QAAQ,OAAO,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,GAAE,CAAC,EAAE,GAAgB,OAAO,SAApB,WAA4B,QAAQ,IAAI,EAAE,KAAK,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,GAAU,IAAP,KAAS,IAAgB,OAAO,GAApB,WAAsB,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAM,GAAE,QAAQ,IAAA,CAAI,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EACzR,SAAS,GAAG,EAAE,EAAE,CAAc,GAAb,GAAG,GAAG,EAAE,GAAG,EAAK,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,eAAe,IAAI,EAAE,YAAY,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,gBAAgB,EAAE,aAAa,OAAO,IAAI,EAAE,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,GAAO,EAAE,aAAN,EAAiB,CAAC,EAAE,EAAE,WAAW,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,EAAE,YAAY,GAAG,CAAC,EAAE,SAAS,EAAE,QAAQ,MAAS,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,EAAK,IAAI,GAAO,IAAJ,GAAW,EAAE,WAAN,IAAiB,EAAE,EAAE,GAAG,IAAI,GAAO,IAAJ,GAAW,EAAE,WAAN,IAAiB,EAAE,EAAE,GAAO,EAAE,WAAN,IAAiB,GACnf,EAAE,UAAU,SAAmB,EAAE,EAAE,cAAZ,MAA8B,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,MAAM,EAA8C,GAA5C,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,IAAc,EAAE,EAAE,eAAZ,KAAyB,MAAM,EAAE,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,EAAO,IAAL,IAAa,IAAL,GAAO,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAM,GAAE,IAAI,CAAC,IAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAM,GAAE,KAA+C,IAA1C,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,EAAM,EAAE,EAAS,IAAP,MAAU,GAAG,EAAE,EAAE,EAAE,EAAE,MAAW,EAAE,aAAa,MAAc,IAAP,KAAS,EAAE,OAAO,EAAE,EAAE,OAAO,KAAY,IAAP,MAAU,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,GAAQ,EAAE,MAAM,KAAM,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,IAAK,IAAG,IAAK,IAAG,MACxf,IAAK,GAAE,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,EAAE,cAAc,EAAE,EAAE,UAA+E,EAAE,oCAArE,EAAE,wBAAwB,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAyC,CAAC,CAAC,MAAM,IAAK,GAAE,IAAI,EAAE,EAAE,UAAU,cAAkB,EAAE,WAAN,EAAe,EAAE,YAAY,GAAO,EAAE,WAAN,GAAgB,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,IAAK,GAAE,IAAK,GAAE,IAAK,GAAE,IAAK,IAAG,MAAM,QAAQ,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAa,GAAZ,EAAE,EAAE,QAAkB,IAAP,KAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,CAAY,MAAX,GAAE,GAAG,GAAG,CAAC,EAAS,CAAC,CAC3f,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,YAAyC,GAA7B,EAAS,IAAP,KAAsB,KAAb,EAAE,WAA0B,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,IAAK,GAAW,IAAT,IAAK,IAAO,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAA8C,GAA7C,EAAE,EAAE,YAAY,EAAS,IAAP,KAAsB,KAAb,EAAE,WAA0B,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,UAAU,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,EAAE,EAAE,MAAM,QAAQ,EAAE,CAAC,CAAc,OAAO,GAApB,WAAsB,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAClf,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,UAAiB,IAAP,OAAW,EAAE,UAAU,KAAK,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,EAAE,UAAU,KAAK,EAAE,QAAQ,KAAS,EAAE,MAAN,IAAY,EAAE,EAAE,UAAiB,IAAP,OAAW,OAAO,EAAE,IAAI,OAAO,EAAE,IAAI,OAAO,EAAE,IAAI,OAAO,EAAE,IAAI,OAAO,EAAE,MAAM,EAAE,UAAU,KAAK,EAAE,OAAO,KAAK,EAAE,aAAa,KAAK,EAAE,cAAc,KAAK,EAAE,cAAc,KAAK,EAAE,aAAa,KAAK,EAAE,UAAU,KAAK,EAAE,YAAY,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,OAAW,EAAE,MAAN,GAAe,EAAE,MAAN,GAAe,EAAE,MAAN,CAAS,CACna,SAAS,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,KAAY,EAAE,UAAT,MAAkB,CAAC,GAAU,EAAE,SAAT,MAAiB,GAAG,EAAE,MAAM,EAAE,OAAO,KAAK,EAAE,EAAE,MAAM,CAA2B,IAA1B,EAAE,QAAQ,OAAO,EAAE,OAAW,EAAE,EAAE,QAAY,EAAE,MAAN,GAAe,EAAE,MAAN,GAAgB,EAAE,MAAP,IAAY,CAAyB,GAArB,EAAE,MAAM,GAAuB,EAAE,QAAT,MAAoB,EAAE,MAAN,EAAU,SAAS,EAAO,EAAE,MAAM,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,OAAO,EAAE,SAAS,CAAC,CACzT,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,GAAO,IAAJ,GAAW,IAAJ,EAAM,EAAE,EAAE,UAAU,EAAM,EAAE,WAAN,EAAe,EAAE,WAAW,aAAa,EAAE,CAAC,EAAE,EAAE,aAAa,EAAE,CAAC,GAAO,EAAE,WAAN,GAAgB,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,YAAY,CAAC,GAAG,EAAE,EAAE,oBAA2B,GAAP,MAA6B,EAAE,UAAT,OAAmB,EAAE,QAAQ,UAAU,GAAO,IAAJ,IAAQ,EAAE,EAAE,MAAa,IAAP,MAAU,IAAI,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,QAAe,IAAP,MAAU,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAC1X,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,GAAO,IAAJ,GAAW,IAAJ,EAAM,EAAE,EAAE,UAAU,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,YAAY,CAAC,OAAO,GAAO,IAAJ,IAAQ,EAAE,EAAE,MAAa,IAAP,MAAU,IAAI,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,QAAe,IAAP,MAAU,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,MAAa,IAAP,MAAU,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CACnR,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,IAAiB,OAAO,GAAG,sBAAvB,WAA4C,GAAG,CAAC,GAAG,qBAAqB,GAAG,CAAC,CAAC,MAAS,CAAC,CAAC,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,IAAG,GAAG,EAAE,CAAC,EAAE,IAAK,GAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAS,IAAP,OAAW,IAAI,EAAE,EAAE,EAAE,EAAE,UAAc,EAAE,WAAN,EAAe,EAAE,WAAW,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,GAAG,MAAM,IAAK,IAAU,IAAP,OAAW,IAAI,EAAE,EAAE,EAAE,EAAE,UAAc,EAAE,WAAN,EAAe,GAAG,EAAE,WAAW,CAAC,EAAM,EAAE,WAAN,GAAgB,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,EAAE,SAAS,GAAG,MAAM,IAAK,GAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,UAAU,cAAc,GAAG,CAAC,EACnf,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,IAAK,GAAE,IAAK,IAAG,IAAK,IAAG,IAAK,IAAG,GAAG,CAAC,KAAI,EAAE,EAAE,YAAmB,IAAP,OAAW,EAAE,EAAE,WAAkB,IAAP,OAAW,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAa,IAAT,IAAK,KAAa,EAAE,GAAkB,EAAE,IAAjB,GAAG,EAAE,EAAE,CAAC,EAAwB,EAAE,EAAE,IAAI,OAAO,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,IAAK,GAAE,GAAG,CAAC,KAAI,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,UAAuB,OAAO,EAAE,sBAAtB,YAA4C,GAAG,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,qBAAqB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,IAAK,IAAG,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,IAAK,IAAG,EAAE,KAAK,GAAG,IAAG,EAAE,KAC5e,EAAE,gBAD8e,KAChe,GAAG,EAAE,EAAE,CAAC,EAAE,GAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,QAAQ,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,YAAY,GAAU,IAAP,KAAS,CAAC,EAAE,YAAY,KAAK,IAAI,EAAE,EAAE,UAAiB,IAAP,OAAW,EAAE,EAAE,UAAU,IAAI,IAAI,EAAE,QAAQ,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CACzQ,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,GAAU,IAAP,KAAS,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAY,IAAP,MAAU,CAAC,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,EAAE,EAAE,UAAU,GAAG,CAAC,EAAE,MAAM,EAAE,IAAK,GAAE,EAAE,EAAE,UAAU,cAAc,GAAG,CAAC,EAAE,MAAM,EAAE,IAAK,GAAE,EAAE,EAAE,UAAU,cAAc,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,GAAU,IAAP,KAAS,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,UAAiB,IAAP,OAAW,EAAE,OAAO,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,aAAa,MAAM,IAAI,EAAE,EAAE,MAAa,IAAP,MAAU,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CACje,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,MAAM,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,IAAK,IAAG,IAAK,IAAG,IAAK,IAAiB,GAAd,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAK,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,IAAK,GAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,KAAY,IAAP,MAAU,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,IAAK,GAAgD,GAA9C,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,KAAY,IAAP,MAAU,GAAG,EAAE,EAAE,MAAM,EAAK,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,UAAgB,GAAN,MAAS,CAAC,IAAI,EAAE,EAAE,cAAc,EAAS,IAAP,KAAyB,EAAhB,EAAE,cAAgB,EAAE,EAAE,KAAK,EAAE,EAAE,YACje,GAAnB,EAAE,YAAY,KAAe,IAAP,KAAS,GAAG,CAAW,IAAV,SAAuB,EAAE,OAAZ,SAAwB,EAAE,MAAR,MAAc,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAa,IAAV,QAAY,GAAG,EAAE,CAAC,EAA8B,IAA5B,0BAA8B,GAAG,EAAE,CAAC,EAAe,IAAb,WAAe,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAP,CAAU,IAAK,QAAQ,GAAG,EAAE,CAAC,EAAE,MAAM,IAAK,WAAW,GAAG,EAAE,CAAC,EAAE,MAAM,IAAK,SAAS,IAAI,EAAE,EAAE,cAAc,YAAY,EAAE,cAAc,YAAY,CAAC,CAAC,EAAE,SAAS,IAAI,EAAE,EAAE,MAAY,GAAN,KAAgC,IAAI,CAAC,CAAC,EAAE,WAAiB,EAAE,cAAR,KAClc,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EADkb,GAAG,EAAE,CAAC,CAAC,EAAE,SACnf,EAAE,aAAa,CAAC,CAAC,GADyZ,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CACtY,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,IAAK,GAAgB,GAAd,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAK,EAAE,EAAE,CAAC,GAAU,EAAE,YAAT,KAAmB,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,cAAc,GAAG,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,IAAK,GAAgB,GAAd,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAK,EAAE,GAAU,IAAP,MAAU,EAAE,cAAc,aAAa,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,IAAK,GAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,IAAK,IAAG,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,OAAO,EAAS,EAAE,gBAAT,KAAuB,EAAE,UAAU,SAAS,EAAE,CAAC,GAC3e,EAAE,YAAT,MAA2B,EAAE,UAAU,gBAAnB,OAAmC,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,MAAM,IAAK,IAAsF,GAAnF,EAAS,IAAP,MAAiB,EAAE,gBAAT,KAAuB,EAAE,KAAK,GAAG,IAAG,EAAE,KAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAE,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAK,EAAE,KAAK,CAA0B,GAAzB,EAAS,EAAE,gBAAT,MAA2B,EAAE,UAAU,SAAS,IAAI,CAAC,GAAQ,EAAE,KAAK,EAAG,IAAI,EAAE,EAAE,EAAE,EAAE,MAAa,IAAP,MAAU,CAAC,IAAI,EAAE,EAAE,EAAS,IAAP,MAAU,CAAe,OAAd,EAAE,EAAE,EAAE,EAAE,MAAa,EAAE,IAAT,CAAc,IAAK,GAAE,IAAK,IAAG,IAAK,IAAG,IAAK,IAAG,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,IAAK,GAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,UAAU,GAAgB,OAAO,EAAE,sBAAtB,WAA2C,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,MACpf,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,qBAAqB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAK,GAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,IAAK,IAAG,GAAU,EAAE,gBAAT,KAAuB,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAQ,IAAP,KAA0B,GAAG,CAAC,GAApB,EAAE,OAAO,EAAE,EAAE,EAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAO,EAAE,MAAN,EAAc,IAAO,IAAP,KAAS,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,EAAE,EAAE,MAAmB,OAAO,EAAE,aAAtB,WAAkC,EAAE,YAAY,UAAU,OAAO,WAAW,EAAE,EAAE,QAAQ,SAAS,EAAE,EAAE,UAAU,EAAE,EAAE,cAAc,MAAM,EAAW,GAAG,MAAU,EAAE,eAAe,SAAS,EAAE,EAAE,QAAQ,KAAK,EAAE,MAAM,QACzf,GAAG,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,GAAO,EAAE,MAAN,EAAc,IAAO,IAAP,KAAS,GAAG,CAAC,EAAE,UAAU,UAAU,EAAE,GAAG,EAAE,aAAa,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,OAAO,IAAS,EAAE,MAAP,IAAiB,EAAE,MAAP,IAAmB,EAAE,gBAAT,MAAwB,IAAI,IAAW,EAAE,QAAT,KAAe,CAAC,EAAE,MAAM,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,KAAY,EAAE,UAAT,MAAkB,CAAC,GAAU,EAAE,SAAT,MAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,MAAM,EAAE,QAAQ,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC,MAAM,IAAK,IAAG,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,MAAM,IAAK,IAAG,MAAM,QAAQ,GAAG,EACnf,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,OAAc,IAAP,MAAU,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CAAC,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,KAAiB,GAAG,EAAT,GAAG,CAAQ,EAAE,CAAC,EAAE,MAAM,IAAK,GAAE,IAAK,GAAE,IAAI,EAAE,EAAE,UAAU,cAAsB,GAAG,EAAT,GAAG,CAAQ,EAAE,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CACvb,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,GAAK,EAAE,KAAK,GAAU,IAAP,MAAU,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,GAAQ,EAAE,MAAP,IAAY,EAAE,CAAC,IAAI,EAAS,EAAE,gBAAT,MAAwB,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,EAAS,IAAP,MAAiB,EAAE,gBAAT,MAAwB,GAAE,EAAE,GAAG,IAAI,EAAE,GAAO,GAAL,GAAG,GAAM,GAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAS,IAAP,MAAU,EAAE,EAAE,EAAE,EAAE,MAAW,EAAE,MAAP,IAAmB,EAAE,gBAAT,MAAoC,IAAP,KAAN,GAAG,CAAC,GAAY,EAAE,OAAO,EAAE,EAAE,GAAS,KAAY,IAAP,MAAU,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAW,EAAE,aAAa,MAAc,IAAP,MAAU,EAAE,OAAO,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CACvc,SAAS,GAAG,EAAE,CAAC,KAAY,IAAP,MAAU,CAAC,IAAI,EAAE,EAAE,GAAQ,EAAE,MAAM,KAAM,CAAC,IAAI,EAAE,EAAE,UAAU,GAAG,CAAC,GAAQ,EAAE,MAAM,KAAM,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,IAAK,IAAG,IAAK,IAAG,IAAG,GAAG,EAAE,CAAC,EAAE,MAAM,IAAK,GAAE,IAAI,EAAE,EAAE,UAAU,GAAG,EAAE,MAAM,GAAG,CAAC,GAAE,IAAU,IAAP,KAAS,EAAE,kBAAkB,MAAM,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,mBAAmB,EAAE,EAAE,cAAc,EAAE,mCAAmC,CAAC,EAAC,IAAI,EAAE,EAAE,YAAmB,IAAP,MAAU,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,IAAK,GAAE,IAAI,EAAE,EAAE,YAAY,GAAU,IAAP,KAAS,CAAQ,GAAP,EAAE,KAAe,EAAE,QAAT,KAAe,OAAO,EAAE,MAAM,IAAf,CAAoB,IAAK,GAAE,EACjhB,EAAE,MAAM,UAAU,MAAM,IAAK,GAAE,EAAE,EAAE,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAK,GAAE,IAAI,EAAE,EAAE,UAAU,GAAU,IAAP,MAAU,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,cAAc,OAAO,EAAE,KAAT,CAAe,IAAK,SAAS,IAAK,QAAQ,IAAK,SAAS,IAAK,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,IAAK,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,IAAK,GAAE,MAAM,IAAK,GAAE,MAAM,IAAK,IAAG,MAAM,IAAK,IAAG,GAAU,EAAE,gBAAT,KAAuB,CAAC,IAAI,EAAE,EAAE,UAAU,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,cAAc,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,WAAkB,IAAP,MAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAK,IAAG,IAAK,IAAG,IAAK,IAAG,IAAK,IAAG,IAAK,IAAG,IAAK,IAAG,MAClgB,QAAQ,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CAAC,IAAG,EAAE,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,CAAa,GAAZ,EAAE,EAAE,QAAkB,IAAP,KAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,KAAY,IAAP,MAAU,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,GAAU,IAAP,KAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CACvS,SAAS,GAAG,EAAE,CAAC,KAAY,IAAP,MAAU,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,IAAK,IAAG,IAAK,IAAG,IAAI,EAAE,EAAE,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAK,GAAE,IAAI,EAAE,EAAE,UAAU,GAAgB,OAAO,EAAE,mBAAtB,WAAwC,CAAC,IAAI,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,kBAAkB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAK,GAAE,IAAI,EAAE,EAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,GAAU,IAAP,KAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAC7d,IAAI,GAAG,KAAK,KAAK,GAAG,EAAG,uBAAuB,GAAG,EAAG,kBAAkB,GAAG,EAAG,wBAAwB,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,GAAG,IAAS,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,EAAE,SAAS,IAAG,CAAC,OAAY,EAAE,EAAG,EAAE,EAAO,KAAL,GAAW,GAAG,EAAE,EAAR,EAAS,CAChU,SAAS,GAAG,EAAE,CAAgL,OAAvK,EAAE,KAAK,EAAoB,EAAE,GAAQ,IAAJ,EAAa,EAAE,CAAC,EAAY,GAAG,aAAV,MAAiD,EAAE,EAAS,IAAJ,GAAe,EAAE,OAAO,MAAM,EAAW,IAAT,IAAK,GAAM,GAAG,GAAG,EAAE,IAAI,EAAS,GAAnD,IAArC,KAAJ,IAAS,GAAG,GAAG,GAAG,IAAnF,CAA8J,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,KAAM,IAAG,EAAE,GAAG,KAAK,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAK,EAAK,EAAE,IAAI,IAAI,KAAE,IAAI,IAAI,EAAK,EAAE,KAAK,IAAI,GAAO,IAAJ,GAAO,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAM,IAAJ,GAAW,IAAJ,GAAO,EAAK,EAAE,KAAK,KAAK,GAAG,EAAE,EAAE,IAAI,IAAI,GAAG,GAAE,CAC1Y,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,aAAa,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,GAAO,IAAJ,EAAa,IAAP,MAAU,GAAG,CAAC,EAAE,EAAE,aAAa,KAAK,EAAE,iBAAiB,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,mBAAmB,EAAE,CAAgB,GAAT,GAAN,MAAS,GAAG,CAAC,EAAS,IAAJ,EAAU,EAAE,MAAN,EAAU,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,EAAK,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC,OAAO,GAAG,CAAC,EAAX,CAAc,IAAK,GAAE,EAAE,GAAG,MAAM,IAAK,GAAE,EAAE,GAAG,MAAM,IAAK,IAAG,EAAE,GAAG,MAAM,IAAK,WAAU,EAAE,GAAG,MAAM,QAAQ,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,aAAa,CAAC,CAAC,CAC7c,SAAS,GAAG,EAAE,EAAE,CAAY,GAAX,GAAG,GAAG,GAAG,EAAU,EAAE,EAAG,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,aAAa,GAAG,GAAG,GAAG,EAAE,eAAe,EAAE,OAAO,KAAK,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,GAAO,IAAJ,EAAM,OAAO,KAAK,GAAQ,EAAE,KAAU,EAAE,EAAE,gBAAT,GAAwB,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAK,IAAI,GAAG,IAAI,KAAE,GAAG,KAAK,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,GAAE,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAS,IAAP,MAAc,EAAE,KAAK,EAAE,EAAE,EAAE,GAAlB,EAAE,CAAkB,CAAC,GAAO,IAAJ,EAAM,CAAyC,GAApC,IAAJ,IAAQ,EAAE,GAAG,CAAC,EAAM,IAAJ,IAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAW,IAAJ,EAAM,KAAM,GAAE,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAO,IAAJ,EAAM,GAAG,EAAE,CAAC,MACjf,CAAuB,GAAtB,EAAE,EAAE,QAAQ,UAAa,EAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAM,IAAJ,IAAQ,EAAE,GAAG,CAAC,EAAM,IAAJ,IAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,IAAQ,IAAJ,GAAO,KAAM,GAAE,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAqC,OAAnC,EAAE,aAAa,EAAE,EAAE,cAAc,EAAS,EAAP,CAAU,IAAK,GAAE,IAAK,GAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,IAAK,GAAE,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,IAAK,GAAU,GAAR,GAAG,EAAE,CAAC,GAAM,EAAE,aAAa,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,CAAC,GAAO,GAAG,EAAE,CAAC,IAAV,EAAY,MAAyB,GAAnB,EAAE,EAAE,gBAAmB,EAAE,KAAK,EAAE,CAAC,GAAE,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,cAAc,GAAG,GAAG,KAAK,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,IAAK,GAAU,GAAR,GAAG,EAAE,CAAC,GAAM,EAAE,WAChf,EAAE,MAAqB,IAAf,EAAE,EAAE,WAAe,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAqG,GAApG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,EAAE,IAAI,KAAK,EAAE,KAAK,KAAK,GAAG,EAAE,IAAI,GAAG,EAAK,GAAG,EAAE,CAAC,EAAE,cAAc,GAAG,GAAG,KAAK,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,IAAK,GAAE,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,QAAQ,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CAAC,CAAC,CAAW,OAAV,GAAG,EAAE,EAAE,CAAC,EAAS,EAAE,eAAe,EAAE,GAAG,KAAK,KAAK,CAAC,EAAE,IAAI,CACrX,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,GAA2G,OAAxG,EAAE,QAAQ,cAAc,eAAe,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,GAAG,EAAE,CAAC,EAAM,IAAJ,IAAQ,EAAE,GAAG,GAAG,EAAS,IAAP,MAAU,GAAG,CAAC,GAAU,CAAC,CAAC,SAAS,GAAG,EAAE,CAAQ,KAAP,KAAU,GAAG,EAAE,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC,CAC5L,SAAS,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,YAAY,GAAU,IAAP,OAAW,EAAE,EAAE,OAAc,IAAP,MAAU,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,MAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAW,GAAV,EAAE,EAAE,MAAS,EAAE,aAAa,OAAc,IAAP,KAAS,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,MAAM,KAAY,EAAE,UAAT,MAAkB,CAAC,GAAU,EAAE,SAAT,MAAiB,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,QAAQ,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CACla,SAAS,GAAG,EAAE,EAAE,CAAqD,IAApD,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,gBAAgB,EAAE,EAAE,aAAa,CAAC,EAAM,EAAE,EAAE,gBAAgB,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,GAAQ,EAAE,EAAG,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAK,EAAE,GAAG,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,GAAO,EAAE,MAAN,GAAe,IAAJ,EAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAM,IAAJ,IAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAO,IAAJ,EAAM,KAAM,GAAE,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAO,IAAJ,EAAM,MAAM,MAAM,EAAE,GAAG,CAAC,EAA6E,MAA3E,GAAE,aAAa,EAAE,QAAQ,UAAU,EAAE,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAS,IAAI,CACvd,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAM,IAAJ,IAAQ,GAAG,EAAE,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,SAAS,GAAG,EAAE,CAAQ,KAAP,MAAe,GAAG,MAAP,GAAY,EAAK,EAAE,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,EAAE,GAAG,CAAC,GAAG,GAAG,WAAW,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,WAAW,EAAE,EAAE,EAAE,EAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,GAAG,GAAG,QAAQ,EAAE,EAAE,CAAC,CAChT,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,aAAa,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,cAAiD,GAA9B,IAAL,KAAS,EAAE,cAAc,GAAG,GAAG,CAAC,GAAa,IAAP,KAAS,IAAI,EAAE,EAAE,OAAc,IAAP,MAAU,CAAC,IAAI,EAAE,EAAQ,OAAN,GAAG,CAAC,EAAS,EAAE,IAAT,CAAc,IAAK,GAAE,EAAE,EAAE,KAAK,kBAAyB,GAAP,MAAsB,GAAG,EAAE,MAAM,IAAK,GAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAC,EAAE,GAAG,EAAE,MAAM,IAAK,GAAE,GAAG,CAAC,EAAE,MAAM,IAAK,GAAE,GAAG,EAAE,MAAM,IAAK,IAAG,EAAE,CAAC,EAAE,MAAM,IAAK,IAAG,EAAE,CAAC,EAAE,MAAM,IAAK,IAAG,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,IAAK,IAAG,IAAK,IAAG,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,CAAqE,GAApE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,KAAe,KAAP,KAAU,CAAC,IAAI,EAC1f,EAAE,EAAE,GAAG,OAAO,IAAI,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,YAAmB,IAAP,KAAS,CAAC,EAAE,YAAY,KAAK,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAC3K,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAoB,GAAnB,GAAG,EAAE,GAAG,QAAQ,GAAM,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,cAAqB,IAAP,MAAU,CAAC,IAAI,EAAE,EAAE,MAAa,IAAP,OAAW,EAAE,QAAQ,MAAM,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAA4C,GAA3C,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,QAAQ,KAAe,IAAP,MAAiB,EAAE,SAAT,KAAgB,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAqB,GAAnB,EAAE,EAAE,EAAE,OAAO,MAA8B,OAAO,GAAlB,UAAH,GAAqC,OAAO,EAAE,MAAtB,WAA2B,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,GAAG,EAAK,EAAE,KAAK,KAAS,IAAJ,GAAY,IAAL,IAAa,IAAL,IAAQ,CAAC,IAAI,EAAE,EAAE,UAAU,GAAG,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,cACxe,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,KAAK,EAAE,cAAc,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAU,IAAP,KAAS,CAAC,EAAE,OAAO,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,YAAY,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAM,GAAG,EAAK,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAU,IAAP,KAAS,CAAC,EAAK,EAAE,MAAM,SAAS,EAAE,OAAO,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAM,IAAJ,IAAQ,EAAE,GAAU,KAAP,KAAU,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,EAAE,OAAO,MACpf,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,IAAK,GAAE,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,GAAG,EAAK,EAAE,MAAM,OAAoB,OAAO,EAAE,0BAAtB,YAAuD,IAAP,MAAuB,OAAO,EAAE,mBAAtB,aAAiD,KAAP,MAAW,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,MAAM,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,OAAc,IAAP,KAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAG,CAAC,EAAE,EAAG,IAAI,GAAU,IAAP,OAAW,EAAE,EAAE,EAAE,QAAQ,QAAQ,CAAC,KAAK,OAAO,EAAE,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,GAAG,QAAsB,MAAd,IAAG,QAAQ,GAAiB,IAAP,KAAS,GAAG,CAAC,CACrd,SAAS,IAAI,EAAQ,IAAJ,GAAW,IAAJ,GAAW,IAAJ,KAAM,EAAE,GAAS,IAAP,MAAU,EAAK,GAAG,YAAY,EAAK,GAAG,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAK,IAAI,GAAG,IAAI,KAAE,GAAG,KAAK,GAAG,EAAE,CAAC,GAAE,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,GAAyB,GAAtB,GAAG,EAAE,EAAE,EAAE,GAAG,QAAQ,EAAY,IAAP,KAAS,MAAM,MAAM,EAAE,GAAG,CAAC,EAAa,MAAX,GAAE,KAAK,EAAE,EAAS,CAAC,CAAC,SAAS,IAAI,CAAC,KAAY,IAAP,MAAU,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,KAAY,IAAP,MAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,aAAoB,IAAP,KAAS,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,QAAQ,IAAI,CAC1d,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UAAqB,GAAX,EAAE,EAAE,OAAe,EAAE,MAAM,MAAkD,CAAW,GAAV,EAAE,GAAG,EAAE,CAAC,EAAY,IAAP,KAAS,CAAC,EAAE,OAAO,MAAM,EAAE,EAAE,MAAM,CAAC,GAAU,IAAP,KAAS,EAAE,OAAO,MAAM,EAAE,aAAa,EAAE,EAAE,UAAU,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,MAAM,CAAC,MAA7K,GAAA,EAAE,GAAG,EAAE,EAAE,EAAE,EAAS,IAAP,KAAS,CAAC,EAAE,EAAE,MAAM,CAAyJ,GAAZ,EAAE,EAAE,QAAkB,IAAP,KAAS,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,OAAc,IAAP,MAAc,IAAJ,IAAQ,EAAE,EAAE,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,WAAW,GAAG,CAAC,GAAG,WAAW,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,CAChc,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,QAAe,KAAP,MAAW,GAAQ,EAAE,EAAG,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,aAAa,IAAI,EAAE,EAAE,cAAc,GAAU,IAAP,KAAS,OAAO,KAA2C,GAAtC,EAAE,aAAa,KAAK,EAAE,cAAc,EAAK,IAAI,EAAE,QAAQ,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,aAAa,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,WAA8J,GAAnJ,GAAG,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAK,EAAE,aAAa,OAAO,EAAK,EAAE,MAAM,OAAO,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,UAAU,CAAM,OAAL,GAAG,EAAS,IAAI,CAAC,GAAG,EAAE,GAAK,EAAE,MAAM,OAAe,EAAE,aAAa,OAAQ,EAAE,CAAC,EAAE,GAAG,WAAW,GAAG,WAAW,KAChf,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,QAAQ,KAAK,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,WAAW,CAAC,KAAM,GAAE,QAAQ,EAAsF,GAApF,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,aAAiB,IAAJ,IAAQ,GAAG,MAAM,GAAG,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAY,IAAP,KAAS,IAAI,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,KAAM,IAAG,CAAC,EAAE,EAAE,GAAG,GAAG,KAAK,EAA2F,OAApF,GAAG,GAAQ,EAAE,MAAN,GAAW,GAAG,EAAE,EAAE,EAAE,aAAkB,EAAE,EAAG,IAAI,GAAG,MAAM,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAS,IAAI,CACre,SAAS,IAAI,CAAC,GAAU,KAAP,KAAU,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,EAAE,GAAG,CAAgC,GAA/B,GAAG,WAAW,KAAK,EAAE,GAAG,EAAE,GAAG,EAAY,KAAP,KAAU,IAAI,EAAE,CAAC,MAAM,CAAmB,GAAlB,EAAE,GAAG,GAAG,KAAK,GAAG,EAAU,EAAE,EAAG,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAO,IAAL,GAAG,EAAM,EAAE,EAAE,QAAe,IAAP,MAAU,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,GAAQ,EAAE,MAAM,GAAI,CAAC,IAAI,EAAE,EAAE,UAAU,GAAU,IAAP,KAAS,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAS,IAAP,MAAU,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,IAAK,IAAG,IAAK,IAAG,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,GAAU,IAAP,KAAS,EAAE,OAAO,EAAE,EAAE,OAAO,KAAY,IAAP,MAAU,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,OAAa,GAAN,GAAG,CAAC,EAAK,IACnf,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,GAAU,IAAP,KAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,UAAU,GAAU,IAAP,KAAS,CAAC,IAAI,EAAE,EAAE,MAAM,GAAU,IAAP,KAAS,CAAC,EAAE,MAAM,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,CAAC,OAAc,IAAP,KAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAQ,EAAE,aAAa,MAAc,IAAP,KAAS,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAY,IAAP,MAAU,CAAK,GAAJ,EAAE,EAAU,EAAE,MAAM,KAAM,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,IAAK,IAAG,IAAK,IAAG,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,GAAU,IAAP,KAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,IAAI,EAAE,EAAS,IAAP,MAAU,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,GAAQ,EAAE,aAAa,MAC3e,IADkf,KAChf,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAS,IAAP,MAAU,CAAK,GAAJ,EAAE,EAAU,EAAE,MAAM,KAAM,GAAG,CAAC,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,IAAK,IAAG,IAAK,IAAG,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,EAAG,CAAC,EAAE,EAAE,EAAE,OAAO,CAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,GAAU,IAAP,KAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAU,GAAT,EAAE,EAAE,GAAG,EAAK,IAAiB,OAAO,GAAG,uBAAvB,WAA6C,GAAG,CAAC,GAAG,sBAAsB,GAAG,CAAC,CAAC,MAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAE,EAAS,IAAP,OAAW,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CACze,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,GAAO,EAAE,MAAN,EAAU,GAAG,EAAE,EAAE,CAAC,OAAO,KAAY,IAAP,MAAU,CAAC,GAAO,EAAE,MAAN,EAAU,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,CAAM,GAAO,EAAE,MAAN,EAAU,CAAC,IAAI,EAAE,EAAE,UAAU,GAAgB,OAAO,EAAE,KAAK,0BAA3B,YAAkE,OAAO,EAAE,mBAAtB,aAAiD,KAAP,MAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,GAAE,EAAS,IAAP,OAAW,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CACnV,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UAAiB,IAAP,MAAU,EAAE,OAAO,CAAC,EAAE,EAAE,GAAE,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,IAAI,EAAE,KAAK,IAAQ,IAAJ,GAAW,IAAJ,IAAQ,EAAE,aAAa,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAK,IAAJ,IAAa,EAAE,KAAK,GAAQ,EAAE,GAAG,KAAK,EAAE,EAAK,GAAG,aAAa,GAAG,UAAzC,EAAE,GAAkD,IAAI,EAAE,GAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAS,IAAP,OAAW,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,EAAS,IAAP,OAAW,EAAE,EAAE,WAAW,GAAG,EAAE,CAAC,CAAC,CACjZ,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAT,CAAc,IAAK,IAAG,IAAI,EAAE,EAAE,UAAc,EAAE,EAAE,cAAqB,IAAP,OAAW,EAAE,EAAE,WAAW,MAAM,IAAK,IAAG,EAAE,EAAE,UAAU,MAAM,QAAQ,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CAAQ,IAAP,MAAU,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAC/M,SAAS,EAAE,EAAE,EAAE,CAAC,GAAU,IAAP,KAAS,IAAG,EAAE,gBAAgB,EAAE,cAAc,GAAG,QAAQ,GAAG,CAAC,MAAM,CAAC,IAAQ,EAAE,MAAM,KAAb,GAAiB,EAAK,EAAE,MAAM,KAAK,MAAO,IAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,GAAK,EAAE,MAAM,OAAa,MAAM,IAAG,CAAC,EAAE,GAAQ,EAAE,MAAM,SAAU,GAAG,EAAE,GAAG,EAAE,KAAK,EAAY,OAAV,EAAE,MAAM,EAAS,EAAE,IAAT,CAAc,IAAK,GAAE,IAAI,EAAE,EAAE,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,aAAa,IAAI,EAAE,GAAG,EAAE,GAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAC1I,MAD4I,GAAE,OAAO,EAAa,OAAO,GAAlB,UAA4B,GAAgB,OAAO,EAAE,QAAtB,YAAuC,EAAE,WAAX,IAAK,IAAgB,EAAE,IAAI,EAAE,EAAE,cAAc,KAAK,EAAE,YAC1e,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,cAAqB,EAAE,QAAT,MAAyB,EAAE,QAAX,IAAK,GAAY,EAAE,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,EAAE,UAAU,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,OAAc,EAAE,IAAK,IAAG,EAAE,EAAE,YAAY,EAAE,CAAqF,OAApF,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAS,EAAP,CAAU,IAAK,GAAE,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,IAAK,GAAE,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,IAAK,IAAG,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,IAAK,IAAG,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,MAAM,EAAE,IACvgB,EAAE,EAAE,CAAC,CAAE,CAAC,OAAO,EAAE,IAAK,GAAE,MAAO,GAAE,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAK,GAAE,MAAO,GAAE,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAK,GAAE,EAAE,CAAO,GAAN,GAAG,CAAC,EAAY,IAAP,KAAS,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,cAAc,EAAE,EAAE,QAAQ,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,cAA0B,GAAZ,EAAE,EAAE,QAAW,EAAE,aAAa,IAAG,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,0BAA0B,EAAE,0BAA0B,YAAY,EAAE,WAAW,EAAE,EAAE,YAAY,UAChf,EAAE,EAAE,cAAc,EAAE,EAAE,MAAM,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAM,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAM,IAAI,GAAG,GAAG,EAAE,UAAU,cAAc,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,EAAE,OAAA,KAAY,CAAM,GAAL,GAAG,EAAK,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,IAAK,GAAE,OAAO,GAAG,CAAC,EAAS,IAAP,MAAU,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,aAAa,EAAS,IAAP,KAAyB,KAAhB,EAAE,cAAmB,EAAE,EAAE,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,KAAY,IAAP,MAAU,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,IACnf,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,IAAK,GAAE,OAAc,IAAP,MAAU,GAAG,CAAC,EAAE,KAAK,IAAK,IAAG,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,IAAK,GAAE,OAAO,GAAG,EAAE,EAAE,UAAU,aAAa,EAAE,EAAE,EAAE,aAAoB,IAAP,KAAS,EAAE,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,IAAK,IAAG,MAAO,GAAE,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAK,GAAE,OAAO,GAAG,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,MAAM,IAAK,GAAE,OAAO,GAAG,EAAE,EAAE,EAAE,aAAa,SAAS,CAAC,EAAE,EAAE,MAAM,IAAK,IAAG,OAAO,GAAG,EAAE,EAAE,EAAE,aAAa,SAAS,CAAC,EAAE,EAAE,MAAM,IAAK,IAAG,EAAE,CACxZ,GADyZ,EAAE,EAAE,KAAK,SAAS,EAAE,EAAE,aAAa,EAAE,EAAE,cAClf,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,cAAc,EAAY,IAAP,KAAS,IAAG,GAAG,EAAE,MAAM,CAAC,EAAM,IAAA,EAAE,WAAW,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,MAAa,IAAP,OAAW,EAAE,OAAO,GAAU,IAAP,MAAU,CAAC,IAAI,EAAE,EAAE,aAAa,GAAU,IAAP,KAAS,CAAC,EAAE,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,aAAoB,IAAP,MAAU,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,GAAO,EAAE,MAAN,EAAU,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,YAAY,GAAU,IAAP,KAAS,CAAC,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,QAAe,IAAP,KAAS,EAAE,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,UAAiB,IAAP,OAAW,EAAE,OAAO,GAAG,GAAG,EAAE,OAClf,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,GAAQ,EAAE,MAAP,GAAW,EAAE,EAAE,OAAO,EAAE,KAAK,KAAK,EAAE,WAAW,GAAQ,EAAE,MAAP,GAAW,CAAY,GAAX,EAAE,EAAE,OAAiB,IAAP,KAAS,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAiB,IAAP,OAAW,EAAE,OAAO,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,KAAM,GAAE,EAAE,MAAM,GAAU,IAAP,KAAS,EAAE,OAAO,OAAO,IAAI,EAAE,EAAS,IAAP,MAAU,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,CAAa,GAAZ,EAAE,EAAE,QAAkB,IAAP,KAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAC,GAAG,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,IAAK,GAAE,MAAO,GAAE,EAAE,KAAK,EAAE,EAAE,aAAa,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EACrf,EAAE,MAAM,IAAK,IAAG,MAAO,GAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAK,IAAG,OAAO,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE,IAAK,IAAG,MAAO,GAAE,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,EAAE,cAAc,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,IAAK,IAAG,OAAO,GAAG,EAAE,EAAE,CAAC,EAAE,IAAK,IAAG,OAAO,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAE,EAAE,SAAS,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CACjZ,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,KAAK,MAAM,KAAK,OAAO,KAAK,UAAU,KAAK,KAAK,KAAK,YAAY,KAAK,KAAK,MAAM,EAAE,KAAK,IAAI,KAAK,KAAK,aAAa,EAAE,KAAK,aAAa,KAAK,cAAc,KAAK,YAAY,KAAK,cAAc,KAAK,KAAK,KAAK,EAAE,KAAK,aAAa,KAAK,MAAM,EAAE,KAAK,UAAU,KAAK,KAAK,WAAW,KAAK,MAAM,EAAE,KAAK,UAAU,IAAI,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,OAAO,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAe,MAAd,GAAE,EAAE,UAAgB,EAAE,CAAC,GAAG,CAAC,EAAE,iBAAiB,CACpd,SAAS,GAAG,EAAE,CAAC,GAAgB,OAAO,GAApB,WAAsB,MAAO,MAAG,CAAC,EAAM,GAAY,GAAG,KAAS,CAAc,GAAb,EAAE,EAAE,SAAY,IAAI,EAAG,MAAO,IAAG,GAAG,IAAI,EAAG,MAAO,GAAE,CAAC,MAAO,EAAC,CAC/I,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UACuB,OADN,IAAP,MAAU,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,UAAU,IAAI,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,EAAE,UAAU,MAAM,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,aAAa,EAAE,aAAoB,IAAP,KAAS,KAAK,CAAC,MAAM,EAAE,MAAM,aAAa,EAAE,YAAY,EAC3f,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAW,CAAC,CACxD,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAM,GAAJ,EAAE,EAAkB,OAAO,GAApB,WAAsB,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAc,OAAO,GAAlB,SAAoB,EAAE,OAAO,EAAE,OAAO,EAAP,CAAU,KAAK,EAAG,OAAO,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,GAAG,MAAO,GAAE,GAAG,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,EAAG,MAAO,GAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAG,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,MAAO,GAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,GAAc,OAAO,GAAlB,UAA4B,EAAE,OAAO,EAAE,SAAT,CAAmB,KAAK,GAAG,EAAE,GAAG,MAAM,EAAE,KAAK,EAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAG,EAAE,GACpf,MAAM,EAAE,KAAK,EAAG,EAAE,GAAG,MAAM,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,CAAC,MAAM,MAAM,EAAE,IAAU,GAAN,KAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,CAAE,CAAkD,MAAjD,GAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAS,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAyB,MAAxB,GAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAS,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAqE,MAApE,GAAE,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,YAAY,GAAG,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,EAAS,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAA4B,MAA3B,GAAE,GAAG,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAS,CAAC,CAC5W,SAAS,GAAG,EAAE,EAAE,EAAE,CAA4J,MAA3J,GAAE,GAAG,EAAS,EAAE,WAAT,KAA6B,CAAC,EAAZ,EAAE,SAAY,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,cAAc,EAAE,cAAc,gBAAgB,KAAK,eAAe,EAAE,cAAc,EAAS,CAAC,CACtL,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,KAAK,UAAU,KAAK,QAAQ,KAAK,gBAAgB,KAAK,KAAK,cAAc,GAAG,KAAK,aAAa,KAAK,eAAe,KAAK,QAAQ,KAAK,KAAK,iBAAiB,EAAE,KAAK,WAAW,GAAG,CAAC,EAAE,KAAK,gBAAgB,GAAG,EAAE,EAAE,KAAK,eAAe,KAAK,cAAc,KAAK,iBAAiB,KAAK,aAAa,KAAK,YAAY,KAAK,eAAe,KAAK,aAAa,EAAE,KAAK,cAAc,GAAG,CAAC,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,KAAK,gCAC/e,IAAI,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAA8M,MAA7M,GAAE,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAM,IAAJ,GAAO,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,KAAK,YAAY,KAAK,0BAA0B,IAAI,EAAE,GAAG,CAAC,EAAS,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,QAAiB,UAAU,KAAnB,IAAK,GAAiB,UAAU,GAAG,KAAK,MAAM,CAAC,SAAS,EAAG,IAAU,GAAN,KAAQ,KAAK,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,CACpa,SAAS,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,gBAAgB,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,GAAO,EAAE,MAAN,EAAU,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,EAAE,EAAE,UAAU,QAAQ,MAAM,EAAE,IAAK,GAAE,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,UAAU,0CAA0C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,OAAc,IAAP,MAAU,MAAM,MAAM,EAAE,GAAG,CAAC,CAAE,CAAC,GAAO,EAAE,MAAN,EAAU,CAAC,IAAI,EAAE,EAAE,KAAK,GAAG,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CACpW,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAsK,MAArK,GAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,SAAkB,GAAc,KAAK,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAS,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAE,EAAE,EAAE,GAAG,CAAC,EAAqL,MAAnL,GAAE,GAAG,CAAC,EAAS,EAAE,UAAT,KAAiB,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAW,IAAT,IAAK,GAAM,KAAK,EAAS,IAAP,OAAW,EAAE,SAAS,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,EAAS,IAAP,OAAW,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAU,CAAC,CAC3b,SAAS,GAAG,EAAE,CAAa,GAAZ,EAAE,EAAE,QAAW,CAAC,EAAE,MAAM,OAAO,KAAK,OAAO,EAAE,MAAM,IAAf,CAAoB,IAAK,GAAE,OAAO,EAAE,MAAM,UAAU,QAAQ,OAAO,EAAE,MAAM,SAAS,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAmB,GAAlB,EAAE,EAAE,cAAwB,IAAP,MAAiB,EAAE,aAAT,KAAoB,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,UAAc,IAAJ,GAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,GAAgB,OAAO,aAApB,WAAgC,YAAY,SAAS,EAAE,CAAC,QAAQ,MAAM,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC,KAAK,cAAc,CAAC,CAC5b,GAAG,UAAU,OAAO,GAAG,UAAU,OAAO,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,cAAc,GAAU,IAAP,KAAS,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,UAAU,QAAQ,GAAG,UAAU,QAAQ,UAAU,CAAC,IAAI,EAAE,KAAK,cAAc,GAAU,IAAP,KAAS,CAAC,KAAK,cAAc,KAAK,IAAI,EAAE,EAAE,cAAc,GAAG,UAAU,CAAC,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC,KAAK,cAAc,CAAC,CAC9V,GAAG,UAAU,2BAA2B,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,KAAK,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,QAAY,IAAJ,GAAO,EAAE,GAAG,EAAE,CAAC,SAAS,KAAK,GAAG,OAAO,EAAE,EAAE,CAAC,EAAM,IAAJ,GAAO,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,GAAO,EAAE,WAAN,GAAoB,EAAE,WAAN,GAAqB,EAAE,WAAP,GAAgB,CAAC,SAAS,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,GAAO,EAAE,WAAN,GAAoB,EAAE,WAAN,GAAqB,EAAE,WAAP,KAAsB,EAAE,WAAN,GAAiD,EAAE,YAAnC,gCAA8C,CAAC,SAAS,IAAI,CAAC,CACxa,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAgB,OAAO,GAApB,WAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAiF,MAA/E,GAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAO,EAAE,WAAN,EAAe,EAAE,WAAW,CAAC,EAAE,GAAG,EAAS,CAAC,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,GAAgB,OAAO,GAApB,WAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAwG,MAAtG,GAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAO,EAAE,WAAN,EAAe,EAAE,WAAW,CAAC,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAS,CAAC,CAC9d,SAAS,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,oBAAoB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,GAAgB,OAAO,GAApB,WAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,KAAM,GAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,OAAO,EAAE,IAAT,CAAc,IAAK,GAAE,IAAI,EAAE,EAAE,UAAU,GAAG,EAAE,QAAQ,cAAc,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,EAAM,IAAJ,IAAQ,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAK,EAAE,KAAK,GAAG,EAAE,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,IAAK,IAAG,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAY,IAAP,MAAoB,GAAG,EAAE,EAAE,EAAX,GAAa,CAAC,CAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAC/b,GAAG,SAAS,EAAE,CAAC,GAAQ,EAAE,MAAP,GAAW,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAY,IAAP,MAAoB,GAAG,EAAE,EAAE,UAAX,GAAqB,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC,GAAQ,EAAE,MAAP,GAAW,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAY,IAAP,MAAoB,GAAG,EAAE,EAAE,EAAX,GAAa,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,MAAO,GAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAClS,GAAG,SAAS,EAAE,EAAE,EAAE,CAAC,OAAO,EAAP,CAAU,IAAK,QAAyB,GAAjB,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,KAAkB,EAAE,OAAZ,SAAwB,GAAN,KAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,WAAsF,IAA3E,EAAE,EAAE,iBAAiB,cAAc,KAAK,UAAU,GAAG,CAAC,EAAE,iBAAiB,EAAM,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAK,WAAW,GAAG,EAAE,CAAC,EAAE,MAAM,IAAK,SAAS,EAAE,EAAE,MAAY,GAAN,MAAS,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,GACpa,IAAI,GAAG,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,wBAAwB,GAAG,WAAW,EAAE,QAAQ,SAAS,oBAAoB,WAAW,EACrJ,GAAG,CAAC,WAAW,GAAG,WAAW,QAAQ,GAAG,QAAQ,oBAAoB,GAAG,oBAAoB,eAAe,GAAG,eAAe,kBAAkB,KAAK,4BAA4B,KAAK,4BAA4B,KAAK,cAAc,KAAK,wBAAwB,KAAK,wBAAwB,KAAK,gBAAgB,KAAK,mBAAmB,KAAK,eAAe,KAAK,qBAAqB,EAAG,uBAAuB,wBAAwB,SAAS,EAAE,CAAS,MAAR,GAAE,GAAG,CAAC,EAAgB,IAAP,KAAS,KAAK,EAAE,SAAS,EAAE,wBAAwB,GAAG,yBAC/f,GAAG,4BAA4B,KAAK,gBAAgB,KAAK,aAAa,KAAK,kBAAkB,KAAK,gBAAgB,KAAK,kBAAkB,iCAAiC,EAAE,GAAiB,OAAO,+BAArB,IAAoD,CAAC,IAAI,GAAG,+BAA+B,GAAG,CAAC,GAAG,YAAY,GAAG,cAAc,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,EAAE,GAAG,EAAE,MAAS,CAAC,CAAC,CAAC,EAAQ,mDAAmD,GAC/Y,EAAQ,aAAa,SAAS,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,UAAU,QAAiB,UAAU,KAAnB,IAAK,GAAiB,UAAU,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,EAAQ,WAAW,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAA4P,OAAlP,GAAP,OAAuB,CAAC,IAAI,EAAE,sBAAsB,EAAE,CAAC,GAAY,EAAE,mBAAX,IAAK,KAAyB,EAAE,EAAE,kBAA2B,EAAE,qBAAX,IAAK,KAA2B,EAAE,EAAE,qBAAqB,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAO,EAAE,WAAN,EAAe,EAAE,WAAW,CAAC,EAAS,IAAI,GAAG,CAAC,CAAC,EACrf,EAAQ,YAAY,SAAS,EAAE,CAAC,GAAS,GAAN,KAAQ,OAAO,KAAK,GAAO,EAAE,WAAN,EAAe,OAAO,EAAE,IAAI,EAAE,EAAE,gBAAgB,GAAY,IAAT,IAAK,GAAsF,MAA/D,OAAO,EAAE,QAAtB,WAAmC,MAAM,EAAE,GAAG,CAAC,GAAE,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,GAAuC,MAApC,GAAE,GAAG,CAAC,EAAE,EAAS,IAAP,KAAS,KAAK,EAAE,UAAiB,CAAC,EAAE,EAAQ,UAAU,SAAS,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,EAAQ,QAAQ,SAAS,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAC/Y,EAAQ,YAAY,SAAS,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAQ,GAAN,MAAS,EAAE,iBAAiB,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAyO,GAA/N,GAAP,OAAuB,CAAC,IAAI,EAAE,sBAAsB,EAAE,CAAC,GAAY,EAAE,mBAAX,IAAK,KAAyB,EAAE,EAAE,kBAA2B,EAAE,qBAAX,IAAK,KAA2B,EAAE,EAAE,qBAAqB,EAAE,GAAG,EAAE,KAAK,EAAE,EAAQ,GAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG,CAAC,EAAK,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAQ,EAAE,iCAAR,KAAwC,EAAE,gCAAgC,CAAC,EAAE,CAAC,EAAE,EAAE,gCAAgC,KAAK,EACvhB,CAAC,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC,EAAE,EAAQ,OAAO,SAAS,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAQ,uBAAuB,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,qBAAqB,GAAG,UAAU,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,oBAAoB,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAQ,wBAAwB,GAC/U,EAAQ,oCAAoC,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,EAAE,GAAG,CAAC,EAAE,GAAS,GAAN,MAAkB,EAAE,kBAAX,IAAK,GAAsB,MAAM,MAAM,EAAE,EAAE,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAQ,QAAQ,kDC/T7L,SAAS,GAAW,CAGhB,YAAO,+BAAmC,KAC1C,OAAO,+BAA+B,UAAa,YAcrD,GAAI,CAEF,+BAA+B,SAAS,CAAQ,CAClD,OAAS,EAAK,CAGZ,QAAQ,MAAM,CAAG,CACnB,CACF,CAKE,EAAS,EACT,EAAO,QAAA,EAAA,cChCT,IAAI,EAAA,EAAA,EAEF,EAAQ,WAAa,EAAE,WACvB,EAAQ,YAAc,EAAE,gCCLpB,EAAqB,2BAEd,EAAb,cAA0C,KAAM,CAC9C,YAAY,EAAU,uCAAwC,CAC5D,MAAM,CAAO,EACb,KAAK,KAAO,sBACd,CACF,EAEa,EAAb,cAA0C,KAAM,CAC9C,YAAY,EAAM,EAAS,EAAS,CAClC,MAAM,GAAW,cAAc,EAC/B,KAAK,KAAO,uBACZ,KAAK,KAAO,EACZ,KAAK,QAAU,CACjB,CACF,EAEA,SAAgB,GAAsB,CACpC,MAAO,EAAQ,OAAO,aAAa,QAAQ,CAAkB,CAC/D,CAEA,eAAsB,IAAmB,CAEvC,IAAM,EAAe,IADA,gBAAgB,OAAO,SAAS,KAAK,QAAQ,KAAM,EAAE,CACrD,CAAA,CAAS,IAAI,MAAM,EACxC,GAAI,CAAC,EAAc,OAAO,EAAoB,EAE9C,IAAM,EAAW,MAAM,MAAM,YAAa,CACxC,OAAQ,OACR,QAAS,CAAE,2BAA4B,CAAa,CACtD,CAAC,EACK,EAAU,MAAM,EAAS,KAAK,CAAC,CAAC,WAAa,CAAC,EAAE,EACtD,GAAI,CAAC,EAAS,IAAM,CAAC,EAAQ,iBAC3B,MAAM,IAAI,EAAqB,EAAQ,OAAS,2CAA2C,EAI7F,OAFA,OAAO,aAAa,QAAQ,EAAoB,EAAQ,gBAAgB,EACxE,OAAO,QAAQ,aAAa,KAAM,GAAI,GAAG,OAAO,SAAS,WAAW,OAAO,SAAS,QAAQ,EACrF,EACT,CAEA,SAAS,GAAgB,CACvB,MAAO,CAAE,0BAA2B,OAAO,aAAa,QAAQ,CAAkB,GAAK,EAAG,CAC5F,CAEA,SAAgB,EAAe,EAAS,EAAQ,EAAU,CACxD,IAAM,EAAY,EAAQ,MAAQ,EAAQ,WAAW,KASrD,OARI,IAAW,MAAQ,CACrB,4BACA,kBACA,4BACA,iBACF,CAAC,CAAC,SAAS,CAAS,GAAK,CAAC,eAAgB,aAAa,CAAC,CAAC,SAAS,CAAS,GAClE,IAAI,EAAqB,EAAW,EAAQ,MAAO,EAAQ,OAAO,EAEhE,MAAM,EAAQ,OAAS,CAAQ,CAC5C,CAEA,eAAe,EAAc,EAAU,EAAU,CAC/C,IAAM,EAAU,MAAM,EAAS,KAAK,CAAC,CAAC,WAAa,CAAC,EAAE,EACtD,GAAI,CAAC,EAAS,GAKZ,MAJI,EAAQ,OAAS,oBACnB,OAAO,cAAc,IAAI,YAAY,uBAAwB,CAAE,OAAQ,EAAQ,KAAM,CAAC,CAAC,EACjF,IAAI,EAAqB,EAAQ,KAAK,GAExC,EAAe,EAAS,EAAS,OAAQ,CAAQ,EAEzD,OAAO,CACT,CAEA,eAAsB,EAAW,EAAM,EAAO,CAAC,EAAG,CAAE,UAAW,CAAC,EAAG,CACjE,IAAM,EAAW,MAAM,MAAM,EAAM,CACjC,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,GAAG,EAAc,CACnB,EACA,KAAM,KAAK,UAAU,CAAI,EACzB,QACF,CAAC,EACD,OAAO,EAAc,EAAU,4BAA4B,EAAS,OAAO,EAAE,CAC/E,CAEA,eAAsB,GAAY,EAAQ,EAAG,CAC3C,IAAM,EAAW,MAAM,MAAM,uBAAuB,IAAS,CAC3D,QAAS,EAAc,CACzB,CAAC,EACD,OAAO,EAAc,EAAU,qCAAqC,EAAS,OAAO,EAAE,CACxF,CAEA,eAAsB,IAAc,CAClC,IAAM,EAAW,MAAM,MAAM,gBAAiB,CAAE,QAAS,EAAc,CAAE,CAAC,EAC1E,OAAO,EAAc,EAAU,oCAAoC,EAAS,OAAO,EAAE,CACvF,CAEA,eAAsB,IAAoB,CACxC,GAAI,CACF,MAAM,EAAW,oBAAoB,CACvC,QAAU,CACR,OAAO,aAAa,WAAW,CAAkB,CACnD,CACF,CAEA,eAAsB,EAAW,EAAO,CAAC,EAAG,EAAU,CAAC,EAAG,CACxD,OAAO,EAAW,eAAgB,EAAM,CAAO,CACjD,CAEA,eAAsB,EAAkB,EAAO,CAAC,EAAG,EAAU,CAAC,EAAG,CAC/D,OAAO,EAAW,uBAAwB,EAAM,CAAO,CACzD,CC1GA,SAAgB,EAAmB,EAAK,EAAc,CACpD,GAAM,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,KAAe,CACvC,GAAI,CACF,IAAM,EAAS,OAAO,aAAa,QAAQ,CAAG,EAC9C,OAAO,EAAS,KAAK,MAAM,CAAM,EAAI,CACvC,MAAQ,CACN,OAAO,CACT,CACF,CAAC,EAMD,OAJA,EAAA,EAAA,UAAA,KAAgB,CACd,OAAO,aAAa,QAAQ,EAAK,KAAK,UAAU,CAAK,CAAC,CACxD,EAAG,CAAC,EAAK,CAAK,CAAC,EAER,CAAC,EAAO,CAAQ,CACzB,CCjBA,SAAgB,IAA0B,CACxC,IAAI,EAAW,EACX,EAAa,KACjB,MAAO,CACL,OAAQ,CAIN,OAHA,GAAY,MAAM,EAClB,EAAa,IAAI,gBACjB,GAAY,EACL,CAAE,WAAU,aAAY,OAAQ,EAAW,MAAO,CAC3D,EACA,SAAS,EAAW,CAClB,OAAO,IAAc,CACvB,EACA,QAAS,CACP,GAAY,MAAM,EAClB,GAAY,CACd,CACF,CACF,CAEA,SAAgB,EAAkB,EAAU,EAAQ,IAAK,EAAS,WAAY,CAC5E,IAAM,EAAK,EAAO,WAAW,EAAU,CAAK,EAC5C,UAAa,EAAO,aAAa,CAAE,CACrC,CCvBA,SAAgB,GAAwB,EAAS,EAAW,EAAQ,CAKlE,MAJI,CAAC,GAAS,IACP,CAAC,GAAS,UACV,GAAQ,YAAc,EAAQ,IAC9B,GAAQ,kBAAoB,EAAQ,SAAiB,KACrD,CACL,GAAG,EACH,QAAS,CAAE,GAAG,CAAQ,EACtB,UAAW,EAAQ,GACnB,gBAAiB,EAAQ,SACzB,OAAQ,CAAE,GAAG,CAAO,CACtB,CACF,CAEA,SAAgB,GAA0B,EAAS,CACjD,IAAM,EAAQ,GAAS,QAAQ,QAAQ,2BAClC,GAAS,QAAQ,2BACjB,GAAS,2BACT,CAAC,EACN,OAAO,MAAM,QAAQ,CAAK,EAAI,EAAM,OAAO,OAAO,EAAI,CAAC,CACzD,CAEA,SAAgB,GAAe,EAAS,CAAE,eAAc,eAAc,WAAW,CAC/E,IAAM,EAAU,GAA0B,CAAO,EAMjD,OALgB,GAAS,QAAQ,UAAY,WAAa,GAAS,UAAY,WAAa,EAAQ,OAAS,EAKtG,CACL,KAAM,UACN,MAAO,EACP,QAAS,CAAC,EANU,EAAQ,OAC1B,OAAO,EAAQ,OAAO,oBAAoB,EAAQ,KAAK,GAAG,IAC1D,qBAI8B,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAC5D,EARqB,CAAE,KAAM,UAAW,MAAO,EAAc,SAAQ,CASvE,CAEA,SAAS,GAAqB,EAAM,EAAU,CAC5C,IAAM,EAAa,OAAO,GAAQ,EAAE,CAAC,CAAC,WAAW,KAAM,GAAG,CAAC,CAAC,QAAQ,UAAW,GAAG,CAAC,CAAC,QAAQ,MAAO,EAAE,EACrG,OAAO,IAAa,QAAU,EAAW,YAAY,EAAI,CAC3D,CAEA,SAAgB,EAAsB,EAAW,CAAC,EAAG,CAAE,WAAW,OAAO,QAAY,IAAc,QAAQ,SAAW,WAAc,CAAC,EAAG,CACtI,IAAM,EAAO,IAAI,IACjB,OAAO,EAAS,QAAQ,EAAS,IAAU,CACzC,IAAM,EAAW,GAAS,UAAY,GAAS,GACzC,EAAc,GAAS,aAAe,GAAS,UAAY,GAAS,aAAe,GAAS,KAC5F,EAAM,EAAW,UAAU,IAAa,EAAc,WAAW,GAAqB,EAAa,CAAQ,IAAM,QAAQ,IAG/H,MAFA,CAAI,EAAK,IAAI,CAAG,IAChB,EAAK,IAAI,CAAG,EACL,GACT,CAAC,CACH,CAEA,SAAS,GAAqB,EAAO,CAAE,kBAAkB,IAAU,CAAC,EAAG,CACrE,IAAM,EAAa,OAAO,GAAS,EAAE,CAAC,CAAC,QAAQ,UAAW,EAAE,CAAC,CAAC,WAAW,KAAM,GAAG,EAClF,OAAO,EAAkB,EAAW,YAAY,EAAI,CACtD,CAEA,SAAS,GAAkB,EAAM,EAAO,EAAS,CAC/C,MAAO,GAAQ,GAAQ,GAAS,GAAqB,EAAM,CAAO,IAAM,GAAqB,EAAO,CAAO,EAC7G,CAEA,SAAS,GAAkB,EAAO,CAChC,IAAM,EAAa,OAAO,GAAS,EAAE,CAAC,CAAC,QAAQ,UAAW,EAAE,EACtD,EAAiB,KAAK,IAAI,EAAW,YAAY,GAAG,EAAG,EAAW,YAAY,IAAI,CAAC,EAIzF,OAHI,EAAiB,EAAU,GAC3B,IAAmB,EAAU,EAAW,MAAM,EAAG,CAAC,EAClD,IAAmB,GAAK,aAAa,KAAK,CAAU,EAAU,EAAW,MAAM,EAAG,CAAC,EAChF,EAAW,MAAM,EAAG,CAAc,CAC3C,CAEA,SAAgB,GAA+B,EAAQ,EAAQ,CAC7D,IAAM,EAAsB,GAAQ,iBAAiB,KACrD,GAAI,EAAqB,OAAO,GAAkB,CAAmB,EACrE,IAAM,EAAiB,GAAQ,SACzB,EAAa,CAAE,gBAAiB,GAAQ,gCAAkC,EAAK,EAMrF,OALI,OAAO,GAAgB,OAAO,GAAK,GAChC,GAAQ,mBAAqB,WAC7B,GAAkB,GAAgB,WAAY,GAAQ,UAAW,CAAU,EACzE,EAAO,UAET,GAAQ,YAAc,EAC/B,CAEA,SAAgB,GAAuB,CAAE,SAAQ,UAAS,mBAAkB,kBAAiB,gBAAe,kBAAiB,gCAAgC,IAAS,CACpK,IAAM,EAAmB,GAAQ,UAAU,WACrC,EAAqB,GAAS,YAAY,KAAK,GAAK,GACpD,EAAqB,GACzB,GACG,GACA,GACA,CAAC,GAAkB,EAAkB,EAAkB,CAAE,gBAAiB,CAA8B,CAAC,GAExG,EAAwB,GAAsB,CAAC,EAC/C,EAAwB,GAAsB,EACpD,MAAO,CACL,qBACA,wBACA,wBACA,UAAW,EAAQ,GAAoB,CAAC,GAAyB,CAAC,CACpE,CACF,CCnGA,SAAgB,GAAe,EAAW,CACxC,MAAO,CAAE,UAAW,GAAa,SAAU,CAC7C,CAOA,SAAgB,GAAqB,CAAE,cAAa,eAAc,OAAO,GAAwB,GAAK,CACpG,IAAM,EAAU,MAAO,CAAE,YAAW,cAAc,GAAM,YAAW,WAAU,aAAc,CACzF,GAAM,CAAE,aAAY,YAAa,EAAK,MAAM,EACxC,GAAa,IAAY,EAAI,EACjC,GAAI,CACF,IAAM,EAAU,GAAe,CAAS,EAClC,CAAC,EAAe,GAAiB,MAAM,QAAQ,IAAI,CACvD,EAAY,EAAS,CAAE,OAAQ,EAAW,MAAO,CAAC,EAClD,EAAa,EAAS,CAAE,OAAQ,EAAW,MAAO,CAAC,CACrD,CAAC,EAGD,OAFK,EAAK,SAAS,CAAQ,GAC3B,IAAW,CAAE,YAAW,OAAQ,EAAc,OAAQ,QAAS,CAAc,CAAC,EACvE,IAF8B,EAGvC,OAAS,EAAO,CAGd,OAFI,GAAO,OAAS,cAAgB,CAAC,EAAK,SAAS,CAAQ,GAC3D,IAAU,CAAK,EADsD,EAGvE,QAAU,CACJ,EAAK,SAAS,CAAQ,GAAG,IAAY,EAAK,CAChD,CACF,EAEA,MADA,GAAQ,WAAe,EAAK,OAAO,EAC5B,CACT,cCzBa,IAAI,EAAA,EAAA,EAAmB,EAAE,OAAO,IAAI,eAAe,EAAE,EAAE,OAAO,IAAI,gBAAgB,EAAE,EAAE,OAAO,UAAU,eAAe,EAAE,EAAE,mDAAmD,kBAAkB,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC,EAClP,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,KAAiF,IAAI,KAAvE,IAAT,IAAK,KAAQ,EAAE,GAAG,GAAY,EAAE,MAAX,IAAK,KAAY,EAAE,GAAG,EAAE,KAAc,EAAE,MAAX,IAAK,KAAY,EAAE,EAAE,KAAc,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,aAAa,IAAI,IAAK,GAAE,EAAE,aAAa,EAAW,EAAE,KAAX,IAAK,KAAW,EAAE,GAAG,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,EAAQ,SAAS,EAAE,EAAQ,IAAI,EAAE,EAAQ,KAAK,kBCPxW,EAAO,QAAA,EAAA,OCDT,SAAS,EAAK,CAAE,WAAU,OAAO,GAAI,YAAY,IAAM,CACrD,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAgB,YAAW,MAAO,EAAM,OAAQ,EAAM,QAAQ,YAAY,KAAK,OAAO,OAAO,eAAe,YAAY,MAAM,cAAc,QAAQ,eAAe,QAAQ,cAAY,OACpL,UACE,CAAA,CAET,CAEA,IAAa,EAAe,IAAU,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,GAAI,EAAV,SAAA,EAAiB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,YAAc,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,YAAc,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,gCAAkC,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,mCAAqC,CAAA,CAAO,IACvL,GAAgB,IAAU,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,GAAI,EAAV,SAAA,EAAiB,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,GAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,oCAAsC,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,sCAAwC,CAAA,CAAO,IACzL,GAAe,IAAU,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,GAAI,EAAV,SAAA,EAAiB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,2BAA6B,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,UAAY,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,aAAe,CAAA,CAAO,IACnI,GAAgB,IAAU,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,EAAO,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,wBAA0B,CAAA,CAAO,CAAA,EACpF,GAAgB,IAAU,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,GAAI,EAAV,SAAA,EAAiB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,IAAI,GAAG,GAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,KAAK,EAAE,IAAI,MAAM,IAAI,OAAO,IAAI,GAAG,GAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,IAAI,EAAE,KAAK,MAAM,IAAI,OAAO,IAAI,GAAG,GAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,KAAK,EAAE,KAAK,MAAM,IAAI,OAAO,IAAI,GAAG,GAAK,CAAA,CAAO,IACrP,GAAc,IAAU,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,GAAI,EAAV,SAAA,EAAiB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,qEAAuE,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,eAAiB,CAAA,CAAO,IACzJ,GAAe,IAAU,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,EAAO,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,eAAiB,CAAA,CAAO,CAAA,EAC1E,GAAS,IAAU,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,EAAO,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,sBAAwB,CAAA,CAAO,CAAA,EAC3E,GAAa,IAAU,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,EAAO,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,gBAAkB,CAAA,CAAO,CAAA,EACzE,EAAa,IAAU,EAAA,EAAA,KAAA,CAAC,EAAD,CAAM,GAAI,EAAV,SAAA,EAAiB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,yBAA2B,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,mBAAqB,CAAA,CAAO,IAChH,GAAc,IAAU,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAI,EAAO,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAE,wDAA0D,CAAA,CAAO,CAAA,ECWzH,GAAY,CAChB,CAAE,GAAI,WAAY,MAAO,KAAM,KAAM,EAAa,EAClD,CAAE,GAAI,UAAW,MAAO,OAAQ,KAAM,EAAY,EAClD,CAAE,GAAI,UAAW,MAAO,KAAM,KAAM,EAAY,EAChD,CAAE,GAAI,WAAY,MAAO,KAAM,KAAM,EAAa,CACpD,EAEM,GAAgB,CAAE,WAAY,GAAI,QAAS,CAAC,CAAE,EAEpD,SAAS,GAAa,EAAO,CAC3B,OAAO,IAAI,KAAK,aAAa,OAAO,CAAC,CAAC,OAAO,OAAO,CAAK,GAAK,CAAC,CACjE,CAEA,SAAS,GAAY,EAAO,CAC1B,IAAM,EAAQ,CAAC,IAAK,KAAM,KAAM,KAAM,IAAI,EACtC,EAAQ,OAAO,CAAK,GAAK,EACzB,EAAQ,EACZ,KAAO,GAAS,MAAQ,EAAQ,EAAM,OAAS,GAC7C,GAAS,KACT,GAAS,EAEX,OAAO,IAAU,EAAI,GAAG,EAAM,IAAM,GAAG,EAAM,QAAQ,GAAS,GAAK,EAAI,CAAC,CAAC,CAAC,QAAQ,OAAQ,EAAE,EAAE,GAAG,EAAM,IACzG,CAEA,SAAS,GAAW,EAAO,CAEzB,OADK,EACE,IAAI,KAAK,eAAe,QAAS,CACtC,MAAO,UACP,IAAK,UACL,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,OAAQ,EACV,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,CAAK,CAAC,EARN,MASrB,CAEA,SAAS,GAAqB,EAAM,EAAW,CAE7C,OADc,EAAK,MAAM,oCAClB,CAAA,CAAM,KAAK,EAAM,IAClB,EAAK,WAAW,GAAG,GAAK,EAAK,SAAS,GAAG,GAAU,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAA0C,EAAK,MAAM,EAAG,EAAE,CAAQ,EAAvD,GAAG,EAAU,QAAQ,GAAkC,EACrH,EAAK,WAAW,IAAI,GAAK,EAAK,SAAS,IAAI,GAAU,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAA8C,EAAK,MAAM,EAAG,EAAE,CAAU,EAA3D,GAAG,EAAU,UAAU,GAAoC,EAC7H,EAAK,WAAW,GAAG,GAAK,EAAK,SAAS,GAAG,GAAU,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAsC,EAAK,MAAM,EAAG,EAAE,CAAM,EAAnD,GAAG,EAAU,MAAM,GAAgC,GAC5G,EAAA,EAAA,IAAA,CAAA,EAAO,SAAP,CAAA,SAAoD,CAAqB,EAApD,GAAG,EAAU,QAAQ,GAA+B,CACjF,CACH,CAEA,SAAS,GAAa,CAAE,QAAQ,CAE9B,OADe,OAAO,GAAQ,EAAE,CAAC,CAAC,MAAM,2BACjC,CAAA,CAAO,KAAK,EAAO,IAAU,CAClC,GAAI,EAAM,WAAW,KAAK,GAAK,EAAM,SAAS,KAAK,EAAG,CACpD,IAAM,EAAQ,EAAM,MAAM,EAAG,EAAE,CAAC,CAAC,QAAQ,SAAU,EAAE,EACrD,OAAO,EAAA,EAAA,IAAA,CAAC,MAAD,CAAA,UAA4B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,CAAY,CAAA,CAAM,EAA3C,SAAS,GAAkC,CAC9D,CACA,OAAO,EAAM,MAAM;CAAI,CAAC,CAAC,KAAK,EAAM,EAAW,KAAU,EAAA,EAAA,KAAA,CAAA,EAAO,SAAP,CAAA,SAAA,CAAoD,GAAqB,EAAM,GAAG,EAAM,GAAG,GAAW,EAAG,EAAY,EAAM,OAAS,GAAI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAK,CAAA,EAAI,IAAqB,CAAA,EAAjJ,QAAQ,EAAM,GAAG,GAAgI,CAAC,CAClO,CAAC,CACH,CAEA,SAAS,GAAoB,EAAQ,CACnC,GAAI,CAAC,EAAQ,MAAO,CAAC,EACrB,IAAM,EAAU,IAAI,IACd,GAAO,EAAQ,IAAW,CAC9B,IAAK,IAAM,KAAS,GAAU,CAAC,EAAG,CAChC,GAAI,CAAC,GAAS,IAAU,YAAa,SACrC,IAAM,EAAS,EAAQ,IAAI,CAAK,GAAK,IAAI,IACzC,EAAO,IAAI,CAAM,EACjB,EAAQ,IAAI,EAAO,CAAM,CAC3B,CACF,EAOA,OANA,EAAI,EAAO,oBAAqB,QAAQ,EACxC,EAAI,OAAO,KAAK,EAAO,eAAe,UAAY,CAAC,CAAC,EAAG,SAAS,EAChE,EAAI,OAAO,KAAK,EAAO,eAAe,mBAAqB,CAAC,CAAC,EAAG,SAAS,EACzE,EAAI,OAAO,KAAK,EAAO,cAAc,UAAY,CAAC,CAAC,EAAG,QAAQ,EAC9D,EAAI,OAAO,KAAK,EAAO,cAAc,mBAAqB,CAAC,CAAC,EAAG,QAAQ,EACvE,EAAI,CAAC,EAAO,eAAe,EAAG,QAAQ,EAC/B,CAAC,GAAG,EAAQ,QAAQ,CAAC,CAAC,CAC1B,KAAK,CAAC,EAAI,MAAsB,CAC/B,KACA,QAAS,CAAC,GAAG,CAAe,EAC5B,WAAY,EAAO,qBAAqB,SAAS,CAAE,EACnD,QAAS,IAAO,EAAO,eACzB,EAAE,CAAC,CACF,MAAM,EAAM,IAAU,OAAO,EAAM,OAAO,EAAI,OAAO,EAAK,OAAO,GAAK,EAAK,GAAG,cAAc,EAAM,EAAE,CAAC,CAC1G,CAEA,SAAS,GAAU,CAAE,OAAO,WAAa,CACvC,OAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,0BAA0B,IAAQ,cAAY,MAAQ,CAAA,CAChF,CAEA,SAAS,GAAU,CAAE,SAAQ,OAAM,aAAa,CAC9C,IAAM,EAAU,GAAQ,cAAc,YAAc,IAAS,CAAC,GAAQ,cAAc,WACpF,OACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAU,aAAlB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,QAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,aAAa,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,KAAM,EAAK,CAAA,CAAM,CAAA,GAC3D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,aAAa,SAAA,qBAAwB,CAAA,GACpD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBAAiB,SAAA,YAAe,CAAA,CAC5C,CAAA,CAAA,CACF,CACL,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,iBAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,KAAM,EAAO,UAAY,EAAU,UAAY,QAAW,CAAA,GACrE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAO,QAAU,EAAU,SAAW,MAAa,CAAA,CACvD,CACL,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAU,2CAA2C,KAAK,SAAS,QAAS,EAAW,SAAU,EAAzG,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,KAAM,EAAK,CAAA,EAAC,IAEnB,CACL,CAAA,CAAA,CACC,CAAA,CAAA,GAEZ,CAEA,SAAS,GAAQ,CAAE,OAAM,UAAS,SAAQ,mBAAmB,CAC3D,OACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAU,UAAjB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,aAAa,aAAW,MACpC,SAAA,GAAU,IAAK,GAAS,CACvB,IAAM,EAAO,EAAK,KAClB,OACE,EAAA,EAAA,KAAA,CAAC,SAAD,CACE,UAAW,YAAY,IAAS,EAAK,GAAK,mBAAqB,KAE/D,KAAK,SACL,YAAe,EAAQ,EAAK,EAAE,EAJhC,SAAA,EAME,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,KAAM,EAAK,CAAA,GACjB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAK,KAAY,CAAA,CAClB,CAND,EAAA,EAAK,EAMJ,CAEZ,CAAC,CACE,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,yBAAyB,SAAA,aAAgB,CAAA,GACxD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,yBAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,KAAK,SAAW,CAAA,GAC3B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAQ,iBAAmB,KAAY,CAAA,CAC3C,KACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,kBAAkB,SAAA,yBAA4B,CAAA,GAC7D,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,uCAAuC,KAAK,SAAS,QAAS,EAAiB,SAAA,QAAc,CAAA,CAC5G,CACA,CAAA,CAAA,GAEX,CAEA,SAAS,GAAW,CAAE,WAAU,YAAW,eAAc,SAAQ,eAAc,kBAAiB,YAAW,UAAS,yBAAyB,CAC3I,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,cAAc,aAAW,OAA5C,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAU,8BAAjB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,MAAU,CAAA,GAChB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,kBAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,KAAM,EAAK,CAAA,GACvB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAO,EAAW,SAAW,GAAU,EAAa,EAAM,OAAO,KAAK,EAAG,SAAU,EACxF,SAAA,EAAS,IAAK,IAAY,EAAA,EAAA,IAAA,CAAC,SAAD,CAAyB,MAAO,EAAQ,GAAK,SAAA,EAAQ,IAAa,EAArD,EAAQ,EAA6C,CAAC,CACxF,CAAA,CACL,CACA,CAAA,CAAA,KACP,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAU,aAAjB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,SAAK,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAO,QAAa,CAAA,CAAO,CAAA,CAAA,GACtC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,kBAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,KAAM,EAAK,CAAA,GACzB,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,MAAO,GAAQ,WAAa,GAAI,SAAA,GAAS,YAAY,SAAW,CAAA,CACpE,CACA,CAAA,CAAA,KACP,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,2CAA2C,KAAK,SAAS,QAAS,EAAc,SAAA,MAAY,CAAA,EAC7G,IAAc,UAA6H,MAAjH,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,uCAAuC,KAAK,SAAS,QAAS,EAAiB,SAAA,MAAY,CAAA,GACxI,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAU,2CAA2C,KAAK,SAAS,QAAS,EAAW,SAAU,EAAzG,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,KAAM,GAAI,UAAW,EAAU,OAAS,EAAK,CAAA,EAAC,MAErD,GACD,GAEb,CAEA,SAAS,GAAa,CAAE,QAAO,SAAQ,mBAAmB,CACxD,IAAM,EAAU,OAAO,QAAQ,GAAU,CAAC,CAAC,CAAC,CAAC,MAAM,EAAM,IAAU,EAAM,GAAK,EAAK,EAAE,EAC/E,EAAQ,EAAQ,QAAQ,EAAK,EAAG,KAAW,EAAM,EAAO,CAAC,EAC/D,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,qBAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,uBAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,CAAY,CAAA,GACnB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,GAAa,CAAK,CAAU,CAAA,CAClC,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,oBACZ,SAAA,EAAQ,SAAW,GAAI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,eAAe,SAAA,KAAQ,CAAA,EAAI,EAAQ,KAAK,CAAC,EAAU,MACxF,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,mBAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,oBAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,gBAAiB,SAAA,CAAe,CAAA,GAChD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAa,CAAK,CAAQ,CAAA,CAC9B,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,YACb,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CACE,UAAW,IAAa,EAAkB,6BAA+B,WACzE,MAAO,CAAE,MAAO,GAAG,KAAK,IAAI,EAAG,EAAS,EAAQ,EAAS,IAAM,CAAC,EAAE,EAAG,CACtE,CAAA,CACE,CAAA,CACF,CAXkC,EAAA,CAWlC,CACN,CACE,CAAA,CACF,GAET,CAEA,SAAS,GAAY,CAAE,SAAQ,WAAW,CACxC,IAAM,EAAe,OAAO,OAAO,GAAQ,eAAe,UAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAK,IAAU,EAAM,EAAO,CAAC,EAC3G,OAAO,OAAO,GAAQ,eAAe,mBAAqB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAK,IAAU,EAAM,EAAO,CAAC,EACjG,EAAc,OAAO,OAAO,GAAQ,cAAc,UAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAK,IAAU,EAAM,EAAO,CAAC,EACzG,OAAO,OAAO,GAAQ,cAAc,mBAAqB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAK,IAAU,EAAM,EAAO,CAAC,EAChG,EAAU,GAAQ,WAAW,QACnC,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,eAAnB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,oBAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,MAAQ,CAAA,GACZ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,wCAAyC,CAAA,CACzC,CAAA,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,mBAAmB,EAAU,2BAA6B,6BAA1E,SAAA,CACG,GAAU,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,KAAM,GAAI,UAAU,MAAQ,CAAA,EAAI,GAAU,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,KAAM,EAAK,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,GAClH,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAU,OAAS,EAAU,kBAAoB,OAAc,CAAA,CACnE,CACF,CAAA,CAAA,KAEL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,aAAiB,CAAA,GACvB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,GAAQ,iBAAmB,GAAY,CAAA,GAChD,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAQ,GAAQ,wBAA0B,OAAS,kBAA0B,CAAA,CAC1E,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,YAAgB,CAAA,GACtB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,GAAa,CAAY,CAAU,CAAA,GAC5C,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAO,qBAA0B,CAAA,CAC9B,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,gBAAoB,CAAA,GAC1B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,GAAQ,cAAc,WAAa,MAAQ,GAAa,CAAW,CAAU,CAAA,GACtF,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAQ,GAAQ,iBAAiB,QAAU,QAAgB,CAAA,CACxD,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,MAAU,CAAA,GAChB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,GAAa,GAAQ,eAAe,KAAK,CAAU,CAAA,GAC5D,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAQ,GAAY,GAAQ,eAAe,UAAU,CAAS,CAAA,CAC3D,GACF,KAEL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,oBAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sBAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EAA8B,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,KAAM,EAAK,CAAA,EAAC,gBAAmB,KACzE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,MAAM,WAAW,OAAQ,GAAQ,eAAe,SAAU,gBAAiB,GAAQ,eAAkB,CAAA,GACnH,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,MAAM,oBAAoB,OAAQ,GAAQ,eAAe,kBAAmB,gBAAiB,GAAQ,eAAkB,CAAA,CAClI,KACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,sBAAwB,CAAA,GACvC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sBAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EAA8B,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,KAAM,EAAK,CAAA,EAAC,eAAkB,KAC1E,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,MAAM,WAAW,OAAQ,GAAQ,cAAc,SAAU,gBAAiB,GAAQ,eAAkB,CAAA,GAClH,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,MAAM,oBAAoB,OAAQ,GAAQ,cAAc,kBAAmB,gBAAiB,GAAQ,eAAkB,CAAA,CACjI,GACF,GACE,GAEb,CAEA,SAAS,GAAS,CAAE,UAAU,CAC5B,IAAM,EAAQ,CAAC,EACX,GAAQ,cAAc,YAAc,IACtC,EAAM,KAAK,CAAE,KAAM,SAAU,MAAO,kBAAmB,OAAQ,EAAO,aAAa,OAAQ,CAAC,EAE1F,GAAQ,cAAc,YACxB,EAAM,KAAK,CAAE,KAAM,SAAU,MAAO,eAAgB,OAAQ,EAAO,aAAa,KAAM,CAAC,EAErF,GAAQ,oBAAoB,QAC9B,EAAM,KAAK,CAAE,KAAM,UAAW,MAAO,GAAG,EAAO,mBAAmB,OAAO,mBAAoB,OAAQ,yBAA0B,CAAC,EAE9H,GAAQ,yBACV,EAAM,KAAK,CAAE,KAAM,UAAW,MAAO,wBAAyB,OAAQ,EAAO,uBAAwB,CAAC,EAExG,IAAM,EAAU,GAAQ,kBAKxB,OAJI,GAAS,4BAA8B,GAAS,uBAClD,EAAM,KAAK,CAAE,KAAM,OAAQ,MAAO,gBAAiB,OAAQ,cAAc,EAAQ,4BAA8B,EAAE,OAAO,EAAQ,sBAAwB,GAAI,CAAC,EAE3J,EAAM,SAAW,EAAU,MAE7B,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAU,gBAAgB,aAAW,OAC3C,SAAA,EAAM,KAAK,EAAM,KAChB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,4BAA4B,EAAK,OAAjD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,GACtB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAK,KAAc,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAK,MAAa,CAAA,CAAM,CAAA,CAAA,CAC9D,CAHyD,EAAA,GAAG,EAAK,MAAM,GAAG,GAG1E,CACN,CACM,CAAA,CAEb,CAEA,SAAS,GAAkB,CAAE,WAAW,CAAC,GAAK,CAC5C,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,eAAnB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,+CACb,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,OAAS,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,iCAAkC,CAAA,CAAM,CAAA,CAAA,CAC3D,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,eACb,UAAA,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAU,aAAjB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,UAAO,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,EAAI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,OAAS,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,MAAQ,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,IAAM,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,OAAS,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,UAAY,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,UAAY,CAAA,CAAK,CAAA,CAAA,CAAQ,CAAA,GAC7G,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SACG,EAAS,SAAW,GACnB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,UAAI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,QAAQ,IAAI,UAAU,cAAc,SAAA,aAAe,CAAA,CAAK,CAAA,EAC9D,EAAS,IAAK,IAChB,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,YAAa,SAAA,EAAQ,IAAS,CAAA,GAC5C,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAQ,kBAAuB,CAAA,GACpC,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,CAAK,EAAQ,iBAAiB,KAAO,CAAA,CAAA,GACrC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAQ,aAAe,GAAQ,CAAA,GACpC,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,CAAK,EAAQ,gBAAgB,IAAE,EAAQ,kBAAuB,CAAA,CAAA,GAC9D,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,OAAO,QAAQ,EAAQ,gBAAkB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAU,KAAW,GAAG,EAAS,GAAG,GAAO,CAAC,CAAC,KAAK,KAAK,GAAK,GAAQ,CAAA,CAC1H,CAAA,EAPK,EAAQ,IAOb,CACL,CACI,CAAA,CACF,GACJ,CAAA,CACE,GAEb,CAEA,SAAS,GAAiB,CAAE,QAAO,WAAU,YAAY,CACvD,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,YAAY,KAAK,aAAa,aAAW,OAAxD,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,IAAU,OAAS,4CAA8C,mBAAoB,YAAe,EAAS,MAAM,EAAa,WAAjK,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,QAAY,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAO,iBAAsB,CAAA,CAC1C,CACR,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,IAAU,SAAW,4CAA8C,mBAAoB,YAAe,EAAS,QAAQ,EAAa,WAArK,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,iBAAqB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAO,QAAa,CAAA,CAC1C,CACL,CAAA,CAAA,GAET,CAEA,SAAS,GAAe,CAAE,SAAQ,YAAW,mBAAkB,sBAAqB,sBAAqB,yBAAwB,mBAAkB,QAAQ,CACzJ,GAAM,CAAC,EAAM,GAAW,EAAmB,eAAgB,MAAM,EAC3D,CAAC,EAAW,GAAgB,EAAmB,oBAAqB,MAAM,EAC1E,CAAC,EAAa,GAAkB,EAAmB,sBAAuB,EAAE,EAC5E,CAAC,EAAW,GAAgB,EAAmB,oBAAqB,CAAC,EACrE,CAAC,EAAgB,IAAA,EAAqB,EAAA,SAAA,CAAS,EAAE,EACjD,EAAiB,EAAU,KAAM,GAAa,EAAS,KAAO,CAAgB,EAC9E,EAAgB,GAAgB,WAChC,EAAsB,oBAAoB,KAAK,EAAe,KAAK,CAAC,EACpE,GAAoB,GAAQ,cAAc,YAAc,GACxD,EAAkB,GAAQ,CAAC,GAAoB,IAAqB,GAAQ,cAAc,WAEhG,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,kBAAnB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,iBAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,MAAQ,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,iDAAkD,CAAA,CAAM,CAAA,CAAA,GAC7E,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,KAAM,EAAK,CAAA,CACpB,KACL,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,MAAO,EAAM,SAAU,EAAS,SAAU,CAAO,CAAA,GACnE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,YAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAU,aAAjB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,aAAiB,CAAA,GACvB,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAO,EAAkB,SAAW,GAAU,EAAoB,EAAM,OAAO,KAAK,EAAG,SAAU,EACtG,SAAA,EAAU,IAAK,IAAa,EAAA,EAAA,KAAA,CAAC,SAAD,CAA0B,MAAO,EAAS,GAA1C,SAAA,CAA+C,EAAS,GAAI,EAAS,QAAU,OAAS,EAAW,CAAtF,EAAA,EAAS,EAA6E,CAAC,CAC3H,CAAA,EACP,IAAS,UAAY,CAAC,GAAgB,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAU,cAAc,SAAA,oCAAyC,CAAA,EAAI,IAC9G,CACP,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAU,+BAAjB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,OAAW,CAAA,GACjB,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,SAAS,IAAI,IAAI,IAAI,SAAS,MAAO,EAAW,SAAW,GAAU,EAAa,OAAO,EAAM,OAAO,KAAK,CAAC,EAAG,SAAU,CAAO,CAAA,GAC5I,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAO,SAAc,CAAA,CAChB,CACJ,CAAA,CAAA,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sBAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,KAAK,OACL,MAAO,EACP,SAAW,GAAU,EAAkB,EAAM,OAAO,KAAK,EACzD,YAAY,mBACZ,WAAW,QACX,SAAU,CACX,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,SAAD,CACE,UAAU,uCACV,KAAK,SACL,SAAU,GAAQ,CAAC,EACnB,YAAe,CACb,EAAoB,EAAe,KAAK,CAAC,EACzC,EAAkB,EAAE,CACtB,EACD,SAAA,IAEO,CAAA,EACP,GAAgB,QAAS,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,gBAAgB,KAAK,SAAS,YAAe,EAAuB,CAAgB,EAAG,SAAU,EAAM,SAAA,SAAe,CAAA,EAAI,IACnK,IAEJ,IAAS,UACR,EAAA,EAAA,KAAA,CAAC,WAAD,CAAU,UAAU,gBAAgB,SAAU,EAA9C,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,UAAgB,CAAA,GACxB,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EAAO,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,QAAQ,KAAK,aAAa,QAAS,IAAc,OAAQ,aAAgB,EAAa,MAAM,CAAI,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,gBAAsB,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,CAAO,wBAAsB,EAAiB,aAAkB,CAAA,CAAA,CAAO,CAAA,CAAA,CAAQ,CAAA,CAAA,GACxO,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EAAO,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,QAAQ,KAAK,aAAa,QAAS,IAAc,OAAQ,aAAgB,EAAa,MAAM,CAAI,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,cAAoB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAO,oBAAyB,CAAA,CAAO,CAAA,CAAA,CAAQ,CAAA,CAAA,GACtM,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAU,sBAAjB,SAAA,EAAuC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,QAAQ,KAAK,aAAa,QAAS,IAAc,SAAU,aAAgB,EAAa,QAAQ,CAAI,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,WAAiB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,OAAO,MAAO,EAAa,YAAe,EAAa,QAAQ,EAAG,SAAW,GAAU,EAAe,EAAM,OAAO,KAAK,EAAG,YAAY,eAAiB,CAAA,CAAO,CAAA,CAAA,CAAQ,GACnW,CACR,CAAA,EAAA,KAEH,IAAoB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sCAAf,SAAA,EAAqD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,iBAAuB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAQ,cAAc,SAAW,wCAA+C,CAAA,CAAM,CAAA,CAAA,CAAM,CAAI,CAAA,EAAA,MAE7O,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,mBAAf,SAAA,EAAkC,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,sCAA0C,CAAA,CAAM,KAC/G,EAAA,EAAA,KAAA,CAAC,SAAD,CACE,UAAU,wCACV,KAAK,SACL,SAAU,GAAoB,IAAS,UAAY,CAAC,GAAmB,IAAS,UAAY,IAAc,UAAY,CAAC,EAAY,KAAK,EACxI,YAAe,EAAiB,CAAE,OAAM,YAAW,MAAO,EAAY,KAAK,EAAG,WAAU,CAAC,EAJ3F,SAAA,CAMG,GAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,KAAM,GAAI,UAAU,MAAQ,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,KAAM,EAAK,CAAA,EAC3E,EAAO,QAAU,IAAS,SAAW,QAAU,MAC1C,GACD,GAEb,CAEA,SAAS,GAAc,CAAE,UAAS,YAAW,YAAW,mBAAmB,CACzE,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,iBAAnB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,+CAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,MAAQ,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAQ,YAAc,wBAA4B,CAAA,CAAM,CAAA,CAAA,GAC9E,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAU,cAAc,QAAS,EAAvD,SAAA,CAAkE,SAAK,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,KAAM,EAAK,CAAA,CAAS,CACrG,CAAA,CAAA,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,cACZ,SAAA,EAAQ,QAAQ,SAAW,GAAI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,cAAc,SAAA,cAAiB,CAAA,EAAI,EAAQ,QAAQ,MAAM,EAAG,CAAC,CAAC,CAAC,IAAK,IACjH,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,aAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,cAAc,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,KAAM,EAAK,CAAA,CAAM,CAAA,GAC3D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,cAAf,SAAA,EAA6B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,GAAW,EAAO,SAAS,SAAS,CAAU,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAO,EAAO,SAAS,eAAe,MAAI,EAAO,SAAS,qBAAuB,EAAE,YAAgB,CAAA,CAAA,CAAM,KAC9L,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,cAAe,SAAA,GAAY,EAAO,SAAS,CAAO,CAAA,GACjE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,uCAAuC,KAAK,SAAS,SAAU,EAAiB,MAAO,EAAkB,wBAA0B,IAAA,GAAW,YAAe,EAAU,CAAM,EAAG,SAAA,IAAU,CAAA,CACzM,CAL4B,EAAA,EAAO,EAKnC,CACN,CACE,CAAA,CACE,GAEb,CAEA,SAAS,GAAS,CAAE,SAAQ,UAAS,YAAW,mBAAkB,sBAAqB,sBAAqB,yBAAwB,YAAW,YAAW,UAAS,OAAM,WAAW,CAClL,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAqB,SAAiB,SAAU,CAAA,GAChD,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,QAAS,CAAA,GAC3B,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sBAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,uBAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAmB,SAAU,GAAQ,yBAA2B,CAAC,CAAI,CAAA,GACrE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAwB,UAAS,cAAiB,EAAQ,SAAS,EAAc,YAAW,gBAAiB,GAAQ,cAAc,YAAc,EAAQ,CAAA,CACtJ,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CACU,SACG,YACO,mBACG,sBACA,sBACG,yBACxB,iBAAkB,EACZ,MACP,CAAA,CACE,GACF,GAET,CAEA,SAAS,GAAY,CAAE,UAAS,SAAQ,OAAM,YAAW,WAAW,CAClE,GAAM,CAAC,EAAW,GAAgB,EAAmB,oBAAqB,CAAC,EACrE,EAAkB,GAAQ,cAAc,YAAc,GAC5D,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,aAAnB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,IAAM,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,0CAA2C,CAAA,CAAM,CAAA,CAAA,GACpE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,SAAA,EAA+B,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,CAAO,SAAK,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,SAAS,IAAI,IAAI,IAAI,SAAS,MAAO,EAAW,SAAW,GAAU,EAAa,OAAO,EAAM,OAAO,KAAK,CAAC,CAAI,CAAA,EAAC,IAAS,CAAA,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,2BAA2B,KAAK,SAAS,SAAU,EAAM,YAAe,EAAQ,CAAS,EAAG,SAAA,OAAa,CAAA,CAAM,CAC5S,CAAA,CAAA,CACT,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,sBAAnB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,mBAAf,SAAA,EAAkC,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAQ,YAAc,GAAQ,YAAc,GAAU,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,SAAD,CAAA,SAAA,CAAS,EAAQ,QAAQ,OAAO,QAAM,GAAY,EAAQ,QAAQ,QAAQ,EAAK,IAAW,EAAM,EAAO,UAAW,CAAC,CAAC,CAAU,CAAA,CAAA,CAAM,CAC5P,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,mBACZ,SAAA,EAAQ,QAAQ,SAAW,GAAI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,cAAf,SAAA,EAA6B,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,OAAa,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,sBAA0B,CAAA,CAAM,CAAI,CAAA,EAAA,EAAQ,QAAQ,IAAK,IACzK,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,kBAAnB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,cAAf,SAAA,EAA6B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,GAAW,EAAO,SAAS,SAAS,CAAU,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAO,EAAS,CAAA,CAAM,KAClH,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EAA8B,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,aAAS,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAO,SAAS,cAAuB,CAAA,CAAO,CAAA,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,YAAQ,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAO,SAAS,qBAAuB,CAAU,CAAA,CAAO,CAAA,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,WAAO,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAO,SAAS,eAAe,OAAS,MAAQ,KAAc,CAAA,CAAO,CAAA,CAAA,CAAM,KACtR,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,SAAA,EAA+B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,aAAiB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAO,SAAS,YAAc,iBAAwB,CAAA,CAAM,KAC1H,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,qBAAf,SAAA,EAAoC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAY,EAAO,SAAS,CAAQ,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,2CAA2C,KAAK,SAAS,SAAU,GAAQ,EAAiB,MAAO,EAAkB,wBAA0B,IAAA,GAAW,YAAe,EAAU,CAAM,EAAG,SAAA,IAAU,CAAA,CAAM,GACvS,CALiC,EAAA,EAAO,EAKxC,CACV,CACE,CAAA,CACE,CACN,CAAA,CAAA,GAET,CAEA,SAAS,GAAa,CAAE,WAAU,mBAAmB,CACnD,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,aAAnB,SAAA,EAAgC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,MAAQ,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,+BAAgC,CAAA,CAAM,CAAA,CAAA,EAAE,GAAkB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,iBAAf,SAAA,EAAgC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,KAAM,GAAI,UAAU,MAAQ,CAAA,EAAC,IAAE,EAAgB,IAAU,CAAI,CAAA,EAAA,IAAc,CACvO,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,mBAAnB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EAA8B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,cAAkB,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAO,EAAS,OAAO,UAAc,CAAA,CAAA,CAAM,CAClG,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,eACZ,SAAA,EAAS,SAAW,GAAI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,gBAAgB,SAAA,OAAU,CAAA,EAAI,EAAS,IAAK,IAClF,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,4BAA4B,EAAM,QAAlD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAW,EAAM,SAAS,CAAQ,CAAA,GACzC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,gBAAiB,SAAA,EAAM,KAAY,CAAA,GACnD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,kBAAmB,SAAA,EAAM,OAAc,CAAA,EACtD,OAAO,EAAM,QAAW,UAAW,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,iBAAkB,SAAA,EAAM,MAAa,CAAA,EAAI,IAC1F,CAL2D,EAAA,EAAM,EAKjE,CACN,CACE,CAAA,CACE,CACN,CAAA,CAAA,GAET,CAEA,SAAS,GAAY,CAAE,YAAW,UAAU,CAC1C,GAAM,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAS,EAAE,EAC/B,CAAC,EAAgB,IAAA,EAAqB,EAAA,SAAA,CAAS,EAAE,EACjD,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAS,EAAE,EACrC,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAS,EAAE,EACnC,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAS,KAAK,EACxC,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,CAAC,EAC5B,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAS,CAAE,SAAU,CAAC,EAAG,MAAO,EAAG,SAAU,GAAI,YAAa,EAAM,CAAC,EAC7F,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAS,EAAE,EACzC,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,IAAI,EACnC,CAAC,EAAS,KAAA,EAAc,EAAA,SAAA,CAAS,EAAK,EACtC,CAAC,EAAe,IAAA,EAAoB,EAAA,SAAA,CAAS,EAAK,EAClD,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAS,EAAE,EAC/B,IAAA,EAAc,EAAA,OAAA,CAAO,IAAI,EACzB,IAAA,EAAgB,EAAA,OAAA,CAAO,IAAI,EACjC,AAA0B,GAAY,UAAU,GAAwB,EACxE,AAA4B,GAAc,UAAU,GAAwB,EAC5E,IAAM,GAAY,GAAoB,CAAM,EACtC,EAAW,CAAC,GAAG,IAAI,KAAK,GAAQ,yBAA2B,CAAC,EAAA,CAAG,IAAK,GAAS,EAAK,IAAI,CAAC,CAAC,GAE9F,EAAA,EAAA,UAAA,KAAgB,CACd,GAAY,QAAQ,OAAO,EAC3B,GAAc,QAAQ,OAAO,EAC7B,EAAS,EAAE,EACX,EAAkB,EAAE,EACpB,EAAY,EAAE,EACd,EAAW,EAAE,EACb,EAAY,KAAK,EACjB,EAAQ,CAAC,EACT,EAAW,CAAE,SAAU,CAAC,EAAG,MAAO,EAAG,SAAU,GAAI,YAAa,EAAM,CAAC,EACvE,EAAc,EAAE,EAChB,EAAU,IAAI,EACd,EAAS,EAAE,CACb,EAAG,CAAC,CAAS,CAAC,GAEd,EAAA,EAAA,UAAA,KACS,MAAwB,EAAkB,CAAK,EAAG,IAAK,MAAM,EACnE,CAAC,CAAK,CAAC,EAEV,IAAM,IAAA,EAAW,EAAA,YAAA,CAAY,SAAY,CACvC,GAAM,CAAE,aAAY,YAAa,GAAY,QAAQ,MAAM,EAC3D,GAAW,EAAI,EAAG,EAAS,EAAE,EAC7B,GAAI,CACF,IAAM,EAAU,MAAM,EAAW,CAAE,GAAG,GAAe,CAAS,EAAG,OAAM,SAAU,GAAI,MAAO,EAAgB,WAAU,UAAS,UAAS,EAAG,CAAE,OAAQ,EAAW,MAAO,CAAC,EACxK,GAAI,CAAC,GAAY,QAAQ,SAAS,CAAQ,EAAG,OAC7C,IAAM,EAAc,CAAE,GAAG,EAAQ,QAAS,SAAU,EAAsB,EAAQ,SAAS,QAAQ,CAAE,EACrG,EAAW,CAAW,EACtB,EAAe,GAAY,EAAY,SAAS,KAAM,GAAY,EAAQ,KAAO,CAAO,EAAI,EAAU,EAAY,SAAS,EAAE,EAAE,IAAM,EAAE,CACzI,OAAS,EAAc,CACjB,EAAa,OAAS,cAAgB,GAAY,QAAQ,SAAS,CAAQ,GAAG,EAAS,EAAa,OAAO,CACjH,QAAU,CACJ,GAAY,QAAQ,SAAS,CAAQ,GAAG,GAAW,EAAK,CAC9D,CACF,EAAG,CAAC,EAAW,EAAM,EAAgB,EAAU,EAAS,CAAQ,CAAC,GAEjE,EAAA,EAAA,UAAA,MACE,GAAS,MACI,GAAY,QAAQ,OAAO,GACvC,CAAC,EAAQ,CAAC,GACb,EAAA,EAAA,UAAA,KAAgB,CAEd,GADA,GAAc,QAAQ,OAAO,EACzB,CAAC,EAAY,CAAE,EAAU,IAAI,EAAG,EAAiB,EAAK,EAAG,MAAkB,CAC/E,GAAM,CAAE,aAAY,YAAa,GAAc,QAAQ,MAAM,EAQ7D,OAPA,EAAU,IAAI,EACd,EAAiB,EAAI,EACrB,EAAS,EAAE,EACX,EAAkB,CAAE,GAAG,GAAe,CAAS,EAAG,UAAW,CAAW,EAAG,CAAE,OAAQ,EAAW,MAAO,CAAC,CAAC,CACtG,KAAM,GAAY,CAAM,GAAc,QAAQ,SAAS,CAAQ,GAAG,EAAU,EAAQ,OAAO,CAAG,CAAC,CAAC,CAChG,MAAO,GAAiB,CAAM,EAAa,OAAS,cAAgB,GAAc,QAAQ,SAAS,CAAQ,GAAG,EAAS,EAAa,OAAO,CAAG,CAAC,CAAC,CAChJ,YAAc,CAAM,GAAc,QAAQ,SAAS,CAAQ,GAAG,EAAiB,EAAK,CAAG,CAAC,MAC9E,EAAW,MAAM,CAChC,EAAG,CAAC,EAAW,CAAU,CAAC,EAE1B,IAAM,GAAgB,GAAY,GAAU,CAAE,EAAO,EAAM,OAAO,KAAK,EAAG,EAAQ,CAAC,CAAG,EACtF,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,4BAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,aAAnB,SAAA,EAAgC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,MAAQ,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,kCAAmC,CAAA,CAAM,CAAA,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAU,2BAA2B,KAAK,SAAS,QAAS,GAAU,SAAU,EAAxF,SAAA,EAAiG,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,KAAM,GAAI,UAAW,EAAU,OAAS,EAAK,CAAA,EAAC,IAAU,CAAU,CAAA,CAAA,KAC/Q,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,kBAAnB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,MAAO,EAAO,SAAU,GAAa,CAAQ,EAAG,UAAY,GAAU,CAAM,EAAM,MAAQ,UAAW,EAAkB,CAAK,EAAG,EAAQ,CAAC,EAAK,EAAG,YAAY,wBAA0B,CAAA,GAC7L,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,MAAO,EAAU,SAAU,GAAa,CAAW,EAA3D,SAAA,EAA8D,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,GAAG,SAAA,aAAmB,CAAA,EAAE,GAAU,IAAK,IAAS,EAAA,EAAA,IAAA,CAAC,SAAD,CAAsB,MAAO,EAAK,GAAK,SAAA,EAAK,EAAW,EAA1C,EAAK,EAAqC,CAAC,CAAU,KAC9L,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,MAAO,EAAS,SAAU,GAAa,CAAU,EAAzD,SAAA,EAA4D,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,GAAG,SAAA,MAAY,CAAA,EAAE,EAAS,IAAK,IAAS,EAAA,EAAA,IAAA,CAAC,SAAD,CAAmB,MAAO,EAAO,SAAA,CAAa,EAAjC,CAAiC,CAAC,CAAU,KAC3K,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,MAAO,EAAU,SAAU,GAAa,CAAW,EAA3D,SAAA,EAA8D,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,MAAM,SAAA,MAAY,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,SAAS,SAAA,MAAY,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,MAAM,WAAW,SAAA,KAAW,CAAA,CAAS,GACzK,IACR,GAAQ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,SAAA,EAA+B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,EAAE,CAAW,CAAI,CAAA,EAAA,MAC/E,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,iBAAnB,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,qBAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,oBAAf,SAAA,EAAmC,EAAA,EAAA,KAAA,CAAC,SAAD,CAAA,SAAA,CAAS,EAAQ,MAAM,MAAY,CAAA,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,KAAG,EAAQ,KAAK,IAAQ,CAAA,CAAA,CAAM,KAC3G,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,CACG,GAAW,CAAC,EAAQ,SAAS,QAAS,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,cAAc,SAAA,MAAS,CAAA,EAAI,KAChF,CAAC,GAAW,CAAC,EAAQ,SAAS,QAAS,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,cAAf,SAAA,EAA6B,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,SAAe,CAAA,CAAM,CAAI,CAAA,EAAA,KAC9H,EAAQ,SAAS,IAAK,IAAY,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,KAAK,SAA0B,UAAW,uBAAuB,EAAQ,KAAO,EAAa,gCAAkC,KAAM,YAAe,EAAc,EAAQ,EAAE,EAApL,SAAA,EAAuL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sBAAf,SAAA,EAAqC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAQ,KAAc,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAW,EAAQ,SAAS,CAAQ,CAAA,CAAM,KAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,EAAQ,kBAAoB,WAAe,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,uBAAf,SAAA,EAAsC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAQ,QAAe,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAO,EAAQ,aAAa,MAAU,CAAA,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAQ,SAAW,MAAQ,IAAW,CAAA,CAAM,GAAS,CAA3e,EAAA,EAAQ,EAAme,CAAC,CACviB,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,qBAAf,SAAA,EAAoC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,uCAAuC,KAAK,SAAS,SAAU,GAAQ,GAAK,EAAS,YAAe,EAAS,GAAU,EAAQ,CAAC,EAAG,SAAA,KAAW,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,CAAW,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,uCAAuC,KAAK,SAAS,SAAU,CAAC,EAAQ,aAAe,EAAS,YAAe,EAAS,GAAU,EAAQ,CAAC,EAAG,SAAA,KAAW,CAAA,CAAM,GACtY,CACL,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,uBACZ,SAAA,GAAgB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,cAAf,SAAA,EAA6B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,KAAM,GAAI,UAAU,MAAQ,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,QAAc,CAAA,CAAM,CAAI,CAAA,EAAC,GAAuH,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EAAE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sBAAf,SAAA,EAAqC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAO,QAAQ,KAAU,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,IAAD,CAAA,SAAA,CAAI,EAAO,QAAQ,KAAO,OAAO,MAAI,EAAO,QAAQ,SAAS,MAAI,EAAO,QAAQ,aAAa,MAAO,CAAA,CAAA,CAAM,CAAA,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAO,QAAQ,SAAW,MAAQ,IAAW,CAAA,CAAM,IAAE,EAAO,WAAY,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,oBAAf,SAAA,EAAmC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,EAAC,SAAO,EAAO,qBAAqB,OAAU,CAAI,CAAA,EAAA,MAAK,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBAAkB,SAAA,EAAO,SAAS,IAAK,IAAY,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,8BAA8B,EAAQ,OAA1D,SAAA,EAAmH,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,qBAAf,SAAA,CAAqC,EAAQ,OAAS,OAAS,IAAM,SAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,GAAW,EAAQ,SAAS,CAAQ,CAAA,CAAM,CAAC,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,oBAAoB,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,KAAM,EAAQ,IAAO,CAAA,CAAM,CAAA,CAAU,CAAjQ,EAAA,GAAG,EAAQ,SAAS,GAAG,EAAQ,WAAkO,CAAC,CAAO,CAAA,CAAG,CAAA,CAAA,GAAx3B,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,cAAf,SAAA,EAA6B,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,QAAc,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,aAAiB,CAAA,CAAM,CAAI,CAAA,CAC7O,CAAA,CACE,GACN,GAET,CAEA,SAAS,GAAM,CAAE,QAAO,WAAU,eAAc,YAAW,WAAU,OAAO,UAAW,kBAAkB,IAAS,CAChH,OACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBAAiB,KAAK,eAAe,YAAc,GAAU,EAAM,SAAW,EAAM,eAAiB,EAAS,EAC3H,UAAA,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAU,QAAQ,KAAK,SAAS,aAAW,OAAO,kBAAgB,cAA3E,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,aAAf,SAAA,EAA4B,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,GAAG,cAAe,SAAA,CAAU,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAU,cAAc,QAAS,EAAU,aAAW,KAAK,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAO,KAAM,EAAK,CAAA,CAAS,CAAA,CAAM,KAC/K,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,aAAc,UAAc,CAAA,GAC3C,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,SAAA,EAA+B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,2BAA2B,KAAK,SAAS,QAAS,EAAU,SAAA,IAAU,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAW,kBAAkB,IAAQ,KAAK,SAAS,SAAU,EAAiB,QAAS,EAAY,SAAA,CAAqB,CAAA,CAAM,GACvP,GACN,CAAA,CAET,CAEA,SAAS,GAAgB,CAAE,QAAQ,CACjC,GAAI,CAAC,EAAM,OAAO,KAClB,IAAM,EAAS,EAAK,QAAU,CAAC,EAC/B,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAU,kBAAd,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,OAAS,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,GAAW,EAAK,SAAS,CAAM,CAAA,CAAM,CAAA,CAAA,GAC7D,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,YAAc,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAO,sBAAwB,CAAM,CAAA,CAAM,CAAA,CAAA,GACxE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,YAAc,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAO,oBAAsB,CAAM,CAAA,CAAM,CAAA,CAAA,GACtE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,cAAgB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,MAAM,QAAQ,EAAO,kBAAkB,EAAI,EAAO,mBAAmB,OAAU,EAAO,oBAAsB,CAAO,CAAA,CAAM,CAAA,CAAA,CACtJ,CACH,CAAA,EAAA,EAAK,UAAU,IAAK,IAAY,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,uCAAf,SAAA,EAAoE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,MAAY,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,CAAc,CAAA,CAAM,CAAA,CAAA,CAAM,CAA3F,EAAA,CAA2F,CAAC,CACxL,CAAA,CAAA,CAEN,CAEA,SAAS,GAAa,CAAE,OAAM,WAAU,SAAQ,mBAAkB,WAAU,aAAa,CACvF,OACE,EAAA,EAAA,KAAA,CAAC,GAAD,CAAO,MAAO,EAAK,OAAS,SAAW,UAAY,UAAW,aAAc,EAAK,OAAS,SAAW,UAAY,SAAoB,WAAqB,YAA1J,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,SAAA,EAA+B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,iBAAuB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,kEAAsE,CAAA,CAAM,CAAA,CAAA,CAAM,KACnL,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAU,kBAAd,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,YAAc,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,GAAQ,SAAc,CAAA,CAAM,CAAA,CAAA,GACzD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,aAAe,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,CAAK,GAAQ,WAAW,KAAC,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,CAAO,IAAE,GAAQ,iBAAiB,GAAQ,CAAA,CAAA,CAAK,CAAA,CAAA,CAAM,CAAA,CAAA,GACvG,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,aAAe,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,GAAQ,eAAoB,CAAA,CAAM,CAAA,CAAA,GAChE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,aAAe,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,CAAqB,CAAA,CAAM,CAAA,CAAA,GACzD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,MAAQ,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAK,OAAS,SAAW,mCAAqC,iBAAsB,CAAA,CAAM,CAAA,CAAA,GACjH,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,UAAY,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,EAAK,OAAS,SAA4B,EAAK,YAAc,OAAS,mBAAqB,EAAK,YAAc,OAAS,eAAiB,OAAO,EAAK,QAA3H,cAAuI,CAAA,CAAM,CAAA,CAAA,GACjM,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,MAAQ,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,CAAI,gBAAc,EAAK,UAAU,IAAM,CAAA,CAAA,CAAM,CAAA,CAAA,CAC7D,KACJ,EAAA,EAAA,IAAA,CAAC,GAAD,CAAiB,KAAM,CAAW,CAAA,CAC7B,GAEX,CAEA,SAAS,GAAa,CAAE,SAAQ,SAAQ,UAAS,WAAU,aAAa,CACtE,GAAM,CAAC,EAAe,IAAA,EAAoB,EAAA,SAAA,CAAS,EAAK,EAClD,CAAC,EAAiB,IAAA,EAAsB,EAAA,SAAA,CAAS,EAAI,EACrD,CAAC,EAAiB,IAAA,EAAsB,EAAA,SAAA,CAAS,EAAI,EACrD,EAAmB,GAA+B,EAAQ,CAAM,EAChE,EAAa,GAAuB,CACxC,SACA,UACA,mBACA,kBACA,gBACA,gBAAiB,GAAQ,cAAc,YAAc,GACrD,8BAA+B,GAAQ,gCAAkC,EAC3E,CAAC,EACD,OACE,EAAA,EAAA,KAAA,CAAC,GAAD,CACE,MAAM,OACN,aAAa,UACb,KAAK,SACK,WACV,gBAAkB,CAAC,GAAiB,CAAC,GAAmB,CAAC,GAAoB,CAAC,EAAW,UACzF,cAAiB,EAAU,CAAE,gBAAe,kBAAiB,kBAAiB,0BAA2B,EAAW,kBAAmB,CAAC,EAN1I,SAAA,EAQE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,kBAAf,SAAA,EAAiC,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,KAAA,CAAC,SAAD,CAAA,SAAA,CAAS,GAAW,EAAO,SAAS,SAAS,EAAE,MAAI,EAAO,SAAS,cAAuB,CAAA,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAO,IAAW,CAAA,CAAM,CAAA,CAAA,CAAM,KAC/L,EAAA,EAAA,KAAA,CAAC,WAAD,CAAU,UAAU,kBAApB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,UAAgB,CAAA,GACxB,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EAAO,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,QAAS,EAAe,SAAW,GAAU,EAAiB,EAAM,OAAO,OAAO,CAAI,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,4BAAkC,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAO,yCAA8C,CAAA,CAAO,CAAA,CAAA,CAAQ,CAAA,CAAA,GAC1O,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EAAO,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,QAAS,EAAiB,SAAW,GAAU,EAAmB,EAAM,OAAO,OAAO,CAAI,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,cAAoB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAO,iCAAsC,CAAA,CAAO,CAAA,CAAA,CAAQ,CAAA,CAAA,GACxN,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EAAO,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,KAAK,WAAW,QAAS,EAAiB,SAAW,GAAU,EAAmB,EAAM,OAAO,OAAO,CAAI,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,aAAmB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAO,0CAA+C,CAAA,CAAO,CAAA,CAAA,CAAQ,CAAA,CAAA,CACxN,IACT,GAAQ,cAAc,YAAc,IAAQ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sCAAf,SAAA,EAAqD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,kBAAwB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAO,aAAa,SAAW,kBAAyB,CAAA,CAAM,CAAA,CAAA,CAAM,CAAI,CAAA,EAAA,KAC7O,EAAW,oBAAqB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,iBAAiB,EAAW,uBAAyB,EAAW,sBAAwB,wBAA0B,2BAAlI,SAAA,EAA8J,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,qBAA2B,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,CAAM,MAAI,EAAO,SAAS,YAAW,EAAA,EAAA,IAAA,CAAC,KAAD,CAAK,CAAA,EAAC,MAAI,GAAiB,EAAA,EAAA,IAAA,CAAC,KAAD,CAAK,CAAA,EAAE,EAAW,sBAAwB,4CAA8C,EAAW,sBAAwB,6BAA+B,iCAAwC,CAAA,CAAA,CAAM,CAAA,CAAA,CAAM,CAAI,CAAA,EAAA,MACjhB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,SAAA,EAA+B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,cAAoB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,oDAAwD,CAAA,CAAM,CAAA,CAAA,CAAM,GAC7J,GAEX,CAEA,SAAS,GAAkB,CAAE,SAAQ,WAAU,WAAU,aAAa,CACpE,OACE,EAAA,EAAA,KAAA,CAAC,GAAD,CAAO,MAAM,SAAS,aAAa,QAAQ,KAAK,SAAmB,WAAqB,YAAxF,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,kBAAf,SAAA,EAAiC,EAAA,EAAA,IAAA,CAAC,GAAD,CAAa,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,KAAA,CAAC,SAAD,CAAA,SAAA,CAAS,GAAW,EAAO,SAAS,SAAS,EAAE,MAAI,EAAO,SAAS,cAAuB,CAAA,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAO,EAAS,CAAA,CAAM,CAAA,CAAA,CAAM,KAC7L,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sCAAf,SAAA,EAAqD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,qBAA2B,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,sDAA0D,CAAA,CAAM,CAAA,CAAA,CAAM,KACjM,EAAA,EAAA,IAAA,CAAC,GAAD,CAAiB,KAAM,CAAW,CAAA,CAC7B,GAEX,CAEA,SAAS,GAAW,CAAE,YAAW,UAAS,WAAU,aAAa,CAC/D,IAAM,EAAc,KAAK,IAAI,EAAG,EAAQ,QAAQ,OAAS,CAAS,EAClE,OACE,EAAA,EAAA,KAAA,CAAC,GAAD,CAAO,MAAM,QAAQ,aAAc,MAAM,EAAY,OAAQ,KAAK,SAAmB,WAAqB,YAAW,gBAAiB,IAAgB,EAAtJ,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,uCAAf,SAAA,EAAsD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,cAAoB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,gCAAoC,CAAA,CAAM,CAAA,CAAA,CAAM,CACrK,CAAA,GAAA,EAAA,EAAA,KAAA,CAAC,KAAD,CAAI,UAAU,kBAAd,SAAA,EAAgC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,MAAQ,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,CAAK,EAAQ,QAAQ,OAAO,IAAM,CAAA,CAAA,CAAM,CAAA,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,IAAM,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,CAAI,MAAI,EAAU,IAAM,CAAA,CAAA,CAAM,CAAA,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EAAK,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,KAAO,CAAA,GAAC,EAAA,EAAA,KAAA,CAAC,KAAD,CAAA,SAAA,CAAK,EAAY,IAAM,CAAA,CAAA,CAAM,CAAA,CAAA,CAAK,CACxL,CAAA,CAAA,GAEX,CAEA,SAAS,GAAa,CAAE,WAAU,aAAa,CAC7C,GAAM,CAAC,EAAW,IAAA,EAAgB,EAAA,SAAA,CAAS,EAAE,EACvC,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAE,EAC7B,CAAC,EAAW,IAAA,EAAgB,EAAA,SAAA,CAAS,EAAE,EACvC,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAS,EAAE,EACzC,EAAQ,yBAAyB,KAAK,CAAS,GAAK,EAAK,KAAK,GAAK,EAAU,KAAK,EACxF,OACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAO,MAAM,SAAS,aAAa,OAAiB,WAAU,gBAAiB,CAAC,EAAO,cAAiB,EAAU,CAAE,YAAW,OAAM,YAAW,YAAW,CAAC,EAC1J,UAAA,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,eAAf,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,OAAW,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,MAAO,EAAW,SAAW,GAAU,EAAa,EAAM,OAAO,KAAK,EAAG,YAAY,OAAO,WAAW,OAAS,CAAA,CAAQ,CAAA,CAAA,GACxJ,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,MAAU,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,MAAO,EAAM,SAAW,GAAU,EAAQ,EAAM,OAAO,KAAK,EAAG,YAAY,MAAQ,CAAA,CAAQ,CAAA,CAAA,GAC1H,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,YAAgB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,MAAO,EAAW,SAAW,GAAU,EAAa,EAAM,OAAO,KAAK,EAAG,YAAY,oBAAoB,WAAW,OAAS,CAAA,CAAQ,CAAA,CAAA,GAC1K,EAAA,EAAA,KAAA,CAAC,QAAD,CAAA,SAAA,EAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,iBAAqB,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,MAAO,EAAY,SAAW,GAAU,EAAc,EAAM,OAAO,KAAK,EAAG,YAAY,eAAe,WAAW,OAAS,CAAA,CAAQ,CAAA,CAAA,CACzK,GACA,CAAA,CAEX,CAEA,SAAS,GAAM,CAAE,QAAO,WAAW,CAOjC,OANA,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,CAAC,EAAO,OACZ,IAAM,EAAQ,OAAO,WAAW,EAAS,GAAI,EAC7C,UAAa,OAAO,aAAa,CAAK,CACxC,EAAG,CAAC,EAAO,CAAO,CAAC,EACd,GACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,gBAAgB,EAAM,OAAtC,SAAA,EAA8C,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,CAAM,EAAM,OAAS,WAAY,EAAA,EAAA,IAAA,CAAC,GAAD,CAAW,KAAM,EAAK,CAAA,GAAI,EAAA,EAAA,IAAA,CAAC,EAAD,CAAW,KAAM,EAAK,CAAA,GAAE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EAAM,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAM,KAAc,CAAA,EAAE,EAAM,SAAU,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SAAQ,EAAM,OAAe,CAAA,EAAI,IAAW,CAAA,CAAA,CAAM,CAAA,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,QAAS,EAAS,aAAW,OAAO,UAAA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAO,KAAM,EAAK,CAAA,CAAS,CAAA,CAAM,IADxT,IAErB,CAEA,SAAwB,IAAM,CAC5B,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,UAAU,EACrC,CAAC,EAAa,IAAA,EAAkB,EAAA,SAAA,CAAS,UAAU,EACnD,CAAC,EAAe,IAAA,EAAoB,EAAA,SAAA,CAAS,EAAE,EAC/C,CAAC,EAAW,GAAgB,EAAmB,oBAAqB,SAAS,EAC7E,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAS,CAAC,CAAC,EACrC,CAAC,EAAiB,GAAsB,EAAmB,0BAA2B,CAAC,CAAC,EACxF,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAAS,IAAI,EACnC,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAS,EAAa,EAC9C,CAAC,EAAkB,IAAA,EAAuB,EAAA,SAAA,CAAS,EAAE,EACrD,CAAC,EAAS,IAAA,EAAc,EAAA,SAAA,CAAS,EAAI,EACrC,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAK,EAChC,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAS,IAAI,EACjC,CAAC,GAAO,IAAA,EAAY,EAAA,SAAA,CAAS,IAAI,EACjC,CAAC,GAAU,KAAA,EAAe,EAAA,SAAA,CAAS,CAAC,CAAC,EACrC,CAAC,EAAiB,KAAA,EAAsB,EAAA,SAAA,CAAS,IAAI,EACrD,IAAA,EAAiB,EAAA,OAAA,CAAO,CAAC,EAEzB,IAAA,EAAY,EAAA,QAAA,KAAc,CAC9B,IAAM,EAAW,GAAoB,CAAM,EACrC,EAAc,IAAI,IAAI,EAAS,IAAK,GAAa,EAAS,EAAE,CAAC,EACnE,MAAO,CACL,GAAG,EAAS,IAAK,IAAc,CAC7B,GAAG,EACH,OAAQ,EAAgB,SAAS,EAAS,EAAE,CAC9C,EAAE,EACF,GAAG,EACA,OAAQ,GAAa,CAAC,EAAY,IAAI,CAAQ,CAAC,CAAC,CAChD,IAAK,IAAQ,CAAE,KAAI,QAAS,CAAC,QAAQ,EAAG,WAAY,GAAO,QAAS,GAAO,OAAQ,EAAK,EAAE,CAC/F,CACF,EAAG,CAAC,EAAQ,CAAe,CAAC,EACtB,GAAkB,EAAS,KAAM,GAAY,EAAQ,KAAO,CAAS,GAAK,KAE1E,IAAA,EAAoB,EAAA,OAAA,CAAO,IAAI,EACrC,AACE,GAAkB,UAAU,GAAqB,CAC/C,aAAc,EAAS,IAAY,EAAW,cAAe,EAAS,CAAO,EAC7E,cAAe,EAAS,IAAY,EAAW,eAAgB,EAAS,CAAO,CACjF,CAAC,EAOH,IAAM,GAAA,EAAU,EAAA,YAAA,CAAY,MAAO,CAAE,QAAQ,IAAU,CAAC,IAAM,CAC5D,MAAM,GAAkB,QAAQ,CAC9B,YACA,YAAa,CAAC,EACd,UAAW,EACX,UAAW,CAAE,OAAQ,EAAY,QAAS,KAAkB,CAC1D,EAAU,CAAU,EACpB,EAAW,CAAW,EACtB,EAAqB,GAAY,GAAW,GAAoB,CAAU,CAAC,CAAC,KAAM,GAAa,EAAS,KAAO,CAAO,EAClH,EACA,EAAW,eAAe,CAChC,EACA,QAAU,GAAU,CAClB,EAAS,CAAE,KAAM,QAAS,MAAO,SAAU,QAAS,EAAM,OAAQ,CAAC,CACrE,CACF,CAAC,CACH,EAAG,CAAC,CAAS,CAAC,EAER,GAAA,EAAkB,EAAA,YAAA,CAAY,SAAY,CAC9C,IAAM,EAAU,MAAM,GAAY,EAClC,EAAY,EAAQ,QAAQ,EAC5B,EAAc,GAAY,EAAQ,SAAS,KAAM,GAAY,EAAQ,KAAO,CAAO,EAAI,EAAU,SAAS,CAC5G,EAAG,CAAC,CAAY,CAAC,EAEX,GAAA,EAAwB,EAAA,YAAA,CAAY,SAAY,CACpD,EAAS,IAAI,EACb,GAAI,CACF,MAAM,EAAgB,EACtB,MAAM,EAAQ,CAAE,MAAO,EAAK,CAAC,CAC/B,MAAQ,CAER,CACA,EAAS,CAAE,KAAM,UAAW,MAAO,cAAe,QAAS,wBAAyB,CAAC,CACvF,EAAG,CAAC,EAAS,CAAe,CAAC,EAEvB,IAAA,EAAuB,EAAA,YAAA,CAAY,KAAO,IAAc,CAC5D,IAAM,EAAW,GAAwB,GAAiB,EAAW,CAAM,EAC3E,GAAI,CAAC,EAAU,CACb,EAAS,CAAE,KAAM,UAAW,MAAO,SAAU,QAAS,uBAAwB,CAAC,EAC/E,EAAgB,CAAC,CAAC,UAAY,CAAC,CAAC,EAChC,MACF,CACA,GAAI,EAAU,OAAS,UAAW,CAChC,EAAS,CAAQ,EACjB,MACF,CACA,EAAQ,EAAI,EACZ,GAAI,CACF,IAAM,EAAS,CACb,GAAG,GAAe,EAAS,SAAS,EACpC,gBAAiB,EAAS,gBAC1B,SAAU,EAAS,iBACnB,UAAW,EAAS,KAAK,SAC3B,EAWM,EAAU,MAAM,EAVL,EAAS,KAAK,OAAS,SAAW,sBAAwB,oBAC3D,EAAS,KAAK,OAAS,SACnC,CACE,GAAG,EACH,UAAW,EAAS,KAAK,YAAc,OACnC,mBACC,EAAS,KAAK,YAAc,OAAS,kBAAoB,WAC9D,MAAO,EAAS,KAAK,YAAc,SAAW,EAAS,KAAK,MAAQ,IAAA,EACtE,EACA,CAC8C,EAClD,EAAS,CAAE,GAAG,EAAU,SAAU,EAAQ,IAAK,CAAC,CAClD,OAAS,EAAO,CACd,GAAI,aAAiB,EAAsB,CACzC,MAAM,EAAsB,EAC5B,MACF,CACA,EAAS,CAAE,KAAM,QAAS,MAAO,SAAU,QAAS,EAAM,OAAQ,CAAC,CACrE,QAAU,CACR,EAAQ,EAAK,CACf,CACF,EAAG,CAAC,EAAuB,EAAiB,GAAiB,CAAM,CAAC,GAEpE,EAAA,EAAA,UAAA,KAAgB,CACd,IAAI,EAAY,GAYhB,OAXA,GAAiB,CAAC,CACf,KAAK,KAAO,IAAW,CACtB,GAAI,CAAC,EAAQ,MAAM,IAAI,EACvB,MAAM,EAAgB,EACjB,GAAW,EAAe,OAAO,CACxC,CAAC,CAAC,CACD,MAAO,GAAU,CACZ,IACJ,EAAe,aAAiB,EAAuB,WAAa,OAAO,EAC3E,EAAiB,EAAM,OAAO,EAChC,CAAC,MACU,CAAE,EAAY,EAAM,CACnC,EAAG,CAAC,CAAe,CAAC,GAEpB,EAAA,EAAA,UAAA,KAAgB,CACV,IAAgB,SAAS,EAAQ,CACvC,EAAG,CAAC,EAAa,CAAS,CAAC,GAE3B,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAkB,GAAU,CAChC,EAAe,UAAU,EACzB,EAAiB,EAAM,QAAU,mCAAmC,CACtE,EAEA,OADA,OAAO,iBAAiB,uBAAwB,CAAc,MACjD,OAAO,oBAAoB,uBAAwB,CAAc,CAChF,EAAG,CAAC,CAAC,GAEL,EAAA,EAAA,UAAA,KAAgB,CACd,GAAI,IAAgB,QAAS,OAC7B,IAAI,EAAU,GACR,EAAO,SAAY,CACvB,GAAI,CACF,IAAM,EAAU,MAAM,GAAY,GAAe,OAAO,EACxD,GAAI,EAAS,OACT,EAAQ,UAAU,SACpB,GAAe,QAAU,EAAQ,SAAS,EAAQ,SAAS,OAAS,EAAE,CAAC,GACvE,GAAa,GAAY,CAAC,GAAG,EAAS,GAAG,EAAQ,QAAQ,CAAC,CAAC,MAAM,IAAI,CAAC,GAExE,GAAmB,EAAQ,iBAAmB,IAAI,CACpD,MAAQ,CAER,CACF,EACA,EAAK,EACL,IAAM,EAAQ,OAAO,YAAY,EAAM,GAAG,EAC1C,UAAa,CAAE,EAAU,GAAM,OAAO,cAAc,CAAK,CAAG,CAC9D,EAAG,CAAC,CAAW,CAAC,EAEhB,IAAM,IAAA,EAAU,EAAA,YAAA,CAAY,SAAY,CACtC,IAAM,EAAO,EAAM,KACb,EAAW,EAAM,SACvB,EAAS,IAAI,EACb,EAAQ,EAAI,EACZ,EAAQ,UAAU,EAClB,GAAI,CACF,IAAM,EAAU,MAAM,EACpB,EAAK,OAAS,SAAW,oBAAsB,kBAC/C,CAAE,cAAe,EAAS,cAAe,OAAQ,EAAS,MAAO,CACnE,EACA,EAAS,GAAe,EAAS,CAC/B,aAAc,EAAK,OAAS,SAAW,UAAY,OACnD,aAAc,EAAK,OAAS,SAAW,YAAc,SACrD,QAAS,MAAM,EAAQ,QAAQ,QAAQ,MAAQ,EAAQ,QAAQ,QAAQ,WAAa,OACtF,CAAC,CAAC,EACF,MAAM,EAAQ,CAAE,MAAO,EAAK,CAAC,CAC/B,OAAS,EAAO,CACd,GAAI,aAAiB,EAAsB,CACzC,MAAM,EAAsB,EAC5B,MACF,CACA,EAAS,CAAE,KAAM,QAAS,MAAO,OAAQ,QAAS,EAAM,OAAQ,CAAC,CACnE,QAAU,CACR,EAAQ,EAAK,CACf,CACF,EAAG,CAAC,EAAuB,EAAO,CAAO,CAAC,EAEpC,IAAA,EAA0B,EAAA,YAAA,CAAY,KAAO,IAAY,CAC7D,IAAM,EAAS,EAAM,OACf,EAAkB,EAAM,UAC9B,EAAQ,EAAI,EACZ,GAAI,CACF,IAAM,EAAU,MAAM,EAAW,uBAAwB,CACvD,GAAG,GAAe,CAAe,EACjC,gBAAiB,EAAM,gBACvB,SAAU,EAAO,GACjB,GAAG,CACL,CAAC,EACD,EAAS,CAAE,GAAG,EAAO,KAAM,eAAgB,eAAgB,EAAS,SAAU,EAAQ,IAAK,CAAC,CAC9F,OAAS,EAAO,CACd,GAAI,aAAiB,EAAsB,CACzC,MAAM,EAAsB,EAC5B,MACF,CACA,EAAS,CAAE,KAAM,QAAS,MAAO,WAAY,QAAS,EAAM,OAAQ,CAAC,CACvE,QAAU,CACR,EAAQ,EAAK,CACf,CACF,EAAG,CAAC,EAAuB,CAAK,CAAC,EAE3B,IAAA,EAAwB,EAAA,YAAA,CAAY,SAAY,CACpD,IAAM,EAAS,EAAM,OACf,EAAW,EAAM,SACvB,EAAS,IAAI,EACb,EAAQ,EAAI,EACZ,EAAQ,UAAU,EAClB,GAAI,CACF,IAAM,EAAU,MAAM,EAAW,qBAAsB,CACrD,cAAe,EAAS,cACxB,OAAQ,EAAS,MACnB,CAAC,EACD,EAAS,GAAe,EAAS,CAAE,aAAc,SAAU,aAAc,WAAY,QAAS,EAAO,EAAG,CAAC,CAAC,EAC1G,MAAM,EAAQ,CAAE,MAAO,EAAK,CAAC,CAC/B,OAAS,EAAO,CACd,GAAI,aAAiB,EAAsB,CACzC,MAAM,EAAsB,EAC5B,MACF,CACA,EAAS,CAAE,KAAM,QAAS,MAAO,OAAQ,QAAS,EAAM,OAAQ,CAAC,CACnE,QAAU,CACR,EAAQ,EAAK,CACf,CACF,EAAG,CAAC,EAAuB,EAAO,CAAO,CAAC,EAEpC,IAAA,EAAQ,EAAA,YAAA,CAAY,SAAY,CACpC,IAAM,EAAY,EAAM,UAClB,EAAkB,EAAM,UAC9B,EAAS,IAAI,EACb,EAAQ,EAAI,EACZ,GAAI,CACF,IAAM,EAAU,MAAM,EAAW,aAAc,CAAE,GAAG,GAAe,CAAe,EAAG,gBAAiB,EAAM,gBAAiB,gBAAiB,EAAM,gBAAiB,WAAU,CAAC,EAChL,EAAS,GAAe,EAAS,CAC/B,aAAc,UACd,aAAc,YACd,QAAS,MAAM,EAAQ,QAAQ,cAAgB,EAAE,QAAQ,GAAY,EAAQ,QAAQ,UAAU,GACjG,CAAC,CAAC,EACF,MAAM,EAAQ,CAAE,MAAO,EAAK,CAAC,CAC/B,OAAS,EAAO,CACd,GAAI,aAAiB,EAAsB,CACzC,MAAM,EAAsB,EAC5B,MACF,CACA,EAAS,CAAE,KAAM,QAAS,MAAO,SAAU,QAAS,EAAM,OAAQ,CAAC,CACrE,QAAU,CACR,EAAQ,EAAK,CACf,CACF,EAAG,CAAC,EAAuB,EAAO,CAAO,CAAC,EAEpC,IAAA,EAAa,EAAA,YAAA,KAAkB,EAAS,IAAI,EAAG,CAAC,CAAC,EACjD,IAAA,EAAc,EAAA,YAAA,CAAY,KAAO,IAAY,CACjD,GAAI,CACF,IAAM,EAAU,MAAM,EAAW,qBAAsB,EAAQ,SAAW,CAAE,GAAG,EAAS,gBAAiB,EAAQ,QAAS,EAAI,CAAO,EACrI,EAAS,IAAI,EACb,MAAM,EAAgB,EACtB,EAAa,EAAQ,QAAQ,EAAE,EAC/B,EAAS,CAAE,KAAM,UAAW,MAAO,UAAW,QAAS,EAAQ,QAAQ,IAAK,CAAC,CAC/E,OAAS,EAAO,CACd,GAAI,aAAiB,EAAsB,CACzC,MAAM,EAAsB,EAC5B,MACF,CACA,EAAS,CAAE,KAAM,QAAS,MAAO,SAAU,QAAS,EAAM,OAAQ,CAAC,CACrE,CACF,EAAG,CAAC,EAAuB,EAAiB,CAAY,CAAC,EACnD,GAAA,EAAgB,EAAA,YAAA,CAAY,SAAY,CAC5C,GAAI,CACF,MAAM,EAAW,uBAAwB,CAAE,YAAW,gBAAiB,IAAiB,QAAS,CAAC,EAClG,EAAa,SAAS,EACtB,MAAM,EAAgB,CACxB,OAAS,EAAO,CACd,GAAI,aAAiB,EAAsB,CACzC,MAAM,EAAsB,EAC5B,MACF,CACA,EAAS,CAAE,KAAM,QAAS,MAAO,SAAU,QAAS,EAAM,OAAQ,CAAC,CACrE,CACF,EAAG,CAAC,EAAuB,EAAW,EAAiB,IAAiB,SAAU,CAAY,CAAC,EACzF,IAAA,EAAgB,EAAA,YAAA,CAAY,SAAY,CAC5C,MAAM,GAAkB,CAAC,CAAC,UAAY,CAAC,CAAC,EACxC,EAAe,UAAU,EACzB,EAAiB,8CAA8C,CACjE,EAAG,CAAC,CAAC,EACC,IAAA,EAAoB,EAAA,YAAA,CAAa,GAAa,CAClD,EAAoB,GAAY,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAS,CAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAC3E,EAAoB,CAAQ,CAC9B,EAAG,CAAC,CAAkB,CAAC,EACjB,IAAA,EAAuB,EAAA,YAAA,CAAa,GAAa,CACrD,EAAoB,GAAY,EAAQ,OAAQ,GAAS,IAAS,CAAQ,CAAC,EAC3E,EAAoB,GAAQ,iBAAmB,EAAE,CACnD,EAAG,CAAC,EAAoB,GAAQ,eAAe,CAAC,EAMhD,OAJI,IAAgB,SAKlB,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,YAAf,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAmB,SAAQ,KAAM,GAAQ,EAAQ,EAAkB,cAAiB,EAAQ,CAAI,CAAA,GAChG,EAAA,EAAA,IAAA,CAAC,GAAD,CAAe,OAAe,UAAiB,SAAQ,gBAAiB,EAAgB,CAAA,GACxF,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,YAAhB,SAAA,EACA,EAAA,EAAA,IAAA,CAAC,GAAD,CAAsB,WAAqB,YAAyB,eAAsB,SAAQ,iBAAoB,EAAS,CAAE,KAAM,SAAU,CAAC,EAAG,gBAAiB,EAAe,cAAiB,EAAQ,EAAY,UAAS,sBAAuB,GAAQ,EAAQ,CAAS,CAAA,EAChR,IAAS,YAAa,EAAA,EAAA,IAAA,CAAC,GAAD,CAAkB,SAAiB,UAAoB,aAA6B,mBAAuC,sBAAqB,oBAAqB,GAAmB,uBAAwB,GAAsB,UAAY,GAAS,GAAqB,CAAE,KAAM,UAAW,OAAM,kBAAiB,CAAC,EAAG,UAAY,GAAW,GAAqB,CAAE,KAAM,UAAW,QAAO,CAAC,EAAY,UAAe,OAAe,SAAU,CAAA,EAAI,KACnd,IAAS,WAAY,EAAA,EAAA,IAAA,CAAC,GAAD,CAAwB,YAAmB,QAAS,CAAA,EAAI,KAC7E,IAAS,WAAY,EAAA,EAAA,IAAA,CAAC,GAAD,CAAsB,UAAiB,SAAc,OAAM,UAAY,GAAW,GAAqB,CAAE,KAAM,UAAW,QAAO,CAAC,EAAG,QAAU,GAAc,GAAqB,CAAE,KAAM,QAAS,WAAU,CAAC,CAAI,CAAA,EAAI,KAC3O,IAAS,YAAa,EAAA,EAAA,IAAA,CAAC,GAAD,CAAwB,YAA2B,iBAAkB,CAAA,EAAI,IAC5F,IACL,GAAO,OAAS,WAAY,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,KAAM,EAAM,KAAM,SAAU,EAAM,SAAU,OAAQ,EAAM,OAAQ,iBAAkB,EAAM,iBAAkB,aAAgB,EAAS,IAAI,EAAG,UAAW,EAAU,CAAA,EAAI,KAC/M,GAAO,OAAS,WAAY,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,OAAQ,EAAM,OAAQ,OAAQ,EAAM,OAAQ,QAAS,EAAM,QAAS,aAAgB,EAAS,IAAI,EAAG,UAAW,EAA0B,CAAA,EAAI,KACvL,GAAO,OAAS,gBAAiB,EAAA,EAAA,IAAA,CAAC,GAAD,CAAmB,OAAQ,EAAM,OAAQ,SAAU,EAAM,SAAU,aAAgB,EAAS,IAAI,EAAG,UAAW,EAAwB,CAAA,EAAI,KAC3K,GAAO,OAAS,SAAU,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,UAAW,EAAM,UAAoB,UAAS,aAAgB,EAAS,IAAI,EAAG,UAAW,EAAQ,CAAA,EAAI,KAC3I,GAAO,OAAS,WAAY,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,aAAgB,EAAS,IAAI,EAAG,UAAW,EAAc,CAAA,EAAI,MACxG,EAAA,EAAA,IAAA,CAAC,GAAD,CAAc,SAAO,QAAS,EAAa,CAAA,CACxC,KApBE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,cAAf,SAAA,EAA6B,EAAA,EAAA,IAAA,CAAC,GAAD,CAAY,KAAM,EAAK,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAK,IAAgB,WAAa,WAAa,QAAa,CAAA,GAAC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,IAAgB,WAAa,OAAS,GAAiB,2BAA+B,CAAA,EAAE,IAAgB,WAA+C,MAAlC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,oBAAwB,CAAA,CAAc,GAsBlS,EChlCA,EAAA,EAAA,WAAA,CAAW,SAAS,eAAe,MAAM,CAAC,CAAC,CAAC,QAC1C,EAAA,EAAA,IAAA,CAAA,EAAO,WAAP,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,GAAD,CAAM,CAAA,CACU,CAAA,CACpB"} \ No newline at end of file diff --git a/web/dist/assets/index-DAOqepUV.js b/web/dist/assets/index-DAOqepUV.js new file mode 100644 index 0000000..548f897 --- /dev/null +++ b/web/dist/assets/index-DAOqepUV.js @@ -0,0 +1,11 @@ +var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var ee=Array.isArray;function te(){}var S={H:null,A:null,T:null,S:null},C=Object.prototype.hasOwnProperty;function w(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function T(e,t){return w(e.type,t,e.props)}function E(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ne(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var re=/\/+/g;function D(e,t){return typeof e==`object`&&e&&e.key!=null?ne(``+e.key):t.toString(36)}function ie(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(te,te):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function ae(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,ae(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+D(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(re,`$&/`)+`/`),ae(o,r,i,``,function(e){return e})):o!=null&&(E(o)&&(o=T(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(re,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m){if(n(c)!==null)m=!0,ee||(ee=!0,E());else{var t=n(l);t!==null&&D(x,t.startTime-e)}}}var ee=!1,te=-1,S=5,C=-1;function w(){return g?!0:!(e.unstable_now()-Ct&&w());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&D(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?E():ee=!1}}}var E;if(typeof y==`function`)E=function(){y(T)};else if(typeof MessageChannel<`u`){var ne=new MessageChannel,re=ne.port2;ne.port1.onmessage=T,E=function(){re.postMessage(null)}}else E=function(){_(T,0)};function D(t,n){te=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(te),te=-1):h=!0,D(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,E()))),r},e.unstable_shouldYield=w,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1le||(e.current=ce[le],ce[le]=null,le--)}function M(e,t){le++,ce[le]=e.current,e.current=t}var de=ue(null),fe=ue(null),pe=ue(null),me=ue(null);function he(e,t){switch(M(pe,t),M(fe,e),M(de,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}j(de),M(de,e)}function N(){j(de),j(fe),j(pe)}function P(e){e.memoizedState!==null&&M(me,e);var t=de.current,n=Hd(t,e.type);t!==n&&(M(fe,e),M(de,n))}function ge(e){fe.current===e&&(j(de),j(fe)),me.current===e&&(j(me),Qf._currentValue=se)}var _e,ve;function ye(e){if(_e===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);_e=t&&t[1]||``,ve=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{be=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?ye(n):``}function Se(e,t){switch(e.tag){case 26:case 27:case 5:return ye(e.type);case 16:return ye(`Lazy`);case 13:return e.child!==t&&t!==null?ye(`Suspense Fallback`):ye(`Suspense`);case 19:return ye(`SuspenseList`);case 0:case 15:return xe(e.type,!1);case 11:return xe(e.type.render,!1);case 1:return xe(e.type,!0);case 31:return ye(`Activity`);default:return``}}function Ce(e){try{var t=``,n=null;do t+=Se(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var we=Object.prototype.hasOwnProperty,Te=t.unstable_scheduleCallback,Ee=t.unstable_cancelCallback,De=t.unstable_shouldYield,Oe=t.unstable_requestPaint,ke=t.unstable_now,Ae=t.unstable_getCurrentPriorityLevel,je=t.unstable_ImmediatePriority,Me=t.unstable_UserBlockingPriority,Ne=t.unstable_NormalPriority,Pe=t.unstable_LowPriority,Fe=t.unstable_IdlePriority,Ie=t.log,Le=t.unstable_setDisableYieldValue,Re=null,ze=null;function Be(e){if(typeof Ie==`function`&&Le(e),ze&&typeof ze.setStrictMode==`function`)try{ze.setStrictMode(Re,e)}catch{}}var Ve=Math.clz32?Math.clz32:We,He=Math.log,Ue=Math.LN2;function We(e){return e>>>=0,e===0?32:31-(He(e)/Ue|0)|0}var Ge=256,Ke=262144,qe=4194304;function Je(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Ye(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=Je(n))):i=Je(o):i=Je(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=Je(n))):i=Je(o)):i=Je(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function Xe(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Ze(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Qe(){var e=qe;return qe<<=1,!(qe&62914560)&&(qe=4194304),e}function $e(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function et(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function tt(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),mn=!1;if(pn)try{var hn={};Object.defineProperty(hn,"passive",{get:function(){mn=!0}}),window.addEventListener(`test`,hn,hn),window.removeEventListener(`test`,hn,hn)}catch{mn=!1}var gn=null,_n=null,vn=null;function yn(){if(vn)return vn;var e,t=_n,n=t.length,r,i=`value`in gn?gn.value:gn.textContent,a=i.length;for(e=0;e=Zn),er=` `,tr=!1;function nr(e,t){switch(e){case`keyup`:return Yn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function rr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var ir=!1;function ar(e,t){switch(e){case`compositionend`:return rr(t);case`keypress`:return t.which===32?(tr=!0,er):null;case`textInput`:return e=t.data,e===er&&tr?null:e;default:return null}}function or(e,t){if(ir)return e===`compositionend`||!Xn&&nr(e,t)?(e=yn(),vn=_n=gn=null,ir=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Or(n)}}function Ar(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Ar(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function jr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Bt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Bt(e.document)}return t}function Mr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Nr=pn&&`documentMode`in document&&11>=document.documentMode,Pr=null,Fr=null,Ir=null,Lr=!1;function Rr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Lr||Pr==null||Pr!==Bt(r)||(r=Pr,`selectionStart`in r&&Mr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Ir&&Dr(Ir,r)||(Ir=r,r=Ed(Fr,`onSelect`),0>=o,i-=o,Ai=1<<32-Ve(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),I&&Mi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),I&&Mi(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return I&&Mi(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),I&&Mi(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===E&&Aa(l)===r.type){n(e,r.sibling),c=a(r,o.props),La(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===y?(c=_i(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=gi(o.type,o.key,o.props,null,e.mode,c),La(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=bi(o,e.mode,c),c.return=e,e=c}return s(e);case E:return o=Aa(o),b(e,r,o,c)}if(oe(o))return h(e,r,o,c);if(ie(o)){if(l=ie(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Ia(o),c);if(o.$$typeof===te)return b(e,r,aa(e,o),c);Ra(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=vi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Fa=0;var i=b(e,t,n,r);return Pa=null,i}catch(t){if(t===wa||t===Ea)throw t;var a=fi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ba=za(!0),Va=za(!1),Ha=!1;function Ua(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Wa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ga(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ka(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=li(e),ci(e,null,n),t}return ai(e,r,t,n),li(e)}function qa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,rt(e,n)}}function Ja(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ya=!1;function Xa(){if(Ya){var e=ha;if(e!==null)throw e}}function Za(e,t,n,r){Ya=!1;var i=e.updateQueue;Ha=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===ma&&(Ya=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ha=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Qa(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function $a(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=k.T,s={};k.T=s,Fs(e,!1,t,n);try{var c=i(),l=k.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ps(e,t,va(c,r),pu(e)):Ps(e,t,r,pu(e))}catch(n){Ps(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{A.p=a,o!==null&&s.types!==null&&(o.types=s.types),k.T=o}}function ws(){}function Ts(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Es(e).queue;Cs(e,a,t,se,n===null?ws:function(){return Ds(e),n(r)})}function Es(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:se,baseState:se,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:se},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Ds(e){var t=Es(e);t.next===null&&(t=e.alternate.memoizedState),Ps(e,t.next.queue,{},pu())}function Os(){return ia(Qf)}function ks(){return H().memoizedState}function As(){return H().memoizedState}function js(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ga(n);var r=Ka(t,e,n);r!==null&&(hu(r,t,n),qa(r,t,n)),t={cache:ua()},e.payload=t;return}t=t.return}}function Ms(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Is(e)?Ls(t,n):(n=oi(e,t,n,r),n!==null&&(hu(n,e,r),Rs(n,t,r)))}function Ns(e,t,n){Ps(e,t,n,pu())}function Ps(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Is(e))Ls(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Er(s,o))return ai(e,t,i,0),K===null&&ii(),!1}catch{}if(n=oi(e,t,i,r),n!==null)return hu(n,e,r),Rs(n,t,r),!0}return!1}function Fs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Is(e)){if(t)throw Error(i(479))}else t=oi(e,n,r,2),t!==null&&hu(t,e,2)}function Is(e){var t=e.alternate;return e===z||t!==null&&t===z}function Ls(e,t){_o=go=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Rs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,rt(e,n)}}var zs={readContext:ia,use:Po,useCallback:V,useContext:V,useEffect:V,useImperativeHandle:V,useLayoutEffect:V,useInsertionEffect:V,useMemo:V,useReducer:V,useRef:V,useState:V,useDebugValue:V,useDeferredValue:V,useTransition:V,useSyncExternalStore:V,useId:V,useHostTransitionStatus:V,useFormState:V,useActionState:V,useOptimistic:V,useMemoCache:V,useCacheRefresh:V};zs.useEffectEvent=V;var Bs={readContext:ia,use:Po,useCallback:function(e,t){return jo().memoizedState=[e,t===void 0?null:t],e},useContext:ia,useEffect:us,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),cs(4194308,4,gs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cs(4194308,4,e,t)},useInsertionEffect:function(e,t){cs(4,2,e,t)},useMemo:function(e,t){var n=jo();t=t===void 0?null:t;var r=e();if(vo){Be(!0);try{e()}finally{Be(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=jo();if(n!==void 0){var i=n(t);if(vo){Be(!0);try{n(t)}finally{Be(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ms.bind(null,z,e),[r.memoizedState,e]},useRef:function(e){var t=jo();return e={current:e},t.memoizedState=e},useState:function(e){e=Ko(e);var t=e.queue,n=Ns.bind(null,z,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:vs,useDeferredValue:function(e,t){return xs(jo(),e,t)},useTransition:function(){var e=Ko(!1);return e=Cs.bind(null,z,e.queue,!0,!1),jo().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=z,a=jo();if(I){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),K===null)throw Error(i(349));J&127||Vo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,us(Uo.bind(null,r,o,e),[e]),r.flags|=2048,os(9,{destroy:void 0},Ho.bind(null,r,o,n,t),null),n},useId:function(){var e=jo(),t=K.identifierPrefix;if(I){var n=ji,r=Ai;n=(r&~(1<<32-Ve(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=yo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[ut]=t,o[dt]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Pd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Pc(t)}}return U(t),Fc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Pc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=pe.current,Wi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Li,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[ut]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Vi(t,!0)}else e=Bd(e).createTextNode(r),e[ut]=t,t.stateNode=e}return U(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Wi(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[ut]=t}else Gi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),e=!1}else n=Ki(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(fo(t),t):(fo(t),null);if(t.flags&128)throw Error(i(558))}return U(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Wi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[ut]=t}else Gi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),a=!1}else a=Ki(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(fo(t),t):(fo(t),null)}return fo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Lc(t,t.updateQueue),U(t),null);case 4:return N(),e===null&&Sd(t.stateNode.containerInfo),U(t),null;case 10:return Qi(t.type),U(t),null;case 19:if(j(R),r=t.memoizedState,r===null)return U(t),null;if(a=!!(t.flags&128),o=r.rendering,o===null){if(a)Rc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=po(e),o!==null){for(t.flags|=128,Rc(r,!1),e=o.updateQueue,t.updateQueue=e,Lc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)hi(n,e),n=n.sibling;return M(R,R.current&1|2),I&&Mi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&ke()>tu&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}}else{if(!a){if(e=po(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Lc(t,e),Rc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!I)return U(t),null}else 2*ke()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(U(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=ke(),e.sibling=null,n=R.current,M(R,a?n&1|2:n&1),I&&Mi(t,r.treeForkCount),e);case 22:case 23:return fo(t),io(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(U(t),t.subtreeFlags&6&&(t.flags|=8192)):U(t),n=t.updateQueue,n!==null&&Lc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&j(ba),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Qi(L),U(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Bc(e,t){switch(Fi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Qi(L),N(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return ge(t),null;case 31:if(t.memoizedState!==null){if(fo(t),t.alternate===null)throw Error(i(340));Gi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(fo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Gi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return j(R),null;case 4:return N(),null;case 10:return Qi(t.type),null;case 22:case 23:return fo(t),io(),e!==null&&j(ba),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Qi(L),null;case 25:return null;default:return null}}function Vc(e,t){switch(Fi(t),t.tag){case 3:Qi(L),N();break;case 26:case 27:case 5:ge(t);break;case 4:N();break;case 31:t.memoizedState!==null&&fo(t);break;case 13:fo(t);break;case 19:j(R);break;case 10:Qi(t.type);break;case 22:case 23:fo(t),io(),e!==null&&j(ba);break;case 24:Qi(L)}}function Hc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Uc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Wc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{$a(t,n)}catch(t){Z(e,e.return,t)}}}function Gc(e,t,n){n.props=qs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Kc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function qc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function Jc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Yc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[dt]=t}catch(t){Z(e,e.return,t)}}function Xc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Zc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Xc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=rn));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[ut]=e,t[dt]=n}catch(t){Z(e,e.return,t)}}var tl=!1,nl=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=jr(e),Mr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(o,r,n),o[ut]=e,Ct(o),r=o;break a;case`link`:var s=Vf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=kr(s,h),v=kr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,k.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(i(331));var c=G;if(G|=4,Fl(o.current),Dl(o,o.current,s,n),G=c,id(0,!1),ze&&typeof ze.onPostCommitFiberRoot==`function`)try{ze.onPostCommitFiberRoot(Re,o)}catch{}return!0}finally{A.p=a,k.T=r,Vu(e,t)}}function Wu(e,t,n){t=Si(n,t),t=$s(e.stateNode,t,2),e=Ka(e,t,2),e!==null&&(et(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=Si(n,e),n=ec(2),r=Ka(t,n,2),r!==null&&(tc(n,r,t,e),et(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>ke()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=Qe()),e=si(e,t),e!==null&&(et(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return Te(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Ve(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=Ye(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||Xe(r,a)||(n=!0,ld(r,a))}r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=ke(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Ht(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),Ct(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Ht(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Ht(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Ht(n.imageSizes)+`"]`)):i+=`[href="`+Ht(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),Ct(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Ht(r)+`"][href="`+Ht(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),Ct(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=St(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);Ct(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=St(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),Ct(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=St(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),Ct(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=pe.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=St(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=St(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=St(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+Ht(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),Ct(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Ht(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Ht(n.href)+`"]`);if(r)return t.instance=r,Ct(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),Ct(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,Ct(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),Ct(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,Ct(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),Ct(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,Ct(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),Ct(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=c(u(),1),v=g(),y=`cps.web.deviceCredential`,b=class extends Error{constructor(e=`此浏览器需要重新配对。请重新运行 codex-provider web。`){super(e),this.name=`PairingRequiredError`}},x=class extends Error{constructor(e,t,n){super(t||`配置已变更,请重新确认。`),this.name=`ProfileRevisionError`,this.code=e,this.profile=n}};function ee(){return!!window.localStorage.getItem(y)}async function te(){let e=new URLSearchParams(window.location.hash.replace(/^#/,``)).get(`pair`);if(!e)return ee();let t=await fetch(`/api/pair`,{method:`POST`,headers:{"X-Codex-Provider-Pairing":e}}),n=await t.json().catch(()=>({}));if(!t.ok||!n.deviceCredential)throw new b(n.error??`配对链接无效、已过期或已被使用。请重新运行 codex-provider web。`);return window.localStorage.setItem(y,n.deviceCredential),window.history.replaceState(null,``,`${window.location.pathname}${window.location.search}`),!0}function S(){return{"X-Codex-Provider-Device":window.localStorage.getItem(y)??``}}function C(e,t,n){let r=e.code??e.coreError?.code;return t===409&&([`PROFILE_REVISION_REQUIRED`,`PROFILE_CHANGED`,`STORAGE_REVISION_REQUIRED`,`STORAGE_CHANGED`].includes(r)||[`PLAN_EXPIRED`,`STALE_STATE`].includes(r))?new x(r,e.error,e.profile):Error(e.error??n)}async function w(e,t){let n=await e.json().catch(()=>({}));if(!e.ok)throw n.code===`PAIRING_REQUIRED`?(window.dispatchEvent(new CustomEvent(`cps:pairing-required`,{detail:n.error})),new b(n.error)):C(n,e.status,t);return n}async function T(e,t={},{signal:n}={}){let r=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`,...S()},body:JSON.stringify(t),signal:n});return w(r,`Request failed with HTTP ${r.status}.`)}async function E(e=0){let t=await fetch(`/api/activity?after=${e}`,{headers:S()});return w(t,`Activity request failed with HTTP ${t.status}.`)}async function ne(){let e=await fetch(`/api/profiles`,{headers:S()});return w(e,`Profile request failed with HTTP ${e.status}.`)}async function re(){try{await T(`/api/access/forget`)}finally{window.localStorage.removeItem(y)}}async function D(e={},t={}){return T(`/api/history`,e,t)}async function ie(e={},t={}){return T(`/api/history/session`,e,t)}function ae(e,t){let[n,r]=(0,_.useState)(()=>{try{let n=window.localStorage.getItem(e);return n?JSON.parse(n):t}catch{return t}});return(0,_.useEffect)(()=>{window.localStorage.setItem(e,JSON.stringify(n))},[e,n]),[n,r]}function O(){let e=0,t=null;return{begin(){return t?.abort(),t=new AbortController,e+=1,{sequence:e,controller:t,signal:t.signal}},isLatest(t){return t===e},cancel(){t?.abort(),e+=1}}}function oe(e,t=300,n=globalThis){let r=n.setTimeout(e,t);return()=>n.clearTimeout(r)}function k(e,t,n){return!e?.id||!e?.revision||n?.profileId!==e.id||n?.profileRevision!==e.revision?null:{...t,profile:{...e},profileId:e.id,profileRevision:e.revision,status:{...n}}}function A(e){let t=e?.result?.result?.skippedLockedRolloutFiles??e?.result?.skippedLockedRolloutFiles??e?.skippedLockedRolloutFiles??[];return Array.isArray(t)?t.filter(Boolean):[]}function se(e,{successTitle:t,partialTitle:n,message:r}){let i=A(e);return e?.result?.outcome===`partial`||e?.outcome===`partial`||i.length>0?{tone:`warning`,title:n,message:[r,i.length?`已跳过 ${i.length} 个被占用的 rollout 文件:${i.join(`、`)}`:`部分项目未完成;请查看活动日志后重试。`].filter(Boolean).join(`;`)}:{tone:`success`,title:t,message:r}}function ce(e,t){let n=String(e??``).replaceAll(`\\`,`/`).replace(/\/{2,}/g,`/`).replace(/\/$/,``);return t===`win32`?n.toLowerCase():n}function le(e=[],{platform:t=typeof process<`u`?process.platform:`browser`}={}){let n=new Set;return e.filter((e,r)=>{let i=e?.threadId??e?.id,a=e?.rolloutPath??e?.filePath??e?.rolloutFile??e?.path,o=i?`thread:${i}`:a?`rollout:${ce(a,t)}`:`item:${r}`;return!n.has(o)&&(n.add(o),!0)})}function ue(e,{caseInsensitive:t=!1}={}){let n=String(e??``).replace(/[\\/]+$/,``).replaceAll(`\\`,`/`);return t?n.toLowerCase():n}function j(e,t,n){return!!(e&&t&&ue(e,n)===ue(t,n))}function M(e){let t=String(e??``).replace(/[\\/]+$/,``),n=Math.max(t.lastIndexOf(`/`),t.lastIndexOf(`\\`));return n<0?``:n===0?t.slice(0,1):n===2&&/^[A-Za-z]:/.test(t)?t.slice(0,3):t.slice(0,n)}function de(e,t){let n=e?.stateDbLocation?.path;if(n)return M(n);let r=t?.metadata,i={caseInsensitive:e?.pathComparisonCaseInsensitive===!0};return Number(r?.version)>=2&&e?.sqliteHomeSource==="default"&&j(r?.sqliteHome,e?.codexHome,i)?e.codexHome:e?.sqliteHome??``}function fe({backup:e,profile:t,targetSqliteHome:n,restoreDatabase:r,restoreConfig:i,sqliteSupported:a,pathComparisonCaseInsensitive:o=!1}){let s=e?.metadata?.sqliteHome,c=t?.sqliteHome?.trim()??``,l=!!(r&&s&&n&&!j(s,n,{caseInsensitive:o})),u=l&&!c,d=l&&i;return{requiresRelocation:l,missingExplicitTarget:u,configRestoreConflict:d,canSubmit:!!a&&!u&&!d}}function pe(e){return{profileId:e||`default`}}function me({fetchStatus:e,fetchBackups:t,gate:n=O()}){let r=async({profileId:r,showLoading:i=!0,onLoading:a,onResult:o,onError:s})=>{let{controller:c,sequence:l}=n.begin();i&&a?.(!0);try{let i=pe(r),[a,s]=await Promise.all([e(i,{signal:c.signal}),t(i,{signal:c.signal})]);return n.isLatest(l)?(o?.({profileId:r,status:a.status,backups:s}),!0):!1}catch(e){return e?.name===`AbortError`||!n.isLatest(l)||s?.(e),!1}finally{n.isLatest(l)&&a?.(!1)}};return r.cancel=()=>n.cancel(),r}var he=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),N=o(((e,t)=>{t.exports=he()}))();function P({children:e,size:t=18,className:n=``}){return(0,N.jsx)(`svg`,{className:n,width:t,height:t,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:e})}var ge=e=>(0,N.jsxs)(P,{...e,children:[(0,N.jsx)(`path`,{d:`M20 6v5h-5`}),(0,N.jsx)(`path`,{d:`M4 18v-5h5`}),(0,N.jsx)(`path`,{d:`M18.3 9A7 7 0 0 0 6.7 6.7L4 11`}),(0,N.jsx)(`path`,{d:`M5.7 15A7 7 0 0 0 17.3 17.3L20 13`})]}),_e=e=>(0,N.jsxs)(P,{...e,children:[(0,N.jsx)(`ellipse`,{cx:`12`,cy:`5`,rx:`8`,ry:`3`}),(0,N.jsx)(`path`,{d:`M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5`}),(0,N.jsx)(`path`,{d:`M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6`})]}),ve=e=>(0,N.jsxs)(P,{...e,children:[(0,N.jsx)(`path`,{d:`M3 12a9 9 0 1 0 3-6.7L3 8`}),(0,N.jsx)(`path`,{d:`M3 3v5h5`}),(0,N.jsx)(`path`,{d:`M12 7v5l3 2`})]}),ye=e=>(0,N.jsx)(P,{...e,children:(0,N.jsx)(`path`,{d:`M3 12h4l2-7 4 14 2-7h6`})}),be=e=>(0,N.jsxs)(P,{...e,children:[(0,N.jsx)(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`,rx:`1`}),(0,N.jsx)(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`,rx:`1`}),(0,N.jsx)(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1`}),(0,N.jsx)(`rect`,{x:`14`,y:`14`,width:`7`,height:`7`,rx:`1`})]}),xe=e=>(0,N.jsxs)(P,{...e,children:[(0,N.jsx)(`path`,{d:`M12 3 4.5 6v5.3c0 4.6 3.2 8 7.5 9.7 4.3-1.7 7.5-5.1 7.5-9.7V6L12 3Z`}),(0,N.jsx)(`path`,{d:`m9 12 2 2 4-4`})]}),Se=e=>(0,N.jsx)(P,{...e,children:(0,N.jsx)(`path`,{d:`m9 18 6-6-6-6`})}),Ce=e=>(0,N.jsx)(P,{...e,children:(0,N.jsx)(`path`,{d:`m6 6 12 12M18 6 6 18`})}),we=e=>(0,N.jsx)(P,{...e,children:(0,N.jsx)(`path`,{d:`m5 12 4 4L19 6`})}),Te=e=>(0,N.jsxs)(P,{...e,children:[(0,N.jsx)(`path`,{d:`M12 3 2.8 19h18.4L12 3Z`}),(0,N.jsx)(`path`,{d:`M12 9v4M12 17h.01`})]}),Ee=e=>(0,N.jsx)(P,{...e,children:(0,N.jsx)(`path`,{d:`M3 6.5h6l2 2h10v9.5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6.5Z`})}),De=[{id:`overview`,label:`概览`,icon:be},{id:`history`,label:`聊天记录`,icon:ve},{id:`backups`,label:`备份`,icon:ve},{id:`activity`,label:`活动`,icon:ye}],Oe={backupRoot:``,backups:[]};function ke(e){return new Intl.NumberFormat(`zh-CN`).format(Number(e)||0)}function Ae(e){let t=[`B`,`KB`,`MB`,`GB`,`TB`],n=Number(e)||0,r=0;for(;n>=1024&&r=10?1:2).replace(/\.0$/,``)} ${t[r]}`}function je(e){return e?new Intl.DateTimeFormat(`zh-CN`,{month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}).format(new Date(e)):`未知时间`}function Me(e,t){return e.split(/(`[^`]+`|\*\*[^*]+\*\*|\*[^*]+\*)/g).map((e,n)=>e.startsWith("`")&&e.endsWith("`")?(0,N.jsx)(`code`,{children:e.slice(1,-1)},`${t}-code-${n}`):e.startsWith(`**`)&&e.endsWith(`**`)?(0,N.jsx)(`strong`,{children:e.slice(2,-2)},`${t}-strong-${n}`):e.startsWith(`*`)&&e.endsWith(`*`)?(0,N.jsx)(`em`,{children:e.slice(1,-1)},`${t}-em-${n}`):(0,N.jsx)(_.Fragment,{children:e},`${t}-text-${n}`))}function Ne({text:e}){return String(e??``).split(/(```[^\n]*\n[\s\S]*?```)/g).map((e,t)=>{if(e.startsWith("```")&&e.endsWith("```")){let n=e.slice(3,-3).replace(/^\w*\n/,``);return(0,N.jsx)(`pre`,{children:(0,N.jsx)(`code`,{children:n})},`block-${t}`)}return e.split(` +`).map((e,n,r)=>(0,N.jsxs)(_.Fragment,{children:[Me(e,`${t}-${n}`),n{for(let r of e??[]){if(!r||r===`(missing)`)continue;let e=t.get(r)??new Set;e.add(n),t.set(r,e)}};return n(e.configuredProviders,`config`),n(Object.keys(e.rolloutCounts?.sessions??{}),`rollout`),n(Object.keys(e.rolloutCounts?.archived_sessions??{}),`rollout`),n(Object.keys(e.sqliteCounts?.sessions??{}),`sqlite`),n(Object.keys(e.sqliteCounts?.archived_sessions??{}),`sqlite`),n([e.currentProvider],`config`),[...t.entries()].map(([t,n])=>({id:t,sources:[...n],configured:e.configuredProviders?.includes(t),current:t===e.currentProvider})).sort((e,t)=>Number(t.current)-Number(e.current)||e.id.localeCompare(t.id))}function Fe({tone:e=`neutral`}){return(0,N.jsx)(`span`,{className:`status-dot status-dot--${e}`,"aria-hidden":`true`})}function Ie({status:e,busy:t,onRefresh:n}){let r=e?.sqliteAccess?.supported!==!1&&!e?.sqliteCounts?.unreadable;return(0,N.jsxs)(`header`,{className:`app-header`,children:[(0,N.jsxs)(`div`,{className:`brand`,children:[(0,N.jsx)(`div`,{className:`brand-mark`,children:(0,N.jsx)(_e,{size:19})}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`div`,{className:`brand-name`,children:`Codex Provider Sync`}),(0,N.jsx)(`div`,{className:`brand-subtitle`,children:`本机元数据一致性工具`})]})]}),(0,N.jsxs)(`div`,{className:`header-actions`,children:[(0,N.jsxs)(`div`,{className:`service-state`,children:[(0,N.jsx)(Fe,{tone:t?`warning`:r?`success`:`danger`}),(0,N.jsx)(`span`,{children:t?`操作执行中`:r?`本地服务就绪`:`需要检查`})]}),(0,N.jsxs)(`button`,{className:`button button--secondary button--compact`,type:`button`,onClick:n,disabled:t,children:[(0,N.jsx)(ge,{size:16}),`刷新`]})]})]})}function Le({view:e,setView:t,status:n,onForgetBrowser:r}){return(0,N.jsxs)(`aside`,{className:`sidebar`,children:[(0,N.jsx)(`nav`,{className:`navigation`,"aria-label":`主导航`,children:De.map(n=>{let r=n.icon;return(0,N.jsxs)(`button`,{className:`nav-item ${e===n.id?`nav-item--active`:``}`,type:`button`,onClick:()=>t(n.id),children:[(0,N.jsx)(r,{size:17}),(0,N.jsx)(`span`,{children:n.label})]},n.id)})}),(0,N.jsxs)(`div`,{className:`sidebar-foot`,children:[(0,N.jsx)(`div`,{className:`sidebar-provider-label`,children:`当前 Provider`}),(0,N.jsxs)(`div`,{className:`sidebar-provider-value`,children:[(0,N.jsx)(Fe,{tone:`success`}),(0,N.jsx)(`span`,{children:n?.currentProvider??`未读取`})]}),(0,N.jsx)(`div`,{className:`sidebar-version`,children:`Web UI · localhost only`}),(0,N.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,onClick:r,children:`忘记此浏览器`})]})]})}function Re({profiles:e,profileId:t,setProfileId:n,status:r,onAddProfile:i,onDeleteProfile:a,onRefresh:o,loading:s,profileSwitchDisabled:c}){return(0,N.jsxs)(`section`,{className:`storage-bar`,"aria-label":`存储位置`,children:[(0,N.jsxs)(`label`,{className:`path-field path-field--wide`,children:[(0,N.jsx)(`span`,{children:`存储配置`}),(0,N.jsxs)(`div`,{className:`path-input-wrap`,children:[(0,N.jsx)(Ee,{size:16}),(0,N.jsx)(`select`,{value:t,onChange:e=>n(e.target.value),disabled:c,children:e.map(e=>(0,N.jsx)(`option`,{value:e.id,children:e.name},e.id))})]})]}),(0,N.jsxs)(`label`,{className:`path-field`,children:[(0,N.jsxs)(`span`,{children:[`当前路径 `,(0,N.jsx)(`small`,{children:`由服务端解析`})]}),(0,N.jsxs)(`div`,{className:`path-input-wrap`,children:[(0,N.jsx)(_e,{size:16}),(0,N.jsx)(`input`,{value:r?.codexHome??``,readOnly:!0,placeholder:`读取状态后显示`})]})]}),(0,N.jsx)(`button`,{className:`button button--secondary storage-refresh`,type:`button`,onClick:i,children:`新增配置`}),t==="default"?null:(0,N.jsx)(`button`,{className:`button button--quiet storage-refresh`,type:`button`,onClick:a,children:`删除配置`}),(0,N.jsxs)(`button`,{className:`button button--secondary storage-refresh`,type:`button`,onClick:o,disabled:s,children:[(0,N.jsx)(ge,{size:16,className:s?`spin`:``}),`读取状态`]})]})}function ze({title:e,counts:t,currentProvider:n}){let r=Object.entries(t??{}).sort((e,t)=>t[1]-e[1]),i=r.reduce((e,[,t])=>e+t,0);return(0,N.jsxs)(`div`,{className:`distribution-block`,children:[(0,N.jsxs)(`div`,{className:`distribution-heading`,children:[(0,N.jsx)(`span`,{children:e}),(0,N.jsx)(`strong`,{children:ke(i)})]}),(0,N.jsx)(`div`,{className:`distribution-list`,children:r.length===0?(0,N.jsx)(`div`,{className:`empty-inline`,children:`无记录`}):r.map(([e,t])=>(0,N.jsxs)(`div`,{className:`distribution-row`,children:[(0,N.jsxs)(`div`,{className:`distribution-meta`,children:[(0,N.jsx)(`span`,{className:`provider-name`,children:e}),(0,N.jsx)(`span`,{children:ke(t)})]}),(0,N.jsx)(`div`,{className:`bar-track`,children:(0,N.jsx)(`span`,{className:e===n?`bar-fill bar-fill--current`:`bar-fill`,style:{width:`${Math.max(5,i?t/i*100:0)}%`}})})]},e))})]})}function Be({status:e,loading:t}){let n=Object.values(e?.rolloutCounts?.sessions??{}).reduce((e,t)=>e+t,0)+Object.values(e?.rolloutCounts?.archived_sessions??{}).reduce((e,t)=>e+t,0),r=Object.values(e?.sqliteCounts?.sessions??{}).reduce((e,t)=>e+t,0)+Object.values(e?.sqliteCounts?.archived_sessions??{}).reduce((e,t)=>e+t,0),i=e?.alignment?.aligned;return(0,N.jsxs)(`section`,{className:`status-panel`,children:[(0,N.jsxs)(`div`,{className:`section-title-row`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h2`,{children:`状态总览`}),(0,N.jsx)(`p`,{children:`比较 rollout 文件、SQLite 线程索引和当前 Provider。`})]}),(0,N.jsxs)(`div`,{className:`alignment-state ${i?`alignment-state--success`:`alignment-state--warning`}`,children:[t?(0,N.jsx)(ge,{size:16,className:`spin`}):i?(0,N.jsx)(we,{size:16}):(0,N.jsx)(Te,{size:16}),(0,N.jsx)(`span`,{children:t?`正在检查`:i?`Provider 元数据已对齐`:`发现不一致`})]})]}),(0,N.jsxs)(`div`,{className:`summary-strip`,children:[(0,N.jsxs)(`div`,{className:`summary-item`,children:[(0,N.jsx)(`span`,{children:`当前 Provider`}),(0,N.jsx)(`strong`,{children:e?.currentProvider??`—`}),(0,N.jsx)(`small`,{children:e?.currentProviderImplicit?`隐式默认`:`config.toml 根级配置`})]}),(0,N.jsxs)(`div`,{className:`summary-item`,children:[(0,N.jsx)(`span`,{children:`Rollout 文件`}),(0,N.jsx)(`strong`,{children:ke(n)}),(0,N.jsx)(`small`,{children:`sessions + archived`})]}),(0,N.jsxs)(`div`,{className:`summary-item`,children:[(0,N.jsx)(`span`,{children:`SQLite threads`}),(0,N.jsx)(`strong`,{children:e?.sqliteCounts?.unreadable?`不可读`:ke(r)}),(0,N.jsx)(`small`,{children:e?.stateDbLocation?.source??`未定位数据库`})]}),(0,N.jsxs)(`div`,{className:`summary-item`,children:[(0,N.jsx)(`span`,{children:`托管备份`}),(0,N.jsx)(`strong`,{children:ke(e?.backupSummary?.count)}),(0,N.jsx)(`small`,{children:Ae(e?.backupSummary?.totalBytes)})]})]}),(0,N.jsxs)(`div`,{className:`distribution-grid`,children:[(0,N.jsxs)(`div`,{className:`distribution-column`,children:[(0,N.jsxs)(`div`,{className:`column-label`,children:[(0,N.jsx)(Ee,{size:16}),` Rollout files`]}),(0,N.jsx)(ze,{title:`sessions`,counts:e?.rolloutCounts?.sessions,currentProvider:e?.currentProvider}),(0,N.jsx)(ze,{title:`archived_sessions`,counts:e?.rolloutCounts?.archived_sessions,currentProvider:e?.currentProvider})]}),(0,N.jsx)(`div`,{className:`distribution-divider`}),(0,N.jsxs)(`div`,{className:`distribution-column`,children:[(0,N.jsxs)(`div`,{className:`column-label`,children:[(0,N.jsx)(_e,{size:16}),` SQLite state`]}),(0,N.jsx)(ze,{title:`sessions`,counts:e?.sqliteCounts?.sessions,currentProvider:e?.currentProvider}),(0,N.jsx)(ze,{title:`archived_sessions`,counts:e?.sqliteCounts?.archived_sessions,currentProvider:e?.currentProvider})]})]})]})}function Ve({status:e}){let t=[];e?.sqliteAccess?.supported===!1&&t.push({tone:`danger`,title:`SQLite 路径不可安全访问`,detail:e.sqliteAccess.message}),e?.sqliteCounts?.unreadable&&t.push({tone:`danger`,title:`SQLite 当前不可读`,detail:e.sqliteCounts.error}),e?.lockedRolloutFiles?.length&&t.push({tone:`warning`,title:`${e.lockedRolloutFiles.length} 个 rollout 文件正在使用`,detail:`同步会跳过这些活跃文件;会话结束后可再次执行。`}),e?.encryptedContentWarning&&t.push({tone:`warning`,title:`检测到 encrypted_content`,detail:e.encryptedContentWarning});let n=e?.sqliteRepairStats;return(n?.userEventRowsNeedingRepair||n?.cwdRowsNeedingRepair)&&t.push({tone:`info`,title:`SQLite 有待修复字段`,detail:`user-event ${n.userEventRowsNeedingRepair??0},cwd ${n.cwdRowsNeedingRepair??0}`}),t.length===0?null:(0,N.jsx)(`section`,{className:`warning-stack`,"aria-label":`诊断信息`,children:t.map((e,t)=>(0,N.jsxs)(`div`,{className:`warning-row warning-row--${e.tone}`,children:[(0,N.jsx)(Te,{size:17}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:e.title}),(0,N.jsx)(`span`,{children:e.detail})]})]},`${e.title}-${t}`))})}function He({projects:e=[]}){return(0,N.jsxs)(`section`,{className:`data-section`,children:[(0,N.jsx)(`div`,{className:`section-title-row section-title-row--compact`,children:(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h2`,{children:`项目可见性`}),(0,N.jsx)(`p`,{children:`检查 Desktop 项目路径、全局排序和首屏 50 条命中。`})]})}),(0,N.jsx)(`div`,{className:`table-scroll`,children:(0,N.jsxs)(`table`,{className:`data-table`,children:[(0,N.jsx)(`thead`,{children:(0,N.jsxs)(`tr`,{children:[(0,N.jsx)(`th`,{children:`项目根目录`}),(0,N.jsx)(`th`,{children:`交互会话`}),(0,N.jsx)(`th`,{children:`首屏`}),(0,N.jsx)(`th`,{children:`Ranks`}),(0,N.jsx)(`th`,{children:`CWD 精确匹配`}),(0,N.jsx)(`th`,{children:`Provider`})]})}),(0,N.jsx)(`tbody`,{children:e.length===0?(0,N.jsx)(`tr`,{children:(0,N.jsx)(`td`,{colSpan:`6`,className:`table-empty`,children:`没有可显示的项目诊断。`})}):e.map(e=>(0,N.jsxs)(`tr`,{children:[(0,N.jsx)(`td`,{className:`path-cell`,children:e.root}),(0,N.jsx)(`td`,{children:e.interactiveThreads}),(0,N.jsxs)(`td`,{children:[e.firstPageThreads,`/50`]}),(0,N.jsx)(`td`,{children:e.rankPreview||`—`}),(0,N.jsxs)(`td`,{children:[e.exactCwdMatches,`/`,e.interactiveThreads]}),(0,N.jsx)(`td`,{children:Object.entries(e.providerCounts??{}).map(([e,t])=>`${e} ${t}`).join(` · `)||`—`})]},e.root))})]})})]})}function Ue({value:e,onChange:t,disabled:n}){return(0,N.jsxs)(`div`,{className:`segmented`,role:`radiogroup`,"aria-label":`执行模式`,children:[(0,N.jsxs)(`button`,{type:`button`,className:e===`sync`?`segmented-option segmented-option--active`:`segmented-option`,onClick:()=>t(`sync`),disabled:n,children:[(0,N.jsx)(`span`,{children:`仅同步元数据`}),(0,N.jsx)(`small`,{children:`不修改 config.toml`})]}),(0,N.jsxs)(`button`,{type:`button`,className:e===`switch`?`segmented-option segmented-option--active`:`segmented-option`,onClick:()=>t(`switch`),disabled:n,children:[(0,N.jsx)(`span`,{children:`切换 Provider 并同步`}),(0,N.jsx)(`small`,{children:`更新根级配置`})]})]})}function We({status:e,providers:t,selectedProvider:n,setSelectedProvider:r,onAddManualProvider:i,onRemoveManualProvider:a,onRequestExecute:o,busy:s}){let[c,l]=ae(`cps.web.mode`,`sync`),[u,d]=ae(`cps.web.modelMode`,`auto`),[f,p]=ae(`cps.web.customModel`,``),[m,h]=ae(`cps.web.keepCount`,5),[g,v]=(0,_.useState)(``),y=t.find(e=>e.id===n),b=y?.configured,x=/^[A-Za-z0-9_.-]+$/.test(g.trim()),ee=e?.sqliteAccess?.supported===!1,te=s||!n||ee||e?.sqliteCounts?.unreadable;return(0,N.jsxs)(`section`,{className:`execution-panel`,children:[(0,N.jsxs)(`div`,{className:`execution-head`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h2`,{children:`执行同步`}),(0,N.jsx)(`p`,{children:`所有写操作都会先创建备份。执行前请关闭 Codex CLI、App 和 app-server。`})]}),(0,N.jsx)(xe,{size:22})]}),(0,N.jsx)(Ue,{value:c,onChange:l,disabled:s}),(0,N.jsxs)(`div`,{className:`form-grid`,children:[(0,N.jsxs)(`label`,{className:`form-field`,children:[(0,N.jsx)(`span`,{children:`目标 Provider`}),(0,N.jsx)(`select`,{value:n,onChange:e=>r(e.target.value),disabled:s,children:t.map(e=>(0,N.jsxs)(`option`,{value:e.id,children:[e.id,e.current?`(当前)`:``]},e.id))}),c===`switch`&&!b?(0,N.jsx)(`small`,{className:`field-error`,children:`切换模式要求该 Provider 已定义在 config.toml。`}):null]}),(0,N.jsxs)(`label`,{className:`form-field form-field--short`,children:[(0,N.jsx)(`span`,{children:`保留备份数`}),(0,N.jsx)(`input`,{type:`number`,min:`1`,max:`100000`,value:m,onChange:e=>h(Number(e.target.value)),disabled:s}),(0,N.jsx)(`small`,{children:`同步后自动清理`})]})]}),(0,N.jsxs)(`div`,{className:`manual-provider-row`,children:[(0,N.jsx)(`input`,{type:`text`,value:g,onChange:e=>v(e.target.value),placeholder:`手动添加 Provider ID`,spellCheck:`false`,disabled:s}),(0,N.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:s||!x,onClick:()=>{i(g.trim()),v(``)},children:`添加`}),y?.manual?(0,N.jsx)(`button`,{className:`manual-remove`,type:`button`,onClick:()=>a(n),disabled:s,children:`删除当前手动项`}):null]}),c===`switch`?(0,N.jsxs)(`fieldset`,{className:`model-options`,disabled:s,children:[(0,N.jsx)(`legend`,{children:`根级 model`}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`auto`,onChange:()=>d(`auto`)}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:`跟随 Provider 配置`}),(0,N.jsxs)(`small`,{children:["采用 `[model_providers.",n,"]` 中的 model"]})]})]}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`keep`,onChange:()=>d(`keep`)}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:`保留当前根级 model`}),(0,N.jsx)(`small`,{children:`只切换 model_provider`})]})]}),(0,N.jsxs)(`label`,{className:`custom-model-option`,children:[(0,N.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`custom`,onChange:()=>d(`custom`)}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:`自定义 model`}),(0,N.jsx)(`input`,{type:`text`,value:f,onFocus:()=>d(`custom`),onChange:e=>p(e.target.value),placeholder:`例如 MiniMax-M3`})]})]})]}):null,ee?(0,N.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`此 SQLite 布局仅供诊断`}),(0,N.jsx)(`span`,{children:e?.sqliteAccess?.message||`当前 SQLite 路径不可由 Web UI 安全写入,因此已禁用执行同步。`})]})]}):null,(0,N.jsxs)(`div`,{className:`backup-assurance`,children:[(0,N.jsx)(we,{size:16}),(0,N.jsx)(`span`,{children:`修改前创建 metadata v2 备份,并记录 SQLite Home`})]}),(0,N.jsxs)(`button`,{className:`button button--primary execute-button`,type:`button`,disabled:te||c===`switch`&&!b||c===`switch`&&u===`custom`&&!f.trim(),onClick:()=>o({mode:c,modelMode:u,model:f.trim(),keepCount:m}),children:[s?(0,N.jsx)(ge,{size:17,className:`spin`}):(0,N.jsx)(xe,{size:17}),s?`正在执行…`:c===`switch`?`切换并同步`:`执行同步`]})]})}function Ge({backups:e,onViewAll:t,onRestore:n,restoreDisabled:r}){return(0,N.jsxs)(`section`,{className:`recent-backups`,children:[(0,N.jsxs)(`div`,{className:`section-title-row section-title-row--compact`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h2`,{children:`最近备份`}),(0,N.jsx)(`p`,{children:e.backupRoot||`同步后将在 Codex Home 下创建备份`})]}),(0,N.jsxs)(`button`,{type:`button`,className:`text-button`,onClick:t,children:[`查看全部 `,(0,N.jsx)(Se,{size:14})]})]}),(0,N.jsx)(`div`,{className:`backup-rows`,children:e.backups.length===0?(0,N.jsx)(`div`,{className:`empty-state`,children:`尚无由本工具创建的备份。`}):e.backups.slice(0,3).map(e=>(0,N.jsxs)(`div`,{className:`backup-row`,children:[(0,N.jsx)(`div`,{className:`backup-icon`,children:(0,N.jsx)(ve,{size:17})}),(0,N.jsxs)(`div`,{className:`backup-main`,children:[(0,N.jsx)(`strong`,{children:je(e.metadata.createdAt)}),(0,N.jsxs)(`span`,{children:[e.metadata.targetProvider,` · `,e.metadata.changedSessionFiles??0,` 个 rollout`]})]}),(0,N.jsx)(`div`,{className:`backup-size`,children:Ae(e.sizeBytes)}),(0,N.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:r,title:r?`当前 SQLite 路径仅供诊断,不能恢复`:void 0,onClick:()=>n(e),children:`恢复`})]},e.id))})]})}function Ke({status:e,backups:t,providers:n,selectedProvider:r,setSelectedProvider:i,onAddManualProvider:a,onRemoveManualProvider:o,onExecute:s,onRestore:c,setView:l,busy:u,loading:d}){return(0,N.jsxs)(`div`,{className:`view-content`,children:[(0,N.jsx)(Be,{status:e,loading:d}),(0,N.jsx)(Ve,{status:e}),(0,N.jsxs)(`div`,{className:`overview-lower-grid`,children:[(0,N.jsxs)(`div`,{className:`overview-main-column`,children:[(0,N.jsx)(He,{projects:e?.projectThreadVisibility??[]}),(0,N.jsx)(Ge,{backups:t,onViewAll:()=>l(`backups`),onRestore:c,restoreDisabled:e?.sqliteAccess?.supported===!1})]}),(0,N.jsx)(We,{status:e,providers:n,selectedProvider:r,setSelectedProvider:i,onAddManualProvider:a,onRemoveManualProvider:o,onRequestExecute:s,busy:u})]})]})}function qe({backups:e,status:t,busy:n,onRestore:r,onPrune:i}){let[a,o]=ae(`cps.web.keepCount`,5),s=t?.sqliteAccess?.supported===!1;return(0,N.jsxs)(`div`,{className:`view-content`,children:[(0,N.jsxs)(`section`,{className:`page-intro`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h1`,{children:`备份`}),(0,N.jsx)(`p`,{children:`管理当前 Codex Home 下由本工具创建的 metadata v2 备份。`})]}),(0,N.jsxs)(`div`,{className:`prune-control`,children:[(0,N.jsxs)(`label`,{children:[`保留最近 `,(0,N.jsx)(`input`,{type:`number`,min:`0`,max:`100000`,value:a,onChange:e=>o(Number(e.target.value))}),` 份`]}),(0,N.jsx)(`button`,{className:`button button--secondary`,type:`button`,disabled:n,onClick:()=>i(a),children:`清理旧备份`})]})]}),(0,N.jsxs)(`section`,{className:`backup-list-section`,children:[(0,N.jsxs)(`div`,{className:`backup-root-line`,children:[(0,N.jsx)(Ee,{size:16}),(0,N.jsx)(`span`,{children:e.backupRoot||t?.backupRoot||`—`}),(0,N.jsxs)(`strong`,{children:[e.backups.length,` 份 · `,Ae(e.backups.reduce((e,t)=>e+t.sizeBytes,0))]})]}),(0,N.jsx)(`div`,{className:`full-backup-list`,children:e.backups.length===0?(0,N.jsxs)(`div`,{className:`large-empty`,children:[(0,N.jsx)(ve,{size:26}),(0,N.jsx)(`strong`,{children:`还没有备份`}),(0,N.jsx)(`span`,{children:`执行一次同步或切换后,备份会显示在这里。`})]}):e.backups.map(e=>(0,N.jsxs)(`article`,{className:`full-backup-row`,children:[(0,N.jsxs)(`div`,{className:`backup-date`,children:[(0,N.jsx)(`strong`,{children:je(e.metadata.createdAt)}),(0,N.jsx)(`span`,{children:e.id})]}),(0,N.jsxs)(`div`,{className:`backup-facts`,children:[(0,N.jsxs)(`span`,{children:[`Provider `,(0,N.jsx)(`strong`,{children:e.metadata.targetProvider})]}),(0,N.jsxs)(`span`,{children:[`Rollout `,(0,N.jsx)(`strong`,{children:e.metadata.changedSessionFiles??0})]}),(0,N.jsxs)(`span`,{children:[`SQLite `,(0,N.jsx)(`strong`,{children:e.metadata.sqliteDbFiles?.length?`已包含`:`未包含`})]})]}),(0,N.jsxs)(`div`,{className:`backup-source`,children:[(0,N.jsx)(`span`,{children:`SQLite Home`}),(0,N.jsx)(`code`,{children:e.metadata.sqliteHome??`旧版 metadata 未记录`})]}),(0,N.jsxs)(`div`,{className:`backup-row-actions`,children:[(0,N.jsx)(`span`,{children:Ae(e.sizeBytes)}),(0,N.jsx)(`button`,{className:`button button--secondary button--compact`,type:`button`,disabled:n||s,title:s?`当前 SQLite 路径仅供诊断,不能恢复`:void 0,onClick:()=>r(e),children:`恢复`})]})]},e.id))})]})]})}function Je({activity:e,activeOperation:t}){return(0,N.jsxs)(`div`,{className:`view-content`,children:[(0,N.jsxs)(`section`,{className:`page-intro`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h1`,{children:`活动日志`}),(0,N.jsx)(`p`,{children:`当前 Web UI 会话中的状态刷新、同步阶段和操作结果。`})]}),t?(0,N.jsxs)(`div`,{className:`live-operation`,children:[(0,N.jsx)(ge,{size:16,className:`spin`}),` `,t.kind]}):null]}),(0,N.jsxs)(`section`,{className:`activity-console`,children:[(0,N.jsxs)(`div`,{className:`console-head`,children:[(0,N.jsx)(`span`,{children:`Activity log`}),(0,N.jsxs)(`span`,{children:[e.length,` entries`]})]}),(0,N.jsx)(`div`,{className:`console-body`,children:e.length===0?(0,N.jsx)(`div`,{className:`console-empty`,children:`等待操作…`}):e.map(e=>(0,N.jsxs)(`div`,{className:`console-row console-row--${e.level}`,children:[(0,N.jsx)(`time`,{children:je(e.timestamp)}),(0,N.jsx)(`span`,{className:`console-level`,children:e.level}),(0,N.jsx)(`span`,{className:`console-message`,children:e.message}),typeof e.detail==`string`?(0,N.jsx)(`span`,{className:`console-detail`,children:e.detail}):null]},e.id))})]})]})}function Ye({profileId:e,status:t}){let[n,r]=(0,_.useState)(``),[i,a]=(0,_.useState)(``),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(``),[u,d]=(0,_.useState)(`all`),[f,p]=(0,_.useState)(1),[m,h]=(0,_.useState)({sessions:[],total:0,pageSize:50,hasNextPage:!1}),[g,v]=(0,_.useState)(``),[y,b]=(0,_.useState)(null),[x,ee]=(0,_.useState)(!1),[te,S]=(0,_.useState)(!1),[C,w]=(0,_.useState)(``),T=(0,_.useRef)(null),E=(0,_.useRef)(null);T.current||=O(),E.current||=O();let ne=Pe(t),re=[...new Set((t?.projectThreadVisibility??[]).map(e=>e.root))];(0,_.useEffect)(()=>{T.current.cancel(),E.current.cancel(),r(``),a(``),s(``),l(``),d(`all`),p(1),h({sessions:[],total:0,pageSize:50,hasNextPage:!1}),v(``),b(null),w(``)},[e]),(0,_.useEffect)(()=>oe(()=>a(n),300,window),[n]);let ae=(0,_.useCallback)(async()=>{let{controller:t,sequence:n}=T.current.begin();ee(!0),w(``);try{let r=await D({...pe(e),page:f,pageSize:50,query:i,provider:o,project:c,archived:u},{signal:t.signal});if(!T.current.isLatest(n))return;let a={...r.history,sessions:le(r.history?.sessions)};h(a),v(e=>a.sessions.some(t=>t.id===e)?e:a.sessions[0]?.id??``)}catch(e){e.name!==`AbortError`&&T.current.isLatest(n)&&w(e.message)}finally{T.current.isLatest(n)&&ee(!1)}},[e,f,i,o,c,u]);(0,_.useEffect)(()=>(ae(),()=>T.current.cancel()),[ae]),(0,_.useEffect)(()=>{if(E.current.cancel(),!g){b(null),S(!1);return}let{controller:t,sequence:n}=E.current.begin();return b(null),S(!0),w(``),ie({...pe(e),sessionId:g},{signal:t.signal}).then(e=>{E.current.isLatest(n)&&b(e.history)}).catch(e=>{e.name!==`AbortError`&&E.current.isLatest(n)&&w(e.message)}).finally(()=>{E.current.isLatest(n)&&S(!1)}),()=>t.abort()},[e,g]);let k=e=>t=>{e(t.target.value),p(1)};return(0,N.jsxs)(`div`,{className:`view-content history-view`,children:[(0,N.jsxs)(`section`,{className:`page-intro`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h1`,{children:`聊天记录`}),(0,N.jsx)(`p`,{children:`从 rollout 文件读取历史会话,只读查看,不修改本地数据。`})]}),(0,N.jsxs)(`button`,{className:`button button--secondary`,type:`button`,onClick:ae,disabled:x,children:[(0,N.jsx)(ge,{size:16,className:x?`spin`:``}),`刷新`]})]}),(0,N.jsxs)(`section`,{className:`history-toolbar`,children:[(0,N.jsx)(`input`,{value:n,onChange:k(r),onKeyDown:e=>{e.key===`Enter`&&(a(n),p(1))},placeholder:`搜索标题、项目、Provider 或消息内容`}),(0,N.jsxs)(`select`,{value:o,onChange:k(s),children:[(0,N.jsx)(`option`,{value:``,children:`全部 Provider`}),ne.map(e=>(0,N.jsx)(`option`,{value:e.id,children:e.id},e.id))]}),(0,N.jsxs)(`select`,{value:c,onChange:k(l),children:[(0,N.jsx)(`option`,{value:``,children:`全部项目`}),re.map(e=>(0,N.jsx)(`option`,{value:e,children:e},e))]}),(0,N.jsxs)(`select`,{value:u,onChange:k(d),children:[(0,N.jsx)(`option`,{value:`all`,children:`全部会话`}),(0,N.jsx)(`option`,{value:`active`,children:`活跃会话`}),(0,N.jsx)(`option`,{value:`archived`,children:`已归档`})]})]}),C?(0,N.jsxs)(`div`,{className:`history-error`,children:[(0,N.jsx)(Te,{size:16}),C]}):null,(0,N.jsxs)(`section`,{className:`history-layout`,children:[(0,N.jsxs)(`div`,{className:`history-list-panel`,children:[(0,N.jsxs)(`div`,{className:`history-list-head`,children:[(0,N.jsxs)(`strong`,{children:[m.total,` 个会话`]}),(0,N.jsxs)(`span`,{children:[`第 `,m.page,` 页`]})]}),(0,N.jsxs)(`div`,{className:`history-list`,children:[x&&!m.sessions.length?(0,N.jsx)(`div`,{className:`large-empty`,children:`读取中…`}):null,!x&&!m.sessions.length?(0,N.jsxs)(`div`,{className:`large-empty`,children:[(0,N.jsx)(ve,{size:24}),(0,N.jsx)(`strong`,{children:`没有匹配的会话`})]}):null,m.sessions.map(e=>(0,N.jsxs)(`button`,{type:`button`,className:`history-session-row ${e.id===g?`history-session-row--selected`:``}`,onClick:()=>v(e.id),children:[(0,N.jsxs)(`div`,{className:`history-session-top`,children:[(0,N.jsx)(`strong`,{children:e.title}),(0,N.jsx)(`time`,{children:je(e.updatedAt)})]}),(0,N.jsx)(`p`,{children:e.firstUserMessage||`没有可读的用户消息`}),(0,N.jsxs)(`div`,{className:`history-session-meta`,children:[(0,N.jsx)(`span`,{children:e.provider}),(0,N.jsxs)(`span`,{children:[e.messageCount,` 条消息`]}),(0,N.jsx)(`span`,{children:e.archived?`已归档`:`活跃`})]})]},e.id))]}),(0,N.jsxs)(`div`,{className:`history-pagination`,children:[(0,N.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:f<=1||x,onClick:()=>p(e=>e-1),children:`上一页`}),(0,N.jsx)(`span`,{children:f}),(0,N.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:!m.hasNextPage||x,onClick:()=>p(e=>e+1),children:`下一页`})]})]}),(0,N.jsx)(`div`,{className:`history-detail-panel`,children:te?(0,N.jsxs)(`div`,{className:`large-empty`,children:[(0,N.jsx)(ge,{size:24,className:`spin`}),(0,N.jsx)(`strong`,{children:`正在读取会话`})]}):y?(0,N.jsxs)(N.Fragment,{children:[(0,N.jsxs)(`div`,{className:`history-detail-head`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h2`,{children:y.session.title}),(0,N.jsxs)(`p`,{children:[y.session.cwd||`未知项目`,` · `,y.session.provider,` · `,y.session.messageCount,` 条消息`]})]}),(0,N.jsx)(`span`,{children:y.session.archived?`已归档`:`活跃`})]}),y.truncated?(0,N.jsxs)(`div`,{className:`history-truncated`,children:[(0,N.jsx)(Te,{size:15}),`仅显示最近 `,y.returnedMessageCount,` 条消息。`]}):null,(0,N.jsx)(`div`,{className:`message-stream`,children:y.messages.map(e=>(0,N.jsxs)(`article`,{className:`chat-message chat-message--${e.role}`,children:[(0,N.jsxs)(`div`,{className:`chat-message-label`,children:[e.role===`user`?`你`:`Codex`,(0,N.jsx)(`time`,{children:je(e.timestamp)})]}),(0,N.jsx)(`div`,{className:`chat-message-body`,children:(0,N.jsx)(Ne,{text:e.text})})]},`${e.sequence}-${e.timestamp}`))})]}):(0,N.jsxs)(`div`,{className:`large-empty`,children:[(0,N.jsx)(ve,{size:28}),(0,N.jsx)(`strong`,{children:`选择一个会话`}),(0,N.jsx)(`span`,{children:`聊天内容将在这里显示。`})]})})]})]})}function Xe({title:e,children:t,confirmLabel:n,onConfirm:r,onCancel:i,tone:a=`primary`,confirmDisabled:o=!1}){return(0,N.jsx)(`div`,{className:`modal-backdrop`,role:`presentation`,onMouseDown:e=>e.target===e.currentTarget&&i(),children:(0,N.jsxs)(`section`,{className:`modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`modal-title`,children:[(0,N.jsxs)(`div`,{className:`modal-head`,children:[(0,N.jsx)(`h2`,{id:`modal-title`,children:e}),(0,N.jsx)(`button`,{type:`button`,className:`icon-button`,onClick:i,"aria-label":`关闭`,children:(0,N.jsx)(Ce,{size:18})})]}),(0,N.jsx)(`div`,{className:`modal-body`,children:t}),(0,N.jsxs)(`div`,{className:`modal-actions`,children:[(0,N.jsx)(`button`,{className:`button button--secondary`,type:`button`,onClick:i,children:`取消`}),(0,N.jsx)(`button`,{className:`button button--${a}`,type:`button`,disabled:o,onClick:r,children:n})]})]})})}function Ze({plan:e}){if(!e)return null;let t=e.impact??{};return(0,N.jsxs)(N.Fragment,{children:[(0,N.jsxs)(`dl`,{className:`operation-scope`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`计划有效期`}),(0,N.jsx)(`dd`,{children:je(e.expiresAt)})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`Rollout 变更`}),(0,N.jsx)(`dd`,{children:t.rolloutFilesToChange??0})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`SQLite 行变更`}),(0,N.jsx)(`dd`,{children:t.sqliteRowsToChange??0})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`当前锁定 Rollout`}),(0,N.jsx)(`dd`,{children:Array.isArray(t.lockedRolloutFiles)?t.lockedRolloutFiles.length:t.lockedRolloutFiles??0})]})]}),e.warnings?.map(e=>(0,N.jsxs)(`div`,{className:`modal-callout modal-callout--warning`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`计划警告`}),(0,N.jsx)(`span`,{children:e})]})]},e))]})}function Qe({plan:e,corePlan:t,status:n,selectedProvider:r,onCancel:i,onConfirm:a}){return(0,N.jsxs)(Xe,{title:e.mode===`switch`?`确认切换并同步`:`确认同步元数据`,confirmLabel:e.mode===`switch`?`确认切换并同步`:`确认执行同步`,onCancel:i,onConfirm:a,children:[(0,N.jsxs)(`div`,{className:`modal-callout`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`请确认 Codex 已完全关闭`}),(0,N.jsx)(`span`,{children:`关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。`})]})]}),(0,N.jsxs)(`dl`,{className:`operation-scope`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`Codex Home`}),(0,N.jsx)(`dd`,{children:n?.codexHome})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`SQLite Home`}),(0,N.jsxs)(`dd`,{children:[n?.sqliteHome,` `,(0,N.jsxs)(`small`,{children:[`(`,n?.sqliteHomeSource,`)`]})]})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`当前 Provider`}),(0,N.jsx)(`dd`,{children:n?.currentProvider})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`目标 Provider`}),(0,N.jsx)(`dd`,{children:r})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`配置变更`}),(0,N.jsx)(`dd`,{children:e.mode===`switch`?`更新 config.toml 根级 model_provider`:`不修改 config.toml`})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`Model 策略`}),(0,N.jsx)(`dd`,{children:e.mode===`switch`?e.modelMode===`auto`?`跟随目标 Provider 配置`:e.modelMode===`keep`?`保留当前根级 model`:`设置为 ${e.model}`:`跟随当前根级 model`})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`备份策略`}),(0,N.jsxs)(`dd`,{children:[`修改前创建备份,保留最近 `,e.keepCount,` 份`]})]})]}),(0,N.jsx)(Ze,{plan:t})]})}function $e({backup:e,status:t,profile:n,onCancel:r,onConfirm:i}){let[a,o]=(0,_.useState)(!1),[s,c]=(0,_.useState)(!0),[l,u]=(0,_.useState)(!0),d=de(t,e),f=fe({backup:e,profile:n,targetSqliteHome:d,restoreDatabase:s,restoreConfig:a,sqliteSupported:t?.sqliteAccess?.supported!==!1,pathComparisonCaseInsensitive:t?.pathComparisonCaseInsensitive===!0});return(0,N.jsxs)(Xe,{title:`恢复备份`,confirmLabel:`覆盖当前元数据`,tone:`danger`,onCancel:r,confirmDisabled:!a&&!s&&!l||!f.canSubmit,onConfirm:()=>i({restoreConfig:a,restoreDatabase:s,restoreSessions:l,allowSqliteHomeRelocation:f.requiresRelocation}),children:[(0,N.jsxs)(`div`,{className:`restore-summary`,children:[(0,N.jsx)(ve,{size:20}),(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`strong`,{children:[je(e.metadata.createdAt),` · `,e.metadata.targetProvider]}),(0,N.jsx)(`code`,{children:e.path})]})]}),(0,N.jsxs)(`fieldset`,{className:`restore-options`,children:[(0,N.jsx)(`legend`,{children:`选择要覆盖的内容`}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`input`,{type:`checkbox`,checked:a,onChange:e=>o(e.target.checked)}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:`config.toml 与 global state`}),(0,N.jsx)(`small`,{children:`恢复 Provider 配置和 Desktop workspace roots`})]})]}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`input`,{type:`checkbox`,checked:s,onChange:e=>c(e.target.checked)}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:`SQLite 线程数据库`}),(0,N.jsx)(`small`,{children:`恢复 state_5.sqlite 及备份中的 WAL/SHM`})]})]}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`input`,{type:`checkbox`,checked:l,onChange:e=>u(e.target.checked)}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:`Rollout 元数据`}),(0,N.jsx)(`small`,{children:`恢复 session_meta 和被修改的 turn_context.model`})]})]})]}),t?.sqliteAccess?.supported===!1?(0,N.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`当前 SQLite 路径仅供诊断`}),(0,N.jsx)(`span`,{children:t.sqliteAccess.message||`不能从 Web UI 执行恢复。`})]})]}):null,f.requiresRelocation?(0,N.jsxs)(`div`,{className:`modal-callout ${f.missingExplicitTarget||f.configRestoreConflict?`modal-callout--danger`:`modal-callout--warning`}`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`SQLite Home 与备份来源不同`}),(0,N.jsxs)(`span`,{children:[`来源:`,e.metadata.sqliteHome,(0,N.jsx)(`br`,{}),`目标:`,d,(0,N.jsx)(`br`,{}),f.missingExplicitTarget?`当前 Profile 未明确配置 SQLite Home,不能提交数据库迁移恢复。`:f.configRestoreConflict?`迁移数据库时不能同时恢复旧 config.toml。`:`确认后数据库将恢复到当前 Profile 明确配置的目标位置。`]})]})]}):null,(0,N.jsxs)(`div`,{className:`modal-callout`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`恢复前请关闭 Codex`}),(0,N.jsx)(`span`,{children:`该操作将覆盖所选的当前元数据;请确认 Codex CLI、App 和 app-server 已关闭。`})]})]})]})}function et({backup:e,corePlan:t,onCancel:n,onConfirm:r}){return(0,N.jsxs)(Xe,{title:`确认恢复计划`,confirmLabel:`按计划恢复`,tone:`danger`,onCancel:n,onConfirm:r,children:[(0,N.jsxs)(`div`,{className:`restore-summary`,children:[(0,N.jsx)(ve,{size:20}),(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`strong`,{children:[je(e.metadata.createdAt),` · `,e.metadata.targetProvider]}),(0,N.jsx)(`code`,{children:e.id})]})]}),(0,N.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`Apply 仅使用一次性 planId`}),(0,N.jsx)(`span`,{children:`任何 Profile、配置、Rollout、SQLite 或备份漂移都会使本计划失效,且不会创建新写入。`})]})]}),(0,N.jsx)(Ze,{plan:t})]})}function tt({keepCount:e,backups:t,onCancel:n,onConfirm:r}){let i=Math.max(0,t.backups.length-e);return(0,N.jsxs)(Xe,{title:`清理旧备份`,confirmLabel:`删除 ${i} 份旧备份`,tone:`danger`,onCancel:n,onConfirm:r,confirmDisabled:i===0,children:[(0,N.jsxs)(`div`,{className:`modal-callout modal-callout--warning`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`被删除的备份无法直接恢复`}),(0,N.jsx)(`span`,{children:`只处理当前 Codex Home 下由本工具管理的备份目录。`})]})]}),(0,N.jsxs)(`dl`,{className:`operation-scope`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`当前备份`}),(0,N.jsxs)(`dd`,{children:[t.backups.length,` 份`]})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`保留`}),(0,N.jsxs)(`dd`,{children:[`最近 `,e,` 份`]})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`将删除`}),(0,N.jsxs)(`dd`,{children:[i,` 份`]})]})]})]})}function nt({onCancel:e,onConfirm:t}){let[n,r]=(0,_.useState)(``),[i,a]=(0,_.useState)(``),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(``),u=/^[A-Za-z0-9_.-]{1,80}$/.test(n)&&i.trim()&&o.trim();return(0,N.jsx)(Xe,{title:`新增存储配置`,confirmLabel:`保存配置`,onCancel:e,confirmDisabled:!u,onConfirm:()=>t({profileId:n,name:i,codexHome:o,sqliteHome:c}),children:(0,N.jsxs)(`div`,{className:`profile-form`,children:[(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`span`,{children:`配置 ID`}),(0,N.jsx)(`input`,{value:n,onChange:e=>r(e.target.value),placeholder:`work`,spellCheck:`false`})]}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`span`,{children:`显示名称`}),(0,N.jsx)(`input`,{value:i,onChange:e=>a(e.target.value),placeholder:`工作环境`})]}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`span`,{children:`Codex Home`}),(0,N.jsx)(`input`,{value:o,onChange:e=>s(e.target.value),placeholder:`/home/user/.codex`,spellCheck:`false`})]}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`span`,{children:`SQLite Home(可选)`}),(0,N.jsx)(`input`,{value:c,onChange:e=>l(e.target.value),placeholder:`留空时由服务端按配置解析`,spellCheck:`false`})]})]})})}function rt({toast:e,onClose:t}){return(0,_.useEffect)(()=>{if(!e)return;let n=window.setTimeout(t,6e3);return()=>window.clearTimeout(n)},[e,t]),e?(0,N.jsxs)(`div`,{className:`toast toast--${e.tone}`,children:[(0,N.jsxs)(`div`,{children:[e.tone===`success`?(0,N.jsx)(we,{size:18}):(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:e.title}),e.message?(0,N.jsx)(`small`,{children:e.message}):null]})]}),(0,N.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`关闭通知`,children:(0,N.jsx)(Ce,{size:16})})]}):null}function it(){let[e,t]=(0,_.useState)(`overview`),[n,r]=(0,_.useState)(`checking`),[i,a]=(0,_.useState)(``),[o,s]=ae(`cps.web.profileId`,`default`),[c,l]=(0,_.useState)([]),[u,d]=ae(`cps.web.manualProviders`,[]),[f,p]=(0,_.useState)(null),[m,h]=(0,_.useState)(Oe),[g,v]=(0,_.useState)(``),[y,ee]=(0,_.useState)(!0),[S,C]=(0,_.useState)(!1),[w,D]=(0,_.useState)(null),[ie,O]=(0,_.useState)(null),[oe,A]=(0,_.useState)([]),[ce,le]=(0,_.useState)(null),ue=(0,_.useRef)(0),j=(0,_.useMemo)(()=>{let e=Pe(f),t=new Set(e.map(e=>e.id));return[...e.map(e=>({...e,manual:u.includes(e.id)})),...u.filter(e=>!t.has(e)).map(e=>({id:e,sources:[`manual`],configured:!1,current:!1,manual:!0}))]},[f,u]),M=c.find(e=>e.id===o)??null,de=(0,_.useRef)(null);de.current||=me({fetchStatus:(e,t)=>T(`/api/status`,e,t),fetchBackups:(e,t)=>T(`/api/backups`,e,t)});let fe=(0,_.useCallback)(async({quiet:e=!1}={})=>{await de.current({profileId:o,showLoading:!e,onLoading:ee,onResult:({status:e,backups:t})=>{p(e),h(t),v(t=>t&&Pe(e).some(e=>e.id===t)?t:e.currentProvider)},onError:e=>{O({tone:`error`,title:`状态读取失败`,message:e.message})}})},[o]),he=(0,_.useCallback)(async()=>{let e=await ne();l(e.profiles),s(t=>e.profiles.some(e=>e.id===t)?t:`default`)},[s]),P=(0,_.useCallback)(async()=>{D(null);try{await he(),await fe({quiet:!0})}catch{}O({tone:`warning`,title:`配置已变更,请重新确认`,message:`已刷新存储配置和当前状态;未自动重试原操作。`})},[fe,he]),ge=(0,_.useCallback)(async e=>{let t=k(M,e,f);if(!t){O({tone:`warning`,title:`配置需要刷新`,message:`没有可用的配置版本,请刷新后重新确认操作。`}),he().catch(()=>{});return}if(e.type!==`execute`){D(t);return}C(!0);try{let e={...pe(t.profileId),profileRevision:t.profileRevision,provider:t.selectedProvider,keepCount:t.plan.keepCount},n=await T(t.plan.mode===`switch`?`/api/switch/prepare`:`/api/sync/prepare`,t.plan.mode===`switch`?{...e,modelMode:t.plan.modelMode===`auto`?`provider-default`:t.plan.modelMode===`keep`?`keep-root-model`:`explicit`,model:t.plan.modelMode===`custom`?t.plan.model:void 0}:e);D({...t,corePlan:n.plan})}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`计划生成失败`,message:e.message})}finally{C(!1)}},[P,he,M,f]);(0,_.useEffect)(()=>{let e=!1;return te().then(async t=>{if(!t)throw new b;await he(),e||r(`ready`)}).catch(t=>{e||(r(t instanceof b?`required`:`error`),a(t.message))}),()=>{e=!0}},[he]),(0,_.useEffect)(()=>{n===`ready`&&fe()},[n,o]),(0,_.useEffect)(()=>{let e=e=>{r(`required`),a(e.detail||`设备凭证已失效。请重新运行 codex-provider web。`)};return window.addEventListener(`cps:pairing-required`,e),()=>window.removeEventListener(`cps:pairing-required`,e)},[]),(0,_.useEffect)(()=>{if(n!==`ready`)return;let e=!1,t=async()=>{try{let t=await E(ue.current);if(e)return;t.activity?.length&&(ue.current=t.activity[t.activity.length-1].id,A(e=>[...e,...t.activity].slice(-250))),le(t.activeOperation??null)}catch{}};t();let r=window.setInterval(t,900);return()=>{e=!0,window.clearInterval(r)}},[n]);let _e=(0,_.useCallback)(async()=>{let e=w.plan,n=w.corePlan;D(null),C(!0),t(`activity`);try{let t=await T(e.mode===`switch`?`/api/switch/apply`:`/api/sync/apply`,{schemaVersion:n.schemaVersion,planId:n.planId});O(se(t,{successTitle:e.mode===`switch`?`切换并同步完成`:`同步完成`,partialTitle:e.mode===`switch`?`切换并同步部分完成`:`同步部分完成`,message:`备份:${t.result?.backup?.path??t.result?.result?.backupDir??`已创建`}`})),await fe({quiet:!0})}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`操作失败`,message:e.message})}finally{C(!1)}},[P,w,fe]),ve=(0,_.useCallback)(async e=>{let t=w.backup,n=w.profileId;C(!0);try{let r=await T(`/api/restore/prepare`,{...pe(n),profileRevision:w.profileRevision,backupId:t.id,...e});D({...w,type:`restoreApply`,restoreOptions:e,corePlan:r.plan})}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`恢复计划生成失败`,message:e.message})}finally{C(!1)}},[P,w]),ye=(0,_.useCallback)(async()=>{let e=w.backup,n=w.corePlan;D(null),C(!0),t(`activity`);try{let t=await T(`/api/restore/apply`,{schemaVersion:n.schemaVersion,planId:n.planId});O(se(t,{successTitle:`备份恢复完成`,partialTitle:`备份恢复部分完成`,message:e.id})),await fe({quiet:!0})}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`恢复失败`,message:e.message})}finally{C(!1)}},[P,w,fe]),be=(0,_.useCallback)(async()=>{let e=w.keepCount,t=w.profileId;D(null),C(!0);try{let n=await T(`/api/prune`,{...pe(t),profileRevision:w.profileRevision,storageRevision:w.storageRevision,keepCount:e});O(se(n,{successTitle:`旧备份清理完成`,partialTitle:`旧备份清理部分完成`,message:`删除 ${n.result?.deletedCount??0} 份,释放 ${Ae(n.result?.freedBytes)}`})),await fe({quiet:!0})}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`备份清理失败`,message:e.message})}finally{C(!1)}},[P,w,fe]),Se=(0,_.useCallback)(()=>O(null),[]),Ce=(0,_.useCallback)(async e=>{try{let t=await T(`/api/profiles/save`,e.revision?{...e,profileRevision:e.revision}:e);D(null),await he(),s(t.profile.id),O({tone:`success`,title:`存储配置已保存`,message:t.profile.name})}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`配置保存失败`,message:e.message})}},[P,he,s]),we=(0,_.useCallback)(async()=>{try{await T(`/api/profiles/delete`,{profileId:o,profileRevision:M?.revision}),s(`default`),await he()}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`配置删除失败`,message:e.message})}},[P,o,he,M?.revision,s]),Te=(0,_.useCallback)(async()=>{await re().catch(()=>{}),r(`required`),a(`此浏览器的设备凭证已失效。重新运行 codex-provider web 即可自动配对。`)},[]),Ee=(0,_.useCallback)(e=>{d(t=>[...new Set([...t,e])].sort()),v(e)},[d]),De=(0,_.useCallback)(e=>{d(t=>t.filter(t=>t!==e)),v(f?.currentProvider??``)},[d,f?.currentProvider]);return n===`ready`?(0,N.jsxs)(`div`,{className:`app-shell`,children:[(0,N.jsx)(Ie,{status:f,busy:S||!!ce,onRefresh:()=>fe()}),(0,N.jsx)(Le,{view:e,setView:t,status:f,onForgetBrowser:Te}),(0,N.jsxs)(`main`,{className:`main-area`,children:[(0,N.jsx)(Re,{profiles:c,profileId:o,setProfileId:s,status:f,onAddProfile:()=>D({type:`profile`}),onDeleteProfile:we,onRefresh:()=>fe(),loading:y,profileSwitchDisabled:S||!!w}),e===`overview`?(0,N.jsx)(Ke,{status:f,backups:m,providers:j,selectedProvider:g,setSelectedProvider:v,onAddManualProvider:Ee,onRemoveManualProvider:De,onExecute:e=>ge({type:`execute`,plan:e,selectedProvider:g}),onRestore:e=>ge({type:`restore`,backup:e}),setView:t,busy:S,loading:y}):null,e===`history`?(0,N.jsx)(Ye,{profileId:o,status:f}):null,e===`backups`?(0,N.jsx)(qe,{backups:m,status:f,busy:S,onRestore:e=>ge({type:`restore`,backup:e}),onPrune:e=>ge({type:`prune`,keepCount:e})}):null,e===`activity`?(0,N.jsx)(Je,{activity:oe,activeOperation:ce}):null]}),w?.type===`execute`?(0,N.jsx)(Qe,{plan:w.plan,corePlan:w.corePlan,status:w.status,selectedProvider:w.selectedProvider,onCancel:()=>D(null),onConfirm:_e}):null,w?.type===`restore`?(0,N.jsx)($e,{backup:w.backup,status:w.status,profile:w.profile,onCancel:()=>D(null),onConfirm:ve}):null,w?.type===`restoreApply`?(0,N.jsx)(et,{backup:w.backup,corePlan:w.corePlan,onCancel:()=>D(null),onConfirm:ye}):null,w?.type===`prune`?(0,N.jsx)(tt,{keepCount:w.keepCount,backups:m,onCancel:()=>D(null),onConfirm:be}):null,w?.type===`profile`?(0,N.jsx)(nt,{onCancel:()=>D(null),onConfirm:Ce}):null,(0,N.jsx)(rt,{toast:ie,onClose:Se})]}):(0,N.jsxs)(`div`,{className:`access-gate`,children:[(0,N.jsx)(xe,{size:32}),(0,N.jsx)(`h1`,{children:n===`checking`?`正在完成安全配对`:`需要重新配对`}),(0,N.jsx)(`p`,{children:n===`checking`?`请稍候…`:i||`请重新运行 codex-provider web。`}),n===`checking`?null:(0,N.jsx)(`code`,{children:`codex-provider web`})]})}(0,v.createRoot)(document.getElementById(`root`)).render((0,N.jsx)(_.StrictMode,{children:(0,N.jsx)(it,{})})); +//# sourceMappingURL=index-DAOqepUV.js.map \ No newline at end of file diff --git a/web/dist/assets/index-DAOqepUV.js.map b/web/dist/assets/index-DAOqepUV.js.map new file mode 100644 index 0000000..4d5e08e --- /dev/null +++ b/web/dist/assets/index-DAOqepUV.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-DAOqepUV.js","names":[],"sources":["../../../node_modules/react/cjs/react.production.js","../../../node_modules/react/index.js","../../../node_modules/scheduler/cjs/scheduler.production.js","../../../node_modules/scheduler/index.js","../../../node_modules/react-dom/cjs/react-dom.production.js","../../../node_modules/react-dom/index.js","../../../node_modules/react-dom/cjs/react-dom-client.production.js","../../../node_modules/react-dom/client.js","../../src/api.js","../../src/hooks.js","../../src/history-requests.js","../../src/operation-state.js","../../src/profile-refresh.js","../../../node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/react/jsx-runtime.js","../../src/icons.jsx","../../src/App.jsx","../../src/main.jsx"],"sourcesContent":["/**\n * @license React\n * react.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nfunction getIteratorFn(maybeIterable) {\n if (null === maybeIterable || \"object\" !== typeof maybeIterable) return null;\n maybeIterable =\n (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n maybeIterable[\"@@iterator\"];\n return \"function\" === typeof maybeIterable ? maybeIterable : null;\n}\nvar ReactNoopUpdateQueue = {\n isMounted: function () {\n return !1;\n },\n enqueueForceUpdate: function () {},\n enqueueReplaceState: function () {},\n enqueueSetState: function () {}\n },\n assign = Object.assign,\n emptyObject = {};\nfunction Component(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n}\nComponent.prototype.isReactComponent = {};\nComponent.prototype.setState = function (partialState, callback) {\n if (\n \"object\" !== typeof partialState &&\n \"function\" !== typeof partialState &&\n null != partialState\n )\n throw Error(\n \"takes an object of state variables to update or a function which returns an object of state variables.\"\n );\n this.updater.enqueueSetState(this, partialState, callback, \"setState\");\n};\nComponent.prototype.forceUpdate = function (callback) {\n this.updater.enqueueForceUpdate(this, callback, \"forceUpdate\");\n};\nfunction ComponentDummy() {}\nComponentDummy.prototype = Component.prototype;\nfunction PureComponent(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n}\nvar pureComponentPrototype = (PureComponent.prototype = new ComponentDummy());\npureComponentPrototype.constructor = PureComponent;\nassign(pureComponentPrototype, Component.prototype);\npureComponentPrototype.isPureReactComponent = !0;\nvar isArrayImpl = Array.isArray;\nfunction noop() {}\nvar ReactSharedInternals = { H: null, A: null, T: null, S: null },\n hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction ReactElement(type, key, props) {\n var refProp = props.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== refProp ? refProp : null,\n props: props\n };\n}\nfunction cloneAndReplaceKey(oldElement, newKey) {\n return ReactElement(oldElement.type, newKey, oldElement.props);\n}\nfunction isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n}\nfunction escape(key) {\n var escaperLookup = { \"=\": \"=0\", \":\": \"=2\" };\n return (\n \"$\" +\n key.replace(/[=:]/g, function (match) {\n return escaperLookup[match];\n })\n );\n}\nvar userProvidedKeyEscapeRegex = /\\/+/g;\nfunction getElementKey(element, index) {\n return \"object\" === typeof element && null !== element && null != element.key\n ? escape(\"\" + element.key)\n : index.toString(36);\n}\nfunction resolveThenable(thenable) {\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw thenable.reason;\n default:\n switch (\n (\"string\" === typeof thenable.status\n ? thenable.then(noop, noop)\n : ((thenable.status = \"pending\"),\n thenable.then(\n function (fulfilledValue) {\n \"pending\" === thenable.status &&\n ((thenable.status = \"fulfilled\"),\n (thenable.value = fulfilledValue));\n },\n function (error) {\n \"pending\" === thenable.status &&\n ((thenable.status = \"rejected\"), (thenable.reason = error));\n }\n )),\n thenable.status)\n ) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw thenable.reason;\n }\n }\n throw thenable;\n}\nfunction mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {\n var type = typeof children;\n if (\"undefined\" === type || \"boolean\" === type) children = null;\n var invokeCallback = !1;\n if (null === children) invokeCallback = !0;\n else\n switch (type) {\n case \"bigint\":\n case \"string\":\n case \"number\":\n invokeCallback = !0;\n break;\n case \"object\":\n switch (children.$$typeof) {\n case REACT_ELEMENT_TYPE:\n case REACT_PORTAL_TYPE:\n invokeCallback = !0;\n break;\n case REACT_LAZY_TYPE:\n return (\n (invokeCallback = children._init),\n mapIntoArray(\n invokeCallback(children._payload),\n array,\n escapedPrefix,\n nameSoFar,\n callback\n )\n );\n }\n }\n if (invokeCallback)\n return (\n (callback = callback(children)),\n (invokeCallback =\n \"\" === nameSoFar ? \".\" + getElementKey(children, 0) : nameSoFar),\n isArrayImpl(callback)\n ? ((escapedPrefix = \"\"),\n null != invokeCallback &&\n (escapedPrefix =\n invokeCallback.replace(userProvidedKeyEscapeRegex, \"$&/\") + \"/\"),\n mapIntoArray(callback, array, escapedPrefix, \"\", function (c) {\n return c;\n }))\n : null != callback &&\n (isValidElement(callback) &&\n (callback = cloneAndReplaceKey(\n callback,\n escapedPrefix +\n (null == callback.key ||\n (children && children.key === callback.key)\n ? \"\"\n : (\"\" + callback.key).replace(\n userProvidedKeyEscapeRegex,\n \"$&/\"\n ) + \"/\") +\n invokeCallback\n )),\n array.push(callback)),\n 1\n );\n invokeCallback = 0;\n var nextNamePrefix = \"\" === nameSoFar ? \".\" : nameSoFar + \":\";\n if (isArrayImpl(children))\n for (var i = 0; i < children.length; i++)\n (nameSoFar = children[i]),\n (type = nextNamePrefix + getElementKey(nameSoFar, i)),\n (invokeCallback += mapIntoArray(\n nameSoFar,\n array,\n escapedPrefix,\n type,\n callback\n ));\n else if (((i = getIteratorFn(children)), \"function\" === typeof i))\n for (\n children = i.call(children), i = 0;\n !(nameSoFar = children.next()).done;\n\n )\n (nameSoFar = nameSoFar.value),\n (type = nextNamePrefix + getElementKey(nameSoFar, i++)),\n (invokeCallback += mapIntoArray(\n nameSoFar,\n array,\n escapedPrefix,\n type,\n callback\n ));\n else if (\"object\" === type) {\n if (\"function\" === typeof children.then)\n return mapIntoArray(\n resolveThenable(children),\n array,\n escapedPrefix,\n nameSoFar,\n callback\n );\n array = String(children);\n throw Error(\n \"Objects are not valid as a React child (found: \" +\n (\"[object Object]\" === array\n ? \"object with keys {\" + Object.keys(children).join(\", \") + \"}\"\n : array) +\n \"). If you meant to render a collection of children, use an array instead.\"\n );\n }\n return invokeCallback;\n}\nfunction mapChildren(children, func, context) {\n if (null == children) return children;\n var result = [],\n count = 0;\n mapIntoArray(children, result, \"\", \"\", function (child) {\n return func.call(context, child, count++);\n });\n return result;\n}\nfunction lazyInitializer(payload) {\n if (-1 === payload._status) {\n var ctor = payload._result;\n ctor = ctor();\n ctor.then(\n function (moduleObject) {\n if (0 === payload._status || -1 === payload._status)\n (payload._status = 1), (payload._result = moduleObject);\n },\n function (error) {\n if (0 === payload._status || -1 === payload._status)\n (payload._status = 2), (payload._result = error);\n }\n );\n -1 === payload._status && ((payload._status = 0), (payload._result = ctor));\n }\n if (1 === payload._status) return payload._result.default;\n throw payload._result;\n}\nvar reportGlobalError =\n \"function\" === typeof reportError\n ? reportError\n : function (error) {\n if (\n \"object\" === typeof window &&\n \"function\" === typeof window.ErrorEvent\n ) {\n var event = new window.ErrorEvent(\"error\", {\n bubbles: !0,\n cancelable: !0,\n message:\n \"object\" === typeof error &&\n null !== error &&\n \"string\" === typeof error.message\n ? String(error.message)\n : String(error),\n error: error\n });\n if (!window.dispatchEvent(event)) return;\n } else if (\n \"object\" === typeof process &&\n \"function\" === typeof process.emit\n ) {\n process.emit(\"uncaughtException\", error);\n return;\n }\n console.error(error);\n },\n Children = {\n map: mapChildren,\n forEach: function (children, forEachFunc, forEachContext) {\n mapChildren(\n children,\n function () {\n forEachFunc.apply(this, arguments);\n },\n forEachContext\n );\n },\n count: function (children) {\n var n = 0;\n mapChildren(children, function () {\n n++;\n });\n return n;\n },\n toArray: function (children) {\n return (\n mapChildren(children, function (child) {\n return child;\n }) || []\n );\n },\n only: function (children) {\n if (!isValidElement(children))\n throw Error(\n \"React.Children.only expected to receive a single React element child.\"\n );\n return children;\n }\n };\nexports.Activity = REACT_ACTIVITY_TYPE;\nexports.Children = Children;\nexports.Component = Component;\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.Profiler = REACT_PROFILER_TYPE;\nexports.PureComponent = PureComponent;\nexports.StrictMode = REACT_STRICT_MODE_TYPE;\nexports.Suspense = REACT_SUSPENSE_TYPE;\nexports.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n ReactSharedInternals;\nexports.__COMPILER_RUNTIME = {\n __proto__: null,\n c: function (size) {\n return ReactSharedInternals.H.useMemoCache(size);\n }\n};\nexports.cache = function (fn) {\n return function () {\n return fn.apply(null, arguments);\n };\n};\nexports.cacheSignal = function () {\n return null;\n};\nexports.cloneElement = function (element, config, children) {\n if (null === element || void 0 === element)\n throw Error(\n \"The argument must be a React element, but you passed \" + element + \".\"\n );\n var props = assign({}, element.props),\n key = element.key;\n if (null != config)\n for (propName in (void 0 !== config.key && (key = \"\" + config.key), config))\n !hasOwnProperty.call(config, propName) ||\n \"key\" === propName ||\n \"__self\" === propName ||\n \"__source\" === propName ||\n (\"ref\" === propName && void 0 === config.ref) ||\n (props[propName] = config[propName]);\n var propName = arguments.length - 2;\n if (1 === propName) props.children = children;\n else if (1 < propName) {\n for (var childArray = Array(propName), i = 0; i < propName; i++)\n childArray[i] = arguments[i + 2];\n props.children = childArray;\n }\n return ReactElement(element.type, key, props);\n};\nexports.createContext = function (defaultValue) {\n defaultValue = {\n $$typeof: REACT_CONTEXT_TYPE,\n _currentValue: defaultValue,\n _currentValue2: defaultValue,\n _threadCount: 0,\n Provider: null,\n Consumer: null\n };\n defaultValue.Provider = defaultValue;\n defaultValue.Consumer = {\n $$typeof: REACT_CONSUMER_TYPE,\n _context: defaultValue\n };\n return defaultValue;\n};\nexports.createElement = function (type, config, children) {\n var propName,\n props = {},\n key = null;\n if (null != config)\n for (propName in (void 0 !== config.key && (key = \"\" + config.key), config))\n hasOwnProperty.call(config, propName) &&\n \"key\" !== propName &&\n \"__self\" !== propName &&\n \"__source\" !== propName &&\n (props[propName] = config[propName]);\n var childrenLength = arguments.length - 2;\n if (1 === childrenLength) props.children = children;\n else if (1 < childrenLength) {\n for (var childArray = Array(childrenLength), i = 0; i < childrenLength; i++)\n childArray[i] = arguments[i + 2];\n props.children = childArray;\n }\n if (type && type.defaultProps)\n for (propName in ((childrenLength = type.defaultProps), childrenLength))\n void 0 === props[propName] &&\n (props[propName] = childrenLength[propName]);\n return ReactElement(type, key, props);\n};\nexports.createRef = function () {\n return { current: null };\n};\nexports.forwardRef = function (render) {\n return { $$typeof: REACT_FORWARD_REF_TYPE, render: render };\n};\nexports.isValidElement = isValidElement;\nexports.lazy = function (ctor) {\n return {\n $$typeof: REACT_LAZY_TYPE,\n _payload: { _status: -1, _result: ctor },\n _init: lazyInitializer\n };\n};\nexports.memo = function (type, compare) {\n return {\n $$typeof: REACT_MEMO_TYPE,\n type: type,\n compare: void 0 === compare ? null : compare\n };\n};\nexports.startTransition = function (scope) {\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n try {\n var returnValue = scope(),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n \"object\" === typeof returnValue &&\n null !== returnValue &&\n \"function\" === typeof returnValue.then &&\n returnValue.then(noop, reportGlobalError);\n } catch (error) {\n reportGlobalError(error);\n } finally {\n null !== prevTransition &&\n null !== currentTransition.types &&\n (prevTransition.types = currentTransition.types),\n (ReactSharedInternals.T = prevTransition);\n }\n};\nexports.unstable_useCacheRefresh = function () {\n return ReactSharedInternals.H.useCacheRefresh();\n};\nexports.use = function (usable) {\n return ReactSharedInternals.H.use(usable);\n};\nexports.useActionState = function (action, initialState, permalink) {\n return ReactSharedInternals.H.useActionState(action, initialState, permalink);\n};\nexports.useCallback = function (callback, deps) {\n return ReactSharedInternals.H.useCallback(callback, deps);\n};\nexports.useContext = function (Context) {\n return ReactSharedInternals.H.useContext(Context);\n};\nexports.useDebugValue = function () {};\nexports.useDeferredValue = function (value, initialValue) {\n return ReactSharedInternals.H.useDeferredValue(value, initialValue);\n};\nexports.useEffect = function (create, deps) {\n return ReactSharedInternals.H.useEffect(create, deps);\n};\nexports.useEffectEvent = function (callback) {\n return ReactSharedInternals.H.useEffectEvent(callback);\n};\nexports.useId = function () {\n return ReactSharedInternals.H.useId();\n};\nexports.useImperativeHandle = function (ref, create, deps) {\n return ReactSharedInternals.H.useImperativeHandle(ref, create, deps);\n};\nexports.useInsertionEffect = function (create, deps) {\n return ReactSharedInternals.H.useInsertionEffect(create, deps);\n};\nexports.useLayoutEffect = function (create, deps) {\n return ReactSharedInternals.H.useLayoutEffect(create, deps);\n};\nexports.useMemo = function (create, deps) {\n return ReactSharedInternals.H.useMemo(create, deps);\n};\nexports.useOptimistic = function (passthrough, reducer) {\n return ReactSharedInternals.H.useOptimistic(passthrough, reducer);\n};\nexports.useReducer = function (reducer, initialArg, init) {\n return ReactSharedInternals.H.useReducer(reducer, initialArg, init);\n};\nexports.useRef = function (initialValue) {\n return ReactSharedInternals.H.useRef(initialValue);\n};\nexports.useState = function (initialState) {\n return ReactSharedInternals.H.useState(initialState);\n};\nexports.useSyncExternalStore = function (\n subscribe,\n getSnapshot,\n getServerSnapshot\n) {\n return ReactSharedInternals.H.useSyncExternalStore(\n subscribe,\n getSnapshot,\n getServerSnapshot\n );\n};\nexports.useTransition = function () {\n return ReactSharedInternals.H.useTransition();\n};\nexports.version = \"19.2.8\";\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","/**\n * @license React\n * scheduler.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nfunction push(heap, node) {\n var index = heap.length;\n heap.push(node);\n a: for (; 0 < index; ) {\n var parentIndex = (index - 1) >>> 1,\n parent = heap[parentIndex];\n if (0 < compare(parent, node))\n (heap[parentIndex] = node), (heap[index] = parent), (index = parentIndex);\n else break a;\n }\n}\nfunction peek(heap) {\n return 0 === heap.length ? null : heap[0];\n}\nfunction pop(heap) {\n if (0 === heap.length) return null;\n var first = heap[0],\n last = heap.pop();\n if (last !== first) {\n heap[0] = last;\n a: for (\n var index = 0, length = heap.length, halfLength = length >>> 1;\n index < halfLength;\n\n ) {\n var leftIndex = 2 * (index + 1) - 1,\n left = heap[leftIndex],\n rightIndex = leftIndex + 1,\n right = heap[rightIndex];\n if (0 > compare(left, last))\n rightIndex < length && 0 > compare(right, left)\n ? ((heap[index] = right),\n (heap[rightIndex] = last),\n (index = rightIndex))\n : ((heap[index] = left),\n (heap[leftIndex] = last),\n (index = leftIndex));\n else if (rightIndex < length && 0 > compare(right, last))\n (heap[index] = right), (heap[rightIndex] = last), (index = rightIndex);\n else break a;\n }\n }\n return first;\n}\nfunction compare(a, b) {\n var diff = a.sortIndex - b.sortIndex;\n return 0 !== diff ? diff : a.id - b.id;\n}\nexports.unstable_now = void 0;\nif (\"object\" === typeof performance && \"function\" === typeof performance.now) {\n var localPerformance = performance;\n exports.unstable_now = function () {\n return localPerformance.now();\n };\n} else {\n var localDate = Date,\n initialTime = localDate.now();\n exports.unstable_now = function () {\n return localDate.now() - initialTime;\n };\n}\nvar taskQueue = [],\n timerQueue = [],\n taskIdCounter = 1,\n currentTask = null,\n currentPriorityLevel = 3,\n isPerformingWork = !1,\n isHostCallbackScheduled = !1,\n isHostTimeoutScheduled = !1,\n needsPaint = !1,\n localSetTimeout = \"function\" === typeof setTimeout ? setTimeout : null,\n localClearTimeout = \"function\" === typeof clearTimeout ? clearTimeout : null,\n localSetImmediate = \"undefined\" !== typeof setImmediate ? setImmediate : null;\nfunction advanceTimers(currentTime) {\n for (var timer = peek(timerQueue); null !== timer; ) {\n if (null === timer.callback) pop(timerQueue);\n else if (timer.startTime <= currentTime)\n pop(timerQueue),\n (timer.sortIndex = timer.expirationTime),\n push(taskQueue, timer);\n else break;\n timer = peek(timerQueue);\n }\n}\nfunction handleTimeout(currentTime) {\n isHostTimeoutScheduled = !1;\n advanceTimers(currentTime);\n if (!isHostCallbackScheduled)\n if (null !== peek(taskQueue))\n (isHostCallbackScheduled = !0),\n isMessageLoopRunning ||\n ((isMessageLoopRunning = !0), schedulePerformWorkUntilDeadline());\n else {\n var firstTimer = peek(timerQueue);\n null !== firstTimer &&\n requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n }\n}\nvar isMessageLoopRunning = !1,\n taskTimeoutID = -1,\n frameInterval = 5,\n startTime = -1;\nfunction shouldYieldToHost() {\n return needsPaint\n ? !0\n : exports.unstable_now() - startTime < frameInterval\n ? !1\n : !0;\n}\nfunction performWorkUntilDeadline() {\n needsPaint = !1;\n if (isMessageLoopRunning) {\n var currentTime = exports.unstable_now();\n startTime = currentTime;\n var hasMoreWork = !0;\n try {\n a: {\n isHostCallbackScheduled = !1;\n isHostTimeoutScheduled &&\n ((isHostTimeoutScheduled = !1),\n localClearTimeout(taskTimeoutID),\n (taskTimeoutID = -1));\n isPerformingWork = !0;\n var previousPriorityLevel = currentPriorityLevel;\n try {\n b: {\n advanceTimers(currentTime);\n for (\n currentTask = peek(taskQueue);\n null !== currentTask &&\n !(\n currentTask.expirationTime > currentTime && shouldYieldToHost()\n );\n\n ) {\n var callback = currentTask.callback;\n if (\"function\" === typeof callback) {\n currentTask.callback = null;\n currentPriorityLevel = currentTask.priorityLevel;\n var continuationCallback = callback(\n currentTask.expirationTime <= currentTime\n );\n currentTime = exports.unstable_now();\n if (\"function\" === typeof continuationCallback) {\n currentTask.callback = continuationCallback;\n advanceTimers(currentTime);\n hasMoreWork = !0;\n break b;\n }\n currentTask === peek(taskQueue) && pop(taskQueue);\n advanceTimers(currentTime);\n } else pop(taskQueue);\n currentTask = peek(taskQueue);\n }\n if (null !== currentTask) hasMoreWork = !0;\n else {\n var firstTimer = peek(timerQueue);\n null !== firstTimer &&\n requestHostTimeout(\n handleTimeout,\n firstTimer.startTime - currentTime\n );\n hasMoreWork = !1;\n }\n }\n break a;\n } finally {\n (currentTask = null),\n (currentPriorityLevel = previousPriorityLevel),\n (isPerformingWork = !1);\n }\n hasMoreWork = void 0;\n }\n } finally {\n hasMoreWork\n ? schedulePerformWorkUntilDeadline()\n : (isMessageLoopRunning = !1);\n }\n }\n}\nvar schedulePerformWorkUntilDeadline;\nif (\"function\" === typeof localSetImmediate)\n schedulePerformWorkUntilDeadline = function () {\n localSetImmediate(performWorkUntilDeadline);\n };\nelse if (\"undefined\" !== typeof MessageChannel) {\n var channel = new MessageChannel(),\n port = channel.port2;\n channel.port1.onmessage = performWorkUntilDeadline;\n schedulePerformWorkUntilDeadline = function () {\n port.postMessage(null);\n };\n} else\n schedulePerformWorkUntilDeadline = function () {\n localSetTimeout(performWorkUntilDeadline, 0);\n };\nfunction requestHostTimeout(callback, ms) {\n taskTimeoutID = localSetTimeout(function () {\n callback(exports.unstable_now());\n }, ms);\n}\nexports.unstable_IdlePriority = 5;\nexports.unstable_ImmediatePriority = 1;\nexports.unstable_LowPriority = 4;\nexports.unstable_NormalPriority = 3;\nexports.unstable_Profiling = null;\nexports.unstable_UserBlockingPriority = 2;\nexports.unstable_cancelCallback = function (task) {\n task.callback = null;\n};\nexports.unstable_forceFrameRate = function (fps) {\n 0 > fps || 125 < fps\n ? console.error(\n \"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"\n )\n : (frameInterval = 0 < fps ? Math.floor(1e3 / fps) : 5);\n};\nexports.unstable_getCurrentPriorityLevel = function () {\n return currentPriorityLevel;\n};\nexports.unstable_next = function (eventHandler) {\n switch (currentPriorityLevel) {\n case 1:\n case 2:\n case 3:\n var priorityLevel = 3;\n break;\n default:\n priorityLevel = currentPriorityLevel;\n }\n var previousPriorityLevel = currentPriorityLevel;\n currentPriorityLevel = priorityLevel;\n try {\n return eventHandler();\n } finally {\n currentPriorityLevel = previousPriorityLevel;\n }\n};\nexports.unstable_requestPaint = function () {\n needsPaint = !0;\n};\nexports.unstable_runWithPriority = function (priorityLevel, eventHandler) {\n switch (priorityLevel) {\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n break;\n default:\n priorityLevel = 3;\n }\n var previousPriorityLevel = currentPriorityLevel;\n currentPriorityLevel = priorityLevel;\n try {\n return eventHandler();\n } finally {\n currentPriorityLevel = previousPriorityLevel;\n }\n};\nexports.unstable_scheduleCallback = function (\n priorityLevel,\n callback,\n options\n) {\n var currentTime = exports.unstable_now();\n \"object\" === typeof options && null !== options\n ? ((options = options.delay),\n (options =\n \"number\" === typeof options && 0 < options\n ? currentTime + options\n : currentTime))\n : (options = currentTime);\n switch (priorityLevel) {\n case 1:\n var timeout = -1;\n break;\n case 2:\n timeout = 250;\n break;\n case 5:\n timeout = 1073741823;\n break;\n case 4:\n timeout = 1e4;\n break;\n default:\n timeout = 5e3;\n }\n timeout = options + timeout;\n priorityLevel = {\n id: taskIdCounter++,\n callback: callback,\n priorityLevel: priorityLevel,\n startTime: options,\n expirationTime: timeout,\n sortIndex: -1\n };\n options > currentTime\n ? ((priorityLevel.sortIndex = options),\n push(timerQueue, priorityLevel),\n null === peek(taskQueue) &&\n priorityLevel === peek(timerQueue) &&\n (isHostTimeoutScheduled\n ? (localClearTimeout(taskTimeoutID), (taskTimeoutID = -1))\n : (isHostTimeoutScheduled = !0),\n requestHostTimeout(handleTimeout, options - currentTime)))\n : ((priorityLevel.sortIndex = timeout),\n push(taskQueue, priorityLevel),\n isHostCallbackScheduled ||\n isPerformingWork ||\n ((isHostCallbackScheduled = !0),\n isMessageLoopRunning ||\n ((isMessageLoopRunning = !0), schedulePerformWorkUntilDeadline())));\n return priorityLevel;\n};\nexports.unstable_shouldYield = shouldYieldToHost;\nexports.unstable_wrapCallback = function (callback) {\n var parentPriorityLevel = currentPriorityLevel;\n return function () {\n var previousPriorityLevel = currentPriorityLevel;\n currentPriorityLevel = parentPriorityLevel;\n try {\n return callback.apply(this, arguments);\n } finally {\n currentPriorityLevel = previousPriorityLevel;\n }\n };\n};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","/**\n * @license React\n * react-dom.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction formatProdErrorMessage(code) {\n var url = \"https://react.dev/errors/\" + code;\n if (1 < arguments.length) {\n url += \"?args[]=\" + encodeURIComponent(arguments[1]);\n for (var i = 2; i < arguments.length; i++)\n url += \"&args[]=\" + encodeURIComponent(arguments[i]);\n }\n return (\n \"Minified React error #\" +\n code +\n \"; visit \" +\n url +\n \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"\n );\n}\nfunction noop() {}\nvar Internals = {\n d: {\n f: noop,\n r: function () {\n throw Error(formatProdErrorMessage(522));\n },\n D: noop,\n C: noop,\n L: noop,\n m: noop,\n X: noop,\n S: noop,\n M: noop\n },\n p: 0,\n findDOMNode: null\n },\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\");\nfunction createPortal$1(children, containerInfo, implementation) {\n var key =\n 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;\n return {\n $$typeof: REACT_PORTAL_TYPE,\n key: null == key ? null : \"\" + key,\n children: children,\n containerInfo: containerInfo,\n implementation: implementation\n };\n}\nvar ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;\nfunction getCrossOriginStringAs(as, input) {\n if (\"font\" === as) return \"\";\n if (\"string\" === typeof input)\n return \"use-credentials\" === input ? input : \"\";\n}\nexports.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n Internals;\nexports.createPortal = function (children, container) {\n var key =\n 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;\n if (\n !container ||\n (1 !== container.nodeType &&\n 9 !== container.nodeType &&\n 11 !== container.nodeType)\n )\n throw Error(formatProdErrorMessage(299));\n return createPortal$1(children, container, null, key);\n};\nexports.flushSync = function (fn) {\n var previousTransition = ReactSharedInternals.T,\n previousUpdatePriority = Internals.p;\n try {\n if (((ReactSharedInternals.T = null), (Internals.p = 2), fn)) return fn();\n } finally {\n (ReactSharedInternals.T = previousTransition),\n (Internals.p = previousUpdatePriority),\n Internals.d.f();\n }\n};\nexports.preconnect = function (href, options) {\n \"string\" === typeof href &&\n (options\n ? ((options = options.crossOrigin),\n (options =\n \"string\" === typeof options\n ? \"use-credentials\" === options\n ? options\n : \"\"\n : void 0))\n : (options = null),\n Internals.d.C(href, options));\n};\nexports.prefetchDNS = function (href) {\n \"string\" === typeof href && Internals.d.D(href);\n};\nexports.preinit = function (href, options) {\n if (\"string\" === typeof href && options && \"string\" === typeof options.as) {\n var as = options.as,\n crossOrigin = getCrossOriginStringAs(as, options.crossOrigin),\n integrity =\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n fetchPriority =\n \"string\" === typeof options.fetchPriority\n ? options.fetchPriority\n : void 0;\n \"style\" === as\n ? Internals.d.S(\n href,\n \"string\" === typeof options.precedence ? options.precedence : void 0,\n {\n crossOrigin: crossOrigin,\n integrity: integrity,\n fetchPriority: fetchPriority\n }\n )\n : \"script\" === as &&\n Internals.d.X(href, {\n crossOrigin: crossOrigin,\n integrity: integrity,\n fetchPriority: fetchPriority,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n });\n }\n};\nexports.preinitModule = function (href, options) {\n if (\"string\" === typeof href)\n if (\"object\" === typeof options && null !== options) {\n if (null == options.as || \"script\" === options.as) {\n var crossOrigin = getCrossOriginStringAs(\n options.as,\n options.crossOrigin\n );\n Internals.d.M(href, {\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n });\n }\n } else null == options && Internals.d.M(href);\n};\nexports.preload = function (href, options) {\n if (\n \"string\" === typeof href &&\n \"object\" === typeof options &&\n null !== options &&\n \"string\" === typeof options.as\n ) {\n var as = options.as,\n crossOrigin = getCrossOriginStringAs(as, options.crossOrigin);\n Internals.d.L(href, as, {\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0,\n type: \"string\" === typeof options.type ? options.type : void 0,\n fetchPriority:\n \"string\" === typeof options.fetchPriority\n ? options.fetchPriority\n : void 0,\n referrerPolicy:\n \"string\" === typeof options.referrerPolicy\n ? options.referrerPolicy\n : void 0,\n imageSrcSet:\n \"string\" === typeof options.imageSrcSet ? options.imageSrcSet : void 0,\n imageSizes:\n \"string\" === typeof options.imageSizes ? options.imageSizes : void 0,\n media: \"string\" === typeof options.media ? options.media : void 0\n });\n }\n};\nexports.preloadModule = function (href, options) {\n if (\"string\" === typeof href)\n if (options) {\n var crossOrigin = getCrossOriginStringAs(options.as, options.crossOrigin);\n Internals.d.m(href, {\n as:\n \"string\" === typeof options.as && \"script\" !== options.as\n ? options.as\n : void 0,\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0\n });\n } else Internals.d.m(href);\n};\nexports.requestFormReset = function (form) {\n Internals.d.r(form);\n};\nexports.unstable_batchedUpdates = function (fn, a) {\n return fn(a);\n};\nexports.useFormState = function (action, initialState, permalink) {\n return ReactSharedInternals.H.useFormState(action, initialState, permalink);\n};\nexports.useFormStatus = function () {\n return ReactSharedInternals.H.useHostTransitionStatus();\n};\nexports.version = \"19.2.8\";\n","'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n","/**\n * @license React\n * react-dom-client.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n\"use strict\";\nvar Scheduler = require(\"scheduler\"),\n React = require(\"react\"),\n ReactDOM = require(\"react-dom\");\nfunction formatProdErrorMessage(code) {\n var url = \"https://react.dev/errors/\" + code;\n if (1 < arguments.length) {\n url += \"?args[]=\" + encodeURIComponent(arguments[1]);\n for (var i = 2; i < arguments.length; i++)\n url += \"&args[]=\" + encodeURIComponent(arguments[i]);\n }\n return (\n \"Minified React error #\" +\n code +\n \"; visit \" +\n url +\n \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"\n );\n}\nfunction isValidContainer(node) {\n return !(\n !node ||\n (1 !== node.nodeType && 9 !== node.nodeType && 11 !== node.nodeType)\n );\n}\nfunction getNearestMountedFiber(fiber) {\n var node = fiber,\n nearestMounted = fiber;\n if (fiber.alternate) for (; node.return; ) node = node.return;\n else {\n fiber = node;\n do\n (node = fiber),\n 0 !== (node.flags & 4098) && (nearestMounted = node.return),\n (fiber = node.return);\n while (fiber);\n }\n return 3 === node.tag ? nearestMounted : null;\n}\nfunction getSuspenseInstanceFromFiber(fiber) {\n if (13 === fiber.tag) {\n var suspenseState = fiber.memoizedState;\n null === suspenseState &&\n ((fiber = fiber.alternate),\n null !== fiber && (suspenseState = fiber.memoizedState));\n if (null !== suspenseState) return suspenseState.dehydrated;\n }\n return null;\n}\nfunction getActivityInstanceFromFiber(fiber) {\n if (31 === fiber.tag) {\n var activityState = fiber.memoizedState;\n null === activityState &&\n ((fiber = fiber.alternate),\n null !== fiber && (activityState = fiber.memoizedState));\n if (null !== activityState) return activityState.dehydrated;\n }\n return null;\n}\nfunction assertIsMounted(fiber) {\n if (getNearestMountedFiber(fiber) !== fiber)\n throw Error(formatProdErrorMessage(188));\n}\nfunction findCurrentFiberUsingSlowPath(fiber) {\n var alternate = fiber.alternate;\n if (!alternate) {\n alternate = getNearestMountedFiber(fiber);\n if (null === alternate) throw Error(formatProdErrorMessage(188));\n return alternate !== fiber ? null : fiber;\n }\n for (var a = fiber, b = alternate; ; ) {\n var parentA = a.return;\n if (null === parentA) break;\n var parentB = parentA.alternate;\n if (null === parentB) {\n b = parentA.return;\n if (null !== b) {\n a = b;\n continue;\n }\n break;\n }\n if (parentA.child === parentB.child) {\n for (parentB = parentA.child; parentB; ) {\n if (parentB === a) return assertIsMounted(parentA), fiber;\n if (parentB === b) return assertIsMounted(parentA), alternate;\n parentB = parentB.sibling;\n }\n throw Error(formatProdErrorMessage(188));\n }\n if (a.return !== b.return) (a = parentA), (b = parentB);\n else {\n for (var didFindChild = !1, child$0 = parentA.child; child$0; ) {\n if (child$0 === a) {\n didFindChild = !0;\n a = parentA;\n b = parentB;\n break;\n }\n if (child$0 === b) {\n didFindChild = !0;\n b = parentA;\n a = parentB;\n break;\n }\n child$0 = child$0.sibling;\n }\n if (!didFindChild) {\n for (child$0 = parentB.child; child$0; ) {\n if (child$0 === a) {\n didFindChild = !0;\n a = parentB;\n b = parentA;\n break;\n }\n if (child$0 === b) {\n didFindChild = !0;\n b = parentB;\n a = parentA;\n break;\n }\n child$0 = child$0.sibling;\n }\n if (!didFindChild) throw Error(formatProdErrorMessage(189));\n }\n }\n if (a.alternate !== b) throw Error(formatProdErrorMessage(190));\n }\n if (3 !== a.tag) throw Error(formatProdErrorMessage(188));\n return a.stateNode.current === a ? fiber : alternate;\n}\nfunction findCurrentHostFiberImpl(node) {\n var tag = node.tag;\n if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node;\n for (node = node.child; null !== node; ) {\n tag = findCurrentHostFiberImpl(node);\n if (null !== tag) return tag;\n node = node.sibling;\n }\n return null;\n}\nvar assign = Object.assign,\n REACT_LEGACY_ELEMENT_TYPE = Symbol.for(\"react.element\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\");\nSymbol.for(\"react.scope\");\nvar REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\");\nSymbol.for(\"react.legacy_hidden\");\nSymbol.for(\"react.tracing_marker\");\nvar REACT_MEMO_CACHE_SENTINEL = Symbol.for(\"react.memo_cache_sentinel\");\nSymbol.for(\"react.view_transition\");\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nfunction getIteratorFn(maybeIterable) {\n if (null === maybeIterable || \"object\" !== typeof maybeIterable) return null;\n maybeIterable =\n (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n maybeIterable[\"@@iterator\"];\n return \"function\" === typeof maybeIterable ? maybeIterable : null;\n}\nvar REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\");\nfunction getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (type.$$typeof) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n}\nvar isArrayImpl = Array.isArray,\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n ReactDOMSharedInternals =\n ReactDOM.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n sharedNotPendingObject = {\n pending: !1,\n data: null,\n method: null,\n action: null\n },\n valueStack = [],\n index = -1;\nfunction createCursor(defaultValue) {\n return { current: defaultValue };\n}\nfunction pop(cursor) {\n 0 > index ||\n ((cursor.current = valueStack[index]), (valueStack[index] = null), index--);\n}\nfunction push(cursor, value) {\n index++;\n valueStack[index] = cursor.current;\n cursor.current = value;\n}\nvar contextStackCursor = createCursor(null),\n contextFiberStackCursor = createCursor(null),\n rootInstanceStackCursor = createCursor(null),\n hostTransitionProviderCursor = createCursor(null);\nfunction pushHostContainer(fiber, nextRootInstance) {\n push(rootInstanceStackCursor, nextRootInstance);\n push(contextFiberStackCursor, fiber);\n push(contextStackCursor, null);\n switch (nextRootInstance.nodeType) {\n case 9:\n case 11:\n fiber = (fiber = nextRootInstance.documentElement)\n ? (fiber = fiber.namespaceURI)\n ? getOwnHostContext(fiber)\n : 0\n : 0;\n break;\n default:\n if (\n ((fiber = nextRootInstance.tagName),\n (nextRootInstance = nextRootInstance.namespaceURI))\n )\n (nextRootInstance = getOwnHostContext(nextRootInstance)),\n (fiber = getChildHostContextProd(nextRootInstance, fiber));\n else\n switch (fiber) {\n case \"svg\":\n fiber = 1;\n break;\n case \"math\":\n fiber = 2;\n break;\n default:\n fiber = 0;\n }\n }\n pop(contextStackCursor);\n push(contextStackCursor, fiber);\n}\nfunction popHostContainer() {\n pop(contextStackCursor);\n pop(contextFiberStackCursor);\n pop(rootInstanceStackCursor);\n}\nfunction pushHostContext(fiber) {\n null !== fiber.memoizedState && push(hostTransitionProviderCursor, fiber);\n var context = contextStackCursor.current;\n var JSCompiler_inline_result = getChildHostContextProd(context, fiber.type);\n context !== JSCompiler_inline_result &&\n (push(contextFiberStackCursor, fiber),\n push(contextStackCursor, JSCompiler_inline_result));\n}\nfunction popHostContext(fiber) {\n contextFiberStackCursor.current === fiber &&\n (pop(contextStackCursor), pop(contextFiberStackCursor));\n hostTransitionProviderCursor.current === fiber &&\n (pop(hostTransitionProviderCursor),\n (HostTransitionContext._currentValue = sharedNotPendingObject));\n}\nvar prefix, suffix;\nfunction describeBuiltInComponentFrame(name) {\n if (void 0 === prefix)\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = (match && match[1]) || \"\";\n suffix =\n -1 < x.stack.indexOf(\"\\n at\")\n ? \" ()\"\n : -1 < x.stack.indexOf(\"@\")\n ? \"@unknown:0:0\"\n : \"\";\n }\n return \"\\n\" + prefix + name + suffix;\n}\nvar reentry = !1;\nfunction describeNativeComponentFrame(fn, construct) {\n if (!fn || reentry) return \"\";\n reentry = !0;\n var previousPrepareStackTrace = Error.prepareStackTrace;\n Error.prepareStackTrace = void 0;\n try {\n var RunInRootFrame = {\n DetermineComponentFrameRoot: function () {\n try {\n if (construct) {\n var Fake = function () {\n throw Error();\n };\n Object.defineProperty(Fake.prototype, \"props\", {\n set: function () {\n throw Error();\n }\n });\n if (\"object\" === typeof Reflect && Reflect.construct) {\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n var control = x;\n }\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x$1) {\n control = x$1;\n }\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x$2) {\n control = x$2;\n }\n (Fake = fn()) &&\n \"function\" === typeof Fake.catch &&\n Fake.catch(function () {});\n }\n } catch (sample) {\n if (sample && control && \"string\" === typeof sample.stack)\n return [sample.stack, control.stack];\n }\n return [null, null];\n }\n };\n RunInRootFrame.DetermineComponentFrameRoot.displayName =\n \"DetermineComponentFrameRoot\";\n var namePropDescriptor = Object.getOwnPropertyDescriptor(\n RunInRootFrame.DetermineComponentFrameRoot,\n \"name\"\n );\n namePropDescriptor &&\n namePropDescriptor.configurable &&\n Object.defineProperty(\n RunInRootFrame.DetermineComponentFrameRoot,\n \"name\",\n { value: \"DetermineComponentFrameRoot\" }\n );\n var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(),\n sampleStack = _RunInRootFrame$Deter[0],\n controlStack = _RunInRootFrame$Deter[1];\n if (sampleStack && controlStack) {\n var sampleLines = sampleStack.split(\"\\n\"),\n controlLines = controlStack.split(\"\\n\");\n for (\n namePropDescriptor = RunInRootFrame = 0;\n RunInRootFrame < sampleLines.length &&\n !sampleLines[RunInRootFrame].includes(\"DetermineComponentFrameRoot\");\n\n )\n RunInRootFrame++;\n for (\n ;\n namePropDescriptor < controlLines.length &&\n !controlLines[namePropDescriptor].includes(\n \"DetermineComponentFrameRoot\"\n );\n\n )\n namePropDescriptor++;\n if (\n RunInRootFrame === sampleLines.length ||\n namePropDescriptor === controlLines.length\n )\n for (\n RunInRootFrame = sampleLines.length - 1,\n namePropDescriptor = controlLines.length - 1;\n 1 <= RunInRootFrame &&\n 0 <= namePropDescriptor &&\n sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor];\n\n )\n namePropDescriptor--;\n for (\n ;\n 1 <= RunInRootFrame && 0 <= namePropDescriptor;\n RunInRootFrame--, namePropDescriptor--\n )\n if (sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor]) {\n if (1 !== RunInRootFrame || 1 !== namePropDescriptor) {\n do\n if (\n (RunInRootFrame--,\n namePropDescriptor--,\n 0 > namePropDescriptor ||\n sampleLines[RunInRootFrame] !==\n controlLines[namePropDescriptor])\n ) {\n var frame =\n \"\\n\" +\n sampleLines[RunInRootFrame].replace(\" at new \", \" at \");\n fn.displayName &&\n frame.includes(\"\") &&\n (frame = frame.replace(\"\", fn.displayName));\n return frame;\n }\n while (1 <= RunInRootFrame && 0 <= namePropDescriptor);\n }\n break;\n }\n }\n } finally {\n (reentry = !1), (Error.prepareStackTrace = previousPrepareStackTrace);\n }\n return (previousPrepareStackTrace = fn ? fn.displayName || fn.name : \"\")\n ? describeBuiltInComponentFrame(previousPrepareStackTrace)\n : \"\";\n}\nfunction describeFiber(fiber, childFiber) {\n switch (fiber.tag) {\n case 26:\n case 27:\n case 5:\n return describeBuiltInComponentFrame(fiber.type);\n case 16:\n return describeBuiltInComponentFrame(\"Lazy\");\n case 13:\n return fiber.child !== childFiber && null !== childFiber\n ? describeBuiltInComponentFrame(\"Suspense Fallback\")\n : describeBuiltInComponentFrame(\"Suspense\");\n case 19:\n return describeBuiltInComponentFrame(\"SuspenseList\");\n case 0:\n case 15:\n return describeNativeComponentFrame(fiber.type, !1);\n case 11:\n return describeNativeComponentFrame(fiber.type.render, !1);\n case 1:\n return describeNativeComponentFrame(fiber.type, !0);\n case 31:\n return describeBuiltInComponentFrame(\"Activity\");\n default:\n return \"\";\n }\n}\nfunction getStackByFiberInDevAndProd(workInProgress) {\n try {\n var info = \"\",\n previous = null;\n do\n (info += describeFiber(workInProgress, previous)),\n (previous = workInProgress),\n (workInProgress = workInProgress.return);\n while (workInProgress);\n return info;\n } catch (x) {\n return \"\\nError generating stack: \" + x.message + \"\\n\" + x.stack;\n }\n}\nvar hasOwnProperty = Object.prototype.hasOwnProperty,\n scheduleCallback$3 = Scheduler.unstable_scheduleCallback,\n cancelCallback$1 = Scheduler.unstable_cancelCallback,\n shouldYield = Scheduler.unstable_shouldYield,\n requestPaint = Scheduler.unstable_requestPaint,\n now = Scheduler.unstable_now,\n getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,\n ImmediatePriority = Scheduler.unstable_ImmediatePriority,\n UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,\n NormalPriority$1 = Scheduler.unstable_NormalPriority,\n LowPriority = Scheduler.unstable_LowPriority,\n IdlePriority = Scheduler.unstable_IdlePriority,\n log$1 = Scheduler.log,\n unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue,\n rendererID = null,\n injectedHook = null;\nfunction setIsStrictModeForDevtools(newIsStrictMode) {\n \"function\" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode);\n if (injectedHook && \"function\" === typeof injectedHook.setStrictMode)\n try {\n injectedHook.setStrictMode(rendererID, newIsStrictMode);\n } catch (err) {}\n}\nvar clz32 = Math.clz32 ? Math.clz32 : clz32Fallback,\n log = Math.log,\n LN2 = Math.LN2;\nfunction clz32Fallback(x) {\n x >>>= 0;\n return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0;\n}\nvar nextTransitionUpdateLane = 256,\n nextTransitionDeferredLane = 262144,\n nextRetryLane = 4194304;\nfunction getHighestPriorityLanes(lanes) {\n var pendingSyncLanes = lanes & 42;\n if (0 !== pendingSyncLanes) return pendingSyncLanes;\n switch (lanes & -lanes) {\n case 1:\n return 1;\n case 2:\n return 2;\n case 4:\n return 4;\n case 8:\n return 8;\n case 16:\n return 16;\n case 32:\n return 32;\n case 64:\n return 64;\n case 128:\n return 128;\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n return lanes & 261888;\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n return lanes & 3932160;\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n return lanes & 62914560;\n case 67108864:\n return 67108864;\n case 134217728:\n return 134217728;\n case 268435456:\n return 268435456;\n case 536870912:\n return 536870912;\n case 1073741824:\n return 0;\n default:\n return lanes;\n }\n}\nfunction getNextLanes(root, wipLanes, rootHasPendingCommit) {\n var pendingLanes = root.pendingLanes;\n if (0 === pendingLanes) return 0;\n var nextLanes = 0,\n suspendedLanes = root.suspendedLanes,\n pingedLanes = root.pingedLanes;\n root = root.warmLanes;\n var nonIdlePendingLanes = pendingLanes & 134217727;\n 0 !== nonIdlePendingLanes\n ? ((pendingLanes = nonIdlePendingLanes & ~suspendedLanes),\n 0 !== pendingLanes\n ? (nextLanes = getHighestPriorityLanes(pendingLanes))\n : ((pingedLanes &= nonIdlePendingLanes),\n 0 !== pingedLanes\n ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n : rootHasPendingCommit ||\n ((rootHasPendingCommit = nonIdlePendingLanes & ~root),\n 0 !== rootHasPendingCommit &&\n (nextLanes = getHighestPriorityLanes(rootHasPendingCommit)))))\n : ((nonIdlePendingLanes = pendingLanes & ~suspendedLanes),\n 0 !== nonIdlePendingLanes\n ? (nextLanes = getHighestPriorityLanes(nonIdlePendingLanes))\n : 0 !== pingedLanes\n ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n : rootHasPendingCommit ||\n ((rootHasPendingCommit = pendingLanes & ~root),\n 0 !== rootHasPendingCommit &&\n (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))));\n return 0 === nextLanes\n ? 0\n : 0 !== wipLanes &&\n wipLanes !== nextLanes &&\n 0 === (wipLanes & suspendedLanes) &&\n ((suspendedLanes = nextLanes & -nextLanes),\n (rootHasPendingCommit = wipLanes & -wipLanes),\n suspendedLanes >= rootHasPendingCommit ||\n (32 === suspendedLanes && 0 !== (rootHasPendingCommit & 4194048)))\n ? wipLanes\n : nextLanes;\n}\nfunction checkIfRootIsPrerendering(root, renderLanes) {\n return (\n 0 ===\n (root.pendingLanes &\n ~(root.suspendedLanes & ~root.pingedLanes) &\n renderLanes)\n );\n}\nfunction computeExpirationTime(lane, currentTime) {\n switch (lane) {\n case 1:\n case 2:\n case 4:\n case 8:\n case 64:\n return currentTime + 250;\n case 16:\n case 32:\n case 128:\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n return currentTime + 5e3;\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n return -1;\n case 67108864:\n case 134217728:\n case 268435456:\n case 536870912:\n case 1073741824:\n return -1;\n default:\n return -1;\n }\n}\nfunction claimNextRetryLane() {\n var lane = nextRetryLane;\n nextRetryLane <<= 1;\n 0 === (nextRetryLane & 62914560) && (nextRetryLane = 4194304);\n return lane;\n}\nfunction createLaneMap(initial) {\n for (var laneMap = [], i = 0; 31 > i; i++) laneMap.push(initial);\n return laneMap;\n}\nfunction markRootUpdated$1(root, updateLane) {\n root.pendingLanes |= updateLane;\n 268435456 !== updateLane &&\n ((root.suspendedLanes = 0), (root.pingedLanes = 0), (root.warmLanes = 0));\n}\nfunction markRootFinished(\n root,\n finishedLanes,\n remainingLanes,\n spawnedLane,\n updatedLanes,\n suspendedRetryLanes\n) {\n var previouslyPendingLanes = root.pendingLanes;\n root.pendingLanes = remainingLanes;\n root.suspendedLanes = 0;\n root.pingedLanes = 0;\n root.warmLanes = 0;\n root.expiredLanes &= remainingLanes;\n root.entangledLanes &= remainingLanes;\n root.errorRecoveryDisabledLanes &= remainingLanes;\n root.shellSuspendCounter = 0;\n var entanglements = root.entanglements,\n expirationTimes = root.expirationTimes,\n hiddenUpdates = root.hiddenUpdates;\n for (\n remainingLanes = previouslyPendingLanes & ~remainingLanes;\n 0 < remainingLanes;\n\n ) {\n var index$7 = 31 - clz32(remainingLanes),\n lane = 1 << index$7;\n entanglements[index$7] = 0;\n expirationTimes[index$7] = -1;\n var hiddenUpdatesForLane = hiddenUpdates[index$7];\n if (null !== hiddenUpdatesForLane)\n for (\n hiddenUpdates[index$7] = null, index$7 = 0;\n index$7 < hiddenUpdatesForLane.length;\n index$7++\n ) {\n var update = hiddenUpdatesForLane[index$7];\n null !== update && (update.lane &= -536870913);\n }\n remainingLanes &= ~lane;\n }\n 0 !== spawnedLane && markSpawnedDeferredLane(root, spawnedLane, 0);\n 0 !== suspendedRetryLanes &&\n 0 === updatedLanes &&\n 0 !== root.tag &&\n (root.suspendedLanes |=\n suspendedRetryLanes & ~(previouslyPendingLanes & ~finishedLanes));\n}\nfunction markSpawnedDeferredLane(root, spawnedLane, entangledLanes) {\n root.pendingLanes |= spawnedLane;\n root.suspendedLanes &= ~spawnedLane;\n var spawnedLaneIndex = 31 - clz32(spawnedLane);\n root.entangledLanes |= spawnedLane;\n root.entanglements[spawnedLaneIndex] =\n root.entanglements[spawnedLaneIndex] |\n 1073741824 |\n (entangledLanes & 261930);\n}\nfunction markRootEntangled(root, entangledLanes) {\n var rootEntangledLanes = (root.entangledLanes |= entangledLanes);\n for (root = root.entanglements; rootEntangledLanes; ) {\n var index$8 = 31 - clz32(rootEntangledLanes),\n lane = 1 << index$8;\n (lane & entangledLanes) | (root[index$8] & entangledLanes) &&\n (root[index$8] |= entangledLanes);\n rootEntangledLanes &= ~lane;\n }\n}\nfunction getBumpedLaneForHydration(root, renderLanes) {\n var renderLane = renderLanes & -renderLanes;\n renderLane =\n 0 !== (renderLane & 42) ? 1 : getBumpedLaneForHydrationByLane(renderLane);\n return 0 !== (renderLane & (root.suspendedLanes | renderLanes))\n ? 0\n : renderLane;\n}\nfunction getBumpedLaneForHydrationByLane(lane) {\n switch (lane) {\n case 2:\n lane = 1;\n break;\n case 8:\n lane = 4;\n break;\n case 32:\n lane = 16;\n break;\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n lane = 128;\n break;\n case 268435456:\n lane = 134217728;\n break;\n default:\n lane = 0;\n }\n return lane;\n}\nfunction lanesToEventPriority(lanes) {\n lanes &= -lanes;\n return 2 < lanes\n ? 8 < lanes\n ? 0 !== (lanes & 134217727)\n ? 32\n : 268435456\n : 8\n : 2;\n}\nfunction resolveUpdatePriority() {\n var updatePriority = ReactDOMSharedInternals.p;\n if (0 !== updatePriority) return updatePriority;\n updatePriority = window.event;\n return void 0 === updatePriority ? 32 : getEventPriority(updatePriority.type);\n}\nfunction runWithPriority(priority, fn) {\n var previousPriority = ReactDOMSharedInternals.p;\n try {\n return (ReactDOMSharedInternals.p = priority), fn();\n } finally {\n ReactDOMSharedInternals.p = previousPriority;\n }\n}\nvar randomKey = Math.random().toString(36).slice(2),\n internalInstanceKey = \"__reactFiber$\" + randomKey,\n internalPropsKey = \"__reactProps$\" + randomKey,\n internalContainerInstanceKey = \"__reactContainer$\" + randomKey,\n internalEventHandlersKey = \"__reactEvents$\" + randomKey,\n internalEventHandlerListenersKey = \"__reactListeners$\" + randomKey,\n internalEventHandlesSetKey = \"__reactHandles$\" + randomKey,\n internalRootNodeResourcesKey = \"__reactResources$\" + randomKey,\n internalHoistableMarker = \"__reactMarker$\" + randomKey;\nfunction detachDeletedInstance(node) {\n delete node[internalInstanceKey];\n delete node[internalPropsKey];\n delete node[internalEventHandlersKey];\n delete node[internalEventHandlerListenersKey];\n delete node[internalEventHandlesSetKey];\n}\nfunction getClosestInstanceFromNode(targetNode) {\n var targetInst = targetNode[internalInstanceKey];\n if (targetInst) return targetInst;\n for (var parentNode = targetNode.parentNode; parentNode; ) {\n if (\n (targetInst =\n parentNode[internalContainerInstanceKey] ||\n parentNode[internalInstanceKey])\n ) {\n parentNode = targetInst.alternate;\n if (\n null !== targetInst.child ||\n (null !== parentNode && null !== parentNode.child)\n )\n for (\n targetNode = getParentHydrationBoundary(targetNode);\n null !== targetNode;\n\n ) {\n if ((parentNode = targetNode[internalInstanceKey])) return parentNode;\n targetNode = getParentHydrationBoundary(targetNode);\n }\n return targetInst;\n }\n targetNode = parentNode;\n parentNode = targetNode.parentNode;\n }\n return null;\n}\nfunction getInstanceFromNode(node) {\n if (\n (node = node[internalInstanceKey] || node[internalContainerInstanceKey])\n ) {\n var tag = node.tag;\n if (\n 5 === tag ||\n 6 === tag ||\n 13 === tag ||\n 31 === tag ||\n 26 === tag ||\n 27 === tag ||\n 3 === tag\n )\n return node;\n }\n return null;\n}\nfunction getNodeFromInstance(inst) {\n var tag = inst.tag;\n if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return inst.stateNode;\n throw Error(formatProdErrorMessage(33));\n}\nfunction getResourcesFromRoot(root) {\n var resources = root[internalRootNodeResourcesKey];\n resources ||\n (resources = root[internalRootNodeResourcesKey] =\n { hoistableStyles: new Map(), hoistableScripts: new Map() });\n return resources;\n}\nfunction markNodeAsHoistable(node) {\n node[internalHoistableMarker] = !0;\n}\nvar allNativeEvents = new Set(),\n registrationNameDependencies = {};\nfunction registerTwoPhaseEvent(registrationName, dependencies) {\n registerDirectEvent(registrationName, dependencies);\n registerDirectEvent(registrationName + \"Capture\", dependencies);\n}\nfunction registerDirectEvent(registrationName, dependencies) {\n registrationNameDependencies[registrationName] = dependencies;\n for (\n registrationName = 0;\n registrationName < dependencies.length;\n registrationName++\n )\n allNativeEvents.add(dependencies[registrationName]);\n}\nvar VALID_ATTRIBUTE_NAME_REGEX = RegExp(\n \"^[:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD][:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]*$\"\n ),\n illegalAttributeNameCache = {},\n validatedAttributeNameCache = {};\nfunction isAttributeNameSafe(attributeName) {\n if (hasOwnProperty.call(validatedAttributeNameCache, attributeName))\n return !0;\n if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) return !1;\n if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName))\n return (validatedAttributeNameCache[attributeName] = !0);\n illegalAttributeNameCache[attributeName] = !0;\n return !1;\n}\nfunction setValueForAttribute(node, name, value) {\n if (isAttributeNameSafe(name))\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n node.removeAttribute(name);\n return;\n case \"boolean\":\n var prefix$10 = name.toLowerCase().slice(0, 5);\n if (\"data-\" !== prefix$10 && \"aria-\" !== prefix$10) {\n node.removeAttribute(name);\n return;\n }\n }\n node.setAttribute(name, \"\" + value);\n }\n}\nfunction setValueForKnownAttribute(node, name, value) {\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n case \"boolean\":\n node.removeAttribute(name);\n return;\n }\n node.setAttribute(name, \"\" + value);\n }\n}\nfunction setValueForNamespacedAttribute(node, namespace, name, value) {\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n case \"boolean\":\n node.removeAttribute(name);\n return;\n }\n node.setAttributeNS(namespace, name, \"\" + value);\n }\n}\nfunction getToStringValue(value) {\n switch (typeof value) {\n case \"bigint\":\n case \"boolean\":\n case \"number\":\n case \"string\":\n case \"undefined\":\n return value;\n case \"object\":\n return value;\n default:\n return \"\";\n }\n}\nfunction isCheckable(elem) {\n var type = elem.type;\n return (\n (elem = elem.nodeName) &&\n \"input\" === elem.toLowerCase() &&\n (\"checkbox\" === type || \"radio\" === type)\n );\n}\nfunction trackValueOnNode(node, valueField, currentValue) {\n var descriptor = Object.getOwnPropertyDescriptor(\n node.constructor.prototype,\n valueField\n );\n if (\n !node.hasOwnProperty(valueField) &&\n \"undefined\" !== typeof descriptor &&\n \"function\" === typeof descriptor.get &&\n \"function\" === typeof descriptor.set\n ) {\n var get = descriptor.get,\n set = descriptor.set;\n Object.defineProperty(node, valueField, {\n configurable: !0,\n get: function () {\n return get.call(this);\n },\n set: function (value) {\n currentValue = \"\" + value;\n set.call(this, value);\n }\n });\n Object.defineProperty(node, valueField, {\n enumerable: descriptor.enumerable\n });\n return {\n getValue: function () {\n return currentValue;\n },\n setValue: function (value) {\n currentValue = \"\" + value;\n },\n stopTracking: function () {\n node._valueTracker = null;\n delete node[valueField];\n }\n };\n }\n}\nfunction track(node) {\n if (!node._valueTracker) {\n var valueField = isCheckable(node) ? \"checked\" : \"value\";\n node._valueTracker = trackValueOnNode(\n node,\n valueField,\n \"\" + node[valueField]\n );\n }\n}\nfunction updateValueIfChanged(node) {\n if (!node) return !1;\n var tracker = node._valueTracker;\n if (!tracker) return !0;\n var lastValue = tracker.getValue();\n var value = \"\";\n node &&\n (value = isCheckable(node)\n ? node.checked\n ? \"true\"\n : \"false\"\n : node.value);\n node = value;\n return node !== lastValue ? (tracker.setValue(node), !0) : !1;\n}\nfunction getActiveElement(doc) {\n doc = doc || (\"undefined\" !== typeof document ? document : void 0);\n if (\"undefined\" === typeof doc) return null;\n try {\n return doc.activeElement || doc.body;\n } catch (e) {\n return doc.body;\n }\n}\nvar escapeSelectorAttributeValueInsideDoubleQuotesRegex = /[\\n\"\\\\]/g;\nfunction escapeSelectorAttributeValueInsideDoubleQuotes(value) {\n return value.replace(\n escapeSelectorAttributeValueInsideDoubleQuotesRegex,\n function (ch) {\n return \"\\\\\" + ch.charCodeAt(0).toString(16) + \" \";\n }\n );\n}\nfunction updateInput(\n element,\n value,\n defaultValue,\n lastDefaultValue,\n checked,\n defaultChecked,\n type,\n name\n) {\n element.name = \"\";\n null != type &&\n \"function\" !== typeof type &&\n \"symbol\" !== typeof type &&\n \"boolean\" !== typeof type\n ? (element.type = type)\n : element.removeAttribute(\"type\");\n if (null != value)\n if (\"number\" === type) {\n if ((0 === value && \"\" === element.value) || element.value != value)\n element.value = \"\" + getToStringValue(value);\n } else\n element.value !== \"\" + getToStringValue(value) &&\n (element.value = \"\" + getToStringValue(value));\n else\n (\"submit\" !== type && \"reset\" !== type) || element.removeAttribute(\"value\");\n null != value\n ? setDefaultValue(element, type, getToStringValue(value))\n : null != defaultValue\n ? setDefaultValue(element, type, getToStringValue(defaultValue))\n : null != lastDefaultValue && element.removeAttribute(\"value\");\n null == checked &&\n null != defaultChecked &&\n (element.defaultChecked = !!defaultChecked);\n null != checked &&\n (element.checked =\n checked && \"function\" !== typeof checked && \"symbol\" !== typeof checked);\n null != name &&\n \"function\" !== typeof name &&\n \"symbol\" !== typeof name &&\n \"boolean\" !== typeof name\n ? (element.name = \"\" + getToStringValue(name))\n : element.removeAttribute(\"name\");\n}\nfunction initInput(\n element,\n value,\n defaultValue,\n checked,\n defaultChecked,\n type,\n name,\n isHydrating\n) {\n null != type &&\n \"function\" !== typeof type &&\n \"symbol\" !== typeof type &&\n \"boolean\" !== typeof type &&\n (element.type = type);\n if (null != value || null != defaultValue) {\n if (\n !(\n (\"submit\" !== type && \"reset\" !== type) ||\n (void 0 !== value && null !== value)\n )\n ) {\n track(element);\n return;\n }\n defaultValue =\n null != defaultValue ? \"\" + getToStringValue(defaultValue) : \"\";\n value = null != value ? \"\" + getToStringValue(value) : defaultValue;\n isHydrating || value === element.value || (element.value = value);\n element.defaultValue = value;\n }\n checked = null != checked ? checked : defaultChecked;\n checked =\n \"function\" !== typeof checked && \"symbol\" !== typeof checked && !!checked;\n element.checked = isHydrating ? element.checked : !!checked;\n element.defaultChecked = !!checked;\n null != name &&\n \"function\" !== typeof name &&\n \"symbol\" !== typeof name &&\n \"boolean\" !== typeof name &&\n (element.name = name);\n track(element);\n}\nfunction setDefaultValue(node, type, value) {\n (\"number\" === type && getActiveElement(node.ownerDocument) === node) ||\n node.defaultValue === \"\" + value ||\n (node.defaultValue = \"\" + value);\n}\nfunction updateOptions(node, multiple, propValue, setDefaultSelected) {\n node = node.options;\n if (multiple) {\n multiple = {};\n for (var i = 0; i < propValue.length; i++)\n multiple[\"$\" + propValue[i]] = !0;\n for (propValue = 0; propValue < node.length; propValue++)\n (i = multiple.hasOwnProperty(\"$\" + node[propValue].value)),\n node[propValue].selected !== i && (node[propValue].selected = i),\n i && setDefaultSelected && (node[propValue].defaultSelected = !0);\n } else {\n propValue = \"\" + getToStringValue(propValue);\n multiple = null;\n for (i = 0; i < node.length; i++) {\n if (node[i].value === propValue) {\n node[i].selected = !0;\n setDefaultSelected && (node[i].defaultSelected = !0);\n return;\n }\n null !== multiple || node[i].disabled || (multiple = node[i]);\n }\n null !== multiple && (multiple.selected = !0);\n }\n}\nfunction updateTextarea(element, value, defaultValue) {\n if (\n null != value &&\n ((value = \"\" + getToStringValue(value)),\n value !== element.value && (element.value = value),\n null == defaultValue)\n ) {\n element.defaultValue !== value && (element.defaultValue = value);\n return;\n }\n element.defaultValue =\n null != defaultValue ? \"\" + getToStringValue(defaultValue) : \"\";\n}\nfunction initTextarea(element, value, defaultValue, children) {\n if (null == value) {\n if (null != children) {\n if (null != defaultValue) throw Error(formatProdErrorMessage(92));\n if (isArrayImpl(children)) {\n if (1 < children.length) throw Error(formatProdErrorMessage(93));\n children = children[0];\n }\n defaultValue = children;\n }\n null == defaultValue && (defaultValue = \"\");\n value = defaultValue;\n }\n defaultValue = getToStringValue(value);\n element.defaultValue = defaultValue;\n children = element.textContent;\n children === defaultValue &&\n \"\" !== children &&\n null !== children &&\n (element.value = children);\n track(element);\n}\nfunction setTextContent(node, text) {\n if (text) {\n var firstChild = node.firstChild;\n if (\n firstChild &&\n firstChild === node.lastChild &&\n 3 === firstChild.nodeType\n ) {\n firstChild.nodeValue = text;\n return;\n }\n }\n node.textContent = text;\n}\nvar unitlessNumbers = new Set(\n \"animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp\".split(\n \" \"\n )\n);\nfunction setValueForStyle(style, styleName, value) {\n var isCustomProperty = 0 === styleName.indexOf(\"--\");\n null == value || \"boolean\" === typeof value || \"\" === value\n ? isCustomProperty\n ? style.setProperty(styleName, \"\")\n : \"float\" === styleName\n ? (style.cssFloat = \"\")\n : (style[styleName] = \"\")\n : isCustomProperty\n ? style.setProperty(styleName, value)\n : \"number\" !== typeof value ||\n 0 === value ||\n unitlessNumbers.has(styleName)\n ? \"float\" === styleName\n ? (style.cssFloat = value)\n : (style[styleName] = (\"\" + value).trim())\n : (style[styleName] = value + \"px\");\n}\nfunction setValueForStyles(node, styles, prevStyles) {\n if (null != styles && \"object\" !== typeof styles)\n throw Error(formatProdErrorMessage(62));\n node = node.style;\n if (null != prevStyles) {\n for (var styleName in prevStyles)\n !prevStyles.hasOwnProperty(styleName) ||\n (null != styles && styles.hasOwnProperty(styleName)) ||\n (0 === styleName.indexOf(\"--\")\n ? node.setProperty(styleName, \"\")\n : \"float\" === styleName\n ? (node.cssFloat = \"\")\n : (node[styleName] = \"\"));\n for (var styleName$16 in styles)\n (styleName = styles[styleName$16]),\n styles.hasOwnProperty(styleName$16) &&\n prevStyles[styleName$16] !== styleName &&\n setValueForStyle(node, styleName$16, styleName);\n } else\n for (var styleName$17 in styles)\n styles.hasOwnProperty(styleName$17) &&\n setValueForStyle(node, styleName$17, styles[styleName$17]);\n}\nfunction isCustomElement(tagName) {\n if (-1 === tagName.indexOf(\"-\")) return !1;\n switch (tagName) {\n case \"annotation-xml\":\n case \"color-profile\":\n case \"font-face\":\n case \"font-face-src\":\n case \"font-face-uri\":\n case \"font-face-format\":\n case \"font-face-name\":\n case \"missing-glyph\":\n return !1;\n default:\n return !0;\n }\n}\nvar aliases = new Map([\n [\"acceptCharset\", \"accept-charset\"],\n [\"htmlFor\", \"for\"],\n [\"httpEquiv\", \"http-equiv\"],\n [\"crossOrigin\", \"crossorigin\"],\n [\"accentHeight\", \"accent-height\"],\n [\"alignmentBaseline\", \"alignment-baseline\"],\n [\"arabicForm\", \"arabic-form\"],\n [\"baselineShift\", \"baseline-shift\"],\n [\"capHeight\", \"cap-height\"],\n [\"clipPath\", \"clip-path\"],\n [\"clipRule\", \"clip-rule\"],\n [\"colorInterpolation\", \"color-interpolation\"],\n [\"colorInterpolationFilters\", \"color-interpolation-filters\"],\n [\"colorProfile\", \"color-profile\"],\n [\"colorRendering\", \"color-rendering\"],\n [\"dominantBaseline\", \"dominant-baseline\"],\n [\"enableBackground\", \"enable-background\"],\n [\"fillOpacity\", \"fill-opacity\"],\n [\"fillRule\", \"fill-rule\"],\n [\"floodColor\", \"flood-color\"],\n [\"floodOpacity\", \"flood-opacity\"],\n [\"fontFamily\", \"font-family\"],\n [\"fontSize\", \"font-size\"],\n [\"fontSizeAdjust\", \"font-size-adjust\"],\n [\"fontStretch\", \"font-stretch\"],\n [\"fontStyle\", \"font-style\"],\n [\"fontVariant\", \"font-variant\"],\n [\"fontWeight\", \"font-weight\"],\n [\"glyphName\", \"glyph-name\"],\n [\"glyphOrientationHorizontal\", \"glyph-orientation-horizontal\"],\n [\"glyphOrientationVertical\", \"glyph-orientation-vertical\"],\n [\"horizAdvX\", \"horiz-adv-x\"],\n [\"horizOriginX\", \"horiz-origin-x\"],\n [\"imageRendering\", \"image-rendering\"],\n [\"letterSpacing\", \"letter-spacing\"],\n [\"lightingColor\", \"lighting-color\"],\n [\"markerEnd\", \"marker-end\"],\n [\"markerMid\", \"marker-mid\"],\n [\"markerStart\", \"marker-start\"],\n [\"overlinePosition\", \"overline-position\"],\n [\"overlineThickness\", \"overline-thickness\"],\n [\"paintOrder\", \"paint-order\"],\n [\"panose-1\", \"panose-1\"],\n [\"pointerEvents\", \"pointer-events\"],\n [\"renderingIntent\", \"rendering-intent\"],\n [\"shapeRendering\", \"shape-rendering\"],\n [\"stopColor\", \"stop-color\"],\n [\"stopOpacity\", \"stop-opacity\"],\n [\"strikethroughPosition\", \"strikethrough-position\"],\n [\"strikethroughThickness\", \"strikethrough-thickness\"],\n [\"strokeDasharray\", \"stroke-dasharray\"],\n [\"strokeDashoffset\", \"stroke-dashoffset\"],\n [\"strokeLinecap\", \"stroke-linecap\"],\n [\"strokeLinejoin\", \"stroke-linejoin\"],\n [\"strokeMiterlimit\", \"stroke-miterlimit\"],\n [\"strokeOpacity\", \"stroke-opacity\"],\n [\"strokeWidth\", \"stroke-width\"],\n [\"textAnchor\", \"text-anchor\"],\n [\"textDecoration\", \"text-decoration\"],\n [\"textRendering\", \"text-rendering\"],\n [\"transformOrigin\", \"transform-origin\"],\n [\"underlinePosition\", \"underline-position\"],\n [\"underlineThickness\", \"underline-thickness\"],\n [\"unicodeBidi\", \"unicode-bidi\"],\n [\"unicodeRange\", \"unicode-range\"],\n [\"unitsPerEm\", \"units-per-em\"],\n [\"vAlphabetic\", \"v-alphabetic\"],\n [\"vHanging\", \"v-hanging\"],\n [\"vIdeographic\", \"v-ideographic\"],\n [\"vMathematical\", \"v-mathematical\"],\n [\"vectorEffect\", \"vector-effect\"],\n [\"vertAdvY\", \"vert-adv-y\"],\n [\"vertOriginX\", \"vert-origin-x\"],\n [\"vertOriginY\", \"vert-origin-y\"],\n [\"wordSpacing\", \"word-spacing\"],\n [\"writingMode\", \"writing-mode\"],\n [\"xmlnsXlink\", \"xmlns:xlink\"],\n [\"xHeight\", \"x-height\"]\n ]),\n isJavaScriptProtocol =\n /^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*:/i;\nfunction sanitizeURL(url) {\n return isJavaScriptProtocol.test(\"\" + url)\n ? \"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')\"\n : url;\n}\nfunction noop$1() {}\nvar currentReplayingEvent = null;\nfunction getEventTarget(nativeEvent) {\n nativeEvent = nativeEvent.target || nativeEvent.srcElement || window;\n nativeEvent.correspondingUseElement &&\n (nativeEvent = nativeEvent.correspondingUseElement);\n return 3 === nativeEvent.nodeType ? nativeEvent.parentNode : nativeEvent;\n}\nvar restoreTarget = null,\n restoreQueue = null;\nfunction restoreStateOfTarget(target) {\n var internalInstance = getInstanceFromNode(target);\n if (internalInstance && (target = internalInstance.stateNode)) {\n var props = target[internalPropsKey] || null;\n a: switch (((target = internalInstance.stateNode), internalInstance.type)) {\n case \"input\":\n updateInput(\n target,\n props.value,\n props.defaultValue,\n props.defaultValue,\n props.checked,\n props.defaultChecked,\n props.type,\n props.name\n );\n internalInstance = props.name;\n if (\"radio\" === props.type && null != internalInstance) {\n for (props = target; props.parentNode; ) props = props.parentNode;\n props = props.querySelectorAll(\n 'input[name=\"' +\n escapeSelectorAttributeValueInsideDoubleQuotes(\n \"\" + internalInstance\n ) +\n '\"][type=\"radio\"]'\n );\n for (\n internalInstance = 0;\n internalInstance < props.length;\n internalInstance++\n ) {\n var otherNode = props[internalInstance];\n if (otherNode !== target && otherNode.form === target.form) {\n var otherProps = otherNode[internalPropsKey] || null;\n if (!otherProps) throw Error(formatProdErrorMessage(90));\n updateInput(\n otherNode,\n otherProps.value,\n otherProps.defaultValue,\n otherProps.defaultValue,\n otherProps.checked,\n otherProps.defaultChecked,\n otherProps.type,\n otherProps.name\n );\n }\n }\n for (\n internalInstance = 0;\n internalInstance < props.length;\n internalInstance++\n )\n (otherNode = props[internalInstance]),\n otherNode.form === target.form && updateValueIfChanged(otherNode);\n }\n break a;\n case \"textarea\":\n updateTextarea(target, props.value, props.defaultValue);\n break a;\n case \"select\":\n (internalInstance = props.value),\n null != internalInstance &&\n updateOptions(target, !!props.multiple, internalInstance, !1);\n }\n }\n}\nvar isInsideEventHandler = !1;\nfunction batchedUpdates$1(fn, a, b) {\n if (isInsideEventHandler) return fn(a, b);\n isInsideEventHandler = !0;\n try {\n var JSCompiler_inline_result = fn(a);\n return JSCompiler_inline_result;\n } finally {\n if (\n ((isInsideEventHandler = !1),\n null !== restoreTarget || null !== restoreQueue)\n )\n if (\n (flushSyncWork$1(),\n restoreTarget &&\n ((a = restoreTarget),\n (fn = restoreQueue),\n (restoreQueue = restoreTarget = null),\n restoreStateOfTarget(a),\n fn))\n )\n for (a = 0; a < fn.length; a++) restoreStateOfTarget(fn[a]);\n }\n}\nfunction getListener(inst, registrationName) {\n var stateNode = inst.stateNode;\n if (null === stateNode) return null;\n var props = stateNode[internalPropsKey] || null;\n if (null === props) return null;\n stateNode = props[registrationName];\n a: switch (registrationName) {\n case \"onClick\":\n case \"onClickCapture\":\n case \"onDoubleClick\":\n case \"onDoubleClickCapture\":\n case \"onMouseDown\":\n case \"onMouseDownCapture\":\n case \"onMouseMove\":\n case \"onMouseMoveCapture\":\n case \"onMouseUp\":\n case \"onMouseUpCapture\":\n case \"onMouseEnter\":\n (props = !props.disabled) ||\n ((inst = inst.type),\n (props = !(\n \"button\" === inst ||\n \"input\" === inst ||\n \"select\" === inst ||\n \"textarea\" === inst\n )));\n inst = !props;\n break a;\n default:\n inst = !1;\n }\n if (inst) return null;\n if (stateNode && \"function\" !== typeof stateNode)\n throw Error(\n formatProdErrorMessage(231, registrationName, typeof stateNode)\n );\n return stateNode;\n}\nvar canUseDOM = !(\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ),\n passiveBrowserEventsSupported = !1;\nif (canUseDOM)\n try {\n var options = {};\n Object.defineProperty(options, \"passive\", {\n get: function () {\n passiveBrowserEventsSupported = !0;\n }\n });\n window.addEventListener(\"test\", options, options);\n window.removeEventListener(\"test\", options, options);\n } catch (e) {\n passiveBrowserEventsSupported = !1;\n }\nvar root = null,\n startText = null,\n fallbackText = null;\nfunction getData() {\n if (fallbackText) return fallbackText;\n var start,\n startValue = startText,\n startLength = startValue.length,\n end,\n endValue = \"value\" in root ? root.value : root.textContent,\n endLength = endValue.length;\n for (\n start = 0;\n start < startLength && startValue[start] === endValue[start];\n start++\n );\n var minEnd = startLength - start;\n for (\n end = 1;\n end <= minEnd &&\n startValue[startLength - end] === endValue[endLength - end];\n end++\n );\n return (fallbackText = endValue.slice(start, 1 < end ? 1 - end : void 0));\n}\nfunction getEventCharCode(nativeEvent) {\n var keyCode = nativeEvent.keyCode;\n \"charCode\" in nativeEvent\n ? ((nativeEvent = nativeEvent.charCode),\n 0 === nativeEvent && 13 === keyCode && (nativeEvent = 13))\n : (nativeEvent = keyCode);\n 10 === nativeEvent && (nativeEvent = 13);\n return 32 <= nativeEvent || 13 === nativeEvent ? nativeEvent : 0;\n}\nfunction functionThatReturnsTrue() {\n return !0;\n}\nfunction functionThatReturnsFalse() {\n return !1;\n}\nfunction createSyntheticEvent(Interface) {\n function SyntheticBaseEvent(\n reactName,\n reactEventType,\n targetInst,\n nativeEvent,\n nativeEventTarget\n ) {\n this._reactName = reactName;\n this._targetInst = targetInst;\n this.type = reactEventType;\n this.nativeEvent = nativeEvent;\n this.target = nativeEventTarget;\n this.currentTarget = null;\n for (var propName in Interface)\n Interface.hasOwnProperty(propName) &&\n ((reactName = Interface[propName]),\n (this[propName] = reactName\n ? reactName(nativeEvent)\n : nativeEvent[propName]));\n this.isDefaultPrevented = (\n null != nativeEvent.defaultPrevented\n ? nativeEvent.defaultPrevented\n : !1 === nativeEvent.returnValue\n )\n ? functionThatReturnsTrue\n : functionThatReturnsFalse;\n this.isPropagationStopped = functionThatReturnsFalse;\n return this;\n }\n assign(SyntheticBaseEvent.prototype, {\n preventDefault: function () {\n this.defaultPrevented = !0;\n var event = this.nativeEvent;\n event &&\n (event.preventDefault\n ? event.preventDefault()\n : \"unknown\" !== typeof event.returnValue && (event.returnValue = !1),\n (this.isDefaultPrevented = functionThatReturnsTrue));\n },\n stopPropagation: function () {\n var event = this.nativeEvent;\n event &&\n (event.stopPropagation\n ? event.stopPropagation()\n : \"unknown\" !== typeof event.cancelBubble &&\n (event.cancelBubble = !0),\n (this.isPropagationStopped = functionThatReturnsTrue));\n },\n persist: function () {},\n isPersistent: functionThatReturnsTrue\n });\n return SyntheticBaseEvent;\n}\nvar EventInterface = {\n eventPhase: 0,\n bubbles: 0,\n cancelable: 0,\n timeStamp: function (event) {\n return event.timeStamp || Date.now();\n },\n defaultPrevented: 0,\n isTrusted: 0\n },\n SyntheticEvent = createSyntheticEvent(EventInterface),\n UIEventInterface = assign({}, EventInterface, { view: 0, detail: 0 }),\n SyntheticUIEvent = createSyntheticEvent(UIEventInterface),\n lastMovementX,\n lastMovementY,\n lastMouseEvent,\n MouseEventInterface = assign({}, UIEventInterface, {\n screenX: 0,\n screenY: 0,\n clientX: 0,\n clientY: 0,\n pageX: 0,\n pageY: 0,\n ctrlKey: 0,\n shiftKey: 0,\n altKey: 0,\n metaKey: 0,\n getModifierState: getEventModifierState,\n button: 0,\n buttons: 0,\n relatedTarget: function (event) {\n return void 0 === event.relatedTarget\n ? event.fromElement === event.srcElement\n ? event.toElement\n : event.fromElement\n : event.relatedTarget;\n },\n movementX: function (event) {\n if (\"movementX\" in event) return event.movementX;\n event !== lastMouseEvent &&\n (lastMouseEvent && \"mousemove\" === event.type\n ? ((lastMovementX = event.screenX - lastMouseEvent.screenX),\n (lastMovementY = event.screenY - lastMouseEvent.screenY))\n : (lastMovementY = lastMovementX = 0),\n (lastMouseEvent = event));\n return lastMovementX;\n },\n movementY: function (event) {\n return \"movementY\" in event ? event.movementY : lastMovementY;\n }\n }),\n SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface),\n DragEventInterface = assign({}, MouseEventInterface, { dataTransfer: 0 }),\n SyntheticDragEvent = createSyntheticEvent(DragEventInterface),\n FocusEventInterface = assign({}, UIEventInterface, { relatedTarget: 0 }),\n SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface),\n AnimationEventInterface = assign({}, EventInterface, {\n animationName: 0,\n elapsedTime: 0,\n pseudoElement: 0\n }),\n SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface),\n ClipboardEventInterface = assign({}, EventInterface, {\n clipboardData: function (event) {\n return \"clipboardData\" in event\n ? event.clipboardData\n : window.clipboardData;\n }\n }),\n SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface),\n CompositionEventInterface = assign({}, EventInterface, { data: 0 }),\n SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface),\n normalizeKey = {\n Esc: \"Escape\",\n Spacebar: \" \",\n Left: \"ArrowLeft\",\n Up: \"ArrowUp\",\n Right: \"ArrowRight\",\n Down: \"ArrowDown\",\n Del: \"Delete\",\n Win: \"OS\",\n Menu: \"ContextMenu\",\n Apps: \"ContextMenu\",\n Scroll: \"ScrollLock\",\n MozPrintableKey: \"Unidentified\"\n },\n translateToKey = {\n 8: \"Backspace\",\n 9: \"Tab\",\n 12: \"Clear\",\n 13: \"Enter\",\n 16: \"Shift\",\n 17: \"Control\",\n 18: \"Alt\",\n 19: \"Pause\",\n 20: \"CapsLock\",\n 27: \"Escape\",\n 32: \" \",\n 33: \"PageUp\",\n 34: \"PageDown\",\n 35: \"End\",\n 36: \"Home\",\n 37: \"ArrowLeft\",\n 38: \"ArrowUp\",\n 39: \"ArrowRight\",\n 40: \"ArrowDown\",\n 45: \"Insert\",\n 46: \"Delete\",\n 112: \"F1\",\n 113: \"F2\",\n 114: \"F3\",\n 115: \"F4\",\n 116: \"F5\",\n 117: \"F6\",\n 118: \"F7\",\n 119: \"F8\",\n 120: \"F9\",\n 121: \"F10\",\n 122: \"F11\",\n 123: \"F12\",\n 144: \"NumLock\",\n 145: \"ScrollLock\",\n 224: \"Meta\"\n },\n modifierKeyToProp = {\n Alt: \"altKey\",\n Control: \"ctrlKey\",\n Meta: \"metaKey\",\n Shift: \"shiftKey\"\n };\nfunction modifierStateGetter(keyArg) {\n var nativeEvent = this.nativeEvent;\n return nativeEvent.getModifierState\n ? nativeEvent.getModifierState(keyArg)\n : (keyArg = modifierKeyToProp[keyArg])\n ? !!nativeEvent[keyArg]\n : !1;\n}\nfunction getEventModifierState() {\n return modifierStateGetter;\n}\nvar KeyboardEventInterface = assign({}, UIEventInterface, {\n key: function (nativeEvent) {\n if (nativeEvent.key) {\n var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n if (\"Unidentified\" !== key) return key;\n }\n return \"keypress\" === nativeEvent.type\n ? ((nativeEvent = getEventCharCode(nativeEvent)),\n 13 === nativeEvent ? \"Enter\" : String.fromCharCode(nativeEvent))\n : \"keydown\" === nativeEvent.type || \"keyup\" === nativeEvent.type\n ? translateToKey[nativeEvent.keyCode] || \"Unidentified\"\n : \"\";\n },\n code: 0,\n location: 0,\n ctrlKey: 0,\n shiftKey: 0,\n altKey: 0,\n metaKey: 0,\n repeat: 0,\n locale: 0,\n getModifierState: getEventModifierState,\n charCode: function (event) {\n return \"keypress\" === event.type ? getEventCharCode(event) : 0;\n },\n keyCode: function (event) {\n return \"keydown\" === event.type || \"keyup\" === event.type\n ? event.keyCode\n : 0;\n },\n which: function (event) {\n return \"keypress\" === event.type\n ? getEventCharCode(event)\n : \"keydown\" === event.type || \"keyup\" === event.type\n ? event.keyCode\n : 0;\n }\n }),\n SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface),\n PointerEventInterface = assign({}, MouseEventInterface, {\n pointerId: 0,\n width: 0,\n height: 0,\n pressure: 0,\n tangentialPressure: 0,\n tiltX: 0,\n tiltY: 0,\n twist: 0,\n pointerType: 0,\n isPrimary: 0\n }),\n SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface),\n TouchEventInterface = assign({}, UIEventInterface, {\n touches: 0,\n targetTouches: 0,\n changedTouches: 0,\n altKey: 0,\n metaKey: 0,\n ctrlKey: 0,\n shiftKey: 0,\n getModifierState: getEventModifierState\n }),\n SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface),\n TransitionEventInterface = assign({}, EventInterface, {\n propertyName: 0,\n elapsedTime: 0,\n pseudoElement: 0\n }),\n SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface),\n WheelEventInterface = assign({}, MouseEventInterface, {\n deltaX: function (event) {\n return \"deltaX\" in event\n ? event.deltaX\n : \"wheelDeltaX\" in event\n ? -event.wheelDeltaX\n : 0;\n },\n deltaY: function (event) {\n return \"deltaY\" in event\n ? event.deltaY\n : \"wheelDeltaY\" in event\n ? -event.wheelDeltaY\n : \"wheelDelta\" in event\n ? -event.wheelDelta\n : 0;\n },\n deltaZ: 0,\n deltaMode: 0\n }),\n SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface),\n ToggleEventInterface = assign({}, EventInterface, {\n newState: 0,\n oldState: 0\n }),\n SyntheticToggleEvent = createSyntheticEvent(ToggleEventInterface),\n END_KEYCODES = [9, 13, 27, 32],\n canUseCompositionEvent = canUseDOM && \"CompositionEvent\" in window,\n documentMode = null;\ncanUseDOM &&\n \"documentMode\" in document &&\n (documentMode = document.documentMode);\nvar canUseTextInputEvent = canUseDOM && \"TextEvent\" in window && !documentMode,\n useFallbackCompositionData =\n canUseDOM &&\n (!canUseCompositionEvent ||\n (documentMode && 8 < documentMode && 11 >= documentMode)),\n SPACEBAR_CHAR = String.fromCharCode(32),\n hasSpaceKeypress = !1;\nfunction isFallbackCompositionEnd(domEventName, nativeEvent) {\n switch (domEventName) {\n case \"keyup\":\n return -1 !== END_KEYCODES.indexOf(nativeEvent.keyCode);\n case \"keydown\":\n return 229 !== nativeEvent.keyCode;\n case \"keypress\":\n case \"mousedown\":\n case \"focusout\":\n return !0;\n default:\n return !1;\n }\n}\nfunction getDataFromCustomEvent(nativeEvent) {\n nativeEvent = nativeEvent.detail;\n return \"object\" === typeof nativeEvent && \"data\" in nativeEvent\n ? nativeEvent.data\n : null;\n}\nvar isComposing = !1;\nfunction getNativeBeforeInputChars(domEventName, nativeEvent) {\n switch (domEventName) {\n case \"compositionend\":\n return getDataFromCustomEvent(nativeEvent);\n case \"keypress\":\n if (32 !== nativeEvent.which) return null;\n hasSpaceKeypress = !0;\n return SPACEBAR_CHAR;\n case \"textInput\":\n return (\n (domEventName = nativeEvent.data),\n domEventName === SPACEBAR_CHAR && hasSpaceKeypress ? null : domEventName\n );\n default:\n return null;\n }\n}\nfunction getFallbackBeforeInputChars(domEventName, nativeEvent) {\n if (isComposing)\n return \"compositionend\" === domEventName ||\n (!canUseCompositionEvent &&\n isFallbackCompositionEnd(domEventName, nativeEvent))\n ? ((domEventName = getData()),\n (fallbackText = startText = root = null),\n (isComposing = !1),\n domEventName)\n : null;\n switch (domEventName) {\n case \"paste\":\n return null;\n case \"keypress\":\n if (\n !(nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) ||\n (nativeEvent.ctrlKey && nativeEvent.altKey)\n ) {\n if (nativeEvent.char && 1 < nativeEvent.char.length)\n return nativeEvent.char;\n if (nativeEvent.which) return String.fromCharCode(nativeEvent.which);\n }\n return null;\n case \"compositionend\":\n return useFallbackCompositionData && \"ko\" !== nativeEvent.locale\n ? null\n : nativeEvent.data;\n default:\n return null;\n }\n}\nvar supportedInputTypes = {\n color: !0,\n date: !0,\n datetime: !0,\n \"datetime-local\": !0,\n email: !0,\n month: !0,\n number: !0,\n password: !0,\n range: !0,\n search: !0,\n tel: !0,\n text: !0,\n time: !0,\n url: !0,\n week: !0\n};\nfunction isTextInputElement(elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return \"input\" === nodeName\n ? !!supportedInputTypes[elem.type]\n : \"textarea\" === nodeName\n ? !0\n : !1;\n}\nfunction createAndAccumulateChangeEvent(\n dispatchQueue,\n inst,\n nativeEvent,\n target\n) {\n restoreTarget\n ? restoreQueue\n ? restoreQueue.push(target)\n : (restoreQueue = [target])\n : (restoreTarget = target);\n inst = accumulateTwoPhaseListeners(inst, \"onChange\");\n 0 < inst.length &&\n ((nativeEvent = new SyntheticEvent(\n \"onChange\",\n \"change\",\n null,\n nativeEvent,\n target\n )),\n dispatchQueue.push({ event: nativeEvent, listeners: inst }));\n}\nvar activeElement$1 = null,\n activeElementInst$1 = null;\nfunction runEventInBatch(dispatchQueue) {\n processDispatchQueue(dispatchQueue, 0);\n}\nfunction getInstIfValueChanged(targetInst) {\n var targetNode = getNodeFromInstance(targetInst);\n if (updateValueIfChanged(targetNode)) return targetInst;\n}\nfunction getTargetInstForChangeEvent(domEventName, targetInst) {\n if (\"change\" === domEventName) return targetInst;\n}\nvar isInputEventSupported = !1;\nif (canUseDOM) {\n var JSCompiler_inline_result$jscomp$286;\n if (canUseDOM) {\n var isSupported$jscomp$inline_427 = \"oninput\" in document;\n if (!isSupported$jscomp$inline_427) {\n var element$jscomp$inline_428 = document.createElement(\"div\");\n element$jscomp$inline_428.setAttribute(\"oninput\", \"return;\");\n isSupported$jscomp$inline_427 =\n \"function\" === typeof element$jscomp$inline_428.oninput;\n }\n JSCompiler_inline_result$jscomp$286 = isSupported$jscomp$inline_427;\n } else JSCompiler_inline_result$jscomp$286 = !1;\n isInputEventSupported =\n JSCompiler_inline_result$jscomp$286 &&\n (!document.documentMode || 9 < document.documentMode);\n}\nfunction stopWatchingForValueChange() {\n activeElement$1 &&\n (activeElement$1.detachEvent(\"onpropertychange\", handlePropertyChange),\n (activeElementInst$1 = activeElement$1 = null));\n}\nfunction handlePropertyChange(nativeEvent) {\n if (\n \"value\" === nativeEvent.propertyName &&\n getInstIfValueChanged(activeElementInst$1)\n ) {\n var dispatchQueue = [];\n createAndAccumulateChangeEvent(\n dispatchQueue,\n activeElementInst$1,\n nativeEvent,\n getEventTarget(nativeEvent)\n );\n batchedUpdates$1(runEventInBatch, dispatchQueue);\n }\n}\nfunction handleEventsForInputEventPolyfill(domEventName, target, targetInst) {\n \"focusin\" === domEventName\n ? (stopWatchingForValueChange(),\n (activeElement$1 = target),\n (activeElementInst$1 = targetInst),\n activeElement$1.attachEvent(\"onpropertychange\", handlePropertyChange))\n : \"focusout\" === domEventName && stopWatchingForValueChange();\n}\nfunction getTargetInstForInputEventPolyfill(domEventName) {\n if (\n \"selectionchange\" === domEventName ||\n \"keyup\" === domEventName ||\n \"keydown\" === domEventName\n )\n return getInstIfValueChanged(activeElementInst$1);\n}\nfunction getTargetInstForClickEvent(domEventName, targetInst) {\n if (\"click\" === domEventName) return getInstIfValueChanged(targetInst);\n}\nfunction getTargetInstForInputOrChangeEvent(domEventName, targetInst) {\n if (\"input\" === domEventName || \"change\" === domEventName)\n return getInstIfValueChanged(targetInst);\n}\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is;\nfunction shallowEqual(objA, objB) {\n if (objectIs(objA, objB)) return !0;\n if (\n \"object\" !== typeof objA ||\n null === objA ||\n \"object\" !== typeof objB ||\n null === objB\n )\n return !1;\n var keysA = Object.keys(objA),\n keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) return !1;\n for (keysB = 0; keysB < keysA.length; keysB++) {\n var currentKey = keysA[keysB];\n if (\n !hasOwnProperty.call(objB, currentKey) ||\n !objectIs(objA[currentKey], objB[currentKey])\n )\n return !1;\n }\n return !0;\n}\nfunction getLeafNode(node) {\n for (; node && node.firstChild; ) node = node.firstChild;\n return node;\n}\nfunction getNodeForCharacterOffset(root, offset) {\n var node = getLeafNode(root);\n root = 0;\n for (var nodeEnd; node; ) {\n if (3 === node.nodeType) {\n nodeEnd = root + node.textContent.length;\n if (root <= offset && nodeEnd >= offset)\n return { node: node, offset: offset - root };\n root = nodeEnd;\n }\n a: {\n for (; node; ) {\n if (node.nextSibling) {\n node = node.nextSibling;\n break a;\n }\n node = node.parentNode;\n }\n node = void 0;\n }\n node = getLeafNode(node);\n }\n}\nfunction containsNode(outerNode, innerNode) {\n return outerNode && innerNode\n ? outerNode === innerNode\n ? !0\n : outerNode && 3 === outerNode.nodeType\n ? !1\n : innerNode && 3 === innerNode.nodeType\n ? containsNode(outerNode, innerNode.parentNode)\n : \"contains\" in outerNode\n ? outerNode.contains(innerNode)\n : outerNode.compareDocumentPosition\n ? !!(outerNode.compareDocumentPosition(innerNode) & 16)\n : !1\n : !1;\n}\nfunction getActiveElementDeep(containerInfo) {\n containerInfo =\n null != containerInfo &&\n null != containerInfo.ownerDocument &&\n null != containerInfo.ownerDocument.defaultView\n ? containerInfo.ownerDocument.defaultView\n : window;\n for (\n var element = getActiveElement(containerInfo.document);\n element instanceof containerInfo.HTMLIFrameElement;\n\n ) {\n try {\n var JSCompiler_inline_result =\n \"string\" === typeof element.contentWindow.location.href;\n } catch (err) {\n JSCompiler_inline_result = !1;\n }\n if (JSCompiler_inline_result) containerInfo = element.contentWindow;\n else break;\n element = getActiveElement(containerInfo.document);\n }\n return element;\n}\nfunction hasSelectionCapabilities(elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return (\n nodeName &&\n ((\"input\" === nodeName &&\n (\"text\" === elem.type ||\n \"search\" === elem.type ||\n \"tel\" === elem.type ||\n \"url\" === elem.type ||\n \"password\" === elem.type)) ||\n \"textarea\" === nodeName ||\n \"true\" === elem.contentEditable)\n );\n}\nvar skipSelectionChangeEvent =\n canUseDOM && \"documentMode\" in document && 11 >= document.documentMode,\n activeElement = null,\n activeElementInst = null,\n lastSelection = null,\n mouseDown = !1;\nfunction constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) {\n var doc =\n nativeEventTarget.window === nativeEventTarget\n ? nativeEventTarget.document\n : 9 === nativeEventTarget.nodeType\n ? nativeEventTarget\n : nativeEventTarget.ownerDocument;\n mouseDown ||\n null == activeElement ||\n activeElement !== getActiveElement(doc) ||\n ((doc = activeElement),\n \"selectionStart\" in doc && hasSelectionCapabilities(doc)\n ? (doc = { start: doc.selectionStart, end: doc.selectionEnd })\n : ((doc = (\n (doc.ownerDocument && doc.ownerDocument.defaultView) ||\n window\n ).getSelection()),\n (doc = {\n anchorNode: doc.anchorNode,\n anchorOffset: doc.anchorOffset,\n focusNode: doc.focusNode,\n focusOffset: doc.focusOffset\n })),\n (lastSelection && shallowEqual(lastSelection, doc)) ||\n ((lastSelection = doc),\n (doc = accumulateTwoPhaseListeners(activeElementInst, \"onSelect\")),\n 0 < doc.length &&\n ((nativeEvent = new SyntheticEvent(\n \"onSelect\",\n \"select\",\n null,\n nativeEvent,\n nativeEventTarget\n )),\n dispatchQueue.push({ event: nativeEvent, listeners: doc }),\n (nativeEvent.target = activeElement))));\n}\nfunction makePrefixMap(styleProp, eventName) {\n var prefixes = {};\n prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n prefixes[\"Webkit\" + styleProp] = \"webkit\" + eventName;\n prefixes[\"Moz\" + styleProp] = \"moz\" + eventName;\n return prefixes;\n}\nvar vendorPrefixes = {\n animationend: makePrefixMap(\"Animation\", \"AnimationEnd\"),\n animationiteration: makePrefixMap(\"Animation\", \"AnimationIteration\"),\n animationstart: makePrefixMap(\"Animation\", \"AnimationStart\"),\n transitionrun: makePrefixMap(\"Transition\", \"TransitionRun\"),\n transitionstart: makePrefixMap(\"Transition\", \"TransitionStart\"),\n transitioncancel: makePrefixMap(\"Transition\", \"TransitionCancel\"),\n transitionend: makePrefixMap(\"Transition\", \"TransitionEnd\")\n },\n prefixedEventNames = {},\n style = {};\ncanUseDOM &&\n ((style = document.createElement(\"div\").style),\n \"AnimationEvent\" in window ||\n (delete vendorPrefixes.animationend.animation,\n delete vendorPrefixes.animationiteration.animation,\n delete vendorPrefixes.animationstart.animation),\n \"TransitionEvent\" in window ||\n delete vendorPrefixes.transitionend.transition);\nfunction getVendorPrefixedEventName(eventName) {\n if (prefixedEventNames[eventName]) return prefixedEventNames[eventName];\n if (!vendorPrefixes[eventName]) return eventName;\n var prefixMap = vendorPrefixes[eventName],\n styleProp;\n for (styleProp in prefixMap)\n if (prefixMap.hasOwnProperty(styleProp) && styleProp in style)\n return (prefixedEventNames[eventName] = prefixMap[styleProp]);\n return eventName;\n}\nvar ANIMATION_END = getVendorPrefixedEventName(\"animationend\"),\n ANIMATION_ITERATION = getVendorPrefixedEventName(\"animationiteration\"),\n ANIMATION_START = getVendorPrefixedEventName(\"animationstart\"),\n TRANSITION_RUN = getVendorPrefixedEventName(\"transitionrun\"),\n TRANSITION_START = getVendorPrefixedEventName(\"transitionstart\"),\n TRANSITION_CANCEL = getVendorPrefixedEventName(\"transitioncancel\"),\n TRANSITION_END = getVendorPrefixedEventName(\"transitionend\"),\n topLevelEventsToReactNames = new Map(),\n simpleEventPluginEvents =\n \"abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\n \" \"\n );\nsimpleEventPluginEvents.push(\"scrollEnd\");\nfunction registerSimpleEvent(domEventName, reactName) {\n topLevelEventsToReactNames.set(domEventName, reactName);\n registerTwoPhaseEvent(reactName, [domEventName]);\n}\nvar reportGlobalError =\n \"function\" === typeof reportError\n ? reportError\n : function (error) {\n if (\n \"object\" === typeof window &&\n \"function\" === typeof window.ErrorEvent\n ) {\n var event = new window.ErrorEvent(\"error\", {\n bubbles: !0,\n cancelable: !0,\n message:\n \"object\" === typeof error &&\n null !== error &&\n \"string\" === typeof error.message\n ? String(error.message)\n : String(error),\n error: error\n });\n if (!window.dispatchEvent(event)) return;\n } else if (\n \"object\" === typeof process &&\n \"function\" === typeof process.emit\n ) {\n process.emit(\"uncaughtException\", error);\n return;\n }\n console.error(error);\n },\n concurrentQueues = [],\n concurrentQueuesIndex = 0,\n concurrentlyUpdatedLanes = 0;\nfunction finishQueueingConcurrentUpdates() {\n for (\n var endIndex = concurrentQueuesIndex,\n i = (concurrentlyUpdatedLanes = concurrentQueuesIndex = 0);\n i < endIndex;\n\n ) {\n var fiber = concurrentQueues[i];\n concurrentQueues[i++] = null;\n var queue = concurrentQueues[i];\n concurrentQueues[i++] = null;\n var update = concurrentQueues[i];\n concurrentQueues[i++] = null;\n var lane = concurrentQueues[i];\n concurrentQueues[i++] = null;\n if (null !== queue && null !== update) {\n var pending = queue.pending;\n null === pending\n ? (update.next = update)\n : ((update.next = pending.next), (pending.next = update));\n queue.pending = update;\n }\n 0 !== lane && markUpdateLaneFromFiberToRoot(fiber, update, lane);\n }\n}\nfunction enqueueUpdate$1(fiber, queue, update, lane) {\n concurrentQueues[concurrentQueuesIndex++] = fiber;\n concurrentQueues[concurrentQueuesIndex++] = queue;\n concurrentQueues[concurrentQueuesIndex++] = update;\n concurrentQueues[concurrentQueuesIndex++] = lane;\n concurrentlyUpdatedLanes |= lane;\n fiber.lanes |= lane;\n fiber = fiber.alternate;\n null !== fiber && (fiber.lanes |= lane);\n}\nfunction enqueueConcurrentHookUpdate(fiber, queue, update, lane) {\n enqueueUpdate$1(fiber, queue, update, lane);\n return getRootForUpdatedFiber(fiber);\n}\nfunction enqueueConcurrentRenderForLane(fiber, lane) {\n enqueueUpdate$1(fiber, null, null, lane);\n return getRootForUpdatedFiber(fiber);\n}\nfunction markUpdateLaneFromFiberToRoot(sourceFiber, update, lane) {\n sourceFiber.lanes |= lane;\n var alternate = sourceFiber.alternate;\n null !== alternate && (alternate.lanes |= lane);\n for (var isHidden = !1, parent = sourceFiber.return; null !== parent; )\n (parent.childLanes |= lane),\n (alternate = parent.alternate),\n null !== alternate && (alternate.childLanes |= lane),\n 22 === parent.tag &&\n ((sourceFiber = parent.stateNode),\n null === sourceFiber || sourceFiber._visibility & 1 || (isHidden = !0)),\n (sourceFiber = parent),\n (parent = parent.return);\n return 3 === sourceFiber.tag\n ? ((parent = sourceFiber.stateNode),\n isHidden &&\n null !== update &&\n ((isHidden = 31 - clz32(lane)),\n (sourceFiber = parent.hiddenUpdates),\n (alternate = sourceFiber[isHidden]),\n null === alternate\n ? (sourceFiber[isHidden] = [update])\n : alternate.push(update),\n (update.lane = lane | 536870912)),\n parent)\n : null;\n}\nfunction getRootForUpdatedFiber(sourceFiber) {\n if (50 < nestedUpdateCount)\n throw (\n ((nestedUpdateCount = 0),\n (rootWithNestedUpdates = null),\n Error(formatProdErrorMessage(185)))\n );\n for (var parent = sourceFiber.return; null !== parent; )\n (sourceFiber = parent), (parent = sourceFiber.return);\n return 3 === sourceFiber.tag ? sourceFiber.stateNode : null;\n}\nvar emptyContextObject = {};\nfunction FiberNode(tag, pendingProps, key, mode) {\n this.tag = tag;\n this.key = key;\n this.sibling =\n this.child =\n this.return =\n this.stateNode =\n this.type =\n this.elementType =\n null;\n this.index = 0;\n this.refCleanup = this.ref = null;\n this.pendingProps = pendingProps;\n this.dependencies =\n this.memoizedState =\n this.updateQueue =\n this.memoizedProps =\n null;\n this.mode = mode;\n this.subtreeFlags = this.flags = 0;\n this.deletions = null;\n this.childLanes = this.lanes = 0;\n this.alternate = null;\n}\nfunction createFiberImplClass(tag, pendingProps, key, mode) {\n return new FiberNode(tag, pendingProps, key, mode);\n}\nfunction shouldConstruct(Component) {\n Component = Component.prototype;\n return !(!Component || !Component.isReactComponent);\n}\nfunction createWorkInProgress(current, pendingProps) {\n var workInProgress = current.alternate;\n null === workInProgress\n ? ((workInProgress = createFiberImplClass(\n current.tag,\n pendingProps,\n current.key,\n current.mode\n )),\n (workInProgress.elementType = current.elementType),\n (workInProgress.type = current.type),\n (workInProgress.stateNode = current.stateNode),\n (workInProgress.alternate = current),\n (current.alternate = workInProgress))\n : ((workInProgress.pendingProps = pendingProps),\n (workInProgress.type = current.type),\n (workInProgress.flags = 0),\n (workInProgress.subtreeFlags = 0),\n (workInProgress.deletions = null));\n workInProgress.flags = current.flags & 65011712;\n workInProgress.childLanes = current.childLanes;\n workInProgress.lanes = current.lanes;\n workInProgress.child = current.child;\n workInProgress.memoizedProps = current.memoizedProps;\n workInProgress.memoizedState = current.memoizedState;\n workInProgress.updateQueue = current.updateQueue;\n pendingProps = current.dependencies;\n workInProgress.dependencies =\n null === pendingProps\n ? null\n : { lanes: pendingProps.lanes, firstContext: pendingProps.firstContext };\n workInProgress.sibling = current.sibling;\n workInProgress.index = current.index;\n workInProgress.ref = current.ref;\n workInProgress.refCleanup = current.refCleanup;\n return workInProgress;\n}\nfunction resetWorkInProgress(workInProgress, renderLanes) {\n workInProgress.flags &= 65011714;\n var current = workInProgress.alternate;\n null === current\n ? ((workInProgress.childLanes = 0),\n (workInProgress.lanes = renderLanes),\n (workInProgress.child = null),\n (workInProgress.subtreeFlags = 0),\n (workInProgress.memoizedProps = null),\n (workInProgress.memoizedState = null),\n (workInProgress.updateQueue = null),\n (workInProgress.dependencies = null),\n (workInProgress.stateNode = null))\n : ((workInProgress.childLanes = current.childLanes),\n (workInProgress.lanes = current.lanes),\n (workInProgress.child = current.child),\n (workInProgress.subtreeFlags = 0),\n (workInProgress.deletions = null),\n (workInProgress.memoizedProps = current.memoizedProps),\n (workInProgress.memoizedState = current.memoizedState),\n (workInProgress.updateQueue = current.updateQueue),\n (workInProgress.type = current.type),\n (renderLanes = current.dependencies),\n (workInProgress.dependencies =\n null === renderLanes\n ? null\n : {\n lanes: renderLanes.lanes,\n firstContext: renderLanes.firstContext\n }));\n return workInProgress;\n}\nfunction createFiberFromTypeAndProps(\n type,\n key,\n pendingProps,\n owner,\n mode,\n lanes\n) {\n var fiberTag = 0;\n owner = type;\n if (\"function\" === typeof type) shouldConstruct(type) && (fiberTag = 1);\n else if (\"string\" === typeof type)\n fiberTag = isHostHoistableType(\n type,\n pendingProps,\n contextStackCursor.current\n )\n ? 26\n : \"html\" === type || \"head\" === type || \"body\" === type\n ? 27\n : 5;\n else\n a: switch (type) {\n case REACT_ACTIVITY_TYPE:\n return (\n (type = createFiberImplClass(31, pendingProps, key, mode)),\n (type.elementType = REACT_ACTIVITY_TYPE),\n (type.lanes = lanes),\n type\n );\n case REACT_FRAGMENT_TYPE:\n return createFiberFromFragment(pendingProps.children, mode, lanes, key);\n case REACT_STRICT_MODE_TYPE:\n fiberTag = 8;\n mode |= 24;\n break;\n case REACT_PROFILER_TYPE:\n return (\n (type = createFiberImplClass(12, pendingProps, key, mode | 2)),\n (type.elementType = REACT_PROFILER_TYPE),\n (type.lanes = lanes),\n type\n );\n case REACT_SUSPENSE_TYPE:\n return (\n (type = createFiberImplClass(13, pendingProps, key, mode)),\n (type.elementType = REACT_SUSPENSE_TYPE),\n (type.lanes = lanes),\n type\n );\n case REACT_SUSPENSE_LIST_TYPE:\n return (\n (type = createFiberImplClass(19, pendingProps, key, mode)),\n (type.elementType = REACT_SUSPENSE_LIST_TYPE),\n (type.lanes = lanes),\n type\n );\n default:\n if (\"object\" === typeof type && null !== type)\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n fiberTag = 10;\n break a;\n case REACT_CONSUMER_TYPE:\n fiberTag = 9;\n break a;\n case REACT_FORWARD_REF_TYPE:\n fiberTag = 11;\n break a;\n case REACT_MEMO_TYPE:\n fiberTag = 14;\n break a;\n case REACT_LAZY_TYPE:\n fiberTag = 16;\n owner = null;\n break a;\n }\n fiberTag = 29;\n pendingProps = Error(\n formatProdErrorMessage(130, null === type ? \"null\" : typeof type, \"\")\n );\n owner = null;\n }\n key = createFiberImplClass(fiberTag, pendingProps, key, mode);\n key.elementType = type;\n key.type = owner;\n key.lanes = lanes;\n return key;\n}\nfunction createFiberFromFragment(elements, mode, lanes, key) {\n elements = createFiberImplClass(7, elements, key, mode);\n elements.lanes = lanes;\n return elements;\n}\nfunction createFiberFromText(content, mode, lanes) {\n content = createFiberImplClass(6, content, null, mode);\n content.lanes = lanes;\n return content;\n}\nfunction createFiberFromDehydratedFragment(dehydratedNode) {\n var fiber = createFiberImplClass(18, null, null, 0);\n fiber.stateNode = dehydratedNode;\n return fiber;\n}\nfunction createFiberFromPortal(portal, mode, lanes) {\n mode = createFiberImplClass(\n 4,\n null !== portal.children ? portal.children : [],\n portal.key,\n mode\n );\n mode.lanes = lanes;\n mode.stateNode = {\n containerInfo: portal.containerInfo,\n pendingChildren: null,\n implementation: portal.implementation\n };\n return mode;\n}\nvar CapturedStacks = new WeakMap();\nfunction createCapturedValueAtFiber(value, source) {\n if (\"object\" === typeof value && null !== value) {\n var existing = CapturedStacks.get(value);\n if (void 0 !== existing) return existing;\n source = {\n value: value,\n source: source,\n stack: getStackByFiberInDevAndProd(source)\n };\n CapturedStacks.set(value, source);\n return source;\n }\n return {\n value: value,\n source: source,\n stack: getStackByFiberInDevAndProd(source)\n };\n}\nvar forkStack = [],\n forkStackIndex = 0,\n treeForkProvider = null,\n treeForkCount = 0,\n idStack = [],\n idStackIndex = 0,\n treeContextProvider = null,\n treeContextId = 1,\n treeContextOverflow = \"\";\nfunction pushTreeFork(workInProgress, totalChildren) {\n forkStack[forkStackIndex++] = treeForkCount;\n forkStack[forkStackIndex++] = treeForkProvider;\n treeForkProvider = workInProgress;\n treeForkCount = totalChildren;\n}\nfunction pushTreeId(workInProgress, totalChildren, index) {\n idStack[idStackIndex++] = treeContextId;\n idStack[idStackIndex++] = treeContextOverflow;\n idStack[idStackIndex++] = treeContextProvider;\n treeContextProvider = workInProgress;\n var baseIdWithLeadingBit = treeContextId;\n workInProgress = treeContextOverflow;\n var baseLength = 32 - clz32(baseIdWithLeadingBit) - 1;\n baseIdWithLeadingBit &= ~(1 << baseLength);\n index += 1;\n var length = 32 - clz32(totalChildren) + baseLength;\n if (30 < length) {\n var numberOfOverflowBits = baseLength - (baseLength % 5);\n length = (\n baseIdWithLeadingBit &\n ((1 << numberOfOverflowBits) - 1)\n ).toString(32);\n baseIdWithLeadingBit >>= numberOfOverflowBits;\n baseLength -= numberOfOverflowBits;\n treeContextId =\n (1 << (32 - clz32(totalChildren) + baseLength)) |\n (index << baseLength) |\n baseIdWithLeadingBit;\n treeContextOverflow = length + workInProgress;\n } else\n (treeContextId =\n (1 << length) | (index << baseLength) | baseIdWithLeadingBit),\n (treeContextOverflow = workInProgress);\n}\nfunction pushMaterializedTreeId(workInProgress) {\n null !== workInProgress.return &&\n (pushTreeFork(workInProgress, 1), pushTreeId(workInProgress, 1, 0));\n}\nfunction popTreeContext(workInProgress) {\n for (; workInProgress === treeForkProvider; )\n (treeForkProvider = forkStack[--forkStackIndex]),\n (forkStack[forkStackIndex] = null),\n (treeForkCount = forkStack[--forkStackIndex]),\n (forkStack[forkStackIndex] = null);\n for (; workInProgress === treeContextProvider; )\n (treeContextProvider = idStack[--idStackIndex]),\n (idStack[idStackIndex] = null),\n (treeContextOverflow = idStack[--idStackIndex]),\n (idStack[idStackIndex] = null),\n (treeContextId = idStack[--idStackIndex]),\n (idStack[idStackIndex] = null);\n}\nfunction restoreSuspendedTreeContext(workInProgress, suspendedContext) {\n idStack[idStackIndex++] = treeContextId;\n idStack[idStackIndex++] = treeContextOverflow;\n idStack[idStackIndex++] = treeContextProvider;\n treeContextId = suspendedContext.id;\n treeContextOverflow = suspendedContext.overflow;\n treeContextProvider = workInProgress;\n}\nvar hydrationParentFiber = null,\n nextHydratableInstance = null,\n isHydrating = !1,\n hydrationErrors = null,\n rootOrSingletonContext = !1,\n HydrationMismatchException = Error(formatProdErrorMessage(519));\nfunction throwOnHydrationMismatch(fiber) {\n var error = Error(\n formatProdErrorMessage(\n 418,\n 1 < arguments.length && void 0 !== arguments[1] && arguments[1]\n ? \"text\"\n : \"HTML\",\n \"\"\n )\n );\n queueHydrationError(createCapturedValueAtFiber(error, fiber));\n throw HydrationMismatchException;\n}\nfunction prepareToHydrateHostInstance(fiber) {\n var instance = fiber.stateNode,\n type = fiber.type,\n props = fiber.memoizedProps;\n instance[internalInstanceKey] = fiber;\n instance[internalPropsKey] = props;\n switch (type) {\n case \"dialog\":\n listenToNonDelegatedEvent(\"cancel\", instance);\n listenToNonDelegatedEvent(\"close\", instance);\n break;\n case \"iframe\":\n case \"object\":\n case \"embed\":\n listenToNonDelegatedEvent(\"load\", instance);\n break;\n case \"video\":\n case \"audio\":\n for (type = 0; type < mediaEventTypes.length; type++)\n listenToNonDelegatedEvent(mediaEventTypes[type], instance);\n break;\n case \"source\":\n listenToNonDelegatedEvent(\"error\", instance);\n break;\n case \"img\":\n case \"image\":\n case \"link\":\n listenToNonDelegatedEvent(\"error\", instance);\n listenToNonDelegatedEvent(\"load\", instance);\n break;\n case \"details\":\n listenToNonDelegatedEvent(\"toggle\", instance);\n break;\n case \"input\":\n listenToNonDelegatedEvent(\"invalid\", instance);\n initInput(\n instance,\n props.value,\n props.defaultValue,\n props.checked,\n props.defaultChecked,\n props.type,\n props.name,\n !0\n );\n break;\n case \"select\":\n listenToNonDelegatedEvent(\"invalid\", instance);\n break;\n case \"textarea\":\n listenToNonDelegatedEvent(\"invalid\", instance),\n initTextarea(instance, props.value, props.defaultValue, props.children);\n }\n type = props.children;\n (\"string\" !== typeof type &&\n \"number\" !== typeof type &&\n \"bigint\" !== typeof type) ||\n instance.textContent === \"\" + type ||\n !0 === props.suppressHydrationWarning ||\n checkForUnmatchedText(instance.textContent, type)\n ? (null != props.popover &&\n (listenToNonDelegatedEvent(\"beforetoggle\", instance),\n listenToNonDelegatedEvent(\"toggle\", instance)),\n null != props.onScroll && listenToNonDelegatedEvent(\"scroll\", instance),\n null != props.onScrollEnd &&\n listenToNonDelegatedEvent(\"scrollend\", instance),\n null != props.onClick && (instance.onclick = noop$1),\n (instance = !0))\n : (instance = !1);\n instance || throwOnHydrationMismatch(fiber, !0);\n}\nfunction popToNextHostParent(fiber) {\n for (hydrationParentFiber = fiber.return; hydrationParentFiber; )\n switch (hydrationParentFiber.tag) {\n case 5:\n case 31:\n case 13:\n rootOrSingletonContext = !1;\n return;\n case 27:\n case 3:\n rootOrSingletonContext = !0;\n return;\n default:\n hydrationParentFiber = hydrationParentFiber.return;\n }\n}\nfunction popHydrationState(fiber) {\n if (fiber !== hydrationParentFiber) return !1;\n if (!isHydrating) return popToNextHostParent(fiber), (isHydrating = !0), !1;\n var tag = fiber.tag,\n JSCompiler_temp;\n if ((JSCompiler_temp = 3 !== tag && 27 !== tag)) {\n if ((JSCompiler_temp = 5 === tag))\n (JSCompiler_temp = fiber.type),\n (JSCompiler_temp =\n !(\"form\" !== JSCompiler_temp && \"button\" !== JSCompiler_temp) ||\n shouldSetTextContent(fiber.type, fiber.memoizedProps));\n JSCompiler_temp = !JSCompiler_temp;\n }\n JSCompiler_temp && nextHydratableInstance && throwOnHydrationMismatch(fiber);\n popToNextHostParent(fiber);\n if (13 === tag) {\n fiber = fiber.memoizedState;\n fiber = null !== fiber ? fiber.dehydrated : null;\n if (!fiber) throw Error(formatProdErrorMessage(317));\n nextHydratableInstance =\n getNextHydratableInstanceAfterHydrationBoundary(fiber);\n } else if (31 === tag) {\n fiber = fiber.memoizedState;\n fiber = null !== fiber ? fiber.dehydrated : null;\n if (!fiber) throw Error(formatProdErrorMessage(317));\n nextHydratableInstance =\n getNextHydratableInstanceAfterHydrationBoundary(fiber);\n } else\n 27 === tag\n ? ((tag = nextHydratableInstance),\n isSingletonScope(fiber.type)\n ? ((fiber = previousHydratableOnEnteringScopedSingleton),\n (previousHydratableOnEnteringScopedSingleton = null),\n (nextHydratableInstance = fiber))\n : (nextHydratableInstance = tag))\n : (nextHydratableInstance = hydrationParentFiber\n ? getNextHydratable(fiber.stateNode.nextSibling)\n : null);\n return !0;\n}\nfunction resetHydrationState() {\n nextHydratableInstance = hydrationParentFiber = null;\n isHydrating = !1;\n}\nfunction upgradeHydrationErrorsToRecoverable() {\n var queuedErrors = hydrationErrors;\n null !== queuedErrors &&\n (null === workInProgressRootRecoverableErrors\n ? (workInProgressRootRecoverableErrors = queuedErrors)\n : workInProgressRootRecoverableErrors.push.apply(\n workInProgressRootRecoverableErrors,\n queuedErrors\n ),\n (hydrationErrors = null));\n return queuedErrors;\n}\nfunction queueHydrationError(error) {\n null === hydrationErrors\n ? (hydrationErrors = [error])\n : hydrationErrors.push(error);\n}\nvar valueCursor = createCursor(null),\n currentlyRenderingFiber$1 = null,\n lastContextDependency = null;\nfunction pushProvider(providerFiber, context, nextValue) {\n push(valueCursor, context._currentValue);\n context._currentValue = nextValue;\n}\nfunction popProvider(context) {\n context._currentValue = valueCursor.current;\n pop(valueCursor);\n}\nfunction scheduleContextWorkOnParentPath(parent, renderLanes, propagationRoot) {\n for (; null !== parent; ) {\n var alternate = parent.alternate;\n (parent.childLanes & renderLanes) !== renderLanes\n ? ((parent.childLanes |= renderLanes),\n null !== alternate && (alternate.childLanes |= renderLanes))\n : null !== alternate &&\n (alternate.childLanes & renderLanes) !== renderLanes &&\n (alternate.childLanes |= renderLanes);\n if (parent === propagationRoot) break;\n parent = parent.return;\n }\n}\nfunction propagateContextChanges(\n workInProgress,\n contexts,\n renderLanes,\n forcePropagateEntireTree\n) {\n var fiber = workInProgress.child;\n null !== fiber && (fiber.return = workInProgress);\n for (; null !== fiber; ) {\n var list = fiber.dependencies;\n if (null !== list) {\n var nextFiber = fiber.child;\n list = list.firstContext;\n a: for (; null !== list; ) {\n var dependency = list;\n list = fiber;\n for (var i = 0; i < contexts.length; i++)\n if (dependency.context === contexts[i]) {\n list.lanes |= renderLanes;\n dependency = list.alternate;\n null !== dependency && (dependency.lanes |= renderLanes);\n scheduleContextWorkOnParentPath(\n list.return,\n renderLanes,\n workInProgress\n );\n forcePropagateEntireTree || (nextFiber = null);\n break a;\n }\n list = dependency.next;\n }\n } else if (18 === fiber.tag) {\n nextFiber = fiber.return;\n if (null === nextFiber) throw Error(formatProdErrorMessage(341));\n nextFiber.lanes |= renderLanes;\n list = nextFiber.alternate;\n null !== list && (list.lanes |= renderLanes);\n scheduleContextWorkOnParentPath(nextFiber, renderLanes, workInProgress);\n nextFiber = null;\n } else nextFiber = fiber.child;\n if (null !== nextFiber) nextFiber.return = fiber;\n else\n for (nextFiber = fiber; null !== nextFiber; ) {\n if (nextFiber === workInProgress) {\n nextFiber = null;\n break;\n }\n fiber = nextFiber.sibling;\n if (null !== fiber) {\n fiber.return = nextFiber.return;\n nextFiber = fiber;\n break;\n }\n nextFiber = nextFiber.return;\n }\n fiber = nextFiber;\n }\n}\nfunction propagateParentContextChanges(\n current,\n workInProgress,\n renderLanes,\n forcePropagateEntireTree\n) {\n current = null;\n for (\n var parent = workInProgress, isInsidePropagationBailout = !1;\n null !== parent;\n\n ) {\n if (!isInsidePropagationBailout)\n if (0 !== (parent.flags & 524288)) isInsidePropagationBailout = !0;\n else if (0 !== (parent.flags & 262144)) break;\n if (10 === parent.tag) {\n var currentParent = parent.alternate;\n if (null === currentParent) throw Error(formatProdErrorMessage(387));\n currentParent = currentParent.memoizedProps;\n if (null !== currentParent) {\n var context = parent.type;\n objectIs(parent.pendingProps.value, currentParent.value) ||\n (null !== current ? current.push(context) : (current = [context]));\n }\n } else if (parent === hostTransitionProviderCursor.current) {\n currentParent = parent.alternate;\n if (null === currentParent) throw Error(formatProdErrorMessage(387));\n currentParent.memoizedState.memoizedState !==\n parent.memoizedState.memoizedState &&\n (null !== current\n ? current.push(HostTransitionContext)\n : (current = [HostTransitionContext]));\n }\n parent = parent.return;\n }\n null !== current &&\n propagateContextChanges(\n workInProgress,\n current,\n renderLanes,\n forcePropagateEntireTree\n );\n workInProgress.flags |= 262144;\n}\nfunction checkIfContextChanged(currentDependencies) {\n for (\n currentDependencies = currentDependencies.firstContext;\n null !== currentDependencies;\n\n ) {\n if (\n !objectIs(\n currentDependencies.context._currentValue,\n currentDependencies.memoizedValue\n )\n )\n return !0;\n currentDependencies = currentDependencies.next;\n }\n return !1;\n}\nfunction prepareToReadContext(workInProgress) {\n currentlyRenderingFiber$1 = workInProgress;\n lastContextDependency = null;\n workInProgress = workInProgress.dependencies;\n null !== workInProgress && (workInProgress.firstContext = null);\n}\nfunction readContext(context) {\n return readContextForConsumer(currentlyRenderingFiber$1, context);\n}\nfunction readContextDuringReconciliation(consumer, context) {\n null === currentlyRenderingFiber$1 && prepareToReadContext(consumer);\n return readContextForConsumer(consumer, context);\n}\nfunction readContextForConsumer(consumer, context) {\n var value = context._currentValue;\n context = { context: context, memoizedValue: value, next: null };\n if (null === lastContextDependency) {\n if (null === consumer) throw Error(formatProdErrorMessage(308));\n lastContextDependency = context;\n consumer.dependencies = { lanes: 0, firstContext: context };\n consumer.flags |= 524288;\n } else lastContextDependency = lastContextDependency.next = context;\n return value;\n}\nvar AbortControllerLocal =\n \"undefined\" !== typeof AbortController\n ? AbortController\n : function () {\n var listeners = [],\n signal = (this.signal = {\n aborted: !1,\n addEventListener: function (type, listener) {\n listeners.push(listener);\n }\n });\n this.abort = function () {\n signal.aborted = !0;\n listeners.forEach(function (listener) {\n return listener();\n });\n };\n },\n scheduleCallback$2 = Scheduler.unstable_scheduleCallback,\n NormalPriority = Scheduler.unstable_NormalPriority,\n CacheContext = {\n $$typeof: REACT_CONTEXT_TYPE,\n Consumer: null,\n Provider: null,\n _currentValue: null,\n _currentValue2: null,\n _threadCount: 0\n };\nfunction createCache() {\n return {\n controller: new AbortControllerLocal(),\n data: new Map(),\n refCount: 0\n };\n}\nfunction releaseCache(cache) {\n cache.refCount--;\n 0 === cache.refCount &&\n scheduleCallback$2(NormalPriority, function () {\n cache.controller.abort();\n });\n}\nvar currentEntangledListeners = null,\n currentEntangledPendingCount = 0,\n currentEntangledLane = 0,\n currentEntangledActionThenable = null;\nfunction entangleAsyncAction(transition, thenable) {\n if (null === currentEntangledListeners) {\n var entangledListeners = (currentEntangledListeners = []);\n currentEntangledPendingCount = 0;\n currentEntangledLane = requestTransitionLane();\n currentEntangledActionThenable = {\n status: \"pending\",\n value: void 0,\n then: function (resolve) {\n entangledListeners.push(resolve);\n }\n };\n }\n currentEntangledPendingCount++;\n thenable.then(pingEngtangledActionScope, pingEngtangledActionScope);\n return thenable;\n}\nfunction pingEngtangledActionScope() {\n if (\n 0 === --currentEntangledPendingCount &&\n null !== currentEntangledListeners\n ) {\n null !== currentEntangledActionThenable &&\n (currentEntangledActionThenable.status = \"fulfilled\");\n var listeners = currentEntangledListeners;\n currentEntangledListeners = null;\n currentEntangledLane = 0;\n currentEntangledActionThenable = null;\n for (var i = 0; i < listeners.length; i++) (0, listeners[i])();\n }\n}\nfunction chainThenableValue(thenable, result) {\n var listeners = [],\n thenableWithOverride = {\n status: \"pending\",\n value: null,\n reason: null,\n then: function (resolve) {\n listeners.push(resolve);\n }\n };\n thenable.then(\n function () {\n thenableWithOverride.status = \"fulfilled\";\n thenableWithOverride.value = result;\n for (var i = 0; i < listeners.length; i++) (0, listeners[i])(result);\n },\n function (error) {\n thenableWithOverride.status = \"rejected\";\n thenableWithOverride.reason = error;\n for (error = 0; error < listeners.length; error++)\n (0, listeners[error])(void 0);\n }\n );\n return thenableWithOverride;\n}\nvar prevOnStartTransitionFinish = ReactSharedInternals.S;\nReactSharedInternals.S = function (transition, returnValue) {\n globalMostRecentTransitionTime = now();\n \"object\" === typeof returnValue &&\n null !== returnValue &&\n \"function\" === typeof returnValue.then &&\n entangleAsyncAction(transition, returnValue);\n null !== prevOnStartTransitionFinish &&\n prevOnStartTransitionFinish(transition, returnValue);\n};\nvar resumedCache = createCursor(null);\nfunction peekCacheFromPool() {\n var cacheResumedFromPreviousRender = resumedCache.current;\n return null !== cacheResumedFromPreviousRender\n ? cacheResumedFromPreviousRender\n : workInProgressRoot.pooledCache;\n}\nfunction pushTransition(offscreenWorkInProgress, prevCachePool) {\n null === prevCachePool\n ? push(resumedCache, resumedCache.current)\n : push(resumedCache, prevCachePool.pool);\n}\nfunction getSuspendedCache() {\n var cacheFromPool = peekCacheFromPool();\n return null === cacheFromPool\n ? null\n : { parent: CacheContext._currentValue, pool: cacheFromPool };\n}\nvar SuspenseException = Error(formatProdErrorMessage(460)),\n SuspenseyCommitException = Error(formatProdErrorMessage(474)),\n SuspenseActionException = Error(formatProdErrorMessage(542)),\n noopSuspenseyCommitThenable = { then: function () {} };\nfunction isThenableResolved(thenable) {\n thenable = thenable.status;\n return \"fulfilled\" === thenable || \"rejected\" === thenable;\n}\nfunction trackUsedThenable(thenableState, thenable, index) {\n index = thenableState[index];\n void 0 === index\n ? thenableState.push(thenable)\n : index !== thenable && (thenable.then(noop$1, noop$1), (thenable = index));\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw (\n ((thenableState = thenable.reason),\n checkIfUseWrappedInAsyncCatch(thenableState),\n thenableState)\n );\n default:\n if (\"string\" === typeof thenable.status) thenable.then(noop$1, noop$1);\n else {\n thenableState = workInProgressRoot;\n if (null !== thenableState && 100 < thenableState.shellSuspendCounter)\n throw Error(formatProdErrorMessage(482));\n thenableState = thenable;\n thenableState.status = \"pending\";\n thenableState.then(\n function (fulfilledValue) {\n if (\"pending\" === thenable.status) {\n var fulfilledThenable = thenable;\n fulfilledThenable.status = \"fulfilled\";\n fulfilledThenable.value = fulfilledValue;\n }\n },\n function (error) {\n if (\"pending\" === thenable.status) {\n var rejectedThenable = thenable;\n rejectedThenable.status = \"rejected\";\n rejectedThenable.reason = error;\n }\n }\n );\n }\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw (\n ((thenableState = thenable.reason),\n checkIfUseWrappedInAsyncCatch(thenableState),\n thenableState)\n );\n }\n suspendedThenable = thenable;\n throw SuspenseException;\n }\n}\nfunction resolveLazy(lazyType) {\n try {\n var init = lazyType._init;\n return init(lazyType._payload);\n } catch (x) {\n if (null !== x && \"object\" === typeof x && \"function\" === typeof x.then)\n throw ((suspendedThenable = x), SuspenseException);\n throw x;\n }\n}\nvar suspendedThenable = null;\nfunction getSuspendedThenable() {\n if (null === suspendedThenable) throw Error(formatProdErrorMessage(459));\n var thenable = suspendedThenable;\n suspendedThenable = null;\n return thenable;\n}\nfunction checkIfUseWrappedInAsyncCatch(rejectedReason) {\n if (\n rejectedReason === SuspenseException ||\n rejectedReason === SuspenseActionException\n )\n throw Error(formatProdErrorMessage(483));\n}\nvar thenableState$1 = null,\n thenableIndexCounter$1 = 0;\nfunction unwrapThenable(thenable) {\n var index = thenableIndexCounter$1;\n thenableIndexCounter$1 += 1;\n null === thenableState$1 && (thenableState$1 = []);\n return trackUsedThenable(thenableState$1, thenable, index);\n}\nfunction coerceRef(workInProgress, element) {\n element = element.props.ref;\n workInProgress.ref = void 0 !== element ? element : null;\n}\nfunction throwOnInvalidObjectTypeImpl(returnFiber, newChild) {\n if (newChild.$$typeof === REACT_LEGACY_ELEMENT_TYPE)\n throw Error(formatProdErrorMessage(525));\n returnFiber = Object.prototype.toString.call(newChild);\n throw Error(\n formatProdErrorMessage(\n 31,\n \"[object Object]\" === returnFiber\n ? \"object with keys {\" + Object.keys(newChild).join(\", \") + \"}\"\n : returnFiber\n )\n );\n}\nfunction createChildReconciler(shouldTrackSideEffects) {\n function deleteChild(returnFiber, childToDelete) {\n if (shouldTrackSideEffects) {\n var deletions = returnFiber.deletions;\n null === deletions\n ? ((returnFiber.deletions = [childToDelete]), (returnFiber.flags |= 16))\n : deletions.push(childToDelete);\n }\n }\n function deleteRemainingChildren(returnFiber, currentFirstChild) {\n if (!shouldTrackSideEffects) return null;\n for (; null !== currentFirstChild; )\n deleteChild(returnFiber, currentFirstChild),\n (currentFirstChild = currentFirstChild.sibling);\n return null;\n }\n function mapRemainingChildren(currentFirstChild) {\n for (var existingChildren = new Map(); null !== currentFirstChild; )\n null !== currentFirstChild.key\n ? existingChildren.set(currentFirstChild.key, currentFirstChild)\n : existingChildren.set(currentFirstChild.index, currentFirstChild),\n (currentFirstChild = currentFirstChild.sibling);\n return existingChildren;\n }\n function useFiber(fiber, pendingProps) {\n fiber = createWorkInProgress(fiber, pendingProps);\n fiber.index = 0;\n fiber.sibling = null;\n return fiber;\n }\n function placeChild(newFiber, lastPlacedIndex, newIndex) {\n newFiber.index = newIndex;\n if (!shouldTrackSideEffects)\n return (newFiber.flags |= 1048576), lastPlacedIndex;\n newIndex = newFiber.alternate;\n if (null !== newIndex)\n return (\n (newIndex = newIndex.index),\n newIndex < lastPlacedIndex\n ? ((newFiber.flags |= 67108866), lastPlacedIndex)\n : newIndex\n );\n newFiber.flags |= 67108866;\n return lastPlacedIndex;\n }\n function placeSingleChild(newFiber) {\n shouldTrackSideEffects &&\n null === newFiber.alternate &&\n (newFiber.flags |= 67108866);\n return newFiber;\n }\n function updateTextNode(returnFiber, current, textContent, lanes) {\n if (null === current || 6 !== current.tag)\n return (\n (current = createFiberFromText(textContent, returnFiber.mode, lanes)),\n (current.return = returnFiber),\n current\n );\n current = useFiber(current, textContent);\n current.return = returnFiber;\n return current;\n }\n function updateElement(returnFiber, current, element, lanes) {\n var elementType = element.type;\n if (elementType === REACT_FRAGMENT_TYPE)\n return updateFragment(\n returnFiber,\n current,\n element.props.children,\n lanes,\n element.key\n );\n if (\n null !== current &&\n (current.elementType === elementType ||\n (\"object\" === typeof elementType &&\n null !== elementType &&\n elementType.$$typeof === REACT_LAZY_TYPE &&\n resolveLazy(elementType) === current.type))\n )\n return (\n (current = useFiber(current, element.props)),\n coerceRef(current, element),\n (current.return = returnFiber),\n current\n );\n current = createFiberFromTypeAndProps(\n element.type,\n element.key,\n element.props,\n null,\n returnFiber.mode,\n lanes\n );\n coerceRef(current, element);\n current.return = returnFiber;\n return current;\n }\n function updatePortal(returnFiber, current, portal, lanes) {\n if (\n null === current ||\n 4 !== current.tag ||\n current.stateNode.containerInfo !== portal.containerInfo ||\n current.stateNode.implementation !== portal.implementation\n )\n return (\n (current = createFiberFromPortal(portal, returnFiber.mode, lanes)),\n (current.return = returnFiber),\n current\n );\n current = useFiber(current, portal.children || []);\n current.return = returnFiber;\n return current;\n }\n function updateFragment(returnFiber, current, fragment, lanes, key) {\n if (null === current || 7 !== current.tag)\n return (\n (current = createFiberFromFragment(\n fragment,\n returnFiber.mode,\n lanes,\n key\n )),\n (current.return = returnFiber),\n current\n );\n current = useFiber(current, fragment);\n current.return = returnFiber;\n return current;\n }\n function createChild(returnFiber, newChild, lanes) {\n if (\n (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n )\n return (\n (newChild = createFiberFromText(\n \"\" + newChild,\n returnFiber.mode,\n lanes\n )),\n (newChild.return = returnFiber),\n newChild\n );\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return (\n (lanes = createFiberFromTypeAndProps(\n newChild.type,\n newChild.key,\n newChild.props,\n null,\n returnFiber.mode,\n lanes\n )),\n coerceRef(lanes, newChild),\n (lanes.return = returnFiber),\n lanes\n );\n case REACT_PORTAL_TYPE:\n return (\n (newChild = createFiberFromPortal(\n newChild,\n returnFiber.mode,\n lanes\n )),\n (newChild.return = returnFiber),\n newChild\n );\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n createChild(returnFiber, newChild, lanes)\n );\n }\n if (isArrayImpl(newChild) || getIteratorFn(newChild))\n return (\n (newChild = createFiberFromFragment(\n newChild,\n returnFiber.mode,\n lanes,\n null\n )),\n (newChild.return = returnFiber),\n newChild\n );\n if (\"function\" === typeof newChild.then)\n return createChild(returnFiber, unwrapThenable(newChild), lanes);\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return createChild(\n returnFiber,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return null;\n }\n function updateSlot(returnFiber, oldFiber, newChild, lanes) {\n var key = null !== oldFiber ? oldFiber.key : null;\n if (\n (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n )\n return null !== key\n ? null\n : updateTextNode(returnFiber, oldFiber, \"\" + newChild, lanes);\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return newChild.key === key\n ? updateElement(returnFiber, oldFiber, newChild, lanes)\n : null;\n case REACT_PORTAL_TYPE:\n return newChild.key === key\n ? updatePortal(returnFiber, oldFiber, newChild, lanes)\n : null;\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n updateSlot(returnFiber, oldFiber, newChild, lanes)\n );\n }\n if (isArrayImpl(newChild) || getIteratorFn(newChild))\n return null !== key\n ? null\n : updateFragment(returnFiber, oldFiber, newChild, lanes, null);\n if (\"function\" === typeof newChild.then)\n return updateSlot(\n returnFiber,\n oldFiber,\n unwrapThenable(newChild),\n lanes\n );\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return updateSlot(\n returnFiber,\n oldFiber,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return null;\n }\n function updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n newChild,\n lanes\n ) {\n if (\n (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n )\n return (\n (existingChildren = existingChildren.get(newIdx) || null),\n updateTextNode(returnFiber, existingChildren, \"\" + newChild, lanes)\n );\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return (\n (existingChildren =\n existingChildren.get(\n null === newChild.key ? newIdx : newChild.key\n ) || null),\n updateElement(returnFiber, existingChildren, newChild, lanes)\n );\n case REACT_PORTAL_TYPE:\n return (\n (existingChildren =\n existingChildren.get(\n null === newChild.key ? newIdx : newChild.key\n ) || null),\n updatePortal(returnFiber, existingChildren, newChild, lanes)\n );\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n newChild,\n lanes\n )\n );\n }\n if (isArrayImpl(newChild) || getIteratorFn(newChild))\n return (\n (existingChildren = existingChildren.get(newIdx) || null),\n updateFragment(returnFiber, existingChildren, newChild, lanes, null)\n );\n if (\"function\" === typeof newChild.then)\n return updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n unwrapThenable(newChild),\n lanes\n );\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return null;\n }\n function reconcileChildrenArray(\n returnFiber,\n currentFirstChild,\n newChildren,\n lanes\n ) {\n for (\n var resultingFirstChild = null,\n previousNewFiber = null,\n oldFiber = currentFirstChild,\n newIdx = (currentFirstChild = 0),\n nextOldFiber = null;\n null !== oldFiber && newIdx < newChildren.length;\n newIdx++\n ) {\n oldFiber.index > newIdx\n ? ((nextOldFiber = oldFiber), (oldFiber = null))\n : (nextOldFiber = oldFiber.sibling);\n var newFiber = updateSlot(\n returnFiber,\n oldFiber,\n newChildren[newIdx],\n lanes\n );\n if (null === newFiber) {\n null === oldFiber && (oldFiber = nextOldFiber);\n break;\n }\n shouldTrackSideEffects &&\n oldFiber &&\n null === newFiber.alternate &&\n deleteChild(returnFiber, oldFiber);\n currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);\n null === previousNewFiber\n ? (resultingFirstChild = newFiber)\n : (previousNewFiber.sibling = newFiber);\n previousNewFiber = newFiber;\n oldFiber = nextOldFiber;\n }\n if (newIdx === newChildren.length)\n return (\n deleteRemainingChildren(returnFiber, oldFiber),\n isHydrating && pushTreeFork(returnFiber, newIdx),\n resultingFirstChild\n );\n if (null === oldFiber) {\n for (; newIdx < newChildren.length; newIdx++)\n (oldFiber = createChild(returnFiber, newChildren[newIdx], lanes)),\n null !== oldFiber &&\n ((currentFirstChild = placeChild(\n oldFiber,\n currentFirstChild,\n newIdx\n )),\n null === previousNewFiber\n ? (resultingFirstChild = oldFiber)\n : (previousNewFiber.sibling = oldFiber),\n (previousNewFiber = oldFiber));\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n for (\n oldFiber = mapRemainingChildren(oldFiber);\n newIdx < newChildren.length;\n newIdx++\n )\n (nextOldFiber = updateFromMap(\n oldFiber,\n returnFiber,\n newIdx,\n newChildren[newIdx],\n lanes\n )),\n null !== nextOldFiber &&\n (shouldTrackSideEffects &&\n null !== nextOldFiber.alternate &&\n oldFiber.delete(\n null === nextOldFiber.key ? newIdx : nextOldFiber.key\n ),\n (currentFirstChild = placeChild(\n nextOldFiber,\n currentFirstChild,\n newIdx\n )),\n null === previousNewFiber\n ? (resultingFirstChild = nextOldFiber)\n : (previousNewFiber.sibling = nextOldFiber),\n (previousNewFiber = nextOldFiber));\n shouldTrackSideEffects &&\n oldFiber.forEach(function (child) {\n return deleteChild(returnFiber, child);\n });\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n function reconcileChildrenIterator(\n returnFiber,\n currentFirstChild,\n newChildren,\n lanes\n ) {\n if (null == newChildren) throw Error(formatProdErrorMessage(151));\n for (\n var resultingFirstChild = null,\n previousNewFiber = null,\n oldFiber = currentFirstChild,\n newIdx = (currentFirstChild = 0),\n nextOldFiber = null,\n step = newChildren.next();\n null !== oldFiber && !step.done;\n newIdx++, step = newChildren.next()\n ) {\n oldFiber.index > newIdx\n ? ((nextOldFiber = oldFiber), (oldFiber = null))\n : (nextOldFiber = oldFiber.sibling);\n var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes);\n if (null === newFiber) {\n null === oldFiber && (oldFiber = nextOldFiber);\n break;\n }\n shouldTrackSideEffects &&\n oldFiber &&\n null === newFiber.alternate &&\n deleteChild(returnFiber, oldFiber);\n currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);\n null === previousNewFiber\n ? (resultingFirstChild = newFiber)\n : (previousNewFiber.sibling = newFiber);\n previousNewFiber = newFiber;\n oldFiber = nextOldFiber;\n }\n if (step.done)\n return (\n deleteRemainingChildren(returnFiber, oldFiber),\n isHydrating && pushTreeFork(returnFiber, newIdx),\n resultingFirstChild\n );\n if (null === oldFiber) {\n for (; !step.done; newIdx++, step = newChildren.next())\n (step = createChild(returnFiber, step.value, lanes)),\n null !== step &&\n ((currentFirstChild = placeChild(step, currentFirstChild, newIdx)),\n null === previousNewFiber\n ? (resultingFirstChild = step)\n : (previousNewFiber.sibling = step),\n (previousNewFiber = step));\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n for (\n oldFiber = mapRemainingChildren(oldFiber);\n !step.done;\n newIdx++, step = newChildren.next()\n )\n (step = updateFromMap(oldFiber, returnFiber, newIdx, step.value, lanes)),\n null !== step &&\n (shouldTrackSideEffects &&\n null !== step.alternate &&\n oldFiber.delete(null === step.key ? newIdx : step.key),\n (currentFirstChild = placeChild(step, currentFirstChild, newIdx)),\n null === previousNewFiber\n ? (resultingFirstChild = step)\n : (previousNewFiber.sibling = step),\n (previousNewFiber = step));\n shouldTrackSideEffects &&\n oldFiber.forEach(function (child) {\n return deleteChild(returnFiber, child);\n });\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n function reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n ) {\n \"object\" === typeof newChild &&\n null !== newChild &&\n newChild.type === REACT_FRAGMENT_TYPE &&\n null === newChild.key &&\n (newChild = newChild.props.children);\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n a: {\n for (var key = newChild.key; null !== currentFirstChild; ) {\n if (currentFirstChild.key === key) {\n key = newChild.type;\n if (key === REACT_FRAGMENT_TYPE) {\n if (7 === currentFirstChild.tag) {\n deleteRemainingChildren(\n returnFiber,\n currentFirstChild.sibling\n );\n lanes = useFiber(\n currentFirstChild,\n newChild.props.children\n );\n lanes.return = returnFiber;\n returnFiber = lanes;\n break a;\n }\n } else if (\n currentFirstChild.elementType === key ||\n (\"object\" === typeof key &&\n null !== key &&\n key.$$typeof === REACT_LAZY_TYPE &&\n resolveLazy(key) === currentFirstChild.type)\n ) {\n deleteRemainingChildren(\n returnFiber,\n currentFirstChild.sibling\n );\n lanes = useFiber(currentFirstChild, newChild.props);\n coerceRef(lanes, newChild);\n lanes.return = returnFiber;\n returnFiber = lanes;\n break a;\n }\n deleteRemainingChildren(returnFiber, currentFirstChild);\n break;\n } else deleteChild(returnFiber, currentFirstChild);\n currentFirstChild = currentFirstChild.sibling;\n }\n newChild.type === REACT_FRAGMENT_TYPE\n ? ((lanes = createFiberFromFragment(\n newChild.props.children,\n returnFiber.mode,\n lanes,\n newChild.key\n )),\n (lanes.return = returnFiber),\n (returnFiber = lanes))\n : ((lanes = createFiberFromTypeAndProps(\n newChild.type,\n newChild.key,\n newChild.props,\n null,\n returnFiber.mode,\n lanes\n )),\n coerceRef(lanes, newChild),\n (lanes.return = returnFiber),\n (returnFiber = lanes));\n }\n return placeSingleChild(returnFiber);\n case REACT_PORTAL_TYPE:\n a: {\n for (key = newChild.key; null !== currentFirstChild; ) {\n if (currentFirstChild.key === key)\n if (\n 4 === currentFirstChild.tag &&\n currentFirstChild.stateNode.containerInfo ===\n newChild.containerInfo &&\n currentFirstChild.stateNode.implementation ===\n newChild.implementation\n ) {\n deleteRemainingChildren(\n returnFiber,\n currentFirstChild.sibling\n );\n lanes = useFiber(currentFirstChild, newChild.children || []);\n lanes.return = returnFiber;\n returnFiber = lanes;\n break a;\n } else {\n deleteRemainingChildren(returnFiber, currentFirstChild);\n break;\n }\n else deleteChild(returnFiber, currentFirstChild);\n currentFirstChild = currentFirstChild.sibling;\n }\n lanes = createFiberFromPortal(newChild, returnFiber.mode, lanes);\n lanes.return = returnFiber;\n returnFiber = lanes;\n }\n return placeSingleChild(returnFiber);\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n )\n );\n }\n if (isArrayImpl(newChild))\n return reconcileChildrenArray(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n );\n if (getIteratorFn(newChild)) {\n key = getIteratorFn(newChild);\n if (\"function\" !== typeof key) throw Error(formatProdErrorMessage(150));\n newChild = key.call(newChild);\n return reconcileChildrenIterator(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n );\n }\n if (\"function\" === typeof newChild.then)\n return reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n unwrapThenable(newChild),\n lanes\n );\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n ? ((newChild = \"\" + newChild),\n null !== currentFirstChild && 6 === currentFirstChild.tag\n ? (deleteRemainingChildren(returnFiber, currentFirstChild.sibling),\n (lanes = useFiber(currentFirstChild, newChild)),\n (lanes.return = returnFiber),\n (returnFiber = lanes))\n : (deleteRemainingChildren(returnFiber, currentFirstChild),\n (lanes = createFiberFromText(newChild, returnFiber.mode, lanes)),\n (lanes.return = returnFiber),\n (returnFiber = lanes)),\n placeSingleChild(returnFiber))\n : deleteRemainingChildren(returnFiber, currentFirstChild);\n }\n return function (returnFiber, currentFirstChild, newChild, lanes) {\n try {\n thenableIndexCounter$1 = 0;\n var firstChildFiber = reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n );\n thenableState$1 = null;\n return firstChildFiber;\n } catch (x) {\n if (x === SuspenseException || x === SuspenseActionException) throw x;\n var fiber = createFiberImplClass(29, x, null, returnFiber.mode);\n fiber.lanes = lanes;\n fiber.return = returnFiber;\n return fiber;\n } finally {\n }\n };\n}\nvar reconcileChildFibers = createChildReconciler(!0),\n mountChildFibers = createChildReconciler(!1),\n hasForceUpdate = !1;\nfunction initializeUpdateQueue(fiber) {\n fiber.updateQueue = {\n baseState: fiber.memoizedState,\n firstBaseUpdate: null,\n lastBaseUpdate: null,\n shared: { pending: null, lanes: 0, hiddenCallbacks: null },\n callbacks: null\n };\n}\nfunction cloneUpdateQueue(current, workInProgress) {\n current = current.updateQueue;\n workInProgress.updateQueue === current &&\n (workInProgress.updateQueue = {\n baseState: current.baseState,\n firstBaseUpdate: current.firstBaseUpdate,\n lastBaseUpdate: current.lastBaseUpdate,\n shared: current.shared,\n callbacks: null\n });\n}\nfunction createUpdate(lane) {\n return { lane: lane, tag: 0, payload: null, callback: null, next: null };\n}\nfunction enqueueUpdate(fiber, update, lane) {\n var updateQueue = fiber.updateQueue;\n if (null === updateQueue) return null;\n updateQueue = updateQueue.shared;\n if (0 !== (executionContext & 2)) {\n var pending = updateQueue.pending;\n null === pending\n ? (update.next = update)\n : ((update.next = pending.next), (pending.next = update));\n updateQueue.pending = update;\n update = getRootForUpdatedFiber(fiber);\n markUpdateLaneFromFiberToRoot(fiber, null, lane);\n return update;\n }\n enqueueUpdate$1(fiber, updateQueue, update, lane);\n return getRootForUpdatedFiber(fiber);\n}\nfunction entangleTransitions(root, fiber, lane) {\n fiber = fiber.updateQueue;\n if (null !== fiber && ((fiber = fiber.shared), 0 !== (lane & 4194048))) {\n var queueLanes = fiber.lanes;\n queueLanes &= root.pendingLanes;\n lane |= queueLanes;\n fiber.lanes = lane;\n markRootEntangled(root, lane);\n }\n}\nfunction enqueueCapturedUpdate(workInProgress, capturedUpdate) {\n var queue = workInProgress.updateQueue,\n current = workInProgress.alternate;\n if (\n null !== current &&\n ((current = current.updateQueue), queue === current)\n ) {\n var newFirst = null,\n newLast = null;\n queue = queue.firstBaseUpdate;\n if (null !== queue) {\n do {\n var clone = {\n lane: queue.lane,\n tag: queue.tag,\n payload: queue.payload,\n callback: null,\n next: null\n };\n null === newLast\n ? (newFirst = newLast = clone)\n : (newLast = newLast.next = clone);\n queue = queue.next;\n } while (null !== queue);\n null === newLast\n ? (newFirst = newLast = capturedUpdate)\n : (newLast = newLast.next = capturedUpdate);\n } else newFirst = newLast = capturedUpdate;\n queue = {\n baseState: current.baseState,\n firstBaseUpdate: newFirst,\n lastBaseUpdate: newLast,\n shared: current.shared,\n callbacks: current.callbacks\n };\n workInProgress.updateQueue = queue;\n return;\n }\n workInProgress = queue.lastBaseUpdate;\n null === workInProgress\n ? (queue.firstBaseUpdate = capturedUpdate)\n : (workInProgress.next = capturedUpdate);\n queue.lastBaseUpdate = capturedUpdate;\n}\nvar didReadFromEntangledAsyncAction = !1;\nfunction suspendIfUpdateReadFromEntangledAsyncAction() {\n if (didReadFromEntangledAsyncAction) {\n var entangledActionThenable = currentEntangledActionThenable;\n if (null !== entangledActionThenable) throw entangledActionThenable;\n }\n}\nfunction processUpdateQueue(\n workInProgress$jscomp$0,\n props,\n instance$jscomp$0,\n renderLanes\n) {\n didReadFromEntangledAsyncAction = !1;\n var queue = workInProgress$jscomp$0.updateQueue;\n hasForceUpdate = !1;\n var firstBaseUpdate = queue.firstBaseUpdate,\n lastBaseUpdate = queue.lastBaseUpdate,\n pendingQueue = queue.shared.pending;\n if (null !== pendingQueue) {\n queue.shared.pending = null;\n var lastPendingUpdate = pendingQueue,\n firstPendingUpdate = lastPendingUpdate.next;\n lastPendingUpdate.next = null;\n null === lastBaseUpdate\n ? (firstBaseUpdate = firstPendingUpdate)\n : (lastBaseUpdate.next = firstPendingUpdate);\n lastBaseUpdate = lastPendingUpdate;\n var current = workInProgress$jscomp$0.alternate;\n null !== current &&\n ((current = current.updateQueue),\n (pendingQueue = current.lastBaseUpdate),\n pendingQueue !== lastBaseUpdate &&\n (null === pendingQueue\n ? (current.firstBaseUpdate = firstPendingUpdate)\n : (pendingQueue.next = firstPendingUpdate),\n (current.lastBaseUpdate = lastPendingUpdate)));\n }\n if (null !== firstBaseUpdate) {\n var newState = queue.baseState;\n lastBaseUpdate = 0;\n current = firstPendingUpdate = lastPendingUpdate = null;\n pendingQueue = firstBaseUpdate;\n do {\n var updateLane = pendingQueue.lane & -536870913,\n isHiddenUpdate = updateLane !== pendingQueue.lane;\n if (\n isHiddenUpdate\n ? (workInProgressRootRenderLanes & updateLane) === updateLane\n : (renderLanes & updateLane) === updateLane\n ) {\n 0 !== updateLane &&\n updateLane === currentEntangledLane &&\n (didReadFromEntangledAsyncAction = !0);\n null !== current &&\n (current = current.next =\n {\n lane: 0,\n tag: pendingQueue.tag,\n payload: pendingQueue.payload,\n callback: null,\n next: null\n });\n a: {\n var workInProgress = workInProgress$jscomp$0,\n update = pendingQueue;\n updateLane = props;\n var instance = instance$jscomp$0;\n switch (update.tag) {\n case 1:\n workInProgress = update.payload;\n if (\"function\" === typeof workInProgress) {\n newState = workInProgress.call(instance, newState, updateLane);\n break a;\n }\n newState = workInProgress;\n break a;\n case 3:\n workInProgress.flags = (workInProgress.flags & -65537) | 128;\n case 0:\n workInProgress = update.payload;\n updateLane =\n \"function\" === typeof workInProgress\n ? workInProgress.call(instance, newState, updateLane)\n : workInProgress;\n if (null === updateLane || void 0 === updateLane) break a;\n newState = assign({}, newState, updateLane);\n break a;\n case 2:\n hasForceUpdate = !0;\n }\n }\n updateLane = pendingQueue.callback;\n null !== updateLane &&\n ((workInProgress$jscomp$0.flags |= 64),\n isHiddenUpdate && (workInProgress$jscomp$0.flags |= 8192),\n (isHiddenUpdate = queue.callbacks),\n null === isHiddenUpdate\n ? (queue.callbacks = [updateLane])\n : isHiddenUpdate.push(updateLane));\n } else\n (isHiddenUpdate = {\n lane: updateLane,\n tag: pendingQueue.tag,\n payload: pendingQueue.payload,\n callback: pendingQueue.callback,\n next: null\n }),\n null === current\n ? ((firstPendingUpdate = current = isHiddenUpdate),\n (lastPendingUpdate = newState))\n : (current = current.next = isHiddenUpdate),\n (lastBaseUpdate |= updateLane);\n pendingQueue = pendingQueue.next;\n if (null === pendingQueue)\n if (((pendingQueue = queue.shared.pending), null === pendingQueue))\n break;\n else\n (isHiddenUpdate = pendingQueue),\n (pendingQueue = isHiddenUpdate.next),\n (isHiddenUpdate.next = null),\n (queue.lastBaseUpdate = isHiddenUpdate),\n (queue.shared.pending = null);\n } while (1);\n null === current && (lastPendingUpdate = newState);\n queue.baseState = lastPendingUpdate;\n queue.firstBaseUpdate = firstPendingUpdate;\n queue.lastBaseUpdate = current;\n null === firstBaseUpdate && (queue.shared.lanes = 0);\n workInProgressRootSkippedLanes |= lastBaseUpdate;\n workInProgress$jscomp$0.lanes = lastBaseUpdate;\n workInProgress$jscomp$0.memoizedState = newState;\n }\n}\nfunction callCallback(callback, context) {\n if (\"function\" !== typeof callback)\n throw Error(formatProdErrorMessage(191, callback));\n callback.call(context);\n}\nfunction commitCallbacks(updateQueue, context) {\n var callbacks = updateQueue.callbacks;\n if (null !== callbacks)\n for (\n updateQueue.callbacks = null, updateQueue = 0;\n updateQueue < callbacks.length;\n updateQueue++\n )\n callCallback(callbacks[updateQueue], context);\n}\nvar currentTreeHiddenStackCursor = createCursor(null),\n prevEntangledRenderLanesCursor = createCursor(0);\nfunction pushHiddenContext(fiber, context) {\n fiber = entangledRenderLanes;\n push(prevEntangledRenderLanesCursor, fiber);\n push(currentTreeHiddenStackCursor, context);\n entangledRenderLanes = fiber | context.baseLanes;\n}\nfunction reuseHiddenContextOnStack() {\n push(prevEntangledRenderLanesCursor, entangledRenderLanes);\n push(currentTreeHiddenStackCursor, currentTreeHiddenStackCursor.current);\n}\nfunction popHiddenContext() {\n entangledRenderLanes = prevEntangledRenderLanesCursor.current;\n pop(currentTreeHiddenStackCursor);\n pop(prevEntangledRenderLanesCursor);\n}\nvar suspenseHandlerStackCursor = createCursor(null),\n shellBoundary = null;\nfunction pushPrimaryTreeSuspenseHandler(handler) {\n var current = handler.alternate;\n push(suspenseStackCursor, suspenseStackCursor.current & 1);\n push(suspenseHandlerStackCursor, handler);\n null === shellBoundary &&\n (null === current || null !== currentTreeHiddenStackCursor.current\n ? (shellBoundary = handler)\n : null !== current.memoizedState && (shellBoundary = handler));\n}\nfunction pushDehydratedActivitySuspenseHandler(fiber) {\n push(suspenseStackCursor, suspenseStackCursor.current);\n push(suspenseHandlerStackCursor, fiber);\n null === shellBoundary && (shellBoundary = fiber);\n}\nfunction pushOffscreenSuspenseHandler(fiber) {\n 22 === fiber.tag\n ? (push(suspenseStackCursor, suspenseStackCursor.current),\n push(suspenseHandlerStackCursor, fiber),\n null === shellBoundary && (shellBoundary = fiber))\n : reuseSuspenseHandlerOnStack(fiber);\n}\nfunction reuseSuspenseHandlerOnStack() {\n push(suspenseStackCursor, suspenseStackCursor.current);\n push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current);\n}\nfunction popSuspenseHandler(fiber) {\n pop(suspenseHandlerStackCursor);\n shellBoundary === fiber && (shellBoundary = null);\n pop(suspenseStackCursor);\n}\nvar suspenseStackCursor = createCursor(0);\nfunction findFirstSuspended(row) {\n for (var node = row; null !== node; ) {\n if (13 === node.tag) {\n var state = node.memoizedState;\n if (\n null !== state &&\n ((state = state.dehydrated),\n null === state ||\n isSuspenseInstancePending(state) ||\n isSuspenseInstanceFallback(state))\n )\n return node;\n } else if (\n 19 === node.tag &&\n (\"forwards\" === node.memoizedProps.revealOrder ||\n \"backwards\" === node.memoizedProps.revealOrder ||\n \"unstable_legacy-backwards\" === node.memoizedProps.revealOrder ||\n \"together\" === node.memoizedProps.revealOrder)\n ) {\n if (0 !== (node.flags & 128)) return node;\n } else if (null !== node.child) {\n node.child.return = node;\n node = node.child;\n continue;\n }\n if (node === row) break;\n for (; null === node.sibling; ) {\n if (null === node.return || node.return === row) return null;\n node = node.return;\n }\n node.sibling.return = node.return;\n node = node.sibling;\n }\n return null;\n}\nvar renderLanes = 0,\n currentlyRenderingFiber = null,\n currentHook = null,\n workInProgressHook = null,\n didScheduleRenderPhaseUpdate = !1,\n didScheduleRenderPhaseUpdateDuringThisPass = !1,\n shouldDoubleInvokeUserFnsInHooksDEV = !1,\n localIdCounter = 0,\n thenableIndexCounter = 0,\n thenableState = null,\n globalClientIdCounter = 0;\nfunction throwInvalidHookError() {\n throw Error(formatProdErrorMessage(321));\n}\nfunction areHookInputsEqual(nextDeps, prevDeps) {\n if (null === prevDeps) return !1;\n for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++)\n if (!objectIs(nextDeps[i], prevDeps[i])) return !1;\n return !0;\n}\nfunction renderWithHooks(\n current,\n workInProgress,\n Component,\n props,\n secondArg,\n nextRenderLanes\n) {\n renderLanes = nextRenderLanes;\n currentlyRenderingFiber = workInProgress;\n workInProgress.memoizedState = null;\n workInProgress.updateQueue = null;\n workInProgress.lanes = 0;\n ReactSharedInternals.H =\n null === current || null === current.memoizedState\n ? HooksDispatcherOnMount\n : HooksDispatcherOnUpdate;\n shouldDoubleInvokeUserFnsInHooksDEV = !1;\n nextRenderLanes = Component(props, secondArg);\n shouldDoubleInvokeUserFnsInHooksDEV = !1;\n didScheduleRenderPhaseUpdateDuringThisPass &&\n (nextRenderLanes = renderWithHooksAgain(\n workInProgress,\n Component,\n props,\n secondArg\n ));\n finishRenderingHooks(current);\n return nextRenderLanes;\n}\nfunction finishRenderingHooks(current) {\n ReactSharedInternals.H = ContextOnlyDispatcher;\n var didRenderTooFewHooks = null !== currentHook && null !== currentHook.next;\n renderLanes = 0;\n workInProgressHook = currentHook = currentlyRenderingFiber = null;\n didScheduleRenderPhaseUpdate = !1;\n thenableIndexCounter = 0;\n thenableState = null;\n if (didRenderTooFewHooks) throw Error(formatProdErrorMessage(300));\n null === current ||\n didReceiveUpdate ||\n ((current = current.dependencies),\n null !== current &&\n checkIfContextChanged(current) &&\n (didReceiveUpdate = !0));\n}\nfunction renderWithHooksAgain(workInProgress, Component, props, secondArg) {\n currentlyRenderingFiber = workInProgress;\n var numberOfReRenders = 0;\n do {\n didScheduleRenderPhaseUpdateDuringThisPass && (thenableState = null);\n thenableIndexCounter = 0;\n didScheduleRenderPhaseUpdateDuringThisPass = !1;\n if (25 <= numberOfReRenders) throw Error(formatProdErrorMessage(301));\n numberOfReRenders += 1;\n workInProgressHook = currentHook = null;\n if (null != workInProgress.updateQueue) {\n var children = workInProgress.updateQueue;\n children.lastEffect = null;\n children.events = null;\n children.stores = null;\n null != children.memoCache && (children.memoCache.index = 0);\n }\n ReactSharedInternals.H = HooksDispatcherOnRerender;\n children = Component(props, secondArg);\n } while (didScheduleRenderPhaseUpdateDuringThisPass);\n return children;\n}\nfunction TransitionAwareHostComponent() {\n var dispatcher = ReactSharedInternals.H,\n maybeThenable = dispatcher.useState()[0];\n maybeThenable =\n \"function\" === typeof maybeThenable.then\n ? useThenable(maybeThenable)\n : maybeThenable;\n dispatcher = dispatcher.useState()[0];\n (null !== currentHook ? currentHook.memoizedState : null) !== dispatcher &&\n (currentlyRenderingFiber.flags |= 1024);\n return maybeThenable;\n}\nfunction checkDidRenderIdHook() {\n var didRenderIdHook = 0 !== localIdCounter;\n localIdCounter = 0;\n return didRenderIdHook;\n}\nfunction bailoutHooks(current, workInProgress, lanes) {\n workInProgress.updateQueue = current.updateQueue;\n workInProgress.flags &= -2053;\n current.lanes &= ~lanes;\n}\nfunction resetHooksOnUnwind(workInProgress) {\n if (didScheduleRenderPhaseUpdate) {\n for (\n workInProgress = workInProgress.memoizedState;\n null !== workInProgress;\n\n ) {\n var queue = workInProgress.queue;\n null !== queue && (queue.pending = null);\n workInProgress = workInProgress.next;\n }\n didScheduleRenderPhaseUpdate = !1;\n }\n renderLanes = 0;\n workInProgressHook = currentHook = currentlyRenderingFiber = null;\n didScheduleRenderPhaseUpdateDuringThisPass = !1;\n thenableIndexCounter = localIdCounter = 0;\n thenableState = null;\n}\nfunction mountWorkInProgressHook() {\n var hook = {\n memoizedState: null,\n baseState: null,\n baseQueue: null,\n queue: null,\n next: null\n };\n null === workInProgressHook\n ? (currentlyRenderingFiber.memoizedState = workInProgressHook = hook)\n : (workInProgressHook = workInProgressHook.next = hook);\n return workInProgressHook;\n}\nfunction updateWorkInProgressHook() {\n if (null === currentHook) {\n var nextCurrentHook = currentlyRenderingFiber.alternate;\n nextCurrentHook =\n null !== nextCurrentHook ? nextCurrentHook.memoizedState : null;\n } else nextCurrentHook = currentHook.next;\n var nextWorkInProgressHook =\n null === workInProgressHook\n ? currentlyRenderingFiber.memoizedState\n : workInProgressHook.next;\n if (null !== nextWorkInProgressHook)\n (workInProgressHook = nextWorkInProgressHook),\n (currentHook = nextCurrentHook);\n else {\n if (null === nextCurrentHook) {\n if (null === currentlyRenderingFiber.alternate)\n throw Error(formatProdErrorMessage(467));\n throw Error(formatProdErrorMessage(310));\n }\n currentHook = nextCurrentHook;\n nextCurrentHook = {\n memoizedState: currentHook.memoizedState,\n baseState: currentHook.baseState,\n baseQueue: currentHook.baseQueue,\n queue: currentHook.queue,\n next: null\n };\n null === workInProgressHook\n ? (currentlyRenderingFiber.memoizedState = workInProgressHook =\n nextCurrentHook)\n : (workInProgressHook = workInProgressHook.next = nextCurrentHook);\n }\n return workInProgressHook;\n}\nfunction createFunctionComponentUpdateQueue() {\n return { lastEffect: null, events: null, stores: null, memoCache: null };\n}\nfunction useThenable(thenable) {\n var index = thenableIndexCounter;\n thenableIndexCounter += 1;\n null === thenableState && (thenableState = []);\n thenable = trackUsedThenable(thenableState, thenable, index);\n index = currentlyRenderingFiber;\n null ===\n (null === workInProgressHook\n ? index.memoizedState\n : workInProgressHook.next) &&\n ((index = index.alternate),\n (ReactSharedInternals.H =\n null === index || null === index.memoizedState\n ? HooksDispatcherOnMount\n : HooksDispatcherOnUpdate));\n return thenable;\n}\nfunction use(usable) {\n if (null !== usable && \"object\" === typeof usable) {\n if (\"function\" === typeof usable.then) return useThenable(usable);\n if (usable.$$typeof === REACT_CONTEXT_TYPE) return readContext(usable);\n }\n throw Error(formatProdErrorMessage(438, String(usable)));\n}\nfunction useMemoCache(size) {\n var memoCache = null,\n updateQueue = currentlyRenderingFiber.updateQueue;\n null !== updateQueue && (memoCache = updateQueue.memoCache);\n if (null == memoCache) {\n var current = currentlyRenderingFiber.alternate;\n null !== current &&\n ((current = current.updateQueue),\n null !== current &&\n ((current = current.memoCache),\n null != current &&\n (memoCache = {\n data: current.data.map(function (array) {\n return array.slice();\n }),\n index: 0\n })));\n }\n null == memoCache && (memoCache = { data: [], index: 0 });\n null === updateQueue &&\n ((updateQueue = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = updateQueue));\n updateQueue.memoCache = memoCache;\n updateQueue = memoCache.data[memoCache.index];\n if (void 0 === updateQueue)\n for (\n updateQueue = memoCache.data[memoCache.index] = Array(size), current = 0;\n current < size;\n current++\n )\n updateQueue[current] = REACT_MEMO_CACHE_SENTINEL;\n memoCache.index++;\n return updateQueue;\n}\nfunction basicStateReducer(state, action) {\n return \"function\" === typeof action ? action(state) : action;\n}\nfunction updateReducer(reducer) {\n var hook = updateWorkInProgressHook();\n return updateReducerImpl(hook, currentHook, reducer);\n}\nfunction updateReducerImpl(hook, current, reducer) {\n var queue = hook.queue;\n if (null === queue) throw Error(formatProdErrorMessage(311));\n queue.lastRenderedReducer = reducer;\n var baseQueue = hook.baseQueue,\n pendingQueue = queue.pending;\n if (null !== pendingQueue) {\n if (null !== baseQueue) {\n var baseFirst = baseQueue.next;\n baseQueue.next = pendingQueue.next;\n pendingQueue.next = baseFirst;\n }\n current.baseQueue = baseQueue = pendingQueue;\n queue.pending = null;\n }\n pendingQueue = hook.baseState;\n if (null === baseQueue) hook.memoizedState = pendingQueue;\n else {\n current = baseQueue.next;\n var newBaseQueueFirst = (baseFirst = null),\n newBaseQueueLast = null,\n update = current,\n didReadFromEntangledAsyncAction$60 = !1;\n do {\n var updateLane = update.lane & -536870913;\n if (\n updateLane !== update.lane\n ? (workInProgressRootRenderLanes & updateLane) === updateLane\n : (renderLanes & updateLane) === updateLane\n ) {\n var revertLane = update.revertLane;\n if (0 === revertLane)\n null !== newBaseQueueLast &&\n (newBaseQueueLast = newBaseQueueLast.next =\n {\n lane: 0,\n revertLane: 0,\n gesture: null,\n action: update.action,\n hasEagerState: update.hasEagerState,\n eagerState: update.eagerState,\n next: null\n }),\n updateLane === currentEntangledLane &&\n (didReadFromEntangledAsyncAction$60 = !0);\n else if ((renderLanes & revertLane) === revertLane) {\n update = update.next;\n revertLane === currentEntangledLane &&\n (didReadFromEntangledAsyncAction$60 = !0);\n continue;\n } else\n (updateLane = {\n lane: 0,\n revertLane: update.revertLane,\n gesture: null,\n action: update.action,\n hasEagerState: update.hasEagerState,\n eagerState: update.eagerState,\n next: null\n }),\n null === newBaseQueueLast\n ? ((newBaseQueueFirst = newBaseQueueLast = updateLane),\n (baseFirst = pendingQueue))\n : (newBaseQueueLast = newBaseQueueLast.next = updateLane),\n (currentlyRenderingFiber.lanes |= revertLane),\n (workInProgressRootSkippedLanes |= revertLane);\n updateLane = update.action;\n shouldDoubleInvokeUserFnsInHooksDEV &&\n reducer(pendingQueue, updateLane);\n pendingQueue = update.hasEagerState\n ? update.eagerState\n : reducer(pendingQueue, updateLane);\n } else\n (revertLane = {\n lane: updateLane,\n revertLane: update.revertLane,\n gesture: update.gesture,\n action: update.action,\n hasEagerState: update.hasEagerState,\n eagerState: update.eagerState,\n next: null\n }),\n null === newBaseQueueLast\n ? ((newBaseQueueFirst = newBaseQueueLast = revertLane),\n (baseFirst = pendingQueue))\n : (newBaseQueueLast = newBaseQueueLast.next = revertLane),\n (currentlyRenderingFiber.lanes |= updateLane),\n (workInProgressRootSkippedLanes |= updateLane);\n update = update.next;\n } while (null !== update && update !== current);\n null === newBaseQueueLast\n ? (baseFirst = pendingQueue)\n : (newBaseQueueLast.next = newBaseQueueFirst);\n if (\n !objectIs(pendingQueue, hook.memoizedState) &&\n ((didReceiveUpdate = !0),\n didReadFromEntangledAsyncAction$60 &&\n ((reducer = currentEntangledActionThenable), null !== reducer))\n )\n throw reducer;\n hook.memoizedState = pendingQueue;\n hook.baseState = baseFirst;\n hook.baseQueue = newBaseQueueLast;\n queue.lastRenderedState = pendingQueue;\n }\n null === baseQueue && (queue.lanes = 0);\n return [hook.memoizedState, queue.dispatch];\n}\nfunction rerenderReducer(reducer) {\n var hook = updateWorkInProgressHook(),\n queue = hook.queue;\n if (null === queue) throw Error(formatProdErrorMessage(311));\n queue.lastRenderedReducer = reducer;\n var dispatch = queue.dispatch,\n lastRenderPhaseUpdate = queue.pending,\n newState = hook.memoizedState;\n if (null !== lastRenderPhaseUpdate) {\n queue.pending = null;\n var update = (lastRenderPhaseUpdate = lastRenderPhaseUpdate.next);\n do (newState = reducer(newState, update.action)), (update = update.next);\n while (update !== lastRenderPhaseUpdate);\n objectIs(newState, hook.memoizedState) || (didReceiveUpdate = !0);\n hook.memoizedState = newState;\n null === hook.baseQueue && (hook.baseState = newState);\n queue.lastRenderedState = newState;\n }\n return [newState, dispatch];\n}\nfunction updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {\n var fiber = currentlyRenderingFiber,\n hook = updateWorkInProgressHook(),\n isHydrating$jscomp$0 = isHydrating;\n if (isHydrating$jscomp$0) {\n if (void 0 === getServerSnapshot) throw Error(formatProdErrorMessage(407));\n getServerSnapshot = getServerSnapshot();\n } else getServerSnapshot = getSnapshot();\n var snapshotChanged = !objectIs(\n (currentHook || hook).memoizedState,\n getServerSnapshot\n );\n snapshotChanged &&\n ((hook.memoizedState = getServerSnapshot), (didReceiveUpdate = !0));\n hook = hook.queue;\n updateEffect(subscribeToStore.bind(null, fiber, hook, subscribe), [\n subscribe\n ]);\n if (\n hook.getSnapshot !== getSnapshot ||\n snapshotChanged ||\n (null !== workInProgressHook && workInProgressHook.memoizedState.tag & 1)\n ) {\n fiber.flags |= 2048;\n pushSimpleEffect(\n 9,\n { destroy: void 0 },\n updateStoreInstance.bind(\n null,\n fiber,\n hook,\n getServerSnapshot,\n getSnapshot\n ),\n null\n );\n if (null === workInProgressRoot) throw Error(formatProdErrorMessage(349));\n isHydrating$jscomp$0 ||\n 0 !== (renderLanes & 127) ||\n pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);\n }\n return getServerSnapshot;\n}\nfunction pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) {\n fiber.flags |= 16384;\n fiber = { getSnapshot: getSnapshot, value: renderedSnapshot };\n getSnapshot = currentlyRenderingFiber.updateQueue;\n null === getSnapshot\n ? ((getSnapshot = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = getSnapshot),\n (getSnapshot.stores = [fiber]))\n : ((renderedSnapshot = getSnapshot.stores),\n null === renderedSnapshot\n ? (getSnapshot.stores = [fiber])\n : renderedSnapshot.push(fiber));\n}\nfunction updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) {\n inst.value = nextSnapshot;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);\n}\nfunction subscribeToStore(fiber, inst, subscribe) {\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);\n });\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction forceStoreRerender(fiber) {\n var root = enqueueConcurrentRenderForLane(fiber, 2);\n null !== root && scheduleUpdateOnFiber(root, fiber, 2);\n}\nfunction mountStateImpl(initialState) {\n var hook = mountWorkInProgressHook();\n if (\"function\" === typeof initialState) {\n var initialStateInitializer = initialState;\n initialState = initialStateInitializer();\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n initialStateInitializer();\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n }\n hook.memoizedState = hook.baseState = initialState;\n hook.queue = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: basicStateReducer,\n lastRenderedState: initialState\n };\n return hook;\n}\nfunction updateOptimisticImpl(hook, current, passthrough, reducer) {\n hook.baseState = passthrough;\n return updateReducerImpl(\n hook,\n currentHook,\n \"function\" === typeof reducer ? reducer : basicStateReducer\n );\n}\nfunction dispatchActionState(\n fiber,\n actionQueue,\n setPendingState,\n setState,\n payload\n) {\n if (isRenderPhaseUpdate(fiber)) throw Error(formatProdErrorMessage(485));\n fiber = actionQueue.action;\n if (null !== fiber) {\n var actionNode = {\n payload: payload,\n action: fiber,\n next: null,\n isTransition: !0,\n status: \"pending\",\n value: null,\n reason: null,\n listeners: [],\n then: function (listener) {\n actionNode.listeners.push(listener);\n }\n };\n null !== ReactSharedInternals.T\n ? setPendingState(!0)\n : (actionNode.isTransition = !1);\n setState(actionNode);\n setPendingState = actionQueue.pending;\n null === setPendingState\n ? ((actionNode.next = actionQueue.pending = actionNode),\n runActionStateAction(actionQueue, actionNode))\n : ((actionNode.next = setPendingState.next),\n (actionQueue.pending = setPendingState.next = actionNode));\n }\n}\nfunction runActionStateAction(actionQueue, node) {\n var action = node.action,\n payload = node.payload,\n prevState = actionQueue.state;\n if (node.isTransition) {\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n try {\n var returnValue = action(prevState, payload),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n handleActionReturnValue(actionQueue, node, returnValue);\n } catch (error) {\n onActionError(actionQueue, node, error);\n } finally {\n null !== prevTransition &&\n null !== currentTransition.types &&\n (prevTransition.types = currentTransition.types),\n (ReactSharedInternals.T = prevTransition);\n }\n } else\n try {\n (prevTransition = action(prevState, payload)),\n handleActionReturnValue(actionQueue, node, prevTransition);\n } catch (error$66) {\n onActionError(actionQueue, node, error$66);\n }\n}\nfunction handleActionReturnValue(actionQueue, node, returnValue) {\n null !== returnValue &&\n \"object\" === typeof returnValue &&\n \"function\" === typeof returnValue.then\n ? returnValue.then(\n function (nextState) {\n onActionSuccess(actionQueue, node, nextState);\n },\n function (error) {\n return onActionError(actionQueue, node, error);\n }\n )\n : onActionSuccess(actionQueue, node, returnValue);\n}\nfunction onActionSuccess(actionQueue, actionNode, nextState) {\n actionNode.status = \"fulfilled\";\n actionNode.value = nextState;\n notifyActionListeners(actionNode);\n actionQueue.state = nextState;\n actionNode = actionQueue.pending;\n null !== actionNode &&\n ((nextState = actionNode.next),\n nextState === actionNode\n ? (actionQueue.pending = null)\n : ((nextState = nextState.next),\n (actionNode.next = nextState),\n runActionStateAction(actionQueue, nextState)));\n}\nfunction onActionError(actionQueue, actionNode, error) {\n var last = actionQueue.pending;\n actionQueue.pending = null;\n if (null !== last) {\n last = last.next;\n do\n (actionNode.status = \"rejected\"),\n (actionNode.reason = error),\n notifyActionListeners(actionNode),\n (actionNode = actionNode.next);\n while (actionNode !== last);\n }\n actionQueue.action = null;\n}\nfunction notifyActionListeners(actionNode) {\n actionNode = actionNode.listeners;\n for (var i = 0; i < actionNode.length; i++) (0, actionNode[i])();\n}\nfunction actionStateReducer(oldState, newState) {\n return newState;\n}\nfunction mountActionState(action, initialStateProp) {\n if (isHydrating) {\n var ssrFormState = workInProgressRoot.formState;\n if (null !== ssrFormState) {\n a: {\n var JSCompiler_inline_result = currentlyRenderingFiber;\n if (isHydrating) {\n if (nextHydratableInstance) {\n b: {\n var JSCompiler_inline_result$jscomp$0 = nextHydratableInstance;\n for (\n var inRootOrSingleton = rootOrSingletonContext;\n 8 !== JSCompiler_inline_result$jscomp$0.nodeType;\n\n ) {\n if (!inRootOrSingleton) {\n JSCompiler_inline_result$jscomp$0 = null;\n break b;\n }\n JSCompiler_inline_result$jscomp$0 = getNextHydratable(\n JSCompiler_inline_result$jscomp$0.nextSibling\n );\n if (null === JSCompiler_inline_result$jscomp$0) {\n JSCompiler_inline_result$jscomp$0 = null;\n break b;\n }\n }\n inRootOrSingleton = JSCompiler_inline_result$jscomp$0.data;\n JSCompiler_inline_result$jscomp$0 =\n \"F!\" === inRootOrSingleton || \"F\" === inRootOrSingleton\n ? JSCompiler_inline_result$jscomp$0\n : null;\n }\n if (JSCompiler_inline_result$jscomp$0) {\n nextHydratableInstance = getNextHydratable(\n JSCompiler_inline_result$jscomp$0.nextSibling\n );\n JSCompiler_inline_result =\n \"F!\" === JSCompiler_inline_result$jscomp$0.data;\n break a;\n }\n }\n throwOnHydrationMismatch(JSCompiler_inline_result);\n }\n JSCompiler_inline_result = !1;\n }\n JSCompiler_inline_result && (initialStateProp = ssrFormState[0]);\n }\n }\n ssrFormState = mountWorkInProgressHook();\n ssrFormState.memoizedState = ssrFormState.baseState = initialStateProp;\n JSCompiler_inline_result = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: actionStateReducer,\n lastRenderedState: initialStateProp\n };\n ssrFormState.queue = JSCompiler_inline_result;\n ssrFormState = dispatchSetState.bind(\n null,\n currentlyRenderingFiber,\n JSCompiler_inline_result\n );\n JSCompiler_inline_result.dispatch = ssrFormState;\n JSCompiler_inline_result = mountStateImpl(!1);\n inRootOrSingleton = dispatchOptimisticSetState.bind(\n null,\n currentlyRenderingFiber,\n !1,\n JSCompiler_inline_result.queue\n );\n JSCompiler_inline_result = mountWorkInProgressHook();\n JSCompiler_inline_result$jscomp$0 = {\n state: initialStateProp,\n dispatch: null,\n action: action,\n pending: null\n };\n JSCompiler_inline_result.queue = JSCompiler_inline_result$jscomp$0;\n ssrFormState = dispatchActionState.bind(\n null,\n currentlyRenderingFiber,\n JSCompiler_inline_result$jscomp$0,\n inRootOrSingleton,\n ssrFormState\n );\n JSCompiler_inline_result$jscomp$0.dispatch = ssrFormState;\n JSCompiler_inline_result.memoizedState = action;\n return [initialStateProp, ssrFormState, !1];\n}\nfunction updateActionState(action) {\n var stateHook = updateWorkInProgressHook();\n return updateActionStateImpl(stateHook, currentHook, action);\n}\nfunction updateActionStateImpl(stateHook, currentStateHook, action) {\n currentStateHook = updateReducerImpl(\n stateHook,\n currentStateHook,\n actionStateReducer\n )[0];\n stateHook = updateReducer(basicStateReducer)[0];\n if (\n \"object\" === typeof currentStateHook &&\n null !== currentStateHook &&\n \"function\" === typeof currentStateHook.then\n )\n try {\n var state = useThenable(currentStateHook);\n } catch (x) {\n if (x === SuspenseException) throw SuspenseActionException;\n throw x;\n }\n else state = currentStateHook;\n currentStateHook = updateWorkInProgressHook();\n var actionQueue = currentStateHook.queue,\n dispatch = actionQueue.dispatch;\n action !== currentStateHook.memoizedState &&\n ((currentlyRenderingFiber.flags |= 2048),\n pushSimpleEffect(\n 9,\n { destroy: void 0 },\n actionStateActionEffect.bind(null, actionQueue, action),\n null\n ));\n return [state, dispatch, stateHook];\n}\nfunction actionStateActionEffect(actionQueue, action) {\n actionQueue.action = action;\n}\nfunction rerenderActionState(action) {\n var stateHook = updateWorkInProgressHook(),\n currentStateHook = currentHook;\n if (null !== currentStateHook)\n return updateActionStateImpl(stateHook, currentStateHook, action);\n updateWorkInProgressHook();\n stateHook = stateHook.memoizedState;\n currentStateHook = updateWorkInProgressHook();\n var dispatch = currentStateHook.queue.dispatch;\n currentStateHook.memoizedState = action;\n return [stateHook, dispatch, !1];\n}\nfunction pushSimpleEffect(tag, inst, create, deps) {\n tag = { tag: tag, create: create, deps: deps, inst: inst, next: null };\n inst = currentlyRenderingFiber.updateQueue;\n null === inst &&\n ((inst = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = inst));\n create = inst.lastEffect;\n null === create\n ? (inst.lastEffect = tag.next = tag)\n : ((deps = create.next),\n (create.next = tag),\n (tag.next = deps),\n (inst.lastEffect = tag));\n return tag;\n}\nfunction updateRef() {\n return updateWorkInProgressHook().memoizedState;\n}\nfunction mountEffectImpl(fiberFlags, hookFlags, create, deps) {\n var hook = mountWorkInProgressHook();\n currentlyRenderingFiber.flags |= fiberFlags;\n hook.memoizedState = pushSimpleEffect(\n 1 | hookFlags,\n { destroy: void 0 },\n create,\n void 0 === deps ? null : deps\n );\n}\nfunction updateEffectImpl(fiberFlags, hookFlags, create, deps) {\n var hook = updateWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var inst = hook.memoizedState.inst;\n null !== currentHook &&\n null !== deps &&\n areHookInputsEqual(deps, currentHook.memoizedState.deps)\n ? (hook.memoizedState = pushSimpleEffect(hookFlags, inst, create, deps))\n : ((currentlyRenderingFiber.flags |= fiberFlags),\n (hook.memoizedState = pushSimpleEffect(\n 1 | hookFlags,\n inst,\n create,\n deps\n )));\n}\nfunction mountEffect(create, deps) {\n mountEffectImpl(8390656, 8, create, deps);\n}\nfunction updateEffect(create, deps) {\n updateEffectImpl(2048, 8, create, deps);\n}\nfunction useEffectEventImpl(payload) {\n currentlyRenderingFiber.flags |= 4;\n var componentUpdateQueue = currentlyRenderingFiber.updateQueue;\n if (null === componentUpdateQueue)\n (componentUpdateQueue = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = componentUpdateQueue),\n (componentUpdateQueue.events = [payload]);\n else {\n var events = componentUpdateQueue.events;\n null === events\n ? (componentUpdateQueue.events = [payload])\n : events.push(payload);\n }\n}\nfunction updateEvent(callback) {\n var ref = updateWorkInProgressHook().memoizedState;\n useEffectEventImpl({ ref: ref, nextImpl: callback });\n return function () {\n if (0 !== (executionContext & 2)) throw Error(formatProdErrorMessage(440));\n return ref.impl.apply(void 0, arguments);\n };\n}\nfunction updateInsertionEffect(create, deps) {\n return updateEffectImpl(4, 2, create, deps);\n}\nfunction updateLayoutEffect(create, deps) {\n return updateEffectImpl(4, 4, create, deps);\n}\nfunction imperativeHandleEffect(create, ref) {\n if (\"function\" === typeof ref) {\n create = create();\n var refCleanup = ref(create);\n return function () {\n \"function\" === typeof refCleanup ? refCleanup() : ref(null);\n };\n }\n if (null !== ref && void 0 !== ref)\n return (\n (create = create()),\n (ref.current = create),\n function () {\n ref.current = null;\n }\n );\n}\nfunction updateImperativeHandle(ref, create, deps) {\n deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;\n updateEffectImpl(4, 4, imperativeHandleEffect.bind(null, create, ref), deps);\n}\nfunction mountDebugValue() {}\nfunction updateCallback(callback, deps) {\n var hook = updateWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var prevState = hook.memoizedState;\n if (null !== deps && areHookInputsEqual(deps, prevState[1]))\n return prevState[0];\n hook.memoizedState = [callback, deps];\n return callback;\n}\nfunction updateMemo(nextCreate, deps) {\n var hook = updateWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var prevState = hook.memoizedState;\n if (null !== deps && areHookInputsEqual(deps, prevState[1]))\n return prevState[0];\n prevState = nextCreate();\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n nextCreate();\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n hook.memoizedState = [prevState, deps];\n return prevState;\n}\nfunction mountDeferredValueImpl(hook, value, initialValue) {\n if (\n void 0 === initialValue ||\n (0 !== (renderLanes & 1073741824) &&\n 0 === (workInProgressRootRenderLanes & 261930))\n )\n return (hook.memoizedState = value);\n hook.memoizedState = initialValue;\n hook = requestDeferredLane();\n currentlyRenderingFiber.lanes |= hook;\n workInProgressRootSkippedLanes |= hook;\n return initialValue;\n}\nfunction updateDeferredValueImpl(hook, prevValue, value, initialValue) {\n if (objectIs(value, prevValue)) return value;\n if (null !== currentTreeHiddenStackCursor.current)\n return (\n (hook = mountDeferredValueImpl(hook, value, initialValue)),\n objectIs(hook, prevValue) || (didReceiveUpdate = !0),\n hook\n );\n if (\n 0 === (renderLanes & 42) ||\n (0 !== (renderLanes & 1073741824) &&\n 0 === (workInProgressRootRenderLanes & 261930))\n )\n return (didReceiveUpdate = !0), (hook.memoizedState = value);\n hook = requestDeferredLane();\n currentlyRenderingFiber.lanes |= hook;\n workInProgressRootSkippedLanes |= hook;\n return prevValue;\n}\nfunction startTransition(fiber, queue, pendingState, finishedState, callback) {\n var previousPriority = ReactDOMSharedInternals.p;\n ReactDOMSharedInternals.p =\n 0 !== previousPriority && 8 > previousPriority ? previousPriority : 8;\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n dispatchOptimisticSetState(fiber, !1, queue, pendingState);\n try {\n var returnValue = callback(),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n if (\n null !== returnValue &&\n \"object\" === typeof returnValue &&\n \"function\" === typeof returnValue.then\n ) {\n var thenableForFinishedState = chainThenableValue(\n returnValue,\n finishedState\n );\n dispatchSetStateInternal(\n fiber,\n queue,\n thenableForFinishedState,\n requestUpdateLane(fiber)\n );\n } else\n dispatchSetStateInternal(\n fiber,\n queue,\n finishedState,\n requestUpdateLane(fiber)\n );\n } catch (error) {\n dispatchSetStateInternal(\n fiber,\n queue,\n { then: function () {}, status: \"rejected\", reason: error },\n requestUpdateLane()\n );\n } finally {\n (ReactDOMSharedInternals.p = previousPriority),\n null !== prevTransition &&\n null !== currentTransition.types &&\n (prevTransition.types = currentTransition.types),\n (ReactSharedInternals.T = prevTransition);\n }\n}\nfunction noop() {}\nfunction startHostTransition(formFiber, pendingState, action, formData) {\n if (5 !== formFiber.tag) throw Error(formatProdErrorMessage(476));\n var queue = ensureFormComponentIsStateful(formFiber).queue;\n startTransition(\n formFiber,\n queue,\n pendingState,\n sharedNotPendingObject,\n null === action\n ? noop\n : function () {\n requestFormReset$1(formFiber);\n return action(formData);\n }\n );\n}\nfunction ensureFormComponentIsStateful(formFiber) {\n var existingStateHook = formFiber.memoizedState;\n if (null !== existingStateHook) return existingStateHook;\n existingStateHook = {\n memoizedState: sharedNotPendingObject,\n baseState: sharedNotPendingObject,\n baseQueue: null,\n queue: {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: basicStateReducer,\n lastRenderedState: sharedNotPendingObject\n },\n next: null\n };\n var initialResetState = {};\n existingStateHook.next = {\n memoizedState: initialResetState,\n baseState: initialResetState,\n baseQueue: null,\n queue: {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: basicStateReducer,\n lastRenderedState: initialResetState\n },\n next: null\n };\n formFiber.memoizedState = existingStateHook;\n formFiber = formFiber.alternate;\n null !== formFiber && (formFiber.memoizedState = existingStateHook);\n return existingStateHook;\n}\nfunction requestFormReset$1(formFiber) {\n var stateHook = ensureFormComponentIsStateful(formFiber);\n null === stateHook.next && (stateHook = formFiber.alternate.memoizedState);\n dispatchSetStateInternal(\n formFiber,\n stateHook.next.queue,\n {},\n requestUpdateLane()\n );\n}\nfunction useHostTransitionStatus() {\n return readContext(HostTransitionContext);\n}\nfunction updateId() {\n return updateWorkInProgressHook().memoizedState;\n}\nfunction updateRefresh() {\n return updateWorkInProgressHook().memoizedState;\n}\nfunction refreshCache(fiber) {\n for (var provider = fiber.return; null !== provider; ) {\n switch (provider.tag) {\n case 24:\n case 3:\n var lane = requestUpdateLane();\n fiber = createUpdate(lane);\n var root$69 = enqueueUpdate(provider, fiber, lane);\n null !== root$69 &&\n (scheduleUpdateOnFiber(root$69, provider, lane),\n entangleTransitions(root$69, provider, lane));\n provider = { cache: createCache() };\n fiber.payload = provider;\n return;\n }\n provider = provider.return;\n }\n}\nfunction dispatchReducerAction(fiber, queue, action) {\n var lane = requestUpdateLane();\n action = {\n lane: lane,\n revertLane: 0,\n gesture: null,\n action: action,\n hasEagerState: !1,\n eagerState: null,\n next: null\n };\n isRenderPhaseUpdate(fiber)\n ? enqueueRenderPhaseUpdate(queue, action)\n : ((action = enqueueConcurrentHookUpdate(fiber, queue, action, lane)),\n null !== action &&\n (scheduleUpdateOnFiber(action, fiber, lane),\n entangleTransitionUpdate(action, queue, lane)));\n}\nfunction dispatchSetState(fiber, queue, action) {\n var lane = requestUpdateLane();\n dispatchSetStateInternal(fiber, queue, action, lane);\n}\nfunction dispatchSetStateInternal(fiber, queue, action, lane) {\n var update = {\n lane: lane,\n revertLane: 0,\n gesture: null,\n action: action,\n hasEagerState: !1,\n eagerState: null,\n next: null\n };\n if (isRenderPhaseUpdate(fiber)) enqueueRenderPhaseUpdate(queue, update);\n else {\n var alternate = fiber.alternate;\n if (\n 0 === fiber.lanes &&\n (null === alternate || 0 === alternate.lanes) &&\n ((alternate = queue.lastRenderedReducer), null !== alternate)\n )\n try {\n var currentState = queue.lastRenderedState,\n eagerState = alternate(currentState, action);\n update.hasEagerState = !0;\n update.eagerState = eagerState;\n if (objectIs(eagerState, currentState))\n return (\n enqueueUpdate$1(fiber, queue, update, 0),\n null === workInProgressRoot && finishQueueingConcurrentUpdates(),\n !1\n );\n } catch (error) {\n } finally {\n }\n action = enqueueConcurrentHookUpdate(fiber, queue, update, lane);\n if (null !== action)\n return (\n scheduleUpdateOnFiber(action, fiber, lane),\n entangleTransitionUpdate(action, queue, lane),\n !0\n );\n }\n return !1;\n}\nfunction dispatchOptimisticSetState(fiber, throwIfDuringRender, queue, action) {\n action = {\n lane: 2,\n revertLane: requestTransitionLane(),\n gesture: null,\n action: action,\n hasEagerState: !1,\n eagerState: null,\n next: null\n };\n if (isRenderPhaseUpdate(fiber)) {\n if (throwIfDuringRender) throw Error(formatProdErrorMessage(479));\n } else\n (throwIfDuringRender = enqueueConcurrentHookUpdate(\n fiber,\n queue,\n action,\n 2\n )),\n null !== throwIfDuringRender &&\n scheduleUpdateOnFiber(throwIfDuringRender, fiber, 2);\n}\nfunction isRenderPhaseUpdate(fiber) {\n var alternate = fiber.alternate;\n return (\n fiber === currentlyRenderingFiber ||\n (null !== alternate && alternate === currentlyRenderingFiber)\n );\n}\nfunction enqueueRenderPhaseUpdate(queue, update) {\n didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate =\n !0;\n var pending = queue.pending;\n null === pending\n ? (update.next = update)\n : ((update.next = pending.next), (pending.next = update));\n queue.pending = update;\n}\nfunction entangleTransitionUpdate(root, queue, lane) {\n if (0 !== (lane & 4194048)) {\n var queueLanes = queue.lanes;\n queueLanes &= root.pendingLanes;\n lane |= queueLanes;\n queue.lanes = lane;\n markRootEntangled(root, lane);\n }\n}\nvar ContextOnlyDispatcher = {\n readContext: readContext,\n use: use,\n useCallback: throwInvalidHookError,\n useContext: throwInvalidHookError,\n useEffect: throwInvalidHookError,\n useImperativeHandle: throwInvalidHookError,\n useLayoutEffect: throwInvalidHookError,\n useInsertionEffect: throwInvalidHookError,\n useMemo: throwInvalidHookError,\n useReducer: throwInvalidHookError,\n useRef: throwInvalidHookError,\n useState: throwInvalidHookError,\n useDebugValue: throwInvalidHookError,\n useDeferredValue: throwInvalidHookError,\n useTransition: throwInvalidHookError,\n useSyncExternalStore: throwInvalidHookError,\n useId: throwInvalidHookError,\n useHostTransitionStatus: throwInvalidHookError,\n useFormState: throwInvalidHookError,\n useActionState: throwInvalidHookError,\n useOptimistic: throwInvalidHookError,\n useMemoCache: throwInvalidHookError,\n useCacheRefresh: throwInvalidHookError\n};\nContextOnlyDispatcher.useEffectEvent = throwInvalidHookError;\nvar HooksDispatcherOnMount = {\n readContext: readContext,\n use: use,\n useCallback: function (callback, deps) {\n mountWorkInProgressHook().memoizedState = [\n callback,\n void 0 === deps ? null : deps\n ];\n return callback;\n },\n useContext: readContext,\n useEffect: mountEffect,\n useImperativeHandle: function (ref, create, deps) {\n deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;\n mountEffectImpl(\n 4194308,\n 4,\n imperativeHandleEffect.bind(null, create, ref),\n deps\n );\n },\n useLayoutEffect: function (create, deps) {\n return mountEffectImpl(4194308, 4, create, deps);\n },\n useInsertionEffect: function (create, deps) {\n mountEffectImpl(4, 2, create, deps);\n },\n useMemo: function (nextCreate, deps) {\n var hook = mountWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var nextValue = nextCreate();\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n nextCreate();\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n hook.memoizedState = [nextValue, deps];\n return nextValue;\n },\n useReducer: function (reducer, initialArg, init) {\n var hook = mountWorkInProgressHook();\n if (void 0 !== init) {\n var initialState = init(initialArg);\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n init(initialArg);\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n } else initialState = initialArg;\n hook.memoizedState = hook.baseState = initialState;\n reducer = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: reducer,\n lastRenderedState: initialState\n };\n hook.queue = reducer;\n reducer = reducer.dispatch = dispatchReducerAction.bind(\n null,\n currentlyRenderingFiber,\n reducer\n );\n return [hook.memoizedState, reducer];\n },\n useRef: function (initialValue) {\n var hook = mountWorkInProgressHook();\n initialValue = { current: initialValue };\n return (hook.memoizedState = initialValue);\n },\n useState: function (initialState) {\n initialState = mountStateImpl(initialState);\n var queue = initialState.queue,\n dispatch = dispatchSetState.bind(null, currentlyRenderingFiber, queue);\n queue.dispatch = dispatch;\n return [initialState.memoizedState, dispatch];\n },\n useDebugValue: mountDebugValue,\n useDeferredValue: function (value, initialValue) {\n var hook = mountWorkInProgressHook();\n return mountDeferredValueImpl(hook, value, initialValue);\n },\n useTransition: function () {\n var stateHook = mountStateImpl(!1);\n stateHook = startTransition.bind(\n null,\n currentlyRenderingFiber,\n stateHook.queue,\n !0,\n !1\n );\n mountWorkInProgressHook().memoizedState = stateHook;\n return [!1, stateHook];\n },\n useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {\n var fiber = currentlyRenderingFiber,\n hook = mountWorkInProgressHook();\n if (isHydrating) {\n if (void 0 === getServerSnapshot)\n throw Error(formatProdErrorMessage(407));\n getServerSnapshot = getServerSnapshot();\n } else {\n getServerSnapshot = getSnapshot();\n if (null === workInProgressRoot)\n throw Error(formatProdErrorMessage(349));\n 0 !== (workInProgressRootRenderLanes & 127) ||\n pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);\n }\n hook.memoizedState = getServerSnapshot;\n var inst = { value: getServerSnapshot, getSnapshot: getSnapshot };\n hook.queue = inst;\n mountEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [\n subscribe\n ]);\n fiber.flags |= 2048;\n pushSimpleEffect(\n 9,\n { destroy: void 0 },\n updateStoreInstance.bind(\n null,\n fiber,\n inst,\n getServerSnapshot,\n getSnapshot\n ),\n null\n );\n return getServerSnapshot;\n },\n useId: function () {\n var hook = mountWorkInProgressHook(),\n identifierPrefix = workInProgressRoot.identifierPrefix;\n if (isHydrating) {\n var JSCompiler_inline_result = treeContextOverflow;\n var idWithLeadingBit = treeContextId;\n JSCompiler_inline_result =\n (\n idWithLeadingBit & ~(1 << (32 - clz32(idWithLeadingBit) - 1))\n ).toString(32) + JSCompiler_inline_result;\n identifierPrefix =\n \"_\" + identifierPrefix + \"R_\" + JSCompiler_inline_result;\n JSCompiler_inline_result = localIdCounter++;\n 0 < JSCompiler_inline_result &&\n (identifierPrefix += \"H\" + JSCompiler_inline_result.toString(32));\n identifierPrefix += \"_\";\n } else\n (JSCompiler_inline_result = globalClientIdCounter++),\n (identifierPrefix =\n \"_\" +\n identifierPrefix +\n \"r_\" +\n JSCompiler_inline_result.toString(32) +\n \"_\");\n return (hook.memoizedState = identifierPrefix);\n },\n useHostTransitionStatus: useHostTransitionStatus,\n useFormState: mountActionState,\n useActionState: mountActionState,\n useOptimistic: function (passthrough) {\n var hook = mountWorkInProgressHook();\n hook.memoizedState = hook.baseState = passthrough;\n var queue = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: null,\n lastRenderedState: null\n };\n hook.queue = queue;\n hook = dispatchOptimisticSetState.bind(\n null,\n currentlyRenderingFiber,\n !0,\n queue\n );\n queue.dispatch = hook;\n return [passthrough, hook];\n },\n useMemoCache: useMemoCache,\n useCacheRefresh: function () {\n return (mountWorkInProgressHook().memoizedState = refreshCache.bind(\n null,\n currentlyRenderingFiber\n ));\n },\n useEffectEvent: function (callback) {\n var hook = mountWorkInProgressHook(),\n ref = { impl: callback };\n hook.memoizedState = ref;\n return function () {\n if (0 !== (executionContext & 2))\n throw Error(formatProdErrorMessage(440));\n return ref.impl.apply(void 0, arguments);\n };\n }\n },\n HooksDispatcherOnUpdate = {\n readContext: readContext,\n use: use,\n useCallback: updateCallback,\n useContext: readContext,\n useEffect: updateEffect,\n useImperativeHandle: updateImperativeHandle,\n useInsertionEffect: updateInsertionEffect,\n useLayoutEffect: updateLayoutEffect,\n useMemo: updateMemo,\n useReducer: updateReducer,\n useRef: updateRef,\n useState: function () {\n return updateReducer(basicStateReducer);\n },\n useDebugValue: mountDebugValue,\n useDeferredValue: function (value, initialValue) {\n var hook = updateWorkInProgressHook();\n return updateDeferredValueImpl(\n hook,\n currentHook.memoizedState,\n value,\n initialValue\n );\n },\n useTransition: function () {\n var booleanOrThenable = updateReducer(basicStateReducer)[0],\n start = updateWorkInProgressHook().memoizedState;\n return [\n \"boolean\" === typeof booleanOrThenable\n ? booleanOrThenable\n : useThenable(booleanOrThenable),\n start\n ];\n },\n useSyncExternalStore: updateSyncExternalStore,\n useId: updateId,\n useHostTransitionStatus: useHostTransitionStatus,\n useFormState: updateActionState,\n useActionState: updateActionState,\n useOptimistic: function (passthrough, reducer) {\n var hook = updateWorkInProgressHook();\n return updateOptimisticImpl(hook, currentHook, passthrough, reducer);\n },\n useMemoCache: useMemoCache,\n useCacheRefresh: updateRefresh\n };\nHooksDispatcherOnUpdate.useEffectEvent = updateEvent;\nvar HooksDispatcherOnRerender = {\n readContext: readContext,\n use: use,\n useCallback: updateCallback,\n useContext: readContext,\n useEffect: updateEffect,\n useImperativeHandle: updateImperativeHandle,\n useInsertionEffect: updateInsertionEffect,\n useLayoutEffect: updateLayoutEffect,\n useMemo: updateMemo,\n useReducer: rerenderReducer,\n useRef: updateRef,\n useState: function () {\n return rerenderReducer(basicStateReducer);\n },\n useDebugValue: mountDebugValue,\n useDeferredValue: function (value, initialValue) {\n var hook = updateWorkInProgressHook();\n return null === currentHook\n ? mountDeferredValueImpl(hook, value, initialValue)\n : updateDeferredValueImpl(\n hook,\n currentHook.memoizedState,\n value,\n initialValue\n );\n },\n useTransition: function () {\n var booleanOrThenable = rerenderReducer(basicStateReducer)[0],\n start = updateWorkInProgressHook().memoizedState;\n return [\n \"boolean\" === typeof booleanOrThenable\n ? booleanOrThenable\n : useThenable(booleanOrThenable),\n start\n ];\n },\n useSyncExternalStore: updateSyncExternalStore,\n useId: updateId,\n useHostTransitionStatus: useHostTransitionStatus,\n useFormState: rerenderActionState,\n useActionState: rerenderActionState,\n useOptimistic: function (passthrough, reducer) {\n var hook = updateWorkInProgressHook();\n if (null !== currentHook)\n return updateOptimisticImpl(hook, currentHook, passthrough, reducer);\n hook.baseState = passthrough;\n return [passthrough, hook.queue.dispatch];\n },\n useMemoCache: useMemoCache,\n useCacheRefresh: updateRefresh\n};\nHooksDispatcherOnRerender.useEffectEvent = updateEvent;\nfunction applyDerivedStateFromProps(\n workInProgress,\n ctor,\n getDerivedStateFromProps,\n nextProps\n) {\n ctor = workInProgress.memoizedState;\n getDerivedStateFromProps = getDerivedStateFromProps(nextProps, ctor);\n getDerivedStateFromProps =\n null === getDerivedStateFromProps || void 0 === getDerivedStateFromProps\n ? ctor\n : assign({}, ctor, getDerivedStateFromProps);\n workInProgress.memoizedState = getDerivedStateFromProps;\n 0 === workInProgress.lanes &&\n (workInProgress.updateQueue.baseState = getDerivedStateFromProps);\n}\nvar classComponentUpdater = {\n enqueueSetState: function (inst, payload, callback) {\n inst = inst._reactInternals;\n var lane = requestUpdateLane(),\n update = createUpdate(lane);\n update.payload = payload;\n void 0 !== callback && null !== callback && (update.callback = callback);\n payload = enqueueUpdate(inst, update, lane);\n null !== payload &&\n (scheduleUpdateOnFiber(payload, inst, lane),\n entangleTransitions(payload, inst, lane));\n },\n enqueueReplaceState: function (inst, payload, callback) {\n inst = inst._reactInternals;\n var lane = requestUpdateLane(),\n update = createUpdate(lane);\n update.tag = 1;\n update.payload = payload;\n void 0 !== callback && null !== callback && (update.callback = callback);\n payload = enqueueUpdate(inst, update, lane);\n null !== payload &&\n (scheduleUpdateOnFiber(payload, inst, lane),\n entangleTransitions(payload, inst, lane));\n },\n enqueueForceUpdate: function (inst, callback) {\n inst = inst._reactInternals;\n var lane = requestUpdateLane(),\n update = createUpdate(lane);\n update.tag = 2;\n void 0 !== callback && null !== callback && (update.callback = callback);\n callback = enqueueUpdate(inst, update, lane);\n null !== callback &&\n (scheduleUpdateOnFiber(callback, inst, lane),\n entangleTransitions(callback, inst, lane));\n }\n};\nfunction checkShouldComponentUpdate(\n workInProgress,\n ctor,\n oldProps,\n newProps,\n oldState,\n newState,\n nextContext\n) {\n workInProgress = workInProgress.stateNode;\n return \"function\" === typeof workInProgress.shouldComponentUpdate\n ? workInProgress.shouldComponentUpdate(newProps, newState, nextContext)\n : ctor.prototype && ctor.prototype.isPureReactComponent\n ? !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState)\n : !0;\n}\nfunction callComponentWillReceiveProps(\n workInProgress,\n instance,\n newProps,\n nextContext\n) {\n workInProgress = instance.state;\n \"function\" === typeof instance.componentWillReceiveProps &&\n instance.componentWillReceiveProps(newProps, nextContext);\n \"function\" === typeof instance.UNSAFE_componentWillReceiveProps &&\n instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);\n instance.state !== workInProgress &&\n classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n}\nfunction resolveClassComponentProps(Component, baseProps) {\n var newProps = baseProps;\n if (\"ref\" in baseProps) {\n newProps = {};\n for (var propName in baseProps)\n \"ref\" !== propName && (newProps[propName] = baseProps[propName]);\n }\n if ((Component = Component.defaultProps)) {\n newProps === baseProps && (newProps = assign({}, newProps));\n for (var propName$73 in Component)\n void 0 === newProps[propName$73] &&\n (newProps[propName$73] = Component[propName$73]);\n }\n return newProps;\n}\nfunction defaultOnUncaughtError(error) {\n reportGlobalError(error);\n}\nfunction defaultOnCaughtError(error) {\n console.error(error);\n}\nfunction defaultOnRecoverableError(error) {\n reportGlobalError(error);\n}\nfunction logUncaughtError(root, errorInfo) {\n try {\n var onUncaughtError = root.onUncaughtError;\n onUncaughtError(errorInfo.value, { componentStack: errorInfo.stack });\n } catch (e$74) {\n setTimeout(function () {\n throw e$74;\n });\n }\n}\nfunction logCaughtError(root, boundary, errorInfo) {\n try {\n var onCaughtError = root.onCaughtError;\n onCaughtError(errorInfo.value, {\n componentStack: errorInfo.stack,\n errorBoundary: 1 === boundary.tag ? boundary.stateNode : null\n });\n } catch (e$75) {\n setTimeout(function () {\n throw e$75;\n });\n }\n}\nfunction createRootErrorUpdate(root, errorInfo, lane) {\n lane = createUpdate(lane);\n lane.tag = 3;\n lane.payload = { element: null };\n lane.callback = function () {\n logUncaughtError(root, errorInfo);\n };\n return lane;\n}\nfunction createClassErrorUpdate(lane) {\n lane = createUpdate(lane);\n lane.tag = 3;\n return lane;\n}\nfunction initializeClassErrorUpdate(update, root, fiber, errorInfo) {\n var getDerivedStateFromError = fiber.type.getDerivedStateFromError;\n if (\"function\" === typeof getDerivedStateFromError) {\n var error = errorInfo.value;\n update.payload = function () {\n return getDerivedStateFromError(error);\n };\n update.callback = function () {\n logCaughtError(root, fiber, errorInfo);\n };\n }\n var inst = fiber.stateNode;\n null !== inst &&\n \"function\" === typeof inst.componentDidCatch &&\n (update.callback = function () {\n logCaughtError(root, fiber, errorInfo);\n \"function\" !== typeof getDerivedStateFromError &&\n (null === legacyErrorBoundariesThatAlreadyFailed\n ? (legacyErrorBoundariesThatAlreadyFailed = new Set([this]))\n : legacyErrorBoundariesThatAlreadyFailed.add(this));\n var stack = errorInfo.stack;\n this.componentDidCatch(errorInfo.value, {\n componentStack: null !== stack ? stack : \"\"\n });\n });\n}\nfunction throwException(\n root,\n returnFiber,\n sourceFiber,\n value,\n rootRenderLanes\n) {\n sourceFiber.flags |= 32768;\n if (\n null !== value &&\n \"object\" === typeof value &&\n \"function\" === typeof value.then\n ) {\n returnFiber = sourceFiber.alternate;\n null !== returnFiber &&\n propagateParentContextChanges(\n returnFiber,\n sourceFiber,\n rootRenderLanes,\n !0\n );\n sourceFiber = suspenseHandlerStackCursor.current;\n if (null !== sourceFiber) {\n switch (sourceFiber.tag) {\n case 31:\n case 13:\n return (\n null === shellBoundary\n ? renderDidSuspendDelayIfPossible()\n : null === sourceFiber.alternate &&\n 0 === workInProgressRootExitStatus &&\n (workInProgressRootExitStatus = 3),\n (sourceFiber.flags &= -257),\n (sourceFiber.flags |= 65536),\n (sourceFiber.lanes = rootRenderLanes),\n value === noopSuspenseyCommitThenable\n ? (sourceFiber.flags |= 16384)\n : ((returnFiber = sourceFiber.updateQueue),\n null === returnFiber\n ? (sourceFiber.updateQueue = new Set([value]))\n : returnFiber.add(value),\n attachPingListener(root, value, rootRenderLanes)),\n !1\n );\n case 22:\n return (\n (sourceFiber.flags |= 65536),\n value === noopSuspenseyCommitThenable\n ? (sourceFiber.flags |= 16384)\n : ((returnFiber = sourceFiber.updateQueue),\n null === returnFiber\n ? ((returnFiber = {\n transitions: null,\n markerInstances: null,\n retryQueue: new Set([value])\n }),\n (sourceFiber.updateQueue = returnFiber))\n : ((sourceFiber = returnFiber.retryQueue),\n null === sourceFiber\n ? (returnFiber.retryQueue = new Set([value]))\n : sourceFiber.add(value)),\n attachPingListener(root, value, rootRenderLanes)),\n !1\n );\n }\n throw Error(formatProdErrorMessage(435, sourceFiber.tag));\n }\n attachPingListener(root, value, rootRenderLanes);\n renderDidSuspendDelayIfPossible();\n return !1;\n }\n if (isHydrating)\n return (\n (returnFiber = suspenseHandlerStackCursor.current),\n null !== returnFiber\n ? (0 === (returnFiber.flags & 65536) && (returnFiber.flags |= 256),\n (returnFiber.flags |= 65536),\n (returnFiber.lanes = rootRenderLanes),\n value !== HydrationMismatchException &&\n ((root = Error(formatProdErrorMessage(422), { cause: value })),\n queueHydrationError(createCapturedValueAtFiber(root, sourceFiber))))\n : (value !== HydrationMismatchException &&\n ((returnFiber = Error(formatProdErrorMessage(423), {\n cause: value\n })),\n queueHydrationError(\n createCapturedValueAtFiber(returnFiber, sourceFiber)\n )),\n (root = root.current.alternate),\n (root.flags |= 65536),\n (rootRenderLanes &= -rootRenderLanes),\n (root.lanes |= rootRenderLanes),\n (value = createCapturedValueAtFiber(value, sourceFiber)),\n (rootRenderLanes = createRootErrorUpdate(\n root.stateNode,\n value,\n rootRenderLanes\n )),\n enqueueCapturedUpdate(root, rootRenderLanes),\n 4 !== workInProgressRootExitStatus &&\n (workInProgressRootExitStatus = 2)),\n !1\n );\n var wrapperError = Error(formatProdErrorMessage(520), { cause: value });\n wrapperError = createCapturedValueAtFiber(wrapperError, sourceFiber);\n null === workInProgressRootConcurrentErrors\n ? (workInProgressRootConcurrentErrors = [wrapperError])\n : workInProgressRootConcurrentErrors.push(wrapperError);\n 4 !== workInProgressRootExitStatus && (workInProgressRootExitStatus = 2);\n if (null === returnFiber) return !0;\n value = createCapturedValueAtFiber(value, sourceFiber);\n sourceFiber = returnFiber;\n do {\n switch (sourceFiber.tag) {\n case 3:\n return (\n (sourceFiber.flags |= 65536),\n (root = rootRenderLanes & -rootRenderLanes),\n (sourceFiber.lanes |= root),\n (root = createRootErrorUpdate(sourceFiber.stateNode, value, root)),\n enqueueCapturedUpdate(sourceFiber, root),\n !1\n );\n case 1:\n if (\n ((returnFiber = sourceFiber.type),\n (wrapperError = sourceFiber.stateNode),\n 0 === (sourceFiber.flags & 128) &&\n (\"function\" === typeof returnFiber.getDerivedStateFromError ||\n (null !== wrapperError &&\n \"function\" === typeof wrapperError.componentDidCatch &&\n (null === legacyErrorBoundariesThatAlreadyFailed ||\n !legacyErrorBoundariesThatAlreadyFailed.has(wrapperError)))))\n )\n return (\n (sourceFiber.flags |= 65536),\n (rootRenderLanes &= -rootRenderLanes),\n (sourceFiber.lanes |= rootRenderLanes),\n (rootRenderLanes = createClassErrorUpdate(rootRenderLanes)),\n initializeClassErrorUpdate(\n rootRenderLanes,\n root,\n sourceFiber,\n value\n ),\n enqueueCapturedUpdate(sourceFiber, rootRenderLanes),\n !1\n );\n }\n sourceFiber = sourceFiber.return;\n } while (null !== sourceFiber);\n return !1;\n}\nvar SelectiveHydrationException = Error(formatProdErrorMessage(461)),\n didReceiveUpdate = !1;\nfunction reconcileChildren(current, workInProgress, nextChildren, renderLanes) {\n workInProgress.child =\n null === current\n ? mountChildFibers(workInProgress, null, nextChildren, renderLanes)\n : reconcileChildFibers(\n workInProgress,\n current.child,\n nextChildren,\n renderLanes\n );\n}\nfunction updateForwardRef(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n Component = Component.render;\n var ref = workInProgress.ref;\n if (\"ref\" in nextProps) {\n var propsWithoutRef = {};\n for (var key in nextProps)\n \"ref\" !== key && (propsWithoutRef[key] = nextProps[key]);\n } else propsWithoutRef = nextProps;\n prepareToReadContext(workInProgress);\n nextProps = renderWithHooks(\n current,\n workInProgress,\n Component,\n propsWithoutRef,\n ref,\n renderLanes\n );\n key = checkDidRenderIdHook();\n if (null !== current && !didReceiveUpdate)\n return (\n bailoutHooks(current, workInProgress, renderLanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n isHydrating && key && pushMaterializedTreeId(workInProgress);\n workInProgress.flags |= 1;\n reconcileChildren(current, workInProgress, nextProps, renderLanes);\n return workInProgress.child;\n}\nfunction updateMemoComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n if (null === current) {\n var type = Component.type;\n if (\n \"function\" === typeof type &&\n !shouldConstruct(type) &&\n void 0 === type.defaultProps &&\n null === Component.compare\n )\n return (\n (workInProgress.tag = 15),\n (workInProgress.type = type),\n updateSimpleMemoComponent(\n current,\n workInProgress,\n type,\n nextProps,\n renderLanes\n )\n );\n current = createFiberFromTypeAndProps(\n Component.type,\n null,\n nextProps,\n workInProgress,\n workInProgress.mode,\n renderLanes\n );\n current.ref = workInProgress.ref;\n current.return = workInProgress;\n return (workInProgress.child = current);\n }\n type = current.child;\n if (!checkScheduledUpdateOrContext(current, renderLanes)) {\n var prevProps = type.memoizedProps;\n Component = Component.compare;\n Component = null !== Component ? Component : shallowEqual;\n if (Component(prevProps, nextProps) && current.ref === workInProgress.ref)\n return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);\n }\n workInProgress.flags |= 1;\n current = createWorkInProgress(type, nextProps);\n current.ref = workInProgress.ref;\n current.return = workInProgress;\n return (workInProgress.child = current);\n}\nfunction updateSimpleMemoComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n if (null !== current) {\n var prevProps = current.memoizedProps;\n if (\n shallowEqual(prevProps, nextProps) &&\n current.ref === workInProgress.ref\n )\n if (\n ((didReceiveUpdate = !1),\n (workInProgress.pendingProps = nextProps = prevProps),\n checkScheduledUpdateOrContext(current, renderLanes))\n )\n 0 !== (current.flags & 131072) && (didReceiveUpdate = !0);\n else\n return (\n (workInProgress.lanes = current.lanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n }\n return updateFunctionComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n );\n}\nfunction updateOffscreenComponent(\n current,\n workInProgress,\n renderLanes,\n nextProps\n) {\n var nextChildren = nextProps.children,\n prevState = null !== current ? current.memoizedState : null;\n null === current &&\n null === workInProgress.stateNode &&\n (workInProgress.stateNode = {\n _visibility: 1,\n _pendingMarkers: null,\n _retryCache: null,\n _transitions: null\n });\n if (\"hidden\" === nextProps.mode) {\n if (0 !== (workInProgress.flags & 128)) {\n prevState =\n null !== prevState ? prevState.baseLanes | renderLanes : renderLanes;\n if (null !== current) {\n nextProps = workInProgress.child = current.child;\n for (nextChildren = 0; null !== nextProps; )\n (nextChildren =\n nextChildren | nextProps.lanes | nextProps.childLanes),\n (nextProps = nextProps.sibling);\n nextProps = nextChildren & ~prevState;\n } else (nextProps = 0), (workInProgress.child = null);\n return deferHiddenOffscreenComponent(\n current,\n workInProgress,\n prevState,\n renderLanes,\n nextProps\n );\n }\n if (0 !== (renderLanes & 536870912))\n (workInProgress.memoizedState = { baseLanes: 0, cachePool: null }),\n null !== current &&\n pushTransition(\n workInProgress,\n null !== prevState ? prevState.cachePool : null\n ),\n null !== prevState\n ? pushHiddenContext(workInProgress, prevState)\n : reuseHiddenContextOnStack(),\n pushOffscreenSuspenseHandler(workInProgress);\n else\n return (\n (nextProps = workInProgress.lanes = 536870912),\n deferHiddenOffscreenComponent(\n current,\n workInProgress,\n null !== prevState ? prevState.baseLanes | renderLanes : renderLanes,\n renderLanes,\n nextProps\n )\n );\n } else\n null !== prevState\n ? (pushTransition(workInProgress, prevState.cachePool),\n pushHiddenContext(workInProgress, prevState),\n reuseSuspenseHandlerOnStack(workInProgress),\n (workInProgress.memoizedState = null))\n : (null !== current && pushTransition(workInProgress, null),\n reuseHiddenContextOnStack(),\n reuseSuspenseHandlerOnStack(workInProgress));\n reconcileChildren(current, workInProgress, nextChildren, renderLanes);\n return workInProgress.child;\n}\nfunction bailoutOffscreenComponent(current, workInProgress) {\n (null !== current && 22 === current.tag) ||\n null !== workInProgress.stateNode ||\n (workInProgress.stateNode = {\n _visibility: 1,\n _pendingMarkers: null,\n _retryCache: null,\n _transitions: null\n });\n return workInProgress.sibling;\n}\nfunction deferHiddenOffscreenComponent(\n current,\n workInProgress,\n nextBaseLanes,\n renderLanes,\n remainingChildLanes\n) {\n var JSCompiler_inline_result = peekCacheFromPool();\n JSCompiler_inline_result =\n null === JSCompiler_inline_result\n ? null\n : { parent: CacheContext._currentValue, pool: JSCompiler_inline_result };\n workInProgress.memoizedState = {\n baseLanes: nextBaseLanes,\n cachePool: JSCompiler_inline_result\n };\n null !== current && pushTransition(workInProgress, null);\n reuseHiddenContextOnStack();\n pushOffscreenSuspenseHandler(workInProgress);\n null !== current &&\n propagateParentContextChanges(current, workInProgress, renderLanes, !0);\n workInProgress.childLanes = remainingChildLanes;\n return null;\n}\nfunction mountActivityChildren(workInProgress, nextProps) {\n nextProps = mountWorkInProgressOffscreenFiber(\n { mode: nextProps.mode, children: nextProps.children },\n workInProgress.mode\n );\n nextProps.ref = workInProgress.ref;\n workInProgress.child = nextProps;\n nextProps.return = workInProgress;\n return nextProps;\n}\nfunction retryActivityComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n) {\n reconcileChildFibers(workInProgress, current.child, null, renderLanes);\n current = mountActivityChildren(workInProgress, workInProgress.pendingProps);\n current.flags |= 2;\n popSuspenseHandler(workInProgress);\n workInProgress.memoizedState = null;\n return current;\n}\nfunction updateActivityComponent(current, workInProgress, renderLanes) {\n var nextProps = workInProgress.pendingProps,\n didSuspend = 0 !== (workInProgress.flags & 128);\n workInProgress.flags &= -129;\n if (null === current) {\n if (isHydrating) {\n if (\"hidden\" === nextProps.mode)\n return (\n (current = mountActivityChildren(workInProgress, nextProps)),\n (workInProgress.lanes = 536870912),\n bailoutOffscreenComponent(null, current)\n );\n pushDehydratedActivitySuspenseHandler(workInProgress);\n (current = nextHydratableInstance)\n ? ((current = canHydrateHydrationBoundary(\n current,\n rootOrSingletonContext\n )),\n (current = null !== current && \"&\" === current.data ? current : null),\n null !== current &&\n ((workInProgress.memoizedState = {\n dehydrated: current,\n treeContext:\n null !== treeContextProvider\n ? { id: treeContextId, overflow: treeContextOverflow }\n : null,\n retryLane: 536870912,\n hydrationErrors: null\n }),\n (renderLanes = createFiberFromDehydratedFragment(current)),\n (renderLanes.return = workInProgress),\n (workInProgress.child = renderLanes),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = null)))\n : (current = null);\n if (null === current) throw throwOnHydrationMismatch(workInProgress);\n workInProgress.lanes = 536870912;\n return null;\n }\n return mountActivityChildren(workInProgress, nextProps);\n }\n var prevState = current.memoizedState;\n if (null !== prevState) {\n var dehydrated = prevState.dehydrated;\n pushDehydratedActivitySuspenseHandler(workInProgress);\n if (didSuspend)\n if (workInProgress.flags & 256)\n (workInProgress.flags &= -257),\n (workInProgress = retryActivityComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n ));\n else if (null !== workInProgress.memoizedState)\n (workInProgress.child = current.child),\n (workInProgress.flags |= 128),\n (workInProgress = null);\n else throw Error(formatProdErrorMessage(558));\n else if (\n (didReceiveUpdate ||\n propagateParentContextChanges(current, workInProgress, renderLanes, !1),\n (didSuspend = 0 !== (renderLanes & current.childLanes)),\n didReceiveUpdate || didSuspend)\n ) {\n nextProps = workInProgressRoot;\n if (\n null !== nextProps &&\n ((dehydrated = getBumpedLaneForHydration(nextProps, renderLanes)),\n 0 !== dehydrated && dehydrated !== prevState.retryLane)\n )\n throw (\n ((prevState.retryLane = dehydrated),\n enqueueConcurrentRenderForLane(current, dehydrated),\n scheduleUpdateOnFiber(nextProps, current, dehydrated),\n SelectiveHydrationException)\n );\n renderDidSuspendDelayIfPossible();\n workInProgress = retryActivityComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n );\n } else\n (current = prevState.treeContext),\n (nextHydratableInstance = getNextHydratable(dehydrated.nextSibling)),\n (hydrationParentFiber = workInProgress),\n (isHydrating = !0),\n (hydrationErrors = null),\n (rootOrSingletonContext = !1),\n null !== current &&\n restoreSuspendedTreeContext(workInProgress, current),\n (workInProgress = mountActivityChildren(workInProgress, nextProps)),\n (workInProgress.flags |= 4096);\n return workInProgress;\n }\n current = createWorkInProgress(current.child, {\n mode: nextProps.mode,\n children: nextProps.children\n });\n current.ref = workInProgress.ref;\n workInProgress.child = current;\n current.return = workInProgress;\n return current;\n}\nfunction markRef(current, workInProgress) {\n var ref = workInProgress.ref;\n if (null === ref)\n null !== current &&\n null !== current.ref &&\n (workInProgress.flags |= 4194816);\n else {\n if (\"function\" !== typeof ref && \"object\" !== typeof ref)\n throw Error(formatProdErrorMessage(284));\n if (null === current || current.ref !== ref)\n workInProgress.flags |= 4194816;\n }\n}\nfunction updateFunctionComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n prepareToReadContext(workInProgress);\n Component = renderWithHooks(\n current,\n workInProgress,\n Component,\n nextProps,\n void 0,\n renderLanes\n );\n nextProps = checkDidRenderIdHook();\n if (null !== current && !didReceiveUpdate)\n return (\n bailoutHooks(current, workInProgress, renderLanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n isHydrating && nextProps && pushMaterializedTreeId(workInProgress);\n workInProgress.flags |= 1;\n reconcileChildren(current, workInProgress, Component, renderLanes);\n return workInProgress.child;\n}\nfunction replayFunctionComponent(\n current,\n workInProgress,\n nextProps,\n Component,\n secondArg,\n renderLanes\n) {\n prepareToReadContext(workInProgress);\n workInProgress.updateQueue = null;\n nextProps = renderWithHooksAgain(\n workInProgress,\n Component,\n nextProps,\n secondArg\n );\n finishRenderingHooks(current);\n Component = checkDidRenderIdHook();\n if (null !== current && !didReceiveUpdate)\n return (\n bailoutHooks(current, workInProgress, renderLanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n isHydrating && Component && pushMaterializedTreeId(workInProgress);\n workInProgress.flags |= 1;\n reconcileChildren(current, workInProgress, nextProps, renderLanes);\n return workInProgress.child;\n}\nfunction updateClassComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n prepareToReadContext(workInProgress);\n if (null === workInProgress.stateNode) {\n var context = emptyContextObject,\n contextType = Component.contextType;\n \"object\" === typeof contextType &&\n null !== contextType &&\n (context = readContext(contextType));\n context = new Component(nextProps, context);\n workInProgress.memoizedState =\n null !== context.state && void 0 !== context.state ? context.state : null;\n context.updater = classComponentUpdater;\n workInProgress.stateNode = context;\n context._reactInternals = workInProgress;\n context = workInProgress.stateNode;\n context.props = nextProps;\n context.state = workInProgress.memoizedState;\n context.refs = {};\n initializeUpdateQueue(workInProgress);\n contextType = Component.contextType;\n context.context =\n \"object\" === typeof contextType && null !== contextType\n ? readContext(contextType)\n : emptyContextObject;\n context.state = workInProgress.memoizedState;\n contextType = Component.getDerivedStateFromProps;\n \"function\" === typeof contextType &&\n (applyDerivedStateFromProps(\n workInProgress,\n Component,\n contextType,\n nextProps\n ),\n (context.state = workInProgress.memoizedState));\n \"function\" === typeof Component.getDerivedStateFromProps ||\n \"function\" === typeof context.getSnapshotBeforeUpdate ||\n (\"function\" !== typeof context.UNSAFE_componentWillMount &&\n \"function\" !== typeof context.componentWillMount) ||\n ((contextType = context.state),\n \"function\" === typeof context.componentWillMount &&\n context.componentWillMount(),\n \"function\" === typeof context.UNSAFE_componentWillMount &&\n context.UNSAFE_componentWillMount(),\n contextType !== context.state &&\n classComponentUpdater.enqueueReplaceState(context, context.state, null),\n processUpdateQueue(workInProgress, nextProps, context, renderLanes),\n suspendIfUpdateReadFromEntangledAsyncAction(),\n (context.state = workInProgress.memoizedState));\n \"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308);\n nextProps = !0;\n } else if (null === current) {\n context = workInProgress.stateNode;\n var unresolvedOldProps = workInProgress.memoizedProps,\n oldProps = resolveClassComponentProps(Component, unresolvedOldProps);\n context.props = oldProps;\n var oldContext = context.context,\n contextType$jscomp$0 = Component.contextType;\n contextType = emptyContextObject;\n \"object\" === typeof contextType$jscomp$0 &&\n null !== contextType$jscomp$0 &&\n (contextType = readContext(contextType$jscomp$0));\n var getDerivedStateFromProps = Component.getDerivedStateFromProps;\n contextType$jscomp$0 =\n \"function\" === typeof getDerivedStateFromProps ||\n \"function\" === typeof context.getSnapshotBeforeUpdate;\n unresolvedOldProps = workInProgress.pendingProps !== unresolvedOldProps;\n contextType$jscomp$0 ||\n (\"function\" !== typeof context.UNSAFE_componentWillReceiveProps &&\n \"function\" !== typeof context.componentWillReceiveProps) ||\n ((unresolvedOldProps || oldContext !== contextType) &&\n callComponentWillReceiveProps(\n workInProgress,\n context,\n nextProps,\n contextType\n ));\n hasForceUpdate = !1;\n var oldState = workInProgress.memoizedState;\n context.state = oldState;\n processUpdateQueue(workInProgress, nextProps, context, renderLanes);\n suspendIfUpdateReadFromEntangledAsyncAction();\n oldContext = workInProgress.memoizedState;\n unresolvedOldProps || oldState !== oldContext || hasForceUpdate\n ? (\"function\" === typeof getDerivedStateFromProps &&\n (applyDerivedStateFromProps(\n workInProgress,\n Component,\n getDerivedStateFromProps,\n nextProps\n ),\n (oldContext = workInProgress.memoizedState)),\n (oldProps =\n hasForceUpdate ||\n checkShouldComponentUpdate(\n workInProgress,\n Component,\n oldProps,\n nextProps,\n oldState,\n oldContext,\n contextType\n ))\n ? (contextType$jscomp$0 ||\n (\"function\" !== typeof context.UNSAFE_componentWillMount &&\n \"function\" !== typeof context.componentWillMount) ||\n (\"function\" === typeof context.componentWillMount &&\n context.componentWillMount(),\n \"function\" === typeof context.UNSAFE_componentWillMount &&\n context.UNSAFE_componentWillMount()),\n \"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308))\n : (\"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308),\n (workInProgress.memoizedProps = nextProps),\n (workInProgress.memoizedState = oldContext)),\n (context.props = nextProps),\n (context.state = oldContext),\n (context.context = contextType),\n (nextProps = oldProps))\n : (\"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308),\n (nextProps = !1));\n } else {\n context = workInProgress.stateNode;\n cloneUpdateQueue(current, workInProgress);\n contextType = workInProgress.memoizedProps;\n contextType$jscomp$0 = resolveClassComponentProps(Component, contextType);\n context.props = contextType$jscomp$0;\n getDerivedStateFromProps = workInProgress.pendingProps;\n oldState = context.context;\n oldContext = Component.contextType;\n oldProps = emptyContextObject;\n \"object\" === typeof oldContext &&\n null !== oldContext &&\n (oldProps = readContext(oldContext));\n unresolvedOldProps = Component.getDerivedStateFromProps;\n (oldContext =\n \"function\" === typeof unresolvedOldProps ||\n \"function\" === typeof context.getSnapshotBeforeUpdate) ||\n (\"function\" !== typeof context.UNSAFE_componentWillReceiveProps &&\n \"function\" !== typeof context.componentWillReceiveProps) ||\n ((contextType !== getDerivedStateFromProps || oldState !== oldProps) &&\n callComponentWillReceiveProps(\n workInProgress,\n context,\n nextProps,\n oldProps\n ));\n hasForceUpdate = !1;\n oldState = workInProgress.memoizedState;\n context.state = oldState;\n processUpdateQueue(workInProgress, nextProps, context, renderLanes);\n suspendIfUpdateReadFromEntangledAsyncAction();\n var newState = workInProgress.memoizedState;\n contextType !== getDerivedStateFromProps ||\n oldState !== newState ||\n hasForceUpdate ||\n (null !== current &&\n null !== current.dependencies &&\n checkIfContextChanged(current.dependencies))\n ? (\"function\" === typeof unresolvedOldProps &&\n (applyDerivedStateFromProps(\n workInProgress,\n Component,\n unresolvedOldProps,\n nextProps\n ),\n (newState = workInProgress.memoizedState)),\n (contextType$jscomp$0 =\n hasForceUpdate ||\n checkShouldComponentUpdate(\n workInProgress,\n Component,\n contextType$jscomp$0,\n nextProps,\n oldState,\n newState,\n oldProps\n ) ||\n (null !== current &&\n null !== current.dependencies &&\n checkIfContextChanged(current.dependencies)))\n ? (oldContext ||\n (\"function\" !== typeof context.UNSAFE_componentWillUpdate &&\n \"function\" !== typeof context.componentWillUpdate) ||\n (\"function\" === typeof context.componentWillUpdate &&\n context.componentWillUpdate(nextProps, newState, oldProps),\n \"function\" === typeof context.UNSAFE_componentWillUpdate &&\n context.UNSAFE_componentWillUpdate(\n nextProps,\n newState,\n oldProps\n )),\n \"function\" === typeof context.componentDidUpdate &&\n (workInProgress.flags |= 4),\n \"function\" === typeof context.getSnapshotBeforeUpdate &&\n (workInProgress.flags |= 1024))\n : (\"function\" !== typeof context.componentDidUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 4),\n \"function\" !== typeof context.getSnapshotBeforeUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 1024),\n (workInProgress.memoizedProps = nextProps),\n (workInProgress.memoizedState = newState)),\n (context.props = nextProps),\n (context.state = newState),\n (context.context = oldProps),\n (nextProps = contextType$jscomp$0))\n : (\"function\" !== typeof context.componentDidUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 4),\n \"function\" !== typeof context.getSnapshotBeforeUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 1024),\n (nextProps = !1));\n }\n context = nextProps;\n markRef(current, workInProgress);\n nextProps = 0 !== (workInProgress.flags & 128);\n context || nextProps\n ? ((context = workInProgress.stateNode),\n (Component =\n nextProps && \"function\" !== typeof Component.getDerivedStateFromError\n ? null\n : context.render()),\n (workInProgress.flags |= 1),\n null !== current && nextProps\n ? ((workInProgress.child = reconcileChildFibers(\n workInProgress,\n current.child,\n null,\n renderLanes\n )),\n (workInProgress.child = reconcileChildFibers(\n workInProgress,\n null,\n Component,\n renderLanes\n )))\n : reconcileChildren(current, workInProgress, Component, renderLanes),\n (workInProgress.memoizedState = context.state),\n (current = workInProgress.child))\n : (current = bailoutOnAlreadyFinishedWork(\n current,\n workInProgress,\n renderLanes\n ));\n return current;\n}\nfunction mountHostRootWithoutHydrating(\n current,\n workInProgress,\n nextChildren,\n renderLanes\n) {\n resetHydrationState();\n workInProgress.flags |= 256;\n reconcileChildren(current, workInProgress, nextChildren, renderLanes);\n return workInProgress.child;\n}\nvar SUSPENDED_MARKER = {\n dehydrated: null,\n treeContext: null,\n retryLane: 0,\n hydrationErrors: null\n};\nfunction mountSuspenseOffscreenState(renderLanes) {\n return { baseLanes: renderLanes, cachePool: getSuspendedCache() };\n}\nfunction getRemainingWorkInPrimaryTree(\n current,\n primaryTreeDidDefer,\n renderLanes\n) {\n current = null !== current ? current.childLanes & ~renderLanes : 0;\n primaryTreeDidDefer && (current |= workInProgressDeferredLane);\n return current;\n}\nfunction updateSuspenseComponent(current, workInProgress, renderLanes) {\n var nextProps = workInProgress.pendingProps,\n showFallback = !1,\n didSuspend = 0 !== (workInProgress.flags & 128),\n JSCompiler_temp;\n (JSCompiler_temp = didSuspend) ||\n (JSCompiler_temp =\n null !== current && null === current.memoizedState\n ? !1\n : 0 !== (suspenseStackCursor.current & 2));\n JSCompiler_temp && ((showFallback = !0), (workInProgress.flags &= -129));\n JSCompiler_temp = 0 !== (workInProgress.flags & 32);\n workInProgress.flags &= -33;\n if (null === current) {\n if (isHydrating) {\n showFallback\n ? pushPrimaryTreeSuspenseHandler(workInProgress)\n : reuseSuspenseHandlerOnStack(workInProgress);\n (current = nextHydratableInstance)\n ? ((current = canHydrateHydrationBoundary(\n current,\n rootOrSingletonContext\n )),\n (current = null !== current && \"&\" !== current.data ? current : null),\n null !== current &&\n ((workInProgress.memoizedState = {\n dehydrated: current,\n treeContext:\n null !== treeContextProvider\n ? { id: treeContextId, overflow: treeContextOverflow }\n : null,\n retryLane: 536870912,\n hydrationErrors: null\n }),\n (renderLanes = createFiberFromDehydratedFragment(current)),\n (renderLanes.return = workInProgress),\n (workInProgress.child = renderLanes),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = null)))\n : (current = null);\n if (null === current) throw throwOnHydrationMismatch(workInProgress);\n isSuspenseInstanceFallback(current)\n ? (workInProgress.lanes = 32)\n : (workInProgress.lanes = 536870912);\n return null;\n }\n var nextPrimaryChildren = nextProps.children;\n nextProps = nextProps.fallback;\n if (showFallback)\n return (\n reuseSuspenseHandlerOnStack(workInProgress),\n (showFallback = workInProgress.mode),\n (nextPrimaryChildren = mountWorkInProgressOffscreenFiber(\n { mode: \"hidden\", children: nextPrimaryChildren },\n showFallback\n )),\n (nextProps = createFiberFromFragment(\n nextProps,\n showFallback,\n renderLanes,\n null\n )),\n (nextPrimaryChildren.return = workInProgress),\n (nextProps.return = workInProgress),\n (nextPrimaryChildren.sibling = nextProps),\n (workInProgress.child = nextPrimaryChildren),\n (nextProps = workInProgress.child),\n (nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes)),\n (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n current,\n JSCompiler_temp,\n renderLanes\n )),\n (workInProgress.memoizedState = SUSPENDED_MARKER),\n bailoutOffscreenComponent(null, nextProps)\n );\n pushPrimaryTreeSuspenseHandler(workInProgress);\n return mountSuspensePrimaryChildren(workInProgress, nextPrimaryChildren);\n }\n var prevState = current.memoizedState;\n if (\n null !== prevState &&\n ((nextPrimaryChildren = prevState.dehydrated), null !== nextPrimaryChildren)\n ) {\n if (didSuspend)\n workInProgress.flags & 256\n ? (pushPrimaryTreeSuspenseHandler(workInProgress),\n (workInProgress.flags &= -257),\n (workInProgress = retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n )))\n : null !== workInProgress.memoizedState\n ? (reuseSuspenseHandlerOnStack(workInProgress),\n (workInProgress.child = current.child),\n (workInProgress.flags |= 128),\n (workInProgress = null))\n : (reuseSuspenseHandlerOnStack(workInProgress),\n (nextPrimaryChildren = nextProps.fallback),\n (showFallback = workInProgress.mode),\n (nextProps = mountWorkInProgressOffscreenFiber(\n { mode: \"visible\", children: nextProps.children },\n showFallback\n )),\n (nextPrimaryChildren = createFiberFromFragment(\n nextPrimaryChildren,\n showFallback,\n renderLanes,\n null\n )),\n (nextPrimaryChildren.flags |= 2),\n (nextProps.return = workInProgress),\n (nextPrimaryChildren.return = workInProgress),\n (nextProps.sibling = nextPrimaryChildren),\n (workInProgress.child = nextProps),\n reconcileChildFibers(\n workInProgress,\n current.child,\n null,\n renderLanes\n ),\n (nextProps = workInProgress.child),\n (nextProps.memoizedState =\n mountSuspenseOffscreenState(renderLanes)),\n (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n current,\n JSCompiler_temp,\n renderLanes\n )),\n (workInProgress.memoizedState = SUSPENDED_MARKER),\n (workInProgress = bailoutOffscreenComponent(null, nextProps)));\n else if (\n (pushPrimaryTreeSuspenseHandler(workInProgress),\n isSuspenseInstanceFallback(nextPrimaryChildren))\n ) {\n JSCompiler_temp =\n nextPrimaryChildren.nextSibling &&\n nextPrimaryChildren.nextSibling.dataset;\n if (JSCompiler_temp) var digest = JSCompiler_temp.dgst;\n JSCompiler_temp = digest;\n nextProps = Error(formatProdErrorMessage(419));\n nextProps.stack = \"\";\n nextProps.digest = JSCompiler_temp;\n queueHydrationError({ value: nextProps, source: null, stack: null });\n workInProgress = retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n );\n } else if (\n (didReceiveUpdate ||\n propagateParentContextChanges(current, workInProgress, renderLanes, !1),\n (JSCompiler_temp = 0 !== (renderLanes & current.childLanes)),\n didReceiveUpdate || JSCompiler_temp)\n ) {\n JSCompiler_temp = workInProgressRoot;\n if (\n null !== JSCompiler_temp &&\n ((nextProps = getBumpedLaneForHydration(JSCompiler_temp, renderLanes)),\n 0 !== nextProps && nextProps !== prevState.retryLane)\n )\n throw (\n ((prevState.retryLane = nextProps),\n enqueueConcurrentRenderForLane(current, nextProps),\n scheduleUpdateOnFiber(JSCompiler_temp, current, nextProps),\n SelectiveHydrationException)\n );\n isSuspenseInstancePending(nextPrimaryChildren) ||\n renderDidSuspendDelayIfPossible();\n workInProgress = retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n );\n } else\n isSuspenseInstancePending(nextPrimaryChildren)\n ? ((workInProgress.flags |= 192),\n (workInProgress.child = current.child),\n (workInProgress = null))\n : ((current = prevState.treeContext),\n (nextHydratableInstance = getNextHydratable(\n nextPrimaryChildren.nextSibling\n )),\n (hydrationParentFiber = workInProgress),\n (isHydrating = !0),\n (hydrationErrors = null),\n (rootOrSingletonContext = !1),\n null !== current &&\n restoreSuspendedTreeContext(workInProgress, current),\n (workInProgress = mountSuspensePrimaryChildren(\n workInProgress,\n nextProps.children\n )),\n (workInProgress.flags |= 4096));\n return workInProgress;\n }\n if (showFallback)\n return (\n reuseSuspenseHandlerOnStack(workInProgress),\n (nextPrimaryChildren = nextProps.fallback),\n (showFallback = workInProgress.mode),\n (prevState = current.child),\n (digest = prevState.sibling),\n (nextProps = createWorkInProgress(prevState, {\n mode: \"hidden\",\n children: nextProps.children\n })),\n (nextProps.subtreeFlags = prevState.subtreeFlags & 65011712),\n null !== digest\n ? (nextPrimaryChildren = createWorkInProgress(\n digest,\n nextPrimaryChildren\n ))\n : ((nextPrimaryChildren = createFiberFromFragment(\n nextPrimaryChildren,\n showFallback,\n renderLanes,\n null\n )),\n (nextPrimaryChildren.flags |= 2)),\n (nextPrimaryChildren.return = workInProgress),\n (nextProps.return = workInProgress),\n (nextProps.sibling = nextPrimaryChildren),\n (workInProgress.child = nextProps),\n bailoutOffscreenComponent(null, nextProps),\n (nextProps = workInProgress.child),\n (nextPrimaryChildren = current.child.memoizedState),\n null === nextPrimaryChildren\n ? (nextPrimaryChildren = mountSuspenseOffscreenState(renderLanes))\n : ((showFallback = nextPrimaryChildren.cachePool),\n null !== showFallback\n ? ((prevState = CacheContext._currentValue),\n (showFallback =\n showFallback.parent !== prevState\n ? { parent: prevState, pool: prevState }\n : showFallback))\n : (showFallback = getSuspendedCache()),\n (nextPrimaryChildren = {\n baseLanes: nextPrimaryChildren.baseLanes | renderLanes,\n cachePool: showFallback\n })),\n (nextProps.memoizedState = nextPrimaryChildren),\n (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n current,\n JSCompiler_temp,\n renderLanes\n )),\n (workInProgress.memoizedState = SUSPENDED_MARKER),\n bailoutOffscreenComponent(current.child, nextProps)\n );\n pushPrimaryTreeSuspenseHandler(workInProgress);\n renderLanes = current.child;\n current = renderLanes.sibling;\n renderLanes = createWorkInProgress(renderLanes, {\n mode: \"visible\",\n children: nextProps.children\n });\n renderLanes.return = workInProgress;\n renderLanes.sibling = null;\n null !== current &&\n ((JSCompiler_temp = workInProgress.deletions),\n null === JSCompiler_temp\n ? ((workInProgress.deletions = [current]), (workInProgress.flags |= 16))\n : JSCompiler_temp.push(current));\n workInProgress.child = renderLanes;\n workInProgress.memoizedState = null;\n return renderLanes;\n}\nfunction mountSuspensePrimaryChildren(workInProgress, primaryChildren) {\n primaryChildren = mountWorkInProgressOffscreenFiber(\n { mode: \"visible\", children: primaryChildren },\n workInProgress.mode\n );\n primaryChildren.return = workInProgress;\n return (workInProgress.child = primaryChildren);\n}\nfunction mountWorkInProgressOffscreenFiber(offscreenProps, mode) {\n offscreenProps = createFiberImplClass(22, offscreenProps, null, mode);\n offscreenProps.lanes = 0;\n return offscreenProps;\n}\nfunction retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n) {\n reconcileChildFibers(workInProgress, current.child, null, renderLanes);\n current = mountSuspensePrimaryChildren(\n workInProgress,\n workInProgress.pendingProps.children\n );\n current.flags |= 2;\n workInProgress.memoizedState = null;\n return current;\n}\nfunction scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) {\n fiber.lanes |= renderLanes;\n var alternate = fiber.alternate;\n null !== alternate && (alternate.lanes |= renderLanes);\n scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot);\n}\nfunction initSuspenseListRenderState(\n workInProgress,\n isBackwards,\n tail,\n lastContentRow,\n tailMode,\n treeForkCount\n) {\n var renderState = workInProgress.memoizedState;\n null === renderState\n ? (workInProgress.memoizedState = {\n isBackwards: isBackwards,\n rendering: null,\n renderingStartTime: 0,\n last: lastContentRow,\n tail: tail,\n tailMode: tailMode,\n treeForkCount: treeForkCount\n })\n : ((renderState.isBackwards = isBackwards),\n (renderState.rendering = null),\n (renderState.renderingStartTime = 0),\n (renderState.last = lastContentRow),\n (renderState.tail = tail),\n (renderState.tailMode = tailMode),\n (renderState.treeForkCount = treeForkCount));\n}\nfunction updateSuspenseListComponent(current, workInProgress, renderLanes) {\n var nextProps = workInProgress.pendingProps,\n revealOrder = nextProps.revealOrder,\n tailMode = nextProps.tail;\n nextProps = nextProps.children;\n var suspenseContext = suspenseStackCursor.current,\n shouldForceFallback = 0 !== (suspenseContext & 2);\n shouldForceFallback\n ? ((suspenseContext = (suspenseContext & 1) | 2),\n (workInProgress.flags |= 128))\n : (suspenseContext &= 1);\n push(suspenseStackCursor, suspenseContext);\n reconcileChildren(current, workInProgress, nextProps, renderLanes);\n nextProps = isHydrating ? treeForkCount : 0;\n if (!shouldForceFallback && null !== current && 0 !== (current.flags & 128))\n a: for (current = workInProgress.child; null !== current; ) {\n if (13 === current.tag)\n null !== current.memoizedState &&\n scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);\n else if (19 === current.tag)\n scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);\n else if (null !== current.child) {\n current.child.return = current;\n current = current.child;\n continue;\n }\n if (current === workInProgress) break a;\n for (; null === current.sibling; ) {\n if (null === current.return || current.return === workInProgress)\n break a;\n current = current.return;\n }\n current.sibling.return = current.return;\n current = current.sibling;\n }\n switch (revealOrder) {\n case \"forwards\":\n renderLanes = workInProgress.child;\n for (revealOrder = null; null !== renderLanes; )\n (current = renderLanes.alternate),\n null !== current &&\n null === findFirstSuspended(current) &&\n (revealOrder = renderLanes),\n (renderLanes = renderLanes.sibling);\n renderLanes = revealOrder;\n null === renderLanes\n ? ((revealOrder = workInProgress.child), (workInProgress.child = null))\n : ((revealOrder = renderLanes.sibling), (renderLanes.sibling = null));\n initSuspenseListRenderState(\n workInProgress,\n !1,\n revealOrder,\n renderLanes,\n tailMode,\n nextProps\n );\n break;\n case \"backwards\":\n case \"unstable_legacy-backwards\":\n renderLanes = null;\n revealOrder = workInProgress.child;\n for (workInProgress.child = null; null !== revealOrder; ) {\n current = revealOrder.alternate;\n if (null !== current && null === findFirstSuspended(current)) {\n workInProgress.child = revealOrder;\n break;\n }\n current = revealOrder.sibling;\n revealOrder.sibling = renderLanes;\n renderLanes = revealOrder;\n revealOrder = current;\n }\n initSuspenseListRenderState(\n workInProgress,\n !0,\n renderLanes,\n null,\n tailMode,\n nextProps\n );\n break;\n case \"together\":\n initSuspenseListRenderState(\n workInProgress,\n !1,\n null,\n null,\n void 0,\n nextProps\n );\n break;\n default:\n workInProgress.memoizedState = null;\n }\n return workInProgress.child;\n}\nfunction bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) {\n null !== current && (workInProgress.dependencies = current.dependencies);\n workInProgressRootSkippedLanes |= workInProgress.lanes;\n if (0 === (renderLanes & workInProgress.childLanes))\n if (null !== current) {\n if (\n (propagateParentContextChanges(\n current,\n workInProgress,\n renderLanes,\n !1\n ),\n 0 === (renderLanes & workInProgress.childLanes))\n )\n return null;\n } else return null;\n if (null !== current && workInProgress.child !== current.child)\n throw Error(formatProdErrorMessage(153));\n if (null !== workInProgress.child) {\n current = workInProgress.child;\n renderLanes = createWorkInProgress(current, current.pendingProps);\n workInProgress.child = renderLanes;\n for (renderLanes.return = workInProgress; null !== current.sibling; )\n (current = current.sibling),\n (renderLanes = renderLanes.sibling =\n createWorkInProgress(current, current.pendingProps)),\n (renderLanes.return = workInProgress);\n renderLanes.sibling = null;\n }\n return workInProgress.child;\n}\nfunction checkScheduledUpdateOrContext(current, renderLanes) {\n if (0 !== (current.lanes & renderLanes)) return !0;\n current = current.dependencies;\n return null !== current && checkIfContextChanged(current) ? !0 : !1;\n}\nfunction attemptEarlyBailoutIfNoScheduledUpdate(\n current,\n workInProgress,\n renderLanes\n) {\n switch (workInProgress.tag) {\n case 3:\n pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n pushProvider(workInProgress, CacheContext, current.memoizedState.cache);\n resetHydrationState();\n break;\n case 27:\n case 5:\n pushHostContext(workInProgress);\n break;\n case 4:\n pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n break;\n case 10:\n pushProvider(\n workInProgress,\n workInProgress.type,\n workInProgress.memoizedProps.value\n );\n break;\n case 31:\n if (null !== workInProgress.memoizedState)\n return (\n (workInProgress.flags |= 128),\n pushDehydratedActivitySuspenseHandler(workInProgress),\n null\n );\n break;\n case 13:\n var state$102 = workInProgress.memoizedState;\n if (null !== state$102) {\n if (null !== state$102.dehydrated)\n return (\n pushPrimaryTreeSuspenseHandler(workInProgress),\n (workInProgress.flags |= 128),\n null\n );\n if (0 !== (renderLanes & workInProgress.child.childLanes))\n return updateSuspenseComponent(current, workInProgress, renderLanes);\n pushPrimaryTreeSuspenseHandler(workInProgress);\n current = bailoutOnAlreadyFinishedWork(\n current,\n workInProgress,\n renderLanes\n );\n return null !== current ? current.sibling : null;\n }\n pushPrimaryTreeSuspenseHandler(workInProgress);\n break;\n case 19:\n var didSuspendBefore = 0 !== (current.flags & 128);\n state$102 = 0 !== (renderLanes & workInProgress.childLanes);\n state$102 ||\n (propagateParentContextChanges(\n current,\n workInProgress,\n renderLanes,\n !1\n ),\n (state$102 = 0 !== (renderLanes & workInProgress.childLanes)));\n if (didSuspendBefore) {\n if (state$102)\n return updateSuspenseListComponent(\n current,\n workInProgress,\n renderLanes\n );\n workInProgress.flags |= 128;\n }\n didSuspendBefore = workInProgress.memoizedState;\n null !== didSuspendBefore &&\n ((didSuspendBefore.rendering = null),\n (didSuspendBefore.tail = null),\n (didSuspendBefore.lastEffect = null));\n push(suspenseStackCursor, suspenseStackCursor.current);\n if (state$102) break;\n else return null;\n case 22:\n return (\n (workInProgress.lanes = 0),\n updateOffscreenComponent(\n current,\n workInProgress,\n renderLanes,\n workInProgress.pendingProps\n )\n );\n case 24:\n pushProvider(workInProgress, CacheContext, current.memoizedState.cache);\n }\n return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);\n}\nfunction beginWork(current, workInProgress, renderLanes) {\n if (null !== current)\n if (current.memoizedProps !== workInProgress.pendingProps)\n didReceiveUpdate = !0;\n else {\n if (\n !checkScheduledUpdateOrContext(current, renderLanes) &&\n 0 === (workInProgress.flags & 128)\n )\n return (\n (didReceiveUpdate = !1),\n attemptEarlyBailoutIfNoScheduledUpdate(\n current,\n workInProgress,\n renderLanes\n )\n );\n didReceiveUpdate = 0 !== (current.flags & 131072) ? !0 : !1;\n }\n else\n (didReceiveUpdate = !1),\n isHydrating &&\n 0 !== (workInProgress.flags & 1048576) &&\n pushTreeId(workInProgress, treeForkCount, workInProgress.index);\n workInProgress.lanes = 0;\n switch (workInProgress.tag) {\n case 16:\n a: {\n var props = workInProgress.pendingProps;\n current = resolveLazy(workInProgress.elementType);\n workInProgress.type = current;\n if (\"function\" === typeof current)\n shouldConstruct(current)\n ? ((props = resolveClassComponentProps(current, props)),\n (workInProgress.tag = 1),\n (workInProgress = updateClassComponent(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n )))\n : ((workInProgress.tag = 0),\n (workInProgress = updateFunctionComponent(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n )));\n else {\n if (void 0 !== current && null !== current) {\n var $$typeof = current.$$typeof;\n if ($$typeof === REACT_FORWARD_REF_TYPE) {\n workInProgress.tag = 11;\n workInProgress = updateForwardRef(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n );\n break a;\n } else if ($$typeof === REACT_MEMO_TYPE) {\n workInProgress.tag = 14;\n workInProgress = updateMemoComponent(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n );\n break a;\n }\n }\n workInProgress = getComponentNameFromType(current) || current;\n throw Error(formatProdErrorMessage(306, workInProgress, \"\"));\n }\n }\n return workInProgress;\n case 0:\n return updateFunctionComponent(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 1:\n return (\n (props = workInProgress.type),\n ($$typeof = resolveClassComponentProps(\n props,\n workInProgress.pendingProps\n )),\n updateClassComponent(\n current,\n workInProgress,\n props,\n $$typeof,\n renderLanes\n )\n );\n case 3:\n a: {\n pushHostContainer(\n workInProgress,\n workInProgress.stateNode.containerInfo\n );\n if (null === current) throw Error(formatProdErrorMessage(387));\n props = workInProgress.pendingProps;\n var prevState = workInProgress.memoizedState;\n $$typeof = prevState.element;\n cloneUpdateQueue(current, workInProgress);\n processUpdateQueue(workInProgress, props, null, renderLanes);\n var nextState = workInProgress.memoizedState;\n props = nextState.cache;\n pushProvider(workInProgress, CacheContext, props);\n props !== prevState.cache &&\n propagateContextChanges(\n workInProgress,\n [CacheContext],\n renderLanes,\n !0\n );\n suspendIfUpdateReadFromEntangledAsyncAction();\n props = nextState.element;\n if (prevState.isDehydrated)\n if (\n ((prevState = {\n element: props,\n isDehydrated: !1,\n cache: nextState.cache\n }),\n (workInProgress.updateQueue.baseState = prevState),\n (workInProgress.memoizedState = prevState),\n workInProgress.flags & 256)\n ) {\n workInProgress = mountHostRootWithoutHydrating(\n current,\n workInProgress,\n props,\n renderLanes\n );\n break a;\n } else if (props !== $$typeof) {\n $$typeof = createCapturedValueAtFiber(\n Error(formatProdErrorMessage(424)),\n workInProgress\n );\n queueHydrationError($$typeof);\n workInProgress = mountHostRootWithoutHydrating(\n current,\n workInProgress,\n props,\n renderLanes\n );\n break a;\n } else {\n current = workInProgress.stateNode.containerInfo;\n switch (current.nodeType) {\n case 9:\n current = current.body;\n break;\n default:\n current =\n \"HTML\" === current.nodeName\n ? current.ownerDocument.body\n : current;\n }\n nextHydratableInstance = getNextHydratable(current.firstChild);\n hydrationParentFiber = workInProgress;\n isHydrating = !0;\n hydrationErrors = null;\n rootOrSingletonContext = !0;\n renderLanes = mountChildFibers(\n workInProgress,\n null,\n props,\n renderLanes\n );\n for (workInProgress.child = renderLanes; renderLanes; )\n (renderLanes.flags = (renderLanes.flags & -3) | 4096),\n (renderLanes = renderLanes.sibling);\n }\n else {\n resetHydrationState();\n if (props === $$typeof) {\n workInProgress = bailoutOnAlreadyFinishedWork(\n current,\n workInProgress,\n renderLanes\n );\n break a;\n }\n reconcileChildren(current, workInProgress, props, renderLanes);\n }\n workInProgress = workInProgress.child;\n }\n return workInProgress;\n case 26:\n return (\n markRef(current, workInProgress),\n null === current\n ? (renderLanes = getResource(\n workInProgress.type,\n null,\n workInProgress.pendingProps,\n null\n ))\n ? (workInProgress.memoizedState = renderLanes)\n : isHydrating ||\n ((renderLanes = workInProgress.type),\n (current = workInProgress.pendingProps),\n (props = getOwnerDocumentFromRootContainer(\n rootInstanceStackCursor.current\n ).createElement(renderLanes)),\n (props[internalInstanceKey] = workInProgress),\n (props[internalPropsKey] = current),\n setInitialProperties(props, renderLanes, current),\n markNodeAsHoistable(props),\n (workInProgress.stateNode = props))\n : (workInProgress.memoizedState = getResource(\n workInProgress.type,\n current.memoizedProps,\n workInProgress.pendingProps,\n current.memoizedState\n )),\n null\n );\n case 27:\n return (\n pushHostContext(workInProgress),\n null === current &&\n isHydrating &&\n ((props = workInProgress.stateNode =\n resolveSingletonInstance(\n workInProgress.type,\n workInProgress.pendingProps,\n rootInstanceStackCursor.current\n )),\n (hydrationParentFiber = workInProgress),\n (rootOrSingletonContext = !0),\n ($$typeof = nextHydratableInstance),\n isSingletonScope(workInProgress.type)\n ? ((previousHydratableOnEnteringScopedSingleton = $$typeof),\n (nextHydratableInstance = getNextHydratable(props.firstChild)))\n : (nextHydratableInstance = $$typeof)),\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n markRef(current, workInProgress),\n null === current && (workInProgress.flags |= 4194304),\n workInProgress.child\n );\n case 5:\n if (null === current && isHydrating) {\n if (($$typeof = props = nextHydratableInstance))\n (props = canHydrateInstance(\n props,\n workInProgress.type,\n workInProgress.pendingProps,\n rootOrSingletonContext\n )),\n null !== props\n ? ((workInProgress.stateNode = props),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = getNextHydratable(props.firstChild)),\n (rootOrSingletonContext = !1),\n ($$typeof = !0))\n : ($$typeof = !1);\n $$typeof || throwOnHydrationMismatch(workInProgress);\n }\n pushHostContext(workInProgress);\n $$typeof = workInProgress.type;\n prevState = workInProgress.pendingProps;\n nextState = null !== current ? current.memoizedProps : null;\n props = prevState.children;\n shouldSetTextContent($$typeof, prevState)\n ? (props = null)\n : null !== nextState &&\n shouldSetTextContent($$typeof, nextState) &&\n (workInProgress.flags |= 32);\n null !== workInProgress.memoizedState &&\n (($$typeof = renderWithHooks(\n current,\n workInProgress,\n TransitionAwareHostComponent,\n null,\n null,\n renderLanes\n )),\n (HostTransitionContext._currentValue = $$typeof));\n markRef(current, workInProgress);\n reconcileChildren(current, workInProgress, props, renderLanes);\n return workInProgress.child;\n case 6:\n if (null === current && isHydrating) {\n if ((current = renderLanes = nextHydratableInstance))\n (renderLanes = canHydrateTextInstance(\n renderLanes,\n workInProgress.pendingProps,\n rootOrSingletonContext\n )),\n null !== renderLanes\n ? ((workInProgress.stateNode = renderLanes),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = null),\n (current = !0))\n : (current = !1);\n current || throwOnHydrationMismatch(workInProgress);\n }\n return null;\n case 13:\n return updateSuspenseComponent(current, workInProgress, renderLanes);\n case 4:\n return (\n pushHostContainer(\n workInProgress,\n workInProgress.stateNode.containerInfo\n ),\n (props = workInProgress.pendingProps),\n null === current\n ? (workInProgress.child = reconcileChildFibers(\n workInProgress,\n null,\n props,\n renderLanes\n ))\n : reconcileChildren(current, workInProgress, props, renderLanes),\n workInProgress.child\n );\n case 11:\n return updateForwardRef(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 7:\n return (\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps,\n renderLanes\n ),\n workInProgress.child\n );\n case 8:\n return (\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n workInProgress.child\n );\n case 12:\n return (\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n workInProgress.child\n );\n case 10:\n return (\n (props = workInProgress.pendingProps),\n pushProvider(workInProgress, workInProgress.type, props.value),\n reconcileChildren(current, workInProgress, props.children, renderLanes),\n workInProgress.child\n );\n case 9:\n return (\n ($$typeof = workInProgress.type._context),\n (props = workInProgress.pendingProps.children),\n prepareToReadContext(workInProgress),\n ($$typeof = readContext($$typeof)),\n (props = props($$typeof)),\n (workInProgress.flags |= 1),\n reconcileChildren(current, workInProgress, props, renderLanes),\n workInProgress.child\n );\n case 14:\n return updateMemoComponent(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 15:\n return updateSimpleMemoComponent(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 19:\n return updateSuspenseListComponent(current, workInProgress, renderLanes);\n case 31:\n return updateActivityComponent(current, workInProgress, renderLanes);\n case 22:\n return updateOffscreenComponent(\n current,\n workInProgress,\n renderLanes,\n workInProgress.pendingProps\n );\n case 24:\n return (\n prepareToReadContext(workInProgress),\n (props = readContext(CacheContext)),\n null === current\n ? (($$typeof = peekCacheFromPool()),\n null === $$typeof &&\n (($$typeof = workInProgressRoot),\n (prevState = createCache()),\n ($$typeof.pooledCache = prevState),\n prevState.refCount++,\n null !== prevState && ($$typeof.pooledCacheLanes |= renderLanes),\n ($$typeof = prevState)),\n (workInProgress.memoizedState = { parent: props, cache: $$typeof }),\n initializeUpdateQueue(workInProgress),\n pushProvider(workInProgress, CacheContext, $$typeof))\n : (0 !== (current.lanes & renderLanes) &&\n (cloneUpdateQueue(current, workInProgress),\n processUpdateQueue(workInProgress, null, null, renderLanes),\n suspendIfUpdateReadFromEntangledAsyncAction()),\n ($$typeof = current.memoizedState),\n (prevState = workInProgress.memoizedState),\n $$typeof.parent !== props\n ? (($$typeof = { parent: props, cache: props }),\n (workInProgress.memoizedState = $$typeof),\n 0 === workInProgress.lanes &&\n (workInProgress.memoizedState =\n workInProgress.updateQueue.baseState =\n $$typeof),\n pushProvider(workInProgress, CacheContext, props))\n : ((props = prevState.cache),\n pushProvider(workInProgress, CacheContext, props),\n props !== $$typeof.cache &&\n propagateContextChanges(\n workInProgress,\n [CacheContext],\n renderLanes,\n !0\n ))),\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n workInProgress.child\n );\n case 29:\n throw workInProgress.pendingProps;\n }\n throw Error(formatProdErrorMessage(156, workInProgress.tag));\n}\nfunction markUpdate(workInProgress) {\n workInProgress.flags |= 4;\n}\nfunction preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n type,\n oldProps,\n newProps,\n renderLanes\n) {\n if ((type = 0 !== (workInProgress.mode & 32))) type = !1;\n if (type) {\n if (\n ((workInProgress.flags |= 16777216),\n (renderLanes & 335544128) === renderLanes)\n )\n if (workInProgress.stateNode.complete) workInProgress.flags |= 8192;\n else if (shouldRemainOnPreviousScreen()) workInProgress.flags |= 8192;\n else\n throw (\n ((suspendedThenable = noopSuspenseyCommitThenable),\n SuspenseyCommitException)\n );\n } else workInProgress.flags &= -16777217;\n}\nfunction preloadResourceAndSuspendIfNeeded(workInProgress, resource) {\n if (\"stylesheet\" !== resource.type || 0 !== (resource.state.loading & 4))\n workInProgress.flags &= -16777217;\n else if (((workInProgress.flags |= 16777216), !preloadResource(resource)))\n if (shouldRemainOnPreviousScreen()) workInProgress.flags |= 8192;\n else\n throw (\n ((suspendedThenable = noopSuspenseyCommitThenable),\n SuspenseyCommitException)\n );\n}\nfunction scheduleRetryEffect(workInProgress, retryQueue) {\n null !== retryQueue && (workInProgress.flags |= 4);\n workInProgress.flags & 16384 &&\n ((retryQueue =\n 22 !== workInProgress.tag ? claimNextRetryLane() : 536870912),\n (workInProgress.lanes |= retryQueue),\n (workInProgressSuspendedRetryLanes |= retryQueue));\n}\nfunction cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {\n if (!isHydrating)\n switch (renderState.tailMode) {\n case \"hidden\":\n hasRenderedATailFallback = renderState.tail;\n for (var lastTailNode = null; null !== hasRenderedATailFallback; )\n null !== hasRenderedATailFallback.alternate &&\n (lastTailNode = hasRenderedATailFallback),\n (hasRenderedATailFallback = hasRenderedATailFallback.sibling);\n null === lastTailNode\n ? (renderState.tail = null)\n : (lastTailNode.sibling = null);\n break;\n case \"collapsed\":\n lastTailNode = renderState.tail;\n for (var lastTailNode$106 = null; null !== lastTailNode; )\n null !== lastTailNode.alternate && (lastTailNode$106 = lastTailNode),\n (lastTailNode = lastTailNode.sibling);\n null === lastTailNode$106\n ? hasRenderedATailFallback || null === renderState.tail\n ? (renderState.tail = null)\n : (renderState.tail.sibling = null)\n : (lastTailNode$106.sibling = null);\n }\n}\nfunction bubbleProperties(completedWork) {\n var didBailout =\n null !== completedWork.alternate &&\n completedWork.alternate.child === completedWork.child,\n newChildLanes = 0,\n subtreeFlags = 0;\n if (didBailout)\n for (var child$107 = completedWork.child; null !== child$107; )\n (newChildLanes |= child$107.lanes | child$107.childLanes),\n (subtreeFlags |= child$107.subtreeFlags & 65011712),\n (subtreeFlags |= child$107.flags & 65011712),\n (child$107.return = completedWork),\n (child$107 = child$107.sibling);\n else\n for (child$107 = completedWork.child; null !== child$107; )\n (newChildLanes |= child$107.lanes | child$107.childLanes),\n (subtreeFlags |= child$107.subtreeFlags),\n (subtreeFlags |= child$107.flags),\n (child$107.return = completedWork),\n (child$107 = child$107.sibling);\n completedWork.subtreeFlags |= subtreeFlags;\n completedWork.childLanes = newChildLanes;\n return didBailout;\n}\nfunction completeWork(current, workInProgress, renderLanes) {\n var newProps = workInProgress.pendingProps;\n popTreeContext(workInProgress);\n switch (workInProgress.tag) {\n case 16:\n case 15:\n case 0:\n case 11:\n case 7:\n case 8:\n case 12:\n case 9:\n case 14:\n return bubbleProperties(workInProgress), null;\n case 1:\n return bubbleProperties(workInProgress), null;\n case 3:\n renderLanes = workInProgress.stateNode;\n newProps = null;\n null !== current && (newProps = current.memoizedState.cache);\n workInProgress.memoizedState.cache !== newProps &&\n (workInProgress.flags |= 2048);\n popProvider(CacheContext);\n popHostContainer();\n renderLanes.pendingContext &&\n ((renderLanes.context = renderLanes.pendingContext),\n (renderLanes.pendingContext = null));\n if (null === current || null === current.child)\n popHydrationState(workInProgress)\n ? markUpdate(workInProgress)\n : null === current ||\n (current.memoizedState.isDehydrated &&\n 0 === (workInProgress.flags & 256)) ||\n ((workInProgress.flags |= 1024),\n upgradeHydrationErrorsToRecoverable());\n bubbleProperties(workInProgress);\n return null;\n case 26:\n var type = workInProgress.type,\n nextResource = workInProgress.memoizedState;\n null === current\n ? (markUpdate(workInProgress),\n null !== nextResource\n ? (bubbleProperties(workInProgress),\n preloadResourceAndSuspendIfNeeded(workInProgress, nextResource))\n : (bubbleProperties(workInProgress),\n preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n type,\n null,\n newProps,\n renderLanes\n )))\n : nextResource\n ? nextResource !== current.memoizedState\n ? (markUpdate(workInProgress),\n bubbleProperties(workInProgress),\n preloadResourceAndSuspendIfNeeded(workInProgress, nextResource))\n : (bubbleProperties(workInProgress),\n (workInProgress.flags &= -16777217))\n : ((current = current.memoizedProps),\n current !== newProps && markUpdate(workInProgress),\n bubbleProperties(workInProgress),\n preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n type,\n current,\n newProps,\n renderLanes\n ));\n return null;\n case 27:\n popHostContext(workInProgress);\n renderLanes = rootInstanceStackCursor.current;\n type = workInProgress.type;\n if (null !== current && null != workInProgress.stateNode)\n current.memoizedProps !== newProps && markUpdate(workInProgress);\n else {\n if (!newProps) {\n if (null === workInProgress.stateNode)\n throw Error(formatProdErrorMessage(166));\n bubbleProperties(workInProgress);\n return null;\n }\n current = contextStackCursor.current;\n popHydrationState(workInProgress)\n ? prepareToHydrateHostInstance(workInProgress, current)\n : ((current = resolveSingletonInstance(type, newProps, renderLanes)),\n (workInProgress.stateNode = current),\n markUpdate(workInProgress));\n }\n bubbleProperties(workInProgress);\n return null;\n case 5:\n popHostContext(workInProgress);\n type = workInProgress.type;\n if (null !== current && null != workInProgress.stateNode)\n current.memoizedProps !== newProps && markUpdate(workInProgress);\n else {\n if (!newProps) {\n if (null === workInProgress.stateNode)\n throw Error(formatProdErrorMessage(166));\n bubbleProperties(workInProgress);\n return null;\n }\n nextResource = contextStackCursor.current;\n if (popHydrationState(workInProgress))\n prepareToHydrateHostInstance(workInProgress, nextResource);\n else {\n var ownerDocument = getOwnerDocumentFromRootContainer(\n rootInstanceStackCursor.current\n );\n switch (nextResource) {\n case 1:\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/2000/svg\",\n type\n );\n break;\n case 2:\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/1998/Math/MathML\",\n type\n );\n break;\n default:\n switch (type) {\n case \"svg\":\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/2000/svg\",\n type\n );\n break;\n case \"math\":\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/1998/Math/MathML\",\n type\n );\n break;\n case \"script\":\n nextResource = ownerDocument.createElement(\"div\");\n nextResource.innerHTML = \" + From 8a53ce8d775996b59fce587ef639c0e00e62fcd1 Mon Sep 17 00:00:00 2001 From: "DAL\\Administrator" <3452720699@qq.com> Date: Wed, 26 Aug 2026 14:55:31 +0800 Subject: [PATCH 06/50] feat(vnext): complete C5 shared UI and web migration --- .gitattributes | 1 + .github/workflows/ci.yml | 35 + .gitignore | 5 + README.md | 17 +- apps/web/checks/web-composition.contract.mjs | 17 + apps/web/e2e/web-ui.spec.mjs | 233 ++ apps/web/index.html | 15 + apps/web/package.json | 14 +- apps/web/playwright.config.mjs | 16 + apps/web/public/favicon.svg | 5 + apps/web/src/main.tsx | 43 + apps/web/src/pairing.ts | 106 + apps/web/src/styles.css | 7 + apps/web/vite.config.ts | 19 + .../CodexProviderSync.Core.Tests.csproj | 1 + .../CodexProviderSync.FixtureHost.csproj | 14 + .../FixtureHost/Program.cs | 59 + docs/README_WEB_UI_ZH.md | 28 +- ...npm-workspace-and-dependency-boundaries.md | 23 +- .../contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md | 19 +- docs/architecture/contracts/ERROR_CODES_ZH.md | 8 +- docs/migration/BEHAVIOR_FIXTURES_ZH.md | 12 +- .../VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md | 4 +- .../evidence/C5_SHARED_UI_WEB_2026-08-26.md | 56 + package-lock.json | 2070 +++++++++++++++-- package.json | 6 +- packages/app-ui/checks/surface.contract.mjs | 35 +- packages/app-ui/package.json | 20 +- packages/app-ui/src/App.tsx | 622 +++++ packages/app-ui/src/i18n.ts | 333 +++ packages/app-ui/src/index.ts | 31 +- packages/app-ui/src/routes.ts | 12 + packages/app-ui/src/schemas.ts | 49 + packages/app-ui/src/types.ts | 41 + packages/app-ui/src/ui.tsx | 180 ++ packages/app-ui/tsconfig.json | 3 +- .../contracts/checks/contracts.contract.mjs | 7 +- packages/contracts/dist/dto.d.ts | 259 +++ packages/contracts/dist/dto.js | 19 + packages/contracts/dist/errors.d.ts | 20 + packages/contracts/dist/errors.js | 224 ++ packages/contracts/dist/index.d.ts | 4 + packages/contracts/dist/index.js | 4 + packages/contracts/dist/json.d.ts | 5 + packages/contracts/dist/json.js | 1 + packages/contracts/dist/protocol.d.ts | 46 + packages/contracts/dist/protocol.js | 504 ++++ packages/contracts/src/dto.ts | 4 +- packages/contracts/src/protocol.ts | 7 +- .../checks/core-client.contract.mjs | 28 +- .../core/checks/core-surface.contract.mjs | 32 +- packages/core/src/index.js | 255 +- .../design-system/checks/surface.contract.mjs | 10 +- packages/design-system/package.json | 3 +- packages/design-system/src/index.ts | 6 +- packages/design-system/src/tokens.css | 75 + .../test-fixtures/checks/runner.contract.mjs | 14 + .../fixture.json | 18 + .../input/codex-home/.codex-global-state.json | 12 + .../codex-home/.codex-global-state.json.bak | 12 + .../input/codex-home/config.toml | 5 + .../2026/08/26/rollout-synthetic.jsonl | 1 + .../input/codex-home/sqlite/.gitkeep | 1 + .../sqlite-seed.sql | 20 + .../foreign-pending-restore/fixture.json | 19 + .../input/codex-home/.codex-global-state.json | 12 + .../codex-home/.codex-global-state.json.bak | 12 + .../input/codex-home/config.toml | 5 + .../2026/08/26/rollout-synthetic.jsonl | 1 + .../input/codex-home/sqlite/.gitkeep | 1 + .../foreign-pending-restore/sqlite-seed.sql | 20 + scripts/run-web-ui-fixture.js | 74 + scripts/smoke-root-tarball.js | 219 +- scripts/verify-workspace-boundaries.js | 18 +- src/backup.js | 126 +- src/web-core-adapter.js | 132 ++ src/web-server.js | 57 +- test-support/cross-runtime-fixtures.mjs | 236 ++ .../cross-runtime-node-crash-host.mjs | 13 + test/history-requests.test.js | 26 - test/profile-refresh.test.js | 134 -- test/sync-service.test.js | 85 + test/web-server.test.js | 141 +- test/workspace-boundaries.test.js | 8 +- tsconfig.base.json | 1 + web/dist/assets/index-C3tdtTcI.css | 1 - web/dist/assets/index-DAOqepUV.js | 11 - web/dist/assets/index-DAOqepUV.js.map | 1 - web/dist/assets/index-DmjSO4SI.css | 2 + web/dist/assets/index-g29kd_F3.js | 113 + web/dist/assets/index-g29kd_F3.js.map | 1 + web/dist/favicon.svg | 5 + web/dist/index.html | 13 +- web/index.html | 14 - web/src/App.jsx | 1111 --------- web/src/api.js | 109 - web/src/api.test.js | 37 - web/src/history-requests.js | 24 - web/src/hooks.js | 18 - web/src/icons.jsx | 21 - web/src/main.jsx | 11 - web/src/operation-state.js | 102 - web/src/operation-state.test.js | 205 -- web/src/profile-refresh.js | 35 - web/src/styles.css | 354 --- web/vite.config.js | 20 - 106 files changed, 6782 insertions(+), 2521 deletions(-) create mode 100644 apps/web/checks/web-composition.contract.mjs create mode 100644 apps/web/e2e/web-ui.spec.mjs create mode 100644 apps/web/index.html create mode 100644 apps/web/playwright.config.mjs create mode 100644 apps/web/public/favicon.svg create mode 100644 apps/web/src/main.tsx create mode 100644 apps/web/src/pairing.ts create mode 100644 apps/web/src/styles.css create mode 100644 apps/web/vite.config.ts create mode 100644 desktop/CodexProviderSync.Core.Tests/FixtureHost/CodexProviderSync.FixtureHost.csproj create mode 100644 desktop/CodexProviderSync.Core.Tests/FixtureHost/Program.cs create mode 100644 docs/migration/evidence/C5_SHARED_UI_WEB_2026-08-26.md create mode 100644 packages/app-ui/src/App.tsx create mode 100644 packages/app-ui/src/i18n.ts create mode 100644 packages/app-ui/src/routes.ts create mode 100644 packages/app-ui/src/schemas.ts create mode 100644 packages/app-ui/src/types.ts create mode 100644 packages/app-ui/src/ui.tsx create mode 100644 packages/contracts/dist/dto.d.ts create mode 100644 packages/contracts/dist/dto.js create mode 100644 packages/contracts/dist/errors.d.ts create mode 100644 packages/contracts/dist/errors.js create mode 100644 packages/contracts/dist/index.d.ts create mode 100644 packages/contracts/dist/index.js create mode 100644 packages/contracts/dist/json.d.ts create mode 100644 packages/contracts/dist/json.js create mode 100644 packages/contracts/dist/protocol.d.ts create mode 100644 packages/contracts/dist/protocol.js create mode 100644 packages/design-system/src/tokens.css create mode 100644 packages/test-fixtures/static/bidirectional-backup-roundtrip/fixture.json create mode 100644 packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/.codex-global-state.json create mode 100644 packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/.codex-global-state.json.bak create mode 100644 packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/config.toml create mode 100644 packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/sessions/2026/08/26/rollout-synthetic.jsonl create mode 100644 packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/sqlite/.gitkeep create mode 100644 packages/test-fixtures/static/bidirectional-backup-roundtrip/sqlite-seed.sql create mode 100644 packages/test-fixtures/static/foreign-pending-restore/fixture.json create mode 100644 packages/test-fixtures/static/foreign-pending-restore/input/codex-home/.codex-global-state.json create mode 100644 packages/test-fixtures/static/foreign-pending-restore/input/codex-home/.codex-global-state.json.bak create mode 100644 packages/test-fixtures/static/foreign-pending-restore/input/codex-home/config.toml create mode 100644 packages/test-fixtures/static/foreign-pending-restore/input/codex-home/sessions/2026/08/26/rollout-synthetic.jsonl create mode 100644 packages/test-fixtures/static/foreign-pending-restore/input/codex-home/sqlite/.gitkeep create mode 100644 packages/test-fixtures/static/foreign-pending-restore/sqlite-seed.sql create mode 100644 scripts/run-web-ui-fixture.js create mode 100644 src/web-core-adapter.js create mode 100644 test-support/cross-runtime-fixtures.mjs create mode 100644 test-support/cross-runtime-node-crash-host.mjs delete mode 100644 test/history-requests.test.js delete mode 100644 test/profile-refresh.test.js delete mode 100644 web/dist/assets/index-C3tdtTcI.css delete mode 100644 web/dist/assets/index-DAOqepUV.js delete mode 100644 web/dist/assets/index-DAOqepUV.js.map create mode 100644 web/dist/assets/index-DmjSO4SI.css create mode 100644 web/dist/assets/index-g29kd_F3.js create mode 100644 web/dist/assets/index-g29kd_F3.js.map create mode 100644 web/dist/favicon.svg delete mode 100644 web/index.html delete mode 100644 web/src/App.jsx delete mode 100644 web/src/api.js delete mode 100644 web/src/api.test.js delete mode 100644 web/src/history-requests.js delete mode 100644 web/src/hooks.js delete mode 100644 web/src/icons.jsx delete mode 100644 web/src/main.jsx delete mode 100644 web/src/operation-state.js delete mode 100644 web/src/operation-state.test.js delete mode 100644 web/src/profile-refresh.js delete mode 100644 web/src/styles.css delete mode 100644 web/vite.config.js diff --git a/.gitattributes b/.gitattributes index 79a730b..1261ca0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ web/index.html text eol=lf web/dist/index.html text eol=lf +web/dist/assets/*.js text eol=lf -whitespace diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bcbeb04..8575a3e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -92,6 +92,19 @@ jobs: - run: npm ci - run: npm run web:build + web-browser: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: "24" + cache: "npm" + - run: npm ci + - run: npm run web:build + - run: npx playwright install --with-deps chromium + - run: npm run web:test:e2e + dependency-audit: runs-on: ubuntu-latest steps: @@ -106,6 +119,22 @@ jobs: - name: Reject full-tree high and critical vulnerabilities run: npm audit --audit-level=high + cross-runtime-fixtures: + runs-on: windows-latest + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: "24" + cache: "npm" + - uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0 + with: + dotnet-version: "10.0.x" + - run: npm ci + - run: dotnet build desktop/CodexProviderSync.Core.Tests/FixtureHost/CodexProviderSync.FixtureHost.csproj --configuration Release + - run: dotnet build desktop/CodexProviderSync.Core.Tests/CrashHost/CodexProviderSync.CrashHost.csproj --configuration Release + - run: npm run fixtures:cross-runtime + desktop-test: runs-on: windows-latest steps: @@ -149,7 +178,9 @@ jobs: - workspace-contract - root-package-compat - web-build + - web-browser - dependency-audit + - cross-runtime-fixtures - desktop-test - desktop-macos - desktop-linux-lock @@ -161,7 +192,9 @@ jobs: WORKSPACE_CONTRACT_RESULT: ${{ needs.workspace-contract.result }} ROOT_PACKAGE_COMPAT_RESULT: ${{ needs.root-package-compat.result }} WEB_BUILD_RESULT: ${{ needs.web-build.result }} + WEB_BROWSER_RESULT: ${{ needs.web-browser.result }} DEPENDENCY_AUDIT_RESULT: ${{ needs.dependency-audit.result }} + CROSS_RUNTIME_FIXTURES_RESULT: ${{ needs.cross-runtime-fixtures.result }} DESKTOP_TEST_RESULT: ${{ needs.desktop-test.result }} MACOS_TEST_RESULT: ${{ needs.desktop-macos.result }} LINUX_LOCK_RESULT: ${{ needs.desktop-linux-lock.result }} @@ -170,7 +203,9 @@ jobs: [ "$WORKSPACE_CONTRACT_RESULT" != "success" ] || [ "$ROOT_PACKAGE_COMPAT_RESULT" != "success" ] || [ "$WEB_BUILD_RESULT" != "success" ] || + [ "$WEB_BROWSER_RESULT" != "success" ] || [ "$DEPENDENCY_AUDIT_RESULT" != "success" ] || + [ "$CROSS_RUNTIME_FIXTURES_RESULT" != "success" ] || [ "$DESKTOP_TEST_RESULT" != "success" ] || [ "$MACOS_TEST_RESULT" != "success" ] || [ "$LINUX_LOCK_RESULT" != "success" ]; then diff --git a/.gitignore b/.gitignore index dea073d..e5f4803 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ node_modules/ apps/*/dist/ packages/*/dist/ +!packages/contracts/dist/ +!packages/contracts/dist/** apps/*/*.tsbuildinfo packages/*/*.tsbuildinfo coverage/ @@ -11,3 +13,6 @@ desktop/**/obj/ *.csproj.user test/*.exe WORKLOG*.md +.playwright-cli/ +apps/web/test-results/ +apps/web/playwright-report/ diff --git a/README.md b/README.md index 50f92de..cd77072 100644 --- a/README.md +++ b/README.md @@ -74,13 +74,13 @@ codex-provider web --port 8792 # 指定端口 codex-provider web --reset-access # 重新配对浏览器 ``` -Web UI 默认只监听 `127.0.0.1`,并自动打开浏览器完成配对。存储路径由页面顶部的存储配置(Profile)管理,写操作需要确认。 +Web UI 默认只监听 `127.0.0.1`,并自动打开浏览器完成配对。共享 React 界面通过版本化 `HttpCoreClient` 调用本地 Web Host;存储路径由服务端 Profile 管理,Sync、Switch 与 Restore 均先显示计划再确认。 #### 切换 Provider 后同步历史 1. 使用 CCSwitch 等常用工具切换 Provider。 -2. 在 Web UI 点击“读取状态”(可跳过)。 -3. 保持“仅同步元数据”,选择目标 Provider(供应商),确认执行同步。 +2. 在“概览”检查当前 Provider 与两侧分布。 +3. 进入“同步”,生成计划并确认执行。 4. 显示“Provider 元数据已对齐”即完成。 > **注意:** 元数据同步只能恢复历史可见性。跨供应商继续旧会话时,目标后端可能无法解密会话中的 `encrypted_content` 推理内容,导致继续对话或压缩(compact)失败。 @@ -123,15 +123,16 @@ SQLite Home 解析顺序:`--sqlite-home` → `config.toml` 根级 `sqlite_home ```mermaid flowchart LR - Browser["Browser Web UI"] --> WebServer["Local Node Web Server
127.0.0.1"] - WebServer --> NodeService["Node Service"] - CLI["Node CLI"] --> NodeService + Browser["Browser React UI"] --> HttpClient["HttpCoreClient"] + HttpClient --> WebServer["Local Web Host
127.0.0.1 + pairing"] + WebServer --> NodeCore["Node Core public facade"] + CLI["Node CLI"] --> NodeCore WindowsGUI["Windows GUI"] --> Application[".NET Application"] Application --> DotNetCore[".NET Core"] MacGUI["macOS GUI"] --> DotNetCore - NodeService --> Storage["Codex Storage"] + NodeCore --> Storage["Codex Storage"] DotNetCore --> Storage Storage --> Config["config.toml"] @@ -140,7 +141,7 @@ flowchart LR Storage --> Backups["managed backups"] ``` -- Web UI 和 CLI 使用同一套 Node 服务逻辑。 +- Web UI 的业务请求经 `HttpCoreClient → /api/core → Node Core public facade`;CLI 直接调用同一公开 Core 边界,不解析彼此的人类输出。 - Windows GUI 通过 Application 层调用 .NET Core;macOS GUI 当前直接调用 .NET Core。 - Node 服务和 .NET Core 处理相同的配置、rollout、SQLite 和备份安全边界。 diff --git a/apps/web/checks/web-composition.contract.mjs b/apps/web/checks/web-composition.contract.mjs new file mode 100644 index 0000000..e5a3d93 --- /dev/null +++ b/apps/web/checks/web-composition.contract.mjs @@ -0,0 +1,17 @@ +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import test from "node:test"; + +test("Web composition injects HttpCoreClient and keeps host APIs separate", async () => { + const main = await fs.readFile(new URL("../src/main.tsx", import.meta.url), "utf8"); + const pairing = await fs.readFile(new URL("../src/pairing.ts", import.meta.url), "utf8"); + assert.match(main, /new HttpCoreClient/); + assert.match(main, / match[1]); + assert.equal(storedKeys.every((key) => /DEVICE_STORAGE_KEY|LOCALE_STORAGE_KEY|THEME_STORAGE_KEY/.test(key)), true); +}); diff --git a/apps/web/e2e/web-ui.spec.mjs b/apps/web/e2e/web-ui.spec.mjs new file mode 100644 index 0000000..ed26cad --- /dev/null +++ b/apps/web/e2e/web-ui.spec.mjs @@ -0,0 +1,233 @@ +import { expect, test } from "@playwright/test"; + +import { createWebUiFixture } from "../../../scripts/run-web-ui-fixture.js"; + +let fixture; + +test.beforeAll(async () => { + fixture = await createWebUiFixture(); +}); + +test.afterAll(async () => { + await fixture?.close(); +}); + +test("paired production UI keeps history lazy and Apply opaque", async ({ page }) => { + const consoleErrors = []; + const coreRequests = []; + page.on("console", (message) => { + if (message.type() === "error") consoleErrors.push(message.text()); + }); + page.on("request", (request) => { + if (request.url() !== `${fixture.origin}/api/core` || request.method() !== "POST") return; + const payload = request.postDataJSON(); + coreRequests.push(payload); + }); + + const response = await page.goto(fixture.pairingUrl); + expect(response?.status()).toBe(200); + const contentSecurityPolicy = response?.headers()["content-security-policy"] ?? ""; + expect(contentSecurityPolicy).toContain("style-src 'self'"); + expect(contentSecurityPolicy).not.toContain("unsafe-inline"); + const nonce = /script-src 'self' 'nonce-([^']+)'/.exec(contentSecurityPolicy)?.[1]; + expect(nonce).toBeTruthy(); + expect(await page.locator("script[nonce]").evaluate((element) => element.nonce)).toBe(nonce); + await expect(page).toHaveURL(`${fixture.origin}/`); + await expect(page.getByRole("heading", { name: "Provider metadata overview" })).toBeVisible(); + await expect(page.locator("html")).toHaveAttribute("lang", "en"); + await page.keyboard.press("Tab"); + await expect(page.getByRole("link", { name: "Skip to content" })).toBeFocused(); + await page.keyboard.press("Enter"); + await expect(page.locator("#main-content")).toBeFocused(); + expect(coreRequests.some((entry) => entry.method === "listHistory")).toBe(false); + expect(coreRequests.some((entry) => entry.method === "getHistorySession")).toBe(false); + expect(JSON.stringify(coreRequests)).not.toContain("C5_BODY_ONLY_MARKER"); + expect(JSON.stringify(coreRequests)).not.toMatch(/codexHome|sqliteHome|cwd/i); + + const pages = [ + ["Sync", "Sync current Provider"], + ["Switch Provider", "Switch Provider"], + ["Backups / Restore", "Backups and Restore"], + ["Profiles", "Profiles"], + ["Diagnostics", "Diagnostics"], + ["Settings", "Settings"], + ["Overview", "Provider metadata overview"] + ]; + for (const [navigation, heading] of pages) { + await page.getByRole("button", { name: navigation, exact: true }).click(); + await expect(page.getByRole("heading", { name: heading, level: 1 })).toBeVisible(); + } + + await page.getByRole("button", { name: "History", exact: true }).click(); + await expect(page.getByRole("heading", { name: "History", level: 1 })).toBeVisible(); + await expect(page.getByText("Synthetic History")).toBeVisible(); + expect(coreRequests.filter((entry) => entry.method === "listHistory")).toHaveLength(1); + expect(coreRequests.some((entry) => entry.method === "getHistorySession")).toBe(false); + await expect(page.getByText("C5_BODY_ONLY_MARKER")).toHaveCount(0); + + await page.getByRole("button", { name: "Open session" }).click(); + await expect(page.getByText("C5_BODY_ONLY_MARKER")).toBeVisible(); + expect(coreRequests.filter((entry) => entry.method === "getHistorySession")).toHaveLength(1); + await page.getByRole("button", { name: "Back to sessions" }).click(); + await expect(page.getByText("C5_BODY_ONLY_MARKER")).toHaveCount(0); + await page.getByRole("button", { name: "Overview", exact: true }).click(); + await page.getByRole("button", { name: "History", exact: true }).click(); + await expect(page.getByText("C5_BODY_ONLY_MARKER")).toHaveCount(0); + + await page.getByRole("button", { name: "Settings", exact: true }).click(); + await page.getByLabel("Language").selectOption("zh-CN"); + await expect(page.getByRole("heading", { name: "设置", level: 1 })).toBeVisible(); + await expect(page.locator("html")).toHaveAttribute("lang", "zh-CN"); + await expect(page.getByLabel("存储配置")).toBeVisible(); + await expect(page.locator('nav[aria-label="主导航"]')).toBeVisible(); + await expect(page.getByText("英文为兜底语言")).toBeVisible(); + await page.getByLabel("语言").selectOption("en"); + await expect(page.getByRole("heading", { name: "Settings", level: 1 })).toBeVisible(); + await expect(page.locator("html")).toHaveAttribute("lang", "en"); + await page.getByRole("button", { name: "Dark", exact: true }).click(); + await expect.poll(() => page.evaluate(() => document.documentElement.dataset.theme)).toBe("dark"); + await page.emulateMedia({ reducedMotion: "reduce" }); + expect(parseFloat(await page.getByRole("button", { name: "Overview", exact: true }).evaluate((element) => getComputedStyle(element).transitionDuration))).toBeLessThanOrEqual(0.001); + + await page.setViewportSize({ width: 640, height: 900 }); + for (const [navigation, heading] of [...pages, ["History", "History"]]) { + await page.getByRole("button", { name: navigation, exact: true }).click(); + await expect(page.getByRole("heading", { name: heading, level: 1 })).toBeVisible(); + await page.evaluate(() => new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve)))); + const layout = await page.evaluate(() => ({ + clientWidth: document.documentElement.clientWidth, + scrollWidth: document.documentElement.scrollWidth + })); + expect(layout.scrollWidth, `${navigation} overflowed the 640px/200% equivalent viewport`).toBeLessThanOrEqual(layout.clientWidth); + } + + await page.getByRole("button", { name: "Sync", exact: true }).click(); + const prepare = page.getByRole("button", { name: "Prepare sync" }); + await prepare.click(); + await expect(page.getByRole("dialog", { name: "Review plan" })).toBeVisible(); + await page.keyboard.press("Escape"); + await expect(prepare).toBeFocused(); + + await prepare.click(); + await page.getByRole("button", { name: "Confirm and apply" }).click(); + await expect(page.getByRole("dialog", { name: "Review plan" })).toHaveCount(0); + const applyRequest = coreRequests.findLast((entry) => entry.method === "applySync"); + expect(applyRequest).toBeDefined(); + expect(Object.keys(applyRequest.payload).sort()).toEqual(["planId", "schemaVersion"]); + expect(applyRequest.payload.schemaVersion).toBe(1); + expect(typeof applyRequest.payload.planId).toBe("string"); + expect(consoleErrors).toEqual([]); +}); + +test("global partial, recovery, operation and error states are visible", async ({ page }) => { + let recovery = false; + let failStatus = false; + await page.route(`${fixture.origin}/api/core`, async (route) => { + const envelope = route.request().postDataJSON(); + const success = (result) => route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + protocolVersion: 1, + requestId: envelope.requestId, + ok: true, + result + }) + }); + if (envelope.method === "getStatus") { + if (failStatus) { + await route.fulfill({ + status: 500, + contentType: "application/json", + body: JSON.stringify({ + protocolVersion: 1, + requestId: envelope.requestId, + ok: false, + error: { + code: "INTERNAL_ERROR", + message: "An internal error occurred.", + severity: "fatal", + retryable: false, + recoveryRequired: false + } + }) + }); + return; + } + await success({ + schemaVersion: 1, + snapshotAt: "2026-08-26T00:00:00.000Z", + storageRevision: "storage-r1", + profile: { + id: envelope.payload.profile.profileId, + revision: envelope.payload.profile.profileRevision + }, + currentProvider: "openai", + rolloutCounts: { sessions: { openai: 1 }, archived_sessions: {} }, + sqliteCounts: { sessions: { openai: 1 }, archived_sessions: {} }, + codexHomeSource: "profile", + sqliteHomeSource: "default", + backupSummary: { count: 0, totalBytes: 0 }, + pendingRecovery: recovery, + pendingTransactions: recovery ? [{ operationId: "recovery-operation", state: "recovery-required" }] : [], + operationInProgress: recovery ? { operationId: "active-operation", operation: "restore", busyScope: "state-db" } : null, + rolloutScanComplete: true, + lockedRolloutFiles: [] + }); + return; + } + if (envelope.method === "prepareSync") { + await success({ + schemaVersion: 1, + planId: "synthetic-plan-id", + operation: "sync", + createdAt: "2026-08-26T00:00:00.000Z", + expiresAt: "2026-08-26T00:10:00.000Z", + profile: { + id: envelope.payload.profile.profileId, + revision: envelope.payload.profile.profileRevision + }, + storageRevision: "storage-r1", + configRevision: "config-r1", + rolloutRevision: "rollout-r1", + stateDbRevision: "state-db-r1", + target: { provider: "openai", model: null }, + impact: { rolloutFilesToChange: 1, sqliteRowsToChange: 0, backupExpected: true }, + warnings: [], + requiresConfirmation: true + }); + return; + } + if (envelope.method === "applySync") { + await success({ + schemaVersion: 1, + operationId: "synthetic-operation", + operation: "sync", + outcome: "partial", + backup: { backupId: "synthetic-backup" }, + warnings: ["One or more rollout files are locked and may be skipped."], + result: { skippedLockedRolloutCount: 1 } + }); + return; + } + await route.continue(); + }); + + await page.goto(fixture.issuePairingUrl()); + await page.getByRole("button", { name: "Sync", exact: true }).click(); + await page.getByRole("button", { name: "Prepare sync" }).click(); + await page.getByRole("button", { name: "Confirm and apply" }).click(); + await expect(page.getByText("Completed with locked rollout files skipped.")).toBeVisible(); + + recovery = true; + await page.reload(); + await expect(page.getByText("RECOVERY_REQUIRED")).toBeVisible(); + await expect(page.locator("#main-content").getByText("Operation in progress", { exact: true })).toBeVisible(); + await page.getByRole("button", { name: "Sync", exact: true }).click(); + await expect(page.getByRole("button", { name: "Prepare sync" })).toBeDisabled(); + + recovery = false; + failStatus = true; + await page.reload(); + await expect(page.getByRole("alert")).toContainText("An internal error occurred."); +}); diff --git a/apps/web/index.html b/apps/web/index.html new file mode 100644 index 0000000..ea00307 --- /dev/null +++ b/apps/web/index.html @@ -0,0 +1,15 @@ + + + + + + + + Codex Provider Sync + + +
+ + + + diff --git a/apps/web/package.json b/apps/web/package.json index 9ba7451..8ccd925 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -4,15 +4,27 @@ "private": true, "type": "module", "scripts": { - "build": "vite build --config ../../web/vite.config.js" + "build": "vite build", + "test": "node --test checks/web-composition.contract.mjs", + "test:e2e": "playwright test" }, "engines": { "node": ">=24" }, + "dependencies": { + "@codex-provider-sync/app-ui": "0.0.0", + "@codex-provider-sync/core-client": "0.0.0", + "@codex-provider-sync/design-system": "0.0.0" + }, "devDependencies": { + "@playwright/test": "1.62.1", + "@tailwindcss/vite": "4.3.3", + "@types/react": "19.2.18", + "@types/react-dom": "19.2.5", "@vitejs/plugin-react": "6.1.0", "react": "19.2.8", "react-dom": "19.2.8", + "tailwindcss": "4.3.3", "vite": "8.2.2" } } diff --git a/apps/web/playwright.config.mjs b/apps/web/playwright.config.mjs new file mode 100644 index 0000000..99db5b0 --- /dev/null +++ b/apps/web/playwright.config.mjs @@ -0,0 +1,16 @@ +import { defineConfig, devices } from "@playwright/test"; + +export default defineConfig({ + testDir: "./e2e", + fullyParallel: false, + workers: 1, + retries: process.env.CI ? 1 : 0, + reporter: "list", + use: { + ...devices["Desktop Chrome"], + headless: true, + screenshot: "off", + trace: "off", + video: "off" + } +}); diff --git a/apps/web/public/favicon.svg b/apps/web/public/favicon.svg new file mode 100644 index 0000000..d0188e0 --- /dev/null +++ b/apps/web/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx new file mode 100644 index 0000000..3e3027e --- /dev/null +++ b/apps/web/src/main.tsx @@ -0,0 +1,43 @@ +import { AppUi } from "@codex-provider-sync/app-ui"; +import { HttpCoreClient } from "@codex-provider-sync/core-client"; +import React from "react"; +import { createRoot } from "react-dom/client"; + +import { createAuthenticatedFetch, createHostClient, forgetBrowser, initializePairing, preferenceStore } from "./pairing.js"; +import "./styles.css"; + +const root = createRoot(document.getElementById("root")!); +const deviceCredential = await initializePairing(); + +if (!deviceCredential) { + root.render( + +
+
+

Codex Provider Sync

+

This browser is not paired. Run codex-provider web again and open the new one-time link.

+
+
+
+ ); +} else { + const host = createHostClient(deviceCredential); + const authenticatedFetch = createAuthenticatedFetch(deviceCredential); + const core = new HttpCoreClient({ + baseUrl: globalThis.location.origin, + fetch: authenticatedFetch + }); + globalThis.addEventListener("cps:pairing-required", () => globalThis.location.reload(), { once: true }); + root.render( + + forgetBrowser(host)} + preferences={preferenceStore} + /> + + ); +} diff --git a/apps/web/src/pairing.ts b/apps/web/src/pairing.ts new file mode 100644 index 0000000..d2aa6a4 --- /dev/null +++ b/apps/web/src/pairing.ts @@ -0,0 +1,106 @@ +import type { HostClient, HostProfile, PreferenceStore, SaveProfileInput } from "@codex-provider-sync/app-ui"; + +const DEVICE_STORAGE_KEY = "cps.web.deviceCredential"; +const LOCALE_STORAGE_KEY = "cps.preference.locale"; +const THEME_STORAGE_KEY = "cps.preference.theme"; + +function credential(): string { + return globalThis.localStorage.getItem(DEVICE_STORAGE_KEY) ?? ""; +} + +async function jsonResponse(response: Response): Promise> { + const payload = await response.json().catch(() => ({})); + return payload && typeof payload === "object" && !Array.isArray(payload) + ? payload as Record + : {}; +} + +function safeHostError(payload: Record, fallback: string): Error { + const code = typeof payload.code === "string" ? payload.code : "HOST_REQUEST_FAILED"; + return Object.assign(new Error(`${fallback} (${code})`), { code }); +} + +export async function initializePairing(): Promise { + const fragment = new URLSearchParams(globalThis.location.hash.replace(/^#/, "")); + const pairingToken = fragment.get("pair"); + if (!pairingToken) return credential() || null; + globalThis.history.replaceState(null, "", `${globalThis.location.pathname}${globalThis.location.search}`); + const response = await globalThis.fetch("/api/pair", { + method: "POST", + redirect: "error", + credentials: "same-origin", + headers: { "X-Codex-Provider-Pairing": pairingToken } + }); + const payload = await jsonResponse(response); + const deviceCredential = typeof payload.deviceCredential === "string" ? payload.deviceCredential : ""; + if (!response.ok || !deviceCredential) return null; + globalThis.localStorage.setItem(DEVICE_STORAGE_KEY, deviceCredential); + return deviceCredential; +} + +export function createAuthenticatedFetch(deviceCredential: string): typeof globalThis.fetch { + return async (input, init = {}) => { + const response = await globalThis.fetch(input, { + ...init, + headers: { ...Object.fromEntries(new Headers(init.headers).entries()), "X-Codex-Provider-Device": deviceCredential } + }); + if (response.status === 403) { + const payload = await jsonResponse(response.clone()); + if (payload.code === "PAIRING_REQUIRED") { + globalThis.localStorage.removeItem(DEVICE_STORAGE_KEY); + globalThis.dispatchEvent(new CustomEvent("cps:pairing-required")); + } + } + return response; + }; +} + +export function createHostClient(deviceCredential: string): HostClient { + const fetch = createAuthenticatedFetch(deviceCredential); + const headers = { "Content-Type": "application/json" }; + const getProfiles = async (signal?: AbortSignal): Promise => { + const response = await fetch("/api/profiles", { credentials: "same-origin", redirect: "error", signal }); + const payload = await jsonResponse(response); + if (!response.ok || !Array.isArray(payload.profiles)) throw safeHostError(payload, "Unable to load profiles"); + return payload.profiles as unknown as HostProfile[]; + }; + return { + listProfiles: getProfiles, + async saveProfile(input: SaveProfileInput, signal?: AbortSignal): Promise { + const response = await fetch("/api/profiles/save", { method: "POST", credentials: "same-origin", redirect: "error", headers, body: JSON.stringify(input), signal }); + const payload = await jsonResponse(response); + if (!response.ok || !payload.profile) throw safeHostError(payload, "Unable to save profile"); + return payload.profile as unknown as HostProfile; + }, + async deleteProfile(profileId: string, profileRevision: string, signal?: AbortSignal): Promise { + const response = await fetch("/api/profiles/delete", { method: "POST", credentials: "same-origin", redirect: "error", headers, body: JSON.stringify({ profileId, profileRevision }), signal }); + const payload = await jsonResponse(response); + if (!response.ok) throw safeHostError(payload, "Unable to delete profile"); + }, + async forgetBrowser(): Promise { + try { + await fetch("/api/access/forget", { method: "POST", credentials: "same-origin", redirect: "error", headers, body: "{}" }); + } finally { + globalThis.localStorage.removeItem(DEVICE_STORAGE_KEY); + } + } + }; +} + +export const preferenceStore: PreferenceStore = { + getLocale() { + const value = globalThis.localStorage.getItem(LOCALE_STORAGE_KEY); + return value === "zh-CN" || value === "en" ? value : null; + }, + setLocale(locale) { globalThis.localStorage.setItem(LOCALE_STORAGE_KEY, locale); }, + getTheme() { + const value = globalThis.localStorage.getItem(THEME_STORAGE_KEY); + return value === "system" || value === "light" || value === "dark" ? value : null; + }, + setTheme(theme) { globalThis.localStorage.setItem(THEME_STORAGE_KEY, theme); } +}; + +export async function forgetBrowser(host: HostClient): Promise { + await host.forgetBrowser?.(); + globalThis.location.reload(); +} diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css new file mode 100644 index 0000000..dc58e47 --- /dev/null +++ b/apps/web/src/styles.css @@ -0,0 +1,7 @@ +@import "tailwindcss"; +@import "@codex-provider-sync/design-system/tokens.css"; +@source "../../../packages/app-ui/src"; + +html { min-width: 320px; background: var(--surface); } +body { margin: 0; min-width: 320px; min-height: 100vh; background: var(--surface); } +button, input, select { font: inherit; } diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts new file mode 100644 index 0000000..70e460c --- /dev/null +++ b/apps/web/vite.config.ts @@ -0,0 +1,19 @@ +import tailwindcss from "@tailwindcss/vite"; +import react from "@vitejs/plugin-react"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { defineConfig } from "vite"; + +const root = path.dirname(fileURLToPath(import.meta.url)); + +export default defineConfig({ + root, + plugins: [react(), tailwindcss()], + build: { + outDir: path.resolve(root, "../../web/dist"), + emptyOutDir: true, + sourcemap: true, + target: "es2022" + }, + server: { host: "127.0.0.1", port: 5173 } +}); diff --git a/desktop/CodexProviderSync.Core.Tests/CodexProviderSync.Core.Tests.csproj b/desktop/CodexProviderSync.Core.Tests/CodexProviderSync.Core.Tests.csproj index b60a51c..6d59c3e 100644 --- a/desktop/CodexProviderSync.Core.Tests/CodexProviderSync.Core.Tests.csproj +++ b/desktop/CodexProviderSync.Core.Tests/CodexProviderSync.Core.Tests.csproj @@ -20,6 +20,7 @@ + diff --git a/desktop/CodexProviderSync.Core.Tests/FixtureHost/CodexProviderSync.FixtureHost.csproj b/desktop/CodexProviderSync.Core.Tests/FixtureHost/CodexProviderSync.FixtureHost.csproj new file mode 100644 index 0000000..ef86c48 --- /dev/null +++ b/desktop/CodexProviderSync.Core.Tests/FixtureHost/CodexProviderSync.FixtureHost.csproj @@ -0,0 +1,14 @@ + + + + Exe + net10.0 + enable + enable + + + + + + + diff --git a/desktop/CodexProviderSync.Core.Tests/FixtureHost/Program.cs b/desktop/CodexProviderSync.Core.Tests/FixtureHost/Program.cs new file mode 100644 index 0000000..be45a27 --- /dev/null +++ b/desktop/CodexProviderSync.Core.Tests/FixtureHost/Program.cs @@ -0,0 +1,59 @@ +using System.Text.Json; +using CodexProviderSync.Core; + +if (args.Length < 2) +{ + return 64; +} + +string operation = args[0]; +string codexHome = Path.GetFullPath(args[1]); +CodexSyncService service = new(); + +try +{ + object output = operation switch + { + "sync" when args.Length == 3 => await SyncAsync(service, codexHome, args[2]), + "restore" when args.Length == 3 => await RestoreAsync(service, codexHome, args[2]), + _ => throw new ArgumentException("Unsupported fixture operation.") + }; + Console.WriteLine(JsonSerializer.Serialize(output)); + return 0; +} +catch (Exception error) +{ + Console.Error.WriteLine(JsonSerializer.Serialize(new + { + schemaVersion = 1, + ok = false, + errorType = error.GetType().Name + })); + return 1; +} + +static async Task SyncAsync(CodexSyncService service, string codexHome, string provider) +{ + SyncResult result = await service.RunSyncAsync(codexHome, provider: provider); + return new + { + schemaVersion = 1, + ok = true, + operation = "sync", + result.BackupDir, + result.TargetProvider + }; +} + +static async Task RestoreAsync(CodexSyncService service, string codexHome, string backupDir) +{ + RestoreResult result = await service.RunRestoreAsync(codexHome, Path.GetFullPath(backupDir)); + return new + { + schemaVersion = 1, + ok = true, + operation = "restore", + result.BackupDir, + result.TargetProvider + }; +} diff --git a/docs/README_WEB_UI_ZH.md b/docs/README_WEB_UI_ZH.md index da7a486..df3e353 100644 --- a/docs/README_WEB_UI_ZH.md +++ b/docs/README_WEB_UI_ZH.md @@ -1,6 +1,6 @@ # Web UI 使用说明 -Web UI 是 CLI 提供的本地浏览器界面,与 CLI 共用同一套同步、备份和恢复逻辑。 +Web UI 是 CLI 提供的本地浏览器界面。共享 React UI 通过版本化 `HttpCoreClient` 调用本地 Web Host,再进入与 CLI 相同的 Node Core 公开边界;页面不会解析 CLI 输出或复制同步逻辑。 ## 启动 @@ -45,8 +45,8 @@ npm run web:start 本工具只同步本地元数据,不负责登录或切换账号。已经通过其他工具切换 Provider 时: 1. 使用 CCSwitch 等常用工具切换 Provider,并确认 Codex 可以正常对话。 -2. 回到 Web UI;需要时点击“读取状态”。 -3. 在概览页的“执行同步”中保持“仅同步元数据”,选择目标 Provider(供应商),确认执行。 +2. 回到 Web UI,在“概览”检查当前 Provider、rollout/SQLite 分布和安全状态。 +3. 进入“同步”,生成十分钟内有效的一次性计划,核对影响数量、警告与备份预期后确认。 4. 显示“Provider 元数据已对齐”即完成。切回原 Provider 时重复相同步骤。 rollout 与 SQLite 的会话总数可能因活动会话写入和索引时序短暂相差 1;这不表示 Provider 元数据未对齐。以两侧的 Provider 分布和页面对齐状态为准。 @@ -55,20 +55,24 @@ rollout 与 SQLite 的会话总数可能因活动会话写入和索引时序短 ## 页面功能 -- 概览:显示当前 Provider、rollout/SQLite 分布、修复项和项目可见性。 -- 聊天记录:从 rollout 文件只读读取会话列表和用户/助手消息,支持搜索、Provider/项目/归档筛选、分页和会话详情。 -- 执行同步:区分“仅同步元数据”和“切换 Provider 并同步”。 -- 切换模型:支持跟随 Provider section、保留根级 model 或显式指定 model。 -- 备份:查看当前 Codex Home 下由本工具管理的备份,并按内容恢复。 -- 恢复保护:SQLite Home 不同时显示来源与目标;迁移数据库时禁止同时恢复旧配置。 -- 活动:显示当前 Web UI 进程内存中的同步阶段和操作结果;服务停止后不会作为日志文件保留。 -- 清理:按保留数量删除较旧的托管备份。 +- 概览(Overview):显示当前 Provider、rollout/SQLite 分布、对齐状态、备份数、locked rollout 数和存储来源;公共状态不显示本机绝对路径。 +- 同步(Sync):设置备份保留数,先生成计划,再在确认对话框中 Apply。 +- 切换 Provider(Switch Provider):只允许已配置 Provider,并明确选择跟随 Provider 默认模型、保留根 model 或显式 model 三种模式。 +- 备份/恢复(Backups/Restore):只展示受管 `backupId`;Restore 可选择 config/SQLite/session 范围,跨 SQLite Home 必须选择目标 Profile 并确认 relocation;同页可按保留数清理受管备份。 +- 历史(History):进入页面后才读取会话列表;只有点击某个会话才延迟读取详情。当前列表最多读取 100 项,不提供搜索/筛选承诺;消息正文不进入 Query cache,离开详情即清空并取消未完成请求。 +- Profiles:管理服务端受信任的 Codex/SQLite Home 配置;Core 业务请求只提交 profile ID/revision,不传递任意路径。 +- Diagnostics:只读显示 Core 返回的有界安全诊断字段,不读取凭据、token、消息正文或原始异常。 +- Settings:切换 `zh-CN` / `en`、`system` / `light` / `dark` 主题,管理 Watch 与撤销当前浏览器授权。 + +全局区域显示 Recovery、正在进行的 Operation、结构化错误与 Toast。界面支持键盘操作、可见焦点、reduced motion 和 200% 缩放等效窄视口。 ## 本地安全边界 - 服务只监听 `127.0.0.1`,不要直接暴露到局域网或公网。 - 首次启动使用短时、一次性的配对链接;服务端只保存设备凭证哈希。使用“忘记此浏览器”或 `--reset-access` 可撤销授权。 -- 存储路径由服务端配置管理,写操作串行执行,恢复只能选择当前 Codex Home 下由本工具管理的备份。 +- Core API 请求/响应使用共享版本化 envelope;服务端验证 Origin、64 KiB 请求上限、requestId、Profile/Storage revision 和产品输入 schema。 +- Production HTML 使用每响应随机 nonce 的严格 CSP;不允许远程脚本或跨源 Core 请求。 +- 存储路径由服务端配置管理,写操作 fail-fast 串行;Sync、Switch、Restore 使用 Prepare/Apply,Apply 只接收不透明 `planId`;恢复只能选择受管备份。 - Web UI 不能绕过共享核心逻辑中的锁、SQLite Home、WSL UNC、备份和恢复限制。 ## SSH、无桌面和远程浏览器 diff --git a/docs/adr/0014-npm-workspace-and-dependency-boundaries.md b/docs/adr/0014-npm-workspace-and-dependency-boundaries.md index 7454e0f..505a531 100644 --- a/docs/adr/0014-npm-workspace-and-dependency-boundaries.md +++ b/docs/adr/0014-npm-workspace-and-dependency-boundaries.md @@ -2,7 +2,8 @@ - Status: Accepted - Date: 2026-08-25 -- Scope: vNext C4 workspace and dependency baseline +- Amended: 2026-08-26 (C5 shared UI/Web runtime) +- Scope: vNext C4 workspace baseline and C5 shared UI/Web dependency boundary ## Context @@ -23,7 +24,9 @@ test-fixtures(仅测试,不进入产品依赖图) `packages/core` 在 C4 仅通过一个已审计例外导入根 `src/public-api.js`,不移动或翻译锁、备份、journal、SQLite、rollout 和 service 算法。包本身只导出 `createCoreFacade({resolveProfile})`;可信 Host 解析 profile ID/revision 为路径后,facade 实例才提供 vNext 固定方法,不导出 `runSync/runSwitch/runRestore/runWatch` 兼容适配器或存储辅助函数。Core workspace 保持 ESM JavaScript;C4 的 JSDoc、`checkJs`、`tsc --noEmit` 只覆盖该可信边界 bridge,仍在根 `src/` 的高风险算法继续由既有 JS 与集成测试约束,后续迁入时逐模块加入 checkJs。Contracts、CoreClient、App UI 边界和 Desktop 边界使用 TypeScript。 -根包不得运行时导入任一 workspace,不得声明 React、Vite、TypeScript 或 Electron 生产依赖;根 `files` allowlist 不包含 `apps/`、`packages/`、Fixture 或 workspace build output。当前尚未搬迁的 `web/` 源由 `apps/web` 的精确 devDependencies 构建;React 静态打包依赖也归该私有 workspace,根 manifest 不重复声明。这样 npm 8 读取单一 workspace lockfile 并执行 `npm ci --workspaces=false --omit=dev` 时,根生产树不会因 hoisted production 标记误装 React。 +根包不得声明 React、Vite、TypeScript 或 Electron 生产依赖。C5 为 Local Web Host 批准一个窄运行时例外:根 `src/web-core-adapter.js` 可以导入随 tarball 检入的 `packages/contracts/dist` 与 `packages/core/src`,根 `files` allowlist 也只允许这两个 `packages/` 子树。例外不包含 workspace manifest、TypeScript source、CoreClient、App UI、Design System、Fixture、Electron 或 node_modules,且必须由 Node 16 安装态 Web smoke 证明不依赖 workspace symlink。其余 `apps/`、`packages/` 和 workspace build output 继续禁止进入根 tarball。 + +C5 已把旧 `web/src`、`web/index.html` 和 Vite 配置迁入 `apps/web`;`web/dist` 仅是根发布包使用的静态部署物。React 与所有现代构建依赖只归 private workspace,根 manifest 不重复声明。这样 npm 8 读取单一 workspace lockfile 并执行 `npm ci --workspaces=false --omit=dev` 时,根生产树不会因 hoisted production 标记误装 React。 ## Dependency Resolution @@ -36,11 +39,19 @@ test-fixtures(仅测试,不进入产品依赖图) | Vite | `8.2.2` | 最新 stable;要求 Node `^20.19.0 || >=22.12.0`,由 Node 24 job 执行 | | `@vitejs/plugin-react` | `6.1.0` | 最新 stable;peer `vite ^8.0.0`,与 Vite 8.2.2 相容 | | React / React DOM | `19.2.8` | 最新 stable;React DOM peer `react ^19.2.8` 闭合 | +| React types | `@types/react 19.2.18`、`@types/react-dom 19.2.5` | 仅供 Node 24 Web/共享 UI TypeScript 构建 | +| TanStack Query | `@tanstack/react-query 5.102.3` | C5 页面状态与显式失效;History 正文不进入 Query cache | +| React Hook Form / resolver / Zod | `react-hook-form 7.86.0`、`@hookform/resolvers 5.9.1`、`zod 4.4.3` | C5 产品输入 schema 与表单验证 | +| Radix primitives | `@radix-ui/react-dialog 1.1.23`、`@radix-ui/react-select 2.3.7`、`@radix-ui/react-slot 1.3.3`、`@radix-ui/react-toast 1.2.23` | C5 检入组件的无障碍 primitives;不引入远程运行时 | +| i18n | `i18next 26.4.0`、`react-i18next 17.0.12` | `zh-CN` / `en`,英文 fallback | +| UI utilities | `lucide-react 1.34.0`、`class-variance-authority 0.7.1`、`clsx 2.1.1`、`tailwind-merge 3.6.0` | 图标与检入组件样式组合 | +| Tailwind | `tailwindcss 4.3.3`、`@tailwindcss/vite 4.3.3` | 仅在 Node 24 Web workspace build 使用 | +| Playwright | `@playwright/test 1.62.1` | C5 production bundle 的真实 Chromium 验收;仅 dev dependency | | `better-sqlite3` | `8.7.0` | 保留现有根 optional fallback;更新版本不满足根 Node 16 合同,不在 C4 强升 | 所有直接 dependency/devDependency/optionalDependency/peerDependency 使用精确版本,不使用 `^`、`~`、`workspace:*`、`file:` 或未锁定 URL。传递依赖由唯一 lockfile 锁定。候选经 `npm audit --omit=dev --audit-level=moderate` 与全树 `npm audit --audit-level=high` 检查;任一不合格候选不得进入 checkpoint。 -Electron、electron-vite、electron-builder、现代 UI 库和 native fallback 的具体版本不在 C4 提前解析:分别在 C5/C6/C9 按同一规则选择并记录。尤其不得为了“先搭骨架”把 Electron 写入根 manifest。 +Electron、electron-vite、electron-builder 和 native fallback 的具体版本不在 C4/C5 提前解析:分别在 C6/C9 按同一规则选择并记录。尤其不得为了“先搭骨架”把 Electron 写入根 manifest。 ## Invariants @@ -49,17 +60,17 @@ Electron、electron-vite、electron-builder、现代 UI 库和 native fallback - `contracts` 不依赖 Node、DOM、React 或 Electron;`core-client` 只依赖 contracts;App UI 不依赖 Node/Electron;Renderer 将来不得导入 Core; - HTTP、Desktop 和 Mock transport 使用同一版本化 request/response/progress envelope;协议不兼容先于业务失败; - Apply transport 输入严格为 `{schemaVersion: 1, planId}`;Legacy error adapter 按结构化 code/DTO 分类,不解析 message; -- 根 tarball 必须在真实临时目录安装并执行 help/status,而不是只依赖 workspace 开发环境或 pack 预览。 +- 根 tarball 必须在真实临时目录安装并执行 help/status/Web health 与 production shell,而不是只依赖 workspace 开发环境或 pack 预览。 ## Consequences -现代应用可逐步迁移到共享包而不同时搬动高风险 Core;根 CLI 仍能独立安装。代价是 C4 到 C5 期间存在一个明确记录的 `web/` 源目录和 `apps/web` 依赖所有权分离状态。该过渡只允许持续到 C5 的 Web 迁移,不能形成第二套业务实现。 +现代应用可逐步迁移到共享包而不同时搬动高风险 Core;根 CLI/Web 仍能独立安装。C4 的 `web/` source ownership 过渡已在 C5 结束:唯一现代 Web source 位于 `apps/web` 与 `packages/app-ui`,根只承载静态 `web/dist` 和经过审计的 Host/Core runtime 闭包。窄 tarball 例外增加了 packlist 与 Node 16 回归责任,任何扩大都必须另行修改本 ADR、边界测试和安装态 smoke。 ## Validation - Node 24:完整 `npm ci`、TypeScript build、Core checkJs、workspace contract tests、Web production build; - Node 16.20.2 + npm 8:根 production-only `npm ci` 无 workspace/UI 链接;根 tarball 分别完成无 lifecycle 内容检查与正常 lifecycle 安装,实际 bin help、synthetic SQLite 创建/打开和显式临时 Codex Home `status --json`; -- packlist:不存在 `apps/`、`packages/`、workspace dist、Electron 或 Fixture; +- packlist:不存在 `apps/`、未批准的 `packages/`、workspace manifest、Electron、Fixture 或 node_modules;只允许 `packages/contracts/dist` 与 `packages/core/src`; - import contract:除 `packages/core -> src/public-api.js` 的单一过渡例外外,禁止深度导入; - security:生产树 moderate/high/critical 为零,全树 high/critical 为零。 diff --git a/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md b/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md index 994795e..7ef5ab9 100644 --- a/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md +++ b/docs/architecture/contracts/CORE_EXTERNAL_BEHAVIOR_ZH.md @@ -929,9 +929,19 @@ V1/C3 已实现上述边界;`runSync/runSwitch/runRestore/runWatch` 仍作为 - `packages/core` 的模块导出仅为 `createCoreFacade({resolveProfile})`;factory 返回对象的业务方法集合精确等于本节 15 个目标方法。根 `src/public-api.js` 继续承载 CLI 与迁移适配器,不被描述为 Renderer 稳定 API。 - `resolveProfile({profileId, profileRevision?})` 只能由 Local Web Host、Electron Main/Utility Host 或测试 Host 注入,返回可信的 `{id, revision, codexHome, sqliteHome?}`。Facade 必须验证 ID、revision 和绝对路径;selector revision 漂移时 fail closed,不能回退到 `CODEX_HOME` 或默认用户目录。 - UI/HTTP/IPC 产品输入只包含 profile ID/revision、Provider/model mode、受管 backupId 等产品字段;不得携带 `codexHome`、`sqliteHome`、backup path 或底层 apply 参数。Apply 仍精确只收 schemaVersion/planId。 -- 备份列表在 facade 处移除 backup root、绝对 path 与 metadata 中的存储路径,只返回 `backupId`、size 和有界展示元数据;History 列表移除 rollout path 与首条消息预览,正文只能由用户明确调用详情方法后读取。 +- Status 在 facade 处移除 `codexHome`、`sqliteHome` 和 State DB 路径,只保留来源枚举、revision、分布与安全状态;warning 只能由固定类别/固定文案投影,不得透传底层任意字符串。 +- 备份列表在 facade 处移除 backup root、绝对 path 与 metadata 中的存储路径,只返回 `backupId`、size 和有界展示元数据;History 列表移除 rollout path、`cwd` 与首条消息预览,正文只能由用户明确调用详情方法后读取。 - `TransportCoreClient` 对成功 payload 执行按方法的最小 runtime guard;协议版本不兼容映射为固定 `PROTOCOL_VERSION_MISMATCH`,其他畸形 envelope/result 收口为固定 `INTERNAL_ERROR`。HTTP 非 2xx 不得携带成功 envelope。 +### 16.4 C5 Local Web Host 与共享 UI + +- `/api/core` 只接受带 `protocolVersion`、`requestId`、可选 `operationId`、`method`、`payload` 的版本化 POST envelope;请求体上限 64 KiB,content type、结构、方法输入和成功输出均由共享 contracts guard 验证。 +- 响应必须保留同一 `requestId`。非 2xx 不得伪装成功 envelope;不可信异常只返回固定、安全的 `INTERNAL_ERROR` DTO,不输出 stack、cause、路径、token、消息正文或原始异常文本。 +- Web Host 在进入 envelope handler 前验证一次性 pairing、设备凭据 hash 与 loopback Origin;Facade 只解析 server-managed profile ID/revision,Prepare 绑定 storage revisions,Apply 在双锁内重新核对。受管 backupId 在可信 Host/Core 边界解析;Renderer 不能通过 Core 输入提交任意路径。 +- React UI 的业务调用固定为 `HttpCoreClient → /api/core → createCoreFacade`;profile 管理、配对和忘记浏览器属于 Host API,不得把业务实现复制进 UI。 +- History 列表仅在用户进入 History 页面后读取;详情仅在用户明确选择会话后延迟读取,正文不进入 TanStack Query cache,离开页面时清空并取消 pending detail request。 +- Production HTML 使用每响应随机 nonce 的严格 CSP;无 `unsafe-inline`,外部导航、远程脚本和跨源 Core 请求不在允许面内。 + ## 17. Phase 1 提取要求 Phase 1 只提取边界,不改变算法或结果: @@ -986,7 +996,9 @@ Phase 1 只提取边界,不改变算法或结果: ### 18.4 Web -- pairing、Origin 和 device credential; +- 未配对 `/api/core`、一次性 pairing、Origin 和 device credential hash; +- 非 JSON content type、超过 64 KiB、畸形/版本不兼容 envelope 与未知 method; +- requestId correlation、非 2xx success 拒绝、Core/Host error 固定脱敏; - raw storage path 拒绝; - profile/storage revision required/changed; - 单写操作; @@ -994,7 +1006,8 @@ Phase 1 只提取边界,不改变算法或结果: - success/partial mapping; - alignment 不要求总数相等; - runtime storage identity 与安全复用; -- History 只读与分页边界。 +- History 列表/详情必须显式读取,详情正文不缓存且离页清空; +- production CSP nonce、八个共享页面、双语/主题、键盘焦点、reduced motion 与 200% 等效窄视口。 ## 19. 变更控制 diff --git a/docs/architecture/contracts/ERROR_CODES_ZH.md b/docs/architecture/contracts/ERROR_CODES_ZH.md index 05eb5e5..0c95700 100644 --- a/docs/architecture/contracts/ERROR_CODES_ZH.md +++ b/docs/architecture/contracts/ERROR_CODES_ZH.md @@ -1,8 +1,8 @@ # vNext Error Code 合同 -> **状态:Accepted(阶段 0 合同;V1 C1 Core DTO、C2 CLI Adapter 与 C4 CoreClient 公共净化已实施)** +> **状态:Accepted(阶段 0 合同;V1 C1 Core DTO、C2 CLI Adapter、C4 CoreClient 与 C5 Web envelope 公共净化已实施)** > -> **日期:2026-08-24;实现增量:2026-08-25** +> **日期:2026-08-24;实现增量:2026-08-26** > > **适用范围:Node Core、CLI、Local Web UI、Electron 与迁移期 .NET 适配层** > @@ -12,7 +12,7 @@ 本文冻结 vNext 的错误分类、兼容映射和演进规则,使调用方依据稳定的 `code` 决策,而不是解析自然语言 `message`、异常类型名或堆栈。 -V1 的 Node Public API 已实现 Canonical `CoreError`/DTO,CLI JSON Adapter 已按 Canonical Code 输出;Web 与迁移期 .NET 仍存在不同大小写、命名和结构,这些现状继续列为 Legacy Surface,并由后续 Adapter 渐进收口。 +V1 的 Node Public API 已实现 Canonical `CoreError`/DTO,CLI JSON Adapter 与 C5 Web Core envelope 已按 Canonical Code 输出;Web 的非 Core Host transport code 与迁移期 .NET 仍存在不同大小写、命名和结构,这些现状继续列为 Legacy Surface,并由后续 Adapter 渐进收口。 ## 2. 稳定边界 @@ -196,4 +196,4 @@ JSON Mode 的当前映射为: ## 8. 阶段实现边界 -阶段 0 冻结分类与映射;V1 C1 已实现 Node 异常类和 DTO,C2 已实现 opt-in CLI JSON/退出码与真实子进程 Contract Test,C4 已实现 Contracts/CoreClient 的公共错误净化与 runtime guard。现有 Web 路由要到 C5 接入统一 envelope,.NET protocol 0.4 仍保持迁移期兼容,尚不能据此声称跨入口错误合同已经全部统一。 +阶段 0 冻结分类与映射;V1 C1 已实现 Node 异常类和 DTO,C2 已实现 opt-in CLI JSON/退出码与真实子进程 Contract Test,C4 已实现 Contracts/CoreClient 的公共错误净化与 runtime guard。V1 C5 的 React Web Core 业务请求已统一经 `HttpCoreClient → POST /api/core` 的 versioned envelope;Host 在调用 Core 前继续执行 pairing、loopback Origin 和可信 profile revision 校验,`PROFILE_REVISION_REQUIRED` / `STORAGE_REVISION_REQUIRED` 等仍是 Web transport code。未知 Host/Core 异常收敛为固定 `INTERNAL_ERROR`,不回显原始 exception。迁移期 .NET protocol 0.4 仍保持旧码兼容,因此尚不能据此声称所有入口的错误合同已完全统一。 diff --git a/docs/migration/BEHAVIOR_FIXTURES_ZH.md b/docs/migration/BEHAVIOR_FIXTURES_ZH.md index 74633df..7f919cd 100644 --- a/docs/migration/BEHAVIOR_FIXTURES_ZH.md +++ b/docs/migration/BEHAVIOR_FIXTURES_ZH.md @@ -1,6 +1,6 @@ # vNext 行为兼容 Fixture 清单 -> **状态:Accepted(阶段 0 语义清单;C2 动态 CLI Fixture 与 C4 安全 Runner/Schema 已实现,共享静态 Corpus 尚未创建)** +> **状态:Accepted(阶段 0 语义清单;C2 动态 CLI Fixture、C4 安全 Runner/Schema、C5 首批跨运行时静态 Corpus 已实现)** > > **日期:2026-08-24** > @@ -12,7 +12,7 @@ 本文冻结需要被共享 Fixture 表达的场景、输入语义和验收结果,用于迁移期间比较 Node 与 .NET,并为 Node 单核心提供长期回归证据。 -阶段 0 没有创建 `packages/test-fixtures/`。C4 已建立私有 workspace、严格 schema 和只向临时目录复制的安全 Runner,但尚未检入共享静态 Corpus、SQLite 二进制、锁文件或平台专属二进制。当前 Node 测试继续使用临时目录动态构造输入,.NET 测试使用 `TestCodexHomeFixture` 和 GUI E2E `IsolatedFixture`;后续共享 Corpus 应复用这些已验证的构造能力。 +C4 已建立私有 workspace、严格 schema 和只向临时目录复制的安全 Runner。C5 检入首批完全合成的 `bidirectional-backup-roundtrip` 与 `foreign-pending-restore` 静态输入:只有 fake provider、空正文 thread row、`session_meta` 和 SQLite seed SQL,不提交 SQLite 二进制、锁文件、平台专属二进制或真实用户数据。Driver 每次在临时目录 materialize SQLite,并为四个 Node↔.NET 方向复制同一输入;现有动态 Node/.NET fixtures 继续补充更广的行为矩阵。 Fixture 不是用户数据样本,严禁从真实 `~/.codex`、认证文件或私人会话复制内容。 @@ -93,7 +93,7 @@ Fixture 不是用户数据样本,严禁从真实 `~/.codex`、认证文件或 真实跨运行时测试不能用 Mock 代替进程争锁。Node 与 .NET 必须在同一临时目标上运行,并以文件/SQLite 最终效果作为独立证据。 -V1/C3 的 executable mapping:Plan/revision 见 `test/plan-ledger.test.js`、`test/operation-revision.test.js`、`test/plan-apply.test.js`;Node 锁与外部 Status 见 `test/state-db-lock.test.js`、`test/status-coordination.test.js`;Watch 见 `test/watch.test.js`;Web transport 见 `test/web-server.test.js`;.NET 与跨运行时锁见 `StateDbLockResourceTests`、`DualResourceLockIntegrationTests`、`CrossRuntimeStateDbLockTests`、`LockServiceTests`。完整命令与结果记录在 `evidence/C3_PLAN_APPLY_DUAL_LOCK_2026-08-25.md`。 +V1/C3 的 executable mapping:Plan/revision 见 `test/plan-ledger.test.js`、`test/operation-revision.test.js`、`test/plan-apply.test.js`;Node 锁与外部 Status 见 `test/state-db-lock.test.js`、`test/status-coordination.test.js`;Watch 见 `test/watch.test.js`;Web transport 见 `test/web-server.test.js`;.NET 与跨运行时锁见 `StateDbLockResourceTests`、`DualResourceLockIntegrationTests`、`CrossRuntimeStateDbLockTests`、`LockServiceTests`。C5 的双向 backup/foreign pending executable mapping 为 `test-support/cross-runtime-fixtures.mjs`、`test-support/cross-runtime-node-crash-host.mjs`、`.NET FixtureHost` 与既有 `.NET CrashHost`;完整命令与结果记录在 `evidence/C5_SHARED_UI_WEB_2026-08-26.md`。 ## 6. Restore、Backup 与 Prune @@ -128,9 +128,9 @@ C2 使用真实 Node 子进程和完全位于临时目录的最小 Core fixture 这些用例当前由 `test/cli-json-contract.test.js`、`test/cli-json.test.js`、`test-support/cli-json-driver.js` 和真实 Core Sync 回归承载;未来迁入 `packages/test-fixtures` 时必须保持同一外部合同。 -## 9. 未来 Corpus 建议结构 +## 9. Corpus 结构与后续扩展 -目录骨架、Schema 和安全 Runner 已在 C4 存在;`static/` 与 `builders/` 仍是目标,不表示共享 Corpus 已经检入: +目录骨架、Schema、安全 Runner 与首批 `static/` Corpus 已存在;后续 fixture 按同一边界扩展: ```text packages/test-fixtures/ @@ -160,4 +160,4 @@ SQLite live WAL、真实文件锁、跨进程 crash 和 WSL UNC 不能作为静 ## 11. 阶段验收边界 -阶段 0 的完成标志是本文场景、预期和安全门槛获得确认。实际 Corpus、Schema、Builder、跨运行时 Harness 和 CI Matrix 均属于后续阶段;在它们真正通过之前,文档不得宣称行为等价。 +阶段 0 的完成标志是本文场景、预期和安全门槛获得确认。C5 已为 `bidirectional-backup-roundtrip` 与 `foreign-pending-restore` 建立真实跨进程 Windows harness 和 required CI job;这只证明这两个 Phase 2 门槛,不代表 Restore v2、全 crash matrix、WSL 或三平台产物等价。其余 Corpus、Builder 与 CI Matrix 必须在对应 checkpoint 真正通过后才能宣称完成。 diff --git a/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md b/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md index d3226ac..6ce1a69 100644 --- a/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md +++ b/docs/migration/VNEXT_MIGRATION_EXECUTION_INDEX_ZH.md @@ -165,7 +165,7 @@ | C2 | CLI `--json` | C1 | stdout 单一 JSON、stderr 日志、JSON Exit Code 与 Schema 合同 | In Progress(V1,本地门禁通过) | | C3 | Prepare/Apply、协调器与双层锁 | C1、C2 | Revision/Plan/Apply、Node/.NET 双层资源锁、真实争锁证据 | In Progress(V1,本地门禁通过) | | C4 | Workspace、Core、Contracts、CoreClient | C1~C3(Phase 1 全部门槛已验证) | 不搬高风险算法;根 npm CLI tarball/Node 16 兼容 | In Progress(V1,本地门禁通过) | -| C5 | 共享 React UI 与 Web | C4 | AppShell/Features/HttpCoreClient;Web 安全与功能等价;阶段 2 门槛 | Pending | +| C5 | 共享 React UI 与 Web | C4 | AppShell/Features/HttpCoreClient;Web 安全与功能等价;阶段 2 门槛 | In Progress(V1,本地门禁通过,等待远端 CI/最终合入) | | C6 | Electron 安全骨架、Utility Runtime、只读能力 | C5(Phase 2 全部门槛已验证) | 安全窗口/IPC、握手、crash recovery、三平台只读 smoke | Pending | | C7 | Electron Sync/Switch | C6(Phase 3 全部门槛已验证) | Prepare/Apply、Busy/Partial/Cancel、Backup/Restore 回环 | Pending | | C8 | Restore/Watch/Diagnostics/Update | C7(Phase 4 全部门槛已验证) | Restore v2 crash matrix、foreign pending、诊断隐私、Watch/Update | Pending | @@ -217,4 +217,4 @@ Node 与 .NET 在同一 Fixture 上不一致时,PR 必须记录: ## 8. 本 PR 完成后的下一步 -V1 的下一项是 `C5`:把现有 Web 迁入共享 React AppShell/Feature 边界并实际接入 `HttpCoreClient`,同时闭合阶段 2 的跨运行时 Fixture 门槛。C1 的本地证据见 [C1 Public API 与结构化错误证据](evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md),C2 证据见 [C2 CLI JSON 合同证据](evidence/C2_CLI_JSON_2026-08-25.md),C3 证据见 [C3 Plan/Apply 与双层锁证据](evidence/C3_PLAN_APPLY_DUAL_LOCK_2026-08-25.md),C4 证据见 [C4 Workspace、Core 与 CoreClient 证据](evidence/C4_WORKSPACE_CORE_CLIENT_2026-08-25.md);这些本地验证不使对应 Phase 在最终 PR 合入前 Completed。 +V1 的下一项是 `C6`,但只有 C5 checkpoint commit、远端 required CI 与最终分支复验都闭合后,才能开放 Electron 只读能力;C5 的本地通过不使 Phase 2 在最终 PR 合入前 Completed。C1 的本地证据见 [C1 Public API 与结构化错误证据](evidence/C1_PUBLIC_API_ERRORS_2026-08-25.md),C2 证据见 [C2 CLI JSON 合同证据](evidence/C2_CLI_JSON_2026-08-25.md),C3 证据见 [C3 Plan/Apply 与双层锁证据](evidence/C3_PLAN_APPLY_DUAL_LOCK_2026-08-25.md),C4 证据见 [C4 Workspace、Core 与 CoreClient 证据](evidence/C4_WORKSPACE_CORE_CLIENT_2026-08-25.md),C5 证据见 [C5 共享 UI、Web 与跨运行时 Fixture 证据](evidence/C5_SHARED_UI_WEB_2026-08-26.md)。 diff --git a/docs/migration/evidence/C5_SHARED_UI_WEB_2026-08-26.md b/docs/migration/evidence/C5_SHARED_UI_WEB_2026-08-26.md new file mode 100644 index 0000000..bdfb0cd --- /dev/null +++ b/docs/migration/evidence/C5_SHARED_UI_WEB_2026-08-26.md @@ -0,0 +1,56 @@ +# C5 共享 UI、Web 与跨运行时 Fixture 证据(2026-08-26) + +状态:本地门禁通过,等待远端 required CI 与最终 PR 合入。输入 checkpoint 为 `d6b0fef`;C5 输出 commit SHA 在本 checkpoint 提交后及 C10 evidence bundle 中索引。 + +## 已实现边界 + +- `apps/web` 是唯一 Web source/build owner;旧 `web/src`、旧 Vite 配置与旧页面测试已移除,`web/dist` 仅保留根 npm 包使用的 production 静态产物。 +- `packages/app-ui` 从零建立共享 React AppShell,固定八个页面:Overview、Sync、Switch Provider、Backups/Restore、History、Profiles、Diagnostics、Settings;Recovery、Operation、Error Boundary 与 Toast 是全局状态,不伪装成额外页面。 +- UI 使用 React、检入的 Radix/shadcn 风格组件、Tailwind、TanStack Query、React Hook Form、Zod、Lucide 和 react-i18next;提供 `zh-CN` / `en`(英文 fallback)与 `system` / `light` / `dark`,并实现键盘操作、可见焦点、reduced motion 和 200% 等效窄视口布局。 +- Core 业务流固定为 `Browser → HttpCoreClient → POST /api/core → Web Core adapter → createCoreFacade`。旧直写路由继续返回 `410 PLAN_REQUIRED`,不调用兼容 `run*`;Sync/Switch/Restore 先 Prepare,再以精确 `{schemaVersion:1, planId}` Apply。 +- Web Host 保留 loopback、一次性 pairing、设备凭据 hash、Origin、64 KiB、server-managed profile/storage revision 和受管 `backupId`。响应保留 requestId;协议/输入/输出由共享 contract guard 校验,非 2xx 不能携带成功 envelope。 +- Public Status 不返回 Codex/SQLite/State DB 路径,History summary 不返回 `cwd`,warning 只映射为固定安全类别/文案;未知异常不回显 message/stack/cause。备份只暴露受管 ID 与有界元数据。 +- History 仅在进入页面后加载列表,点击会话后才读取详情;正文不进入 TanStack Query cache,离开详情时清空并 abort pending request。E2E 以合成 marker 证明 Overview/其他页面不会预取消息正文。 +- Production HTML 每响应生成随机 CSP nonce,`script-src` / `style-src` 均不使用 `unsafe-inline`;Web Host contract test 与 Chromium E2E 都验证 nonce/header 对应且 CSP 生效。 + +## Phase 2 跨运行时 Fixture + +- 检入 `packages/test-fixtures/static/bidirectional-backup-roundtrip` 与 `foreign-pending-restore`。输入只含 fake `example.invalid` Provider、空正文 SQLite row、`session_meta` rollout 和 seed SQL;无 SQLite 二进制、认证材料、消息正文或真实用户数据。 +- `test-support/cross-runtime-fixtures.mjs` 每次在临时目录 materialize SQLite,并从同一静态输入复制四个独立方向:Node Backup→.NET Restore、.NET Backup→Node Restore、Node crash journal→.NET Restore、.NET crash journal→Node Restore。它只由专用 Windows job 调用,不混入 Node-only/Node 16 matrix。 +- 比较 config、global-state primary/backup 与 rollout 原始字节 hash,并对 SQLite 全部 `threads` 列(含 `updated_at` / `updated_at_ms` / sentinel)、schema、user_version 做固定排序语义 hash 与 `integrity_check`;不把 SQLite page layout、绝对路径、运行时间或 operationId 当作跨实现合同。四个方向均恢复为初态,source journal 均重读为合法 `rolledBack` terminal,无 pending/invalid tail。 +- 首次真实运行发现 .NET 写入长路径而 Node 进程看到同一目录的 Windows 8.3 短路径。Node Restore 改为以存在目录的 `realpath` 证明物理身份,同时对 manifest 原始路径逐段拒绝 symlink/junction/reparse、冻结 canonical identity,并在每个 rollout 写入前重新验证;canonical target 仍须位于 canonical rollout root、无重复且为 regular file,无法证明时 fail closed。目录链接与初检后替换均有回归测试。 +- `.NET FixtureHost` 只调用公开 Core sync/restore API 并输出最小 JSON;Node/.NET CrashHost 在同一 rollout mutation 窗口真实终止。Windows `cross-runtime-fixtures` job 已加入 `ci-gate`,失败、取消或跳过均阻断。 + +这组证据只闭合 Phase 2 的双向 backup round-trip 与 foreign source pending 兼容,不提前声称 C8 Restore v2 自身 snapshot/journal 或完整 crash matrix 已实现。 + +## 依赖与发布面 + +- C5 依赖解析与 exact version 记录在 [ADR-0014](../../adr/0014-npm-workspace-and-dependency-boundaries.md);所有直接依赖不使用 `^`、`~`、`workspace:*` 或 `file:`。 +- 根包继续没有普通 production dependency;为已发布的 Local Web Host 批准窄 tarball runtime:`packages/contracts/dist` 与 `packages/core/src`。边界测试/packlist 禁止其他 workspace、Fixture、Electron、node_modules 和 UI source;Node 16.20.2 与 Node 24 安装态实际执行 CLI、SQLite、Web pairing/profile、真实 `/api/core getStatus` / `PROFILE_CHANGED` 脱敏以及 shell/strict CSP。造库优先使用现代 Node 的 `node:sqlite`,Node 16 才使用安装态 fallback。 +- `npm audit --omit=dev --audit-level=moderate`:0 vulnerabilities;`npm audit --audit-level=high`:0 vulnerabilities。 + +## 本地验证 + +环境:Windows x64,Node `v24.11.1`,npm `11.10.0`;兼容 smoke 使用 Node `v16.20.2` + npm `8.19.4`;输入 SHA `d6b0fef`。 + +| 命令 | 结果 | +| --- | --- | +| `npm run workspaces:check` | build/checkJs、边界与 9 个 workspace tests:34 passed,0 failed/skipped | +| `npm run fixtures:cross-runtime` | 2 top-level tests / 4 directed Node↔.NET cases passed;最终 hash、integrity、journal terminal 全通过 | +| `npm run web:build` | Vite 8.2.2 production build 成功,2032 modules;JS 530.55 kB、gzip 163.97 kB | +| `npm run web:test:e2e` | 2 Chromium tests passed;八页、History lazy/detail/clear、精确 Apply、partial/recovery/operation/error、html lang/本地化读屏标签、双语/主题、Skip/Escape 焦点、CSP nonce、八页 640px/200% 等效 reflow 与 reduced-motion computed style,0 console errors | +| `npm test` | 325 passed,0 failed/skipped;包含 28 个 Web Host/API tests;跨运行时 fixture 由专用命令/job 隔离执行 | +| Node 16:三个边界/API/CLI contract tests | 3 files passed,0 failed/skipped | +| Node 16 + npm 8、Node 24:`npm run package:smoke:lifecycle` | 两个 runtime 均通过安装态 bin、synthetic SQLite、status JSON、Web pairing/profile、真实 Core status/stale error 脱敏、index/strict CSP | +| `npm audit --omit=dev --audit-level=moderate` / full-tree high | 均为 0 vulnerabilities | +| `dotnet build CodexProviderSync.sln --configuration Release`,另显式 build FixtureHost/CrashHost Release | 均为 0 warnings / 0 errors | +| `.NET Core/Application/Automation/App/GUI E2E tests` | Core 220 passed(1 个 Windows WSL safety 按平台预期 skipped);其余 49 / 27 / 67 / 36 passed,0 failed | + +## 已知未闭合项 + +- 远端 required CI 尚未运行,最终 PR 合入前 Phase 2 不标记 Completed;C5 checkpoint 也不等同于发布。 +- 当前 production Web 单 JS chunk 为 530.55 kB,Vite 产生约 2.30 MB source map;这是 C9 的 code-split/生产产物排除与包内容扫描门槛,不能据 C5 声称 release artifact 已安全闭合。 +- Electron BrowserWindow、Preload/IPC、Utility Process、只读 packaged smoke 与 Renderer 原生路径 picker/token 属于 C6;当前 Web Profiles 仍是浏览器 Host 管理界面,不能直接复用于 Electron 任意路径输入。 +- C5 保留既有 atomic rollout Restore,不用 `truncate + copy` 临时方案换取表面上的路径绑定,也不声称最终 namespace commit 已 descriptor-bound。C8 必须把 parent-handle-relative atomic install、恢复前 snapshot/journal、逐阶段故障注入及正文/换行逐字节不变量一起闭合。 +- Restore v2 独立恢复前 snapshot/journal、Watch/Diagnostics export/Update、三平台打包、SBOM/checksum、签名/公证和 C10 evidence bundle 均未在 C5 实现。 +- 本 checkpoint 未创建 tag,未发布 npm/GitHub Release,未签名、公证或写更新通道。 diff --git a/package-lock.json b/package-lock.json index d2141c0..1a95fb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,16 +47,35 @@ "apps/web": { "name": "@codex-provider-sync/web", "version": "0.0.0", + "dependencies": { + "@codex-provider-sync/app-ui": "0.0.0", + "@codex-provider-sync/core-client": "0.0.0", + "@codex-provider-sync/design-system": "0.0.0" + }, "devDependencies": { + "@playwright/test": "1.62.1", + "@tailwindcss/vite": "4.3.3", + "@types/react": "19.2.18", + "@types/react-dom": "19.2.5", "@vitejs/plugin-react": "6.1.0", "react": "19.2.8", "react-dom": "19.2.8", + "tailwindcss": "4.3.3", "vite": "8.2.2" }, "engines": { "node": ">=24" } }, + "node_modules/@babel/runtime": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@codex-provider-sync/app-ui": { "resolved": "packages/app-ui", "link": true @@ -81,153 +100,1459 @@ "resolved": "packages/design-system", "link": true }, - "node_modules/@codex-provider-sync/desktop": { - "resolved": "apps/desktop", - "link": true + "node_modules/@codex-provider-sync/desktop": { + "resolved": "apps/desktop", + "link": true + }, + "node_modules/@codex-provider-sync/test-fixtures": { + "resolved": "packages/test-fixtures", + "link": true + }, + "node_modules/@codex-provider-sync/web": { + "resolved": "apps/web", + "link": true + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.8.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@hookform/resolvers": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.9.1.tgz", + "integrity": "sha512-7b7vsbraJxKgjVSA1Nur9tLwj539WGJUBLA7QNvXnFoT2pM5Z7G+6rlukk4B2/QrTZy6huRtH6wKeESPKuIr6w==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "@sinclair/typebox": ">=0.25.24", + "@standard-schema/spec": "^1.0.0", + "@typeschema/main": ">=0.13.7", + "@vinejs/vine": "^2.0.0 || ^3.0.0 || ^4.0.0", + "ajv": "^8.12.0", + "ajv-errors": "^3.0.0", + "ajv-formats": "^2.1.1", + "arktype": "^2.0.0", + "ata-validator": "^1.2.0", + "class-transformer": ">=0.4.0", + "class-validator": ">=0.12.0", + "computed-types": "^1.0.0", + "effect": "^3.10.3", + "fluentvalidation-ts": "^3.0.0", + "fp-ts": "^2.7.0", + "io-ts": "^2.0.0", + "joi": "^17.0.0 || ^18.0.0", + "nope-validator": ">=0.12.0", + "react-hook-form": "^7.55.0", + "superstruct": ">=0.12.0", + "typanion": "^3.3.2", + "valibot": ">=0.31.0 || ^1.0.0-beta.4 || ^1.0.0-rc", + "vest": ">=6.0.0", + "yup": "^1.0.0", + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@sinclair/typebox": { + "optional": true + }, + "@standard-schema/spec": { + "optional": true + }, + "@typeschema/main": { + "optional": true + }, + "@vinejs/vine": { + "optional": true + }, + "ajv": { + "optional": true + }, + "ajv-errors": { + "optional": true + }, + "ajv-formats": { + "optional": true + }, + "arktype": { + "optional": true + }, + "ata-validator": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + }, + "computed-types": { + "optional": true + }, + "effect": { + "optional": true + }, + "fluentvalidation-ts": { + "optional": true + }, + "fp-ts": { + "optional": true + }, + "io-ts": { + "optional": true + }, + "joi": { + "optional": true + }, + "nope-validator": { + "optional": true + }, + "superstruct": { + "optional": true + }, + "typanion": { + "optional": true + }, + "valibot": { + "optional": true + }, + "vest": { + "optional": true + }, + "yup": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@playwright/test": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz", + "integrity": "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.62.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", + "integrity": "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", + "integrity": "sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", + "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", + "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", + "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", + "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", + "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-effect-event": "0.0.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", + "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", + "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", + "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", + "integrity": "sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-rect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/rect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", + "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", + "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.3.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.7.tgz", + "integrity": "sha512-WFGImkmbzcfxeIwq/+4HvRN0pizBwbwQUED4I13ezQsDdfl38ZntN6TmR8XaSzPBqoCToe8rF75j6NPNDSzhbg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.23.tgz", + "integrity": "sha512-ofhyAsYaocRGOs/n0XWdUOSVzEAG6BfrMVM8z0c0kLEWY38w/0WuMFPTJP/HVaZPYkMvHZoKIIhNcjbTCBILPg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", + "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", + "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.4.tgz", + "integrity": "sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", + "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", + "integrity": "sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", + "integrity": "sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/@codex-provider-sync/test-fixtures": { - "resolved": "packages/test-fixtures", - "link": true + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/@codex-provider-sync/web": { - "resolved": "apps/web", - "link": true + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/@oxc-project/types": { - "version": "0.146.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", - "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, "funding": { - "url": "https://github.com/sponsors/Boshen" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", - "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", "cpu": [ - "arm" + "x64" ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ - "android" + "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", - "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", "cpu": [ - "arm64" + "x64" ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ - "android" + "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", - "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", + "license": "MPL-2.0", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", - "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", "cpu": [ "x64" ], "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 20" } }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", - "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "freebsd" + "darwin" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 20" } }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", - "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", "cpu": [ - "arm" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "darwin" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 20" } }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", - "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" + "freebsd" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 20" } }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", - "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", "cpu": [ - "arm64" + "arm" ], "dev": true, "license": "MIT", @@ -236,15 +1561,15 @@ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 20" } }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", - "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, "license": "MIT", @@ -253,15 +1578,15 @@ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 20" } }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", - "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", "cpu": [ - "s390x" + "arm64" ], "dev": true, "license": "MIT", @@ -270,13 +1595,13 @@ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 20" } }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", - "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", "cpu": [ "x64" ], @@ -287,13 +1612,13 @@ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 20" } }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", - "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", "cpu": [ "x64" ], @@ -304,30 +1629,43 @@ "linux" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 20" } }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", - "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], "cpu": [ - "arm64" + "wasm32" ], "dev": true, "license": "MIT", "optional": true, - "os": [ - "openharmony" - ], + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">=14.0.0" } }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", - "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", "cpu": [ "arm64" ], @@ -338,13 +1676,13 @@ "win32" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 20" } }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", - "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", "cpu": [ "x64" ], @@ -355,15 +1693,49 @@ "win32" ], "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": ">= 20" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.102.3", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.102.3.tgz", + "integrity": "sha512-5O2VEceonqC4uaTLUGglb0hgPouWCJ4K1ykVWyeV8aThhdNCzwpwu01bYoaRNJ9mgFUXS7Kf9utJ46ysT8m+bw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.102.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.102.3.tgz", + "integrity": "sha512-nHazxUEUQSGJOswGgSL2DI77f2K75WRCowDgaiyEi0ACocZTFKewTv+A/rJfq6QkuE35rVPff1QUT3ClbaePGQ==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.102.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } }, "node_modules/@types/node": { "version": "24.13.3", @@ -375,6 +1747,26 @@ "undici-types": "~7.18.0" } }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, "node_modules/@typescript/typescript-aix-ppc64": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", @@ -382,7 +1774,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -399,7 +1790,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -416,7 +1806,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -433,7 +1822,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -450,7 +1838,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -467,7 +1854,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -484,7 +1870,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -501,7 +1886,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -518,7 +1902,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -535,7 +1918,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -552,7 +1934,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -569,7 +1950,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -586,7 +1966,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -603,7 +1982,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -620,7 +1998,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -637,7 +2014,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -654,7 +2030,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -671,7 +2046,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -688,7 +2062,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -705,7 +2078,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -745,6 +2117,18 @@ } } }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -826,6 +2210,34 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "optional": true }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -859,6 +2271,12 @@ "node": ">=8" } }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -868,6 +2286,20 @@ "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -922,12 +2354,65 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "optional": true }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/html-parse-stringify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-4.0.1.tgz", + "integrity": "sha512-0zHsZJrK7S3K2aucXWL6ycoYJ/iNtIcFHC/nYQgFklPtrv5LpJctIiSCroWZWeuoXvuyFdzp6KzjJQ+OT5MfFw==", + "license": "MIT", + "funding": { + "url": "https://locize.com" + } + }, + "node_modules/i18next": { + "version": "26.4.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.4.0.tgz", + "integrity": "sha512-rsmK5bFqsD1AetSFSIa43wtNR4WpvvH4p0tLEsTxkC7QTrfdFm06nbQ95bh8Og4wwaCnUEcm9DVYL2cgxitiQg==", + "funding": [ + { + "type": "individual", + "url": "https://www.locize.com/i18next" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + }, + { + "type": "individual", + "url": "https://www.locize.com" + } + ], + "license": "MIT", + "peerDependencies": { + "typescript": "^5 || ^6 || ^7" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -960,6 +2445,16 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "optional": true }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/lightningcss": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", @@ -1221,6 +2716,25 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lucide-react": { + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.34.0.tgz", + "integrity": "sha512-vnjGJNI7Htk5+oWW8gXGuaLgwgAb0T6/iZbBrp9JCfRFwdNWZ0YTm3eyxjOLgwN6r8iyAf3UA70zNmBRBNv7yg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -1314,6 +2828,53 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/playwright": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", + "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.62.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", + "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { "version": "8.5.26", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", @@ -1399,7 +2960,6 @@ "version": "19.2.8", "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -1409,7 +2969,6 @@ "version": "19.2.8", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", - "dev": true, "license": "MIT", "dependencies": { "scheduler": "^0.27.0" @@ -1418,6 +2977,118 @@ "react": "^19.2.8" } }, + "node_modules/react-hook-form": { + "version": "7.86.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.86.0.tgz", + "integrity": "sha512-4kbWJrh5jPZt1+YqVcXcGKffGcXV/XVbozknLh0Yjh0KhpoAkus21TAQhzRYqNwFkkObmnSvRlZZ3GT+ehoIrA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-i18next": { + "version": "17.0.12", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.12.tgz", + "integrity": "sha512-lFWPEGkxQ6RhusdUkysFBD58VHfSSzvHBzqMgN0SvfVpdQGfwtNkStTqdy08/sJd7s807qqutgx93fRpD0DJ3Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.7", + "html-parse-stringify": "^4.0.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "i18next": ">= 26.2.0", + "react": ">= 16.8.0", + "typescript": "^5 || ^6 || ^7" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -1490,7 +3161,6 @@ "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true, "license": "MIT" }, "node_modules/semver": { @@ -1578,6 +3248,37 @@ "node": ">=0.10.0" } }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/tar-fs": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", @@ -1623,6 +3324,12 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -1639,7 +3346,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc" @@ -1677,6 +3384,58 @@ "dev": true, "license": "MIT" }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -1767,16 +3526,43 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "optional": true }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "packages/app-ui": { "name": "@codex-provider-sync/app-ui", "version": "0.0.0", "dependencies": { "@codex-provider-sync/contracts": "0.0.0", "@codex-provider-sync/core-client": "0.0.0", - "@codex-provider-sync/design-system": "0.0.0" + "@codex-provider-sync/design-system": "0.0.0", + "@hookform/resolvers": "5.9.1", + "@radix-ui/react-dialog": "1.1.23", + "@radix-ui/react-select": "2.3.7", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-toast": "1.2.23", + "@tanstack/react-query": "5.102.3", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", + "i18next": "26.4.0", + "lucide-react": "1.34.0", + "react-hook-form": "7.86.0", + "react-i18next": "17.0.12", + "tailwind-merge": "3.6.0", + "zod": "4.4.3" }, "engines": { "node": ">=24" + }, + "peerDependencies": { + "react": "19.2.8", + "react-dom": "19.2.8" } }, "packages/contracts": { diff --git a/package.json b/package.json index a242403..17cf4da 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,8 @@ "AGENTS.md", "docs", "images/README", + "packages/contracts/dist", + "packages/core/src", "src", "web/dist" ], @@ -23,7 +25,9 @@ }, "scripts": { "test": "node --test", - "web:build": "npm run build --workspace @codex-provider-sync/web", + "web:build": "npm run workspaces:build && npm run build --workspace @codex-provider-sync/web", + "web:test:e2e": "npm run test:e2e --workspace @codex-provider-sync/web", + "fixtures:cross-runtime": "node --test test-support/cross-runtime-fixtures.mjs", "web:start": "node src/cli.js web", "workspaces:build": "tsc -b tsconfig.workspaces.json && tsc -p packages/core/tsconfig.json", "workspaces:test": "npm run test --workspaces --if-present", diff --git a/packages/app-ui/checks/surface.contract.mjs b/packages/app-ui/checks/surface.contract.mjs index 9414359..a7094db 100644 --- a/packages/app-ui/checks/surface.contract.mjs +++ b/packages/app-ui/checks/surface.contract.mjs @@ -1,7 +1,15 @@ import assert from "node:assert/strict"; +import fs from "node:fs/promises"; import test from "node:test"; -import { APP_ROUTES, APP_UI_MIGRATION_STATE } from "../dist/index.js"; +import { + APP_ROUTES, + APP_UI_MIGRATION_STATE, + profileSchema, + resourcesHaveMatchingKeys, + restoreSchema, + switchSchema +} from "../dist/index.js"; test("app-ui owns the complete target navigation vocabulary", () => { assert.deepEqual(APP_ROUTES, [ @@ -14,5 +22,28 @@ test("app-ui owns the complete target navigation vocabulary", () => { "diagnostics", "settings" ]); - assert.equal(APP_UI_MIGRATION_STATE, "contract-only-c4"); + assert.equal(APP_UI_MIGRATION_STATE, "shared-ui-c5"); +}); + +test("shared UI translations and write forms keep one strict schema", () => { + assert.equal(resourcesHaveMatchingKeys(), true); + assert.equal(switchSchema.safeParse({ provider: "relay", modelMode: "explicit", model: "gpt", keepCount: 5 }).success, true); + assert.equal(switchSchema.safeParse({ provider: "relay", modelMode: "explicit", model: "", keepCount: 5 }).success, false); + assert.equal(restoreSchema.safeParse({ backupId: "managed", restoreConfig: false, restoreDatabase: false, restoreSessions: false, allowSqliteHomeRelocation: false }).success, false); + assert.equal(profileSchema.safeParse({ profileId: "safe", name: "Safe", codexHome: "../relative", sqliteHome: "" }).success, false); +}); + +test("shared UI has no transport, Node, Electron or persistent history access", async () => { + const appSource = await fs.readFile(new URL("../src/App.tsx", import.meta.url), "utf8"); + const allSource = await Promise.all([ + "App.tsx", "i18n.ts", "routes.ts", "schemas.ts", "types.ts", "ui.tsx" + ].map((name) => fs.readFile(new URL(`../src/${name}`, import.meta.url), "utf8"))); + const source = allSource.join("\n"); + assert.doesNotMatch(source, /\bfetch\s*\(/); + assert.doesNotMatch(source, /localStorage|sessionStorage|from\s+["'](?:node:|electron)/); + assert.doesNotMatch(source, /\/api\//); + assert.match(appSource, /core\.getHistorySession/); + assert.match(appSource, /messageLimit:\s*200/); + assert.doesNotMatch(appSource, /queryKey:\s*\["history-detail"/); + assert.match(appSource, /schemaVersion:\s*1 as const, planId: summary\.planId/); }); diff --git a/packages/app-ui/package.json b/packages/app-ui/package.json index ef73971..298516a 100644 --- a/packages/app-ui/package.json +++ b/packages/app-ui/package.json @@ -17,8 +17,26 @@ "node": ">=24" }, "dependencies": { + "@hookform/resolvers": "5.9.1", + "@radix-ui/react-dialog": "1.1.23", + "@radix-ui/react-select": "2.3.7", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-toast": "1.2.23", + "@tanstack/react-query": "5.102.3", "@codex-provider-sync/contracts": "0.0.0", "@codex-provider-sync/core-client": "0.0.0", - "@codex-provider-sync/design-system": "0.0.0" + "@codex-provider-sync/design-system": "0.0.0", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", + "i18next": "26.4.0", + "lucide-react": "1.34.0", + "react-hook-form": "7.86.0", + "react-i18next": "17.0.12", + "tailwind-merge": "3.6.0", + "zod": "4.4.3" + }, + "peerDependencies": { + "react": "19.2.8", + "react-dom": "19.2.8" } } diff --git a/packages/app-ui/src/App.tsx b/packages/app-ui/src/App.tsx new file mode 100644 index 0000000..92a7f04 --- /dev/null +++ b/packages/app-ui/src/App.tsx @@ -0,0 +1,622 @@ +import { zodResolver } from "@hookform/resolvers/zod"; +import { + QueryClient, + QueryClientProvider, + useIsMutating, + useMutation, + useQuery, + useQueryClient +} from "@tanstack/react-query"; +import type { + DiagnosticsSnapshot, + HistorySessionDetail, + ManagedBackup, + OperationResult, + PlanSummary, + ProfileSelector, + StatusSnapshot, + SwitchModelMode, + WatchSnapshot, + WatchStatusList +} from "@codex-provider-sync/contracts"; +import { CoreClientError } from "@codex-provider-sync/core-client"; +import { I18nextProvider, useTranslation } from "react-i18next"; +import { + Activity, + AlertTriangle, + ArchiveRestore, + CheckCircle2, + Database, + FileClock, + FolderCog, + Gauge, + Globe2, + History, + Languages, + Moon, + Play, + RefreshCw, + RotateCcw, + Settings, + ShieldAlert, + Sun, + Workflow +} from "lucide-react"; +import { + Component, + Fragment, + useCallback, + useEffect, + useMemo, + useRef, + useState, + type ErrorInfo, + type ReactNode +} from "react"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; + +import { APP_ROUTES, type AppRoute } from "./routes.js"; +import { createAppI18n } from "./i18n.js"; +import { profileSchema, restoreSchema, switchSchema, syncSchema } from "./schemas.js"; +import type { AppUiProps, HostProfile } from "./types.js"; +import { Badge, Button, Card, Dialog, Field, Input, ToastProvider, cn, useToast } from "./ui.js"; + +const navigation = [ + ["overview", "nav.overview", Gauge], + ["sync", "nav.sync", Workflow], + ["switch-provider", "nav.switchProvider", RotateCcw], + ["backups-restore", "nav.backupsRestore", ArchiveRestore], + ["history", "nav.history", History], + ["profiles", "nav.profiles", FolderCog], + ["diagnostics", "nav.diagnostics", Activity], + ["settings", "nav.settings", Settings] +] as const; + +type SyncValues = z.infer; +type SwitchValues = z.infer; +type RestoreValues = z.infer; +type ProfileValues = z.infer; + +function profileSelector(profile: HostProfile): ProfileSelector { + return { profileId: profile.id, profileRevision: profile.revision }; +} + +function formatBytes(bytes: number): string { + const units = ["B", "KB", "MB", "GB", "TB"]; + let value = Number.isFinite(bytes) ? bytes : 0; + let unit = 0; + while (value >= 1024 && unit < units.length - 1) { + value /= 1024; + unit += 1; + } + return unit === 0 ? `${value} ${units[unit]}` : `${value.toFixed(value >= 10 ? 1 : 2)} ${units[unit]}`; +} + +function formatDate(value?: string | null, locale = "en"): string { + if (!value) return "—"; + const date = new Date(value); + if (Number.isNaN(date.valueOf())) return "—"; + return new Intl.DateTimeFormat(locale, { dateStyle: "medium", timeStyle: "medium" }).format(date); +} + +function safeErrorText(error: unknown, fallback: string): string { + if (error instanceof CoreClientError) return `${error.dto.message} (${error.code})`; + return fallback; +} + +function PageHeading({ title, subtitle, action }: { title: string; subtitle: string; action?: ReactNode }) { + return ( +
+
+

{title}

+

{subtitle}

+
+ {action} +
+ ); +} + +function KeyValue({ label, value, mono = false }: { label: string; value: ReactNode; mono?: boolean }) { + return ( +
+
{label}
+
{value}
+
+ ); +} + +function Distribution({ title, counts, current }: { title: string; counts: unknown; current: string }) { + const record = counts && typeof counts === "object" && !Array.isArray(counts) ? counts as Record : {}; + const merged = new Map(); + for (const scope of ["sessions", "archived_sessions"]) { + const distribution = record[scope]; + if (!distribution || typeof distribution !== "object" || Array.isArray(distribution)) continue; + for (const [provider, count] of Object.entries(distribution as Record)) { + if (typeof count === "number") merged.set(provider, (merged.get(provider) ?? 0) + count); + } + } + const entries = [...merged.entries()].sort((left, right) => right[1] - left[1]); + const total = entries.reduce((sum, [, count]) => sum + count, 0); + return ( + +

{title}

{total}
+
+ {entries.length === 0 ? : entries.map(([provider, count]) => ( +
+
{provider}{count}
+ +
+ ))} +
+
+ ); +} + +function OverviewPage({ status, loading, refresh }: { status?: StatusSnapshot; loading: boolean; refresh(): void }) { + const { t, i18n } = useTranslation(); + const alignment = status?.alignment && typeof status.alignment === "object" + ? (status.alignment as Record).aligned === true + : false; + return ( + + {t("common.refresh")}} + /> +
+
{t("common.provider")}
{status?.currentProvider ?? "—"}
+
{t("overview.alignment")}
{alignment ? : }{alignment ? t("overview.aligned") : t("overview.notAligned")}
+
{t("overview.backupCount")}
{status?.backupSummary.count ?? 0}
{formatBytes(status?.backupSummary.totalBytes ?? 0)}
+
{t("overview.locked")}
{status?.lockedRolloutFiles.length ?? 0}
+
+
+
+ + +
+
+ ); +} + +function SyncPage({ disabled, prepare }: { disabled: boolean; prepare(values: SyncValues, trigger: HTMLButtonElement | null): Promise }) { + const { t } = useTranslation(); + const form = useForm({ resolver: zodResolver(syncSchema), defaultValues: { keepCount: 5 } }); + const prepareButton = useRef(null); + return ( + + + +
prepare(values, prepareButton.current))}> + + + + +
+
+
+ ); +} + +function SwitchPage({ disabled, providers, prepare }: { disabled: boolean; providers: string[]; prepare(values: SwitchValues, trigger: HTMLButtonElement | null): Promise }) { + const { t } = useTranslation(); + const prepareButton = useRef(null); + const form = useForm({ + resolver: zodResolver(switchSchema), + defaultValues: { provider: providers[0] ?? "openai", modelMode: "provider-default", model: "", keepCount: 5 } + }); + const modelMode = form.watch("modelMode"); + useEffect(() => { if (modelMode !== "explicit") form.setValue("model", ""); }, [form, modelMode]); + return ( + + + +
prepare(values, prepareButton.current))}> + + + + {providers.map((provider) => + + + + {modelMode === "explicit" ? : null} + + +
+
+
+ ); +} + +function BackupRow({ backup, selected, onSelect }: { backup: ManagedBackup; selected: boolean; onSelect(): void }) { + return ( + + ); +} + +function BackupsPage({ + profile, + profiles, + backups, + loading, + disabled, + prepare, + prune +}: { + profile: HostProfile; + profiles: HostProfile[]; + backups: ManagedBackup[]; + loading: boolean; + disabled: boolean; + prepare(values: RestoreValues, trigger: HTMLButtonElement | null): Promise; + prune(keepCount: number): Promise; +}) { + const { t } = useTranslation(); + const form = useForm({ + resolver: zodResolver(restoreSchema), + defaultValues: { + backupId: "", + restoreConfig: true, + restoreDatabase: true, + restoreSessions: true, + allowSqliteHomeRelocation: false, + relocationTargetProfileId: "" + } + }); + const relocation = form.watch("allowSqliteHomeRelocation"); + const [keepCount, setKeepCount] = useState(5); + const prepareButton = useRef(null); + return ( + + +
+ +
+ {loading ? {t("common.loading")} : backups.length === 0 ? {t("backups.empty")} : backups.map((backup) => form.setValue("backupId", backup.backupId, { shouldValidate: true })} selected={form.watch("backupId") === backup.backupId} />)} +
+
+
+ +
prepare(values, prepareButton.current))}> + {["restoreConfig", "restoreDatabase", "restoreSessions"].map((name) => ( + + ))} + + {relocation ? : null} + {form.formState.errors.restoreSessions ? {t("validation.restore")} : null} + +
+
+ + setKeepCount(Number(event.target.value))} type="number" value={keepCount} /> + + +
+
+
+ ); +} + +function HistoryPage({ core, profile }: { core: AppUiProps["core"]; profile: HostProfile }) { + const { t, i18n } = useTranslation(); + const [selectedId, setSelectedId] = useState(null); + const [detail, setDetail] = useState(null); + const [detailLoading, setDetailLoading] = useState(false); + const [detailError, setDetailError] = useState(null); + const list = useQuery({ + queryKey: ["history", profile.id, profile.revision], + queryFn: ({ signal }) => core.listHistory({ profile: profileSelector(profile), page: 1, pageSize: 100 }, { signal }), + gcTime: 0, + staleTime: 0 + }); + useEffect(() => { + if (!selectedId) { + setDetail(null); + setDetailError(null); + return; + } + const controller = new AbortController(); + setDetail(null); + setDetailError(null); + setDetailLoading(true); + void core.getHistorySession({ profile: profileSelector(profile), sessionId: selectedId, messageLimit: 200 }, { signal: controller.signal }) + .then((value) => { if (!controller.signal.aborted) setDetail(value); }) + .catch((error: unknown) => { if (!controller.signal.aborted) setDetailError(safeErrorText(error, t("global.failed"))); }) + .finally(() => { if (!controller.signal.aborted) setDetailLoading(false); }); + return () => { + controller.abort(); + setDetail(null); + }; + }, [core, profile, selectedId, t]); + if (selectedId) { + return ( + + setSelectedId(null)} type="button" variant="secondary">{t("history.back")}} /> + + {detailLoading ? {t("common.loading")} : detailError ? {detailError} : detail ?
{detail.messages.map((message) =>
{message.role}{formatDate(message.timestamp, i18n.language)}
{message.text}
)}
: null} +
+
+ ); + } + return ( + + + + {list.isPending ? {t("common.loading")} : list.isError ? {safeErrorText(list.error, t("global.failed"))} : list.data.sessions.length === 0 ? {t("history.empty")} :
{list.data.sessions.map((session) =>
{session.title || session.id}
{session.provider}{session.messageCount} {t("history.messages")}{formatDate(session.updatedAt, i18n.language)}{session.archived ? {t("history.archived")} : null}
)}
} +
+
+ ); +} + +function ProfilesPage({ profiles, refresh, host }: { profiles: HostProfile[]; refresh(): Promise; host: AppUiProps["host"] }) { + const { t } = useTranslation(); + const toast = useToast(); + const [editing, setEditing] = useState(null); + const form = useForm({ resolver: zodResolver(profileSchema), defaultValues: { profileId: "", name: "", codexHome: "", sqliteHome: "" } }); + useEffect(() => { + form.reset(editing ? { profileId: editing.id, name: editing.name, codexHome: editing.codexHome, sqliteHome: editing.sqliteHome ?? "" } : { profileId: "", name: "", codexHome: "", sqliteHome: "" }); + }, [editing, form]); + const save = useMutation({ + mutationFn: async (values: ProfileValues) => host.saveProfile({ ...values, ...(editing ? { profileRevision: editing.revision } : {}) }), + onSuccess: async () => { await refresh(); setEditing(null); form.reset(); toast.push({ title: t("common.save"), tone: "success" }); }, + onError: (error) => toast.push({ title: t("global.failed"), description: safeErrorText(error, t("global.unexpected")), tone: "danger" }) + }); + const remove = useMutation({ + mutationFn: (profile: HostProfile) => host.deleteProfile(profile.id, profile.revision), + onSuccess: async () => { await refresh(); setEditing(null); toast.push({ title: t("common.delete"), tone: "success" }); }, + onError: (error) => toast.push({ title: t("global.failed"), description: safeErrorText(error, t("global.unexpected")), tone: "danger" }) + }); + return ( + + +
+
{profiles.map((profile) => )}
+ +
save.mutateAsync(values))}> + + + + +
{editing ? : null}
+
+

{t("profiles.defaultManaged")}

+
+
+
+ ); +} + +function DiagnosticsPage({ diagnostics, loading, refresh }: { diagnostics?: DiagnosticsSnapshot; loading: boolean; refresh(): void }) { + const { t } = useTranslation(); + const sections = diagnostics ? [["runtime", diagnostics.runtime], ["storage", diagnostics.storage], ["provider", diagnostics.provider], ["safety", diagnostics.safety]] as const : []; + return ( + + {t("common.refresh")}} /> +
{sections.map(([key, value]) =>

{t(`diagnostics.${key}`)}

{JSON.stringify(value, null, 2)}
)}
+
+ ); +} + +function activeWatch(value: WatchSnapshot | WatchStatusList | undefined): WatchSnapshot | null { + if (!value) return null; + if ("watches" in value) return value.watches.find((watch) => watch.status !== "stopped") ?? value.watches[0] ?? null; + return value; +} + +function SettingsPage({ props, profile }: { props: AppUiProps; profile: HostProfile }) { + const { t, i18n } = useTranslation(); + const queryClient = useQueryClient(); + const [theme, setTheme] = useState(props.preferences.getTheme() ?? props.initialTheme); + const watch = useQuery({ queryKey: ["watch-status"], queryFn: () => props.core.getWatchStatus({}), refetchInterval: 3000 }); + const currentWatch = activeWatch(watch.data); + const start = useMutation({ mutationFn: () => props.core.startWatch({ profile: profileSelector(profile), includeStateDb: true }), onSuccess: () => queryClient.invalidateQueries({ queryKey: ["watch-status"] }) }); + const stop = useMutation({ mutationFn: (watchId: string) => props.core.stopWatch({ watchId }), onSuccess: () => queryClient.invalidateQueries({ queryKey: ["watch-status"] }) }); + const setLocale = async (locale: "zh-CN" | "en") => { props.preferences.setLocale(locale); await i18n.changeLanguage(locale); }; + const applyTheme = (value: "system" | "light" | "dark") => { + setTheme(value); + props.preferences.setTheme(value); + document.documentElement.dataset.theme = value; + }; + return ( + + +
+
{t("settings.englishFallback")}
+
{(["system", "light", "dark"] as const).map((value) => )}
+

{t("settings.watch")}

{currentWatch?.status ?? t("common.none")}{currentWatch ?
{currentWatch.watchId}
: null}
{currentWatch?.status === "running" ? : }
+

{t("settings.forget")}

{t("settings.forgetHint")}

+
+
+ ); +} + +function PlanReview({ plan, applying, close, apply, restoreFocus }: { plan: PlanSummary | null; applying: boolean; close(): void; apply(): void; restoreFocus(): void }) { + const { t, i18n } = useTranslation(); + return ( + } + onOpenChange={(open) => { if (!open && !applying) close(); }} + open={Boolean(plan)} + restoreFocus={restoreFocus} + title={t("plan.title")} + > + {plan ?

{t("plan.target")}

{JSON.stringify(plan.target, null, 2)}

{t("plan.impact")}

{JSON.stringify(plan.impact, null, 2)}
{plan.warnings.length ?

{t("common.warnings")}

    {plan.warnings.map((warning, index) =>
  • {warning}
  • )}
: null}

{t("plan.exactApply")}

: null} +
+ ); +} + +function AppContent({ props }: { props: AppUiProps }) { + const { t, i18n } = useTranslation(); + const toast = useToast(); + const queryClient = useQueryClient(); + const [route, setRoute] = useState("overview"); + const [selectedProfileId, setSelectedProfileId] = useState("default"); + const [plan, setPlan] = useState(null); + const planReturnFocus = useRef(null); + const mutationCount = useIsMutating(); + const profilesQuery = useQuery({ queryKey: ["profiles"], queryFn: ({ signal }) => props.host.listProfiles(signal), staleTime: 5000 }); + const profiles = profilesQuery.data ?? []; + const profile = profiles.find((entry) => entry.id === selectedProfileId) ?? profiles[0]; + useEffect(() => { + document.documentElement.lang = i18n.resolvedLanguage?.toLowerCase().startsWith("zh") ? "zh-CN" : "en"; + }, [i18n.resolvedLanguage]); + useEffect(() => { if (profiles.length && !profiles.some((entry) => entry.id === selectedProfileId)) setSelectedProfileId(profiles[0].id); }, [profiles, selectedProfileId]); + const statusQuery = useQuery({ + queryKey: ["status", profile?.id, profile?.revision], + queryFn: ({ signal }) => props.core.getStatus({ profile: profileSelector(profile) }, { signal }), + enabled: Boolean(profile), + refetchInterval: 5000 + }); + const status = statusQuery.data; + const writeDisabled = !profile || status?.pendingRecovery === true || mutationCount > 0; + const backupsQuery = useQuery({ + queryKey: ["backups", profile?.id, profile?.revision], + queryFn: ({ signal }) => props.core.listBackups({ profile: profileSelector(profile) }, { signal }), + enabled: Boolean(profile && route === "backups-restore") + }); + const diagnosticsQuery = useQuery({ + queryKey: ["diagnostics", profile?.id, profile?.revision], + queryFn: ({ signal }) => props.core.getDiagnostics({ profile: profileSelector(profile) }, { signal }), + enabled: Boolean(profile && route === "diagnostics") + }); + const refreshAfterWrite = useCallback(async () => { + await Promise.all([ + queryClient.invalidateQueries({ queryKey: ["status"] }), + queryClient.invalidateQueries({ queryKey: ["backups"] }), + queryClient.invalidateQueries({ queryKey: ["history"] }), + queryClient.invalidateQueries({ queryKey: ["diagnostics"] }) + ]); + }, [queryClient]); + const prepare = useCallback(async (action: () => Promise, trigger: HTMLElement | null) => { + planReturnFocus.current = trigger; + try { setPlan(await action()); } + catch (error) { + planReturnFocus.current = null; + toast.push({ title: t("global.failed"), description: safeErrorText(error, t("global.unexpected")), tone: "danger" }); + } + }, [t, toast]); + const closePlan = useCallback(() => { + const target = planReturnFocus.current; + setPlan(null); + globalThis.requestAnimationFrame(() => globalThis.requestAnimationFrame(() => { + if (target?.isConnected) target.focus(); + if (planReturnFocus.current === target) planReturnFocus.current = null; + })); + }, []); + const restorePlanFocus = useCallback(() => { + const target = planReturnFocus.current; + planReturnFocus.current = null; + target?.focus(); + }, []); + const applyMutation = useMutation({ + mutationFn: async (summary: PlanSummary): Promise => { + const input = { schemaVersion: 1 as const, planId: summary.planId }; + if (summary.operation === "sync") return props.core.applySync(input); + if (summary.operation === "switch") return props.core.applySwitch(input); + return props.core.applyRestore(input); + }, + onSuccess: async (result) => { + closePlan(); + await refreshAfterWrite(); + toast.push({ title: result.outcome === "partial" ? t("global.partial") : t("global.completed"), description: result.backup?.backupId, tone: result.outcome === "partial" ? "warning" : "success" }); + }, + onError: (error) => { + if (error instanceof CoreClientError && ["PLAN_EXPIRED", "PLAN_STALE", "STALE_STATE", "PROFILE_CHANGED", "STORAGE_CHANGED"].includes(error.code)) closePlan(); + toast.push({ title: t("global.failed"), description: safeErrorText(error, t("global.unexpected")), tone: "danger" }); + } + }); + const prune = useCallback(async (keepCount: number) => { + if (!profile) return; + try { + await props.core.pruneBackups({ profile: profileSelector(profile), keepCount }); + await refreshAfterWrite(); + toast.push({ title: t("global.completed"), tone: "success" }); + } catch (error) { + toast.push({ title: t("global.failed"), description: safeErrorText(error, t("global.unexpected")), tone: "danger" }); + } + }, [profile, props.core, refreshAfterWrite, t, toast]); + + const configuredProviders = status?.configuredProviders && Array.isArray(status.configuredProviders) + ? status.configuredProviders.filter((value): value is string => typeof value === "string") + : [status?.currentProvider ?? "openai"]; + const page = !profile ? {profilesQuery.isPending ? t("common.loading") : safeErrorText(profilesQuery.error, t("global.failed"))} + : route === "overview" ? void statusQuery.refetch()} status={status} /> + : route === "sync" ? prepare(() => props.core.prepareSync({ profile: profileSelector(profile), keepCount: values.keepCount }), trigger)} /> + : route === "switch-provider" ? prepare(() => props.core.prepareSwitch({ profile: profileSelector(profile), provider: values.provider, modelMode: values.modelMode as SwitchModelMode, ...(values.modelMode === "explicit" ? { model: values.model } : {}), keepCount: values.keepCount }), trigger)} providers={configuredProviders} /> + : route === "backups-restore" ? prepare(() => props.core.prepareRestore({ profile: profileSelector(profile), backupId: values.backupId, restoreConfig: values.restoreConfig, restoreDatabase: values.restoreDatabase, restoreSessions: values.restoreSessions, ...(values.allowSqliteHomeRelocation ? { allowSqliteHomeRelocation: true, relocationTargetProfileId: values.relocationTargetProfileId } : {}) }), trigger)} profile={profile} profiles={profiles} prune={prune} /> + : route === "history" ? + : route === "profiles" ? profilesQuery.refetch()} /> + : route === "diagnostics" ? void diagnosticsQuery.refetch()} /> + : ; + + return ( +
+ { event.preventDefault(); document.getElementById("main-content")?.focus(); }}>{t("a11y.skipToContent")} +
+
Codex Provider Sync
{t("brandSubtitle")}
+
0 || status?.operationInProgress ? "warning" : "success"}>{mutationCount > 0 || status?.operationInProgress ? t("global.busy") : t("global.ready")}
+
+
+ +
+ {status?.pendingRecovery ?
RECOVERY_REQUIRED
{t("global.recovery")}
: null} + {status?.operationInProgress ?
{t("global.busy")}
{String(status.operationInProgress.operation ?? "operation")} · {String(status.operationInProgress.busyScope ?? "")}
: null} + {statusQuery.isError ?
{safeErrorText(statusQuery.error, t("global.failed"))}
: null} + {page} +
+
+ { if (plan) applyMutation.mutate(plan); }} applying={applyMutation.isPending} close={closePlan} plan={plan} restoreFocus={restorePlanFocus} /> +
+ ); +} + +class AppErrorBoundary extends Component<{ children: ReactNode; locale(): string }, { failed: boolean }> { + state = { failed: false }; + static getDerivedStateFromError(): { failed: boolean } { return { failed: true }; } + componentDidCatch(_error: Error, _info: ErrorInfo): void {} + render(): ReactNode { + if (!this.state.failed) return this.props.children; + const chinese = this.props.locale().toLowerCase().startsWith("zh"); + return

{chinese ? "应用错误" : "Application error"}

{chinese ? "页面遇到未预期错误;系统没有自动启动任何写操作。" : "The page encountered an unexpected error. No write was started automatically."}

; + } +} + +export function AppUi(props: AppUiProps) { + const requestedLocale = props.preferences.getLocale() ?? props.initialLocale; + const [i18n, setI18n] = useState> | null>(null); + const [queryClient] = useState(() => new QueryClient({ defaultOptions: { queries: { retry: 1, refetchOnWindowFocus: false }, mutations: { retry: false } } })); + useEffect(() => { + let active = true; + void createAppI18n(requestedLocale).then((instance) => { if (active) setI18n(instance); }); + document.documentElement.dataset.theme = props.preferences.getTheme() ?? props.initialTheme; + return () => { active = false; queryClient.clear(); }; + }, [props.initialTheme, props.preferences, queryClient, requestedLocale]); + if (!i18n) return
{requestedLocale === "zh-CN" ? "正在加载…" : "Loading…"}
; + return i18n.language}>; +} + +export { APP_ROUTES }; diff --git a/packages/app-ui/src/i18n.ts b/packages/app-ui/src/i18n.ts new file mode 100644 index 0000000..8730599 --- /dev/null +++ b/packages/app-ui/src/i18n.ts @@ -0,0 +1,333 @@ +import i18next, { type i18n } from "i18next"; +import type { SupportedLocale } from "@codex-provider-sync/design-system"; + +export const resources = { + en: { + translation: { + brandSubtitle: "Local metadata alignment", + a11y: { + skipToContent: "Skip to content", + profile: "Profile", + primaryNavigation: "Primary navigation" + }, + nav: { + overview: "Overview", + sync: "Sync", + switchProvider: "Switch Provider", + backupsRestore: "Backups / Restore", + history: "History", + profiles: "Profiles", + diagnostics: "Diagnostics", + settings: "Settings" + }, + common: { + refresh: "Refresh", + loading: "Loading…", + cancel: "Cancel", + confirm: "Confirm and apply", + save: "Save", + delete: "Delete", + close: "Close", + none: "None", + unknown: "Unknown", + current: "Current", + provider: "Provider", + model: "Model", + status: "Status", + warnings: "Warnings", + retry: "Retry" + }, + global: { + ready: "Local service ready", + busy: "Operation in progress", + recovery: "Recovery required. Writes are disabled until the pending transaction is resolved.", + stale: "Protected state changed. Prepare the operation again.", + unexpected: "The page encountered an unexpected error.", + partial: "Completed with locked rollout files skipped.", + completed: "Operation completed.", + failed: "Operation failed." + }, + overview: { + title: "Provider metadata overview", + subtitle: "Compare rollout files, the SQLite thread index, and the selected profile.", + alignment: "Alignment", + aligned: "Aligned", + notAligned: "Needs attention", + rollout: "Rollout metadata", + sqlite: "SQLite metadata", + codexHomeSource: "Codex Home source", + sqliteHomeSource: "SQLite Home source", + snapshot: "Snapshot", + backupCount: "Managed backups", + locked: "Locked rollouts" + }, + sync: { + title: "Sync current Provider", + subtitle: "Use the selected profile's root model_provider and align rollout and SQLite metadata.", + keep: "Backups to keep", + prepare: "Prepare sync" + }, + switchPage: { + title: "Switch Provider", + subtitle: "Update root model_provider and synchronize history in one protected operation.", + provider: "Provider ID", + modelMode: "Model handling", + providerDefault: "Use provider default", + keepModel: "Keep root model", + explicitModel: "Set explicit model", + model: "Model name", + prepare: "Prepare switch" + }, + backups: { + title: "Backups and Restore", + subtitle: "Only managed backup IDs can be restored.", + empty: "No managed backups.", + restoreConfig: "Restore config.toml", + restoreDatabase: "Restore State DB", + restoreSessions: "Restore rollout files", + relocation: "Confirm SQLite Home relocation", + targetProfile: "Relocation target profile", + prepare: "Prepare restore", + pruneKeep: "Keep newest backups", + prune: "Prune older backups" + }, + history: { + title: "History", + subtitle: "Session bodies load only after you explicitly open a session.", + empty: "No sessions found.", + open: "Open session", + back: "Back to sessions", + messages: "messages", + archived: "Archived", + active: "Active" + }, + profiles: { + title: "Profiles", + subtitle: "The host resolves paths; Core requests receive only profile IDs and revisions.", + id: "Profile ID", + name: "Name", + codexHome: "Codex Home", + sqliteHome: "SQLite Home (optional)", + create: "Create profile", + update: "Update profile", + defaultManaged: "The default profile is managed by startup flags." + }, + diagnostics: { + title: "Diagnostics", + subtitle: "Read-only, redacted runtime and safety state.", + runtime: "Runtime", + storage: "Storage", + provider: "Provider", + safety: "Safety" + }, + settings: { + title: "Settings", + subtitle: "Only language and theme preferences are stored in this browser.", + language: "Language", + theme: "Theme", + system: "System", + light: "Light", + dark: "Dark", + watch: "Watch", + watchStart: "Start watch", + watchStop: "Stop watch", + forget: "Forget this browser", + englishFallback: "English fallback", + forgetHint: "Pairing credentials are removed by the local host." + }, + plan: { + title: "Review plan", + target: "Target", + impact: "Impact", + expires: "Expires", + backupExpected: "A backup will be created before writes.", + exactApply: "Apply sends only this one-time plan ID." + }, + validation: { + required: "This field is required.", + keep: "Use a whole number from 0 to 1000.", + provider: "Enter a valid Provider ID.", + model: "Enter a model name for explicit mode.", + restore: "Select at least one item to restore.", + profileId: "Use letters, numbers, dots, underscores, or hyphens.", + path: "Enter an absolute path." + } + } + }, + "zh-CN": { + translation: { + brandSubtitle: "本机元数据一致性工具", + a11y: { + skipToContent: "跳到主要内容", + profile: "存储配置", + primaryNavigation: "主导航" + }, + nav: { + overview: "概览", + sync: "同步", + switchProvider: "切换 Provider", + backupsRestore: "备份 / 恢复", + history: "聊天记录", + profiles: "存储配置", + diagnostics: "诊断", + settings: "设置" + }, + common: { + refresh: "刷新", + loading: "正在加载…", + cancel: "取消", + confirm: "确认并执行", + save: "保存", + delete: "删除", + close: "关闭", + none: "无", + unknown: "未知", + current: "当前", + provider: "Provider", + model: "模型", + status: "状态", + warnings: "警告", + retry: "重试" + }, + global: { + ready: "本地服务就绪", + busy: "操作执行中", + recovery: "存在待恢复事务;在明确恢复前已禁用写操作。", + stale: "受保护状态已变化,请重新生成计划。", + unexpected: "页面遇到未预期错误。", + partial: "操作完成,但跳过了仍被锁定的 rollout 文件。", + completed: "操作已完成。", + failed: "操作失败。" + }, + overview: { + title: "Provider 元数据总览", + subtitle: "比较 rollout 文件、SQLite 线程索引与当前存储配置。", + alignment: "对齐状态", + aligned: "已对齐", + notAligned: "需要处理", + rollout: "Rollout 元数据", + sqlite: "SQLite 元数据", + codexHomeSource: "Codex Home 来源", + sqliteHomeSource: "SQLite Home 来源", + snapshot: "快照时间", + backupCount: "受管备份", + locked: "锁定的 rollout" + }, + sync: { + title: "同步当前 Provider", + subtitle: "读取当前配置的根 model_provider,并对齐 rollout 与 SQLite 元数据。", + keep: "保留备份数量", + prepare: "生成同步计划" + }, + switchPage: { + title: "切换 Provider", + subtitle: "在一次受保护操作中修改根 model_provider 并同步历史。", + provider: "Provider ID", + modelMode: "模型处理方式", + providerDefault: "使用 Provider 默认模型", + keepModel: "保留根模型", + explicitModel: "显式设置模型", + model: "模型名称", + prepare: "生成切换计划" + }, + backups: { + title: "备份与恢复", + subtitle: "恢复只能使用服务端管理的 backupId。", + empty: "暂无受管备份。", + restoreConfig: "恢复 config.toml", + restoreDatabase: "恢复 State DB", + restoreSessions: "恢复 rollout 文件", + relocation: "确认 SQLite Home 迁移", + targetProfile: "迁移目标配置", + prepare: "生成恢复计划", + pruneKeep: "保留最新备份数", + prune: "清理旧备份" + }, + history: { + title: "聊天记录", + subtitle: "只有在你明确打开会话后才加载消息正文。", + empty: "没有找到会话。", + open: "打开会话", + back: "返回会话列表", + messages: "条消息", + archived: "已归档", + active: "活动" + }, + profiles: { + title: "存储配置", + subtitle: "路径由 Host 可信解析;Core 请求只携带配置 ID 与 revision。", + id: "配置 ID", + name: "名称", + codexHome: "Codex Home", + sqliteHome: "SQLite Home(可选)", + create: "新建配置", + update: "更新配置", + defaultManaged: "默认配置由启动参数管理。" + }, + diagnostics: { + title: "诊断", + subtitle: "只读展示经脱敏的运行时与安全状态。", + runtime: "运行时", + storage: "存储", + provider: "Provider", + safety: "安全状态" + }, + settings: { + title: "设置", + subtitle: "此浏览器只持久化语言和主题偏好。", + language: "语言", + theme: "主题", + system: "跟随系统", + light: "浅色", + dark: "深色", + watch: "监视", + watchStart: "启动监视", + watchStop: "停止监视", + forget: "忘记此浏览器", + englishFallback: "英文为兜底语言", + forgetHint: "配对凭据将由本地 Host 删除。" + }, + plan: { + title: "审核计划", + target: "目标", + impact: "影响", + expires: "失效时间", + backupExpected: "写入前会先创建备份。", + exactApply: "执行时只提交此一次性 planId。" + }, + validation: { + required: "此项必填。", + keep: "请输入 0 到 1000 的整数。", + provider: "请输入有效的 Provider ID。", + model: "显式模式必须填写模型名称。", + restore: "至少选择一种恢复内容。", + profileId: "只能使用字母、数字、点、下划线或连字符。", + path: "请输入绝对路径。" + } + } + } +} as const; + +export async function createAppI18n(locale: SupportedLocale): Promise { + const instance = i18next.createInstance(); + await instance.init({ + resources, + lng: locale, + fallbackLng: "en", + interpolation: { escapeValue: false }, + returnNull: false + }); + return instance; +} + +export function resourcesHaveMatchingKeys(): boolean { + const flatten = (value: Record, prefix = ""): string[] => Object.entries(value).flatMap(([key, entry]) => { + const path = prefix ? `${prefix}.${key}` : key; + return entry && typeof entry === "object" + ? flatten(entry as Record, path) + : [path]; + }); + const english = flatten(resources.en.translation as unknown as Record).sort(); + const chinese = flatten(resources["zh-CN"].translation as unknown as Record).sort(); + return english.length === chinese.length && english.every((key, index) => key === chinese[index]); +} diff --git a/packages/app-ui/src/index.ts b/packages/app-ui/src/index.ts index c0e79fb..ae69e90 100644 --- a/packages/app-ui/src/index.ts +++ b/packages/app-ui/src/index.ts @@ -1,26 +1,7 @@ -import type { CoreClient } from "@codex-provider-sync/core-client"; -import type { SupportedLocale, ThemeMode } from "@codex-provider-sync/design-system"; +export { AppUi } from "./App.js"; +export { APP_ROUTES, type AppRoute } from "./routes.js"; +export { createAppI18n, resources, resourcesHaveMatchingKeys } from "./i18n.js"; +export { profileSchema, restoreSchema, switchSchema, syncSchema } from "./schemas.js"; +export type { AppUiProps, HostClient, HostProfile, PreferenceStore, SaveProfileInput } from "./types.js"; -export const APP_ROUTES = [ - "overview", - "sync", - "switch-provider", - "backups-restore", - "history", - "profiles", - "diagnostics", - "settings" -] as const; - -export type AppRoute = typeof APP_ROUTES[number]; - -export interface AppShellDependencies { - core: CoreClient; - locale: SupportedLocale; - theme: ThemeMode; -} - -export const APP_UI_MIGRATION_STATE = "contract-only-c4" as const; - -// C5 supplies React, routing, queries, forms, validation and rendered pages. -// This package intentionally has no Electron or Node dependency. +export const APP_UI_MIGRATION_STATE = "shared-ui-c5" as const; diff --git a/packages/app-ui/src/routes.ts b/packages/app-ui/src/routes.ts new file mode 100644 index 0000000..eb33af7 --- /dev/null +++ b/packages/app-ui/src/routes.ts @@ -0,0 +1,12 @@ +export const APP_ROUTES = [ + "overview", + "sync", + "switch-provider", + "backups-restore", + "history", + "profiles", + "diagnostics", + "settings" +] as const; + +export type AppRoute = typeof APP_ROUTES[number]; diff --git a/packages/app-ui/src/schemas.ts b/packages/app-ui/src/schemas.ts new file mode 100644 index 0000000..44d594f --- /dev/null +++ b/packages/app-ui/src/schemas.ts @@ -0,0 +1,49 @@ +import { z } from "zod"; + +export const keepCountSchema = z.number().int().min(0).max(1000); + +export const syncSchema = z.object({ + keepCount: keepCountSchema +}); + +export const switchSchema = z.object({ + provider: z.string().trim().min(1).max(200).regex(/^[A-Za-z0-9._-]+$/), + modelMode: z.enum(["provider-default", "keep-root-model", "explicit"]), + model: z.string().trim().max(500).optional(), + keepCount: keepCountSchema +}).superRefine((value, context) => { + if (value.modelMode === "explicit" && !value.model) { + context.addIssue({ code: "custom", path: ["model"], message: "model-required" }); + } + if (value.modelMode !== "explicit" && value.model) { + context.addIssue({ code: "custom", path: ["model"], message: "model-not-accepted" }); + } +}); + +export const restoreSchema = z.object({ + backupId: z.string().trim().min(1).max(300), + restoreConfig: z.boolean(), + restoreDatabase: z.boolean(), + restoreSessions: z.boolean(), + allowSqliteHomeRelocation: z.boolean(), + relocationTargetProfileId: z.string().trim().max(80).optional() +}).superRefine((value, context) => { + if (!value.restoreConfig && !value.restoreDatabase && !value.restoreSessions) { + context.addIssue({ code: "custom", path: ["restoreSessions"], message: "restore-required" }); + } + if (value.allowSqliteHomeRelocation && (!value.relocationTargetProfileId || value.restoreConfig)) { + context.addIssue({ code: "custom", path: ["relocationTargetProfileId"], message: "relocation-invalid" }); + } +}); + +const absolutePath = z.string().trim().min(1).max(4096).refine( + (value) => /^(?:[A-Za-z]:[\\/]|\\\\|\/)/.test(value), + "absolute-path-required" +); + +export const profileSchema = z.object({ + profileId: z.string().trim().min(1).max(80).regex(/^[A-Za-z0-9._-]+$/), + name: z.string().trim().min(1).max(120), + codexHome: absolutePath, + sqliteHome: z.union([absolutePath, z.literal("")]).optional() +}); diff --git a/packages/app-ui/src/types.ts b/packages/app-ui/src/types.ts new file mode 100644 index 0000000..6d43376 --- /dev/null +++ b/packages/app-ui/src/types.ts @@ -0,0 +1,41 @@ +import type { CoreClient } from "@codex-provider-sync/core-client"; +import type { SupportedLocale, ThemeMode } from "@codex-provider-sync/design-system"; + +export interface HostProfile { + id: string; + name: string; + codexHome: string; + sqliteHome: string | null; + revision: string; +} + +export interface SaveProfileInput { + profileId: string; + profileRevision?: string; + name: string; + codexHome: string; + sqliteHome?: string; +} + +export interface HostClient { + listProfiles(signal?: AbortSignal): Promise; + saveProfile(input: SaveProfileInput, signal?: AbortSignal): Promise; + deleteProfile(profileId: string, profileRevision: string, signal?: AbortSignal): Promise; + forgetBrowser?(): Promise; +} + +export interface PreferenceStore { + getLocale(): SupportedLocale | null; + setLocale(locale: SupportedLocale): void; + getTheme(): ThemeMode | null; + setTheme(theme: ThemeMode): void; +} + +export interface AppUiProps { + core: CoreClient; + host: HostClient; + preferences: PreferenceStore; + initialLocale: SupportedLocale; + initialTheme: ThemeMode; + onForgetBrowser?: () => void | Promise; +} diff --git a/packages/app-ui/src/ui.tsx b/packages/app-ui/src/ui.tsx new file mode 100644 index 0000000..ca507bf --- /dev/null +++ b/packages/app-ui/src/ui.tsx @@ -0,0 +1,180 @@ +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { Slot } from "@radix-ui/react-slot"; +import * as ToastPrimitive from "@radix-ui/react-toast"; +import { cva, type VariantProps } from "class-variance-authority"; +import { X } from "lucide-react"; +import { + createContext, + forwardRef, + useCallback, + useContext, + useMemo, + useState, + type ButtonHTMLAttributes, + type HTMLAttributes, + type InputHTMLAttributes, + type ReactNode +} from "react"; +import { twMerge } from "tailwind-merge"; +import clsx, { type ClassValue } from "clsx"; + +export function cn(...values: ClassValue[]): string { + return twMerge(clsx(values)); +} + +const buttonVariants = cva( + "inline-flex min-h-10 items-center justify-center gap-2 rounded-lg px-4 text-sm font-semibold transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--surface)] disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + primary: "bg-[var(--accent)] text-white hover:bg-[var(--accent-strong)]", + secondary: "border border-[var(--border)] bg-[var(--surface-raised)] text-[var(--text)] hover:bg-[var(--surface-hover)]", + danger: "bg-[var(--danger)] text-white hover:brightness-95", + ghost: "text-[var(--muted)] hover:bg-[var(--surface-hover)] hover:text-[var(--text)]" + }, + size: { + default: "h-10", + compact: "h-9 min-h-9 px-3", + icon: "h-10 w-10 px-0" + } + }, + defaultVariants: { variant: "primary", size: "default" } + } +); + +export interface ButtonProps extends ButtonHTMLAttributes, VariantProps { + asChild?: boolean; +} + +export const Button = forwardRef(function Button( + { asChild = false, className, variant, size, ...props }, + ref +) { + const Component = asChild ? Slot : "button"; + return ; +}); + +export const Card = forwardRef>(function Card( + { className, ...props }, + ref +) { + return
; +}); + +export const Input = forwardRef>(function Input( + { className, ...props }, + ref +) { + return ( + + ); +}); + +export function Field({ label, error, hint, children }: { label: string; error?: string; hint?: string; children: ReactNode }) { + return ( + + ); +} + +export function Badge({ tone = "neutral", children }: { tone?: "neutral" | "success" | "warning" | "danger"; children: ReactNode }) { + const tones = { + neutral: "bg-[var(--surface-hover)] text-[var(--muted)]", + success: "bg-[var(--success-soft)] text-[var(--success)]", + warning: "bg-[var(--warning-soft)] text-[var(--warning)]", + danger: "bg-[var(--danger-soft)] text-[var(--danger)]" + }; + return {children}; +} + +export function Dialog({ + open, + onOpenChange, + restoreFocus, + title, + description, + children, + footer +}: { + open: boolean; + onOpenChange(open: boolean): void; + restoreFocus?(): void; + title: string; + description?: string; + children: ReactNode; + footer?: ReactNode; +}) { + return ( + + + + { + if (!restoreFocus) return; + event.preventDefault(); + restoreFocus(); + }} + > +
+ {title} + {description ? {description} : null} +
+ + + +
{children}
+ {footer ?
{footer}
: null} +
+
+
+ ); +} + +interface ToastItem { id: number; title: string; description?: string; tone: "success" | "warning" | "danger"; } +interface ToastContextValue { push(item: Omit): void; } +const ToastContext = createContext(null); + +export function ToastProvider({ children }: { children: ReactNode }) { + const [items, setItems] = useState([]); + const push = useCallback((item: Omit) => { + const id = Date.now() + Math.floor(Math.random() * 1000); + setItems((current) => [...current, { ...item, id }]); + }, []); + const value = useMemo(() => ({ push }), [push]); + return ( + + + {children} + {items.map((item) => ( + { if (!open) setItems((current) => current.filter((entry) => entry.id !== item.id)); }} + > + {item.title} + {item.description ? {item.description} : null} + + ))} + + + + ); +} + +export function useToast(): ToastContextValue { + const value = useContext(ToastContext); + if (!value) throw new Error("useToast must be used inside ToastProvider."); + return value; +} diff --git a/packages/app-ui/tsconfig.json b/packages/app-ui/tsconfig.json index 9c115ef..0d6c810 100644 --- a/packages/app-ui/tsconfig.json +++ b/packages/app-ui/tsconfig.json @@ -6,7 +6,8 @@ "outDir": "dist" }, "include": [ - "src/**/*.ts" + "src/**/*.ts", + "src/**/*.tsx" ], "references": [ { "path": "../contracts" }, diff --git a/packages/contracts/checks/contracts.contract.mjs b/packages/contracts/checks/contracts.contract.mjs index 2ae4f75..d8cf5da 100644 --- a/packages/contracts/checks/contracts.contract.mjs +++ b/packages/contracts/checks/contracts.contract.mjs @@ -129,8 +129,7 @@ test("method output guards reject structurally invalid successes", () => { currentProvider: "openai", rolloutCounts: { openai: 1 }, sqliteCounts: { openai: 1 }, - codexHome: "redacted", - sqliteHome: "redacted", + codexHomeSource: "profile", sqliteHomeSource: "default", backupSummary: { count: 0, totalBytes: 0 }, pendingRecovery: false, @@ -158,6 +157,10 @@ test("method output guards reject structurally invalid successes", () => { ...status, operationInProgress: { leak: () => "private" } })); + assert.throws(() => assertCoreMethodOutput("getStatus", { + ...status, + codexHome: "C:/private" + })); assert.throws(() => assertCoreMethodOutput("getDiagnostics", { schemaVersion: 1, generatedAt: "2026-08-25T00:00:00.000Z", diff --git a/packages/contracts/dist/dto.d.ts b/packages/contracts/dist/dto.d.ts new file mode 100644 index 0000000..5e1c863 --- /dev/null +++ b/packages/contracts/dist/dto.d.ts @@ -0,0 +1,259 @@ +import type { JsonObject, JsonValue } from "./json.js"; +export declare const CONTRACT_SCHEMA_VERSION: 1; +export declare const CORE_PROTOCOL_VERSION: 1; +export type ContractSchemaVersion = typeof CONTRACT_SCHEMA_VERSION; +export type CoreProtocolVersion = typeof CORE_PROTOCOL_VERSION; +export type OperationKind = "sync" | "switch" | "restore" | "prune" | "watch"; +export type OperationOutcome = "completed" | "partial" | "failed_rolled_back" | "recovery_required" | "cancelled" | "stale"; +export interface ProfileSelector { + profileId: string; + profileRevision?: string; +} +export interface GetStatusInput { + profile: ProfileSelector; +} +export interface PrepareSyncInput extends GetStatusInput { + keepCount?: number; +} +export type SwitchModelMode = "provider-default" | "keep-root-model" | "explicit"; +export interface PrepareSwitchInput extends GetStatusInput { + provider: string; + modelMode: SwitchModelMode; + model?: string; + keepCount?: number; +} +export interface ApplyPlanInput { + schemaVersion: ContractSchemaVersion; + planId: string; +} +export interface ListBackupsInput extends GetStatusInput { +} +export interface PrepareRestoreInput extends GetStatusInput { + backupId: string; + restoreConfig: boolean; + restoreDatabase: boolean; + restoreSessions: boolean; + allowSqliteHomeRelocation?: boolean; + relocationTargetProfileId?: string; +} +export interface PruneBackupsInput extends GetStatusInput { + keepCount: number; +} +export interface ListHistoryInput extends GetStatusInput { + page?: number; + pageSize?: number; + query?: string; + project?: string; + provider?: string; + archived?: "all" | "active" | "archived"; +} +export interface GetHistorySessionInput extends GetStatusInput { + sessionId: string; + messageLimit?: number; +} +export interface StartWatchInput extends GetStatusInput { + includeStateDb?: boolean; + debounceMs?: number; + once?: boolean; +} +export interface WatchReferenceInput { + watchId: string; +} +export interface GetWatchStatusInput { + watchId?: string; +} +export interface GetDiagnosticsInput extends GetStatusInput { +} +export type ProviderDistribution = Record>; +export interface StatusSnapshot { + schemaVersion: ContractSchemaVersion; + snapshotAt: string; + storageRevision: string; + profile: { + id: string; + revision: string; + }; + currentProvider: string; + currentModel?: string | null; + rolloutCounts: ProviderDistribution; + modelCounts?: ProviderDistribution; + sqliteCounts: JsonValue; + codexHomeSource: string; + sqliteHomeSource: string; + backupSummary: { + count: number; + totalBytes: number; + }; + pendingRecovery: boolean; + pendingTransactions: JsonObject[]; + operationInProgress: JsonObject | null; + rolloutScanComplete: boolean; + lockedRolloutFiles: string[]; + [extension: string]: JsonValue | undefined; +} +export interface PlanSummary { + schemaVersion: ContractSchemaVersion; + planId: string; + operation: "sync" | "switch" | "restore"; + createdAt: string; + expiresAt: string; + profile: { + id: string; + revision: string; + }; + storageRevision: string; + configRevision: string; + rolloutRevision: string; + stateDbRevision: string; + backupRevision?: string; + target: JsonObject; + impact: JsonObject; + warnings: string[]; + requiresConfirmation: boolean; +} +export interface ManagedBackup { + backupId: string; + createdAt?: string; + sizeBytes: number; + metadata: JsonObject; +} +export interface BackupList { + backups: ManagedBackup[]; +} +export interface OperationResult { + schemaVersion: ContractSchemaVersion; + operationId: string; + operation: "sync" | "switch" | "restore"; + outcome: OperationOutcome; + backup: { + backupId: string; + } | null; + warnings: string[]; + result: Result; +} +export interface PruneBackupsResult { + deletedCount: number; + remainingCount: number; + freedBytes: number; +} +export interface HistorySessionSummary { + id: string; + title: string; + provider: string; + model?: string | null; + archived: boolean; + createdAt?: string; + updatedAt: string; + messageCount: number; +} +export interface HistoryPage { + page: number; + pageSize: number; + total: number; + hasNextPage: boolean; + sessions: HistorySessionSummary[]; +} +export interface HistoryMessage { + role: string; + text: string; + timestamp?: string; + sequence: number; +} +export interface HistorySessionDetail { + session: HistorySessionSummary; + messages: HistoryMessage[]; + truncated: boolean; + returnedMessageCount: number; +} +export interface WatchSnapshot { + schemaVersion: ContractSchemaVersion; + watchId: string; + status: "running" | "stopping" | "stopped"; + startedAt: string; + stoppedAt: string | null; + stopReason: string | null; + includeStateDb: boolean; + once: boolean; +} +export interface WatchStatusList { + schemaVersion: ContractSchemaVersion; + watches: WatchSnapshot[]; +} +export interface DiagnosticsSnapshot { + schemaVersion: ContractSchemaVersion; + generatedAt: string; + runtime: JsonObject; + storage: JsonObject; + provider: JsonObject; + safety: JsonObject; +} +export interface ProgressEvent { + stage: string; + status: string; + progress?: number; + count?: number; +} +export declare const CORE_METHODS: readonly ["getStatus", "prepareSync", "applySync", "prepareSwitch", "applySwitch", "listBackups", "prepareRestore", "applyRestore", "pruneBackups", "listHistory", "getHistorySession", "startWatch", "stopWatch", "getWatchStatus", "getDiagnostics"]; +export type CoreMethodName = typeof CORE_METHODS[number]; +export interface CoreMethodMap { + getStatus: { + input: GetStatusInput; + output: StatusSnapshot; + }; + prepareSync: { + input: PrepareSyncInput; + output: PlanSummary; + }; + applySync: { + input: ApplyPlanInput; + output: OperationResult; + }; + prepareSwitch: { + input: PrepareSwitchInput; + output: PlanSummary; + }; + applySwitch: { + input: ApplyPlanInput; + output: OperationResult; + }; + listBackups: { + input: ListBackupsInput; + output: BackupList; + }; + prepareRestore: { + input: PrepareRestoreInput; + output: PlanSummary; + }; + applyRestore: { + input: ApplyPlanInput; + output: OperationResult; + }; + pruneBackups: { + input: PruneBackupsInput; + output: PruneBackupsResult; + }; + listHistory: { + input: ListHistoryInput; + output: HistoryPage; + }; + getHistorySession: { + input: GetHistorySessionInput; + output: HistorySessionDetail; + }; + startWatch: { + input: StartWatchInput; + output: WatchSnapshot; + }; + stopWatch: { + input: WatchReferenceInput; + output: WatchSnapshot; + }; + getWatchStatus: { + input: GetWatchStatusInput; + output: WatchSnapshot | WatchStatusList; + }; + getDiagnostics: { + input: GetDiagnosticsInput; + output: DiagnosticsSnapshot; + }; +} diff --git a/packages/contracts/dist/dto.js b/packages/contracts/dist/dto.js new file mode 100644 index 0000000..b00ca92 --- /dev/null +++ b/packages/contracts/dist/dto.js @@ -0,0 +1,19 @@ +export const CONTRACT_SCHEMA_VERSION = 1; +export const CORE_PROTOCOL_VERSION = 1; +export const CORE_METHODS = [ + "getStatus", + "prepareSync", + "applySync", + "prepareSwitch", + "applySwitch", + "listBackups", + "prepareRestore", + "applyRestore", + "pruneBackups", + "listHistory", + "getHistorySession", + "startWatch", + "stopWatch", + "getWatchStatus", + "getDiagnostics" +]; diff --git a/packages/contracts/dist/errors.d.ts b/packages/contracts/dist/errors.d.ts new file mode 100644 index 0000000..235c63d --- /dev/null +++ b/packages/contracts/dist/errors.d.ts @@ -0,0 +1,20 @@ +import type { JsonObject } from "./json.js"; +export declare const CORE_ERROR_CODES: readonly ["INVALID_INPUT", "PROFILE_CHANGED", "STORAGE_CHANGED", "PLAN_STALE", "PLAN_EXPIRED", "STALE_STATE", "CODEX_HOME_NOT_FOUND", "STATE_DB_NOT_FOUND", "SQLITE_UNSUPPORTED_PATH", "SQLITE_BUSY", "SQLITE_UNREADABLE", "ROLLOUT_LOCKED", "ROLLOUT_CHANGED", "PENDING_TRANSACTION", "BACKUP_FAILED", "SYNC_FAILED_ROLLED_BACK", "RECOVERY_REQUIRED", "RESTORE_VALIDATION_FAILED", "PERMISSION_DENIED", "OPERATION_BUSY", "LOCK_UNVERIFIABLE", "OPERATION_CANCELLED", "CORE_RUNTIME_CRASHED", "PROTOCOL_VERSION_MISMATCH", "INTERNAL_ERROR"]; +export type CoreErrorCode = typeof CORE_ERROR_CODES[number]; +export type CoreErrorSeverity = "info" | "warning" | "error" | "fatal"; +export interface CoreErrorDto { + code: CoreErrorCode; + message: string; + severity: CoreErrorSeverity; + retryable: boolean; + recoveryRequired: boolean; + operationId?: string; + details?: JsonObject; +} +export declare const PUBLIC_CORE_ERROR_MESSAGES: Readonly>; +export declare function createPublicCoreErrorDto(code: CoreErrorCode, options?: { + operationId?: unknown; + details?: unknown; +}): CoreErrorDto; +export declare function sanitizePublicCoreErrorDto(value: unknown): CoreErrorDto; +export declare function isCanonicalPublicCoreErrorDto(value: unknown): value is CoreErrorDto; diff --git a/packages/contracts/dist/errors.js b/packages/contracts/dist/errors.js new file mode 100644 index 0000000..dfdfba9 --- /dev/null +++ b/packages/contracts/dist/errors.js @@ -0,0 +1,224 @@ +export const CORE_ERROR_CODES = [ + "INVALID_INPUT", + "PROFILE_CHANGED", + "STORAGE_CHANGED", + "PLAN_STALE", + "PLAN_EXPIRED", + "STALE_STATE", + "CODEX_HOME_NOT_FOUND", + "STATE_DB_NOT_FOUND", + "SQLITE_UNSUPPORTED_PATH", + "SQLITE_BUSY", + "SQLITE_UNREADABLE", + "ROLLOUT_LOCKED", + "ROLLOUT_CHANGED", + "PENDING_TRANSACTION", + "BACKUP_FAILED", + "SYNC_FAILED_ROLLED_BACK", + "RECOVERY_REQUIRED", + "RESTORE_VALIDATION_FAILED", + "PERMISSION_DENIED", + "OPERATION_BUSY", + "LOCK_UNVERIFIABLE", + "OPERATION_CANCELLED", + "CORE_RUNTIME_CRASHED", + "PROTOCOL_VERSION_MISMATCH", + "INTERNAL_ERROR" +]; +export const PUBLIC_CORE_ERROR_MESSAGES = Object.freeze({ + INVALID_INPUT: "The command input is invalid.", + PROFILE_CHANGED: "The selected profile changed. Prepare the operation again.", + STORAGE_CHANGED: "The resolved storage changed. Prepare the operation again.", + PLAN_STALE: "The prepared operation is stale. Prepare it again.", + PLAN_EXPIRED: "The prepared operation expired. Prepare it again.", + STALE_STATE: "The protected state changed. Prepare the operation again.", + CODEX_HOME_NOT_FOUND: "The selected Codex Home was not found.", + STATE_DB_NOT_FOUND: "The selected state database was not found.", + SQLITE_UNSUPPORTED_PATH: "The selected SQLite path is not supported by this runtime.", + SQLITE_BUSY: "The state database is busy. Close Codex processes and retry.", + SQLITE_UNREADABLE: "The state database is unreadable or malformed.", + ROLLOUT_LOCKED: "One or more rollout files are locked.", + ROLLOUT_CHANGED: "One or more rollout files changed during the operation.", + PENDING_TRANSACTION: "An unfinished transaction must be resolved before another write.", + BACKUP_FAILED: "The required backup could not be completed.", + SYNC_FAILED_ROLLED_BACK: "The operation failed and its changes were rolled back.", + RECOVERY_REQUIRED: "The operation requires explicit recovery.", + RESTORE_VALIDATION_FAILED: "The selected backup or restore target failed validation.", + PERMISSION_DENIED: "The operation does not have permission to access a required resource.", + OPERATION_BUSY: "Another write operation is using the protected resource.", + LOCK_UNVERIFIABLE: "The lock owner or protected resource identity cannot be verified.", + OPERATION_CANCELLED: "The operation was cancelled.", + CORE_RUNTIME_CRASHED: "The Core runtime stopped unexpectedly.", + PROTOCOL_VERSION_MISMATCH: "The client and Core protocol versions are incompatible.", + INTERNAL_ERROR: "An internal error occurred." +}); +const WARNING_CODES = new Set([ + "PROFILE_CHANGED", + "STORAGE_CHANGED", + "PLAN_STALE", + "PLAN_EXPIRED", + "STALE_STATE", + "SQLITE_BUSY", + "ROLLOUT_LOCKED", + "ROLLOUT_CHANGED", + "OPERATION_BUSY" +]); +const RECOVERY_CODES = new Set(["PENDING_TRANSACTION", "RECOVERY_REQUIRED"]); +const LOCK_SCOPES = new Set(["codex-home", "state-db"]); +const SAFE_REASONS = new Set([ + "profile", + "config", + "storage", + "rollout", + "state-db", + "windows-wsl-unc" +]); +const SAFE_CAUSE_CODES = new Set([ + "ENOENT", + "EACCES", + "EPERM", + "EIO", + "EBUSY", + "SQLITE_BUSY", + "SQLITE_LOCKED", + "SQLITE_CORRUPT", + "SQLITE_NOTADB", + "ERR_SQLITE_ERROR" +]); +const SQLITE_HOME_SOURCES = new Set(["cli", "config", "env", "default"]); +const OPERATION_KINDS = new Set(["sync", "switch", "restore", "prune-backups", "watch"]); +const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; +const CORE_ERROR_CODE_SET = new Set(CORE_ERROR_CODES); +function objectRecord(value) { + return value !== null && typeof value === "object" && !Array.isArray(value) + ? value + : null; +} +function record(value) { + if (value === null || typeof value !== "object" || Array.isArray(value)) + return null; + const prototype = Object.getPrototypeOf(value); + return prototype === Object.prototype || prototype === null + ? value + : null; +} +function ownValue(source, key) { + if (!source) + return undefined; + const descriptor = Object.getOwnPropertyDescriptor(source, key); + return descriptor && "value" in descriptor ? descriptor.value : undefined; +} +function publicSeverity(code) { + if (code === "OPERATION_CANCELLED") + return "info"; + if (code === "CORE_RUNTIME_CRASHED" || code === "INTERNAL_ERROR") + return "fatal"; + return WARNING_CODES.has(code) ? "warning" : "error"; +} +function sanitizeDetails(value) { + const source = record(value); + if (!source) + return undefined; + const details = {}; + const busyScope = ownValue(source, "busyScope"); + const lockScope = ownValue(source, "lockScope"); + const causeCode = ownValue(source, "causeCode"); + const reason = ownValue(source, "reason"); + const missing = ownValue(source, "missing"); + const sqliteHomeSource = ownValue(source, "sqliteHomeSource"); + const operationKind = ownValue(source, "operationKind"); + if (LOCK_SCOPES.has(String(busyScope))) + details.busyScope = String(busyScope); + if (LOCK_SCOPES.has(String(lockScope))) + details.lockScope = String(lockScope); + if (SAFE_CAUSE_CODES.has(String(causeCode))) + details.causeCode = String(causeCode); + if (SAFE_REASONS.has(String(reason))) + details.reason = String(reason); + if (missing === "config.toml" || missing === "state_5.sqlite") + details.missing = missing; + if (SQLITE_HOME_SOURCES.has(String(sqliteHomeSource))) { + details.sqliteHomeSource = String(sqliteHomeSource); + } + for (const key of ["sqlitePrimaryCode", "sqliteExtendedCode"]) { + const candidate = ownValue(source, key); + if (Number.isInteger(candidate) && Number(candidate) >= 0 && Number(candidate) <= 0xffff) { + details[key] = Number(candidate); + } + } + if (OPERATION_KINDS.has(String(operationKind))) + details.operationKind = String(operationKind); + return Object.keys(details).length > 0 ? details : undefined; +} +export function createPublicCoreErrorDto(code, options = {}) { + if (!CORE_ERROR_CODE_SET.has(code)) + code = "INTERNAL_ERROR"; + if (code === "INTERNAL_ERROR") { + return { + code, + message: PUBLIC_CORE_ERROR_MESSAGES[code], + severity: "fatal", + retryable: false, + recoveryRequired: false + }; + } + const details = sanitizeDetails(options.details); + if ((code === "OPERATION_BUSY" && details?.busyScope === undefined) + || (code === "LOCK_UNVERIFIABLE" && details?.lockScope === undefined)) { + return createPublicCoreErrorDto("INTERNAL_ERROR"); + } + const operationId = typeof options.operationId === "string" && UUID_PATTERN.test(options.operationId) + ? options.operationId + : undefined; + return { + code, + message: PUBLIC_CORE_ERROR_MESSAGES[code], + severity: publicSeverity(code), + retryable: true, + recoveryRequired: RECOVERY_CODES.has(code), + ...(operationId ? { operationId } : {}), + ...(details ? { details } : {}) + }; +} +export function sanitizePublicCoreErrorDto(value) { + const source = objectRecord(value); + const candidate = ownValue(source, "code"); + const code = typeof candidate === "string" && CORE_ERROR_CODE_SET.has(candidate) + ? candidate + : "INTERNAL_ERROR"; + return createPublicCoreErrorDto(code, { + operationId: ownValue(source, "operationId"), + details: ownValue(source, "details") + }); +} +export function isCanonicalPublicCoreErrorDto(value) { + const source = record(value); + if (!source) + return false; + const code = ownValue(source, "code"); + if (typeof code !== "string" || !CORE_ERROR_CODE_SET.has(code)) + return false; + const expected = sanitizePublicCoreErrorDto(source); + const sourceKeys = Object.keys(source).sort(); + const expectedKeys = Object.keys(expected).sort(); + if (sourceKeys.length !== expectedKeys.length + || sourceKeys.some((key, index) => key !== expectedKeys[index])) + return false; + for (const key of expectedKeys) { + if (key === "details") + continue; + if (ownValue(source, key) !== expected[key]) + return false; + } + const actualDetails = record(ownValue(source, "details")); + const expectedDetails = expected.details; + if (expectedDetails === undefined) + return actualDetails === null; + if (!actualDetails) + return false; + const actualDetailKeys = Object.keys(actualDetails).sort(); + const expectedDetailKeys = Object.keys(expectedDetails).sort(); + return actualDetailKeys.length === expectedDetailKeys.length + && actualDetailKeys.every((key, index) => (key === expectedDetailKeys[index] + && ownValue(actualDetails, key) === expectedDetails[key])); +} diff --git a/packages/contracts/dist/index.d.ts b/packages/contracts/dist/index.d.ts new file mode 100644 index 0000000..5fcb9fd --- /dev/null +++ b/packages/contracts/dist/index.d.ts @@ -0,0 +1,4 @@ +export * from "./dto.js"; +export * from "./errors.js"; +export * from "./json.js"; +export * from "./protocol.js"; diff --git a/packages/contracts/dist/index.js b/packages/contracts/dist/index.js new file mode 100644 index 0000000..5fcb9fd --- /dev/null +++ b/packages/contracts/dist/index.js @@ -0,0 +1,4 @@ +export * from "./dto.js"; +export * from "./errors.js"; +export * from "./json.js"; +export * from "./protocol.js"; diff --git a/packages/contracts/dist/json.d.ts b/packages/contracts/dist/json.d.ts new file mode 100644 index 0000000..7b7ad79 --- /dev/null +++ b/packages/contracts/dist/json.d.ts @@ -0,0 +1,5 @@ +export type JsonPrimitive = null | boolean | number | string; +export type JsonValue = JsonPrimitive | JsonValue[] | JsonObject; +export type JsonObject = { + [key: string]: JsonValue; +}; diff --git a/packages/contracts/dist/json.js b/packages/contracts/dist/json.js new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/packages/contracts/dist/json.js @@ -0,0 +1 @@ +export {}; diff --git a/packages/contracts/dist/protocol.d.ts b/packages/contracts/dist/protocol.d.ts new file mode 100644 index 0000000..f9a74b7 --- /dev/null +++ b/packages/contracts/dist/protocol.d.ts @@ -0,0 +1,46 @@ +import { type ApplyPlanInput, type CoreMethodMap, type CoreMethodName, type CoreProtocolVersion, type ProgressEvent } from "./dto.js"; +import { type CoreErrorCode, type CoreErrorDto, type CoreErrorSeverity } from "./errors.js"; +export interface CoreRequestEnvelope { + protocolVersion: CoreProtocolVersion; + requestId: string; + operationId?: string; + method: M; + payload: CoreMethodMap[M]["input"]; +} +export type CoreResponseEnvelope = { + protocolVersion: CoreProtocolVersion; + requestId: string; + operationId?: string; + ok: true; + result: CoreMethodMap[M]["output"]; +} | { + protocolVersion: CoreProtocolVersion; + requestId: string; + operationId?: string; + ok: false; + error: CoreErrorDto; +}; +export interface CoreProgressEnvelope { + protocolVersion: CoreProtocolVersion; + requestId: string; + operationId: string; + event: "progress"; + progress: ProgressEvent; +} +export declare class ContractValidationError extends Error { + readonly code: "INVALID_INPUT" | "PROTOCOL_VERSION_MISMATCH"; + constructor(code: "INVALID_INPUT" | "PROTOCOL_VERSION_MISMATCH", message: string); +} +export declare function assertProtocolVersion(value: unknown): asserts value is CoreProtocolVersion; +export declare function assertApplyPlanInput(value: unknown): asserts value is ApplyPlanInput; +export declare function assertCoreMethodInput(method: M, value: unknown): asserts value is CoreMethodMap[M]["input"]; +export declare function assertCoreErrorDto(value: unknown): asserts value is CoreErrorDto; +export declare function assertCoreRequestEnvelope(value: unknown): asserts value is CoreRequestEnvelope; +export declare function assertCoreResponseEnvelope(value: unknown, expectedRequestId?: string): asserts value is CoreResponseEnvelope; +export declare function assertCoreMethodOutput(method: M, value: unknown): asserts value is CoreMethodMap[M]["output"]; +export declare function assertProgressEvent(value: unknown): asserts value is ProgressEvent; +export declare function createCoreRequestEnvelope(method: M, payload: CoreMethodMap[M]["input"], requestId: string, operationId?: string): CoreRequestEnvelope; +export declare function createCoreSuccessEnvelope(request: CoreRequestEnvelope, result: CoreMethodMap[M]["output"], operationId?: string): CoreResponseEnvelope; +export declare function createCoreFailureEnvelope(request: CoreRequestEnvelope, error: CoreErrorDto): CoreResponseEnvelope; +export declare function isCoreErrorCode(value: unknown): value is CoreErrorCode; +export declare function isCoreErrorSeverity(value: unknown): value is CoreErrorSeverity; diff --git a/packages/contracts/dist/protocol.js b/packages/contracts/dist/protocol.js new file mode 100644 index 0000000..a3087a4 --- /dev/null +++ b/packages/contracts/dist/protocol.js @@ -0,0 +1,504 @@ +import { CORE_METHODS, CORE_PROTOCOL_VERSION } from "./dto.js"; +import { CORE_ERROR_CODES, isCanonicalPublicCoreErrorDto } from "./errors.js"; +const METHOD_SET = new Set(CORE_METHODS); +const ERROR_CODE_SET = new Set(CORE_ERROR_CODES); +const SEVERITY_SET = new Set(["info", "warning", "error", "fatal"]); +function isRecord(value) { + return value !== null && typeof value === "object" && !Array.isArray(value); +} +function isNonEmptyString(value) { + return typeof value === "string" && value.length > 0; +} +function exactObjectKeys(value, allowed) { + const allowedSet = new Set(allowed); + return Object.keys(value).every((key) => allowedSet.has(key)); +} +function assertProfileSelector(value) { + if (!isRecord(value) + || !exactObjectKeys(value, ["profileId", "profileRevision"]) + || typeof value.profileId !== "string" + || !/^[A-Za-z0-9._-]{1,80}$/.test(value.profileId) + || (value.profileRevision !== undefined + && (!isNonEmptyString(value.profileRevision) || value.profileRevision.length > 512))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid profile selector."); + } +} +function assertProfileInput(value, allowed) { + if (!isRecord(value) + || !exactObjectKeys(value, ["profile", ...allowed])) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Core method input."); + } + assertProfileSelector(value.profile); +} +export class ContractValidationError extends Error { + code; + constructor(code, message) { + super(message); + this.name = "ContractValidationError"; + this.code = code; + } +} +export function assertProtocolVersion(value) { + if (value !== CORE_PROTOCOL_VERSION) { + throw new ContractValidationError("PROTOCOL_VERSION_MISMATCH", `Unsupported Core protocol version: ${String(value)}.`); + } +} +export function assertApplyPlanInput(value) { + if (!isRecord(value) + || Object.keys(value).sort().join(",") !== "planId,schemaVersion" + || value.schemaVersion !== 1 + || !isNonEmptyString(value.planId)) { + throw new ContractValidationError("INVALID_INPUT", "Apply accepts exactly { schemaVersion: 1, planId }."); + } +} +export function assertCoreMethodInput(method, value) { + switch (method) { + case "applySync": + case "applySwitch": + case "applyRestore": + assertApplyPlanInput(value); + return; + case "getStatus": + case "listBackups": + case "getDiagnostics": + assertProfileInput(value, []); + return; + case "prepareSync": + assertProfileInput(value, ["keepCount"]); + if (value.keepCount !== undefined + && (!Number.isSafeInteger(value.keepCount) || Number(value.keepCount) < 1)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Sync retention count."); + } + return; + case "prepareSwitch": + assertProfileInput(value, ["provider", "modelMode", "model", "keepCount"]); + if (!isNonEmptyString(value.provider) + || !["provider-default", "keep-root-model", "explicit"].includes(String(value.modelMode)) + || (value.modelMode === "explicit" && !isNonEmptyString(value.model)) + || (value.modelMode !== "explicit" && value.model !== undefined) + || (value.keepCount !== undefined + && (!Number.isSafeInteger(value.keepCount) || Number(value.keepCount) < 1))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Switch Provider input."); + } + return; + case "prepareRestore": + assertProfileInput(value, [ + "backupId", + "restoreConfig", + "restoreDatabase", + "restoreSessions", + "allowSqliteHomeRelocation", + "relocationTargetProfileId" + ]); + if (!isNonEmptyString(value.backupId) + || typeof value.restoreConfig !== "boolean" + || typeof value.restoreDatabase !== "boolean" + || typeof value.restoreSessions !== "boolean" + || (value.allowSqliteHomeRelocation !== undefined + && typeof value.allowSqliteHomeRelocation !== "boolean") + || (value.relocationTargetProfileId !== undefined + && (typeof value.relocationTargetProfileId !== "string" + || !/^[A-Za-z0-9._-]{1,80}$/.test(value.relocationTargetProfileId))) + || (value.allowSqliteHomeRelocation === true + && (value.restoreConfig !== false || value.relocationTargetProfileId === undefined)) + || (value.relocationTargetProfileId !== undefined + && value.allowSqliteHomeRelocation !== true)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Restore input."); + } + return; + case "pruneBackups": + assertProfileInput(value, ["keepCount"]); + if (!Number.isSafeInteger(value.keepCount) || Number(value.keepCount) < 0) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Prune retention count."); + } + return; + case "listHistory": + assertProfileInput(value, ["page", "pageSize", "query", "project", "provider", "archived"]); + if ((value.page !== undefined && (!Number.isSafeInteger(value.page) || Number(value.page) < 1)) + || (value.pageSize !== undefined + && (!Number.isSafeInteger(value.pageSize) + || Number(value.pageSize) < 10 + || Number(value.pageSize) > 100)) + || ["query", "project", "provider"].some((key) => (value[key] !== undefined && typeof value[key] !== "string")) + || (value.archived !== undefined + && !["all", "active", "archived"].includes(String(value.archived)))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid History list input."); + } + return; + case "getHistorySession": + assertProfileInput(value, ["sessionId", "messageLimit"]); + if (!isNonEmptyString(value.sessionId) + || (value.messageLimit !== undefined + && (!Number.isSafeInteger(value.messageLimit) + || Number(value.messageLimit) < 1 + || Number(value.messageLimit) > 200))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid History detail input."); + } + return; + case "startWatch": + assertProfileInput(value, ["includeStateDb", "debounceMs", "once"]); + if ((value.includeStateDb !== undefined && typeof value.includeStateDb !== "boolean") + || (value.once !== undefined && typeof value.once !== "boolean") + || (value.debounceMs !== undefined + && (!Number.isSafeInteger(value.debounceMs) || Number(value.debounceMs) < 0))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Watch input."); + } + return; + case "stopWatch": + if (!isRecord(value) + || !exactObjectKeys(value, ["watchId"]) + || !isNonEmptyString(value.watchId)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Watch reference."); + } + return; + case "getWatchStatus": + if (!isRecord(value) + || !exactObjectKeys(value, ["watchId"]) + || (value.watchId !== undefined && !isNonEmptyString(value.watchId))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Watch status input."); + } + return; + default: + throw new ContractValidationError("INVALID_INPUT", "Unknown Core method input."); + } +} +export function assertCoreErrorDto(value) { + if (!isCanonicalPublicCoreErrorDto(value)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid public CoreErrorDto."); + } +} +export function assertCoreRequestEnvelope(value) { + if (!isRecord(value)) { + throw new ContractValidationError("INVALID_INPUT", "Core request envelope must be an object."); + } + const allowedKeys = new Set(["protocolVersion", "requestId", "operationId", "method", "payload"]); + if (Object.keys(value).some((key) => !allowedKeys.has(key))) { + throw new ContractValidationError("INVALID_INPUT", "Core request envelope has unknown fields."); + } + assertProtocolVersion(value.protocolVersion); + if (!isNonEmptyString(value.requestId) + || !isNonEmptyString(value.method) + || !METHOD_SET.has(value.method) + || !isRecord(value.payload)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Core request envelope."); + } + if (value.operationId !== undefined && !isNonEmptyString(value.operationId)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Core request operationId."); + } + assertCoreMethodInput(value.method, value.payload); +} +export function assertCoreResponseEnvelope(value, expectedRequestId) { + if (!isRecord(value)) { + throw new ContractValidationError("INVALID_INPUT", "Core response envelope must be an object."); + } + const allowedKeys = value.ok === true + ? new Set(["protocolVersion", "requestId", "operationId", "ok", "result"]) + : new Set(["protocolVersion", "requestId", "operationId", "ok", "error"]); + if (Object.keys(value).some((key) => !allowedKeys.has(key))) { + throw new ContractValidationError("INVALID_INPUT", "Core response envelope has unknown fields."); + } + assertProtocolVersion(value.protocolVersion); + if (!isNonEmptyString(value.requestId) + || (expectedRequestId !== undefined && value.requestId !== expectedRequestId) + || typeof value.ok !== "boolean") { + throw new ContractValidationError("INVALID_INPUT", "Invalid Core response envelope."); + } + if (value.operationId !== undefined && !isNonEmptyString(value.operationId)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid Core response operationId."); + } + if (value.ok) { + if (!("result" in value) || "error" in value) { + throw new ContractValidationError("INVALID_INPUT", "Invalid successful Core response."); + } + } + else { + if (!("error" in value) || "result" in value) { + throw new ContractValidationError("INVALID_INPUT", "Invalid failed Core response."); + } + assertCoreErrorDto(value.error); + } +} +function requireSchemaObject(value, label) { + if (!isRecord(value) || value.schemaVersion !== 1) { + throw new ContractValidationError("INVALID_INPUT", `Invalid ${label}.`); + } + return value; +} +function requireStringArray(value, label) { + if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string")) { + throw new ContractValidationError("INVALID_INPUT", `Invalid ${label}.`); + } +} +function isNonNegativeInteger(value) { + return Number.isSafeInteger(value) && Number(value) >= 0; +} +function isNullableString(value) { + return value === null || typeof value === "string"; +} +function isJsonValue(value, depth = 0) { + if (depth > 16) + return false; + if (value === null || typeof value === "string" || typeof value === "boolean") + return true; + if (typeof value === "number") + return Number.isFinite(value); + if (Array.isArray(value)) + return value.every((entry) => isJsonValue(entry, depth + 1)); + if (!isRecord(value)) + return false; + return Object.values(value).every((entry) => isJsonValue(entry, depth + 1)); +} +function isProviderDistribution(value) { + if (!isRecord(value)) + return false; + return Object.values(value).every((counts) => (isRecord(counts) && Object.values(counts).every(isNonNegativeInteger))); +} +function isHistorySummary(value) { + if (!isRecord(value)) + return false; + return isNonEmptyString(value.id) + && typeof value.title === "string" + && !("cwd" in value) + && isNonEmptyString(value.provider) + && typeof value.archived === "boolean" + && isNonEmptyString(value.updatedAt) + && isNonNegativeInteger(value.messageCount) + && (value.model === undefined || isNullableString(value.model)) + && (value.createdAt === undefined || isNonEmptyString(value.createdAt)); +} +function assertWatchSnapshot(value) { + const snapshot = requireSchemaObject(value, "WatchSnapshot"); + if (!isNonEmptyString(snapshot.watchId) + || !["running", "stopping", "stopped"].includes(String(snapshot.status)) + || !isNonEmptyString(snapshot.startedAt) + || !isNullableString(snapshot.stoppedAt) + || !isNullableString(snapshot.stopReason) + || typeof snapshot.includeStateDb !== "boolean" + || typeof snapshot.once !== "boolean") { + throw new ContractValidationError("INVALID_INPUT", "Invalid WatchSnapshot."); + } +} +export function assertCoreMethodOutput(method, value) { + switch (method) { + case "getStatus": { + const status = requireSchemaObject(value, "StatusSnapshot"); + const profile = isRecord(status.profile) ? status.profile : null; + if (!isNonEmptyString(status.snapshotAt) + || !isNonEmptyString(status.storageRevision) + || !profile + || !isNonEmptyString(profile.id) + || !isNonEmptyString(profile.revision) + || !isNonEmptyString(status.currentProvider) + || !isProviderDistribution(status.rolloutCounts) + || (status.modelCounts !== undefined && !isProviderDistribution(status.modelCounts)) + || !("sqliteCounts" in status) + || !isJsonValue(status.sqliteCounts) + || "codexHome" in status + || "sqliteHome" in status + || !isNonEmptyString(status.codexHomeSource) + || !isNonEmptyString(status.sqliteHomeSource) + || !isRecord(status.backupSummary) + || !isNonNegativeInteger(status.backupSummary.count) + || !isNonNegativeInteger(status.backupSummary.totalBytes) + || typeof status.pendingRecovery !== "boolean" + || !Array.isArray(status.pendingTransactions) + || status.pendingTransactions.some((entry) => !isRecord(entry) || !isJsonValue(entry)) + || !(status.operationInProgress === null + || (isRecord(status.operationInProgress) && isJsonValue(status.operationInProgress))) + || typeof status.rolloutScanComplete !== "boolean" + || !Array.isArray(status.lockedRolloutFiles) + || status.lockedRolloutFiles.some((entry) => typeof entry !== "string") + || (status.currentModel !== undefined && !isNullableString(status.currentModel))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid StatusSnapshot."); + } + return; + } + case "prepareSync": + case "prepareSwitch": + case "prepareRestore": { + const plan = requireSchemaObject(value, "PlanSummary"); + if (!isNonEmptyString(plan.planId) + || !["sync", "switch", "restore"].includes(String(plan.operation)) + || !isNonEmptyString(plan.createdAt) + || !isNonEmptyString(plan.expiresAt) + || !isRecord(plan.profile) + || !isNonEmptyString(plan.profile.id) + || !isNonEmptyString(plan.profile.revision) + || !isNonEmptyString(plan.storageRevision) + || !isNonEmptyString(plan.configRevision) + || !isNonEmptyString(plan.rolloutRevision) + || !isNonEmptyString(plan.stateDbRevision) + || (plan.backupRevision !== undefined && !isNonEmptyString(plan.backupRevision)) + || !isRecord(plan.target) + || !isJsonValue(plan.target) + || !isRecord(plan.impact) + || !isJsonValue(plan.impact) + || !Array.isArray(plan.warnings) + || plan.warnings.some((entry) => typeof entry !== "string") + || typeof plan.requiresConfirmation !== "boolean") { + throw new ContractValidationError("INVALID_INPUT", "Invalid PlanSummary."); + } + return; + } + case "applySync": + case "applySwitch": + case "applyRestore": { + const result = requireSchemaObject(value, "OperationResult"); + if (!isNonEmptyString(result.operationId) + || !["sync", "switch", "restore"].includes(String(result.operation)) + || !["completed", "partial", "failed_rolled_back", "recovery_required", "cancelled", "stale"].includes(String(result.outcome)) + || !(result.backup === null + || (isRecord(result.backup) && isNonEmptyString(result.backup.backupId)))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid OperationResult."); + } + requireStringArray(result.warnings, "OperationResult warnings"); + if (!("result" in result) || !isJsonValue(result.result)) { + throw new ContractValidationError("INVALID_INPUT", "OperationResult result is required."); + } + return; + } + case "listBackups": { + if (!isRecord(value) || !Array.isArray(value.backups) + || value.backups.some((entry) => { + const backup = isRecord(entry) ? entry : null; + return !backup + || !isNonEmptyString(backup.backupId) + || !isNonNegativeInteger(backup.sizeBytes) + || !isRecord(backup.metadata) + || !isJsonValue(backup.metadata) + || (backup.createdAt !== undefined && !isNonEmptyString(backup.createdAt)); + })) { + throw new ContractValidationError("INVALID_INPUT", "Invalid BackupList."); + } + return; + } + case "pruneBackups": { + if (!isRecord(value) + || !isNonNegativeInteger(value.deletedCount) + || !isNonNegativeInteger(value.remainingCount) + || !isNonNegativeInteger(value.freedBytes)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid PruneBackupsResult."); + } + return; + } + case "listHistory": { + if (!isRecord(value) + || !Number.isSafeInteger(value.page) + || Number(value.page) < 1 + || !Number.isSafeInteger(value.pageSize) + || Number(value.pageSize) < 1 + || !isNonNegativeInteger(value.total) + || typeof value.hasNextPage !== "boolean" + || !Array.isArray(value.sessions) + || value.sessions.some((entry) => !isHistorySummary(entry))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid HistoryPage."); + } + return; + } + case "getHistorySession": { + if (!isRecord(value) + || !isHistorySummary(value.session) + || !Array.isArray(value.messages) + || value.messages.some((entry) => { + const message = isRecord(entry) ? entry : null; + return !message + || !isNonEmptyString(message.role) + || typeof message.text !== "string" + || !isNonNegativeInteger(message.sequence) + || (message.timestamp !== undefined && !isNonEmptyString(message.timestamp)); + }) + || typeof value.truncated !== "boolean" + || !isNonNegativeInteger(value.returnedMessageCount) + || Number(value.returnedMessageCount) !== value.messages.length) { + throw new ContractValidationError("INVALID_INPUT", "Invalid HistorySessionDetail."); + } + return; + } + case "startWatch": + case "stopWatch": + assertWatchSnapshot(value); + return; + case "getWatchStatus": { + if (isRecord(value) && Array.isArray(value.watches)) { + requireSchemaObject(value, "WatchStatusList"); + value.watches.forEach(assertWatchSnapshot); + return; + } + assertWatchSnapshot(value); + return; + } + case "getDiagnostics": { + const diagnostics = requireSchemaObject(value, "DiagnosticsSnapshot"); + if (!isNonEmptyString(diagnostics.generatedAt) + || !isRecord(diagnostics.runtime) + || !isJsonValue(diagnostics.runtime) + || !isRecord(diagnostics.storage) + || !isJsonValue(diagnostics.storage) + || !isRecord(diagnostics.provider) + || !isJsonValue(diagnostics.provider) + || !isRecord(diagnostics.safety) + || !isJsonValue(diagnostics.safety)) { + throw new ContractValidationError("INVALID_INPUT", "Invalid DiagnosticsSnapshot."); + } + return; + } + default: + throw new ContractValidationError("INVALID_INPUT", "Unknown Core method output."); + } +} +export function assertProgressEvent(value) { + if (!isRecord(value)) { + throw new ContractValidationError("INVALID_INPUT", "Progress event must be an object."); + } + const allowed = new Set(["stage", "status", "progress", "count"]); + if (Object.keys(value).some((key) => !allowed.has(key)) + || !isNonEmptyString(value.stage) + || !isNonEmptyString(value.status) + || (value.progress !== undefined + && (typeof value.progress !== "number" || !Number.isFinite(value.progress))) + || (value.count !== undefined + && (typeof value.count !== "number" || !Number.isFinite(value.count)))) { + throw new ContractValidationError("INVALID_INPUT", "Invalid ProgressEvent."); + } +} +export function createCoreRequestEnvelope(method, payload, requestId, operationId) { + const envelope = { + protocolVersion: CORE_PROTOCOL_VERSION, + requestId, + ...(operationId ? { operationId } : {}), + method, + payload + }; + assertCoreRequestEnvelope(envelope); + return envelope; +} +export function createCoreSuccessEnvelope(request, result, operationId) { + assertCoreMethodOutput(request.method, result); + return { + protocolVersion: CORE_PROTOCOL_VERSION, + requestId: request.requestId, + ...(operationId ?? request.operationId + ? { operationId: operationId ?? request.operationId } + : {}), + ok: true, + result + }; +} +export function createCoreFailureEnvelope(request, error) { + assertCoreErrorDto(error); + return { + protocolVersion: CORE_PROTOCOL_VERSION, + requestId: request.requestId, + ...(error.operationId ?? request.operationId + ? { operationId: error.operationId ?? request.operationId } + : {}), + ok: false, + error + }; +} +export function isCoreErrorCode(value) { + return typeof value === "string" && ERROR_CODE_SET.has(value); +} +export function isCoreErrorSeverity(value) { + return typeof value === "string" && SEVERITY_SET.has(value); +} diff --git a/packages/contracts/src/dto.ts b/packages/contracts/src/dto.ts index 284b58e..652ce14 100644 --- a/packages/contracts/src/dto.ts +++ b/packages/contracts/src/dto.ts @@ -101,8 +101,7 @@ export interface StatusSnapshot { rolloutCounts: ProviderDistribution; modelCounts?: ProviderDistribution; sqliteCounts: JsonValue; - codexHome: string; - sqliteHome: string; + codexHomeSource: string; sqliteHomeSource: string; backupSummary: { count: number; @@ -167,7 +166,6 @@ export interface PruneBackupsResult { export interface HistorySessionSummary { id: string; title: string; - cwd: string; provider: string; model?: string | null; archived: boolean; diff --git a/packages/contracts/src/protocol.ts b/packages/contracts/src/protocol.ts index 760d1d8..a64de0e 100644 --- a/packages/contracts/src/protocol.ts +++ b/packages/contracts/src/protocol.ts @@ -341,7 +341,7 @@ function isHistorySummary(value: unknown): boolean { if (!isRecord(value)) return false; return isNonEmptyString(value.id) && typeof value.title === "string" - && typeof value.cwd === "string" + && !("cwd" in value) && isNonEmptyString(value.provider) && typeof value.archived === "boolean" && isNonEmptyString(value.updatedAt) @@ -381,8 +381,9 @@ export function assertCoreMethodOutput( || (status.modelCounts !== undefined && !isProviderDistribution(status.modelCounts)) || !("sqliteCounts" in status) || !isJsonValue(status.sqliteCounts) - || !isNonEmptyString(status.codexHome) - || !isNonEmptyString(status.sqliteHome) + || "codexHome" in status + || "sqliteHome" in status + || !isNonEmptyString(status.codexHomeSource) || !isNonEmptyString(status.sqliteHomeSource) || !isRecord(status.backupSummary) || !isNonNegativeInteger(status.backupSummary.count) diff --git a/packages/core-client/checks/core-client.contract.mjs b/packages/core-client/checks/core-client.contract.mjs index f9ec4b4..b536b3c 100644 --- a/packages/core-client/checks/core-client.contract.mjs +++ b/packages/core-client/checks/core-client.contract.mjs @@ -5,6 +5,7 @@ import { CoreClientError, CoreTransportError, HttpCoreClient, + HttpCoreTransport, MockCoreClient, legacyErrorToDto } from "../dist/index.js"; @@ -21,8 +22,7 @@ test("MockCoreClient uses the same versioned request envelope", async () => { currentProvider: "openai", rolloutCounts: {}, sqliteCounts: null, - codexHome: "redacted", - sqliteHome: "redacted", + codexHomeSource: "profile", sqliteHomeSource: "default", backupSummary: { count: 0, totalBytes: 0 }, pendingRecovery: false, @@ -69,6 +69,30 @@ test("HttpCoreClient validates response correlation and sends one envelope", asy }); }); +test("HttpCoreClient rejects an oversized envelope before calling fetch", async () => { + let fetchCalls = 0; + const transport = new HttpCoreTransport({ + baseUrl: "http://127.0.0.1:31337/", + fetch: async () => { + fetchCalls += 1; + throw new Error("fetch must not be called"); + } + }); + + await assert.rejects( + transport.request({ + protocolVersion: 1, + requestId: "oversized-request", + method: "getWatchStatus", + payload: { oversized: "x".repeat(65 * 1024) } + }), + (error) => error instanceof CoreTransportError + && error.status === null + && error.message === "Core request exceeds the 64 KiB transport limit." + ); + assert.equal(fetchCalls, 0); +}); + test("canonical failed envelopes become CoreClientError", async () => { const client = new MockCoreClient({ prepareSync: async () => { diff --git a/packages/core/checks/core-surface.contract.mjs b/packages/core/checks/core-surface.contract.mjs index cbe7b07..339f4a4 100644 --- a/packages/core/checks/core-surface.contract.mjs +++ b/packages/core/checks/core-surface.contract.mjs @@ -78,6 +78,17 @@ test("trusted profile selection never falls back to the process default Codex Ho } await fs.writeFile(path.join(defaultHome, "config.toml"), 'model_provider = "wrong-default"\n'); await fs.writeFile(path.join(selectedHome, "config.toml"), 'model_provider = "openai"\n'); + await fs.writeFile(path.join(selectedHome, "sessions", "rollout-synthetic.jsonl"), `${JSON.stringify({ + type: "session_meta", + timestamp: "2026-08-25T00:00:00.000Z", + payload: { + id: "synthetic-session", + title: "Synthetic session", + cwd: path.join(selectedHome, "private-project"), + model_provider: "relay", + encrypted_content: "synthetic-ciphertext" + } + })}\n`); process.env.CODEX_HOME = defaultHome; const selectors = []; const facade = core.createCoreFacade({ @@ -96,13 +107,28 @@ test("trusted profile selection never falls back to the process default Codex Ho const history = await facade.listHistory(input); const diagnostics = await facade.getDiagnostics(input); const pruned = await facade.pruneBackups({ ...input, keepCount: 1 }); + const plan = await facade.prepareSync({ ...input, keepCount: 1 }); assert.equal(status.currentProvider, "openai"); assert.deepEqual(status.profile, { id: "selected", revision: "selected-r1" }); + assert.equal(status.codexHomeSource, "profile"); + assert.equal("codexHome" in status, false); + assert.equal("sqliteHome" in status, false); assert.deepEqual(backups, { backups: [] }); - assert.deepEqual(history.sessions, []); - assert.equal(diagnostics.storage.codexHome, selectedHome); + assert.equal(history.sessions.length, 1); + assert.equal(history.sessions[0].id, "synthetic-session"); + assert.equal("cwd" in history.sessions[0], false); + assert.ok(plan.warnings.includes( + "Some encrypted histories may require their original Provider or account for continuation." + )); + assert.equal(plan.warnings.every((warning) => [ + "Some encrypted histories may require their original Provider or account for continuation.", + "Project visibility diagnostics are unavailable; backup-first protection remains enabled." + ].includes(warning)), true); + assert.doesNotMatch(JSON.stringify(plan), /private-project|synthetic-ciphertext/); + assert.equal(diagnostics.storage.sqliteHomeSource, "default"); + assert.equal("codexHome" in diagnostics.storage, false); assert.equal(pruned.deletedCount, 0); - assert.equal(selectors.length, 5); + assert.equal(selectors.length, 6); assert.equal(selectors.every((selector) => selector.profileId === "selected"), true); } finally { if (originalCodexHome === undefined) delete process.env.CODEX_HOME; diff --git a/packages/core/src/index.js b/packages/core/src/index.js index bf904fb..136eb9e 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -120,13 +120,210 @@ function withPublicProfile(value, profile) { return { ...value, profile: { id: profile.id, revision: profile.revision } }; } +/** @param {unknown} value */ +function publicWarnings(value) { + if (!Array.isArray(value)) return []; + /** @type {string[]} */ + const result = []; + for (const warning of value.filter((entry) => typeof entry === "string")) { + let projected; + if (warning.startsWith("Backup inventory refresh failed:")) { + projected = "Backup inventory refresh failed."; + } else if (warning.startsWith("Automatic backup cleanup failed:")) { + projected = "Automatic backup cleanup failed."; + } else if (warning.startsWith("Encrypted content warning:")) { + projected = "Some encrypted histories may require their original Provider or account for continuation."; + } else if (/^\d+ rollout file\(s\) are currently locked/.test(warning)) { + projected = "One or more rollout files are locked and may be skipped."; + } else if (warning.startsWith("Provider \"") && warning.includes("has no model field")) { + projected = "The selected Provider has no default model; the root model will remain unchanged."; + } else if (warning === "Project visibility diagnostics are unavailable; the write operation will still validate and protect the global state with backup-first recovery.") { + projected = "Project visibility diagnostics are unavailable; backup-first protection remains enabled."; + } else if (warning === "SQLite Home relocation is explicit; config.toml will not be restored.") { + projected = "SQLite Home relocation is confirmed; config.toml will not be restored."; + } else { + projected = "The operation produced an additional warning."; + } + if (!result.includes(projected)) result.push(projected); + } + return result; +} + +/** @param {unknown} value */ +function publicOperationState(value) { + if (!isRecord(value)) return null; + /** @type {Record} */ + const result = {}; + for (const key of [ + "operationId", + "operation", + "actor", + "runtime", + "startedAt", + "busyScope", + "lockState", + "errorCode" + ]) { + const candidate = value[key]; + if (typeof candidate === "string") result[key] = candidate; + } + return result; +} + +/** @param {unknown} value */ +function publicStatus(value) { + if (!isRecord(value)) return value; + const rolloutCounts = isRecord(value.rolloutCounts) ? value.rolloutCounts : {}; + const sqliteCounts = value.sqliteCounts ?? {}; + const provider = typeof value.currentProvider === "string" && value.currentProvider + ? value.currentProvider + : "openai"; + /** @param {unknown} distribution */ + const matchesProvider = (distribution) => isRecord(distribution) + && ["sessions", "archived_sessions"].every((scope) => { + const counts = isRecord(distribution[scope]) ? distribution[scope] : {}; + return Object.entries(counts).every(([candidate, count]) => Number(count) === 0 || candidate === provider); + }); + const operation = publicOperationState(value.operationInProgress); + const locked = Array.isArray(value.lockedRolloutFiles) + ? value.lockedRolloutFiles.filter((entry) => typeof entry === "string").map((entry) => path.basename(entry)) + : []; + const pending = Array.isArray(value.pendingTransactions) + ? value.pendingTransactions.filter(isRecord).map((transaction) => ({ + operationId: typeof transaction.operationId === "string" ? transaction.operationId : null, + state: typeof transaction.state === "string" ? transaction.state : "unknown" + })) + : []; + const backupSummary = isRecord(value.backupSummary) ? value.backupSummary : {}; + const blocked = isRecord(value.statusReadBlocked) && typeof value.statusReadBlocked.reason === "string" + ? { reason: value.statusReadBlocked.reason } + : undefined; + const sqliteReadable = isRecord(sqliteCounts) && sqliteCounts.unreadable !== true; + return { + schemaVersion: 1, + snapshotAt: value.snapshotAt, + storageRevision: value.storageRevision, + profile: value.profile, + currentProvider: provider, + ...(typeof value.currentModel === "string" || value.currentModel === null + ? { currentModel: value.currentModel } + : {}), + rolloutCounts, + ...(isRecord(value.modelCounts) ? { modelCounts: value.modelCounts } : {}), + sqliteCounts, + codexHomeSource: "profile", + sqliteHomeSource: value.sqliteHomeSource, + backupSummary: { + count: Number.isSafeInteger(backupSummary.count) ? backupSummary.count : 0, + totalBytes: Number.isSafeInteger(backupSummary.totalBytes) ? backupSummary.totalBytes : 0 + }, + pendingRecovery: pending.length > 0 || value.pendingRecovery === true, + pendingTransactions: pending, + operationInProgress: operation, + rolloutScanComplete: value.rolloutScanComplete === true && locked.length === 0, + lockedRolloutFiles: locked, + currentProviderImplicit: value.currentProviderImplicit === true, + configuredProviders: Array.isArray(value.configuredProviders) + ? value.configuredProviders.filter((entry) => typeof entry === "string") + : [], + alignment: { + aligned: Boolean(!operation + && !blocked + && sqliteReadable + && value.rolloutScanComplete === true + && locked.length === 0 + && matchesProvider(rolloutCounts) + && matchesProvider(sqliteCounts)), + sqliteReadable, + targetProvider: provider + }, + ...(blocked ? { statusReadBlocked: blocked } : {}) + }; +} + +/** @param {unknown} value */ +function publicPlan(value) { + if (!isRecord(value)) return value; + const target = isRecord(value.target) ? value.target : {}; + const impact = isRecord(value.impact) ? value.impact : {}; + /** @type {Record} */ + const publicTarget = {}; + for (const key of ["provider", "model", "modelMode", "backupId"]) { + const candidate = target[key]; + if (typeof candidate === "string" || candidate === null) publicTarget[key] = candidate; + } + for (const key of ["restoreConfig", "restoreDatabase", "restoreSessions", "allowSqliteHomeRelocation"]) { + if (typeof target[key] === "boolean") publicTarget[key] = target[key]; + } + /** @type {Record} */ + const publicImpact = {}; + for (const [key, candidate] of Object.entries(impact)) { + if (typeof candidate === "boolean" || (Number.isSafeInteger(candidate) && Number(candidate) >= 0)) { + publicImpact[key] = candidate; + } + } + if (Array.isArray(impact.lockedRolloutFiles)) { + publicImpact.lockedRolloutFiles = impact.lockedRolloutFiles + .filter((entry) => typeof entry === "string") + .map((entry) => path.basename(entry)); + } + return { + schemaVersion: 1, + planId: value.planId, + operation: value.operation, + createdAt: value.createdAt, + expiresAt: value.expiresAt, + profile: value.profile, + storageRevision: value.storageRevision, + configRevision: value.configRevision, + rolloutRevision: value.rolloutRevision, + stateDbRevision: value.stateDbRevision, + ...(typeof value.backupRevision === "string" ? { backupRevision: value.backupRevision } : {}), + target: publicTarget, + impact: publicImpact, + warnings: publicWarnings(value.warnings), + requiresConfirmation: value.requiresConfirmation === true + }; +} + /** @param {unknown} value */ function publicOperationResult(value) { if (!isRecord(value)) return value; const backup = isRecord(value.backup) && typeof value.backup.backupId === "string" ? { backupId: value.backup.backupId } : null; - return { ...value, backup }; + const source = isRecord(value.result) ? value.result : {}; + /** @type {Record} */ + const result = {}; + for (const key of [ + "targetProvider", + "targetModel", + "modelSource" + ]) { + const candidate = source[key]; + if (typeof candidate === "string" || candidate === null) result[key] = candidate; + } + for (const [key, candidate] of Object.entries(source)) { + if ((key.endsWith("Count") || key.endsWith("Changed") || key.endsWith("Updated") || key.endsWith("Restored")) + && Number.isSafeInteger(candidate) + && Number(candidate) >= 0) { + result[key] = candidate; + } + } + if (Array.isArray(source.skippedLockedRolloutFiles)) { + result.skippedLockedRolloutFiles = source.skippedLockedRolloutFiles + .filter((entry) => typeof entry === "string") + .map((entry) => path.basename(entry)); + } + return { + schemaVersion: 1, + operationId: value.operationId, + operation: value.operation, + outcome: value.outcome, + backup, + warnings: publicWarnings(value.warnings), + result + }; } /** @param {unknown} value */ @@ -152,7 +349,6 @@ function publicHistorySummary(value) { return { id: value.id, title: value.title, - cwd: value.cwd, provider: value.provider, ...(value.model === undefined ? {} : { model: value.model }), archived: value.archived, @@ -198,7 +394,10 @@ export function createCoreFacade({ resolveProfile }) { const facade = { async getStatus(input) { const trusted = await trustedInput(input); - return withPublicProfile(await getStatusInternal(rootProfileInput(trusted.profile)), trusted.profile); + return publicStatus(withPublicProfile( + await getStatusInternal(rootProfileInput(trusted.profile)), + trusted.profile + )); }, async prepareSync(input) { @@ -208,7 +407,7 @@ export function createCoreFacade({ resolveProfile }) { ...(trusted.input.keepCount === undefined ? {} : { keepCount: trusted.input.keepCount }), profileResolver: currentProfileResolver() }); - return withPublicProfile(plan, trusted.profile); + return publicPlan(withPublicProfile(plan, trusted.profile)); }, async applySync(input) { @@ -235,7 +434,7 @@ export function createCoreFacade({ resolveProfile }) { ...(trusted.input.keepCount === undefined ? {} : { keepCount: trusted.input.keepCount }), profileResolver: currentProfileResolver() }); - return withPublicProfile(plan, trusted.profile); + return publicPlan(withPublicProfile(plan, trusted.profile)); }, async applySwitch(input) { @@ -309,7 +508,7 @@ export function createCoreFacade({ resolveProfile }) { : { allowSqliteHomeRelocation: trusted.input.allowSqliteHomeRelocation }), profileResolver }); - return withPublicProfile(plan, trusted.profile); + return publicPlan(withPublicProfile(plan, trusted.profile)); }, async applyRestore(input) { @@ -375,7 +574,49 @@ export function createCoreFacade({ resolveProfile }) { async getDiagnostics(input) { const trusted = await trustedInput(input); - return getDiagnosticsInternal(rootProfileInput(trusted.profile)); + const value = await getDiagnosticsInternal(rootProfileInput(trusted.profile)); + if (!isRecord(value)) return value; + const runtime = isRecord(value.runtime) ? value.runtime : {}; + const storage = isRecord(value.storage) ? value.storage : {}; + const provider = isRecord(value.provider) ? value.provider : {}; + const safety = isRecord(value.safety) ? value.safety : {}; + return { + schemaVersion: 1, + generatedAt: value.generatedAt, + runtime: { + ...(typeof runtime.node === "string" ? { node: runtime.node } : {}), + ...(typeof runtime.platform === "string" ? { platform: runtime.platform } : {}), + ...(typeof runtime.arch === "string" ? { arch: runtime.arch } : {}) + }, + storage: { + ...(typeof storage.sqliteHomeSource === "string" ? { sqliteHomeSource: storage.sqliteHomeSource } : {}), + stateDbFound: storage.stateDbLocation !== null, + sqliteSupported: !isRecord(storage.sqliteAccess) || storage.sqliteAccess.supported !== false + }, + provider: { + ...(typeof provider.current === "string" ? { current: provider.current } : {}), + implicit: provider.implicit === true, + configured: Array.isArray(provider.configured) + ? provider.configured.filter((entry) => typeof entry === "string") + : [], + ...(isRecord(provider.rolloutCounts) ? { rolloutCounts: provider.rolloutCounts } : {}), + ...(isRecord(provider.sqliteCounts) ? { sqliteCounts: provider.sqliteCounts } : {}) + }, + safety: { + ...(typeof safety.storageRevision === "string" ? { storageRevision: safety.storageRevision } : {}), + pendingRecovery: safety.pendingRecovery === true, + pendingTransactions: Array.isArray(safety.pendingTransactions) + ? safety.pendingTransactions.filter(isRecord).map((transaction) => ({ + operationId: typeof transaction.operationId === "string" ? transaction.operationId : null, + state: typeof transaction.state === "string" ? transaction.state : "unknown" + })) + : [], + operationInProgress: publicOperationState(safety.operationInProgress), + rolloutScanComplete: safety.rolloutScanComplete === true, + lockedRolloutCount: Number.isSafeInteger(safety.lockedRolloutCount) ? safety.lockedRolloutCount : 0, + projectThreadVisibilityAvailable: safety.projectThreadVisibilityAvailable === true + } + }; } }; diff --git a/packages/design-system/checks/surface.contract.mjs b/packages/design-system/checks/surface.contract.mjs index 8e8d76d..19c67b3 100644 --- a/packages/design-system/checks/surface.contract.mjs +++ b/packages/design-system/checks/surface.contract.mjs @@ -1,4 +1,5 @@ import assert from "node:assert/strict"; +import fs from "node:fs/promises"; import test from "node:test"; import { @@ -7,8 +8,13 @@ import { THEME_MODES } from "../dist/index.js"; -test("design-system owns the frozen locale and theme vocabulary", () => { +test("design-system owns the frozen locale and theme vocabulary", async () => { assert.deepEqual(THEME_MODES, ["system", "light", "dark"]); assert.deepEqual(SUPPORTED_LOCALES, ["zh-CN", "en"]); - assert.equal(DESIGN_SYSTEM_MIGRATION_STATE, "tokens-only-c4"); + assert.equal(DESIGN_SYSTEM_MIGRATION_STATE, "tokens-and-primitives-c5"); + const tokens = await fs.readFile(new URL("../src/tokens.css", import.meta.url), "utf8"); + assert.match(tokens, /data-theme="dark"/); + assert.match(tokens, /prefers-color-scheme:\s*dark/); + assert.match(tokens, /prefers-reduced-motion:\s*reduce/); + assert.match(tokens, /--focus:/); }); diff --git a/packages/design-system/package.json b/packages/design-system/package.json index 6855f40..89fd037 100644 --- a/packages/design-system/package.json +++ b/packages/design-system/package.json @@ -7,7 +7,8 @@ ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js" - } + }, + "./tokens.css": "./src/tokens.css" }, "scripts": { "build": "tsc -b", diff --git a/packages/design-system/src/index.ts b/packages/design-system/src/index.ts index 1aaf545..50a0f99 100644 --- a/packages/design-system/src/index.ts +++ b/packages/design-system/src/index.ts @@ -4,8 +4,4 @@ export type ThemeMode = typeof THEME_MODES[number]; export const SUPPORTED_LOCALES = ["zh-CN", "en"] as const; export type SupportedLocale = typeof SUPPORTED_LOCALES[number]; -export const DESIGN_SYSTEM_MIGRATION_STATE = "tokens-only-c4" as const; - -// React components, Tailwind output and the checked-in Radix/shadcn-style -// component set are C5 deliverables. C4 only establishes the platform-neutral -// token and locale ownership boundary. +export const DESIGN_SYSTEM_MIGRATION_STATE = "tokens-and-primitives-c5" as const; diff --git a/packages/design-system/src/tokens.css b/packages/design-system/src/tokens.css new file mode 100644 index 0000000..89fc0d4 --- /dev/null +++ b/packages/design-system/src/tokens.css @@ -0,0 +1,75 @@ +:root, +:root[data-theme="light"] { + color-scheme: light; + --surface: #f6f7fb; + --surface-raised: #ffffff; + --surface-hover: #eef1f7; + --input: #ffffff; + --border: #dce1eb; + --text: #172033; + --muted: #657086; + --accent: #4867e8; + --accent-strong: #3452ce; + --accent-soft: #e9edff; + --focus: #315ee8; + --success: #16734a; + --success-soft: #e6f6ee; + --warning: #9a5b00; + --warning-soft: #fff3d8; + --danger: #b42335; + --danger-soft: #fdebed; + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +:root[data-theme="dark"] { + color-scheme: dark; + --surface: #11141b; + --surface-raised: #181d27; + --surface-hover: #242b38; + --input: #111722; + --border: #30394a; + --text: #eef2f8; + --muted: #a6b0c1; + --accent: #7189ff; + --accent-strong: #8fa1ff; + --accent-soft: #222d58; + --focus: #91a3ff; + --success: #67d8a4; + --success-soft: #17392d; + --warning: #f2bb61; + --warning-soft: #3d2e17; + --danger: #ff8c99; + --danger-soft: #461e26; +} + +@media (prefers-color-scheme: dark) { + :root[data-theme="system"] { + color-scheme: dark; + --surface: #11141b; + --surface-raised: #181d27; + --surface-hover: #242b38; + --input: #111722; + --border: #30394a; + --text: #eef2f8; + --muted: #a6b0c1; + --accent: #7189ff; + --accent-strong: #8fa1ff; + --accent-soft: #222d58; + --focus: #91a3ff; + --success: #67d8a4; + --success-soft: #17392d; + --warning: #f2bb61; + --warning-soft: #3d2e17; + --danger: #ff8c99; + --danger-soft: #461e26; + } +} + +@media (prefers-reduced-motion: reduce) { + *, *::before, *::after { + scroll-behavior: auto !important; + animation-duration: 0.001ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.001ms !important; + } +} diff --git a/packages/test-fixtures/checks/runner.contract.mjs b/packages/test-fixtures/checks/runner.contract.mjs index b75e0e9..b18bd2a 100644 --- a/packages/test-fixtures/checks/runner.contract.mjs +++ b/packages/test-fixtures/checks/runner.contract.mjs @@ -3,6 +3,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import test from "node:test"; +import { fileURLToPath } from "node:url"; import { createRuntimeDifference, @@ -155,3 +156,16 @@ test("difference records make unresolved runtime mismatches blocking", () => { notes: ["hash mismatch"] }); }); + +test("the Phase 2 static corpus is synthetic and accepted by the safe runner", async () => { + const staticRoot = fileURLToPath(new URL("../static/", import.meta.url)); + for (const fixtureId of ["bidirectional-backup-roundtrip", "foreign-pending-restore"]) { + const fixtureRoot = path.join(staticRoot, fixtureId); + const manifest = await readFixtureManifest(fixtureRoot); + assert.equal(manifest.id, fixtureId); + assert.equal(manifest.containsRealUserData, false); + const rollout = await fs.readFile(path.join(fixtureRoot, "input", "codex-home", "sessions", "2026", "08", "26", "rollout-synthetic.jsonl"), "utf8"); + assert.match(rollout, /"type":"session_meta"/); + assert.doesNotMatch(rollout, /"type":"event_msg"|"message"|encrypted_content/); + } +}); diff --git a/packages/test-fixtures/static/bidirectional-backup-roundtrip/fixture.json b/packages/test-fixtures/static/bidirectional-backup-roundtrip/fixture.json new file mode 100644 index 0000000..c869e30 --- /dev/null +++ b/packages/test-fixtures/static/bidirectional-backup-roundtrip/fixture.json @@ -0,0 +1,18 @@ +{ + "schemaVersion": 1, + "id": "bidirectional-backup-roundtrip", + "description": "Synthetic Node and .NET backup/restore interoperability corpus.", + "containsRealUserData": false, + "inputs": { + "codexHome": "input/codex-home", + "sqliteHome": "input/codex-home/sqlite" + }, + "expected": { + "directions": [ + "node-to-dotnet", + "dotnet-to-node" + ], + "restoredProvider": "relay", + "journalTerminal": "committed" + } +} diff --git a/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/.codex-global-state.json b/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/.codex-global-state.json new file mode 100644 index 0000000..c6845c1 --- /dev/null +++ b/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/.codex-global-state.json @@ -0,0 +1,12 @@ +{ + "electron-saved-workspace-roots": [ + "C:\\synthetic\\fixture" + ], + "project-order": [ + "C:\\synthetic\\fixture" + ], + "active-workspace-roots": [ + "C:\\synthetic\\fixture" + ], + "fixture-marker": "primary-global-state-sentinel" +} diff --git a/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/.codex-global-state.json.bak b/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/.codex-global-state.json.bak new file mode 100644 index 0000000..29ca3a1 --- /dev/null +++ b/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/.codex-global-state.json.bak @@ -0,0 +1,12 @@ +{ + "electron-saved-workspace-roots": [ + "C:\\synthetic\\fixture" + ], + "project-order": [ + "C:\\synthetic\\fixture" + ], + "active-workspace-roots": [ + "C:\\synthetic\\fixture" + ], + "fixture-marker": "backup-global-state-sentinel" +} diff --git a/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/config.toml b/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/config.toml new file mode 100644 index 0000000..ee2ca3a --- /dev/null +++ b/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/config.toml @@ -0,0 +1,5 @@ +model_provider = "relay" + +[model_providers.relay] +name = "Synthetic Relay" +base_url = "https://example.invalid/v1" diff --git a/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/sessions/2026/08/26/rollout-synthetic.jsonl b/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/sessions/2026/08/26/rollout-synthetic.jsonl new file mode 100644 index 0000000..1c87e39 --- /dev/null +++ b/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/sessions/2026/08/26/rollout-synthetic.jsonl @@ -0,0 +1 @@ +{"timestamp":"2026-08-26T00:00:00.000Z","type":"session_meta","payload":{"id":"fixture-thread","timestamp":"2026-08-26T00:00:00.000Z","cwd":"C:\\synthetic\\fixture","source":"cli","cli_version":"1.0.0-fixture","model_provider":"relay"}} diff --git a/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/sqlite/.gitkeep b/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/sqlite/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/packages/test-fixtures/static/bidirectional-backup-roundtrip/input/codex-home/sqlite/.gitkeep @@ -0,0 +1 @@ + diff --git a/packages/test-fixtures/static/bidirectional-backup-roundtrip/sqlite-seed.sql b/packages/test-fixtures/static/bidirectional-backup-roundtrip/sqlite-seed.sql new file mode 100644 index 0000000..4461346 --- /dev/null +++ b/packages/test-fixtures/static/bidirectional-backup-roundtrip/sqlite-seed.sql @@ -0,0 +1,20 @@ +CREATE TABLE threads ( + id TEXT PRIMARY KEY, + model_provider TEXT, + cwd TEXT NOT NULL DEFAULT '', + archived INTEGER NOT NULL DEFAULT 0, + first_user_message TEXT NOT NULL DEFAULT '', + model TEXT, + has_user_event INTEGER NOT NULL DEFAULT 0, + updated_at INTEGER NOT NULL DEFAULT 0, + updated_at_ms INTEGER NOT NULL DEFAULT 0, + protected_marker TEXT NOT NULL DEFAULT '' +); +INSERT INTO threads ( + id, model_provider, cwd, archived, first_user_message, model, + has_user_event, updated_at, updated_at_ms, protected_marker +) +VALUES ( + 'fixture-thread', 'relay', 'C:\synthetic\fixture', 0, '', NULL, + 0, 1700000000, 1700000000123, 'fixture-db-sentinel' +); diff --git a/packages/test-fixtures/static/foreign-pending-restore/fixture.json b/packages/test-fixtures/static/foreign-pending-restore/fixture.json new file mode 100644 index 0000000..55aeedd --- /dev/null +++ b/packages/test-fixtures/static/foreign-pending-restore/fixture.json @@ -0,0 +1,19 @@ +{ + "schemaVersion": 1, + "id": "foreign-pending-restore", + "description": "Synthetic cross-runtime recovery of a transaction interrupted after rollout mutation.", + "containsRealUserData": false, + "inputs": { + "codexHome": "input/codex-home", + "sqliteHome": "input/codex-home/sqlite" + }, + "expected": { + "directions": [ + "node-pending-to-dotnet", + "dotnet-pending-to-node" + ], + "restoredProvider": "relay", + "journalTerminal": "rolledBack", + "pendingCount": 0 + } +} diff --git a/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/.codex-global-state.json b/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/.codex-global-state.json new file mode 100644 index 0000000..c6845c1 --- /dev/null +++ b/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/.codex-global-state.json @@ -0,0 +1,12 @@ +{ + "electron-saved-workspace-roots": [ + "C:\\synthetic\\fixture" + ], + "project-order": [ + "C:\\synthetic\\fixture" + ], + "active-workspace-roots": [ + "C:\\synthetic\\fixture" + ], + "fixture-marker": "primary-global-state-sentinel" +} diff --git a/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/.codex-global-state.json.bak b/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/.codex-global-state.json.bak new file mode 100644 index 0000000..29ca3a1 --- /dev/null +++ b/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/.codex-global-state.json.bak @@ -0,0 +1,12 @@ +{ + "electron-saved-workspace-roots": [ + "C:\\synthetic\\fixture" + ], + "project-order": [ + "C:\\synthetic\\fixture" + ], + "active-workspace-roots": [ + "C:\\synthetic\\fixture" + ], + "fixture-marker": "backup-global-state-sentinel" +} diff --git a/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/config.toml b/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/config.toml new file mode 100644 index 0000000..ee2ca3a --- /dev/null +++ b/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/config.toml @@ -0,0 +1,5 @@ +model_provider = "relay" + +[model_providers.relay] +name = "Synthetic Relay" +base_url = "https://example.invalid/v1" diff --git a/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/sessions/2026/08/26/rollout-synthetic.jsonl b/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/sessions/2026/08/26/rollout-synthetic.jsonl new file mode 100644 index 0000000..1c87e39 --- /dev/null +++ b/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/sessions/2026/08/26/rollout-synthetic.jsonl @@ -0,0 +1 @@ +{"timestamp":"2026-08-26T00:00:00.000Z","type":"session_meta","payload":{"id":"fixture-thread","timestamp":"2026-08-26T00:00:00.000Z","cwd":"C:\\synthetic\\fixture","source":"cli","cli_version":"1.0.0-fixture","model_provider":"relay"}} diff --git a/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/sqlite/.gitkeep b/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/sqlite/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/packages/test-fixtures/static/foreign-pending-restore/input/codex-home/sqlite/.gitkeep @@ -0,0 +1 @@ + diff --git a/packages/test-fixtures/static/foreign-pending-restore/sqlite-seed.sql b/packages/test-fixtures/static/foreign-pending-restore/sqlite-seed.sql new file mode 100644 index 0000000..4461346 --- /dev/null +++ b/packages/test-fixtures/static/foreign-pending-restore/sqlite-seed.sql @@ -0,0 +1,20 @@ +CREATE TABLE threads ( + id TEXT PRIMARY KEY, + model_provider TEXT, + cwd TEXT NOT NULL DEFAULT '', + archived INTEGER NOT NULL DEFAULT 0, + first_user_message TEXT NOT NULL DEFAULT '', + model TEXT, + has_user_event INTEGER NOT NULL DEFAULT 0, + updated_at INTEGER NOT NULL DEFAULT 0, + updated_at_ms INTEGER NOT NULL DEFAULT 0, + protected_marker TEXT NOT NULL DEFAULT '' +); +INSERT INTO threads ( + id, model_provider, cwd, archived, first_user_message, model, + has_user_event, updated_at, updated_at_ms, protected_marker +) +VALUES ( + 'fixture-thread', 'relay', 'C:\synthetic\fixture', 0, '', NULL, + 0, 1700000000, 1700000000123, 'fixture-db-sentinel' +); diff --git a/scripts/run-web-ui-fixture.js b/scripts/run-web-ui-fixture.js new file mode 100644 index 0000000..94022fb --- /dev/null +++ b/scripts/run-web-ui-fixture.js @@ -0,0 +1,74 @@ +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +import { createWebUiServer } from "../src/web-server.js"; +import { createMemoryWebUiState } from "../src/web-state.js"; + +const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); + +export async function createWebUiFixture() { + const fixtureRoot = await fs.mkdtemp(path.join(os.tmpdir(), "provider-sync-c5-browser-")); + const codexHome = path.join(fixtureRoot, ".codex"); + const rolloutPath = path.join(codexHome, "sessions", "2026", "08", "25", "rollout-c5-browser.jsonl"); + await fs.mkdir(path.dirname(rolloutPath), { recursive: true }); + await fs.mkdir(path.join(codexHome, "archived_sessions"), { recursive: true }); + await fs.mkdir(path.join(codexHome, "sqlite"), { recursive: true }); + await fs.writeFile(path.join(codexHome, "config.toml"), 'model_provider = "openai"\nmodel = "gpt-5"\n', "utf8"); + await fs.writeFile(rolloutPath, [ + { type: "session_meta", timestamp: "2026-08-25T00:00:00.000Z", payload: { id: "c5-browser-session", title: "Synthetic History", cwd: "C:\\synthetic\\project", model_provider: "openai", model: "gpt-5" } }, + { type: "event_msg", timestamp: "2026-08-25T00:01:00.000Z", payload: { type: "user_message", message: "C5_BODY_ONLY_MARKER" } }, + { type: "event_msg", timestamp: "2026-08-25T00:02:00.000Z", payload: { type: "assistant_message", message: "Synthetic response for browser validation." } } + ].map((entry) => JSON.stringify(entry)).join("\n") + "\n", "utf8"); + + const stateStore = createMemoryWebUiState({ codexHome }); + const handle = createWebUiServer({ + webRoot: path.join(repositoryRoot, "web", "dist"), + stateStore + }); + try { + await new Promise((resolve, reject) => { + handle.server.once("error", reject); + handle.server.listen(0, "127.0.0.1", resolve); + }); + } catch (error) { + await fs.rm(fixtureRoot, { recursive: true, force: true }); + throw error; + } + const address = handle.server.address(); + if (!address || typeof address === "string") { + await fs.rm(fixtureRoot, { recursive: true, force: true }); + throw new Error("Fixture Web server did not bind a TCP port."); + } + const origin = `http://127.0.0.1:${address.port}`; + handle.setBaseUrl(origin); + const issuePairingUrl = () => `${origin}/#pair=${encodeURIComponent(handle.issuePairing())}`; + let closing = false; + return { + origin, + pairingUrl: issuePairingUrl(), + issuePairingUrl, + async close() { + if (closing) return; + closing = true; + await new Promise((resolve) => handle.server.close(resolve)); + await fs.rm(fixtureRoot, { recursive: true, force: true }); + } + }; +} + +if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + const fixture = await createWebUiFixture(); + process.stdout.write(`CPS_FIXTURE_URL=${fixture.pairingUrl}\n`); + let closing = false; + const close = async () => { + if (closing) return; + closing = true; + await fixture.close(); + }; + for (const signal of ["SIGINT", "SIGTERM"]) { + process.once(signal, () => void close().finally(() => process.exit(0))); + } + process.stdin.resume(); +} diff --git a/scripts/smoke-root-tarball.js b/scripts/smoke-root-tarball.js index dc3b02b..9f8dfae 100644 --- a/scripts/smoke-root-tarball.js +++ b/scripts/smoke-root-tarball.js @@ -1,7 +1,10 @@ import fs from "node:fs/promises"; +import crypto from "node:crypto"; +import http from "node:http"; +import net from "node:net"; import os from "node:os"; import path from "node:path"; -import { spawnSync } from "node:child_process"; +import { spawn, spawnSync } from "node:child_process"; import { fileURLToPath } from "node:url"; const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); @@ -36,6 +39,178 @@ function dependencyNames(tree, result = new Set()) { return result; } +function containsPrivateStorageField(value) { + if (Array.isArray(value)) { + return value.some(containsPrivateStorageField); + } + if (!value || typeof value !== "object") { + return false; + } + for (const [key, child] of Object.entries(value)) { + if (["codexHome", "sqliteHome", "cwd"].includes(key)) { + return true; + } + if (containsPrivateStorageField(child)) { + return true; + } + } + return false; +} + +function reserveLoopbackPort() { + return new Promise((resolve, reject) => { + const server = net.createServer(); + server.once("error", reject); + server.listen(0, "127.0.0.1", () => { + const address = server.address(); + if (!address || typeof address === "string") { + server.close(); + reject(new Error("Could not reserve a loopback port.")); + return; + } + server.close((error) => error ? reject(error) : resolve(address.port)); + }); + }); +} + +function requestPage(url, options = {}) { + return new Promise((resolve, reject) => { + const request = http.request(url, { + method: options.method ?? "GET", + headers: options.headers ?? {} + }, (response) => { + const chunks = []; + response.on("data", (chunk) => chunks.push(chunk)); + response.on("end", () => resolve({ + status: response.statusCode, + headers: response.headers, + body: Buffer.concat(chunks).toString("utf8") + })); + }); + request.once("error", reject); + request.end(options.body ?? null); + }); +} + +async function smokeInstalledWeb(tempRoot, codexHome) { + const port = await reserveLoopbackPort(); + const installedCliPath = path.join( + tempRoot, + "node_modules", + "@dailin521", + "codex-provider-sync", + "src", + "cli.js" + ); + const child = spawn(process.execPath, [ + installedCliPath, + "web", + "--no-open", + "--port", + String(port), + "--codex-home", + codexHome + ], { + cwd: tempRoot, + windowsHide: true, + stdio: ["ignore", "pipe", "pipe"], + env: { ...process.env, NO_COLOR: "1" } + }); + let output = ""; + child.stdout.on("data", (chunk) => { output += chunk.toString("utf8"); }); + child.stderr.on("data", (chunk) => { output += chunk.toString("utf8"); }); + try { + const deadline = Date.now() + 10_000; + let health = null; + while (Date.now() < deadline) { + if (child.exitCode !== null) throw new Error(`Installed Web UI exited early.\n${output}`); + try { + health = await requestPage(`http://127.0.0.1:${port}/api/health`); + if (health.status === 200) break; + } catch {} + await new Promise((resolve) => setTimeout(resolve, 100)); + } + if (!health || health.status !== 200) throw new Error(`Installed Web UI did not become healthy.\n${output}`); + const page = await requestPage(`http://127.0.0.1:${port}/`); + if (page.status !== 200 || !page.body.includes("Codex Provider Sync")) { + throw new Error("Installed Web UI did not serve the production application shell."); + } + if (!String(page.headers["content-security-policy"] ?? "").includes("style-src 'self'")) { + throw new Error("Installed Web UI did not serve the strict production CSP."); + } + const pairingUrl = output.match(/One-time pairing link:\s+(\S+)/)?.[1]; + if (!pairingUrl) throw new Error("Installed Web UI did not emit a one-time pairing link."); + const pairingToken = decodeURIComponent(new URL(pairingUrl).hash.replace(/^#pair=/, "")); + const origin = `http://127.0.0.1:${port}`; + const paired = await requestPage(`${origin}/api/pair`, { + method: "POST", + headers: { Origin: origin, "X-Codex-Provider-Pairing": pairingToken } + }); + const pairedPayload = JSON.parse(paired.body); + if (paired.status !== 200 || typeof pairedPayload.deviceCredential !== "string") { + throw new Error("Installed Web UI pairing smoke failed."); + } + const authenticatedHeaders = { + Origin: origin, + "X-Codex-Provider-Device": pairedPayload.deviceCredential + }; + const profiles = await requestPage(`${origin}/api/profiles`, { headers: authenticatedHeaders }); + const profilesPayload = JSON.parse(profiles.body); + const profile = profilesPayload.profiles?.find((entry) => entry.id === "default"); + if (profiles.status !== 200 || !profile?.revision) { + throw new Error("Installed Web UI profile smoke failed."); + } + const coreHeaders = { ...authenticatedHeaders, "Content-Type": "application/json" }; + const statusRequest = { + protocolVersion: 1, + requestId: crypto.randomUUID(), + method: "getStatus", + payload: { profile: { profileId: profile.id, profileRevision: profile.revision } } + }; + const coreStatus = await requestPage(`${origin}/api/core`, { + method: "POST", + headers: coreHeaders, + body: JSON.stringify(statusRequest) + }); + const coreStatusPayload = JSON.parse(coreStatus.body); + const serializedStatus = JSON.stringify(coreStatusPayload); + if (coreStatus.status !== 200 || coreStatusPayload.ok !== true) { + throw new Error("Installed Web UI Core facade smoke failed."); + } + if (containsPrivateStorageField(coreStatusPayload) || serializedStatus.includes(codexHome)) { + throw new Error("Installed Web UI Core facade exposed a private storage path."); + } + const staleStatus = await requestPage(`${origin}/api/core`, { + method: "POST", + headers: coreHeaders, + body: JSON.stringify({ + ...statusRequest, + requestId: crypto.randomUUID(), + payload: { + profile: { + profileId: profile.id, + profileRevision: `${profile.revision}-stale` + } + } + }) + }); + const stalePayload = JSON.parse(staleStatus.body); + const serializedError = JSON.stringify(stalePayload); + if (staleStatus.status !== 409 + || stalePayload.ok !== false + || stalePayload.error?.code !== "PROFILE_CHANGED" + || serializedError.includes(codexHome)) { + throw new Error("Installed Web UI Core error redaction smoke failed."); + } + } finally { + child.kill(); + await Promise.race([ + new Promise((resolve) => child.once("exit", resolve)), + new Promise((resolve) => setTimeout(resolve, 3000)) + ]); + } +} + const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "codex-provider-sync-pack-smoke-")); let tarballPath = null; try { @@ -62,14 +237,37 @@ try { } if (!tarballPath) throw new Error("Could not locate the npm pack tarball."); const packedPaths = new Set(packResult[0].files.map((entry) => entry.path.replaceAll("\\", "/"))); - for (const required of ["src/cli.js", "src/public-api.js", "web/dist/index.html"] ) { + for (const required of [ + "src/cli.js", + "src/public-api.js", + "src/web-core-adapter.js", + "packages/contracts/dist/index.js", + "packages/core/src/index.js", + "web/dist/index.html" + ] ) { if (!packedPaths.has(required)) throw new Error(`Root tarball is missing ${required}.`); } for (const packedPath of packedPaths) { - if (packedPath.startsWith("apps/") - || packedPath.startsWith("packages/") - || packedPath.startsWith("node_modules/")) { - throw new Error(`Root tarball contains forbidden workspace/runtime content: ${packedPath}`); + const allowedExact = new Set([ + "AGENTS.md", + "CHANGELOG.md", + "CONTRIBUTING.md", + "CONTRIBUTORS.md", + "LICENSE", + "README.md", + "package.json" + ]); + const allowedPrefix = [ + "docs/", + "images/README/", + "packages/contracts/dist/", + "packages/core/src/", + "src/", + "web/dist/" + ]; + if (!allowedExact.has(packedPath) + && !allowedPrefix.some((prefix) => packedPath.startsWith(prefix))) { + throw new Error(`Root tarball contains an unapproved path: ${packedPath}`); } } @@ -105,7 +303,13 @@ try { if (installLifecycle) { const stateDbPath = path.join(codexHome, "sqlite", "state_5.sqlite"); const createDatabase = [ - 'const Database = require("better-sqlite3");', + 'let Database;', + 'try {', + ' Database = require("node:sqlite").DatabaseSync;', + '} catch (error) {', + ' if (!["ERR_UNKNOWN_BUILTIN_MODULE", "MODULE_NOT_FOUND"].includes(error?.code)) throw error;', + ' Database = require("better-sqlite3");', + '}', 'const database = new Database(process.env.PROVIDER_SYNC_SMOKE_DB);', 'database.exec(`CREATE TABLE threads (', ' id TEXT PRIMARY KEY,', @@ -146,6 +350,7 @@ try { || statusEnvelope.result?.sqliteCounts?.unreadable === true)) { throw new Error("Installed CLI did not open the synthetic SQLite database."); } + if (installLifecycle) await smokeInstalledWeb(tempRoot, codexHome); const productionTree = JSON.parse(run(process.execPath, [npmCliPath, "ls", "--omit=dev", "--json"], { cwd: tempRoot diff --git a/scripts/verify-workspace-boundaries.js b/scripts/verify-workspace-boundaries.js index aba27fb..7b31d7b 100644 --- a/scripts/verify-workspace-boundaries.js +++ b/scripts/verify-workspace-boundaries.js @@ -59,8 +59,24 @@ assert(rootManifest.workspaces.includes("apps/*") && rootManifest.workspaces.inc assert(Object.keys(rootManifest.dependencies ?? {}).length === 0, "Root runtime dependencies must stay Core-only."); assertExactDependencies(rootManifest, "root package"); +const rootPublishAllowlist = new Set([ + "README.md", + "CHANGELOG.md", + "CONTRIBUTING.md", + "CONTRIBUTORS.md", + "AGENTS.md", + "docs", + "images/README", + "src", + "web/dist", + "packages/contracts/dist", + "packages/core/src" +]); for (const entry of rootManifest.files ?? []) { - assert(!entry.startsWith("apps") && !entry.startsWith("packages"), `Root tarball allowlist leaks workspace source: ${entry}`); + assert(rootPublishAllowlist.has(entry), `Root tarball allowlist contains an unapproved path: ${entry}`); +} +for (const required of rootPublishAllowlist) { + assert(rootManifest.files?.includes(required), `Root tarball allowlist is missing ${required}.`); } const manifests = new Map(); diff --git a/src/backup.js b/src/backup.js index 81c6f9a..7e7949c 100644 --- a/src/backup.js +++ b/src/backup.js @@ -30,6 +30,8 @@ import { } from "./transaction-journal.js"; import { syncDirectory, writeFileAtomic } from "./atomic-file.js"; +const SESSION_CANONICAL_TARGET = Symbol("codex-provider-sync.session-canonical-target"); + function timestampSlug(date = new Date()) { return date.toISOString().replaceAll(":", "").replaceAll("-", "").replace(".", ""); } @@ -111,6 +113,21 @@ function storagePathsEqual(left, right) { : normalizedLeft === normalizedRight; } +async function storagePathsEqualPhysical(left, right) { + if (storagePathsEqual(left, right)) { + return true; + } + try { + const [physicalLeft, physicalRight] = await Promise.all([ + fs.realpath(path.resolve(left)), + fs.realpath(path.resolve(right)) + ]); + return storagePathsEqual(physicalLeft, physicalRight); + } catch { + return false; + } +} + function pathComparisonKey(value) { const resolved = path.resolve(value); return process.platform === "win32" ? resolved.toLowerCase() : resolved; @@ -124,6 +141,21 @@ function pathIsWithin(root, target) { && !path.isAbsolute(relativePath); } +function findRawRolloutRoot(target) { + let current = path.dirname(target); + while (true) { + const name = path.basename(current).toLowerCase(); + if (name === "sessions" || name === "archived_sessions") { + return current; + } + const parent = path.dirname(current); + if (parent === current) { + return null; + } + current = parent; + } +} + async function assertNoLinkedPathSegments(root, target) { const relativePath = path.relative(root, target); const segments = relativePath.split(path.sep).filter(Boolean); @@ -141,34 +173,64 @@ async function assertNoLinkedPathSegments(root, target) { async function validateSessionManifestEntries(entries, codexHome) { const roots = ["sessions", "archived_sessions"].map((name) => path.resolve(codexHome, name)); + const canonicalRoots = (await Promise.all(roots.map(async (root) => { + try { + return await fs.realpath(root); + } catch (error) { + if (error?.code === "ENOENT") { + return null; + } + throw error; + } + }))).filter(Boolean); const seen = new Set(); + const validated = []; for (const entry of entries) { if (!entry || typeof entry.path !== "string" || !path.isAbsolute(entry.path)) { throw new Error("Backup session manifest contains a missing or non-absolute rollout path."); } const target = path.resolve(entry.path); - const lexicalRoot = roots.find((root) => pathIsWithin(root, target)); - if (!lexicalRoot || !/^rollout-.*\.jsonl$/i.test(path.basename(target))) { + if (!/^rollout-.*\.jsonl$/i.test(path.basename(target))) { throw new Error(`Backup session target is outside the allowed rollout roots: ${entry.path}`); } - const key = pathComparisonKey(target); - if (seen.has(key)) { - throw new Error(`Backup session manifest contains a duplicate rollout target: ${entry.path}`); + const rawRoot = findRawRolloutRoot(target); + if (!rawRoot) { + throw new Error(`Backup session target is outside the allowed rollout roots: ${entry.path}`); } - seen.add(key); - await assertNoLinkedPathSegments(lexicalRoot, target); - const [canonicalRoot, canonicalTarget] = await Promise.all([ - fs.realpath(lexicalRoot), + await assertNoLinkedPathSegments(rawRoot, target); + const [canonicalRawRoot, canonicalTarget] = await Promise.all([ + fs.realpath(rawRoot), fs.realpath(target) ]); - if (!pathIsWithin(canonicalRoot, canonicalTarget)) { + const canonicalRoot = canonicalRoots.find((root) => + storagePathsEqual(root, canonicalRawRoot) && pathIsWithin(root, canonicalTarget) + ); + if (!canonicalRoot) { throw new Error(`Backup session target resolves outside the allowed rollout roots: ${entry.path}`); } + const key = pathComparisonKey(canonicalTarget); + if (seen.has(key)) { + throw new Error(`Backup session manifest contains a duplicate rollout target: ${entry.path}`); + } + seen.add(key); + await assertNoLinkedPathSegments(canonicalRoot, canonicalTarget); const stat = await fs.stat(canonicalTarget); if (!stat.isFile()) { throw new Error(`Backup session target is not a regular file: ${entry.path}`); } + const normalizedEntry = { ...entry, path: target }; + Object.defineProperty(normalizedEntry, SESSION_CANONICAL_TARGET, { + configurable: true, + enumerable: false, + value: canonicalTarget + }); + validated.push({ + originalPath: target, + canonicalPath: canonicalTarget, + entry: normalizedEntry + }); } + return validated; } function resolveRestoreSqliteHome(storage, metadata, stateDb) { @@ -498,7 +560,8 @@ async function readValidatedBackupMetadata(backupDir, codexHome) { if (metadata.namespace !== BACKUP_NAMESPACE || ![1, 2].includes(metadata.version)) { throw new Error(`Unsupported backup metadata in ${metadataPath}.`); } - if (typeof metadata.codexHome !== "string" || !storagePathsEqual(metadata.codexHome, codexHome)) { + if (typeof metadata.codexHome !== "string" + || !await storagePathsEqualPhysical(metadata.codexHome, codexHome)) { throw new Error(`Backup was created for ${metadata.codexHome}, not ${codexHome}.`); } return metadata; @@ -541,7 +604,7 @@ export async function getBackupRecoveryCoverage(backupDir, storageOrCodexHome) { throw new Error(`Unsupported session backup manifest in ${sessionManifestPath}.`); } if (typeof sessionManifest.codexHome !== "string" - || !storagePathsEqual(sessionManifest.codexHome, codexHome)) { + || !await storagePathsEqualPhysical(sessionManifest.codexHome, codexHome)) { throw new Error(`Session backup was created for ${sessionManifest.codexHome}, not ${codexHome}.`); } if (!Array.isArray(sessionManifest.files)) { @@ -588,7 +651,8 @@ export async function restoreBackup(backupDir, storageOrCodexHome, options = {}) restoreSessions = true, allowSqliteHomeRelocation = false, globalStateTargetPaths = null, - sessionTargetPaths = null + sessionTargetPaths = null, + onBeforeSessionRestore = null } = options; const storage = typeof storageOrCodexHome === "string" ? resolveStorageLayout({ codexHome: storageOrCodexHome, env: {} }) @@ -606,16 +670,26 @@ export async function restoreBackup(backupDir, storageOrCodexHome, options = {}) throw new Error(`Unsupported session backup manifest in ${sessionManifestPath}.`); } if (typeof sessionManifest.codexHome !== "string" - || !storagePathsEqual(sessionManifest.codexHome, codexHome)) { + || !await storagePathsEqualPhysical(sessionManifest.codexHome, codexHome)) { throw new Error(`Session backup was created for ${sessionManifest.codexHome}, not ${codexHome}.`); } - await validateSessionManifestEntries(sessionManifest.files ?? [], codexHome); + const validatedEntries = await validateSessionManifestEntries(sessionManifest.files ?? [], codexHome); if (sessionTargetPaths) { const selected = new Set(sessionTargetPaths.map(pathComparisonKey)); - sessionRestoreEntries = (sessionManifest.files ?? []) - .filter((entry) => selected.has(pathComparisonKey(entry.path))); + for (const selectedPath of sessionTargetPaths) { + selected.add(pathComparisonKey(await fs.realpath(selectedPath))); + } + sessionRestoreEntries = validatedEntries + .filter(({ originalPath, canonicalPath }) => + selected.has(pathComparisonKey(originalPath)) || selected.has(pathComparisonKey(canonicalPath)) + ) + .map(({ entry }) => entry); } else { - sessionRestoreEntries = await selectSessionRestoreEntries(backupDir, sessionManifest); + const selectedEntries = await selectSessionRestoreEntries(backupDir, sessionManifest); + const selected = new Set(selectedEntries.map((entry) => pathComparisonKey(entry.path))); + sessionRestoreEntries = validatedEntries + .filter(({ originalPath }) => selected.has(pathComparisonKey(originalPath))) + .map(({ entry }) => entry); } } @@ -632,7 +706,7 @@ export async function restoreBackup(backupDir, storageOrCodexHome, options = {}) targetSqliteHome = resolveRestoreSqliteHome(storage, metadata, stateDb); const sqliteHomeRelocation = metadata.version >= 2 && metadata.sqliteHome - && !storagePathsEqual(metadata.sqliteHome, targetSqliteHome); + && !await storagePathsEqualPhysical(metadata.sqliteHome, targetSqliteHome); if (sqliteHomeRelocation && !allowSqliteHomeRelocation) { throw new Error( `Backup SQLite home is ${metadata.sqliteHome}, but the current target is ${targetSqliteHome}. ` @@ -697,7 +771,19 @@ export async function restoreBackup(backupDir, storageOrCodexHome, options = {}) } if (restoreSessions) { - await restoreSessionChanges(sessionRestoreEntries); + await restoreSessionChanges(sessionRestoreEntries, { + onBeforeRestore: async (entry) => { + await onBeforeSessionRestore?.(entry); + const [validated] = await validateSessionManifestEntries([entry], codexHome); + if (!validated + || !storagePathsEqual( + validated.entry[SESSION_CANONICAL_TARGET], + entry[SESSION_CANONICAL_TARGET] + )) { + throw new Error(`Backup session target changed after validation: ${entry.path}`); + } + } + }); } return metadata; diff --git a/src/web-core-adapter.js b/src/web-core-adapter.js new file mode 100644 index 0000000..79a643a --- /dev/null +++ b/src/web-core-adapter.js @@ -0,0 +1,132 @@ +import { + CORE_PROTOCOL_VERSION, + ContractValidationError, + assertCoreRequestEnvelope, + createCoreFailureEnvelope, + createCoreSuccessEnvelope, + createPublicCoreErrorDto, + isCoreErrorCode +} from "../packages/contracts/dist/index.js"; +import { createCoreFacade } from "../packages/core/src/index.js"; + +const CONFLICT_CODES = new Set([ + "PROFILE_CHANGED", + "STORAGE_CHANGED", + "PLAN_STALE", + "PLAN_EXPIRED", + "STALE_STATE", + "ROLLOUT_CHANGED", + "PENDING_TRANSACTION", + "RECOVERY_REQUIRED", + "OPERATION_BUSY" +]); + +function isRecord(value) { + return value !== null && typeof value === "object" && !Array.isArray(value); +} + +function safeString(value) { + return typeof value === "string" && value.length > 0 ? value : undefined; +} + +function httpStatusForCode(code) { + if (code === "INVALID_INPUT" || code === "PROTOCOL_VERSION_MISMATCH") return 400; + if (code === "CODEX_HOME_NOT_FOUND" || code === "STATE_DB_NOT_FOUND") return 404; + if (code === "PERMISSION_DENIED") return 403; + if (code === "SQLITE_BUSY" || code === "LOCK_UNVERIFIABLE") return 423; + if (CONFLICT_CODES.has(code)) return 409; + if (code === "OPERATION_CANCELLED") return 499; + return 500; +} + +function publicErrorFromException(error, fallbackCode = "INTERNAL_ERROR") { + const source = isRecord(error) ? error : {}; + const candidate = safeString(source.code); + const code = isCoreErrorCode(candidate) ? candidate : fallbackCode; + return createPublicCoreErrorDto(code, { + operationId: source.operationId, + details: source.details + }); +} + +function correlationFromUnknown(value) { + const source = isRecord(value) ? value : {}; + return { + requestId: safeString(source.requestId) ?? "invalid-request", + operationId: safeString(source.operationId) + }; +} + +export function createWebCoreFacade(stateStore) { + if (!stateStore || typeof stateStore.getProfile !== "function") { + throw new TypeError("A trusted Web UI state store is required."); + } + return createCoreFacade({ + async resolveProfile(selector) { + const profile = stateStore.getProfile(selector.profileId); + return { + id: profile.id, + revision: profile.revision, + codexHome: profile.codexHome, + ...(profile.sqliteHome ? { sqliteHome: profile.sqliteHome } : {}) + }; + } + }); +} + +export async function dispatchWebCoreRequest(coreFacade, value) { + let request; + try { + assertCoreRequestEnvelope(value); + request = value; + } catch (error) { + const correlation = correlationFromUnknown(value); + const dto = publicErrorFromException( + error, + error instanceof ContractValidationError && error.code === "PROTOCOL_VERSION_MISMATCH" + ? "PROTOCOL_VERSION_MISMATCH" + : "INVALID_INPUT" + ); + return { + statusCode: httpStatusForCode(dto.code), + envelope: { + protocolVersion: CORE_PROTOCOL_VERSION, + requestId: correlation.requestId, + ...(correlation.operationId ? { operationId: correlation.operationId } : {}), + ok: false, + error: dto + }, + activity: { method: null, ok: false, code: dto.code } + }; + } + + try { + const handler = coreFacade[request.method]; + if (typeof handler !== "function") { + throw Object.assign(new Error("Unknown Core method."), { code: "INVALID_INPUT" }); + } + const result = await handler.call(coreFacade, request.payload); + const operationId = isRecord(result) ? safeString(result.operationId) : undefined; + return { + statusCode: 200, + envelope: createCoreSuccessEnvelope(request, result, operationId), + activity: { + method: request.method, + ok: true, + operationId: operationId ?? request.operationId ?? null + } + }; + } catch (error) { + const dto = publicErrorFromException(error); + return { + statusCode: httpStatusForCode(dto.code), + envelope: createCoreFailureEnvelope(request, dto), + activity: { + method: request.method, + ok: false, + code: dto.code, + operationId: dto.operationId ?? request.operationId ?? null + } + }; + } +} diff --git a/src/web-server.js b/src/web-server.js index 6b2cdcd..f9d35a0 100644 --- a/src/web-server.js +++ b/src/web-server.js @@ -25,6 +25,7 @@ import { toCoreErrorDto, } from "./public-api.js"; import { createMemoryWebUiState, ProfileRevisionConflictError, WebUiStateStore } from "./web-state.js"; +import { createWebCoreFacade, dispatchWebCoreRequest } from "./web-core-adapter.js"; const DEFAULT_PORT = 8791; const MAX_REQUEST_BYTES = 64 * 1024; @@ -52,6 +53,15 @@ const MIME_TYPES = new Map([ [".webp", "image/webp"] ]); +class WebRequestError extends Error { + constructor(message, statusCode, code) { + super(message); + this.name = "WebRequestError"; + this.statusCode = statusCode; + this.code = code; + } +} + function sendJson(response, statusCode, value) { const body = JSON.stringify(value); response.writeHead(statusCode, { @@ -89,7 +99,7 @@ async function readJsonBody(request) { for await (const chunk of request) { received += chunk.length; if (received > MAX_REQUEST_BYTES) { - throw new Error(`Request body exceeds ${MAX_REQUEST_BYTES} bytes.`); + throw new WebRequestError(`Request body exceeds ${MAX_REQUEST_BYTES} bytes.`, 413, "REQUEST_TOO_LARGE"); } chunks.push(chunk); } @@ -99,7 +109,7 @@ async function readJsonBody(request) { try { return JSON.parse(Buffer.concat(chunks).toString("utf8")); } catch { - throw new Error("Request body must be valid JSON."); + throw new WebRequestError("Request body must be valid JSON.", 400, "INVALID_JSON"); } } @@ -293,9 +303,14 @@ async function serveStatic(response, pathname, webRoot) { } const extension = path.extname(filePath).toLowerCase(); + let cspNonce = null; if (extension === ".html") { - file = Buffer.from(file.toString("utf8").replace("__CODEX_PROVIDER_SYNC_BOOTSTRAP__", "{}"), "utf8"); + cspNonce = crypto.randomBytes(18).toString("base64url"); + file = Buffer.from(file.toString("utf8") + .replace("__CODEX_PROVIDER_SYNC_BOOTSTRAP__", "{}") + .replaceAll("__CPS_CSP_NONCE__", cspNonce), "utf8"); } + const nonceSource = cspNonce ? ` 'nonce-${cspNonce}'` : ""; response.writeHead(200, { "Cache-Control": extension === ".html" ? "no-store" : "public, max-age=3600", "Content-Type": MIME_TYPES.get(extension) ?? "application/octet-stream", @@ -303,7 +318,7 @@ async function serveStatic(response, pathname, webRoot) { "Referrer-Policy": "no-referrer", "X-Content-Type-Options": "nosniff", "X-Frame-Options": "DENY", - "Content-Security-Policy": "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src 'self'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'" + "Content-Security-Policy": `default-src 'self'; script-src 'self'${nonceSource}; style-src 'self'${nonceSource}; img-src 'self' data:; connect-src 'self'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'` }); response.end(file); } @@ -431,6 +446,7 @@ export function createWebUiServer({ listHistory: services.listHistory ?? listHistory, getHistorySession: services.getHistorySession ?? getHistorySession }; + const coreFacade = services.coreFacade ?? createWebCoreFacade(stateStore); const activity = []; let activityId = 0; let activeOperation = null; @@ -488,7 +504,7 @@ export function createWebUiServer({ record(outcome === "partial" ? "warning" : "success", `${kind} completed`); sendJson(response, 200, { result: { ...result, outcome } }); } catch (error) { - record("error", `${kind} failed`, error instanceof Error ? error.message : String(error)); + record("error", `${kind} failed`, typeof error?.code === "string" ? error.code : "INTERNAL_ERROR"); sendError(response, coreErrorHttpStatus(error, 400), error); } finally { activeOperation = null; @@ -645,6 +661,29 @@ export function createWebUiServer({ } const body = await readJsonBody(request); + if (pathname === "/api/core") { + const contentType = String(request.headers["content-type"] ?? "").toLowerCase(); + if (!contentType.startsWith("application/json")) { + const dispatched = await dispatchWebCoreRequest(coreFacade, { + protocolVersion: body?.protocolVersion, + requestId: body?.requestId, + operationId: body?.operationId, + method: body?.method, + payload: { invalidContentType: true } + }); + record("warning", "Core request rejected", dispatched.activity); + sendJson(response, 415, dispatched.envelope); + return; + } + const dispatched = await dispatchWebCoreRequest(coreFacade, body); + record( + dispatched.activity.ok ? "info" : "warning", + dispatched.activity.ok ? "Core request completed" : "Core request rejected", + dispatched.activity + ); + sendJson(response, dispatched.statusCode, dispatched.envelope); + return; + } if (pathname === "/api/profiles/save") { const profileId = requireString(body.profileId, "profileId", { maxLength: 80 }); try { @@ -683,7 +722,7 @@ export function createWebUiServer({ if (pathname === "/api/status") { const profile = resolveStorageProfile(body, stateStore); const status = serializeStatus(await api.getStatus({ ...profile, platform })); - record("info", "Status refreshed", status.codexHome, null); + record("info", "Status refreshed", { profileId: profile.profileId }, null); sendJson(response, 200, { status }); return; } @@ -827,7 +866,11 @@ export function createWebUiServer({ } await serveStatic(response, pathname, webRoot); } catch (error) { - sendError(response, coreErrorHttpStatus(error, 500), error); + if (error instanceof WebRequestError) { + sendError(response, error.statusCode, error, error.code); + } else { + sendError(response, coreErrorHttpStatus(error, 500), error); + } } }); diff --git a/test-support/cross-runtime-fixtures.mjs b/test-support/cross-runtime-fixtures.mjs new file mode 100644 index 0000000..fddfc73 --- /dev/null +++ b/test-support/cross-runtime-fixtures.mjs @@ -0,0 +1,236 @@ +import assert from "node:assert/strict"; +import crypto from "node:crypto"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { spawnSync } from "node:child_process"; +import { fileURLToPath } from "node:url"; +import test from "node:test"; + +import { createRuntimeDifference, runFixtureInTemp } from "../packages/test-fixtures/src/index.js"; +import { runRestore, runSync } from "../src/public-api.js"; +import { openDatabase } from "../src/sqlite.js"; +import { + findPendingTransactions, + readTransactionJournal, + TRANSACTION_JOURNAL_BASENAME +} from "../src/transaction-journal.js"; + +const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const staticRoot = path.join(repositoryRoot, "packages", "test-fixtures", "static"); +const fixtureHostDll = process.env.CPS_DOTNET_FIXTURE_HOST + ?? path.join(repositoryRoot, "desktop", "CodexProviderSync.Core.Tests", "FixtureHost", "bin", "Release", "net10.0", "CodexProviderSync.FixtureHost.dll"); +const crashHostDll = process.env.CPS_DOTNET_CRASH_HOST + ?? path.join(repositoryRoot, "desktop", "CodexProviderSync.Core.Tests", "CrashHost", "bin", "Release", "net10.0", "CodexProviderSync.CrashHost.dll"); +const nodeCrashHost = path.join(repositoryRoot, "test-support", "cross-runtime-node-crash-host.mjs"); + +function digest(value) { + return crypto.createHash("sha256").update(value).digest("hex"); +} + +function canonicalSqliteValue(value) { + if (Buffer.isBuffer(value)) return ["blob", value.toString("base64")]; + if (typeof value === "bigint") return ["integer", value.toString()]; + return value; +} + +async function rolloutFiles(root) { + const result = []; + async function visit(current) { + let entries = []; + try { + entries = await fs.readdir(current, { withFileTypes: true }); + } catch (error) { + if (error?.code === "ENOENT") return; + throw error; + } + for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) { + const fullPath = path.join(current, entry.name); + if (entry.isDirectory()) await visit(fullPath); + else if (entry.isFile() && entry.name.endsWith(".jsonl")) result.push(fullPath); + } + } + await visit(root); + return result; +} + +async function canonicalState(codexHome) { + const files = []; + const configPath = path.join(codexHome, "config.toml"); + files.push(["config.toml", digest(await fs.readFile(configPath))]); + for (const fileName of [".codex-global-state.json", ".codex-global-state.json.bak"]) { + const filePath = path.join(codexHome, fileName); + try { + files.push([fileName, digest(await fs.readFile(filePath))]); + } catch (error) { + if (error?.code !== "ENOENT") throw error; + files.push([fileName, null]); + } + } + for (const scope of ["sessions", "archived_sessions"]) { + for (const filePath of await rolloutFiles(path.join(codexHome, scope))) { + files.push([ + path.relative(codexHome, filePath).replaceAll("\\", "/"), + digest(await fs.readFile(filePath)) + ]); + } + } + const database = await openDatabase(path.join(codexHome, "sqlite", "state_5.sqlite"), { readOnly: true }); + try { + const integrity = database.prepare("PRAGMA integrity_check").get(); + assert.equal(integrity.integrity_check, "ok"); + const columns = database.prepare("PRAGMA table_info(threads)").all() + .sort((left, right) => Number(left.cid) - Number(right.cid)) + .map((column) => String(column.name)); + const quotedColumns = columns + .map((column) => `"${column.replaceAll('"', '""')}"`) + .join(", "); + const rows = database.prepare(`SELECT ${quotedColumns} FROM threads ORDER BY id`).all() + .map((row) => columns.map((column) => canonicalSqliteValue(row[column]))); + const schema = database.prepare(` + SELECT type, name, tbl_name, sql + FROM sqlite_schema + WHERE sql IS NOT NULL + ORDER BY type, name + `).all().map((row) => [row.type, row.name, row.tbl_name, row.sql]); + const canonical = { + files, + sqlite: { + schema, + columns, + rows, + userVersion: Number(database.prepare("PRAGMA user_version").get().user_version) + } + }; + const providerIndex = columns.indexOf("model_provider"); + return { + hash: digest(JSON.stringify(canonical)), + provider: providerIndex >= 0 ? rows[0]?.[providerIndex] ?? null : null + }; + } finally { + database.close(); + } +} + +async function createCase(fixture, name) { + const caseRoot = path.join(fixture.root, "work", name); + const codexHome = path.join(caseRoot, ".codex"); + await fs.mkdir(caseRoot, { recursive: true }); + await fs.cp(fixture.codexHome, codexHome, { recursive: true, force: false, errorOnExist: true }); + await fs.mkdir(path.join(codexHome, "archived_sessions"), { recursive: true }); + const seed = await fs.readFile(path.join(fixture.root, "sqlite-seed.sql"), "utf8"); + const database = await openDatabase(path.join(codexHome, "sqlite", "state_5.sqlite")); + try { + database.exec(seed); + } finally { + database.close(); + } + return { codexHome, initial: await canonicalState(codexHome) }; +} + +function runProcess(command, args, { expectCrash = false } = {}) { + const result = spawnSync(command, args, { + cwd: repositoryRoot, + encoding: "utf8", + windowsHide: true, + maxBuffer: 1024 * 1024, + env: { ...process.env, NO_COLOR: "1" } + }); + if (expectCrash) { + assert.notEqual(result.status, 0, "The crash host unexpectedly completed successfully."); + return null; + } + assert.equal(result.status, 0, [result.stdout, result.stderr].filter(Boolean).join("\n")); + const line = result.stdout.trim().split(/\r?\n/).filter(Boolean).at(-1); + const output = JSON.parse(line); + assert.equal(output.schemaVersion, 1); + assert.equal(output.ok, true); + return output; +} + +function runDotnet(operation, codexHome, argument) { + return runProcess("dotnet", [fixtureHostDll, operation, codexHome, argument]); +} + +async function managedBackupDirectories(codexHome) { + const root = path.join(codexHome, "backups_state", "provider-sync"); + const entries = await fs.readdir(root, { withFileTypes: true }); + return entries + .filter((entry) => entry.isDirectory()) + .map((entry) => path.join(root, entry.name)) + .sort(); +} + +async function assertJournal(backupDir, expectedState) { + const journal = await readTransactionJournal(path.join(backupDir, TRANSACTION_JOURNAL_BASENAME)); + assert.equal(journal.invalidTail, false); + assert.equal(journal.terminal, true); + assert.equal(journal.state, expectedState); +} + +async function assertRestored(caseState, backupDir, expectedJournal) { + const restored = await canonicalState(caseState.codexHome); + assert.equal(restored.hash, caseState.initial.hash); + assert.equal(restored.provider, "relay"); + assert.deepEqual(await findPendingTransactions(caseState.codexHome), []); + await assertJournal(backupDir, expectedJournal); +} + +test("bidirectional-backup-roundtrip uses one synthetic corpus across Node and .NET", async () => { + await Promise.all([fs.access(fixtureHostDll), fs.access(crashHostDll)]); + const fixtureRoot = path.join(staticRoot, "bidirectional-backup-roundtrip"); + const evidence = await runFixtureInTemp(fixtureRoot, async (fixture) => { + const nodeToDotnet = await createCase(fixture, "node-to-dotnet"); + const nodeResult = await runSync({ codexHome: nodeToDotnet.codexHome, provider: "openai" }); + assert.notEqual((await canonicalState(nodeToDotnet.codexHome)).hash, nodeToDotnet.initial.hash); + runDotnet("restore", nodeToDotnet.codexHome, nodeResult.backupDir); + await assertRestored(nodeToDotnet, nodeResult.backupDir, fixture.manifest.expected.journalTerminal); + + const dotnetToNode = await createCase(fixture, "dotnet-to-node"); + const dotnetResult = runDotnet("sync", dotnetToNode.codexHome, "openai"); + assert.notEqual((await canonicalState(dotnetToNode.codexHome)).hash, dotnetToNode.initial.hash); + await runRestore({ codexHome: dotnetToNode.codexHome, backupDir: dotnetResult.BackupDir }); + await assertRestored(dotnetToNode, dotnetResult.BackupDir, fixture.manifest.expected.journalTerminal); + + return createRuntimeDifference({ + fixtureId: fixture.manifest.id, + status: "matched", + node: { restored: true }, + dotnet: { restored: true }, + decision: "Both directed backup/restore paths match the synthetic canonical state." + }); + }); + assert.equal(evidence.status, "matched"); +}); + +test("foreign-pending-restore converges both crash directions to rolledBack", async () => { + await Promise.all([fs.access(fixtureHostDll), fs.access(crashHostDll)]); + const fixtureRoot = path.join(staticRoot, "foreign-pending-restore"); + const evidence = await runFixtureInTemp(fixtureRoot, async (fixture) => { + const nodeToDotnet = await createCase(fixture, "node-pending-to-dotnet"); + runProcess(process.execPath, [nodeCrashHost, nodeToDotnet.codexHome], { expectCrash: true }); + const nodePending = await findPendingTransactions(nodeToDotnet.codexHome); + assert.equal(nodePending.length, 1); + assert.notEqual((await canonicalState(nodeToDotnet.codexHome)).hash, nodeToDotnet.initial.hash); + runDotnet("restore", nodeToDotnet.codexHome, nodePending[0].backupDir); + await assertRestored(nodeToDotnet, nodePending[0].backupDir, fixture.manifest.expected.journalTerminal); + + const dotnetToNode = await createCase(fixture, "dotnet-pending-to-node"); + runProcess("dotnet", [crashHostDll, dotnetToNode.codexHome], { expectCrash: true }); + const dotnetPending = await findPendingTransactions(dotnetToNode.codexHome); + assert.equal(dotnetPending.length, 1); + assert.notEqual((await canonicalState(dotnetToNode.codexHome)).hash, dotnetToNode.initial.hash); + await runRestore({ codexHome: dotnetToNode.codexHome, backupDir: dotnetPending[0].backupDir }); + await assertRestored(dotnetToNode, dotnetPending[0].backupDir, fixture.manifest.expected.journalTerminal); + + assert.equal((await managedBackupDirectories(nodeToDotnet.codexHome)).length, 1); + assert.equal((await managedBackupDirectories(dotnetToNode.codexHome)).length, 1); + return createRuntimeDifference({ + fixtureId: fixture.manifest.id, + status: "matched", + node: { pendingRecovered: true }, + dotnet: { pendingRecovered: true }, + decision: "Both foreign pending journals reached a valid rolledBack terminal." + }); + }); + assert.equal(evidence.status, "matched"); +}); diff --git a/test-support/cross-runtime-node-crash-host.mjs b/test-support/cross-runtime-node-crash-host.mjs new file mode 100644 index 0000000..fcbb685 --- /dev/null +++ b/test-support/cross-runtime-node-crash-host.mjs @@ -0,0 +1,13 @@ +import { runSync } from "../src/public-api.js"; + +if (process.argv.length !== 3) process.exit(64); + +await runSync({ + codexHome: process.argv[2], + provider: "openai", + faultInjector: async ({ point }) => { + if (point === "after_rollout_mutation_before_applied") process.exit(86); + } +}); + +process.exit(65); diff --git a/test/history-requests.test.js b/test/history-requests.test.js deleted file mode 100644 index dcf1713..0000000 --- a/test/history-requests.test.js +++ /dev/null @@ -1,26 +0,0 @@ -import assert from "node:assert/strict"; -import test from "node:test"; - -import { createLatestRequestGate, scheduleDebounced } from "../web/src/history-requests.js"; - -test("starting a newer History request aborts the older request and rejects its response", () => { - const gate = createLatestRequestGate(); - const first = gate.begin(); - const second = gate.begin(); - - assert.equal(first.signal.aborted, true); - assert.equal(second.signal.aborted, false); - assert.equal(gate.isLatest(first.sequence), false); - assert.equal(gate.isLatest(second.sequence), true); -}); - -test("History query debounce uses a 300ms delay and can be cancelled", () => { - const calls = []; - const timers = { - setTimeout(callback, delay) { calls.push(["set", delay, callback]); return 17; }, - clearTimeout(id) { calls.push(["clear", id]); } - }; - const cancel = scheduleDebounced(() => {}, 300, timers); - cancel(); - assert.deepEqual(calls.slice(0, 2).map((call) => call.slice(0, 2)), [["set", 300], ["clear", 17]]); -}); diff --git a/test/profile-refresh.test.js b/test/profile-refresh.test.js deleted file mode 100644 index 2aef3ae..0000000 --- a/test/profile-refresh.test.js +++ /dev/null @@ -1,134 +0,0 @@ -import assert from "node:assert/strict"; -import test from "node:test"; - -import { createProfileRefresh, storagePayload } from "../web/src/profile-refresh.js"; - -function createDeferred() { - let resolve; - let reject; - const promise = new Promise((resolvePromise, rejectPromise) => { - resolve = resolvePromise; - reject = rejectPromise; - }); - return { promise, resolve, reject }; -} - -function createRecordingFetches() { - const calls = []; - const pending = new Map(); - const fetchFor = (kind) => (storage, options = {}) => { - const deferred = createDeferred(); - const key = `${kind}:${storage.profileId}`; - calls.push({ kind, profileId: storage.profileId, signal: options.signal }); - pending.set(key, deferred); - return deferred.promise; - }; - return { - calls, - pending, - fetchStatus: fetchFor("status"), - fetchBackups: fetchFor("backups"), - resolveFor(profileId, { status = {}, backups = {} } = {}) { - pending.get(`status:${profileId}`)?.resolve({ status }); - pending.get(`backups:${profileId}`)?.resolve(backups); - }, - rejectFor(profileId, error) { - pending.get(`status:${profileId}`)?.reject(error); - pending.get(`backups:${profileId}`)?.reject(error); - } - }; -} - -function createUiRecorder() { - const recorder = { - applied: [], - errors: [], - loading: [] - }; - recorder.onResult = (result) => recorder.applied.push(result); - recorder.onError = (error) => recorder.errors.push(error.message); - recorder.onLoading = (value) => recorder.loading.push(value); - return recorder; -} - -test("storagePayload defaults to the default profile", () => { - assert.deepEqual(storagePayload(), { profileId: "default" }); - assert.deepEqual(storagePayload("work"), { profileId: "work" }); -}); - -test("profile refresh race: A starts first, B finishes first, A finishes last — UI stays on B", async () => { - const fetches = createRecordingFetches(); - const ui = createUiRecorder(); - const refresh = createProfileRefresh({ fetchStatus: fetches.fetchStatus, fetchBackups: fetches.fetchBackups }); - - // The user is on profile A and a refresh is in flight. - const refreshA = refresh({ profileId: "a", onLoading: ui.onLoading, onResult: ui.onResult, onError: ui.onError }); - // The user switches to profile B before A completes. - const refreshB = refresh({ profileId: "b", onLoading: ui.onLoading, onResult: ui.onResult, onError: ui.onError }); - - // Starting B aborts A's underlying requests. - const requestA = fetches.calls.find((call) => call.profileId === "a"); - assert.equal(requestA.signal.aborted, true); - - // B finishes first and is applied. - fetches.resolveFor("b", { status: { currentProvider: "provider-b" }, backups: { backups: ["b-backup"] } }); - assert.equal(await refreshB, true); - assert.deepEqual(ui.applied.map((entry) => entry.profileId), ["b"]); - assert.deepEqual(ui.loading, [true, true, false]); - - // A finishes last; its results, loading transitions, and errors must be discarded. - fetches.resolveFor("a", { status: { currentProvider: "provider-a" }, backups: { backups: ["a-backup"] } }); - assert.equal(await refreshA, false); - assert.deepEqual(ui.applied.map((entry) => entry.profileId), ["b"]); - assert.deepEqual(ui.applied[0].status, { currentProvider: "provider-b" }); - assert.deepEqual(ui.errors, []); - assert.deepEqual(ui.loading, [true, true, false]); -}); - -test("profile refresh race: a stale request failing late never surfaces an error", async () => { - const fetches = createRecordingFetches(); - const ui = createUiRecorder(); - const refresh = createProfileRefresh({ fetchStatus: fetches.fetchStatus, fetchBackups: fetches.fetchBackups }); - - const refreshA = refresh({ profileId: "a", onLoading: ui.onLoading, onResult: ui.onResult, onError: ui.onError }); - const refreshB = refresh({ profileId: "b", onLoading: ui.onLoading, onResult: ui.onResult, onError: ui.onError }); - - fetches.resolveFor("b", { status: { currentProvider: "provider-b" } }); - assert.equal(await refreshB, true); - - fetches.rejectFor("a", new Error("profile A backend exploded")); - assert.equal(await refreshA, false); - assert.deepEqual(ui.errors, []); - assert.deepEqual(ui.applied.map((entry) => entry.profileId), ["b"]); -}); - -test("profile refresh surfaces errors from the latest request only", async () => { - const fetches = createRecordingFetches(); - const ui = createUiRecorder(); - const refresh = createProfileRefresh({ fetchStatus: fetches.fetchStatus, fetchBackups: fetches.fetchBackups }); - - const refreshA = refresh({ profileId: "a", onLoading: ui.onLoading, onResult: ui.onResult, onError: ui.onError }); - fetches.rejectFor("a", new Error("profile A is unreachable")); - assert.equal(await refreshA, false); - assert.deepEqual(ui.errors, ["profile A is unreachable"]); - assert.deepEqual(ui.applied, []); - assert.deepEqual(ui.loading, [true, false]); -}); - -test("profile refresh quiet mode leaves the loading indicator untouched unless it is the latest", async () => { - const fetches = createRecordingFetches(); - const ui = createUiRecorder(); - const refresh = createProfileRefresh({ fetchStatus: fetches.fetchStatus, fetchBackups: fetches.fetchBackups }); - - const refreshA = refresh({ profileId: "a", onLoading: ui.onLoading, onResult: ui.onResult, onError: ui.onError }); - const quietB = refresh({ profileId: "b", showLoading: false, onLoading: ui.onLoading, onResult: ui.onResult, onError: ui.onError }); - - fetches.resolveFor("b", { status: { currentProvider: "provider-b" } }); - assert.equal(await quietB, true); - // The quiet refresh never raised the indicator but still settles it as the latest request. - assert.deepEqual(ui.loading, [true, false]); - - fetches.resolveFor("a", { status: { currentProvider: "provider-a" } }); - assert.equal(await refreshA, false); - assert.deepEqual(ui.loading, [true, false]); -}); diff --git a/test/sync-service.test.js b/test/sync-service.test.js index d4af1e5..b76d88a 100644 --- a/test/sync-service.test.js +++ b/test/sync-service.test.js @@ -3580,6 +3580,91 @@ test("restoreBackup rejects escaped and non-rollout session manifest targets", a ); }); +test("restoreBackup rejects rollout targets that traverse a directory link", async () => { + const { codexHome } = await makeTempCodexHome(); + await writeConfig(codexHome, 'model_provider = "openai"'); + const configPath = path.join(codexHome, "config.toml"); + const sessionsRoot = path.join(codexHome, "sessions"); + const realDirectory = path.join(sessionsRoot, "2026", "linked-target"); + const linkedDirectory = path.join(sessionsRoot, "linked-alias"); + const realPath = path.join(realDirectory, "rollout-linked.jsonl"); + await fs.mkdir(realDirectory, { recursive: true }); + await writeRollout(realPath, "thread-linked", "apigather"); + const { changes } = await collectSessionChanges(codexHome, "openai"); + const backupDir = await createBackup({ + codexHome, + targetProvider: "openai", + sessionChanges: changes, + configPath + }); + await fs.symlink(realDirectory, linkedDirectory, process.platform === "win32" ? "junction" : "dir"); + const manifestPath = path.join(backupDir, "session-meta-backup.json"); + const manifest = JSON.parse(await fs.readFile(manifestPath, "utf8")); + manifest.files[0].path = path.join(linkedDirectory, "rollout-linked.jsonl"); + await fs.writeFile(manifestPath, JSON.stringify(manifest), "utf8"); + + await assert.rejects( + restoreBackup(backupDir, codexHome, { + restoreConfig: false, + restoreDatabase: false, + restoreSessions: true + }), + /symbolic link or reparse point/ + ); +}); + +test("restoreBackup revalidates a rollout target immediately before restore", async () => { + const { root, codexHome } = await makeTempCodexHome(); + await writeConfig(codexHome, 'model_provider = "openai"'); + const sessionDirectory = path.join(codexHome, "sessions", "2026", "swap-target"); + const originalDirectory = path.join(codexHome, "sessions", "2026", "swap-original"); + const sessionPath = path.join(sessionDirectory, "rollout-swap.jsonl"); + await fs.mkdir(sessionDirectory, { recursive: true }); + await writeRollout(sessionPath, "thread-swap", "apigather"); + const { changes } = await collectSessionChanges(codexHome, "openai"); + const backupDir = await createBackup({ + codexHome, + targetProvider: "openai", + sessionChanges: changes, + configPath: path.join(codexHome, "config.toml") + }); + await writeRollout(sessionPath, "thread-swap", "openai"); + + const outsideDirectory = path.join(root, "outside-swap-target"); + const outsidePath = path.join(outsideDirectory, "rollout-swap.jsonl"); + await fs.mkdir(outsideDirectory, { recursive: true }); + await writeRollout(outsidePath, "outside-thread", "outside-provider"); + const outsideBefore = await fs.readFile(outsidePath, "utf8"); + let swapped = false; + try { + await assert.rejects( + restoreBackup(backupDir, codexHome, { + restoreConfig: false, + restoreDatabase: false, + restoreSessions: true, + onBeforeSessionRestore: async () => { + if (swapped) return; + swapped = true; + await fs.rename(sessionDirectory, originalDirectory); + await fs.symlink( + outsideDirectory, + sessionDirectory, + process.platform === "win32" ? "junction" : "dir" + ); + } + }), + (error) => error instanceof AggregateError + && error.failures.some((failure) => /symbolic link or reparse point/.test(failure.message)) + ); + assert.equal(await fs.readFile(outsidePath, "utf8"), outsideBefore); + } finally { + if (swapped) { + await fs.unlink(sessionDirectory); + await fs.rename(originalDirectory, sessionDirectory); + } + } +}); + test("Windows restore attempts every rollout even when one target is locked", async () => { if (process.platform !== "win32") { return; diff --git a/test/web-server.test.js b/test/web-server.test.js index 6e72b76..9990e17 100644 --- a/test/web-server.test.js +++ b/test/web-server.test.js @@ -44,7 +44,7 @@ async function startFixture(services = {}, options = {}) { const root = await fs.mkdtemp(path.join(os.tmpdir(), "codex-provider-sync-web-")); await fs.writeFile( path.join(root, "index.html"), - 'fixture', + 'fixture', "utf8" ); const stateStore = options.stateStore ?? createMemoryWebUiState({ @@ -136,6 +136,135 @@ function statusFixture(overrides = {}) { }; } +function coreStatusFixture(profile, overrides = {}) { + return { + schemaVersion: 1, + snapshotAt: "2026-08-25T00:00:00.000Z", + storageRevision: "storage-r1", + profile: { id: profile.id, revision: profile.revision }, + currentProvider: "openai", + rolloutCounts: { sessions: { openai: 1 }, archived_sessions: {} }, + sqliteCounts: { sessions: { openai: 1 }, archived_sessions: {} }, + codexHomeSource: "profile", + sqliteHomeSource: "default", + backupSummary: { count: 0, totalBytes: 0 }, + pendingRecovery: false, + pendingTransactions: [], + operationInProgress: null, + rolloutScanComplete: true, + lockedRolloutFiles: [], + ...overrides + }; +} + +test("versioned Core HTTP endpoint preserves pairing, correlation and canonical errors", async () => { + let statusError = null; + const handle = await startFixture({ + coreFacade: { + async getStatus(input) { + if (statusError) throw statusError; + const profile = handle.stateStore.getProfile(input.profile.profileId); + return coreStatusFixture(profile); + } + } + }); + try { + const profile = handle.stateStore.getProfile("default"); + const envelope = { + protocolVersion: 1, + requestId: "core-status-request", + method: "getStatus", + payload: { profile: { profileId: profile.id, profileRevision: profile.revision } } + }; + const anonymous = await api(handle, "/api/core", envelope); + assert.equal(anonymous.status, 403); + + const { credential } = await handle.pair(); + const response = await api(handle, "/api/core", envelope, credential); + assert.equal(response.status, 200); + assert.equal(response.payload.protocolVersion, 1); + assert.equal(response.payload.requestId, envelope.requestId); + assert.equal(response.payload.ok, true); + assert.equal(response.payload.result.profile.id, "default"); + assert.equal("codexHome" in response.payload.result, false); + assert.equal("sqliteHome" in response.payload.result, false); + + const pathInjection = await api(handle, "/api/core", { + ...envelope, + requestId: "core-path-injection", + payload: { ...envelope.payload, codexHome: "C:\\private" } + }, credential); + assert.equal(pathInjection.status, 400); + assert.equal(pathInjection.payload.ok, false); + assert.equal(pathInjection.payload.error.code, "INVALID_INPUT"); + assert.doesNotMatch(JSON.stringify(pathInjection.payload), /C:\\\\private/); + + statusError = Object.assign(new Error("token=secret C:\\private\\journal.json"), { + code: "INTERNAL_ERROR", + details: { path: "C:\\private\\journal.json", token: "secret" } + }); + const failed = await api(handle, "/api/core", { + ...envelope, + requestId: "core-safe-error" + }, credential); + assert.equal(failed.status, 500); + assert.equal(failed.payload.ok, false); + assert.equal(failed.payload.requestId, "core-safe-error"); + assert.deepEqual(failed.payload.error, { + code: "INTERNAL_ERROR", + message: "An internal error occurred.", + severity: "fatal", + retryable: false, + recoveryRequired: false + }); + assert.doesNotMatch(JSON.stringify(failed.payload), /secret|private|journal/i); + assert.doesNotMatch(JSON.stringify(handle.getActivity()), /secret|private|journal/i); + + const applyInjection = await api(handle, "/api/core", { + protocolVersion: 1, + requestId: "core-apply-injection", + method: "applySync", + payload: { schemaVersion: 1, planId: "opaque", provider: "openai" } + }, credential); + assert.equal(applyInjection.status, 400); + assert.equal(applyInjection.payload.error.code, "INVALID_INPUT"); + + const wrongContentType = await request({ + origin: handle.origin, + pathname: "/api/core", + method: "POST", + body: envelope, + headers: { + Origin: handle.origin, + "X-Codex-Provider-Device": credential, + "Content-Type": "text/plain" + } + }); + assert.equal(wrongContentType.status, 415); + assert.equal(wrongContentType.payload.ok, false); + assert.equal(wrongContentType.payload.error.code, "INVALID_INPUT"); + + const incompatible = await api(handle, "/api/core", { + ...envelope, + protocolVersion: 99, + requestId: "core-protocol-mismatch" + }, credential); + assert.equal(incompatible.status, 400); + assert.equal(incompatible.payload.requestId, "core-protocol-mismatch"); + assert.equal(incompatible.payload.error.code, "PROTOCOL_VERSION_MISMATCH"); + + const oversized = await api(handle, "/api/core", { + ...envelope, + requestId: "core-oversized", + padding: "x".repeat(70 * 1024) + }, credential); + assert.equal(oversized.status, 413); + assert.equal(oversized.payload.code, "REQUEST_TOO_LARGE"); + } finally { + await handle.close(); + } +}); + test("status alignment follows the current provider without requiring equal inventory counts", async () => { let currentStatus = statusFixture({ currentProvider: "dal", @@ -185,10 +314,18 @@ test("anonymous HTML contains no API or pairing credential and write APIs requir const pairingToken = handle.issuePairing(); const page = await request({ origin: handle.origin }); assert.equal(page.status, 200); + const csp = page.headers["content-security-policy"]; + const scriptNonce = csp.match(/script-src 'self' 'nonce-([^']+)'/); + const styleNonce = csp.match(/style-src 'self' 'nonce-([^']+)'/); + assert.ok(scriptNonce); + assert.ok(styleNonce); + assert.equal(scriptNonce[1], styleNonce[1]); + assert.match(page.text, new RegExp(`nonce="${scriptNonce[1]}"`)); + assert.doesNotMatch(page.text, /__CPS_CSP_NONCE__/); + assert.doesNotMatch(csp, /unsafe-inline/); assert.doesNotMatch(page.text, new RegExp(pairingToken)); assert.doesNotMatch(page.text, /apiToken|X-Codex-Provider-Token/); assert.doesNotMatch(page.text, /__CODEX_PROVIDER_SYNC_BOOTSTRAP__/); - assert.match(page.headers["content-security-policy"], /script-src 'self';/); const denied = await api(handle, "/api/status", { profileId: "default" }, "wrong-token"); assert.equal(denied.status, 403); diff --git a/test/workspace-boundaries.test.js b/test/workspace-boundaries.test.js index b336b75..bfcfac7 100644 --- a/test/workspace-boundaries.test.js +++ b/test/workspace-boundaries.test.js @@ -21,7 +21,7 @@ async function manifest(relativePath) { return JSON.parse(await fs.readFile(path.join(repositoryRoot, relativePath, "package.json"), "utf8")); } -test("root npm package remains an independent Node 16 CLI tarball surface", async () => { +test("root npm package remains a Node 16 surface with only the audited shared Web runtime", async () => { const root = await manifest(""); assert.equal(root.name, "@dailin521/codex-provider-sync"); assert.equal(root.engines.node, ">=16.20.2"); @@ -29,7 +29,11 @@ test("root npm package remains an independent Node 16 CLI tarball surface", asyn assert.deepEqual(root.dependencies ?? {}, {}); assert.ok(root.files.includes("src")); assert.ok(root.files.includes("web/dist")); - assert.equal(root.files.some((entry) => entry.startsWith("apps") || entry.startsWith("packages")), false); + assert.equal(root.files.some((entry) => entry.startsWith("apps")), false); + assert.deepEqual( + root.files.filter((entry) => entry.startsWith("packages")).sort(), + ["packages/contracts/dist", "packages/core/src"] + ); }); test("all C4 workspaces are private and direct dependency versions are exact", async () => { diff --git a/tsconfig.base.json b/tsconfig.base.json index 1c08b8c..2d411dc 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -3,6 +3,7 @@ "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext", + "jsx": "react-jsx", "lib": [ "ES2022", "DOM", diff --git a/web/dist/assets/index-C3tdtTcI.css b/web/dist/assets/index-C3tdtTcI.css deleted file mode 100644 index bcac7f5..0000000 --- a/web/dist/assets/index-C3tdtTcI.css +++ /dev/null @@ -1 +0,0 @@ -:root{color:#172033;font-synthesis:none;text-rendering:optimizelegibility;--accent:#2463eb;--accent-strong:#174fc8;--accent-soft:#edf3ff;--success:#11865b;--success-soft:#eaf8f2;--warning:#b36309;--warning-soft:#fff7e6;--danger:#c43c45;--danger-soft:#fff0f0;--text:#172033;--muted:#687388;--subtle:#8a94a7;--border:#dfe4ec;--border-strong:#cdd4df;--surface:#fff;--sidebar:#fbfcfe;--mono:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;background:#f5f7fa;font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif}*{box-sizing:border-box}body{background:#f5f7fa;min-width:320px;min-height:100vh;margin:0}button,input,select{font:inherit}button{color:inherit}button:focus-visible,input:focus-visible,select:focus-visible{outline-offset:1px;outline:3px solid #2463eb2e}.app-shell{grid-template-rows:68px minmax(0,1fr);grid-template-columns:198px minmax(0,1fr);min-height:100vh;display:grid}.app-header{background:var(--surface);border-bottom:1px solid var(--border);z-index:30;grid-column:1/-1;justify-content:space-between;align-items:center;padding:0 24px;display:flex;position:sticky;top:0}.brand,.header-actions,.service-state,.brand-mark,.nav-item,.sidebar-provider-value,.path-input-wrap,.button,.alignment-state,.column-label,.warning-row,.execution-head,.backup-assurance,.text-button,.backup-row,.backup-root-line,.live-operation,.modal-callout,.restore-summary,.toast>div{align-items:center;display:flex}.brand{gap:11px}.brand-mark{color:#fff;background:#202a3d;border-radius:9px;justify-content:center;width:36px;height:36px;box-shadow:0 5px 13px #17203329}.brand-name{letter-spacing:-.01em;font-size:15px;font-weight:720}.brand-subtitle{color:var(--muted);margin-top:2px;font-size:11px}.header-actions{gap:16px}.service-state{color:#4f5b70;gap:8px;font-size:12px}.status-dot{background:#9aa4b5;border-radius:50%;flex:none;width:7px;height:7px;box-shadow:0 0 0 3px #9aa4b51f}.status-dot--success{background:var(--success);box-shadow:0 0 0 3px #11865b1f}.status-dot--warning{background:#db820d;box-shadow:0 0 0 3px #db820d1f}.status-dot--danger{background:var(--danger);box-shadow:0 0 0 3px #c43c451f}.sidebar{background:var(--sidebar);border-right:1px solid var(--border);flex-direction:column;grid-area:2/1;height:calc(100vh - 68px);padding:19px 12px 16px;display:flex;position:sticky;top:68px}.navigation{gap:4px;display:grid}.nav-item{color:#657087;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;gap:10px;width:100%;padding:10px 12px;font-size:13px}.nav-item:hover{color:#354157;background:#f0f3f8}.nav-item--active{background:var(--accent-soft);color:#174fc8;box-shadow:inset 2px 0 0 var(--accent);font-weight:650}.sidebar-foot{border-top:1px solid var(--border);margin-top:auto;padding:14px 10px 0}.sidebar-provider-label{color:var(--subtle);text-transform:uppercase;letter-spacing:.08em;font-size:10px}.sidebar-provider-value{font-family:var(--mono);gap:8px;margin-top:8px;font-size:12px;font-weight:700}.sidebar-version{color:#a0a8b6;margin-top:12px;font-size:10px}.main-area{grid-area:2/2;min-width:0}.storage-bar{border-bottom:1px solid var(--border);z-index:20;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);background:#ffffffeb;grid-template-columns:minmax(220px,.8fr) minmax(260px,1.2fr) auto auto auto;align-items:end;gap:10px;min-height:88px;padding:15px 26px 16px;display:grid;position:sticky;top:68px}.path-field{color:#455168;gap:6px;min-width:0;font-size:11px;font-weight:650;display:grid}.path-field span small{color:var(--subtle);font-weight:450}.path-input-wrap{border:1px solid var(--border-strong);color:#8791a3;background:#fff;border-radius:7px;gap:8px;height:36px;padding:0 10px}.path-input-wrap:focus-within{border-color:#8eaff6;box-shadow:0 0 0 3px #2463eb17}.path-input-wrap input,.path-input-wrap select{color:#273247;width:100%;min-width:0;font-family:var(--mono);background:0 0;border:0;outline:0;font-size:11px}.storage-refresh{height:36px}.view-content{max-width:1480px;margin:0 auto;padding:24px 26px 42px}.history-view{flex-direction:column;height:calc(100dvh - 156px);min-height:0;display:flex;overflow:hidden}h1,h2,p{margin-top:0}h1{letter-spacing:-.025em;margin-bottom:6px;font-size:25px}h2{letter-spacing:-.014em;margin-bottom:5px;font-size:16px}.section-title-row{justify-content:space-between;align-items:flex-start;gap:18px;display:flex}.section-title-row p,.execution-head p,.page-intro p{color:var(--muted);margin-bottom:0;font-size:12px;line-height:1.55}.section-title-row--compact{align-items:center}.button{cursor:pointer;border:1px solid #0000;border-radius:7px;justify-content:center;gap:7px;min-height:36px;padding:0 13px;font-size:12px;font-weight:650;transition:background .15s,border-color .15s,box-shadow .15s,transform .15s}.button:hover:not(:disabled){transform:translateY(-1px)}.button:disabled{opacity:.48;cursor:not-allowed}.button--primary{color:#fff;background:var(--accent);border-color:var(--accent);box-shadow:0 5px 12px #2463eb2e}.button--primary:hover:not(:disabled){background:var(--accent-strong)}.button--secondary{color:#3d4960;border-color:var(--border-strong);background:#fff;box-shadow:0 1px 2px #1720330a}.button--secondary:hover:not(:disabled){background:#f8faff;border-color:#b7c2d2}.button--quiet{color:#3e4b62;background:#f5f7fa;border-color:#edf0f5}.button--danger{color:#fff;background:var(--danger);border-color:var(--danger)}.button--compact{min-height:31px;padding:0 10px;font-size:11px}.text-button{color:var(--accent);cursor:pointer;background:0 0;border:0;gap:3px;font-size:11px;font-weight:650}.icon-button{cursor:pointer;width:32px;height:32px;color:var(--muted);background:0 0;border:0;border-radius:6px;place-items:center;display:grid}.icon-button:hover{background:#f1f3f7}.status-panel,.data-section,.recent-backups,.backup-list-section,.activity-console{background:var(--surface);border:1px solid var(--border);border-radius:10px;box-shadow:0 1px 2px #17203306}.status-panel{padding:20px 22px 21px}.alignment-state{border:1px solid var(--border);border-radius:6px;gap:7px;min-height:30px;padding:0 10px;font-size:11px;font-weight:650}.alignment-state--success{color:var(--success);background:var(--success-soft);border-color:#bfe4d4}.alignment-state--warning{color:var(--warning);background:var(--warning-soft);border-color:#ead2a4}.summary-strip{border-top:1px solid var(--border);border-bottom:1px solid var(--border);grid-template-columns:repeat(4,1fr);margin-top:20px;display:grid}.summary-item{border-right:1px solid var(--border);min-width:0;padding:15px 18px}.summary-item:first-child{padding-left:0}.summary-item:last-child{border-right:0}.summary-item>span{color:var(--muted);font-size:10px;display:block}.summary-item strong{letter-spacing:-.025em;text-overflow:ellipsis;margin-top:5px;font-size:19px;display:block;overflow:hidden}.summary-item small{color:var(--subtle);white-space:nowrap;text-overflow:ellipsis;margin-top:3px;font-size:10px;display:block;overflow:hidden}.distribution-grid{grid-template-columns:minmax(0,1fr) 1px minmax(0,1fr);gap:22px;padding-top:19px;display:grid}.distribution-divider{background:var(--border)}.column-label{color:#3f4a5f;text-transform:uppercase;letter-spacing:.05em;gap:7px;margin-bottom:14px;font-size:11px;font-weight:700}.distribution-block+.distribution-block{margin-top:16px}.distribution-heading,.distribution-meta{justify-content:space-between;gap:12px;display:flex}.distribution-heading{color:var(--muted);margin-bottom:8px;font-size:11px}.distribution-heading strong{color:#3c485e}.distribution-list{gap:8px;display:grid}.distribution-meta{color:var(--muted);font-family:var(--mono);margin-bottom:5px;font-size:10px}.provider-name{color:#303b50}.bar-track{background:#edf0f5;border-radius:99px;height:5px;overflow:hidden}.bar-fill{border-radius:inherit;background:#9eabc0;height:100%;display:block}.bar-fill--current{background:var(--accent)}.empty-inline{color:var(--subtle);font-size:11px}.warning-stack{gap:7px;margin-top:12px;display:grid}.warning-row{border:1px solid;border-radius:7px;align-items:flex-start;gap:10px;padding:10px 13px;font-size:11px}.warning-row svg{flex:none;margin-top:1px}.warning-row div{gap:2px;display:grid}.warning-row span{color:#6e5d47;word-break:break-word;line-height:1.5}.warning-row--warning{background:var(--warning-soft);color:var(--warning);border-color:#ebd7ae}.warning-row--danger{background:var(--danger-soft);color:var(--danger);border-color:#efc2c4}.warning-row--info{color:#2463a7;background:#eef6ff;border-color:#c9def8}.warning-row--info span{color:#4f6a89}.overview-lower-grid{grid-template-columns:minmax(0,1fr) 360px;align-items:start;gap:18px;margin-top:18px;display:grid}.overview-main-column{grid-template-columns:minmax(0,1fr);gap:18px;width:100%;min-width:0;display:grid}.data-section,.recent-backups{min-width:0;padding:18px 20px}.table-scroll{margin-top:15px;overflow-x:auto}.data-table{border-collapse:collapse;width:100%;font-size:11px}.data-table th{color:var(--muted);border-top:1px solid var(--border);border-bottom:1px solid var(--border);text-align:left;white-space:nowrap;background:#f8fafc;padding:9px 10px;font-weight:650}.data-table td{color:#465268;vertical-align:top;border-bottom:1px solid #edf0f4;padding:11px 10px}.data-table tbody tr:last-child td{border-bottom:0}.path-cell{max-width:260px;font-family:var(--mono);word-break:break-all;color:#263249!important}.table-empty{text-align:center;color:var(--subtle)!important;padding:25px!important}.execution-panel{background:#fff;border:1px solid #cdd8e9;border-radius:10px;padding:19px;position:sticky;top:174px;box-shadow:0 9px 24px #26375312}.execution-head{justify-content:space-between;align-items:flex-start;gap:14px}.execution-head>svg{color:var(--accent);margin-top:2px}.segmented{background:#f1f4f8;border-radius:8px;grid-template-columns:1fr 1fr;gap:4px;margin-top:17px;padding:4px;display:grid}.segmented-option{min-width:0;color:var(--muted);cursor:pointer;text-align:left;background:0 0;border:1px solid #0000;border-radius:6px;gap:3px;padding:9px 8px;display:grid}.segmented-option span{font-size:11px;font-weight:700}.segmented-option small{color:var(--subtle);font-size:9px}.segmented-option--active{color:#263249;background:#fff;border-color:#dce3ee;box-shadow:0 2px 5px #17203312}.form-grid{grid-template-columns:minmax(0,1fr) 100px;gap:12px;margin-top:15px;display:grid}.form-field{color:#4c586d;align-content:start;gap:6px;font-size:10px;font-weight:650;display:grid}.form-field select,.form-field input,.custom-model-option input[type=text]{color:#273247;border:1px solid var(--border-strong);background:#fff;border-radius:6px;width:100%;height:35px;padding:0 9px;font-size:11px}.form-field small{color:var(--subtle);font-weight:450;line-height:1.35}.form-field .field-error{color:var(--danger)}.manual-provider-row{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:7px;margin-top:9px;display:grid}.manual-provider-row input{color:#273247;border:1px solid var(--border-strong);min-width:0;height:32px;font-family:var(--mono);background:#fff;border-radius:6px;padding:0 9px;font-size:10px}.manual-remove{color:var(--danger);cursor:pointer;background:0 0;border:0;grid-column:1/-1;justify-self:start;padding:0;font-size:9px}.model-options,.restore-options{border:1px solid var(--border);border-radius:7px;margin:16px 0 0;padding:13px}.model-options legend,.restore-options legend{color:#566176;padding:0 5px;font-size:10px;font-weight:700}.model-options>label,.restore-options>label{color:#364258;cursor:pointer;align-items:flex-start;gap:8px;padding:7px 0;font-size:11px;display:flex}.model-options input[type=radio],.restore-options input[type=checkbox]{accent-color:var(--accent);margin:2px 0 0}.model-options label>span,.restore-options label>span{flex:1;gap:2px;min-width:0;display:grid}.model-options small,.restore-options small{color:var(--muted);font-size:9px;font-weight:450;line-height:1.4}.custom-model-option input[type=text]{margin-top:5px}.backup-assurance{color:var(--success);gap:7px;margin-top:14px;font-size:10px}.execute-button{width:100%;height:40px;margin-top:14px}.backup-rows{border-top:1px solid var(--border);margin-top:13px}.backup-row{border-bottom:1px solid #edf0f4;gap:11px;min-width:0;padding:11px 0}.backup-row:last-child{border-bottom:0}.backup-icon{color:#5e6a80;background:#f1f4f8;border-radius:7px;flex:none;place-items:center;width:30px;height:30px;display:grid}.backup-main{flex:1;gap:2px;min-width:0;display:grid}.backup-main strong{font-size:11px}.backup-main span,.backup-size{color:var(--muted);font-size:10px}.empty-state{color:var(--subtle);text-align:center;padding:25px 0 12px;font-size:11px}.page-intro{justify-content:space-between;align-items:center;gap:24px;padding:4px 2px 20px;display:flex}.prune-control{color:var(--muted);align-items:center;gap:10px;font-size:11px;display:flex}.prune-control input{border:1px solid var(--border-strong);text-align:center;border-radius:6px;width:64px;height:34px}.backup-list-section{overflow:hidden}.backup-root-line{border-bottom:1px solid var(--border);color:#59657a;background:#f8fafc;gap:8px;padding:13px 17px;font-size:10px}.backup-root-line span{text-overflow:ellipsis;min-width:0;font-family:var(--mono);white-space:nowrap;flex:1;overflow:hidden}.backup-root-line strong{color:#465168;font-size:10px}.full-backup-row{border-bottom:1px solid var(--border);grid-template-columns:190px 230px minmax(220px,1fr) auto;align-items:center;gap:22px;padding:16px 18px;display:grid}.full-backup-row:last-child{border-bottom:0}.backup-date,.backup-source{gap:5px;min-width:0;display:grid}.backup-date strong{font-size:12px}.backup-date span,.backup-source span{color:var(--subtle);font-size:9px}.backup-facts{color:var(--muted);gap:15px;font-size:10px;display:flex}.backup-facts span{gap:3px;display:grid}.backup-facts strong{color:#344057}.backup-source code{color:#445169;font-family:var(--mono);text-overflow:ellipsis;white-space:nowrap;font-size:9px;overflow:hidden}.backup-row-actions{color:var(--muted);justify-content:flex-end;align-items:center;gap:12px;font-size:10px;display:flex}.large-empty{color:var(--subtle);justify-items:center;gap:7px;padding:70px 20px;display:grid}.large-empty strong{color:#59657a;font-size:13px}.large-empty span{font-size:11px}.live-operation{color:var(--warning);gap:7px;font-size:11px}.activity-console{overflow:hidden}.console-head{color:#b6c2d4;font-family:var(--mono);background:#202a3b;border-bottom:1px solid #354156;justify-content:space-between;padding:12px 15px;font-size:10px;display:flex}.console-body{content-visibility:auto;background:#17202f;min-height:440px;max-height:calc(100vh - 250px);padding:7px 0;overflow:auto}.console-row{color:#d7deea;font-family:var(--mono);border-bottom:1px solid #ffffff09;grid-template-columns:150px 70px minmax(220px,1fr) minmax(0,1.2fr);gap:12px;padding:8px 15px;font-size:10px;line-height:1.45;display:grid}.console-row time,.console-detail{color:#7e8ca3}.console-level{color:#8fa3c1;text-transform:uppercase}.console-row--success .console-level{color:#54d19f}.console-row--error .console-level{color:#ff8790}.console-row--progress .console-level{color:#79a8ff}.console-empty{color:#708098;font-family:var(--mono);padding:30px 15px;font-size:11px}.modal-backdrop{z-index:100;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background:#141c2b75;place-items:center;padding:20px;display:grid;position:fixed;inset:0}.modal{background:#fff;border:1px solid #cfd6e1;border-radius:12px;width:min(600px,100%);max-height:calc(100vh - 40px);animation:.16s ease-out modal-in;overflow:auto;box-shadow:0 24px 70px #0e172840}.modal-head{border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:17px 19px;display:flex}.modal-head h2{margin:0;font-size:16px}.modal-body{padding:18px 19px}.modal-actions{border-top:1px solid var(--border);background:#f8fafc;justify-content:flex-end;gap:9px;padding:13px 19px;display:flex}.modal-callout{color:#9a5909;background:var(--warning-soft);border:1px solid #ead4aa;border-radius:7px;align-items:flex-start;gap:10px;padding:11px 12px}.modal-callout>svg{flex:none;margin-top:1px}.modal-callout div{gap:3px;display:grid}.modal-callout span{color:#735f43;word-break:break-word;font-size:10px;line-height:1.55}.modal-callout--danger{color:var(--danger);background:var(--danger-soft);border-color:#efc1c4}.modal-callout--warning{margin-top:14px}.operation-scope{border-top:1px solid var(--border);margin:16px 0 0}.operation-scope>div{border-bottom:1px solid #edf0f4;grid-template-columns:130px minmax(0,1fr);gap:14px;padding:9px 0;font-size:11px;display:grid}.operation-scope dt{color:var(--muted)}.operation-scope dd{color:#2d394f;font-family:var(--mono);word-break:break-word;margin:0}.operation-scope small{color:var(--subtle)}.restore-summary{border-bottom:1px solid var(--border);align-items:flex-start;gap:10px;padding-bottom:13px}.restore-summary div{gap:4px;min-width:0;display:grid}.restore-summary strong{font-size:12px}.restore-summary code{color:var(--muted);font-family:var(--mono);word-break:break-all;font-size:9px}.restore-options{margin-bottom:14px}.profile-form{gap:12px;display:grid}.profile-form label{color:#4c586d;gap:6px;font-size:10px;font-weight:650;display:grid}.profile-form input{color:#273247;border:1px solid var(--border-strong);width:100%;height:36px;font:11px var(--mono);border-radius:6px;padding:0 10px}.access-gate{color:#344057;text-align:center;background:#f5f7fb;place-content:center;justify-items:center;gap:12px;min-height:100vh;padding:24px;display:grid}.access-gate svg{color:var(--accent)}.access-gate h1{margin:0;font-size:22px}.access-gate p{max-width:520px;color:var(--muted);margin:0;line-height:1.6}.access-gate code{color:#273247;border:1px solid var(--border);background:#fff;border-radius:6px;padding:8px 12px}.toast{z-index:120;border:1px solid var(--border-strong);border-left:3px solid var(--accent);background:#fff;border-radius:8px;justify-content:space-between;align-items:flex-start;gap:12px;width:min(390px,100vw - 44px);padding:13px 14px;animation:.2s ease-out toast-in;display:flex;position:fixed;bottom:22px;right:22px;box-shadow:0 15px 40px #161f302e}.toast>div{align-items:flex-start;gap:9px}.toast span{gap:3px;display:grid}.toast strong{font-size:12px}.toast small{color:var(--muted);word-break:break-word;font-size:10px;line-height:1.4}.toast button{color:var(--muted);cursor:pointer;background:0 0;border:0}.toast--success{border-left-color:var(--success)}.toast--success>div>svg{color:var(--success)}.toast--error{border-left-color:var(--danger)}.toast--error>div>svg{color:var(--danger)}.toast--warning{border-left-color:var(--warning)}.toast--warning>div>svg{color:var(--warning)}.spin{animation:1s linear infinite spin}.history-toolbar{grid-template-columns:minmax(220px,1.7fr) repeat(3,minmax(130px,1fr));gap:9px;margin-bottom:14px;display:grid}.history-toolbar input,.history-toolbar select{border:1px solid var(--border-strong);width:100%;min-width:0;color:var(--text);font:inherit;background:#fff;border-radius:7px;padding:10px 11px}.history-error{color:var(--danger);background:#fff5f3;border:1px solid #f2c9c2;border-radius:7px;align-items:center;gap:8px;margin-bottom:12px;padding:10px 12px;font-size:12px;display:flex}.history-layout{border:1px solid var(--border);background:#fff;border-radius:9px;flex:auto;grid-template-columns:minmax(300px,.8fr) minmax(0,1.4fr);height:100%;min-height:0;display:grid;overflow:hidden}.history-list-panel{border-right:1px solid var(--border);background:#fbfcfe;flex-direction:column;min-width:0;min-height:0;display:flex;overflow:hidden}.history-list-head{color:var(--muted);border-bottom:1px solid var(--border);justify-content:space-between;padding:13px 15px;font-size:11px;display:flex}.history-list{overscroll-behavior:contain;flex:auto;height:0;min-height:0;overflow-y:auto}.history-session-row{text-align:left;border:0;border-bottom:1px solid var(--border);width:100%;color:var(--text);cursor:pointer;background:0 0;padding:13px 15px;display:block}.history-session-row:hover,.history-session-row--selected{background:#eef5ff}.history-session-top{justify-content:space-between;gap:9px;display:flex}.history-session-top strong{text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.history-session-top time{color:var(--subtle);flex:none;font-size:10px}.history-session-row p{color:var(--muted);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:7px 0;font-size:11px;line-height:1.45;display:-webkit-box;overflow:hidden}.history-session-meta{color:var(--subtle);flex-wrap:wrap;gap:7px;font-size:10px;display:flex}.history-session-meta span:first-child{color:var(--accent)}.history-pagination{border-top:1px solid var(--border);justify-content:space-between;align-items:center;padding:10px 12px;display:flex}.history-pagination span{color:var(--muted);font-size:11px}.history-detail-panel{overscroll-behavior:contain;background:#fff;min-width:0;min-height:0;overflow-y:auto}.history-detail-head{border-bottom:1px solid var(--border);justify-content:space-between;gap:12px;padding:20px 22px 15px;display:flex}.history-detail-head h2{margin:0 0 6px;font-size:17px}.history-detail-head p{color:var(--muted);font:10px/1.4 var(--mono);word-break:break-word;margin:0}.history-detail-head>span{height:fit-content;color:var(--accent);background:#edf4ff;border-radius:4px;flex:none;padding:4px 7px;font-size:10px}.history-truncated{color:#8b631c;background:#fff8e7;border:1px solid #f0dfae;border-radius:6px;align-items:center;gap:7px;margin:14px 22px 0;padding:9px 10px;font-size:11px;display:flex}.message-stream{gap:14px;padding:20px 22px 28px;display:grid}.chat-message{max-width:88%}.chat-message--user{justify-self:end}.chat-message--assistant{justify-self:start}.chat-message-label{color:var(--muted);justify-content:space-between;gap:12px;margin-bottom:5px;font-size:10px;display:flex}.chat-message--user .chat-message-label{color:var(--accent)}.chat-message-label time{color:var(--subtle);font:9px var(--mono)}.chat-message-body{white-space:pre-wrap;word-break:break-word;color:var(--text);border:1px solid var(--border);background:#f5f7fb;border-radius:8px;padding:11px 13px;font-size:12px;line-height:1.6}.chat-message--user .chat-message-body{background:#edf4ff;border-color:#d5e4fb}.chat-message-body code{font:11px var(--mono);background:#2d394f14;border-radius:3px;padding:1px 4px}.chat-message-body pre{color:#f7f9fc;white-space:pre;background:#1f2937;border-radius:5px;margin:8px 0 0;padding:10px;overflow:auto}.chat-message-body pre code{color:inherit;background:0 0;padding:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes modal-in{0%{opacity:0;transform:translateY(8px)scale(.99)}}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}}@media (width<=1120px){.app-shell{grid-template-columns:168px minmax(0,1fr)}.overview-lower-grid{grid-template-columns:1fr}.execution-panel{position:static}.full-backup-row{grid-template-columns:170px 1fr auto}.backup-source{grid-area:2/1/auto/3}.backup-row-actions{grid-area:1/3/3}}@media (width<=820px){.app-shell{display:block}.app-header{height:62px;padding:0 14px}.brand-subtitle,.service-state{display:none}.sidebar{z-index:25;border-right:0;border-bottom:1px solid var(--border);width:100%;height:auto;padding:7px 10px;display:block;position:sticky;top:62px}.navigation{grid-template-columns:repeat(4,1fr);display:grid}.nav-item{justify-content:center;padding:8px}.nav-item--active{box-shadow:inset 0 -2px 0 var(--accent)}.sidebar-foot{display:none}.storage-bar{grid-template-columns:1fr;padding:14px;position:static}.view-content{padding:18px 14px 32px}.summary-strip{grid-template-columns:1fr 1fr}.summary-item{border-bottom:1px solid var(--border)}.summary-item:nth-child(2){border-right:0}.summary-item:nth-child(3),.summary-item:nth-child(4){border-bottom:0}.summary-item:nth-child(3){padding-left:0}.distribution-grid{grid-template-columns:1fr}.distribution-divider{height:1px}.page-intro{flex-direction:column;align-items:flex-start}.full-backup-row{grid-template-columns:1fr auto;gap:12px}.backup-facts,.backup-source{grid-column:1/-1}.backup-row-actions{grid-area:1/2}.console-row{grid-template-columns:115px 62px minmax(180px,1fr)}.console-detail{grid-column:3}.history-toolbar{grid-template-columns:1fr 1fr}.history-toolbar input{grid-column:1/-1}.history-view{height:calc(100dvh - 270px);min-height:520px}.history-layout{grid-template-columns:1fr;min-height:0}.history-list-panel{border-right:0;border-bottom:1px solid var(--border);min-height:0;max-height:40%}.history-detail-panel{min-height:0}}@media (width<=560px){.header-actions .button span{display:none}.brand-name{font-size:13px}.status-panel,.data-section,.recent-backups{padding:16px}.section-title-row{flex-direction:column;align-items:flex-start}.summary-strip{grid-template-columns:1fr}.summary-item{border-right:0;padding-left:0;border-bottom:1px solid var(--border)!important}.summary-item:last-child{border-bottom:0!important}.form-grid,.segmented{grid-template-columns:1fr}.backup-size{display:none}.prune-control{justify-content:space-between;width:100%}.operation-scope>div{grid-template-columns:1fr;gap:4px}.modal{max-height:calc(100vh - 20px)}.modal-backdrop{padding:10px}.history-toolbar{grid-template-columns:1fr}.history-toolbar input{grid-column:auto}.history-view{height:calc(100dvh - 300px);min-height:500px}.history-detail-head,.message-stream{padding-left:15px;padding-right:15px}.chat-message{max-width:96%}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}} diff --git a/web/dist/assets/index-DAOqepUV.js b/web/dist/assets/index-DAOqepUV.js deleted file mode 100644 index 548f897..0000000 --- a/web/dist/assets/index-DAOqepUV.js +++ /dev/null @@ -1,11 +0,0 @@ -var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var ee=Array.isArray;function te(){}var S={H:null,A:null,T:null,S:null},C=Object.prototype.hasOwnProperty;function w(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function T(e,t){return w(e.type,t,e.props)}function E(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ne(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var re=/\/+/g;function D(e,t){return typeof e==`object`&&e&&e.key!=null?ne(``+e.key):t.toString(36)}function ie(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(te,te):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function ae(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,ae(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+D(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(re,`$&/`)+`/`),ae(o,r,i,``,function(e){return e})):o!=null&&(E(o)&&(o=T(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(re,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m){if(n(c)!==null)m=!0,ee||(ee=!0,E());else{var t=n(l);t!==null&&D(x,t.startTime-e)}}}var ee=!1,te=-1,S=5,C=-1;function w(){return g?!0:!(e.unstable_now()-Ct&&w());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&D(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?E():ee=!1}}}var E;if(typeof y==`function`)E=function(){y(T)};else if(typeof MessageChannel<`u`){var ne=new MessageChannel,re=ne.port2;ne.port1.onmessage=T,E=function(){re.postMessage(null)}}else E=function(){_(T,0)};function D(t,n){te=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(te),te=-1):h=!0,D(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,E()))),r},e.unstable_shouldYield=w,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1le||(e.current=ce[le],ce[le]=null,le--)}function M(e,t){le++,ce[le]=e.current,e.current=t}var de=ue(null),fe=ue(null),pe=ue(null),me=ue(null);function he(e,t){switch(M(pe,t),M(fe,e),M(de,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}j(de),M(de,e)}function N(){j(de),j(fe),j(pe)}function P(e){e.memoizedState!==null&&M(me,e);var t=de.current,n=Hd(t,e.type);t!==n&&(M(fe,e),M(de,n))}function ge(e){fe.current===e&&(j(de),j(fe)),me.current===e&&(j(me),Qf._currentValue=se)}var _e,ve;function ye(e){if(_e===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);_e=t&&t[1]||``,ve=-1)`:-1i||c[r]!==l[i]){var u=` -`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{be=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?ye(n):``}function Se(e,t){switch(e.tag){case 26:case 27:case 5:return ye(e.type);case 16:return ye(`Lazy`);case 13:return e.child!==t&&t!==null?ye(`Suspense Fallback`):ye(`Suspense`);case 19:return ye(`SuspenseList`);case 0:case 15:return xe(e.type,!1);case 11:return xe(e.type.render,!1);case 1:return xe(e.type,!0);case 31:return ye(`Activity`);default:return``}}function Ce(e){try{var t=``,n=null;do t+=Se(e,n),n=e,e=e.return;while(e);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}var we=Object.prototype.hasOwnProperty,Te=t.unstable_scheduleCallback,Ee=t.unstable_cancelCallback,De=t.unstable_shouldYield,Oe=t.unstable_requestPaint,ke=t.unstable_now,Ae=t.unstable_getCurrentPriorityLevel,je=t.unstable_ImmediatePriority,Me=t.unstable_UserBlockingPriority,Ne=t.unstable_NormalPriority,Pe=t.unstable_LowPriority,Fe=t.unstable_IdlePriority,Ie=t.log,Le=t.unstable_setDisableYieldValue,Re=null,ze=null;function Be(e){if(typeof Ie==`function`&&Le(e),ze&&typeof ze.setStrictMode==`function`)try{ze.setStrictMode(Re,e)}catch{}}var Ve=Math.clz32?Math.clz32:We,He=Math.log,Ue=Math.LN2;function We(e){return e>>>=0,e===0?32:31-(He(e)/Ue|0)|0}var Ge=256,Ke=262144,qe=4194304;function Je(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Ye(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=Je(n))):i=Je(o):i=Je(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=Je(n))):i=Je(o)):i=Je(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function Xe(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Ze(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Qe(){var e=qe;return qe<<=1,!(qe&62914560)&&(qe=4194304),e}function $e(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function et(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function tt(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),mn=!1;if(pn)try{var hn={};Object.defineProperty(hn,"passive",{get:function(){mn=!0}}),window.addEventListener(`test`,hn,hn),window.removeEventListener(`test`,hn,hn)}catch{mn=!1}var gn=null,_n=null,vn=null;function yn(){if(vn)return vn;var e,t=_n,n=t.length,r,i=`value`in gn?gn.value:gn.textContent,a=i.length;for(e=0;e=Zn),er=` `,tr=!1;function nr(e,t){switch(e){case`keyup`:return Yn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function rr(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var ir=!1;function ar(e,t){switch(e){case`compositionend`:return rr(t);case`keypress`:return t.which===32?(tr=!0,er):null;case`textInput`:return e=t.data,e===er&&tr?null:e;default:return null}}function or(e,t){if(ir)return e===`compositionend`||!Xn&&nr(e,t)?(e=yn(),vn=_n=gn=null,ir=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=Or(n)}}function Ar(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Ar(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function jr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Bt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Bt(e.document)}return t}function Mr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Nr=pn&&`documentMode`in document&&11>=document.documentMode,Pr=null,Fr=null,Ir=null,Lr=!1;function Rr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Lr||Pr==null||Pr!==Bt(r)||(r=Pr,`selectionStart`in r&&Mr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Ir&&Dr(Ir,r)||(Ir=r,r=Ed(Fr,`onSelect`),0>=o,i-=o,Ai=1<<32-Ve(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),I&&Mi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),I&&Mi(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return I&&Mi(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),I&&Mi(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===E&&Aa(l)===r.type){n(e,r.sibling),c=a(r,o.props),La(c,o),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}o.type===y?(c=_i(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=gi(o.type,o.key,o.props,null,e.mode,c),La(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=bi(o,e.mode,c),c.return=e,e=c}return s(e);case E:return o=Aa(o),b(e,r,o,c)}if(oe(o))return h(e,r,o,c);if(ie(o)){if(l=ie(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Ia(o),c);if(o.$$typeof===te)return b(e,r,aa(e,o),c);Ra(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=vi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Fa=0;var i=b(e,t,n,r);return Pa=null,i}catch(t){if(t===wa||t===Ea)throw t;var a=fi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ba=za(!0),Va=za(!1),Ha=!1;function Ua(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Wa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ga(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ka(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=li(e),ci(e,null,n),t}return ai(e,r,t,n),li(e)}function qa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,rt(e,n)}}function Ja(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ya=!1;function Xa(){if(Ya){var e=ha;if(e!==null)throw e}}function Za(e,t,n,r){Ya=!1;var i=e.updateQueue;Ha=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===ma&&(Ya=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ha=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function Qa(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function $a(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=k.T,s={};k.T=s,Fs(e,!1,t,n);try{var c=i(),l=k.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Ps(e,t,va(c,r),pu(e)):Ps(e,t,r,pu(e))}catch(n){Ps(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{A.p=a,o!==null&&s.types!==null&&(o.types=s.types),k.T=o}}function ws(){}function Ts(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=Es(e).queue;Cs(e,a,t,se,n===null?ws:function(){return Ds(e),n(r)})}function Es(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:se,baseState:se,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:se},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Io,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function Ds(e){var t=Es(e);t.next===null&&(t=e.alternate.memoizedState),Ps(e,t.next.queue,{},pu())}function Os(){return ia(Qf)}function ks(){return H().memoizedState}function As(){return H().memoizedState}function js(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ga(n);var r=Ka(t,e,n);r!==null&&(hu(r,t,n),qa(r,t,n)),t={cache:ua()},e.payload=t;return}t=t.return}}function Ms(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Is(e)?Ls(t,n):(n=oi(e,t,n,r),n!==null&&(hu(n,e,r),Rs(n,t,r)))}function Ns(e,t,n){Ps(e,t,n,pu())}function Ps(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Is(e))Ls(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Er(s,o))return ai(e,t,i,0),K===null&&ii(),!1}catch{}if(n=oi(e,t,i,r),n!==null)return hu(n,e,r),Rs(n,t,r),!0}return!1}function Fs(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Is(e)){if(t)throw Error(i(479))}else t=oi(e,n,r,2),t!==null&&hu(t,e,2)}function Is(e){var t=e.alternate;return e===z||t!==null&&t===z}function Ls(e,t){_o=go=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Rs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,rt(e,n)}}var zs={readContext:ia,use:Po,useCallback:V,useContext:V,useEffect:V,useImperativeHandle:V,useLayoutEffect:V,useInsertionEffect:V,useMemo:V,useReducer:V,useRef:V,useState:V,useDebugValue:V,useDeferredValue:V,useTransition:V,useSyncExternalStore:V,useId:V,useHostTransitionStatus:V,useFormState:V,useActionState:V,useOptimistic:V,useMemoCache:V,useCacheRefresh:V};zs.useEffectEvent=V;var Bs={readContext:ia,use:Po,useCallback:function(e,t){return jo().memoizedState=[e,t===void 0?null:t],e},useContext:ia,useEffect:us,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),cs(4194308,4,gs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return cs(4194308,4,e,t)},useInsertionEffect:function(e,t){cs(4,2,e,t)},useMemo:function(e,t){var n=jo();t=t===void 0?null:t;var r=e();if(vo){Be(!0);try{e()}finally{Be(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=jo();if(n!==void 0){var i=n(t);if(vo){Be(!0);try{n(t)}finally{Be(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ms.bind(null,z,e),[r.memoizedState,e]},useRef:function(e){var t=jo();return e={current:e},t.memoizedState=e},useState:function(e){e=Ko(e);var t=e.queue,n=Ns.bind(null,z,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:vs,useDeferredValue:function(e,t){return xs(jo(),e,t)},useTransition:function(){var e=Ko(!1);return e=Cs.bind(null,z,e.queue,!0,!1),jo().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=z,a=jo();if(I){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),K===null)throw Error(i(349));J&127||Vo(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,us(Uo.bind(null,r,o,e),[e]),r.flags|=2048,os(9,{destroy:void 0},Ho.bind(null,r,o,n,t),null),n},useId:function(){var e=jo(),t=K.identifierPrefix;if(I){var n=ji,r=Ai;n=(r&~(1<<32-Ve(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=yo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[ut]=t,o[dt]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Pd(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Pc(t)}}return U(t),Fc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Pc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=pe.current,Wi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Li,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[ut]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Vi(t,!0)}else e=Bd(e).createTextNode(r),e[ut]=t,t.stateNode=e}return U(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Wi(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[ut]=t}else Gi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),e=!1}else n=Ki(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(fo(t),t):(fo(t),null);if(t.flags&128)throw Error(i(558))}return U(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Wi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[ut]=t}else Gi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;U(t),a=!1}else a=Ki(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(fo(t),t):(fo(t),null)}return fo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Lc(t,t.updateQueue),U(t),null);case 4:return N(),e===null&&Sd(t.stateNode.containerInfo),U(t),null;case 10:return Qi(t.type),U(t),null;case 19:if(j(R),r=t.memoizedState,r===null)return U(t),null;if(a=!!(t.flags&128),o=r.rendering,o===null){if(a)Rc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=po(e),o!==null){for(t.flags|=128,Rc(r,!1),e=o.updateQueue,t.updateQueue=e,Lc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)hi(n,e),n=n.sibling;return M(R,R.current&1|2),I&&Mi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&ke()>tu&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}}else{if(!a){if(e=po(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,Lc(t,e),Rc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!I)return U(t),null}else 2*ke()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,a=!0,Rc(r,!1),t.lanes=4194304)}r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(U(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=ke(),e.sibling=null,n=R.current,M(R,a?n&1|2:n&1),I&&Mi(t,r.treeForkCount),e);case 22:case 23:return fo(t),io(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(U(t),t.subtreeFlags&6&&(t.flags|=8192)):U(t),n=t.updateQueue,n!==null&&Lc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&j(ba),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Qi(L),U(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Bc(e,t){switch(Fi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Qi(L),N(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return ge(t),null;case 31:if(t.memoizedState!==null){if(fo(t),t.alternate===null)throw Error(i(340));Gi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(fo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Gi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return j(R),null;case 4:return N(),null;case 10:return Qi(t.type),null;case 22:case 23:return fo(t),io(),e!==null&&j(ba),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Qi(L),null;case 25:return null;default:return null}}function Vc(e,t){switch(Fi(t),t.tag){case 3:Qi(L),N();break;case 26:case 27:case 5:ge(t);break;case 4:N();break;case 31:t.memoizedState!==null&&fo(t);break;case 13:fo(t);break;case 19:j(R);break;case 10:Qi(t.type);break;case 22:case 23:fo(t),io(),e!==null&&j(ba);break;case 24:Qi(L)}}function Hc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Uc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Wc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{$a(t,n)}catch(t){Z(e,e.return,t)}}}function Gc(e,t,n){n.props=qs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Kc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function qc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function Jc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Yc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[dt]=t}catch(t){Z(e,e.return,t)}}function Xc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Zc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Xc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Qc(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=rn));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for(Qc(e,t,n),e=e.sibling;e!==null;)Qc(e,t,n),e=e.sibling}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[ut]=e,t[dt]=n}catch(t){Z(e,e.return,t)}}var tl=!1,nl=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=jr(e),Mr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(o,r,n),o[ut]=e,Ct(o),r=o;break a;case`link`:var s=Vf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=kr(s,h),v=kr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,k.T=null,n=lu,lu=null;var o=au,s=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(i(331));var c=G;if(G|=4,Fl(o.current),Dl(o,o.current,s,n),G=c,id(0,!1),ze&&typeof ze.onPostCommitFiberRoot==`function`)try{ze.onPostCommitFiberRoot(Re,o)}catch{}return!0}finally{A.p=a,k.T=r,Vu(e,t)}}function Wu(e,t,n){t=Si(n,t),t=$s(e.stateNode,t,2),e=Ka(e,t,2),e!==null&&(et(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=Si(n,e),n=ec(2),r=Ka(t,n,2),r!==null&&(tc(n,r,t,e),et(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>ke()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=Qe()),e=si(e,t),e!==null&&(et(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return Te(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Ve(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=Ye(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||Xe(r,a)||(n=!0,ld(r,a))}r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=ke(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Ht(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),Ct(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Ht(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Ht(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Ht(n.imageSizes)+`"]`)):i+=`[href="`+Ht(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),Ct(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Ht(r)+`"][href="`+Ht(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),Ct(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=St(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);Ct(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=St(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),Ct(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=St(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),Ct(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var a=(a=pe.current)?gf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=St(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var o=St(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(jf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),o||Nf(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=St(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Af(e){return`href="`+Ht(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),Ct(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Ht(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Ht(n.href)+`"]`);if(r)return t.instance=r,Ct(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),Ct(r),Pd(r,`style`,a),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Af(n.href);var o=e.querySelector(jf(a));if(o)return t.state.loading|=4,t.instance=o,Ct(o),o;r=Mf(n),(a=mf.get(a))&&Rf(r,a),o=(e.ownerDocument||e).createElement(`link`),Ct(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Pd(o,`link`,r),t.state.loading|=4,Lf(o,n.precedence,e),t.instance=o;case`script`:return o=Pf(n.src),(a=e.querySelector(Ff(o)))?(t.instance=a,Ct(a),a):(r=n,(a=mf.get(o))&&(r=h({},n),zf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),Ct(a),Pd(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,Ct(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),Ct(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=c(u(),1),v=g(),y=`cps.web.deviceCredential`,b=class extends Error{constructor(e=`此浏览器需要重新配对。请重新运行 codex-provider web。`){super(e),this.name=`PairingRequiredError`}},x=class extends Error{constructor(e,t,n){super(t||`配置已变更,请重新确认。`),this.name=`ProfileRevisionError`,this.code=e,this.profile=n}};function ee(){return!!window.localStorage.getItem(y)}async function te(){let e=new URLSearchParams(window.location.hash.replace(/^#/,``)).get(`pair`);if(!e)return ee();let t=await fetch(`/api/pair`,{method:`POST`,headers:{"X-Codex-Provider-Pairing":e}}),n=await t.json().catch(()=>({}));if(!t.ok||!n.deviceCredential)throw new b(n.error??`配对链接无效、已过期或已被使用。请重新运行 codex-provider web。`);return window.localStorage.setItem(y,n.deviceCredential),window.history.replaceState(null,``,`${window.location.pathname}${window.location.search}`),!0}function S(){return{"X-Codex-Provider-Device":window.localStorage.getItem(y)??``}}function C(e,t,n){let r=e.code??e.coreError?.code;return t===409&&([`PROFILE_REVISION_REQUIRED`,`PROFILE_CHANGED`,`STORAGE_REVISION_REQUIRED`,`STORAGE_CHANGED`].includes(r)||[`PLAN_EXPIRED`,`STALE_STATE`].includes(r))?new x(r,e.error,e.profile):Error(e.error??n)}async function w(e,t){let n=await e.json().catch(()=>({}));if(!e.ok)throw n.code===`PAIRING_REQUIRED`?(window.dispatchEvent(new CustomEvent(`cps:pairing-required`,{detail:n.error})),new b(n.error)):C(n,e.status,t);return n}async function T(e,t={},{signal:n}={}){let r=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`,...S()},body:JSON.stringify(t),signal:n});return w(r,`Request failed with HTTP ${r.status}.`)}async function E(e=0){let t=await fetch(`/api/activity?after=${e}`,{headers:S()});return w(t,`Activity request failed with HTTP ${t.status}.`)}async function ne(){let e=await fetch(`/api/profiles`,{headers:S()});return w(e,`Profile request failed with HTTP ${e.status}.`)}async function re(){try{await T(`/api/access/forget`)}finally{window.localStorage.removeItem(y)}}async function D(e={},t={}){return T(`/api/history`,e,t)}async function ie(e={},t={}){return T(`/api/history/session`,e,t)}function ae(e,t){let[n,r]=(0,_.useState)(()=>{try{let n=window.localStorage.getItem(e);return n?JSON.parse(n):t}catch{return t}});return(0,_.useEffect)(()=>{window.localStorage.setItem(e,JSON.stringify(n))},[e,n]),[n,r]}function O(){let e=0,t=null;return{begin(){return t?.abort(),t=new AbortController,e+=1,{sequence:e,controller:t,signal:t.signal}},isLatest(t){return t===e},cancel(){t?.abort(),e+=1}}}function oe(e,t=300,n=globalThis){let r=n.setTimeout(e,t);return()=>n.clearTimeout(r)}function k(e,t,n){return!e?.id||!e?.revision||n?.profileId!==e.id||n?.profileRevision!==e.revision?null:{...t,profile:{...e},profileId:e.id,profileRevision:e.revision,status:{...n}}}function A(e){let t=e?.result?.result?.skippedLockedRolloutFiles??e?.result?.skippedLockedRolloutFiles??e?.skippedLockedRolloutFiles??[];return Array.isArray(t)?t.filter(Boolean):[]}function se(e,{successTitle:t,partialTitle:n,message:r}){let i=A(e);return e?.result?.outcome===`partial`||e?.outcome===`partial`||i.length>0?{tone:`warning`,title:n,message:[r,i.length?`已跳过 ${i.length} 个被占用的 rollout 文件:${i.join(`、`)}`:`部分项目未完成;请查看活动日志后重试。`].filter(Boolean).join(`;`)}:{tone:`success`,title:t,message:r}}function ce(e,t){let n=String(e??``).replaceAll(`\\`,`/`).replace(/\/{2,}/g,`/`).replace(/\/$/,``);return t===`win32`?n.toLowerCase():n}function le(e=[],{platform:t=typeof process<`u`?process.platform:`browser`}={}){let n=new Set;return e.filter((e,r)=>{let i=e?.threadId??e?.id,a=e?.rolloutPath??e?.filePath??e?.rolloutFile??e?.path,o=i?`thread:${i}`:a?`rollout:${ce(a,t)}`:`item:${r}`;return!n.has(o)&&(n.add(o),!0)})}function ue(e,{caseInsensitive:t=!1}={}){let n=String(e??``).replace(/[\\/]+$/,``).replaceAll(`\\`,`/`);return t?n.toLowerCase():n}function j(e,t,n){return!!(e&&t&&ue(e,n)===ue(t,n))}function M(e){let t=String(e??``).replace(/[\\/]+$/,``),n=Math.max(t.lastIndexOf(`/`),t.lastIndexOf(`\\`));return n<0?``:n===0?t.slice(0,1):n===2&&/^[A-Za-z]:/.test(t)?t.slice(0,3):t.slice(0,n)}function de(e,t){let n=e?.stateDbLocation?.path;if(n)return M(n);let r=t?.metadata,i={caseInsensitive:e?.pathComparisonCaseInsensitive===!0};return Number(r?.version)>=2&&e?.sqliteHomeSource==="default"&&j(r?.sqliteHome,e?.codexHome,i)?e.codexHome:e?.sqliteHome??``}function fe({backup:e,profile:t,targetSqliteHome:n,restoreDatabase:r,restoreConfig:i,sqliteSupported:a,pathComparisonCaseInsensitive:o=!1}){let s=e?.metadata?.sqliteHome,c=t?.sqliteHome?.trim()??``,l=!!(r&&s&&n&&!j(s,n,{caseInsensitive:o})),u=l&&!c,d=l&&i;return{requiresRelocation:l,missingExplicitTarget:u,configRestoreConflict:d,canSubmit:!!a&&!u&&!d}}function pe(e){return{profileId:e||`default`}}function me({fetchStatus:e,fetchBackups:t,gate:n=O()}){let r=async({profileId:r,showLoading:i=!0,onLoading:a,onResult:o,onError:s})=>{let{controller:c,sequence:l}=n.begin();i&&a?.(!0);try{let i=pe(r),[a,s]=await Promise.all([e(i,{signal:c.signal}),t(i,{signal:c.signal})]);return n.isLatest(l)?(o?.({profileId:r,status:a.status,backups:s}),!0):!1}catch(e){return e?.name===`AbortError`||!n.isLatest(l)||s?.(e),!1}finally{n.isLatest(l)&&a?.(!1)}};return r.cancel=()=>n.cancel(),r}var he=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),N=o(((e,t)=>{t.exports=he()}))();function P({children:e,size:t=18,className:n=``}){return(0,N.jsx)(`svg`,{className:n,width:t,height:t,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:e})}var ge=e=>(0,N.jsxs)(P,{...e,children:[(0,N.jsx)(`path`,{d:`M20 6v5h-5`}),(0,N.jsx)(`path`,{d:`M4 18v-5h5`}),(0,N.jsx)(`path`,{d:`M18.3 9A7 7 0 0 0 6.7 6.7L4 11`}),(0,N.jsx)(`path`,{d:`M5.7 15A7 7 0 0 0 17.3 17.3L20 13`})]}),_e=e=>(0,N.jsxs)(P,{...e,children:[(0,N.jsx)(`ellipse`,{cx:`12`,cy:`5`,rx:`8`,ry:`3`}),(0,N.jsx)(`path`,{d:`M4 5v6c0 1.7 3.6 3 8 3s8-1.3 8-3V5`}),(0,N.jsx)(`path`,{d:`M4 11v6c0 1.7 3.6 3 8 3s8-1.3 8-3v-6`})]}),ve=e=>(0,N.jsxs)(P,{...e,children:[(0,N.jsx)(`path`,{d:`M3 12a9 9 0 1 0 3-6.7L3 8`}),(0,N.jsx)(`path`,{d:`M3 3v5h5`}),(0,N.jsx)(`path`,{d:`M12 7v5l3 2`})]}),ye=e=>(0,N.jsx)(P,{...e,children:(0,N.jsx)(`path`,{d:`M3 12h4l2-7 4 14 2-7h6`})}),be=e=>(0,N.jsxs)(P,{...e,children:[(0,N.jsx)(`rect`,{x:`3`,y:`3`,width:`7`,height:`7`,rx:`1`}),(0,N.jsx)(`rect`,{x:`14`,y:`3`,width:`7`,height:`7`,rx:`1`}),(0,N.jsx)(`rect`,{x:`3`,y:`14`,width:`7`,height:`7`,rx:`1`}),(0,N.jsx)(`rect`,{x:`14`,y:`14`,width:`7`,height:`7`,rx:`1`})]}),xe=e=>(0,N.jsxs)(P,{...e,children:[(0,N.jsx)(`path`,{d:`M12 3 4.5 6v5.3c0 4.6 3.2 8 7.5 9.7 4.3-1.7 7.5-5.1 7.5-9.7V6L12 3Z`}),(0,N.jsx)(`path`,{d:`m9 12 2 2 4-4`})]}),Se=e=>(0,N.jsx)(P,{...e,children:(0,N.jsx)(`path`,{d:`m9 18 6-6-6-6`})}),Ce=e=>(0,N.jsx)(P,{...e,children:(0,N.jsx)(`path`,{d:`m6 6 12 12M18 6 6 18`})}),we=e=>(0,N.jsx)(P,{...e,children:(0,N.jsx)(`path`,{d:`m5 12 4 4L19 6`})}),Te=e=>(0,N.jsxs)(P,{...e,children:[(0,N.jsx)(`path`,{d:`M12 3 2.8 19h18.4L12 3Z`}),(0,N.jsx)(`path`,{d:`M12 9v4M12 17h.01`})]}),Ee=e=>(0,N.jsx)(P,{...e,children:(0,N.jsx)(`path`,{d:`M3 6.5h6l2 2h10v9.5a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6.5Z`})}),De=[{id:`overview`,label:`概览`,icon:be},{id:`history`,label:`聊天记录`,icon:ve},{id:`backups`,label:`备份`,icon:ve},{id:`activity`,label:`活动`,icon:ye}],Oe={backupRoot:``,backups:[]};function ke(e){return new Intl.NumberFormat(`zh-CN`).format(Number(e)||0)}function Ae(e){let t=[`B`,`KB`,`MB`,`GB`,`TB`],n=Number(e)||0,r=0;for(;n>=1024&&r=10?1:2).replace(/\.0$/,``)} ${t[r]}`}function je(e){return e?new Intl.DateTimeFormat(`zh-CN`,{month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}).format(new Date(e)):`未知时间`}function Me(e,t){return e.split(/(`[^`]+`|\*\*[^*]+\*\*|\*[^*]+\*)/g).map((e,n)=>e.startsWith("`")&&e.endsWith("`")?(0,N.jsx)(`code`,{children:e.slice(1,-1)},`${t}-code-${n}`):e.startsWith(`**`)&&e.endsWith(`**`)?(0,N.jsx)(`strong`,{children:e.slice(2,-2)},`${t}-strong-${n}`):e.startsWith(`*`)&&e.endsWith(`*`)?(0,N.jsx)(`em`,{children:e.slice(1,-1)},`${t}-em-${n}`):(0,N.jsx)(_.Fragment,{children:e},`${t}-text-${n}`))}function Ne({text:e}){return String(e??``).split(/(```[^\n]*\n[\s\S]*?```)/g).map((e,t)=>{if(e.startsWith("```")&&e.endsWith("```")){let n=e.slice(3,-3).replace(/^\w*\n/,``);return(0,N.jsx)(`pre`,{children:(0,N.jsx)(`code`,{children:n})},`block-${t}`)}return e.split(` -`).map((e,n,r)=>(0,N.jsxs)(_.Fragment,{children:[Me(e,`${t}-${n}`),n{for(let r of e??[]){if(!r||r===`(missing)`)continue;let e=t.get(r)??new Set;e.add(n),t.set(r,e)}};return n(e.configuredProviders,`config`),n(Object.keys(e.rolloutCounts?.sessions??{}),`rollout`),n(Object.keys(e.rolloutCounts?.archived_sessions??{}),`rollout`),n(Object.keys(e.sqliteCounts?.sessions??{}),`sqlite`),n(Object.keys(e.sqliteCounts?.archived_sessions??{}),`sqlite`),n([e.currentProvider],`config`),[...t.entries()].map(([t,n])=>({id:t,sources:[...n],configured:e.configuredProviders?.includes(t),current:t===e.currentProvider})).sort((e,t)=>Number(t.current)-Number(e.current)||e.id.localeCompare(t.id))}function Fe({tone:e=`neutral`}){return(0,N.jsx)(`span`,{className:`status-dot status-dot--${e}`,"aria-hidden":`true`})}function Ie({status:e,busy:t,onRefresh:n}){let r=e?.sqliteAccess?.supported!==!1&&!e?.sqliteCounts?.unreadable;return(0,N.jsxs)(`header`,{className:`app-header`,children:[(0,N.jsxs)(`div`,{className:`brand`,children:[(0,N.jsx)(`div`,{className:`brand-mark`,children:(0,N.jsx)(_e,{size:19})}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`div`,{className:`brand-name`,children:`Codex Provider Sync`}),(0,N.jsx)(`div`,{className:`brand-subtitle`,children:`本机元数据一致性工具`})]})]}),(0,N.jsxs)(`div`,{className:`header-actions`,children:[(0,N.jsxs)(`div`,{className:`service-state`,children:[(0,N.jsx)(Fe,{tone:t?`warning`:r?`success`:`danger`}),(0,N.jsx)(`span`,{children:t?`操作执行中`:r?`本地服务就绪`:`需要检查`})]}),(0,N.jsxs)(`button`,{className:`button button--secondary button--compact`,type:`button`,onClick:n,disabled:t,children:[(0,N.jsx)(ge,{size:16}),`刷新`]})]})]})}function Le({view:e,setView:t,status:n,onForgetBrowser:r}){return(0,N.jsxs)(`aside`,{className:`sidebar`,children:[(0,N.jsx)(`nav`,{className:`navigation`,"aria-label":`主导航`,children:De.map(n=>{let r=n.icon;return(0,N.jsxs)(`button`,{className:`nav-item ${e===n.id?`nav-item--active`:``}`,type:`button`,onClick:()=>t(n.id),children:[(0,N.jsx)(r,{size:17}),(0,N.jsx)(`span`,{children:n.label})]},n.id)})}),(0,N.jsxs)(`div`,{className:`sidebar-foot`,children:[(0,N.jsx)(`div`,{className:`sidebar-provider-label`,children:`当前 Provider`}),(0,N.jsxs)(`div`,{className:`sidebar-provider-value`,children:[(0,N.jsx)(Fe,{tone:`success`}),(0,N.jsx)(`span`,{children:n?.currentProvider??`未读取`})]}),(0,N.jsx)(`div`,{className:`sidebar-version`,children:`Web UI · localhost only`}),(0,N.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,onClick:r,children:`忘记此浏览器`})]})]})}function Re({profiles:e,profileId:t,setProfileId:n,status:r,onAddProfile:i,onDeleteProfile:a,onRefresh:o,loading:s,profileSwitchDisabled:c}){return(0,N.jsxs)(`section`,{className:`storage-bar`,"aria-label":`存储位置`,children:[(0,N.jsxs)(`label`,{className:`path-field path-field--wide`,children:[(0,N.jsx)(`span`,{children:`存储配置`}),(0,N.jsxs)(`div`,{className:`path-input-wrap`,children:[(0,N.jsx)(Ee,{size:16}),(0,N.jsx)(`select`,{value:t,onChange:e=>n(e.target.value),disabled:c,children:e.map(e=>(0,N.jsx)(`option`,{value:e.id,children:e.name},e.id))})]})]}),(0,N.jsxs)(`label`,{className:`path-field`,children:[(0,N.jsxs)(`span`,{children:[`当前路径 `,(0,N.jsx)(`small`,{children:`由服务端解析`})]}),(0,N.jsxs)(`div`,{className:`path-input-wrap`,children:[(0,N.jsx)(_e,{size:16}),(0,N.jsx)(`input`,{value:r?.codexHome??``,readOnly:!0,placeholder:`读取状态后显示`})]})]}),(0,N.jsx)(`button`,{className:`button button--secondary storage-refresh`,type:`button`,onClick:i,children:`新增配置`}),t==="default"?null:(0,N.jsx)(`button`,{className:`button button--quiet storage-refresh`,type:`button`,onClick:a,children:`删除配置`}),(0,N.jsxs)(`button`,{className:`button button--secondary storage-refresh`,type:`button`,onClick:o,disabled:s,children:[(0,N.jsx)(ge,{size:16,className:s?`spin`:``}),`读取状态`]})]})}function ze({title:e,counts:t,currentProvider:n}){let r=Object.entries(t??{}).sort((e,t)=>t[1]-e[1]),i=r.reduce((e,[,t])=>e+t,0);return(0,N.jsxs)(`div`,{className:`distribution-block`,children:[(0,N.jsxs)(`div`,{className:`distribution-heading`,children:[(0,N.jsx)(`span`,{children:e}),(0,N.jsx)(`strong`,{children:ke(i)})]}),(0,N.jsx)(`div`,{className:`distribution-list`,children:r.length===0?(0,N.jsx)(`div`,{className:`empty-inline`,children:`无记录`}):r.map(([e,t])=>(0,N.jsxs)(`div`,{className:`distribution-row`,children:[(0,N.jsxs)(`div`,{className:`distribution-meta`,children:[(0,N.jsx)(`span`,{className:`provider-name`,children:e}),(0,N.jsx)(`span`,{children:ke(t)})]}),(0,N.jsx)(`div`,{className:`bar-track`,children:(0,N.jsx)(`span`,{className:e===n?`bar-fill bar-fill--current`:`bar-fill`,style:{width:`${Math.max(5,i?t/i*100:0)}%`}})})]},e))})]})}function Be({status:e,loading:t}){let n=Object.values(e?.rolloutCounts?.sessions??{}).reduce((e,t)=>e+t,0)+Object.values(e?.rolloutCounts?.archived_sessions??{}).reduce((e,t)=>e+t,0),r=Object.values(e?.sqliteCounts?.sessions??{}).reduce((e,t)=>e+t,0)+Object.values(e?.sqliteCounts?.archived_sessions??{}).reduce((e,t)=>e+t,0),i=e?.alignment?.aligned;return(0,N.jsxs)(`section`,{className:`status-panel`,children:[(0,N.jsxs)(`div`,{className:`section-title-row`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h2`,{children:`状态总览`}),(0,N.jsx)(`p`,{children:`比较 rollout 文件、SQLite 线程索引和当前 Provider。`})]}),(0,N.jsxs)(`div`,{className:`alignment-state ${i?`alignment-state--success`:`alignment-state--warning`}`,children:[t?(0,N.jsx)(ge,{size:16,className:`spin`}):i?(0,N.jsx)(we,{size:16}):(0,N.jsx)(Te,{size:16}),(0,N.jsx)(`span`,{children:t?`正在检查`:i?`Provider 元数据已对齐`:`发现不一致`})]})]}),(0,N.jsxs)(`div`,{className:`summary-strip`,children:[(0,N.jsxs)(`div`,{className:`summary-item`,children:[(0,N.jsx)(`span`,{children:`当前 Provider`}),(0,N.jsx)(`strong`,{children:e?.currentProvider??`—`}),(0,N.jsx)(`small`,{children:e?.currentProviderImplicit?`隐式默认`:`config.toml 根级配置`})]}),(0,N.jsxs)(`div`,{className:`summary-item`,children:[(0,N.jsx)(`span`,{children:`Rollout 文件`}),(0,N.jsx)(`strong`,{children:ke(n)}),(0,N.jsx)(`small`,{children:`sessions + archived`})]}),(0,N.jsxs)(`div`,{className:`summary-item`,children:[(0,N.jsx)(`span`,{children:`SQLite threads`}),(0,N.jsx)(`strong`,{children:e?.sqliteCounts?.unreadable?`不可读`:ke(r)}),(0,N.jsx)(`small`,{children:e?.stateDbLocation?.source??`未定位数据库`})]}),(0,N.jsxs)(`div`,{className:`summary-item`,children:[(0,N.jsx)(`span`,{children:`托管备份`}),(0,N.jsx)(`strong`,{children:ke(e?.backupSummary?.count)}),(0,N.jsx)(`small`,{children:Ae(e?.backupSummary?.totalBytes)})]})]}),(0,N.jsxs)(`div`,{className:`distribution-grid`,children:[(0,N.jsxs)(`div`,{className:`distribution-column`,children:[(0,N.jsxs)(`div`,{className:`column-label`,children:[(0,N.jsx)(Ee,{size:16}),` Rollout files`]}),(0,N.jsx)(ze,{title:`sessions`,counts:e?.rolloutCounts?.sessions,currentProvider:e?.currentProvider}),(0,N.jsx)(ze,{title:`archived_sessions`,counts:e?.rolloutCounts?.archived_sessions,currentProvider:e?.currentProvider})]}),(0,N.jsx)(`div`,{className:`distribution-divider`}),(0,N.jsxs)(`div`,{className:`distribution-column`,children:[(0,N.jsxs)(`div`,{className:`column-label`,children:[(0,N.jsx)(_e,{size:16}),` SQLite state`]}),(0,N.jsx)(ze,{title:`sessions`,counts:e?.sqliteCounts?.sessions,currentProvider:e?.currentProvider}),(0,N.jsx)(ze,{title:`archived_sessions`,counts:e?.sqliteCounts?.archived_sessions,currentProvider:e?.currentProvider})]})]})]})}function Ve({status:e}){let t=[];e?.sqliteAccess?.supported===!1&&t.push({tone:`danger`,title:`SQLite 路径不可安全访问`,detail:e.sqliteAccess.message}),e?.sqliteCounts?.unreadable&&t.push({tone:`danger`,title:`SQLite 当前不可读`,detail:e.sqliteCounts.error}),e?.lockedRolloutFiles?.length&&t.push({tone:`warning`,title:`${e.lockedRolloutFiles.length} 个 rollout 文件正在使用`,detail:`同步会跳过这些活跃文件;会话结束后可再次执行。`}),e?.encryptedContentWarning&&t.push({tone:`warning`,title:`检测到 encrypted_content`,detail:e.encryptedContentWarning});let n=e?.sqliteRepairStats;return(n?.userEventRowsNeedingRepair||n?.cwdRowsNeedingRepair)&&t.push({tone:`info`,title:`SQLite 有待修复字段`,detail:`user-event ${n.userEventRowsNeedingRepair??0},cwd ${n.cwdRowsNeedingRepair??0}`}),t.length===0?null:(0,N.jsx)(`section`,{className:`warning-stack`,"aria-label":`诊断信息`,children:t.map((e,t)=>(0,N.jsxs)(`div`,{className:`warning-row warning-row--${e.tone}`,children:[(0,N.jsx)(Te,{size:17}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:e.title}),(0,N.jsx)(`span`,{children:e.detail})]})]},`${e.title}-${t}`))})}function He({projects:e=[]}){return(0,N.jsxs)(`section`,{className:`data-section`,children:[(0,N.jsx)(`div`,{className:`section-title-row section-title-row--compact`,children:(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h2`,{children:`项目可见性`}),(0,N.jsx)(`p`,{children:`检查 Desktop 项目路径、全局排序和首屏 50 条命中。`})]})}),(0,N.jsx)(`div`,{className:`table-scroll`,children:(0,N.jsxs)(`table`,{className:`data-table`,children:[(0,N.jsx)(`thead`,{children:(0,N.jsxs)(`tr`,{children:[(0,N.jsx)(`th`,{children:`项目根目录`}),(0,N.jsx)(`th`,{children:`交互会话`}),(0,N.jsx)(`th`,{children:`首屏`}),(0,N.jsx)(`th`,{children:`Ranks`}),(0,N.jsx)(`th`,{children:`CWD 精确匹配`}),(0,N.jsx)(`th`,{children:`Provider`})]})}),(0,N.jsx)(`tbody`,{children:e.length===0?(0,N.jsx)(`tr`,{children:(0,N.jsx)(`td`,{colSpan:`6`,className:`table-empty`,children:`没有可显示的项目诊断。`})}):e.map(e=>(0,N.jsxs)(`tr`,{children:[(0,N.jsx)(`td`,{className:`path-cell`,children:e.root}),(0,N.jsx)(`td`,{children:e.interactiveThreads}),(0,N.jsxs)(`td`,{children:[e.firstPageThreads,`/50`]}),(0,N.jsx)(`td`,{children:e.rankPreview||`—`}),(0,N.jsxs)(`td`,{children:[e.exactCwdMatches,`/`,e.interactiveThreads]}),(0,N.jsx)(`td`,{children:Object.entries(e.providerCounts??{}).map(([e,t])=>`${e} ${t}`).join(` · `)||`—`})]},e.root))})]})})]})}function Ue({value:e,onChange:t,disabled:n}){return(0,N.jsxs)(`div`,{className:`segmented`,role:`radiogroup`,"aria-label":`执行模式`,children:[(0,N.jsxs)(`button`,{type:`button`,className:e===`sync`?`segmented-option segmented-option--active`:`segmented-option`,onClick:()=>t(`sync`),disabled:n,children:[(0,N.jsx)(`span`,{children:`仅同步元数据`}),(0,N.jsx)(`small`,{children:`不修改 config.toml`})]}),(0,N.jsxs)(`button`,{type:`button`,className:e===`switch`?`segmented-option segmented-option--active`:`segmented-option`,onClick:()=>t(`switch`),disabled:n,children:[(0,N.jsx)(`span`,{children:`切换 Provider 并同步`}),(0,N.jsx)(`small`,{children:`更新根级配置`})]})]})}function We({status:e,providers:t,selectedProvider:n,setSelectedProvider:r,onAddManualProvider:i,onRemoveManualProvider:a,onRequestExecute:o,busy:s}){let[c,l]=ae(`cps.web.mode`,`sync`),[u,d]=ae(`cps.web.modelMode`,`auto`),[f,p]=ae(`cps.web.customModel`,``),[m,h]=ae(`cps.web.keepCount`,5),[g,v]=(0,_.useState)(``),y=t.find(e=>e.id===n),b=y?.configured,x=/^[A-Za-z0-9_.-]+$/.test(g.trim()),ee=e?.sqliteAccess?.supported===!1,te=s||!n||ee||e?.sqliteCounts?.unreadable;return(0,N.jsxs)(`section`,{className:`execution-panel`,children:[(0,N.jsxs)(`div`,{className:`execution-head`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h2`,{children:`执行同步`}),(0,N.jsx)(`p`,{children:`所有写操作都会先创建备份。执行前请关闭 Codex CLI、App 和 app-server。`})]}),(0,N.jsx)(xe,{size:22})]}),(0,N.jsx)(Ue,{value:c,onChange:l,disabled:s}),(0,N.jsxs)(`div`,{className:`form-grid`,children:[(0,N.jsxs)(`label`,{className:`form-field`,children:[(0,N.jsx)(`span`,{children:`目标 Provider`}),(0,N.jsx)(`select`,{value:n,onChange:e=>r(e.target.value),disabled:s,children:t.map(e=>(0,N.jsxs)(`option`,{value:e.id,children:[e.id,e.current?`(当前)`:``]},e.id))}),c===`switch`&&!b?(0,N.jsx)(`small`,{className:`field-error`,children:`切换模式要求该 Provider 已定义在 config.toml。`}):null]}),(0,N.jsxs)(`label`,{className:`form-field form-field--short`,children:[(0,N.jsx)(`span`,{children:`保留备份数`}),(0,N.jsx)(`input`,{type:`number`,min:`1`,max:`100000`,value:m,onChange:e=>h(Number(e.target.value)),disabled:s}),(0,N.jsx)(`small`,{children:`同步后自动清理`})]})]}),(0,N.jsxs)(`div`,{className:`manual-provider-row`,children:[(0,N.jsx)(`input`,{type:`text`,value:g,onChange:e=>v(e.target.value),placeholder:`手动添加 Provider ID`,spellCheck:`false`,disabled:s}),(0,N.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:s||!x,onClick:()=>{i(g.trim()),v(``)},children:`添加`}),y?.manual?(0,N.jsx)(`button`,{className:`manual-remove`,type:`button`,onClick:()=>a(n),disabled:s,children:`删除当前手动项`}):null]}),c===`switch`?(0,N.jsxs)(`fieldset`,{className:`model-options`,disabled:s,children:[(0,N.jsx)(`legend`,{children:`根级 model`}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`auto`,onChange:()=>d(`auto`)}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:`跟随 Provider 配置`}),(0,N.jsxs)(`small`,{children:["采用 `[model_providers.",n,"]` 中的 model"]})]})]}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`keep`,onChange:()=>d(`keep`)}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:`保留当前根级 model`}),(0,N.jsx)(`small`,{children:`只切换 model_provider`})]})]}),(0,N.jsxs)(`label`,{className:`custom-model-option`,children:[(0,N.jsx)(`input`,{type:`radio`,name:`model-mode`,checked:u===`custom`,onChange:()=>d(`custom`)}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:`自定义 model`}),(0,N.jsx)(`input`,{type:`text`,value:f,onFocus:()=>d(`custom`),onChange:e=>p(e.target.value),placeholder:`例如 MiniMax-M3`})]})]})]}):null,ee?(0,N.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`此 SQLite 布局仅供诊断`}),(0,N.jsx)(`span`,{children:e?.sqliteAccess?.message||`当前 SQLite 路径不可由 Web UI 安全写入,因此已禁用执行同步。`})]})]}):null,(0,N.jsxs)(`div`,{className:`backup-assurance`,children:[(0,N.jsx)(we,{size:16}),(0,N.jsx)(`span`,{children:`修改前创建 metadata v2 备份,并记录 SQLite Home`})]}),(0,N.jsxs)(`button`,{className:`button button--primary execute-button`,type:`button`,disabled:te||c===`switch`&&!b||c===`switch`&&u===`custom`&&!f.trim(),onClick:()=>o({mode:c,modelMode:u,model:f.trim(),keepCount:m}),children:[s?(0,N.jsx)(ge,{size:17,className:`spin`}):(0,N.jsx)(xe,{size:17}),s?`正在执行…`:c===`switch`?`切换并同步`:`执行同步`]})]})}function Ge({backups:e,onViewAll:t,onRestore:n,restoreDisabled:r}){return(0,N.jsxs)(`section`,{className:`recent-backups`,children:[(0,N.jsxs)(`div`,{className:`section-title-row section-title-row--compact`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h2`,{children:`最近备份`}),(0,N.jsx)(`p`,{children:e.backupRoot||`同步后将在 Codex Home 下创建备份`})]}),(0,N.jsxs)(`button`,{type:`button`,className:`text-button`,onClick:t,children:[`查看全部 `,(0,N.jsx)(Se,{size:14})]})]}),(0,N.jsx)(`div`,{className:`backup-rows`,children:e.backups.length===0?(0,N.jsx)(`div`,{className:`empty-state`,children:`尚无由本工具创建的备份。`}):e.backups.slice(0,3).map(e=>(0,N.jsxs)(`div`,{className:`backup-row`,children:[(0,N.jsx)(`div`,{className:`backup-icon`,children:(0,N.jsx)(ve,{size:17})}),(0,N.jsxs)(`div`,{className:`backup-main`,children:[(0,N.jsx)(`strong`,{children:je(e.metadata.createdAt)}),(0,N.jsxs)(`span`,{children:[e.metadata.targetProvider,` · `,e.metadata.changedSessionFiles??0,` 个 rollout`]})]}),(0,N.jsx)(`div`,{className:`backup-size`,children:Ae(e.sizeBytes)}),(0,N.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:r,title:r?`当前 SQLite 路径仅供诊断,不能恢复`:void 0,onClick:()=>n(e),children:`恢复`})]},e.id))})]})}function Ke({status:e,backups:t,providers:n,selectedProvider:r,setSelectedProvider:i,onAddManualProvider:a,onRemoveManualProvider:o,onExecute:s,onRestore:c,setView:l,busy:u,loading:d}){return(0,N.jsxs)(`div`,{className:`view-content`,children:[(0,N.jsx)(Be,{status:e,loading:d}),(0,N.jsx)(Ve,{status:e}),(0,N.jsxs)(`div`,{className:`overview-lower-grid`,children:[(0,N.jsxs)(`div`,{className:`overview-main-column`,children:[(0,N.jsx)(He,{projects:e?.projectThreadVisibility??[]}),(0,N.jsx)(Ge,{backups:t,onViewAll:()=>l(`backups`),onRestore:c,restoreDisabled:e?.sqliteAccess?.supported===!1})]}),(0,N.jsx)(We,{status:e,providers:n,selectedProvider:r,setSelectedProvider:i,onAddManualProvider:a,onRemoveManualProvider:o,onRequestExecute:s,busy:u})]})]})}function qe({backups:e,status:t,busy:n,onRestore:r,onPrune:i}){let[a,o]=ae(`cps.web.keepCount`,5),s=t?.sqliteAccess?.supported===!1;return(0,N.jsxs)(`div`,{className:`view-content`,children:[(0,N.jsxs)(`section`,{className:`page-intro`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h1`,{children:`备份`}),(0,N.jsx)(`p`,{children:`管理当前 Codex Home 下由本工具创建的 metadata v2 备份。`})]}),(0,N.jsxs)(`div`,{className:`prune-control`,children:[(0,N.jsxs)(`label`,{children:[`保留最近 `,(0,N.jsx)(`input`,{type:`number`,min:`0`,max:`100000`,value:a,onChange:e=>o(Number(e.target.value))}),` 份`]}),(0,N.jsx)(`button`,{className:`button button--secondary`,type:`button`,disabled:n,onClick:()=>i(a),children:`清理旧备份`})]})]}),(0,N.jsxs)(`section`,{className:`backup-list-section`,children:[(0,N.jsxs)(`div`,{className:`backup-root-line`,children:[(0,N.jsx)(Ee,{size:16}),(0,N.jsx)(`span`,{children:e.backupRoot||t?.backupRoot||`—`}),(0,N.jsxs)(`strong`,{children:[e.backups.length,` 份 · `,Ae(e.backups.reduce((e,t)=>e+t.sizeBytes,0))]})]}),(0,N.jsx)(`div`,{className:`full-backup-list`,children:e.backups.length===0?(0,N.jsxs)(`div`,{className:`large-empty`,children:[(0,N.jsx)(ve,{size:26}),(0,N.jsx)(`strong`,{children:`还没有备份`}),(0,N.jsx)(`span`,{children:`执行一次同步或切换后,备份会显示在这里。`})]}):e.backups.map(e=>(0,N.jsxs)(`article`,{className:`full-backup-row`,children:[(0,N.jsxs)(`div`,{className:`backup-date`,children:[(0,N.jsx)(`strong`,{children:je(e.metadata.createdAt)}),(0,N.jsx)(`span`,{children:e.id})]}),(0,N.jsxs)(`div`,{className:`backup-facts`,children:[(0,N.jsxs)(`span`,{children:[`Provider `,(0,N.jsx)(`strong`,{children:e.metadata.targetProvider})]}),(0,N.jsxs)(`span`,{children:[`Rollout `,(0,N.jsx)(`strong`,{children:e.metadata.changedSessionFiles??0})]}),(0,N.jsxs)(`span`,{children:[`SQLite `,(0,N.jsx)(`strong`,{children:e.metadata.sqliteDbFiles?.length?`已包含`:`未包含`})]})]}),(0,N.jsxs)(`div`,{className:`backup-source`,children:[(0,N.jsx)(`span`,{children:`SQLite Home`}),(0,N.jsx)(`code`,{children:e.metadata.sqliteHome??`旧版 metadata 未记录`})]}),(0,N.jsxs)(`div`,{className:`backup-row-actions`,children:[(0,N.jsx)(`span`,{children:Ae(e.sizeBytes)}),(0,N.jsx)(`button`,{className:`button button--secondary button--compact`,type:`button`,disabled:n||s,title:s?`当前 SQLite 路径仅供诊断,不能恢复`:void 0,onClick:()=>r(e),children:`恢复`})]})]},e.id))})]})]})}function Je({activity:e,activeOperation:t}){return(0,N.jsxs)(`div`,{className:`view-content`,children:[(0,N.jsxs)(`section`,{className:`page-intro`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h1`,{children:`活动日志`}),(0,N.jsx)(`p`,{children:`当前 Web UI 会话中的状态刷新、同步阶段和操作结果。`})]}),t?(0,N.jsxs)(`div`,{className:`live-operation`,children:[(0,N.jsx)(ge,{size:16,className:`spin`}),` `,t.kind]}):null]}),(0,N.jsxs)(`section`,{className:`activity-console`,children:[(0,N.jsxs)(`div`,{className:`console-head`,children:[(0,N.jsx)(`span`,{children:`Activity log`}),(0,N.jsxs)(`span`,{children:[e.length,` entries`]})]}),(0,N.jsx)(`div`,{className:`console-body`,children:e.length===0?(0,N.jsx)(`div`,{className:`console-empty`,children:`等待操作…`}):e.map(e=>(0,N.jsxs)(`div`,{className:`console-row console-row--${e.level}`,children:[(0,N.jsx)(`time`,{children:je(e.timestamp)}),(0,N.jsx)(`span`,{className:`console-level`,children:e.level}),(0,N.jsx)(`span`,{className:`console-message`,children:e.message}),typeof e.detail==`string`?(0,N.jsx)(`span`,{className:`console-detail`,children:e.detail}):null]},e.id))})]})]})}function Ye({profileId:e,status:t}){let[n,r]=(0,_.useState)(``),[i,a]=(0,_.useState)(``),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(``),[u,d]=(0,_.useState)(`all`),[f,p]=(0,_.useState)(1),[m,h]=(0,_.useState)({sessions:[],total:0,pageSize:50,hasNextPage:!1}),[g,v]=(0,_.useState)(``),[y,b]=(0,_.useState)(null),[x,ee]=(0,_.useState)(!1),[te,S]=(0,_.useState)(!1),[C,w]=(0,_.useState)(``),T=(0,_.useRef)(null),E=(0,_.useRef)(null);T.current||=O(),E.current||=O();let ne=Pe(t),re=[...new Set((t?.projectThreadVisibility??[]).map(e=>e.root))];(0,_.useEffect)(()=>{T.current.cancel(),E.current.cancel(),r(``),a(``),s(``),l(``),d(`all`),p(1),h({sessions:[],total:0,pageSize:50,hasNextPage:!1}),v(``),b(null),w(``)},[e]),(0,_.useEffect)(()=>oe(()=>a(n),300,window),[n]);let ae=(0,_.useCallback)(async()=>{let{controller:t,sequence:n}=T.current.begin();ee(!0),w(``);try{let r=await D({...pe(e),page:f,pageSize:50,query:i,provider:o,project:c,archived:u},{signal:t.signal});if(!T.current.isLatest(n))return;let a={...r.history,sessions:le(r.history?.sessions)};h(a),v(e=>a.sessions.some(t=>t.id===e)?e:a.sessions[0]?.id??``)}catch(e){e.name!==`AbortError`&&T.current.isLatest(n)&&w(e.message)}finally{T.current.isLatest(n)&&ee(!1)}},[e,f,i,o,c,u]);(0,_.useEffect)(()=>(ae(),()=>T.current.cancel()),[ae]),(0,_.useEffect)(()=>{if(E.current.cancel(),!g){b(null),S(!1);return}let{controller:t,sequence:n}=E.current.begin();return b(null),S(!0),w(``),ie({...pe(e),sessionId:g},{signal:t.signal}).then(e=>{E.current.isLatest(n)&&b(e.history)}).catch(e=>{e.name!==`AbortError`&&E.current.isLatest(n)&&w(e.message)}).finally(()=>{E.current.isLatest(n)&&S(!1)}),()=>t.abort()},[e,g]);let k=e=>t=>{e(t.target.value),p(1)};return(0,N.jsxs)(`div`,{className:`view-content history-view`,children:[(0,N.jsxs)(`section`,{className:`page-intro`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h1`,{children:`聊天记录`}),(0,N.jsx)(`p`,{children:`从 rollout 文件读取历史会话,只读查看,不修改本地数据。`})]}),(0,N.jsxs)(`button`,{className:`button button--secondary`,type:`button`,onClick:ae,disabled:x,children:[(0,N.jsx)(ge,{size:16,className:x?`spin`:``}),`刷新`]})]}),(0,N.jsxs)(`section`,{className:`history-toolbar`,children:[(0,N.jsx)(`input`,{value:n,onChange:k(r),onKeyDown:e=>{e.key===`Enter`&&(a(n),p(1))},placeholder:`搜索标题、项目、Provider 或消息内容`}),(0,N.jsxs)(`select`,{value:o,onChange:k(s),children:[(0,N.jsx)(`option`,{value:``,children:`全部 Provider`}),ne.map(e=>(0,N.jsx)(`option`,{value:e.id,children:e.id},e.id))]}),(0,N.jsxs)(`select`,{value:c,onChange:k(l),children:[(0,N.jsx)(`option`,{value:``,children:`全部项目`}),re.map(e=>(0,N.jsx)(`option`,{value:e,children:e},e))]}),(0,N.jsxs)(`select`,{value:u,onChange:k(d),children:[(0,N.jsx)(`option`,{value:`all`,children:`全部会话`}),(0,N.jsx)(`option`,{value:`active`,children:`活跃会话`}),(0,N.jsx)(`option`,{value:`archived`,children:`已归档`})]})]}),C?(0,N.jsxs)(`div`,{className:`history-error`,children:[(0,N.jsx)(Te,{size:16}),C]}):null,(0,N.jsxs)(`section`,{className:`history-layout`,children:[(0,N.jsxs)(`div`,{className:`history-list-panel`,children:[(0,N.jsxs)(`div`,{className:`history-list-head`,children:[(0,N.jsxs)(`strong`,{children:[m.total,` 个会话`]}),(0,N.jsxs)(`span`,{children:[`第 `,m.page,` 页`]})]}),(0,N.jsxs)(`div`,{className:`history-list`,children:[x&&!m.sessions.length?(0,N.jsx)(`div`,{className:`large-empty`,children:`读取中…`}):null,!x&&!m.sessions.length?(0,N.jsxs)(`div`,{className:`large-empty`,children:[(0,N.jsx)(ve,{size:24}),(0,N.jsx)(`strong`,{children:`没有匹配的会话`})]}):null,m.sessions.map(e=>(0,N.jsxs)(`button`,{type:`button`,className:`history-session-row ${e.id===g?`history-session-row--selected`:``}`,onClick:()=>v(e.id),children:[(0,N.jsxs)(`div`,{className:`history-session-top`,children:[(0,N.jsx)(`strong`,{children:e.title}),(0,N.jsx)(`time`,{children:je(e.updatedAt)})]}),(0,N.jsx)(`p`,{children:e.firstUserMessage||`没有可读的用户消息`}),(0,N.jsxs)(`div`,{className:`history-session-meta`,children:[(0,N.jsx)(`span`,{children:e.provider}),(0,N.jsxs)(`span`,{children:[e.messageCount,` 条消息`]}),(0,N.jsx)(`span`,{children:e.archived?`已归档`:`活跃`})]})]},e.id))]}),(0,N.jsxs)(`div`,{className:`history-pagination`,children:[(0,N.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:f<=1||x,onClick:()=>p(e=>e-1),children:`上一页`}),(0,N.jsx)(`span`,{children:f}),(0,N.jsx)(`button`,{className:`button button--quiet button--compact`,type:`button`,disabled:!m.hasNextPage||x,onClick:()=>p(e=>e+1),children:`下一页`})]})]}),(0,N.jsx)(`div`,{className:`history-detail-panel`,children:te?(0,N.jsxs)(`div`,{className:`large-empty`,children:[(0,N.jsx)(ge,{size:24,className:`spin`}),(0,N.jsx)(`strong`,{children:`正在读取会话`})]}):y?(0,N.jsxs)(N.Fragment,{children:[(0,N.jsxs)(`div`,{className:`history-detail-head`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`h2`,{children:y.session.title}),(0,N.jsxs)(`p`,{children:[y.session.cwd||`未知项目`,` · `,y.session.provider,` · `,y.session.messageCount,` 条消息`]})]}),(0,N.jsx)(`span`,{children:y.session.archived?`已归档`:`活跃`})]}),y.truncated?(0,N.jsxs)(`div`,{className:`history-truncated`,children:[(0,N.jsx)(Te,{size:15}),`仅显示最近 `,y.returnedMessageCount,` 条消息。`]}):null,(0,N.jsx)(`div`,{className:`message-stream`,children:y.messages.map(e=>(0,N.jsxs)(`article`,{className:`chat-message chat-message--${e.role}`,children:[(0,N.jsxs)(`div`,{className:`chat-message-label`,children:[e.role===`user`?`你`:`Codex`,(0,N.jsx)(`time`,{children:je(e.timestamp)})]}),(0,N.jsx)(`div`,{className:`chat-message-body`,children:(0,N.jsx)(Ne,{text:e.text})})]},`${e.sequence}-${e.timestamp}`))})]}):(0,N.jsxs)(`div`,{className:`large-empty`,children:[(0,N.jsx)(ve,{size:28}),(0,N.jsx)(`strong`,{children:`选择一个会话`}),(0,N.jsx)(`span`,{children:`聊天内容将在这里显示。`})]})})]})]})}function Xe({title:e,children:t,confirmLabel:n,onConfirm:r,onCancel:i,tone:a=`primary`,confirmDisabled:o=!1}){return(0,N.jsx)(`div`,{className:`modal-backdrop`,role:`presentation`,onMouseDown:e=>e.target===e.currentTarget&&i(),children:(0,N.jsxs)(`section`,{className:`modal`,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`modal-title`,children:[(0,N.jsxs)(`div`,{className:`modal-head`,children:[(0,N.jsx)(`h2`,{id:`modal-title`,children:e}),(0,N.jsx)(`button`,{type:`button`,className:`icon-button`,onClick:i,"aria-label":`关闭`,children:(0,N.jsx)(Ce,{size:18})})]}),(0,N.jsx)(`div`,{className:`modal-body`,children:t}),(0,N.jsxs)(`div`,{className:`modal-actions`,children:[(0,N.jsx)(`button`,{className:`button button--secondary`,type:`button`,onClick:i,children:`取消`}),(0,N.jsx)(`button`,{className:`button button--${a}`,type:`button`,disabled:o,onClick:r,children:n})]})]})})}function Ze({plan:e}){if(!e)return null;let t=e.impact??{};return(0,N.jsxs)(N.Fragment,{children:[(0,N.jsxs)(`dl`,{className:`operation-scope`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`计划有效期`}),(0,N.jsx)(`dd`,{children:je(e.expiresAt)})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`Rollout 变更`}),(0,N.jsx)(`dd`,{children:t.rolloutFilesToChange??0})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`SQLite 行变更`}),(0,N.jsx)(`dd`,{children:t.sqliteRowsToChange??0})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`当前锁定 Rollout`}),(0,N.jsx)(`dd`,{children:Array.isArray(t.lockedRolloutFiles)?t.lockedRolloutFiles.length:t.lockedRolloutFiles??0})]})]}),e.warnings?.map(e=>(0,N.jsxs)(`div`,{className:`modal-callout modal-callout--warning`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`计划警告`}),(0,N.jsx)(`span`,{children:e})]})]},e))]})}function Qe({plan:e,corePlan:t,status:n,selectedProvider:r,onCancel:i,onConfirm:a}){return(0,N.jsxs)(Xe,{title:e.mode===`switch`?`确认切换并同步`:`确认同步元数据`,confirmLabel:e.mode===`switch`?`确认切换并同步`:`确认执行同步`,onCancel:i,onConfirm:a,children:[(0,N.jsxs)(`div`,{className:`modal-callout`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`请确认 Codex 已完全关闭`}),(0,N.jsx)(`span`,{children:`关闭 Codex CLI、Codex App、app-server 及相关终端,避免 SQLite 或 rollout 被占用。`})]})]}),(0,N.jsxs)(`dl`,{className:`operation-scope`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`Codex Home`}),(0,N.jsx)(`dd`,{children:n?.codexHome})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`SQLite Home`}),(0,N.jsxs)(`dd`,{children:[n?.sqliteHome,` `,(0,N.jsxs)(`small`,{children:[`(`,n?.sqliteHomeSource,`)`]})]})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`当前 Provider`}),(0,N.jsx)(`dd`,{children:n?.currentProvider})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`目标 Provider`}),(0,N.jsx)(`dd`,{children:r})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`配置变更`}),(0,N.jsx)(`dd`,{children:e.mode===`switch`?`更新 config.toml 根级 model_provider`:`不修改 config.toml`})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`Model 策略`}),(0,N.jsx)(`dd`,{children:e.mode===`switch`?e.modelMode===`auto`?`跟随目标 Provider 配置`:e.modelMode===`keep`?`保留当前根级 model`:`设置为 ${e.model}`:`跟随当前根级 model`})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`备份策略`}),(0,N.jsxs)(`dd`,{children:[`修改前创建备份,保留最近 `,e.keepCount,` 份`]})]})]}),(0,N.jsx)(Ze,{plan:t})]})}function $e({backup:e,status:t,profile:n,onCancel:r,onConfirm:i}){let[a,o]=(0,_.useState)(!1),[s,c]=(0,_.useState)(!0),[l,u]=(0,_.useState)(!0),d=de(t,e),f=fe({backup:e,profile:n,targetSqliteHome:d,restoreDatabase:s,restoreConfig:a,sqliteSupported:t?.sqliteAccess?.supported!==!1,pathComparisonCaseInsensitive:t?.pathComparisonCaseInsensitive===!0});return(0,N.jsxs)(Xe,{title:`恢复备份`,confirmLabel:`覆盖当前元数据`,tone:`danger`,onCancel:r,confirmDisabled:!a&&!s&&!l||!f.canSubmit,onConfirm:()=>i({restoreConfig:a,restoreDatabase:s,restoreSessions:l,allowSqliteHomeRelocation:f.requiresRelocation}),children:[(0,N.jsxs)(`div`,{className:`restore-summary`,children:[(0,N.jsx)(ve,{size:20}),(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`strong`,{children:[je(e.metadata.createdAt),` · `,e.metadata.targetProvider]}),(0,N.jsx)(`code`,{children:e.path})]})]}),(0,N.jsxs)(`fieldset`,{className:`restore-options`,children:[(0,N.jsx)(`legend`,{children:`选择要覆盖的内容`}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`input`,{type:`checkbox`,checked:a,onChange:e=>o(e.target.checked)}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:`config.toml 与 global state`}),(0,N.jsx)(`small`,{children:`恢复 Provider 配置和 Desktop workspace roots`})]})]}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`input`,{type:`checkbox`,checked:s,onChange:e=>c(e.target.checked)}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:`SQLite 线程数据库`}),(0,N.jsx)(`small`,{children:`恢复 state_5.sqlite 及备份中的 WAL/SHM`})]})]}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`input`,{type:`checkbox`,checked:l,onChange:e=>u(e.target.checked)}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:`Rollout 元数据`}),(0,N.jsx)(`small`,{children:`恢复 session_meta 和被修改的 turn_context.model`})]})]})]}),t?.sqliteAccess?.supported===!1?(0,N.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`当前 SQLite 路径仅供诊断`}),(0,N.jsx)(`span`,{children:t.sqliteAccess.message||`不能从 Web UI 执行恢复。`})]})]}):null,f.requiresRelocation?(0,N.jsxs)(`div`,{className:`modal-callout ${f.missingExplicitTarget||f.configRestoreConflict?`modal-callout--danger`:`modal-callout--warning`}`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`SQLite Home 与备份来源不同`}),(0,N.jsxs)(`span`,{children:[`来源:`,e.metadata.sqliteHome,(0,N.jsx)(`br`,{}),`目标:`,d,(0,N.jsx)(`br`,{}),f.missingExplicitTarget?`当前 Profile 未明确配置 SQLite Home,不能提交数据库迁移恢复。`:f.configRestoreConflict?`迁移数据库时不能同时恢复旧 config.toml。`:`确认后数据库将恢复到当前 Profile 明确配置的目标位置。`]})]})]}):null,(0,N.jsxs)(`div`,{className:`modal-callout`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`恢复前请关闭 Codex`}),(0,N.jsx)(`span`,{children:`该操作将覆盖所选的当前元数据;请确认 Codex CLI、App 和 app-server 已关闭。`})]})]})]})}function et({backup:e,corePlan:t,onCancel:n,onConfirm:r}){return(0,N.jsxs)(Xe,{title:`确认恢复计划`,confirmLabel:`按计划恢复`,tone:`danger`,onCancel:n,onConfirm:r,children:[(0,N.jsxs)(`div`,{className:`restore-summary`,children:[(0,N.jsx)(ve,{size:20}),(0,N.jsxs)(`div`,{children:[(0,N.jsxs)(`strong`,{children:[je(e.metadata.createdAt),` · `,e.metadata.targetProvider]}),(0,N.jsx)(`code`,{children:e.id})]})]}),(0,N.jsxs)(`div`,{className:`modal-callout modal-callout--danger`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`Apply 仅使用一次性 planId`}),(0,N.jsx)(`span`,{children:`任何 Profile、配置、Rollout、SQLite 或备份漂移都会使本计划失效,且不会创建新写入。`})]})]}),(0,N.jsx)(Ze,{plan:t})]})}function tt({keepCount:e,backups:t,onCancel:n,onConfirm:r}){let i=Math.max(0,t.backups.length-e);return(0,N.jsxs)(Xe,{title:`清理旧备份`,confirmLabel:`删除 ${i} 份旧备份`,tone:`danger`,onCancel:n,onConfirm:r,confirmDisabled:i===0,children:[(0,N.jsxs)(`div`,{className:`modal-callout modal-callout--warning`,children:[(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`strong`,{children:`被删除的备份无法直接恢复`}),(0,N.jsx)(`span`,{children:`只处理当前 Codex Home 下由本工具管理的备份目录。`})]})]}),(0,N.jsxs)(`dl`,{className:`operation-scope`,children:[(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`当前备份`}),(0,N.jsxs)(`dd`,{children:[t.backups.length,` 份`]})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`保留`}),(0,N.jsxs)(`dd`,{children:[`最近 `,e,` 份`]})]}),(0,N.jsxs)(`div`,{children:[(0,N.jsx)(`dt`,{children:`将删除`}),(0,N.jsxs)(`dd`,{children:[i,` 份`]})]})]})]})}function nt({onCancel:e,onConfirm:t}){let[n,r]=(0,_.useState)(``),[i,a]=(0,_.useState)(``),[o,s]=(0,_.useState)(``),[c,l]=(0,_.useState)(``),u=/^[A-Za-z0-9_.-]{1,80}$/.test(n)&&i.trim()&&o.trim();return(0,N.jsx)(Xe,{title:`新增存储配置`,confirmLabel:`保存配置`,onCancel:e,confirmDisabled:!u,onConfirm:()=>t({profileId:n,name:i,codexHome:o,sqliteHome:c}),children:(0,N.jsxs)(`div`,{className:`profile-form`,children:[(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`span`,{children:`配置 ID`}),(0,N.jsx)(`input`,{value:n,onChange:e=>r(e.target.value),placeholder:`work`,spellCheck:`false`})]}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`span`,{children:`显示名称`}),(0,N.jsx)(`input`,{value:i,onChange:e=>a(e.target.value),placeholder:`工作环境`})]}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`span`,{children:`Codex Home`}),(0,N.jsx)(`input`,{value:o,onChange:e=>s(e.target.value),placeholder:`/home/user/.codex`,spellCheck:`false`})]}),(0,N.jsxs)(`label`,{children:[(0,N.jsx)(`span`,{children:`SQLite Home(可选)`}),(0,N.jsx)(`input`,{value:c,onChange:e=>l(e.target.value),placeholder:`留空时由服务端按配置解析`,spellCheck:`false`})]})]})})}function rt({toast:e,onClose:t}){return(0,_.useEffect)(()=>{if(!e)return;let n=window.setTimeout(t,6e3);return()=>window.clearTimeout(n)},[e,t]),e?(0,N.jsxs)(`div`,{className:`toast toast--${e.tone}`,children:[(0,N.jsxs)(`div`,{children:[e.tone===`success`?(0,N.jsx)(we,{size:18}):(0,N.jsx)(Te,{size:18}),(0,N.jsxs)(`span`,{children:[(0,N.jsx)(`strong`,{children:e.title}),e.message?(0,N.jsx)(`small`,{children:e.message}):null]})]}),(0,N.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`关闭通知`,children:(0,N.jsx)(Ce,{size:16})})]}):null}function it(){let[e,t]=(0,_.useState)(`overview`),[n,r]=(0,_.useState)(`checking`),[i,a]=(0,_.useState)(``),[o,s]=ae(`cps.web.profileId`,`default`),[c,l]=(0,_.useState)([]),[u,d]=ae(`cps.web.manualProviders`,[]),[f,p]=(0,_.useState)(null),[m,h]=(0,_.useState)(Oe),[g,v]=(0,_.useState)(``),[y,ee]=(0,_.useState)(!0),[S,C]=(0,_.useState)(!1),[w,D]=(0,_.useState)(null),[ie,O]=(0,_.useState)(null),[oe,A]=(0,_.useState)([]),[ce,le]=(0,_.useState)(null),ue=(0,_.useRef)(0),j=(0,_.useMemo)(()=>{let e=Pe(f),t=new Set(e.map(e=>e.id));return[...e.map(e=>({...e,manual:u.includes(e.id)})),...u.filter(e=>!t.has(e)).map(e=>({id:e,sources:[`manual`],configured:!1,current:!1,manual:!0}))]},[f,u]),M=c.find(e=>e.id===o)??null,de=(0,_.useRef)(null);de.current||=me({fetchStatus:(e,t)=>T(`/api/status`,e,t),fetchBackups:(e,t)=>T(`/api/backups`,e,t)});let fe=(0,_.useCallback)(async({quiet:e=!1}={})=>{await de.current({profileId:o,showLoading:!e,onLoading:ee,onResult:({status:e,backups:t})=>{p(e),h(t),v(t=>t&&Pe(e).some(e=>e.id===t)?t:e.currentProvider)},onError:e=>{O({tone:`error`,title:`状态读取失败`,message:e.message})}})},[o]),he=(0,_.useCallback)(async()=>{let e=await ne();l(e.profiles),s(t=>e.profiles.some(e=>e.id===t)?t:`default`)},[s]),P=(0,_.useCallback)(async()=>{D(null);try{await he(),await fe({quiet:!0})}catch{}O({tone:`warning`,title:`配置已变更,请重新确认`,message:`已刷新存储配置和当前状态;未自动重试原操作。`})},[fe,he]),ge=(0,_.useCallback)(async e=>{let t=k(M,e,f);if(!t){O({tone:`warning`,title:`配置需要刷新`,message:`没有可用的配置版本,请刷新后重新确认操作。`}),he().catch(()=>{});return}if(e.type!==`execute`){D(t);return}C(!0);try{let e={...pe(t.profileId),profileRevision:t.profileRevision,provider:t.selectedProvider,keepCount:t.plan.keepCount},n=await T(t.plan.mode===`switch`?`/api/switch/prepare`:`/api/sync/prepare`,t.plan.mode===`switch`?{...e,modelMode:t.plan.modelMode===`auto`?`provider-default`:t.plan.modelMode===`keep`?`keep-root-model`:`explicit`,model:t.plan.modelMode===`custom`?t.plan.model:void 0}:e);D({...t,corePlan:n.plan})}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`计划生成失败`,message:e.message})}finally{C(!1)}},[P,he,M,f]);(0,_.useEffect)(()=>{let e=!1;return te().then(async t=>{if(!t)throw new b;await he(),e||r(`ready`)}).catch(t=>{e||(r(t instanceof b?`required`:`error`),a(t.message))}),()=>{e=!0}},[he]),(0,_.useEffect)(()=>{n===`ready`&&fe()},[n,o]),(0,_.useEffect)(()=>{let e=e=>{r(`required`),a(e.detail||`设备凭证已失效。请重新运行 codex-provider web。`)};return window.addEventListener(`cps:pairing-required`,e),()=>window.removeEventListener(`cps:pairing-required`,e)},[]),(0,_.useEffect)(()=>{if(n!==`ready`)return;let e=!1,t=async()=>{try{let t=await E(ue.current);if(e)return;t.activity?.length&&(ue.current=t.activity[t.activity.length-1].id,A(e=>[...e,...t.activity].slice(-250))),le(t.activeOperation??null)}catch{}};t();let r=window.setInterval(t,900);return()=>{e=!0,window.clearInterval(r)}},[n]);let _e=(0,_.useCallback)(async()=>{let e=w.plan,n=w.corePlan;D(null),C(!0),t(`activity`);try{let t=await T(e.mode===`switch`?`/api/switch/apply`:`/api/sync/apply`,{schemaVersion:n.schemaVersion,planId:n.planId});O(se(t,{successTitle:e.mode===`switch`?`切换并同步完成`:`同步完成`,partialTitle:e.mode===`switch`?`切换并同步部分完成`:`同步部分完成`,message:`备份:${t.result?.backup?.path??t.result?.result?.backupDir??`已创建`}`})),await fe({quiet:!0})}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`操作失败`,message:e.message})}finally{C(!1)}},[P,w,fe]),ve=(0,_.useCallback)(async e=>{let t=w.backup,n=w.profileId;C(!0);try{let r=await T(`/api/restore/prepare`,{...pe(n),profileRevision:w.profileRevision,backupId:t.id,...e});D({...w,type:`restoreApply`,restoreOptions:e,corePlan:r.plan})}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`恢复计划生成失败`,message:e.message})}finally{C(!1)}},[P,w]),ye=(0,_.useCallback)(async()=>{let e=w.backup,n=w.corePlan;D(null),C(!0),t(`activity`);try{let t=await T(`/api/restore/apply`,{schemaVersion:n.schemaVersion,planId:n.planId});O(se(t,{successTitle:`备份恢复完成`,partialTitle:`备份恢复部分完成`,message:e.id})),await fe({quiet:!0})}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`恢复失败`,message:e.message})}finally{C(!1)}},[P,w,fe]),be=(0,_.useCallback)(async()=>{let e=w.keepCount,t=w.profileId;D(null),C(!0);try{let n=await T(`/api/prune`,{...pe(t),profileRevision:w.profileRevision,storageRevision:w.storageRevision,keepCount:e});O(se(n,{successTitle:`旧备份清理完成`,partialTitle:`旧备份清理部分完成`,message:`删除 ${n.result?.deletedCount??0} 份,释放 ${Ae(n.result?.freedBytes)}`})),await fe({quiet:!0})}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`备份清理失败`,message:e.message})}finally{C(!1)}},[P,w,fe]),Se=(0,_.useCallback)(()=>O(null),[]),Ce=(0,_.useCallback)(async e=>{try{let t=await T(`/api/profiles/save`,e.revision?{...e,profileRevision:e.revision}:e);D(null),await he(),s(t.profile.id),O({tone:`success`,title:`存储配置已保存`,message:t.profile.name})}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`配置保存失败`,message:e.message})}},[P,he,s]),we=(0,_.useCallback)(async()=>{try{await T(`/api/profiles/delete`,{profileId:o,profileRevision:M?.revision}),s(`default`),await he()}catch(e){if(e instanceof x){await P();return}O({tone:`error`,title:`配置删除失败`,message:e.message})}},[P,o,he,M?.revision,s]),Te=(0,_.useCallback)(async()=>{await re().catch(()=>{}),r(`required`),a(`此浏览器的设备凭证已失效。重新运行 codex-provider web 即可自动配对。`)},[]),Ee=(0,_.useCallback)(e=>{d(t=>[...new Set([...t,e])].sort()),v(e)},[d]),De=(0,_.useCallback)(e=>{d(t=>t.filter(t=>t!==e)),v(f?.currentProvider??``)},[d,f?.currentProvider]);return n===`ready`?(0,N.jsxs)(`div`,{className:`app-shell`,children:[(0,N.jsx)(Ie,{status:f,busy:S||!!ce,onRefresh:()=>fe()}),(0,N.jsx)(Le,{view:e,setView:t,status:f,onForgetBrowser:Te}),(0,N.jsxs)(`main`,{className:`main-area`,children:[(0,N.jsx)(Re,{profiles:c,profileId:o,setProfileId:s,status:f,onAddProfile:()=>D({type:`profile`}),onDeleteProfile:we,onRefresh:()=>fe(),loading:y,profileSwitchDisabled:S||!!w}),e===`overview`?(0,N.jsx)(Ke,{status:f,backups:m,providers:j,selectedProvider:g,setSelectedProvider:v,onAddManualProvider:Ee,onRemoveManualProvider:De,onExecute:e=>ge({type:`execute`,plan:e,selectedProvider:g}),onRestore:e=>ge({type:`restore`,backup:e}),setView:t,busy:S,loading:y}):null,e===`history`?(0,N.jsx)(Ye,{profileId:o,status:f}):null,e===`backups`?(0,N.jsx)(qe,{backups:m,status:f,busy:S,onRestore:e=>ge({type:`restore`,backup:e}),onPrune:e=>ge({type:`prune`,keepCount:e})}):null,e===`activity`?(0,N.jsx)(Je,{activity:oe,activeOperation:ce}):null]}),w?.type===`execute`?(0,N.jsx)(Qe,{plan:w.plan,corePlan:w.corePlan,status:w.status,selectedProvider:w.selectedProvider,onCancel:()=>D(null),onConfirm:_e}):null,w?.type===`restore`?(0,N.jsx)($e,{backup:w.backup,status:w.status,profile:w.profile,onCancel:()=>D(null),onConfirm:ve}):null,w?.type===`restoreApply`?(0,N.jsx)(et,{backup:w.backup,corePlan:w.corePlan,onCancel:()=>D(null),onConfirm:ye}):null,w?.type===`prune`?(0,N.jsx)(tt,{keepCount:w.keepCount,backups:m,onCancel:()=>D(null),onConfirm:be}):null,w?.type===`profile`?(0,N.jsx)(nt,{onCancel:()=>D(null),onConfirm:Ce}):null,(0,N.jsx)(rt,{toast:ie,onClose:Se})]}):(0,N.jsxs)(`div`,{className:`access-gate`,children:[(0,N.jsx)(xe,{size:32}),(0,N.jsx)(`h1`,{children:n===`checking`?`正在完成安全配对`:`需要重新配对`}),(0,N.jsx)(`p`,{children:n===`checking`?`请稍候…`:i||`请重新运行 codex-provider web。`}),n===`checking`?null:(0,N.jsx)(`code`,{children:`codex-provider web`})]})}(0,v.createRoot)(document.getElementById(`root`)).render((0,N.jsx)(_.StrictMode,{children:(0,N.jsx)(it,{})})); -//# sourceMappingURL=index-DAOqepUV.js.map \ No newline at end of file diff --git a/web/dist/assets/index-DAOqepUV.js.map b/web/dist/assets/index-DAOqepUV.js.map deleted file mode 100644 index 4d5e08e..0000000 --- a/web/dist/assets/index-DAOqepUV.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index-DAOqepUV.js","names":[],"sources":["../../../node_modules/react/cjs/react.production.js","../../../node_modules/react/index.js","../../../node_modules/scheduler/cjs/scheduler.production.js","../../../node_modules/scheduler/index.js","../../../node_modules/react-dom/cjs/react-dom.production.js","../../../node_modules/react-dom/index.js","../../../node_modules/react-dom/cjs/react-dom-client.production.js","../../../node_modules/react-dom/client.js","../../src/api.js","../../src/hooks.js","../../src/history-requests.js","../../src/operation-state.js","../../src/profile-refresh.js","../../../node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/react/jsx-runtime.js","../../src/icons.jsx","../../src/App.jsx","../../src/main.jsx"],"sourcesContent":["/**\n * @license React\n * react.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nfunction getIteratorFn(maybeIterable) {\n if (null === maybeIterable || \"object\" !== typeof maybeIterable) return null;\n maybeIterable =\n (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n maybeIterable[\"@@iterator\"];\n return \"function\" === typeof maybeIterable ? maybeIterable : null;\n}\nvar ReactNoopUpdateQueue = {\n isMounted: function () {\n return !1;\n },\n enqueueForceUpdate: function () {},\n enqueueReplaceState: function () {},\n enqueueSetState: function () {}\n },\n assign = Object.assign,\n emptyObject = {};\nfunction Component(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n}\nComponent.prototype.isReactComponent = {};\nComponent.prototype.setState = function (partialState, callback) {\n if (\n \"object\" !== typeof partialState &&\n \"function\" !== typeof partialState &&\n null != partialState\n )\n throw Error(\n \"takes an object of state variables to update or a function which returns an object of state variables.\"\n );\n this.updater.enqueueSetState(this, partialState, callback, \"setState\");\n};\nComponent.prototype.forceUpdate = function (callback) {\n this.updater.enqueueForceUpdate(this, callback, \"forceUpdate\");\n};\nfunction ComponentDummy() {}\nComponentDummy.prototype = Component.prototype;\nfunction PureComponent(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n}\nvar pureComponentPrototype = (PureComponent.prototype = new ComponentDummy());\npureComponentPrototype.constructor = PureComponent;\nassign(pureComponentPrototype, Component.prototype);\npureComponentPrototype.isPureReactComponent = !0;\nvar isArrayImpl = Array.isArray;\nfunction noop() {}\nvar ReactSharedInternals = { H: null, A: null, T: null, S: null },\n hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction ReactElement(type, key, props) {\n var refProp = props.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== refProp ? refProp : null,\n props: props\n };\n}\nfunction cloneAndReplaceKey(oldElement, newKey) {\n return ReactElement(oldElement.type, newKey, oldElement.props);\n}\nfunction isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n}\nfunction escape(key) {\n var escaperLookup = { \"=\": \"=0\", \":\": \"=2\" };\n return (\n \"$\" +\n key.replace(/[=:]/g, function (match) {\n return escaperLookup[match];\n })\n );\n}\nvar userProvidedKeyEscapeRegex = /\\/+/g;\nfunction getElementKey(element, index) {\n return \"object\" === typeof element && null !== element && null != element.key\n ? escape(\"\" + element.key)\n : index.toString(36);\n}\nfunction resolveThenable(thenable) {\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw thenable.reason;\n default:\n switch (\n (\"string\" === typeof thenable.status\n ? thenable.then(noop, noop)\n : ((thenable.status = \"pending\"),\n thenable.then(\n function (fulfilledValue) {\n \"pending\" === thenable.status &&\n ((thenable.status = \"fulfilled\"),\n (thenable.value = fulfilledValue));\n },\n function (error) {\n \"pending\" === thenable.status &&\n ((thenable.status = \"rejected\"), (thenable.reason = error));\n }\n )),\n thenable.status)\n ) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw thenable.reason;\n }\n }\n throw thenable;\n}\nfunction mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {\n var type = typeof children;\n if (\"undefined\" === type || \"boolean\" === type) children = null;\n var invokeCallback = !1;\n if (null === children) invokeCallback = !0;\n else\n switch (type) {\n case \"bigint\":\n case \"string\":\n case \"number\":\n invokeCallback = !0;\n break;\n case \"object\":\n switch (children.$$typeof) {\n case REACT_ELEMENT_TYPE:\n case REACT_PORTAL_TYPE:\n invokeCallback = !0;\n break;\n case REACT_LAZY_TYPE:\n return (\n (invokeCallback = children._init),\n mapIntoArray(\n invokeCallback(children._payload),\n array,\n escapedPrefix,\n nameSoFar,\n callback\n )\n );\n }\n }\n if (invokeCallback)\n return (\n (callback = callback(children)),\n (invokeCallback =\n \"\" === nameSoFar ? \".\" + getElementKey(children, 0) : nameSoFar),\n isArrayImpl(callback)\n ? ((escapedPrefix = \"\"),\n null != invokeCallback &&\n (escapedPrefix =\n invokeCallback.replace(userProvidedKeyEscapeRegex, \"$&/\") + \"/\"),\n mapIntoArray(callback, array, escapedPrefix, \"\", function (c) {\n return c;\n }))\n : null != callback &&\n (isValidElement(callback) &&\n (callback = cloneAndReplaceKey(\n callback,\n escapedPrefix +\n (null == callback.key ||\n (children && children.key === callback.key)\n ? \"\"\n : (\"\" + callback.key).replace(\n userProvidedKeyEscapeRegex,\n \"$&/\"\n ) + \"/\") +\n invokeCallback\n )),\n array.push(callback)),\n 1\n );\n invokeCallback = 0;\n var nextNamePrefix = \"\" === nameSoFar ? \".\" : nameSoFar + \":\";\n if (isArrayImpl(children))\n for (var i = 0; i < children.length; i++)\n (nameSoFar = children[i]),\n (type = nextNamePrefix + getElementKey(nameSoFar, i)),\n (invokeCallback += mapIntoArray(\n nameSoFar,\n array,\n escapedPrefix,\n type,\n callback\n ));\n else if (((i = getIteratorFn(children)), \"function\" === typeof i))\n for (\n children = i.call(children), i = 0;\n !(nameSoFar = children.next()).done;\n\n )\n (nameSoFar = nameSoFar.value),\n (type = nextNamePrefix + getElementKey(nameSoFar, i++)),\n (invokeCallback += mapIntoArray(\n nameSoFar,\n array,\n escapedPrefix,\n type,\n callback\n ));\n else if (\"object\" === type) {\n if (\"function\" === typeof children.then)\n return mapIntoArray(\n resolveThenable(children),\n array,\n escapedPrefix,\n nameSoFar,\n callback\n );\n array = String(children);\n throw Error(\n \"Objects are not valid as a React child (found: \" +\n (\"[object Object]\" === array\n ? \"object with keys {\" + Object.keys(children).join(\", \") + \"}\"\n : array) +\n \"). If you meant to render a collection of children, use an array instead.\"\n );\n }\n return invokeCallback;\n}\nfunction mapChildren(children, func, context) {\n if (null == children) return children;\n var result = [],\n count = 0;\n mapIntoArray(children, result, \"\", \"\", function (child) {\n return func.call(context, child, count++);\n });\n return result;\n}\nfunction lazyInitializer(payload) {\n if (-1 === payload._status) {\n var ctor = payload._result;\n ctor = ctor();\n ctor.then(\n function (moduleObject) {\n if (0 === payload._status || -1 === payload._status)\n (payload._status = 1), (payload._result = moduleObject);\n },\n function (error) {\n if (0 === payload._status || -1 === payload._status)\n (payload._status = 2), (payload._result = error);\n }\n );\n -1 === payload._status && ((payload._status = 0), (payload._result = ctor));\n }\n if (1 === payload._status) return payload._result.default;\n throw payload._result;\n}\nvar reportGlobalError =\n \"function\" === typeof reportError\n ? reportError\n : function (error) {\n if (\n \"object\" === typeof window &&\n \"function\" === typeof window.ErrorEvent\n ) {\n var event = new window.ErrorEvent(\"error\", {\n bubbles: !0,\n cancelable: !0,\n message:\n \"object\" === typeof error &&\n null !== error &&\n \"string\" === typeof error.message\n ? String(error.message)\n : String(error),\n error: error\n });\n if (!window.dispatchEvent(event)) return;\n } else if (\n \"object\" === typeof process &&\n \"function\" === typeof process.emit\n ) {\n process.emit(\"uncaughtException\", error);\n return;\n }\n console.error(error);\n },\n Children = {\n map: mapChildren,\n forEach: function (children, forEachFunc, forEachContext) {\n mapChildren(\n children,\n function () {\n forEachFunc.apply(this, arguments);\n },\n forEachContext\n );\n },\n count: function (children) {\n var n = 0;\n mapChildren(children, function () {\n n++;\n });\n return n;\n },\n toArray: function (children) {\n return (\n mapChildren(children, function (child) {\n return child;\n }) || []\n );\n },\n only: function (children) {\n if (!isValidElement(children))\n throw Error(\n \"React.Children.only expected to receive a single React element child.\"\n );\n return children;\n }\n };\nexports.Activity = REACT_ACTIVITY_TYPE;\nexports.Children = Children;\nexports.Component = Component;\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.Profiler = REACT_PROFILER_TYPE;\nexports.PureComponent = PureComponent;\nexports.StrictMode = REACT_STRICT_MODE_TYPE;\nexports.Suspense = REACT_SUSPENSE_TYPE;\nexports.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n ReactSharedInternals;\nexports.__COMPILER_RUNTIME = {\n __proto__: null,\n c: function (size) {\n return ReactSharedInternals.H.useMemoCache(size);\n }\n};\nexports.cache = function (fn) {\n return function () {\n return fn.apply(null, arguments);\n };\n};\nexports.cacheSignal = function () {\n return null;\n};\nexports.cloneElement = function (element, config, children) {\n if (null === element || void 0 === element)\n throw Error(\n \"The argument must be a React element, but you passed \" + element + \".\"\n );\n var props = assign({}, element.props),\n key = element.key;\n if (null != config)\n for (propName in (void 0 !== config.key && (key = \"\" + config.key), config))\n !hasOwnProperty.call(config, propName) ||\n \"key\" === propName ||\n \"__self\" === propName ||\n \"__source\" === propName ||\n (\"ref\" === propName && void 0 === config.ref) ||\n (props[propName] = config[propName]);\n var propName = arguments.length - 2;\n if (1 === propName) props.children = children;\n else if (1 < propName) {\n for (var childArray = Array(propName), i = 0; i < propName; i++)\n childArray[i] = arguments[i + 2];\n props.children = childArray;\n }\n return ReactElement(element.type, key, props);\n};\nexports.createContext = function (defaultValue) {\n defaultValue = {\n $$typeof: REACT_CONTEXT_TYPE,\n _currentValue: defaultValue,\n _currentValue2: defaultValue,\n _threadCount: 0,\n Provider: null,\n Consumer: null\n };\n defaultValue.Provider = defaultValue;\n defaultValue.Consumer = {\n $$typeof: REACT_CONSUMER_TYPE,\n _context: defaultValue\n };\n return defaultValue;\n};\nexports.createElement = function (type, config, children) {\n var propName,\n props = {},\n key = null;\n if (null != config)\n for (propName in (void 0 !== config.key && (key = \"\" + config.key), config))\n hasOwnProperty.call(config, propName) &&\n \"key\" !== propName &&\n \"__self\" !== propName &&\n \"__source\" !== propName &&\n (props[propName] = config[propName]);\n var childrenLength = arguments.length - 2;\n if (1 === childrenLength) props.children = children;\n else if (1 < childrenLength) {\n for (var childArray = Array(childrenLength), i = 0; i < childrenLength; i++)\n childArray[i] = arguments[i + 2];\n props.children = childArray;\n }\n if (type && type.defaultProps)\n for (propName in ((childrenLength = type.defaultProps), childrenLength))\n void 0 === props[propName] &&\n (props[propName] = childrenLength[propName]);\n return ReactElement(type, key, props);\n};\nexports.createRef = function () {\n return { current: null };\n};\nexports.forwardRef = function (render) {\n return { $$typeof: REACT_FORWARD_REF_TYPE, render: render };\n};\nexports.isValidElement = isValidElement;\nexports.lazy = function (ctor) {\n return {\n $$typeof: REACT_LAZY_TYPE,\n _payload: { _status: -1, _result: ctor },\n _init: lazyInitializer\n };\n};\nexports.memo = function (type, compare) {\n return {\n $$typeof: REACT_MEMO_TYPE,\n type: type,\n compare: void 0 === compare ? null : compare\n };\n};\nexports.startTransition = function (scope) {\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n try {\n var returnValue = scope(),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n \"object\" === typeof returnValue &&\n null !== returnValue &&\n \"function\" === typeof returnValue.then &&\n returnValue.then(noop, reportGlobalError);\n } catch (error) {\n reportGlobalError(error);\n } finally {\n null !== prevTransition &&\n null !== currentTransition.types &&\n (prevTransition.types = currentTransition.types),\n (ReactSharedInternals.T = prevTransition);\n }\n};\nexports.unstable_useCacheRefresh = function () {\n return ReactSharedInternals.H.useCacheRefresh();\n};\nexports.use = function (usable) {\n return ReactSharedInternals.H.use(usable);\n};\nexports.useActionState = function (action, initialState, permalink) {\n return ReactSharedInternals.H.useActionState(action, initialState, permalink);\n};\nexports.useCallback = function (callback, deps) {\n return ReactSharedInternals.H.useCallback(callback, deps);\n};\nexports.useContext = function (Context) {\n return ReactSharedInternals.H.useContext(Context);\n};\nexports.useDebugValue = function () {};\nexports.useDeferredValue = function (value, initialValue) {\n return ReactSharedInternals.H.useDeferredValue(value, initialValue);\n};\nexports.useEffect = function (create, deps) {\n return ReactSharedInternals.H.useEffect(create, deps);\n};\nexports.useEffectEvent = function (callback) {\n return ReactSharedInternals.H.useEffectEvent(callback);\n};\nexports.useId = function () {\n return ReactSharedInternals.H.useId();\n};\nexports.useImperativeHandle = function (ref, create, deps) {\n return ReactSharedInternals.H.useImperativeHandle(ref, create, deps);\n};\nexports.useInsertionEffect = function (create, deps) {\n return ReactSharedInternals.H.useInsertionEffect(create, deps);\n};\nexports.useLayoutEffect = function (create, deps) {\n return ReactSharedInternals.H.useLayoutEffect(create, deps);\n};\nexports.useMemo = function (create, deps) {\n return ReactSharedInternals.H.useMemo(create, deps);\n};\nexports.useOptimistic = function (passthrough, reducer) {\n return ReactSharedInternals.H.useOptimistic(passthrough, reducer);\n};\nexports.useReducer = function (reducer, initialArg, init) {\n return ReactSharedInternals.H.useReducer(reducer, initialArg, init);\n};\nexports.useRef = function (initialValue) {\n return ReactSharedInternals.H.useRef(initialValue);\n};\nexports.useState = function (initialState) {\n return ReactSharedInternals.H.useState(initialState);\n};\nexports.useSyncExternalStore = function (\n subscribe,\n getSnapshot,\n getServerSnapshot\n) {\n return ReactSharedInternals.H.useSyncExternalStore(\n subscribe,\n getSnapshot,\n getServerSnapshot\n );\n};\nexports.useTransition = function () {\n return ReactSharedInternals.H.useTransition();\n};\nexports.version = \"19.2.8\";\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","/**\n * @license React\n * scheduler.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nfunction push(heap, node) {\n var index = heap.length;\n heap.push(node);\n a: for (; 0 < index; ) {\n var parentIndex = (index - 1) >>> 1,\n parent = heap[parentIndex];\n if (0 < compare(parent, node))\n (heap[parentIndex] = node), (heap[index] = parent), (index = parentIndex);\n else break a;\n }\n}\nfunction peek(heap) {\n return 0 === heap.length ? null : heap[0];\n}\nfunction pop(heap) {\n if (0 === heap.length) return null;\n var first = heap[0],\n last = heap.pop();\n if (last !== first) {\n heap[0] = last;\n a: for (\n var index = 0, length = heap.length, halfLength = length >>> 1;\n index < halfLength;\n\n ) {\n var leftIndex = 2 * (index + 1) - 1,\n left = heap[leftIndex],\n rightIndex = leftIndex + 1,\n right = heap[rightIndex];\n if (0 > compare(left, last))\n rightIndex < length && 0 > compare(right, left)\n ? ((heap[index] = right),\n (heap[rightIndex] = last),\n (index = rightIndex))\n : ((heap[index] = left),\n (heap[leftIndex] = last),\n (index = leftIndex));\n else if (rightIndex < length && 0 > compare(right, last))\n (heap[index] = right), (heap[rightIndex] = last), (index = rightIndex);\n else break a;\n }\n }\n return first;\n}\nfunction compare(a, b) {\n var diff = a.sortIndex - b.sortIndex;\n return 0 !== diff ? diff : a.id - b.id;\n}\nexports.unstable_now = void 0;\nif (\"object\" === typeof performance && \"function\" === typeof performance.now) {\n var localPerformance = performance;\n exports.unstable_now = function () {\n return localPerformance.now();\n };\n} else {\n var localDate = Date,\n initialTime = localDate.now();\n exports.unstable_now = function () {\n return localDate.now() - initialTime;\n };\n}\nvar taskQueue = [],\n timerQueue = [],\n taskIdCounter = 1,\n currentTask = null,\n currentPriorityLevel = 3,\n isPerformingWork = !1,\n isHostCallbackScheduled = !1,\n isHostTimeoutScheduled = !1,\n needsPaint = !1,\n localSetTimeout = \"function\" === typeof setTimeout ? setTimeout : null,\n localClearTimeout = \"function\" === typeof clearTimeout ? clearTimeout : null,\n localSetImmediate = \"undefined\" !== typeof setImmediate ? setImmediate : null;\nfunction advanceTimers(currentTime) {\n for (var timer = peek(timerQueue); null !== timer; ) {\n if (null === timer.callback) pop(timerQueue);\n else if (timer.startTime <= currentTime)\n pop(timerQueue),\n (timer.sortIndex = timer.expirationTime),\n push(taskQueue, timer);\n else break;\n timer = peek(timerQueue);\n }\n}\nfunction handleTimeout(currentTime) {\n isHostTimeoutScheduled = !1;\n advanceTimers(currentTime);\n if (!isHostCallbackScheduled)\n if (null !== peek(taskQueue))\n (isHostCallbackScheduled = !0),\n isMessageLoopRunning ||\n ((isMessageLoopRunning = !0), schedulePerformWorkUntilDeadline());\n else {\n var firstTimer = peek(timerQueue);\n null !== firstTimer &&\n requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n }\n}\nvar isMessageLoopRunning = !1,\n taskTimeoutID = -1,\n frameInterval = 5,\n startTime = -1;\nfunction shouldYieldToHost() {\n return needsPaint\n ? !0\n : exports.unstable_now() - startTime < frameInterval\n ? !1\n : !0;\n}\nfunction performWorkUntilDeadline() {\n needsPaint = !1;\n if (isMessageLoopRunning) {\n var currentTime = exports.unstable_now();\n startTime = currentTime;\n var hasMoreWork = !0;\n try {\n a: {\n isHostCallbackScheduled = !1;\n isHostTimeoutScheduled &&\n ((isHostTimeoutScheduled = !1),\n localClearTimeout(taskTimeoutID),\n (taskTimeoutID = -1));\n isPerformingWork = !0;\n var previousPriorityLevel = currentPriorityLevel;\n try {\n b: {\n advanceTimers(currentTime);\n for (\n currentTask = peek(taskQueue);\n null !== currentTask &&\n !(\n currentTask.expirationTime > currentTime && shouldYieldToHost()\n );\n\n ) {\n var callback = currentTask.callback;\n if (\"function\" === typeof callback) {\n currentTask.callback = null;\n currentPriorityLevel = currentTask.priorityLevel;\n var continuationCallback = callback(\n currentTask.expirationTime <= currentTime\n );\n currentTime = exports.unstable_now();\n if (\"function\" === typeof continuationCallback) {\n currentTask.callback = continuationCallback;\n advanceTimers(currentTime);\n hasMoreWork = !0;\n break b;\n }\n currentTask === peek(taskQueue) && pop(taskQueue);\n advanceTimers(currentTime);\n } else pop(taskQueue);\n currentTask = peek(taskQueue);\n }\n if (null !== currentTask) hasMoreWork = !0;\n else {\n var firstTimer = peek(timerQueue);\n null !== firstTimer &&\n requestHostTimeout(\n handleTimeout,\n firstTimer.startTime - currentTime\n );\n hasMoreWork = !1;\n }\n }\n break a;\n } finally {\n (currentTask = null),\n (currentPriorityLevel = previousPriorityLevel),\n (isPerformingWork = !1);\n }\n hasMoreWork = void 0;\n }\n } finally {\n hasMoreWork\n ? schedulePerformWorkUntilDeadline()\n : (isMessageLoopRunning = !1);\n }\n }\n}\nvar schedulePerformWorkUntilDeadline;\nif (\"function\" === typeof localSetImmediate)\n schedulePerformWorkUntilDeadline = function () {\n localSetImmediate(performWorkUntilDeadline);\n };\nelse if (\"undefined\" !== typeof MessageChannel) {\n var channel = new MessageChannel(),\n port = channel.port2;\n channel.port1.onmessage = performWorkUntilDeadline;\n schedulePerformWorkUntilDeadline = function () {\n port.postMessage(null);\n };\n} else\n schedulePerformWorkUntilDeadline = function () {\n localSetTimeout(performWorkUntilDeadline, 0);\n };\nfunction requestHostTimeout(callback, ms) {\n taskTimeoutID = localSetTimeout(function () {\n callback(exports.unstable_now());\n }, ms);\n}\nexports.unstable_IdlePriority = 5;\nexports.unstable_ImmediatePriority = 1;\nexports.unstable_LowPriority = 4;\nexports.unstable_NormalPriority = 3;\nexports.unstable_Profiling = null;\nexports.unstable_UserBlockingPriority = 2;\nexports.unstable_cancelCallback = function (task) {\n task.callback = null;\n};\nexports.unstable_forceFrameRate = function (fps) {\n 0 > fps || 125 < fps\n ? console.error(\n \"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"\n )\n : (frameInterval = 0 < fps ? Math.floor(1e3 / fps) : 5);\n};\nexports.unstable_getCurrentPriorityLevel = function () {\n return currentPriorityLevel;\n};\nexports.unstable_next = function (eventHandler) {\n switch (currentPriorityLevel) {\n case 1:\n case 2:\n case 3:\n var priorityLevel = 3;\n break;\n default:\n priorityLevel = currentPriorityLevel;\n }\n var previousPriorityLevel = currentPriorityLevel;\n currentPriorityLevel = priorityLevel;\n try {\n return eventHandler();\n } finally {\n currentPriorityLevel = previousPriorityLevel;\n }\n};\nexports.unstable_requestPaint = function () {\n needsPaint = !0;\n};\nexports.unstable_runWithPriority = function (priorityLevel, eventHandler) {\n switch (priorityLevel) {\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n break;\n default:\n priorityLevel = 3;\n }\n var previousPriorityLevel = currentPriorityLevel;\n currentPriorityLevel = priorityLevel;\n try {\n return eventHandler();\n } finally {\n currentPriorityLevel = previousPriorityLevel;\n }\n};\nexports.unstable_scheduleCallback = function (\n priorityLevel,\n callback,\n options\n) {\n var currentTime = exports.unstable_now();\n \"object\" === typeof options && null !== options\n ? ((options = options.delay),\n (options =\n \"number\" === typeof options && 0 < options\n ? currentTime + options\n : currentTime))\n : (options = currentTime);\n switch (priorityLevel) {\n case 1:\n var timeout = -1;\n break;\n case 2:\n timeout = 250;\n break;\n case 5:\n timeout = 1073741823;\n break;\n case 4:\n timeout = 1e4;\n break;\n default:\n timeout = 5e3;\n }\n timeout = options + timeout;\n priorityLevel = {\n id: taskIdCounter++,\n callback: callback,\n priorityLevel: priorityLevel,\n startTime: options,\n expirationTime: timeout,\n sortIndex: -1\n };\n options > currentTime\n ? ((priorityLevel.sortIndex = options),\n push(timerQueue, priorityLevel),\n null === peek(taskQueue) &&\n priorityLevel === peek(timerQueue) &&\n (isHostTimeoutScheduled\n ? (localClearTimeout(taskTimeoutID), (taskTimeoutID = -1))\n : (isHostTimeoutScheduled = !0),\n requestHostTimeout(handleTimeout, options - currentTime)))\n : ((priorityLevel.sortIndex = timeout),\n push(taskQueue, priorityLevel),\n isHostCallbackScheduled ||\n isPerformingWork ||\n ((isHostCallbackScheduled = !0),\n isMessageLoopRunning ||\n ((isMessageLoopRunning = !0), schedulePerformWorkUntilDeadline())));\n return priorityLevel;\n};\nexports.unstable_shouldYield = shouldYieldToHost;\nexports.unstable_wrapCallback = function (callback) {\n var parentPriorityLevel = currentPriorityLevel;\n return function () {\n var previousPriorityLevel = currentPriorityLevel;\n currentPriorityLevel = parentPriorityLevel;\n try {\n return callback.apply(this, arguments);\n } finally {\n currentPriorityLevel = previousPriorityLevel;\n }\n };\n};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","/**\n * @license React\n * react-dom.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction formatProdErrorMessage(code) {\n var url = \"https://react.dev/errors/\" + code;\n if (1 < arguments.length) {\n url += \"?args[]=\" + encodeURIComponent(arguments[1]);\n for (var i = 2; i < arguments.length; i++)\n url += \"&args[]=\" + encodeURIComponent(arguments[i]);\n }\n return (\n \"Minified React error #\" +\n code +\n \"; visit \" +\n url +\n \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"\n );\n}\nfunction noop() {}\nvar Internals = {\n d: {\n f: noop,\n r: function () {\n throw Error(formatProdErrorMessage(522));\n },\n D: noop,\n C: noop,\n L: noop,\n m: noop,\n X: noop,\n S: noop,\n M: noop\n },\n p: 0,\n findDOMNode: null\n },\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\");\nfunction createPortal$1(children, containerInfo, implementation) {\n var key =\n 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;\n return {\n $$typeof: REACT_PORTAL_TYPE,\n key: null == key ? null : \"\" + key,\n children: children,\n containerInfo: containerInfo,\n implementation: implementation\n };\n}\nvar ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;\nfunction getCrossOriginStringAs(as, input) {\n if (\"font\" === as) return \"\";\n if (\"string\" === typeof input)\n return \"use-credentials\" === input ? input : \"\";\n}\nexports.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n Internals;\nexports.createPortal = function (children, container) {\n var key =\n 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;\n if (\n !container ||\n (1 !== container.nodeType &&\n 9 !== container.nodeType &&\n 11 !== container.nodeType)\n )\n throw Error(formatProdErrorMessage(299));\n return createPortal$1(children, container, null, key);\n};\nexports.flushSync = function (fn) {\n var previousTransition = ReactSharedInternals.T,\n previousUpdatePriority = Internals.p;\n try {\n if (((ReactSharedInternals.T = null), (Internals.p = 2), fn)) return fn();\n } finally {\n (ReactSharedInternals.T = previousTransition),\n (Internals.p = previousUpdatePriority),\n Internals.d.f();\n }\n};\nexports.preconnect = function (href, options) {\n \"string\" === typeof href &&\n (options\n ? ((options = options.crossOrigin),\n (options =\n \"string\" === typeof options\n ? \"use-credentials\" === options\n ? options\n : \"\"\n : void 0))\n : (options = null),\n Internals.d.C(href, options));\n};\nexports.prefetchDNS = function (href) {\n \"string\" === typeof href && Internals.d.D(href);\n};\nexports.preinit = function (href, options) {\n if (\"string\" === typeof href && options && \"string\" === typeof options.as) {\n var as = options.as,\n crossOrigin = getCrossOriginStringAs(as, options.crossOrigin),\n integrity =\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n fetchPriority =\n \"string\" === typeof options.fetchPriority\n ? options.fetchPriority\n : void 0;\n \"style\" === as\n ? Internals.d.S(\n href,\n \"string\" === typeof options.precedence ? options.precedence : void 0,\n {\n crossOrigin: crossOrigin,\n integrity: integrity,\n fetchPriority: fetchPriority\n }\n )\n : \"script\" === as &&\n Internals.d.X(href, {\n crossOrigin: crossOrigin,\n integrity: integrity,\n fetchPriority: fetchPriority,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n });\n }\n};\nexports.preinitModule = function (href, options) {\n if (\"string\" === typeof href)\n if (\"object\" === typeof options && null !== options) {\n if (null == options.as || \"script\" === options.as) {\n var crossOrigin = getCrossOriginStringAs(\n options.as,\n options.crossOrigin\n );\n Internals.d.M(href, {\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n });\n }\n } else null == options && Internals.d.M(href);\n};\nexports.preload = function (href, options) {\n if (\n \"string\" === typeof href &&\n \"object\" === typeof options &&\n null !== options &&\n \"string\" === typeof options.as\n ) {\n var as = options.as,\n crossOrigin = getCrossOriginStringAs(as, options.crossOrigin);\n Internals.d.L(href, as, {\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0,\n nonce: \"string\" === typeof options.nonce ? options.nonce : void 0,\n type: \"string\" === typeof options.type ? options.type : void 0,\n fetchPriority:\n \"string\" === typeof options.fetchPriority\n ? options.fetchPriority\n : void 0,\n referrerPolicy:\n \"string\" === typeof options.referrerPolicy\n ? options.referrerPolicy\n : void 0,\n imageSrcSet:\n \"string\" === typeof options.imageSrcSet ? options.imageSrcSet : void 0,\n imageSizes:\n \"string\" === typeof options.imageSizes ? options.imageSizes : void 0,\n media: \"string\" === typeof options.media ? options.media : void 0\n });\n }\n};\nexports.preloadModule = function (href, options) {\n if (\"string\" === typeof href)\n if (options) {\n var crossOrigin = getCrossOriginStringAs(options.as, options.crossOrigin);\n Internals.d.m(href, {\n as:\n \"string\" === typeof options.as && \"script\" !== options.as\n ? options.as\n : void 0,\n crossOrigin: crossOrigin,\n integrity:\n \"string\" === typeof options.integrity ? options.integrity : void 0\n });\n } else Internals.d.m(href);\n};\nexports.requestFormReset = function (form) {\n Internals.d.r(form);\n};\nexports.unstable_batchedUpdates = function (fn, a) {\n return fn(a);\n};\nexports.useFormState = function (action, initialState, permalink) {\n return ReactSharedInternals.H.useFormState(action, initialState, permalink);\n};\nexports.useFormStatus = function () {\n return ReactSharedInternals.H.useHostTransitionStatus();\n};\nexports.version = \"19.2.8\";\n","'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n","/**\n * @license React\n * react-dom-client.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n\"use strict\";\nvar Scheduler = require(\"scheduler\"),\n React = require(\"react\"),\n ReactDOM = require(\"react-dom\");\nfunction formatProdErrorMessage(code) {\n var url = \"https://react.dev/errors/\" + code;\n if (1 < arguments.length) {\n url += \"?args[]=\" + encodeURIComponent(arguments[1]);\n for (var i = 2; i < arguments.length; i++)\n url += \"&args[]=\" + encodeURIComponent(arguments[i]);\n }\n return (\n \"Minified React error #\" +\n code +\n \"; visit \" +\n url +\n \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"\n );\n}\nfunction isValidContainer(node) {\n return !(\n !node ||\n (1 !== node.nodeType && 9 !== node.nodeType && 11 !== node.nodeType)\n );\n}\nfunction getNearestMountedFiber(fiber) {\n var node = fiber,\n nearestMounted = fiber;\n if (fiber.alternate) for (; node.return; ) node = node.return;\n else {\n fiber = node;\n do\n (node = fiber),\n 0 !== (node.flags & 4098) && (nearestMounted = node.return),\n (fiber = node.return);\n while (fiber);\n }\n return 3 === node.tag ? nearestMounted : null;\n}\nfunction getSuspenseInstanceFromFiber(fiber) {\n if (13 === fiber.tag) {\n var suspenseState = fiber.memoizedState;\n null === suspenseState &&\n ((fiber = fiber.alternate),\n null !== fiber && (suspenseState = fiber.memoizedState));\n if (null !== suspenseState) return suspenseState.dehydrated;\n }\n return null;\n}\nfunction getActivityInstanceFromFiber(fiber) {\n if (31 === fiber.tag) {\n var activityState = fiber.memoizedState;\n null === activityState &&\n ((fiber = fiber.alternate),\n null !== fiber && (activityState = fiber.memoizedState));\n if (null !== activityState) return activityState.dehydrated;\n }\n return null;\n}\nfunction assertIsMounted(fiber) {\n if (getNearestMountedFiber(fiber) !== fiber)\n throw Error(formatProdErrorMessage(188));\n}\nfunction findCurrentFiberUsingSlowPath(fiber) {\n var alternate = fiber.alternate;\n if (!alternate) {\n alternate = getNearestMountedFiber(fiber);\n if (null === alternate) throw Error(formatProdErrorMessage(188));\n return alternate !== fiber ? null : fiber;\n }\n for (var a = fiber, b = alternate; ; ) {\n var parentA = a.return;\n if (null === parentA) break;\n var parentB = parentA.alternate;\n if (null === parentB) {\n b = parentA.return;\n if (null !== b) {\n a = b;\n continue;\n }\n break;\n }\n if (parentA.child === parentB.child) {\n for (parentB = parentA.child; parentB; ) {\n if (parentB === a) return assertIsMounted(parentA), fiber;\n if (parentB === b) return assertIsMounted(parentA), alternate;\n parentB = parentB.sibling;\n }\n throw Error(formatProdErrorMessage(188));\n }\n if (a.return !== b.return) (a = parentA), (b = parentB);\n else {\n for (var didFindChild = !1, child$0 = parentA.child; child$0; ) {\n if (child$0 === a) {\n didFindChild = !0;\n a = parentA;\n b = parentB;\n break;\n }\n if (child$0 === b) {\n didFindChild = !0;\n b = parentA;\n a = parentB;\n break;\n }\n child$0 = child$0.sibling;\n }\n if (!didFindChild) {\n for (child$0 = parentB.child; child$0; ) {\n if (child$0 === a) {\n didFindChild = !0;\n a = parentB;\n b = parentA;\n break;\n }\n if (child$0 === b) {\n didFindChild = !0;\n b = parentB;\n a = parentA;\n break;\n }\n child$0 = child$0.sibling;\n }\n if (!didFindChild) throw Error(formatProdErrorMessage(189));\n }\n }\n if (a.alternate !== b) throw Error(formatProdErrorMessage(190));\n }\n if (3 !== a.tag) throw Error(formatProdErrorMessage(188));\n return a.stateNode.current === a ? fiber : alternate;\n}\nfunction findCurrentHostFiberImpl(node) {\n var tag = node.tag;\n if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node;\n for (node = node.child; null !== node; ) {\n tag = findCurrentHostFiberImpl(node);\n if (null !== tag) return tag;\n node = node.sibling;\n }\n return null;\n}\nvar assign = Object.assign,\n REACT_LEGACY_ELEMENT_TYPE = Symbol.for(\"react.element\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\");\nSymbol.for(\"react.scope\");\nvar REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\");\nSymbol.for(\"react.legacy_hidden\");\nSymbol.for(\"react.tracing_marker\");\nvar REACT_MEMO_CACHE_SENTINEL = Symbol.for(\"react.memo_cache_sentinel\");\nSymbol.for(\"react.view_transition\");\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nfunction getIteratorFn(maybeIterable) {\n if (null === maybeIterable || \"object\" !== typeof maybeIterable) return null;\n maybeIterable =\n (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n maybeIterable[\"@@iterator\"];\n return \"function\" === typeof maybeIterable ? maybeIterable : null;\n}\nvar REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\");\nfunction getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (type.$$typeof) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n}\nvar isArrayImpl = Array.isArray,\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n ReactDOMSharedInternals =\n ReactDOM.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n sharedNotPendingObject = {\n pending: !1,\n data: null,\n method: null,\n action: null\n },\n valueStack = [],\n index = -1;\nfunction createCursor(defaultValue) {\n return { current: defaultValue };\n}\nfunction pop(cursor) {\n 0 > index ||\n ((cursor.current = valueStack[index]), (valueStack[index] = null), index--);\n}\nfunction push(cursor, value) {\n index++;\n valueStack[index] = cursor.current;\n cursor.current = value;\n}\nvar contextStackCursor = createCursor(null),\n contextFiberStackCursor = createCursor(null),\n rootInstanceStackCursor = createCursor(null),\n hostTransitionProviderCursor = createCursor(null);\nfunction pushHostContainer(fiber, nextRootInstance) {\n push(rootInstanceStackCursor, nextRootInstance);\n push(contextFiberStackCursor, fiber);\n push(contextStackCursor, null);\n switch (nextRootInstance.nodeType) {\n case 9:\n case 11:\n fiber = (fiber = nextRootInstance.documentElement)\n ? (fiber = fiber.namespaceURI)\n ? getOwnHostContext(fiber)\n : 0\n : 0;\n break;\n default:\n if (\n ((fiber = nextRootInstance.tagName),\n (nextRootInstance = nextRootInstance.namespaceURI))\n )\n (nextRootInstance = getOwnHostContext(nextRootInstance)),\n (fiber = getChildHostContextProd(nextRootInstance, fiber));\n else\n switch (fiber) {\n case \"svg\":\n fiber = 1;\n break;\n case \"math\":\n fiber = 2;\n break;\n default:\n fiber = 0;\n }\n }\n pop(contextStackCursor);\n push(contextStackCursor, fiber);\n}\nfunction popHostContainer() {\n pop(contextStackCursor);\n pop(contextFiberStackCursor);\n pop(rootInstanceStackCursor);\n}\nfunction pushHostContext(fiber) {\n null !== fiber.memoizedState && push(hostTransitionProviderCursor, fiber);\n var context = contextStackCursor.current;\n var JSCompiler_inline_result = getChildHostContextProd(context, fiber.type);\n context !== JSCompiler_inline_result &&\n (push(contextFiberStackCursor, fiber),\n push(contextStackCursor, JSCompiler_inline_result));\n}\nfunction popHostContext(fiber) {\n contextFiberStackCursor.current === fiber &&\n (pop(contextStackCursor), pop(contextFiberStackCursor));\n hostTransitionProviderCursor.current === fiber &&\n (pop(hostTransitionProviderCursor),\n (HostTransitionContext._currentValue = sharedNotPendingObject));\n}\nvar prefix, suffix;\nfunction describeBuiltInComponentFrame(name) {\n if (void 0 === prefix)\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = (match && match[1]) || \"\";\n suffix =\n -1 < x.stack.indexOf(\"\\n at\")\n ? \" ()\"\n : -1 < x.stack.indexOf(\"@\")\n ? \"@unknown:0:0\"\n : \"\";\n }\n return \"\\n\" + prefix + name + suffix;\n}\nvar reentry = !1;\nfunction describeNativeComponentFrame(fn, construct) {\n if (!fn || reentry) return \"\";\n reentry = !0;\n var previousPrepareStackTrace = Error.prepareStackTrace;\n Error.prepareStackTrace = void 0;\n try {\n var RunInRootFrame = {\n DetermineComponentFrameRoot: function () {\n try {\n if (construct) {\n var Fake = function () {\n throw Error();\n };\n Object.defineProperty(Fake.prototype, \"props\", {\n set: function () {\n throw Error();\n }\n });\n if (\"object\" === typeof Reflect && Reflect.construct) {\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n var control = x;\n }\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x$1) {\n control = x$1;\n }\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x$2) {\n control = x$2;\n }\n (Fake = fn()) &&\n \"function\" === typeof Fake.catch &&\n Fake.catch(function () {});\n }\n } catch (sample) {\n if (sample && control && \"string\" === typeof sample.stack)\n return [sample.stack, control.stack];\n }\n return [null, null];\n }\n };\n RunInRootFrame.DetermineComponentFrameRoot.displayName =\n \"DetermineComponentFrameRoot\";\n var namePropDescriptor = Object.getOwnPropertyDescriptor(\n RunInRootFrame.DetermineComponentFrameRoot,\n \"name\"\n );\n namePropDescriptor &&\n namePropDescriptor.configurable &&\n Object.defineProperty(\n RunInRootFrame.DetermineComponentFrameRoot,\n \"name\",\n { value: \"DetermineComponentFrameRoot\" }\n );\n var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(),\n sampleStack = _RunInRootFrame$Deter[0],\n controlStack = _RunInRootFrame$Deter[1];\n if (sampleStack && controlStack) {\n var sampleLines = sampleStack.split(\"\\n\"),\n controlLines = controlStack.split(\"\\n\");\n for (\n namePropDescriptor = RunInRootFrame = 0;\n RunInRootFrame < sampleLines.length &&\n !sampleLines[RunInRootFrame].includes(\"DetermineComponentFrameRoot\");\n\n )\n RunInRootFrame++;\n for (\n ;\n namePropDescriptor < controlLines.length &&\n !controlLines[namePropDescriptor].includes(\n \"DetermineComponentFrameRoot\"\n );\n\n )\n namePropDescriptor++;\n if (\n RunInRootFrame === sampleLines.length ||\n namePropDescriptor === controlLines.length\n )\n for (\n RunInRootFrame = sampleLines.length - 1,\n namePropDescriptor = controlLines.length - 1;\n 1 <= RunInRootFrame &&\n 0 <= namePropDescriptor &&\n sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor];\n\n )\n namePropDescriptor--;\n for (\n ;\n 1 <= RunInRootFrame && 0 <= namePropDescriptor;\n RunInRootFrame--, namePropDescriptor--\n )\n if (sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor]) {\n if (1 !== RunInRootFrame || 1 !== namePropDescriptor) {\n do\n if (\n (RunInRootFrame--,\n namePropDescriptor--,\n 0 > namePropDescriptor ||\n sampleLines[RunInRootFrame] !==\n controlLines[namePropDescriptor])\n ) {\n var frame =\n \"\\n\" +\n sampleLines[RunInRootFrame].replace(\" at new \", \" at \");\n fn.displayName &&\n frame.includes(\"\") &&\n (frame = frame.replace(\"\", fn.displayName));\n return frame;\n }\n while (1 <= RunInRootFrame && 0 <= namePropDescriptor);\n }\n break;\n }\n }\n } finally {\n (reentry = !1), (Error.prepareStackTrace = previousPrepareStackTrace);\n }\n return (previousPrepareStackTrace = fn ? fn.displayName || fn.name : \"\")\n ? describeBuiltInComponentFrame(previousPrepareStackTrace)\n : \"\";\n}\nfunction describeFiber(fiber, childFiber) {\n switch (fiber.tag) {\n case 26:\n case 27:\n case 5:\n return describeBuiltInComponentFrame(fiber.type);\n case 16:\n return describeBuiltInComponentFrame(\"Lazy\");\n case 13:\n return fiber.child !== childFiber && null !== childFiber\n ? describeBuiltInComponentFrame(\"Suspense Fallback\")\n : describeBuiltInComponentFrame(\"Suspense\");\n case 19:\n return describeBuiltInComponentFrame(\"SuspenseList\");\n case 0:\n case 15:\n return describeNativeComponentFrame(fiber.type, !1);\n case 11:\n return describeNativeComponentFrame(fiber.type.render, !1);\n case 1:\n return describeNativeComponentFrame(fiber.type, !0);\n case 31:\n return describeBuiltInComponentFrame(\"Activity\");\n default:\n return \"\";\n }\n}\nfunction getStackByFiberInDevAndProd(workInProgress) {\n try {\n var info = \"\",\n previous = null;\n do\n (info += describeFiber(workInProgress, previous)),\n (previous = workInProgress),\n (workInProgress = workInProgress.return);\n while (workInProgress);\n return info;\n } catch (x) {\n return \"\\nError generating stack: \" + x.message + \"\\n\" + x.stack;\n }\n}\nvar hasOwnProperty = Object.prototype.hasOwnProperty,\n scheduleCallback$3 = Scheduler.unstable_scheduleCallback,\n cancelCallback$1 = Scheduler.unstable_cancelCallback,\n shouldYield = Scheduler.unstable_shouldYield,\n requestPaint = Scheduler.unstable_requestPaint,\n now = Scheduler.unstable_now,\n getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,\n ImmediatePriority = Scheduler.unstable_ImmediatePriority,\n UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,\n NormalPriority$1 = Scheduler.unstable_NormalPriority,\n LowPriority = Scheduler.unstable_LowPriority,\n IdlePriority = Scheduler.unstable_IdlePriority,\n log$1 = Scheduler.log,\n unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue,\n rendererID = null,\n injectedHook = null;\nfunction setIsStrictModeForDevtools(newIsStrictMode) {\n \"function\" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode);\n if (injectedHook && \"function\" === typeof injectedHook.setStrictMode)\n try {\n injectedHook.setStrictMode(rendererID, newIsStrictMode);\n } catch (err) {}\n}\nvar clz32 = Math.clz32 ? Math.clz32 : clz32Fallback,\n log = Math.log,\n LN2 = Math.LN2;\nfunction clz32Fallback(x) {\n x >>>= 0;\n return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0;\n}\nvar nextTransitionUpdateLane = 256,\n nextTransitionDeferredLane = 262144,\n nextRetryLane = 4194304;\nfunction getHighestPriorityLanes(lanes) {\n var pendingSyncLanes = lanes & 42;\n if (0 !== pendingSyncLanes) return pendingSyncLanes;\n switch (lanes & -lanes) {\n case 1:\n return 1;\n case 2:\n return 2;\n case 4:\n return 4;\n case 8:\n return 8;\n case 16:\n return 16;\n case 32:\n return 32;\n case 64:\n return 64;\n case 128:\n return 128;\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n return lanes & 261888;\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n return lanes & 3932160;\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n return lanes & 62914560;\n case 67108864:\n return 67108864;\n case 134217728:\n return 134217728;\n case 268435456:\n return 268435456;\n case 536870912:\n return 536870912;\n case 1073741824:\n return 0;\n default:\n return lanes;\n }\n}\nfunction getNextLanes(root, wipLanes, rootHasPendingCommit) {\n var pendingLanes = root.pendingLanes;\n if (0 === pendingLanes) return 0;\n var nextLanes = 0,\n suspendedLanes = root.suspendedLanes,\n pingedLanes = root.pingedLanes;\n root = root.warmLanes;\n var nonIdlePendingLanes = pendingLanes & 134217727;\n 0 !== nonIdlePendingLanes\n ? ((pendingLanes = nonIdlePendingLanes & ~suspendedLanes),\n 0 !== pendingLanes\n ? (nextLanes = getHighestPriorityLanes(pendingLanes))\n : ((pingedLanes &= nonIdlePendingLanes),\n 0 !== pingedLanes\n ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n : rootHasPendingCommit ||\n ((rootHasPendingCommit = nonIdlePendingLanes & ~root),\n 0 !== rootHasPendingCommit &&\n (nextLanes = getHighestPriorityLanes(rootHasPendingCommit)))))\n : ((nonIdlePendingLanes = pendingLanes & ~suspendedLanes),\n 0 !== nonIdlePendingLanes\n ? (nextLanes = getHighestPriorityLanes(nonIdlePendingLanes))\n : 0 !== pingedLanes\n ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n : rootHasPendingCommit ||\n ((rootHasPendingCommit = pendingLanes & ~root),\n 0 !== rootHasPendingCommit &&\n (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))));\n return 0 === nextLanes\n ? 0\n : 0 !== wipLanes &&\n wipLanes !== nextLanes &&\n 0 === (wipLanes & suspendedLanes) &&\n ((suspendedLanes = nextLanes & -nextLanes),\n (rootHasPendingCommit = wipLanes & -wipLanes),\n suspendedLanes >= rootHasPendingCommit ||\n (32 === suspendedLanes && 0 !== (rootHasPendingCommit & 4194048)))\n ? wipLanes\n : nextLanes;\n}\nfunction checkIfRootIsPrerendering(root, renderLanes) {\n return (\n 0 ===\n (root.pendingLanes &\n ~(root.suspendedLanes & ~root.pingedLanes) &\n renderLanes)\n );\n}\nfunction computeExpirationTime(lane, currentTime) {\n switch (lane) {\n case 1:\n case 2:\n case 4:\n case 8:\n case 64:\n return currentTime + 250;\n case 16:\n case 32:\n case 128:\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n return currentTime + 5e3;\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n return -1;\n case 67108864:\n case 134217728:\n case 268435456:\n case 536870912:\n case 1073741824:\n return -1;\n default:\n return -1;\n }\n}\nfunction claimNextRetryLane() {\n var lane = nextRetryLane;\n nextRetryLane <<= 1;\n 0 === (nextRetryLane & 62914560) && (nextRetryLane = 4194304);\n return lane;\n}\nfunction createLaneMap(initial) {\n for (var laneMap = [], i = 0; 31 > i; i++) laneMap.push(initial);\n return laneMap;\n}\nfunction markRootUpdated$1(root, updateLane) {\n root.pendingLanes |= updateLane;\n 268435456 !== updateLane &&\n ((root.suspendedLanes = 0), (root.pingedLanes = 0), (root.warmLanes = 0));\n}\nfunction markRootFinished(\n root,\n finishedLanes,\n remainingLanes,\n spawnedLane,\n updatedLanes,\n suspendedRetryLanes\n) {\n var previouslyPendingLanes = root.pendingLanes;\n root.pendingLanes = remainingLanes;\n root.suspendedLanes = 0;\n root.pingedLanes = 0;\n root.warmLanes = 0;\n root.expiredLanes &= remainingLanes;\n root.entangledLanes &= remainingLanes;\n root.errorRecoveryDisabledLanes &= remainingLanes;\n root.shellSuspendCounter = 0;\n var entanglements = root.entanglements,\n expirationTimes = root.expirationTimes,\n hiddenUpdates = root.hiddenUpdates;\n for (\n remainingLanes = previouslyPendingLanes & ~remainingLanes;\n 0 < remainingLanes;\n\n ) {\n var index$7 = 31 - clz32(remainingLanes),\n lane = 1 << index$7;\n entanglements[index$7] = 0;\n expirationTimes[index$7] = -1;\n var hiddenUpdatesForLane = hiddenUpdates[index$7];\n if (null !== hiddenUpdatesForLane)\n for (\n hiddenUpdates[index$7] = null, index$7 = 0;\n index$7 < hiddenUpdatesForLane.length;\n index$7++\n ) {\n var update = hiddenUpdatesForLane[index$7];\n null !== update && (update.lane &= -536870913);\n }\n remainingLanes &= ~lane;\n }\n 0 !== spawnedLane && markSpawnedDeferredLane(root, spawnedLane, 0);\n 0 !== suspendedRetryLanes &&\n 0 === updatedLanes &&\n 0 !== root.tag &&\n (root.suspendedLanes |=\n suspendedRetryLanes & ~(previouslyPendingLanes & ~finishedLanes));\n}\nfunction markSpawnedDeferredLane(root, spawnedLane, entangledLanes) {\n root.pendingLanes |= spawnedLane;\n root.suspendedLanes &= ~spawnedLane;\n var spawnedLaneIndex = 31 - clz32(spawnedLane);\n root.entangledLanes |= spawnedLane;\n root.entanglements[spawnedLaneIndex] =\n root.entanglements[spawnedLaneIndex] |\n 1073741824 |\n (entangledLanes & 261930);\n}\nfunction markRootEntangled(root, entangledLanes) {\n var rootEntangledLanes = (root.entangledLanes |= entangledLanes);\n for (root = root.entanglements; rootEntangledLanes; ) {\n var index$8 = 31 - clz32(rootEntangledLanes),\n lane = 1 << index$8;\n (lane & entangledLanes) | (root[index$8] & entangledLanes) &&\n (root[index$8] |= entangledLanes);\n rootEntangledLanes &= ~lane;\n }\n}\nfunction getBumpedLaneForHydration(root, renderLanes) {\n var renderLane = renderLanes & -renderLanes;\n renderLane =\n 0 !== (renderLane & 42) ? 1 : getBumpedLaneForHydrationByLane(renderLane);\n return 0 !== (renderLane & (root.suspendedLanes | renderLanes))\n ? 0\n : renderLane;\n}\nfunction getBumpedLaneForHydrationByLane(lane) {\n switch (lane) {\n case 2:\n lane = 1;\n break;\n case 8:\n lane = 4;\n break;\n case 32:\n lane = 16;\n break;\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n lane = 128;\n break;\n case 268435456:\n lane = 134217728;\n break;\n default:\n lane = 0;\n }\n return lane;\n}\nfunction lanesToEventPriority(lanes) {\n lanes &= -lanes;\n return 2 < lanes\n ? 8 < lanes\n ? 0 !== (lanes & 134217727)\n ? 32\n : 268435456\n : 8\n : 2;\n}\nfunction resolveUpdatePriority() {\n var updatePriority = ReactDOMSharedInternals.p;\n if (0 !== updatePriority) return updatePriority;\n updatePriority = window.event;\n return void 0 === updatePriority ? 32 : getEventPriority(updatePriority.type);\n}\nfunction runWithPriority(priority, fn) {\n var previousPriority = ReactDOMSharedInternals.p;\n try {\n return (ReactDOMSharedInternals.p = priority), fn();\n } finally {\n ReactDOMSharedInternals.p = previousPriority;\n }\n}\nvar randomKey = Math.random().toString(36).slice(2),\n internalInstanceKey = \"__reactFiber$\" + randomKey,\n internalPropsKey = \"__reactProps$\" + randomKey,\n internalContainerInstanceKey = \"__reactContainer$\" + randomKey,\n internalEventHandlersKey = \"__reactEvents$\" + randomKey,\n internalEventHandlerListenersKey = \"__reactListeners$\" + randomKey,\n internalEventHandlesSetKey = \"__reactHandles$\" + randomKey,\n internalRootNodeResourcesKey = \"__reactResources$\" + randomKey,\n internalHoistableMarker = \"__reactMarker$\" + randomKey;\nfunction detachDeletedInstance(node) {\n delete node[internalInstanceKey];\n delete node[internalPropsKey];\n delete node[internalEventHandlersKey];\n delete node[internalEventHandlerListenersKey];\n delete node[internalEventHandlesSetKey];\n}\nfunction getClosestInstanceFromNode(targetNode) {\n var targetInst = targetNode[internalInstanceKey];\n if (targetInst) return targetInst;\n for (var parentNode = targetNode.parentNode; parentNode; ) {\n if (\n (targetInst =\n parentNode[internalContainerInstanceKey] ||\n parentNode[internalInstanceKey])\n ) {\n parentNode = targetInst.alternate;\n if (\n null !== targetInst.child ||\n (null !== parentNode && null !== parentNode.child)\n )\n for (\n targetNode = getParentHydrationBoundary(targetNode);\n null !== targetNode;\n\n ) {\n if ((parentNode = targetNode[internalInstanceKey])) return parentNode;\n targetNode = getParentHydrationBoundary(targetNode);\n }\n return targetInst;\n }\n targetNode = parentNode;\n parentNode = targetNode.parentNode;\n }\n return null;\n}\nfunction getInstanceFromNode(node) {\n if (\n (node = node[internalInstanceKey] || node[internalContainerInstanceKey])\n ) {\n var tag = node.tag;\n if (\n 5 === tag ||\n 6 === tag ||\n 13 === tag ||\n 31 === tag ||\n 26 === tag ||\n 27 === tag ||\n 3 === tag\n )\n return node;\n }\n return null;\n}\nfunction getNodeFromInstance(inst) {\n var tag = inst.tag;\n if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return inst.stateNode;\n throw Error(formatProdErrorMessage(33));\n}\nfunction getResourcesFromRoot(root) {\n var resources = root[internalRootNodeResourcesKey];\n resources ||\n (resources = root[internalRootNodeResourcesKey] =\n { hoistableStyles: new Map(), hoistableScripts: new Map() });\n return resources;\n}\nfunction markNodeAsHoistable(node) {\n node[internalHoistableMarker] = !0;\n}\nvar allNativeEvents = new Set(),\n registrationNameDependencies = {};\nfunction registerTwoPhaseEvent(registrationName, dependencies) {\n registerDirectEvent(registrationName, dependencies);\n registerDirectEvent(registrationName + \"Capture\", dependencies);\n}\nfunction registerDirectEvent(registrationName, dependencies) {\n registrationNameDependencies[registrationName] = dependencies;\n for (\n registrationName = 0;\n registrationName < dependencies.length;\n registrationName++\n )\n allNativeEvents.add(dependencies[registrationName]);\n}\nvar VALID_ATTRIBUTE_NAME_REGEX = RegExp(\n \"^[:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD][:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]*$\"\n ),\n illegalAttributeNameCache = {},\n validatedAttributeNameCache = {};\nfunction isAttributeNameSafe(attributeName) {\n if (hasOwnProperty.call(validatedAttributeNameCache, attributeName))\n return !0;\n if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) return !1;\n if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName))\n return (validatedAttributeNameCache[attributeName] = !0);\n illegalAttributeNameCache[attributeName] = !0;\n return !1;\n}\nfunction setValueForAttribute(node, name, value) {\n if (isAttributeNameSafe(name))\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n node.removeAttribute(name);\n return;\n case \"boolean\":\n var prefix$10 = name.toLowerCase().slice(0, 5);\n if (\"data-\" !== prefix$10 && \"aria-\" !== prefix$10) {\n node.removeAttribute(name);\n return;\n }\n }\n node.setAttribute(name, \"\" + value);\n }\n}\nfunction setValueForKnownAttribute(node, name, value) {\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n case \"boolean\":\n node.removeAttribute(name);\n return;\n }\n node.setAttribute(name, \"\" + value);\n }\n}\nfunction setValueForNamespacedAttribute(node, namespace, name, value) {\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n case \"boolean\":\n node.removeAttribute(name);\n return;\n }\n node.setAttributeNS(namespace, name, \"\" + value);\n }\n}\nfunction getToStringValue(value) {\n switch (typeof value) {\n case \"bigint\":\n case \"boolean\":\n case \"number\":\n case \"string\":\n case \"undefined\":\n return value;\n case \"object\":\n return value;\n default:\n return \"\";\n }\n}\nfunction isCheckable(elem) {\n var type = elem.type;\n return (\n (elem = elem.nodeName) &&\n \"input\" === elem.toLowerCase() &&\n (\"checkbox\" === type || \"radio\" === type)\n );\n}\nfunction trackValueOnNode(node, valueField, currentValue) {\n var descriptor = Object.getOwnPropertyDescriptor(\n node.constructor.prototype,\n valueField\n );\n if (\n !node.hasOwnProperty(valueField) &&\n \"undefined\" !== typeof descriptor &&\n \"function\" === typeof descriptor.get &&\n \"function\" === typeof descriptor.set\n ) {\n var get = descriptor.get,\n set = descriptor.set;\n Object.defineProperty(node, valueField, {\n configurable: !0,\n get: function () {\n return get.call(this);\n },\n set: function (value) {\n currentValue = \"\" + value;\n set.call(this, value);\n }\n });\n Object.defineProperty(node, valueField, {\n enumerable: descriptor.enumerable\n });\n return {\n getValue: function () {\n return currentValue;\n },\n setValue: function (value) {\n currentValue = \"\" + value;\n },\n stopTracking: function () {\n node._valueTracker = null;\n delete node[valueField];\n }\n };\n }\n}\nfunction track(node) {\n if (!node._valueTracker) {\n var valueField = isCheckable(node) ? \"checked\" : \"value\";\n node._valueTracker = trackValueOnNode(\n node,\n valueField,\n \"\" + node[valueField]\n );\n }\n}\nfunction updateValueIfChanged(node) {\n if (!node) return !1;\n var tracker = node._valueTracker;\n if (!tracker) return !0;\n var lastValue = tracker.getValue();\n var value = \"\";\n node &&\n (value = isCheckable(node)\n ? node.checked\n ? \"true\"\n : \"false\"\n : node.value);\n node = value;\n return node !== lastValue ? (tracker.setValue(node), !0) : !1;\n}\nfunction getActiveElement(doc) {\n doc = doc || (\"undefined\" !== typeof document ? document : void 0);\n if (\"undefined\" === typeof doc) return null;\n try {\n return doc.activeElement || doc.body;\n } catch (e) {\n return doc.body;\n }\n}\nvar escapeSelectorAttributeValueInsideDoubleQuotesRegex = /[\\n\"\\\\]/g;\nfunction escapeSelectorAttributeValueInsideDoubleQuotes(value) {\n return value.replace(\n escapeSelectorAttributeValueInsideDoubleQuotesRegex,\n function (ch) {\n return \"\\\\\" + ch.charCodeAt(0).toString(16) + \" \";\n }\n );\n}\nfunction updateInput(\n element,\n value,\n defaultValue,\n lastDefaultValue,\n checked,\n defaultChecked,\n type,\n name\n) {\n element.name = \"\";\n null != type &&\n \"function\" !== typeof type &&\n \"symbol\" !== typeof type &&\n \"boolean\" !== typeof type\n ? (element.type = type)\n : element.removeAttribute(\"type\");\n if (null != value)\n if (\"number\" === type) {\n if ((0 === value && \"\" === element.value) || element.value != value)\n element.value = \"\" + getToStringValue(value);\n } else\n element.value !== \"\" + getToStringValue(value) &&\n (element.value = \"\" + getToStringValue(value));\n else\n (\"submit\" !== type && \"reset\" !== type) || element.removeAttribute(\"value\");\n null != value\n ? setDefaultValue(element, type, getToStringValue(value))\n : null != defaultValue\n ? setDefaultValue(element, type, getToStringValue(defaultValue))\n : null != lastDefaultValue && element.removeAttribute(\"value\");\n null == checked &&\n null != defaultChecked &&\n (element.defaultChecked = !!defaultChecked);\n null != checked &&\n (element.checked =\n checked && \"function\" !== typeof checked && \"symbol\" !== typeof checked);\n null != name &&\n \"function\" !== typeof name &&\n \"symbol\" !== typeof name &&\n \"boolean\" !== typeof name\n ? (element.name = \"\" + getToStringValue(name))\n : element.removeAttribute(\"name\");\n}\nfunction initInput(\n element,\n value,\n defaultValue,\n checked,\n defaultChecked,\n type,\n name,\n isHydrating\n) {\n null != type &&\n \"function\" !== typeof type &&\n \"symbol\" !== typeof type &&\n \"boolean\" !== typeof type &&\n (element.type = type);\n if (null != value || null != defaultValue) {\n if (\n !(\n (\"submit\" !== type && \"reset\" !== type) ||\n (void 0 !== value && null !== value)\n )\n ) {\n track(element);\n return;\n }\n defaultValue =\n null != defaultValue ? \"\" + getToStringValue(defaultValue) : \"\";\n value = null != value ? \"\" + getToStringValue(value) : defaultValue;\n isHydrating || value === element.value || (element.value = value);\n element.defaultValue = value;\n }\n checked = null != checked ? checked : defaultChecked;\n checked =\n \"function\" !== typeof checked && \"symbol\" !== typeof checked && !!checked;\n element.checked = isHydrating ? element.checked : !!checked;\n element.defaultChecked = !!checked;\n null != name &&\n \"function\" !== typeof name &&\n \"symbol\" !== typeof name &&\n \"boolean\" !== typeof name &&\n (element.name = name);\n track(element);\n}\nfunction setDefaultValue(node, type, value) {\n (\"number\" === type && getActiveElement(node.ownerDocument) === node) ||\n node.defaultValue === \"\" + value ||\n (node.defaultValue = \"\" + value);\n}\nfunction updateOptions(node, multiple, propValue, setDefaultSelected) {\n node = node.options;\n if (multiple) {\n multiple = {};\n for (var i = 0; i < propValue.length; i++)\n multiple[\"$\" + propValue[i]] = !0;\n for (propValue = 0; propValue < node.length; propValue++)\n (i = multiple.hasOwnProperty(\"$\" + node[propValue].value)),\n node[propValue].selected !== i && (node[propValue].selected = i),\n i && setDefaultSelected && (node[propValue].defaultSelected = !0);\n } else {\n propValue = \"\" + getToStringValue(propValue);\n multiple = null;\n for (i = 0; i < node.length; i++) {\n if (node[i].value === propValue) {\n node[i].selected = !0;\n setDefaultSelected && (node[i].defaultSelected = !0);\n return;\n }\n null !== multiple || node[i].disabled || (multiple = node[i]);\n }\n null !== multiple && (multiple.selected = !0);\n }\n}\nfunction updateTextarea(element, value, defaultValue) {\n if (\n null != value &&\n ((value = \"\" + getToStringValue(value)),\n value !== element.value && (element.value = value),\n null == defaultValue)\n ) {\n element.defaultValue !== value && (element.defaultValue = value);\n return;\n }\n element.defaultValue =\n null != defaultValue ? \"\" + getToStringValue(defaultValue) : \"\";\n}\nfunction initTextarea(element, value, defaultValue, children) {\n if (null == value) {\n if (null != children) {\n if (null != defaultValue) throw Error(formatProdErrorMessage(92));\n if (isArrayImpl(children)) {\n if (1 < children.length) throw Error(formatProdErrorMessage(93));\n children = children[0];\n }\n defaultValue = children;\n }\n null == defaultValue && (defaultValue = \"\");\n value = defaultValue;\n }\n defaultValue = getToStringValue(value);\n element.defaultValue = defaultValue;\n children = element.textContent;\n children === defaultValue &&\n \"\" !== children &&\n null !== children &&\n (element.value = children);\n track(element);\n}\nfunction setTextContent(node, text) {\n if (text) {\n var firstChild = node.firstChild;\n if (\n firstChild &&\n firstChild === node.lastChild &&\n 3 === firstChild.nodeType\n ) {\n firstChild.nodeValue = text;\n return;\n }\n }\n node.textContent = text;\n}\nvar unitlessNumbers = new Set(\n \"animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp\".split(\n \" \"\n )\n);\nfunction setValueForStyle(style, styleName, value) {\n var isCustomProperty = 0 === styleName.indexOf(\"--\");\n null == value || \"boolean\" === typeof value || \"\" === value\n ? isCustomProperty\n ? style.setProperty(styleName, \"\")\n : \"float\" === styleName\n ? (style.cssFloat = \"\")\n : (style[styleName] = \"\")\n : isCustomProperty\n ? style.setProperty(styleName, value)\n : \"number\" !== typeof value ||\n 0 === value ||\n unitlessNumbers.has(styleName)\n ? \"float\" === styleName\n ? (style.cssFloat = value)\n : (style[styleName] = (\"\" + value).trim())\n : (style[styleName] = value + \"px\");\n}\nfunction setValueForStyles(node, styles, prevStyles) {\n if (null != styles && \"object\" !== typeof styles)\n throw Error(formatProdErrorMessage(62));\n node = node.style;\n if (null != prevStyles) {\n for (var styleName in prevStyles)\n !prevStyles.hasOwnProperty(styleName) ||\n (null != styles && styles.hasOwnProperty(styleName)) ||\n (0 === styleName.indexOf(\"--\")\n ? node.setProperty(styleName, \"\")\n : \"float\" === styleName\n ? (node.cssFloat = \"\")\n : (node[styleName] = \"\"));\n for (var styleName$16 in styles)\n (styleName = styles[styleName$16]),\n styles.hasOwnProperty(styleName$16) &&\n prevStyles[styleName$16] !== styleName &&\n setValueForStyle(node, styleName$16, styleName);\n } else\n for (var styleName$17 in styles)\n styles.hasOwnProperty(styleName$17) &&\n setValueForStyle(node, styleName$17, styles[styleName$17]);\n}\nfunction isCustomElement(tagName) {\n if (-1 === tagName.indexOf(\"-\")) return !1;\n switch (tagName) {\n case \"annotation-xml\":\n case \"color-profile\":\n case \"font-face\":\n case \"font-face-src\":\n case \"font-face-uri\":\n case \"font-face-format\":\n case \"font-face-name\":\n case \"missing-glyph\":\n return !1;\n default:\n return !0;\n }\n}\nvar aliases = new Map([\n [\"acceptCharset\", \"accept-charset\"],\n [\"htmlFor\", \"for\"],\n [\"httpEquiv\", \"http-equiv\"],\n [\"crossOrigin\", \"crossorigin\"],\n [\"accentHeight\", \"accent-height\"],\n [\"alignmentBaseline\", \"alignment-baseline\"],\n [\"arabicForm\", \"arabic-form\"],\n [\"baselineShift\", \"baseline-shift\"],\n [\"capHeight\", \"cap-height\"],\n [\"clipPath\", \"clip-path\"],\n [\"clipRule\", \"clip-rule\"],\n [\"colorInterpolation\", \"color-interpolation\"],\n [\"colorInterpolationFilters\", \"color-interpolation-filters\"],\n [\"colorProfile\", \"color-profile\"],\n [\"colorRendering\", \"color-rendering\"],\n [\"dominantBaseline\", \"dominant-baseline\"],\n [\"enableBackground\", \"enable-background\"],\n [\"fillOpacity\", \"fill-opacity\"],\n [\"fillRule\", \"fill-rule\"],\n [\"floodColor\", \"flood-color\"],\n [\"floodOpacity\", \"flood-opacity\"],\n [\"fontFamily\", \"font-family\"],\n [\"fontSize\", \"font-size\"],\n [\"fontSizeAdjust\", \"font-size-adjust\"],\n [\"fontStretch\", \"font-stretch\"],\n [\"fontStyle\", \"font-style\"],\n [\"fontVariant\", \"font-variant\"],\n [\"fontWeight\", \"font-weight\"],\n [\"glyphName\", \"glyph-name\"],\n [\"glyphOrientationHorizontal\", \"glyph-orientation-horizontal\"],\n [\"glyphOrientationVertical\", \"glyph-orientation-vertical\"],\n [\"horizAdvX\", \"horiz-adv-x\"],\n [\"horizOriginX\", \"horiz-origin-x\"],\n [\"imageRendering\", \"image-rendering\"],\n [\"letterSpacing\", \"letter-spacing\"],\n [\"lightingColor\", \"lighting-color\"],\n [\"markerEnd\", \"marker-end\"],\n [\"markerMid\", \"marker-mid\"],\n [\"markerStart\", \"marker-start\"],\n [\"overlinePosition\", \"overline-position\"],\n [\"overlineThickness\", \"overline-thickness\"],\n [\"paintOrder\", \"paint-order\"],\n [\"panose-1\", \"panose-1\"],\n [\"pointerEvents\", \"pointer-events\"],\n [\"renderingIntent\", \"rendering-intent\"],\n [\"shapeRendering\", \"shape-rendering\"],\n [\"stopColor\", \"stop-color\"],\n [\"stopOpacity\", \"stop-opacity\"],\n [\"strikethroughPosition\", \"strikethrough-position\"],\n [\"strikethroughThickness\", \"strikethrough-thickness\"],\n [\"strokeDasharray\", \"stroke-dasharray\"],\n [\"strokeDashoffset\", \"stroke-dashoffset\"],\n [\"strokeLinecap\", \"stroke-linecap\"],\n [\"strokeLinejoin\", \"stroke-linejoin\"],\n [\"strokeMiterlimit\", \"stroke-miterlimit\"],\n [\"strokeOpacity\", \"stroke-opacity\"],\n [\"strokeWidth\", \"stroke-width\"],\n [\"textAnchor\", \"text-anchor\"],\n [\"textDecoration\", \"text-decoration\"],\n [\"textRendering\", \"text-rendering\"],\n [\"transformOrigin\", \"transform-origin\"],\n [\"underlinePosition\", \"underline-position\"],\n [\"underlineThickness\", \"underline-thickness\"],\n [\"unicodeBidi\", \"unicode-bidi\"],\n [\"unicodeRange\", \"unicode-range\"],\n [\"unitsPerEm\", \"units-per-em\"],\n [\"vAlphabetic\", \"v-alphabetic\"],\n [\"vHanging\", \"v-hanging\"],\n [\"vIdeographic\", \"v-ideographic\"],\n [\"vMathematical\", \"v-mathematical\"],\n [\"vectorEffect\", \"vector-effect\"],\n [\"vertAdvY\", \"vert-adv-y\"],\n [\"vertOriginX\", \"vert-origin-x\"],\n [\"vertOriginY\", \"vert-origin-y\"],\n [\"wordSpacing\", \"word-spacing\"],\n [\"writingMode\", \"writing-mode\"],\n [\"xmlnsXlink\", \"xmlns:xlink\"],\n [\"xHeight\", \"x-height\"]\n ]),\n isJavaScriptProtocol =\n /^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*:/i;\nfunction sanitizeURL(url) {\n return isJavaScriptProtocol.test(\"\" + url)\n ? \"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')\"\n : url;\n}\nfunction noop$1() {}\nvar currentReplayingEvent = null;\nfunction getEventTarget(nativeEvent) {\n nativeEvent = nativeEvent.target || nativeEvent.srcElement || window;\n nativeEvent.correspondingUseElement &&\n (nativeEvent = nativeEvent.correspondingUseElement);\n return 3 === nativeEvent.nodeType ? nativeEvent.parentNode : nativeEvent;\n}\nvar restoreTarget = null,\n restoreQueue = null;\nfunction restoreStateOfTarget(target) {\n var internalInstance = getInstanceFromNode(target);\n if (internalInstance && (target = internalInstance.stateNode)) {\n var props = target[internalPropsKey] || null;\n a: switch (((target = internalInstance.stateNode), internalInstance.type)) {\n case \"input\":\n updateInput(\n target,\n props.value,\n props.defaultValue,\n props.defaultValue,\n props.checked,\n props.defaultChecked,\n props.type,\n props.name\n );\n internalInstance = props.name;\n if (\"radio\" === props.type && null != internalInstance) {\n for (props = target; props.parentNode; ) props = props.parentNode;\n props = props.querySelectorAll(\n 'input[name=\"' +\n escapeSelectorAttributeValueInsideDoubleQuotes(\n \"\" + internalInstance\n ) +\n '\"][type=\"radio\"]'\n );\n for (\n internalInstance = 0;\n internalInstance < props.length;\n internalInstance++\n ) {\n var otherNode = props[internalInstance];\n if (otherNode !== target && otherNode.form === target.form) {\n var otherProps = otherNode[internalPropsKey] || null;\n if (!otherProps) throw Error(formatProdErrorMessage(90));\n updateInput(\n otherNode,\n otherProps.value,\n otherProps.defaultValue,\n otherProps.defaultValue,\n otherProps.checked,\n otherProps.defaultChecked,\n otherProps.type,\n otherProps.name\n );\n }\n }\n for (\n internalInstance = 0;\n internalInstance < props.length;\n internalInstance++\n )\n (otherNode = props[internalInstance]),\n otherNode.form === target.form && updateValueIfChanged(otherNode);\n }\n break a;\n case \"textarea\":\n updateTextarea(target, props.value, props.defaultValue);\n break a;\n case \"select\":\n (internalInstance = props.value),\n null != internalInstance &&\n updateOptions(target, !!props.multiple, internalInstance, !1);\n }\n }\n}\nvar isInsideEventHandler = !1;\nfunction batchedUpdates$1(fn, a, b) {\n if (isInsideEventHandler) return fn(a, b);\n isInsideEventHandler = !0;\n try {\n var JSCompiler_inline_result = fn(a);\n return JSCompiler_inline_result;\n } finally {\n if (\n ((isInsideEventHandler = !1),\n null !== restoreTarget || null !== restoreQueue)\n )\n if (\n (flushSyncWork$1(),\n restoreTarget &&\n ((a = restoreTarget),\n (fn = restoreQueue),\n (restoreQueue = restoreTarget = null),\n restoreStateOfTarget(a),\n fn))\n )\n for (a = 0; a < fn.length; a++) restoreStateOfTarget(fn[a]);\n }\n}\nfunction getListener(inst, registrationName) {\n var stateNode = inst.stateNode;\n if (null === stateNode) return null;\n var props = stateNode[internalPropsKey] || null;\n if (null === props) return null;\n stateNode = props[registrationName];\n a: switch (registrationName) {\n case \"onClick\":\n case \"onClickCapture\":\n case \"onDoubleClick\":\n case \"onDoubleClickCapture\":\n case \"onMouseDown\":\n case \"onMouseDownCapture\":\n case \"onMouseMove\":\n case \"onMouseMoveCapture\":\n case \"onMouseUp\":\n case \"onMouseUpCapture\":\n case \"onMouseEnter\":\n (props = !props.disabled) ||\n ((inst = inst.type),\n (props = !(\n \"button\" === inst ||\n \"input\" === inst ||\n \"select\" === inst ||\n \"textarea\" === inst\n )));\n inst = !props;\n break a;\n default:\n inst = !1;\n }\n if (inst) return null;\n if (stateNode && \"function\" !== typeof stateNode)\n throw Error(\n formatProdErrorMessage(231, registrationName, typeof stateNode)\n );\n return stateNode;\n}\nvar canUseDOM = !(\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ),\n passiveBrowserEventsSupported = !1;\nif (canUseDOM)\n try {\n var options = {};\n Object.defineProperty(options, \"passive\", {\n get: function () {\n passiveBrowserEventsSupported = !0;\n }\n });\n window.addEventListener(\"test\", options, options);\n window.removeEventListener(\"test\", options, options);\n } catch (e) {\n passiveBrowserEventsSupported = !1;\n }\nvar root = null,\n startText = null,\n fallbackText = null;\nfunction getData() {\n if (fallbackText) return fallbackText;\n var start,\n startValue = startText,\n startLength = startValue.length,\n end,\n endValue = \"value\" in root ? root.value : root.textContent,\n endLength = endValue.length;\n for (\n start = 0;\n start < startLength && startValue[start] === endValue[start];\n start++\n );\n var minEnd = startLength - start;\n for (\n end = 1;\n end <= minEnd &&\n startValue[startLength - end] === endValue[endLength - end];\n end++\n );\n return (fallbackText = endValue.slice(start, 1 < end ? 1 - end : void 0));\n}\nfunction getEventCharCode(nativeEvent) {\n var keyCode = nativeEvent.keyCode;\n \"charCode\" in nativeEvent\n ? ((nativeEvent = nativeEvent.charCode),\n 0 === nativeEvent && 13 === keyCode && (nativeEvent = 13))\n : (nativeEvent = keyCode);\n 10 === nativeEvent && (nativeEvent = 13);\n return 32 <= nativeEvent || 13 === nativeEvent ? nativeEvent : 0;\n}\nfunction functionThatReturnsTrue() {\n return !0;\n}\nfunction functionThatReturnsFalse() {\n return !1;\n}\nfunction createSyntheticEvent(Interface) {\n function SyntheticBaseEvent(\n reactName,\n reactEventType,\n targetInst,\n nativeEvent,\n nativeEventTarget\n ) {\n this._reactName = reactName;\n this._targetInst = targetInst;\n this.type = reactEventType;\n this.nativeEvent = nativeEvent;\n this.target = nativeEventTarget;\n this.currentTarget = null;\n for (var propName in Interface)\n Interface.hasOwnProperty(propName) &&\n ((reactName = Interface[propName]),\n (this[propName] = reactName\n ? reactName(nativeEvent)\n : nativeEvent[propName]));\n this.isDefaultPrevented = (\n null != nativeEvent.defaultPrevented\n ? nativeEvent.defaultPrevented\n : !1 === nativeEvent.returnValue\n )\n ? functionThatReturnsTrue\n : functionThatReturnsFalse;\n this.isPropagationStopped = functionThatReturnsFalse;\n return this;\n }\n assign(SyntheticBaseEvent.prototype, {\n preventDefault: function () {\n this.defaultPrevented = !0;\n var event = this.nativeEvent;\n event &&\n (event.preventDefault\n ? event.preventDefault()\n : \"unknown\" !== typeof event.returnValue && (event.returnValue = !1),\n (this.isDefaultPrevented = functionThatReturnsTrue));\n },\n stopPropagation: function () {\n var event = this.nativeEvent;\n event &&\n (event.stopPropagation\n ? event.stopPropagation()\n : \"unknown\" !== typeof event.cancelBubble &&\n (event.cancelBubble = !0),\n (this.isPropagationStopped = functionThatReturnsTrue));\n },\n persist: function () {},\n isPersistent: functionThatReturnsTrue\n });\n return SyntheticBaseEvent;\n}\nvar EventInterface = {\n eventPhase: 0,\n bubbles: 0,\n cancelable: 0,\n timeStamp: function (event) {\n return event.timeStamp || Date.now();\n },\n defaultPrevented: 0,\n isTrusted: 0\n },\n SyntheticEvent = createSyntheticEvent(EventInterface),\n UIEventInterface = assign({}, EventInterface, { view: 0, detail: 0 }),\n SyntheticUIEvent = createSyntheticEvent(UIEventInterface),\n lastMovementX,\n lastMovementY,\n lastMouseEvent,\n MouseEventInterface = assign({}, UIEventInterface, {\n screenX: 0,\n screenY: 0,\n clientX: 0,\n clientY: 0,\n pageX: 0,\n pageY: 0,\n ctrlKey: 0,\n shiftKey: 0,\n altKey: 0,\n metaKey: 0,\n getModifierState: getEventModifierState,\n button: 0,\n buttons: 0,\n relatedTarget: function (event) {\n return void 0 === event.relatedTarget\n ? event.fromElement === event.srcElement\n ? event.toElement\n : event.fromElement\n : event.relatedTarget;\n },\n movementX: function (event) {\n if (\"movementX\" in event) return event.movementX;\n event !== lastMouseEvent &&\n (lastMouseEvent && \"mousemove\" === event.type\n ? ((lastMovementX = event.screenX - lastMouseEvent.screenX),\n (lastMovementY = event.screenY - lastMouseEvent.screenY))\n : (lastMovementY = lastMovementX = 0),\n (lastMouseEvent = event));\n return lastMovementX;\n },\n movementY: function (event) {\n return \"movementY\" in event ? event.movementY : lastMovementY;\n }\n }),\n SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface),\n DragEventInterface = assign({}, MouseEventInterface, { dataTransfer: 0 }),\n SyntheticDragEvent = createSyntheticEvent(DragEventInterface),\n FocusEventInterface = assign({}, UIEventInterface, { relatedTarget: 0 }),\n SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface),\n AnimationEventInterface = assign({}, EventInterface, {\n animationName: 0,\n elapsedTime: 0,\n pseudoElement: 0\n }),\n SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface),\n ClipboardEventInterface = assign({}, EventInterface, {\n clipboardData: function (event) {\n return \"clipboardData\" in event\n ? event.clipboardData\n : window.clipboardData;\n }\n }),\n SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface),\n CompositionEventInterface = assign({}, EventInterface, { data: 0 }),\n SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface),\n normalizeKey = {\n Esc: \"Escape\",\n Spacebar: \" \",\n Left: \"ArrowLeft\",\n Up: \"ArrowUp\",\n Right: \"ArrowRight\",\n Down: \"ArrowDown\",\n Del: \"Delete\",\n Win: \"OS\",\n Menu: \"ContextMenu\",\n Apps: \"ContextMenu\",\n Scroll: \"ScrollLock\",\n MozPrintableKey: \"Unidentified\"\n },\n translateToKey = {\n 8: \"Backspace\",\n 9: \"Tab\",\n 12: \"Clear\",\n 13: \"Enter\",\n 16: \"Shift\",\n 17: \"Control\",\n 18: \"Alt\",\n 19: \"Pause\",\n 20: \"CapsLock\",\n 27: \"Escape\",\n 32: \" \",\n 33: \"PageUp\",\n 34: \"PageDown\",\n 35: \"End\",\n 36: \"Home\",\n 37: \"ArrowLeft\",\n 38: \"ArrowUp\",\n 39: \"ArrowRight\",\n 40: \"ArrowDown\",\n 45: \"Insert\",\n 46: \"Delete\",\n 112: \"F1\",\n 113: \"F2\",\n 114: \"F3\",\n 115: \"F4\",\n 116: \"F5\",\n 117: \"F6\",\n 118: \"F7\",\n 119: \"F8\",\n 120: \"F9\",\n 121: \"F10\",\n 122: \"F11\",\n 123: \"F12\",\n 144: \"NumLock\",\n 145: \"ScrollLock\",\n 224: \"Meta\"\n },\n modifierKeyToProp = {\n Alt: \"altKey\",\n Control: \"ctrlKey\",\n Meta: \"metaKey\",\n Shift: \"shiftKey\"\n };\nfunction modifierStateGetter(keyArg) {\n var nativeEvent = this.nativeEvent;\n return nativeEvent.getModifierState\n ? nativeEvent.getModifierState(keyArg)\n : (keyArg = modifierKeyToProp[keyArg])\n ? !!nativeEvent[keyArg]\n : !1;\n}\nfunction getEventModifierState() {\n return modifierStateGetter;\n}\nvar KeyboardEventInterface = assign({}, UIEventInterface, {\n key: function (nativeEvent) {\n if (nativeEvent.key) {\n var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n if (\"Unidentified\" !== key) return key;\n }\n return \"keypress\" === nativeEvent.type\n ? ((nativeEvent = getEventCharCode(nativeEvent)),\n 13 === nativeEvent ? \"Enter\" : String.fromCharCode(nativeEvent))\n : \"keydown\" === nativeEvent.type || \"keyup\" === nativeEvent.type\n ? translateToKey[nativeEvent.keyCode] || \"Unidentified\"\n : \"\";\n },\n code: 0,\n location: 0,\n ctrlKey: 0,\n shiftKey: 0,\n altKey: 0,\n metaKey: 0,\n repeat: 0,\n locale: 0,\n getModifierState: getEventModifierState,\n charCode: function (event) {\n return \"keypress\" === event.type ? getEventCharCode(event) : 0;\n },\n keyCode: function (event) {\n return \"keydown\" === event.type || \"keyup\" === event.type\n ? event.keyCode\n : 0;\n },\n which: function (event) {\n return \"keypress\" === event.type\n ? getEventCharCode(event)\n : \"keydown\" === event.type || \"keyup\" === event.type\n ? event.keyCode\n : 0;\n }\n }),\n SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface),\n PointerEventInterface = assign({}, MouseEventInterface, {\n pointerId: 0,\n width: 0,\n height: 0,\n pressure: 0,\n tangentialPressure: 0,\n tiltX: 0,\n tiltY: 0,\n twist: 0,\n pointerType: 0,\n isPrimary: 0\n }),\n SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface),\n TouchEventInterface = assign({}, UIEventInterface, {\n touches: 0,\n targetTouches: 0,\n changedTouches: 0,\n altKey: 0,\n metaKey: 0,\n ctrlKey: 0,\n shiftKey: 0,\n getModifierState: getEventModifierState\n }),\n SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface),\n TransitionEventInterface = assign({}, EventInterface, {\n propertyName: 0,\n elapsedTime: 0,\n pseudoElement: 0\n }),\n SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface),\n WheelEventInterface = assign({}, MouseEventInterface, {\n deltaX: function (event) {\n return \"deltaX\" in event\n ? event.deltaX\n : \"wheelDeltaX\" in event\n ? -event.wheelDeltaX\n : 0;\n },\n deltaY: function (event) {\n return \"deltaY\" in event\n ? event.deltaY\n : \"wheelDeltaY\" in event\n ? -event.wheelDeltaY\n : \"wheelDelta\" in event\n ? -event.wheelDelta\n : 0;\n },\n deltaZ: 0,\n deltaMode: 0\n }),\n SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface),\n ToggleEventInterface = assign({}, EventInterface, {\n newState: 0,\n oldState: 0\n }),\n SyntheticToggleEvent = createSyntheticEvent(ToggleEventInterface),\n END_KEYCODES = [9, 13, 27, 32],\n canUseCompositionEvent = canUseDOM && \"CompositionEvent\" in window,\n documentMode = null;\ncanUseDOM &&\n \"documentMode\" in document &&\n (documentMode = document.documentMode);\nvar canUseTextInputEvent = canUseDOM && \"TextEvent\" in window && !documentMode,\n useFallbackCompositionData =\n canUseDOM &&\n (!canUseCompositionEvent ||\n (documentMode && 8 < documentMode && 11 >= documentMode)),\n SPACEBAR_CHAR = String.fromCharCode(32),\n hasSpaceKeypress = !1;\nfunction isFallbackCompositionEnd(domEventName, nativeEvent) {\n switch (domEventName) {\n case \"keyup\":\n return -1 !== END_KEYCODES.indexOf(nativeEvent.keyCode);\n case \"keydown\":\n return 229 !== nativeEvent.keyCode;\n case \"keypress\":\n case \"mousedown\":\n case \"focusout\":\n return !0;\n default:\n return !1;\n }\n}\nfunction getDataFromCustomEvent(nativeEvent) {\n nativeEvent = nativeEvent.detail;\n return \"object\" === typeof nativeEvent && \"data\" in nativeEvent\n ? nativeEvent.data\n : null;\n}\nvar isComposing = !1;\nfunction getNativeBeforeInputChars(domEventName, nativeEvent) {\n switch (domEventName) {\n case \"compositionend\":\n return getDataFromCustomEvent(nativeEvent);\n case \"keypress\":\n if (32 !== nativeEvent.which) return null;\n hasSpaceKeypress = !0;\n return SPACEBAR_CHAR;\n case \"textInput\":\n return (\n (domEventName = nativeEvent.data),\n domEventName === SPACEBAR_CHAR && hasSpaceKeypress ? null : domEventName\n );\n default:\n return null;\n }\n}\nfunction getFallbackBeforeInputChars(domEventName, nativeEvent) {\n if (isComposing)\n return \"compositionend\" === domEventName ||\n (!canUseCompositionEvent &&\n isFallbackCompositionEnd(domEventName, nativeEvent))\n ? ((domEventName = getData()),\n (fallbackText = startText = root = null),\n (isComposing = !1),\n domEventName)\n : null;\n switch (domEventName) {\n case \"paste\":\n return null;\n case \"keypress\":\n if (\n !(nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) ||\n (nativeEvent.ctrlKey && nativeEvent.altKey)\n ) {\n if (nativeEvent.char && 1 < nativeEvent.char.length)\n return nativeEvent.char;\n if (nativeEvent.which) return String.fromCharCode(nativeEvent.which);\n }\n return null;\n case \"compositionend\":\n return useFallbackCompositionData && \"ko\" !== nativeEvent.locale\n ? null\n : nativeEvent.data;\n default:\n return null;\n }\n}\nvar supportedInputTypes = {\n color: !0,\n date: !0,\n datetime: !0,\n \"datetime-local\": !0,\n email: !0,\n month: !0,\n number: !0,\n password: !0,\n range: !0,\n search: !0,\n tel: !0,\n text: !0,\n time: !0,\n url: !0,\n week: !0\n};\nfunction isTextInputElement(elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return \"input\" === nodeName\n ? !!supportedInputTypes[elem.type]\n : \"textarea\" === nodeName\n ? !0\n : !1;\n}\nfunction createAndAccumulateChangeEvent(\n dispatchQueue,\n inst,\n nativeEvent,\n target\n) {\n restoreTarget\n ? restoreQueue\n ? restoreQueue.push(target)\n : (restoreQueue = [target])\n : (restoreTarget = target);\n inst = accumulateTwoPhaseListeners(inst, \"onChange\");\n 0 < inst.length &&\n ((nativeEvent = new SyntheticEvent(\n \"onChange\",\n \"change\",\n null,\n nativeEvent,\n target\n )),\n dispatchQueue.push({ event: nativeEvent, listeners: inst }));\n}\nvar activeElement$1 = null,\n activeElementInst$1 = null;\nfunction runEventInBatch(dispatchQueue) {\n processDispatchQueue(dispatchQueue, 0);\n}\nfunction getInstIfValueChanged(targetInst) {\n var targetNode = getNodeFromInstance(targetInst);\n if (updateValueIfChanged(targetNode)) return targetInst;\n}\nfunction getTargetInstForChangeEvent(domEventName, targetInst) {\n if (\"change\" === domEventName) return targetInst;\n}\nvar isInputEventSupported = !1;\nif (canUseDOM) {\n var JSCompiler_inline_result$jscomp$286;\n if (canUseDOM) {\n var isSupported$jscomp$inline_427 = \"oninput\" in document;\n if (!isSupported$jscomp$inline_427) {\n var element$jscomp$inline_428 = document.createElement(\"div\");\n element$jscomp$inline_428.setAttribute(\"oninput\", \"return;\");\n isSupported$jscomp$inline_427 =\n \"function\" === typeof element$jscomp$inline_428.oninput;\n }\n JSCompiler_inline_result$jscomp$286 = isSupported$jscomp$inline_427;\n } else JSCompiler_inline_result$jscomp$286 = !1;\n isInputEventSupported =\n JSCompiler_inline_result$jscomp$286 &&\n (!document.documentMode || 9 < document.documentMode);\n}\nfunction stopWatchingForValueChange() {\n activeElement$1 &&\n (activeElement$1.detachEvent(\"onpropertychange\", handlePropertyChange),\n (activeElementInst$1 = activeElement$1 = null));\n}\nfunction handlePropertyChange(nativeEvent) {\n if (\n \"value\" === nativeEvent.propertyName &&\n getInstIfValueChanged(activeElementInst$1)\n ) {\n var dispatchQueue = [];\n createAndAccumulateChangeEvent(\n dispatchQueue,\n activeElementInst$1,\n nativeEvent,\n getEventTarget(nativeEvent)\n );\n batchedUpdates$1(runEventInBatch, dispatchQueue);\n }\n}\nfunction handleEventsForInputEventPolyfill(domEventName, target, targetInst) {\n \"focusin\" === domEventName\n ? (stopWatchingForValueChange(),\n (activeElement$1 = target),\n (activeElementInst$1 = targetInst),\n activeElement$1.attachEvent(\"onpropertychange\", handlePropertyChange))\n : \"focusout\" === domEventName && stopWatchingForValueChange();\n}\nfunction getTargetInstForInputEventPolyfill(domEventName) {\n if (\n \"selectionchange\" === domEventName ||\n \"keyup\" === domEventName ||\n \"keydown\" === domEventName\n )\n return getInstIfValueChanged(activeElementInst$1);\n}\nfunction getTargetInstForClickEvent(domEventName, targetInst) {\n if (\"click\" === domEventName) return getInstIfValueChanged(targetInst);\n}\nfunction getTargetInstForInputOrChangeEvent(domEventName, targetInst) {\n if (\"input\" === domEventName || \"change\" === domEventName)\n return getInstIfValueChanged(targetInst);\n}\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is;\nfunction shallowEqual(objA, objB) {\n if (objectIs(objA, objB)) return !0;\n if (\n \"object\" !== typeof objA ||\n null === objA ||\n \"object\" !== typeof objB ||\n null === objB\n )\n return !1;\n var keysA = Object.keys(objA),\n keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) return !1;\n for (keysB = 0; keysB < keysA.length; keysB++) {\n var currentKey = keysA[keysB];\n if (\n !hasOwnProperty.call(objB, currentKey) ||\n !objectIs(objA[currentKey], objB[currentKey])\n )\n return !1;\n }\n return !0;\n}\nfunction getLeafNode(node) {\n for (; node && node.firstChild; ) node = node.firstChild;\n return node;\n}\nfunction getNodeForCharacterOffset(root, offset) {\n var node = getLeafNode(root);\n root = 0;\n for (var nodeEnd; node; ) {\n if (3 === node.nodeType) {\n nodeEnd = root + node.textContent.length;\n if (root <= offset && nodeEnd >= offset)\n return { node: node, offset: offset - root };\n root = nodeEnd;\n }\n a: {\n for (; node; ) {\n if (node.nextSibling) {\n node = node.nextSibling;\n break a;\n }\n node = node.parentNode;\n }\n node = void 0;\n }\n node = getLeafNode(node);\n }\n}\nfunction containsNode(outerNode, innerNode) {\n return outerNode && innerNode\n ? outerNode === innerNode\n ? !0\n : outerNode && 3 === outerNode.nodeType\n ? !1\n : innerNode && 3 === innerNode.nodeType\n ? containsNode(outerNode, innerNode.parentNode)\n : \"contains\" in outerNode\n ? outerNode.contains(innerNode)\n : outerNode.compareDocumentPosition\n ? !!(outerNode.compareDocumentPosition(innerNode) & 16)\n : !1\n : !1;\n}\nfunction getActiveElementDeep(containerInfo) {\n containerInfo =\n null != containerInfo &&\n null != containerInfo.ownerDocument &&\n null != containerInfo.ownerDocument.defaultView\n ? containerInfo.ownerDocument.defaultView\n : window;\n for (\n var element = getActiveElement(containerInfo.document);\n element instanceof containerInfo.HTMLIFrameElement;\n\n ) {\n try {\n var JSCompiler_inline_result =\n \"string\" === typeof element.contentWindow.location.href;\n } catch (err) {\n JSCompiler_inline_result = !1;\n }\n if (JSCompiler_inline_result) containerInfo = element.contentWindow;\n else break;\n element = getActiveElement(containerInfo.document);\n }\n return element;\n}\nfunction hasSelectionCapabilities(elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return (\n nodeName &&\n ((\"input\" === nodeName &&\n (\"text\" === elem.type ||\n \"search\" === elem.type ||\n \"tel\" === elem.type ||\n \"url\" === elem.type ||\n \"password\" === elem.type)) ||\n \"textarea\" === nodeName ||\n \"true\" === elem.contentEditable)\n );\n}\nvar skipSelectionChangeEvent =\n canUseDOM && \"documentMode\" in document && 11 >= document.documentMode,\n activeElement = null,\n activeElementInst = null,\n lastSelection = null,\n mouseDown = !1;\nfunction constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) {\n var doc =\n nativeEventTarget.window === nativeEventTarget\n ? nativeEventTarget.document\n : 9 === nativeEventTarget.nodeType\n ? nativeEventTarget\n : nativeEventTarget.ownerDocument;\n mouseDown ||\n null == activeElement ||\n activeElement !== getActiveElement(doc) ||\n ((doc = activeElement),\n \"selectionStart\" in doc && hasSelectionCapabilities(doc)\n ? (doc = { start: doc.selectionStart, end: doc.selectionEnd })\n : ((doc = (\n (doc.ownerDocument && doc.ownerDocument.defaultView) ||\n window\n ).getSelection()),\n (doc = {\n anchorNode: doc.anchorNode,\n anchorOffset: doc.anchorOffset,\n focusNode: doc.focusNode,\n focusOffset: doc.focusOffset\n })),\n (lastSelection && shallowEqual(lastSelection, doc)) ||\n ((lastSelection = doc),\n (doc = accumulateTwoPhaseListeners(activeElementInst, \"onSelect\")),\n 0 < doc.length &&\n ((nativeEvent = new SyntheticEvent(\n \"onSelect\",\n \"select\",\n null,\n nativeEvent,\n nativeEventTarget\n )),\n dispatchQueue.push({ event: nativeEvent, listeners: doc }),\n (nativeEvent.target = activeElement))));\n}\nfunction makePrefixMap(styleProp, eventName) {\n var prefixes = {};\n prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n prefixes[\"Webkit\" + styleProp] = \"webkit\" + eventName;\n prefixes[\"Moz\" + styleProp] = \"moz\" + eventName;\n return prefixes;\n}\nvar vendorPrefixes = {\n animationend: makePrefixMap(\"Animation\", \"AnimationEnd\"),\n animationiteration: makePrefixMap(\"Animation\", \"AnimationIteration\"),\n animationstart: makePrefixMap(\"Animation\", \"AnimationStart\"),\n transitionrun: makePrefixMap(\"Transition\", \"TransitionRun\"),\n transitionstart: makePrefixMap(\"Transition\", \"TransitionStart\"),\n transitioncancel: makePrefixMap(\"Transition\", \"TransitionCancel\"),\n transitionend: makePrefixMap(\"Transition\", \"TransitionEnd\")\n },\n prefixedEventNames = {},\n style = {};\ncanUseDOM &&\n ((style = document.createElement(\"div\").style),\n \"AnimationEvent\" in window ||\n (delete vendorPrefixes.animationend.animation,\n delete vendorPrefixes.animationiteration.animation,\n delete vendorPrefixes.animationstart.animation),\n \"TransitionEvent\" in window ||\n delete vendorPrefixes.transitionend.transition);\nfunction getVendorPrefixedEventName(eventName) {\n if (prefixedEventNames[eventName]) return prefixedEventNames[eventName];\n if (!vendorPrefixes[eventName]) return eventName;\n var prefixMap = vendorPrefixes[eventName],\n styleProp;\n for (styleProp in prefixMap)\n if (prefixMap.hasOwnProperty(styleProp) && styleProp in style)\n return (prefixedEventNames[eventName] = prefixMap[styleProp]);\n return eventName;\n}\nvar ANIMATION_END = getVendorPrefixedEventName(\"animationend\"),\n ANIMATION_ITERATION = getVendorPrefixedEventName(\"animationiteration\"),\n ANIMATION_START = getVendorPrefixedEventName(\"animationstart\"),\n TRANSITION_RUN = getVendorPrefixedEventName(\"transitionrun\"),\n TRANSITION_START = getVendorPrefixedEventName(\"transitionstart\"),\n TRANSITION_CANCEL = getVendorPrefixedEventName(\"transitioncancel\"),\n TRANSITION_END = getVendorPrefixedEventName(\"transitionend\"),\n topLevelEventsToReactNames = new Map(),\n simpleEventPluginEvents =\n \"abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\n \" \"\n );\nsimpleEventPluginEvents.push(\"scrollEnd\");\nfunction registerSimpleEvent(domEventName, reactName) {\n topLevelEventsToReactNames.set(domEventName, reactName);\n registerTwoPhaseEvent(reactName, [domEventName]);\n}\nvar reportGlobalError =\n \"function\" === typeof reportError\n ? reportError\n : function (error) {\n if (\n \"object\" === typeof window &&\n \"function\" === typeof window.ErrorEvent\n ) {\n var event = new window.ErrorEvent(\"error\", {\n bubbles: !0,\n cancelable: !0,\n message:\n \"object\" === typeof error &&\n null !== error &&\n \"string\" === typeof error.message\n ? String(error.message)\n : String(error),\n error: error\n });\n if (!window.dispatchEvent(event)) return;\n } else if (\n \"object\" === typeof process &&\n \"function\" === typeof process.emit\n ) {\n process.emit(\"uncaughtException\", error);\n return;\n }\n console.error(error);\n },\n concurrentQueues = [],\n concurrentQueuesIndex = 0,\n concurrentlyUpdatedLanes = 0;\nfunction finishQueueingConcurrentUpdates() {\n for (\n var endIndex = concurrentQueuesIndex,\n i = (concurrentlyUpdatedLanes = concurrentQueuesIndex = 0);\n i < endIndex;\n\n ) {\n var fiber = concurrentQueues[i];\n concurrentQueues[i++] = null;\n var queue = concurrentQueues[i];\n concurrentQueues[i++] = null;\n var update = concurrentQueues[i];\n concurrentQueues[i++] = null;\n var lane = concurrentQueues[i];\n concurrentQueues[i++] = null;\n if (null !== queue && null !== update) {\n var pending = queue.pending;\n null === pending\n ? (update.next = update)\n : ((update.next = pending.next), (pending.next = update));\n queue.pending = update;\n }\n 0 !== lane && markUpdateLaneFromFiberToRoot(fiber, update, lane);\n }\n}\nfunction enqueueUpdate$1(fiber, queue, update, lane) {\n concurrentQueues[concurrentQueuesIndex++] = fiber;\n concurrentQueues[concurrentQueuesIndex++] = queue;\n concurrentQueues[concurrentQueuesIndex++] = update;\n concurrentQueues[concurrentQueuesIndex++] = lane;\n concurrentlyUpdatedLanes |= lane;\n fiber.lanes |= lane;\n fiber = fiber.alternate;\n null !== fiber && (fiber.lanes |= lane);\n}\nfunction enqueueConcurrentHookUpdate(fiber, queue, update, lane) {\n enqueueUpdate$1(fiber, queue, update, lane);\n return getRootForUpdatedFiber(fiber);\n}\nfunction enqueueConcurrentRenderForLane(fiber, lane) {\n enqueueUpdate$1(fiber, null, null, lane);\n return getRootForUpdatedFiber(fiber);\n}\nfunction markUpdateLaneFromFiberToRoot(sourceFiber, update, lane) {\n sourceFiber.lanes |= lane;\n var alternate = sourceFiber.alternate;\n null !== alternate && (alternate.lanes |= lane);\n for (var isHidden = !1, parent = sourceFiber.return; null !== parent; )\n (parent.childLanes |= lane),\n (alternate = parent.alternate),\n null !== alternate && (alternate.childLanes |= lane),\n 22 === parent.tag &&\n ((sourceFiber = parent.stateNode),\n null === sourceFiber || sourceFiber._visibility & 1 || (isHidden = !0)),\n (sourceFiber = parent),\n (parent = parent.return);\n return 3 === sourceFiber.tag\n ? ((parent = sourceFiber.stateNode),\n isHidden &&\n null !== update &&\n ((isHidden = 31 - clz32(lane)),\n (sourceFiber = parent.hiddenUpdates),\n (alternate = sourceFiber[isHidden]),\n null === alternate\n ? (sourceFiber[isHidden] = [update])\n : alternate.push(update),\n (update.lane = lane | 536870912)),\n parent)\n : null;\n}\nfunction getRootForUpdatedFiber(sourceFiber) {\n if (50 < nestedUpdateCount)\n throw (\n ((nestedUpdateCount = 0),\n (rootWithNestedUpdates = null),\n Error(formatProdErrorMessage(185)))\n );\n for (var parent = sourceFiber.return; null !== parent; )\n (sourceFiber = parent), (parent = sourceFiber.return);\n return 3 === sourceFiber.tag ? sourceFiber.stateNode : null;\n}\nvar emptyContextObject = {};\nfunction FiberNode(tag, pendingProps, key, mode) {\n this.tag = tag;\n this.key = key;\n this.sibling =\n this.child =\n this.return =\n this.stateNode =\n this.type =\n this.elementType =\n null;\n this.index = 0;\n this.refCleanup = this.ref = null;\n this.pendingProps = pendingProps;\n this.dependencies =\n this.memoizedState =\n this.updateQueue =\n this.memoizedProps =\n null;\n this.mode = mode;\n this.subtreeFlags = this.flags = 0;\n this.deletions = null;\n this.childLanes = this.lanes = 0;\n this.alternate = null;\n}\nfunction createFiberImplClass(tag, pendingProps, key, mode) {\n return new FiberNode(tag, pendingProps, key, mode);\n}\nfunction shouldConstruct(Component) {\n Component = Component.prototype;\n return !(!Component || !Component.isReactComponent);\n}\nfunction createWorkInProgress(current, pendingProps) {\n var workInProgress = current.alternate;\n null === workInProgress\n ? ((workInProgress = createFiberImplClass(\n current.tag,\n pendingProps,\n current.key,\n current.mode\n )),\n (workInProgress.elementType = current.elementType),\n (workInProgress.type = current.type),\n (workInProgress.stateNode = current.stateNode),\n (workInProgress.alternate = current),\n (current.alternate = workInProgress))\n : ((workInProgress.pendingProps = pendingProps),\n (workInProgress.type = current.type),\n (workInProgress.flags = 0),\n (workInProgress.subtreeFlags = 0),\n (workInProgress.deletions = null));\n workInProgress.flags = current.flags & 65011712;\n workInProgress.childLanes = current.childLanes;\n workInProgress.lanes = current.lanes;\n workInProgress.child = current.child;\n workInProgress.memoizedProps = current.memoizedProps;\n workInProgress.memoizedState = current.memoizedState;\n workInProgress.updateQueue = current.updateQueue;\n pendingProps = current.dependencies;\n workInProgress.dependencies =\n null === pendingProps\n ? null\n : { lanes: pendingProps.lanes, firstContext: pendingProps.firstContext };\n workInProgress.sibling = current.sibling;\n workInProgress.index = current.index;\n workInProgress.ref = current.ref;\n workInProgress.refCleanup = current.refCleanup;\n return workInProgress;\n}\nfunction resetWorkInProgress(workInProgress, renderLanes) {\n workInProgress.flags &= 65011714;\n var current = workInProgress.alternate;\n null === current\n ? ((workInProgress.childLanes = 0),\n (workInProgress.lanes = renderLanes),\n (workInProgress.child = null),\n (workInProgress.subtreeFlags = 0),\n (workInProgress.memoizedProps = null),\n (workInProgress.memoizedState = null),\n (workInProgress.updateQueue = null),\n (workInProgress.dependencies = null),\n (workInProgress.stateNode = null))\n : ((workInProgress.childLanes = current.childLanes),\n (workInProgress.lanes = current.lanes),\n (workInProgress.child = current.child),\n (workInProgress.subtreeFlags = 0),\n (workInProgress.deletions = null),\n (workInProgress.memoizedProps = current.memoizedProps),\n (workInProgress.memoizedState = current.memoizedState),\n (workInProgress.updateQueue = current.updateQueue),\n (workInProgress.type = current.type),\n (renderLanes = current.dependencies),\n (workInProgress.dependencies =\n null === renderLanes\n ? null\n : {\n lanes: renderLanes.lanes,\n firstContext: renderLanes.firstContext\n }));\n return workInProgress;\n}\nfunction createFiberFromTypeAndProps(\n type,\n key,\n pendingProps,\n owner,\n mode,\n lanes\n) {\n var fiberTag = 0;\n owner = type;\n if (\"function\" === typeof type) shouldConstruct(type) && (fiberTag = 1);\n else if (\"string\" === typeof type)\n fiberTag = isHostHoistableType(\n type,\n pendingProps,\n contextStackCursor.current\n )\n ? 26\n : \"html\" === type || \"head\" === type || \"body\" === type\n ? 27\n : 5;\n else\n a: switch (type) {\n case REACT_ACTIVITY_TYPE:\n return (\n (type = createFiberImplClass(31, pendingProps, key, mode)),\n (type.elementType = REACT_ACTIVITY_TYPE),\n (type.lanes = lanes),\n type\n );\n case REACT_FRAGMENT_TYPE:\n return createFiberFromFragment(pendingProps.children, mode, lanes, key);\n case REACT_STRICT_MODE_TYPE:\n fiberTag = 8;\n mode |= 24;\n break;\n case REACT_PROFILER_TYPE:\n return (\n (type = createFiberImplClass(12, pendingProps, key, mode | 2)),\n (type.elementType = REACT_PROFILER_TYPE),\n (type.lanes = lanes),\n type\n );\n case REACT_SUSPENSE_TYPE:\n return (\n (type = createFiberImplClass(13, pendingProps, key, mode)),\n (type.elementType = REACT_SUSPENSE_TYPE),\n (type.lanes = lanes),\n type\n );\n case REACT_SUSPENSE_LIST_TYPE:\n return (\n (type = createFiberImplClass(19, pendingProps, key, mode)),\n (type.elementType = REACT_SUSPENSE_LIST_TYPE),\n (type.lanes = lanes),\n type\n );\n default:\n if (\"object\" === typeof type && null !== type)\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n fiberTag = 10;\n break a;\n case REACT_CONSUMER_TYPE:\n fiberTag = 9;\n break a;\n case REACT_FORWARD_REF_TYPE:\n fiberTag = 11;\n break a;\n case REACT_MEMO_TYPE:\n fiberTag = 14;\n break a;\n case REACT_LAZY_TYPE:\n fiberTag = 16;\n owner = null;\n break a;\n }\n fiberTag = 29;\n pendingProps = Error(\n formatProdErrorMessage(130, null === type ? \"null\" : typeof type, \"\")\n );\n owner = null;\n }\n key = createFiberImplClass(fiberTag, pendingProps, key, mode);\n key.elementType = type;\n key.type = owner;\n key.lanes = lanes;\n return key;\n}\nfunction createFiberFromFragment(elements, mode, lanes, key) {\n elements = createFiberImplClass(7, elements, key, mode);\n elements.lanes = lanes;\n return elements;\n}\nfunction createFiberFromText(content, mode, lanes) {\n content = createFiberImplClass(6, content, null, mode);\n content.lanes = lanes;\n return content;\n}\nfunction createFiberFromDehydratedFragment(dehydratedNode) {\n var fiber = createFiberImplClass(18, null, null, 0);\n fiber.stateNode = dehydratedNode;\n return fiber;\n}\nfunction createFiberFromPortal(portal, mode, lanes) {\n mode = createFiberImplClass(\n 4,\n null !== portal.children ? portal.children : [],\n portal.key,\n mode\n );\n mode.lanes = lanes;\n mode.stateNode = {\n containerInfo: portal.containerInfo,\n pendingChildren: null,\n implementation: portal.implementation\n };\n return mode;\n}\nvar CapturedStacks = new WeakMap();\nfunction createCapturedValueAtFiber(value, source) {\n if (\"object\" === typeof value && null !== value) {\n var existing = CapturedStacks.get(value);\n if (void 0 !== existing) return existing;\n source = {\n value: value,\n source: source,\n stack: getStackByFiberInDevAndProd(source)\n };\n CapturedStacks.set(value, source);\n return source;\n }\n return {\n value: value,\n source: source,\n stack: getStackByFiberInDevAndProd(source)\n };\n}\nvar forkStack = [],\n forkStackIndex = 0,\n treeForkProvider = null,\n treeForkCount = 0,\n idStack = [],\n idStackIndex = 0,\n treeContextProvider = null,\n treeContextId = 1,\n treeContextOverflow = \"\";\nfunction pushTreeFork(workInProgress, totalChildren) {\n forkStack[forkStackIndex++] = treeForkCount;\n forkStack[forkStackIndex++] = treeForkProvider;\n treeForkProvider = workInProgress;\n treeForkCount = totalChildren;\n}\nfunction pushTreeId(workInProgress, totalChildren, index) {\n idStack[idStackIndex++] = treeContextId;\n idStack[idStackIndex++] = treeContextOverflow;\n idStack[idStackIndex++] = treeContextProvider;\n treeContextProvider = workInProgress;\n var baseIdWithLeadingBit = treeContextId;\n workInProgress = treeContextOverflow;\n var baseLength = 32 - clz32(baseIdWithLeadingBit) - 1;\n baseIdWithLeadingBit &= ~(1 << baseLength);\n index += 1;\n var length = 32 - clz32(totalChildren) + baseLength;\n if (30 < length) {\n var numberOfOverflowBits = baseLength - (baseLength % 5);\n length = (\n baseIdWithLeadingBit &\n ((1 << numberOfOverflowBits) - 1)\n ).toString(32);\n baseIdWithLeadingBit >>= numberOfOverflowBits;\n baseLength -= numberOfOverflowBits;\n treeContextId =\n (1 << (32 - clz32(totalChildren) + baseLength)) |\n (index << baseLength) |\n baseIdWithLeadingBit;\n treeContextOverflow = length + workInProgress;\n } else\n (treeContextId =\n (1 << length) | (index << baseLength) | baseIdWithLeadingBit),\n (treeContextOverflow = workInProgress);\n}\nfunction pushMaterializedTreeId(workInProgress) {\n null !== workInProgress.return &&\n (pushTreeFork(workInProgress, 1), pushTreeId(workInProgress, 1, 0));\n}\nfunction popTreeContext(workInProgress) {\n for (; workInProgress === treeForkProvider; )\n (treeForkProvider = forkStack[--forkStackIndex]),\n (forkStack[forkStackIndex] = null),\n (treeForkCount = forkStack[--forkStackIndex]),\n (forkStack[forkStackIndex] = null);\n for (; workInProgress === treeContextProvider; )\n (treeContextProvider = idStack[--idStackIndex]),\n (idStack[idStackIndex] = null),\n (treeContextOverflow = idStack[--idStackIndex]),\n (idStack[idStackIndex] = null),\n (treeContextId = idStack[--idStackIndex]),\n (idStack[idStackIndex] = null);\n}\nfunction restoreSuspendedTreeContext(workInProgress, suspendedContext) {\n idStack[idStackIndex++] = treeContextId;\n idStack[idStackIndex++] = treeContextOverflow;\n idStack[idStackIndex++] = treeContextProvider;\n treeContextId = suspendedContext.id;\n treeContextOverflow = suspendedContext.overflow;\n treeContextProvider = workInProgress;\n}\nvar hydrationParentFiber = null,\n nextHydratableInstance = null,\n isHydrating = !1,\n hydrationErrors = null,\n rootOrSingletonContext = !1,\n HydrationMismatchException = Error(formatProdErrorMessage(519));\nfunction throwOnHydrationMismatch(fiber) {\n var error = Error(\n formatProdErrorMessage(\n 418,\n 1 < arguments.length && void 0 !== arguments[1] && arguments[1]\n ? \"text\"\n : \"HTML\",\n \"\"\n )\n );\n queueHydrationError(createCapturedValueAtFiber(error, fiber));\n throw HydrationMismatchException;\n}\nfunction prepareToHydrateHostInstance(fiber) {\n var instance = fiber.stateNode,\n type = fiber.type,\n props = fiber.memoizedProps;\n instance[internalInstanceKey] = fiber;\n instance[internalPropsKey] = props;\n switch (type) {\n case \"dialog\":\n listenToNonDelegatedEvent(\"cancel\", instance);\n listenToNonDelegatedEvent(\"close\", instance);\n break;\n case \"iframe\":\n case \"object\":\n case \"embed\":\n listenToNonDelegatedEvent(\"load\", instance);\n break;\n case \"video\":\n case \"audio\":\n for (type = 0; type < mediaEventTypes.length; type++)\n listenToNonDelegatedEvent(mediaEventTypes[type], instance);\n break;\n case \"source\":\n listenToNonDelegatedEvent(\"error\", instance);\n break;\n case \"img\":\n case \"image\":\n case \"link\":\n listenToNonDelegatedEvent(\"error\", instance);\n listenToNonDelegatedEvent(\"load\", instance);\n break;\n case \"details\":\n listenToNonDelegatedEvent(\"toggle\", instance);\n break;\n case \"input\":\n listenToNonDelegatedEvent(\"invalid\", instance);\n initInput(\n instance,\n props.value,\n props.defaultValue,\n props.checked,\n props.defaultChecked,\n props.type,\n props.name,\n !0\n );\n break;\n case \"select\":\n listenToNonDelegatedEvent(\"invalid\", instance);\n break;\n case \"textarea\":\n listenToNonDelegatedEvent(\"invalid\", instance),\n initTextarea(instance, props.value, props.defaultValue, props.children);\n }\n type = props.children;\n (\"string\" !== typeof type &&\n \"number\" !== typeof type &&\n \"bigint\" !== typeof type) ||\n instance.textContent === \"\" + type ||\n !0 === props.suppressHydrationWarning ||\n checkForUnmatchedText(instance.textContent, type)\n ? (null != props.popover &&\n (listenToNonDelegatedEvent(\"beforetoggle\", instance),\n listenToNonDelegatedEvent(\"toggle\", instance)),\n null != props.onScroll && listenToNonDelegatedEvent(\"scroll\", instance),\n null != props.onScrollEnd &&\n listenToNonDelegatedEvent(\"scrollend\", instance),\n null != props.onClick && (instance.onclick = noop$1),\n (instance = !0))\n : (instance = !1);\n instance || throwOnHydrationMismatch(fiber, !0);\n}\nfunction popToNextHostParent(fiber) {\n for (hydrationParentFiber = fiber.return; hydrationParentFiber; )\n switch (hydrationParentFiber.tag) {\n case 5:\n case 31:\n case 13:\n rootOrSingletonContext = !1;\n return;\n case 27:\n case 3:\n rootOrSingletonContext = !0;\n return;\n default:\n hydrationParentFiber = hydrationParentFiber.return;\n }\n}\nfunction popHydrationState(fiber) {\n if (fiber !== hydrationParentFiber) return !1;\n if (!isHydrating) return popToNextHostParent(fiber), (isHydrating = !0), !1;\n var tag = fiber.tag,\n JSCompiler_temp;\n if ((JSCompiler_temp = 3 !== tag && 27 !== tag)) {\n if ((JSCompiler_temp = 5 === tag))\n (JSCompiler_temp = fiber.type),\n (JSCompiler_temp =\n !(\"form\" !== JSCompiler_temp && \"button\" !== JSCompiler_temp) ||\n shouldSetTextContent(fiber.type, fiber.memoizedProps));\n JSCompiler_temp = !JSCompiler_temp;\n }\n JSCompiler_temp && nextHydratableInstance && throwOnHydrationMismatch(fiber);\n popToNextHostParent(fiber);\n if (13 === tag) {\n fiber = fiber.memoizedState;\n fiber = null !== fiber ? fiber.dehydrated : null;\n if (!fiber) throw Error(formatProdErrorMessage(317));\n nextHydratableInstance =\n getNextHydratableInstanceAfterHydrationBoundary(fiber);\n } else if (31 === tag) {\n fiber = fiber.memoizedState;\n fiber = null !== fiber ? fiber.dehydrated : null;\n if (!fiber) throw Error(formatProdErrorMessage(317));\n nextHydratableInstance =\n getNextHydratableInstanceAfterHydrationBoundary(fiber);\n } else\n 27 === tag\n ? ((tag = nextHydratableInstance),\n isSingletonScope(fiber.type)\n ? ((fiber = previousHydratableOnEnteringScopedSingleton),\n (previousHydratableOnEnteringScopedSingleton = null),\n (nextHydratableInstance = fiber))\n : (nextHydratableInstance = tag))\n : (nextHydratableInstance = hydrationParentFiber\n ? getNextHydratable(fiber.stateNode.nextSibling)\n : null);\n return !0;\n}\nfunction resetHydrationState() {\n nextHydratableInstance = hydrationParentFiber = null;\n isHydrating = !1;\n}\nfunction upgradeHydrationErrorsToRecoverable() {\n var queuedErrors = hydrationErrors;\n null !== queuedErrors &&\n (null === workInProgressRootRecoverableErrors\n ? (workInProgressRootRecoverableErrors = queuedErrors)\n : workInProgressRootRecoverableErrors.push.apply(\n workInProgressRootRecoverableErrors,\n queuedErrors\n ),\n (hydrationErrors = null));\n return queuedErrors;\n}\nfunction queueHydrationError(error) {\n null === hydrationErrors\n ? (hydrationErrors = [error])\n : hydrationErrors.push(error);\n}\nvar valueCursor = createCursor(null),\n currentlyRenderingFiber$1 = null,\n lastContextDependency = null;\nfunction pushProvider(providerFiber, context, nextValue) {\n push(valueCursor, context._currentValue);\n context._currentValue = nextValue;\n}\nfunction popProvider(context) {\n context._currentValue = valueCursor.current;\n pop(valueCursor);\n}\nfunction scheduleContextWorkOnParentPath(parent, renderLanes, propagationRoot) {\n for (; null !== parent; ) {\n var alternate = parent.alternate;\n (parent.childLanes & renderLanes) !== renderLanes\n ? ((parent.childLanes |= renderLanes),\n null !== alternate && (alternate.childLanes |= renderLanes))\n : null !== alternate &&\n (alternate.childLanes & renderLanes) !== renderLanes &&\n (alternate.childLanes |= renderLanes);\n if (parent === propagationRoot) break;\n parent = parent.return;\n }\n}\nfunction propagateContextChanges(\n workInProgress,\n contexts,\n renderLanes,\n forcePropagateEntireTree\n) {\n var fiber = workInProgress.child;\n null !== fiber && (fiber.return = workInProgress);\n for (; null !== fiber; ) {\n var list = fiber.dependencies;\n if (null !== list) {\n var nextFiber = fiber.child;\n list = list.firstContext;\n a: for (; null !== list; ) {\n var dependency = list;\n list = fiber;\n for (var i = 0; i < contexts.length; i++)\n if (dependency.context === contexts[i]) {\n list.lanes |= renderLanes;\n dependency = list.alternate;\n null !== dependency && (dependency.lanes |= renderLanes);\n scheduleContextWorkOnParentPath(\n list.return,\n renderLanes,\n workInProgress\n );\n forcePropagateEntireTree || (nextFiber = null);\n break a;\n }\n list = dependency.next;\n }\n } else if (18 === fiber.tag) {\n nextFiber = fiber.return;\n if (null === nextFiber) throw Error(formatProdErrorMessage(341));\n nextFiber.lanes |= renderLanes;\n list = nextFiber.alternate;\n null !== list && (list.lanes |= renderLanes);\n scheduleContextWorkOnParentPath(nextFiber, renderLanes, workInProgress);\n nextFiber = null;\n } else nextFiber = fiber.child;\n if (null !== nextFiber) nextFiber.return = fiber;\n else\n for (nextFiber = fiber; null !== nextFiber; ) {\n if (nextFiber === workInProgress) {\n nextFiber = null;\n break;\n }\n fiber = nextFiber.sibling;\n if (null !== fiber) {\n fiber.return = nextFiber.return;\n nextFiber = fiber;\n break;\n }\n nextFiber = nextFiber.return;\n }\n fiber = nextFiber;\n }\n}\nfunction propagateParentContextChanges(\n current,\n workInProgress,\n renderLanes,\n forcePropagateEntireTree\n) {\n current = null;\n for (\n var parent = workInProgress, isInsidePropagationBailout = !1;\n null !== parent;\n\n ) {\n if (!isInsidePropagationBailout)\n if (0 !== (parent.flags & 524288)) isInsidePropagationBailout = !0;\n else if (0 !== (parent.flags & 262144)) break;\n if (10 === parent.tag) {\n var currentParent = parent.alternate;\n if (null === currentParent) throw Error(formatProdErrorMessage(387));\n currentParent = currentParent.memoizedProps;\n if (null !== currentParent) {\n var context = parent.type;\n objectIs(parent.pendingProps.value, currentParent.value) ||\n (null !== current ? current.push(context) : (current = [context]));\n }\n } else if (parent === hostTransitionProviderCursor.current) {\n currentParent = parent.alternate;\n if (null === currentParent) throw Error(formatProdErrorMessage(387));\n currentParent.memoizedState.memoizedState !==\n parent.memoizedState.memoizedState &&\n (null !== current\n ? current.push(HostTransitionContext)\n : (current = [HostTransitionContext]));\n }\n parent = parent.return;\n }\n null !== current &&\n propagateContextChanges(\n workInProgress,\n current,\n renderLanes,\n forcePropagateEntireTree\n );\n workInProgress.flags |= 262144;\n}\nfunction checkIfContextChanged(currentDependencies) {\n for (\n currentDependencies = currentDependencies.firstContext;\n null !== currentDependencies;\n\n ) {\n if (\n !objectIs(\n currentDependencies.context._currentValue,\n currentDependencies.memoizedValue\n )\n )\n return !0;\n currentDependencies = currentDependencies.next;\n }\n return !1;\n}\nfunction prepareToReadContext(workInProgress) {\n currentlyRenderingFiber$1 = workInProgress;\n lastContextDependency = null;\n workInProgress = workInProgress.dependencies;\n null !== workInProgress && (workInProgress.firstContext = null);\n}\nfunction readContext(context) {\n return readContextForConsumer(currentlyRenderingFiber$1, context);\n}\nfunction readContextDuringReconciliation(consumer, context) {\n null === currentlyRenderingFiber$1 && prepareToReadContext(consumer);\n return readContextForConsumer(consumer, context);\n}\nfunction readContextForConsumer(consumer, context) {\n var value = context._currentValue;\n context = { context: context, memoizedValue: value, next: null };\n if (null === lastContextDependency) {\n if (null === consumer) throw Error(formatProdErrorMessage(308));\n lastContextDependency = context;\n consumer.dependencies = { lanes: 0, firstContext: context };\n consumer.flags |= 524288;\n } else lastContextDependency = lastContextDependency.next = context;\n return value;\n}\nvar AbortControllerLocal =\n \"undefined\" !== typeof AbortController\n ? AbortController\n : function () {\n var listeners = [],\n signal = (this.signal = {\n aborted: !1,\n addEventListener: function (type, listener) {\n listeners.push(listener);\n }\n });\n this.abort = function () {\n signal.aborted = !0;\n listeners.forEach(function (listener) {\n return listener();\n });\n };\n },\n scheduleCallback$2 = Scheduler.unstable_scheduleCallback,\n NormalPriority = Scheduler.unstable_NormalPriority,\n CacheContext = {\n $$typeof: REACT_CONTEXT_TYPE,\n Consumer: null,\n Provider: null,\n _currentValue: null,\n _currentValue2: null,\n _threadCount: 0\n };\nfunction createCache() {\n return {\n controller: new AbortControllerLocal(),\n data: new Map(),\n refCount: 0\n };\n}\nfunction releaseCache(cache) {\n cache.refCount--;\n 0 === cache.refCount &&\n scheduleCallback$2(NormalPriority, function () {\n cache.controller.abort();\n });\n}\nvar currentEntangledListeners = null,\n currentEntangledPendingCount = 0,\n currentEntangledLane = 0,\n currentEntangledActionThenable = null;\nfunction entangleAsyncAction(transition, thenable) {\n if (null === currentEntangledListeners) {\n var entangledListeners = (currentEntangledListeners = []);\n currentEntangledPendingCount = 0;\n currentEntangledLane = requestTransitionLane();\n currentEntangledActionThenable = {\n status: \"pending\",\n value: void 0,\n then: function (resolve) {\n entangledListeners.push(resolve);\n }\n };\n }\n currentEntangledPendingCount++;\n thenable.then(pingEngtangledActionScope, pingEngtangledActionScope);\n return thenable;\n}\nfunction pingEngtangledActionScope() {\n if (\n 0 === --currentEntangledPendingCount &&\n null !== currentEntangledListeners\n ) {\n null !== currentEntangledActionThenable &&\n (currentEntangledActionThenable.status = \"fulfilled\");\n var listeners = currentEntangledListeners;\n currentEntangledListeners = null;\n currentEntangledLane = 0;\n currentEntangledActionThenable = null;\n for (var i = 0; i < listeners.length; i++) (0, listeners[i])();\n }\n}\nfunction chainThenableValue(thenable, result) {\n var listeners = [],\n thenableWithOverride = {\n status: \"pending\",\n value: null,\n reason: null,\n then: function (resolve) {\n listeners.push(resolve);\n }\n };\n thenable.then(\n function () {\n thenableWithOverride.status = \"fulfilled\";\n thenableWithOverride.value = result;\n for (var i = 0; i < listeners.length; i++) (0, listeners[i])(result);\n },\n function (error) {\n thenableWithOverride.status = \"rejected\";\n thenableWithOverride.reason = error;\n for (error = 0; error < listeners.length; error++)\n (0, listeners[error])(void 0);\n }\n );\n return thenableWithOverride;\n}\nvar prevOnStartTransitionFinish = ReactSharedInternals.S;\nReactSharedInternals.S = function (transition, returnValue) {\n globalMostRecentTransitionTime = now();\n \"object\" === typeof returnValue &&\n null !== returnValue &&\n \"function\" === typeof returnValue.then &&\n entangleAsyncAction(transition, returnValue);\n null !== prevOnStartTransitionFinish &&\n prevOnStartTransitionFinish(transition, returnValue);\n};\nvar resumedCache = createCursor(null);\nfunction peekCacheFromPool() {\n var cacheResumedFromPreviousRender = resumedCache.current;\n return null !== cacheResumedFromPreviousRender\n ? cacheResumedFromPreviousRender\n : workInProgressRoot.pooledCache;\n}\nfunction pushTransition(offscreenWorkInProgress, prevCachePool) {\n null === prevCachePool\n ? push(resumedCache, resumedCache.current)\n : push(resumedCache, prevCachePool.pool);\n}\nfunction getSuspendedCache() {\n var cacheFromPool = peekCacheFromPool();\n return null === cacheFromPool\n ? null\n : { parent: CacheContext._currentValue, pool: cacheFromPool };\n}\nvar SuspenseException = Error(formatProdErrorMessage(460)),\n SuspenseyCommitException = Error(formatProdErrorMessage(474)),\n SuspenseActionException = Error(formatProdErrorMessage(542)),\n noopSuspenseyCommitThenable = { then: function () {} };\nfunction isThenableResolved(thenable) {\n thenable = thenable.status;\n return \"fulfilled\" === thenable || \"rejected\" === thenable;\n}\nfunction trackUsedThenable(thenableState, thenable, index) {\n index = thenableState[index];\n void 0 === index\n ? thenableState.push(thenable)\n : index !== thenable && (thenable.then(noop$1, noop$1), (thenable = index));\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw (\n ((thenableState = thenable.reason),\n checkIfUseWrappedInAsyncCatch(thenableState),\n thenableState)\n );\n default:\n if (\"string\" === typeof thenable.status) thenable.then(noop$1, noop$1);\n else {\n thenableState = workInProgressRoot;\n if (null !== thenableState && 100 < thenableState.shellSuspendCounter)\n throw Error(formatProdErrorMessage(482));\n thenableState = thenable;\n thenableState.status = \"pending\";\n thenableState.then(\n function (fulfilledValue) {\n if (\"pending\" === thenable.status) {\n var fulfilledThenable = thenable;\n fulfilledThenable.status = \"fulfilled\";\n fulfilledThenable.value = fulfilledValue;\n }\n },\n function (error) {\n if (\"pending\" === thenable.status) {\n var rejectedThenable = thenable;\n rejectedThenable.status = \"rejected\";\n rejectedThenable.reason = error;\n }\n }\n );\n }\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw (\n ((thenableState = thenable.reason),\n checkIfUseWrappedInAsyncCatch(thenableState),\n thenableState)\n );\n }\n suspendedThenable = thenable;\n throw SuspenseException;\n }\n}\nfunction resolveLazy(lazyType) {\n try {\n var init = lazyType._init;\n return init(lazyType._payload);\n } catch (x) {\n if (null !== x && \"object\" === typeof x && \"function\" === typeof x.then)\n throw ((suspendedThenable = x), SuspenseException);\n throw x;\n }\n}\nvar suspendedThenable = null;\nfunction getSuspendedThenable() {\n if (null === suspendedThenable) throw Error(formatProdErrorMessage(459));\n var thenable = suspendedThenable;\n suspendedThenable = null;\n return thenable;\n}\nfunction checkIfUseWrappedInAsyncCatch(rejectedReason) {\n if (\n rejectedReason === SuspenseException ||\n rejectedReason === SuspenseActionException\n )\n throw Error(formatProdErrorMessage(483));\n}\nvar thenableState$1 = null,\n thenableIndexCounter$1 = 0;\nfunction unwrapThenable(thenable) {\n var index = thenableIndexCounter$1;\n thenableIndexCounter$1 += 1;\n null === thenableState$1 && (thenableState$1 = []);\n return trackUsedThenable(thenableState$1, thenable, index);\n}\nfunction coerceRef(workInProgress, element) {\n element = element.props.ref;\n workInProgress.ref = void 0 !== element ? element : null;\n}\nfunction throwOnInvalidObjectTypeImpl(returnFiber, newChild) {\n if (newChild.$$typeof === REACT_LEGACY_ELEMENT_TYPE)\n throw Error(formatProdErrorMessage(525));\n returnFiber = Object.prototype.toString.call(newChild);\n throw Error(\n formatProdErrorMessage(\n 31,\n \"[object Object]\" === returnFiber\n ? \"object with keys {\" + Object.keys(newChild).join(\", \") + \"}\"\n : returnFiber\n )\n );\n}\nfunction createChildReconciler(shouldTrackSideEffects) {\n function deleteChild(returnFiber, childToDelete) {\n if (shouldTrackSideEffects) {\n var deletions = returnFiber.deletions;\n null === deletions\n ? ((returnFiber.deletions = [childToDelete]), (returnFiber.flags |= 16))\n : deletions.push(childToDelete);\n }\n }\n function deleteRemainingChildren(returnFiber, currentFirstChild) {\n if (!shouldTrackSideEffects) return null;\n for (; null !== currentFirstChild; )\n deleteChild(returnFiber, currentFirstChild),\n (currentFirstChild = currentFirstChild.sibling);\n return null;\n }\n function mapRemainingChildren(currentFirstChild) {\n for (var existingChildren = new Map(); null !== currentFirstChild; )\n null !== currentFirstChild.key\n ? existingChildren.set(currentFirstChild.key, currentFirstChild)\n : existingChildren.set(currentFirstChild.index, currentFirstChild),\n (currentFirstChild = currentFirstChild.sibling);\n return existingChildren;\n }\n function useFiber(fiber, pendingProps) {\n fiber = createWorkInProgress(fiber, pendingProps);\n fiber.index = 0;\n fiber.sibling = null;\n return fiber;\n }\n function placeChild(newFiber, lastPlacedIndex, newIndex) {\n newFiber.index = newIndex;\n if (!shouldTrackSideEffects)\n return (newFiber.flags |= 1048576), lastPlacedIndex;\n newIndex = newFiber.alternate;\n if (null !== newIndex)\n return (\n (newIndex = newIndex.index),\n newIndex < lastPlacedIndex\n ? ((newFiber.flags |= 67108866), lastPlacedIndex)\n : newIndex\n );\n newFiber.flags |= 67108866;\n return lastPlacedIndex;\n }\n function placeSingleChild(newFiber) {\n shouldTrackSideEffects &&\n null === newFiber.alternate &&\n (newFiber.flags |= 67108866);\n return newFiber;\n }\n function updateTextNode(returnFiber, current, textContent, lanes) {\n if (null === current || 6 !== current.tag)\n return (\n (current = createFiberFromText(textContent, returnFiber.mode, lanes)),\n (current.return = returnFiber),\n current\n );\n current = useFiber(current, textContent);\n current.return = returnFiber;\n return current;\n }\n function updateElement(returnFiber, current, element, lanes) {\n var elementType = element.type;\n if (elementType === REACT_FRAGMENT_TYPE)\n return updateFragment(\n returnFiber,\n current,\n element.props.children,\n lanes,\n element.key\n );\n if (\n null !== current &&\n (current.elementType === elementType ||\n (\"object\" === typeof elementType &&\n null !== elementType &&\n elementType.$$typeof === REACT_LAZY_TYPE &&\n resolveLazy(elementType) === current.type))\n )\n return (\n (current = useFiber(current, element.props)),\n coerceRef(current, element),\n (current.return = returnFiber),\n current\n );\n current = createFiberFromTypeAndProps(\n element.type,\n element.key,\n element.props,\n null,\n returnFiber.mode,\n lanes\n );\n coerceRef(current, element);\n current.return = returnFiber;\n return current;\n }\n function updatePortal(returnFiber, current, portal, lanes) {\n if (\n null === current ||\n 4 !== current.tag ||\n current.stateNode.containerInfo !== portal.containerInfo ||\n current.stateNode.implementation !== portal.implementation\n )\n return (\n (current = createFiberFromPortal(portal, returnFiber.mode, lanes)),\n (current.return = returnFiber),\n current\n );\n current = useFiber(current, portal.children || []);\n current.return = returnFiber;\n return current;\n }\n function updateFragment(returnFiber, current, fragment, lanes, key) {\n if (null === current || 7 !== current.tag)\n return (\n (current = createFiberFromFragment(\n fragment,\n returnFiber.mode,\n lanes,\n key\n )),\n (current.return = returnFiber),\n current\n );\n current = useFiber(current, fragment);\n current.return = returnFiber;\n return current;\n }\n function createChild(returnFiber, newChild, lanes) {\n if (\n (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n )\n return (\n (newChild = createFiberFromText(\n \"\" + newChild,\n returnFiber.mode,\n lanes\n )),\n (newChild.return = returnFiber),\n newChild\n );\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return (\n (lanes = createFiberFromTypeAndProps(\n newChild.type,\n newChild.key,\n newChild.props,\n null,\n returnFiber.mode,\n lanes\n )),\n coerceRef(lanes, newChild),\n (lanes.return = returnFiber),\n lanes\n );\n case REACT_PORTAL_TYPE:\n return (\n (newChild = createFiberFromPortal(\n newChild,\n returnFiber.mode,\n lanes\n )),\n (newChild.return = returnFiber),\n newChild\n );\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n createChild(returnFiber, newChild, lanes)\n );\n }\n if (isArrayImpl(newChild) || getIteratorFn(newChild))\n return (\n (newChild = createFiberFromFragment(\n newChild,\n returnFiber.mode,\n lanes,\n null\n )),\n (newChild.return = returnFiber),\n newChild\n );\n if (\"function\" === typeof newChild.then)\n return createChild(returnFiber, unwrapThenable(newChild), lanes);\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return createChild(\n returnFiber,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return null;\n }\n function updateSlot(returnFiber, oldFiber, newChild, lanes) {\n var key = null !== oldFiber ? oldFiber.key : null;\n if (\n (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n )\n return null !== key\n ? null\n : updateTextNode(returnFiber, oldFiber, \"\" + newChild, lanes);\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return newChild.key === key\n ? updateElement(returnFiber, oldFiber, newChild, lanes)\n : null;\n case REACT_PORTAL_TYPE:\n return newChild.key === key\n ? updatePortal(returnFiber, oldFiber, newChild, lanes)\n : null;\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n updateSlot(returnFiber, oldFiber, newChild, lanes)\n );\n }\n if (isArrayImpl(newChild) || getIteratorFn(newChild))\n return null !== key\n ? null\n : updateFragment(returnFiber, oldFiber, newChild, lanes, null);\n if (\"function\" === typeof newChild.then)\n return updateSlot(\n returnFiber,\n oldFiber,\n unwrapThenable(newChild),\n lanes\n );\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return updateSlot(\n returnFiber,\n oldFiber,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return null;\n }\n function updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n newChild,\n lanes\n ) {\n if (\n (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n )\n return (\n (existingChildren = existingChildren.get(newIdx) || null),\n updateTextNode(returnFiber, existingChildren, \"\" + newChild, lanes)\n );\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return (\n (existingChildren =\n existingChildren.get(\n null === newChild.key ? newIdx : newChild.key\n ) || null),\n updateElement(returnFiber, existingChildren, newChild, lanes)\n );\n case REACT_PORTAL_TYPE:\n return (\n (existingChildren =\n existingChildren.get(\n null === newChild.key ? newIdx : newChild.key\n ) || null),\n updatePortal(returnFiber, existingChildren, newChild, lanes)\n );\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n newChild,\n lanes\n )\n );\n }\n if (isArrayImpl(newChild) || getIteratorFn(newChild))\n return (\n (existingChildren = existingChildren.get(newIdx) || null),\n updateFragment(returnFiber, existingChildren, newChild, lanes, null)\n );\n if (\"function\" === typeof newChild.then)\n return updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n unwrapThenable(newChild),\n lanes\n );\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return null;\n }\n function reconcileChildrenArray(\n returnFiber,\n currentFirstChild,\n newChildren,\n lanes\n ) {\n for (\n var resultingFirstChild = null,\n previousNewFiber = null,\n oldFiber = currentFirstChild,\n newIdx = (currentFirstChild = 0),\n nextOldFiber = null;\n null !== oldFiber && newIdx < newChildren.length;\n newIdx++\n ) {\n oldFiber.index > newIdx\n ? ((nextOldFiber = oldFiber), (oldFiber = null))\n : (nextOldFiber = oldFiber.sibling);\n var newFiber = updateSlot(\n returnFiber,\n oldFiber,\n newChildren[newIdx],\n lanes\n );\n if (null === newFiber) {\n null === oldFiber && (oldFiber = nextOldFiber);\n break;\n }\n shouldTrackSideEffects &&\n oldFiber &&\n null === newFiber.alternate &&\n deleteChild(returnFiber, oldFiber);\n currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);\n null === previousNewFiber\n ? (resultingFirstChild = newFiber)\n : (previousNewFiber.sibling = newFiber);\n previousNewFiber = newFiber;\n oldFiber = nextOldFiber;\n }\n if (newIdx === newChildren.length)\n return (\n deleteRemainingChildren(returnFiber, oldFiber),\n isHydrating && pushTreeFork(returnFiber, newIdx),\n resultingFirstChild\n );\n if (null === oldFiber) {\n for (; newIdx < newChildren.length; newIdx++)\n (oldFiber = createChild(returnFiber, newChildren[newIdx], lanes)),\n null !== oldFiber &&\n ((currentFirstChild = placeChild(\n oldFiber,\n currentFirstChild,\n newIdx\n )),\n null === previousNewFiber\n ? (resultingFirstChild = oldFiber)\n : (previousNewFiber.sibling = oldFiber),\n (previousNewFiber = oldFiber));\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n for (\n oldFiber = mapRemainingChildren(oldFiber);\n newIdx < newChildren.length;\n newIdx++\n )\n (nextOldFiber = updateFromMap(\n oldFiber,\n returnFiber,\n newIdx,\n newChildren[newIdx],\n lanes\n )),\n null !== nextOldFiber &&\n (shouldTrackSideEffects &&\n null !== nextOldFiber.alternate &&\n oldFiber.delete(\n null === nextOldFiber.key ? newIdx : nextOldFiber.key\n ),\n (currentFirstChild = placeChild(\n nextOldFiber,\n currentFirstChild,\n newIdx\n )),\n null === previousNewFiber\n ? (resultingFirstChild = nextOldFiber)\n : (previousNewFiber.sibling = nextOldFiber),\n (previousNewFiber = nextOldFiber));\n shouldTrackSideEffects &&\n oldFiber.forEach(function (child) {\n return deleteChild(returnFiber, child);\n });\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n function reconcileChildrenIterator(\n returnFiber,\n currentFirstChild,\n newChildren,\n lanes\n ) {\n if (null == newChildren) throw Error(formatProdErrorMessage(151));\n for (\n var resultingFirstChild = null,\n previousNewFiber = null,\n oldFiber = currentFirstChild,\n newIdx = (currentFirstChild = 0),\n nextOldFiber = null,\n step = newChildren.next();\n null !== oldFiber && !step.done;\n newIdx++, step = newChildren.next()\n ) {\n oldFiber.index > newIdx\n ? ((nextOldFiber = oldFiber), (oldFiber = null))\n : (nextOldFiber = oldFiber.sibling);\n var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes);\n if (null === newFiber) {\n null === oldFiber && (oldFiber = nextOldFiber);\n break;\n }\n shouldTrackSideEffects &&\n oldFiber &&\n null === newFiber.alternate &&\n deleteChild(returnFiber, oldFiber);\n currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);\n null === previousNewFiber\n ? (resultingFirstChild = newFiber)\n : (previousNewFiber.sibling = newFiber);\n previousNewFiber = newFiber;\n oldFiber = nextOldFiber;\n }\n if (step.done)\n return (\n deleteRemainingChildren(returnFiber, oldFiber),\n isHydrating && pushTreeFork(returnFiber, newIdx),\n resultingFirstChild\n );\n if (null === oldFiber) {\n for (; !step.done; newIdx++, step = newChildren.next())\n (step = createChild(returnFiber, step.value, lanes)),\n null !== step &&\n ((currentFirstChild = placeChild(step, currentFirstChild, newIdx)),\n null === previousNewFiber\n ? (resultingFirstChild = step)\n : (previousNewFiber.sibling = step),\n (previousNewFiber = step));\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n for (\n oldFiber = mapRemainingChildren(oldFiber);\n !step.done;\n newIdx++, step = newChildren.next()\n )\n (step = updateFromMap(oldFiber, returnFiber, newIdx, step.value, lanes)),\n null !== step &&\n (shouldTrackSideEffects &&\n null !== step.alternate &&\n oldFiber.delete(null === step.key ? newIdx : step.key),\n (currentFirstChild = placeChild(step, currentFirstChild, newIdx)),\n null === previousNewFiber\n ? (resultingFirstChild = step)\n : (previousNewFiber.sibling = step),\n (previousNewFiber = step));\n shouldTrackSideEffects &&\n oldFiber.forEach(function (child) {\n return deleteChild(returnFiber, child);\n });\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n function reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n ) {\n \"object\" === typeof newChild &&\n null !== newChild &&\n newChild.type === REACT_FRAGMENT_TYPE &&\n null === newChild.key &&\n (newChild = newChild.props.children);\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n a: {\n for (var key = newChild.key; null !== currentFirstChild; ) {\n if (currentFirstChild.key === key) {\n key = newChild.type;\n if (key === REACT_FRAGMENT_TYPE) {\n if (7 === currentFirstChild.tag) {\n deleteRemainingChildren(\n returnFiber,\n currentFirstChild.sibling\n );\n lanes = useFiber(\n currentFirstChild,\n newChild.props.children\n );\n lanes.return = returnFiber;\n returnFiber = lanes;\n break a;\n }\n } else if (\n currentFirstChild.elementType === key ||\n (\"object\" === typeof key &&\n null !== key &&\n key.$$typeof === REACT_LAZY_TYPE &&\n resolveLazy(key) === currentFirstChild.type)\n ) {\n deleteRemainingChildren(\n returnFiber,\n currentFirstChild.sibling\n );\n lanes = useFiber(currentFirstChild, newChild.props);\n coerceRef(lanes, newChild);\n lanes.return = returnFiber;\n returnFiber = lanes;\n break a;\n }\n deleteRemainingChildren(returnFiber, currentFirstChild);\n break;\n } else deleteChild(returnFiber, currentFirstChild);\n currentFirstChild = currentFirstChild.sibling;\n }\n newChild.type === REACT_FRAGMENT_TYPE\n ? ((lanes = createFiberFromFragment(\n newChild.props.children,\n returnFiber.mode,\n lanes,\n newChild.key\n )),\n (lanes.return = returnFiber),\n (returnFiber = lanes))\n : ((lanes = createFiberFromTypeAndProps(\n newChild.type,\n newChild.key,\n newChild.props,\n null,\n returnFiber.mode,\n lanes\n )),\n coerceRef(lanes, newChild),\n (lanes.return = returnFiber),\n (returnFiber = lanes));\n }\n return placeSingleChild(returnFiber);\n case REACT_PORTAL_TYPE:\n a: {\n for (key = newChild.key; null !== currentFirstChild; ) {\n if (currentFirstChild.key === key)\n if (\n 4 === currentFirstChild.tag &&\n currentFirstChild.stateNode.containerInfo ===\n newChild.containerInfo &&\n currentFirstChild.stateNode.implementation ===\n newChild.implementation\n ) {\n deleteRemainingChildren(\n returnFiber,\n currentFirstChild.sibling\n );\n lanes = useFiber(currentFirstChild, newChild.children || []);\n lanes.return = returnFiber;\n returnFiber = lanes;\n break a;\n } else {\n deleteRemainingChildren(returnFiber, currentFirstChild);\n break;\n }\n else deleteChild(returnFiber, currentFirstChild);\n currentFirstChild = currentFirstChild.sibling;\n }\n lanes = createFiberFromPortal(newChild, returnFiber.mode, lanes);\n lanes.return = returnFiber;\n returnFiber = lanes;\n }\n return placeSingleChild(returnFiber);\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n )\n );\n }\n if (isArrayImpl(newChild))\n return reconcileChildrenArray(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n );\n if (getIteratorFn(newChild)) {\n key = getIteratorFn(newChild);\n if (\"function\" !== typeof key) throw Error(formatProdErrorMessage(150));\n newChild = key.call(newChild);\n return reconcileChildrenIterator(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n );\n }\n if (\"function\" === typeof newChild.then)\n return reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n unwrapThenable(newChild),\n lanes\n );\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n ? ((newChild = \"\" + newChild),\n null !== currentFirstChild && 6 === currentFirstChild.tag\n ? (deleteRemainingChildren(returnFiber, currentFirstChild.sibling),\n (lanes = useFiber(currentFirstChild, newChild)),\n (lanes.return = returnFiber),\n (returnFiber = lanes))\n : (deleteRemainingChildren(returnFiber, currentFirstChild),\n (lanes = createFiberFromText(newChild, returnFiber.mode, lanes)),\n (lanes.return = returnFiber),\n (returnFiber = lanes)),\n placeSingleChild(returnFiber))\n : deleteRemainingChildren(returnFiber, currentFirstChild);\n }\n return function (returnFiber, currentFirstChild, newChild, lanes) {\n try {\n thenableIndexCounter$1 = 0;\n var firstChildFiber = reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n );\n thenableState$1 = null;\n return firstChildFiber;\n } catch (x) {\n if (x === SuspenseException || x === SuspenseActionException) throw x;\n var fiber = createFiberImplClass(29, x, null, returnFiber.mode);\n fiber.lanes = lanes;\n fiber.return = returnFiber;\n return fiber;\n } finally {\n }\n };\n}\nvar reconcileChildFibers = createChildReconciler(!0),\n mountChildFibers = createChildReconciler(!1),\n hasForceUpdate = !1;\nfunction initializeUpdateQueue(fiber) {\n fiber.updateQueue = {\n baseState: fiber.memoizedState,\n firstBaseUpdate: null,\n lastBaseUpdate: null,\n shared: { pending: null, lanes: 0, hiddenCallbacks: null },\n callbacks: null\n };\n}\nfunction cloneUpdateQueue(current, workInProgress) {\n current = current.updateQueue;\n workInProgress.updateQueue === current &&\n (workInProgress.updateQueue = {\n baseState: current.baseState,\n firstBaseUpdate: current.firstBaseUpdate,\n lastBaseUpdate: current.lastBaseUpdate,\n shared: current.shared,\n callbacks: null\n });\n}\nfunction createUpdate(lane) {\n return { lane: lane, tag: 0, payload: null, callback: null, next: null };\n}\nfunction enqueueUpdate(fiber, update, lane) {\n var updateQueue = fiber.updateQueue;\n if (null === updateQueue) return null;\n updateQueue = updateQueue.shared;\n if (0 !== (executionContext & 2)) {\n var pending = updateQueue.pending;\n null === pending\n ? (update.next = update)\n : ((update.next = pending.next), (pending.next = update));\n updateQueue.pending = update;\n update = getRootForUpdatedFiber(fiber);\n markUpdateLaneFromFiberToRoot(fiber, null, lane);\n return update;\n }\n enqueueUpdate$1(fiber, updateQueue, update, lane);\n return getRootForUpdatedFiber(fiber);\n}\nfunction entangleTransitions(root, fiber, lane) {\n fiber = fiber.updateQueue;\n if (null !== fiber && ((fiber = fiber.shared), 0 !== (lane & 4194048))) {\n var queueLanes = fiber.lanes;\n queueLanes &= root.pendingLanes;\n lane |= queueLanes;\n fiber.lanes = lane;\n markRootEntangled(root, lane);\n }\n}\nfunction enqueueCapturedUpdate(workInProgress, capturedUpdate) {\n var queue = workInProgress.updateQueue,\n current = workInProgress.alternate;\n if (\n null !== current &&\n ((current = current.updateQueue), queue === current)\n ) {\n var newFirst = null,\n newLast = null;\n queue = queue.firstBaseUpdate;\n if (null !== queue) {\n do {\n var clone = {\n lane: queue.lane,\n tag: queue.tag,\n payload: queue.payload,\n callback: null,\n next: null\n };\n null === newLast\n ? (newFirst = newLast = clone)\n : (newLast = newLast.next = clone);\n queue = queue.next;\n } while (null !== queue);\n null === newLast\n ? (newFirst = newLast = capturedUpdate)\n : (newLast = newLast.next = capturedUpdate);\n } else newFirst = newLast = capturedUpdate;\n queue = {\n baseState: current.baseState,\n firstBaseUpdate: newFirst,\n lastBaseUpdate: newLast,\n shared: current.shared,\n callbacks: current.callbacks\n };\n workInProgress.updateQueue = queue;\n return;\n }\n workInProgress = queue.lastBaseUpdate;\n null === workInProgress\n ? (queue.firstBaseUpdate = capturedUpdate)\n : (workInProgress.next = capturedUpdate);\n queue.lastBaseUpdate = capturedUpdate;\n}\nvar didReadFromEntangledAsyncAction = !1;\nfunction suspendIfUpdateReadFromEntangledAsyncAction() {\n if (didReadFromEntangledAsyncAction) {\n var entangledActionThenable = currentEntangledActionThenable;\n if (null !== entangledActionThenable) throw entangledActionThenable;\n }\n}\nfunction processUpdateQueue(\n workInProgress$jscomp$0,\n props,\n instance$jscomp$0,\n renderLanes\n) {\n didReadFromEntangledAsyncAction = !1;\n var queue = workInProgress$jscomp$0.updateQueue;\n hasForceUpdate = !1;\n var firstBaseUpdate = queue.firstBaseUpdate,\n lastBaseUpdate = queue.lastBaseUpdate,\n pendingQueue = queue.shared.pending;\n if (null !== pendingQueue) {\n queue.shared.pending = null;\n var lastPendingUpdate = pendingQueue,\n firstPendingUpdate = lastPendingUpdate.next;\n lastPendingUpdate.next = null;\n null === lastBaseUpdate\n ? (firstBaseUpdate = firstPendingUpdate)\n : (lastBaseUpdate.next = firstPendingUpdate);\n lastBaseUpdate = lastPendingUpdate;\n var current = workInProgress$jscomp$0.alternate;\n null !== current &&\n ((current = current.updateQueue),\n (pendingQueue = current.lastBaseUpdate),\n pendingQueue !== lastBaseUpdate &&\n (null === pendingQueue\n ? (current.firstBaseUpdate = firstPendingUpdate)\n : (pendingQueue.next = firstPendingUpdate),\n (current.lastBaseUpdate = lastPendingUpdate)));\n }\n if (null !== firstBaseUpdate) {\n var newState = queue.baseState;\n lastBaseUpdate = 0;\n current = firstPendingUpdate = lastPendingUpdate = null;\n pendingQueue = firstBaseUpdate;\n do {\n var updateLane = pendingQueue.lane & -536870913,\n isHiddenUpdate = updateLane !== pendingQueue.lane;\n if (\n isHiddenUpdate\n ? (workInProgressRootRenderLanes & updateLane) === updateLane\n : (renderLanes & updateLane) === updateLane\n ) {\n 0 !== updateLane &&\n updateLane === currentEntangledLane &&\n (didReadFromEntangledAsyncAction = !0);\n null !== current &&\n (current = current.next =\n {\n lane: 0,\n tag: pendingQueue.tag,\n payload: pendingQueue.payload,\n callback: null,\n next: null\n });\n a: {\n var workInProgress = workInProgress$jscomp$0,\n update = pendingQueue;\n updateLane = props;\n var instance = instance$jscomp$0;\n switch (update.tag) {\n case 1:\n workInProgress = update.payload;\n if (\"function\" === typeof workInProgress) {\n newState = workInProgress.call(instance, newState, updateLane);\n break a;\n }\n newState = workInProgress;\n break a;\n case 3:\n workInProgress.flags = (workInProgress.flags & -65537) | 128;\n case 0:\n workInProgress = update.payload;\n updateLane =\n \"function\" === typeof workInProgress\n ? workInProgress.call(instance, newState, updateLane)\n : workInProgress;\n if (null === updateLane || void 0 === updateLane) break a;\n newState = assign({}, newState, updateLane);\n break a;\n case 2:\n hasForceUpdate = !0;\n }\n }\n updateLane = pendingQueue.callback;\n null !== updateLane &&\n ((workInProgress$jscomp$0.flags |= 64),\n isHiddenUpdate && (workInProgress$jscomp$0.flags |= 8192),\n (isHiddenUpdate = queue.callbacks),\n null === isHiddenUpdate\n ? (queue.callbacks = [updateLane])\n : isHiddenUpdate.push(updateLane));\n } else\n (isHiddenUpdate = {\n lane: updateLane,\n tag: pendingQueue.tag,\n payload: pendingQueue.payload,\n callback: pendingQueue.callback,\n next: null\n }),\n null === current\n ? ((firstPendingUpdate = current = isHiddenUpdate),\n (lastPendingUpdate = newState))\n : (current = current.next = isHiddenUpdate),\n (lastBaseUpdate |= updateLane);\n pendingQueue = pendingQueue.next;\n if (null === pendingQueue)\n if (((pendingQueue = queue.shared.pending), null === pendingQueue))\n break;\n else\n (isHiddenUpdate = pendingQueue),\n (pendingQueue = isHiddenUpdate.next),\n (isHiddenUpdate.next = null),\n (queue.lastBaseUpdate = isHiddenUpdate),\n (queue.shared.pending = null);\n } while (1);\n null === current && (lastPendingUpdate = newState);\n queue.baseState = lastPendingUpdate;\n queue.firstBaseUpdate = firstPendingUpdate;\n queue.lastBaseUpdate = current;\n null === firstBaseUpdate && (queue.shared.lanes = 0);\n workInProgressRootSkippedLanes |= lastBaseUpdate;\n workInProgress$jscomp$0.lanes = lastBaseUpdate;\n workInProgress$jscomp$0.memoizedState = newState;\n }\n}\nfunction callCallback(callback, context) {\n if (\"function\" !== typeof callback)\n throw Error(formatProdErrorMessage(191, callback));\n callback.call(context);\n}\nfunction commitCallbacks(updateQueue, context) {\n var callbacks = updateQueue.callbacks;\n if (null !== callbacks)\n for (\n updateQueue.callbacks = null, updateQueue = 0;\n updateQueue < callbacks.length;\n updateQueue++\n )\n callCallback(callbacks[updateQueue], context);\n}\nvar currentTreeHiddenStackCursor = createCursor(null),\n prevEntangledRenderLanesCursor = createCursor(0);\nfunction pushHiddenContext(fiber, context) {\n fiber = entangledRenderLanes;\n push(prevEntangledRenderLanesCursor, fiber);\n push(currentTreeHiddenStackCursor, context);\n entangledRenderLanes = fiber | context.baseLanes;\n}\nfunction reuseHiddenContextOnStack() {\n push(prevEntangledRenderLanesCursor, entangledRenderLanes);\n push(currentTreeHiddenStackCursor, currentTreeHiddenStackCursor.current);\n}\nfunction popHiddenContext() {\n entangledRenderLanes = prevEntangledRenderLanesCursor.current;\n pop(currentTreeHiddenStackCursor);\n pop(prevEntangledRenderLanesCursor);\n}\nvar suspenseHandlerStackCursor = createCursor(null),\n shellBoundary = null;\nfunction pushPrimaryTreeSuspenseHandler(handler) {\n var current = handler.alternate;\n push(suspenseStackCursor, suspenseStackCursor.current & 1);\n push(suspenseHandlerStackCursor, handler);\n null === shellBoundary &&\n (null === current || null !== currentTreeHiddenStackCursor.current\n ? (shellBoundary = handler)\n : null !== current.memoizedState && (shellBoundary = handler));\n}\nfunction pushDehydratedActivitySuspenseHandler(fiber) {\n push(suspenseStackCursor, suspenseStackCursor.current);\n push(suspenseHandlerStackCursor, fiber);\n null === shellBoundary && (shellBoundary = fiber);\n}\nfunction pushOffscreenSuspenseHandler(fiber) {\n 22 === fiber.tag\n ? (push(suspenseStackCursor, suspenseStackCursor.current),\n push(suspenseHandlerStackCursor, fiber),\n null === shellBoundary && (shellBoundary = fiber))\n : reuseSuspenseHandlerOnStack(fiber);\n}\nfunction reuseSuspenseHandlerOnStack() {\n push(suspenseStackCursor, suspenseStackCursor.current);\n push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current);\n}\nfunction popSuspenseHandler(fiber) {\n pop(suspenseHandlerStackCursor);\n shellBoundary === fiber && (shellBoundary = null);\n pop(suspenseStackCursor);\n}\nvar suspenseStackCursor = createCursor(0);\nfunction findFirstSuspended(row) {\n for (var node = row; null !== node; ) {\n if (13 === node.tag) {\n var state = node.memoizedState;\n if (\n null !== state &&\n ((state = state.dehydrated),\n null === state ||\n isSuspenseInstancePending(state) ||\n isSuspenseInstanceFallback(state))\n )\n return node;\n } else if (\n 19 === node.tag &&\n (\"forwards\" === node.memoizedProps.revealOrder ||\n \"backwards\" === node.memoizedProps.revealOrder ||\n \"unstable_legacy-backwards\" === node.memoizedProps.revealOrder ||\n \"together\" === node.memoizedProps.revealOrder)\n ) {\n if (0 !== (node.flags & 128)) return node;\n } else if (null !== node.child) {\n node.child.return = node;\n node = node.child;\n continue;\n }\n if (node === row) break;\n for (; null === node.sibling; ) {\n if (null === node.return || node.return === row) return null;\n node = node.return;\n }\n node.sibling.return = node.return;\n node = node.sibling;\n }\n return null;\n}\nvar renderLanes = 0,\n currentlyRenderingFiber = null,\n currentHook = null,\n workInProgressHook = null,\n didScheduleRenderPhaseUpdate = !1,\n didScheduleRenderPhaseUpdateDuringThisPass = !1,\n shouldDoubleInvokeUserFnsInHooksDEV = !1,\n localIdCounter = 0,\n thenableIndexCounter = 0,\n thenableState = null,\n globalClientIdCounter = 0;\nfunction throwInvalidHookError() {\n throw Error(formatProdErrorMessage(321));\n}\nfunction areHookInputsEqual(nextDeps, prevDeps) {\n if (null === prevDeps) return !1;\n for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++)\n if (!objectIs(nextDeps[i], prevDeps[i])) return !1;\n return !0;\n}\nfunction renderWithHooks(\n current,\n workInProgress,\n Component,\n props,\n secondArg,\n nextRenderLanes\n) {\n renderLanes = nextRenderLanes;\n currentlyRenderingFiber = workInProgress;\n workInProgress.memoizedState = null;\n workInProgress.updateQueue = null;\n workInProgress.lanes = 0;\n ReactSharedInternals.H =\n null === current || null === current.memoizedState\n ? HooksDispatcherOnMount\n : HooksDispatcherOnUpdate;\n shouldDoubleInvokeUserFnsInHooksDEV = !1;\n nextRenderLanes = Component(props, secondArg);\n shouldDoubleInvokeUserFnsInHooksDEV = !1;\n didScheduleRenderPhaseUpdateDuringThisPass &&\n (nextRenderLanes = renderWithHooksAgain(\n workInProgress,\n Component,\n props,\n secondArg\n ));\n finishRenderingHooks(current);\n return nextRenderLanes;\n}\nfunction finishRenderingHooks(current) {\n ReactSharedInternals.H = ContextOnlyDispatcher;\n var didRenderTooFewHooks = null !== currentHook && null !== currentHook.next;\n renderLanes = 0;\n workInProgressHook = currentHook = currentlyRenderingFiber = null;\n didScheduleRenderPhaseUpdate = !1;\n thenableIndexCounter = 0;\n thenableState = null;\n if (didRenderTooFewHooks) throw Error(formatProdErrorMessage(300));\n null === current ||\n didReceiveUpdate ||\n ((current = current.dependencies),\n null !== current &&\n checkIfContextChanged(current) &&\n (didReceiveUpdate = !0));\n}\nfunction renderWithHooksAgain(workInProgress, Component, props, secondArg) {\n currentlyRenderingFiber = workInProgress;\n var numberOfReRenders = 0;\n do {\n didScheduleRenderPhaseUpdateDuringThisPass && (thenableState = null);\n thenableIndexCounter = 0;\n didScheduleRenderPhaseUpdateDuringThisPass = !1;\n if (25 <= numberOfReRenders) throw Error(formatProdErrorMessage(301));\n numberOfReRenders += 1;\n workInProgressHook = currentHook = null;\n if (null != workInProgress.updateQueue) {\n var children = workInProgress.updateQueue;\n children.lastEffect = null;\n children.events = null;\n children.stores = null;\n null != children.memoCache && (children.memoCache.index = 0);\n }\n ReactSharedInternals.H = HooksDispatcherOnRerender;\n children = Component(props, secondArg);\n } while (didScheduleRenderPhaseUpdateDuringThisPass);\n return children;\n}\nfunction TransitionAwareHostComponent() {\n var dispatcher = ReactSharedInternals.H,\n maybeThenable = dispatcher.useState()[0];\n maybeThenable =\n \"function\" === typeof maybeThenable.then\n ? useThenable(maybeThenable)\n : maybeThenable;\n dispatcher = dispatcher.useState()[0];\n (null !== currentHook ? currentHook.memoizedState : null) !== dispatcher &&\n (currentlyRenderingFiber.flags |= 1024);\n return maybeThenable;\n}\nfunction checkDidRenderIdHook() {\n var didRenderIdHook = 0 !== localIdCounter;\n localIdCounter = 0;\n return didRenderIdHook;\n}\nfunction bailoutHooks(current, workInProgress, lanes) {\n workInProgress.updateQueue = current.updateQueue;\n workInProgress.flags &= -2053;\n current.lanes &= ~lanes;\n}\nfunction resetHooksOnUnwind(workInProgress) {\n if (didScheduleRenderPhaseUpdate) {\n for (\n workInProgress = workInProgress.memoizedState;\n null !== workInProgress;\n\n ) {\n var queue = workInProgress.queue;\n null !== queue && (queue.pending = null);\n workInProgress = workInProgress.next;\n }\n didScheduleRenderPhaseUpdate = !1;\n }\n renderLanes = 0;\n workInProgressHook = currentHook = currentlyRenderingFiber = null;\n didScheduleRenderPhaseUpdateDuringThisPass = !1;\n thenableIndexCounter = localIdCounter = 0;\n thenableState = null;\n}\nfunction mountWorkInProgressHook() {\n var hook = {\n memoizedState: null,\n baseState: null,\n baseQueue: null,\n queue: null,\n next: null\n };\n null === workInProgressHook\n ? (currentlyRenderingFiber.memoizedState = workInProgressHook = hook)\n : (workInProgressHook = workInProgressHook.next = hook);\n return workInProgressHook;\n}\nfunction updateWorkInProgressHook() {\n if (null === currentHook) {\n var nextCurrentHook = currentlyRenderingFiber.alternate;\n nextCurrentHook =\n null !== nextCurrentHook ? nextCurrentHook.memoizedState : null;\n } else nextCurrentHook = currentHook.next;\n var nextWorkInProgressHook =\n null === workInProgressHook\n ? currentlyRenderingFiber.memoizedState\n : workInProgressHook.next;\n if (null !== nextWorkInProgressHook)\n (workInProgressHook = nextWorkInProgressHook),\n (currentHook = nextCurrentHook);\n else {\n if (null === nextCurrentHook) {\n if (null === currentlyRenderingFiber.alternate)\n throw Error(formatProdErrorMessage(467));\n throw Error(formatProdErrorMessage(310));\n }\n currentHook = nextCurrentHook;\n nextCurrentHook = {\n memoizedState: currentHook.memoizedState,\n baseState: currentHook.baseState,\n baseQueue: currentHook.baseQueue,\n queue: currentHook.queue,\n next: null\n };\n null === workInProgressHook\n ? (currentlyRenderingFiber.memoizedState = workInProgressHook =\n nextCurrentHook)\n : (workInProgressHook = workInProgressHook.next = nextCurrentHook);\n }\n return workInProgressHook;\n}\nfunction createFunctionComponentUpdateQueue() {\n return { lastEffect: null, events: null, stores: null, memoCache: null };\n}\nfunction useThenable(thenable) {\n var index = thenableIndexCounter;\n thenableIndexCounter += 1;\n null === thenableState && (thenableState = []);\n thenable = trackUsedThenable(thenableState, thenable, index);\n index = currentlyRenderingFiber;\n null ===\n (null === workInProgressHook\n ? index.memoizedState\n : workInProgressHook.next) &&\n ((index = index.alternate),\n (ReactSharedInternals.H =\n null === index || null === index.memoizedState\n ? HooksDispatcherOnMount\n : HooksDispatcherOnUpdate));\n return thenable;\n}\nfunction use(usable) {\n if (null !== usable && \"object\" === typeof usable) {\n if (\"function\" === typeof usable.then) return useThenable(usable);\n if (usable.$$typeof === REACT_CONTEXT_TYPE) return readContext(usable);\n }\n throw Error(formatProdErrorMessage(438, String(usable)));\n}\nfunction useMemoCache(size) {\n var memoCache = null,\n updateQueue = currentlyRenderingFiber.updateQueue;\n null !== updateQueue && (memoCache = updateQueue.memoCache);\n if (null == memoCache) {\n var current = currentlyRenderingFiber.alternate;\n null !== current &&\n ((current = current.updateQueue),\n null !== current &&\n ((current = current.memoCache),\n null != current &&\n (memoCache = {\n data: current.data.map(function (array) {\n return array.slice();\n }),\n index: 0\n })));\n }\n null == memoCache && (memoCache = { data: [], index: 0 });\n null === updateQueue &&\n ((updateQueue = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = updateQueue));\n updateQueue.memoCache = memoCache;\n updateQueue = memoCache.data[memoCache.index];\n if (void 0 === updateQueue)\n for (\n updateQueue = memoCache.data[memoCache.index] = Array(size), current = 0;\n current < size;\n current++\n )\n updateQueue[current] = REACT_MEMO_CACHE_SENTINEL;\n memoCache.index++;\n return updateQueue;\n}\nfunction basicStateReducer(state, action) {\n return \"function\" === typeof action ? action(state) : action;\n}\nfunction updateReducer(reducer) {\n var hook = updateWorkInProgressHook();\n return updateReducerImpl(hook, currentHook, reducer);\n}\nfunction updateReducerImpl(hook, current, reducer) {\n var queue = hook.queue;\n if (null === queue) throw Error(formatProdErrorMessage(311));\n queue.lastRenderedReducer = reducer;\n var baseQueue = hook.baseQueue,\n pendingQueue = queue.pending;\n if (null !== pendingQueue) {\n if (null !== baseQueue) {\n var baseFirst = baseQueue.next;\n baseQueue.next = pendingQueue.next;\n pendingQueue.next = baseFirst;\n }\n current.baseQueue = baseQueue = pendingQueue;\n queue.pending = null;\n }\n pendingQueue = hook.baseState;\n if (null === baseQueue) hook.memoizedState = pendingQueue;\n else {\n current = baseQueue.next;\n var newBaseQueueFirst = (baseFirst = null),\n newBaseQueueLast = null,\n update = current,\n didReadFromEntangledAsyncAction$60 = !1;\n do {\n var updateLane = update.lane & -536870913;\n if (\n updateLane !== update.lane\n ? (workInProgressRootRenderLanes & updateLane) === updateLane\n : (renderLanes & updateLane) === updateLane\n ) {\n var revertLane = update.revertLane;\n if (0 === revertLane)\n null !== newBaseQueueLast &&\n (newBaseQueueLast = newBaseQueueLast.next =\n {\n lane: 0,\n revertLane: 0,\n gesture: null,\n action: update.action,\n hasEagerState: update.hasEagerState,\n eagerState: update.eagerState,\n next: null\n }),\n updateLane === currentEntangledLane &&\n (didReadFromEntangledAsyncAction$60 = !0);\n else if ((renderLanes & revertLane) === revertLane) {\n update = update.next;\n revertLane === currentEntangledLane &&\n (didReadFromEntangledAsyncAction$60 = !0);\n continue;\n } else\n (updateLane = {\n lane: 0,\n revertLane: update.revertLane,\n gesture: null,\n action: update.action,\n hasEagerState: update.hasEagerState,\n eagerState: update.eagerState,\n next: null\n }),\n null === newBaseQueueLast\n ? ((newBaseQueueFirst = newBaseQueueLast = updateLane),\n (baseFirst = pendingQueue))\n : (newBaseQueueLast = newBaseQueueLast.next = updateLane),\n (currentlyRenderingFiber.lanes |= revertLane),\n (workInProgressRootSkippedLanes |= revertLane);\n updateLane = update.action;\n shouldDoubleInvokeUserFnsInHooksDEV &&\n reducer(pendingQueue, updateLane);\n pendingQueue = update.hasEagerState\n ? update.eagerState\n : reducer(pendingQueue, updateLane);\n } else\n (revertLane = {\n lane: updateLane,\n revertLane: update.revertLane,\n gesture: update.gesture,\n action: update.action,\n hasEagerState: update.hasEagerState,\n eagerState: update.eagerState,\n next: null\n }),\n null === newBaseQueueLast\n ? ((newBaseQueueFirst = newBaseQueueLast = revertLane),\n (baseFirst = pendingQueue))\n : (newBaseQueueLast = newBaseQueueLast.next = revertLane),\n (currentlyRenderingFiber.lanes |= updateLane),\n (workInProgressRootSkippedLanes |= updateLane);\n update = update.next;\n } while (null !== update && update !== current);\n null === newBaseQueueLast\n ? (baseFirst = pendingQueue)\n : (newBaseQueueLast.next = newBaseQueueFirst);\n if (\n !objectIs(pendingQueue, hook.memoizedState) &&\n ((didReceiveUpdate = !0),\n didReadFromEntangledAsyncAction$60 &&\n ((reducer = currentEntangledActionThenable), null !== reducer))\n )\n throw reducer;\n hook.memoizedState = pendingQueue;\n hook.baseState = baseFirst;\n hook.baseQueue = newBaseQueueLast;\n queue.lastRenderedState = pendingQueue;\n }\n null === baseQueue && (queue.lanes = 0);\n return [hook.memoizedState, queue.dispatch];\n}\nfunction rerenderReducer(reducer) {\n var hook = updateWorkInProgressHook(),\n queue = hook.queue;\n if (null === queue) throw Error(formatProdErrorMessage(311));\n queue.lastRenderedReducer = reducer;\n var dispatch = queue.dispatch,\n lastRenderPhaseUpdate = queue.pending,\n newState = hook.memoizedState;\n if (null !== lastRenderPhaseUpdate) {\n queue.pending = null;\n var update = (lastRenderPhaseUpdate = lastRenderPhaseUpdate.next);\n do (newState = reducer(newState, update.action)), (update = update.next);\n while (update !== lastRenderPhaseUpdate);\n objectIs(newState, hook.memoizedState) || (didReceiveUpdate = !0);\n hook.memoizedState = newState;\n null === hook.baseQueue && (hook.baseState = newState);\n queue.lastRenderedState = newState;\n }\n return [newState, dispatch];\n}\nfunction updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {\n var fiber = currentlyRenderingFiber,\n hook = updateWorkInProgressHook(),\n isHydrating$jscomp$0 = isHydrating;\n if (isHydrating$jscomp$0) {\n if (void 0 === getServerSnapshot) throw Error(formatProdErrorMessage(407));\n getServerSnapshot = getServerSnapshot();\n } else getServerSnapshot = getSnapshot();\n var snapshotChanged = !objectIs(\n (currentHook || hook).memoizedState,\n getServerSnapshot\n );\n snapshotChanged &&\n ((hook.memoizedState = getServerSnapshot), (didReceiveUpdate = !0));\n hook = hook.queue;\n updateEffect(subscribeToStore.bind(null, fiber, hook, subscribe), [\n subscribe\n ]);\n if (\n hook.getSnapshot !== getSnapshot ||\n snapshotChanged ||\n (null !== workInProgressHook && workInProgressHook.memoizedState.tag & 1)\n ) {\n fiber.flags |= 2048;\n pushSimpleEffect(\n 9,\n { destroy: void 0 },\n updateStoreInstance.bind(\n null,\n fiber,\n hook,\n getServerSnapshot,\n getSnapshot\n ),\n null\n );\n if (null === workInProgressRoot) throw Error(formatProdErrorMessage(349));\n isHydrating$jscomp$0 ||\n 0 !== (renderLanes & 127) ||\n pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);\n }\n return getServerSnapshot;\n}\nfunction pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) {\n fiber.flags |= 16384;\n fiber = { getSnapshot: getSnapshot, value: renderedSnapshot };\n getSnapshot = currentlyRenderingFiber.updateQueue;\n null === getSnapshot\n ? ((getSnapshot = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = getSnapshot),\n (getSnapshot.stores = [fiber]))\n : ((renderedSnapshot = getSnapshot.stores),\n null === renderedSnapshot\n ? (getSnapshot.stores = [fiber])\n : renderedSnapshot.push(fiber));\n}\nfunction updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) {\n inst.value = nextSnapshot;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);\n}\nfunction subscribeToStore(fiber, inst, subscribe) {\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);\n });\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction forceStoreRerender(fiber) {\n var root = enqueueConcurrentRenderForLane(fiber, 2);\n null !== root && scheduleUpdateOnFiber(root, fiber, 2);\n}\nfunction mountStateImpl(initialState) {\n var hook = mountWorkInProgressHook();\n if (\"function\" === typeof initialState) {\n var initialStateInitializer = initialState;\n initialState = initialStateInitializer();\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n initialStateInitializer();\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n }\n hook.memoizedState = hook.baseState = initialState;\n hook.queue = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: basicStateReducer,\n lastRenderedState: initialState\n };\n return hook;\n}\nfunction updateOptimisticImpl(hook, current, passthrough, reducer) {\n hook.baseState = passthrough;\n return updateReducerImpl(\n hook,\n currentHook,\n \"function\" === typeof reducer ? reducer : basicStateReducer\n );\n}\nfunction dispatchActionState(\n fiber,\n actionQueue,\n setPendingState,\n setState,\n payload\n) {\n if (isRenderPhaseUpdate(fiber)) throw Error(formatProdErrorMessage(485));\n fiber = actionQueue.action;\n if (null !== fiber) {\n var actionNode = {\n payload: payload,\n action: fiber,\n next: null,\n isTransition: !0,\n status: \"pending\",\n value: null,\n reason: null,\n listeners: [],\n then: function (listener) {\n actionNode.listeners.push(listener);\n }\n };\n null !== ReactSharedInternals.T\n ? setPendingState(!0)\n : (actionNode.isTransition = !1);\n setState(actionNode);\n setPendingState = actionQueue.pending;\n null === setPendingState\n ? ((actionNode.next = actionQueue.pending = actionNode),\n runActionStateAction(actionQueue, actionNode))\n : ((actionNode.next = setPendingState.next),\n (actionQueue.pending = setPendingState.next = actionNode));\n }\n}\nfunction runActionStateAction(actionQueue, node) {\n var action = node.action,\n payload = node.payload,\n prevState = actionQueue.state;\n if (node.isTransition) {\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n try {\n var returnValue = action(prevState, payload),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n handleActionReturnValue(actionQueue, node, returnValue);\n } catch (error) {\n onActionError(actionQueue, node, error);\n } finally {\n null !== prevTransition &&\n null !== currentTransition.types &&\n (prevTransition.types = currentTransition.types),\n (ReactSharedInternals.T = prevTransition);\n }\n } else\n try {\n (prevTransition = action(prevState, payload)),\n handleActionReturnValue(actionQueue, node, prevTransition);\n } catch (error$66) {\n onActionError(actionQueue, node, error$66);\n }\n}\nfunction handleActionReturnValue(actionQueue, node, returnValue) {\n null !== returnValue &&\n \"object\" === typeof returnValue &&\n \"function\" === typeof returnValue.then\n ? returnValue.then(\n function (nextState) {\n onActionSuccess(actionQueue, node, nextState);\n },\n function (error) {\n return onActionError(actionQueue, node, error);\n }\n )\n : onActionSuccess(actionQueue, node, returnValue);\n}\nfunction onActionSuccess(actionQueue, actionNode, nextState) {\n actionNode.status = \"fulfilled\";\n actionNode.value = nextState;\n notifyActionListeners(actionNode);\n actionQueue.state = nextState;\n actionNode = actionQueue.pending;\n null !== actionNode &&\n ((nextState = actionNode.next),\n nextState === actionNode\n ? (actionQueue.pending = null)\n : ((nextState = nextState.next),\n (actionNode.next = nextState),\n runActionStateAction(actionQueue, nextState)));\n}\nfunction onActionError(actionQueue, actionNode, error) {\n var last = actionQueue.pending;\n actionQueue.pending = null;\n if (null !== last) {\n last = last.next;\n do\n (actionNode.status = \"rejected\"),\n (actionNode.reason = error),\n notifyActionListeners(actionNode),\n (actionNode = actionNode.next);\n while (actionNode !== last);\n }\n actionQueue.action = null;\n}\nfunction notifyActionListeners(actionNode) {\n actionNode = actionNode.listeners;\n for (var i = 0; i < actionNode.length; i++) (0, actionNode[i])();\n}\nfunction actionStateReducer(oldState, newState) {\n return newState;\n}\nfunction mountActionState(action, initialStateProp) {\n if (isHydrating) {\n var ssrFormState = workInProgressRoot.formState;\n if (null !== ssrFormState) {\n a: {\n var JSCompiler_inline_result = currentlyRenderingFiber;\n if (isHydrating) {\n if (nextHydratableInstance) {\n b: {\n var JSCompiler_inline_result$jscomp$0 = nextHydratableInstance;\n for (\n var inRootOrSingleton = rootOrSingletonContext;\n 8 !== JSCompiler_inline_result$jscomp$0.nodeType;\n\n ) {\n if (!inRootOrSingleton) {\n JSCompiler_inline_result$jscomp$0 = null;\n break b;\n }\n JSCompiler_inline_result$jscomp$0 = getNextHydratable(\n JSCompiler_inline_result$jscomp$0.nextSibling\n );\n if (null === JSCompiler_inline_result$jscomp$0) {\n JSCompiler_inline_result$jscomp$0 = null;\n break b;\n }\n }\n inRootOrSingleton = JSCompiler_inline_result$jscomp$0.data;\n JSCompiler_inline_result$jscomp$0 =\n \"F!\" === inRootOrSingleton || \"F\" === inRootOrSingleton\n ? JSCompiler_inline_result$jscomp$0\n : null;\n }\n if (JSCompiler_inline_result$jscomp$0) {\n nextHydratableInstance = getNextHydratable(\n JSCompiler_inline_result$jscomp$0.nextSibling\n );\n JSCompiler_inline_result =\n \"F!\" === JSCompiler_inline_result$jscomp$0.data;\n break a;\n }\n }\n throwOnHydrationMismatch(JSCompiler_inline_result);\n }\n JSCompiler_inline_result = !1;\n }\n JSCompiler_inline_result && (initialStateProp = ssrFormState[0]);\n }\n }\n ssrFormState = mountWorkInProgressHook();\n ssrFormState.memoizedState = ssrFormState.baseState = initialStateProp;\n JSCompiler_inline_result = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: actionStateReducer,\n lastRenderedState: initialStateProp\n };\n ssrFormState.queue = JSCompiler_inline_result;\n ssrFormState = dispatchSetState.bind(\n null,\n currentlyRenderingFiber,\n JSCompiler_inline_result\n );\n JSCompiler_inline_result.dispatch = ssrFormState;\n JSCompiler_inline_result = mountStateImpl(!1);\n inRootOrSingleton = dispatchOptimisticSetState.bind(\n null,\n currentlyRenderingFiber,\n !1,\n JSCompiler_inline_result.queue\n );\n JSCompiler_inline_result = mountWorkInProgressHook();\n JSCompiler_inline_result$jscomp$0 = {\n state: initialStateProp,\n dispatch: null,\n action: action,\n pending: null\n };\n JSCompiler_inline_result.queue = JSCompiler_inline_result$jscomp$0;\n ssrFormState = dispatchActionState.bind(\n null,\n currentlyRenderingFiber,\n JSCompiler_inline_result$jscomp$0,\n inRootOrSingleton,\n ssrFormState\n );\n JSCompiler_inline_result$jscomp$0.dispatch = ssrFormState;\n JSCompiler_inline_result.memoizedState = action;\n return [initialStateProp, ssrFormState, !1];\n}\nfunction updateActionState(action) {\n var stateHook = updateWorkInProgressHook();\n return updateActionStateImpl(stateHook, currentHook, action);\n}\nfunction updateActionStateImpl(stateHook, currentStateHook, action) {\n currentStateHook = updateReducerImpl(\n stateHook,\n currentStateHook,\n actionStateReducer\n )[0];\n stateHook = updateReducer(basicStateReducer)[0];\n if (\n \"object\" === typeof currentStateHook &&\n null !== currentStateHook &&\n \"function\" === typeof currentStateHook.then\n )\n try {\n var state = useThenable(currentStateHook);\n } catch (x) {\n if (x === SuspenseException) throw SuspenseActionException;\n throw x;\n }\n else state = currentStateHook;\n currentStateHook = updateWorkInProgressHook();\n var actionQueue = currentStateHook.queue,\n dispatch = actionQueue.dispatch;\n action !== currentStateHook.memoizedState &&\n ((currentlyRenderingFiber.flags |= 2048),\n pushSimpleEffect(\n 9,\n { destroy: void 0 },\n actionStateActionEffect.bind(null, actionQueue, action),\n null\n ));\n return [state, dispatch, stateHook];\n}\nfunction actionStateActionEffect(actionQueue, action) {\n actionQueue.action = action;\n}\nfunction rerenderActionState(action) {\n var stateHook = updateWorkInProgressHook(),\n currentStateHook = currentHook;\n if (null !== currentStateHook)\n return updateActionStateImpl(stateHook, currentStateHook, action);\n updateWorkInProgressHook();\n stateHook = stateHook.memoizedState;\n currentStateHook = updateWorkInProgressHook();\n var dispatch = currentStateHook.queue.dispatch;\n currentStateHook.memoizedState = action;\n return [stateHook, dispatch, !1];\n}\nfunction pushSimpleEffect(tag, inst, create, deps) {\n tag = { tag: tag, create: create, deps: deps, inst: inst, next: null };\n inst = currentlyRenderingFiber.updateQueue;\n null === inst &&\n ((inst = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = inst));\n create = inst.lastEffect;\n null === create\n ? (inst.lastEffect = tag.next = tag)\n : ((deps = create.next),\n (create.next = tag),\n (tag.next = deps),\n (inst.lastEffect = tag));\n return tag;\n}\nfunction updateRef() {\n return updateWorkInProgressHook().memoizedState;\n}\nfunction mountEffectImpl(fiberFlags, hookFlags, create, deps) {\n var hook = mountWorkInProgressHook();\n currentlyRenderingFiber.flags |= fiberFlags;\n hook.memoizedState = pushSimpleEffect(\n 1 | hookFlags,\n { destroy: void 0 },\n create,\n void 0 === deps ? null : deps\n );\n}\nfunction updateEffectImpl(fiberFlags, hookFlags, create, deps) {\n var hook = updateWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var inst = hook.memoizedState.inst;\n null !== currentHook &&\n null !== deps &&\n areHookInputsEqual(deps, currentHook.memoizedState.deps)\n ? (hook.memoizedState = pushSimpleEffect(hookFlags, inst, create, deps))\n : ((currentlyRenderingFiber.flags |= fiberFlags),\n (hook.memoizedState = pushSimpleEffect(\n 1 | hookFlags,\n inst,\n create,\n deps\n )));\n}\nfunction mountEffect(create, deps) {\n mountEffectImpl(8390656, 8, create, deps);\n}\nfunction updateEffect(create, deps) {\n updateEffectImpl(2048, 8, create, deps);\n}\nfunction useEffectEventImpl(payload) {\n currentlyRenderingFiber.flags |= 4;\n var componentUpdateQueue = currentlyRenderingFiber.updateQueue;\n if (null === componentUpdateQueue)\n (componentUpdateQueue = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = componentUpdateQueue),\n (componentUpdateQueue.events = [payload]);\n else {\n var events = componentUpdateQueue.events;\n null === events\n ? (componentUpdateQueue.events = [payload])\n : events.push(payload);\n }\n}\nfunction updateEvent(callback) {\n var ref = updateWorkInProgressHook().memoizedState;\n useEffectEventImpl({ ref: ref, nextImpl: callback });\n return function () {\n if (0 !== (executionContext & 2)) throw Error(formatProdErrorMessage(440));\n return ref.impl.apply(void 0, arguments);\n };\n}\nfunction updateInsertionEffect(create, deps) {\n return updateEffectImpl(4, 2, create, deps);\n}\nfunction updateLayoutEffect(create, deps) {\n return updateEffectImpl(4, 4, create, deps);\n}\nfunction imperativeHandleEffect(create, ref) {\n if (\"function\" === typeof ref) {\n create = create();\n var refCleanup = ref(create);\n return function () {\n \"function\" === typeof refCleanup ? refCleanup() : ref(null);\n };\n }\n if (null !== ref && void 0 !== ref)\n return (\n (create = create()),\n (ref.current = create),\n function () {\n ref.current = null;\n }\n );\n}\nfunction updateImperativeHandle(ref, create, deps) {\n deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;\n updateEffectImpl(4, 4, imperativeHandleEffect.bind(null, create, ref), deps);\n}\nfunction mountDebugValue() {}\nfunction updateCallback(callback, deps) {\n var hook = updateWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var prevState = hook.memoizedState;\n if (null !== deps && areHookInputsEqual(deps, prevState[1]))\n return prevState[0];\n hook.memoizedState = [callback, deps];\n return callback;\n}\nfunction updateMemo(nextCreate, deps) {\n var hook = updateWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var prevState = hook.memoizedState;\n if (null !== deps && areHookInputsEqual(deps, prevState[1]))\n return prevState[0];\n prevState = nextCreate();\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n nextCreate();\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n hook.memoizedState = [prevState, deps];\n return prevState;\n}\nfunction mountDeferredValueImpl(hook, value, initialValue) {\n if (\n void 0 === initialValue ||\n (0 !== (renderLanes & 1073741824) &&\n 0 === (workInProgressRootRenderLanes & 261930))\n )\n return (hook.memoizedState = value);\n hook.memoizedState = initialValue;\n hook = requestDeferredLane();\n currentlyRenderingFiber.lanes |= hook;\n workInProgressRootSkippedLanes |= hook;\n return initialValue;\n}\nfunction updateDeferredValueImpl(hook, prevValue, value, initialValue) {\n if (objectIs(value, prevValue)) return value;\n if (null !== currentTreeHiddenStackCursor.current)\n return (\n (hook = mountDeferredValueImpl(hook, value, initialValue)),\n objectIs(hook, prevValue) || (didReceiveUpdate = !0),\n hook\n );\n if (\n 0 === (renderLanes & 42) ||\n (0 !== (renderLanes & 1073741824) &&\n 0 === (workInProgressRootRenderLanes & 261930))\n )\n return (didReceiveUpdate = !0), (hook.memoizedState = value);\n hook = requestDeferredLane();\n currentlyRenderingFiber.lanes |= hook;\n workInProgressRootSkippedLanes |= hook;\n return prevValue;\n}\nfunction startTransition(fiber, queue, pendingState, finishedState, callback) {\n var previousPriority = ReactDOMSharedInternals.p;\n ReactDOMSharedInternals.p =\n 0 !== previousPriority && 8 > previousPriority ? previousPriority : 8;\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n dispatchOptimisticSetState(fiber, !1, queue, pendingState);\n try {\n var returnValue = callback(),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n if (\n null !== returnValue &&\n \"object\" === typeof returnValue &&\n \"function\" === typeof returnValue.then\n ) {\n var thenableForFinishedState = chainThenableValue(\n returnValue,\n finishedState\n );\n dispatchSetStateInternal(\n fiber,\n queue,\n thenableForFinishedState,\n requestUpdateLane(fiber)\n );\n } else\n dispatchSetStateInternal(\n fiber,\n queue,\n finishedState,\n requestUpdateLane(fiber)\n );\n } catch (error) {\n dispatchSetStateInternal(\n fiber,\n queue,\n { then: function () {}, status: \"rejected\", reason: error },\n requestUpdateLane()\n );\n } finally {\n (ReactDOMSharedInternals.p = previousPriority),\n null !== prevTransition &&\n null !== currentTransition.types &&\n (prevTransition.types = currentTransition.types),\n (ReactSharedInternals.T = prevTransition);\n }\n}\nfunction noop() {}\nfunction startHostTransition(formFiber, pendingState, action, formData) {\n if (5 !== formFiber.tag) throw Error(formatProdErrorMessage(476));\n var queue = ensureFormComponentIsStateful(formFiber).queue;\n startTransition(\n formFiber,\n queue,\n pendingState,\n sharedNotPendingObject,\n null === action\n ? noop\n : function () {\n requestFormReset$1(formFiber);\n return action(formData);\n }\n );\n}\nfunction ensureFormComponentIsStateful(formFiber) {\n var existingStateHook = formFiber.memoizedState;\n if (null !== existingStateHook) return existingStateHook;\n existingStateHook = {\n memoizedState: sharedNotPendingObject,\n baseState: sharedNotPendingObject,\n baseQueue: null,\n queue: {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: basicStateReducer,\n lastRenderedState: sharedNotPendingObject\n },\n next: null\n };\n var initialResetState = {};\n existingStateHook.next = {\n memoizedState: initialResetState,\n baseState: initialResetState,\n baseQueue: null,\n queue: {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: basicStateReducer,\n lastRenderedState: initialResetState\n },\n next: null\n };\n formFiber.memoizedState = existingStateHook;\n formFiber = formFiber.alternate;\n null !== formFiber && (formFiber.memoizedState = existingStateHook);\n return existingStateHook;\n}\nfunction requestFormReset$1(formFiber) {\n var stateHook = ensureFormComponentIsStateful(formFiber);\n null === stateHook.next && (stateHook = formFiber.alternate.memoizedState);\n dispatchSetStateInternal(\n formFiber,\n stateHook.next.queue,\n {},\n requestUpdateLane()\n );\n}\nfunction useHostTransitionStatus() {\n return readContext(HostTransitionContext);\n}\nfunction updateId() {\n return updateWorkInProgressHook().memoizedState;\n}\nfunction updateRefresh() {\n return updateWorkInProgressHook().memoizedState;\n}\nfunction refreshCache(fiber) {\n for (var provider = fiber.return; null !== provider; ) {\n switch (provider.tag) {\n case 24:\n case 3:\n var lane = requestUpdateLane();\n fiber = createUpdate(lane);\n var root$69 = enqueueUpdate(provider, fiber, lane);\n null !== root$69 &&\n (scheduleUpdateOnFiber(root$69, provider, lane),\n entangleTransitions(root$69, provider, lane));\n provider = { cache: createCache() };\n fiber.payload = provider;\n return;\n }\n provider = provider.return;\n }\n}\nfunction dispatchReducerAction(fiber, queue, action) {\n var lane = requestUpdateLane();\n action = {\n lane: lane,\n revertLane: 0,\n gesture: null,\n action: action,\n hasEagerState: !1,\n eagerState: null,\n next: null\n };\n isRenderPhaseUpdate(fiber)\n ? enqueueRenderPhaseUpdate(queue, action)\n : ((action = enqueueConcurrentHookUpdate(fiber, queue, action, lane)),\n null !== action &&\n (scheduleUpdateOnFiber(action, fiber, lane),\n entangleTransitionUpdate(action, queue, lane)));\n}\nfunction dispatchSetState(fiber, queue, action) {\n var lane = requestUpdateLane();\n dispatchSetStateInternal(fiber, queue, action, lane);\n}\nfunction dispatchSetStateInternal(fiber, queue, action, lane) {\n var update = {\n lane: lane,\n revertLane: 0,\n gesture: null,\n action: action,\n hasEagerState: !1,\n eagerState: null,\n next: null\n };\n if (isRenderPhaseUpdate(fiber)) enqueueRenderPhaseUpdate(queue, update);\n else {\n var alternate = fiber.alternate;\n if (\n 0 === fiber.lanes &&\n (null === alternate || 0 === alternate.lanes) &&\n ((alternate = queue.lastRenderedReducer), null !== alternate)\n )\n try {\n var currentState = queue.lastRenderedState,\n eagerState = alternate(currentState, action);\n update.hasEagerState = !0;\n update.eagerState = eagerState;\n if (objectIs(eagerState, currentState))\n return (\n enqueueUpdate$1(fiber, queue, update, 0),\n null === workInProgressRoot && finishQueueingConcurrentUpdates(),\n !1\n );\n } catch (error) {\n } finally {\n }\n action = enqueueConcurrentHookUpdate(fiber, queue, update, lane);\n if (null !== action)\n return (\n scheduleUpdateOnFiber(action, fiber, lane),\n entangleTransitionUpdate(action, queue, lane),\n !0\n );\n }\n return !1;\n}\nfunction dispatchOptimisticSetState(fiber, throwIfDuringRender, queue, action) {\n action = {\n lane: 2,\n revertLane: requestTransitionLane(),\n gesture: null,\n action: action,\n hasEagerState: !1,\n eagerState: null,\n next: null\n };\n if (isRenderPhaseUpdate(fiber)) {\n if (throwIfDuringRender) throw Error(formatProdErrorMessage(479));\n } else\n (throwIfDuringRender = enqueueConcurrentHookUpdate(\n fiber,\n queue,\n action,\n 2\n )),\n null !== throwIfDuringRender &&\n scheduleUpdateOnFiber(throwIfDuringRender, fiber, 2);\n}\nfunction isRenderPhaseUpdate(fiber) {\n var alternate = fiber.alternate;\n return (\n fiber === currentlyRenderingFiber ||\n (null !== alternate && alternate === currentlyRenderingFiber)\n );\n}\nfunction enqueueRenderPhaseUpdate(queue, update) {\n didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate =\n !0;\n var pending = queue.pending;\n null === pending\n ? (update.next = update)\n : ((update.next = pending.next), (pending.next = update));\n queue.pending = update;\n}\nfunction entangleTransitionUpdate(root, queue, lane) {\n if (0 !== (lane & 4194048)) {\n var queueLanes = queue.lanes;\n queueLanes &= root.pendingLanes;\n lane |= queueLanes;\n queue.lanes = lane;\n markRootEntangled(root, lane);\n }\n}\nvar ContextOnlyDispatcher = {\n readContext: readContext,\n use: use,\n useCallback: throwInvalidHookError,\n useContext: throwInvalidHookError,\n useEffect: throwInvalidHookError,\n useImperativeHandle: throwInvalidHookError,\n useLayoutEffect: throwInvalidHookError,\n useInsertionEffect: throwInvalidHookError,\n useMemo: throwInvalidHookError,\n useReducer: throwInvalidHookError,\n useRef: throwInvalidHookError,\n useState: throwInvalidHookError,\n useDebugValue: throwInvalidHookError,\n useDeferredValue: throwInvalidHookError,\n useTransition: throwInvalidHookError,\n useSyncExternalStore: throwInvalidHookError,\n useId: throwInvalidHookError,\n useHostTransitionStatus: throwInvalidHookError,\n useFormState: throwInvalidHookError,\n useActionState: throwInvalidHookError,\n useOptimistic: throwInvalidHookError,\n useMemoCache: throwInvalidHookError,\n useCacheRefresh: throwInvalidHookError\n};\nContextOnlyDispatcher.useEffectEvent = throwInvalidHookError;\nvar HooksDispatcherOnMount = {\n readContext: readContext,\n use: use,\n useCallback: function (callback, deps) {\n mountWorkInProgressHook().memoizedState = [\n callback,\n void 0 === deps ? null : deps\n ];\n return callback;\n },\n useContext: readContext,\n useEffect: mountEffect,\n useImperativeHandle: function (ref, create, deps) {\n deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;\n mountEffectImpl(\n 4194308,\n 4,\n imperativeHandleEffect.bind(null, create, ref),\n deps\n );\n },\n useLayoutEffect: function (create, deps) {\n return mountEffectImpl(4194308, 4, create, deps);\n },\n useInsertionEffect: function (create, deps) {\n mountEffectImpl(4, 2, create, deps);\n },\n useMemo: function (nextCreate, deps) {\n var hook = mountWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var nextValue = nextCreate();\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n nextCreate();\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n hook.memoizedState = [nextValue, deps];\n return nextValue;\n },\n useReducer: function (reducer, initialArg, init) {\n var hook = mountWorkInProgressHook();\n if (void 0 !== init) {\n var initialState = init(initialArg);\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n init(initialArg);\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n } else initialState = initialArg;\n hook.memoizedState = hook.baseState = initialState;\n reducer = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: reducer,\n lastRenderedState: initialState\n };\n hook.queue = reducer;\n reducer = reducer.dispatch = dispatchReducerAction.bind(\n null,\n currentlyRenderingFiber,\n reducer\n );\n return [hook.memoizedState, reducer];\n },\n useRef: function (initialValue) {\n var hook = mountWorkInProgressHook();\n initialValue = { current: initialValue };\n return (hook.memoizedState = initialValue);\n },\n useState: function (initialState) {\n initialState = mountStateImpl(initialState);\n var queue = initialState.queue,\n dispatch = dispatchSetState.bind(null, currentlyRenderingFiber, queue);\n queue.dispatch = dispatch;\n return [initialState.memoizedState, dispatch];\n },\n useDebugValue: mountDebugValue,\n useDeferredValue: function (value, initialValue) {\n var hook = mountWorkInProgressHook();\n return mountDeferredValueImpl(hook, value, initialValue);\n },\n useTransition: function () {\n var stateHook = mountStateImpl(!1);\n stateHook = startTransition.bind(\n null,\n currentlyRenderingFiber,\n stateHook.queue,\n !0,\n !1\n );\n mountWorkInProgressHook().memoizedState = stateHook;\n return [!1, stateHook];\n },\n useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {\n var fiber = currentlyRenderingFiber,\n hook = mountWorkInProgressHook();\n if (isHydrating) {\n if (void 0 === getServerSnapshot)\n throw Error(formatProdErrorMessage(407));\n getServerSnapshot = getServerSnapshot();\n } else {\n getServerSnapshot = getSnapshot();\n if (null === workInProgressRoot)\n throw Error(formatProdErrorMessage(349));\n 0 !== (workInProgressRootRenderLanes & 127) ||\n pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);\n }\n hook.memoizedState = getServerSnapshot;\n var inst = { value: getServerSnapshot, getSnapshot: getSnapshot };\n hook.queue = inst;\n mountEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [\n subscribe\n ]);\n fiber.flags |= 2048;\n pushSimpleEffect(\n 9,\n { destroy: void 0 },\n updateStoreInstance.bind(\n null,\n fiber,\n inst,\n getServerSnapshot,\n getSnapshot\n ),\n null\n );\n return getServerSnapshot;\n },\n useId: function () {\n var hook = mountWorkInProgressHook(),\n identifierPrefix = workInProgressRoot.identifierPrefix;\n if (isHydrating) {\n var JSCompiler_inline_result = treeContextOverflow;\n var idWithLeadingBit = treeContextId;\n JSCompiler_inline_result =\n (\n idWithLeadingBit & ~(1 << (32 - clz32(idWithLeadingBit) - 1))\n ).toString(32) + JSCompiler_inline_result;\n identifierPrefix =\n \"_\" + identifierPrefix + \"R_\" + JSCompiler_inline_result;\n JSCompiler_inline_result = localIdCounter++;\n 0 < JSCompiler_inline_result &&\n (identifierPrefix += \"H\" + JSCompiler_inline_result.toString(32));\n identifierPrefix += \"_\";\n } else\n (JSCompiler_inline_result = globalClientIdCounter++),\n (identifierPrefix =\n \"_\" +\n identifierPrefix +\n \"r_\" +\n JSCompiler_inline_result.toString(32) +\n \"_\");\n return (hook.memoizedState = identifierPrefix);\n },\n useHostTransitionStatus: useHostTransitionStatus,\n useFormState: mountActionState,\n useActionState: mountActionState,\n useOptimistic: function (passthrough) {\n var hook = mountWorkInProgressHook();\n hook.memoizedState = hook.baseState = passthrough;\n var queue = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: null,\n lastRenderedState: null\n };\n hook.queue = queue;\n hook = dispatchOptimisticSetState.bind(\n null,\n currentlyRenderingFiber,\n !0,\n queue\n );\n queue.dispatch = hook;\n return [passthrough, hook];\n },\n useMemoCache: useMemoCache,\n useCacheRefresh: function () {\n return (mountWorkInProgressHook().memoizedState = refreshCache.bind(\n null,\n currentlyRenderingFiber\n ));\n },\n useEffectEvent: function (callback) {\n var hook = mountWorkInProgressHook(),\n ref = { impl: callback };\n hook.memoizedState = ref;\n return function () {\n if (0 !== (executionContext & 2))\n throw Error(formatProdErrorMessage(440));\n return ref.impl.apply(void 0, arguments);\n };\n }\n },\n HooksDispatcherOnUpdate = {\n readContext: readContext,\n use: use,\n useCallback: updateCallback,\n useContext: readContext,\n useEffect: updateEffect,\n useImperativeHandle: updateImperativeHandle,\n useInsertionEffect: updateInsertionEffect,\n useLayoutEffect: updateLayoutEffect,\n useMemo: updateMemo,\n useReducer: updateReducer,\n useRef: updateRef,\n useState: function () {\n return updateReducer(basicStateReducer);\n },\n useDebugValue: mountDebugValue,\n useDeferredValue: function (value, initialValue) {\n var hook = updateWorkInProgressHook();\n return updateDeferredValueImpl(\n hook,\n currentHook.memoizedState,\n value,\n initialValue\n );\n },\n useTransition: function () {\n var booleanOrThenable = updateReducer(basicStateReducer)[0],\n start = updateWorkInProgressHook().memoizedState;\n return [\n \"boolean\" === typeof booleanOrThenable\n ? booleanOrThenable\n : useThenable(booleanOrThenable),\n start\n ];\n },\n useSyncExternalStore: updateSyncExternalStore,\n useId: updateId,\n useHostTransitionStatus: useHostTransitionStatus,\n useFormState: updateActionState,\n useActionState: updateActionState,\n useOptimistic: function (passthrough, reducer) {\n var hook = updateWorkInProgressHook();\n return updateOptimisticImpl(hook, currentHook, passthrough, reducer);\n },\n useMemoCache: useMemoCache,\n useCacheRefresh: updateRefresh\n };\nHooksDispatcherOnUpdate.useEffectEvent = updateEvent;\nvar HooksDispatcherOnRerender = {\n readContext: readContext,\n use: use,\n useCallback: updateCallback,\n useContext: readContext,\n useEffect: updateEffect,\n useImperativeHandle: updateImperativeHandle,\n useInsertionEffect: updateInsertionEffect,\n useLayoutEffect: updateLayoutEffect,\n useMemo: updateMemo,\n useReducer: rerenderReducer,\n useRef: updateRef,\n useState: function () {\n return rerenderReducer(basicStateReducer);\n },\n useDebugValue: mountDebugValue,\n useDeferredValue: function (value, initialValue) {\n var hook = updateWorkInProgressHook();\n return null === currentHook\n ? mountDeferredValueImpl(hook, value, initialValue)\n : updateDeferredValueImpl(\n hook,\n currentHook.memoizedState,\n value,\n initialValue\n );\n },\n useTransition: function () {\n var booleanOrThenable = rerenderReducer(basicStateReducer)[0],\n start = updateWorkInProgressHook().memoizedState;\n return [\n \"boolean\" === typeof booleanOrThenable\n ? booleanOrThenable\n : useThenable(booleanOrThenable),\n start\n ];\n },\n useSyncExternalStore: updateSyncExternalStore,\n useId: updateId,\n useHostTransitionStatus: useHostTransitionStatus,\n useFormState: rerenderActionState,\n useActionState: rerenderActionState,\n useOptimistic: function (passthrough, reducer) {\n var hook = updateWorkInProgressHook();\n if (null !== currentHook)\n return updateOptimisticImpl(hook, currentHook, passthrough, reducer);\n hook.baseState = passthrough;\n return [passthrough, hook.queue.dispatch];\n },\n useMemoCache: useMemoCache,\n useCacheRefresh: updateRefresh\n};\nHooksDispatcherOnRerender.useEffectEvent = updateEvent;\nfunction applyDerivedStateFromProps(\n workInProgress,\n ctor,\n getDerivedStateFromProps,\n nextProps\n) {\n ctor = workInProgress.memoizedState;\n getDerivedStateFromProps = getDerivedStateFromProps(nextProps, ctor);\n getDerivedStateFromProps =\n null === getDerivedStateFromProps || void 0 === getDerivedStateFromProps\n ? ctor\n : assign({}, ctor, getDerivedStateFromProps);\n workInProgress.memoizedState = getDerivedStateFromProps;\n 0 === workInProgress.lanes &&\n (workInProgress.updateQueue.baseState = getDerivedStateFromProps);\n}\nvar classComponentUpdater = {\n enqueueSetState: function (inst, payload, callback) {\n inst = inst._reactInternals;\n var lane = requestUpdateLane(),\n update = createUpdate(lane);\n update.payload = payload;\n void 0 !== callback && null !== callback && (update.callback = callback);\n payload = enqueueUpdate(inst, update, lane);\n null !== payload &&\n (scheduleUpdateOnFiber(payload, inst, lane),\n entangleTransitions(payload, inst, lane));\n },\n enqueueReplaceState: function (inst, payload, callback) {\n inst = inst._reactInternals;\n var lane = requestUpdateLane(),\n update = createUpdate(lane);\n update.tag = 1;\n update.payload = payload;\n void 0 !== callback && null !== callback && (update.callback = callback);\n payload = enqueueUpdate(inst, update, lane);\n null !== payload &&\n (scheduleUpdateOnFiber(payload, inst, lane),\n entangleTransitions(payload, inst, lane));\n },\n enqueueForceUpdate: function (inst, callback) {\n inst = inst._reactInternals;\n var lane = requestUpdateLane(),\n update = createUpdate(lane);\n update.tag = 2;\n void 0 !== callback && null !== callback && (update.callback = callback);\n callback = enqueueUpdate(inst, update, lane);\n null !== callback &&\n (scheduleUpdateOnFiber(callback, inst, lane),\n entangleTransitions(callback, inst, lane));\n }\n};\nfunction checkShouldComponentUpdate(\n workInProgress,\n ctor,\n oldProps,\n newProps,\n oldState,\n newState,\n nextContext\n) {\n workInProgress = workInProgress.stateNode;\n return \"function\" === typeof workInProgress.shouldComponentUpdate\n ? workInProgress.shouldComponentUpdate(newProps, newState, nextContext)\n : ctor.prototype && ctor.prototype.isPureReactComponent\n ? !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState)\n : !0;\n}\nfunction callComponentWillReceiveProps(\n workInProgress,\n instance,\n newProps,\n nextContext\n) {\n workInProgress = instance.state;\n \"function\" === typeof instance.componentWillReceiveProps &&\n instance.componentWillReceiveProps(newProps, nextContext);\n \"function\" === typeof instance.UNSAFE_componentWillReceiveProps &&\n instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);\n instance.state !== workInProgress &&\n classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n}\nfunction resolveClassComponentProps(Component, baseProps) {\n var newProps = baseProps;\n if (\"ref\" in baseProps) {\n newProps = {};\n for (var propName in baseProps)\n \"ref\" !== propName && (newProps[propName] = baseProps[propName]);\n }\n if ((Component = Component.defaultProps)) {\n newProps === baseProps && (newProps = assign({}, newProps));\n for (var propName$73 in Component)\n void 0 === newProps[propName$73] &&\n (newProps[propName$73] = Component[propName$73]);\n }\n return newProps;\n}\nfunction defaultOnUncaughtError(error) {\n reportGlobalError(error);\n}\nfunction defaultOnCaughtError(error) {\n console.error(error);\n}\nfunction defaultOnRecoverableError(error) {\n reportGlobalError(error);\n}\nfunction logUncaughtError(root, errorInfo) {\n try {\n var onUncaughtError = root.onUncaughtError;\n onUncaughtError(errorInfo.value, { componentStack: errorInfo.stack });\n } catch (e$74) {\n setTimeout(function () {\n throw e$74;\n });\n }\n}\nfunction logCaughtError(root, boundary, errorInfo) {\n try {\n var onCaughtError = root.onCaughtError;\n onCaughtError(errorInfo.value, {\n componentStack: errorInfo.stack,\n errorBoundary: 1 === boundary.tag ? boundary.stateNode : null\n });\n } catch (e$75) {\n setTimeout(function () {\n throw e$75;\n });\n }\n}\nfunction createRootErrorUpdate(root, errorInfo, lane) {\n lane = createUpdate(lane);\n lane.tag = 3;\n lane.payload = { element: null };\n lane.callback = function () {\n logUncaughtError(root, errorInfo);\n };\n return lane;\n}\nfunction createClassErrorUpdate(lane) {\n lane = createUpdate(lane);\n lane.tag = 3;\n return lane;\n}\nfunction initializeClassErrorUpdate(update, root, fiber, errorInfo) {\n var getDerivedStateFromError = fiber.type.getDerivedStateFromError;\n if (\"function\" === typeof getDerivedStateFromError) {\n var error = errorInfo.value;\n update.payload = function () {\n return getDerivedStateFromError(error);\n };\n update.callback = function () {\n logCaughtError(root, fiber, errorInfo);\n };\n }\n var inst = fiber.stateNode;\n null !== inst &&\n \"function\" === typeof inst.componentDidCatch &&\n (update.callback = function () {\n logCaughtError(root, fiber, errorInfo);\n \"function\" !== typeof getDerivedStateFromError &&\n (null === legacyErrorBoundariesThatAlreadyFailed\n ? (legacyErrorBoundariesThatAlreadyFailed = new Set([this]))\n : legacyErrorBoundariesThatAlreadyFailed.add(this));\n var stack = errorInfo.stack;\n this.componentDidCatch(errorInfo.value, {\n componentStack: null !== stack ? stack : \"\"\n });\n });\n}\nfunction throwException(\n root,\n returnFiber,\n sourceFiber,\n value,\n rootRenderLanes\n) {\n sourceFiber.flags |= 32768;\n if (\n null !== value &&\n \"object\" === typeof value &&\n \"function\" === typeof value.then\n ) {\n returnFiber = sourceFiber.alternate;\n null !== returnFiber &&\n propagateParentContextChanges(\n returnFiber,\n sourceFiber,\n rootRenderLanes,\n !0\n );\n sourceFiber = suspenseHandlerStackCursor.current;\n if (null !== sourceFiber) {\n switch (sourceFiber.tag) {\n case 31:\n case 13:\n return (\n null === shellBoundary\n ? renderDidSuspendDelayIfPossible()\n : null === sourceFiber.alternate &&\n 0 === workInProgressRootExitStatus &&\n (workInProgressRootExitStatus = 3),\n (sourceFiber.flags &= -257),\n (sourceFiber.flags |= 65536),\n (sourceFiber.lanes = rootRenderLanes),\n value === noopSuspenseyCommitThenable\n ? (sourceFiber.flags |= 16384)\n : ((returnFiber = sourceFiber.updateQueue),\n null === returnFiber\n ? (sourceFiber.updateQueue = new Set([value]))\n : returnFiber.add(value),\n attachPingListener(root, value, rootRenderLanes)),\n !1\n );\n case 22:\n return (\n (sourceFiber.flags |= 65536),\n value === noopSuspenseyCommitThenable\n ? (sourceFiber.flags |= 16384)\n : ((returnFiber = sourceFiber.updateQueue),\n null === returnFiber\n ? ((returnFiber = {\n transitions: null,\n markerInstances: null,\n retryQueue: new Set([value])\n }),\n (sourceFiber.updateQueue = returnFiber))\n : ((sourceFiber = returnFiber.retryQueue),\n null === sourceFiber\n ? (returnFiber.retryQueue = new Set([value]))\n : sourceFiber.add(value)),\n attachPingListener(root, value, rootRenderLanes)),\n !1\n );\n }\n throw Error(formatProdErrorMessage(435, sourceFiber.tag));\n }\n attachPingListener(root, value, rootRenderLanes);\n renderDidSuspendDelayIfPossible();\n return !1;\n }\n if (isHydrating)\n return (\n (returnFiber = suspenseHandlerStackCursor.current),\n null !== returnFiber\n ? (0 === (returnFiber.flags & 65536) && (returnFiber.flags |= 256),\n (returnFiber.flags |= 65536),\n (returnFiber.lanes = rootRenderLanes),\n value !== HydrationMismatchException &&\n ((root = Error(formatProdErrorMessage(422), { cause: value })),\n queueHydrationError(createCapturedValueAtFiber(root, sourceFiber))))\n : (value !== HydrationMismatchException &&\n ((returnFiber = Error(formatProdErrorMessage(423), {\n cause: value\n })),\n queueHydrationError(\n createCapturedValueAtFiber(returnFiber, sourceFiber)\n )),\n (root = root.current.alternate),\n (root.flags |= 65536),\n (rootRenderLanes &= -rootRenderLanes),\n (root.lanes |= rootRenderLanes),\n (value = createCapturedValueAtFiber(value, sourceFiber)),\n (rootRenderLanes = createRootErrorUpdate(\n root.stateNode,\n value,\n rootRenderLanes\n )),\n enqueueCapturedUpdate(root, rootRenderLanes),\n 4 !== workInProgressRootExitStatus &&\n (workInProgressRootExitStatus = 2)),\n !1\n );\n var wrapperError = Error(formatProdErrorMessage(520), { cause: value });\n wrapperError = createCapturedValueAtFiber(wrapperError, sourceFiber);\n null === workInProgressRootConcurrentErrors\n ? (workInProgressRootConcurrentErrors = [wrapperError])\n : workInProgressRootConcurrentErrors.push(wrapperError);\n 4 !== workInProgressRootExitStatus && (workInProgressRootExitStatus = 2);\n if (null === returnFiber) return !0;\n value = createCapturedValueAtFiber(value, sourceFiber);\n sourceFiber = returnFiber;\n do {\n switch (sourceFiber.tag) {\n case 3:\n return (\n (sourceFiber.flags |= 65536),\n (root = rootRenderLanes & -rootRenderLanes),\n (sourceFiber.lanes |= root),\n (root = createRootErrorUpdate(sourceFiber.stateNode, value, root)),\n enqueueCapturedUpdate(sourceFiber, root),\n !1\n );\n case 1:\n if (\n ((returnFiber = sourceFiber.type),\n (wrapperError = sourceFiber.stateNode),\n 0 === (sourceFiber.flags & 128) &&\n (\"function\" === typeof returnFiber.getDerivedStateFromError ||\n (null !== wrapperError &&\n \"function\" === typeof wrapperError.componentDidCatch &&\n (null === legacyErrorBoundariesThatAlreadyFailed ||\n !legacyErrorBoundariesThatAlreadyFailed.has(wrapperError)))))\n )\n return (\n (sourceFiber.flags |= 65536),\n (rootRenderLanes &= -rootRenderLanes),\n (sourceFiber.lanes |= rootRenderLanes),\n (rootRenderLanes = createClassErrorUpdate(rootRenderLanes)),\n initializeClassErrorUpdate(\n rootRenderLanes,\n root,\n sourceFiber,\n value\n ),\n enqueueCapturedUpdate(sourceFiber, rootRenderLanes),\n !1\n );\n }\n sourceFiber = sourceFiber.return;\n } while (null !== sourceFiber);\n return !1;\n}\nvar SelectiveHydrationException = Error(formatProdErrorMessage(461)),\n didReceiveUpdate = !1;\nfunction reconcileChildren(current, workInProgress, nextChildren, renderLanes) {\n workInProgress.child =\n null === current\n ? mountChildFibers(workInProgress, null, nextChildren, renderLanes)\n : reconcileChildFibers(\n workInProgress,\n current.child,\n nextChildren,\n renderLanes\n );\n}\nfunction updateForwardRef(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n Component = Component.render;\n var ref = workInProgress.ref;\n if (\"ref\" in nextProps) {\n var propsWithoutRef = {};\n for (var key in nextProps)\n \"ref\" !== key && (propsWithoutRef[key] = nextProps[key]);\n } else propsWithoutRef = nextProps;\n prepareToReadContext(workInProgress);\n nextProps = renderWithHooks(\n current,\n workInProgress,\n Component,\n propsWithoutRef,\n ref,\n renderLanes\n );\n key = checkDidRenderIdHook();\n if (null !== current && !didReceiveUpdate)\n return (\n bailoutHooks(current, workInProgress, renderLanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n isHydrating && key && pushMaterializedTreeId(workInProgress);\n workInProgress.flags |= 1;\n reconcileChildren(current, workInProgress, nextProps, renderLanes);\n return workInProgress.child;\n}\nfunction updateMemoComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n if (null === current) {\n var type = Component.type;\n if (\n \"function\" === typeof type &&\n !shouldConstruct(type) &&\n void 0 === type.defaultProps &&\n null === Component.compare\n )\n return (\n (workInProgress.tag = 15),\n (workInProgress.type = type),\n updateSimpleMemoComponent(\n current,\n workInProgress,\n type,\n nextProps,\n renderLanes\n )\n );\n current = createFiberFromTypeAndProps(\n Component.type,\n null,\n nextProps,\n workInProgress,\n workInProgress.mode,\n renderLanes\n );\n current.ref = workInProgress.ref;\n current.return = workInProgress;\n return (workInProgress.child = current);\n }\n type = current.child;\n if (!checkScheduledUpdateOrContext(current, renderLanes)) {\n var prevProps = type.memoizedProps;\n Component = Component.compare;\n Component = null !== Component ? Component : shallowEqual;\n if (Component(prevProps, nextProps) && current.ref === workInProgress.ref)\n return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);\n }\n workInProgress.flags |= 1;\n current = createWorkInProgress(type, nextProps);\n current.ref = workInProgress.ref;\n current.return = workInProgress;\n return (workInProgress.child = current);\n}\nfunction updateSimpleMemoComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n if (null !== current) {\n var prevProps = current.memoizedProps;\n if (\n shallowEqual(prevProps, nextProps) &&\n current.ref === workInProgress.ref\n )\n if (\n ((didReceiveUpdate = !1),\n (workInProgress.pendingProps = nextProps = prevProps),\n checkScheduledUpdateOrContext(current, renderLanes))\n )\n 0 !== (current.flags & 131072) && (didReceiveUpdate = !0);\n else\n return (\n (workInProgress.lanes = current.lanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n }\n return updateFunctionComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n );\n}\nfunction updateOffscreenComponent(\n current,\n workInProgress,\n renderLanes,\n nextProps\n) {\n var nextChildren = nextProps.children,\n prevState = null !== current ? current.memoizedState : null;\n null === current &&\n null === workInProgress.stateNode &&\n (workInProgress.stateNode = {\n _visibility: 1,\n _pendingMarkers: null,\n _retryCache: null,\n _transitions: null\n });\n if (\"hidden\" === nextProps.mode) {\n if (0 !== (workInProgress.flags & 128)) {\n prevState =\n null !== prevState ? prevState.baseLanes | renderLanes : renderLanes;\n if (null !== current) {\n nextProps = workInProgress.child = current.child;\n for (nextChildren = 0; null !== nextProps; )\n (nextChildren =\n nextChildren | nextProps.lanes | nextProps.childLanes),\n (nextProps = nextProps.sibling);\n nextProps = nextChildren & ~prevState;\n } else (nextProps = 0), (workInProgress.child = null);\n return deferHiddenOffscreenComponent(\n current,\n workInProgress,\n prevState,\n renderLanes,\n nextProps\n );\n }\n if (0 !== (renderLanes & 536870912))\n (workInProgress.memoizedState = { baseLanes: 0, cachePool: null }),\n null !== current &&\n pushTransition(\n workInProgress,\n null !== prevState ? prevState.cachePool : null\n ),\n null !== prevState\n ? pushHiddenContext(workInProgress, prevState)\n : reuseHiddenContextOnStack(),\n pushOffscreenSuspenseHandler(workInProgress);\n else\n return (\n (nextProps = workInProgress.lanes = 536870912),\n deferHiddenOffscreenComponent(\n current,\n workInProgress,\n null !== prevState ? prevState.baseLanes | renderLanes : renderLanes,\n renderLanes,\n nextProps\n )\n );\n } else\n null !== prevState\n ? (pushTransition(workInProgress, prevState.cachePool),\n pushHiddenContext(workInProgress, prevState),\n reuseSuspenseHandlerOnStack(workInProgress),\n (workInProgress.memoizedState = null))\n : (null !== current && pushTransition(workInProgress, null),\n reuseHiddenContextOnStack(),\n reuseSuspenseHandlerOnStack(workInProgress));\n reconcileChildren(current, workInProgress, nextChildren, renderLanes);\n return workInProgress.child;\n}\nfunction bailoutOffscreenComponent(current, workInProgress) {\n (null !== current && 22 === current.tag) ||\n null !== workInProgress.stateNode ||\n (workInProgress.stateNode = {\n _visibility: 1,\n _pendingMarkers: null,\n _retryCache: null,\n _transitions: null\n });\n return workInProgress.sibling;\n}\nfunction deferHiddenOffscreenComponent(\n current,\n workInProgress,\n nextBaseLanes,\n renderLanes,\n remainingChildLanes\n) {\n var JSCompiler_inline_result = peekCacheFromPool();\n JSCompiler_inline_result =\n null === JSCompiler_inline_result\n ? null\n : { parent: CacheContext._currentValue, pool: JSCompiler_inline_result };\n workInProgress.memoizedState = {\n baseLanes: nextBaseLanes,\n cachePool: JSCompiler_inline_result\n };\n null !== current && pushTransition(workInProgress, null);\n reuseHiddenContextOnStack();\n pushOffscreenSuspenseHandler(workInProgress);\n null !== current &&\n propagateParentContextChanges(current, workInProgress, renderLanes, !0);\n workInProgress.childLanes = remainingChildLanes;\n return null;\n}\nfunction mountActivityChildren(workInProgress, nextProps) {\n nextProps = mountWorkInProgressOffscreenFiber(\n { mode: nextProps.mode, children: nextProps.children },\n workInProgress.mode\n );\n nextProps.ref = workInProgress.ref;\n workInProgress.child = nextProps;\n nextProps.return = workInProgress;\n return nextProps;\n}\nfunction retryActivityComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n) {\n reconcileChildFibers(workInProgress, current.child, null, renderLanes);\n current = mountActivityChildren(workInProgress, workInProgress.pendingProps);\n current.flags |= 2;\n popSuspenseHandler(workInProgress);\n workInProgress.memoizedState = null;\n return current;\n}\nfunction updateActivityComponent(current, workInProgress, renderLanes) {\n var nextProps = workInProgress.pendingProps,\n didSuspend = 0 !== (workInProgress.flags & 128);\n workInProgress.flags &= -129;\n if (null === current) {\n if (isHydrating) {\n if (\"hidden\" === nextProps.mode)\n return (\n (current = mountActivityChildren(workInProgress, nextProps)),\n (workInProgress.lanes = 536870912),\n bailoutOffscreenComponent(null, current)\n );\n pushDehydratedActivitySuspenseHandler(workInProgress);\n (current = nextHydratableInstance)\n ? ((current = canHydrateHydrationBoundary(\n current,\n rootOrSingletonContext\n )),\n (current = null !== current && \"&\" === current.data ? current : null),\n null !== current &&\n ((workInProgress.memoizedState = {\n dehydrated: current,\n treeContext:\n null !== treeContextProvider\n ? { id: treeContextId, overflow: treeContextOverflow }\n : null,\n retryLane: 536870912,\n hydrationErrors: null\n }),\n (renderLanes = createFiberFromDehydratedFragment(current)),\n (renderLanes.return = workInProgress),\n (workInProgress.child = renderLanes),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = null)))\n : (current = null);\n if (null === current) throw throwOnHydrationMismatch(workInProgress);\n workInProgress.lanes = 536870912;\n return null;\n }\n return mountActivityChildren(workInProgress, nextProps);\n }\n var prevState = current.memoizedState;\n if (null !== prevState) {\n var dehydrated = prevState.dehydrated;\n pushDehydratedActivitySuspenseHandler(workInProgress);\n if (didSuspend)\n if (workInProgress.flags & 256)\n (workInProgress.flags &= -257),\n (workInProgress = retryActivityComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n ));\n else if (null !== workInProgress.memoizedState)\n (workInProgress.child = current.child),\n (workInProgress.flags |= 128),\n (workInProgress = null);\n else throw Error(formatProdErrorMessage(558));\n else if (\n (didReceiveUpdate ||\n propagateParentContextChanges(current, workInProgress, renderLanes, !1),\n (didSuspend = 0 !== (renderLanes & current.childLanes)),\n didReceiveUpdate || didSuspend)\n ) {\n nextProps = workInProgressRoot;\n if (\n null !== nextProps &&\n ((dehydrated = getBumpedLaneForHydration(nextProps, renderLanes)),\n 0 !== dehydrated && dehydrated !== prevState.retryLane)\n )\n throw (\n ((prevState.retryLane = dehydrated),\n enqueueConcurrentRenderForLane(current, dehydrated),\n scheduleUpdateOnFiber(nextProps, current, dehydrated),\n SelectiveHydrationException)\n );\n renderDidSuspendDelayIfPossible();\n workInProgress = retryActivityComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n );\n } else\n (current = prevState.treeContext),\n (nextHydratableInstance = getNextHydratable(dehydrated.nextSibling)),\n (hydrationParentFiber = workInProgress),\n (isHydrating = !0),\n (hydrationErrors = null),\n (rootOrSingletonContext = !1),\n null !== current &&\n restoreSuspendedTreeContext(workInProgress, current),\n (workInProgress = mountActivityChildren(workInProgress, nextProps)),\n (workInProgress.flags |= 4096);\n return workInProgress;\n }\n current = createWorkInProgress(current.child, {\n mode: nextProps.mode,\n children: nextProps.children\n });\n current.ref = workInProgress.ref;\n workInProgress.child = current;\n current.return = workInProgress;\n return current;\n}\nfunction markRef(current, workInProgress) {\n var ref = workInProgress.ref;\n if (null === ref)\n null !== current &&\n null !== current.ref &&\n (workInProgress.flags |= 4194816);\n else {\n if (\"function\" !== typeof ref && \"object\" !== typeof ref)\n throw Error(formatProdErrorMessage(284));\n if (null === current || current.ref !== ref)\n workInProgress.flags |= 4194816;\n }\n}\nfunction updateFunctionComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n prepareToReadContext(workInProgress);\n Component = renderWithHooks(\n current,\n workInProgress,\n Component,\n nextProps,\n void 0,\n renderLanes\n );\n nextProps = checkDidRenderIdHook();\n if (null !== current && !didReceiveUpdate)\n return (\n bailoutHooks(current, workInProgress, renderLanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n isHydrating && nextProps && pushMaterializedTreeId(workInProgress);\n workInProgress.flags |= 1;\n reconcileChildren(current, workInProgress, Component, renderLanes);\n return workInProgress.child;\n}\nfunction replayFunctionComponent(\n current,\n workInProgress,\n nextProps,\n Component,\n secondArg,\n renderLanes\n) {\n prepareToReadContext(workInProgress);\n workInProgress.updateQueue = null;\n nextProps = renderWithHooksAgain(\n workInProgress,\n Component,\n nextProps,\n secondArg\n );\n finishRenderingHooks(current);\n Component = checkDidRenderIdHook();\n if (null !== current && !didReceiveUpdate)\n return (\n bailoutHooks(current, workInProgress, renderLanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n isHydrating && Component && pushMaterializedTreeId(workInProgress);\n workInProgress.flags |= 1;\n reconcileChildren(current, workInProgress, nextProps, renderLanes);\n return workInProgress.child;\n}\nfunction updateClassComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n prepareToReadContext(workInProgress);\n if (null === workInProgress.stateNode) {\n var context = emptyContextObject,\n contextType = Component.contextType;\n \"object\" === typeof contextType &&\n null !== contextType &&\n (context = readContext(contextType));\n context = new Component(nextProps, context);\n workInProgress.memoizedState =\n null !== context.state && void 0 !== context.state ? context.state : null;\n context.updater = classComponentUpdater;\n workInProgress.stateNode = context;\n context._reactInternals = workInProgress;\n context = workInProgress.stateNode;\n context.props = nextProps;\n context.state = workInProgress.memoizedState;\n context.refs = {};\n initializeUpdateQueue(workInProgress);\n contextType = Component.contextType;\n context.context =\n \"object\" === typeof contextType && null !== contextType\n ? readContext(contextType)\n : emptyContextObject;\n context.state = workInProgress.memoizedState;\n contextType = Component.getDerivedStateFromProps;\n \"function\" === typeof contextType &&\n (applyDerivedStateFromProps(\n workInProgress,\n Component,\n contextType,\n nextProps\n ),\n (context.state = workInProgress.memoizedState));\n \"function\" === typeof Component.getDerivedStateFromProps ||\n \"function\" === typeof context.getSnapshotBeforeUpdate ||\n (\"function\" !== typeof context.UNSAFE_componentWillMount &&\n \"function\" !== typeof context.componentWillMount) ||\n ((contextType = context.state),\n \"function\" === typeof context.componentWillMount &&\n context.componentWillMount(),\n \"function\" === typeof context.UNSAFE_componentWillMount &&\n context.UNSAFE_componentWillMount(),\n contextType !== context.state &&\n classComponentUpdater.enqueueReplaceState(context, context.state, null),\n processUpdateQueue(workInProgress, nextProps, context, renderLanes),\n suspendIfUpdateReadFromEntangledAsyncAction(),\n (context.state = workInProgress.memoizedState));\n \"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308);\n nextProps = !0;\n } else if (null === current) {\n context = workInProgress.stateNode;\n var unresolvedOldProps = workInProgress.memoizedProps,\n oldProps = resolveClassComponentProps(Component, unresolvedOldProps);\n context.props = oldProps;\n var oldContext = context.context,\n contextType$jscomp$0 = Component.contextType;\n contextType = emptyContextObject;\n \"object\" === typeof contextType$jscomp$0 &&\n null !== contextType$jscomp$0 &&\n (contextType = readContext(contextType$jscomp$0));\n var getDerivedStateFromProps = Component.getDerivedStateFromProps;\n contextType$jscomp$0 =\n \"function\" === typeof getDerivedStateFromProps ||\n \"function\" === typeof context.getSnapshotBeforeUpdate;\n unresolvedOldProps = workInProgress.pendingProps !== unresolvedOldProps;\n contextType$jscomp$0 ||\n (\"function\" !== typeof context.UNSAFE_componentWillReceiveProps &&\n \"function\" !== typeof context.componentWillReceiveProps) ||\n ((unresolvedOldProps || oldContext !== contextType) &&\n callComponentWillReceiveProps(\n workInProgress,\n context,\n nextProps,\n contextType\n ));\n hasForceUpdate = !1;\n var oldState = workInProgress.memoizedState;\n context.state = oldState;\n processUpdateQueue(workInProgress, nextProps, context, renderLanes);\n suspendIfUpdateReadFromEntangledAsyncAction();\n oldContext = workInProgress.memoizedState;\n unresolvedOldProps || oldState !== oldContext || hasForceUpdate\n ? (\"function\" === typeof getDerivedStateFromProps &&\n (applyDerivedStateFromProps(\n workInProgress,\n Component,\n getDerivedStateFromProps,\n nextProps\n ),\n (oldContext = workInProgress.memoizedState)),\n (oldProps =\n hasForceUpdate ||\n checkShouldComponentUpdate(\n workInProgress,\n Component,\n oldProps,\n nextProps,\n oldState,\n oldContext,\n contextType\n ))\n ? (contextType$jscomp$0 ||\n (\"function\" !== typeof context.UNSAFE_componentWillMount &&\n \"function\" !== typeof context.componentWillMount) ||\n (\"function\" === typeof context.componentWillMount &&\n context.componentWillMount(),\n \"function\" === typeof context.UNSAFE_componentWillMount &&\n context.UNSAFE_componentWillMount()),\n \"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308))\n : (\"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308),\n (workInProgress.memoizedProps = nextProps),\n (workInProgress.memoizedState = oldContext)),\n (context.props = nextProps),\n (context.state = oldContext),\n (context.context = contextType),\n (nextProps = oldProps))\n : (\"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308),\n (nextProps = !1));\n } else {\n context = workInProgress.stateNode;\n cloneUpdateQueue(current, workInProgress);\n contextType = workInProgress.memoizedProps;\n contextType$jscomp$0 = resolveClassComponentProps(Component, contextType);\n context.props = contextType$jscomp$0;\n getDerivedStateFromProps = workInProgress.pendingProps;\n oldState = context.context;\n oldContext = Component.contextType;\n oldProps = emptyContextObject;\n \"object\" === typeof oldContext &&\n null !== oldContext &&\n (oldProps = readContext(oldContext));\n unresolvedOldProps = Component.getDerivedStateFromProps;\n (oldContext =\n \"function\" === typeof unresolvedOldProps ||\n \"function\" === typeof context.getSnapshotBeforeUpdate) ||\n (\"function\" !== typeof context.UNSAFE_componentWillReceiveProps &&\n \"function\" !== typeof context.componentWillReceiveProps) ||\n ((contextType !== getDerivedStateFromProps || oldState !== oldProps) &&\n callComponentWillReceiveProps(\n workInProgress,\n context,\n nextProps,\n oldProps\n ));\n hasForceUpdate = !1;\n oldState = workInProgress.memoizedState;\n context.state = oldState;\n processUpdateQueue(workInProgress, nextProps, context, renderLanes);\n suspendIfUpdateReadFromEntangledAsyncAction();\n var newState = workInProgress.memoizedState;\n contextType !== getDerivedStateFromProps ||\n oldState !== newState ||\n hasForceUpdate ||\n (null !== current &&\n null !== current.dependencies &&\n checkIfContextChanged(current.dependencies))\n ? (\"function\" === typeof unresolvedOldProps &&\n (applyDerivedStateFromProps(\n workInProgress,\n Component,\n unresolvedOldProps,\n nextProps\n ),\n (newState = workInProgress.memoizedState)),\n (contextType$jscomp$0 =\n hasForceUpdate ||\n checkShouldComponentUpdate(\n workInProgress,\n Component,\n contextType$jscomp$0,\n nextProps,\n oldState,\n newState,\n oldProps\n ) ||\n (null !== current &&\n null !== current.dependencies &&\n checkIfContextChanged(current.dependencies)))\n ? (oldContext ||\n (\"function\" !== typeof context.UNSAFE_componentWillUpdate &&\n \"function\" !== typeof context.componentWillUpdate) ||\n (\"function\" === typeof context.componentWillUpdate &&\n context.componentWillUpdate(nextProps, newState, oldProps),\n \"function\" === typeof context.UNSAFE_componentWillUpdate &&\n context.UNSAFE_componentWillUpdate(\n nextProps,\n newState,\n oldProps\n )),\n \"function\" === typeof context.componentDidUpdate &&\n (workInProgress.flags |= 4),\n \"function\" === typeof context.getSnapshotBeforeUpdate &&\n (workInProgress.flags |= 1024))\n : (\"function\" !== typeof context.componentDidUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 4),\n \"function\" !== typeof context.getSnapshotBeforeUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 1024),\n (workInProgress.memoizedProps = nextProps),\n (workInProgress.memoizedState = newState)),\n (context.props = nextProps),\n (context.state = newState),\n (context.context = oldProps),\n (nextProps = contextType$jscomp$0))\n : (\"function\" !== typeof context.componentDidUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 4),\n \"function\" !== typeof context.getSnapshotBeforeUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 1024),\n (nextProps = !1));\n }\n context = nextProps;\n markRef(current, workInProgress);\n nextProps = 0 !== (workInProgress.flags & 128);\n context || nextProps\n ? ((context = workInProgress.stateNode),\n (Component =\n nextProps && \"function\" !== typeof Component.getDerivedStateFromError\n ? null\n : context.render()),\n (workInProgress.flags |= 1),\n null !== current && nextProps\n ? ((workInProgress.child = reconcileChildFibers(\n workInProgress,\n current.child,\n null,\n renderLanes\n )),\n (workInProgress.child = reconcileChildFibers(\n workInProgress,\n null,\n Component,\n renderLanes\n )))\n : reconcileChildren(current, workInProgress, Component, renderLanes),\n (workInProgress.memoizedState = context.state),\n (current = workInProgress.child))\n : (current = bailoutOnAlreadyFinishedWork(\n current,\n workInProgress,\n renderLanes\n ));\n return current;\n}\nfunction mountHostRootWithoutHydrating(\n current,\n workInProgress,\n nextChildren,\n renderLanes\n) {\n resetHydrationState();\n workInProgress.flags |= 256;\n reconcileChildren(current, workInProgress, nextChildren, renderLanes);\n return workInProgress.child;\n}\nvar SUSPENDED_MARKER = {\n dehydrated: null,\n treeContext: null,\n retryLane: 0,\n hydrationErrors: null\n};\nfunction mountSuspenseOffscreenState(renderLanes) {\n return { baseLanes: renderLanes, cachePool: getSuspendedCache() };\n}\nfunction getRemainingWorkInPrimaryTree(\n current,\n primaryTreeDidDefer,\n renderLanes\n) {\n current = null !== current ? current.childLanes & ~renderLanes : 0;\n primaryTreeDidDefer && (current |= workInProgressDeferredLane);\n return current;\n}\nfunction updateSuspenseComponent(current, workInProgress, renderLanes) {\n var nextProps = workInProgress.pendingProps,\n showFallback = !1,\n didSuspend = 0 !== (workInProgress.flags & 128),\n JSCompiler_temp;\n (JSCompiler_temp = didSuspend) ||\n (JSCompiler_temp =\n null !== current && null === current.memoizedState\n ? !1\n : 0 !== (suspenseStackCursor.current & 2));\n JSCompiler_temp && ((showFallback = !0), (workInProgress.flags &= -129));\n JSCompiler_temp = 0 !== (workInProgress.flags & 32);\n workInProgress.flags &= -33;\n if (null === current) {\n if (isHydrating) {\n showFallback\n ? pushPrimaryTreeSuspenseHandler(workInProgress)\n : reuseSuspenseHandlerOnStack(workInProgress);\n (current = nextHydratableInstance)\n ? ((current = canHydrateHydrationBoundary(\n current,\n rootOrSingletonContext\n )),\n (current = null !== current && \"&\" !== current.data ? current : null),\n null !== current &&\n ((workInProgress.memoizedState = {\n dehydrated: current,\n treeContext:\n null !== treeContextProvider\n ? { id: treeContextId, overflow: treeContextOverflow }\n : null,\n retryLane: 536870912,\n hydrationErrors: null\n }),\n (renderLanes = createFiberFromDehydratedFragment(current)),\n (renderLanes.return = workInProgress),\n (workInProgress.child = renderLanes),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = null)))\n : (current = null);\n if (null === current) throw throwOnHydrationMismatch(workInProgress);\n isSuspenseInstanceFallback(current)\n ? (workInProgress.lanes = 32)\n : (workInProgress.lanes = 536870912);\n return null;\n }\n var nextPrimaryChildren = nextProps.children;\n nextProps = nextProps.fallback;\n if (showFallback)\n return (\n reuseSuspenseHandlerOnStack(workInProgress),\n (showFallback = workInProgress.mode),\n (nextPrimaryChildren = mountWorkInProgressOffscreenFiber(\n { mode: \"hidden\", children: nextPrimaryChildren },\n showFallback\n )),\n (nextProps = createFiberFromFragment(\n nextProps,\n showFallback,\n renderLanes,\n null\n )),\n (nextPrimaryChildren.return = workInProgress),\n (nextProps.return = workInProgress),\n (nextPrimaryChildren.sibling = nextProps),\n (workInProgress.child = nextPrimaryChildren),\n (nextProps = workInProgress.child),\n (nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes)),\n (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n current,\n JSCompiler_temp,\n renderLanes\n )),\n (workInProgress.memoizedState = SUSPENDED_MARKER),\n bailoutOffscreenComponent(null, nextProps)\n );\n pushPrimaryTreeSuspenseHandler(workInProgress);\n return mountSuspensePrimaryChildren(workInProgress, nextPrimaryChildren);\n }\n var prevState = current.memoizedState;\n if (\n null !== prevState &&\n ((nextPrimaryChildren = prevState.dehydrated), null !== nextPrimaryChildren)\n ) {\n if (didSuspend)\n workInProgress.flags & 256\n ? (pushPrimaryTreeSuspenseHandler(workInProgress),\n (workInProgress.flags &= -257),\n (workInProgress = retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n )))\n : null !== workInProgress.memoizedState\n ? (reuseSuspenseHandlerOnStack(workInProgress),\n (workInProgress.child = current.child),\n (workInProgress.flags |= 128),\n (workInProgress = null))\n : (reuseSuspenseHandlerOnStack(workInProgress),\n (nextPrimaryChildren = nextProps.fallback),\n (showFallback = workInProgress.mode),\n (nextProps = mountWorkInProgressOffscreenFiber(\n { mode: \"visible\", children: nextProps.children },\n showFallback\n )),\n (nextPrimaryChildren = createFiberFromFragment(\n nextPrimaryChildren,\n showFallback,\n renderLanes,\n null\n )),\n (nextPrimaryChildren.flags |= 2),\n (nextProps.return = workInProgress),\n (nextPrimaryChildren.return = workInProgress),\n (nextProps.sibling = nextPrimaryChildren),\n (workInProgress.child = nextProps),\n reconcileChildFibers(\n workInProgress,\n current.child,\n null,\n renderLanes\n ),\n (nextProps = workInProgress.child),\n (nextProps.memoizedState =\n mountSuspenseOffscreenState(renderLanes)),\n (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n current,\n JSCompiler_temp,\n renderLanes\n )),\n (workInProgress.memoizedState = SUSPENDED_MARKER),\n (workInProgress = bailoutOffscreenComponent(null, nextProps)));\n else if (\n (pushPrimaryTreeSuspenseHandler(workInProgress),\n isSuspenseInstanceFallback(nextPrimaryChildren))\n ) {\n JSCompiler_temp =\n nextPrimaryChildren.nextSibling &&\n nextPrimaryChildren.nextSibling.dataset;\n if (JSCompiler_temp) var digest = JSCompiler_temp.dgst;\n JSCompiler_temp = digest;\n nextProps = Error(formatProdErrorMessage(419));\n nextProps.stack = \"\";\n nextProps.digest = JSCompiler_temp;\n queueHydrationError({ value: nextProps, source: null, stack: null });\n workInProgress = retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n );\n } else if (\n (didReceiveUpdate ||\n propagateParentContextChanges(current, workInProgress, renderLanes, !1),\n (JSCompiler_temp = 0 !== (renderLanes & current.childLanes)),\n didReceiveUpdate || JSCompiler_temp)\n ) {\n JSCompiler_temp = workInProgressRoot;\n if (\n null !== JSCompiler_temp &&\n ((nextProps = getBumpedLaneForHydration(JSCompiler_temp, renderLanes)),\n 0 !== nextProps && nextProps !== prevState.retryLane)\n )\n throw (\n ((prevState.retryLane = nextProps),\n enqueueConcurrentRenderForLane(current, nextProps),\n scheduleUpdateOnFiber(JSCompiler_temp, current, nextProps),\n SelectiveHydrationException)\n );\n isSuspenseInstancePending(nextPrimaryChildren) ||\n renderDidSuspendDelayIfPossible();\n workInProgress = retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n );\n } else\n isSuspenseInstancePending(nextPrimaryChildren)\n ? ((workInProgress.flags |= 192),\n (workInProgress.child = current.child),\n (workInProgress = null))\n : ((current = prevState.treeContext),\n (nextHydratableInstance = getNextHydratable(\n nextPrimaryChildren.nextSibling\n )),\n (hydrationParentFiber = workInProgress),\n (isHydrating = !0),\n (hydrationErrors = null),\n (rootOrSingletonContext = !1),\n null !== current &&\n restoreSuspendedTreeContext(workInProgress, current),\n (workInProgress = mountSuspensePrimaryChildren(\n workInProgress,\n nextProps.children\n )),\n (workInProgress.flags |= 4096));\n return workInProgress;\n }\n if (showFallback)\n return (\n reuseSuspenseHandlerOnStack(workInProgress),\n (nextPrimaryChildren = nextProps.fallback),\n (showFallback = workInProgress.mode),\n (prevState = current.child),\n (digest = prevState.sibling),\n (nextProps = createWorkInProgress(prevState, {\n mode: \"hidden\",\n children: nextProps.children\n })),\n (nextProps.subtreeFlags = prevState.subtreeFlags & 65011712),\n null !== digest\n ? (nextPrimaryChildren = createWorkInProgress(\n digest,\n nextPrimaryChildren\n ))\n : ((nextPrimaryChildren = createFiberFromFragment(\n nextPrimaryChildren,\n showFallback,\n renderLanes,\n null\n )),\n (nextPrimaryChildren.flags |= 2)),\n (nextPrimaryChildren.return = workInProgress),\n (nextProps.return = workInProgress),\n (nextProps.sibling = nextPrimaryChildren),\n (workInProgress.child = nextProps),\n bailoutOffscreenComponent(null, nextProps),\n (nextProps = workInProgress.child),\n (nextPrimaryChildren = current.child.memoizedState),\n null === nextPrimaryChildren\n ? (nextPrimaryChildren = mountSuspenseOffscreenState(renderLanes))\n : ((showFallback = nextPrimaryChildren.cachePool),\n null !== showFallback\n ? ((prevState = CacheContext._currentValue),\n (showFallback =\n showFallback.parent !== prevState\n ? { parent: prevState, pool: prevState }\n : showFallback))\n : (showFallback = getSuspendedCache()),\n (nextPrimaryChildren = {\n baseLanes: nextPrimaryChildren.baseLanes | renderLanes,\n cachePool: showFallback\n })),\n (nextProps.memoizedState = nextPrimaryChildren),\n (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n current,\n JSCompiler_temp,\n renderLanes\n )),\n (workInProgress.memoizedState = SUSPENDED_MARKER),\n bailoutOffscreenComponent(current.child, nextProps)\n );\n pushPrimaryTreeSuspenseHandler(workInProgress);\n renderLanes = current.child;\n current = renderLanes.sibling;\n renderLanes = createWorkInProgress(renderLanes, {\n mode: \"visible\",\n children: nextProps.children\n });\n renderLanes.return = workInProgress;\n renderLanes.sibling = null;\n null !== current &&\n ((JSCompiler_temp = workInProgress.deletions),\n null === JSCompiler_temp\n ? ((workInProgress.deletions = [current]), (workInProgress.flags |= 16))\n : JSCompiler_temp.push(current));\n workInProgress.child = renderLanes;\n workInProgress.memoizedState = null;\n return renderLanes;\n}\nfunction mountSuspensePrimaryChildren(workInProgress, primaryChildren) {\n primaryChildren = mountWorkInProgressOffscreenFiber(\n { mode: \"visible\", children: primaryChildren },\n workInProgress.mode\n );\n primaryChildren.return = workInProgress;\n return (workInProgress.child = primaryChildren);\n}\nfunction mountWorkInProgressOffscreenFiber(offscreenProps, mode) {\n offscreenProps = createFiberImplClass(22, offscreenProps, null, mode);\n offscreenProps.lanes = 0;\n return offscreenProps;\n}\nfunction retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n) {\n reconcileChildFibers(workInProgress, current.child, null, renderLanes);\n current = mountSuspensePrimaryChildren(\n workInProgress,\n workInProgress.pendingProps.children\n );\n current.flags |= 2;\n workInProgress.memoizedState = null;\n return current;\n}\nfunction scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) {\n fiber.lanes |= renderLanes;\n var alternate = fiber.alternate;\n null !== alternate && (alternate.lanes |= renderLanes);\n scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot);\n}\nfunction initSuspenseListRenderState(\n workInProgress,\n isBackwards,\n tail,\n lastContentRow,\n tailMode,\n treeForkCount\n) {\n var renderState = workInProgress.memoizedState;\n null === renderState\n ? (workInProgress.memoizedState = {\n isBackwards: isBackwards,\n rendering: null,\n renderingStartTime: 0,\n last: lastContentRow,\n tail: tail,\n tailMode: tailMode,\n treeForkCount: treeForkCount\n })\n : ((renderState.isBackwards = isBackwards),\n (renderState.rendering = null),\n (renderState.renderingStartTime = 0),\n (renderState.last = lastContentRow),\n (renderState.tail = tail),\n (renderState.tailMode = tailMode),\n (renderState.treeForkCount = treeForkCount));\n}\nfunction updateSuspenseListComponent(current, workInProgress, renderLanes) {\n var nextProps = workInProgress.pendingProps,\n revealOrder = nextProps.revealOrder,\n tailMode = nextProps.tail;\n nextProps = nextProps.children;\n var suspenseContext = suspenseStackCursor.current,\n shouldForceFallback = 0 !== (suspenseContext & 2);\n shouldForceFallback\n ? ((suspenseContext = (suspenseContext & 1) | 2),\n (workInProgress.flags |= 128))\n : (suspenseContext &= 1);\n push(suspenseStackCursor, suspenseContext);\n reconcileChildren(current, workInProgress, nextProps, renderLanes);\n nextProps = isHydrating ? treeForkCount : 0;\n if (!shouldForceFallback && null !== current && 0 !== (current.flags & 128))\n a: for (current = workInProgress.child; null !== current; ) {\n if (13 === current.tag)\n null !== current.memoizedState &&\n scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);\n else if (19 === current.tag)\n scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);\n else if (null !== current.child) {\n current.child.return = current;\n current = current.child;\n continue;\n }\n if (current === workInProgress) break a;\n for (; null === current.sibling; ) {\n if (null === current.return || current.return === workInProgress)\n break a;\n current = current.return;\n }\n current.sibling.return = current.return;\n current = current.sibling;\n }\n switch (revealOrder) {\n case \"forwards\":\n renderLanes = workInProgress.child;\n for (revealOrder = null; null !== renderLanes; )\n (current = renderLanes.alternate),\n null !== current &&\n null === findFirstSuspended(current) &&\n (revealOrder = renderLanes),\n (renderLanes = renderLanes.sibling);\n renderLanes = revealOrder;\n null === renderLanes\n ? ((revealOrder = workInProgress.child), (workInProgress.child = null))\n : ((revealOrder = renderLanes.sibling), (renderLanes.sibling = null));\n initSuspenseListRenderState(\n workInProgress,\n !1,\n revealOrder,\n renderLanes,\n tailMode,\n nextProps\n );\n break;\n case \"backwards\":\n case \"unstable_legacy-backwards\":\n renderLanes = null;\n revealOrder = workInProgress.child;\n for (workInProgress.child = null; null !== revealOrder; ) {\n current = revealOrder.alternate;\n if (null !== current && null === findFirstSuspended(current)) {\n workInProgress.child = revealOrder;\n break;\n }\n current = revealOrder.sibling;\n revealOrder.sibling = renderLanes;\n renderLanes = revealOrder;\n revealOrder = current;\n }\n initSuspenseListRenderState(\n workInProgress,\n !0,\n renderLanes,\n null,\n tailMode,\n nextProps\n );\n break;\n case \"together\":\n initSuspenseListRenderState(\n workInProgress,\n !1,\n null,\n null,\n void 0,\n nextProps\n );\n break;\n default:\n workInProgress.memoizedState = null;\n }\n return workInProgress.child;\n}\nfunction bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) {\n null !== current && (workInProgress.dependencies = current.dependencies);\n workInProgressRootSkippedLanes |= workInProgress.lanes;\n if (0 === (renderLanes & workInProgress.childLanes))\n if (null !== current) {\n if (\n (propagateParentContextChanges(\n current,\n workInProgress,\n renderLanes,\n !1\n ),\n 0 === (renderLanes & workInProgress.childLanes))\n )\n return null;\n } else return null;\n if (null !== current && workInProgress.child !== current.child)\n throw Error(formatProdErrorMessage(153));\n if (null !== workInProgress.child) {\n current = workInProgress.child;\n renderLanes = createWorkInProgress(current, current.pendingProps);\n workInProgress.child = renderLanes;\n for (renderLanes.return = workInProgress; null !== current.sibling; )\n (current = current.sibling),\n (renderLanes = renderLanes.sibling =\n createWorkInProgress(current, current.pendingProps)),\n (renderLanes.return = workInProgress);\n renderLanes.sibling = null;\n }\n return workInProgress.child;\n}\nfunction checkScheduledUpdateOrContext(current, renderLanes) {\n if (0 !== (current.lanes & renderLanes)) return !0;\n current = current.dependencies;\n return null !== current && checkIfContextChanged(current) ? !0 : !1;\n}\nfunction attemptEarlyBailoutIfNoScheduledUpdate(\n current,\n workInProgress,\n renderLanes\n) {\n switch (workInProgress.tag) {\n case 3:\n pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n pushProvider(workInProgress, CacheContext, current.memoizedState.cache);\n resetHydrationState();\n break;\n case 27:\n case 5:\n pushHostContext(workInProgress);\n break;\n case 4:\n pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n break;\n case 10:\n pushProvider(\n workInProgress,\n workInProgress.type,\n workInProgress.memoizedProps.value\n );\n break;\n case 31:\n if (null !== workInProgress.memoizedState)\n return (\n (workInProgress.flags |= 128),\n pushDehydratedActivitySuspenseHandler(workInProgress),\n null\n );\n break;\n case 13:\n var state$102 = workInProgress.memoizedState;\n if (null !== state$102) {\n if (null !== state$102.dehydrated)\n return (\n pushPrimaryTreeSuspenseHandler(workInProgress),\n (workInProgress.flags |= 128),\n null\n );\n if (0 !== (renderLanes & workInProgress.child.childLanes))\n return updateSuspenseComponent(current, workInProgress, renderLanes);\n pushPrimaryTreeSuspenseHandler(workInProgress);\n current = bailoutOnAlreadyFinishedWork(\n current,\n workInProgress,\n renderLanes\n );\n return null !== current ? current.sibling : null;\n }\n pushPrimaryTreeSuspenseHandler(workInProgress);\n break;\n case 19:\n var didSuspendBefore = 0 !== (current.flags & 128);\n state$102 = 0 !== (renderLanes & workInProgress.childLanes);\n state$102 ||\n (propagateParentContextChanges(\n current,\n workInProgress,\n renderLanes,\n !1\n ),\n (state$102 = 0 !== (renderLanes & workInProgress.childLanes)));\n if (didSuspendBefore) {\n if (state$102)\n return updateSuspenseListComponent(\n current,\n workInProgress,\n renderLanes\n );\n workInProgress.flags |= 128;\n }\n didSuspendBefore = workInProgress.memoizedState;\n null !== didSuspendBefore &&\n ((didSuspendBefore.rendering = null),\n (didSuspendBefore.tail = null),\n (didSuspendBefore.lastEffect = null));\n push(suspenseStackCursor, suspenseStackCursor.current);\n if (state$102) break;\n else return null;\n case 22:\n return (\n (workInProgress.lanes = 0),\n updateOffscreenComponent(\n current,\n workInProgress,\n renderLanes,\n workInProgress.pendingProps\n )\n );\n case 24:\n pushProvider(workInProgress, CacheContext, current.memoizedState.cache);\n }\n return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);\n}\nfunction beginWork(current, workInProgress, renderLanes) {\n if (null !== current)\n if (current.memoizedProps !== workInProgress.pendingProps)\n didReceiveUpdate = !0;\n else {\n if (\n !checkScheduledUpdateOrContext(current, renderLanes) &&\n 0 === (workInProgress.flags & 128)\n )\n return (\n (didReceiveUpdate = !1),\n attemptEarlyBailoutIfNoScheduledUpdate(\n current,\n workInProgress,\n renderLanes\n )\n );\n didReceiveUpdate = 0 !== (current.flags & 131072) ? !0 : !1;\n }\n else\n (didReceiveUpdate = !1),\n isHydrating &&\n 0 !== (workInProgress.flags & 1048576) &&\n pushTreeId(workInProgress, treeForkCount, workInProgress.index);\n workInProgress.lanes = 0;\n switch (workInProgress.tag) {\n case 16:\n a: {\n var props = workInProgress.pendingProps;\n current = resolveLazy(workInProgress.elementType);\n workInProgress.type = current;\n if (\"function\" === typeof current)\n shouldConstruct(current)\n ? ((props = resolveClassComponentProps(current, props)),\n (workInProgress.tag = 1),\n (workInProgress = updateClassComponent(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n )))\n : ((workInProgress.tag = 0),\n (workInProgress = updateFunctionComponent(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n )));\n else {\n if (void 0 !== current && null !== current) {\n var $$typeof = current.$$typeof;\n if ($$typeof === REACT_FORWARD_REF_TYPE) {\n workInProgress.tag = 11;\n workInProgress = updateForwardRef(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n );\n break a;\n } else if ($$typeof === REACT_MEMO_TYPE) {\n workInProgress.tag = 14;\n workInProgress = updateMemoComponent(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n );\n break a;\n }\n }\n workInProgress = getComponentNameFromType(current) || current;\n throw Error(formatProdErrorMessage(306, workInProgress, \"\"));\n }\n }\n return workInProgress;\n case 0:\n return updateFunctionComponent(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 1:\n return (\n (props = workInProgress.type),\n ($$typeof = resolveClassComponentProps(\n props,\n workInProgress.pendingProps\n )),\n updateClassComponent(\n current,\n workInProgress,\n props,\n $$typeof,\n renderLanes\n )\n );\n case 3:\n a: {\n pushHostContainer(\n workInProgress,\n workInProgress.stateNode.containerInfo\n );\n if (null === current) throw Error(formatProdErrorMessage(387));\n props = workInProgress.pendingProps;\n var prevState = workInProgress.memoizedState;\n $$typeof = prevState.element;\n cloneUpdateQueue(current, workInProgress);\n processUpdateQueue(workInProgress, props, null, renderLanes);\n var nextState = workInProgress.memoizedState;\n props = nextState.cache;\n pushProvider(workInProgress, CacheContext, props);\n props !== prevState.cache &&\n propagateContextChanges(\n workInProgress,\n [CacheContext],\n renderLanes,\n !0\n );\n suspendIfUpdateReadFromEntangledAsyncAction();\n props = nextState.element;\n if (prevState.isDehydrated)\n if (\n ((prevState = {\n element: props,\n isDehydrated: !1,\n cache: nextState.cache\n }),\n (workInProgress.updateQueue.baseState = prevState),\n (workInProgress.memoizedState = prevState),\n workInProgress.flags & 256)\n ) {\n workInProgress = mountHostRootWithoutHydrating(\n current,\n workInProgress,\n props,\n renderLanes\n );\n break a;\n } else if (props !== $$typeof) {\n $$typeof = createCapturedValueAtFiber(\n Error(formatProdErrorMessage(424)),\n workInProgress\n );\n queueHydrationError($$typeof);\n workInProgress = mountHostRootWithoutHydrating(\n current,\n workInProgress,\n props,\n renderLanes\n );\n break a;\n } else {\n current = workInProgress.stateNode.containerInfo;\n switch (current.nodeType) {\n case 9:\n current = current.body;\n break;\n default:\n current =\n \"HTML\" === current.nodeName\n ? current.ownerDocument.body\n : current;\n }\n nextHydratableInstance = getNextHydratable(current.firstChild);\n hydrationParentFiber = workInProgress;\n isHydrating = !0;\n hydrationErrors = null;\n rootOrSingletonContext = !0;\n renderLanes = mountChildFibers(\n workInProgress,\n null,\n props,\n renderLanes\n );\n for (workInProgress.child = renderLanes; renderLanes; )\n (renderLanes.flags = (renderLanes.flags & -3) | 4096),\n (renderLanes = renderLanes.sibling);\n }\n else {\n resetHydrationState();\n if (props === $$typeof) {\n workInProgress = bailoutOnAlreadyFinishedWork(\n current,\n workInProgress,\n renderLanes\n );\n break a;\n }\n reconcileChildren(current, workInProgress, props, renderLanes);\n }\n workInProgress = workInProgress.child;\n }\n return workInProgress;\n case 26:\n return (\n markRef(current, workInProgress),\n null === current\n ? (renderLanes = getResource(\n workInProgress.type,\n null,\n workInProgress.pendingProps,\n null\n ))\n ? (workInProgress.memoizedState = renderLanes)\n : isHydrating ||\n ((renderLanes = workInProgress.type),\n (current = workInProgress.pendingProps),\n (props = getOwnerDocumentFromRootContainer(\n rootInstanceStackCursor.current\n ).createElement(renderLanes)),\n (props[internalInstanceKey] = workInProgress),\n (props[internalPropsKey] = current),\n setInitialProperties(props, renderLanes, current),\n markNodeAsHoistable(props),\n (workInProgress.stateNode = props))\n : (workInProgress.memoizedState = getResource(\n workInProgress.type,\n current.memoizedProps,\n workInProgress.pendingProps,\n current.memoizedState\n )),\n null\n );\n case 27:\n return (\n pushHostContext(workInProgress),\n null === current &&\n isHydrating &&\n ((props = workInProgress.stateNode =\n resolveSingletonInstance(\n workInProgress.type,\n workInProgress.pendingProps,\n rootInstanceStackCursor.current\n )),\n (hydrationParentFiber = workInProgress),\n (rootOrSingletonContext = !0),\n ($$typeof = nextHydratableInstance),\n isSingletonScope(workInProgress.type)\n ? ((previousHydratableOnEnteringScopedSingleton = $$typeof),\n (nextHydratableInstance = getNextHydratable(props.firstChild)))\n : (nextHydratableInstance = $$typeof)),\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n markRef(current, workInProgress),\n null === current && (workInProgress.flags |= 4194304),\n workInProgress.child\n );\n case 5:\n if (null === current && isHydrating) {\n if (($$typeof = props = nextHydratableInstance))\n (props = canHydrateInstance(\n props,\n workInProgress.type,\n workInProgress.pendingProps,\n rootOrSingletonContext\n )),\n null !== props\n ? ((workInProgress.stateNode = props),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = getNextHydratable(props.firstChild)),\n (rootOrSingletonContext = !1),\n ($$typeof = !0))\n : ($$typeof = !1);\n $$typeof || throwOnHydrationMismatch(workInProgress);\n }\n pushHostContext(workInProgress);\n $$typeof = workInProgress.type;\n prevState = workInProgress.pendingProps;\n nextState = null !== current ? current.memoizedProps : null;\n props = prevState.children;\n shouldSetTextContent($$typeof, prevState)\n ? (props = null)\n : null !== nextState &&\n shouldSetTextContent($$typeof, nextState) &&\n (workInProgress.flags |= 32);\n null !== workInProgress.memoizedState &&\n (($$typeof = renderWithHooks(\n current,\n workInProgress,\n TransitionAwareHostComponent,\n null,\n null,\n renderLanes\n )),\n (HostTransitionContext._currentValue = $$typeof));\n markRef(current, workInProgress);\n reconcileChildren(current, workInProgress, props, renderLanes);\n return workInProgress.child;\n case 6:\n if (null === current && isHydrating) {\n if ((current = renderLanes = nextHydratableInstance))\n (renderLanes = canHydrateTextInstance(\n renderLanes,\n workInProgress.pendingProps,\n rootOrSingletonContext\n )),\n null !== renderLanes\n ? ((workInProgress.stateNode = renderLanes),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = null),\n (current = !0))\n : (current = !1);\n current || throwOnHydrationMismatch(workInProgress);\n }\n return null;\n case 13:\n return updateSuspenseComponent(current, workInProgress, renderLanes);\n case 4:\n return (\n pushHostContainer(\n workInProgress,\n workInProgress.stateNode.containerInfo\n ),\n (props = workInProgress.pendingProps),\n null === current\n ? (workInProgress.child = reconcileChildFibers(\n workInProgress,\n null,\n props,\n renderLanes\n ))\n : reconcileChildren(current, workInProgress, props, renderLanes),\n workInProgress.child\n );\n case 11:\n return updateForwardRef(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 7:\n return (\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps,\n renderLanes\n ),\n workInProgress.child\n );\n case 8:\n return (\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n workInProgress.child\n );\n case 12:\n return (\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n workInProgress.child\n );\n case 10:\n return (\n (props = workInProgress.pendingProps),\n pushProvider(workInProgress, workInProgress.type, props.value),\n reconcileChildren(current, workInProgress, props.children, renderLanes),\n workInProgress.child\n );\n case 9:\n return (\n ($$typeof = workInProgress.type._context),\n (props = workInProgress.pendingProps.children),\n prepareToReadContext(workInProgress),\n ($$typeof = readContext($$typeof)),\n (props = props($$typeof)),\n (workInProgress.flags |= 1),\n reconcileChildren(current, workInProgress, props, renderLanes),\n workInProgress.child\n );\n case 14:\n return updateMemoComponent(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 15:\n return updateSimpleMemoComponent(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 19:\n return updateSuspenseListComponent(current, workInProgress, renderLanes);\n case 31:\n return updateActivityComponent(current, workInProgress, renderLanes);\n case 22:\n return updateOffscreenComponent(\n current,\n workInProgress,\n renderLanes,\n workInProgress.pendingProps\n );\n case 24:\n return (\n prepareToReadContext(workInProgress),\n (props = readContext(CacheContext)),\n null === current\n ? (($$typeof = peekCacheFromPool()),\n null === $$typeof &&\n (($$typeof = workInProgressRoot),\n (prevState = createCache()),\n ($$typeof.pooledCache = prevState),\n prevState.refCount++,\n null !== prevState && ($$typeof.pooledCacheLanes |= renderLanes),\n ($$typeof = prevState)),\n (workInProgress.memoizedState = { parent: props, cache: $$typeof }),\n initializeUpdateQueue(workInProgress),\n pushProvider(workInProgress, CacheContext, $$typeof))\n : (0 !== (current.lanes & renderLanes) &&\n (cloneUpdateQueue(current, workInProgress),\n processUpdateQueue(workInProgress, null, null, renderLanes),\n suspendIfUpdateReadFromEntangledAsyncAction()),\n ($$typeof = current.memoizedState),\n (prevState = workInProgress.memoizedState),\n $$typeof.parent !== props\n ? (($$typeof = { parent: props, cache: props }),\n (workInProgress.memoizedState = $$typeof),\n 0 === workInProgress.lanes &&\n (workInProgress.memoizedState =\n workInProgress.updateQueue.baseState =\n $$typeof),\n pushProvider(workInProgress, CacheContext, props))\n : ((props = prevState.cache),\n pushProvider(workInProgress, CacheContext, props),\n props !== $$typeof.cache &&\n propagateContextChanges(\n workInProgress,\n [CacheContext],\n renderLanes,\n !0\n ))),\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n workInProgress.child\n );\n case 29:\n throw workInProgress.pendingProps;\n }\n throw Error(formatProdErrorMessage(156, workInProgress.tag));\n}\nfunction markUpdate(workInProgress) {\n workInProgress.flags |= 4;\n}\nfunction preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n type,\n oldProps,\n newProps,\n renderLanes\n) {\n if ((type = 0 !== (workInProgress.mode & 32))) type = !1;\n if (type) {\n if (\n ((workInProgress.flags |= 16777216),\n (renderLanes & 335544128) === renderLanes)\n )\n if (workInProgress.stateNode.complete) workInProgress.flags |= 8192;\n else if (shouldRemainOnPreviousScreen()) workInProgress.flags |= 8192;\n else\n throw (\n ((suspendedThenable = noopSuspenseyCommitThenable),\n SuspenseyCommitException)\n );\n } else workInProgress.flags &= -16777217;\n}\nfunction preloadResourceAndSuspendIfNeeded(workInProgress, resource) {\n if (\"stylesheet\" !== resource.type || 0 !== (resource.state.loading & 4))\n workInProgress.flags &= -16777217;\n else if (((workInProgress.flags |= 16777216), !preloadResource(resource)))\n if (shouldRemainOnPreviousScreen()) workInProgress.flags |= 8192;\n else\n throw (\n ((suspendedThenable = noopSuspenseyCommitThenable),\n SuspenseyCommitException)\n );\n}\nfunction scheduleRetryEffect(workInProgress, retryQueue) {\n null !== retryQueue && (workInProgress.flags |= 4);\n workInProgress.flags & 16384 &&\n ((retryQueue =\n 22 !== workInProgress.tag ? claimNextRetryLane() : 536870912),\n (workInProgress.lanes |= retryQueue),\n (workInProgressSuspendedRetryLanes |= retryQueue));\n}\nfunction cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {\n if (!isHydrating)\n switch (renderState.tailMode) {\n case \"hidden\":\n hasRenderedATailFallback = renderState.tail;\n for (var lastTailNode = null; null !== hasRenderedATailFallback; )\n null !== hasRenderedATailFallback.alternate &&\n (lastTailNode = hasRenderedATailFallback),\n (hasRenderedATailFallback = hasRenderedATailFallback.sibling);\n null === lastTailNode\n ? (renderState.tail = null)\n : (lastTailNode.sibling = null);\n break;\n case \"collapsed\":\n lastTailNode = renderState.tail;\n for (var lastTailNode$106 = null; null !== lastTailNode; )\n null !== lastTailNode.alternate && (lastTailNode$106 = lastTailNode),\n (lastTailNode = lastTailNode.sibling);\n null === lastTailNode$106\n ? hasRenderedATailFallback || null === renderState.tail\n ? (renderState.tail = null)\n : (renderState.tail.sibling = null)\n : (lastTailNode$106.sibling = null);\n }\n}\nfunction bubbleProperties(completedWork) {\n var didBailout =\n null !== completedWork.alternate &&\n completedWork.alternate.child === completedWork.child,\n newChildLanes = 0,\n subtreeFlags = 0;\n if (didBailout)\n for (var child$107 = completedWork.child; null !== child$107; )\n (newChildLanes |= child$107.lanes | child$107.childLanes),\n (subtreeFlags |= child$107.subtreeFlags & 65011712),\n (subtreeFlags |= child$107.flags & 65011712),\n (child$107.return = completedWork),\n (child$107 = child$107.sibling);\n else\n for (child$107 = completedWork.child; null !== child$107; )\n (newChildLanes |= child$107.lanes | child$107.childLanes),\n (subtreeFlags |= child$107.subtreeFlags),\n (subtreeFlags |= child$107.flags),\n (child$107.return = completedWork),\n (child$107 = child$107.sibling);\n completedWork.subtreeFlags |= subtreeFlags;\n completedWork.childLanes = newChildLanes;\n return didBailout;\n}\nfunction completeWork(current, workInProgress, renderLanes) {\n var newProps = workInProgress.pendingProps;\n popTreeContext(workInProgress);\n switch (workInProgress.tag) {\n case 16:\n case 15:\n case 0:\n case 11:\n case 7:\n case 8:\n case 12:\n case 9:\n case 14:\n return bubbleProperties(workInProgress), null;\n case 1:\n return bubbleProperties(workInProgress), null;\n case 3:\n renderLanes = workInProgress.stateNode;\n newProps = null;\n null !== current && (newProps = current.memoizedState.cache);\n workInProgress.memoizedState.cache !== newProps &&\n (workInProgress.flags |= 2048);\n popProvider(CacheContext);\n popHostContainer();\n renderLanes.pendingContext &&\n ((renderLanes.context = renderLanes.pendingContext),\n (renderLanes.pendingContext = null));\n if (null === current || null === current.child)\n popHydrationState(workInProgress)\n ? markUpdate(workInProgress)\n : null === current ||\n (current.memoizedState.isDehydrated &&\n 0 === (workInProgress.flags & 256)) ||\n ((workInProgress.flags |= 1024),\n upgradeHydrationErrorsToRecoverable());\n bubbleProperties(workInProgress);\n return null;\n case 26:\n var type = workInProgress.type,\n nextResource = workInProgress.memoizedState;\n null === current\n ? (markUpdate(workInProgress),\n null !== nextResource\n ? (bubbleProperties(workInProgress),\n preloadResourceAndSuspendIfNeeded(workInProgress, nextResource))\n : (bubbleProperties(workInProgress),\n preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n type,\n null,\n newProps,\n renderLanes\n )))\n : nextResource\n ? nextResource !== current.memoizedState\n ? (markUpdate(workInProgress),\n bubbleProperties(workInProgress),\n preloadResourceAndSuspendIfNeeded(workInProgress, nextResource))\n : (bubbleProperties(workInProgress),\n (workInProgress.flags &= -16777217))\n : ((current = current.memoizedProps),\n current !== newProps && markUpdate(workInProgress),\n bubbleProperties(workInProgress),\n preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n type,\n current,\n newProps,\n renderLanes\n ));\n return null;\n case 27:\n popHostContext(workInProgress);\n renderLanes = rootInstanceStackCursor.current;\n type = workInProgress.type;\n if (null !== current && null != workInProgress.stateNode)\n current.memoizedProps !== newProps && markUpdate(workInProgress);\n else {\n if (!newProps) {\n if (null === workInProgress.stateNode)\n throw Error(formatProdErrorMessage(166));\n bubbleProperties(workInProgress);\n return null;\n }\n current = contextStackCursor.current;\n popHydrationState(workInProgress)\n ? prepareToHydrateHostInstance(workInProgress, current)\n : ((current = resolveSingletonInstance(type, newProps, renderLanes)),\n (workInProgress.stateNode = current),\n markUpdate(workInProgress));\n }\n bubbleProperties(workInProgress);\n return null;\n case 5:\n popHostContext(workInProgress);\n type = workInProgress.type;\n if (null !== current && null != workInProgress.stateNode)\n current.memoizedProps !== newProps && markUpdate(workInProgress);\n else {\n if (!newProps) {\n if (null === workInProgress.stateNode)\n throw Error(formatProdErrorMessage(166));\n bubbleProperties(workInProgress);\n return null;\n }\n nextResource = contextStackCursor.current;\n if (popHydrationState(workInProgress))\n prepareToHydrateHostInstance(workInProgress, nextResource);\n else {\n var ownerDocument = getOwnerDocumentFromRootContainer(\n rootInstanceStackCursor.current\n );\n switch (nextResource) {\n case 1:\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/2000/svg\",\n type\n );\n break;\n case 2:\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/1998/Math/MathML\",\n type\n );\n break;\n default:\n switch (type) {\n case \"svg\":\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/2000/svg\",\n type\n );\n break;\n case \"math\":\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/1998/Math/MathML\",\n type\n );\n break;\n case \"script\":\n nextResource = ownerDocument.createElement(\"div\");\n nextResource.innerHTML = \" - + +
+ diff --git a/web/index.html b/web/index.html deleted file mode 100644 index 119eace..0000000 --- a/web/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - Codex Provider Sync - - -
- - - diff --git a/web/src/App.jsx b/web/src/App.jsx deleted file mode 100644 index c9165d0..0000000 --- a/web/src/App.jsx +++ /dev/null @@ -1,1111 +0,0 @@ -import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; - -import { - PairingRequiredError, - ProfileRevisionError, - apiRequest, - forgetThisBrowser, - getActivity, - getHistory, - getHistorySession, - getProfiles, - initializeAccess -} from "./api.js"; -import { usePersistentState } from "./hooks.js"; -import { createLatestRequestGate, scheduleDebounced } from "./history-requests.js"; -import { captureProfileOperation, dedupeHistorySessions, operationToast, resolveRestoreTargetSqliteHome, restoreRelocationState } from "./operation-state.js"; -import { createProfileRefresh, storagePayload } from "./profile-refresh.js"; -import { - ActivityIcon, - AlertIcon, - CheckIcon, - ChevronIcon, - DatabaseIcon, - FolderIcon, - HistoryIcon, - OverviewIcon, - RefreshIcon, - ShieldIcon, - XIcon -} from "./icons.jsx"; - -const NAV_ITEMS = [ - { id: "overview", label: "概览", icon: OverviewIcon }, - { id: "history", label: "聊天记录", icon: HistoryIcon }, - { id: "backups", label: "备份", icon: HistoryIcon }, - { id: "activity", label: "活动", icon: ActivityIcon } -]; - -const EMPTY_BACKUPS = { backupRoot: "", backups: [] }; - -function formatNumber(value) { - return new Intl.NumberFormat("zh-CN").format(Number(value) || 0); -} - -function formatBytes(bytes) { - const units = ["B", "KB", "MB", "GB", "TB"]; - let value = Number(bytes) || 0; - let index = 0; - while (value >= 1024 && index < units.length - 1) { - value /= 1024; - index += 1; - } - return index === 0 ? `${value} B` : `${value.toFixed(value >= 10 ? 1 : 2).replace(/\.0$/, "")} ${units[index]}`; -} - -function formatDate(value) { - if (!value) return "未知时间"; - return new Intl.DateTimeFormat("zh-CN", { - month: "2-digit", - day: "2-digit", - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - hour12: false - }).format(new Date(value)); -} - -function renderInlineMarkdown(text, keyPrefix) { - const parts = text.split(/(`[^`]+`|\*\*[^*]+\*\*|\*[^*]+\*)/g); - return parts.map((part, index) => { - if (part.startsWith("`") && part.endsWith("`")) return {part.slice(1, -1)}; - if (part.startsWith("**") && part.endsWith("**")) return {part.slice(2, -2)}; - if (part.startsWith("*") && part.endsWith("*")) return {part.slice(1, -1)}; - return {part}; - }); -} - -function SafeMarkdown({ text }) { - const blocks = String(text ?? "").split(/(```[^\n]*\n[\s\S]*?```)/g); - return blocks.map((block, index) => { - if (block.startsWith("```") && block.endsWith("```")) { - const lines = block.slice(3, -3).replace(/^\w*\n/, ""); - return
{lines}
; - } - return block.split("\n").map((line, lineIndex, lines) => {renderInlineMarkdown(line, `${index}-${lineIndex}`)}{lineIndex < lines.length - 1 ?
: null}
); - }); -} - -function providersFromStatus(status) { - if (!status) return []; - const sources = new Map(); - const add = (values, source) => { - for (const value of values ?? []) { - if (!value || value === "(missing)") continue; - const bucket = sources.get(value) ?? new Set(); - bucket.add(source); - sources.set(value, bucket); - } - }; - add(status.configuredProviders, "config"); - add(Object.keys(status.rolloutCounts?.sessions ?? {}), "rollout"); - add(Object.keys(status.rolloutCounts?.archived_sessions ?? {}), "rollout"); - add(Object.keys(status.sqliteCounts?.sessions ?? {}), "sqlite"); - add(Object.keys(status.sqliteCounts?.archived_sessions ?? {}), "sqlite"); - add([status.currentProvider], "config"); - return [...sources.entries()] - .map(([id, providerSources]) => ({ - id, - sources: [...providerSources], - configured: status.configuredProviders?.includes(id), - current: id === status.currentProvider - })) - .sort((left, right) => Number(right.current) - Number(left.current) || left.id.localeCompare(right.id)); -} - -function StatusDot({ tone = "neutral" }) { - return