@covro/covro 0.5.1-dev.3 → 0.5.1-dev.5

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 +14 -43
  2. package/README.zh-CN.md +14 -43
  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-BMy2AwDH.js} +1 -1
  34. package/dist/web/assets/{arc-ChLnTnZI.js → arc-DeUcXVmK.js} +1 -1
  35. package/dist/web/assets/{architecture-WOLXFQ4H-B2oEg329.js → architecture-WOLXFQ4H-B5DscTAH.js} +1 -1
  36. package/dist/web/assets/{architectureDiagram-ZHVYKT53-BzSXU9d0.js → architectureDiagram-ZHVYKT53-CwmVMMBS.js} +1 -1
  37. package/dist/web/assets/{blockDiagram-RJAE7QA3-xhCZ7iUm.js → blockDiagram-RJAE7QA3-CebOV20Y.js} +1 -1
  38. package/dist/web/assets/{c4Diagram-XDPPPE54-DZ8j79Mx.js → c4Diagram-XDPPPE54-ssP1dgbB.js} +1 -1
  39. package/dist/web/assets/channel-BONlMBPL.js +1 -0
  40. package/dist/web/assets/{chunk-2E7WHVMD-y5rSOViW.js → chunk-2E7WHVMD-BvN6p7-r.js} +1 -1
  41. package/dist/web/assets/{chunk-4EMNKR2T-B7WVoonr.js → chunk-4EMNKR2T-B5lsOa5d.js} +1 -1
  42. package/dist/web/assets/{chunk-55XCU76K-D-tlN44X.js → chunk-55XCU76K-C7v-VLmv.js} +1 -1
  43. package/dist/web/assets/{chunk-7S6XSTFO-31xOZx-Y.js → chunk-7S6XSTFO-DlQvFeJv.js} +1 -1
  44. package/dist/web/assets/{chunk-AQDTSKZB-CeCjUBmu.js → chunk-AQDTSKZB-DY66z9o6.js} +1 -1
  45. package/dist/web/assets/{chunk-DSNLSHJZ-DgzXTo3_.js → chunk-DSNLSHJZ-CNTCEJar.js} +1 -1
  46. package/dist/web/assets/{chunk-HAGFOTED-Dm22rez0.js → chunk-HAGFOTED-Ds8gP_pC.js} +1 -1
  47. package/dist/web/assets/{chunk-HNE4Q36P-CnFLQjbZ.js → chunk-HNE4Q36P-DmElQsSf.js} +1 -1
  48. package/dist/web/assets/{chunk-NQOKRVIF-7DXXp2d_.js → chunk-NQOKRVIF-PvGRAuAw.js} +1 -1
  49. package/dist/web/assets/{chunk-UHW7PFBP-Bw9-oVzV.js → chunk-UHW7PFBP-CtgMZDoT.js} +1 -1
  50. package/dist/web/assets/{chunk-VQ5W62QI-C9PHAHIJ.js → chunk-VQ5W62QI-6NJrEIzR.js} +1 -1
  51. package/dist/web/assets/{chunk-WQQL4CDK-C9nKxc0i.js → chunk-WQQL4CDK-DI2mRFvc.js} +1 -1
  52. package/dist/web/assets/{chunk-XXDRQBXY-DjdTeNXE.js → chunk-XXDRQBXY-CiBCRo3T.js} +1 -1
  53. package/dist/web/assets/{chunk-YZO67HFG-C1z77_dC.js → chunk-YZO67HFG-DtCoGutI.js} +1 -1
  54. package/dist/web/assets/{chunk-ZAUX2LTX-C7e41NBP.js → chunk-ZAUX2LTX-B7ylZUnx.js} +1 -1
  55. package/dist/web/assets/{chunk-ZCHMQSOR-Gv41Qgvd.js → chunk-ZCHMQSOR-BwN6F2pb.js} +1 -1
  56. package/dist/web/assets/{classDiagram-v2-4MYWR3UA-PjZDyaSs.js → classDiagram-v2-4MYWR3UA-DI-dMW0L.js} +1 -1
  57. package/dist/web/assets/{cose-bilkent-JH36ORCC-CvwZK3HN.js → cose-bilkent-JH36ORCC-BqNb8Qsf.js} +1 -1
  58. package/dist/web/assets/{cynefin-EF2NZ3EQ-Yn6p93cE.js → cynefin-EF2NZ3EQ-B9F8Lxxt.js} +1 -1
  59. package/dist/web/assets/{cynefinDiagram-WF24UDRP-BXa5Guxe.js → cynefinDiagram-WF24UDRP-V8w1XJro.js} +1 -1
  60. package/dist/web/assets/{dagre-NK4GIZVX-Cnskqb30.js → dagre-NK4GIZVX-CrQEcCfE.js} +1 -1
  61. package/dist/web/assets/{diagram-CBK3MWTC-K8WEazkZ.js → diagram-CBK3MWTC-CPcuEQV3.js} +1 -1
  62. package/dist/web/assets/{diagram-I5XIIV2D-CLzouqUh.js → diagram-I5XIIV2D-_QhPHtw6.js} +1 -1
  63. package/dist/web/assets/{diagram-ODIL2UCW-B_9ysyHU.js → diagram-ODIL2UCW-RA65VX6F.js} +1 -1
  64. package/dist/web/assets/{diagram-PFBEJUXE-D1ge5Ebx.js → diagram-PFBEJUXE-9OI5etAn.js} +1 -1
  65. package/dist/web/assets/{diagram-RJA3I4VV-DWF6V26r.js → diagram-RJA3I4VV-B10DlhGR.js} +1 -1
  66. package/dist/web/assets/{diagram-TYUNFSNR-BNM1pCS4.js → diagram-TYUNFSNR-BLwN-9mB.js} +1 -1
  67. package/dist/web/assets/{dist-_uWZFvFF.js → dist-DwHukJTB.js} +1 -1
  68. package/dist/web/assets/{ebnfDiagram-V4P3TTPT-Cge9YHFL.js → ebnfDiagram-V4P3TTPT-J7MBvK86.js} +1 -1
  69. package/dist/web/assets/{elk-QONTBCTQ-CY_393oL.js → elk-QONTBCTQ-DgtewEoX.js} +1 -1
  70. package/dist/web/assets/{erDiagram-KYQIGQAA-CCOr67SS.js → erDiagram-KYQIGQAA-Cn5kVne3.js} +1 -1
  71. package/dist/web/assets/{eventmodeling-K75KTNOO-BzNNWwRQ.js → eventmodeling-K75KTNOO-Cx1OdjIB.js} +1 -1
  72. package/dist/web/assets/flowDiagram-IUGLLWBU-HLbjrYlZ.js +1 -0
  73. package/dist/web/assets/{ganttDiagram-R7GPNTJY-8BewtZrJ.js → ganttDiagram-R7GPNTJY-x2B7XlcJ.js} +1 -1
  74. package/dist/web/assets/{gitGraph-VSP46ZUC-CrqJbic_.js → gitGraph-VSP46ZUC-CP1CGXSo.js} +1 -1
  75. package/dist/web/assets/{gitGraphDiagram-PDYL7XHY-Ddr5Q6Is.js → gitGraphDiagram-PDYL7XHY-B32E1dRa.js} +1 -1
  76. package/dist/web/assets/index-DXEj9ZMB.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-BqgII2wT.js} +1 -1
  79. package/dist/web/assets/{infoDiagram-MVDRKAX5-zlubFwKS.js → infoDiagram-MVDRKAX5-BV-WLQ_Y.js} +1 -1
  80. package/dist/web/assets/{ishikawaDiagram-HPEHV2GE-DdQfvqVi.js → ishikawaDiagram-HPEHV2GE-D2d2TDHI.js} +1 -1
  81. package/dist/web/assets/{journeyDiagram-BOSHW7O7-DZ4XswBd.js → journeyDiagram-BOSHW7O7-DdgHsdHz.js} +1 -1
  82. package/dist/web/assets/{kanban-definition-FNSA4HC5-B1BQdpKc.js → kanban-definition-FNSA4HC5-bzF0Iyr6.js} +1 -1
  83. package/dist/web/assets/{line-jQDqs207.js → line-DA04Ug-X.js} +1 -1
  84. package/dist/web/assets/{linear-DbYz4fU8.js → linear-DIrAIB_A.js} +1 -1
  85. package/dist/web/assets/{mermaid-parser.core-CY5CVNe8.js → mermaid-parser.core-DhCddf6t.js} +3 -3
  86. package/dist/web/assets/{mermaid.core-mETL7nBW.js → mermaid.core-sAbEeclG.js} +4 -4
  87. package/dist/web/assets/{mindmap-definition-6OY57UG3-CxgWFLxa.js → mindmap-definition-6OY57UG3-B7pbG4qr.js} +1 -1
  88. package/dist/web/assets/{packet-JDAUHWVQ-Czsr9kk7.js → packet-JDAUHWVQ-BpXWi4v7.js} +1 -1
  89. package/dist/web/assets/{pegDiagram-ECIUJNBX-BqYq-SA-.js → pegDiagram-ECIUJNBX-CnIz50ZX.js} +1 -1
  90. package/dist/web/assets/{pie-XZMESJXO-CRpxJzCy.js → pie-XZMESJXO-Cif1Ynbj.js} +1 -1
  91. package/dist/web/assets/{pieDiagram-GNMPY74T-Bt2wKk8z.js → pieDiagram-GNMPY74T-Ck5nOYI8.js} +1 -1
  92. package/dist/web/assets/{quadrantDiagram-D57K4MC3-VOKqYTgn.js → quadrantDiagram-D57K4MC3-DGWT1xA2.js} +1 -1
  93. package/dist/web/assets/{radar-ABXABTNO-wXmArQH-.js → radar-ABXABTNO-Cs5Evg0F.js} +1 -1
  94. package/dist/web/assets/{railroad-I3PHUGI6-CKPK4tQV.js → railroad-I3PHUGI6-bPE2bl6t.js} +1 -1
  95. package/dist/web/assets/{railroad-abnf-LNEFI6M7-BLEs3xqV.js → railroad-abnf-LNEFI6M7-Bf9uUUsQ.js} +1 -1
  96. package/dist/web/assets/{railroad-ebnf-DWYD2UWJ-DS5QZgky.js → railroad-ebnf-DWYD2UWJ-M2tmC6nN.js} +1 -1
  97. package/dist/web/assets/{railroad-peg-JR7BVNR7-DHWXNOSl.js → railroad-peg-JR7BVNR7-BLrv00Iy.js} +1 -1
  98. package/dist/web/assets/{railroadDiagram-Y72NRBL7-Cy4eWKH1.js → railroadDiagram-Y72NRBL7-BKzTLgo8.js} +1 -1
  99. package/dist/web/assets/{requirementDiagram-EQYSW5RA-Bvbk8wwe.js → requirementDiagram-EQYSW5RA-B99o2Aj1.js} +1 -1
  100. package/dist/web/assets/{sankeyDiagram-SY24JHO5-B4jGjMzu.js → sankeyDiagram-SY24JHO5-Bf5ZtsJ_.js} +1 -1
  101. package/dist/web/assets/{sequenceDiagram-BLEHNHQU-BpgUogv_.js → sequenceDiagram-BLEHNHQU-BGuIX9o_.js} +1 -1
  102. package/dist/web/assets/{src-DigPeGm7.js → src-CohAWB0C.js} +1 -1
  103. package/dist/web/assets/{stateDiagram-v2-A6IESKWZ-tHq7e40Q.js → stateDiagram-v2-A6IESKWZ-26L-tE9O.js} +1 -1
  104. package/dist/web/assets/{swimlanes-B3ENRKFQ-DVUPAaDR.js → swimlanes-B3ENRKFQ-C15cbuwK.js} +1 -1
  105. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-CJVz2uN5.js +8 -0
  106. package/dist/web/assets/{timeline-definition-JXYKGLGB-BHMM9AHV.js → timeline-definition-JXYKGLGB-BeL4WpaZ.js} +1 -1
  107. package/dist/web/assets/{treeView-D4JQ5SDB-DZ7k_TTS.js → treeView-D4JQ5SDB-DizQY9xz.js} +1 -1
  108. package/dist/web/assets/{treemap-SAJKECNS-C1wGfVb4.js → treemap-SAJKECNS-D91-mGk5.js} +1 -1
  109. package/dist/web/assets/{usecaseDiagram-WPOLBNNX-BTg0K_GO.js → usecaseDiagram-WPOLBNNX-Ba0T4eoq.js} +1 -1
  110. package/dist/web/assets/{vennDiagram-Q3Y3IDCW-BTKShPx1.js → vennDiagram-Q3Y3IDCW-B0Q_6_0E.js} +1 -1
  111. package/dist/web/assets/{wardley-7MLQ67FV-DnYPM5OB.js → wardley-7MLQ67FV-BMqvKWF0.js} +1 -1
  112. package/dist/web/assets/{wardleyDiagram-IVAIDKWA-Dzb67Boa.js → wardleyDiagram-IVAIDKWA-shZdkY_1.js} +1 -1
  113. package/dist/web/assets/{xychartDiagram-4URNHDU4-qijltKIO.js → xychartDiagram-4URNHDU4-DAt5ftPl.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,13 +34,7 @@
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
-
41
- See the [usage guide · 中文](docs/usage.zh-CN.md) for workflow details and controls.
42
-
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.
37
+ Find controls, shortcuts, and supported commands in the [usage guide · 中文](docs/usage.zh-CN.md) and [command guide](docs/slash-commands.md).
44
38
 
45
39
  <details>
46
40
  <summary><strong>📱 A workspace that fits your phone</strong></summary>
@@ -70,9 +64,9 @@ npm install -g @covro/covro
70
64
  covro
71
65
  ```
72
66
 
73
- `covro` starts in the background and prints the local address. Use `covro stop` to stop it. See [installation and service management](docs/distribution.md) for configuration, logs, login auto-start, macOS credential diagnostics, and release channels.
67
+ `covro` runs in the background; stop it with `covro stop`. See the [installation guide](docs/distribution.md) for configuration, logs, and login auto-start.
74
68
 
75
- Open **<http://127.0.0.1:8787>** and click **+** beside **Unassigned** to send your first task. Or use **Add project** to import a host directory or clone a Git repository. See [project setup](docs/project-clone.md) and [conversation workspaces](docs/workspaces.md) for directory options.
69
+ Open **<http://127.0.0.1:8787>** and click **+** beside **Unassigned** to start a task, or use **Add project** to [import a directory or clone a repository](docs/project-clone.md).
76
70
 
77
71
  <a id="run-from-source"></a>
78
72
 
@@ -101,11 +95,7 @@ The host computer must stay awake and online. When adding projects remotely, ent
101
95
 
102
96
  ## Updates and release channels
103
97
 
104
- Use the update panel to check versions and choose stable, beta, or dev. Beta and Dev also receive newer stable releases. **macOS and Linux npm global installations** support managed upgrades from this panel or `covro update`; other installations use their original update method.
105
-
106
- Automatic installation is off by default and requires a verified Codex combination. Unverified combinations need explicit confirmation; unknown versions, missing or invalid compatibility declarations, and explicitly unsupported combinations block managed upgrades. Covro does not upgrade Codex CLI. See [updates and recovery](docs/distribution.md) for commands, compatibility checks, and backups.
107
-
108
- DB Schema **7** is tracked separately from the application version; older applications cannot open newer databases. Backups cover Covro’s database and service configuration, excluding project files, Codex history, and credentials. Restore requires stopping the service; see [backups](docs/backups.md) and [database compatibility](docs/database.md).
98
+ Choose stable, beta, or dev in the update panel or with `covro update`. Managed upgrades support **macOS and Linux npm global installations**; other installations use their original update method. Automatic installation is off by default and requires verified Codex compatibility; unverified combinations need explicit confirmation. Covro does not upgrade Codex CLI. See [updates and recovery](docs/distribution.md).
109
99
 
110
100
  ## Your computer, your workspace
111
101
 
@@ -113,42 +103,23 @@ Covro connects to your existing CLI through `codex app-server`. Tasks, projects,
113
103
 
114
104
  Covro is for a single user. The [Shell panel](docs/shell.md) runs non-interactive commands using Codex’s configured sandbox. An interactive terminal, file editor, Git GUI, and multi-user team management are outside the current scope.
115
105
 
116
- ## Development and contribution
117
-
118
- ```sh
119
- pnpm format:check
120
- pnpm typecheck
121
- pnpm lint
122
- pnpm test
123
- pnpm build
124
- pnpm test:e2e
125
- ```
126
-
127
- Browser tests require the Chromium version used by the existing Playwright dependency. Tests and CI use explicit fixtures; they do not send real model requests.
106
+ DB Schema **7** is independent of the application version; older applications cannot open newer databases. Backups cover only Covro’s database and service configuration, excluding project files, Codex history, and credentials. Restore requires stopping the service. See [backups](docs/backups.md) and [database compatibility](docs/database.md).
128
107
 
129
- Use `pnpm format` to fix formatting; PR titles follow Conventional Commits. See [contribution and release conventions](docs/contributing.md).
108
+ ## Development and contribution
130
109
 
131
- Found a problem or have an idea? [Open an issue](https://github.com/yuzheng14/covro/issues) with your OS, Node.js and Codex versions, installation method, and steps to reproduce. Small, focused PRs are welcome; update both READMEs when changing user-facing facts or setup instructions.
110
+ See the [contribution guide](docs/contributing.md) for development setup, checks, and PR conventions. [Open an issue](https://github.com/yuzheng14/covro/issues) or send a focused PR; update both READMEs when changing user-facing facts.
132
111
 
133
112
  <a id="documentation"></a>
134
113
 
135
114
  ## 📚 Documentation
136
115
 
137
- | Guide | Contents |
138
- | ---------------------------------------------------------------------- | ----------------------------------------------------------------------- |
139
- | [Detailed usage · 中文](docs/usage.zh-CN.md) | Projects, conversations, approvals, notifications, images, and recovery |
140
- | [Deployment](docs/deployment.md) | Local access, Tailscale, and Cloudflare Access |
141
- | [Distribution](docs/distribution.md) | CLI, services, data locations, upgrades, and repair |
142
- | [Compatibility](docs/compatibility.md) | Verified Codex versions and behavior boundaries |
143
- | [Slash commands](docs/slash-commands.md) | Supported commands and usage |
144
- | [Architecture](docs/architecture.md) | How the gateway, Codex adapter, and browser fit together |
145
- | [Verification](docs/verification.md) | Test coverage and recorded live checks |
146
- | [Projects](docs/project-clone.md) · [Workspaces](docs/workspaces.md) | Importing, cloning, and conversation directories |
147
- | [Languages](docs/i18n.md) · [History loading](docs/session-history.md) | Interface language and conversation loading |
148
- | [Shell](docs/shell.md) | Command execution and sandbox limits |
149
- | [Backups](docs/backups.md) · [Database](docs/database.md) | Snapshot scope, compatibility, and offline recovery |
150
- | [Contributing](docs/contributing.md) · [Releases](docs/releases.md) | Formatting, PRs, and publishing |
151
- | [Brand assets](docs/brand.md) | Editable SVG logo and wordmarks |
116
+ | Topic | Guides |
117
+ | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
118
+ | Everyday use | [Usage · 中文](docs/usage.zh-CN.md) · [Commands](docs/slash-commands.md) · [Shell](docs/shell.md) · [Capacity retries](docs/capacity-retry.md) |
119
+ | Projects and conversations | [Import and clone](docs/project-clone.md) · [Workspaces](docs/workspaces.md) · [History loading](docs/session-history.md) |
120
+ | Setup and access | [Install and update](docs/distribution.md) · [Deployment](docs/deployment.md) · [Interface languages](docs/i18n.md) |
121
+ | Data and compatibility | [Backups](docs/backups.md) · [Database](docs/database.md) · [Codex compatibility](docs/compatibility.md) |
122
+ | Development and releases | [Contributing](docs/contributing.md) · [Architecture](docs/architecture.md) · [Verification](docs/verification.md) · [Releases](docs/releases.md) · [Brand assets](docs/brand.md) |
152
123
 
153
124
  ## License
154
125
 
package/README.zh-CN.md CHANGED
@@ -34,13 +34,7 @@
34
34
  - 📖 **一边看产出,一边讨论。** 电脑上将文档、图表和代码变更与会话并排阅读,手机上使用全屏阅读器。
35
35
  - 🔔 **及时收到待办提醒。** 开启浏览器通知,在工作结束、需要回答或审批时收到提醒;需在支持通知的桌面浏览器中保持页面运行。
36
36
 
37
- 点击输入框中的 **+**,可从手机或电脑选择图片附件。模型、推理强度和 Fast 模式统一收进模型设置入口。
38
-
39
- 当前模型容量不足时,Covro 会展示原生重试进度;如果 Codex 没有自行重试,且本轮尚无输出或工具操作,会在 5、10、20 秒后最多补偿重试 3 次。可以取消,也可以选择其他模型后手动重试。恢复边界见[容量重试说明](docs/capacity-retry.md)。
40
-
41
- 操作方式与使用细节见[使用指南](docs/usage.zh-CN.md)。
42
-
43
- 在当前工作区新建会话:macOS 按 **⌘ + Option + N**,Windows/Linux 按 **Ctrl + Alt + N**。输入框会自动获得焦点,已有草稿继续保留。工作区有可识别的 GitHub remote 时,点击顶部 GitHub 图标即可在新标签页打开仓库;remote 选择规则见[工作区说明](docs/workspaces.md#快捷打开-github-仓库)。
37
+ 操作、快捷键和命令用法见[使用指南](docs/usage.zh-CN.md)与[Slash 命令说明](docs/slash-commands.md)。
44
38
 
45
39
  <details>
46
40
  <summary><strong>📱 手机上也能舒服地使用</strong></summary>
@@ -70,9 +64,9 @@ npm install -g @covro/covro
70
64
  covro
71
65
  ```
72
66
 
73
- `covro` 默认在后台启动并输出本机访问地址,使用 `covro stop` 停止。配置、日志、登录自启、macOS 凭证诊断和版本渠道见[安装与服务管理](docs/distribution.md)。
67
+ `covro` 在后台启动,使用 `covro stop` 停止。配置、日志与登录自启见[安装指南](docs/distribution.md)。
74
68
 
75
- 打开 **<http://127.0.0.1:8787>**,点击 **未关联项目** 右侧的 **+** 即可发送第一条任务。也可通过 **添加项目** 导入主机目录或克隆 Git 仓库。目录选项见[项目配置](docs/project-clone.md)和[会话工作目录](docs/workspaces.md)。
69
+ 打开 **<http://127.0.0.1:8787>**,点击 **未关联项目** 旁的 **+** 开始任务,或通过 **添加项目** [导入目录或克隆仓库](docs/project-clone.md)。
76
70
 
77
71
  <a id="从源码运行"></a>
78
72
 
@@ -101,11 +95,7 @@ pnpm start -- --config ./config.local.json
101
95
 
102
96
  ## 更新与版本渠道
103
97
 
104
- 在更新面板检查版本,选择稳定版、预览版或开发版;预览版和开发版也会接收更新的稳定版本。**macOS 和 Linux 的 npm 全局安装**支持在此面板或通过 `covro update` 受管升级;其他安装方式沿用原更新方法。
105
-
106
- 自动安装默认关闭,且只接受已验证的 Codex 组合。未验证组合需要明确确认;版本未知、兼容声明缺失或无效、明确不支持的组合会阻止受管升级。Covro 不会升级 Codex CLI。完整命令、兼容检查和备份说明见[更新与恢复](docs/distribution.md)。
107
-
108
- DB Schema **7** 独立于应用版本管理,旧应用不能打开更新的数据库。备份覆盖 Covro 数据库和服务配置,不包含项目文件、Codex 历史或凭据。恢复需要停服,详见[备份与恢复](docs/backups.md)和[数据库兼容规则](docs/database.md)。
98
+ 在更新面板或通过 `covro update` 选择稳定、预览或开发渠道。受管升级支持 **macOS 和 Linux 的 npm 全局安装**,其他安装方式沿用原更新方法。自动安装默认关闭,且只接受已验证的 Codex 组合;未验证组合需明确确认。Covro 不会升级 Codex CLI。详见[更新与恢复](docs/distribution.md)。
109
99
 
110
100
  ## 你的电脑,你的工作台
111
101
 
@@ -113,42 +103,23 @@ Covro 通过 `codex app-server` 连接已有 CLI,沿用你的 Codex 登录与
113
103
 
114
104
  Covro 面向单用户。[Shell 面板](docs/shell.md)沿用 Codex 配置的沙箱执行非交互命令。交互终端、文件编辑器、Git 图形界面与多人团队管理不在当前范围内。
115
105
 
116
- ## 开发与参与
117
-
118
- ```sh
119
- pnpm format:check
120
- pnpm typecheck
121
- pnpm lint
122
- pnpm test
123
- pnpm build
124
- pnpm test:e2e
125
- ```
126
-
127
- 浏览器测试需要现有 Playwright 依赖所对应的 Chromium。测试与 CI 使用明确的测试夹具,不发起真实模型请求。
106
+ DB Schema **7** 独立于应用版本,旧应用不能打开更新的数据库。备份只覆盖 Covro 数据库和服务配置,不包含项目文件、Codex 历史或凭据;恢复需停服。详见[备份](docs/backups.md)与[数据库兼容规则](docs/database.md)。
128
107
 
129
- 使用 `pnpm format` 修复格式,PR 标题遵循 Conventional Commits,详见[开发与发版约定](docs/contributing.md)。
108
+ ## 开发与参与
130
109
 
131
- 遇到问题或有想法,欢迎[提交 Issue](https://github.com/yuzheng14/covro/issues),附上操作系统、Node.js 与 Codex 版本、安装方式和复现步骤。也欢迎范围明确的小 PR;修改面向使用者的事实或安装步骤时,请同步更新两份 README。
110
+ 开发环境、检查命令与 PR 约定见[贡献指南](docs/contributing.md)。欢迎[提交 Issue](https://github.com/yuzheng14/covro/issues) 或范围明确的 PR;面向使用者的变更需同步更新两份 README。
132
111
 
133
112
  <a id="文档导航"></a>
134
113
 
135
114
  ## 📚 文档导航
136
115
 
137
- | 指南 | 内容 |
138
- | -------------------------------------------------------------- | ------------------------------------ |
139
- | [详细使用指南](docs/usage.zh-CN.md) | 项目、会话、审批、通知、图片和恢复 |
140
- | [部署](docs/deployment.md) | 本机、Tailscale 与 Cloudflare Access |
141
- | [分发](docs/distribution.md) | CLI、服务、数据位置、升级与修复 |
142
- | [兼容性](docs/compatibility.md) | 已验证的 Codex 版本与行为边界 |
143
- | [Slash 命令](docs/slash-commands.md) | 支持的命令和用法 |
144
- | [架构](docs/architecture.md) | 网关、Codex 适配器与浏览器的协作方式 |
145
- | [验证记录](docs/verification.md) | 测试范围与真实环境检查记录 |
146
- | [项目](docs/project-clone.md) · [工作目录](docs/workspaces.md) | 导入、克隆与会话目录 |
147
- | [语言](docs/i18n.md) · [历史加载](docs/session-history.md) | 界面语言与会话加载 |
148
- | [Shell](docs/shell.md) | 命令执行与沙箱限制 |
149
- | [备份](docs/backups.md) · [数据库](docs/database.md) | 快照范围、兼容性与停服恢复 |
150
- | [开发约定](docs/contributing.md) · [发版](docs/releases.md) | 格式、PR 与发布流程 |
151
- | [品牌素材](docs/brand.md) | 可编辑的 SVG 图标与完整标识 |
116
+ | 主题 | 指南 |
117
+ | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
118
+ | 日常使用 | [使用指南](docs/usage.zh-CN.md) · [命令](docs/slash-commands.md) · [Shell](docs/shell.md) · [容量重试](docs/capacity-retry.md) |
119
+ | 项目与会话 | [导入与克隆](docs/project-clone.md) · [工作目录](docs/workspaces.md) · [历史加载](docs/session-history.md) |
120
+ | 安装与访问 | [安装与更新](docs/distribution.md) · [部署](docs/deployment.md) · [界面语言](docs/i18n.md) |
121
+ | 数据与兼容 | [备份](docs/backups.md) · [数据库](docs/database.md) · [Codex 兼容性](docs/compatibility.md) |
122
+ | 开发与发布 | [贡献](docs/contributing.md) · [架构](docs/architecture.md) · [验证](docs/verification.md) · [发版](docs/releases.md) · [品牌素材](docs/brand.md) |
152
123
 
153
124
  ## 许可证
154
125
 
@@ -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
  }