@covro/covro 0.5.1-dev.2 → 0.5.1-dev.4

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.
Files changed (127) hide show
  1. package/README.md +11 -1
  2. package/README.zh-CN.md +11 -1
  3. package/dist/codex/adapter.js +65 -5
  4. package/dist/codex/adapter.js.map +2 -2
  5. package/dist/codex/collaboration.js +28 -0
  6. package/dist/codex/collaboration.js.map +7 -0
  7. package/dist/codex/guardian-denials.js +67 -0
  8. package/dist/codex/guardian-denials.js.map +7 -0
  9. package/dist/codex/mapping.js +10 -1
  10. package/dist/codex/mapping.js.map +2 -2
  11. package/dist/codex/thread-goals.js +15 -0
  12. package/dist/codex/thread-goals.js.map +7 -0
  13. package/dist/codex/thread-titles.js +135 -60
  14. package/dist/codex/thread-titles.js.map +2 -2
  15. package/dist/server/capacity-retry.js +176 -0
  16. package/dist/server/capacity-retry.js.map +7 -0
  17. package/dist/server/db/operations.js +11 -0
  18. package/dist/server/db/operations.js.map +2 -2
  19. package/dist/server/http.js +51 -0
  20. package/dist/server/http.js.map +2 -2
  21. package/dist/server/project-init.js +28 -0
  22. package/dist/server/project-init.js.map +7 -0
  23. package/dist/server/projection.js +11 -3
  24. package/dist/server/projection.js.map +2 -2
  25. package/dist/server/service.js +315 -8
  26. package/dist/server/service.js.map +2 -2
  27. package/dist/server/thread-recap.js +34 -0
  28. package/dist/server/thread-recap.js.map +7 -0
  29. package/dist/server/workspace-diff.js +149 -0
  30. package/dist/server/workspace-diff.js.map +7 -0
  31. package/dist/shared/guardian-denials.js +1 -0
  32. package/dist/shared/guardian-denials.js.map +7 -0
  33. package/dist/shared/thread-goal.js +1 -0
  34. package/dist/shared/thread-goal.js.map +7 -0
  35. package/dist/shared/turn-errors.js +25 -0
  36. package/dist/shared/turn-errors.js.map +7 -0
  37. package/dist/shared/validation.js +53 -3
  38. package/dist/shared/validation.js.map +2 -2
  39. package/dist/shared/workspace-diff.js +1 -0
  40. package/dist/shared/workspace-diff.js.map +7 -0
  41. package/dist/web/assets/{abnfDiagram-WEYOIA3C-DK1b1m5g.js → abnfDiagram-WEYOIA3C-2_00Zp4O.js} +1 -1
  42. package/dist/web/assets/{arc-0hKPa6cH.js → arc-DAyuVDVU.js} +1 -1
  43. package/dist/web/assets/{architecture-WOLXFQ4H-DUa2ELbW.js → architecture-WOLXFQ4H-CgR1C4gR.js} +1 -1
  44. package/dist/web/assets/{architectureDiagram-ZHVYKT53-DfpAMcHI.js → architectureDiagram-ZHVYKT53-Dkb6AWjz.js} +1 -1
  45. package/dist/web/assets/{blockDiagram-RJAE7QA3-CD8LlPAk.js → blockDiagram-RJAE7QA3-NtOGZdkX.js} +1 -1
  46. package/dist/web/assets/{c4Diagram-XDPPPE54-KVKGUBPP.js → c4Diagram-XDPPPE54-C1dqWKb1.js} +1 -1
  47. package/dist/web/assets/channel-Co9_v2dk.js +1 -0
  48. package/dist/web/assets/{chunk-2E7WHVMD-CPcfaznm.js → chunk-2E7WHVMD-ClzuEiGk.js} +1 -1
  49. package/dist/web/assets/{chunk-4EMNKR2T-Ba4ZkZos.js → chunk-4EMNKR2T-DyTpkWag.js} +1 -1
  50. package/dist/web/assets/{chunk-55XCU76K-COU6aQoV.js → chunk-55XCU76K-DXBA4ib1.js} +1 -1
  51. package/dist/web/assets/{chunk-7S6XSTFO-mof6va94.js → chunk-7S6XSTFO-DA_aq0zc.js} +1 -1
  52. package/dist/web/assets/{chunk-AQDTSKZB-B9S7XD0k.js → chunk-AQDTSKZB-BWTN3SC_.js} +1 -1
  53. package/dist/web/assets/{chunk-DSNLSHJZ-DiTTjo21.js → chunk-DSNLSHJZ-DJnLTeE9.js} +1 -1
  54. package/dist/web/assets/{chunk-HAGFOTED-bBaCv2Gr.js → chunk-HAGFOTED-cDP-g1Eh.js} +1 -1
  55. package/dist/web/assets/{chunk-HNE4Q36P-COubV5SQ.js → chunk-HNE4Q36P-B3TTIYd_.js} +1 -1
  56. package/dist/web/assets/{chunk-NQOKRVIF-D7mCDLmx.js → chunk-NQOKRVIF-D8mmhZHq.js} +1 -1
  57. package/dist/web/assets/{chunk-UHW7PFBP-7E_Y7QMq.js → chunk-UHW7PFBP-DWIIg_jq.js} +1 -1
  58. package/dist/web/assets/{chunk-VQ5W62QI-DIe2sxBO.js → chunk-VQ5W62QI-Bu3R2cpS.js} +1 -1
  59. package/dist/web/assets/{chunk-WQQL4CDK-sGc70NW0.js → chunk-WQQL4CDK-BxsR1mXs.js} +1 -1
  60. package/dist/web/assets/{chunk-XXDRQBXY-CnTJfCp_.js → chunk-XXDRQBXY-Ds0JNdm-.js} +1 -1
  61. package/dist/web/assets/{chunk-YZO67HFG-D1uBxw_D.js → chunk-YZO67HFG-COpqyQaD.js} +1 -1
  62. package/dist/web/assets/{chunk-ZAUX2LTX-quytYPeh.js → chunk-ZAUX2LTX-BUrGjDuS.js} +1 -1
  63. package/dist/web/assets/{chunk-ZCHMQSOR-CebhdtBu.js → chunk-ZCHMQSOR-DYMM9mEK.js} +1 -1
  64. package/dist/web/assets/{classDiagram-v2-4MYWR3UA-_NujQwSa.js → classDiagram-v2-4MYWR3UA-DfJvks0C.js} +1 -1
  65. package/dist/web/assets/{cose-bilkent-JH36ORCC-DltmODTL.js → cose-bilkent-JH36ORCC-CN5mpYIb.js} +1 -1
  66. package/dist/web/assets/{cynefin-EF2NZ3EQ-CyNUtvfu.js → cynefin-EF2NZ3EQ-DmlCHkY-.js} +1 -1
  67. package/dist/web/assets/{cynefinDiagram-WF24UDRP-DH1m77PD.js → cynefinDiagram-WF24UDRP-C0aUblC2.js} +1 -1
  68. package/dist/web/assets/{dagre-NK4GIZVX-DiCwjat3.js → dagre-NK4GIZVX-Ba7RcAgP.js} +1 -1
  69. package/dist/web/assets/{diagram-CBK3MWTC-DnoBkry8.js → diagram-CBK3MWTC-BYQDjB9i.js} +1 -1
  70. package/dist/web/assets/{diagram-I5XIIV2D-CIeRHNwj.js → diagram-I5XIIV2D-EV79hoob.js} +1 -1
  71. package/dist/web/assets/{diagram-ODIL2UCW-BiyJagHP.js → diagram-ODIL2UCW-BvQdwmgA.js} +1 -1
  72. package/dist/web/assets/{diagram-PFBEJUXE-B6xGLENr.js → diagram-PFBEJUXE-hxwI3F00.js} +1 -1
  73. package/dist/web/assets/{diagram-RJA3I4VV-DCbGrXsR.js → diagram-RJA3I4VV-DwaHE2iB.js} +1 -1
  74. package/dist/web/assets/{diagram-TYUNFSNR-BjYXlBMa.js → diagram-TYUNFSNR-BxiOemA0.js} +1 -1
  75. package/dist/web/assets/{dist-C9Qd1YEe.js → dist-nfRX7L9k.js} +1 -1
  76. package/dist/web/assets/{ebnfDiagram-V4P3TTPT-CpRXdAa6.js → ebnfDiagram-V4P3TTPT-CzQv5iDM.js} +1 -1
  77. package/dist/web/assets/{elk-QONTBCTQ-BZa9Vnbc.js → elk-QONTBCTQ-DNR9HWcl.js} +1 -1
  78. package/dist/web/assets/{erDiagram-KYQIGQAA-7AaYG_a9.js → erDiagram-KYQIGQAA-aJlTdb9w.js} +1 -1
  79. package/dist/web/assets/{eventmodeling-K75KTNOO-BzIg1KNf.js → eventmodeling-K75KTNOO-D4J-ujy-.js} +1 -1
  80. package/dist/web/assets/flowDiagram-IUGLLWBU-Bq7dmPlS.js +1 -0
  81. package/dist/web/assets/{ganttDiagram-R7GPNTJY-DeNg-7K2.js → ganttDiagram-R7GPNTJY-DgytSfqO.js} +1 -1
  82. package/dist/web/assets/{gitGraph-VSP46ZUC-BR-A7hdM.js → gitGraph-VSP46ZUC-BtjueFHB.js} +1 -1
  83. package/dist/web/assets/{gitGraphDiagram-PDYL7XHY-LMyLpeqK.js → gitGraphDiagram-PDYL7XHY-WP0Hjdh9.js} +1 -1
  84. package/dist/web/assets/index-BesPYgjq.js +156 -0
  85. package/dist/web/assets/{index-CEM8pkOB.css → index-qYBdGqKM.css} +1 -1
  86. package/dist/web/assets/{info-OHQRW6UA-CRbCGNnm.js → info-OHQRW6UA-iuP0WTfn.js} +1 -1
  87. package/dist/web/assets/{infoDiagram-MVDRKAX5-DTUWae1O.js → infoDiagram-MVDRKAX5-CpAtMyKS.js} +1 -1
  88. package/dist/web/assets/{ishikawaDiagram-HPEHV2GE-CE4r0jTM.js → ishikawaDiagram-HPEHV2GE-JTnItv7N.js} +1 -1
  89. package/dist/web/assets/{journeyDiagram-BOSHW7O7-KcSuVnTV.js → journeyDiagram-BOSHW7O7-B333k1QJ.js} +1 -1
  90. package/dist/web/assets/{kanban-definition-FNSA4HC5-I0QF1Ftr.js → kanban-definition-FNSA4HC5-DpCk5ZH0.js} +1 -1
  91. package/dist/web/assets/{line-DLSy1-se.js → line-CLs-qFxt.js} +1 -1
  92. package/dist/web/assets/{linear-XWNSUdmR.js → linear-E9AWqBNs.js} +1 -1
  93. package/dist/web/assets/{mermaid-parser.core-BcMfaJSH.js → mermaid-parser.core-D1rEzlb-.js} +3 -3
  94. package/dist/web/assets/{mermaid.core-CPl3cZ55.js → mermaid.core-D6TNGGsX.js} +4 -4
  95. package/dist/web/assets/{mindmap-definition-6OY57UG3-BIB4ahHf.js → mindmap-definition-6OY57UG3-DrpuGWuc.js} +1 -1
  96. package/dist/web/assets/{packet-JDAUHWVQ-UZicf9-F.js → packet-JDAUHWVQ-BpBr3aKk.js} +1 -1
  97. package/dist/web/assets/{pegDiagram-ECIUJNBX-ckOqIfTt.js → pegDiagram-ECIUJNBX-BrZX1cdv.js} +1 -1
  98. package/dist/web/assets/{pie-XZMESJXO-DErhKWJX.js → pie-XZMESJXO-CcTpis-K.js} +1 -1
  99. package/dist/web/assets/{pieDiagram-GNMPY74T-CrnS_2qe.js → pieDiagram-GNMPY74T-CR2em875.js} +1 -1
  100. package/dist/web/assets/{quadrantDiagram-D57K4MC3-UK4DsDJz.js → quadrantDiagram-D57K4MC3-D-ET5xbH.js} +1 -1
  101. package/dist/web/assets/{radar-ABXABTNO-BYgJm4I9.js → radar-ABXABTNO-CTFFPCi_.js} +1 -1
  102. package/dist/web/assets/{railroad-I3PHUGI6-2n6yUb7T.js → railroad-I3PHUGI6-S6MHolw_.js} +1 -1
  103. package/dist/web/assets/{railroad-abnf-LNEFI6M7-CGAFqTzs.js → railroad-abnf-LNEFI6M7-NWxYLYMN.js} +1 -1
  104. package/dist/web/assets/{railroad-ebnf-DWYD2UWJ-gJx_FXYW.js → railroad-ebnf-DWYD2UWJ-CRnaPl26.js} +1 -1
  105. package/dist/web/assets/{railroad-peg-JR7BVNR7-Dm0kEaxK.js → railroad-peg-JR7BVNR7-CB85ffhO.js} +1 -1
  106. package/dist/web/assets/{railroadDiagram-Y72NRBL7-CqzySn4U.js → railroadDiagram-Y72NRBL7-Ba2xIF7q.js} +1 -1
  107. package/dist/web/assets/{requirementDiagram-EQYSW5RA-B33Hrc0L.js → requirementDiagram-EQYSW5RA-B7faqgDT.js} +1 -1
  108. package/dist/web/assets/{sankeyDiagram-SY24JHO5-BA9Smc0j.js → sankeyDiagram-SY24JHO5-IjJVI58S.js} +1 -1
  109. package/dist/web/assets/{sequenceDiagram-BLEHNHQU-CUA-rKot.js → sequenceDiagram-BLEHNHQU-D-h5jxwQ.js} +1 -1
  110. package/dist/web/assets/{src-htchAh5W.js → src-hBdSvoFJ.js} +1 -1
  111. package/dist/web/assets/{stateDiagram-v2-A6IESKWZ-kIYMkX3_.js → stateDiagram-v2-A6IESKWZ-rlZaPFqZ.js} +1 -1
  112. package/dist/web/assets/{swimlanes-B3ENRKFQ-C8Lzsqig.js → swimlanes-B3ENRKFQ-CqgKwSbP.js} +1 -1
  113. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-BGvWQ2Hp.js +8 -0
  114. package/dist/web/assets/{timeline-definition-JXYKGLGB-C3uOHb1e.js → timeline-definition-JXYKGLGB-DD76ZtY0.js} +1 -1
  115. package/dist/web/assets/{treeView-D4JQ5SDB-Dq-ug1SE.js → treeView-D4JQ5SDB-CcwWh4Bw.js} +1 -1
  116. package/dist/web/assets/{treemap-SAJKECNS-mX01fnXB.js → treemap-SAJKECNS-8lde6V5O.js} +1 -1
  117. package/dist/web/assets/{usecaseDiagram-WPOLBNNX-DMBep2-D.js → usecaseDiagram-WPOLBNNX-CWowobZv.js} +1 -1
  118. package/dist/web/assets/{vennDiagram-Q3Y3IDCW-CUardqBP.js → vennDiagram-Q3Y3IDCW-U11W8pHe.js} +1 -1
  119. package/dist/web/assets/{wardley-7MLQ67FV-CIOqSz29.js → wardley-7MLQ67FV-Dp2EaBmo.js} +1 -1
  120. package/dist/web/assets/{wardleyDiagram-IVAIDKWA-DtfU2fzi.js → wardleyDiagram-IVAIDKWA-7Qnos8ak.js} +1 -1
  121. package/dist/web/assets/{xychartDiagram-4URNHDU4-Cb3se94q.js → xychartDiagram-4URNHDU4-BwfHNtsG.js} +1 -1
  122. package/dist/web/index.html +2 -2
  123. package/package.json +3 -3
  124. package/dist/web/assets/channel-CpEW0zog.js +0 -1
  125. package/dist/web/assets/flowDiagram-IUGLLWBU-FDG_7_Jf.js +0 -1
  126. package/dist/web/assets/index-D2dQZgkr.js +0 -147
  127. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-CWrPdxiH.js +0 -8
