@covro/covro 0.3.1-dev.3 → 0.3.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 (90) hide show
  1. package/README.md +36 -98
  2. package/README.zh-CN.md +36 -98
  3. package/dist/web/assets/{abnfDiagram-WEYOIA3C-CgSmgOr1.js → abnfDiagram-WEYOIA3C-Cjx0OXcz.js} +1 -1
  4. package/dist/web/assets/{arc-DHf4CdSk.js → arc-CvLw1Xal.js} +1 -1
  5. package/dist/web/assets/{architecture-WOLXFQ4H-DMTD1pHe.js → architecture-WOLXFQ4H-BoyiZK3I.js} +1 -1
  6. package/dist/web/assets/{architectureDiagram-ZHVYKT53-DTR8wiWo.js → architectureDiagram-ZHVYKT53-CJFFQbOJ.js} +1 -1
  7. package/dist/web/assets/{blockDiagram-RJAE7QA3-DcNiTPKZ.js → blockDiagram-RJAE7QA3-DcmYDYUX.js} +1 -1
  8. package/dist/web/assets/{c4Diagram-XDPPPE54-BDxJVXjQ.js → c4Diagram-XDPPPE54-C2KOq1Us.js} +1 -1
  9. package/dist/web/assets/channel-DHeAegjr.js +1 -0
  10. package/dist/web/assets/{chunk-2E7WHVMD-D5oKHRGT.js → chunk-2E7WHVMD-CPc4Cyjo.js} +1 -1
  11. package/dist/web/assets/{chunk-4EMNKR2T-CtrbVCM-.js → chunk-4EMNKR2T-B_j-4I2i.js} +1 -1
  12. package/dist/web/assets/{chunk-55XCU76K-Dhl7DEL7.js → chunk-55XCU76K-BP-MraiS.js} +1 -1
  13. package/dist/web/assets/{chunk-7S6XSTFO-C8EwegP-.js → chunk-7S6XSTFO-CQYF0QBO.js} +1 -1
  14. package/dist/web/assets/{chunk-AQDTSKZB-lFiNKr7B.js → chunk-AQDTSKZB-C6XdKA-D.js} +1 -1
  15. package/dist/web/assets/{chunk-DSNLSHJZ-B8GftONA.js → chunk-DSNLSHJZ-D0FOol-u.js} +1 -1
  16. package/dist/web/assets/{chunk-HAGFOTED-Cnc2mh7_.js → chunk-HAGFOTED-DXH_cvSy.js} +1 -1
  17. package/dist/web/assets/{chunk-HNE4Q36P-BKl6ZgI0.js → chunk-HNE4Q36P-CX7MKHoR.js} +1 -1
  18. package/dist/web/assets/{chunk-NQOKRVIF-qKlxSw3D.js → chunk-NQOKRVIF-Avf9oLB0.js} +1 -1
  19. package/dist/web/assets/{chunk-UHW7PFBP-C_zh3mNe.js → chunk-UHW7PFBP-DAsYRzs7.js} +1 -1
  20. package/dist/web/assets/{chunk-VQ5W62QI-BXoyXK0q.js → chunk-VQ5W62QI-DFWpHl0D.js} +1 -1
  21. package/dist/web/assets/{chunk-WQQL4CDK-BBeqcU1J.js → chunk-WQQL4CDK-xqWPEXgl.js} +1 -1
  22. package/dist/web/assets/{chunk-XXDRQBXY-DzssZtz_.js → chunk-XXDRQBXY-2tossxkc.js} +1 -1
  23. package/dist/web/assets/{chunk-YZO67HFG-BbNSwLjS.js → chunk-YZO67HFG-DlJUQLDo.js} +1 -1
  24. package/dist/web/assets/{chunk-ZAUX2LTX-CjURwZfv.js → chunk-ZAUX2LTX-DK7k3CWi.js} +1 -1
  25. package/dist/web/assets/{chunk-ZCHMQSOR-u39dymjE.js → chunk-ZCHMQSOR-CJTg80VM.js} +1 -1
  26. package/dist/web/assets/{classDiagram-v2-4MYWR3UA-BEXx5gKT.js → classDiagram-v2-4MYWR3UA-D9ycrRqn.js} +1 -1
  27. package/dist/web/assets/{cose-bilkent-JH36ORCC-BxDEucP_.js → cose-bilkent-JH36ORCC-BcHO63YR.js} +1 -1
  28. package/dist/web/assets/{cynefin-EF2NZ3EQ-BhkCsT6-.js → cynefin-EF2NZ3EQ-y6F6uo0X.js} +1 -1
  29. package/dist/web/assets/{cynefinDiagram-WF24UDRP-Wpu-yNke.js → cynefinDiagram-WF24UDRP-BGHRMk1J.js} +1 -1
  30. package/dist/web/assets/{dagre-NK4GIZVX-LNSSIN4l.js → dagre-NK4GIZVX-BUGDXh2l.js} +1 -1
  31. package/dist/web/assets/{diagram-CBK3MWTC-BVDr5Vx9.js → diagram-CBK3MWTC-ITipFRO6.js} +1 -1
  32. package/dist/web/assets/{diagram-I5XIIV2D-MnLzR1Rv.js → diagram-I5XIIV2D-C77vK6Rh.js} +1 -1
  33. package/dist/web/assets/{diagram-ODIL2UCW-CZ4igbo_.js → diagram-ODIL2UCW-ixKT-RwG.js} +1 -1
  34. package/dist/web/assets/{diagram-PFBEJUXE-4hCnyMdK.js → diagram-PFBEJUXE-Cf_zNyGa.js} +1 -1
  35. package/dist/web/assets/{diagram-RJA3I4VV-DTo42rGA.js → diagram-RJA3I4VV-Cn3svdht.js} +1 -1
  36. package/dist/web/assets/{diagram-TYUNFSNR-BC12iCUZ.js → diagram-TYUNFSNR-DqS4o_qt.js} +1 -1
  37. package/dist/web/assets/{dist-Dg_ysSxT.js → dist-BxX2PIsO.js} +1 -1
  38. package/dist/web/assets/{ebnfDiagram-V4P3TTPT-Du8LCQ31.js → ebnfDiagram-V4P3TTPT-WBx9wV8-.js} +1 -1
  39. package/dist/web/assets/{elk-QONTBCTQ-BzTAR-T1.js → elk-QONTBCTQ-DWPUx0sZ.js} +1 -1
  40. package/dist/web/assets/{erDiagram-KYQIGQAA-SXYIjNOP.js → erDiagram-KYQIGQAA-CAFR0w7D.js} +1 -1
  41. package/dist/web/assets/{eventmodeling-K75KTNOO-Sbno3ZxQ.js → eventmodeling-K75KTNOO-BCW1wXaB.js} +1 -1
  42. package/dist/web/assets/flowDiagram-IUGLLWBU-D-HflbqC.js +1 -0
  43. package/dist/web/assets/{ganttDiagram-R7GPNTJY-DBeX1qmu.js → ganttDiagram-R7GPNTJY-BKg-6vBi.js} +1 -1
  44. package/dist/web/assets/{gitGraph-VSP46ZUC-CKWihueS.js → gitGraph-VSP46ZUC-Codgogo9.js} +1 -1
  45. package/dist/web/assets/{gitGraphDiagram-PDYL7XHY-Cj1E3jqN.js → gitGraphDiagram-PDYL7XHY-_586lhwJ.js} +1 -1
  46. package/dist/web/assets/index-B1wlD3sg.css +1 -0
  47. package/dist/web/assets/index-CJCf6cdc.js +147 -0
  48. package/dist/web/assets/{info-OHQRW6UA-D0w3nR0p.js → info-OHQRW6UA-DMCkz484.js} +1 -1
  49. package/dist/web/assets/{infoDiagram-MVDRKAX5-F0jTCG-G.js → infoDiagram-MVDRKAX5-m7XtcE7i.js} +1 -1
  50. package/dist/web/assets/{ishikawaDiagram-HPEHV2GE-CwQGP9AT.js → ishikawaDiagram-HPEHV2GE-C4wWzCs9.js} +1 -1
  51. package/dist/web/assets/{journeyDiagram-BOSHW7O7-CPY5GqD2.js → journeyDiagram-BOSHW7O7-BlWQT1Sx.js} +1 -1
  52. package/dist/web/assets/{kanban-definition-FNSA4HC5-BCL38eXh.js → kanban-definition-FNSA4HC5-CC5ff6mC.js} +1 -1
  53. package/dist/web/assets/{line-DoUzbVJS.js → line-CBiIKtfD.js} +1 -1
  54. package/dist/web/assets/{linear-LoqU-SEO.js → linear-BKe-iA-D.js} +1 -1
  55. package/dist/web/assets/{mermaid-parser.core-CvO-MTG1.js → mermaid-parser.core-BTsSiR1J.js} +3 -3
  56. package/dist/web/assets/{mermaid.core-DcCEGt0V.js → mermaid.core-CMDsDlBl.js} +4 -4
  57. package/dist/web/assets/{mindmap-definition-6OY57UG3-yZvSibNz.js → mindmap-definition-6OY57UG3-3IJPjY7w.js} +1 -1
  58. package/dist/web/assets/{packet-JDAUHWVQ-9ZiCegsV.js → packet-JDAUHWVQ-D-_ETQrl.js} +1 -1
  59. package/dist/web/assets/{pegDiagram-ECIUJNBX-BkGwBoEk.js → pegDiagram-ECIUJNBX-D_ftaIbW.js} +1 -1
  60. package/dist/web/assets/{pie-XZMESJXO-kAXIwFnU.js → pie-XZMESJXO-B7rDTN6s.js} +1 -1
  61. package/dist/web/assets/{pieDiagram-GNMPY74T-jiwTgtdb.js → pieDiagram-GNMPY74T-CqR-i7yU.js} +1 -1
  62. package/dist/web/assets/{quadrantDiagram-D57K4MC3-u9HdbUwr.js → quadrantDiagram-D57K4MC3-C_224EYQ.js} +1 -1
  63. package/dist/web/assets/{radar-ABXABTNO-BQ911CvQ.js → radar-ABXABTNO-DGRi3v9D.js} +1 -1
  64. package/dist/web/assets/{railroad-I3PHUGI6-Bvm7MWf9.js → railroad-I3PHUGI6-DQ_eo9oa.js} +1 -1
  65. package/dist/web/assets/{railroad-abnf-LNEFI6M7-BfFmWnzu.js → railroad-abnf-LNEFI6M7-DQDZjpNe.js} +1 -1
  66. package/dist/web/assets/{railroad-ebnf-DWYD2UWJ-B8Ekz4aD.js → railroad-ebnf-DWYD2UWJ-COkW75aP.js} +1 -1
  67. package/dist/web/assets/{railroad-peg-JR7BVNR7-B5ANjRbC.js → railroad-peg-JR7BVNR7-DC72afyO.js} +1 -1
  68. package/dist/web/assets/{railroadDiagram-Y72NRBL7-iu8Hmuma.js → railroadDiagram-Y72NRBL7-DR_X0nVu.js} +1 -1
  69. package/dist/web/assets/{requirementDiagram-EQYSW5RA-DgiEaaYZ.js → requirementDiagram-EQYSW5RA-DV25jmiz.js} +1 -1
  70. package/dist/web/assets/{sankeyDiagram-SY24JHO5-KzDvhd8J.js → sankeyDiagram-SY24JHO5-CFmJJoSR.js} +1 -1
  71. package/dist/web/assets/{sequenceDiagram-BLEHNHQU-DJMSHuO_.js → sequenceDiagram-BLEHNHQU-wle2fhAZ.js} +1 -1
  72. package/dist/web/assets/{src-C5WkvxTS.js → src-m1aZIffM.js} +1 -1
  73. package/dist/web/assets/{stateDiagram-v2-A6IESKWZ-CyfHfUyU.js → stateDiagram-v2-A6IESKWZ-BIrvH_yN.js} +1 -1
  74. package/dist/web/assets/{swimlanes-B3ENRKFQ-YPSzHf2U.js → swimlanes-B3ENRKFQ-BB349NpW.js} +1 -1
  75. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-BFk_Sb-0.js +8 -0
  76. package/dist/web/assets/{timeline-definition-JXYKGLGB-BwvPIiSj.js → timeline-definition-JXYKGLGB-CVk1BejN.js} +1 -1
  77. package/dist/web/assets/{treeView-D4JQ5SDB-DsUhEw24.js → treeView-D4JQ5SDB-DS2edlGl.js} +1 -1
  78. package/dist/web/assets/{treemap-SAJKECNS-D5NThB4V.js → treemap-SAJKECNS-Bk8l3nKF.js} +1 -1
  79. package/dist/web/assets/{usecaseDiagram-WPOLBNNX-fLWGvuS0.js → usecaseDiagram-WPOLBNNX-CFmszgkP.js} +1 -1
  80. package/dist/web/assets/{vennDiagram-Q3Y3IDCW-DFzlk_u2.js → vennDiagram-Q3Y3IDCW-CYkDp-49.js} +1 -1
  81. package/dist/web/assets/{wardley-7MLQ67FV-0uG-noJX.js → wardley-7MLQ67FV-CyD-xTtd.js} +1 -1
  82. package/dist/web/assets/{wardleyDiagram-IVAIDKWA-DfEQPTLg.js → wardleyDiagram-IVAIDKWA-Bg8YxOdf.js} +1 -1
  83. package/dist/web/assets/{xychartDiagram-4URNHDU4-BXVsWbL0.js → xychartDiagram-4URNHDU4-Cor5OZMM.js} +1 -1
  84. package/dist/web/index.html +2 -2
  85. package/package.json +3 -3
  86. package/dist/web/assets/channel-B6d61z43.js +0 -1
  87. package/dist/web/assets/flowDiagram-IUGLLWBU-Ae1H3vSR.js +0 -1
  88. package/dist/web/assets/index-CtTuHkNv.js +0 -147
  89. package/dist/web/assets/index-DwnjYADO.css +0 -1
  90. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-D2_NQS-o.js +0 -8
