@covro/covro 0.2.0 → 0.2.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -3
- package/README.zh-CN.md +10 -3
- package/dist/codex/adapter.js +8 -1
- package/dist/codex/adapter.js.map +2 -2
- package/dist/drizzle/0005_session_workspaces.sql +24 -0
- package/dist/drizzle/meta/0005_snapshot.json +480 -0
- package/dist/drizzle/meta/_journal.json +7 -0
- package/dist/server/db/operations.js +14 -1
- package/dist/server/db/operations.js.map +2 -2
- package/dist/server/db/schema.js +9 -1
- package/dist/server/db/schema.js.map +2 -2
- package/dist/server/http.js +25 -0
- package/dist/server/http.js.map +2 -2
- package/dist/server/local-files.js +2 -2
- package/dist/server/local-files.js.map +2 -2
- package/dist/server/main.js +1 -0
- package/dist/server/main.js.map +2 -2
- package/dist/server/service.js +96 -51
- package/dist/server/service.js.map +2 -2
- package/dist/server/workspaces.js +138 -0
- package/dist/server/workspaces.js.map +7 -0
- package/dist/shared/workspace-scope.js +9 -0
- package/dist/shared/workspace-scope.js.map +7 -0
- package/dist/web/assets/abnfDiagram-WEYOIA3C-B3om3w2y.js +1 -0
- package/dist/web/assets/arc-hdxlL3Om.js +1 -0
- package/dist/web/assets/architecture-WOLXFQ4H-FZOiLQD-.js +1 -0
- package/dist/web/assets/architectureDiagram-ZHVYKT53-DjatMTKS.js +36 -0
- package/dist/web/assets/array-BifhSqXX.js +1 -0
- package/dist/web/assets/blockDiagram-RJAE7QA3-Bu6LTv0p.js +140 -0
- package/dist/web/assets/c4Diagram-XDPPPE54-BGFHYP5H.js +38 -0
- package/dist/web/assets/channel-DmN_FTbE.js +1 -0
- package/dist/web/assets/chunk-2E7WHVMD-k8528aQZ.js +88 -0
- package/dist/web/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web/assets/chunk-4EMNKR2T-CCkntZuJ.js +1 -0
- package/dist/web/assets/chunk-55XCU76K-Br-Kelsg.js +1 -0
- package/dist/web/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web/assets/chunk-7S6XSTFO-C3W_8ji8.js +2 -0
- package/dist/web/assets/chunk-AQDTSKZB-DZQV76Iu.js +72 -0
- package/dist/web/assets/chunk-DSNLSHJZ-BRfUxqaq.js +129 -0
- package/dist/web/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
- package/dist/web/assets/chunk-HAGFOTED-BD5jLT7f.js +62 -0
- package/dist/web/assets/chunk-HNE4Q36P-iJGu5Gi6.js +1 -0
- package/dist/web/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
- package/dist/web/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web/assets/chunk-NGNAAXSQ-C2Wy9Xmz.js +136 -0
- package/dist/web/assets/chunk-NQOKRVIF-D-yS8zxU.js +213 -0
- package/dist/web/assets/chunk-UHW7PFBP-Dnu0oPmA.js +1 -0
- package/dist/web/assets/chunk-VQ5W62QI-CzZ8zHjp.js +1 -0
- package/dist/web/assets/chunk-WQQL4CDK-Cu4nebs6.js +10 -0
- package/dist/web/assets/chunk-XXDRQBXY-DgtjWyl3.js +1 -0
- package/dist/web/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/web/assets/chunk-YZO67HFG-CGApWL5X.js +1 -0
- package/dist/web/assets/chunk-ZAUX2LTX-D5DhZJoE.js +1 -0
- package/dist/web/assets/chunk-ZCHMQSOR-BC0ITpUM.js +2 -0
- package/dist/web/assets/classDiagram-v2-4MYWR3UA-Budj7a3U.js +217 -0
- package/dist/web/assets/cose-bilkent-JH36ORCC-DIHNUNHx.js +1 -0
- package/dist/web/assets/cynefin-EF2NZ3EQ-BRluapvc.js +1 -0
- package/dist/web/assets/cynefinDiagram-WF24UDRP-CATBOOnO.js +62 -0
- package/dist/web/assets/cytoscape.esm-BegBNzOV.js +321 -0
- package/dist/web/assets/dagre-NK4GIZVX-B8DaH0ao.js +4 -0
- package/dist/web/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web/assets/diagram-CBK3MWTC-C6HHNKIg.js +24 -0
- package/dist/web/assets/diagram-I5XIIV2D-BftOP4e2.js +24 -0
- package/dist/web/assets/diagram-ODIL2UCW-CCO6wwvD.js +30 -0
- package/dist/web/assets/diagram-PFBEJUXE-y6w_y2UD.js +3 -0
- package/dist/web/assets/diagram-RJA3I4VV-gsgGHcdI.js +41 -0
- package/dist/web/assets/diagram-TYUNFSNR-BFuCHkk0.js +200 -0
- package/dist/web/assets/dist-DLTSHXmk.js +1 -0
- package/dist/web/assets/ebnfDiagram-V4P3TTPT-B6_sRdDs.js +1 -0
- package/dist/web/assets/elk-QONTBCTQ-BtVt8qRm.js +27 -0
- package/dist/web/assets/erDiagram-KYQIGQAA-rgfheTvQ.js +99 -0
- package/dist/web/assets/eventmodeling-K75KTNOO-r9vnCD2d.js +1 -0
- package/dist/web/assets/flowDiagram-IUGLLWBU-CiGVEt1a.js +1 -0
- package/dist/web/assets/ganttDiagram-R7GPNTJY-CJFYABWz.js +292 -0
- package/dist/web/assets/gitGraph-VSP46ZUC-ccOuonLa.js +1 -0
- package/dist/web/assets/gitGraphDiagram-PDYL7XHY-e5kzwjY2.js +106 -0
- package/dist/web/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web/assets/index-B4RJQRiD.js +142 -0
- package/dist/web/assets/index-DaMLk_sl.css +1 -0
- package/dist/web/assets/info-OHQRW6UA-C8aOXyva.js +1 -0
- package/dist/web/assets/infoDiagram-MVDRKAX5-ztgQX_ha.js +2 -0
- package/dist/web/assets/init-C-OQMol4.js +1 -0
- package/dist/web/assets/ishikawaDiagram-HPEHV2GE-BPCGAT_m.js +70 -0
- package/dist/web/assets/journeyDiagram-BOSHW7O7-BoiZL6al.js +139 -0
- package/dist/web/assets/kanban-definition-FNSA4HC5-BDcWGn8E.js +89 -0
- package/dist/web/assets/katex-B_JcIwqj.js +257 -0
- package/dist/web/assets/line-nGnhrXrD.js +1 -0
- package/dist/web/assets/linear-DiAwgAUj.js +1 -0
- package/dist/web/assets/mermaid-parser.core-DAzSIS8w.js +7 -0
- package/dist/web/assets/mermaid.core-CL_7HT-R.js +44 -0
- package/dist/web/assets/mindmap-definition-6OY57UG3-Bp7IBNG5.js +98 -0
- package/dist/web/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/web/assets/packet-JDAUHWVQ-C-1SMzOZ.js +1 -0
- package/dist/web/assets/path-fybaL0A-.js +1 -0
- package/dist/web/assets/pegDiagram-ECIUJNBX-Be1uqoNt.js +1 -0
- package/dist/web/assets/pie-XZMESJXO-Dq5h06i3.js +1 -0
- package/dist/web/assets/pieDiagram-GNMPY74T-CN5ZGBXZ.js +39 -0
- package/dist/web/assets/quadrantDiagram-D57K4MC3-C7sLKW4U.js +7 -0
- package/dist/web/assets/radar-ABXABTNO-DVVIp0T9.js +1 -0
- package/dist/web/assets/railroad-I3PHUGI6-CxxBEQri.js +1 -0
- package/dist/web/assets/railroad-abnf-LNEFI6M7-CM7hMwVK.js +1 -0
- package/dist/web/assets/railroad-ebnf-DWYD2UWJ-KUafccMV.js +1 -0
- package/dist/web/assets/railroad-peg-JR7BVNR7-5BmypBHR.js +1 -0
- package/dist/web/assets/railroadDiagram-Y72NRBL7-DHAJk4_o.js +1 -0
- package/dist/web/assets/requirementDiagram-EQYSW5RA-y9zEf_QB.js +84 -0
- package/dist/web/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/web/assets/sankeyDiagram-SY24JHO5-C6pWLy-I.js +40 -0
- package/dist/web/assets/sequenceDiagram-BLEHNHQU-Cj-Vitmg.js +169 -0
- package/dist/web/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/dist/web/assets/src-DbSGPN_8.js +1 -0
- package/dist/web/assets/stateDiagram-v2-A6IESKWZ-RbKYMXiF.js +291 -0
- package/dist/web/assets/swimlanes-B3ENRKFQ-7bBxQYlO.js +1 -0
- package/dist/web/assets/swimlanesDiagram-AYQRV4AK-CfAECQ56.js +8 -0
- package/dist/web/assets/timeline-definition-JXYKGLGB-5mrf5Irf.js +120 -0
- package/dist/web/assets/treeView-D4JQ5SDB-DP63r0Rt.js +1 -0
- package/dist/web/assets/treemap-SAJKECNS-ChWSB650.js +1 -0
- package/dist/web/assets/usecaseDiagram-WPOLBNNX-_OObMcZu.js +328 -0
- package/dist/web/assets/vennDiagram-Q3Y3IDCW-DO1Tmzxv.js +34 -0
- package/dist/web/assets/wardley-7MLQ67FV-DcDqvVeS.js +1 -0
- package/dist/web/assets/wardleyDiagram-IVAIDKWA-i-x65JPs.js +78 -0
- package/dist/web/assets/xychartDiagram-4URNHDU4-Dlk1JIjO.js +7 -0
- package/dist/web/index.html +2 -2
- package/package.json +5 -4
- package/dist/web/assets/index-B9_AU2Fw.js +0 -140
- package/dist/web/assets/index-BmbPtei8.css +0 -1
package/README.md
CHANGED
|
@@ -30,14 +30,17 @@
|
|
|
30
30
|
## ✨ What you can do
|
|
31
31
|
|
|
32
32
|
- 📱 **Step away from your desk. Stay with the task.** Follow tool activity, inspect file changes, handle permission requests, and answer Codex's questions from your computer or phone. Closing the page doesn't cancel the task.
|
|
33
|
+
- 💬 **Start without a project.** Use **新建会话** (New conversation) to start in an automatically assigned directory. Conversations and files stay available after refresh, restart, or archive.
|
|
33
34
|
- 🗂️ **See every project in one place.** Run independent tasks in parallel and spot which conversations are working, waiting for approval, or ready to read.
|
|
34
35
|
- 💬 **Pick up your Codex CLI conversations.** Browse saved history, resume existing work, or fork a new direction. Rename conversations to find them later and archive them when you're done. View and copy the full Thread ID in conversation details or diagnostics.
|
|
35
36
|
- ⚡ **Open long conversations sooner.** Recent messages appear first; scrolling preloads older history. On this device, cached conversation lists and history pages appear while the server checks for updates. [Loading and cache behavior](docs/session-history.md).
|
|
36
|
-
- 📖 **Review the work beside the conversation.** Read Markdown documents with code, tables, and
|
|
37
|
-
- 🔎 **Inspect code changes.** Open Codex’s saved patches for a turn or tool in the same read-only panel.
|
|
37
|
+
- 📖 **Review the work beside the conversation.** Read Markdown documents with code, tables, images, and Mermaid diagrams, or open JSON files in a desktop side panel while you keep talking to Codex. Mermaid diagrams also render in replies; view or copy their source and inspect wide diagrams at actual size. JSON previews include indentation, syntax highlighting, and original text for invalid JSON. Copy the unchanged source, with a full-screen reader on mobile. File previews are read-only; Markdown and JSON files have a 2 MiB limit.
|
|
38
|
+
- 🔎 **Inspect code changes.** Open Codex’s saved patches for a turn or tool in the same read-only panel. Scroll through all files, inspect line numbers, see the exact words changed within each line, and jump between change blocks. Long diffs start collapsed and render when expanded. File headers stay visible while scrolling so you can collapse the current file.
|
|
38
39
|
- ✍️ **Switch tasks without losing your draft.** Each conversation keeps its own draft, pasted images, and model settings in the current page. Copy or export results when you're done.
|
|
39
40
|
- 🖥️ **Run a command beside your task.** Open **Shell** to execute commands in the selected project's directory, follow stdout/stderr, interrupt a run, and reuse recent commands. The panel uses Codex's configured sandbox, with a ten-minute limit and no interactive input. Closing it keeps the command running. [Capabilities and limits](docs/shell.md).
|
|
40
41
|
|
|
42
|
+
Mermaid diagrams render locally after their code fence closes, with automatic light/dark colors. Failed diagrams keep their source; rendering is limited to 50,000 source characters and 500 edges.
|
|
43
|
+
|
|
41
44
|
<details>
|
|
42
45
|
<summary><strong>📱 A workspace that fits your phone</strong></summary>
|
|
43
46
|
<p>Check a result, answer a question, or send the next instruction without returning to your desk.</p>
|
|
@@ -102,7 +105,9 @@ pnpm build
|
|
|
102
105
|
pnpm start -- --config ./config.local.json
|
|
103
106
|
```
|
|
104
107
|
|
|
105
|
-
Open **<http://127.0.0.1:8787
|
|
108
|
+
Open **<http://127.0.0.1:8787>** and click **+** beside **未关联项目** (Unassigned) in the sidebar to send a task without choosing a project. To work in an existing directory, click **添加项目** (Add project) and enter its path on the computer running Covro.
|
|
109
|
+
|
|
110
|
+
Unassigned conversations use separate directories under `<dataDir>/workspaces/`, allocated on the first send. Their files are retained until you explicitly remove them; archiving does not delete files. See [conversation workspaces](docs/workspaces.md) for directory, recovery, and backup details.
|
|
106
111
|
|
|
107
112
|
For local development, run `pnpm dev` instead and open <http://127.0.0.1:5173>.
|
|
108
113
|
|
|
@@ -136,6 +141,8 @@ covro update --channel dev
|
|
|
136
141
|
| Beta | `beta` | Maintainer-selected Beta tags or GitHub Releases |
|
|
137
142
|
| Dev | `dev` | New main-branch changes after CI passes |
|
|
138
143
|
|
|
144
|
+
Successful Dev npm publications also create a [GitHub Pre-release](https://github.com/yuzheng14/covro/releases) with automatically generated notes. The comparison starts from whichever has the newer source commit: the preceding Dev version or stable version. Stable releases retain their grouped changelog.
|
|
145
|
+
|
|
139
146
|
Each release declares its recommended and verified Codex CLI versions. The update panel shows the current and candidate combinations. Automatic upgrades require a verified combination; an unverified combination needs explicit confirmation for that exact upgrade. Unknown versions, invalid/missing declarations, and explicitly unsupported combinations block managed upgrades. The CLI offers `covro update --allow-unverified-codex` for the same explicit attempt. Covro does not upgrade your Codex CLI.
|
|
140
147
|
|
|
141
148
|
Automatic installation is off by default. Managed upgrades support **macOS and Linux npm global installations**; source, linked, container, and Windows installations use their original update method. A failed candidate is rolled back before business writes resume; downgrades must pass database compatibility checks. Old backups are retained without automatic rotation.
|
package/README.zh-CN.md
CHANGED
|
@@ -30,14 +30,17 @@
|
|
|
30
30
|
## ✨ 你可以做什么
|
|
31
31
|
|
|
32
32
|
- 📱 **离开电脑,也能跟进任务。** 在电脑或手机上查看工具活动与文件变更、处理权限审批、回答 Codex 的问题。关闭页面,任务仍会继续。
|
|
33
|
+
- 💬 **无需项目,也能直接开始。** 点击 **新建会话**,应用自动分配独立目录;刷新、重启或归档后,会话和文件仍保留。
|
|
33
34
|
- 🗂️ **多个项目,一眼掌握进展。** 让独立任务并行执行,随时看到哪些会话正在工作、等待审批,哪些已有结果可读。
|
|
34
35
|
- 💬 **接着你的 Codex CLI 会话。** 浏览已有历史、恢复工作,或 Fork 一个新方向;为会话命名以便查找,完成后归档。在会话详情或状态诊断中查看、复制完整 Thread ID。
|
|
35
36
|
- ⚡ **更快打开长会话。** 优先显示最近消息,向上滚动时提前加载历史;本机会话列表和历史分片可先显示缓存,再由服务端核对更新。[加载与缓存说明](docs/session-history.md)。
|
|
36
|
-
- 📖 **一边看产出,一边继续讨论。** 电脑上将 Markdown 文档、JSON 文件与会话并排打开,继续向 Codex 提问;Markdown
|
|
37
|
-
- 🔎 **逐行查看代码变更。** 在同一只读预览窗口查看某轮或某工具的 Codex
|
|
37
|
+
- 📖 **一边看产出,一边继续讨论。** 电脑上将 Markdown 文档、JSON 文件与会话并排打开,继续向 Codex 提问;Markdown 支持代码、表格、图片和 Mermaid 图表,回复也可直接显示图表,可查看或复制图表源码,并以实际大小查看宽图。JSON 支持格式化缩进、语法高亮,格式无效时保留原文,可复制完整原文,手机上也有全屏阅读器。文件预览保持只读,Markdown 和 JSON 文件限制为 2 MiB。
|
|
38
|
+
- 🔎 **逐行查看代码变更。** 在同一只读预览窗口查看某轮或某工具的 Codex 补丁快照,按顺序连续浏览全部文件,支持行号、行内文字高亮和区块跳转;长 diff 默认折叠,展开后按需渲染,阅读时文件标题栏吸顶,随时收起当前文件。
|
|
38
39
|
- ✍️ **切换任务,草稿还在。** 每个会话分别保留当前页面中的草稿、粘贴图片和模型设置;完成后可以复制或导出结果。
|
|
39
40
|
- 🖥️ **在任务旁运行命令。** 打开 **Shell**,在所选项目目录执行命令、查看实时标准输出和错误输出、中断执行,并复用近期命令。面板沿用 Codex 配置的沙箱,最长运行十分钟,不支持交互输入;关闭面板后命令仍继续运行。[能力与限制](docs/shell.md)。
|
|
40
41
|
|
|
42
|
+
Mermaid 图表在代码块闭合后于本地渲染,自动适配浅色/深色。渲染失败时保留源码;渲染上限为 50,000 个源码字符、500 条边。
|
|
43
|
+
|
|
41
44
|
<details>
|
|
42
45
|
<summary><strong>📱 手机上也能舒服地使用</strong></summary>
|
|
43
46
|
<p>查看结果、回答问题、补充下一步要求,不必每次都回到电脑前。</p>
|
|
@@ -102,7 +105,9 @@ pnpm build
|
|
|
102
105
|
pnpm start -- --config ./config.local.json
|
|
103
106
|
```
|
|
104
107
|
|
|
105
|
-
打开 **<http://127.0.0.1:8787
|
|
108
|
+
打开 **<http://127.0.0.1:8787>**,点击侧栏 **未关联项目** 标题右侧的 **+** 即可直接发送任务,无需选择项目。如需操作已有目录,点击 **添加项目**,填写运行 Covro 的电脑上的目录。
|
|
109
|
+
|
|
110
|
+
未关联项目的会话在首次发送时分配 `<dataDir>/workspaces/` 下的独立目录。文件持续保留,归档不会删除文件;目录、恢复与备份规则见[会话工作目录](docs/workspaces.md)。
|
|
106
111
|
|
|
107
112
|
本地开发可以改用 `pnpm dev`,打开 <http://127.0.0.1:5173>。
|
|
108
113
|
|
|
@@ -136,6 +141,8 @@ covro update --channel dev
|
|
|
136
141
|
| 预览版 | `beta` | 维护者通过 Beta 标签或 GitHub Release 选定的预览版 |
|
|
137
142
|
| 开发版 | `dev` | CI 通过后的 main 分支新功能 |
|
|
138
143
|
|
|
144
|
+
开发版 npm 发布成功后,还会创建带 GitHub 自动生成说明的 [GitHub Pre-release](https://github.com/yuzheng14/covro/releases)。比较起点取上一个 Dev 版本与稳定版本中源码提交较新的那个;稳定版仍保留原来的分组 Changelog。
|
|
145
|
+
|
|
139
146
|
每个发行版声明推荐和已验证的 Codex CLI 版本,更新面板会同时显示当前与目标组合。自动升级只接受已验证组合;未验证组合需要对确切目标明确确认。版本未知、声明缺失/无效或明确不支持的组合会阻止受管升级。CLI 可通过 `covro update --allow-unverified-codex` 明确尝试同一组合。Covro 不会自动升级你的 Codex CLI。
|
|
140
147
|
|
|
141
148
|
自动安装默认关闭。受管升级支持 **macOS 和 Linux 的 npm 全局安装**;源码、链接、容器和 Windows 安装沿用原更新方式。候选版本失败时,会在重新开放业务写入前回滚;降级需通过数据库兼容检查。旧备份会保留,暂不自动轮转。
|
package/dist/codex/adapter.js
CHANGED
|
@@ -481,7 +481,14 @@ class CodexAdapter {
|
|
|
481
481
|
limit: 100
|
|
482
482
|
});
|
|
483
483
|
for (const id of page.data) {
|
|
484
|
-
let thread
|
|
484
|
+
let thread;
|
|
485
|
+
try {
|
|
486
|
+
thread = await read(id);
|
|
487
|
+
} catch (error) {
|
|
488
|
+
if (error instanceof CodexError && error.rpcCode === -32600 && error.message === `thread not loaded: ${id}`)
|
|
489
|
+
continue;
|
|
490
|
+
throw error;
|
|
491
|
+
}
|
|
485
492
|
if (thread.status.type !== "active") continue;
|
|
486
493
|
const ancestors = /* @__PURE__ */ new Set();
|
|
487
494
|
for (; ; ) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/codex/adapter.ts"],
|
|
4
|
-
"sourcesContent": ["import { CODEX_COMPATIBILITY } from './compatibility.js';\nimport { SHELL_TIMEOUT_MS, SHELL_OUTPUT_BYTES } from '../shared/shell.js';\nimport type { CommandExecResponse } from './generated/v2/CommandExecResponse.js';\nimport type { CommandExecTerminateResponse } from './generated/v2/CommandExecTerminateResponse.js';\nimport { spawn, execFile, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { promisify } from 'node:util';\nimport { ThreadTitles } from './thread-titles.js';\nimport { TurnTokenUsage } from './turn-token-usage.js';\nimport { AppError } from '../shared/errors.js';\nimport { threadNameError } from '../shared/thread-name.js';\nimport { permissionModeUnavailable, permissionReviewerUnavailable } from '../shared/permissions.js';\nimport {\n permissionCapabilities,\n type PermissionRequirements,\n type ProfileProvenance,\n} from './permissions.js';\nimport { mapAutoReview } from './auto-review.js';\nimport {\n normalizeElicitationRequest,\n validateElicitationResolution,\n validatePermissionResolution,\n} from '../shared/elicitation.js';\nimport type {\n ActionResolution,\n PermissionCapabilities,\n RuntimeSettings,\n PendingAction,\n Settings,\n ModelDefaults,\n ModelDefaultsResult,\n ThreadPage,\n ThreadView,\n TurnView,\n} from '../shared/types.js';\nimport type { ClientRequest } from './generated/ClientRequest.js';\nimport type { ServerNotification } from './generated/ServerNotification.js';\nimport type { ServerRequest } from './generated/ServerRequest.js';\nimport type { InitializeResponse } from './generated/InitializeResponse.js';\nimport type { GetAccountResponse } from './generated/v2/GetAccountResponse.js';\nimport type { ModelListResponse } from './generated/v2/ModelListResponse.js';\nimport type { ConfigReadResponse } from './generated/v2/ConfigReadResponse.js';\nimport type { ConfigWriteResponse } from './generated/v2/ConfigWriteResponse.js';\nimport type { ConfigRequirementsReadResponse } from './generated/v2/ConfigRequirementsReadResponse.js';\nimport type { ExperimentalFeatureListResponse } from './generated/v2/ExperimentalFeatureListResponse.js';\nimport type { Thread } from './generated/v2/Thread.js';\nimport type { ThreadArchiveResponse } from './generated/v2/ThreadArchiveResponse.js';\nimport type { ThreadSetNameResponse } from './generated/v2/ThreadSetNameResponse.js';\nimport type { ThreadUnarchiveResponse } from './generated/v2/ThreadUnarchiveResponse.js';\nimport type { ThreadLoadedListResponse } from './generated/v2/ThreadLoadedListResponse.js';\nimport type { ThreadListResponse } from './generated/v2/ThreadListResponse.js';\nimport type { ThreadReadResponse } from './generated/v2/ThreadReadResponse.js';\nimport type { ThreadStartResponse } from './generated/v2/ThreadStartResponse.js';\nimport type { ThreadForkResponse } from './generated/v2/ThreadForkResponse.js';\nimport type { ThreadResumeResponse } from './generated/v2/ThreadResumeResponse.js';\nimport type { ThreadTurnsListResponse } from './generated/v2/ThreadTurnsListResponse.js';\nimport type { ThreadItemsListResponse } from './generated/v2/ThreadItemsListResponse.js';\nimport type { TurnStartResponse } from './generated/v2/TurnStartResponse.js';\nimport type { ReviewStartResponse } from './generated/v2/ReviewStartResponse.js';\nimport type { TurnSteerResponse } from './generated/v2/TurnSteerResponse.js';\nimport type { TurnInterruptResponse } from './generated/v2/TurnInterruptResponse.js';\nimport type { CommandExecutionApprovalDecision } from './generated/v2/CommandExecutionApprovalDecision.js';\nimport type { CommandExecutionRequestApprovalResponse } from './generated/v2/CommandExecutionRequestApprovalResponse.js';\nimport type { FileChangeRequestApprovalResponse } from './generated/v2/FileChangeRequestApprovalResponse.js';\nimport type { ToolRequestUserInputResponse } from './generated/v2/ToolRequestUserInputResponse.js';\nimport type { PermissionsRequestApprovalResponse } from './generated/v2/PermissionsRequestApprovalResponse.js';\nimport type { McpServerElicitationRequestResponse } from './generated/v2/McpServerElicitationRequestResponse.js';\nimport type { FileSystemPath } from './generated/v2/FileSystemPath.js';\nimport {\n mapItem,\n mapThread,\n mapTurn,\n permissionSettings,\n serviceTierSettings,\n threadSettings,\n threadStatus,\n turnSettings,\n taskInput,\n} from './mapping.js';\nimport {\n asCodexError,\n CodexError,\n isRecord,\n RpcTransport,\n type RpcId,\n type RpcNotification,\n type RpcServerRequest,\n} from './transport.js';\nimport type { CodexClient, CodexDiagnostics, CodexEvent } from './types.js';\nimport type { ThreadCompactStartResponse } from './generated/v2/ThreadCompactStartResponse.js';\nexport type {\n CodexClient,\n CodexDiagnostics,\n CodexEvent,\n CodexEvent as AdapterEvent,\n} from './types.js';\nexport { CodexError } from './transport.js';\n\nexport const VERIFIED_CODEX_VERSION = CODEX_COMPATIBILITY.recommended;\nconst CAPABILITIES = [\n 'command/exec',\n 'command/exec/terminate',\n 'thread/name/set',\n 'thread/start',\n 'thread/fork',\n 'thread/read',\n 'thread/list',\n 'thread/resume',\n 'thread/archive',\n 'thread/loaded/list',\n 'thread/unarchive',\n 'thread/compact/start',\n 'thread/turns/list',\n 'thread/items/list',\n 'turn/start',\n 'review/start',\n 'turn/steer',\n 'turn/interrupt',\n 'model/list',\n 'config/read',\n 'config/batchWrite',\n 'configRequirements/read',\n 'experimentalFeature/list',\n 'account/read',\n];\ntype Responses = {\n 'command/exec': CommandExecResponse;\n 'command/exec/terminate': CommandExecTerminateResponse;\n 'thread/name/set': ThreadSetNameResponse;\n initialize: InitializeResponse;\n 'account/read': GetAccountResponse;\n 'model/list': ModelListResponse;\n 'config/read': ConfigReadResponse;\n 'config/batchWrite': ConfigWriteResponse;\n 'configRequirements/read': ConfigRequirementsReadResponse;\n 'experimentalFeature/list': ExperimentalFeatureListResponse;\n 'thread/list': ThreadListResponse;\n 'thread/read': ThreadReadResponse;\n 'thread/start': ThreadStartResponse;\n 'thread/fork': ThreadForkResponse;\n 'thread/resume': ThreadResumeResponse;\n 'thread/loaded/list': ThreadLoadedListResponse;\n 'thread/archive': ThreadArchiveResponse;\n 'thread/unarchive': ThreadUnarchiveResponse;\n 'thread/compact/start': ThreadCompactStartResponse;\n 'thread/turns/list': ThreadTurnsListResponse;\n 'thread/items/list': ThreadItemsListResponse;\n 'turn/start': TurnStartResponse;\n 'review/start': ReviewStartResponse;\n 'turn/steer': TurnSteerResponse;\n 'turn/interrupt': TurnInterruptResponse;\n};\nexport interface CodexAdapterOptions {\n binary: string;\n home?: string;\n /** Explicit argument override for the test simulator; production leaves this unset. */\n args?: string[];\n requestTimeoutMs?: number;\n titleTimeoutMs?: number;\n maxLineBytes?: number;\n maxStderrBytes?: number;\n}\ntype ActionContext = {\n action: PendingAction;\n request: ServerRequest;\n decisions: Map<string, CommandExecutionApprovalDecision>;\n responding: boolean;\n};\n\nfunction permissionPathLabel(path: FileSystemPath): string {\n if (path.type === 'path') return path.path;\n if (path.type === 'glob_pattern') return `\u5339\u914D\uFF1A${path.pattern}`;\n const special = path.value;\n const subpath =\n 'subpath' in special && special.subpath !== null ? `\uFF08\u5B50\u8DEF\u5F84\uFF1A${special.subpath}\uFF09` : '';\n switch (special.kind) {\n case 'root':\n return '\u6574\u4E2A\u6587\u4EF6\u7CFB\u7EDF\uFF08/\uFF09';\n case 'minimal':\n return '\u7CFB\u7EDF\u57FA\u7840\u8FD0\u884C\u76EE\u5F55';\n case 'project_roots':\n return `\u9879\u76EE\u6839\u76EE\u5F55${subpath}`;\n case 'tmpdir':\n return '\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\uFF08TMPDIR\uFF09';\n case 'slash_tmp':\n return '/tmp';\n case 'unknown':\n return `\u7279\u6B8A\u8DEF\u5F84\uFF1A${special.path}${subpath}`;\n }\n}\n\nexport class CodexAdapter implements CodexClient {\n private readonly commandOutputs = new Map<\n string,\n Parameters<NonNullable<CodexClient['executeCommand']>>[3]\n >();\n epoch = randomUUID();\n private child?: ChildProcessWithoutNullStreams;\n private rpc?: RpcTransport;\n private stopped = true;\n private starting?: Promise<void>;\n private recovering?: Promise<void>;\n private restartTimer?: NodeJS.Timeout;\n private restartAttempt = 0;\n private titles?: ThreadTitles;\n private readonly tokenUsage = new TurnTokenUsage();\n // Ordering only. Persisted archive state belongs exclusively to Codex.\n private archiveSequence = 0;\n private readonly archives = new Map<string, { archived: boolean; sequence: number }>();\n private listeners = new Set<(event: CodexEvent) => void>();\n private actions = new Map<string, ActionContext>();\n private actionIds = new Map<RpcId, string>();\n private stderrTail = Buffer.alloc(0);\n private disabled = new Set<string>();\n private permissionState = new Map<string, RuntimeSettings>();\n private state: CodexDiagnostics = {\n ready: false,\n connection: 'starting',\n codexVersion: null,\n verifiedVersion: VERIFIED_CODEX_VERSION,\n compatibility: 'unavailable',\n codexEpoch: this.epoch,\n authenticated: null,\n models: [],\n capabilities: [],\n };\n constructor(private readonly options: CodexAdapterOptions) {}\n get pid(): number | undefined {\n return this.child?.pid;\n }\n get ready(): boolean {\n return this.state.ready;\n }\n diagnostics(): CodexDiagnostics {\n return structuredClone(this.state);\n }\n onEvent(listener: (event: CodexEvent) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n private emit(event: CodexEvent): void {\n for (const listener of this.listeners) listener(event);\n }\n private publishRuntime(): void {\n this.emit({ type: 'runtime', diagnostics: this.diagnostics() });\n }\n\n async start(): Promise<void> {\n if (this.starting) return this.starting;\n this.stopped = false;\n this.starting = this.startProcess();\n try {\n await this.starting;\n } finally {\n this.starting = undefined;\n }\n }\n private async startProcess(): Promise<void> {\n if (this.child) throw new CodexError('CODEX_BUSY', 'Codex app-server is already started');\n this.epoch = randomUUID();\n this.disabled.clear();\n this.archives.clear();\n this.state = {\n ...this.state,\n codexEpoch: this.epoch,\n ready: false,\n connection: 'starting',\n error: undefined,\n capabilities: [],\n };\n this.publishRuntime();\n try {\n const env = {\n ...process.env,\n ...(this.options.home === undefined ? {} : { CODEX_HOME: this.options.home }),\n };\n const { stdout } = await promisify(execFile)(this.options.binary, ['--version'], {\n env,\n timeout: 5000,\n maxBuffer: 64 * 1024,\n });\n const version = stdout.trim().replace(/^codex-cli\\s+/, '');\n this.state.codexVersion = version;\n this.permissionState.clear();\n this.state.compatibility = CODEX_COMPATIBILITY.verified.includes(version)\n ? 'verified'\n : 'unverified';\n const child = spawn(\n this.options.binary,\n this.options.args ?? ['app-server', '--listen', 'stdio://'],\n { env, stdio: ['pipe', 'pipe', 'pipe'], shell: false },\n );\n this.child = child;\n const rpc = new RpcTransport(child.stdin, child.stdout, {\n timeoutMs: this.options.requestTimeoutMs,\n maxLineBytes: this.options.maxLineBytes,\n });\n this.rpc = rpc;\n this.titles = new ThreadTitles(rpc, this.options.titleTimeoutMs);\n child.stderr.on('data', (chunk: Buffer) => {\n const max = this.options.maxStderrBytes ?? 64 * 1024;\n this.stderrTail = Buffer.concat([this.stderrTail, chunk.subarray(-max)]).subarray(-max);\n });\n child.on('error', (error) =>\n rpc.fail(new CodexError('CODEX_UNAVAILABLE', `Cannot start Codex: ${error.message}`, true)),\n );\n child.on('exit', (code, signal) => {\n rpc.fail(\n new CodexError(\n 'CODEX_UNAVAILABLE',\n `Codex exited (${signal ?? code ?? 'unknown'})`,\n true,\n ),\n );\n if (this.child === child) this.child = undefined;\n });\n rpc.on('notification', (message: RpcNotification) => {\n try {\n this.notification(message);\n } catch (error) {\n rpc.fail(asCodexError(error));\n }\n });\n rpc.on('request', (message: RpcServerRequest) => {\n void this.serverRequest(message).catch((error: unknown) => rpc.fail(asCodexError(error)));\n });\n rpc.on('failure', (error: CodexError) => {\n if (this.rpc !== rpc) return;\n const wasReady = this.ready;\n this.state.ready = false;\n this.tokenUsage.clear();\n this.state.connection = 'unavailable';\n this.state.error = error.message;\n this.expireActions();\n this.publishRuntime();\n if (!child.killed) child.kill('SIGTERM');\n const kill = setTimeout(() => {\n if (child.exitCode === null && child.signalCode === null) child.kill('SIGKILL');\n }, 2500);\n kill.unref();\n child.once('exit', () => clearTimeout(kill));\n if (wasReady && !this.stopped) {\n // Only metadata is logged: never RPC params, results, or session contents.\n console.error('Codex transport failed', {\n code: error.code,\n ...(error.details as object),\n });\n this.scheduleRestart();\n }\n });\n const initialized = await this.call(\n 'initialize',\n {\n clientInfo: { name: 'codex_web_ui', title: 'Codex Web UI', version: '0.1.0' },\n capabilities: {\n experimentalApi: true,\n requestAttestation: false,\n explicitGatewayOauth: true,\n },\n },\n true,\n );\n if (!isRecord(initialized) || typeof initialized.userAgent !== 'string')\n throw new CodexError(\n 'PROTOCOL_INCOMPATIBLE',\n 'Codex initialize returned a malformed result',\n true,\n );\n await rpc.notify('initialized');\n const [account, models] = await Promise.all([\n this.call('account/read', { refreshToken: false }, true),\n this.call('model/list', { limit: 100 }, true),\n ]);\n if (\n !isRecord(account) ||\n !Object.hasOwn(account, 'account') ||\n typeof account.requiresOpenaiAuth !== 'boolean'\n )\n throw new CodexError(\n 'PROTOCOL_INCOMPATIBLE',\n 'Codex account/read returned a malformed result',\n true,\n );\n this.state.authenticated = account.account !== null || !account.requiresOpenaiAuth;\n this.state.models = models.data.map((model) => ({\n id: model.model,\n name: model.displayName,\n description: model.description,\n reasoningEfforts: model.supportedReasoningEfforts.map((effort) => effort.reasoningEffort),\n defaultReasoningEffort: model.defaultReasoningEffort,\n serviceTiers:\n model.serviceTiers?.map((tier) => (tier.id === 'priority' ? 'fast' : tier.id)) ??\n model.additionalSpeedTiers,\n }));\n let cursor = models.nextCursor;\n const seen = new Set<string>();\n while (cursor) {\n if (seen.has(cursor) || seen.size >= 100)\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid model pagination');\n seen.add(cursor);\n const page = await this.call('model/list', { limit: 100, cursor }, true);\n this.state.models.push(\n ...page.data.map((model) => ({\n id: model.model,\n name: model.displayName,\n description: model.description,\n reasoningEfforts: model.supportedReasoningEfforts.map(\n (effort) => effort.reasoningEffort,\n ),\n defaultReasoningEffort: model.defaultReasoningEffort,\n serviceTiers:\n model.serviceTiers?.map((tier) => (tier.id === 'priority' ? 'fast' : tier.id)) ??\n model.additionalSpeedTiers,\n })),\n );\n cursor = page.nextCursor;\n }\n this.titles?.configure(\n account.account?.type === 'chatgpt',\n this.state.models.map((model) => model.id),\n );\n this.state.ready = true;\n this.state.connection = 'ready';\n this.state.capabilities = CAPABILITIES.filter((method) => !this.disabled.has(method));\n this.publishRuntime();\n } catch (error) {\n const failure = asCodexError(error);\n this.state.ready = false;\n this.state.connection = 'unavailable';\n this.state.error = failure.message;\n this.publishRuntime();\n await this.stopProcess(failure);\n this.scheduleRestart();\n throw failure;\n }\n }\n async stop(): Promise<void> {\n this.stopped = true;\n clearTimeout(this.restartTimer);\n this.restartTimer = undefined;\n await this.starting?.catch(() => {});\n await this.recovering;\n await this.stopProcess();\n }\n private scheduleRestart(): void {\n if (this.stopped || this.restartTimer) return;\n const delay = Math.min(1000 * 2 ** Math.min(this.restartAttempt++, 5), 30_000);\n this.restartTimer = setTimeout(() => {\n this.restartTimer = undefined;\n this.recovering = (async () => {\n await this.stopProcess();\n if (this.stopped) return;\n try {\n await this.start();\n this.restartAttempt = 0;\n } catch {\n this.scheduleRestart();\n }\n })();\n void this.recovering.finally(() => {\n this.recovering = undefined;\n });\n }, delay);\n this.restartTimer.unref();\n }\n private async stopProcess(\n reason = new CodexError('CODEX_UNAVAILABLE', 'Codex connection closed by this service', true),\n ): Promise<void> {\n const child = this.child;\n this.state.ready = false;\n this.state.connection = 'unavailable';\n this.expireActions();\n this.rpc?.fail(reason);\n if (!child || child.exitCode !== null || child.signalCode !== null) return;\n child.stdin.end();\n await new Promise<void>((resolve) => {\n const term = setTimeout(() => child.kill('SIGTERM'), 1000);\n const kill = setTimeout(() => child.kill('SIGKILL'), 2500);\n const done = setTimeout(() => {\n cleanup();\n resolve();\n }, 3500);\n const cleanup = () => {\n clearTimeout(term);\n clearTimeout(kill);\n clearTimeout(done);\n };\n child.once('exit', () => {\n cleanup();\n resolve();\n });\n });\n if (this.child === child) this.child = undefined;\n }\n private async call<M extends keyof Responses>(\n method: M,\n params: Extract<ClientRequest, { method: M }>['params'],\n initializing = false,\n timeoutMs?: number,\n ): Promise<Responses[M]> {\n if (!this.rpc || (!initializing && !this.ready))\n throw new CodexError('CODEX_UNAVAILABLE', 'Codex is not ready');\n if (this.disabled.has(method))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', `Codex does not support ${method}`);\n try {\n return await this.rpc.request<Responses[M]>(method, params, undefined, timeoutMs);\n } catch (error) {\n // Concurrent startup calls can inherit the same error when cleanup fails the transport.\n if (!initializing && error instanceof CodexError && error.rpcCode === -32601) {\n this.disabled.add(method);\n this.state.capabilities = this.state.capabilities.filter((name) => name !== method);\n this.state.error = `\u5F53\u524D Codex \u7F3A\u5C11 ${method} \u80FD\u529B`;\n this.publishRuntime();\n }\n throw error;\n }\n }\n private validateSettings(settings: Settings = {}): void {\n const model =\n settings.model === undefined\n ? undefined\n : this.state.models.find((entry) => entry.id === settings.model);\n if (settings.model !== undefined && !model)\n throw new AppError('VALIDATION_ERROR', '\u6A21\u578B\u4E0D\u5728\u5F53\u524D Codex \u6A21\u578B\u5217\u8868\u4E2D');\n if (\n settings.reasoningEffort !== undefined &&\n !(\n model?.reasoningEfforts ?? this.state.models.flatMap((entry) => entry.reasoningEfforts)\n ).includes(settings.reasoningEffort)\n )\n throw new AppError('VALIDATION_ERROR', '\u6240\u9009\u63A8\u7406\u5F3A\u5EA6\u4E0D\u53D7\u5F53\u524D\u6A21\u578B\u652F\u6301');\n }\n async listThreads(cwd: string, cursor?: string, archived = false): Promise<ThreadPage> {\n const sequence = ++this.archiveSequence;\n const result = await this.call('thread/list', {\n cwd,\n cursor,\n limit: 30,\n archived,\n sourceKinds: ['cli', 'appServer', 'vscode'],\n sortKey: 'updated_at',\n sortDirection: 'desc',\n });\n return {\n data: result.data.map((thread) => ({\n ...mapThread(thread),\n archived: this.observeArchive(thread.id, archived, sequence),\n })),\n nextCursor: result.nextCursor,\n };\n }\n\n private observeArchive(id: string, archived: boolean, sequence: number): boolean {\n const current = this.archives.get(id);\n if (current && current.sequence > sequence) return current.archived;\n this.archives.set(id, { archived, sequence });\n return archived;\n }\n\n private archiveChanged(id: string, archived: boolean): void {\n this.observeArchive(id, archived, ++this.archiveSequence);\n this.emit({ type: 'threadArchive', threadId: id, archived });\n }\n\n /** thread/read has no archive field. Query the native index, including paginated history,\n * instead of guessing from the unstable rollout path or maintaining a second database. */\n private async storedThread(thread: Thread, sequence: number): Promise<ThreadView> {\n let cursor: string | null = null;\n const seen = new Set<string>();\n let archived = false;\n do {\n const page: ThreadListResponse = await this.call('thread/list', {\n archived: true,\n cwd: thread.cwd,\n cursor,\n limit: 100,\n sourceKinds: [\n 'cli',\n 'vscode',\n 'exec',\n 'appServer',\n 'subAgent',\n 'subAgentReview',\n 'subAgentCompact',\n 'subAgentThreadSpawn',\n 'subAgentOther',\n 'unknown',\n ],\n });\n if (page.data.some((entry) => entry.id === thread.id)) {\n archived = true;\n break;\n }\n cursor = page.nextCursor;\n if (cursor && (seen.has(cursor) || seen.size >= 1000))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid archive pagination');\n if (cursor) seen.add(cursor);\n } while (cursor);\n return { ...mapThread(thread), archived: this.observeArchive(thread.id, archived, sequence) };\n }\n\n /** Native archive also shuts down spawned descendants, even already-archived ones. */\n private async assertArchiveIdle(rootId: string): Promise<void> {\n const threads = new Map<string, Thread>();\n const read = async (id: string): Promise<Thread> => {\n let thread = threads.get(id);\n if (!thread) {\n thread = (await this.call('thread/read', { threadId: id, includeTurns: false })).thread;\n threads.set(id, thread);\n }\n return thread;\n };\n let cursor: string | null = null;\n const seen = new Set<string>();\n do {\n const page: ThreadLoadedListResponse = await this.call('thread/loaded/list', {\n cursor,\n limit: 100,\n });\n for (const id of page.data) {\n let thread = await read(id);\n if (thread.status.type !== 'active') continue;\n const ancestors = new Set<string>();\n for (;;) {\n if (thread.id === rootId)\n throw new AppError('THREAD_BUSY', '\u4F1A\u8BDD\u6216\u5176\u5B50\u4EFB\u52A1\u4ECD\u5728\u8FD0\u884C\uFF0C\u7ED3\u675F\u540E\u624D\u80FD\u5F52\u6863', 409);\n if (!thread.parentThreadId) break;\n if (ancestors.has(thread.id))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid thread ancestry');\n ancestors.add(thread.id);\n thread = await read(thread.parentThreadId);\n }\n }\n cursor = page.nextCursor;\n if (cursor && (seen.has(cursor) || seen.size >= 1000))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid loaded thread pagination');\n if (cursor) seen.add(cursor);\n } while (cursor);\n }\n\n async renameThread(id: string, name: string): Promise<void> {\n const problem = threadNameError(name);\n if (problem) throw new AppError('VALIDATION_ERROR', problem);\n const epoch = this.epoch;\n // A generated name may already be on the wire. Finish it before the explicit write.\n await this.titles?.prepareManualName(id);\n if (this.epoch !== epoch || !this.ready)\n throw new CodexError(\n 'CODEX_UNAVAILABLE',\n '\u91CD\u547D\u540D\u7B49\u5F85\u671F\u95F4 Codex \u5B9E\u4F8B\u5DF2\u53D8\u5316\uFF0C\u8BF7\u6838\u5BF9\u540D\u79F0',\n true,\n );\n await this.call('thread/name/set', { threadId: id, name: name.trim() });\n }\n\n async archiveThread(id: string): Promise<void> {\n await this.assertArchiveIdle(id);\n await this.call('thread/archive', { threadId: id });\n this.archiveChanged(id, true);\n }\n\n async unarchiveThread(id: string): Promise<ThreadView> {\n const { thread } = await this.call('thread/unarchive', { threadId: id });\n this.archiveChanged(id, false);\n return { ...mapThread(thread), archived: false };\n }\n private async readThreadHeader(id: string): Promise<Thread> {\n try {\n return (await this.call('thread/read', { threadId: id, includeTurns: false })).thread;\n } catch (error) {\n if (\n error instanceof CodexError &&\n error.rpcCode === -32600 &&\n error.message === `thread not loaded: ${id}`\n )\n throw new AppError('THREAD_NOT_FOUND', '\u4F1A\u8BDD\u5C1A\u672A\u4FDD\u5B58\u6216\u5DF2\u4E0D\u5B58\u5728', 404, { threadId: id });\n throw error;\n }\n }\n\n async readThreadMetadata(id: string): Promise<ThreadView> {\n const sequence = ++this.archiveSequence;\n return this.storedThread(await this.readThreadHeader(id), sequence);\n }\n async readThreadPage(id: string, continuation?: string): Promise<ThreadView> {\n const epoch = this.epoch;\n let cursor: string | null = null;\n if (continuation) {\n try {\n const decoded = JSON.parse(Buffer.from(continuation, 'base64url').toString('utf8'));\n if (\n decoded.threadId !== id ||\n decoded.epoch !== epoch ||\n typeof decoded.cursor !== 'string'\n )\n throw new Error('Invalid cursor');\n cursor = decoded.cursor;\n } catch {\n throw new AppError('HISTORY_CURSOR_EXPIRED', '\u5386\u53F2\u5206\u9875\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u540C\u6B65\u4F1A\u8BDD\u3002', 409);\n }\n }\n const sequence = ++this.archiveSequence;\n const header = await this.readThreadHeader(id);\n // Legacy rollout files expose no paging protocol. Keep the compatibility path explicit.\n if (header.historyMode !== 'paginated') return this.readThread(id);\n const page = await this.call('thread/turns/list', {\n threadId: id,\n cursor,\n limit: 12,\n sortDirection: 'desc',\n itemsView: 'summary',\n });\n if (page.nextCursor && page.nextCursor === cursor)\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid turn pagination');\n await this.hydrateTurns(id, page.data);\n if (this.epoch !== epoch)\n throw new AppError('HISTORY_CURSOR_EXPIRED', '\u8BFB\u53D6\u671F\u95F4 Codex \u5DF2\u91CD\u542F\uFF0C\u8BF7\u91CD\u65B0\u540C\u6B65\u4F1A\u8BDD\u3002', 409);\n const view = await this.storedThread(\n { ...header, turns: page.data.slice().reverse() },\n sequence,\n );\n return {\n ...view,\n history: {\n olderCursor: page.nextCursor\n ? Buffer.from(\n JSON.stringify({\n threadId: id,\n epoch,\n cursor: page.nextCursor,\n }),\n ).toString('base64url')\n : null,\n },\n };\n }\n\n private async hydrateTurns(id: string, turns: Thread['turns']): Promise<void> {\n for (const turn of turns) {\n if (turn.itemsView === 'full') continue;\n let cursor: string | null = null;\n const seen = new Set<string>();\n turn.items = [];\n do {\n const page: ThreadItemsListResponse = await this.call('thread/items/list', {\n threadId: id,\n turnId: turn.id,\n cursor,\n limit: 20,\n sortDirection: 'asc',\n });\n turn.items.push(...page.data.map((entry) => entry.item));\n cursor = page.nextCursor;\n if (cursor && (seen.has(cursor) || seen.size >= 1000))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid item pagination');\n if (cursor) seen.add(cursor);\n } while (cursor);\n }\n }\n\n async readThread(id: string): Promise<ThreadView> {\n const sequence = ++this.archiveSequence;\n const thread = await this.readThreadHeader(id);\n if (thread.historyMode !== 'paginated')\n return this.storedThread(\n (await this.call('thread/read', { threadId: id, includeTurns: true })).thread,\n sequence,\n );\n let cursor: string | null = null;\n const seen = new Set<string>();\n thread.turns = [];\n do {\n const page: ThreadTurnsListResponse = await this.call('thread/turns/list', {\n threadId: id,\n cursor,\n limit: 100,\n sortDirection: 'asc',\n itemsView: 'summary',\n });\n for (const turn of page.data) {\n if (turn.itemsView !== 'full') {\n let itemCursor: string | null = null;\n const itemSeen = new Set<string>();\n turn.items = [];\n do {\n const items: ThreadItemsListResponse = await this.call('thread/items/list', {\n threadId: id,\n turnId: turn.id,\n cursor: itemCursor,\n limit: 20,\n sortDirection: 'asc',\n });\n turn.items.push(...items.data.map((entry) => entry.item));\n itemCursor = items.nextCursor;\n if (itemCursor && (itemSeen.has(itemCursor) || itemSeen.size >= 1000))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid item pagination');\n if (itemCursor) itemSeen.add(itemCursor);\n } while (itemCursor);\n }\n }\n thread.turns.push(...page.data);\n cursor = page.nextCursor;\n if (cursor && (seen.has(cursor) || seen.size >= 1000))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid turn pagination');\n if (cursor) seen.add(cursor);\n } while (cursor);\n return this.storedThread(thread, sequence);\n }\n async createThread(cwd: string, settings?: Settings): Promise<ThreadView> {\n this.validateSettings(settings);\n await this.validatePermissionSettings(cwd, settings);\n const titles = this.titles;\n const result = await this.call('thread/start', { cwd, ...threadSettings(settings) });\n this.tokenUsage.created(result.thread.id);\n titles?.register(result);\n return {\n ...mapThread(result.thread),\n runtimeSettings: await this.responseRuntimeSettings(result),\n };\n }\n async saveModelDefaults(settings: ModelDefaults): Promise<ModelDefaultsResult> {\n this.validateSettings({\n model: settings.model,\n ...(settings.reasoningEffort === null ? {} : { reasoningEffort: settings.reasoningEffort }),\n });\n // Match the CLI picker: write a complete pair to the owning server's user/profile config.\n // No file path or permission fields can be supplied by the browser.\n const result = await this.call('config/batchWrite', {\n edits: [\n { keyPath: 'model', value: settings.model, mergeStrategy: 'replace' },\n {\n keyPath: 'model_reasoning_effort',\n value: settings.reasoningEffort,\n mergeStrategy: 'replace',\n },\n ],\n reloadUserConfig: true,\n });\n return { status: result.status };\n }\n async readRuntimeSettings(cwd: string): Promise<RuntimeSettings> {\n const { config } = await this.call('config/read', { cwd, includeLayers: false });\n // Config can contain credentials and instructions. Only displayable fields cross the gateway.\n return {\n model: typeof config.model === 'string' ? config.model : null,\n reasoningEffort:\n typeof config.model_reasoning_effort === 'string' ? config.model_reasoning_effort : null,\n ...serviceTierSettings(config.service_tier),\n sandbox: config.sandbox_mode ?? null,\n approvalPolicy:\n typeof config.approval_policy === 'string'\n ? config.approval_policy\n : config.approval_policy\n ? 'granular'\n : null,\n approvalReviewer: config.approvals_reviewer ?? null,\n networkAccess:\n config.sandbox_mode === 'workspace-write'\n ? (config.sandbox_workspace_write?.network_access ?? null)\n : null,\n permissionMode:\n typeof config.default_permissions === 'string' &&\n ![':workspace', ':read-only', ':danger-full-access'].includes(config.default_permissions)\n ? 'custom'\n : null,\n permissionProfile:\n typeof config.default_permissions === 'string'\n ? { id: config.default_permissions, extends: null }\n : null,\n writableRoots: config.sandbox_workspace_write?.writable_roots ?? null,\n excludeTmpdirEnvVar: config.sandbox_workspace_write?.exclude_tmpdir_env_var ?? null,\n excludeSlashTmp: config.sandbox_workspace_write?.exclude_slash_tmp ?? null,\n permissionCapabilities: await this.readPermissionCapabilities(undefined, config),\n };\n }\n private async readPermissionCapabilities(\n threadId?: string,\n config?: ConfigReadResponse['config'],\n ): Promise<PermissionCapabilities> {\n if (!CODEX_COMPATIBILITY.verified.includes(this.state.codexVersion ?? ''))\n return permissionCapabilities(\n null,\n false,\n `\u6743\u9650\u6A21\u5F0F\u4EC5\u6838\u9A8C\u8FC7 Codex ${VERIFIED_CODEX_VERSION}\uFF1B\u5F53\u524D\u7248\u672C ${this.state.codexVersion ?? '\u672A\u77E5'}`,\n );\n try {\n const [requirements, first] = await Promise.all([\n this.call('configRequirements/read', undefined),\n this.call('experimentalFeature/list', { limit: 200, ...(threadId ? { threadId } : {}) }),\n ]);\n if (!Object.hasOwn(requirements, 'requirements') || !Array.isArray(first.data))\n throw new Error('Permission capability response is incomplete');\n const features = [...first.data];\n let cursor = first.nextCursor;\n const seen = new Set<string>();\n while (cursor) {\n if (seen.has(cursor) || seen.size >= 100) throw new Error('Invalid feature pagination');\n seen.add(cursor);\n const page = await this.call('experimentalFeature/list', {\n limit: 200,\n cursor,\n ...(threadId ? { threadId } : {}),\n });\n features.push(...page.data);\n cursor = page.nextCursor;\n }\n const configFeatures = config?.features;\n const explicit = isRecord(configFeatures) ? configFeatures.guardian_approval : undefined;\n const autoReview =\n typeof explicit === 'boolean'\n ? explicit\n : features.find((entry) => entry.name === 'guardian_approval')?.enabled === true;\n return permissionCapabilities(\n requirements.requirements as PermissionRequirements | null,\n autoReview,\n );\n } catch {\n return permissionCapabilities(\n null,\n false,\n '\u65E0\u6CD5\u6838\u5B9E\u5F53\u524D Codex \u7684\u529F\u80FD\u548C\u53D7\u7BA1\u8981\u6C42\uFF0C\u8BF7\u91CD\u8BD5\u6216\u68C0\u67E5\u7248\u672C\u652F\u6301',\n );\n }\n }\n private async validatePermissionSettings(\n cwd: string,\n settings?: Settings,\n threadId?: string,\n ): Promise<void> {\n if (!settings?.permissionMode && settings?.approvalReviewer === undefined) return;\n const epoch = this.epoch;\n const defaults =\n !threadId || !this.permissionState.has(threadId)\n ? await this.readRuntimeSettings(cwd)\n : undefined;\n const capabilities = defaults\n ? defaults.permissionCapabilities\n : await this.readPermissionCapabilities(threadId);\n if (epoch !== this.epoch)\n throw new AppError('CODEX_UNAVAILABLE', 'Codex \u8FD0\u884C\u5B9E\u4F8B\u5DF2\u53D8\u5316\uFF0C\u8BF7\u91CD\u8BD5');\n const model =\n settings.model ??\n (threadId ? this.permissionState.get(threadId)?.model : undefined) ??\n defaults?.model;\n const reason = settings.permissionMode\n ? permissionModeUnavailable(settings.permissionMode, capabilities, model)\n : permissionReviewerUnavailable(settings.approvalReviewer!, capabilities, model);\n if (reason) throw new AppError('PERMISSION_MODE_UNAVAILABLE', reason);\n }\n private async responseRuntimeSettings(result: ThreadStartResponse): Promise<RuntimeSettings> {\n const previous = this.permissionState.get(result.thread.id);\n const settings: RuntimeSettings = {\n model: result.model ?? result.thread.model ?? null,\n reasoningEffort: result.reasoningEffort ?? null,\n ...serviceTierSettings(result.serviceTier),\n ...permissionSettings(\n result.sandbox,\n result.approvalPolicy,\n result.approvalsReviewer,\n (result as ThreadStartResponse & ProfileProvenance).activePermissionProfile,\n result.cwd,\n ),\n permissionCapabilities: await this.readPermissionCapabilities(result.thread.id),\n };\n const latest = this.permissionState.get(result.thread.id);\n const confirmed =\n latest && latest !== previous\n ? { ...latest, permissionCapabilities: settings.permissionCapabilities }\n : settings;\n this.permissionState.set(result.thread.id, confirmed);\n // The service correctly keeps a newer settings notification over a lifecycle response.\n // Publish availability alongside that newer state so the delayed capability read is not lost.\n if (confirmed !== settings)\n this.emit({ type: 'threadSettings', threadId: result.thread.id, settings: confirmed });\n return settings;\n }\n async resumeThread(id: string, cwd: string, settings?: Settings): Promise<ThreadView> {\n this.validateSettings(settings);\n await this.validatePermissionSettings(cwd, settings, id);\n const titles = this.titles;\n let result: ThreadResumeResponse;\n try {\n result = await this.call('thread/resume', {\n threadId: id,\n cwd,\n ...threadSettings(settings),\n excludeTurns: true,\n });\n } catch (error) {\n // Verified with two 0.163.0 processes, for both legacy and paginated histories.\n // -32600 alone covers many failures; match this thread's writer conflict exactly.\n if (\n error instanceof CodexError &&\n error.rpcCode === -32600 &&\n error.message === `thread ${id} already has an active writer`\n )\n throw new AppError('THREAD_IN_USE', '\u6B64\u4F1A\u8BDD\u6B63\u88AB\u5176\u4ED6\u8FDB\u7A0B\u4F7F\u7528', 409, { threadId: id });\n throw error;\n }\n titles?.register(result);\n const view = await this.readThreadPage(result.thread.id);\n return { ...view, runtimeSettings: await this.responseRuntimeSettings(result) };\n }\n async forkThread(id: string, cwd: string, settings?: Settings): Promise<ThreadView> {\n this.validateSettings(settings);\n await this.validatePermissionSettings(cwd, settings, id);\n const titles = this.titles;\n const result = await this.call('thread/fork', {\n threadId: id,\n cwd,\n ...threadSettings(settings),\n // Omitting lastTurnId copies the persisted history, including an active turn's\n // interruption marker in the fork. The source is never resumed or interrupted.\n excludeTurns: true,\n });\n let forkedId: string | undefined;\n try {\n if (isRecord(result) && isRecord(result.thread) && typeof result.thread.id === 'string')\n forkedId = result.thread.id === id ? undefined : result.thread.id;\n const metadata = mapThread(result.thread);\n if (metadata.id === id)\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex fork returned the source thread ID');\n forkedId = metadata.id;\n const thread = await this.readThread(forkedId);\n if (thread.id !== forkedId)\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex returned a different fork thread ID');\n titles?.register(result);\n return { ...thread, runtimeSettings: await this.responseRuntimeSettings(result) };\n } catch (error) {\n const failure = asCodexError(error);\n // The mutating RPC already succeeded. A read failure cannot make a retry safe.\n throw new CodexError(\n failure.code,\n forkedId\n ? `\u5DF2\u521B\u5EFA\u5206\u652F\u4F1A\u8BDD ${forkedId}\uFF0C\u4F46\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2\uFF1B\u8BF7\u4ECE\u4F1A\u8BDD\u5217\u8868\u91CD\u65B0\u6253\u5F00\uFF0C\u4E0D\u8981\u91CD\u590D fork\u3002${failure.message}`\n : `Codex fork \u5DF2\u8FD4\u56DE\u7ED3\u679C\uFF0C\u4F46\u65E0\u6CD5\u786E\u8BA4\u65B0\u4F1A\u8BDD\uFF1B\u8BF7\u68C0\u67E5\u4F1A\u8BDD\u5217\u8868\uFF0C\u4E0D\u8981\u91CD\u590D fork\u3002${failure.message}`,\n true,\n failure.rpcCode,\n );\n }\n }\n async startTurn(\n id: string,\n cwd: string,\n text: string,\n settings?: Settings,\n images?: string[],\n ): Promise<TurnView> {\n this.validateSettings(settings);\n await this.validatePermissionSettings(cwd, settings, id);\n const turn = mapTurn(\n id,\n (\n await this.call('turn/start', {\n threadId: id,\n cwd,\n input: taskInput(text, images),\n ...turnSettings(cwd, settings),\n })\n ).turn,\n );\n return turn;\n }\n async startReview(id: string): Promise<TurnView> {\n const result = await this.call('review/start', {\n threadId: id,\n target: { type: 'uncommittedChanges' },\n delivery: 'inline',\n });\n if (!isRecord(result) || result.reviewThreadId !== id)\n throw new CodexError(\n 'PROTOCOL_INCOMPATIBLE',\n 'Codex review returned a different thread; review result needs reconciliation',\n true,\n );\n return mapTurn(id, result.turn);\n }\n steerTurn(\n id: string,\n turnId: string,\n text: string,\n images?: string[],\n ): Promise<TurnSteerResponse> {\n return this.call('turn/steer', {\n threadId: id,\n expectedTurnId: turnId,\n input: taskInput(text, images),\n });\n }\n async interruptTurn(id: string, turnId: string): Promise<void> {\n await this.call('turn/interrupt', { threadId: id, turnId });\n }\n\n async compactThread(id: string): Promise<void> {\n // The empty response acknowledges dispatch, not completion. Turn notifications\n // carry the compaction's identity and final outcome.\n await this.call('thread/compact/start', { threadId: id });\n }\n\n async executeCommand(\n processId: string,\n cwd: string,\n command: string,\n output: Parameters<NonNullable<CodexClient['executeCommand']>>[3],\n ) {\n this.commandOutputs.set(processId, output);\n try {\n return await this.call(\n 'command/exec',\n {\n processId,\n cwd,\n command:\n process.platform === 'win32'\n ? ['cmd.exe', '/d', '/s', '/c', command]\n : ['/bin/sh', '-c', command],\n streamStdoutStderr: true,\n streamStdin: false,\n tty: false,\n timeoutMs: SHELL_TIMEOUT_MS,\n outputBytesCap: SHELL_OUTPUT_BYTES / 2,\n // Omit sandboxPolicy: preserve the server's configured permission policy.\n },\n false,\n SHELL_TIMEOUT_MS + 5000,\n );\n } finally {\n this.commandOutputs.delete(processId);\n }\n }\n async terminateCommand(processId: string): Promise<void> {\n await this.call('command/exec/terminate', { processId });\n }\n\n private notification(message: RpcNotification): void {\n if (this.titles?.notification(message)) return;\n const event = message as ServerNotification;\n const p = event.params;\n switch (event.method) {\n case 'command/exec/outputDelta': {\n const { processId, stream, deltaBase64, capReached } = event.params;\n this.commandOutputs.get(processId)?.(\n stream,\n Buffer.from(deltaBase64, 'base64'),\n capReached,\n );\n break;\n }\n case 'thread/settings/updated':\n {\n const observed: RuntimeSettings = {\n model: event.params.threadSettings.model ?? null,\n reasoningEffort: event.params.threadSettings.effort ?? null,\n ...serviceTierSettings(event.params.threadSettings.serviceTier),\n ...permissionSettings(\n event.params.threadSettings.sandboxPolicy,\n event.params.threadSettings.approvalPolicy,\n event.params.threadSettings.approvalsReviewer,\n event.params.threadSettings.activePermissionProfile,\n event.params.threadSettings.cwd,\n ),\n permissionCapabilities: this.permissionState.get(event.params.threadId)\n ?.permissionCapabilities,\n };\n this.permissionState.set(event.params.threadId, observed);\n this.emit({\n type: 'threadSettings',\n threadId: event.params.threadId,\n settings: observed,\n });\n }\n break;\n case 'item/autoApprovalReview/started':\n case 'item/autoApprovalReview/completed':\n this.emit({\n type: 'autoReview',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n review: mapAutoReview(event.params),\n });\n break;\n case 'thread/started':\n this.emit({ type: 'thread', thread: mapThread(event.params.thread) });\n break;\n case 'thread/archived':\n this.archiveChanged(event.params.threadId, true);\n break;\n case 'thread/unarchived':\n this.archiveChanged(event.params.threadId, false);\n break;\n case 'thread/name/updated':\n this.emit({\n type: 'threadName',\n threadId: event.params.threadId,\n name: event.params.threadName,\n });\n break;\n case 'thread/status/changed':\n this.emit({\n type: 'threadStatus',\n threadId: event.params.threadId,\n status: threadStatus(event.params.status),\n });\n break;\n case 'turn/started':\n case 'turn/completed': {\n const { threadId, turn } = event.params;\n if (event.method === 'turn/started') this.tokenUsage.started(threadId, turn.id);\n const outputTokens =\n event.method === 'turn/completed'\n ? this.tokenUsage.completed(threadId, turn.id)\n : undefined;\n this.emit({\n type: 'turn',\n threadId,\n turn: {\n ...mapTurn(threadId, turn),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n },\n });\n if (event.method === 'turn/completed')\n this.expireActions(event.params.threadId, event.params.turn.id);\n break;\n }\n case 'thread/tokenUsage/updated':\n this.tokenUsage.updated(\n event.params.threadId,\n event.params.turnId,\n event.params.tokenUsage?.total?.outputTokens,\n );\n break;\n case 'thread/compacted':\n this.tokenUsage.compacted(event.params.threadId, event.params.turnId);\n this.emit({ type: 'compactionCompleted', ...event.params });\n break;\n case 'item/started':\n case 'item/completed':\n if (event.params.item.type === 'contextCompaction')\n this.tokenUsage.compacted(event.params.threadId, event.params.turnId);\n if (['agentMessage', 'plan', 'reasoning'].includes(event.params.item.type))\n this.emit({\n type: 'turnProgress',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n });\n this.emit({\n type: 'item',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n item: {\n ...mapItem(event.params.item),\n ...(event.params.item.type === 'contextCompaction'\n ? { status: event.method === 'item/started' ? 'inProgress' : 'completed' }\n : {}),\n },\n });\n break;\n case 'item/agentMessage/delta':\n case 'item/plan/delta':\n case 'item/reasoning/summaryTextDelta':\n case 'item/reasoning/textDelta':\n case 'item/commandExecution/outputDelta':\n case 'item/fileChange/outputDelta':\n // Background tool output can continue while the model stream is retrying.\n // Only model content proves that this turn's upstream stream resumed.\n if (!event.method.includes('outputDelta'))\n this.emit({\n type: 'turnProgress',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n });\n this.emit({\n type: 'delta',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n itemId: event.params.itemId,\n field: event.method.includes('outputDelta') ? 'output' : 'text',\n delta: event.params.delta,\n itemType: event.method.split('/')[1]!,\n });\n break;\n case 'item/reasoning/summaryPartAdded':\n case 'rawResponse/completed':\n this.emit({\n type: 'turnProgress',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n });\n break;\n case 'turn/diff/updated':\n this.emit({\n type: 'diff',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n diff: event.params.diff,\n });\n break;\n case 'item/fileChange/patchUpdated':\n this.emit({\n type: 'item',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n item: mapItem({\n type: 'fileChange',\n id: event.params.itemId,\n changes: event.params.changes,\n status: 'inProgress',\n }),\n });\n break;\n case 'serverRequest/resolved': {\n const actionId = this.actionIds.get(event.params.requestId);\n if (actionId) {\n this.emit({ type: 'actionResolved', actionId });\n this.actions.delete(actionId);\n this.actionIds.delete(event.params.requestId);\n }\n break;\n }\n case 'error':\n // Upstream retries/failures belong to a turn, not to the app-server process.\n this.emit({\n type: 'turnError',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n message: event.params.error.message,\n willRetry: event.params.willRetry,\n });\n break;\n default: // Unknown noninteractive notifications cannot authorize any action.\n if (!isRecord(p)) break;\n }\n }\n private async serverRequest(message: RpcServerRequest): Promise<void> {\n if (isRecord(message.params) && this.titles?.isInternal(message.params.threadId)) {\n await this.rpc?.reject(\n message.id,\n -32601,\n 'Interactive tools are disabled for title generation',\n );\n return;\n }\n const request = message as ServerRequest;\n const params: Record<string, unknown> = isRecord(message.params) ? message.params : {};\n const action: PendingAction = {\n actionId: randomUUID(),\n codexEpoch: this.epoch,\n rpcId: message.id,\n kind: 'unsupported',\n status: 'pending',\n title: '\u4E0D\u652F\u6301\u7684 Codex \u4EA4\u4E92\u8BF7\u6C42',\n options: [],\n ...(typeof params.threadId === 'string' ? { threadId: params.threadId } : {}),\n ...(typeof params.turnId === 'string' ? { turnId: params.turnId } : {}),\n };\n const decisions = new Map<string, CommandExecutionApprovalDecision>();\n if (\n request.method === 'item/commandExecution/requestApproval' ||\n request.method === 'item/fileChange/requestApproval'\n ) {\n for (const [id, label] of [\n ['accept', '\u5141\u8BB8\u672C\u6B21'],\n ['acceptForSession', '\u672C\u4F1A\u8BDD\u5141\u8BB8'],\n ['decline', '\u62D2\u7EDD'],\n ['cancel', '\u53D6\u6D88\u5F53\u524D\u4EFB\u52A1'],\n ] as const) {\n action.options.push({ id, label });\n decisions.set(id, id);\n }\n action.reason = request.params.reason ?? undefined;\n if (request.method === 'item/commandExecution/requestApproval') {\n const p = request.params;\n action.kind = p.networkApprovalContext ? 'network' : 'command';\n action.title = p.networkApprovalContext\n ? `\u7F51\u7EDC\u6743\u9650\uFF1A${p.networkApprovalContext.protocol}://${p.networkApprovalContext.host}`\n : '\u547D\u4EE4\u5BA1\u6279';\n action.command = p.command ?? undefined;\n action.cwd = p.cwd ?? undefined;\n action.details = {\n kind: p.kind,\n network: p.networkApprovalContext,\n commandActions: p.commandActions,\n };\n if (p.proposedExecpolicyAmendment) {\n action.options.push({\n id: 'acceptWithRule',\n label: `\u5141\u8BB8\u5E76\u8BB0\u4F4F\u547D\u4EE4\u89C4\u5219\uFF1A${p.proposedExecpolicyAmendment.join(' ')}`,\n });\n decisions.set('acceptWithRule', {\n acceptWithExecpolicyAmendment: { execpolicy_amendment: p.proposedExecpolicyAmendment },\n });\n }\n p.proposedNetworkPolicyAmendments?.forEach((amendment, index) => {\n const id = `networkRule:${index}`;\n action.options.push({ id, label: `\u5E94\u7528\u7F51\u7EDC\u89C4\u5219\uFF1A${JSON.stringify(amendment)}` });\n decisions.set(id, {\n applyNetworkPolicyAmendment: { network_policy_amendment: amendment },\n });\n });\n } else {\n action.kind = 'file';\n action.title = '\u6587\u4EF6\u53D8\u66F4\u5BA1\u6279';\n action.details = { itemId: request.params.itemId, grantRoot: request.params.grantRoot };\n }\n } else if (request.method === 'item/permissions/requestApproval') {\n const p = request.params;\n action.kind = 'permissions';\n action.title = '\u989D\u5916\u6743\u9650\u5BA1\u6279';\n action.reason = p.reason ?? undefined;\n action.cwd = p.cwd;\n action.options = [\n { id: 'accept', label: '\u5F53\u524D\u4EFB\u52A1\u5141\u8BB8' },\n { id: 'acceptForSession', label: '\u672C\u4F1A\u8BDD\u5141\u8BB8' },\n { id: 'decline', label: '\u62D2\u7EDD' },\n ];\n action.permissionRequest = {\n ...(p.permissions.network === null ? {} : { network: p.permissions.network.enabled }),\n ...(p.permissions.fileSystem === null\n ? {}\n : {\n fileSystem: {\n read: p.permissions.fileSystem.read ?? [],\n write: p.permissions.fileSystem.write ?? [],\n entries: (p.permissions.fileSystem.entries ?? []).map((entry) => ({\n path: permissionPathLabel(entry.path),\n access: entry.access,\n })),\n ...(p.permissions.fileSystem.globScanMaxDepth === undefined\n ? {}\n : {\n globScanMaxDepth: p.permissions.fileSystem.globScanMaxDepth,\n }),\n },\n }),\n };\n action.details = {\n itemId: p.itemId,\n environmentId: p.environmentId,\n permissions: p.permissions,\n };\n } else if (request.method === 'mcpServer/elicitation/request') {\n action.kind = 'elicitation';\n action.reason = request.params.message;\n action.elicitation = normalizeElicitationRequest(params);\n action.title = `${action.elicitation.approval ? 'MCP \u5DE5\u5177\u5BA1\u6279' : 'MCP \u4EA4\u4E92'}\uFF1A${request.params.serverName}`;\n action.options = [\n {\n id: 'accept',\n label: action.elicitation.approval\n ? '\u5141\u8BB8\u672C\u6B21'\n : action.elicitation.mode === 'url'\n ? '\u5DF2\u5B8C\u6210\uFF0C\u7EE7\u7EED'\n : '\u63D0\u4EA4',\n },\n ...(action.elicitation.approval?.allowSession\n ? [{ id: 'acceptSession', label: '\u672C\u4F1A\u8BDD\u5141\u8BB8' }]\n : []),\n { id: 'decline', label: '\u62D2\u7EDD' },\n { id: 'cancel', label: '\u53D6\u6D88' },\n ];\n // Keep an unsupported schema reviewable while allowing an explicit decline/cancel.\n if (action.elicitation.schemaError)\n action.details = { requestedSchema: params.requestedSchema, mode: params.mode };\n } else if (request.method === 'item/tool/requestUserInput') {\n action.kind = 'questions';\n action.title = '\u9700\u8981\u4F60\u7684\u56DE\u7B54';\n action.blocking = request.params.isBlocking;\n action.questions = request.params.questions.map((question) => ({\n ...question,\n options: question.options ?? [],\n }));\n } else {\n action.status = 'expired';\n action.reason = `\u5F53\u524D Web UI \u5C1A\u672A\u5B9E\u73B0 ${message.method}`;\n this.emit({ type: 'action', action });\n this.state.error = action.reason;\n this.publishRuntime();\n await this.rpc!.reject(\n message.id,\n -32601,\n `Unsupported interactive request: ${message.method}`,\n );\n return;\n }\n this.actions.set(action.actionId, { action, request, decisions, responding: false });\n this.actionIds.set(message.id, action.actionId);\n this.emit({ type: 'action', action: structuredClone(action) });\n }\n async respond(actionId: string, resolution: ActionResolution): Promise<void> {\n const context = this.actions.get(actionId);\n if (!context || context.action.codexEpoch !== this.epoch || !this.ready)\n throw new AppError('ACTION_EXPIRED', '\u6B64\u4EBA\u5DE5\u8BF7\u6C42\u5DF2\u5931\u6548', 409);\n if (context.responding) throw new AppError('ACTION_CONFLICT', '\u6B64\u4EBA\u5DE5\u8BF7\u6C42\u5DF2\u63D0\u4EA4\u56DE\u7B54', 409);\n let response:\n | ToolRequestUserInputResponse\n | CommandExecutionRequestApprovalResponse\n | FileChangeRequestApprovalResponse\n | PermissionsRequestApprovalResponse\n | McpServerElicitationRequestResponse;\n if (context.request.method === 'item/permissions/requestApproval') {\n const decision = validatePermissionResolution(resolution);\n const requested = context.request.params.permissions;\n response = {\n permissions:\n decision === 'decline'\n ? {}\n : structuredClone({\n ...(requested.network === null ? {} : { network: requested.network }),\n ...(requested.fileSystem === null ? {} : { fileSystem: requested.fileSystem }),\n }),\n scope: decision === 'acceptForSession' ? 'session' : 'turn',\n };\n } else if (context.request.method === 'mcpServer/elicitation/request') {\n const content = validateElicitationResolution(\n normalizeElicitationRequest({ ...context.request.params }),\n resolution,\n );\n response = {\n action: (resolution as { decision: 'accept' | 'decline' | 'cancel' }).decision,\n content,\n _meta:\n 'decision' in resolution && resolution.persist === 'session'\n ? { persist: 'session' }\n : null,\n };\n } else if (context.request.method === 'item/tool/requestUserInput') {\n if (!('answers' in resolution))\n throw new AppError('VALIDATION_ERROR', '\u6B64\u8BF7\u6C42\u9700\u8981\u7ED3\u6784\u5316\u56DE\u7B54');\n const questions = context.request.params.questions;\n const ids = new Set(questions.map((question) => question.id));\n if (Object.keys(resolution.answers).some((id) => !ids.has(id)))\n throw new AppError('VALIDATION_ERROR', '\u56DE\u7B54\u5305\u542B\u672A\u77E5\u9898\u76EE');\n const answers: ToolRequestUserInputResponse['answers'] = {};\n for (const question of questions) {\n const values = resolution.answers[question.id];\n if (\n !Array.isArray(values) ||\n !values.length ||\n values.some((value) => typeof value !== 'string' || !value.trim())\n )\n throw new AppError('VALIDATION_ERROR', `\u8BF7\u56DE\u7B54 ${question.header}`);\n if (\n question.options?.length &&\n !question.isOther &&\n values.some((value) => !question.options!.some((option) => option.label === value))\n )\n throw new AppError('VALIDATION_ERROR', `\u9898\u76EE ${question.header} \u53EA\u63A5\u53D7\u6240\u5217\u9009\u9879`);\n answers[question.id] = { answers: values };\n }\n response = { answers };\n } else {\n if (\n !('decision' in resolution) ||\n 'content' in resolution ||\n 'persist' in resolution ||\n !context.decisions.has(resolution.decision)\n )\n throw new AppError('VALIDATION_ERROR', '\u6B64\u8BF7\u6C42\u4E0D\u652F\u6301\u6240\u63D0\u4EA4\u7684\u51B3\u5B9A');\n response = { decision: context.decisions.get(resolution.decision)! };\n }\n context.responding = true;\n try {\n await this.rpc!.respond(context.action.rpcId, response);\n } catch (error) {\n if (error instanceof CodexError && !error.uncertain) context.responding = false;\n throw error;\n }\n }\n private expireActions(threadId?: string, turnId?: string): void {\n for (const [id, context] of this.actions) {\n if (threadId && context.action.threadId !== threadId) continue;\n if (turnId && context.action.turnId !== turnId) continue;\n this.emit({ type: 'action', action: { ...context.action, status: 'expired' } });\n this.actions.delete(id);\n this.actionIds.delete(context.action.rpcId);\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { CODEX_COMPATIBILITY } from './compatibility.js';\nimport { SHELL_TIMEOUT_MS, SHELL_OUTPUT_BYTES } from '../shared/shell.js';\nimport type { CommandExecResponse } from './generated/v2/CommandExecResponse.js';\nimport type { CommandExecTerminateResponse } from './generated/v2/CommandExecTerminateResponse.js';\nimport { spawn, execFile, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport { promisify } from 'node:util';\nimport { ThreadTitles } from './thread-titles.js';\nimport { TurnTokenUsage } from './turn-token-usage.js';\nimport { AppError } from '../shared/errors.js';\nimport { threadNameError } from '../shared/thread-name.js';\nimport { permissionModeUnavailable, permissionReviewerUnavailable } from '../shared/permissions.js';\nimport {\n permissionCapabilities,\n type PermissionRequirements,\n type ProfileProvenance,\n} from './permissions.js';\nimport { mapAutoReview } from './auto-review.js';\nimport {\n normalizeElicitationRequest,\n validateElicitationResolution,\n validatePermissionResolution,\n} from '../shared/elicitation.js';\nimport type {\n ActionResolution,\n PermissionCapabilities,\n RuntimeSettings,\n PendingAction,\n Settings,\n ModelDefaults,\n ModelDefaultsResult,\n ThreadPage,\n ThreadView,\n TurnView,\n} from '../shared/types.js';\nimport type { ClientRequest } from './generated/ClientRequest.js';\nimport type { ServerNotification } from './generated/ServerNotification.js';\nimport type { ServerRequest } from './generated/ServerRequest.js';\nimport type { InitializeResponse } from './generated/InitializeResponse.js';\nimport type { GetAccountResponse } from './generated/v2/GetAccountResponse.js';\nimport type { ModelListResponse } from './generated/v2/ModelListResponse.js';\nimport type { ConfigReadResponse } from './generated/v2/ConfigReadResponse.js';\nimport type { ConfigWriteResponse } from './generated/v2/ConfigWriteResponse.js';\nimport type { ConfigRequirementsReadResponse } from './generated/v2/ConfigRequirementsReadResponse.js';\nimport type { ExperimentalFeatureListResponse } from './generated/v2/ExperimentalFeatureListResponse.js';\nimport type { Thread } from './generated/v2/Thread.js';\nimport type { ThreadArchiveResponse } from './generated/v2/ThreadArchiveResponse.js';\nimport type { ThreadSetNameResponse } from './generated/v2/ThreadSetNameResponse.js';\nimport type { ThreadUnarchiveResponse } from './generated/v2/ThreadUnarchiveResponse.js';\nimport type { ThreadLoadedListResponse } from './generated/v2/ThreadLoadedListResponse.js';\nimport type { ThreadListResponse } from './generated/v2/ThreadListResponse.js';\nimport type { ThreadReadResponse } from './generated/v2/ThreadReadResponse.js';\nimport type { ThreadStartResponse } from './generated/v2/ThreadStartResponse.js';\nimport type { ThreadForkResponse } from './generated/v2/ThreadForkResponse.js';\nimport type { ThreadResumeResponse } from './generated/v2/ThreadResumeResponse.js';\nimport type { ThreadTurnsListResponse } from './generated/v2/ThreadTurnsListResponse.js';\nimport type { ThreadItemsListResponse } from './generated/v2/ThreadItemsListResponse.js';\nimport type { TurnStartResponse } from './generated/v2/TurnStartResponse.js';\nimport type { ReviewStartResponse } from './generated/v2/ReviewStartResponse.js';\nimport type { TurnSteerResponse } from './generated/v2/TurnSteerResponse.js';\nimport type { TurnInterruptResponse } from './generated/v2/TurnInterruptResponse.js';\nimport type { CommandExecutionApprovalDecision } from './generated/v2/CommandExecutionApprovalDecision.js';\nimport type { CommandExecutionRequestApprovalResponse } from './generated/v2/CommandExecutionRequestApprovalResponse.js';\nimport type { FileChangeRequestApprovalResponse } from './generated/v2/FileChangeRequestApprovalResponse.js';\nimport type { ToolRequestUserInputResponse } from './generated/v2/ToolRequestUserInputResponse.js';\nimport type { PermissionsRequestApprovalResponse } from './generated/v2/PermissionsRequestApprovalResponse.js';\nimport type { McpServerElicitationRequestResponse } from './generated/v2/McpServerElicitationRequestResponse.js';\nimport type { FileSystemPath } from './generated/v2/FileSystemPath.js';\nimport {\n mapItem,\n mapThread,\n mapTurn,\n permissionSettings,\n serviceTierSettings,\n threadSettings,\n threadStatus,\n turnSettings,\n taskInput,\n} from './mapping.js';\nimport {\n asCodexError,\n CodexError,\n isRecord,\n RpcTransport,\n type RpcId,\n type RpcNotification,\n type RpcServerRequest,\n} from './transport.js';\nimport type { CodexClient, CodexDiagnostics, CodexEvent } from './types.js';\nimport type { ThreadCompactStartResponse } from './generated/v2/ThreadCompactStartResponse.js';\nexport type {\n CodexClient,\n CodexDiagnostics,\n CodexEvent,\n CodexEvent as AdapterEvent,\n} from './types.js';\nexport { CodexError } from './transport.js';\n\nexport const VERIFIED_CODEX_VERSION = CODEX_COMPATIBILITY.recommended;\nconst CAPABILITIES = [\n 'command/exec',\n 'command/exec/terminate',\n 'thread/name/set',\n 'thread/start',\n 'thread/fork',\n 'thread/read',\n 'thread/list',\n 'thread/resume',\n 'thread/archive',\n 'thread/loaded/list',\n 'thread/unarchive',\n 'thread/compact/start',\n 'thread/turns/list',\n 'thread/items/list',\n 'turn/start',\n 'review/start',\n 'turn/steer',\n 'turn/interrupt',\n 'model/list',\n 'config/read',\n 'config/batchWrite',\n 'configRequirements/read',\n 'experimentalFeature/list',\n 'account/read',\n];\ntype Responses = {\n 'command/exec': CommandExecResponse;\n 'command/exec/terminate': CommandExecTerminateResponse;\n 'thread/name/set': ThreadSetNameResponse;\n initialize: InitializeResponse;\n 'account/read': GetAccountResponse;\n 'model/list': ModelListResponse;\n 'config/read': ConfigReadResponse;\n 'config/batchWrite': ConfigWriteResponse;\n 'configRequirements/read': ConfigRequirementsReadResponse;\n 'experimentalFeature/list': ExperimentalFeatureListResponse;\n 'thread/list': ThreadListResponse;\n 'thread/read': ThreadReadResponse;\n 'thread/start': ThreadStartResponse;\n 'thread/fork': ThreadForkResponse;\n 'thread/resume': ThreadResumeResponse;\n 'thread/loaded/list': ThreadLoadedListResponse;\n 'thread/archive': ThreadArchiveResponse;\n 'thread/unarchive': ThreadUnarchiveResponse;\n 'thread/compact/start': ThreadCompactStartResponse;\n 'thread/turns/list': ThreadTurnsListResponse;\n 'thread/items/list': ThreadItemsListResponse;\n 'turn/start': TurnStartResponse;\n 'review/start': ReviewStartResponse;\n 'turn/steer': TurnSteerResponse;\n 'turn/interrupt': TurnInterruptResponse;\n};\nexport interface CodexAdapterOptions {\n binary: string;\n home?: string;\n /** Explicit argument override for the test simulator; production leaves this unset. */\n args?: string[];\n requestTimeoutMs?: number;\n titleTimeoutMs?: number;\n maxLineBytes?: number;\n maxStderrBytes?: number;\n}\ntype ActionContext = {\n action: PendingAction;\n request: ServerRequest;\n decisions: Map<string, CommandExecutionApprovalDecision>;\n responding: boolean;\n};\n\nfunction permissionPathLabel(path: FileSystemPath): string {\n if (path.type === 'path') return path.path;\n if (path.type === 'glob_pattern') return `\u5339\u914D\uFF1A${path.pattern}`;\n const special = path.value;\n const subpath =\n 'subpath' in special && special.subpath !== null ? `\uFF08\u5B50\u8DEF\u5F84\uFF1A${special.subpath}\uFF09` : '';\n switch (special.kind) {\n case 'root':\n return '\u6574\u4E2A\u6587\u4EF6\u7CFB\u7EDF\uFF08/\uFF09';\n case 'minimal':\n return '\u7CFB\u7EDF\u57FA\u7840\u8FD0\u884C\u76EE\u5F55';\n case 'project_roots':\n return `\u9879\u76EE\u6839\u76EE\u5F55${subpath}`;\n case 'tmpdir':\n return '\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\uFF08TMPDIR\uFF09';\n case 'slash_tmp':\n return '/tmp';\n case 'unknown':\n return `\u7279\u6B8A\u8DEF\u5F84\uFF1A${special.path}${subpath}`;\n }\n}\n\nexport class CodexAdapter implements CodexClient {\n private readonly commandOutputs = new Map<\n string,\n Parameters<NonNullable<CodexClient['executeCommand']>>[3]\n >();\n epoch = randomUUID();\n private child?: ChildProcessWithoutNullStreams;\n private rpc?: RpcTransport;\n private stopped = true;\n private starting?: Promise<void>;\n private recovering?: Promise<void>;\n private restartTimer?: NodeJS.Timeout;\n private restartAttempt = 0;\n private titles?: ThreadTitles;\n private readonly tokenUsage = new TurnTokenUsage();\n // Ordering only. Persisted archive state belongs exclusively to Codex.\n private archiveSequence = 0;\n private readonly archives = new Map<string, { archived: boolean; sequence: number }>();\n private listeners = new Set<(event: CodexEvent) => void>();\n private actions = new Map<string, ActionContext>();\n private actionIds = new Map<RpcId, string>();\n private stderrTail = Buffer.alloc(0);\n private disabled = new Set<string>();\n private permissionState = new Map<string, RuntimeSettings>();\n private state: CodexDiagnostics = {\n ready: false,\n connection: 'starting',\n codexVersion: null,\n verifiedVersion: VERIFIED_CODEX_VERSION,\n compatibility: 'unavailable',\n codexEpoch: this.epoch,\n authenticated: null,\n models: [],\n capabilities: [],\n };\n constructor(private readonly options: CodexAdapterOptions) {}\n get pid(): number | undefined {\n return this.child?.pid;\n }\n get ready(): boolean {\n return this.state.ready;\n }\n diagnostics(): CodexDiagnostics {\n return structuredClone(this.state);\n }\n onEvent(listener: (event: CodexEvent) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n private emit(event: CodexEvent): void {\n for (const listener of this.listeners) listener(event);\n }\n private publishRuntime(): void {\n this.emit({ type: 'runtime', diagnostics: this.diagnostics() });\n }\n\n async start(): Promise<void> {\n if (this.starting) return this.starting;\n this.stopped = false;\n this.starting = this.startProcess();\n try {\n await this.starting;\n } finally {\n this.starting = undefined;\n }\n }\n private async startProcess(): Promise<void> {\n if (this.child) throw new CodexError('CODEX_BUSY', 'Codex app-server is already started');\n this.epoch = randomUUID();\n this.disabled.clear();\n this.archives.clear();\n this.state = {\n ...this.state,\n codexEpoch: this.epoch,\n ready: false,\n connection: 'starting',\n error: undefined,\n capabilities: [],\n };\n this.publishRuntime();\n try {\n const env = {\n ...process.env,\n ...(this.options.home === undefined ? {} : { CODEX_HOME: this.options.home }),\n };\n const { stdout } = await promisify(execFile)(this.options.binary, ['--version'], {\n env,\n timeout: 5000,\n maxBuffer: 64 * 1024,\n });\n const version = stdout.trim().replace(/^codex-cli\\s+/, '');\n this.state.codexVersion = version;\n this.permissionState.clear();\n this.state.compatibility = CODEX_COMPATIBILITY.verified.includes(version)\n ? 'verified'\n : 'unverified';\n const child = spawn(\n this.options.binary,\n this.options.args ?? ['app-server', '--listen', 'stdio://'],\n { env, stdio: ['pipe', 'pipe', 'pipe'], shell: false },\n );\n this.child = child;\n const rpc = new RpcTransport(child.stdin, child.stdout, {\n timeoutMs: this.options.requestTimeoutMs,\n maxLineBytes: this.options.maxLineBytes,\n });\n this.rpc = rpc;\n this.titles = new ThreadTitles(rpc, this.options.titleTimeoutMs);\n child.stderr.on('data', (chunk: Buffer) => {\n const max = this.options.maxStderrBytes ?? 64 * 1024;\n this.stderrTail = Buffer.concat([this.stderrTail, chunk.subarray(-max)]).subarray(-max);\n });\n child.on('error', (error) =>\n rpc.fail(new CodexError('CODEX_UNAVAILABLE', `Cannot start Codex: ${error.message}`, true)),\n );\n child.on('exit', (code, signal) => {\n rpc.fail(\n new CodexError(\n 'CODEX_UNAVAILABLE',\n `Codex exited (${signal ?? code ?? 'unknown'})`,\n true,\n ),\n );\n if (this.child === child) this.child = undefined;\n });\n rpc.on('notification', (message: RpcNotification) => {\n try {\n this.notification(message);\n } catch (error) {\n rpc.fail(asCodexError(error));\n }\n });\n rpc.on('request', (message: RpcServerRequest) => {\n void this.serverRequest(message).catch((error: unknown) => rpc.fail(asCodexError(error)));\n });\n rpc.on('failure', (error: CodexError) => {\n if (this.rpc !== rpc) return;\n const wasReady = this.ready;\n this.state.ready = false;\n this.tokenUsage.clear();\n this.state.connection = 'unavailable';\n this.state.error = error.message;\n this.expireActions();\n this.publishRuntime();\n if (!child.killed) child.kill('SIGTERM');\n const kill = setTimeout(() => {\n if (child.exitCode === null && child.signalCode === null) child.kill('SIGKILL');\n }, 2500);\n kill.unref();\n child.once('exit', () => clearTimeout(kill));\n if (wasReady && !this.stopped) {\n // Only metadata is logged: never RPC params, results, or session contents.\n console.error('Codex transport failed', {\n code: error.code,\n ...(error.details as object),\n });\n this.scheduleRestart();\n }\n });\n const initialized = await this.call(\n 'initialize',\n {\n clientInfo: { name: 'codex_web_ui', title: 'Codex Web UI', version: '0.1.0' },\n capabilities: {\n experimentalApi: true,\n requestAttestation: false,\n explicitGatewayOauth: true,\n },\n },\n true,\n );\n if (!isRecord(initialized) || typeof initialized.userAgent !== 'string')\n throw new CodexError(\n 'PROTOCOL_INCOMPATIBLE',\n 'Codex initialize returned a malformed result',\n true,\n );\n await rpc.notify('initialized');\n const [account, models] = await Promise.all([\n this.call('account/read', { refreshToken: false }, true),\n this.call('model/list', { limit: 100 }, true),\n ]);\n if (\n !isRecord(account) ||\n !Object.hasOwn(account, 'account') ||\n typeof account.requiresOpenaiAuth !== 'boolean'\n )\n throw new CodexError(\n 'PROTOCOL_INCOMPATIBLE',\n 'Codex account/read returned a malformed result',\n true,\n );\n this.state.authenticated = account.account !== null || !account.requiresOpenaiAuth;\n this.state.models = models.data.map((model) => ({\n id: model.model,\n name: model.displayName,\n description: model.description,\n reasoningEfforts: model.supportedReasoningEfforts.map((effort) => effort.reasoningEffort),\n defaultReasoningEffort: model.defaultReasoningEffort,\n serviceTiers:\n model.serviceTiers?.map((tier) => (tier.id === 'priority' ? 'fast' : tier.id)) ??\n model.additionalSpeedTiers,\n }));\n let cursor = models.nextCursor;\n const seen = new Set<string>();\n while (cursor) {\n if (seen.has(cursor) || seen.size >= 100)\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid model pagination');\n seen.add(cursor);\n const page = await this.call('model/list', { limit: 100, cursor }, true);\n this.state.models.push(\n ...page.data.map((model) => ({\n id: model.model,\n name: model.displayName,\n description: model.description,\n reasoningEfforts: model.supportedReasoningEfforts.map(\n (effort) => effort.reasoningEffort,\n ),\n defaultReasoningEffort: model.defaultReasoningEffort,\n serviceTiers:\n model.serviceTiers?.map((tier) => (tier.id === 'priority' ? 'fast' : tier.id)) ??\n model.additionalSpeedTiers,\n })),\n );\n cursor = page.nextCursor;\n }\n this.titles?.configure(\n account.account?.type === 'chatgpt',\n this.state.models.map((model) => model.id),\n );\n this.state.ready = true;\n this.state.connection = 'ready';\n this.state.capabilities = CAPABILITIES.filter((method) => !this.disabled.has(method));\n this.publishRuntime();\n } catch (error) {\n const failure = asCodexError(error);\n this.state.ready = false;\n this.state.connection = 'unavailable';\n this.state.error = failure.message;\n this.publishRuntime();\n await this.stopProcess(failure);\n this.scheduleRestart();\n throw failure;\n }\n }\n async stop(): Promise<void> {\n this.stopped = true;\n clearTimeout(this.restartTimer);\n this.restartTimer = undefined;\n await this.starting?.catch(() => {});\n await this.recovering;\n await this.stopProcess();\n }\n private scheduleRestart(): void {\n if (this.stopped || this.restartTimer) return;\n const delay = Math.min(1000 * 2 ** Math.min(this.restartAttempt++, 5), 30_000);\n this.restartTimer = setTimeout(() => {\n this.restartTimer = undefined;\n this.recovering = (async () => {\n await this.stopProcess();\n if (this.stopped) return;\n try {\n await this.start();\n this.restartAttempt = 0;\n } catch {\n this.scheduleRestart();\n }\n })();\n void this.recovering.finally(() => {\n this.recovering = undefined;\n });\n }, delay);\n this.restartTimer.unref();\n }\n private async stopProcess(\n reason = new CodexError('CODEX_UNAVAILABLE', 'Codex connection closed by this service', true),\n ): Promise<void> {\n const child = this.child;\n this.state.ready = false;\n this.state.connection = 'unavailable';\n this.expireActions();\n this.rpc?.fail(reason);\n if (!child || child.exitCode !== null || child.signalCode !== null) return;\n child.stdin.end();\n await new Promise<void>((resolve) => {\n const term = setTimeout(() => child.kill('SIGTERM'), 1000);\n const kill = setTimeout(() => child.kill('SIGKILL'), 2500);\n const done = setTimeout(() => {\n cleanup();\n resolve();\n }, 3500);\n const cleanup = () => {\n clearTimeout(term);\n clearTimeout(kill);\n clearTimeout(done);\n };\n child.once('exit', () => {\n cleanup();\n resolve();\n });\n });\n if (this.child === child) this.child = undefined;\n }\n private async call<M extends keyof Responses>(\n method: M,\n params: Extract<ClientRequest, { method: M }>['params'],\n initializing = false,\n timeoutMs?: number,\n ): Promise<Responses[M]> {\n if (!this.rpc || (!initializing && !this.ready))\n throw new CodexError('CODEX_UNAVAILABLE', 'Codex is not ready');\n if (this.disabled.has(method))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', `Codex does not support ${method}`);\n try {\n return await this.rpc.request<Responses[M]>(method, params, undefined, timeoutMs);\n } catch (error) {\n // Concurrent startup calls can inherit the same error when cleanup fails the transport.\n if (!initializing && error instanceof CodexError && error.rpcCode === -32601) {\n this.disabled.add(method);\n this.state.capabilities = this.state.capabilities.filter((name) => name !== method);\n this.state.error = `\u5F53\u524D Codex \u7F3A\u5C11 ${method} \u80FD\u529B`;\n this.publishRuntime();\n }\n throw error;\n }\n }\n private validateSettings(settings: Settings = {}): void {\n const model =\n settings.model === undefined\n ? undefined\n : this.state.models.find((entry) => entry.id === settings.model);\n if (settings.model !== undefined && !model)\n throw new AppError('VALIDATION_ERROR', '\u6A21\u578B\u4E0D\u5728\u5F53\u524D Codex \u6A21\u578B\u5217\u8868\u4E2D');\n if (\n settings.reasoningEffort !== undefined &&\n !(\n model?.reasoningEfforts ?? this.state.models.flatMap((entry) => entry.reasoningEfforts)\n ).includes(settings.reasoningEffort)\n )\n throw new AppError('VALIDATION_ERROR', '\u6240\u9009\u63A8\u7406\u5F3A\u5EA6\u4E0D\u53D7\u5F53\u524D\u6A21\u578B\u652F\u6301');\n }\n async listThreads(\n cwd: string | string[],\n cursor?: string,\n archived = false,\n ): Promise<ThreadPage> {\n const sequence = ++this.archiveSequence;\n const result = await this.call('thread/list', {\n cwd,\n cursor,\n limit: 30,\n archived,\n sourceKinds: ['cli', 'appServer', 'vscode'],\n sortKey: 'updated_at',\n sortDirection: 'desc',\n });\n return {\n data: result.data.map((thread) => ({\n ...mapThread(thread),\n archived: this.observeArchive(thread.id, archived, sequence),\n })),\n nextCursor: result.nextCursor,\n };\n }\n\n private observeArchive(id: string, archived: boolean, sequence: number): boolean {\n const current = this.archives.get(id);\n if (current && current.sequence > sequence) return current.archived;\n this.archives.set(id, { archived, sequence });\n return archived;\n }\n\n private archiveChanged(id: string, archived: boolean): void {\n this.observeArchive(id, archived, ++this.archiveSequence);\n this.emit({ type: 'threadArchive', threadId: id, archived });\n }\n\n /** thread/read has no archive field. Query the native index, including paginated history,\n * instead of guessing from the unstable rollout path or maintaining a second database. */\n private async storedThread(thread: Thread, sequence: number): Promise<ThreadView> {\n let cursor: string | null = null;\n const seen = new Set<string>();\n let archived = false;\n do {\n const page: ThreadListResponse = await this.call('thread/list', {\n archived: true,\n cwd: thread.cwd,\n cursor,\n limit: 100,\n sourceKinds: [\n 'cli',\n 'vscode',\n 'exec',\n 'appServer',\n 'subAgent',\n 'subAgentReview',\n 'subAgentCompact',\n 'subAgentThreadSpawn',\n 'subAgentOther',\n 'unknown',\n ],\n });\n if (page.data.some((entry) => entry.id === thread.id)) {\n archived = true;\n break;\n }\n cursor = page.nextCursor;\n if (cursor && (seen.has(cursor) || seen.size >= 1000))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid archive pagination');\n if (cursor) seen.add(cursor);\n } while (cursor);\n return { ...mapThread(thread), archived: this.observeArchive(thread.id, archived, sequence) };\n }\n\n /** Native archive also shuts down spawned descendants, even already-archived ones. */\n private async assertArchiveIdle(rootId: string): Promise<void> {\n const threads = new Map<string, Thread>();\n const read = async (id: string): Promise<Thread> => {\n let thread = threads.get(id);\n if (!thread) {\n thread = (await this.call('thread/read', { threadId: id, includeTurns: false })).thread;\n threads.set(id, thread);\n }\n return thread;\n };\n let cursor: string | null = null;\n const seen = new Set<string>();\n do {\n const page: ThreadLoadedListResponse = await this.call('thread/loaded/list', {\n cursor,\n limit: 100,\n });\n for (const id of page.data) {\n let thread: Thread;\n try {\n thread = await read(id);\n } catch (error) {\n // A completed helper can unload after the loaded-thread snapshot.\n if (\n error instanceof CodexError &&\n error.rpcCode === -32600 &&\n error.message === `thread not loaded: ${id}`\n )\n continue;\n throw error;\n }\n if (thread.status.type !== 'active') continue;\n const ancestors = new Set<string>();\n for (;;) {\n if (thread.id === rootId)\n throw new AppError('THREAD_BUSY', '\u4F1A\u8BDD\u6216\u5176\u5B50\u4EFB\u52A1\u4ECD\u5728\u8FD0\u884C\uFF0C\u7ED3\u675F\u540E\u624D\u80FD\u5F52\u6863', 409);\n if (!thread.parentThreadId) break;\n if (ancestors.has(thread.id))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid thread ancestry');\n ancestors.add(thread.id);\n thread = await read(thread.parentThreadId);\n }\n }\n cursor = page.nextCursor;\n if (cursor && (seen.has(cursor) || seen.size >= 1000))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid loaded thread pagination');\n if (cursor) seen.add(cursor);\n } while (cursor);\n }\n\n async renameThread(id: string, name: string): Promise<void> {\n const problem = threadNameError(name);\n if (problem) throw new AppError('VALIDATION_ERROR', problem);\n const epoch = this.epoch;\n // A generated name may already be on the wire. Finish it before the explicit write.\n await this.titles?.prepareManualName(id);\n if (this.epoch !== epoch || !this.ready)\n throw new CodexError(\n 'CODEX_UNAVAILABLE',\n '\u91CD\u547D\u540D\u7B49\u5F85\u671F\u95F4 Codex \u5B9E\u4F8B\u5DF2\u53D8\u5316\uFF0C\u8BF7\u6838\u5BF9\u540D\u79F0',\n true,\n );\n await this.call('thread/name/set', { threadId: id, name: name.trim() });\n }\n\n async archiveThread(id: string): Promise<void> {\n await this.assertArchiveIdle(id);\n await this.call('thread/archive', { threadId: id });\n this.archiveChanged(id, true);\n }\n\n async unarchiveThread(id: string): Promise<ThreadView> {\n const { thread } = await this.call('thread/unarchive', { threadId: id });\n this.archiveChanged(id, false);\n return { ...mapThread(thread), archived: false };\n }\n private async readThreadHeader(id: string): Promise<Thread> {\n try {\n return (await this.call('thread/read', { threadId: id, includeTurns: false })).thread;\n } catch (error) {\n if (\n error instanceof CodexError &&\n error.rpcCode === -32600 &&\n error.message === `thread not loaded: ${id}`\n )\n throw new AppError('THREAD_NOT_FOUND', '\u4F1A\u8BDD\u5C1A\u672A\u4FDD\u5B58\u6216\u5DF2\u4E0D\u5B58\u5728', 404, { threadId: id });\n throw error;\n }\n }\n\n async readThreadMetadata(id: string): Promise<ThreadView> {\n const sequence = ++this.archiveSequence;\n return this.storedThread(await this.readThreadHeader(id), sequence);\n }\n async readThreadPage(id: string, continuation?: string): Promise<ThreadView> {\n const epoch = this.epoch;\n let cursor: string | null = null;\n if (continuation) {\n try {\n const decoded = JSON.parse(Buffer.from(continuation, 'base64url').toString('utf8'));\n if (\n decoded.threadId !== id ||\n decoded.epoch !== epoch ||\n typeof decoded.cursor !== 'string'\n )\n throw new Error('Invalid cursor');\n cursor = decoded.cursor;\n } catch {\n throw new AppError('HISTORY_CURSOR_EXPIRED', '\u5386\u53F2\u5206\u9875\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u540C\u6B65\u4F1A\u8BDD\u3002', 409);\n }\n }\n const sequence = ++this.archiveSequence;\n const header = await this.readThreadHeader(id);\n // Legacy rollout files expose no paging protocol. Keep the compatibility path explicit.\n if (header.historyMode !== 'paginated') return this.readThread(id);\n const page = await this.call('thread/turns/list', {\n threadId: id,\n cursor,\n limit: 12,\n sortDirection: 'desc',\n itemsView: 'summary',\n });\n if (page.nextCursor && page.nextCursor === cursor)\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid turn pagination');\n await this.hydrateTurns(id, page.data);\n if (this.epoch !== epoch)\n throw new AppError('HISTORY_CURSOR_EXPIRED', '\u8BFB\u53D6\u671F\u95F4 Codex \u5DF2\u91CD\u542F\uFF0C\u8BF7\u91CD\u65B0\u540C\u6B65\u4F1A\u8BDD\u3002', 409);\n const view = await this.storedThread(\n { ...header, turns: page.data.slice().reverse() },\n sequence,\n );\n return {\n ...view,\n history: {\n olderCursor: page.nextCursor\n ? Buffer.from(\n JSON.stringify({\n threadId: id,\n epoch,\n cursor: page.nextCursor,\n }),\n ).toString('base64url')\n : null,\n },\n };\n }\n\n private async hydrateTurns(id: string, turns: Thread['turns']): Promise<void> {\n for (const turn of turns) {\n if (turn.itemsView === 'full') continue;\n let cursor: string | null = null;\n const seen = new Set<string>();\n turn.items = [];\n do {\n const page: ThreadItemsListResponse = await this.call('thread/items/list', {\n threadId: id,\n turnId: turn.id,\n cursor,\n limit: 20,\n sortDirection: 'asc',\n });\n turn.items.push(...page.data.map((entry) => entry.item));\n cursor = page.nextCursor;\n if (cursor && (seen.has(cursor) || seen.size >= 1000))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid item pagination');\n if (cursor) seen.add(cursor);\n } while (cursor);\n }\n }\n\n async readThread(id: string): Promise<ThreadView> {\n const sequence = ++this.archiveSequence;\n const thread = await this.readThreadHeader(id);\n if (thread.historyMode !== 'paginated')\n return this.storedThread(\n (await this.call('thread/read', { threadId: id, includeTurns: true })).thread,\n sequence,\n );\n let cursor: string | null = null;\n const seen = new Set<string>();\n thread.turns = [];\n do {\n const page: ThreadTurnsListResponse = await this.call('thread/turns/list', {\n threadId: id,\n cursor,\n limit: 100,\n sortDirection: 'asc',\n itemsView: 'summary',\n });\n for (const turn of page.data) {\n if (turn.itemsView !== 'full') {\n let itemCursor: string | null = null;\n const itemSeen = new Set<string>();\n turn.items = [];\n do {\n const items: ThreadItemsListResponse = await this.call('thread/items/list', {\n threadId: id,\n turnId: turn.id,\n cursor: itemCursor,\n limit: 20,\n sortDirection: 'asc',\n });\n turn.items.push(...items.data.map((entry) => entry.item));\n itemCursor = items.nextCursor;\n if (itemCursor && (itemSeen.has(itemCursor) || itemSeen.size >= 1000))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid item pagination');\n if (itemCursor) itemSeen.add(itemCursor);\n } while (itemCursor);\n }\n }\n thread.turns.push(...page.data);\n cursor = page.nextCursor;\n if (cursor && (seen.has(cursor) || seen.size >= 1000))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Invalid turn pagination');\n if (cursor) seen.add(cursor);\n } while (cursor);\n return this.storedThread(thread, sequence);\n }\n async createThread(cwd: string, settings?: Settings): Promise<ThreadView> {\n this.validateSettings(settings);\n await this.validatePermissionSettings(cwd, settings);\n const titles = this.titles;\n const result = await this.call('thread/start', { cwd, ...threadSettings(settings) });\n this.tokenUsage.created(result.thread.id);\n titles?.register(result);\n return {\n ...mapThread(result.thread),\n runtimeSettings: await this.responseRuntimeSettings(result),\n };\n }\n async saveModelDefaults(settings: ModelDefaults): Promise<ModelDefaultsResult> {\n this.validateSettings({\n model: settings.model,\n ...(settings.reasoningEffort === null ? {} : { reasoningEffort: settings.reasoningEffort }),\n });\n // Match the CLI picker: write a complete pair to the owning server's user/profile config.\n // No file path or permission fields can be supplied by the browser.\n const result = await this.call('config/batchWrite', {\n edits: [\n { keyPath: 'model', value: settings.model, mergeStrategy: 'replace' },\n {\n keyPath: 'model_reasoning_effort',\n value: settings.reasoningEffort,\n mergeStrategy: 'replace',\n },\n ],\n reloadUserConfig: true,\n });\n return { status: result.status };\n }\n async readRuntimeSettings(cwd: string): Promise<RuntimeSettings> {\n const { config } = await this.call('config/read', { cwd, includeLayers: false });\n // Config can contain credentials and instructions. Only displayable fields cross the gateway.\n return {\n model: typeof config.model === 'string' ? config.model : null,\n reasoningEffort:\n typeof config.model_reasoning_effort === 'string' ? config.model_reasoning_effort : null,\n ...serviceTierSettings(config.service_tier),\n sandbox: config.sandbox_mode ?? null,\n approvalPolicy:\n typeof config.approval_policy === 'string'\n ? config.approval_policy\n : config.approval_policy\n ? 'granular'\n : null,\n approvalReviewer: config.approvals_reviewer ?? null,\n networkAccess:\n config.sandbox_mode === 'workspace-write'\n ? (config.sandbox_workspace_write?.network_access ?? null)\n : null,\n permissionMode:\n typeof config.default_permissions === 'string' &&\n ![':workspace', ':read-only', ':danger-full-access'].includes(config.default_permissions)\n ? 'custom'\n : null,\n permissionProfile:\n typeof config.default_permissions === 'string'\n ? { id: config.default_permissions, extends: null }\n : null,\n writableRoots: config.sandbox_workspace_write?.writable_roots ?? null,\n excludeTmpdirEnvVar: config.sandbox_workspace_write?.exclude_tmpdir_env_var ?? null,\n excludeSlashTmp: config.sandbox_workspace_write?.exclude_slash_tmp ?? null,\n permissionCapabilities: await this.readPermissionCapabilities(undefined, config),\n };\n }\n private async readPermissionCapabilities(\n threadId?: string,\n config?: ConfigReadResponse['config'],\n ): Promise<PermissionCapabilities> {\n if (!CODEX_COMPATIBILITY.verified.includes(this.state.codexVersion ?? ''))\n return permissionCapabilities(\n null,\n false,\n `\u6743\u9650\u6A21\u5F0F\u4EC5\u6838\u9A8C\u8FC7 Codex ${VERIFIED_CODEX_VERSION}\uFF1B\u5F53\u524D\u7248\u672C ${this.state.codexVersion ?? '\u672A\u77E5'}`,\n );\n try {\n const [requirements, first] = await Promise.all([\n this.call('configRequirements/read', undefined),\n this.call('experimentalFeature/list', { limit: 200, ...(threadId ? { threadId } : {}) }),\n ]);\n if (!Object.hasOwn(requirements, 'requirements') || !Array.isArray(first.data))\n throw new Error('Permission capability response is incomplete');\n const features = [...first.data];\n let cursor = first.nextCursor;\n const seen = new Set<string>();\n while (cursor) {\n if (seen.has(cursor) || seen.size >= 100) throw new Error('Invalid feature pagination');\n seen.add(cursor);\n const page = await this.call('experimentalFeature/list', {\n limit: 200,\n cursor,\n ...(threadId ? { threadId } : {}),\n });\n features.push(...page.data);\n cursor = page.nextCursor;\n }\n const configFeatures = config?.features;\n const explicit = isRecord(configFeatures) ? configFeatures.guardian_approval : undefined;\n const autoReview =\n typeof explicit === 'boolean'\n ? explicit\n : features.find((entry) => entry.name === 'guardian_approval')?.enabled === true;\n return permissionCapabilities(\n requirements.requirements as PermissionRequirements | null,\n autoReview,\n );\n } catch {\n return permissionCapabilities(\n null,\n false,\n '\u65E0\u6CD5\u6838\u5B9E\u5F53\u524D Codex \u7684\u529F\u80FD\u548C\u53D7\u7BA1\u8981\u6C42\uFF0C\u8BF7\u91CD\u8BD5\u6216\u68C0\u67E5\u7248\u672C\u652F\u6301',\n );\n }\n }\n private async validatePermissionSettings(\n cwd: string,\n settings?: Settings,\n threadId?: string,\n ): Promise<void> {\n if (!settings?.permissionMode && settings?.approvalReviewer === undefined) return;\n const epoch = this.epoch;\n const defaults =\n !threadId || !this.permissionState.has(threadId)\n ? await this.readRuntimeSettings(cwd)\n : undefined;\n const capabilities = defaults\n ? defaults.permissionCapabilities\n : await this.readPermissionCapabilities(threadId);\n if (epoch !== this.epoch)\n throw new AppError('CODEX_UNAVAILABLE', 'Codex \u8FD0\u884C\u5B9E\u4F8B\u5DF2\u53D8\u5316\uFF0C\u8BF7\u91CD\u8BD5');\n const model =\n settings.model ??\n (threadId ? this.permissionState.get(threadId)?.model : undefined) ??\n defaults?.model;\n const reason = settings.permissionMode\n ? permissionModeUnavailable(settings.permissionMode, capabilities, model)\n : permissionReviewerUnavailable(settings.approvalReviewer!, capabilities, model);\n if (reason) throw new AppError('PERMISSION_MODE_UNAVAILABLE', reason);\n }\n private async responseRuntimeSettings(result: ThreadStartResponse): Promise<RuntimeSettings> {\n const previous = this.permissionState.get(result.thread.id);\n const settings: RuntimeSettings = {\n model: result.model ?? result.thread.model ?? null,\n reasoningEffort: result.reasoningEffort ?? null,\n ...serviceTierSettings(result.serviceTier),\n ...permissionSettings(\n result.sandbox,\n result.approvalPolicy,\n result.approvalsReviewer,\n (result as ThreadStartResponse & ProfileProvenance).activePermissionProfile,\n result.cwd,\n ),\n permissionCapabilities: await this.readPermissionCapabilities(result.thread.id),\n };\n const latest = this.permissionState.get(result.thread.id);\n const confirmed =\n latest && latest !== previous\n ? { ...latest, permissionCapabilities: settings.permissionCapabilities }\n : settings;\n this.permissionState.set(result.thread.id, confirmed);\n // The service correctly keeps a newer settings notification over a lifecycle response.\n // Publish availability alongside that newer state so the delayed capability read is not lost.\n if (confirmed !== settings)\n this.emit({ type: 'threadSettings', threadId: result.thread.id, settings: confirmed });\n return settings;\n }\n async resumeThread(id: string, cwd: string, settings?: Settings): Promise<ThreadView> {\n this.validateSettings(settings);\n await this.validatePermissionSettings(cwd, settings, id);\n const titles = this.titles;\n let result: ThreadResumeResponse;\n try {\n result = await this.call('thread/resume', {\n threadId: id,\n cwd,\n ...threadSettings(settings),\n excludeTurns: true,\n });\n } catch (error) {\n // Verified with two 0.163.0 processes, for both legacy and paginated histories.\n // -32600 alone covers many failures; match this thread's writer conflict exactly.\n if (\n error instanceof CodexError &&\n error.rpcCode === -32600 &&\n error.message === `thread ${id} already has an active writer`\n )\n throw new AppError('THREAD_IN_USE', '\u6B64\u4F1A\u8BDD\u6B63\u88AB\u5176\u4ED6\u8FDB\u7A0B\u4F7F\u7528', 409, { threadId: id });\n throw error;\n }\n titles?.register(result);\n const view = await this.readThreadPage(result.thread.id);\n return { ...view, runtimeSettings: await this.responseRuntimeSettings(result) };\n }\n async forkThread(id: string, cwd: string, settings?: Settings): Promise<ThreadView> {\n this.validateSettings(settings);\n await this.validatePermissionSettings(cwd, settings, id);\n const titles = this.titles;\n const result = await this.call('thread/fork', {\n threadId: id,\n cwd,\n ...threadSettings(settings),\n // Omitting lastTurnId copies the persisted history, including an active turn's\n // interruption marker in the fork. The source is never resumed or interrupted.\n excludeTurns: true,\n });\n let forkedId: string | undefined;\n try {\n if (isRecord(result) && isRecord(result.thread) && typeof result.thread.id === 'string')\n forkedId = result.thread.id === id ? undefined : result.thread.id;\n const metadata = mapThread(result.thread);\n if (metadata.id === id)\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex fork returned the source thread ID');\n forkedId = metadata.id;\n const thread = await this.readThread(forkedId);\n if (thread.id !== forkedId)\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex returned a different fork thread ID');\n titles?.register(result);\n return { ...thread, runtimeSettings: await this.responseRuntimeSettings(result) };\n } catch (error) {\n const failure = asCodexError(error);\n // The mutating RPC already succeeded. A read failure cannot make a retry safe.\n throw new CodexError(\n failure.code,\n forkedId\n ? `\u5DF2\u521B\u5EFA\u5206\u652F\u4F1A\u8BDD ${forkedId}\uFF0C\u4F46\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2\uFF1B\u8BF7\u4ECE\u4F1A\u8BDD\u5217\u8868\u91CD\u65B0\u6253\u5F00\uFF0C\u4E0D\u8981\u91CD\u590D fork\u3002${failure.message}`\n : `Codex fork \u5DF2\u8FD4\u56DE\u7ED3\u679C\uFF0C\u4F46\u65E0\u6CD5\u786E\u8BA4\u65B0\u4F1A\u8BDD\uFF1B\u8BF7\u68C0\u67E5\u4F1A\u8BDD\u5217\u8868\uFF0C\u4E0D\u8981\u91CD\u590D fork\u3002${failure.message}`,\n true,\n failure.rpcCode,\n );\n }\n }\n async startTurn(\n id: string,\n cwd: string,\n text: string,\n settings?: Settings,\n images?: string[],\n ): Promise<TurnView> {\n this.validateSettings(settings);\n await this.validatePermissionSettings(cwd, settings, id);\n const turn = mapTurn(\n id,\n (\n await this.call('turn/start', {\n threadId: id,\n cwd,\n input: taskInput(text, images),\n ...turnSettings(cwd, settings),\n })\n ).turn,\n );\n return turn;\n }\n async startReview(id: string): Promise<TurnView> {\n const result = await this.call('review/start', {\n threadId: id,\n target: { type: 'uncommittedChanges' },\n delivery: 'inline',\n });\n if (!isRecord(result) || result.reviewThreadId !== id)\n throw new CodexError(\n 'PROTOCOL_INCOMPATIBLE',\n 'Codex review returned a different thread; review result needs reconciliation',\n true,\n );\n return mapTurn(id, result.turn);\n }\n steerTurn(\n id: string,\n turnId: string,\n text: string,\n images?: string[],\n ): Promise<TurnSteerResponse> {\n return this.call('turn/steer', {\n threadId: id,\n expectedTurnId: turnId,\n input: taskInput(text, images),\n });\n }\n async interruptTurn(id: string, turnId: string): Promise<void> {\n await this.call('turn/interrupt', { threadId: id, turnId });\n }\n\n async compactThread(id: string): Promise<void> {\n // The empty response acknowledges dispatch, not completion. Turn notifications\n // carry the compaction's identity and final outcome.\n await this.call('thread/compact/start', { threadId: id });\n }\n\n async executeCommand(\n processId: string,\n cwd: string,\n command: string,\n output: Parameters<NonNullable<CodexClient['executeCommand']>>[3],\n ) {\n this.commandOutputs.set(processId, output);\n try {\n return await this.call(\n 'command/exec',\n {\n processId,\n cwd,\n command:\n process.platform === 'win32'\n ? ['cmd.exe', '/d', '/s', '/c', command]\n : ['/bin/sh', '-c', command],\n streamStdoutStderr: true,\n streamStdin: false,\n tty: false,\n timeoutMs: SHELL_TIMEOUT_MS,\n outputBytesCap: SHELL_OUTPUT_BYTES / 2,\n // Omit sandboxPolicy: preserve the server's configured permission policy.\n },\n false,\n SHELL_TIMEOUT_MS + 5000,\n );\n } finally {\n this.commandOutputs.delete(processId);\n }\n }\n async terminateCommand(processId: string): Promise<void> {\n await this.call('command/exec/terminate', { processId });\n }\n\n private notification(message: RpcNotification): void {\n if (this.titles?.notification(message)) return;\n const event = message as ServerNotification;\n const p = event.params;\n switch (event.method) {\n case 'command/exec/outputDelta': {\n const { processId, stream, deltaBase64, capReached } = event.params;\n this.commandOutputs.get(processId)?.(\n stream,\n Buffer.from(deltaBase64, 'base64'),\n capReached,\n );\n break;\n }\n case 'thread/settings/updated':\n {\n const observed: RuntimeSettings = {\n model: event.params.threadSettings.model ?? null,\n reasoningEffort: event.params.threadSettings.effort ?? null,\n ...serviceTierSettings(event.params.threadSettings.serviceTier),\n ...permissionSettings(\n event.params.threadSettings.sandboxPolicy,\n event.params.threadSettings.approvalPolicy,\n event.params.threadSettings.approvalsReviewer,\n event.params.threadSettings.activePermissionProfile,\n event.params.threadSettings.cwd,\n ),\n permissionCapabilities: this.permissionState.get(event.params.threadId)\n ?.permissionCapabilities,\n };\n this.permissionState.set(event.params.threadId, observed);\n this.emit({\n type: 'threadSettings',\n threadId: event.params.threadId,\n settings: observed,\n });\n }\n break;\n case 'item/autoApprovalReview/started':\n case 'item/autoApprovalReview/completed':\n this.emit({\n type: 'autoReview',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n review: mapAutoReview(event.params),\n });\n break;\n case 'thread/started':\n this.emit({ type: 'thread', thread: mapThread(event.params.thread) });\n break;\n case 'thread/archived':\n this.archiveChanged(event.params.threadId, true);\n break;\n case 'thread/unarchived':\n this.archiveChanged(event.params.threadId, false);\n break;\n case 'thread/name/updated':\n this.emit({\n type: 'threadName',\n threadId: event.params.threadId,\n name: event.params.threadName,\n });\n break;\n case 'thread/status/changed':\n this.emit({\n type: 'threadStatus',\n threadId: event.params.threadId,\n status: threadStatus(event.params.status),\n });\n break;\n case 'turn/started':\n case 'turn/completed': {\n const { threadId, turn } = event.params;\n if (event.method === 'turn/started') this.tokenUsage.started(threadId, turn.id);\n const outputTokens =\n event.method === 'turn/completed'\n ? this.tokenUsage.completed(threadId, turn.id)\n : undefined;\n this.emit({\n type: 'turn',\n threadId,\n turn: {\n ...mapTurn(threadId, turn),\n ...(outputTokens !== undefined ? { outputTokens } : {}),\n },\n });\n if (event.method === 'turn/completed')\n this.expireActions(event.params.threadId, event.params.turn.id);\n break;\n }\n case 'thread/tokenUsage/updated':\n this.tokenUsage.updated(\n event.params.threadId,\n event.params.turnId,\n event.params.tokenUsage?.total?.outputTokens,\n );\n break;\n case 'thread/compacted':\n this.tokenUsage.compacted(event.params.threadId, event.params.turnId);\n this.emit({ type: 'compactionCompleted', ...event.params });\n break;\n case 'item/started':\n case 'item/completed':\n if (event.params.item.type === 'contextCompaction')\n this.tokenUsage.compacted(event.params.threadId, event.params.turnId);\n if (['agentMessage', 'plan', 'reasoning'].includes(event.params.item.type))\n this.emit({\n type: 'turnProgress',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n });\n this.emit({\n type: 'item',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n item: {\n ...mapItem(event.params.item),\n ...(event.params.item.type === 'contextCompaction'\n ? { status: event.method === 'item/started' ? 'inProgress' : 'completed' }\n : {}),\n },\n });\n break;\n case 'item/agentMessage/delta':\n case 'item/plan/delta':\n case 'item/reasoning/summaryTextDelta':\n case 'item/reasoning/textDelta':\n case 'item/commandExecution/outputDelta':\n case 'item/fileChange/outputDelta':\n // Background tool output can continue while the model stream is retrying.\n // Only model content proves that this turn's upstream stream resumed.\n if (!event.method.includes('outputDelta'))\n this.emit({\n type: 'turnProgress',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n });\n this.emit({\n type: 'delta',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n itemId: event.params.itemId,\n field: event.method.includes('outputDelta') ? 'output' : 'text',\n delta: event.params.delta,\n itemType: event.method.split('/')[1]!,\n });\n break;\n case 'item/reasoning/summaryPartAdded':\n case 'rawResponse/completed':\n this.emit({\n type: 'turnProgress',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n });\n break;\n case 'turn/diff/updated':\n this.emit({\n type: 'diff',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n diff: event.params.diff,\n });\n break;\n case 'item/fileChange/patchUpdated':\n this.emit({\n type: 'item',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n item: mapItem({\n type: 'fileChange',\n id: event.params.itemId,\n changes: event.params.changes,\n status: 'inProgress',\n }),\n });\n break;\n case 'serverRequest/resolved': {\n const actionId = this.actionIds.get(event.params.requestId);\n if (actionId) {\n this.emit({ type: 'actionResolved', actionId });\n this.actions.delete(actionId);\n this.actionIds.delete(event.params.requestId);\n }\n break;\n }\n case 'error':\n // Upstream retries/failures belong to a turn, not to the app-server process.\n this.emit({\n type: 'turnError',\n threadId: event.params.threadId,\n turnId: event.params.turnId,\n message: event.params.error.message,\n willRetry: event.params.willRetry,\n });\n break;\n default: // Unknown noninteractive notifications cannot authorize any action.\n if (!isRecord(p)) break;\n }\n }\n private async serverRequest(message: RpcServerRequest): Promise<void> {\n if (isRecord(message.params) && this.titles?.isInternal(message.params.threadId)) {\n await this.rpc?.reject(\n message.id,\n -32601,\n 'Interactive tools are disabled for title generation',\n );\n return;\n }\n const request = message as ServerRequest;\n const params: Record<string, unknown> = isRecord(message.params) ? message.params : {};\n const action: PendingAction = {\n actionId: randomUUID(),\n codexEpoch: this.epoch,\n rpcId: message.id,\n kind: 'unsupported',\n status: 'pending',\n title: '\u4E0D\u652F\u6301\u7684 Codex \u4EA4\u4E92\u8BF7\u6C42',\n options: [],\n ...(typeof params.threadId === 'string' ? { threadId: params.threadId } : {}),\n ...(typeof params.turnId === 'string' ? { turnId: params.turnId } : {}),\n };\n const decisions = new Map<string, CommandExecutionApprovalDecision>();\n if (\n request.method === 'item/commandExecution/requestApproval' ||\n request.method === 'item/fileChange/requestApproval'\n ) {\n for (const [id, label] of [\n ['accept', '\u5141\u8BB8\u672C\u6B21'],\n ['acceptForSession', '\u672C\u4F1A\u8BDD\u5141\u8BB8'],\n ['decline', '\u62D2\u7EDD'],\n ['cancel', '\u53D6\u6D88\u5F53\u524D\u4EFB\u52A1'],\n ] as const) {\n action.options.push({ id, label });\n decisions.set(id, id);\n }\n action.reason = request.params.reason ?? undefined;\n if (request.method === 'item/commandExecution/requestApproval') {\n const p = request.params;\n action.kind = p.networkApprovalContext ? 'network' : 'command';\n action.title = p.networkApprovalContext\n ? `\u7F51\u7EDC\u6743\u9650\uFF1A${p.networkApprovalContext.protocol}://${p.networkApprovalContext.host}`\n : '\u547D\u4EE4\u5BA1\u6279';\n action.command = p.command ?? undefined;\n action.cwd = p.cwd ?? undefined;\n action.details = {\n kind: p.kind,\n network: p.networkApprovalContext,\n commandActions: p.commandActions,\n };\n if (p.proposedExecpolicyAmendment) {\n action.options.push({\n id: 'acceptWithRule',\n label: `\u5141\u8BB8\u5E76\u8BB0\u4F4F\u547D\u4EE4\u89C4\u5219\uFF1A${p.proposedExecpolicyAmendment.join(' ')}`,\n });\n decisions.set('acceptWithRule', {\n acceptWithExecpolicyAmendment: { execpolicy_amendment: p.proposedExecpolicyAmendment },\n });\n }\n p.proposedNetworkPolicyAmendments?.forEach((amendment, index) => {\n const id = `networkRule:${index}`;\n action.options.push({ id, label: `\u5E94\u7528\u7F51\u7EDC\u89C4\u5219\uFF1A${JSON.stringify(amendment)}` });\n decisions.set(id, {\n applyNetworkPolicyAmendment: { network_policy_amendment: amendment },\n });\n });\n } else {\n action.kind = 'file';\n action.title = '\u6587\u4EF6\u53D8\u66F4\u5BA1\u6279';\n action.details = { itemId: request.params.itemId, grantRoot: request.params.grantRoot };\n }\n } else if (request.method === 'item/permissions/requestApproval') {\n const p = request.params;\n action.kind = 'permissions';\n action.title = '\u989D\u5916\u6743\u9650\u5BA1\u6279';\n action.reason = p.reason ?? undefined;\n action.cwd = p.cwd;\n action.options = [\n { id: 'accept', label: '\u5F53\u524D\u4EFB\u52A1\u5141\u8BB8' },\n { id: 'acceptForSession', label: '\u672C\u4F1A\u8BDD\u5141\u8BB8' },\n { id: 'decline', label: '\u62D2\u7EDD' },\n ];\n action.permissionRequest = {\n ...(p.permissions.network === null ? {} : { network: p.permissions.network.enabled }),\n ...(p.permissions.fileSystem === null\n ? {}\n : {\n fileSystem: {\n read: p.permissions.fileSystem.read ?? [],\n write: p.permissions.fileSystem.write ?? [],\n entries: (p.permissions.fileSystem.entries ?? []).map((entry) => ({\n path: permissionPathLabel(entry.path),\n access: entry.access,\n })),\n ...(p.permissions.fileSystem.globScanMaxDepth === undefined\n ? {}\n : {\n globScanMaxDepth: p.permissions.fileSystem.globScanMaxDepth,\n }),\n },\n }),\n };\n action.details = {\n itemId: p.itemId,\n environmentId: p.environmentId,\n permissions: p.permissions,\n };\n } else if (request.method === 'mcpServer/elicitation/request') {\n action.kind = 'elicitation';\n action.reason = request.params.message;\n action.elicitation = normalizeElicitationRequest(params);\n action.title = `${action.elicitation.approval ? 'MCP \u5DE5\u5177\u5BA1\u6279' : 'MCP \u4EA4\u4E92'}\uFF1A${request.params.serverName}`;\n action.options = [\n {\n id: 'accept',\n label: action.elicitation.approval\n ? '\u5141\u8BB8\u672C\u6B21'\n : action.elicitation.mode === 'url'\n ? '\u5DF2\u5B8C\u6210\uFF0C\u7EE7\u7EED'\n : '\u63D0\u4EA4',\n },\n ...(action.elicitation.approval?.allowSession\n ? [{ id: 'acceptSession', label: '\u672C\u4F1A\u8BDD\u5141\u8BB8' }]\n : []),\n { id: 'decline', label: '\u62D2\u7EDD' },\n { id: 'cancel', label: '\u53D6\u6D88' },\n ];\n // Keep an unsupported schema reviewable while allowing an explicit decline/cancel.\n if (action.elicitation.schemaError)\n action.details = { requestedSchema: params.requestedSchema, mode: params.mode };\n } else if (request.method === 'item/tool/requestUserInput') {\n action.kind = 'questions';\n action.title = '\u9700\u8981\u4F60\u7684\u56DE\u7B54';\n action.blocking = request.params.isBlocking;\n action.questions = request.params.questions.map((question) => ({\n ...question,\n options: question.options ?? [],\n }));\n } else {\n action.status = 'expired';\n action.reason = `\u5F53\u524D Web UI \u5C1A\u672A\u5B9E\u73B0 ${message.method}`;\n this.emit({ type: 'action', action });\n this.state.error = action.reason;\n this.publishRuntime();\n await this.rpc!.reject(\n message.id,\n -32601,\n `Unsupported interactive request: ${message.method}`,\n );\n return;\n }\n this.actions.set(action.actionId, { action, request, decisions, responding: false });\n this.actionIds.set(message.id, action.actionId);\n this.emit({ type: 'action', action: structuredClone(action) });\n }\n async respond(actionId: string, resolution: ActionResolution): Promise<void> {\n const context = this.actions.get(actionId);\n if (!context || context.action.codexEpoch !== this.epoch || !this.ready)\n throw new AppError('ACTION_EXPIRED', '\u6B64\u4EBA\u5DE5\u8BF7\u6C42\u5DF2\u5931\u6548', 409);\n if (context.responding) throw new AppError('ACTION_CONFLICT', '\u6B64\u4EBA\u5DE5\u8BF7\u6C42\u5DF2\u63D0\u4EA4\u56DE\u7B54', 409);\n let response:\n | ToolRequestUserInputResponse\n | CommandExecutionRequestApprovalResponse\n | FileChangeRequestApprovalResponse\n | PermissionsRequestApprovalResponse\n | McpServerElicitationRequestResponse;\n if (context.request.method === 'item/permissions/requestApproval') {\n const decision = validatePermissionResolution(resolution);\n const requested = context.request.params.permissions;\n response = {\n permissions:\n decision === 'decline'\n ? {}\n : structuredClone({\n ...(requested.network === null ? {} : { network: requested.network }),\n ...(requested.fileSystem === null ? {} : { fileSystem: requested.fileSystem }),\n }),\n scope: decision === 'acceptForSession' ? 'session' : 'turn',\n };\n } else if (context.request.method === 'mcpServer/elicitation/request') {\n const content = validateElicitationResolution(\n normalizeElicitationRequest({ ...context.request.params }),\n resolution,\n );\n response = {\n action: (resolution as { decision: 'accept' | 'decline' | 'cancel' }).decision,\n content,\n _meta:\n 'decision' in resolution && resolution.persist === 'session'\n ? { persist: 'session' }\n : null,\n };\n } else if (context.request.method === 'item/tool/requestUserInput') {\n if (!('answers' in resolution))\n throw new AppError('VALIDATION_ERROR', '\u6B64\u8BF7\u6C42\u9700\u8981\u7ED3\u6784\u5316\u56DE\u7B54');\n const questions = context.request.params.questions;\n const ids = new Set(questions.map((question) => question.id));\n if (Object.keys(resolution.answers).some((id) => !ids.has(id)))\n throw new AppError('VALIDATION_ERROR', '\u56DE\u7B54\u5305\u542B\u672A\u77E5\u9898\u76EE');\n const answers: ToolRequestUserInputResponse['answers'] = {};\n for (const question of questions) {\n const values = resolution.answers[question.id];\n if (\n !Array.isArray(values) ||\n !values.length ||\n values.some((value) => typeof value !== 'string' || !value.trim())\n )\n throw new AppError('VALIDATION_ERROR', `\u8BF7\u56DE\u7B54 ${question.header}`);\n if (\n question.options?.length &&\n !question.isOther &&\n values.some((value) => !question.options!.some((option) => option.label === value))\n )\n throw new AppError('VALIDATION_ERROR', `\u9898\u76EE ${question.header} \u53EA\u63A5\u53D7\u6240\u5217\u9009\u9879`);\n answers[question.id] = { answers: values };\n }\n response = { answers };\n } else {\n if (\n !('decision' in resolution) ||\n 'content' in resolution ||\n 'persist' in resolution ||\n !context.decisions.has(resolution.decision)\n )\n throw new AppError('VALIDATION_ERROR', '\u6B64\u8BF7\u6C42\u4E0D\u652F\u6301\u6240\u63D0\u4EA4\u7684\u51B3\u5B9A');\n response = { decision: context.decisions.get(resolution.decision)! };\n }\n context.responding = true;\n try {\n await this.rpc!.respond(context.action.rpcId, response);\n } catch (error) {\n if (error instanceof CodexError && !error.uncertain) context.responding = false;\n throw error;\n }\n }\n private expireActions(threadId?: string, turnId?: string): void {\n for (const [id, context] of this.actions) {\n if (threadId && context.action.threadId !== threadId) continue;\n if (turnId && context.action.turnId !== turnId) continue;\n this.emit({ type: 'action', action: { ...context.action, status: 'expired' } });\n this.actions.delete(id);\n this.actionIds.delete(context.action.rpcId);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["CodexError"]
|
|
7
7
|
}
|