package/README.md CHANGED
@@ -34,7 +34,17 @@
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.
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, Fast mode, and Plan/Execute mode. Use `/plan [task]` to select Plan mode or submit a planning task.
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
+
41
+ Use `/review` to choose uncommitted changes, a base branch, a commit, or custom review instructions. Use `/init` to request a project contributor guide; an existing `AGENTS.md` is preserved.
42
+
43
+ Use `/diff` to inspect staged, unstaged, and untracked Git changes in the current workspace without starting a model task. Use `/approve` to explicitly authorize a recorded automatic-review denial once, then ask Codex to continue.
44
+
45
+ Use `/recap` to summarize recent visible messages in a separate model request without changing conversation context.
46
+
47
+ Use `/goal` to view and manage a native session goal, its token budget and actual progress. Activating a goal can start automatic continuation; pausing and clearing remain available during a task.
38
48
 
39
49
  See the [usage guide · 中文](docs/usage.zh-CN.md) for workflow details and controls.
40
50
 
package/README.zh-CN.md CHANGED
@@ -34,7 +34,17 @@
34
34
  - 📖 **一边看产出,一边讨论。** 电脑上将文档、图表和代码变更与会话并排阅读,手机上使用全屏阅读器。
35
35
  - 🔔 **及时收到待办提醒。** 开启浏览器通知,在工作结束、需要回答或审批时收到提醒;需在支持通知的桌面浏览器中保持页面运行。