package/README.md CHANGED
@@ -29,25 +29,14 @@
29
29
 
30
30
  ## ✨ What you can do
31
31
 
32
- - 📱 **Step away from your desk. Stay with the task.** Follow tool activity, inspect file changes, handle permission requests, and answer Codex's questions from your computer or phone. Closing the page doesn't cancel the task.
33
- - 💬 **Start without a project.** Use **New session** to start in an automatically assigned directory. Conversations and files stay available after refresh, restart, or archive.
34
- - 🌐 **Choose your interface language.** Switch between 简体中文, English, 日本語 and 한국어 without leaving your session. Prompts, replies, tool output and paths remain unchanged. [Localization details](docs/i18n.md).
35
- - 🗂️ **See every project in one place.** Run independent tasks in parallel and spot which conversations are working, waiting for approval, or ready to read. Use **Reorder projects** to drag projects or move them with the arrow buttons on desktop and mobile. Your order survives refreshes and restarts; new or restored projects appear at the end.
36
- - 💬 **Pick up your Codex CLI conversations.** Browse saved history, resume existing work, or fork a new direction. Rename conversations to find them later and archive them when you're done. View and copy the full Thread ID in conversation details or diagnostics.
37
- - ⚡ **Open long conversations sooner.** Recent messages appear first; scrolling preloads older history. On this device, cached conversation lists and history pages appear while the server checks for updates. [Loading and cache behavior](docs/session-history.md).
38
- - 📖 **Review the work beside the conversation.** Read Markdown documents with code, tables, images, and Mermaid diagrams, or open JSON files in a desktop side panel while you keep talking to Codex. Mermaid diagrams also render in replies; view or copy their source and inspect wide diagrams at actual size. JSON previews include indentation, syntax highlighting, and original text for invalid JSON. Copy the unchanged source, with a full-screen reader on mobile. TXT, CSV, TSV, TOML, YAML/YML, JSONL, LOG, and INI files open as plain text, preserving whitespace with optional line wrapping. File previews are read-only; all supported text formats have a 2 MiB limit and require UTF-8.
39
- - 🔎 **Inspect code changes.** Open Codex’s saved patches for a turn or tool in the same read-only panel. Scroll through all files, inspect line numbers, see the exact words changed within each line, and jump between change blocks. Long diffs start collapsed and render when expanded. File headers stay visible while scrolling so you can collapse the current file.
40
- - ✍️ **Switch tasks without losing your draft.** Each conversation keeps its own draft, pasted images, and model settings in the current page. On phones and tablets, Enter inserts a new line and the send button submits; desktop keeps Enter to send and Shift + Enter for a new line. Copy or export results when you're done. Use the copy button at the top right of a command’s output to copy all loaded results; truncated output is clearly marked.
41
- - 🖥️ **Run a command beside your task.** Open **Shell** to execute commands in the selected project's directory, follow stdout/stderr, interrupt a run, and reuse recent commands. The panel uses Codex's configured sandbox, with a ten-minute limit and no interactive input. Closing it keeps the command running. [Capabilities and limits](docs/shell.md).
42
- - 🛟 **Keep a recovery point.** Open **Backups and recovery** in the sidebar to create a server-side backup, follow its progress and review verified snapshots. Upgrades use the same backup engine. Recovery runs offline through the CLI. [Scope and recovery instructions](docs/backups.md).
43
-
44
- Mermaid diagrams render locally after their code fence closes, with automatic light/dark colors. Failed diagrams keep their source; rendering is limited to 50,000 source characters and 500 edges.
45
-
46
- Local image previews reuse loaded images for 30 seconds. Reopening an expired image shows the existing preview while the server checks for updates.
32
+ - 📱 **Follow tasks from any device.** Review changes, handle approvals, and answer questions on desktop or mobile. Tasks keep running when you close the page.
33
+ - 🗂️ **Keep projects and conversations together.** Start without a project, track parallel tasks, and resume or fork your Codex CLI conversations.
34
+ - 📖 **Read results while you chat.** Preview documents, diagrams, and code changes beside the conversation on desktop, or full-screen on mobile.
35
+
36
+ See the [usage guide · 中文](docs/usage.zh-CN.md) for workflow details and controls.
47
37
 
