aicodeman 1.41.0 → 1.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +101 -21
- package/dist/attachment-registry.d.ts +2 -0
- package/dist/attachment-registry.d.ts.map +1 -1
- package/dist/attachment-registry.js +14 -3
- package/dist/attachment-registry.js.map +1 -1
- package/dist/cli-agent.d.ts +2 -0
- package/dist/cli-agent.d.ts.map +1 -1
- package/dist/cli-agent.js +13 -9
- package/dist/cli-agent.js.map +1 -1
- package/dist/cli.d.ts +25 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +97 -11
- package/dist/cli.js.map +1 -1
- package/dist/config/buffer-limits.d.ts +9 -0
- package/dist/config/buffer-limits.d.ts.map +1 -1
- package/dist/config/buffer-limits.js +9 -0
- package/dist/config/buffer-limits.js.map +1 -1
- package/dist/config/cli-registry/schema.d.ts +10 -0
- package/dist/config/cli-registry/schema.d.ts.map +1 -1
- package/dist/config/cli-registry/schema.js +26 -0
- package/dist/config/cli-registry/schema.js.map +1 -1
- package/dist/config/cli-registry/stock.d.ts.map +1 -1
- package/dist/config/cli-registry/stock.js +89 -6
- package/dist/config/cli-registry/stock.js.map +1 -1
- package/dist/config/cli-registry/types.d.ts +61 -0
- package/dist/config/cli-registry/types.d.ts.map +1 -1
- package/dist/folder-listing.d.ts +94 -0
- package/dist/folder-listing.d.ts.map +1 -0
- package/dist/folder-listing.js +241 -0
- package/dist/folder-listing.js.map +1 -0
- package/dist/git-worktrees.d.ts +292 -0
- package/dist/git-worktrees.d.ts.map +1 -0
- package/dist/git-worktrees.js +791 -0
- package/dist/git-worktrees.js.map +1 -0
- package/dist/hooks-config.d.ts +36 -16
- package/dist/hooks-config.d.ts.map +1 -1
- package/dist/hooks-config.js +45 -20
- package/dist/hooks-config.js.map +1 -1
- package/dist/html-view-capabilities.d.ts +54 -0
- package/dist/html-view-capabilities.d.ts.map +1 -0
- package/dist/html-view-capabilities.js +103 -0
- package/dist/html-view-capabilities.js.map +1 -0
- package/dist/mcp-server.d.ts +114 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +918 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-sync.d.ts +5 -0
- package/dist/mcp-sync.d.ts.map +1 -1
- package/dist/mcp-sync.js +51 -5
- package/dist/mcp-sync.js.map +1 -1
- package/dist/mux-interface.d.ts +36 -1
- package/dist/mux-interface.d.ts.map +1 -1
- package/dist/remote-files.d.ts +37 -0
- package/dist/remote-files.d.ts.map +1 -1
- package/dist/remote-files.js +103 -0
- package/dist/remote-files.js.map +1 -1
- package/dist/remote-pane-history.d.ts +103 -0
- package/dist/remote-pane-history.d.ts.map +1 -0
- package/dist/remote-pane-history.js +258 -0
- package/dist/remote-pane-history.js.map +1 -0
- package/dist/remote-ssh-limiter.d.ts +16 -3
- package/dist/remote-ssh-limiter.d.ts.map +1 -1
- package/dist/remote-ssh-limiter.js +37 -6
- package/dist/remote-ssh-limiter.js.map +1 -1
- package/dist/services/unified-session-service.d.ts +8 -0
- package/dist/services/unified-session-service.d.ts.map +1 -1
- package/dist/services/unified-session-service.js +21 -0
- package/dist/services/unified-session-service.js.map +1 -1
- package/dist/session-activity.d.ts +51 -0
- package/dist/session-activity.d.ts.map +1 -1
- package/dist/session-activity.js +62 -0
- package/dist/session-activity.js.map +1 -1
- package/dist/session-submit-verifier.js +1 -1
- package/dist/session.d.ts +90 -2
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +247 -9
- package/dist/session.js.map +1 -1
- package/dist/tab-layout-legacy-order.d.ts.map +1 -1
- package/dist/tab-layout-legacy-order.js +72 -13
- package/dist/tab-layout-legacy-order.js.map +1 -1
- package/dist/tab-layout-service.d.ts +33 -2
- package/dist/tab-layout-service.d.ts.map +1 -1
- package/dist/tab-layout-service.js +102 -7
- package/dist/tab-layout-service.js.map +1 -1
- package/dist/tab-layout.d.ts +9 -0
- package/dist/tab-layout.d.ts.map +1 -1
- package/dist/tab-layout.js +15 -2
- package/dist/tab-layout.js.map +1 -1
- package/dist/tmux-manager.d.ts +130 -7
- package/dist/tmux-manager.d.ts.map +1 -1
- package/dist/tmux-manager.js +263 -36
- package/dist/tmux-manager.js.map +1 -1
- package/dist/types/session.d.ts +53 -0
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js.map +1 -1
- package/dist/usage-telemetry.d.ts +44 -7
- package/dist/usage-telemetry.d.ts.map +1 -1
- package/dist/usage-telemetry.js +72 -7
- package/dist/usage-telemetry.js.map +1 -1
- package/dist/utils/deepseek-cli-resolver.d.ts.map +1 -1
- package/dist/utils/deepseek-cli-resolver.js +1 -1
- package/dist/utils/deepseek-cli-resolver.js.map +1 -1
- package/dist/web/approval-inbox.d.ts +24 -2
- package/dist/web/approval-inbox.d.ts.map +1 -1
- package/dist/web/approval-inbox.js +8 -2
- package/dist/web/approval-inbox.js.map +1 -1
- package/dist/web/middleware/auth.d.ts.map +1 -1
- package/dist/web/middleware/auth.js +33 -0
- package/dist/web/middleware/auth.js.map +1 -1
- package/dist/web/ports/session-port.d.ts +8 -1
- package/dist/web/ports/session-port.d.ts.map +1 -1
- package/dist/web/public/admin-ui.js.gz +0 -0
- package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
- package/dist/web/public/app.f04bb2a5.js +43 -0
- package/dist/web/public/app.f04bb2a5.js.br +0 -0
- package/dist/web/public/app.f04bb2a5.js.gz +0 -0
- package/dist/web/public/approvals-ui.js +4 -0
- package/dist/web/public/approvals-ui.js.br +0 -0
- package/dist/web/public/approvals-ui.js.gz +0 -0
- package/dist/web/public/{constants.bc9c1f63.js → constants.12b0c247.js} +395 -7
- package/dist/web/public/constants.12b0c247.js.br +0 -0
- package/dist/web/public/constants.12b0c247.js.gz +0 -0
- package/dist/web/public/cron-ui.js.gz +0 -0
- package/dist/web/public/entrance-animations.js.gz +0 -0
- package/dist/web/public/gesture/gesture-codeman.js +112 -6
- package/dist/web/public/git-status-ui.js.gz +0 -0
- package/dist/web/public/home-sessions.js.gz +0 -0
- package/dist/web/public/host-wake-ui.js.gz +0 -0
- package/dist/web/public/i18n.06659676.js +2 -0
- package/dist/web/public/i18n.06659676.js.br +0 -0
- package/dist/web/public/i18n.06659676.js.gz +0 -0
- package/dist/web/public/image-input.fcdcb46c.js +462 -0
- package/dist/web/public/image-input.fcdcb46c.js.br +0 -0
- package/dist/web/public/image-input.fcdcb46c.js.gz +0 -0
- package/dist/web/public/index.html +169 -24
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
- package/dist/web/public/{keyboard-accessory.c1e7c7b7.js → keyboard-accessory.b42f539b.js} +124 -44
- package/dist/web/public/keyboard-accessory.b42f539b.js.br +0 -0
- package/dist/web/public/keyboard-accessory.b42f539b.js.gz +0 -0
- package/dist/web/public/mobile-handlers.0ef9c311.js.gz +0 -0
- package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
- package/dist/web/public/mobile-overview.js +11 -2
- package/dist/web/public/mobile-overview.js.br +0 -0
- package/dist/web/public/mobile-overview.js.gz +0 -0
- package/dist/web/public/mobile.2dff1580.css +1 -0
- package/dist/web/public/mobile.2dff1580.css.br +0 -0
- package/dist/web/public/mobile.2dff1580.css.gz +0 -0
- package/dist/web/public/notification-manager.feb82c04.js.gz +0 -0
- package/dist/web/public/orchestrator-panel.js.gz +0 -0
- package/dist/web/public/{panels-ui.71846fcb.js → panels-ui.73ec0137.js} +87 -87
- package/dist/web/public/panels-ui.73ec0137.js.br +0 -0
- package/dist/web/public/panels-ui.73ec0137.js.gz +0 -0
- package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
- package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
- package/dist/web/public/readmymind-ui.js.gz +0 -0
- package/dist/web/public/reboot-restore-ui.js.gz +0 -0
- package/dist/web/public/{respawn-ui.ff0dae4c.js → respawn-ui.d7adcf6a.js} +1 -1
- package/dist/web/public/respawn-ui.d7adcf6a.js.br +0 -0
- package/dist/web/public/respawn-ui.d7adcf6a.js.gz +0 -0
- package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
- package/dist/web/public/session-lineage.js.gz +0 -0
- package/dist/web/public/session-ui.d52ff6aa.js +100 -0
- package/dist/web/public/session-ui.d52ff6aa.js.br +0 -0
- package/dist/web/public/session-ui.d52ff6aa.js.gz +0 -0
- package/dist/web/public/settings-ui.3a22bd2a.js +97 -0
- package/dist/web/public/settings-ui.3a22bd2a.js.br +0 -0
- package/dist/web/public/settings-ui.3a22bd2a.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview-worker.js +11 -0
- package/dist/web/public/spreadsheet-preview-worker.js.br +0 -0
- package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
- package/dist/web/public/{spreadsheet-preview.af82fa2f.js → spreadsheet-preview.75c751de.js} +1 -1
- package/dist/web/public/spreadsheet-preview.75c751de.js.br +0 -0
- package/dist/web/public/spreadsheet-preview.75c751de.js.gz +0 -0
- package/dist/web/public/spreadsheet-xlsx-core.js +110 -0
- package/dist/web/public/spreadsheet-xlsx-core.js.br +0 -0
- package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
- package/dist/web/public/styles.ba6a9b84.css +1 -0
- package/dist/web/public/styles.ba6a9b84.css.br +0 -0
- package/dist/web/public/styles.ba6a9b84.css.gz +0 -0
- package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
- package/dist/web/public/sw.js +6 -2
- package/dist/web/public/sw.js.br +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/tab-layout-browser.2d6189f7.js +1 -0
- package/dist/web/public/tab-layout-browser.2d6189f7.js.br +0 -0
- package/dist/web/public/tab-layout-browser.2d6189f7.js.gz +0 -0
- package/dist/web/public/{tab-rail-resize.a5867793.js → tab-rail-resize.7157e0bd.js} +1 -1
- package/dist/web/public/tab-rail-resize.7157e0bd.js.br +0 -0
- package/dist/web/public/tab-rail-resize.7157e0bd.js.gz +0 -0
- package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.gz +0 -0
- package/dist/web/public/terminal-split.js.gz +0 -0
- package/dist/web/public/terminal-tile.js +45 -24
- package/dist/web/public/terminal-tile.js.br +0 -0
- package/dist/web/public/terminal-tile.js.gz +0 -0
- package/dist/web/public/terminal-ui.0a7ccc29.js +2 -0
- package/dist/web/public/terminal-ui.0a7ccc29.js.br +0 -0
- package/dist/web/public/terminal-ui.0a7ccc29.js.gz +0 -0
- package/dist/web/public/tile-grid.js +439 -18
- package/dist/web/public/tile-grid.js.br +0 -0
- package/dist/web/public/tile-grid.js.gz +0 -0
- package/dist/web/public/ultracode-panel.js.gz +0 -0
- package/dist/web/public/ultracode-windows.js.gz +0 -0
- package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
- package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
- package/dist/web/public/vendor/fflate.min.js.gz +0 -0
- package/dist/web/public/vendor/marked.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.2342c37b.js.gz +0 -0
- package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
- package/dist/web/public/webview-tabs.js +12 -0
- package/dist/web/public/webview-tabs.js.br +0 -0
- package/dist/web/public/webview-tabs.js.gz +0 -0
- package/dist/web/public/whats-new.json +13 -0
- package/dist/web/route-helpers.d.ts +8 -0
- package/dist/web/route-helpers.d.ts.map +1 -1
- package/dist/web/route-helpers.js +8 -0
- package/dist/web/route-helpers.js.map +1 -1
- package/dist/web/routes/admin-routes.d.ts.map +1 -1
- package/dist/web/routes/admin-routes.js +4 -1
- package/dist/web/routes/admin-routes.js.map +1 -1
- package/dist/web/routes/approval-routes.d.ts.map +1 -1
- package/dist/web/routes/approval-routes.js +12 -10
- package/dist/web/routes/approval-routes.js.map +1 -1
- package/dist/web/routes/case-routes.d.ts.map +1 -1
- package/dist/web/routes/case-routes.js +10 -3
- package/dist/web/routes/case-routes.js.map +1 -1
- package/dist/web/routes/file-routes.d.ts +46 -1
- package/dist/web/routes/file-routes.d.ts.map +1 -1
- package/dist/web/routes/file-routes.js +214 -27
- package/dist/web/routes/file-routes.js.map +1 -1
- package/dist/web/routes/hook-event-routes.d.ts.map +1 -1
- package/dist/web/routes/hook-event-routes.js +8 -1
- package/dist/web/routes/hook-event-routes.js.map +1 -1
- package/dist/web/routes/html-view-routes.d.ts +60 -0
- package/dist/web/routes/html-view-routes.d.ts.map +1 -0
- package/dist/web/routes/html-view-routes.js +288 -0
- package/dist/web/routes/html-view-routes.js.map +1 -0
- package/dist/web/routes/index.d.ts +2 -0
- package/dist/web/routes/index.d.ts.map +1 -1
- package/dist/web/routes/index.js +2 -0
- package/dist/web/routes/index.js.map +1 -1
- package/dist/web/routes/ralph-routes.d.ts.map +1 -1
- package/dist/web/routes/ralph-routes.js +19 -14
- package/dist/web/routes/ralph-routes.js.map +1 -1
- package/dist/web/routes/reboot-restore-routes.js +2 -2
- package/dist/web/routes/reboot-restore-routes.js.map +1 -1
- package/dist/web/routes/session-routes.d.ts +8 -5
- package/dist/web/routes/session-routes.d.ts.map +1 -1
- package/dist/web/routes/session-routes.js +462 -109
- package/dist/web/routes/session-routes.js.map +1 -1
- package/dist/web/routes/status-telemetry-routes.d.ts.map +1 -1
- package/dist/web/routes/status-telemetry-routes.js +24 -6
- package/dist/web/routes/status-telemetry-routes.js.map +1 -1
- package/dist/web/routes/system-routes.d.ts +9 -0
- package/dist/web/routes/system-routes.d.ts.map +1 -1
- package/dist/web/routes/system-routes.js +91 -12
- package/dist/web/routes/system-routes.js.map +1 -1
- package/dist/web/routes/worktree-routes.d.ts +52 -0
- package/dist/web/routes/worktree-routes.d.ts.map +1 -0
- package/dist/web/routes/worktree-routes.js +220 -0
- package/dist/web/routes/worktree-routes.js.map +1 -0
- package/dist/web/schemas.d.ts +45 -0
- package/dist/web/schemas.d.ts.map +1 -1
- package/dist/web/schemas.js +105 -0
- package/dist/web/schemas.js.map +1 -1
- package/dist/web/screen-blocked.d.ts +80 -0
- package/dist/web/screen-blocked.d.ts.map +1 -0
- package/dist/web/screen-blocked.js +106 -0
- package/dist/web/screen-blocked.js.map +1 -0
- package/dist/web/server.d.ts +6 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +73 -14
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-listener-wiring.d.ts +1 -0
- package/dist/web/session-listener-wiring.d.ts.map +1 -1
- package/dist/web/session-listener-wiring.js +20 -0
- package/dist/web/session-listener-wiring.js.map +1 -1
- package/dist/web/session-wait-registry.d.ts +27 -9
- package/dist/web/session-wait-registry.d.ts.map +1 -1
- package/dist/web/session-wait-registry.js +36 -13
- package/dist/web/session-wait-registry.js.map +1 -1
- package/dist/web/sse-events.d.ts +12 -4
- package/dist/web/sse-events.d.ts.map +1 -1
- package/dist/web/sse-events.js +12 -4
- package/dist/web/sse-events.js.map +1 -1
- package/package.json +3 -2
- package/skills/codeman/SKILL.md +47 -27
- package/skills/codeman/preamble.sh +14 -11
- package/skills/codeman/reference/endpoints.md +1 -1
- package/skills/codeman/reference/recipes.md +12 -9
- package/skills/codeman/reference/verbs.md +3 -1
- package/dist/web/public/app.6f8552e1.js +0 -43
- package/dist/web/public/app.6f8552e1.js.br +0 -0
- package/dist/web/public/app.6f8552e1.js.gz +0 -0
- package/dist/web/public/constants.bc9c1f63.js.br +0 -0
- package/dist/web/public/constants.bc9c1f63.js.gz +0 -0
- package/dist/web/public/i18n.a9840ea2.js +0 -2
- package/dist/web/public/i18n.a9840ea2.js.br +0 -0
- package/dist/web/public/i18n.a9840ea2.js.gz +0 -0
- package/dist/web/public/image-input.e00471c6.js +0 -283
- package/dist/web/public/image-input.e00471c6.js.br +0 -0
- package/dist/web/public/image-input.e00471c6.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.c1e7c7b7.js.br +0 -0
- package/dist/web/public/keyboard-accessory.c1e7c7b7.js.gz +0 -0
- package/dist/web/public/mobile.111b187d.css +0 -1
- package/dist/web/public/mobile.111b187d.css.br +0 -0
- package/dist/web/public/mobile.111b187d.css.gz +0 -0
- package/dist/web/public/panels-ui.71846fcb.js.br +0 -0
- package/dist/web/public/panels-ui.71846fcb.js.gz +0 -0
- package/dist/web/public/respawn-ui.ff0dae4c.js.br +0 -0
- package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
- package/dist/web/public/session-ui.f731602c.js +0 -100
- package/dist/web/public/session-ui.f731602c.js.br +0 -0
- package/dist/web/public/session-ui.f731602c.js.gz +0 -0
- package/dist/web/public/settings-ui.4e33390f.js +0 -97
- package/dist/web/public/settings-ui.4e33390f.js.br +0 -0
- package/dist/web/public/settings-ui.4e33390f.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview.af82fa2f.js.br +0 -0
- package/dist/web/public/spreadsheet-preview.af82fa2f.js.gz +0 -0
- package/dist/web/public/styles.81a72906.css +0 -1
- package/dist/web/public/styles.81a72906.css.br +0 -0
- package/dist/web/public/styles.81a72906.css.gz +0 -0
- package/dist/web/public/tab-layout-browser.065fcba4.js +0 -1
- package/dist/web/public/tab-layout-browser.065fcba4.js.br +0 -0
- package/dist/web/public/tab-layout-browser.065fcba4.js.gz +0 -0
- package/dist/web/public/tab-rail-resize.a5867793.js.br +0 -0
- package/dist/web/public/tab-rail-resize.a5867793.js.gz +0 -0
- package/dist/web/public/terminal-ui.b7267005.js +0 -2
- package/dist/web/public/terminal-ui.b7267005.js.br +0 -0
- package/dist/web/public/terminal-ui.b7267005.js.gz +0 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Git worktrees of a local case (src/git-worktrees.ts holds the rules):
|
|
3
|
+
*
|
|
4
|
+
* GET /api/cases/:name/worktrees the case repository's worktrees, which of them
|
|
5
|
+
* Codeman manages, and the live sessions in each
|
|
6
|
+
* POST /api/cases/:name/worktrees create `<case>/.claude/worktrees/<name>` on a
|
|
7
|
+
* new branch (`{ name, branch?, base? }`)
|
|
8
|
+
* DELETE /api/cases/:name/worktrees/:worktree `git worktree remove` WITHOUT --force, refused
|
|
9
|
+
* while a live session runs inside; optional
|
|
10
|
+
* `?deleteBranch=true` is `git branch -d`
|
|
11
|
+
*
|
|
12
|
+
* A session starts in a worktree through the EXISTING create paths, never a new spawn path here:
|
|
13
|
+
* `POST /api/quick-start` with `worktree: <name>` (validated against this module's rules), or
|
|
14
|
+
* `POST /api/sessions` with the worktree path as `workingDir`.
|
|
15
|
+
*
|
|
16
|
+
* The case is resolved the way quick-start resolves it: an owned remote or Docker case is refused
|
|
17
|
+
* with a 400 (git must never run on the host over a Docker workspace, and a remote case's folder
|
|
18
|
+
* is on another machine); a linked case resolves for admins only in multi-user mode; anything else
|
|
19
|
+
* is the caller's own case space, confined with `isWorkingDirAllowed`. The case folder is probed
|
|
20
|
+
* BOUNDED (#516): a case on a network mount that stopped answering is a 422, never a 404.
|
|
21
|
+
*
|
|
22
|
+
* Statuses are set explicitly from the error code, so the route answers the same with or without
|
|
23
|
+
* the server's envelope hook.
|
|
24
|
+
*/
|
|
25
|
+
import { ApiErrorCode, createErrorResponse, httpStatusForErrorCode } from '../../types.js';
|
|
26
|
+
import { readDockerCases } from '../../docker-hosts.js';
|
|
27
|
+
import { readRemoteCases } from '../../remote-hosts.js';
|
|
28
|
+
import { dataPath, getDataDir } from '../../config/instance.js';
|
|
29
|
+
import { isMultiUserMode } from '../../config/multiuser.js';
|
|
30
|
+
import { listClis } from '../../config/cli-registry/registry.js';
|
|
31
|
+
import { agentSkillDir } from '../../hooks-config.js';
|
|
32
|
+
import { describeUnknownPath, probePathKind } from '../../utils/index.js';
|
|
33
|
+
import { createCaseWorktree, isPathWithin, listCaseWorktrees, managedWorktreesDir, removeCaseWorktree, resolveCaseRepository, respellUnder, worktreeNameError, } from '../../git-worktrees.js';
|
|
34
|
+
import { CreateWorktreeSchema, RemoveWorktreeQuerySchema } from '../schemas.js';
|
|
35
|
+
import { canAccessOwned, getAuthUser, isAdmin, isWorkingDirAllowed, parseBody, readJsonConfig, resolveCasesDir, validatePathWithinBase, } from '../route-helpers.js';
|
|
36
|
+
const SAFE_CASE_NAME = /^[a-zA-Z0-9_-]+$/;
|
|
37
|
+
/** Host paths of every Docker case workspace: git never runs for a case at or inside one. */
|
|
38
|
+
const defaultDockerWorkspaces = async () => (await readDockerCases(getDataDir()).catch(() => [])).map((c) => c.hostWorkspacePath).filter(Boolean);
|
|
39
|
+
/**
|
|
40
|
+
* Every workspace skills folder a session of some registry CLI gets Codeman's agent skill in
|
|
41
|
+
* (`capabilities.agentSkillDir`), read from the registry at call time as data, never by CLI id.
|
|
42
|
+
*/
|
|
43
|
+
const registryAgentSkillDirs = () => {
|
|
44
|
+
const dirs = new Set();
|
|
45
|
+
for (const cli of listClis()) {
|
|
46
|
+
const dir = agentSkillDir(cli.capabilities);
|
|
47
|
+
if (dir)
|
|
48
|
+
dirs.add(dir);
|
|
49
|
+
}
|
|
50
|
+
return [...dirs];
|
|
51
|
+
};
|
|
52
|
+
function failWith(reply, code, message) {
|
|
53
|
+
reply.code(httpStatusForErrorCode(code));
|
|
54
|
+
return createErrorResponse(code, message);
|
|
55
|
+
}
|
|
56
|
+
function failFrom(reply, failure) {
|
|
57
|
+
return failWith(reply, ApiErrorCode[failure.code], failure.message);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The LOCAL folder of case `name` for this caller, or the refusal. Mirrors quick-start's
|
|
61
|
+
* resolution (remote, then Docker, then linked, then the caller's case space) so a name means
|
|
62
|
+
* the same case here as it does to the Run button.
|
|
63
|
+
*/
|
|
64
|
+
async function resolveLocalCaseFolder(req, name) {
|
|
65
|
+
if (!SAFE_CASE_NAME.test(name)) {
|
|
66
|
+
return { ok: false, code: ApiErrorCode.INVALID_INPUT, message: 'Invalid case name' };
|
|
67
|
+
}
|
|
68
|
+
const user = getAuthUser(req);
|
|
69
|
+
const configDir = getDataDir();
|
|
70
|
+
// Ownership folded into the match, as quick-start does: a foreign same-named remote/Docker
|
|
71
|
+
// case falls through to the caller's own local case instead of shadowing it.
|
|
72
|
+
if ((await readRemoteCases(configDir)).some((c) => c.name === name && canAccessOwned(user, c.owner))) {
|
|
73
|
+
return {
|
|
74
|
+
ok: false,
|
|
75
|
+
code: ApiErrorCode.INVALID_INPUT,
|
|
76
|
+
message: 'Worktrees are not available for remote (SSH) cases: the repository is on another machine.',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if ((await readDockerCases(configDir)).some((c) => c.name === name && canAccessOwned(user, c.owner))) {
|
|
80
|
+
return {
|
|
81
|
+
ok: false,
|
|
82
|
+
code: ApiErrorCode.INVALID_INPUT,
|
|
83
|
+
message: 'Worktrees are not available for Docker cases: a container can write to the workspace, and git would run its hooks and filters on this machine.',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const linkedCases = await readJsonConfig(dataPath('linked-cases.json'), 'linked cases', {});
|
|
87
|
+
// Linked cases carry no owner: only admins resolve them in multi-user mode.
|
|
88
|
+
const linked = !isMultiUserMode() || isAdmin(req) ? linkedCases[name] : undefined;
|
|
89
|
+
const casePath = linked || validatePathWithinBase(name, resolveCasesDir(user));
|
|
90
|
+
if (!casePath)
|
|
91
|
+
return { ok: false, code: ApiErrorCode.INVALID_INPUT, message: 'Invalid case path' };
|
|
92
|
+
if (!isWorkingDirAllowed(user, casePath)) {
|
|
93
|
+
return { ok: false, code: ApiErrorCode.FORBIDDEN, message: 'case path is outside your workspace' };
|
|
94
|
+
}
|
|
95
|
+
const kind = await probePathKind(casePath, { pastCap: true });
|
|
96
|
+
if (kind === 'unknown') {
|
|
97
|
+
return {
|
|
98
|
+
ok: false,
|
|
99
|
+
code: ApiErrorCode.OPERATION_FAILED,
|
|
100
|
+
message: describeUnknownPath('Case folder', casePath, { pastCap: true }),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (kind === 'absent')
|
|
104
|
+
return { ok: false, code: ApiErrorCode.NOT_FOUND, message: `Case "${name}" not found` };
|
|
105
|
+
if (kind !== 'directory')
|
|
106
|
+
return { ok: false, code: ApiErrorCode.INVALID_INPUT, message: 'Case path is not a folder' };
|
|
107
|
+
return { ok: true, casePath };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Live local sessions, with the folder each runs in as the case's repository spells it
|
|
111
|
+
* (`respellUnder`: a folder named through the case's own path, which can run through a symlink,
|
|
112
|
+
* is moved onto the repository's real top level, where git lists the worktrees). Remote sessions
|
|
113
|
+
* have no local folder.
|
|
114
|
+
*/
|
|
115
|
+
function liveLocalSessions(ctx, casePath, repoRoot) {
|
|
116
|
+
const out = [];
|
|
117
|
+
for (const session of ctx.sessions.values()) {
|
|
118
|
+
if (session.remote || !session.workingDir || !session.workingDir.startsWith('/'))
|
|
119
|
+
continue;
|
|
120
|
+
const dir = respellUnder(session.workingDir, casePath, repoRoot);
|
|
121
|
+
out.push({ id: session.id, name: session.name, owner: session.owner, dir });
|
|
122
|
+
}
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
export function registerWorktreeRoutes(app, ctx, deps = {}) {
|
|
126
|
+
const dockerWorkspaces = deps.dockerWorkspaces ?? defaultDockerWorkspaces;
|
|
127
|
+
/**
|
|
128
|
+
* Case folder → its repository, or the refusal already rendered. `casePath` is the folder as
|
|
129
|
+
* the case resolves it (possibly through a symlink); `repo.repoRoot` is its real path.
|
|
130
|
+
*/
|
|
131
|
+
async function caseRepository(req, reply, name) {
|
|
132
|
+
const folder = await resolveLocalCaseFolder(req, name);
|
|
133
|
+
if (!folder.ok)
|
|
134
|
+
return { ok: false, fail: failWith(reply, folder.code, folder.message) };
|
|
135
|
+
const dockerRoots = await dockerWorkspaces();
|
|
136
|
+
const repo = await resolveCaseRepository(folder.casePath, { git: deps.git, dockerWorkspaces: dockerRoots });
|
|
137
|
+
if (!repo.ok)
|
|
138
|
+
return { ok: false, fail: failFrom(reply, repo) };
|
|
139
|
+
return { ok: true, repo: repo.repo, casePath: folder.casePath, dockerRoots };
|
|
140
|
+
}
|
|
141
|
+
app.get('/api/cases/:name/worktrees', async (req, reply) => {
|
|
142
|
+
const { name } = req.params;
|
|
143
|
+
const resolved = await caseRepository(req, reply, name);
|
|
144
|
+
if (!resolved.ok)
|
|
145
|
+
return resolved.fail;
|
|
146
|
+
const { repo, casePath } = resolved;
|
|
147
|
+
const listed = await listCaseWorktrees(repo, { git: deps.git });
|
|
148
|
+
if (!listed.ok)
|
|
149
|
+
return failFrom(reply, listed);
|
|
150
|
+
// Each live session belongs to the DEEPEST worktree holding its folder, so a session in a
|
|
151
|
+
// managed worktree is not also counted against the main checkout that contains it.
|
|
152
|
+
const user = getAuthUser(req);
|
|
153
|
+
const rows = listed.worktrees.map((wt) => ({ ...wt, sessionCount: 0, sessions: [] }));
|
|
154
|
+
for (const session of liveLocalSessions(ctx, casePath, repo.repoRoot)) {
|
|
155
|
+
let best;
|
|
156
|
+
for (const row of rows) {
|
|
157
|
+
if (!isPathWithin(session.dir, row.path))
|
|
158
|
+
continue;
|
|
159
|
+
if (!best || row.path.length > best.path.length)
|
|
160
|
+
best = row;
|
|
161
|
+
}
|
|
162
|
+
if (!best)
|
|
163
|
+
continue;
|
|
164
|
+
best.sessionCount += 1;
|
|
165
|
+
if (canAccessOwned(user, session.owner))
|
|
166
|
+
best.sessions.push({ id: session.id, name: session.name });
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
success: true,
|
|
170
|
+
data: {
|
|
171
|
+
caseName: name,
|
|
172
|
+
repoRoot: repo.repoRoot,
|
|
173
|
+
worktreesDir: managedWorktreesDir(repo.repoRoot),
|
|
174
|
+
worktrees: rows,
|
|
175
|
+
truncated: listed.truncated,
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
});
|
|
179
|
+
app.post('/api/cases/:name/worktrees', async (req, reply) => {
|
|
180
|
+
const { name } = req.params;
|
|
181
|
+
const body = parseBody(CreateWorktreeSchema, req.body);
|
|
182
|
+
const nameError = worktreeNameError(body.name);
|
|
183
|
+
if (nameError)
|
|
184
|
+
return failWith(reply, ApiErrorCode.INVALID_INPUT, nameError);
|
|
185
|
+
const resolved = await caseRepository(req, reply, name);
|
|
186
|
+
if (!resolved.ok)
|
|
187
|
+
return resolved.fail;
|
|
188
|
+
const created = await createCaseWorktree(resolved.repo, body, {
|
|
189
|
+
git: deps.git,
|
|
190
|
+
agentSkillDirs: registryAgentSkillDirs(),
|
|
191
|
+
});
|
|
192
|
+
if (!created.ok)
|
|
193
|
+
return failFrom(reply, created);
|
|
194
|
+
reply.code(201);
|
|
195
|
+
return { success: true, data: { worktree: created.worktree } };
|
|
196
|
+
});
|
|
197
|
+
app.delete('/api/cases/:name/worktrees/:worktree', async (req, reply) => {
|
|
198
|
+
const { name, worktree } = req.params;
|
|
199
|
+
const query = parseBody(RemoveWorktreeQuerySchema, req.query ?? {});
|
|
200
|
+
const nameError = worktreeNameError(worktree);
|
|
201
|
+
if (nameError)
|
|
202
|
+
return failWith(reply, ApiErrorCode.INVALID_INPUT, nameError);
|
|
203
|
+
const resolved = await caseRepository(req, reply, name);
|
|
204
|
+
if (!resolved.ok)
|
|
205
|
+
return resolved.fail;
|
|
206
|
+
const removed = await removeCaseWorktree(resolved.repo, {
|
|
207
|
+
name: worktree,
|
|
208
|
+
deleteBranch: query.deleteBranch === 'true' || query.deleteBranch === '1',
|
|
209
|
+
// Any owner's session blocks: removing the folder under a running agent is the damage
|
|
210
|
+
// this refusal exists to prevent, whoever started it.
|
|
211
|
+
isInUse: (path) => liveLocalSessions(ctx, resolved.casePath, resolved.repo.repoRoot).some((s) => isPathWithin(s.dir, path)),
|
|
212
|
+
},
|
|
213
|
+
// The worktree folder itself must not be (or hold) a Docker case workspace either.
|
|
214
|
+
{ git: deps.git, dockerWorkspaces: resolved.dockerRoots });
|
|
215
|
+
if (!removed.ok)
|
|
216
|
+
return failFrom(reply, removed);
|
|
217
|
+
return { success: true, data: { removed: removed.removed } };
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=worktree-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-routes.js","sourceRoot":"","sources":["../../../src/web/routes/worktree-routes.ts"],"names":[],"mappings":"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"}
|
package/dist/web/schemas.d.ts
CHANGED
|
@@ -46,6 +46,15 @@ export declare const FileWriteSchema: z.ZodObject<{
|
|
|
46
46
|
}>>;
|
|
47
47
|
force: z.ZodOptional<z.ZodBoolean>;
|
|
48
48
|
}, z.core.$strict>;
|
|
49
|
+
/**
|
|
50
|
+
* Body validation for `POST /api/sessions/:id/html-view` (render a local HTML file
|
|
51
|
+
* as a sandboxed page). `path` is absolute or relative to the session workspace;
|
|
52
|
+
* the extension, containment, guard and broad-root checks are the route's
|
|
53
|
+
* (html-view-routes.ts), after parsing.
|
|
54
|
+
*/
|
|
55
|
+
export declare const HtmlViewOpenSchema: z.ZodObject<{
|
|
56
|
+
path: z.ZodString;
|
|
57
|
+
}, z.core.$strict>;
|
|
49
58
|
/**
|
|
50
59
|
* The run-mode ids the API currently accepts: every ENABLED registry entry.
|
|
51
60
|
*
|
|
@@ -87,6 +96,7 @@ export declare const CreateSessionSchema: z.ZodObject<{
|
|
|
87
96
|
mode: z.ZodOptional<z.ZodType<SessionMode, unknown, z.core.$ZodTypeInternals<SessionMode, unknown>>>;
|
|
88
97
|
name: z.ZodOptional<z.ZodString>;
|
|
89
98
|
parentSessionId: z.ZodOptional<z.ZodString>;
|
|
99
|
+
tabGroupId: z.ZodOptional<z.ZodString>;
|
|
90
100
|
envOverrides: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
91
101
|
effort: z.ZodOptional<z.ZodEnum<{
|
|
92
102
|
low: "low";
|
|
@@ -230,6 +240,23 @@ export declare const StatusTelemetrySchema: z.ZodObject<{
|
|
|
230
240
|
model: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
231
241
|
display_name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
232
242
|
}, z.core.$strip>>>;
|
|
243
|
+
prompt_cache: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
244
|
+
warm: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
245
|
+
caching_observed: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
246
|
+
ttl: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
247
|
+
expires_at: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
248
|
+
requests: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
249
|
+
misses: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
250
|
+
expected_rebuilds: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
251
|
+
hit_ratio: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
252
|
+
cache_write_tokens: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
253
|
+
miss_recache_tokens: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
254
|
+
last_miss_at: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
255
|
+
recache_tokens_if_cold: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
256
|
+
last_miss_cause: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
257
|
+
causes: z.ZodPreprocess<z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnknown>>>>;
|
|
258
|
+
}, z.core.$strip>>>;
|
|
259
|
+
}, z.core.$strip>>>;
|
|
233
260
|
}, z.core.$strip>>>;
|
|
234
261
|
}, z.core.$strip>;
|
|
235
262
|
/**
|
|
@@ -260,6 +287,21 @@ export declare const CloneCaseSchema: z.ZodObject<{
|
|
|
260
287
|
export declare const ClonePreflightSchema: z.ZodObject<{
|
|
261
288
|
repository: z.ZodString;
|
|
262
289
|
}, z.core.$strip>;
|
|
290
|
+
/** Schema for POST /api/cases/:name/worktrees: a new worktree on a new branch. */
|
|
291
|
+
export declare const CreateWorktreeSchema: z.ZodObject<{
|
|
292
|
+
name: z.ZodString;
|
|
293
|
+
branch: z.ZodOptional<z.ZodString>;
|
|
294
|
+
base: z.ZodOptional<z.ZodString>;
|
|
295
|
+
}, z.core.$strip>;
|
|
296
|
+
/** Query of DELETE /api/cases/:name/worktrees/:worktree. */
|
|
297
|
+
export declare const RemoveWorktreeQuerySchema: z.ZodObject<{
|
|
298
|
+
deleteBranch: z.ZodOptional<z.ZodEnum<{
|
|
299
|
+
0: "0";
|
|
300
|
+
false: "false";
|
|
301
|
+
1: "1";
|
|
302
|
+
true: "true";
|
|
303
|
+
}>>;
|
|
304
|
+
}, z.core.$strip>;
|
|
263
305
|
export declare const RemoteHostSchema: z.ZodObject<{
|
|
264
306
|
id: z.ZodString;
|
|
265
307
|
label: z.ZodString;
|
|
@@ -399,6 +441,8 @@ export declare const QuickStartSchema: z.ZodObject<{
|
|
|
399
441
|
caseName: z.ZodOptional<z.ZodString>;
|
|
400
442
|
sessionName: z.ZodOptional<z.ZodString>;
|
|
401
443
|
parentSessionId: z.ZodOptional<z.ZodString>;
|
|
444
|
+
tabGroupId: z.ZodOptional<z.ZodString>;
|
|
445
|
+
worktree: z.ZodOptional<z.ZodString>;
|
|
402
446
|
modelOverride: z.ZodOptional<z.ZodString>;
|
|
403
447
|
mode: z.ZodOptional<z.ZodType<SessionMode, unknown, z.core.$ZodTypeInternals<SessionMode, unknown>>>;
|
|
404
448
|
openCodeConfig: z.ZodOptional<z.ZodObject<{
|
|
@@ -648,6 +692,7 @@ export declare const SettingsUpdateSchema: z.ZodObject<{
|
|
|
648
692
|
claudeVoiceEnabled: z.ZodOptional<z.ZodBoolean>;
|
|
649
693
|
approvalsInboxEnabled: z.ZodOptional<z.ZodBoolean>;
|
|
650
694
|
autoNameSessions: z.ZodOptional<z.ZodBoolean>;
|
|
695
|
+
spawnedTabsFollowParent: z.ZodOptional<z.ZodBoolean>;
|
|
651
696
|
readMyMindEnabled: z.ZodOptional<z.ZodBoolean>;
|
|
652
697
|
customModelEndpointsEnabled: z.ZodOptional<z.ZodBoolean>;
|
|
653
698
|
cliManagementEnabled: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/web/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,sFAAsF;AACtF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAuBpD;AA4BD,yEAAyE;AACzE,eAAO,MAAM,2BAA2B;;;;;;;iBAQtC,CAAC;AAEH,0EAA0E;AAC1E,eAAO,MAAM,4BAA4B;;;;;;;iBAQvC,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe;;;;;;;;;kBAcjB,CAAC;AAEZ;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAEzC;AAkVD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,4BAA4B;;;kBAe9B,CAAC;AAEZ;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB;;kBAQxB,CAAC;
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/web/schemas.ts"],"names":[],"mappings":"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"}
|
package/dist/web/schemas.js
CHANGED
|
@@ -111,6 +111,23 @@ export const FileWriteSchema = z
|
|
|
111
111
|
force: z.boolean().optional(),
|
|
112
112
|
})
|
|
113
113
|
.strict();
|
|
114
|
+
/**
|
|
115
|
+
* Body validation for `POST /api/sessions/:id/html-view` (render a local HTML file
|
|
116
|
+
* as a sandboxed page). `path` is absolute or relative to the session workspace;
|
|
117
|
+
* the extension, containment, guard and broad-root checks are the route's
|
|
118
|
+
* (html-view-routes.ts), after parsing.
|
|
119
|
+
*/
|
|
120
|
+
export const HtmlViewOpenSchema = z
|
|
121
|
+
.object({
|
|
122
|
+
path: z
|
|
123
|
+
.string({ error: 'Missing path parameter' })
|
|
124
|
+
.min(1, 'Missing path parameter')
|
|
125
|
+
.max(4096)
|
|
126
|
+
.refine((p) => !p.includes('\0') && !p.includes('\n') && !p.includes('\r'), {
|
|
127
|
+
message: 'Invalid path',
|
|
128
|
+
}),
|
|
129
|
+
})
|
|
130
|
+
.strict();
|
|
114
131
|
/**
|
|
115
132
|
* The run-mode ids the API currently accepts: every ENABLED registry entry.
|
|
116
133
|
*
|
|
@@ -489,12 +506,22 @@ export const DeepSeekWebStartSchema = z
|
|
|
489
506
|
* spawn, and this is never an ownership or permission signal.
|
|
490
507
|
*/
|
|
491
508
|
const parentSessionIdSchema = z.string().max(100).optional();
|
|
509
|
+
/**
|
|
510
|
+
* Tab group the new session should be placed in (the group's "New session"
|
|
511
|
+
* action). Advisory like parentSessionId: the layout service looks the id up in
|
|
512
|
+
* the creating owner's own layout and ignores one it cannot find, so a stale or
|
|
513
|
+
* foreign id never fails a spawn. A malformed value (null, empty, over-long) is
|
|
514
|
+
* still a 400, because only the browser sends it.
|
|
515
|
+
*/
|
|
516
|
+
const tabGroupIdSchema = z.string().min(1).max(100).optional();
|
|
492
517
|
export const CreateSessionSchema = z.object({
|
|
493
518
|
workingDir: safePathSchema.optional(),
|
|
494
519
|
mode: sessionModeSchema().optional(),
|
|
495
520
|
name: z.string().max(100).optional(),
|
|
496
521
|
/** Session that spawned this one — see parentSessionIdSchema. */
|
|
497
522
|
parentSessionId: parentSessionIdSchema,
|
|
523
|
+
/** Tab group to place the new session in: see tabGroupIdSchema. */
|
|
524
|
+
tabGroupId: tabGroupIdSchema,
|
|
498
525
|
envOverrides: safeEnvOverridesSchema,
|
|
499
526
|
/** Claude CLI effort level (soft default via --settings, switchable in-session via /effort) */
|
|
500
527
|
effort: effortLevelSchema,
|
|
@@ -605,6 +632,43 @@ export const StatusTelemetrySchema = z.object({
|
|
|
605
632
|
.nullish(),
|
|
606
633
|
cost: z.object({ total_cost_usd: z.number().nullish() }).nullish(),
|
|
607
634
|
model: z.object({ display_name: z.string().max(100).nullish() }).nullish(),
|
|
635
|
+
// Main-conversation prompt-cache statistics (Claude Code v2.1.251+). Every documented
|
|
636
|
+
// scalar field is listed nullish: `expires_at`/`hit_ratio`/`last_miss_at`/
|
|
637
|
+
// `recache_tokens_if_cold` are all documented as possibly null, and the object gains
|
|
638
|
+
// fields over CLI versions, so a stricter shape would 400 the whole post and blank the
|
|
639
|
+
// footer (the recurring .optional()/null trap). Causes stay `unknown` (the parser keeps
|
|
640
|
+
// the strings); `last_miss_cause`'s extra numeric keys and the `miss_causes` record are
|
|
641
|
+
// stripped by Zod unread, which keeps the stored object bounded — a hostile localhost
|
|
642
|
+
// payload cannot bloat state, since only the normalized subset below is ever stored.
|
|
643
|
+
prompt_cache: z
|
|
644
|
+
.object({
|
|
645
|
+
warm: z.boolean().nullish(),
|
|
646
|
+
caching_observed: z.boolean().nullish(),
|
|
647
|
+
// No length cap: a future TTL longer than today's `5m`/`1h` must not 400 the whole
|
|
648
|
+
// post and blank the footer. parsePromptCache discards any TTL it does not know, so
|
|
649
|
+
// the stored value stays bounded to those two regardless.
|
|
650
|
+
ttl: z.string().nullish(),
|
|
651
|
+
expires_at: z.number().nullish(),
|
|
652
|
+
requests: z.number().nullish(),
|
|
653
|
+
misses: z.number().nullish(),
|
|
654
|
+
expected_rebuilds: z.number().nullish(),
|
|
655
|
+
hit_ratio: z.number().nullish(),
|
|
656
|
+
cache_write_tokens: z.number().nullish(),
|
|
657
|
+
miss_recache_tokens: z.number().nullish(),
|
|
658
|
+
last_miss_at: z.number().nullish(),
|
|
659
|
+
recache_tokens_if_cold: z.number().nullish(),
|
|
660
|
+
// Keep the first 20 causes instead of 400-ing the whole post (which also drops the
|
|
661
|
+
// footer, the plan chip and the model report it carries) when Claude Code reports more. The
|
|
662
|
+
// preprocess slices BEFORE the array validates, so an over-long array costs one bounded
|
|
663
|
+
// slice, never per-element validation across every entry (parsePromptCache then keeps
|
|
664
|
+
// the string ones among those 20).
|
|
665
|
+
last_miss_cause: z
|
|
666
|
+
.object({
|
|
667
|
+
causes: z.preprocess((v) => (Array.isArray(v) ? v.slice(0, 20) : v), z.array(z.unknown()).nullish()),
|
|
668
|
+
})
|
|
669
|
+
.nullish(),
|
|
670
|
+
})
|
|
671
|
+
.nullish(),
|
|
608
672
|
})
|
|
609
673
|
.nullish(),
|
|
610
674
|
});
|
|
@@ -649,6 +713,30 @@ export const CloneCaseSchema = z.object({
|
|
|
649
713
|
export const ClonePreflightSchema = z.object({
|
|
650
714
|
repository: z.string().min(1).max(2048),
|
|
651
715
|
});
|
|
716
|
+
// ========== Git worktrees of a case (src/git-worktrees.ts) ==========
|
|
717
|
+
/**
|
|
718
|
+
* A worktree name: one segment of letters, digits, `.`, `_`, `-`, starting with a letter or
|
|
719
|
+
* digit, at most 64 characters (Claude Code's own `--worktree` limit). The finer rules (no `..`,
|
|
720
|
+
* no trailing `.lock`) are `worktreeNameError()`, which every route applies after this.
|
|
721
|
+
*/
|
|
722
|
+
const worktreeNameSchema = z
|
|
723
|
+
.string()
|
|
724
|
+
.min(1)
|
|
725
|
+
.max(64)
|
|
726
|
+
.regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/, 'Invalid worktree name. Use letters, digits, ".", "_" and "-".');
|
|
727
|
+
/** Schema for POST /api/cases/:name/worktrees: a new worktree on a new branch. */
|
|
728
|
+
export const CreateWorktreeSchema = z.object({
|
|
729
|
+
name: worktreeNameSchema,
|
|
730
|
+
/** New branch name; default `worktree-<name>`, Claude Code's convention. */
|
|
731
|
+
branch: z.string().min(1).max(200).optional(),
|
|
732
|
+
/** Start point (branch, tag or commit); default the case's current HEAD. */
|
|
733
|
+
base: z.string().min(1).max(200).optional(),
|
|
734
|
+
});
|
|
735
|
+
/** Query of DELETE /api/cases/:name/worktrees/:worktree. */
|
|
736
|
+
export const RemoveWorktreeQuerySchema = z.object({
|
|
737
|
+
/** Also `git branch -d` the worktree's branch (never `-D`). */
|
|
738
|
+
deleteBranch: z.enum(['true', 'false', '1', '0']).optional(),
|
|
739
|
+
});
|
|
652
740
|
const RemoteCommandOverridesSchema = z
|
|
653
741
|
.object({
|
|
654
742
|
shell: z.string().min(1).max(300).optional(),
|
|
@@ -999,6 +1087,15 @@ export const QuickStartSchema = z.object({
|
|
|
999
1087
|
sessionName: z.string().max(128).optional(),
|
|
1000
1088
|
/** Session that spawned this one — see parentSessionIdSchema. */
|
|
1001
1089
|
parentSessionId: parentSessionIdSchema,
|
|
1090
|
+
/** Tab group to place the new session in: see tabGroupIdSchema. */
|
|
1091
|
+
tabGroupId: tabGroupIdSchema,
|
|
1092
|
+
/**
|
|
1093
|
+
* Start the session in this git worktree of the case (`<case>/.claude/worktrees/<worktree>`,
|
|
1094
|
+
* created through POST /api/cases/:name/worktrees) instead of the case folder. Local cases
|
|
1095
|
+
* only: refused (400) for remote and Docker cases. The worktree must be a registered worktree
|
|
1096
|
+
* of the case's repository; it is never created here.
|
|
1097
|
+
*/
|
|
1098
|
+
worktree: worktreeNameSchema.optional(),
|
|
1002
1099
|
/** Model override written to <case>/.claude/settings.local.json (e.g. "opus[1m]").
|
|
1003
1100
|
* Empty string clears. Applied for local AND docker cases (the docker workspace is
|
|
1004
1101
|
* a real host dir, so the settings file crosses the bind mount); rejected for
|
|
@@ -1252,6 +1349,14 @@ export const SettingsUpdateSchema = z
|
|
|
1252
1349
|
* broadcast and /api/search, which is the user's choice to make.
|
|
1253
1350
|
*/
|
|
1254
1351
|
autoNameSessions: z.boolean().optional(),
|
|
1352
|
+
/**
|
|
1353
|
+
* Spawned tabs follow their parent: a session created by another one keeps
|
|
1354
|
+
* following its parent's tab (into its group, moving with it) until moved by
|
|
1355
|
+
* hand. SYNCED, default OFF, because the server does the placement:
|
|
1356
|
+
* TabLayoutService.sessionCreated() reads it at every creation, and with it
|
|
1357
|
+
* off the child lands after its parent once and is hand-placed from then on.
|
|
1358
|
+
*/
|
|
1359
|
+
spawnedTabsFollowParent: z.boolean().optional(),
|
|
1255
1360
|
/**
|
|
1256
1361
|
* Read My Mind (docs/readmymind-plan.md): capture the user's submitted
|
|
1257
1362
|
* prompts into per-case intent profiles. SYNCED, default OFF (opt-in:
|