@covro/covro 0.5.1-dev.3 → 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 (119) hide show
  1. package/README.md +9 -1
  2. package/README.zh-CN.md +9 -1
  3. package/dist/codex/adapter.js +62 -4
  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/thread-goals.js +15 -0
  10. package/dist/codex/thread-goals.js.map +7 -0
  11. package/dist/codex/thread-titles.js +135 -60
  12. package/dist/codex/thread-titles.js.map +2 -2
  13. package/dist/server/http.js +37 -0
  14. package/dist/server/http.js.map +2 -2
  15. package/dist/server/project-init.js +28 -0
  16. package/dist/server/project-init.js.map +7 -0
  17. package/dist/server/projection.js +1 -0
  18. package/dist/server/projection.js.map +2 -2
  19. package/dist/server/service.js +181 -3
  20. package/dist/server/service.js.map +2 -2
  21. package/dist/server/thread-recap.js +34 -0
  22. package/dist/server/thread-recap.js.map +7 -0
  23. package/dist/server/workspace-diff.js +149 -0
  24. package/dist/server/workspace-diff.js.map +7 -0
  25. package/dist/shared/guardian-denials.js +1 -0
  26. package/dist/shared/guardian-denials.js.map +7 -0
  27. package/dist/shared/thread-goal.js +1 -0
  28. package/dist/shared/thread-goal.js.map +7 -0
  29. package/dist/shared/validation.js +51 -3
  30. package/dist/shared/validation.js.map +2 -2
  31. package/dist/shared/workspace-diff.js +1 -0
  32. package/dist/shared/workspace-diff.js.map +7 -0
  33. package/dist/web/assets/{abnfDiagram-WEYOIA3C-ATf52olP.js → abnfDiagram-WEYOIA3C-2_00Zp4O.js} +1 -1
  34. package/dist/web/assets/{arc-ChLnTnZI.js → arc-DAyuVDVU.js} +1 -1
  35. package/dist/web/assets/{architecture-WOLXFQ4H-B2oEg329.js → architecture-WOLXFQ4H-CgR1C4gR.js} +1 -1
  36. package/dist/web/assets/{architectureDiagram-ZHVYKT53-BzSXU9d0.js → architectureDiagram-ZHVYKT53-Dkb6AWjz.js} +1 -1
  37. package/dist/web/assets/{blockDiagram-RJAE7QA3-xhCZ7iUm.js → blockDiagram-RJAE7QA3-NtOGZdkX.js} +1 -1
  38. package/dist/web/assets/{c4Diagram-XDPPPE54-DZ8j79Mx.js → c4Diagram-XDPPPE54-C1dqWKb1.js} +1 -1
  39. package/dist/web/assets/channel-Co9_v2dk.js +1 -0
  40. package/dist/web/assets/{chunk-2E7WHVMD-y5rSOViW.js → chunk-2E7WHVMD-ClzuEiGk.js} +1 -1
  41. package/dist/web/assets/{chunk-4EMNKR2T-B7WVoonr.js → chunk-4EMNKR2T-DyTpkWag.js} +1 -1
  42. package/dist/web/assets/{chunk-55XCU76K-D-tlN44X.js → chunk-55XCU76K-DXBA4ib1.js} +1 -1
  43. package/dist/web/assets/{chunk-7S6XSTFO-31xOZx-Y.js → chunk-7S6XSTFO-DA_aq0zc.js} +1 -1
  44. package/dist/web/assets/{chunk-AQDTSKZB-CeCjUBmu.js → chunk-AQDTSKZB-BWTN3SC_.js} +1 -1
  45. package/dist/web/assets/{chunk-DSNLSHJZ-DgzXTo3_.js → chunk-DSNLSHJZ-DJnLTeE9.js} +1 -1
  46. package/dist/web/assets/{chunk-HAGFOTED-Dm22rez0.js → chunk-HAGFOTED-cDP-g1Eh.js} +1 -1
  47. package/dist/web/assets/{chunk-HNE4Q36P-CnFLQjbZ.js → chunk-HNE4Q36P-B3TTIYd_.js} +1 -1
  48. package/dist/web/assets/{chunk-NQOKRVIF-7DXXp2d_.js → chunk-NQOKRVIF-D8mmhZHq.js} +1 -1
  49. package/dist/web/assets/{chunk-UHW7PFBP-Bw9-oVzV.js → chunk-UHW7PFBP-DWIIg_jq.js} +1 -1
  50. package/dist/web/assets/{chunk-VQ5W62QI-C9PHAHIJ.js → chunk-VQ5W62QI-Bu3R2cpS.js} +1 -1
  51. package/dist/web/assets/{chunk-WQQL4CDK-C9nKxc0i.js → chunk-WQQL4CDK-BxsR1mXs.js} +1 -1
  52. package/dist/web/assets/{chunk-XXDRQBXY-DjdTeNXE.js → chunk-XXDRQBXY-Ds0JNdm-.js} +1 -1
  53. package/dist/web/assets/{chunk-YZO67HFG-C1z77_dC.js → chunk-YZO67HFG-COpqyQaD.js} +1 -1
  54. package/dist/web/assets/{chunk-ZAUX2LTX-C7e41NBP.js → chunk-ZAUX2LTX-BUrGjDuS.js} +1 -1
  55. package/dist/web/assets/{chunk-ZCHMQSOR-Gv41Qgvd.js → chunk-ZCHMQSOR-DYMM9mEK.js} +1 -1
  56. package/dist/web/assets/{classDiagram-v2-4MYWR3UA-PjZDyaSs.js → classDiagram-v2-4MYWR3UA-DfJvks0C.js} +1 -1
  57. package/dist/web/assets/{cose-bilkent-JH36ORCC-CvwZK3HN.js → cose-bilkent-JH36ORCC-CN5mpYIb.js} +1 -1
  58. package/dist/web/assets/{cynefin-EF2NZ3EQ-Yn6p93cE.js → cynefin-EF2NZ3EQ-DmlCHkY-.js} +1 -1
  59. package/dist/web/assets/{cynefinDiagram-WF24UDRP-BXa5Guxe.js → cynefinDiagram-WF24UDRP-C0aUblC2.js} +1 -1
  60. package/dist/web/assets/{dagre-NK4GIZVX-Cnskqb30.js → dagre-NK4GIZVX-Ba7RcAgP.js} +1 -1
  61. package/dist/web/assets/{diagram-CBK3MWTC-K8WEazkZ.js → diagram-CBK3MWTC-BYQDjB9i.js} +1 -1
  62. package/dist/web/assets/{diagram-I5XIIV2D-CLzouqUh.js → diagram-I5XIIV2D-EV79hoob.js} +1 -1
  63. package/dist/web/assets/{diagram-ODIL2UCW-B_9ysyHU.js → diagram-ODIL2UCW-BvQdwmgA.js} +1 -1
  64. package/dist/web/assets/{diagram-PFBEJUXE-D1ge5Ebx.js → diagram-PFBEJUXE-hxwI3F00.js} +1 -1
  65. package/dist/web/assets/{diagram-RJA3I4VV-DWF6V26r.js → diagram-RJA3I4VV-DwaHE2iB.js} +1 -1
  66. package/dist/web/assets/{diagram-TYUNFSNR-BNM1pCS4.js → diagram-TYUNFSNR-BxiOemA0.js} +1 -1
  67. package/dist/web/assets/{dist-_uWZFvFF.js → dist-nfRX7L9k.js} +1 -1
  68. package/dist/web/assets/{ebnfDiagram-V4P3TTPT-Cge9YHFL.js → ebnfDiagram-V4P3TTPT-CzQv5iDM.js} +1 -1
  69. package/dist/web/assets/{elk-QONTBCTQ-CY_393oL.js → elk-QONTBCTQ-DNR9HWcl.js} +1 -1
  70. package/dist/web/assets/{erDiagram-KYQIGQAA-CCOr67SS.js → erDiagram-KYQIGQAA-aJlTdb9w.js} +1 -1
  71. package/dist/web/assets/{eventmodeling-K75KTNOO-BzNNWwRQ.js → eventmodeling-K75KTNOO-D4J-ujy-.js} +1 -1
  72. package/dist/web/assets/flowDiagram-IUGLLWBU-Bq7dmPlS.js +1 -0
  73. package/dist/web/assets/{ganttDiagram-R7GPNTJY-8BewtZrJ.js → ganttDiagram-R7GPNTJY-DgytSfqO.js} +1 -1
  74. package/dist/web/assets/{gitGraph-VSP46ZUC-CrqJbic_.js → gitGraph-VSP46ZUC-BtjueFHB.js} +1 -1
  75. package/dist/web/assets/{gitGraphDiagram-PDYL7XHY-Ddr5Q6Is.js → gitGraphDiagram-PDYL7XHY-WP0Hjdh9.js} +1 -1
  76. package/dist/web/assets/index-BesPYgjq.js +156 -0
  77. package/dist/web/assets/{index-C_i_PNi6.css → index-qYBdGqKM.css} +1 -1
  78. package/dist/web/assets/{info-OHQRW6UA-DgPvuC2J.js → info-OHQRW6UA-iuP0WTfn.js} +1 -1
  79. package/dist/web/assets/{infoDiagram-MVDRKAX5-zlubFwKS.js → infoDiagram-MVDRKAX5-CpAtMyKS.js} +1 -1
  80. package/dist/web/assets/{ishikawaDiagram-HPEHV2GE-DdQfvqVi.js → ishikawaDiagram-HPEHV2GE-JTnItv7N.js} +1 -1
  81. package/dist/web/assets/{journeyDiagram-BOSHW7O7-DZ4XswBd.js → journeyDiagram-BOSHW7O7-B333k1QJ.js} +1 -1
  82. package/dist/web/assets/{kanban-definition-FNSA4HC5-B1BQdpKc.js → kanban-definition-FNSA4HC5-DpCk5ZH0.js} +1 -1
  83. package/dist/web/assets/{line-jQDqs207.js → line-CLs-qFxt.js} +1 -1
  84. package/dist/web/assets/{linear-DbYz4fU8.js → linear-E9AWqBNs.js} +1 -1
  85. package/dist/web/assets/{mermaid-parser.core-CY5CVNe8.js → mermaid-parser.core-D1rEzlb-.js} +3 -3
  86. package/dist/web/assets/{mermaid.core-mETL7nBW.js → mermaid.core-D6TNGGsX.js} +4 -4
  87. package/dist/web/assets/{mindmap-definition-6OY57UG3-CxgWFLxa.js → mindmap-definition-6OY57UG3-DrpuGWuc.js} +1 -1
  88. package/dist/web/assets/{packet-JDAUHWVQ-Czsr9kk7.js → packet-JDAUHWVQ-BpBr3aKk.js} +1 -1
  89. package/dist/web/assets/{pegDiagram-ECIUJNBX-BqYq-SA-.js → pegDiagram-ECIUJNBX-BrZX1cdv.js} +1 -1
  90. package/dist/web/assets/{pie-XZMESJXO-CRpxJzCy.js → pie-XZMESJXO-CcTpis-K.js} +1 -1
  91. package/dist/web/assets/{pieDiagram-GNMPY74T-Bt2wKk8z.js → pieDiagram-GNMPY74T-CR2em875.js} +1 -1
  92. package/dist/web/assets/{quadrantDiagram-D57K4MC3-VOKqYTgn.js → quadrantDiagram-D57K4MC3-D-ET5xbH.js} +1 -1
  93. package/dist/web/assets/{radar-ABXABTNO-wXmArQH-.js → radar-ABXABTNO-CTFFPCi_.js} +1 -1
  94. package/dist/web/assets/{railroad-I3PHUGI6-CKPK4tQV.js → railroad-I3PHUGI6-S6MHolw_.js} +1 -1
  95. package/dist/web/assets/{railroad-abnf-LNEFI6M7-BLEs3xqV.js → railroad-abnf-LNEFI6M7-NWxYLYMN.js} +1 -1
  96. package/dist/web/assets/{railroad-ebnf-DWYD2UWJ-DS5QZgky.js → railroad-ebnf-DWYD2UWJ-CRnaPl26.js} +1 -1
  97. package/dist/web/assets/{railroad-peg-JR7BVNR7-DHWXNOSl.js → railroad-peg-JR7BVNR7-CB85ffhO.js} +1 -1
  98. package/dist/web/assets/{railroadDiagram-Y72NRBL7-Cy4eWKH1.js → railroadDiagram-Y72NRBL7-Ba2xIF7q.js} +1 -1
  99. package/dist/web/assets/{requirementDiagram-EQYSW5RA-Bvbk8wwe.js → requirementDiagram-EQYSW5RA-B7faqgDT.js} +1 -1
  100. package/dist/web/assets/{sankeyDiagram-SY24JHO5-B4jGjMzu.js → sankeyDiagram-SY24JHO5-IjJVI58S.js} +1 -1
  101. package/dist/web/assets/{sequenceDiagram-BLEHNHQU-BpgUogv_.js → sequenceDiagram-BLEHNHQU-D-h5jxwQ.js} +1 -1
  102. package/dist/web/assets/{src-DigPeGm7.js → src-hBdSvoFJ.js} +1 -1
  103. package/dist/web/assets/{stateDiagram-v2-A6IESKWZ-tHq7e40Q.js → stateDiagram-v2-A6IESKWZ-rlZaPFqZ.js} +1 -1
  104. package/dist/web/assets/{swimlanes-B3ENRKFQ-DVUPAaDR.js → swimlanes-B3ENRKFQ-CqgKwSbP.js} +1 -1
  105. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-BGvWQ2Hp.js +8 -0
  106. package/dist/web/assets/{timeline-definition-JXYKGLGB-BHMM9AHV.js → timeline-definition-JXYKGLGB-DD76ZtY0.js} +1 -1
  107. package/dist/web/assets/{treeView-D4JQ5SDB-DZ7k_TTS.js → treeView-D4JQ5SDB-CcwWh4Bw.js} +1 -1
  108. package/dist/web/assets/{treemap-SAJKECNS-C1wGfVb4.js → treemap-SAJKECNS-8lde6V5O.js} +1 -1
  109. package/dist/web/assets/{usecaseDiagram-WPOLBNNX-BTg0K_GO.js → usecaseDiagram-WPOLBNNX-CWowobZv.js} +1 -1
  110. package/dist/web/assets/{vennDiagram-Q3Y3IDCW-BTKShPx1.js → vennDiagram-Q3Y3IDCW-U11W8pHe.js} +1 -1
  111. package/dist/web/assets/{wardley-7MLQ67FV-DnYPM5OB.js → wardley-7MLQ67FV-Dp2EaBmo.js} +1 -1
  112. package/dist/web/assets/{wardleyDiagram-IVAIDKWA-Dzb67Boa.js → wardleyDiagram-IVAIDKWA-7Qnos8ak.js} +1 -1
  113. package/dist/web/assets/{xychartDiagram-4URNHDU4-qijltKIO.js → xychartDiagram-4URNHDU4-BwfHNtsG.js} +1 -1
  114. package/dist/web/index.html +2 -2
  115. package/package.json +3 -3
  116. package/dist/web/assets/channel-COC5jFhc.js +0 -1
  117. package/dist/web/assets/flowDiagram-IUGLLWBU-C8dLq0uV.js +0 -1
  118. package/dist/web/assets/index-DHENTsqN.js +0 -148
  119. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-jJ6zDGAv.js +0 -8