48
38
  <details>
49
39
  <summary><strong>📱 A workspace that fits your phone</strong></summary>
50
- <p>Check a result, answer a question, or send the next instruction without returning to your desk.</p>
51
40
  <img src="docs/assets/workspace-mobile.png" alt="Covro conversation on a phone-sized screen" width="320" />
52
41
  </details>
53
42
 
@@ -55,7 +44,7 @@ Local image previews reuse loaded images for 30 seconds. Reopening an expired im
55
44
 
56
45
  ## 🚀 Get started
57
46
 
58
- You need **Node.js 24.19 or later in the 24.x line** and an installed, signed-in **Codex CLI**. The interface supports Simplified Chinese, English, Japanese and Korean. Choose **Language** in the sidebar; the first visit follows your browser preferences, and manual choices are saved on this device.
47
+ You need **Node.js 24.19 or later in the 24.x line** and an installed, signed-in **Codex CLI**. The interface supports Simplified Chinese, English, Japanese, and Korean.
59
48
 
60
49
  <!-- codex-compatibility:start -->
61
50
 
@@ -63,45 +52,29 @@ Recommended Codex CLI: **0.163.0**. Verified versions: `0.163.0`.
63
52
 
64
53
  <!-- codex-compatibility:end -->
65
54
 
55
+ For other Codex versions and confirmation requirements, see [compatibility](docs/compatibility.md).
56
+
66
57
  <a id="npm-installation"></a>
67
58
 
68
59
  ### 📦 npm installation
69
60
 
