aicodeman 1.41.1 → 1.43.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.
Files changed (276) hide show
  1. package/README.md +54 -24
  2. package/dist/claude-session-title.d.ts +6 -4
  3. package/dist/claude-session-title.d.ts.map +1 -1
  4. package/dist/claude-session-title.js +6 -4
  5. package/dist/claude-session-title.js.map +1 -1
  6. package/dist/cli-agent.js +1 -1
  7. package/dist/cli-agent.js.map +1 -1
  8. package/dist/config/cli-registry/patterns.d.ts +1 -1
  9. package/dist/config/cli-registry/patterns.d.ts.map +1 -1
  10. package/dist/config/cli-registry/patterns.js +3 -0
  11. package/dist/config/cli-registry/patterns.js.map +1 -1
  12. package/dist/config/cli-registry/schema.d.ts +3 -0
  13. package/dist/config/cli-registry/schema.d.ts.map +1 -1
  14. package/dist/config/cli-registry/schema.js +19 -3
  15. package/dist/config/cli-registry/schema.js.map +1 -1
  16. package/dist/config/cli-registry/stock.d.ts.map +1 -1
  17. package/dist/config/cli-registry/stock.js +302 -7
  18. package/dist/config/cli-registry/stock.js.map +1 -1
  19. package/dist/config/cli-registry/types.d.ts +37 -3
  20. package/dist/config/cli-registry/types.d.ts.map +1 -1
  21. package/dist/git-worktrees.d.ts +292 -0
  22. package/dist/git-worktrees.d.ts.map +1 -0
  23. package/dist/git-worktrees.js +791 -0
  24. package/dist/git-worktrees.js.map +1 -0
  25. package/dist/hooks-config.d.ts +9 -0
  26. package/dist/hooks-config.d.ts.map +1 -1
  27. package/dist/hooks-config.js +12 -0
  28. package/dist/hooks-config.js.map +1 -1
  29. package/dist/mcp-server.d.ts.map +1 -1
  30. package/dist/mcp-server.js +2 -1
  31. package/dist/mcp-server.js.map +1 -1
  32. package/dist/mcp-sync-targets.d.ts +6 -3
  33. package/dist/mcp-sync-targets.d.ts.map +1 -1
  34. package/dist/mcp-sync-targets.js +6 -3
  35. package/dist/mcp-sync-targets.js.map +1 -1
  36. package/dist/mux-interface.d.ts +7 -3
  37. package/dist/mux-interface.d.ts.map +1 -1
  38. package/dist/services/unified-session-service.d.ts +8 -0
  39. package/dist/services/unified-session-service.d.ts.map +1 -1
  40. package/dist/services/unified-session-service.js +21 -0
  41. package/dist/services/unified-session-service.js.map +1 -1
  42. package/dist/session-activity.d.ts +51 -0
  43. package/dist/session-activity.d.ts.map +1 -1
  44. package/dist/session-activity.js +62 -0
  45. package/dist/session-activity.js.map +1 -1
  46. package/dist/session-cli-registry-bridge.d.ts +2 -1
  47. package/dist/session-cli-registry-bridge.d.ts.map +1 -1
  48. package/dist/session-cli-registry-bridge.js.map +1 -1
  49. package/dist/session-submit-verifier.js +1 -1
  50. package/dist/session.d.ts +84 -9
  51. package/dist/session.d.ts.map +1 -1
  52. package/dist/session.js +232 -18
  53. package/dist/session.js.map +1 -1
  54. package/dist/tmux-manager.d.ts +62 -7
  55. package/dist/tmux-manager.d.ts.map +1 -1
  56. package/dist/tmux-manager.js +98 -20
  57. package/dist/tmux-manager.js.map +1 -1
  58. package/dist/types/session.d.ts +32 -4
  59. package/dist/types/session.d.ts.map +1 -1
  60. package/dist/types/session.js +2 -1
  61. package/dist/types/session.js.map +1 -1
  62. package/dist/utils/cli-installed-probes.d.ts +1 -1
  63. package/dist/utils/cli-installed-probes.d.ts.map +1 -1
  64. package/dist/utils/cli-installed-probes.js +4 -2
  65. package/dist/utils/cli-installed-probes.js.map +1 -1
  66. package/dist/utils/copilot-cli-resolver.d.ts +48 -0
  67. package/dist/utils/copilot-cli-resolver.d.ts.map +1 -0
  68. package/dist/utils/copilot-cli-resolver.js +112 -0
  69. package/dist/utils/copilot-cli-resolver.js.map +1 -0
  70. package/dist/utils/deepseek-cli-resolver.d.ts.map +1 -1
  71. package/dist/utils/deepseek-cli-resolver.js +1 -1
  72. package/dist/utils/deepseek-cli-resolver.js.map +1 -1
  73. package/dist/utils/index.d.ts +1 -0
  74. package/dist/utils/index.d.ts.map +1 -1
  75. package/dist/utils/index.js +1 -0
  76. package/dist/utils/index.js.map +1 -1
  77. package/dist/web/approval-inbox.d.ts +12 -2
  78. package/dist/web/approval-inbox.d.ts.map +1 -1
  79. package/dist/web/approval-inbox.js +7 -2
  80. package/dist/web/approval-inbox.js.map +1 -1
  81. package/dist/web/case-path.d.ts +4 -2
  82. package/dist/web/case-path.d.ts.map +1 -1
  83. package/dist/web/case-path.js +13 -4
  84. package/dist/web/case-path.js.map +1 -1
  85. package/dist/web/public/admin-ui.js.gz +0 -0
  86. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  87. package/dist/web/public/app.ae50029a.js +43 -0
  88. package/dist/web/public/app.ae50029a.js.br +0 -0
  89. package/dist/web/public/app.ae50029a.js.gz +0 -0
  90. package/dist/web/public/approvals-ui.js.gz +0 -0
  91. package/dist/web/public/{constants.17d77b65.js → constants.e5e588db.js} +156 -2
  92. package/dist/web/public/constants.e5e588db.js.br +0 -0
  93. package/dist/web/public/constants.e5e588db.js.gz +0 -0
  94. package/dist/web/public/cron-ui.js.gz +0 -0
  95. package/dist/web/public/entrance-animations.js.gz +0 -0
  96. package/dist/web/public/git-status-ui.js.gz +0 -0
  97. package/dist/web/public/home-sessions.js.gz +0 -0
  98. package/dist/web/public/host-wake-ui.js.gz +0 -0
  99. package/dist/web/public/i18n.8f291f06.js +2 -0
  100. package/dist/web/public/i18n.8f291f06.js.br +0 -0
  101. package/dist/web/public/i18n.8f291f06.js.gz +0 -0
  102. package/dist/web/public/{image-input.9ed1d0d2.js → image-input.941386e7.js} +41 -22
  103. package/dist/web/public/image-input.941386e7.js.br +0 -0
  104. package/dist/web/public/image-input.941386e7.js.gz +0 -0
  105. package/dist/web/public/index.html +88 -16
  106. package/dist/web/public/index.html.br +0 -0
  107. package/dist/web/public/index.html.gz +0 -0
  108. package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
  109. package/dist/web/public/{keyboard-accessory.c458eea8.js → keyboard-accessory.c283e827.js} +40 -29
  110. package/dist/web/public/keyboard-accessory.c283e827.js.br +0 -0
  111. package/dist/web/public/keyboard-accessory.c283e827.js.gz +0 -0
  112. package/dist/web/public/mobile-handlers.0ef9c311.js.gz +0 -0
  113. package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
  114. package/dist/web/public/mobile-overview.js +1 -0
  115. package/dist/web/public/mobile-overview.js.br +0 -0
  116. package/dist/web/public/mobile-overview.js.gz +0 -0
  117. package/dist/web/public/mobile.13514863.css +1 -0
  118. package/dist/web/public/mobile.13514863.css.br +0 -0
  119. package/dist/web/public/mobile.13514863.css.gz +0 -0
  120. package/dist/web/public/notification-manager.feb82c04.js.gz +0 -0
  121. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  122. package/dist/web/public/{panels-ui.73ec0137.js → panels-ui.b7bfb9da.js} +6 -6
  123. package/dist/web/public/panels-ui.b7bfb9da.js.br +0 -0
  124. package/dist/web/public/panels-ui.b7bfb9da.js.gz +0 -0
  125. package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
  126. package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
  127. package/dist/web/public/readmymind-ui.js.gz +0 -0
  128. package/dist/web/public/reboot-restore-ui.js.gz +0 -0
  129. package/dist/web/public/{respawn-ui.ff0dae4c.js → respawn-ui.d7adcf6a.js} +1 -1
  130. package/dist/web/public/respawn-ui.d7adcf6a.js.br +0 -0
  131. package/dist/web/public/respawn-ui.d7adcf6a.js.gz +0 -0
  132. package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
  133. package/dist/web/public/security-notices.json +21 -0
  134. package/dist/web/public/session-lineage.js.gz +0 -0
  135. package/dist/web/public/session-ui.be076c88.js +100 -0
  136. package/dist/web/public/session-ui.be076c88.js.br +0 -0
  137. package/dist/web/public/session-ui.be076c88.js.gz +0 -0
  138. package/dist/web/public/settings-ui.fc4cc50a.js +97 -0
  139. package/dist/web/public/settings-ui.fc4cc50a.js.br +0 -0
  140. package/dist/web/public/settings-ui.fc4cc50a.js.gz +0 -0
  141. package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
  142. package/dist/web/public/spreadsheet-preview.75c751de.js.gz +0 -0
  143. package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
  144. package/dist/web/public/styles.dcfa907f.css +1 -0
  145. package/dist/web/public/styles.dcfa907f.css.br +0 -0
  146. package/dist/web/public/styles.dcfa907f.css.gz +0 -0
  147. package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
  148. package/dist/web/public/sw.js +2 -2
  149. package/dist/web/public/sw.js.br +0 -0
  150. package/dist/web/public/sw.js.gz +0 -0
  151. package/dist/web/public/tab-layout-browser.2d6189f7.js.gz +0 -0
  152. package/dist/web/public/tab-rail-resize.7157e0bd.js.gz +0 -0
  153. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.gz +0 -0
  154. package/dist/web/public/terminal-split.js.gz +0 -0
  155. package/dist/web/public/terminal-tile.js +1 -0
  156. package/dist/web/public/terminal-tile.js.br +0 -0
  157. package/dist/web/public/terminal-tile.js.gz +0 -0
  158. package/dist/web/public/terminal-ui.ae01a7d1.js +2 -0
  159. package/dist/web/public/terminal-ui.ae01a7d1.js.br +0 -0
  160. package/dist/web/public/terminal-ui.ae01a7d1.js.gz +0 -0
  161. package/dist/web/public/tile-grid.js +3 -6
  162. package/dist/web/public/tile-grid.js.br +0 -0
  163. package/dist/web/public/tile-grid.js.gz +0 -0
  164. package/dist/web/public/ultracode-panel.js.gz +0 -0
  165. package/dist/web/public/ultracode-windows.js.gz +0 -0
  166. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  167. package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
  168. package/dist/web/public/vendor/fflate.min.js.gz +0 -0
  169. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  170. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  171. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  172. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  173. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  174. package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.gz +0 -0
  175. package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js.gz +0 -0
  176. package/dist/web/public/vendor/xterm.css.gz +0 -0
  177. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  178. package/dist/web/public/voice-input.2342c37b.js.gz +0 -0
  179. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  180. package/dist/web/public/webview-tabs.js.gz +0 -0
  181. package/dist/web/public/whats-new.json +13 -0
  182. package/dist/web/response-viewer-transcript.d.ts +6 -0
  183. package/dist/web/response-viewer-transcript.d.ts.map +1 -1
  184. package/dist/web/response-viewer-transcript.js +134 -1
  185. package/dist/web/response-viewer-transcript.js.map +1 -1
  186. package/dist/web/routes/approval-routes.d.ts.map +1 -1
  187. package/dist/web/routes/approval-routes.js +12 -8
  188. package/dist/web/routes/approval-routes.js.map +1 -1
  189. package/dist/web/routes/case-routes.d.ts.map +1 -1
  190. package/dist/web/routes/case-routes.js +9 -2
  191. package/dist/web/routes/case-routes.js.map +1 -1
  192. package/dist/web/routes/index.d.ts +1 -0
  193. package/dist/web/routes/index.d.ts.map +1 -1
  194. package/dist/web/routes/index.js +1 -0
  195. package/dist/web/routes/index.js.map +1 -1
  196. package/dist/web/routes/mcp-sync-routes.d.ts +4 -4
  197. package/dist/web/routes/mcp-sync-routes.js +4 -4
  198. package/dist/web/routes/ralph-routes.d.ts.map +1 -1
  199. package/dist/web/routes/ralph-routes.js +19 -14
  200. package/dist/web/routes/ralph-routes.js.map +1 -1
  201. package/dist/web/routes/session-routes.d.ts +19 -7
  202. package/dist/web/routes/session-routes.d.ts.map +1 -1
  203. package/dist/web/routes/session-routes.js +227 -66
  204. package/dist/web/routes/session-routes.js.map +1 -1
  205. package/dist/web/routes/status-telemetry-routes.d.ts.map +1 -1
  206. package/dist/web/routes/status-telemetry-routes.js +9 -5
  207. package/dist/web/routes/status-telemetry-routes.js.map +1 -1
  208. package/dist/web/routes/system-routes.d.ts +9 -0
  209. package/dist/web/routes/system-routes.d.ts.map +1 -1
  210. package/dist/web/routes/system-routes.js +102 -12
  211. package/dist/web/routes/system-routes.js.map +1 -1
  212. package/dist/web/routes/worktree-routes.d.ts +52 -0
  213. package/dist/web/routes/worktree-routes.d.ts.map +1 -0
  214. package/dist/web/routes/worktree-routes.js +220 -0
  215. package/dist/web/routes/worktree-routes.js.map +1 -0
  216. package/dist/web/schemas.d.ts +30 -1
  217. package/dist/web/schemas.d.ts.map +1 -1
  218. package/dist/web/schemas.js +74 -3
  219. package/dist/web/schemas.js.map +1 -1
  220. package/dist/web/screen-blocked.d.ts +80 -0
  221. package/dist/web/screen-blocked.d.ts.map +1 -0
  222. package/dist/web/screen-blocked.js +106 -0
  223. package/dist/web/screen-blocked.js.map +1 -0
  224. package/dist/web/server.d.ts.map +1 -1
  225. package/dist/web/server.js +23 -2
  226. package/dist/web/server.js.map +1 -1
  227. package/dist/web/session-listener-wiring.d.ts +1 -0
  228. package/dist/web/session-listener-wiring.d.ts.map +1 -1
  229. package/dist/web/session-listener-wiring.js +20 -0
  230. package/dist/web/session-listener-wiring.js.map +1 -1
  231. package/dist/web/session-wait-registry.d.ts +27 -9
  232. package/dist/web/session-wait-registry.d.ts.map +1 -1
  233. package/dist/web/session-wait-registry.js +36 -13
  234. package/dist/web/session-wait-registry.js.map +1 -1
  235. package/dist/web/sse-events.d.ts +7 -2
  236. package/dist/web/sse-events.d.ts.map +1 -1
  237. package/dist/web/sse-events.js +7 -2
  238. package/dist/web/sse-events.js.map +1 -1
  239. package/package.json +2 -2
  240. package/skills/codeman/SKILL.md +21 -17
  241. package/skills/codeman/preamble.sh +14 -11
  242. package/skills/codeman/reference/endpoints.md +8 -8
  243. package/skills/codeman/reference/messaging.md +5 -5
  244. package/skills/codeman/reference/recipes.md +13 -10
  245. package/skills/codeman/reference/verbs.md +7 -5
  246. package/dist/web/public/app.24689381.js +0 -43
  247. package/dist/web/public/app.24689381.js.br +0 -0
  248. package/dist/web/public/app.24689381.js.gz +0 -0
  249. package/dist/web/public/constants.17d77b65.js.br +0 -0
  250. package/dist/web/public/constants.17d77b65.js.gz +0 -0
  251. package/dist/web/public/i18n.9afd8e4d.js +0 -2
  252. package/dist/web/public/i18n.9afd8e4d.js.br +0 -0
  253. package/dist/web/public/i18n.9afd8e4d.js.gz +0 -0
  254. package/dist/web/public/image-input.9ed1d0d2.js.br +0 -0
  255. package/dist/web/public/image-input.9ed1d0d2.js.gz +0 -0
  256. package/dist/web/public/keyboard-accessory.c458eea8.js.br +0 -0
  257. package/dist/web/public/keyboard-accessory.c458eea8.js.gz +0 -0
  258. package/dist/web/public/mobile.2dff1580.css +0 -1
  259. package/dist/web/public/mobile.2dff1580.css.br +0 -0
  260. package/dist/web/public/mobile.2dff1580.css.gz +0 -0
  261. package/dist/web/public/panels-ui.73ec0137.js.br +0 -0
  262. package/dist/web/public/panels-ui.73ec0137.js.gz +0 -0
  263. package/dist/web/public/respawn-ui.ff0dae4c.js.br +0 -0
  264. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  265. package/dist/web/public/session-ui.dbc6819b.js +0 -100
  266. package/dist/web/public/session-ui.dbc6819b.js.br +0 -0
  267. package/dist/web/public/session-ui.dbc6819b.js.gz +0 -0
  268. package/dist/web/public/settings-ui.81ac264e.js +0 -97
  269. package/dist/web/public/settings-ui.81ac264e.js.br +0 -0
  270. package/dist/web/public/settings-ui.81ac264e.js.gz +0 -0
  271. package/dist/web/public/styles.900a28e4.css +0 -1
  272. package/dist/web/public/styles.900a28e4.css.br +0 -0
  273. package/dist/web/public/styles.900a28e4.css.gz +0 -0
  274. package/dist/web/public/terminal-ui.858f5da5.js +0 -2
  275. package/dist/web/public/terminal-ui.858f5da5.js.br +0 -0
  276. package/dist/web/public/terminal-ui.858f5da5.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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"}