36
36
 
37
- 点击输入框中的 **+**,可从手机或电脑选择图片附件。模型、推理强度和 Fast 模式统一收进模型设置入口。
37
+ 点击输入框中的 **+**,可从手机或电脑选择图片附件。模型、推理强度、Fast 和 Plan/执行模式统一收进模型设置入口。使用 `/plan [任务]` 可选择 Plan 模式或直接提交规划任务。
38
+
39
+ 当前模型容量不足时,Covro 会展示原生重试进度;如果 Codex 没有自行重试,且本轮尚无输出或工具操作,会在 5、10、20 秒后最多补偿重试 3 次。可以取消,也可以选择其他模型后手动重试。恢复边界见[容量重试说明](docs/capacity-retry.md)。
40
+
41
+ 使用 `/review` 可选择未提交改动、基础分支、指定 commit 或自定义要求进行代码审查。使用 `/init` 可请求生成项目说明,已有 `AGENTS.md` 会保留。
42
+
43
+ 使用 `/diff` 可查看当前工作区已暂存、未暂存和未跟踪的 Git 改动,不创建模型任务。使用 `/approve` 可显式单次授权一条自动审核拒绝记录,再发送任务让 Codex 继续。
44
+
45
+ 使用 `/recap` 可通过独立模型请求总结近期可见消息,不改变会话上下文。
46
+
47
+ 使用 `/goal` 可查看和管理原生会话目标、Token 预算与实际进度。激活后 Codex 可自动继续工作,任务运行期间仍可暂停或清除目标。
38
48
 