70
- The first public npm release is being prepared. Until `@covro/covro` is published, [run from source](#run-from-source). After publication, install and start with:
71
-
72
61
  ```sh
73
62
  npm install -g @covro/covro
74
63
  covro
75
64
  ```
76
65
 
77
- `covro` starts in the background and prints the local address. Open **<http://127.0.0.1:8787>** to get started. Close the terminal and keep working in your browser.
78
-
79
- | Command | Purpose |
80
- | ------------------------- | -------------------------------------------------------------------------------------- |
81
- | `covro status` | Show the running instance and its address |
82
- | `covro doctor` | Diagnose the running instance's session and GitHub credentials without printing tokens |
83
- | `covro logs` | Read recent service logs |
84
- | `covro stop` | Stop the service |
85
- | `covro run` | Run in the foreground |
86
- | `covro service install` | Opt in to login auto-start on macOS or Linux |
87
- | `covro service uninstall` | Remove login auto-start |
88
-
89
- The npm package is `@covro/covro`; the command is `covro`. Install the development channel with `npm install -g @covro/covro@dev`.
90
-
91
- The npm CLI uses `~/.covro/config.json` and a fixed data directory beside it. Reuse an existing configuration with `covro --config /absolute/path/config.json`.
66
+ `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.
92
67
 
93
- Open **Service configuration → Advanced settings** to edit size limits in MiB (1 MiB = 1024 × 1024 bytes). Decimal values must correspond to whole bytes; existing byte values are preserved exactly. JSON files and the API continue to use bytes. Saved changes take effect after restarting the service.
94
-
95
- On macOS, background startup uses the logged-in user's GUI launchd domain so commands can access existing Keychain credentials when their execution permissions allow it. This does not enable login auto-start; use `covro service install` for that. Without a desktop session, headless startup remains available with a Keychain access notice. After installing this fix, restart existing instances with `covro stop` and `covro start`. See [startup and credential diagnostics](docs/distribution.md#macos-sessions-and-credentials).
68
+ 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.
96
69
 
97
70
  <a id="run-from-source"></a>
98
71
 
99
72
  ### 🛠️ Run from source
100
73
 
101
- To try Covro before the npm release or work on the code, use **pnpm 12.11.2**:
74
+ For local development or source deployments, use **pnpm 12.11.2**:
102
75
 
103
76
  ```sh
104
- git clone https://github.com/yuzheng14/codex-web-ui.git covro
77
+ git clone https://github.com/yuzheng14/covro.git
105
78
  cd covro
106
79
  pnpm install --frozen-lockfile
107
80
  cp config.example.json config.local.json
@@ -109,67 +82,29 @@ pnpm build
109
82
  pnpm start -- --config ./config.local.json
110
83
  ```
111
84
 
112
- Open **<http://127.0.0.1:8787>** and click **+** beside **Unassigned** in the sidebar to send a task without choosing a project.
113
-
114
- To work in a project directory, click **Add project**, then choose an existing host directory or **Clone Git repository**. Set **Service configuration → Data and projects → Project base directory (workDir, optional)** to start from a shared host directory. For example, with `workDir=/workspace/projects`, enter `demo` to add `/workspace/projects/demo`; cloning a `demo` repository defaults to that path too. Absolute paths override the prefix. The final server path is shown before submission and the destination remains editable. Saving `workDir` applies immediately to subsequent imports and survives refreshes and restarts, without moving existing projects. Leave it blank to keep entering absolute paths. Git cloning uses the host’s existing credentials, with progress and cancellation in the dialog. [Directory configuration, clone requirements and recovery](docs/project-clone.md).
115
-
116
- Unassigned conversations use separate directories under `<dataDir>/workspaces/`, allocated on the first send. Their files are retained until you explicitly remove them; archiving does not delete files. See [conversation workspaces](docs/workspaces.md) for directory, recovery, and backup details.
117
-
118
85
  For local development, run `pnpm dev` instead and open <http://127.0.0.1:5173>.
119
86
 
120
87
  <a id="access-from-another-device"></a>
121
88
 
122
89
  ## 🌐 Access from another device
123
90
 
124
- Covro runs on your computer; the browser is your control surface. Tasks continue when you close the page, and reopening it reconnects to the service. The host computer must stay awake and online.
125
-
126
- | Setup | How to connect |
127
- | ------------------------------ | -------------------------------------------------------------------- |
128
- | On the host computer | Open the local address |
129
- | Your devices through Tailscale | Configure Tailscale Serve and add its HTTPS origin to `publicOrigin` |
130
- | Through Cloudflare | Use a tunnel with Cloudflare Access and Covro's JWT verification |
91
+ Fresh installations listen on loopback only. To connect from another device, configure **Tailscale Serve** or **Cloudflare Tunnel with Access** using the [deployment guide](docs/deployment.md).
131
92
 
132
- Follow the [deployment guide](docs/deployment.md) for complete configuration. Remote access is explicit: a fresh installation listens on loopback only. When adding projects remotely, choose directories on the host computer.
93
+ The host computer must stay awake and online. When adding projects remotely, enter directories on that computer.
133
94
 
134
95
  ## Updates and release channels
135
96
 
136
- Open **Covro** in the sidebar to check versions, choose a channel, enable idle-time automatic upgrades, or upgrade and restart. The CLI provides the same update engine:
97
+ 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.
137
98
 
138
- ```sh
139
- covro update status
140
- covro update
141
- covro update --channel dev
142
- ```
143
-
144
- | Channel | npm tag | Choose it for |
145
- | ------- | ---------------- | ------------------------------------------------ |
146
- | Stable | `latest` | Regular use |
147
- | Beta | `beta`, `latest` | Maintainer-selected Beta tags or GitHub Releases |
148
- | Dev | `dev`, `latest` | New main-branch changes after CI passes |
149
-
150
- Stable checks only `latest`. Beta and Dev each compare their own tag with `latest` and select the newest version by SemVer; Dev does not receive Beta. Installing a stable version keeps your selected subscription, so future Beta or Dev updates remain available. Older candidates require explicit downgrade permission.
151
-
152
- Successful Dev and Beta npm publications also create a [GitHub Pre-release](https://github.com/yuzheng14/covro/releases) with automatically generated notes. The comparison starts from whichever has the newer source commit: the preceding version in the same channel or a stable version. Push a Beta tag to publish both the npm package and its Pre-release; existing release notes are preserved on retries. Beta notes also include compatibility declarations from the selected source. Stable releases retain their grouped changelog.
153
-
154
- Before installing, the update panel displays the selected version’s GitHub Release notes with Markdown and a link to the original. Notes follow the exact target version; some Beta / Dev versions have no matching Release. Missing notes or GitHub connection failures do not block updates.
155
-
156
- Each release declares its recommended and verified Codex CLI versions. The update panel shows the current and candidate combinations. Automatic upgrades require a verified combination; an unverified combination needs explicit confirmation for that exact upgrade. Unknown versions, invalid/missing declarations, and explicitly unsupported combinations block managed upgrades. The CLI offers `covro update --allow-unverified-codex` for the same explicit attempt. Covro does not upgrade your Codex CLI.
99
+ 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.
157
100
 
158
- Automatic installation is off by default. Managed upgrades support **macOS and Linux npm global installations**; source, linked, container, and Windows installations use their original update method. A failed candidate is rolled back before business writes resume; downgrades must pass database compatibility checks. Old backups are retained without automatic rotation.
159
-
160
- DB Schema **7** is tracked independently of the application version. Releases declare the schema and the verified backup migration range; an older application cannot open a newer database. See [database compatibility](docs/database.md).
161
-
162
- Managed upgrades create and validate a private backup of the Covro database and service configuration before replacing the installation. A failed backup blocks activation. These snapshots do not include Codex history, credentials or project files. See [backup scope](docs/backups.md).
163
-
164
- Use `covro backup create`, `covro backup list` and `covro backup verify ID` for manual snapshots. Preview offline recovery with `covro backup restore ID`; stop the service and repeat with `--confirm ID` to apply it. See [recovery instructions](docs/backups.md#manual-backups-and-offline-recovery).
165
-
166
- See [distribution and recovery](docs/distribution.md) and [release operations](docs/releases.md) for details.
101
+ 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).
167
102
 
168
103
  ## Your computer, your workspace
169
104
 
170
- Covro is a single-user Web UI for your existing Codex CLI. It connects through `codex app-server`, which executes tasks on the host computer using your Codex login and configuration. Projects and Codex history stay there; Covro stores its own project registry and operation records in SQLite. It does not provide a separate hosted account or copy your Codex login into the browser. Codex itself still uses its configured model provider.
105
+ Covro connects to your existing CLI through `codex app-server`. Tasks, projects, and Codex history stay on the host computer, using your Codex login and configuration. Login credentials are not copied into the browser; Codex still uses its configured model provider.
171
106
 
172
- Use the browser to follow work, review requests, and continue conversations. An interactive terminal, file editor, Git GUI, and multi-user team management are outside the current scope.
107
+ 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.
173
108
 
174
109
  ## Development and contribution
175
110
 
@@ -184,26 +119,29 @@ pnpm test:e2e
184
119
 
185
120
  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.
186
121
 
187
- CI requires Prettier formatting to pass. Run `pnpm format` to fix formatting locally; see [formatting conventions](docs/contributing.md#格式检查) for generated-file exclusions.
188
-
189
- PR titles must follow Conventional Commits, for example `feat(ui): add JSON preview` or `fix: preserve scroll position`. See [PR checks and squash merge conventions](docs/contributing.md) for supported types, Release PRs, and release behavior.
122
+ Use `pnpm format` to fix formatting; PR titles follow Conventional Commits. See [contribution and release conventions](docs/contributing.md).
190
123
 
191
- Found a problem or have an idea? [Open an issue](https://github.com/yuzheng14/codex-web-ui/issues). Include your OS, Node.js and Codex versions, installation method, and steps to reproduce. Small, focused PRs are welcome. Update both `README.md` and `README.zh-CN.md` when changing user-facing facts or setup instructions.
124
+ 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.
192
125
 
193
126
  <a id="documentation"></a>
194
127
 
195
128
  ## 📚 Documentation
196
129
 
197
- | Guide | Contents |
198
- | -------------------------------------------- | ----------------------------------------------------------------------- |
199
- | [Detailed usage · 中文](docs/usage.zh-CN.md) | Projects, conversations, approvals, notifications, images, and recovery |
200
- | [Deployment](docs/deployment.md) | Local access, Tailscale, and Cloudflare Access |
201
- | [Distribution](docs/distribution.md) | CLI, services, data locations, upgrades, and repair |
202
- | [Compatibility](docs/compatibility.md) | Verified Codex versions and behavior boundaries |
203
- | [Slash commands](docs/slash-commands.md) | Supported commands and usage |
204
- | [Architecture](docs/architecture.md) | How the gateway, Codex adapter, and browser fit together |
205
- | [Verification](docs/verification.md) | Test coverage and recorded live checks |
206
- | [Brand assets](docs/brand.md) | Editable SVG logo and wordmarks |
130
+ | Guide | Contents |
131
+ | ---------------------------------------------------------------------- | ----------------------------------------------------------------------- |
132
+ | [Detailed usage · 中文](docs/usage.zh-CN.md) | Projects, conversations, approvals, notifications, images, and recovery |
133
+ | [Deployment](docs/deployment.md) | Local access, Tailscale, and Cloudflare Access |
134
+ | [Distribution](docs/distribution.md) | CLI, services, data locations, upgrades, and repair |
135
+ | [Compatibility](docs/compatibility.md) | Verified Codex versions and behavior boundaries |
136
+ | [Slash commands](docs/slash-commands.md) | Supported commands and usage |
137
+ | [Architecture](docs/architecture.md) | How the gateway, Codex adapter, and browser fit together |
138
+ | [Verification](docs/verification.md) | Test coverage and recorded live checks |
139
+ | [Projects](docs/project-clone.md) · [Workspaces](docs/workspaces.md) | Importing, cloning, and conversation directories |
140
+ | [Languages](docs/i18n.md) · [History loading](docs/session-history.md) | Interface language and conversation loading |
141
+ | [Shell](docs/shell.md) | Command execution and sandbox limits |
142
+ | [Backups](docs/backups.md) · [Database](docs/database.md) | Snapshot scope, compatibility, and offline recovery |
143
+ | [Contributing](docs/contributing.md) · [Releases](docs/releases.md) | Formatting, PRs, and publishing |
144
+ | [Brand assets](docs/brand.md) | Editable SVG logo and wordmarks |
207
145
 
208
146
  ## License
209
147
 
package/README.zh-CN.md CHANGED
@@ -29,25 +29,14 @@
29
29
 
30
30
  ## ✨ 你可以做什么
31
31
 
32
- - 📱 **离开电脑,也能跟进任务。** 在电脑或手机上查看工具活动与文件变更、处理权限审批、回答 Codex 的问题。关闭页面,任务仍会继续。
33
- - 💬 **无需项目,也能直接开始。** 点击 **新建会话**,应用自动分配独立目录;刷新、重启或归档后,会话和文件仍保留。
34
- - 🌐 **选择界面语言。** 支持简体中文、English、日本語和 한국어,会话内即可切换;输入、回复、工具原文和路径保持不变。[多语言说明](docs/i18n.md)。
35
- - 🗂️ **多个项目,一眼掌握进展。** 让独立任务并行执行,随时看到哪些会话正在工作、等待审批,哪些已有结果可读。点击「调整项目顺序」,在电脑上拖拽项目,或在电脑和手机上用上下按钮排序;刷新和重启后顺序仍然保留,新增或重新添加的项目排在末尾。
36
- - 💬 **接着你的 Codex CLI 会话。** 浏览已有历史、恢复工作,或 Fork 一个新方向;为会话命名以便查找,完成后归档。在会话详情或状态诊断中查看、复制完整 Thread ID。
37
- - ⚡ **更快打开长会话。** 优先显示最近消息,向上滚动时提前加载历史;本机会话列表和历史分片可先显示缓存,再由服务端核对更新。[加载与缓存说明](docs/session-history.md)。
38
- - 📖 **一边看产出,一边继续讨论。** 电脑上将 Markdown 文档、JSON 文件与会话并排打开,继续向 Codex 提问;Markdown 支持代码、表格、图片和 Mermaid 图表,回复也可直接显示图表,可查看或复制图表源码,并以实际大小查看宽图。JSON 支持格式化缩进、语法高亮,格式无效时保留原文,可复制完整原文,手机上也有全屏阅读器。TXT、CSV、TSV、TOML、YAML/YML、JSONL、LOG 和 INI 文件按纯文本展示,保留空白并支持切换自动换行。文件预览保持只读,所有支持的文本格式均限制为 2 MiB,仅支持 UTF-8。
39
- - 🔎 **逐行查看代码变更。** 在同一只读预览窗口查看某轮或某工具的 Codex 补丁快照,按顺序连续浏览全部文件,支持行号、行内文字高亮和区块跳转;长 diff 默认折叠,展开后按需渲染,阅读时文件标题栏吸顶,随时收起当前文件。
40
- - ✍️ **切换任务,草稿还在。** 每个会话分别保留当前页面中的草稿、粘贴图片和模型设置。手机和平板按 Enter 换行、点击发送按钮提交;桌面保留 Enter 发送、Shift + Enter 换行。完成后可以复制或导出结果。在命令输出区域右上角一键复制全部已加载结果,截断内容会明确提示。
41
- - 🖥️ **在任务旁运行命令。** 打开 **Shell**,在所选项目目录执行命令、查看实时标准输出和错误输出、中断执行,并复用近期命令。面板沿用 Codex 配置的沙箱,最长运行十分钟,不支持交互输入;关闭面板后命令仍继续运行。[能力与限制](docs/shell.md)。
42
- - 🛟 **保留可恢复的数据快照。** 从侧栏打开**备份与恢复**,手动创建服务端备份,查看进度和已验证的记录;升级前使用同一套备份能力。恢复通过停服后的 CLI 执行。[范围与恢复步骤](docs/backups.md)。
43
-
44
- Mermaid 图表在代码块闭合后于本地渲染,自动适配浅色/深色。渲染失败时保留源码;渲染上限为 50,000 个源码字符、500 条边。
45
-
46
- 本地图片预览在加载后 30 秒内直接复用已有图片;过期后再次打开时,先显示已有预览,再由服务端核对更新。
32
+ - 📱 **随时随地跟进任务。** 用电脑或手机查看改动、处理审批、回答问题。关闭页面,任务仍会继续。
33
+ - 🗂️ **集中管理项目与会话。** 无需项目即可开始任务,在一个工作台查看并行进展,接续或 Fork Codex CLI 会话。
34
+ - 📖 **一边看产出,一边讨论。** 电脑上将文档、图表和代码变更与会话并排阅读,手机上使用全屏阅读器。
35
+
36
+ 操作方式与使用细节见[使用指南](docs/usage.zh-CN.md)。
47
37
 
48
38
  <details>
49
39
  <summary><strong>📱 手机上也能舒服地使用</strong></summary>
50
- <p>查看结果、回答问题、补充下一步要求,不必每次都回到电脑前。</p>
51
40
  <img src="docs/assets/workspace-mobile.png" alt="手机屏幕上的 Covro 会话" width="320" />
52
41
  </details>
53
42
 
@@ -55,7 +44,7 @@ Mermaid 图表在代码块闭合后于本地渲染,自动适配浅色/深色
55
44
 
56
45
  ## 🚀 开始使用
57
46
 
58
- 需要 **Node.js 24.x,版本不低于 24.19**,以及已经安装、登录的 **Codex CLI**。界面支持简体中文、英语、日语和韩语。在侧栏选择「语言」;首次访问按浏览器偏好匹配,手动选择会保存在当前设备。
47
+ 需要 **Node.js 24.x,版本不低于 24.19**,以及已经安装、登录的 **Codex CLI**。界面支持简体中文、英语、日语和韩语。
59
48
 
60
49
  <!-- codex-compatibility:start -->
61
50
 
@@ -63,45 +52,29 @@ Mermaid 图表在代码块闭合后于本地渲染,自动适配浅色/深色
63
52
 
64
53
  <!-- codex-compatibility:end -->
65
54
 
55
+ 其他 Codex 版本及使用确认要求见[兼容性说明](docs/compatibility.md)。
56
+
66
57
  <a id="npm-安装"></a>
67
58
 
68
59
  ### 📦 npm 安装
69
60
 
70
- 首个公开 npm 版本正在准备中。`@covro/covro` 发布前,请先[从源码运行](#从源码运行);发布后,只需安装并启动:
71
-
72
61
  ```sh
73
62
  npm install -g @covro/covro
74
63
  covro
75
64
  ```
76
65
 
77
- `covro` 默认在后台启动,并输出本机访问地址。打开 **<http://127.0.0.1:8787>** 即可开始使用。关掉终端后,仍可继续通过浏览器工作。
78
-
79
- | 命令 | 用途 |
80
- | ------------------------- | -------------------------------------------- |
81
- | `covro status` | 查看运行实例与访问地址 |
82
- | `covro doctor` | 诊断运行实例的会话和 GitHub 凭证,不输出令牌 |
83
- | `covro logs` | 查看最近的服务日志 |
84
- | `covro stop` | 停止服务 |
85
- | `covro run` | 在前台运行 |
86
- | `covro service install` | 在 macOS 或 Linux 上主动启用登录自启 |
87
- | `covro service uninstall` | 移除登录自启 |
88
-
89
- npm 包名为 `@covro/covro`,命令为 `covro`。开发渠道使用 `npm install -g @covro/covro@dev` 安装。
90
-
91
- npm CLI 默认使用 `~/.covro/config.json`,数据目录固定在配置文件旁。可以通过 `covro --config /absolute/path/config.json` 沿用已有配置。
66
+ `covro` 默认在后台启动并输出本机访问地址,使用 `covro stop` 停止。配置、日志、登录自启、macOS 凭证诊断和版本渠道见[安装与服务管理](docs/distribution.md)。
92
67
 
93
- 在**服务配置 → 高级设置**中,以 MiB 编辑大小限制(1 MiB = 1024 × 1024 字节)。小数必须精确对应整数字节;已有字节值会原样保留。JSON 文件和 API 继续使用字节,保存后需重启服务生效。
94
-
95
- macOS 后台启动使用已登录用户的 GUI launchd 域,使权限允许的命令能够访问已有钥匙串凭证;这不会开启登录自启,登录自启仍需显式运行 `covro service install`。没有桌面会话时仍支持 headless 启动,并提示钥匙串访问限制。安装此修复后,已有实例需要执行 `covro stop` 和 `covro start` 重启。详见[启动与凭证诊断](docs/distribution.md#macos-sessions-and-credentials)。
68
+ 打开 **<http://127.0.0.1:8787>**,点击 **未关联项目** 右侧的 **+** 即可发送第一条任务。也可通过 **添加项目** 导入主机目录或克隆 Git 仓库。目录选项见[项目配置](docs/project-clone.md)和[会话工作目录](docs/workspaces.md)。
96
69
 
97
70
  <a id="从源码运行"></a>
98
71
 
99
72
  ### 🛠️ 从源码运行
100
73
 
101
- 想在 npm 发布前体验,或参与开发,可以使用 **pnpm 12.11.2** 从源码运行:
74
+ 参与开发或从源码部署时,使用 **pnpm 12.11.2**:
102
75
 
103
76
  ```sh
104
- git clone https://github.com/yuzheng14/codex-web-ui.git covro
77
+ git clone https://github.com/yuzheng14/covro.git
105
78
  cd covro
106
79
  pnpm install --frozen-lockfile
107
80
  cp config.example.json config.local.json
@@ -109,67 +82,29 @@ pnpm build
109
82
  pnpm start -- --config ./config.local.json
110
83
  ```
111
84
 
112
- 打开 **<http://127.0.0.1:8787>**,点击侧栏 **未关联项目** 标题右侧的 **+** 即可直接发送任务,无需选择项目。
113
-
114
- 如需操作项目目录,点击 **添加项目**,选择已有目录或 **克隆 Git 仓库**。可在 **服务配置 → 数据与项目 → 项目基础目录(workDir,可选)** 设置共用的主机目录。例如 `workDir=/workspace/projects` 时,填写 `demo` 即添加 `/workspace/projects/demo`,克隆 `demo` 仓库时也默认使用该路径。绝对路径直接使用,不再拼接前缀;提交前会显示最终服务器路径,目录可自行编辑。`workDir` 保存后立即用于后续添加和克隆,刷新或重启后仍保留,不会移动已有项目;留空时继续填写绝对路径。克隆沿用主机已有的 Git 认证,弹窗可查看进度或取消。[目录配置、克隆要求与失败恢复](docs/project-clone.md)。
115
-
116
- 未关联项目的会话在首次发送时分配 `<dataDir>/workspaces/` 下的独立目录。文件持续保留,归档不会删除文件;目录、恢复与备份规则见[会话工作目录](docs/workspaces.md)。
117
-
118
85
  本地开发可以改用 `pnpm dev`,打开 <http://127.0.0.1:5173>。
119
86
 
120
87
  <a id="从其他设备访问"></a>
121
88
 
122
89
  ## 🌐 从其他设备访问
123
90
 
124
- Covro 运行在你的电脑上,浏览器是操作入口。关闭页面不会取消任务;重新打开后会连接到服务。运行服务的电脑需要保持唤醒并在线。
125
-
126
- | 使用方式 | 连接方法 |
127
- | ----------------------------- | -------------------------------------------------------- |
128
- | 在运行服务的电脑上 | 打开本机地址 |
129
- | 通过 Tailscale 访问自己的设备 | 配置 Tailscale Serve,并将 HTTPS 地址加入 `publicOrigin` |
130
- | 通过 Cloudflare 访问 | 使用 Tunnel、Cloudflare Access 及 Covro 的 JWT 校验 |
91
+ 新安装默认只监听回环地址。从其他设备访问时,请按[部署指南](docs/deployment.md)配置 **Tailscale Serve** 或 **Cloudflare Tunnel 与 Access**。
131
92
 
132
- 完整配置见[部署指南](docs/deployment.md)。新安装默认只监听回环地址,远程访问需单独配置。在手机上添加项目时,填写的仍是运行服务的电脑上的目录。
93
+ 运行服务的电脑需要保持唤醒并在线。远程添加项目时,填写的仍是这台电脑上的目录。
133
94
 
134
95
  ## 更新与版本渠道
135
96
 
136
- 点击侧栏的 **Covro**,可以检查版本、选择渠道、启用空闲时自动升级,或一键升级并重启。CLI 使用同一个升级引擎:
97
+ 在更新面板检查版本,选择稳定版、预览版或开发版;预览版和开发版也会接收更新的稳定版本。**macOS 和 Linux 的 npm 全局安装**支持在此面板或通过 `covro update` 受管升级;其他安装方式沿用原更新方法。
137
98
 
138
- ```sh
139
- covro update status
140
- covro update
141
- covro update --channel dev
142
- ```
143
-
144
- | 渠道 | npm 标签 | 适合 |
145
- | ------ | ---------------- | -------------------------------------------------- |
146
- | 稳定版 | `latest` | 日常使用 |
147
- | 预览版 | `beta`、`latest` | 维护者通过 Beta 标签或 GitHub Release 选定的预览版 |
148
- | 开发版 | `dev`、`latest` | CI 通过后的 main 分支新功能 |
149
-
150
- 稳定版只检查 `latest`;预览版和开发版分别比较自身标签与 `latest`,按 SemVer 选择最新版本,开发版不接收预览版。安装稳定版后仍保留所选订阅,继续接收后续预览版或开发版;安装较旧候选版本需要明确允许降级。
151
-
152
- 开发版和预览版 npm 发布成功后,还会创建带 GitHub 自动生成说明的 [GitHub Pre-release](https://github.com/yuzheng14/covro/releases)。比较起点取同一渠道的先前版本与稳定版本中源码提交较新的那个。推送 Beta 标签即可发布 npm 包并创建对应的 Pre-release;重跑时保留已有发布说明。Beta 说明还会附上所选源码的兼容性声明。稳定版仍保留原来的分组 Changelog。
153
-
154
- 安装前,更新面板会展示所选目标版本的 GitHub Release 说明,支持 Markdown 和原文链接。说明始终对应确切目标版本;部分 Beta / Dev 版本没有对应 Release。说明缺失或 GitHub 连接失败不会阻止更新。
155
-
156
- 每个发行版声明推荐和已验证的 Codex CLI 版本,更新面板会同时显示当前与目标组合。自动升级只接受已验证组合;未验证组合需要对确切目标明确确认。版本未知、声明缺失/无效或明确不支持的组合会阻止受管升级。CLI 可通过 `covro update --allow-unverified-codex` 明确尝试同一组合。Covro 不会自动升级你的 Codex CLI。
99
+ 自动安装默认关闭,且只接受已验证的 Codex 组合。未验证组合需要明确确认;版本未知、兼容声明缺失或无效、明确不支持的组合会阻止受管升级。Covro 不会升级 Codex CLI。完整命令、兼容检查和备份说明见[更新与恢复](docs/distribution.md)。
157
100
 
158
- 自动安装默认关闭。受管升级支持 **macOS 和 Linux 的 npm 全局安装**;源码、链接、容器和 Windows 安装沿用原更新方式。候选版本失败时,会在重新开放业务写入前回滚;降级需通过数据库兼容检查。旧备份会保留,暂不自动轮转。
159
-
160
- DB Schema **7** 独立于应用版本管理。发行版声明 Schema 及经过验证的备份迁移范围;旧应用不能打开更新的数据库。详见[数据库兼容规则](docs/database.md)。
161
-
162
- 受管升级会在替换安装前创建并验证私有备份,覆盖 Covro 数据库与服务配置;备份失败会阻止激活。快照不包含 Codex 历史、凭据或项目文件。详见[备份范围](docs/backups.md)。
163
-
164
- 使用 `covro backup create`、`covro backup list` 和 `covro backup verify ID` 创建与检查手动备份。先运行 `covro backup restore ID` 预检;停服后加 `--confirm ID` 执行恢复。详见[恢复步骤](docs/backups.md#manual-backups-and-offline-recovery)。
165
-
166
- 详细说明见[分发与恢复](docs/distribution.md)、[发版操作](docs/releases.md)。
101
+ DB Schema **7** 独立于应用版本管理,旧应用不能打开更新的数据库。备份覆盖 Covro 数据库和服务配置,不包含项目文件、Codex 历史或凭据。恢复需要停服,详见[备份与恢复](docs/backups.md)和[数据库兼容规则](docs/database.md)。
167
102
 
168
103
  ## 你的电脑,你的工作台
169
104
 
170
- Covro 是面向单用户的 Codex CLI Web UI,通过 `codex app-server` 连接已有 CLI,沿用你的 Codex 登录与配置,在运行服务的电脑上执行任务。项目与 Codex 历史留在那里;Covro 使用 SQLite 保存自身的项目注册和操作记录。它不提供单独的托管账号,也不会把 Codex 登录信息复制到浏览器。Codex 本身仍会访问你配置的模型提供方。
105
+ Covro 通过 `codex app-server` 连接已有 CLI,沿用你的 Codex 登录与配置。任务在运行服务的电脑上执行,项目和 Codex 历史也留在那里;登录凭据不会复制到浏览器,Codex 仍会访问你配置的模型提供方。
171
106
 
172
- 浏览器用于跟进工作、处理请求和继续对话。交互终端、文件编辑器、Git 图形界面与多人团队管理不在当前范围内。
107
+ Covro 面向单用户。[Shell 面板](docs/shell.md)沿用 Codex 配置的沙箱执行非交互命令。交互终端、文件编辑器、Git 图形界面与多人团队管理不在当前范围内。
173
108
 
174
109
  ## 开发与参与
175
110
 
@@ -184,26 +119,29 @@ pnpm test:e2e
184
119
 
185
120
  浏览器测试需要现有 Playwright 依赖所对应的 Chromium。测试与 CI 使用明确的测试夹具,不发起真实模型请求。
186
121
 
187
- CI 要求通过 Prettier 格式检查。可在本地运行 `pnpm format` 修复格式,生成文件的排除范围见[格式检查约定](docs/contributing.md#格式检查)。
188
-
189
- PR 标题须符合 Conventional Commits,例如 `feat(ui): add JSON preview` 或 `fix: preserve scroll position`。支持的 type、Release PR 检查及 squash 合并与发版约定见[开发与 PR 约定](docs/contributing.md)。
122
+ 使用 `pnpm format` 修复格式,PR 标题遵循 Conventional Commits,详见[开发与发版约定](docs/contributing.md)。
190
123
 
191
- 遇到问题或有想法,欢迎[提交 Issue](https://github.com/yuzheng14/codex-web-ui/issues),附上操作系统、Node.js 与 Codex 版本、安装方式和复现步骤。也欢迎范围明确的小 PR。修改面向使用者的事实或安装步骤时,请同步更新 `README.md` 和 `README.zh-CN.md`。
124
+ 遇到问题或有想法,欢迎[提交 Issue](https://github.com/yuzheng14/covro/issues),附上操作系统、Node.js 与 Codex 版本、安装方式和复现步骤。也欢迎范围明确的小 PR;修改面向使用者的事实或安装步骤时,请同步更新两份 README。
192
125
 
193
126
  <a id="文档导航"></a>
194
127
 
195
128
  ## 📚 文档导航
196
129
 
197
- | 指南 | 内容 |
198
- | ------------------------------------ | ------------------------------------ |
199
- | [详细使用指南](docs/usage.zh-CN.md) | 项目、会话、审批、通知、图片和恢复 |
200
- | [部署](docs/deployment.md) | 本机、Tailscale 与 Cloudflare Access |
201
- | [分发](docs/distribution.md) | CLI、服务、数据位置、升级与修复 |
202
- | [兼容性](docs/compatibility.md) | 已验证的 Codex 版本与行为边界 |
203
- | [Slash 命令](docs/slash-commands.md) | 支持的命令和用法 |
204
- | [架构](docs/architecture.md) | 网关、Codex 适配器与浏览器的协作方式 |
205
- | [验证记录](docs/verification.md) | 测试范围与真实环境检查记录 |
206
- | [品牌素材](docs/brand.md) | 可编辑的 SVG 图标与完整标识 |
130
+ | 指南 | 内容 |
131
+ | -------------------------------------------------------------- | ------------------------------------ |
132
+ | [详细使用指南](docs/usage.zh-CN.md) | 项目、会话、审批、通知、图片和恢复 |
133
+ | [部署](docs/deployment.md) | 本机、Tailscale 与 Cloudflare Access |
134
+ | [分发](docs/distribution.md) | CLI、服务、数据位置、升级与修复 |
135
+ | [兼容性](docs/compatibility.md) | 已验证的 Codex 版本与行为边界 |
136
+ | [Slash 命令](docs/slash-commands.md) | 支持的命令和用法 |
137
+ | [架构](docs/architecture.md) | 网关、Codex 适配器与浏览器的协作方式 |
138
+ | [验证记录](docs/verification.md) | 测试范围与真实环境检查记录 |
139
+ | [项目](docs/project-clone.md) · [工作目录](docs/workspaces.md) | 导入、克隆与会话目录 |
140
+ | [语言](docs/i18n.md) · [历史加载](docs/session-history.md) | 界面语言与会话加载 |
141
+ | [Shell](docs/shell.md) | 命令执行与沙箱限制 |
142
+ | [备份](docs/backups.md) · [数据库](docs/database.md) | 快照范围、兼容性与停服恢复 |
143
+ | [开发约定](docs/contributing.md) · [发版](docs/releases.md) | 格式、PR 与发布流程 |
144
+ | [品牌素材](docs/brand.md) | 可编辑的 SVG 图标与完整标识 |
207
145
 
208
146
  ## 许可证
209
147
 
@@ -1 +1 @@
1
- import{m as e,t}from"./mermaid-parser.core-CvO-MTG1.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-C5WkvxTS.js";import"./chunk-DSNLSHJZ-B8GftONA.js";import{n as i,r as a,t as o}from"./chunk-2E7WHVMD-D5oKHRGT.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid.core-DcCEGt0V.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
1
+ import{m as e,t}from"./mermaid-parser.core-BTsSiR1J.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-m1aZIffM.js";import"./chunk-DSNLSHJZ-D0FOol-u.js";import{n as i,r as a,t as o}from"./chunk-2E7WHVMD-CPc4Cyjo.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid.core-CMDsDlBl.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
@@ -1 +1 @@
1
- import{n as e,t}from"./path-fybaL0A-.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-Dg_ysSxT.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i){if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
1
+ import{n as e,t}from"./path-fybaL0A-.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-BxX2PIsO.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i){if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
@@ -1 +1 @@
1
- import"./chunk-NGNAAXSQ-C2Wy9Xmz.js";export{M as createArchitectureServices}from"./mermaid-parser.core-CvO-MTG1.js";
1
+ import"./chunk-NGNAAXSQ-C2Wy9Xmz.js";export{M as createArchitectureServices}from"./mermaid-parser.core-BTsSiR1J.js";