@covro/covro 0.5.1-dev.1 → 0.5.1-dev.3
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 +5 -1
- package/README.zh-CN.md +5 -1
- package/dist/codex/adapter.js +3 -1
- package/dist/codex/adapter.js.map +2 -2
- package/dist/codex/mapping.js +10 -1
- package/dist/codex/mapping.js.map +2 -2
- package/dist/server/capacity-retry.js +176 -0
- package/dist/server/capacity-retry.js.map +7 -0
- package/dist/server/db/operations.js +11 -0
- package/dist/server/db/operations.js.map +2 -2
- package/dist/server/github-repository.js +61 -0
- package/dist/server/github-repository.js.map +7 -0
- package/dist/server/http.js +22 -0
- package/dist/server/http.js.map +2 -2
- package/dist/server/projection.js +10 -3
- package/dist/server/projection.js.map +2 -2
- package/dist/server/service.js +152 -5
- package/dist/server/service.js.map +2 -2
- package/dist/shared/turn-errors.js +25 -0
- package/dist/shared/turn-errors.js.map +7 -0
- package/dist/shared/validation.js +2 -0
- package/dist/shared/validation.js.map +2 -2
- package/dist/web/assets/{abnfDiagram-WEYOIA3C-B7ZgLRcz.js → abnfDiagram-WEYOIA3C-ATf52olP.js} +1 -1
- package/dist/web/assets/{arc-l2Y0qpaA.js → arc-ChLnTnZI.js} +1 -1
- package/dist/web/assets/{architecture-WOLXFQ4H-CPMJhOrI.js → architecture-WOLXFQ4H-B2oEg329.js} +1 -1
- package/dist/web/assets/{architectureDiagram-ZHVYKT53-BGyNOKZB.js → architectureDiagram-ZHVYKT53-BzSXU9d0.js} +1 -1
- package/dist/web/assets/{blockDiagram-RJAE7QA3-CFTsFM2C.js → blockDiagram-RJAE7QA3-xhCZ7iUm.js} +1 -1
- package/dist/web/assets/{c4Diagram-XDPPPE54-DePVq6hL.js → c4Diagram-XDPPPE54-DZ8j79Mx.js} +1 -1
- package/dist/web/assets/channel-COC5jFhc.js +1 -0
- package/dist/web/assets/{chunk-2E7WHVMD-BjwXDHKa.js → chunk-2E7WHVMD-y5rSOViW.js} +1 -1
- package/dist/web/assets/{chunk-4EMNKR2T-DfazpkKZ.js → chunk-4EMNKR2T-B7WVoonr.js} +1 -1
- package/dist/web/assets/{chunk-55XCU76K-C8SPf4XM.js → chunk-55XCU76K-D-tlN44X.js} +1 -1
- package/dist/web/assets/{chunk-7S6XSTFO-4drJ38MC.js → chunk-7S6XSTFO-31xOZx-Y.js} +1 -1
- package/dist/web/assets/{chunk-AQDTSKZB-CT94xwkm.js → chunk-AQDTSKZB-CeCjUBmu.js} +1 -1
- package/dist/web/assets/{chunk-DSNLSHJZ-Do8zQFMz.js → chunk-DSNLSHJZ-DgzXTo3_.js} +1 -1
- package/dist/web/assets/{chunk-HAGFOTED-5XuJjFhz.js → chunk-HAGFOTED-Dm22rez0.js} +1 -1
- package/dist/web/assets/{chunk-HNE4Q36P-DlG6wQNV.js → chunk-HNE4Q36P-CnFLQjbZ.js} +1 -1
- package/dist/web/assets/{chunk-NQOKRVIF-D-7GGebB.js → chunk-NQOKRVIF-7DXXp2d_.js} +1 -1
- package/dist/web/assets/{chunk-UHW7PFBP-BTJa6uY3.js → chunk-UHW7PFBP-Bw9-oVzV.js} +1 -1
- package/dist/web/assets/{chunk-VQ5W62QI-DtWEqWoe.js → chunk-VQ5W62QI-C9PHAHIJ.js} +1 -1
- package/dist/web/assets/{chunk-WQQL4CDK-qNZoyGqM.js → chunk-WQQL4CDK-C9nKxc0i.js} +1 -1
- package/dist/web/assets/{chunk-XXDRQBXY-DGCXD5QG.js → chunk-XXDRQBXY-DjdTeNXE.js} +1 -1
- package/dist/web/assets/{chunk-YZO67HFG-DwHNq7O3.js → chunk-YZO67HFG-C1z77_dC.js} +1 -1
- package/dist/web/assets/{chunk-ZAUX2LTX-1lvpL_7X.js → chunk-ZAUX2LTX-C7e41NBP.js} +1 -1
- package/dist/web/assets/{chunk-ZCHMQSOR-Dt3EEGC_.js → chunk-ZCHMQSOR-Gv41Qgvd.js} +1 -1
- package/dist/web/assets/{classDiagram-v2-4MYWR3UA-DiM_A5E4.js → classDiagram-v2-4MYWR3UA-PjZDyaSs.js} +1 -1
- package/dist/web/assets/{cose-bilkent-JH36ORCC-B5yeBESI.js → cose-bilkent-JH36ORCC-CvwZK3HN.js} +1 -1
- package/dist/web/assets/{cynefin-EF2NZ3EQ-DepIuM8k.js → cynefin-EF2NZ3EQ-Yn6p93cE.js} +1 -1
- package/dist/web/assets/{cynefinDiagram-WF24UDRP-9NThILAR.js → cynefinDiagram-WF24UDRP-BXa5Guxe.js} +1 -1
- package/dist/web/assets/{dagre-NK4GIZVX-C3KdtDhG.js → dagre-NK4GIZVX-Cnskqb30.js} +1 -1
- package/dist/web/assets/{diagram-CBK3MWTC-v3bh0eI-.js → diagram-CBK3MWTC-K8WEazkZ.js} +1 -1
- package/dist/web/assets/{diagram-I5XIIV2D-B-ICpu9I.js → diagram-I5XIIV2D-CLzouqUh.js} +1 -1
- package/dist/web/assets/{diagram-ODIL2UCW-DpmbfYP-.js → diagram-ODIL2UCW-B_9ysyHU.js} +1 -1
- package/dist/web/assets/{diagram-PFBEJUXE-DjCVTHlN.js → diagram-PFBEJUXE-D1ge5Ebx.js} +1 -1
- package/dist/web/assets/{diagram-RJA3I4VV-BgwHDpSh.js → diagram-RJA3I4VV-DWF6V26r.js} +1 -1
- package/dist/web/assets/{diagram-TYUNFSNR-BSQV5_eI.js → diagram-TYUNFSNR-BNM1pCS4.js} +1 -1
- package/dist/web/assets/{dist-DnjG1c62.js → dist-_uWZFvFF.js} +1 -1
- package/dist/web/assets/{ebnfDiagram-V4P3TTPT-CpfF488c.js → ebnfDiagram-V4P3TTPT-Cge9YHFL.js} +1 -1
- package/dist/web/assets/{elk-QONTBCTQ-DpD_nrIC.js → elk-QONTBCTQ-CY_393oL.js} +1 -1
- package/dist/web/assets/{erDiagram-KYQIGQAA-17q4UWrx.js → erDiagram-KYQIGQAA-CCOr67SS.js} +1 -1
- package/dist/web/assets/{eventmodeling-K75KTNOO-CuFiu_4h.js → eventmodeling-K75KTNOO-BzNNWwRQ.js} +1 -1
- package/dist/web/assets/flowDiagram-IUGLLWBU-C8dLq0uV.js +1 -0
- package/dist/web/assets/{ganttDiagram-R7GPNTJY-9ZLwR83Q.js → ganttDiagram-R7GPNTJY-8BewtZrJ.js} +1 -1
- package/dist/web/assets/{gitGraph-VSP46ZUC-DjHWMo_n.js → gitGraph-VSP46ZUC-CrqJbic_.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PDYL7XHY-qoPQTUpT.js → gitGraphDiagram-PDYL7XHY-Ddr5Q6Is.js} +1 -1
- package/dist/web/assets/index-C_i_PNi6.css +1 -0
- package/dist/web/assets/index-DHENTsqN.js +148 -0
- package/dist/web/assets/{info-OHQRW6UA-B0YOBALB.js → info-OHQRW6UA-DgPvuC2J.js} +1 -1
- package/dist/web/assets/{infoDiagram-MVDRKAX5-DWLetMhi.js → infoDiagram-MVDRKAX5-zlubFwKS.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-HPEHV2GE-D7fHGOrW.js → ishikawaDiagram-HPEHV2GE-DdQfvqVi.js} +1 -1
- package/dist/web/assets/{journeyDiagram-BOSHW7O7-DJJ-UZbG.js → journeyDiagram-BOSHW7O7-DZ4XswBd.js} +1 -1
- package/dist/web/assets/{kanban-definition-FNSA4HC5-zWaq8RKK.js → kanban-definition-FNSA4HC5-B1BQdpKc.js} +1 -1
- package/dist/web/assets/{line-BggZ3vsX.js → line-jQDqs207.js} +1 -1
- package/dist/web/assets/{linear-Cz_-flHq.js → linear-DbYz4fU8.js} +1 -1
- package/dist/web/assets/{mermaid-parser.core-C7Kpq-Lh.js → mermaid-parser.core-CY5CVNe8.js} +3 -3
- package/dist/web/assets/{mermaid.core-B-AKvFuX.js → mermaid.core-mETL7nBW.js} +4 -4
- package/dist/web/assets/{mindmap-definition-6OY57UG3-JGOdyl4n.js → mindmap-definition-6OY57UG3-CxgWFLxa.js} +1 -1
- package/dist/web/assets/{packet-JDAUHWVQ-DKCNvhvF.js → packet-JDAUHWVQ-Czsr9kk7.js} +1 -1
- package/dist/web/assets/{pegDiagram-ECIUJNBX-BKKUVsiJ.js → pegDiagram-ECIUJNBX-BqYq-SA-.js} +1 -1
- package/dist/web/assets/{pie-XZMESJXO-Cj1U8HAg.js → pie-XZMESJXO-CRpxJzCy.js} +1 -1
- package/dist/web/assets/{pieDiagram-GNMPY74T-B4gWYmj5.js → pieDiagram-GNMPY74T-Bt2wKk8z.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-D57K4MC3-CzKFFFWA.js → quadrantDiagram-D57K4MC3-VOKqYTgn.js} +1 -1
- package/dist/web/assets/{radar-ABXABTNO-BvW6txnl.js → radar-ABXABTNO-wXmArQH-.js} +1 -1
- package/dist/web/assets/{railroad-I3PHUGI6-CQFUQhrP.js → railroad-I3PHUGI6-CKPK4tQV.js} +1 -1
- package/dist/web/assets/{railroad-abnf-LNEFI6M7-Dp31IQhK.js → railroad-abnf-LNEFI6M7-BLEs3xqV.js} +1 -1
- package/dist/web/assets/{railroad-ebnf-DWYD2UWJ-DDYlK9R4.js → railroad-ebnf-DWYD2UWJ-DS5QZgky.js} +1 -1
- package/dist/web/assets/{railroad-peg-JR7BVNR7-C8-c26bu.js → railroad-peg-JR7BVNR7-DHWXNOSl.js} +1 -1
- package/dist/web/assets/{railroadDiagram-Y72NRBL7-6FaSHHCa.js → railroadDiagram-Y72NRBL7-Cy4eWKH1.js} +1 -1
- package/dist/web/assets/{requirementDiagram-EQYSW5RA-C6Ry03Cr.js → requirementDiagram-EQYSW5RA-Bvbk8wwe.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-SY24JHO5-Cwnb3Qeu.js → sankeyDiagram-SY24JHO5-B4jGjMzu.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-BLEHNHQU-CRvwFUCU.js → sequenceDiagram-BLEHNHQU-BpgUogv_.js} +1 -1
- package/dist/web/assets/{src-DVW4doAe.js → src-DigPeGm7.js} +1 -1
- package/dist/web/assets/{stateDiagram-v2-A6IESKWZ-wwkCw23o.js → stateDiagram-v2-A6IESKWZ-tHq7e40Q.js} +1 -1
- package/dist/web/assets/{swimlanes-B3ENRKFQ-ChNg0Cbk.js → swimlanes-B3ENRKFQ-DVUPAaDR.js} +1 -1
- package/dist/web/assets/swimlanesDiagram-AYQRV4AK-jJ6zDGAv.js +8 -0
- package/dist/web/assets/{timeline-definition-JXYKGLGB-BVfl26_t.js → timeline-definition-JXYKGLGB-BHMM9AHV.js} +1 -1
- package/dist/web/assets/{treeView-D4JQ5SDB-DJFvd6yo.js → treeView-D4JQ5SDB-DZ7k_TTS.js} +1 -1
- package/dist/web/assets/{treemap-SAJKECNS-BDiJSu2k.js → treemap-SAJKECNS-C1wGfVb4.js} +1 -1
- package/dist/web/assets/{usecaseDiagram-WPOLBNNX-Bq_3KTOD.js → usecaseDiagram-WPOLBNNX-BTg0K_GO.js} +1 -1
- package/dist/web/assets/{vennDiagram-Q3Y3IDCW-6YGgOzny.js → vennDiagram-Q3Y3IDCW-BTKShPx1.js} +1 -1
- package/dist/web/assets/{wardley-7MLQ67FV-4cm0j7qc.js → wardley-7MLQ67FV-DnYPM5OB.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-IVAIDKWA-BMqtyCjx.js → wardleyDiagram-IVAIDKWA-Dzb67Boa.js} +1 -1
- package/dist/web/assets/{xychartDiagram-4URNHDU4-CFsu67vz.js → xychartDiagram-4URNHDU4-qijltKIO.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +3 -3
- package/dist/web/assets/channel-DiiJLG5R.js +0 -1
- package/dist/web/assets/flowDiagram-IUGLLWBU-D63MFFYq.js +0 -1
- package/dist/web/assets/index-CGAKLE5y.js +0 -147
- package/dist/web/assets/index-QZirxrGa.css +0 -1
- package/dist/web/assets/swimlanesDiagram-AYQRV4AK-Dww2HRCa.js +0 -8
package/README.md
CHANGED
|
@@ -34,9 +34,13 @@
|
|
|
34
34
|
- 📖 **Read results while you chat.** Preview documents, diagrams, and code changes beside the conversation on desktop, or full-screen on mobile.
|
|
35
35
|
- 🔔 **Know when your attention is needed.** Enable browser notifications for completed work, questions, and approvals; keep the page open in a supported desktop browser.
|
|
36
36
|
|
|
37
|
+
Use **+** in the message box to attach images from your phone or computer. Open the combined model control to choose the model, reasoning effort, and Fast mode.
|
|
38
|
+
|
|
39
|
+
When the selected model is at capacity, Covro shows native retry progress and can make up to three additional attempts after 5, 10, and 20 seconds when Codex does not retry and no output or tool work has started. You can cancel, or choose another model and retry manually. See [retry behavior](docs/capacity-retry.md) for recovery boundaries.
|
|
40
|
+
|
|
37
41
|
See the [usage guide · 中文](docs/usage.zh-CN.md) for workflow details and controls.
|
|
38
42
|
|
|
39
|
-
Start a new conversation in the current workspace with **⌘ + Option + N** on macOS or **Ctrl + Alt + N** on Windows/Linux. The message box receives focus and existing drafts stay available.
|
|
43
|
+
Start a new conversation in the current workspace with **⌘ + Option + N** on macOS or **Ctrl + Alt + N** on Windows/Linux. The message box receives focus and existing drafts stay available. When the workspace has a recognized GitHub remote, the GitHub icon in the header opens its repository in a new tab. See [workspace details](docs/workspaces.md#open-the-github-repository) for remote selection rules.
|
|
40
44
|
|
|
41
45
|
<details>
|
|
42
46
|
<summary><strong>📱 A workspace that fits your phone</strong></summary>
|
package/README.zh-CN.md
CHANGED
|
@@ -34,9 +34,13 @@
|
|
|
34
34
|
- 📖 **一边看产出,一边讨论。** 电脑上将文档、图表和代码变更与会话并排阅读,手机上使用全屏阅读器。
|
|
35
35
|
- 🔔 **及时收到待办提醒。** 开启浏览器通知,在工作结束、需要回答或审批时收到提醒;需在支持通知的桌面浏览器中保持页面运行。
|
|
36
36
|
|
|
37
|
+
点击输入框中的 **+**,可从手机或电脑选择图片附件。模型、推理强度和 Fast 模式统一收进模型设置入口。
|
|
38
|
+
|
|
39
|
+
当前模型容量不足时,Covro 会展示原生重试进度;如果 Codex 没有自行重试,且本轮尚无输出或工具操作,会在 5、10、20 秒后最多补偿重试 3 次。可以取消,也可以选择其他模型后手动重试。恢复边界见[容量重试说明](docs/capacity-retry.md)。
|
|
40
|
+
|
|
37
41
|
操作方式与使用细节见[使用指南](docs/usage.zh-CN.md)。
|
|
38
42
|
|
|
39
|
-
在当前工作区新建会话:macOS 按 **⌘ + Option + N**,Windows/Linux 按 **Ctrl + Alt + N
|
|
43
|
+
在当前工作区新建会话:macOS 按 **⌘ + Option + N**,Windows/Linux 按 **Ctrl + Alt + N**。输入框会自动获得焦点,已有草稿继续保留。工作区有可识别的 GitHub remote 时,点击顶部 GitHub 图标即可在新标签页打开仓库;remote 选择规则见[工作区说明](docs/workspaces.md#快捷打开-github-仓库)。
|
|
40
44
|
|
|
41
45
|
<details>
|
|
42
46
|
<summary><strong>📱 手机上也能舒服地使用</strong></summary>
|
package/dist/codex/adapter.js
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
mapItem,
|
|
22
22
|
mapThread,
|
|
23
23
|
mapTurn,
|
|
24
|
+
mapTurnError,
|
|
24
25
|
permissionSettings,
|
|
25
26
|
serviceTierSettings,
|
|
26
27
|
threadSettings,
|
|
@@ -1088,7 +1089,8 @@ class CodexAdapter {
|
|
|
1088
1089
|
threadId: event.params.threadId,
|
|
1089
1090
|
turnId: event.params.turnId,
|
|
1090
1091
|
message: event.params.error.message,
|
|
1091
|
-
willRetry: event.params.willRetry
|
|
1092
|
+
willRetry: event.params.willRetry,
|
|
1093
|
+
...mapTurnError(event.params.error)
|
|
1092
1094
|
});
|
|
1093
1095
|
break;
|
|
1094
1096
|
default:
|
|
@@ -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(\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.164.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 mapTurnError,\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.164.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 ...mapTurnError(event.params.error),\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
|
}
|
package/dist/codex/mapping.js
CHANGED
|
@@ -3,6 +3,14 @@ import { permissionSettings } from "./permissions.js";
|
|
|
3
3
|
import { parseQuestionReplies } from "../shared/async-questions.js";
|
|
4
4
|
import { imageDataBytes, MAX_IMAGES, MAX_IMAGE_BYTES } from "../shared/images.js";
|
|
5
5
|
import { CodexError, isRecord } from "./transport.js";
|
|
6
|
+
function mapTurnError(error) {
|
|
7
|
+
const info = error.codexErrorInfo;
|
|
8
|
+
const code = typeof info === "string" ? info : isRecord(info) ? Object.keys(info)[0] : void 0;
|
|
9
|
+
return {
|
|
10
|
+
...code ? { errorCode: code.slice(0, 100) } : {},
|
|
11
|
+
...error.additionalDetails ? { errorDetails: error.additionalDetails.slice(0, 4096) } : {}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
6
14
|
function taskInput(text, images = []) {
|
|
7
15
|
return [
|
|
8
16
|
...text ? [{ type: "text", text, text_elements: [] }] : [],
|
|
@@ -72,7 +80,7 @@ function mapTurn(threadId, turn) {
|
|
|
72
80
|
...validTiming(turn.completedAt) ? { completedAt: turn.completedAt * 1e3 } : {},
|
|
73
81
|
...validTiming(turn.durationMs) ? { durationMs: turn.durationMs } : {},
|
|
74
82
|
items: turn.items.map(mapItem),
|
|
75
|
-
...turn.error ? { error: turn.error.message } : {}
|
|
83
|
+
...turn.error ? { error: turn.error.message, ...mapTurnError(turn.error) } : {}
|
|
76
84
|
};
|
|
77
85
|
}
|
|
78
86
|
function validTiming(value) {
|
|
@@ -200,6 +208,7 @@ export {
|
|
|
200
208
|
mapItem,
|
|
201
209
|
mapThread,
|
|
202
210
|
mapTurn,
|
|
211
|
+
mapTurnError,
|
|
203
212
|
permissionSettings,
|
|
204
213
|
serviceTierSettings,
|
|
205
214
|
taskInput,
|