aicodeman 1.41.0 → 1.41.1

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 (287) hide show
  1. package/README.md +58 -8
  2. package/dist/attachment-registry.d.ts +2 -0
  3. package/dist/attachment-registry.d.ts.map +1 -1
  4. package/dist/attachment-registry.js +14 -3
  5. package/dist/attachment-registry.js.map +1 -1
  6. package/dist/cli-agent.d.ts +2 -0
  7. package/dist/cli-agent.d.ts.map +1 -1
  8. package/dist/cli-agent.js +12 -8
  9. package/dist/cli-agent.js.map +1 -1
  10. package/dist/cli.d.ts +25 -1
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +97 -11
  13. package/dist/cli.js.map +1 -1
  14. package/dist/config/buffer-limits.d.ts +9 -0
  15. package/dist/config/buffer-limits.d.ts.map +1 -1
  16. package/dist/config/buffer-limits.js +9 -0
  17. package/dist/config/buffer-limits.js.map +1 -1
  18. package/dist/config/cli-registry/schema.d.ts +8 -0
  19. package/dist/config/cli-registry/schema.d.ts.map +1 -1
  20. package/dist/config/cli-registry/schema.js +12 -0
  21. package/dist/config/cli-registry/schema.js.map +1 -1
  22. package/dist/config/cli-registry/stock.d.ts.map +1 -1
  23. package/dist/config/cli-registry/stock.js +42 -0
  24. package/dist/config/cli-registry/stock.js.map +1 -1
  25. package/dist/config/cli-registry/types.d.ts +35 -0
  26. package/dist/config/cli-registry/types.d.ts.map +1 -1
  27. package/dist/folder-listing.d.ts +94 -0
  28. package/dist/folder-listing.d.ts.map +1 -0
  29. package/dist/folder-listing.js +241 -0
  30. package/dist/folder-listing.js.map +1 -0
  31. package/dist/hooks-config.d.ts +36 -16
  32. package/dist/hooks-config.d.ts.map +1 -1
  33. package/dist/hooks-config.js +45 -20
  34. package/dist/hooks-config.js.map +1 -1
  35. package/dist/html-view-capabilities.d.ts +54 -0
  36. package/dist/html-view-capabilities.d.ts.map +1 -0
  37. package/dist/html-view-capabilities.js +103 -0
  38. package/dist/html-view-capabilities.js.map +1 -0
  39. package/dist/mcp-server.d.ts +114 -0
  40. package/dist/mcp-server.d.ts.map +1 -0
  41. package/dist/mcp-server.js +917 -0
  42. package/dist/mcp-server.js.map +1 -0
  43. package/dist/mcp-sync.d.ts +5 -0
  44. package/dist/mcp-sync.d.ts.map +1 -1
  45. package/dist/mcp-sync.js +51 -5
  46. package/dist/mcp-sync.js.map +1 -1
  47. package/dist/mux-interface.d.ts +36 -1
  48. package/dist/mux-interface.d.ts.map +1 -1
  49. package/dist/remote-files.d.ts +37 -0
  50. package/dist/remote-files.d.ts.map +1 -1
  51. package/dist/remote-files.js +103 -0
  52. package/dist/remote-files.js.map +1 -1
  53. package/dist/remote-pane-history.d.ts +103 -0
  54. package/dist/remote-pane-history.d.ts.map +1 -0
  55. package/dist/remote-pane-history.js +258 -0
  56. package/dist/remote-pane-history.js.map +1 -0
  57. package/dist/remote-ssh-limiter.d.ts +16 -3
  58. package/dist/remote-ssh-limiter.d.ts.map +1 -1
  59. package/dist/remote-ssh-limiter.js +37 -6
  60. package/dist/remote-ssh-limiter.js.map +1 -1
  61. package/dist/session.d.ts +29 -1
  62. package/dist/session.d.ts.map +1 -1
  63. package/dist/session.js +53 -0
  64. package/dist/session.js.map +1 -1
  65. package/dist/tab-layout-legacy-order.d.ts.map +1 -1
  66. package/dist/tab-layout-legacy-order.js +72 -13
  67. package/dist/tab-layout-legacy-order.js.map +1 -1
  68. package/dist/tab-layout-service.d.ts +33 -2
  69. package/dist/tab-layout-service.d.ts.map +1 -1
  70. package/dist/tab-layout-service.js +102 -7
  71. package/dist/tab-layout-service.js.map +1 -1
  72. package/dist/tab-layout.d.ts +9 -0
  73. package/dist/tab-layout.d.ts.map +1 -1
  74. package/dist/tab-layout.js +15 -2
  75. package/dist/tab-layout.js.map +1 -1
  76. package/dist/tmux-manager.d.ts +71 -2
  77. package/dist/tmux-manager.d.ts.map +1 -1
  78. package/dist/tmux-manager.js +169 -18
  79. package/dist/tmux-manager.js.map +1 -1
  80. package/dist/types/session.d.ts +53 -0
  81. package/dist/types/session.d.ts.map +1 -1
  82. package/dist/types/session.js.map +1 -1
  83. package/dist/usage-telemetry.d.ts +44 -7
  84. package/dist/usage-telemetry.d.ts.map +1 -1
  85. package/dist/usage-telemetry.js +72 -7
  86. package/dist/usage-telemetry.js.map +1 -1
  87. package/dist/web/approval-inbox.d.ts +12 -0
  88. package/dist/web/approval-inbox.d.ts.map +1 -1
  89. package/dist/web/approval-inbox.js +1 -0
  90. package/dist/web/approval-inbox.js.map +1 -1
  91. package/dist/web/middleware/auth.d.ts.map +1 -1
  92. package/dist/web/middleware/auth.js +33 -0
  93. package/dist/web/middleware/auth.js.map +1 -1
  94. package/dist/web/ports/session-port.d.ts +8 -1
  95. package/dist/web/ports/session-port.d.ts.map +1 -1
  96. package/dist/web/public/admin-ui.js.gz +0 -0
  97. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  98. package/dist/web/public/app.24689381.js +43 -0
  99. package/dist/web/public/app.24689381.js.br +0 -0
  100. package/dist/web/public/app.24689381.js.gz +0 -0
  101. package/dist/web/public/approvals-ui.js +4 -0
  102. package/dist/web/public/approvals-ui.js.br +0 -0
  103. package/dist/web/public/approvals-ui.js.gz +0 -0
  104. package/dist/web/public/{constants.bc9c1f63.js → constants.17d77b65.js} +395 -7
  105. package/dist/web/public/constants.17d77b65.js.br +0 -0
  106. package/dist/web/public/constants.17d77b65.js.gz +0 -0
  107. package/dist/web/public/cron-ui.js.gz +0 -0
  108. package/dist/web/public/entrance-animations.js.gz +0 -0
  109. package/dist/web/public/gesture/gesture-codeman.js +112 -6
  110. package/dist/web/public/git-status-ui.js.gz +0 -0
  111. package/dist/web/public/home-sessions.js.gz +0 -0
  112. package/dist/web/public/host-wake-ui.js.gz +0 -0
  113. package/dist/web/public/i18n.9afd8e4d.js +2 -0
  114. package/dist/web/public/i18n.9afd8e4d.js.br +0 -0
  115. package/dist/web/public/i18n.9afd8e4d.js.gz +0 -0
  116. package/dist/web/public/{image-input.e00471c6.js → image-input.9ed1d0d2.js} +186 -16
  117. package/dist/web/public/image-input.9ed1d0d2.js.br +0 -0
  118. package/dist/web/public/image-input.9ed1d0d2.js.gz +0 -0
  119. package/dist/web/public/index.html +105 -23
  120. package/dist/web/public/index.html.br +0 -0
  121. package/dist/web/public/index.html.gz +0 -0
  122. package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
  123. package/dist/web/public/{keyboard-accessory.c1e7c7b7.js → keyboard-accessory.c458eea8.js} +115 -35
  124. package/dist/web/public/keyboard-accessory.c458eea8.js.br +0 -0
  125. package/dist/web/public/keyboard-accessory.c458eea8.js.gz +0 -0
  126. package/dist/web/public/mobile-handlers.0ef9c311.js.gz +0 -0
  127. package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
  128. package/dist/web/public/mobile-overview.js +11 -2
  129. package/dist/web/public/mobile-overview.js.br +0 -0
  130. package/dist/web/public/mobile-overview.js.gz +0 -0
  131. package/dist/web/public/mobile.2dff1580.css +1 -0
  132. package/dist/web/public/mobile.2dff1580.css.br +0 -0
  133. package/dist/web/public/mobile.2dff1580.css.gz +0 -0
  134. package/dist/web/public/notification-manager.feb82c04.js.gz +0 -0
  135. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  136. package/dist/web/public/{panels-ui.71846fcb.js → panels-ui.73ec0137.js} +87 -87
  137. package/dist/web/public/panels-ui.73ec0137.js.br +0 -0
  138. package/dist/web/public/panels-ui.73ec0137.js.gz +0 -0
  139. package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
  140. package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
  141. package/dist/web/public/readmymind-ui.js.gz +0 -0
  142. package/dist/web/public/reboot-restore-ui.js.gz +0 -0
  143. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  144. package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
  145. package/dist/web/public/session-lineage.js.gz +0 -0
  146. package/dist/web/public/{session-ui.f731602c.js → session-ui.dbc6819b.js} +33 -33
  147. package/dist/web/public/session-ui.dbc6819b.js.br +0 -0
  148. package/dist/web/public/session-ui.dbc6819b.js.gz +0 -0
  149. package/dist/web/public/{settings-ui.4e33390f.js → settings-ui.81ac264e.js} +9 -9
  150. package/dist/web/public/settings-ui.81ac264e.js.br +0 -0
  151. package/dist/web/public/settings-ui.81ac264e.js.gz +0 -0
  152. package/dist/web/public/spreadsheet-preview-worker.js +11 -0
  153. package/dist/web/public/spreadsheet-preview-worker.js.br +0 -0
  154. package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
  155. package/dist/web/public/{spreadsheet-preview.af82fa2f.js → spreadsheet-preview.75c751de.js} +1 -1
  156. package/dist/web/public/spreadsheet-preview.75c751de.js.br +0 -0
  157. package/dist/web/public/spreadsheet-preview.75c751de.js.gz +0 -0
  158. package/dist/web/public/spreadsheet-xlsx-core.js +110 -0
  159. package/dist/web/public/spreadsheet-xlsx-core.js.br +0 -0
  160. package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
  161. package/dist/web/public/styles.900a28e4.css +1 -0
  162. package/dist/web/public/styles.900a28e4.css.br +0 -0
  163. package/dist/web/public/styles.900a28e4.css.gz +0 -0
  164. package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
  165. package/dist/web/public/sw.js +6 -2
  166. package/dist/web/public/sw.js.br +0 -0
  167. package/dist/web/public/sw.js.gz +0 -0
  168. package/dist/web/public/tab-layout-browser.2d6189f7.js +1 -0
  169. package/dist/web/public/tab-layout-browser.2d6189f7.js.br +0 -0
  170. package/dist/web/public/tab-layout-browser.2d6189f7.js.gz +0 -0
  171. package/dist/web/public/{tab-rail-resize.a5867793.js → tab-rail-resize.7157e0bd.js} +1 -1
  172. package/dist/web/public/tab-rail-resize.7157e0bd.js.br +0 -0
  173. package/dist/web/public/tab-rail-resize.7157e0bd.js.gz +0 -0
  174. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.gz +0 -0
  175. package/dist/web/public/terminal-split.js.gz +0 -0
  176. package/dist/web/public/terminal-tile.js +44 -24
  177. package/dist/web/public/terminal-tile.js.br +0 -0
  178. package/dist/web/public/terminal-tile.js.gz +0 -0
  179. package/dist/web/public/terminal-ui.858f5da5.js +2 -0
  180. package/dist/web/public/terminal-ui.858f5da5.js.br +0 -0
  181. package/dist/web/public/terminal-ui.858f5da5.js.gz +0 -0
  182. package/dist/web/public/tile-grid.js +439 -18
  183. package/dist/web/public/tile-grid.js.br +0 -0
  184. package/dist/web/public/tile-grid.js.gz +0 -0
  185. package/dist/web/public/ultracode-panel.js.gz +0 -0
  186. package/dist/web/public/ultracode-windows.js.gz +0 -0
  187. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  188. package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
  189. package/dist/web/public/vendor/fflate.min.js.gz +0 -0
  190. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  191. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  192. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  193. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  194. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  195. package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.gz +0 -0
  196. package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js.gz +0 -0
  197. package/dist/web/public/vendor/xterm.css.gz +0 -0
  198. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  199. package/dist/web/public/voice-input.2342c37b.js.gz +0 -0
  200. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  201. package/dist/web/public/webview-tabs.js +12 -0
  202. package/dist/web/public/webview-tabs.js.br +0 -0
  203. package/dist/web/public/webview-tabs.js.gz +0 -0
  204. package/dist/web/route-helpers.d.ts +8 -0
  205. package/dist/web/route-helpers.d.ts.map +1 -1
  206. package/dist/web/route-helpers.js +8 -0
  207. package/dist/web/route-helpers.js.map +1 -1
  208. package/dist/web/routes/admin-routes.d.ts.map +1 -1
  209. package/dist/web/routes/admin-routes.js +4 -1
  210. package/dist/web/routes/admin-routes.js.map +1 -1
  211. package/dist/web/routes/approval-routes.d.ts.map +1 -1
  212. package/dist/web/routes/approval-routes.js +6 -8
  213. package/dist/web/routes/approval-routes.js.map +1 -1
  214. package/dist/web/routes/case-routes.js +1 -1
  215. package/dist/web/routes/case-routes.js.map +1 -1
  216. package/dist/web/routes/file-routes.d.ts +46 -1
  217. package/dist/web/routes/file-routes.d.ts.map +1 -1
  218. package/dist/web/routes/file-routes.js +214 -27
  219. package/dist/web/routes/file-routes.js.map +1 -1
  220. package/dist/web/routes/hook-event-routes.d.ts.map +1 -1
  221. package/dist/web/routes/hook-event-routes.js +8 -1
  222. package/dist/web/routes/hook-event-routes.js.map +1 -1
  223. package/dist/web/routes/html-view-routes.d.ts +60 -0
  224. package/dist/web/routes/html-view-routes.d.ts.map +1 -0
  225. package/dist/web/routes/html-view-routes.js +288 -0
  226. package/dist/web/routes/html-view-routes.js.map +1 -0
  227. package/dist/web/routes/index.d.ts +1 -0
  228. package/dist/web/routes/index.d.ts.map +1 -1
  229. package/dist/web/routes/index.js +1 -0
  230. package/dist/web/routes/index.js.map +1 -1
  231. package/dist/web/routes/reboot-restore-routes.js +2 -2
  232. package/dist/web/routes/reboot-restore-routes.js.map +1 -1
  233. package/dist/web/routes/session-routes.d.ts +1 -0
  234. package/dist/web/routes/session-routes.d.ts.map +1 -1
  235. package/dist/web/routes/session-routes.js +278 -56
  236. package/dist/web/routes/session-routes.js.map +1 -1
  237. package/dist/web/routes/status-telemetry-routes.d.ts.map +1 -1
  238. package/dist/web/routes/status-telemetry-routes.js +16 -2
  239. package/dist/web/routes/status-telemetry-routes.js.map +1 -1
  240. package/dist/web/schemas.d.ts +29 -0
  241. package/dist/web/schemas.d.ts.map +1 -1
  242. package/dist/web/schemas.js +65 -0
  243. package/dist/web/schemas.js.map +1 -1
  244. package/dist/web/server.d.ts +6 -1
  245. package/dist/web/server.d.ts.map +1 -1
  246. package/dist/web/server.js +62 -14
  247. package/dist/web/server.js.map +1 -1
  248. package/dist/web/sse-events.d.ts +5 -2
  249. package/dist/web/sse-events.d.ts.map +1 -1
  250. package/dist/web/sse-events.js +5 -2
  251. package/dist/web/sse-events.js.map +1 -1
  252. package/package.json +2 -1
  253. package/skills/codeman/SKILL.md +29 -12
  254. package/dist/web/public/app.6f8552e1.js +0 -43
  255. package/dist/web/public/app.6f8552e1.js.br +0 -0
  256. package/dist/web/public/app.6f8552e1.js.gz +0 -0
  257. package/dist/web/public/constants.bc9c1f63.js.br +0 -0
  258. package/dist/web/public/constants.bc9c1f63.js.gz +0 -0
  259. package/dist/web/public/i18n.a9840ea2.js +0 -2
  260. package/dist/web/public/i18n.a9840ea2.js.br +0 -0
  261. package/dist/web/public/i18n.a9840ea2.js.gz +0 -0
  262. package/dist/web/public/image-input.e00471c6.js.br +0 -0
  263. package/dist/web/public/image-input.e00471c6.js.gz +0 -0
  264. package/dist/web/public/keyboard-accessory.c1e7c7b7.js.br +0 -0
  265. package/dist/web/public/keyboard-accessory.c1e7c7b7.js.gz +0 -0
  266. package/dist/web/public/mobile.111b187d.css +0 -1
  267. package/dist/web/public/mobile.111b187d.css.br +0 -0
  268. package/dist/web/public/mobile.111b187d.css.gz +0 -0
  269. package/dist/web/public/panels-ui.71846fcb.js.br +0 -0
  270. package/dist/web/public/panels-ui.71846fcb.js.gz +0 -0
  271. package/dist/web/public/session-ui.f731602c.js.br +0 -0
  272. package/dist/web/public/session-ui.f731602c.js.gz +0 -0
  273. package/dist/web/public/settings-ui.4e33390f.js.br +0 -0
  274. package/dist/web/public/settings-ui.4e33390f.js.gz +0 -0
  275. package/dist/web/public/spreadsheet-preview.af82fa2f.js.br +0 -0
  276. package/dist/web/public/spreadsheet-preview.af82fa2f.js.gz +0 -0
  277. package/dist/web/public/styles.81a72906.css +0 -1
  278. package/dist/web/public/styles.81a72906.css.br +0 -0
  279. package/dist/web/public/styles.81a72906.css.gz +0 -0
  280. package/dist/web/public/tab-layout-browser.065fcba4.js +0 -1
  281. package/dist/web/public/tab-layout-browser.065fcba4.js.br +0 -0
  282. package/dist/web/public/tab-layout-browser.065fcba4.js.gz +0 -0
  283. package/dist/web/public/tab-rail-resize.a5867793.js.br +0 -0
  284. package/dist/web/public/tab-rail-resize.a5867793.js.gz +0 -0
  285. package/dist/web/public/terminal-ui.b7267005.js +0 -2
  286. package/dist/web/public/terminal-ui.b7267005.js.br +0 -0
  287. package/dist/web/public/terminal-ui.b7267005.js.gz +0 -0
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @fileoverview Capability tokens for rendering a local HTML file.
3
+ *
4
+ * `file-raw` never serves HTML as HTML: a page rendered from Codeman's own origin
5
+ * could read the Codeman document and drive the agent-spawning API. So an HTML
6
+ * file is rendered from `/html-view/:cap/*` instead, with a `Content-Security-
7
+ * Policy: sandbox` header that puts the document in an OPAQUE origin no matter how
8
+ * it is opened (iframe or top-level tab). That opaque origin is also why the route
9
+ * cannot authenticate on the session cookie: its subresource requests are
10
+ * cross-site, so the `SameSite=lax` cookie is never attached (the same reason the
11
+ * web-tab proxy uses capabilities, see webview-capabilities.ts).
12
+ *
13
+ * A capability is minted by an authenticated `POST /api/sessions/:id/html-view` and
14
+ * grants exactly one thing: GET access to the files in ONE directory (the HTML
15
+ * file's own), so a page's relative `style.css` / `chart.js` / images resolve.
16
+ *
17
+ * - 192 bits of `randomBytes` entropy, base64url.
18
+ * - Held in memory only. A restart invalidates every outstanding capability.
19
+ * - Rolling TTL, revoked on logout, admin logout and user deletion (`revokeOwner`).
20
+ */
21
+ /** URL prefix the rendered files are served under. */
22
+ export declare const HTML_VIEW_PREFIX = "/html-view";
23
+ export interface HtmlViewCapabilityRecord {
24
+ /** Realpath of the directory the capability serves. */
25
+ rootDir: string;
26
+ /** Username that minted it (multi-user); undefined in single-user mode. */
27
+ owner?: string;
28
+ /**
29
+ * Whether the directory lies outside the minting session's workspace (admitted
30
+ * under the attachment guard). Recorded so the serving route can refuse it the
31
+ * moment workspace confinement is switched on, as the attachment routes do.
32
+ */
33
+ outsideWorkspace: boolean;
34
+ createdAt: number;
35
+ }
36
+ export declare class HtmlViewCapabilityStore {
37
+ private readonly capabilities;
38
+ /** Reverse index so re-opening a page reuses its capability instead of leaking one per click. */
39
+ private readonly byRoot;
40
+ constructor(ttlMs?: number);
41
+ /** Mint (or reuse) a capability for a directory. Returns the token. */
42
+ mint(rootDir: string, owner?: string, outsideWorkspace?: boolean): string;
43
+ /** Resolve a capability, refreshing its TTL. Returns undefined when unknown or expired. */
44
+ resolve(token: string): HtmlViewCapabilityRecord | undefined;
45
+ /** Revoke every capability bound to an identity (logout, admin logout, user deletion). */
46
+ revokeOwner(owner: string | undefined): number;
47
+ get size(): number;
48
+ dispose(): void;
49
+ }
50
+ /** The capability token in an `/html-view/<cap>/...` path, or null. */
51
+ export declare function capabilityFromHtmlViewPath(pathname: string): string | null;
52
+ /** Process-wide store, shared by the routes and the auth middleware (see webviewCapabilities). */
53
+ export declare const htmlViewCapabilities: HtmlViewCapabilityStore;
54
+ //# sourceMappingURL=html-view-capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-view-capabilities.d.ts","sourceRoot":"","sources":["../src/html-view-capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,eAAe,CAAC;AAE7C,MAAM,WAAW,wBAAwB;IACvC,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuD;IACpF,iGAAiG;IACjG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;gBAExC,KAAK,GAAE,MAAkC;IAWrD,uEAAuE;IACvE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,gBAAgB,UAAQ,GAAG,MAAM;IAgBvE,2FAA2F;IAC3F,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS;IAK5D,0FAA0F;IAC1F,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM;IAa9C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,OAAO,IAAI,IAAI;CAIhB;AAMD,uEAAuE;AACvE,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ1E;AAED,kGAAkG;AAClG,eAAO,MAAM,oBAAoB,yBAAgC,CAAC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * @fileoverview Capability tokens for rendering a local HTML file.
3
+ *
4
+ * `file-raw` never serves HTML as HTML: a page rendered from Codeman's own origin
5
+ * could read the Codeman document and drive the agent-spawning API. So an HTML
6
+ * file is rendered from `/html-view/:cap/*` instead, with a `Content-Security-
7
+ * Policy: sandbox` header that puts the document in an OPAQUE origin no matter how
8
+ * it is opened (iframe or top-level tab). That opaque origin is also why the route
9
+ * cannot authenticate on the session cookie: its subresource requests are
10
+ * cross-site, so the `SameSite=lax` cookie is never attached (the same reason the
11
+ * web-tab proxy uses capabilities, see webview-capabilities.ts).
12
+ *
13
+ * A capability is minted by an authenticated `POST /api/sessions/:id/html-view` and
14
+ * grants exactly one thing: GET access to the files in ONE directory (the HTML
15
+ * file's own), so a page's relative `style.css` / `chart.js` / images resolve.
16
+ *
17
+ * - 192 bits of `randomBytes` entropy, base64url.
18
+ * - Held in memory only. A restart invalidates every outstanding capability.
19
+ * - Rolling TTL, revoked on logout, admin logout and user deletion (`revokeOwner`).
20
+ */
21
+ import { randomBytes } from 'node:crypto';
22
+ import { StaleExpirationMap } from './utils/index.js';
23
+ import { MAX_WEBVIEW_CAPABILITIES, WEBVIEW_CAPABILITY_TTL_MS } from './config/webview-limits.js';
24
+ /** URL prefix the rendered files are served under. */
25
+ export const HTML_VIEW_PREFIX = '/html-view';
26
+ export class HtmlViewCapabilityStore {
27
+ capabilities;
28
+ /** Reverse index so re-opening a page reuses its capability instead of leaking one per click. */
29
+ byRoot = new Map();
30
+ constructor(ttlMs = WEBVIEW_CAPABILITY_TTL_MS) {
31
+ this.capabilities = new StaleExpirationMap({
32
+ ttlMs,
33
+ refreshOnGet: true,
34
+ onExpire: (token, record) => {
35
+ const key = rootKey(record.rootDir, record.owner, record.outsideWorkspace);
36
+ if (this.byRoot.get(key) === token)
37
+ this.byRoot.delete(key);
38
+ },
39
+ });
40
+ }
41
+ /** Mint (or reuse) a capability for a directory. Returns the token. */
42
+ mint(rootDir, owner, outsideWorkspace = false) {
43
+ // The flag is part of the key: an out-of-workspace mint must never reuse a
44
+ // capability recorded as in-workspace, which confinement would not stop.
45
+ const key = rootKey(rootDir, owner, outsideWorkspace);
46
+ const existing = this.byRoot.get(key);
47
+ if (existing && this.capabilities.get(existing))
48
+ return existing;
49
+ if (existing)
50
+ this.byRoot.delete(key);
51
+ if (this.capabilities.size >= MAX_WEBVIEW_CAPABILITIES)
52
+ this.capabilities.cleanup();
53
+ const token = randomBytes(24).toString('base64url');
54
+ this.capabilities.set(token, { rootDir, owner, outsideWorkspace, createdAt: Date.now() });
55
+ this.byRoot.set(key, token);
56
+ return token;
57
+ }
58
+ /** Resolve a capability, refreshing its TTL. Returns undefined when unknown or expired. */
59
+ resolve(token) {
60
+ if (!token)
61
+ return undefined;
62
+ return this.capabilities.get(token);
63
+ }
64
+ /** Revoke every capability bound to an identity (logout, admin logout, user deletion). */
65
+ revokeOwner(owner) {
66
+ let revoked = 0;
67
+ for (const [key, token] of [...this.byRoot]) {
68
+ const record = this.capabilities.peek(token);
69
+ if (!record || record.owner === owner) {
70
+ this.capabilities.delete(token);
71
+ this.byRoot.delete(key);
72
+ if (record)
73
+ revoked++;
74
+ }
75
+ }
76
+ return revoked;
77
+ }
78
+ get size() {
79
+ return this.capabilities.size;
80
+ }
81
+ dispose() {
82
+ this.capabilities.dispose();
83
+ this.byRoot.clear();
84
+ }
85
+ }
86
+ function rootKey(rootDir, owner, outsideWorkspace) {
87
+ return `${owner ?? ''}\0${outsideWorkspace ? 'out' : 'in'}\0${rootDir}`;
88
+ }
89
+ /** The capability token in an `/html-view/<cap>/...` path, or null. */
90
+ export function capabilityFromHtmlViewPath(pathname) {
91
+ if (typeof pathname !== 'string')
92
+ return null;
93
+ const prefix = `${HTML_VIEW_PREFIX}/`;
94
+ if (!pathname.startsWith(prefix))
95
+ return null;
96
+ const rest = pathname.slice(prefix.length);
97
+ const slash = rest.indexOf('/');
98
+ const cap = slash === -1 ? rest : rest.slice(0, slash);
99
+ return /^[A-Za-z0-9_-]{16,128}$/.test(cap) ? cap : null;
100
+ }
101
+ /** Process-wide store, shared by the routes and the auth middleware (see webviewCapabilities). */
102
+ export const htmlViewCapabilities = new HtmlViewCapabilityStore();
103
+ //# sourceMappingURL=html-view-capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-view-capabilities.js","sourceRoot":"","sources":["../src/html-view-capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ import { type AgentContext, type ApiRequest } from './cli-agent.js';
2
+ /** Revisions served with per-request `_meta` (no handshake). */
3
+ export declare const MODERN_PROTOCOL_VERSIONS: readonly ["2026-07-28"];
4
+ /** Revisions served after an `initialize` handshake, newest first. */
5
+ export declare const LEGACY_PROTOCOL_VERSIONS: readonly ["2025-11-25", "2025-06-18", "2025-03-26", "2024-11-05"];
6
+ /** JSON-RPC error codes this server emits. */
7
+ export declare const RPC_ERROR: {
8
+ readonly parse: -32700;
9
+ readonly invalidRequest: -32600;
10
+ readonly methodNotFound: -32601;
11
+ readonly invalidParams: -32602;
12
+ readonly internal: -32603;
13
+ readonly unsupportedProtocolVersion: -32022;
14
+ };
15
+ /** Default wait: under Codex's 60 s MCP tool timeout, so a default call never gets cut off. */
16
+ export declare const DEFAULT_WAIT_MS = 45000;
17
+ /** The server's own ceiling for one wait (`MAX_WAIT_MS` in config/agent-wait.ts). */
18
+ export declare const MAX_WAIT_MS = 600000;
19
+ /** Cap on text handed back to the model, so one read cannot flood its context. */
20
+ export declare const MAX_OUTPUT_CHARS = 40000;
21
+ export interface McpConfig {
22
+ /** Codeman server URL; undefined = not configured, and every tool says how to fix it. */
23
+ apiUrl?: string;
24
+ /** Why the URL given was refused, when one was given. */
25
+ urlError?: string;
26
+ /** This process's own session, when it runs inside a Codeman pane. */
27
+ selfId?: string;
28
+ auth?: AgentContext['auth'];
29
+ /** `--allow-any-session`: prompt, interrupt and delete sessions this server did not start. */
30
+ allowAnySession: boolean;
31
+ version: string;
32
+ }
33
+ /**
34
+ * Resolve the configuration from flags and the environment. Never guesses a URL: only
35
+ * `--url` or `CODEMAN_API_URL` set one. A session id counts only inside a Codeman pane
36
+ * (`CODEMAN_MUX=1`); a desktop client's environment has no session of its own.
37
+ */
38
+ export declare function resolveMcpConfig(options: {
39
+ url?: string;
40
+ allowAnySession?: boolean;
41
+ version: string;
42
+ }, env?: NodeJS.ProcessEnv, envFile?: () => Record<string, string>): McpConfig;
43
+ export interface ToolDefinition {
44
+ name: string;
45
+ title: string;
46
+ description: string;
47
+ inputSchema: Record<string, unknown>;
48
+ annotations: {
49
+ readOnlyHint: boolean;
50
+ destructiveHint?: boolean;
51
+ idempotentHint?: boolean;
52
+ openWorldHint: boolean;
53
+ };
54
+ }
55
+ /**
56
+ * The tools, in a fixed order (the spec asks for deterministic `tools/list` output, which
57
+ * also keeps a client's prompt cache warm). `modes` are the run modes start_session
58
+ * offers, from the CLI registry.
59
+ */
60
+ export declare function buildToolDefinitions(modes: readonly string[]): ToolDefinition[];
61
+ /** Run modes start_session offers: every enabled registry entry, in registry order. */
62
+ export declare function registryModes(): string[];
63
+ export interface ToolResult {
64
+ text: string;
65
+ structured?: Record<string, unknown>;
66
+ isError?: boolean;
67
+ }
68
+ /** A refusal or failure the model can act on: becomes an `isError` result, never a JSON-RPC error. */
69
+ export declare class ToolError extends Error {
70
+ }
71
+ export interface ToolRunnerDeps {
72
+ config: McpConfig;
73
+ request: ApiRequest;
74
+ /** Ids of sessions this process started: the default allowlist for prompting and deleting. */
75
+ started: Set<string>;
76
+ /** Exactly-once tag for this process's input (`seq` is the clock, kept strictly increasing). */
77
+ clientId: string;
78
+ now?: () => number;
79
+ }
80
+ export declare function createToolRunner(deps: ToolRunnerDeps): {
81
+ has(name: string): boolean;
82
+ run(name: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<ToolResult>;
83
+ };
84
+ export interface McpServerOptions {
85
+ config: McpConfig;
86
+ /** One JSON-RPC message out (a line on stdout in production). */
87
+ write: (message: Record<string, unknown>) => void;
88
+ log?: (line: string) => void;
89
+ request?: ApiRequest;
90
+ /** Run modes start_session offers; defaults to the registry's enabled entries. */
91
+ modes?: readonly string[];
92
+ now?: () => number;
93
+ }
94
+ /**
95
+ * The protocol core, transport-free so tests drive it message by message. Requests run
96
+ * concurrently (a long wait must not hold up a list), each answered once, by id.
97
+ */
98
+ export declare function createMcpServer(options: McpServerOptions): {
99
+ /** One stdin line. Resolves when that message is fully handled. */
100
+ handleLine(line: string): Promise<void>;
101
+ /** Stop: abort every in-flight call and write nothing more. */
102
+ close(): void;
103
+ inflightCount(): number;
104
+ };
105
+ /**
106
+ * Serve MCP on this process's stdin/stdout until stdin closes (the client's shutdown
107
+ * signal), then abort whatever is still in flight.
108
+ */
109
+ export declare function runMcpStdio(config: McpConfig, io?: {
110
+ stdin: NodeJS.ReadableStream;
111
+ stdout: NodeJS.WritableStream;
112
+ stderr: NodeJS.WritableStream;
113
+ }): Promise<void>;
114
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}