39
49
  操作方式与使用细节见[使用指南](docs/usage.zh-CN.md)。
40
50
 
@@ -3,7 +3,13 @@ import { SHELL_TIMEOUT_MS, SHELL_OUTPUT_BYTES } from "../shared/shell.js";
3
3
  import { spawn, execFile } from "node:child_process";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import { promisify } from "node:util";
6
+ import { readGoal } from "./thread-goals.js";
7
+ import { GuardianDenials } from "./guardian-denials.js";
6
8
  import { ThreadTitles } from "./thread-titles.js";
9
+ import {
10
+ collaborationSelection,
11
+ reportedCollaborationMode
12
+ } from "./collaboration.js";
7
13
  import { TurnTokenUsage } from "./turn-token-usage.js";
8
14
  import { AppError } from "../shared/errors.js";
9
15
  import { threadNameError } from "../shared/thread-name.js";
@@ -21,6 +27,7 @@ import {
21
27
  mapItem,
22
28
  mapThread,
23
29
  mapTurn,
30
+ mapTurnError,
24
31
  permissionSettings,
25
32
  serviceTierSettings,
26
33
  threadSettings,
@@ -53,6 +60,10 @@ const CAPABILITIES = [
53
60
  "thread/items/list",
54
61
  "turn/start",
55
62
  "review/start",
63
+ "thread/goal/get",
64
+ "thread/goal/set",
65
+ "thread/goal/clear",
66
+ "thread/approveGuardianDeniedAction",
56
67
  "turn/steer",
57
68
  "turn/interrupt",
58
69
  "model/list",
@@ -97,6 +108,7 @@ class CodexAdapter {
97
108
  restartTimer;
98
109
  restartAttempt = 0;
99
110
  titles;
111
+ denials = new GuardianDenials();
100
112
  tokenUsage = new TurnTokenUsage();
101
113
  // Ordering only. Persisted archive state belongs exclusively to Codex.
102
114
  archiveSequence = 0;
@@ -174,6 +186,7 @@ class CodexAdapter {
174
186
  const version = stdout.trim().replace(/^codex-cli\s+/, "");
175
187
  this.state.codexVersion = version;
176
188
  this.permissionState.clear();
189
+ this.denials.clear();
177
190
  this.state.compatibility = CODEX_COMPATIBILITY.verified.includes(version) ? "verified" : "unverified";
178
191
  const child = spawn(
179
192
  this.options.binary,
@@ -220,6 +233,7 @@ class CodexAdapter {
220
233
  const wasReady = this.ready;
221
234
  this.state.ready = false;
222
235
  this.tokenUsage.clear();
236
+ this.denials.clear();
223
237
  this.state.connection = "unavailable";
224
238
  this.state.error = error.message;
225
239
  this.expireActions();
@@ -764,6 +778,9 @@ class CodexAdapter {
764
778
  const previous = this.permissionState.get(result.thread.id);
765
779
  const settings = {
766
780
  model: result.model ?? result.thread.model ?? null,
781
+ ...reportedCollaborationMode(
782
+ result.collaborationMode
783
+ ),
767
784
  reasoningEffort: result.reasoningEffort ?? null,
768
785
  ...serviceTierSettings(result.serviceTier),
769
786
  ...permissionSettings(
@@ -847,15 +864,16 @@ class CodexAdapter {
847
864
  threadId: id,
848
865
  cwd,
849
866
  input: taskInput(text, images),
850
- ...turnSettings(cwd, settings)
867
+ ...turnSettings(cwd, settings),
868
+ ...collaborationSelection(settings, this.permissionState.get(id))
851
869
  })).turn
852
870
  );
853
871
  return turn;
854
872
  }
855
- async startReview(id) {
873
+ async startReview(id, target = { type: "uncommittedChanges" }) {
856
874
  const result = await this.call("review/start", {
857
875
  threadId: id,
858
- target: { type: "uncommittedChanges" },
876
+ target: target.type === "commit" ? { ...target, title: null } : target,
859
877
  delivery: "inline"
860
878
  });
861
879
  if (!isRecord(result) || result.reviewThreadId !== id)
@@ -876,6 +894,37 @@ class CodexAdapter {
876
894
  async interruptTurn(id, turnId) {
877
895
  await this.call("turn/interrupt", { threadId: id, turnId });
878
896
  }
897
+ async getGoal(id) {
898
+ try {
899
+ return readGoal((await this.call("thread/goal/get", { threadId: id })).goal, id);
900
+ } catch (error) {
901
+ if (error instanceof Error && /goals feature is disabled/i.test(error.message))
902
+ throw new AppError("GOAL_UNAVAILABLE", "\u5F53\u524D Codex \u672A\u542F\u7528 goals \u529F\u80FD", 409);
903
+ throw error;
904
+ }
905
+ }
906
+ async mutateGoal(id, mutation) {
907
+ if (mutation.action === "clear") {
908
+ await this.call("thread/goal/clear", { threadId: id, origin: "user" });
909
+ return null;
910
+ }
911
+ const { action: _, ...fields } = mutation;
912
+ return readGoal(
913
+ (await this.call("thread/goal/set", { threadId: id, origin: "user", ...fields })).goal,
914
+ id
915
+ );
916
+ }
917
+ async recapThread(id, prompt) {
918
+ if (!this.titles) throw new CodexError("CODEX_UNAVAILABLE", "Codex unavailable");
919
+ return this.titles.recap(id, prompt);
920
+ }
921
+ listGuardianDenials(id) {
922
+ return this.denials.list(id);
923
+ }
924
+ async approveGuardianDenial(id, denialId) {
925
+ const event = this.denials.take(id, denialId);
926
+ await this.call("thread/approveGuardianDeniedAction", { threadId: id, event });
927
+ }
879
928
  async compactThread(id) {
880
929
  await this.call("thread/compact/start", { threadId: id });
881
930
  }
@@ -919,9 +968,18 @@ class CodexAdapter {
919
968
  );
920
969
  break;
921
970
  }
971
+ case "thread/goal/updated":
972
+ this.emit({ type: "goal", threadId: event.params.threadId, goal: event.params.goal });
973
+ break;
974
+ case "thread/goal/cleared":
975
+ this.emit({ type: "goal", threadId: event.params.threadId, goal: null });
976
+ break;
922
977
  case "thread/settings/updated":
923
978
  {
924
979
  const observed = {
980
+ ...reportedCollaborationMode(
981
+ event.params.threadSettings.collaborationMode
982
+ ),
925
983
  model: event.params.threadSettings.model ?? null,
926
984
  reasoningEffort: event.params.threadSettings.effort ?? null,
927
985
  ...serviceTierSettings(event.params.threadSettings.serviceTier),
@@ -944,6 +1002,7 @@ class CodexAdapter {
944
1002
  break;
945
1003
  case "item/autoApprovalReview/started":
946
1004
  case "item/autoApprovalReview/completed":
1005
+ if (event.method === "item/autoApprovalReview/completed") this.denials.record(event.params);
947
1006
  this.emit({
948
1007
  type: "autoReview",
949
1008
  threadId: event.params.threadId,
@@ -1088,7 +1147,8 @@ class CodexAdapter {
1088
1147
  threadId: event.params.threadId,
1089
1148
  turnId: event.params.turnId,
1090
1149
  message: event.params.error.message,
1091
- willRetry: event.params.willRetry
1150
+ willRetry: event.params.willRetry,
1151
+ ...mapTurnError(event.params.error)
1092
1152
  });
1093
1153
  break;
1094
1154
  default:
@@ -1100,7 +1160,7 @@ class CodexAdapter {
1100
1160
  await this.rpc?.reject(
1101
1161
  message.id,
1102
1162
  -32601,
1103
- "Interactive tools are disabled for title generation"
1163
+ "Interactive tools are disabled for isolated helper requests"
1104
1164
  );
1105
1165
  return;
1106
1166
  }