package/README.md CHANGED
@@ -34,10 +34,18 @@
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
38
 
39
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
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.
48
+
41
49
  See the [usage guide · 中文](docs/usage.zh-CN.md) for workflow details and controls.
42
50
 
43
51
  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.
package/README.zh-CN.md CHANGED
@@ -34,10 +34,18 @@
34
34
  - 📖 **一边看产出,一边讨论。** 电脑上将文档、图表和代码变更与会话并排阅读,手机上使用全屏阅读器。
35
35
  - 🔔 **及时收到待办提醒。** 开启浏览器通知,在工作结束、需要回答或审批时收到提醒;需在支持通知的桌面浏览器中保持页面运行。
36
36
 
37
- 点击输入框中的 **+**,可从手机或电脑选择图片附件。模型、推理强度和 Fast 模式统一收进模型设置入口。
37
+ 点击输入框中的 **+**,可从手机或电脑选择图片附件。模型、推理强度、Fast 和 Plan/执行模式统一收进模型设置入口。使用 `/plan [任务]` 可选择 Plan 模式或直接提交规划任务。
38
38
 
39
39
  当前模型容量不足时,Covro 会展示原生重试进度;如果 Codex 没有自行重试,且本轮尚无输出或工具操作,会在 5、10、20 秒后最多补偿重试 3 次。可以取消,也可以选择其他模型后手动重试。恢复边界见[容量重试说明](docs/capacity-retry.md)。