@@ -173,6 +173,12 @@ export declare const CreateSessionSchema: z.ZodObject<{
173
173
  continueSession: z.ZodOptional<z.ZodBoolean>;
174
174
  resumeSessionId: z.ZodOptional<z.ZodString>;
175
175
  }, z.core.$strip>>;
176
+ copilotConfig: z.ZodOptional<z.ZodObject<{
177
+ model: z.ZodOptional<z.ZodString>;
178
+ allowAll: z.ZodOptional<z.ZodBoolean>;
179
+ continueSession: z.ZodOptional<z.ZodBoolean>;
180
+ resumeSessionId: z.ZodOptional<z.ZodString>;
181
+ }, z.core.$strip>>;
176
182
  deepSeekConfig: z.ZodOptional<z.ZodObject<{
177
183
  profile: z.ZodOptional<z.ZodString>;
178
184
  permissionMode: z.ZodOptional<z.ZodEnum<{
@@ -254,7 +260,7 @@ export declare const StatusTelemetrySchema: z.ZodObject<{
254
260
  last_miss_at: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
255
261
  recache_tokens_if_cold: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
256
262
  last_miss_cause: z.ZodOptional<z.ZodNullable<z.ZodObject<{
257
- causes: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnknown>>>;
263
+ causes: z.ZodPreprocess<z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodUnknown>>>>;
258
264
  }, z.core.$strip>>>;
259
265
  }, z.core.$strip>>>;
260
266
  }, z.core.$strip>>>;
@@ -287,6 +293,21 @@ export declare const CloneCaseSchema: z.ZodObject<{
287
293
  export declare const ClonePreflightSchema: z.ZodObject<{
288
294
  repository: z.ZodString;
289
295
  }, z.core.$strip>;
296
+ /** Schema for POST /api/cases/:name/worktrees: a new worktree on a new branch. */
297
+ export declare const CreateWorktreeSchema: z.ZodObject<{
298
+ name: z.ZodString;
299
+ branch: z.ZodOptional<z.ZodString>;
300
+ base: z.ZodOptional<z.ZodString>;
301
+ }, z.core.$strip>;
302
+ /** Query of DELETE /api/cases/:name/worktrees/:worktree. */
303
+ export declare const RemoveWorktreeQuerySchema: z.ZodObject<{
304
+ deleteBranch: z.ZodOptional<z.ZodEnum<{
305
+ 0: "0";
306
+ false: "false";
307
+ 1: "1";
308
+ true: "true";
309
+ }>>;
310
+ }, z.core.$strip>;
290
311
  export declare const RemoteHostSchema: z.ZodObject<{
291
312
  id: z.ZodString;
292
313
  label: z.ZodString;
@@ -427,6 +448,7 @@ export declare const QuickStartSchema: z.ZodObject<{
427
448
  sessionName: z.ZodOptional<z.ZodString>;
428
449
  parentSessionId: z.ZodOptional<z.ZodString>;
429
450
  tabGroupId: z.ZodOptional<z.ZodString>;
451
+ worktree: z.ZodOptional<z.ZodString>;
430
452
  modelOverride: z.ZodOptional<z.ZodString>;
431
453
  mode: z.ZodOptional<z.ZodType<SessionMode, unknown, z.core.$ZodTypeInternals<SessionMode, unknown>>>;
432
454
  openCodeConfig: z.ZodOptional<z.ZodObject<{
@@ -493,6 +515,12 @@ export declare const QuickStartSchema: z.ZodObject<{
493
515
  continueSession: z.ZodOptional<z.ZodBoolean>;
494
516
  resumeSessionId: z.ZodOptional<z.ZodString>;
495
517
  }, z.core.$strip>>;
518
+ copilotConfig: z.ZodOptional<z.ZodObject<{
519
+ model: z.ZodOptional<z.ZodString>;
520
+ allowAll: z.ZodOptional<z.ZodBoolean>;
521
+ continueSession: z.ZodOptional<z.ZodBoolean>;
522
+ resumeSessionId: z.ZodOptional<z.ZodString>;
523
+ }, z.core.$strip>>;
496
524
  deepSeekConfig: z.ZodOptional<z.ZodObject<{
497
525
  profile: z.ZodOptional<z.ZodString>;
498
526
  permissionMode: z.ZodOptional<z.ZodEnum<{
@@ -673,6 +701,7 @@ export declare const SettingsUpdateSchema: z.ZodObject<{
673
701
  imageWatcherEnabled: z.ZodOptional<z.ZodBoolean>;
674
702
  agentSkillEnabled: z.ZodOptional<z.ZodBoolean>;
675
703
  workspaceHooksEnabled: z.ZodOptional<z.ZodBoolean>;
704
+ pinCliSessionName: z.ZodOptional<z.ZodBoolean>;
676
705
  claudeVoiceEnabled: z.ZodOptional<z.ZodBoolean>;
677
706
  approvalsInboxEnabled: z.ZodOptional<z.ZodBoolean>;
678
707
  autoNameSessions: z.ZodOptional<z.ZodBoolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/web/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/web/schemas.ts"],"names":[],"mappings":"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"}
@@ -172,7 +172,7 @@ function sessionModeSchema() {
172
172
  /**
173
173
  * Allowlisted env var key prefixes, contributed by the ENABLED CLIs in the registry
174
174
  * (`env.allowedPrefixes`) — `CLAUDE_CODE_`, `OPENCODE_`, `CODEX_`, `GEMINI_`, `GOOGLE_`,
175
- * `ANTIGRAVITY_`, `PI_`, `GROK_`, `XAI_`, `DSH_`, `DEEPSEEK_` as shipped.
175
+ * `ANTIGRAVITY_`, `PI_`, `GROK_`, `XAI_`, `DSH_`, `DEEPSEEK_`, `OMP_`, `COPILOT_` as shipped.
176
176
  *
177
177
  * ⚠️ Resolved AT PARSE TIME, not at module load. This used to be a frozen array computed
178
178
  * once when the module was imported, which meant a CLI enabled while the server was running
@@ -233,7 +233,7 @@ const safeEnvOverridesSchema = z
233
233
  return true;
234
234
  return Object.keys(val).every(isAllowedEnvKey);
235
235
  }, {
236
- message: 'envOverrides contains blocked or disallowed env var keys. Only CLAUDE_CODE_*, OPENCODE_*, CODEX_*, GEMINI_*, GOOGLE_*, ANTIGRAVITY_*, PI_*, GROK_*, XAI_*, DSH_*, DEEPSEEK_*, OMP_* keys and CLAUDE_CONFIG_DIR are allowed.',
236
+ message: 'envOverrides contains blocked or disallowed env var keys. Only CLAUDE_CODE_*, OPENCODE_*, CODEX_*, GEMINI_*, GOOGLE_*, ANTIGRAVITY_*, PI_*, GROK_*, XAI_*, DSH_*, DEEPSEEK_*, OMP_*, COPILOT_* keys and CLAUDE_CONFIG_DIR are allowed.',
237
237
  });
238
238
  // ========== Effort Level ==========
239
239
  /**
@@ -399,6 +399,27 @@ const GrokConfigSchema = z
399
399
  .optional(),
400
400
  })
401
401
  .optional();
402
+ const CopilotConfigSchema = z
403
+ .object({
404
+ // A leading alphanumeric, like resumeSessionId below: a value like `--yolo` would otherwise be read
405
+ // as its own flag after `--model` (bypassing the allowAll clamp). `/` stays for provider/id.
406
+ model: z
407
+ .string()
408
+ .max(100)
409
+ .regex(/^[a-zA-Z0-9][a-zA-Z0-9._\-/]*$/)
410
+ .optional(),
411
+ allowAll: z.boolean().optional(),
412
+ continueSession: z.boolean().optional(),
413
+ // A single plain word with a leading alphanumeric: --resume also matches session NAMES, so
414
+ // `my-feature` is accepted, but a value like `--yolo` must not be, because --resume's value is
415
+ // optional and the next token would be read as its own flag (bypassing the allowAll clamp).
416
+ resumeSessionId: z
417
+ .string()
418
+ .max(100)
419
+ .regex(/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/)
420
+ .optional(),
421
+ })
422
+ .optional();
402
423
  /**
403
424
  * Schema for OMP CLI-specific configuration.
404
425
  */
@@ -550,6 +571,7 @@ export const CreateSessionSchema = z.object({
550
571
  antigravityConfig: AntigravityConfigSchema,
551
572
  piConfig: PiConfigSchema,
552
573
  grokConfig: GrokConfigSchema,
574
+ copilotConfig: CopilotConfigSchema,
553
575
  deepSeekConfig: DeepSeekConfigSchema,
554
576
  ompConfig: OmpConfigSchema,
555
577
  /** Resume a previous Claude conversation by its session ID (used for reboot recovery) */
@@ -657,7 +679,16 @@ export const StatusTelemetrySchema = z.object({
657
679
  miss_recache_tokens: z.number().nullish(),
658
680
  last_miss_at: z.number().nullish(),
659
681
  recache_tokens_if_cold: z.number().nullish(),
660
- last_miss_cause: z.object({ causes: z.array(z.unknown()).max(20).nullish() }).nullish(),
682
+ // Keep the first 20 causes instead of 400-ing the whole post (which also drops the
683
+ // footer, the plan chip and the model report it carries) when Claude Code reports more. The
684
+ // preprocess slices BEFORE the array validates, so an over-long array costs one bounded
685
+ // slice, never per-element validation across every entry (parsePromptCache then keeps
686
+ // the string ones among those 20).
687
+ last_miss_cause: z
688
+ .object({
689
+ causes: z.preprocess((v) => (Array.isArray(v) ? v.slice(0, 20) : v), z.array(z.unknown()).nullish()),
690
+ })
691
+ .nullish(),
661
692
  })
662
693
  .nullish(),
663
694
  })
@@ -704,6 +735,30 @@ export const CloneCaseSchema = z.object({
704
735
  export const ClonePreflightSchema = z.object({
705
736
  repository: z.string().min(1).max(2048),
706
737
  });
738
+ // ========== Git worktrees of a case (src/git-worktrees.ts) ==========
739
+ /**
740
+ * A worktree name: one segment of letters, digits, `.`, `_`, `-`, starting with a letter or
741
+ * digit, at most 64 characters (Claude Code's own `--worktree` limit). The finer rules (no `..`,
742
+ * no trailing `.lock`) are `worktreeNameError()`, which every route applies after this.
743
+ */
744
+ const worktreeNameSchema = z
745
+ .string()
746
+ .min(1)
747
+ .max(64)
748
+ .regex(/^[A-Za-z0-9][A-Za-z0-9._-]*$/, 'Invalid worktree name. Use letters, digits, ".", "_" and "-".');
749
+ /** Schema for POST /api/cases/:name/worktrees: a new worktree on a new branch. */
750
+ export const CreateWorktreeSchema = z.object({
751
+ name: worktreeNameSchema,
752
+ /** New branch name; default `worktree-<name>`, Claude Code's convention. */
753
+ branch: z.string().min(1).max(200).optional(),
754
+ /** Start point (branch, tag or commit); default the case's current HEAD. */
755
+ base: z.string().min(1).max(200).optional(),
756
+ });
757
+ /** Query of DELETE /api/cases/:name/worktrees/:worktree. */
758
+ export const RemoveWorktreeQuerySchema = z.object({
759
+ /** Also `git branch -d` the worktree's branch (never `-D`). */
760
+ deleteBranch: z.enum(['true', 'false', '1', '0']).optional(),
761
+ });
707
762
  const RemoteCommandOverridesSchema = z
708
763
  .object({
709
764
  shell: z.string().min(1).max(300).optional(),
@@ -1056,6 +1111,13 @@ export const QuickStartSchema = z.object({
1056
1111
  parentSessionId: parentSessionIdSchema,
1057
1112
  /** Tab group to place the new session in: see tabGroupIdSchema. */
1058
1113
  tabGroupId: tabGroupIdSchema,
1114
+ /**
1115
+ * Start the session in this git worktree of the case (`<case>/.claude/worktrees/<worktree>`,
1116
+ * created through POST /api/cases/:name/worktrees) instead of the case folder. Local cases
1117
+ * only: refused (400) for remote and Docker cases. The worktree must be a registered worktree
1118
+ * of the case's repository; it is never created here.
1119
+ */
1120
+ worktree: worktreeNameSchema.optional(),
1059
1121
  /** Model override written to <case>/.claude/settings.local.json (e.g. "opus[1m]").
1060
1122
  * Empty string clears. Applied for local AND docker cases (the docker workspace is
1061
1123
  * a real host dir, so the settings file crosses the bind mount); rejected for
@@ -1068,6 +1130,7 @@ export const QuickStartSchema = z.object({
1068
1130
  antigravityConfig: AntigravityConfigSchema,
1069
1131
  piConfig: PiConfigSchema,
1070
1132
  grokConfig: GrokConfigSchema,
1133
+ copilotConfig: CopilotConfigSchema,
1071
1134
  deepSeekConfig: DeepSeekConfigSchema,
1072
1135
  ompConfig: OmpConfigSchema,
1073
1136
  envOverrides: safeEnvOverridesSchema,
@@ -1283,6 +1346,14 @@ export const SettingsUpdateSchema = z
1283
1346
  * never added — for a user who wants Codeman to leave their repos alone.
1284
1347
  */
1285
1348
  workspaceHooksEnabled: z.boolean().optional(),
1349
+ /**
1350
+ * Launch every Claude session with `--name` set to its tab name (default OFF: only a
1351
+ * name the user chose is pinned). Nothing acts on it in `PUT /api/settings`: it is read
1352
+ * fresh from disk by readPinCliSessionNameEnabled() (hooks-config.ts) at every claude
1353
+ * create and respawn, like readPlanUsageTelemetryEnabled(), so a toggle applies from the
1354
+ * next spawn with no restart.
1355
+ */
1356
+ pinCliSessionName: z.boolean().optional(),
1286
1357
  /**
1287
1358
  * Let browser dictation transcribe through this machine's Claude Code login,
1288
1359
  * the same speech-to-text service the CLI's own `/voice` mode uses