40
40
 
41
+ 使用 `/review` 可选择未提交改动、基础分支、指定 commit 或自定义要求进行代码审查。使用 `/init` 可请求生成项目说明,已有 `AGENTS.md` 会保留。
42
+
43
+ 使用 `/diff` 可查看当前工作区已暂存、未暂存和未跟踪的 Git 改动,不创建模型任务。使用 `/approve` 可显式单次授权一条自动审核拒绝记录,再发送任务让 Codex 继续。
44
+
45
+ 使用 `/recap` 可通过独立模型请求总结近期可见消息,不改变会话上下文。
46
+
47
+ 使用 `/goal` 可查看和管理原生会话目标、Token 预算与实际进度。激活后 Codex 可自动继续工作,任务运行期间仍可暂停或清除目标。
48
+
41
49
  操作方式与使用细节见[使用指南](docs/usage.zh-CN.md)。
42
50
 
43
51
  在当前工作区新建会话:macOS 按 **⌘ + Option + N**,Windows/Linux 按 **Ctrl + Alt + N**。输入框会自动获得焦点,已有草稿继续保留。工作区有可识别的 GitHub remote 时,点击顶部 GitHub 图标即可在新标签页打开仓库;remote 选择规则见[工作区说明](docs/workspaces.md#快捷打开-github-仓库)。
@@ -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";
@@ -54,6 +60,10 @@ const CAPABILITIES = [
54
60
  "thread/items/list",
55
61
  "turn/start",
56
62
  "review/start",
63
+ "thread/goal/get",
64
+ "thread/goal/set",
65
+ "thread/goal/clear",
66
+ "thread/approveGuardianDeniedAction",
57
67
  "turn/steer",
58
68
  "turn/interrupt",
59
69
  "model/list",
@@ -98,6 +108,7 @@ class CodexAdapter {
98
108
  restartTimer;
99
109
  restartAttempt = 0;
100
110
  titles;
111
+ denials = new GuardianDenials();
101
112
  tokenUsage = new TurnTokenUsage();
102
113
  // Ordering only. Persisted archive state belongs exclusively to Codex.
103
114
  archiveSequence = 0;
@@ -175,6 +186,7 @@ class CodexAdapter {
175
186
  const version = stdout.trim().replace(/^codex-cli\s+/, "");
176
187
  this.state.codexVersion = version;
177
188
  this.permissionState.clear();
189
+ this.denials.clear();
178
190
  this.state.compatibility = CODEX_COMPATIBILITY.verified.includes(version) ? "verified" : "unverified";
179
191
  const child = spawn(
180
192
  this.options.binary,
@@ -221,6 +233,7 @@ class CodexAdapter {
221
233
  const wasReady = this.ready;
222
234
  this.state.ready = false;
223
235
  this.tokenUsage.clear();
236
+ this.denials.clear();
224
237
  this.state.connection = "unavailable";
225
238
  this.state.error = error.message;
226
239
  this.expireActions();
@@ -765,6 +778,9 @@ class CodexAdapter {
765
778
  const previous = this.permissionState.get(result.thread.id);
766
779
  const settings = {
767
780
  model: result.model ?? result.thread.model ?? null,
781
+ ...reportedCollaborationMode(
782
+ result.collaborationMode
783
+ ),
768
784
  reasoningEffort: result.reasoningEffort ?? null,
769
785
  ...serviceTierSettings(result.serviceTier),
770
786
  ...permissionSettings(
@@ -848,15 +864,16 @@ class CodexAdapter {
848
864
  threadId: id,
849
865
  cwd,
850
866
  input: taskInput(text, images),
851
- ...turnSettings(cwd, settings)
867
+ ...turnSettings(cwd, settings),
868
+ ...collaborationSelection(settings, this.permissionState.get(id))
852
869
  })).turn
853
870
  );
854
871
  return turn;
855
872
  }
856
- async startReview(id) {
873
+ async startReview(id, target = { type: "uncommittedChanges" }) {
857
874
  const result = await this.call("review/start", {
858
875
  threadId: id,
859
- target: { type: "uncommittedChanges" },
876
+ target: target.type === "commit" ? { ...target, title: null } : target,
860
877
  delivery: "inline"
861
878
  });
862
879
  if (!isRecord(result) || result.reviewThreadId !== id)
@@ -877,6 +894,37 @@ class CodexAdapter {
877
894
  async interruptTurn(id, turnId) {
878
895
  await this.call("turn/interrupt", { threadId: id, turnId });
879
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
+ }
880
928
  async compactThread(id) {
881
929
  await this.call("thread/compact/start", { threadId: id });
882
930
  }
@@ -920,9 +968,18 @@ class CodexAdapter {
920
968
  );
921
969
  break;
922
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;
923
977
  case "thread/settings/updated":
924
978
  {
925
979
  const observed = {
980
+ ...reportedCollaborationMode(
981
+ event.params.threadSettings.collaborationMode
982
+ ),
926
983
  model: event.params.threadSettings.model ?? null,
927
984
  reasoningEffort: event.params.threadSettings.effort ?? null,
928
985
  ...serviceTierSettings(event.params.threadSettings.serviceTier),
@@ -945,6 +1002,7 @@ class CodexAdapter {
945
1002
  break;
946
1003
  case "item/autoApprovalReview/started":
947
1004
  case "item/autoApprovalReview/completed":
1005
+ if (event.method === "item/autoApprovalReview/completed") this.denials.record(event.params);
948
1006
  this.emit({
949
1007
  type: "autoReview",
950
1008
  threadId: event.params.threadId,
@@ -1102,7 +1160,7 @@ class CodexAdapter {
1102
1160
  await this.rpc?.reject(
1103
1161
  message.id,
1104
1162
  -32601,
1105
- "Interactive tools are disabled for title generation"
1163
+ "Interactive tools are disabled for isolated helper requests"
1106
1164
  );
1107
1165
  return;
1108
1166
  }