@north-light/api 0.3.580 → 0.3.588

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 (1671) hide show
  1. package/dist/api/client.d.ts +9 -2
  2. package/dist/api/client.js +22 -0
  3. package/dist/api/contract.d.ts +1 -1
  4. package/dist/api/contract.js +1 -1
  5. package/dist/api/dto/bash-jobs.d.ts +17 -0
  6. package/dist/api/dto/bash-jobs.js +2 -0
  7. package/dist/api/dto/execution-start.d.ts +14 -0
  8. package/dist/api/dto/health.d.ts +22 -0
  9. package/dist/api/dto/imports.d.ts +142 -0
  10. package/dist/api/dto/imports.js +2 -0
  11. package/dist/api/error-codes.d.ts +5 -0
  12. package/dist/api/error-codes.js +2 -0
  13. package/dist/api/errors.js +2 -1
  14. package/dist/api/index.d.ts +1 -0
  15. package/dist/api/index.js +1 -0
  16. package/dist/api/routes.d.ts +3 -0
  17. package/dist/api/routes.js +3 -0
  18. package/dist/build-root.d.ts +66 -0
  19. package/dist/build-root.js +401 -0
  20. package/dist/clients/attach/ansi-cells.d.ts +44 -0
  21. package/dist/clients/attach/ansi-cells.js +137 -0
  22. package/dist/clients/attach/chrome/bash-jobs.d.ts +16 -0
  23. package/dist/clients/attach/chrome/bash-jobs.js +34 -0
  24. package/dist/clients/attach/chrome/canvas-panels.d.ts +43 -0
  25. package/dist/clients/attach/chrome/canvas-panels.js +227 -0
  26. package/dist/clients/attach/chrome/completion-bell.d.ts +10 -0
  27. package/dist/clients/attach/chrome/completion-bell.js +89 -0
  28. package/dist/clients/attach/chrome/cron-wait.d.ts +3 -0
  29. package/dist/clients/attach/chrome/cron-wait.js +34 -0
  30. package/dist/clients/attach/chrome/git-info.d.ts +20 -0
  31. package/dist/clients/attach/chrome/git-info.js +44 -0
  32. package/dist/clients/attach/chrome/header.d.ts +10 -0
  33. package/dist/clients/attach/chrome/header.js +30 -0
  34. package/dist/clients/attach/chrome/inbox-strip.d.ts +36 -0
  35. package/dist/clients/attach/chrome/inbox-strip.js +219 -0
  36. package/dist/clients/attach/chrome/key-hint.d.ts +9 -0
  37. package/dist/clients/attach/chrome/key-hint.js +16 -0
  38. package/dist/clients/attach/chrome/object-wait.d.ts +4 -0
  39. package/dist/clients/attach/chrome/object-wait.js +24 -0
  40. package/dist/clients/attach/chrome/recap.d.ts +7 -0
  41. package/dist/clients/attach/chrome/recap.js +19 -0
  42. package/dist/clients/attach/chrome/review-wait.d.ts +6 -0
  43. package/dist/clients/attach/chrome/review-wait.js +22 -0
  44. package/dist/clients/attach/chrome/roster.d.ts +39 -0
  45. package/dist/clients/attach/chrome/roster.js +294 -0
  46. package/dist/clients/attach/chrome/status-line.d.ts +38 -0
  47. package/dist/clients/attach/chrome/status-line.js +127 -0
  48. package/dist/clients/attach/chrome/ticket-panel.d.ts +29 -0
  49. package/dist/clients/attach/chrome/ticket-panel.js +280 -0
  50. package/dist/clients/attach/chrome/widgets.d.ts +9 -0
  51. package/dist/clients/attach/chrome/widgets.js +51 -0
  52. package/dist/clients/attach/command.d.ts +3 -0
  53. package/dist/clients/attach/command.js +107 -0
  54. package/dist/clients/attach/config.d.ts +95 -0
  55. package/dist/clients/attach/config.js +275 -0
  56. package/dist/clients/attach/input/capabilities.d.ts +30 -0
  57. package/dist/clients/attach/input/capabilities.js +112 -0
  58. package/dist/clients/attach/input/clipboard-image.d.ts +55 -0
  59. package/dist/clients/attach/input/clipboard-image.js +237 -0
  60. package/dist/clients/attach/input/completion-frecency.d.ts +45 -0
  61. package/dist/clients/attach/input/completion-frecency.js +141 -0
  62. package/dist/clients/attach/input/controller.d.ts +92 -0
  63. package/dist/clients/attach/input/controller.js +383 -0
  64. package/dist/clients/attach/input/overlay-owner.d.ts +41 -0
  65. package/dist/clients/attach/input/overlay-owner.js +199 -0
  66. package/dist/clients/attach/input/ref-autocomplete.d.ts +77 -0
  67. package/dist/clients/attach/input/ref-autocomplete.js +176 -0
  68. package/dist/clients/attach/input/titled-editor.d.ts +225 -0
  69. package/dist/clients/attach/input/titled-editor.js +859 -0
  70. package/dist/clients/attach/overlays/auth.d.ts +13 -0
  71. package/dist/clients/attach/overlays/auth.js +247 -0
  72. package/dist/clients/attach/overlays/dialogs.d.ts +27 -0
  73. package/dist/clients/attach/overlays/dialogs.js +102 -0
  74. package/dist/clients/attach/overlays/file-review.d.ts +10 -0
  75. package/dist/clients/attach/overlays/file-review.js +146 -0
  76. package/dist/clients/attach/overlays/graph.d.ts +83 -0
  77. package/dist/clients/attach/overlays/graph.js +725 -0
  78. package/dist/clients/attach/overlays/help.d.ts +33 -0
  79. package/dist/clients/attach/overlays/help.js +214 -0
  80. package/dist/clients/attach/overlays/mcp.d.ts +32 -0
  81. package/dist/clients/attach/overlays/mcp.js +302 -0
  82. package/dist/clients/attach/overlays/pickers.d.ts +56 -0
  83. package/dist/clients/attach/overlays/pickers.js +163 -0
  84. package/dist/clients/attach/render/activity-slot.d.ts +4 -0
  85. package/dist/clients/attach/render/activity-slot.js +13 -0
  86. package/dist/clients/attach/render/assistant-message.d.ts +13 -0
  87. package/dist/clients/attach/render/assistant-message.js +56 -0
  88. package/dist/clients/attach/render/card-presentation.d.ts +36 -0
  89. package/dist/clients/attach/render/card-presentation.js +222 -0
  90. package/dist/clients/attach/render/chat-view.d.ts +409 -0
  91. package/dist/clients/attach/render/chat-view.js +2108 -0
  92. package/dist/clients/attach/render/condensed-history.d.ts +21 -0
  93. package/dist/clients/attach/render/condensed-history.js +60 -0
  94. package/dist/clients/attach/render/context-message.d.ts +22 -0
  95. package/dist/clients/attach/render/context-message.js +63 -0
  96. package/dist/clients/attach/render/crtr-output.d.ts +52 -0
  97. package/dist/clients/attach/render/crtr-output.js +721 -0
  98. package/dist/clients/attach/render/diagram.d.ts +4 -0
  99. package/dist/clients/attach/render/diagram.js +111 -0
  100. package/dist/clients/attach/render/doc-links.d.ts +36 -0
  101. package/dist/clients/attach/render/doc-links.js +78 -0
  102. package/dist/clients/attach/render/edit-diff.d.ts +12 -0
  103. package/dist/clients/attach/render/edit-diff.js +304 -0
  104. package/dist/clients/attach/render/glyph-codepoints.d.ts +3 -0
  105. package/dist/clients/attach/render/glyph-codepoints.js +42 -0
  106. package/dist/clients/attach/render/group-activity.d.ts +84 -0
  107. package/dist/clients/attach/render/group-activity.js +276 -0
  108. package/dist/clients/attach/render/group-recap.d.ts +13 -0
  109. package/dist/clients/attach/render/group-recap.js +146 -0
  110. package/dist/clients/attach/render/markdown-source.d.ts +21 -0
  111. package/dist/clients/attach/render/markdown-source.js +279 -0
  112. package/dist/clients/attach/render/measured-container.d.ts +96 -0
  113. package/dist/clients/attach/render/measured-container.js +322 -0
  114. package/dist/clients/attach/render/page-block.d.ts +39 -0
  115. package/dist/clients/attach/render/page-block.js +187 -0
  116. package/dist/clients/attach/render/scroll-animation.d.ts +8 -0
  117. package/dist/clients/attach/render/scroll-animation.js +80 -0
  118. package/dist/clients/attach/render/tool-calls.d.ts +53 -0
  119. package/dist/clients/attach/render/tool-calls.js +350 -0
  120. package/dist/clients/attach/render/transcript-copy.d.ts +9 -0
  121. package/dist/clients/attach/render/transcript-copy.js +81 -0
  122. package/dist/clients/attach/render/transcript-search.d.ts +28 -0
  123. package/dist/clients/attach/render/transcript-search.js +152 -0
  124. package/dist/clients/attach/render/viewport.d.ts +38 -0
  125. package/dist/clients/attach/render/viewport.js +184 -0
  126. package/dist/clients/attach/session/banner.d.ts +13 -0
  127. package/dist/clients/attach/session/banner.js +33 -0
  128. package/dist/clients/attach/session/bindings.d.ts +20 -0
  129. package/dist/clients/attach/session/bindings.js +71 -0
  130. package/dist/clients/attach/session/chrome-refresh.d.ts +49 -0
  131. package/dist/clients/attach/session/chrome-refresh.js +154 -0
  132. package/dist/clients/attach/session/connection.d.ts +54 -0
  133. package/dist/clients/attach/session/connection.js +204 -0
  134. package/dist/clients/attach/session/context.d.ts +59 -0
  135. package/dist/clients/attach/session/context.js +16 -0
  136. package/dist/clients/attach/session/document-links.d.ts +12 -0
  137. package/dist/clients/attach/session/document-links.js +43 -0
  138. package/dist/clients/attach/session/editor-frame.d.ts +47 -0
  139. package/dist/clients/attach/session/editor-frame.js +142 -0
  140. package/dist/clients/attach/session/editor-inventory.d.ts +63 -0
  141. package/dist/clients/attach/session/editor-inventory.js +156 -0
  142. package/dist/clients/attach/session/file-links.d.ts +22 -0
  143. package/dist/clients/attach/session/file-links.js +73 -0
  144. package/dist/clients/attach/session/focus-events.d.ts +4 -0
  145. package/dist/clients/attach/session/focus-events.js +12 -0
  146. package/dist/clients/attach/session/frame.d.ts +46 -0
  147. package/dist/clients/attach/session/frame.js +214 -0
  148. package/dist/clients/attach/session/frames.d.ts +51 -0
  149. package/dist/clients/attach/session/frames.js +203 -0
  150. package/dist/clients/attach/session/identity.d.ts +16 -0
  151. package/dist/clients/attach/session/identity.js +26 -0
  152. package/dist/clients/attach/session/input-wiring.d.ts +53 -0
  153. package/dist/clients/attach/session/input-wiring.js +146 -0
  154. package/dist/clients/attach/session/invariant.d.ts +9 -0
  155. package/dist/clients/attach/session/invariant.js +15 -0
  156. package/dist/clients/attach/session/keys.d.ts +46 -0
  157. package/dist/clients/attach/session/keys.js +77 -0
  158. package/dist/clients/attach/session/layout.d.ts +22 -0
  159. package/dist/clients/attach/session/layout.js +59 -0
  160. package/dist/clients/attach/session/mouse.d.ts +27 -0
  161. package/dist/clients/attach/session/mouse.js +78 -0
  162. package/dist/clients/attach/session/pane-focus.d.ts +8 -0
  163. package/dist/clients/attach/session/pane-focus.js +42 -0
  164. package/dist/clients/attach/session/pane-tag.d.ts +44 -0
  165. package/dist/clients/attach/session/pane-tag.js +112 -0
  166. package/dist/clients/attach/session/pi-assets.d.ts +1 -0
  167. package/dist/clients/attach/session/pi-assets.js +24 -0
  168. package/dist/clients/attach/session/pi-oauth-flows.d.ts +1 -0
  169. package/dist/clients/attach/session/pi-oauth-flows.js +21 -0
  170. package/dist/clients/attach/session/profile-files.d.ts +17 -0
  171. package/dist/clients/attach/session/profile-files.js +207 -0
  172. package/dist/clients/attach/session/readonly-popup.d.ts +15 -0
  173. package/dist/clients/attach/session/readonly-popup.js +25 -0
  174. package/dist/clients/attach/session/reconnect.d.ts +46 -0
  175. package/dist/clients/attach/session/reconnect.js +195 -0
  176. package/dist/clients/attach/session/selection.d.ts +28 -0
  177. package/dist/clients/attach/session/selection.js +108 -0
  178. package/dist/clients/attach/session/state-sync.d.ts +38 -0
  179. package/dist/clients/attach/session/state-sync.js +67 -0
  180. package/dist/clients/attach/session/surface-frame.d.ts +20 -0
  181. package/dist/clients/attach/session/surface-frame.js +73 -0
  182. package/dist/clients/attach/session/surface-host.d.ts +65 -0
  183. package/dist/clients/attach/session/surface-host.js +256 -0
  184. package/dist/clients/attach/session/teardown.d.ts +30 -0
  185. package/dist/clients/attach/session/teardown.js +94 -0
  186. package/dist/clients/attach/session/transcript-search.d.ts +20 -0
  187. package/dist/clients/attach/session/transcript-search.js +151 -0
  188. package/dist/clients/attach/session/whip-achievements.d.ts +4 -0
  189. package/dist/clients/attach/session/whip-achievements.js +145 -0
  190. package/dist/clients/attach/session/whip.d.ts +20 -0
  191. package/dist/clients/attach/session/whip.js +362 -0
  192. package/dist/clients/attach/slash/dispatch.d.ts +120 -0
  193. package/dist/clients/attach/slash/dispatch.js +748 -0
  194. package/dist/clients/attach/slash/prompt-preview.d.ts +30 -0
  195. package/dist/clients/attach/slash/prompt-preview.js +121 -0
  196. package/dist/clients/attach/viewer.d.ts +8 -0
  197. package/dist/clients/attach/viewer.js +873 -0
  198. package/dist/clients/conversation/projection.d.ts +79 -0
  199. package/dist/clients/conversation/projection.js +324 -0
  200. package/dist/clients/conversation/submit.d.ts +38 -0
  201. package/dist/clients/conversation/submit.js +51 -0
  202. package/dist/clients/dashboard/app.d.ts +7 -0
  203. package/dist/clients/dashboard/app.js +438 -0
  204. package/dist/clients/dashboard/model.d.ts +39 -0
  205. package/dist/clients/dashboard/model.js +77 -0
  206. package/dist/clients/dashboard/render.d.ts +29 -0
  207. package/dist/clients/dashboard/render.js +148 -0
  208. package/dist/clients/inbox/controller.d.ts +174 -0
  209. package/dist/clients/inbox/controller.js +816 -0
  210. package/dist/clients/inbox/dto-adapt.d.ts +28 -0
  211. package/dist/clients/inbox/dto-adapt.js +93 -0
  212. package/dist/clients/inbox/layout.d.ts +8 -0
  213. package/dist/clients/inbox/layout.js +9 -0
  214. package/dist/clients/inbox/page-adapter.d.ts +33 -0
  215. package/dist/clients/inbox/page-adapter.js +55 -0
  216. package/dist/clients/inbox/resolve.d.ts +16 -0
  217. package/dist/clients/inbox/resolve.js +35 -0
  218. package/dist/clients/inbox/review/anchors.d.ts +41 -0
  219. package/dist/clients/inbox/review/anchors.js +89 -0
  220. package/dist/clients/inbox/review/comments-client.d.ts +74 -0
  221. package/dist/clients/inbox/review/comments-client.js +103 -0
  222. package/dist/clients/inbox/review/companion-pane.d.ts +47 -0
  223. package/dist/clients/inbox/review/companion-pane.js +109 -0
  224. package/dist/clients/inbox/review/document-surface.d.ts +212 -0
  225. package/dist/clients/inbox/review/document-surface.js +1268 -0
  226. package/dist/clients/inbox/review/frame.d.ts +57 -0
  227. package/dist/clients/inbox/review/frame.js +309 -0
  228. package/dist/clients/inbox/review/keys.d.ts +69 -0
  229. package/dist/clients/inbox/review/keys.js +133 -0
  230. package/dist/clients/inbox/review/launch.d.ts +16 -0
  231. package/dist/clients/inbox/review/launch.js +170 -0
  232. package/dist/clients/inbox/review/live-source.d.ts +24 -0
  233. package/dist/clients/inbox/review/live-source.js +160 -0
  234. package/dist/clients/inbox/review/nvim.d.ts +15 -0
  235. package/dist/clients/inbox/review/nvim.js +43 -0
  236. package/dist/clients/inbox/review/remap.d.ts +51 -0
  237. package/dist/clients/inbox/review/remap.js +157 -0
  238. package/dist/clients/inbox/review/review-client.d.ts +43 -0
  239. package/dist/clients/inbox/review/review-client.js +123 -0
  240. package/dist/clients/inbox/review/roundtrip.d.ts +5 -0
  241. package/dist/clients/inbox/review/roundtrip.js +41 -0
  242. package/dist/clients/inbox/review/state.d.ts +153 -0
  243. package/dist/clients/inbox/review/state.js +315 -0
  244. package/dist/clients/inbox/review-adapter.d.ts +17 -0
  245. package/dist/clients/inbox/review-adapter.js +43 -0
  246. package/dist/clients/inbox/surface.d.ts +25 -0
  247. package/dist/clients/inbox/surface.js +190 -0
  248. package/dist/clients/inbox/tui/ansi.d.ts +68 -0
  249. package/dist/clients/inbox/tui/ansi.js +321 -0
  250. package/dist/clients/inbox/tui/input.d.ts +5 -0
  251. package/dist/clients/inbox/tui/input.js +392 -0
  252. package/dist/clients/inbox/tui/keys.d.ts +28 -0
  253. package/dist/clients/inbox/tui/keys.js +104 -0
  254. package/dist/clients/inbox/tui/page-body.d.ts +10 -0
  255. package/dist/clients/inbox/tui/page-body.js +69 -0
  256. package/dist/clients/inbox/tui/panel.d.ts +4 -0
  257. package/dist/clients/inbox/tui/panel.js +84 -0
  258. package/dist/clients/inbox/tui/render.d.ts +23 -0
  259. package/dist/clients/inbox/tui/render.js +378 -0
  260. package/dist/clients/inbox/tui/slots.d.ts +33 -0
  261. package/dist/clients/inbox/tui/slots.js +134 -0
  262. package/dist/clients/inbox/tui/types.d.ts +73 -0
  263. package/dist/clients/inbox/tui/types.js +1 -0
  264. package/dist/clients/inbox/tui.d.ts +17 -0
  265. package/dist/clients/inbox/tui.js +92 -0
  266. package/dist/clients/surfaces/host.d.ts +74 -0
  267. package/dist/clients/surfaces/host.js +1 -0
  268. package/dist/commands/api-client.d.ts +113 -0
  269. package/dist/commands/api-client.js +427 -0
  270. package/dist/commands/attention.d.ts +2 -0
  271. package/dist/commands/attention.js +215 -0
  272. package/dist/commands/canvas/edges.d.ts +2 -0
  273. package/dist/commands/canvas/edges.js +41 -0
  274. package/dist/commands/canvas/list.d.ts +4 -0
  275. package/dist/commands/canvas/list.js +79 -0
  276. package/dist/commands/canvas/read.d.ts +14 -0
  277. package/dist/commands/canvas/read.js +95 -0
  278. package/dist/commands/canvas/search.d.ts +2 -0
  279. package/dist/commands/canvas/search.js +49 -0
  280. package/dist/commands/canvas/share.d.ts +2 -0
  281. package/dist/commands/canvas/share.js +80 -0
  282. package/dist/commands/canvas/unwatch.d.ts +2 -0
  283. package/dist/commands/canvas/unwatch.js +42 -0
  284. package/dist/commands/canvas/watch.d.ts +3 -0
  285. package/dist/commands/canvas/watch.js +63 -0
  286. package/dist/commands/canvas-analytics/chart.d.ts +52 -0
  287. package/dist/commands/canvas-analytics/chart.js +124 -0
  288. package/dist/commands/canvas-analytics/drilldown.d.ts +34 -0
  289. package/dist/commands/canvas-analytics/drilldown.js +96 -0
  290. package/dist/commands/canvas-analytics/format.d.ts +29 -0
  291. package/dist/commands/canvas-analytics/format.js +106 -0
  292. package/dist/commands/canvas-analytics/graph-detail.d.ts +2 -0
  293. package/dist/commands/canvas-analytics/graph-detail.js +307 -0
  294. package/dist/commands/canvas-analytics/graphs.d.ts +9 -0
  295. package/dist/commands/canvas-analytics/graphs.js +365 -0
  296. package/dist/commands/canvas-analytics/memory.d.ts +2 -0
  297. package/dist/commands/canvas-analytics/memory.js +211 -0
  298. package/dist/commands/canvas-analytics/overview.d.ts +2 -0
  299. package/dist/commands/canvas-analytics/overview.js +189 -0
  300. package/dist/commands/canvas-analytics/shell.d.ts +60 -0
  301. package/dist/commands/canvas-analytics/shell.js +416 -0
  302. package/dist/commands/canvas-analytics/time.d.ts +2 -0
  303. package/dist/commands/canvas-analytics/time.js +228 -0
  304. package/dist/commands/canvas-analytics/usage.d.ts +2 -0
  305. package/dist/commands/canvas-analytics/usage.js +305 -0
  306. package/dist/commands/canvas-analytics/view.d.ts +85 -0
  307. package/dist/commands/canvas-analytics/view.js +102 -0
  308. package/dist/commands/canvas-analytics.d.ts +2 -0
  309. package/dist/commands/canvas-analytics.js +28 -0
  310. package/dist/commands/canvas-browse.d.ts +2 -0
  311. package/dist/commands/canvas-browse.js +71 -0
  312. package/dist/commands/canvas-config.d.ts +2 -0
  313. package/dist/commands/canvas-config.js +192 -0
  314. package/dist/commands/canvas-history/grep.d.ts +1 -0
  315. package/dist/commands/canvas-history/grep.js +85 -0
  316. package/dist/commands/canvas-history/read.d.ts +1 -0
  317. package/dist/commands/canvas-history/read.js +48 -0
  318. package/dist/commands/canvas-history/search.d.ts +1 -0
  319. package/dist/commands/canvas-history/search.js +99 -0
  320. package/dist/commands/canvas-history/shared.d.ts +34 -0
  321. package/dist/commands/canvas-history/shared.js +135 -0
  322. package/dist/commands/canvas-history/stats.d.ts +1 -0
  323. package/dist/commands/canvas-history/stats.js +68 -0
  324. package/dist/commands/canvas-history.d.ts +2 -0
  325. package/dist/commands/canvas-history.js +29 -0
  326. package/dist/commands/canvas-issue.d.ts +2 -0
  327. package/dist/commands/canvas-issue.js +148 -0
  328. package/dist/commands/canvas-prune.d.ts +2 -0
  329. package/dist/commands/canvas-prune.js +111 -0
  330. package/dist/commands/canvas-roster.d.ts +2 -0
  331. package/dist/commands/canvas-roster.js +69 -0
  332. package/dist/commands/canvas-snapshot.d.ts +2 -0
  333. package/dist/commands/canvas-snapshot.js +34 -0
  334. package/dist/commands/canvas-use.d.ts +1 -0
  335. package/dist/commands/canvas-use.js +61 -0
  336. package/dist/commands/canvas.d.ts +3 -0
  337. package/dist/commands/canvas.js +57 -0
  338. package/dist/commands/chord.d.ts +2 -0
  339. package/dist/commands/chord.js +241 -0
  340. package/dist/commands/cron.d.ts +2 -0
  341. package/dist/commands/cron.js +541 -0
  342. package/dist/commands/custom-object/ack.d.ts +2 -0
  343. package/dist/commands/custom-object/ack.js +30 -0
  344. package/dist/commands/custom-object/publish.d.ts +2 -0
  345. package/dist/commands/custom-object/publish.js +39 -0
  346. package/dist/commands/custom-object/receive.d.ts +2 -0
  347. package/dist/commands/custom-object/receive.js +69 -0
  348. package/dist/commands/custom-object/register.d.ts +2 -0
  349. package/dist/commands/custom-object/register.js +69 -0
  350. package/dist/commands/custom-object/shared.d.ts +5 -0
  351. package/dist/commands/custom-object/shared.js +14 -0
  352. package/dist/commands/custom-object/unregister.d.ts +2 -0
  353. package/dist/commands/custom-object/unregister.js +26 -0
  354. package/dist/commands/custom-object.d.ts +2 -0
  355. package/dist/commands/custom-object.js +21 -0
  356. package/dist/commands/dashboard.d.ts +2 -0
  357. package/dist/commands/dashboard.js +86 -0
  358. package/dist/commands/doc/delete.d.ts +2 -0
  359. package/dist/commands/doc/delete.js +30 -0
  360. package/dist/commands/doc/edit.d.ts +2 -0
  361. package/dist/commands/doc/edit.js +82 -0
  362. package/dist/commands/doc/history.d.ts +2 -0
  363. package/dist/commands/doc/history.js +38 -0
  364. package/dist/commands/doc/lint.d.ts +2 -0
  365. package/dist/commands/doc/lint.js +36 -0
  366. package/dist/commands/doc/list.d.ts +2 -0
  367. package/dist/commands/doc/list.js +19 -0
  368. package/dist/commands/doc/move.d.ts +2 -0
  369. package/dist/commands/doc/move.js +37 -0
  370. package/dist/commands/doc/read.d.ts +2 -0
  371. package/dist/commands/doc/read.js +19 -0
  372. package/dist/commands/doc/replace-blocks.d.ts +6 -0
  373. package/dist/commands/doc/replace-blocks.js +40 -0
  374. package/dist/commands/doc/shared.d.ts +25 -0
  375. package/dist/commands/doc/shared.js +160 -0
  376. package/dist/commands/doc/write.d.ts +2 -0
  377. package/dist/commands/doc/write.js +52 -0
  378. package/dist/commands/doc.d.ts +2 -0
  379. package/dist/commands/doc.js +27 -0
  380. package/dist/commands/human/components.d.ts +4 -0
  381. package/dist/commands/human/components.js +78 -0
  382. package/dist/commands/human/feedback.d.ts +2 -0
  383. package/dist/commands/human/feedback.js +112 -0
  384. package/dist/commands/human/prompts.d.ts +21 -0
  385. package/dist/commands/human/prompts.js +326 -0
  386. package/dist/commands/human/queue.d.ts +3 -0
  387. package/dist/commands/human/queue.js +191 -0
  388. package/dist/commands/human/request.d.ts +2 -0
  389. package/dist/commands/human/request.js +266 -0
  390. package/dist/commands/human/review.d.ts +2 -0
  391. package/dist/commands/human/review.js +288 -0
  392. package/dist/commands/human/shared.d.ts +16 -0
  393. package/dist/commands/human/shared.js +67 -0
  394. package/dist/commands/human.d.ts +2 -0
  395. package/dist/commands/human.js +63 -0
  396. package/dist/commands/node/bash.d.ts +1 -0
  397. package/dist/commands/node/bash.js +390 -0
  398. package/dist/commands/node/create.d.ts +6 -0
  399. package/dist/commands/node/create.js +363 -0
  400. package/dist/commands/node/inspect.d.ts +2 -0
  401. package/dist/commands/node/inspect.js +288 -0
  402. package/dist/commands/node/lifecycle.d.ts +4 -0
  403. package/dist/commands/node/lifecycle.js +577 -0
  404. package/dist/commands/node/message.d.ts +1 -0
  405. package/dist/commands/node/message.js +170 -0
  406. package/dist/commands/node/outcome.d.ts +2 -0
  407. package/dist/commands/node/outcome.js +133 -0
  408. package/dist/commands/node/pyramid.d.ts +2 -0
  409. package/dist/commands/node/pyramid.js +79 -0
  410. package/dist/commands/node/subscription.d.ts +1 -0
  411. package/dist/commands/node/subscription.js +78 -0
  412. package/dist/commands/node/wait.d.ts +1 -0
  413. package/dist/commands/node/wait.js +165 -0
  414. package/dist/commands/node-context.d.ts +2 -0
  415. package/dist/commands/node-context.js +145 -0
  416. package/dist/commands/node-lifecycle-revive.d.ts +12 -0
  417. package/dist/commands/node-lifecycle-revive.js +217 -0
  418. package/dist/commands/node-snapshot.d.ts +2 -0
  419. package/dist/commands/node-snapshot.js +37 -0
  420. package/dist/commands/node-transcript.d.ts +2 -0
  421. package/dist/commands/node-transcript.js +59 -0
  422. package/dist/commands/node-worktree.d.ts +2 -0
  423. package/dist/commands/node-worktree.js +138 -0
  424. package/dist/commands/node.d.ts +2 -0
  425. package/dist/commands/node.js +29 -0
  426. package/dist/commands/person-settings.d.ts +1 -0
  427. package/dist/commands/person-settings.js +23 -0
  428. package/dist/commands/pkg/browse/actions.d.ts +7 -0
  429. package/dist/commands/pkg/browse/actions.js +198 -0
  430. package/dist/commands/pkg/browse/catalog.d.ts +9 -0
  431. package/dist/commands/pkg/browse/catalog.js +461 -0
  432. package/dist/commands/pkg/browse/command-view.d.ts +3 -0
  433. package/dist/commands/pkg/browse/command-view.js +217 -0
  434. package/dist/commands/pkg/browse/detail-panel.d.ts +66 -0
  435. package/dist/commands/pkg/browse/detail-panel.js +402 -0
  436. package/dist/commands/pkg/browse/doc-view.d.ts +3 -0
  437. package/dist/commands/pkg/browse/doc-view.js +84 -0
  438. package/dist/commands/pkg/browse/list-panel.d.ts +28 -0
  439. package/dist/commands/pkg/browse/list-panel.js +168 -0
  440. package/dist/commands/pkg/browse/model.d.ts +223 -0
  441. package/dist/commands/pkg/browse/model.js +36 -0
  442. package/dist/commands/pkg/browse/shell.d.ts +93 -0
  443. package/dist/commands/pkg/browse/shell.js +640 -0
  444. package/dist/commands/pkg/browse.d.ts +2 -0
  445. package/dist/commands/pkg/browse.js +27 -0
  446. package/dist/commands/pkg/market-inspect.d.ts +2 -0
  447. package/dist/commands/pkg/market-inspect.js +141 -0
  448. package/dist/commands/pkg/market-manage.d.ts +16 -0
  449. package/dist/commands/pkg/market-manage.js +327 -0
  450. package/dist/commands/pkg/market.d.ts +1 -0
  451. package/dist/commands/pkg/market.js +14 -0
  452. package/dist/commands/pkg/plugin-env.d.ts +3 -0
  453. package/dist/commands/pkg/plugin-env.js +65 -0
  454. package/dist/commands/pkg/plugin-inspect.d.ts +2 -0
  455. package/dist/commands/pkg/plugin-inspect.js +168 -0
  456. package/dist/commands/pkg/plugin-manage.d.ts +98 -0
  457. package/dist/commands/pkg/plugin-manage.js +1024 -0
  458. package/dist/commands/pkg/plugin.d.ts +1 -0
  459. package/dist/commands/pkg/plugin.js +14 -0
  460. package/dist/commands/pkg/shared.d.ts +13 -0
  461. package/dist/commands/pkg/shared.js +62 -0
  462. package/dist/commands/pkg.d.ts +2 -0
  463. package/dist/commands/pkg.js +21 -0
  464. package/dist/commands/profile/daemon-profiles.d.ts +13 -0
  465. package/dist/commands/profile/daemon-profiles.js +38 -0
  466. package/dist/commands/profile/default.d.ts +2 -0
  467. package/dist/commands/profile/default.js +183 -0
  468. package/dist/commands/profile/delete.d.ts +1 -0
  469. package/dist/commands/profile/delete.js +66 -0
  470. package/dist/commands/profile/env.d.ts +8 -0
  471. package/dist/commands/profile/env.js +188 -0
  472. package/dist/commands/profile/kind.d.ts +1 -0
  473. package/dist/commands/profile/kind.js +27 -0
  474. package/dist/commands/profile/list.d.ts +1 -0
  475. package/dist/commands/profile/list.js +45 -0
  476. package/dist/commands/profile/meta.d.ts +4 -0
  477. package/dist/commands/profile/meta.js +65 -0
  478. package/dist/commands/profile/new.d.ts +1 -0
  479. package/dist/commands/profile/new.js +95 -0
  480. package/dist/commands/profile/pause.d.ts +2 -0
  481. package/dist/commands/profile/pause.js +59 -0
  482. package/dist/commands/profile/project.d.ts +2 -0
  483. package/dist/commands/profile/project.js +134 -0
  484. package/dist/commands/profile/rename.d.ts +1 -0
  485. package/dist/commands/profile/rename.js +41 -0
  486. package/dist/commands/profile/show.d.ts +1 -0
  487. package/dist/commands/profile/show.js +55 -0
  488. package/dist/commands/profile.d.ts +2 -0
  489. package/dist/commands/profile.js +35 -0
  490. package/dist/commands/push.d.ts +2 -0
  491. package/dist/commands/push.js +263 -0
  492. package/dist/commands/revive.d.ts +2 -0
  493. package/dist/commands/revive.js +183 -0
  494. package/dist/commands/surface/node/cycle.d.ts +1 -0
  495. package/dist/commands/surface/node/cycle.js +83 -0
  496. package/dist/commands/surface/node/focus.d.ts +1 -0
  497. package/dist/commands/surface/node/focus.js +60 -0
  498. package/dist/commands/surface/node/id.d.ts +1 -0
  499. package/dist/commands/surface/node/id.js +38 -0
  500. package/dist/commands/surface/node/pin.d.ts +1 -0
  501. package/dist/commands/surface/node/pin.js +42 -0
  502. package/dist/commands/surface/node/placement.d.ts +30 -0
  503. package/dist/commands/surface/node/placement.js +49 -0
  504. package/dist/commands/surface-dashboard.d.ts +2 -0
  505. package/dist/commands/surface-dashboard.js +138 -0
  506. package/dist/commands/surface-edit.d.ts +2 -0
  507. package/dist/commands/surface-edit.js +157 -0
  508. package/dist/commands/surface-inbox.d.ts +2 -0
  509. package/dist/commands/surface-inbox.js +98 -0
  510. package/dist/commands/surface-inspect.d.ts +2 -0
  511. package/dist/commands/surface-inspect.js +41 -0
  512. package/dist/commands/surface-node.d.ts +2 -0
  513. package/dist/commands/surface-node.js +19 -0
  514. package/dist/commands/surface-reload.d.ts +7 -0
  515. package/dist/commands/surface-reload.js +129 -0
  516. package/dist/commands/surface-tmux-spread.d.ts +2 -0
  517. package/dist/commands/surface-tmux-spread.js +214 -0
  518. package/dist/commands/surface.d.ts +2 -0
  519. package/dist/commands/surface.js +29 -0
  520. package/dist/commands/sys/branch.d.ts +2 -0
  521. package/dist/commands/sys/branch.js +19 -0
  522. package/dist/commands/sys/config.d.ts +1 -0
  523. package/dist/commands/sys/config.js +353 -0
  524. package/dist/commands/sys/connect.d.ts +1 -0
  525. package/dist/commands/sys/connect.js +185 -0
  526. package/dist/commands/sys/context/admin/actions.d.ts +23 -0
  527. package/dist/commands/sys/context/admin/actions.js +89 -0
  528. package/dist/commands/sys/context/admin/detail-panel.d.ts +73 -0
  529. package/dist/commands/sys/context/admin/detail-panel.js +233 -0
  530. package/dist/commands/sys/context/admin/docs-panel.d.ts +63 -0
  531. package/dist/commands/sys/context/admin/docs-panel.js +185 -0
  532. package/dist/commands/sys/context/admin/list-view.d.ts +62 -0
  533. package/dist/commands/sys/context/admin/list-view.js +170 -0
  534. package/dist/commands/sys/context/admin/model.d.ts +123 -0
  535. package/dist/commands/sys/context/admin/model.js +179 -0
  536. package/dist/commands/sys/context/admin/rail-panel.d.ts +84 -0
  537. package/dist/commands/sys/context/admin/rail-panel.js +229 -0
  538. package/dist/commands/sys/context/admin/read-view.d.ts +27 -0
  539. package/dist/commands/sys/context/admin/read-view.js +172 -0
  540. package/dist/commands/sys/context/admin/shell.d.ts +125 -0
  541. package/dist/commands/sys/context/admin/shell.js +870 -0
  542. package/dist/commands/sys/context/admin.d.ts +1 -0
  543. package/dist/commands/sys/context/admin.js +148 -0
  544. package/dist/commands/sys/context/doc.d.ts +1 -0
  545. package/dist/commands/sys/context/doc.js +126 -0
  546. package/dist/commands/sys/context/expose.d.ts +1 -0
  547. package/dist/commands/sys/context/expose.js +66 -0
  548. package/dist/commands/sys/context/prompt-review.d.ts +1 -0
  549. package/dist/commands/sys/context/prompt-review.js +244 -0
  550. package/dist/commands/sys/context/resolve.d.ts +115 -0
  551. package/dist/commands/sys/context/resolve.js +326 -0
  552. package/dist/commands/sys/context/sysprompt.d.ts +1 -0
  553. package/dist/commands/sys/context/sysprompt.js +95 -0
  554. package/dist/commands/sys/context.d.ts +2 -0
  555. package/dist/commands/sys/context.js +21 -0
  556. package/dist/commands/sys/daemon.d.ts +4 -0
  557. package/dist/commands/sys/daemon.js +334 -0
  558. package/dist/commands/sys/db.d.ts +1 -0
  559. package/dist/commands/sys/db.js +69 -0
  560. package/dist/commands/sys/desktop.d.ts +5 -0
  561. package/dist/commands/sys/desktop.js +201 -0
  562. package/dist/commands/sys/doctor.d.ts +36 -0
  563. package/dist/commands/sys/doctor.js +633 -0
  564. package/dist/commands/sys/env.d.ts +1 -0
  565. package/dist/commands/sys/env.js +39 -0
  566. package/dist/commands/sys/feedback.d.ts +1 -0
  567. package/dist/commands/sys/feedback.js +228 -0
  568. package/dist/commands/sys/import/move.d.ts +55 -0
  569. package/dist/commands/sys/import/move.js +391 -0
  570. package/dist/commands/sys/import/resume.d.ts +1 -0
  571. package/dist/commands/sys/import/resume.js +23 -0
  572. package/dist/commands/sys/import/start.d.ts +4 -0
  573. package/dist/commands/sys/import/start.js +92 -0
  574. package/dist/commands/sys/join.d.ts +3 -0
  575. package/dist/commands/sys/join.js +85 -0
  576. package/dist/commands/sys/limits.d.ts +1 -0
  577. package/dist/commands/sys/limits.js +133 -0
  578. package/dist/commands/sys/logs.d.ts +1 -0
  579. package/dist/commands/sys/logs.js +129 -0
  580. package/dist/commands/sys/machine/rotate.d.ts +1 -0
  581. package/dist/commands/sys/machine/rotate.js +49 -0
  582. package/dist/commands/sys/migrate.d.ts +1 -0
  583. package/dist/commands/sys/migrate.js +79 -0
  584. package/dist/commands/sys/panels/broker-limits-panel.d.ts +17 -0
  585. package/dist/commands/sys/panels/broker-limits-panel.js +110 -0
  586. package/dist/commands/sys/panels/dependencies-panel.d.ts +14 -0
  587. package/dist/commands/sys/panels/dependencies-panel.js +80 -0
  588. package/dist/commands/sys/panels/keybindings-panel.d.ts +56 -0
  589. package/dist/commands/sys/panels/keybindings-panel.js +703 -0
  590. package/dist/commands/sys/panels/models-panel.d.ts +106 -0
  591. package/dist/commands/sys/panels/models-panel.js +1160 -0
  592. package/dist/commands/sys/panels/plugin-env-panel.d.ts +19 -0
  593. package/dist/commands/sys/panels/plugin-env-panel.js +70 -0
  594. package/dist/commands/sys/panels/plugins-panel.d.ts +16 -0
  595. package/dist/commands/sys/panels/plugins-panel.js +87 -0
  596. package/dist/commands/sys/panels/prefs-panel.d.ts +22 -0
  597. package/dist/commands/sys/panels/prefs-panel.js +97 -0
  598. package/dist/commands/sys/panels/profiles-panel.d.ts +70 -0
  599. package/dist/commands/sys/panels/profiles-panel.js +655 -0
  600. package/dist/commands/sys/panels/provider-panel.d.ts +74 -0
  601. package/dist/commands/sys/panels/provider-panel.js +534 -0
  602. package/dist/commands/sys/panels/terminal-panel.d.ts +19 -0
  603. package/dist/commands/sys/panels/terminal-panel.js +67 -0
  604. package/dist/commands/sys/provider-login.d.ts +8 -0
  605. package/dist/commands/sys/provider-login.js +99 -0
  606. package/dist/commands/sys/retry-delivery.d.ts +1 -0
  607. package/dist/commands/sys/retry-delivery.js +33 -0
  608. package/dist/commands/sys/settings-shell.d.ts +54 -0
  609. package/dist/commands/sys/settings-shell.js +400 -0
  610. package/dist/commands/sys/settings.d.ts +2 -0
  611. package/dist/commands/sys/settings.js +46 -0
  612. package/dist/commands/sys/setup-core.d.ts +121 -0
  613. package/dist/commands/sys/setup-core.js +890 -0
  614. package/dist/commands/sys/setup-settings-runner.d.ts +13 -0
  615. package/dist/commands/sys/setup-settings-runner.js +15 -0
  616. package/dist/commands/sys/setup-wizard.d.ts +52 -0
  617. package/dist/commands/sys/setup-wizard.js +351 -0
  618. package/dist/commands/sys/setup.d.ts +6 -0
  619. package/dist/commands/sys/setup.js +41 -0
  620. package/dist/commands/sys/shared.d.ts +51 -0
  621. package/dist/commands/sys/shared.js +81 -0
  622. package/dist/commands/sys/signin.d.ts +7 -0
  623. package/dist/commands/sys/signin.js +149 -0
  624. package/dist/commands/sys/spaces.d.ts +1 -0
  625. package/dist/commands/sys/spaces.js +22 -0
  626. package/dist/commands/sys/spend.d.ts +1 -0
  627. package/dist/commands/sys/spend.js +144 -0
  628. package/dist/commands/sys/support/prepare.d.ts +13 -0
  629. package/dist/commands/sys/support/prepare.js +239 -0
  630. package/dist/commands/sys/support/submit.d.ts +19 -0
  631. package/dist/commands/sys/support/submit.js +524 -0
  632. package/dist/commands/sys/support.d.ts +2 -0
  633. package/dist/commands/sys/support.js +18 -0
  634. package/dist/commands/sys/sync-deps.d.ts +16 -0
  635. package/dist/commands/sys/sync-deps.js +445 -0
  636. package/dist/commands/sys/sync-project-guidance.d.ts +1 -0
  637. package/dist/commands/sys/sync-project-guidance.js +319 -0
  638. package/dist/commands/sys/sync-shared.d.ts +44 -0
  639. package/dist/commands/sys/sync-shared.js +139 -0
  640. package/dist/commands/sys/sync-skills.d.ts +1 -0
  641. package/dist/commands/sys/sync-skills.js +297 -0
  642. package/dist/commands/sys/sync.d.ts +2 -0
  643. package/dist/commands/sys/sync.js +17 -0
  644. package/dist/commands/sys/terminal-option.d.ts +112 -0
  645. package/dist/commands/sys/terminal-option.js +542 -0
  646. package/dist/commands/sys/tutorial/branch.d.ts +1 -0
  647. package/dist/commands/sys/tutorial/branch.js +15 -0
  648. package/dist/commands/sys/tutorial/lessons.d.ts +5 -0
  649. package/dist/commands/sys/tutorial/lessons.js +107 -0
  650. package/dist/commands/sys/tutorial/scenario.d.ts +1 -0
  651. package/dist/commands/sys/tutorial/scenario.js +431 -0
  652. package/dist/commands/sys/tutorial/tracks.d.ts +1 -0
  653. package/dist/commands/sys/tutorial/tracks.js +96 -0
  654. package/dist/commands/sys/update.d.ts +2 -0
  655. package/dist/commands/sys/update.js +157 -0
  656. package/dist/commands/sys/worktrees.d.ts +2 -0
  657. package/dist/commands/sys/worktrees.js +53 -0
  658. package/dist/commands/sys.d.ts +2 -0
  659. package/dist/commands/sys.js +31 -0
  660. package/dist/core/activity-signal.d.ts +7 -0
  661. package/dist/core/activity-signal.js +38 -0
  662. package/dist/core/async-array.d.ts +7 -0
  663. package/dist/core/async-array.js +48 -0
  664. package/dist/core/auth-file.d.ts +35 -0
  665. package/dist/core/auth-file.js +161 -0
  666. package/dist/core/auth-interaction.d.ts +19 -0
  667. package/dist/core/auth-interaction.js +94 -0
  668. package/dist/core/bash-guard.d.ts +6 -0
  669. package/dist/core/bash-guard.js +527 -0
  670. package/dist/core/bash-job-supervisor.d.ts +5 -0
  671. package/dist/core/bash-job-supervisor.js +144 -0
  672. package/dist/core/bash-jobs.d.ts +168 -0
  673. package/dist/core/bash-jobs.js +455 -0
  674. package/dist/core/blobs/directory.d.ts +11 -0
  675. package/dist/core/blobs/directory.js +216 -0
  676. package/dist/core/blobs/fault.d.ts +3 -0
  677. package/dist/core/blobs/fault.js +6 -0
  678. package/dist/core/blobs/index.d.ts +21 -0
  679. package/dist/core/blobs/index.js +30 -0
  680. package/dist/core/blobs/r2.d.ts +13 -0
  681. package/dist/core/blobs/r2.js +104 -0
  682. package/dist/core/broker-client/client.d.ts +89 -0
  683. package/dist/core/broker-client/client.js +184 -0
  684. package/dist/core/broker-client/index.d.ts +2 -0
  685. package/dist/core/broker-client/index.js +14 -0
  686. package/dist/core/broker-client/transport-relay.d.ts +47 -0
  687. package/dist/core/broker-client/transport-relay.js +165 -0
  688. package/dist/core/broker-client/transport-socket.d.ts +35 -0
  689. package/dist/core/broker-client/transport-socket.js +187 -0
  690. package/dist/core/broker-client/transport.d.ts +46 -0
  691. package/dist/core/broker-client/transport.js +40 -0
  692. package/dist/core/canvas/app-run.d.ts +3 -0
  693. package/dist/core/canvas/app-run.js +4 -0
  694. package/dist/core/canvas/attention.d.ts +18 -0
  695. package/dist/core/canvas/attention.js +47 -0
  696. package/dist/core/canvas/browse/app.d.ts +29 -0
  697. package/dist/core/canvas/browse/app.js +1050 -0
  698. package/dist/core/canvas/browse/model.d.ts +176 -0
  699. package/dist/core/canvas/browse/model.js +477 -0
  700. package/dist/core/canvas/browse/pins.d.ts +4 -0
  701. package/dist/core/canvas/browse/pins.js +29 -0
  702. package/dist/core/canvas/browse/render.d.ts +103 -0
  703. package/dist/core/canvas/browse/render.js +1058 -0
  704. package/dist/core/canvas/canvas.d.ts +409 -0
  705. package/dist/core/canvas/canvas.js +1206 -0
  706. package/dist/core/canvas/crons.d.ts +322 -0
  707. package/dist/core/canvas/crons.js +541 -0
  708. package/dist/core/canvas/daemon-actions.d.ts +42 -0
  709. package/dist/core/canvas/daemon-actions.js +98 -0
  710. package/dist/core/canvas/db.d.ts +60 -0
  711. package/dist/core/canvas/db.js +426 -0
  712. package/dist/core/canvas/deliveries.d.ts +125 -0
  713. package/dist/core/canvas/deliveries.js +393 -0
  714. package/dist/core/canvas/delivery-contract.d.ts +37 -0
  715. package/dist/core/canvas/delivery-contract.js +30 -0
  716. package/dist/core/canvas/executions.d.ts +125 -0
  717. package/dist/core/canvas/executions.js +279 -0
  718. package/dist/core/canvas/extensions.d.ts +9 -0
  719. package/dist/core/canvas/extensions.js +90 -0
  720. package/dist/core/canvas/focuses.d.ts +26 -0
  721. package/dist/core/canvas/focuses.js +82 -0
  722. package/dist/core/canvas/history.d.ts +104 -0
  723. package/dist/core/canvas/history.js +480 -0
  724. package/dist/core/canvas/index.d.ts +14 -0
  725. package/dist/core/canvas/index.js +16 -0
  726. package/dist/core/canvas/install-id.d.ts +9 -0
  727. package/dist/core/canvas/install-id.js +64 -0
  728. package/dist/core/canvas/labels.d.ts +30 -0
  729. package/dist/core/canvas/labels.js +43 -0
  730. package/dist/core/canvas/legacy-person.d.ts +4 -0
  731. package/dist/core/canvas/legacy-person.js +4 -0
  732. package/dist/core/canvas/memory-reads.d.ts +24 -0
  733. package/dist/core/canvas/memory-reads.js +36 -0
  734. package/dist/core/canvas/meta-file.d.ts +20 -0
  735. package/dist/core/canvas/meta-file.js +89 -0
  736. package/dist/core/canvas/nav-render.d.ts +136 -0
  737. package/dist/core/canvas/nav-render.js +224 -0
  738. package/dist/core/canvas/node-agent-paths.d.ts +8 -0
  739. package/dist/core/canvas/node-agent-paths.js +30 -0
  740. package/dist/core/canvas/node-order.d.ts +24 -0
  741. package/dist/core/canvas/node-order.js +37 -0
  742. package/dist/core/canvas/node-recap.d.ts +23 -0
  743. package/dist/core/canvas/node-recap.js +62 -0
  744. package/dist/core/canvas/node-tokens.d.ts +19 -0
  745. package/dist/core/canvas/node-tokens.js +53 -0
  746. package/dist/core/canvas/outcome-actions.d.ts +23 -0
  747. package/dist/core/canvas/outcome-actions.js +71 -0
  748. package/dist/core/canvas/person.d.ts +32 -0
  749. package/dist/core/canvas/person.js +244 -0
  750. package/dist/core/canvas/pid.d.ts +6 -0
  751. package/dist/core/canvas/pid.js +20 -10
  752. package/dist/core/canvas/reconciler-leases.d.ts +12 -0
  753. package/dist/core/canvas/reconciler-leases.js +40 -0
  754. package/dist/core/canvas/recovery.d.ts +127 -0
  755. package/dist/core/canvas/recovery.js +713 -0
  756. package/dist/core/canvas/remote-canvas-source.d.ts +71 -0
  757. package/dist/core/canvas/remote-canvas-source.js +290 -0
  758. package/dist/core/canvas/remote-transport.d.ts +7 -0
  759. package/dist/core/canvas/remote-transport.js +57 -0
  760. package/dist/core/canvas/render-source.d.ts +193 -0
  761. package/dist/core/canvas/render-source.js +518 -0
  762. package/dist/core/canvas/schema-chain.d.ts +33 -0
  763. package/dist/core/canvas/schema-chain.js +110 -0
  764. package/dist/core/canvas/schema-version.d.ts +30 -0
  765. package/dist/core/canvas/schema-version.js +58 -0
  766. package/dist/core/canvas/sessions.d.ts +54 -0
  767. package/dist/core/canvas/sessions.js +128 -0
  768. package/dist/core/canvas/source.d.ts +52 -0
  769. package/dist/core/canvas/source.js +57 -0
  770. package/dist/core/canvas/status-glyph.d.ts +52 -0
  771. package/dist/core/canvas/status-glyph.js +132 -0
  772. package/dist/core/canvas/structured-requests.d.ts +69 -0
  773. package/dist/core/canvas/structured-requests.js +176 -0
  774. package/dist/core/canvas/telemetry.d.ts +14 -0
  775. package/dist/core/canvas/telemetry.js +35 -0
  776. package/dist/core/canvas/tree.d.ts +33 -0
  777. package/dist/core/canvas/tree.js +128 -0
  778. package/dist/core/canvas/types.d.ts +461 -0
  779. package/dist/core/canvas/types.js +6 -0
  780. package/dist/core/canvas/waits.d.ts +39 -0
  781. package/dist/core/canvas/waits.js +104 -0
  782. package/dist/core/canvas/worktrees.d.ts +41 -0
  783. package/dist/core/canvas/worktrees.js +97 -0
  784. package/dist/core/clipboard-text.d.ts +11 -0
  785. package/dist/core/clipboard-text.js +57 -0
  786. package/dist/core/command-hooks/artifact.d.ts +16 -0
  787. package/dist/core/command-hooks/artifact.js +145 -0
  788. package/dist/core/command-hooks/catalog.d.ts +14 -0
  789. package/dist/core/command-hooks/catalog.js +38 -0
  790. package/dist/core/command-hooks/compose.d.ts +15 -0
  791. package/dist/core/command-hooks/compose.js +101 -0
  792. package/dist/core/command-hooks/discovery.d.ts +133 -0
  793. package/dist/core/command-hooks/discovery.js +246 -0
  794. package/dist/core/command-hooks/help.d.ts +5 -0
  795. package/dist/core/command-hooks/help.js +18 -0
  796. package/dist/core/command-hooks/lifecycle-catalog.d.ts +21 -0
  797. package/dist/core/command-hooks/lifecycle-catalog.js +9 -0
  798. package/dist/core/command-hooks/lifecycle-create.d.ts +4 -0
  799. package/dist/core/command-hooks/lifecycle-create.js +51 -0
  800. package/dist/core/command-hooks/report.d.ts +32 -0
  801. package/dist/core/command-hooks/report.js +28 -0
  802. package/dist/core/command-hooks/schema.d.ts +42 -0
  803. package/dist/core/command-hooks/schema.js +157 -0
  804. package/dist/core/command-hooks/transport/exec-invoke.d.ts +24 -0
  805. package/dist/core/command-hooks/transport/exec-invoke.js +315 -0
  806. package/dist/core/command-hooks/transport/exec-lifecycle.d.ts +23 -0
  807. package/dist/core/command-hooks/transport/exec-lifecycle.js +248 -0
  808. package/dist/core/command-hooks/transport/plan.d.ts +3 -0
  809. package/dist/core/command-hooks/transport/plan.js +30 -0
  810. package/dist/core/command-manifests/registry.d.ts +68 -0
  811. package/dist/core/command-manifests/registry.js +118 -0
  812. package/dist/core/command-plugins/caller-header.d.ts +10 -0
  813. package/dist/core/command-plugins/caller-header.js +15 -0
  814. package/dist/core/command-plugins/compose.d.ts +11 -0
  815. package/dist/core/command-plugins/compose.js +241 -0
  816. package/dist/core/command-plugins/discovery.d.ts +49 -0
  817. package/dist/core/command-plugins/discovery.js +240 -0
  818. package/dist/core/command-plugins/extensions.d.ts +20 -0
  819. package/dist/core/command-plugins/extensions.js +166 -0
  820. package/dist/core/command-plugins/help-addenda.d.ts +25 -0
  821. package/dist/core/command-plugins/help-addenda.js +55 -0
  822. package/dist/core/command-plugins/presence.d.ts +4 -0
  823. package/dist/core/command-plugins/presence.js +36 -0
  824. package/dist/core/command-plugins/transport/exec-invoke.d.ts +42 -0
  825. package/dist/core/command-plugins/transport/exec-invoke.js +138 -0
  826. package/dist/core/command-plugins/transport/http-fetch.d.ts +41 -0
  827. package/dist/core/command-plugins/transport/http-fetch.js +68 -0
  828. package/dist/core/command-plugins/transport/http-invoke.d.ts +22 -0
  829. package/dist/core/command-plugins/transport/http-invoke.js +333 -0
  830. package/dist/core/command-plugins/transport/http-plan.d.ts +75 -0
  831. package/dist/core/command-plugins/transport/http-plan.js +349 -0
  832. package/dist/core/command-plugins/transport/sign.d.ts +55 -0
  833. package/dist/core/command-plugins/transport/sign.js +115 -0
  834. package/dist/core/command.d.ts +238 -0
  835. package/dist/core/command.js +848 -0
  836. package/dist/core/conversation-store/row-store.d.ts +14 -0
  837. package/dist/core/conversation-store/row-store.js +337 -0
  838. package/dist/core/directory/issuer.d.ts +8 -0
  839. package/dist/core/directory/issuer.js +15 -0
  840. package/dist/core/directory/join.d.ts +57 -0
  841. package/dist/core/directory/join.js +218 -0
  842. package/dist/core/directory/person-credential.d.ts +61 -0
  843. package/dist/core/directory/person-credential.js +220 -0
  844. package/dist/core/directory/reach.d.ts +3 -0
  845. package/dist/core/directory/reach.js +19 -0
  846. package/dist/core/document-lines.d.ts +4 -0
  847. package/dist/core/document-lines.js +6 -0
  848. package/dist/core/editor-resolver.d.ts +28 -0
  849. package/dist/core/editor-resolver.js +77 -0
  850. package/dist/core/environments.d.ts +21 -0
  851. package/dist/core/environments.js +56 -0
  852. package/dist/core/events/outbound.d.ts +21 -0
  853. package/dist/core/events/outbound.js +92 -0
  854. package/dist/core/events/read.d.ts +40 -0
  855. package/dist/core/events/read.js +625 -0
  856. package/dist/core/fault-classifier.d.ts +36 -0
  857. package/dist/core/fault-classifier.js +101 -0
  858. package/dist/core/feed/feed.d.ts +63 -0
  859. package/dist/core/feed/feed.js +190 -0
  860. package/dist/core/feed/inbox.d.ts +34 -0
  861. package/dist/core/feed/inbox.js +93 -0
  862. package/dist/core/feed/messages.d.ts +88 -0
  863. package/dist/core/feed/messages.js +206 -0
  864. package/dist/core/feed/reports.d.ts +10 -0
  865. package/dist/core/feed/reports.js +58 -0
  866. package/dist/core/frontmatter.d.ts +8 -0
  867. package/dist/core/frontmatter.js +35 -0
  868. package/dist/core/grants/cover.d.ts +14 -0
  869. package/dist/core/grants/cover.js +66 -0
  870. package/dist/core/grants/local.d.ts +4 -0
  871. package/dist/core/grants/local.js +26 -0
  872. package/dist/core/grants/mirror.d.ts +155 -0
  873. package/dist/core/grants/mirror.js +379 -0
  874. package/dist/core/grants/on-sync.d.ts +26 -0
  875. package/dist/core/grants/on-sync.js +161 -0
  876. package/dist/core/grants/sandboxes.d.ts +7 -0
  877. package/dist/core/grants/sandboxes.js +24 -0
  878. package/dist/core/grants/sync.d.ts +46 -0
  879. package/dist/core/grants/sync.js +195 -0
  880. package/dist/core/grants/terminal.d.ts +10 -0
  881. package/dist/core/grants/terminal.js +25 -0
  882. package/dist/core/graph/access.d.ts +13 -0
  883. package/dist/core/graph/access.js +37 -0
  884. package/dist/core/graph/bodies.d.ts +22 -0
  885. package/dist/core/graph/bodies.js +68 -0
  886. package/dist/core/graph/custom.d.ts +98 -0
  887. package/dist/core/graph/custom.js +298 -0
  888. package/dist/core/graph/deletion.d.ts +16 -0
  889. package/dist/core/graph/deletion.js +104 -0
  890. package/dist/core/graph/documents.d.ts +181 -0
  891. package/dist/core/graph/documents.js +653 -0
  892. package/dist/core/graph/edges.d.ts +41 -0
  893. package/dist/core/graph/edges.js +83 -0
  894. package/dist/core/graph/events.d.ts +49 -0
  895. package/dist/core/graph/events.js +315 -0
  896. package/dist/core/graph/exposures.d.ts +53 -0
  897. package/dist/core/graph/exposures.js +152 -0
  898. package/dist/core/graph/jobs.d.ts +107 -0
  899. package/dist/core/graph/jobs.js +184 -0
  900. package/dist/core/graph/kinds/action.d.ts +3 -0
  901. package/dist/core/graph/kinds/action.js +20 -0
  902. package/dist/core/graph/kinds/custom.d.ts +8 -0
  903. package/dist/core/graph/kinds/custom.js +25 -0
  904. package/dist/core/graph/kinds/document.d.ts +20 -0
  905. package/dist/core/graph/kinds/document.js +133 -0
  906. package/dist/core/graph/kinds/dto.d.ts +5 -0
  907. package/dist/core/graph/kinds/dto.js +11 -0
  908. package/dist/core/graph/kinds/environment.d.ts +2 -0
  909. package/dist/core/graph/kinds/environment.js +21 -0
  910. package/dist/core/graph/kinds/job.d.ts +2 -0
  911. package/dist/core/graph/kinds/job.js +24 -0
  912. package/dist/core/graph/kinds/kind.d.ts +67 -0
  913. package/dist/core/graph/kinds/kind.js +15 -0
  914. package/dist/core/graph/kinds/live-read.d.ts +5 -0
  915. package/dist/core/graph/kinds/live-read.js +11 -0
  916. package/dist/core/graph/kinds/node.d.ts +12 -0
  917. package/dist/core/graph/kinds/node.js +87 -0
  918. package/dist/core/graph/kinds/owner.d.ts +2 -0
  919. package/dist/core/graph/kinds/owner.js +26 -0
  920. package/dist/core/graph/kinds/registry.d.ts +10 -0
  921. package/dist/core/graph/kinds/registry.js +58 -0
  922. package/dist/core/graph/kinds/render.d.ts +9 -0
  923. package/dist/core/graph/kinds/render.js +17 -0
  924. package/dist/core/graph/names.d.ts +57 -0
  925. package/dist/core/graph/names.js +183 -0
  926. package/dist/core/graph/objects.d.ts +88 -0
  927. package/dist/core/graph/objects.js +273 -0
  928. package/dist/core/graph/package-docs.d.ts +41 -0
  929. package/dist/core/graph/package-docs.js +198 -0
  930. package/dist/core/graph/package-files.d.ts +20 -0
  931. package/dist/core/graph/package-files.js +146 -0
  932. package/dist/core/graph/package-kinds.d.ts +22 -0
  933. package/dist/core/graph/package-kinds.js +49 -0
  934. package/dist/core/graph/package-reconcile.d.ts +17 -0
  935. package/dist/core/graph/package-reconcile.js +31 -0
  936. package/dist/core/graph/reader.d.ts +45 -0
  937. package/dist/core/graph/reader.js +218 -0
  938. package/dist/core/graph/receiver-url.d.ts +11 -0
  939. package/dist/core/graph/receiver-url.js +83 -0
  940. package/dist/core/graph/receivers.d.ts +28 -0
  941. package/dist/core/graph/receivers.js +66 -0
  942. package/dist/core/graph/repo-sync/exchange.d.ts +36 -0
  943. package/dist/core/graph/repo-sync/exchange.js +422 -0
  944. package/dist/core/graph/repo-sync/identity.d.ts +32 -0
  945. package/dist/core/graph/repo-sync/identity.js +147 -0
  946. package/dist/core/graph/repo-sync/index.d.ts +4 -0
  947. package/dist/core/graph/repo-sync/index.js +2 -0
  948. package/dist/core/graph/repo-sync/mirror.d.ts +30 -0
  949. package/dist/core/graph/repo-sync/mirror.js +170 -0
  950. package/dist/core/graph/repo-sync/ref-format.d.ts +80 -0
  951. package/dist/core/graph/repo-sync/ref-format.js +215 -0
  952. package/dist/core/graph/repo-sync/repos.d.ts +21 -0
  953. package/dist/core/graph/repo-sync/repos.js +57 -0
  954. package/dist/core/graph/repo-sync/sync.d.ts +40 -0
  955. package/dist/core/graph/repo-sync/sync.js +322 -0
  956. package/dist/core/graph/rules.d.ts +27 -0
  957. package/dist/core/graph/rules.js +134 -0
  958. package/dist/core/graph/types.d.ts +131 -0
  959. package/dist/core/graph/types.js +10 -0
  960. package/dist/core/graph/watches.d.ts +66 -0
  961. package/dist/core/graph/watches.js +177 -0
  962. package/dist/core/human/action-binding.d.ts +23 -0
  963. package/dist/core/human/action-binding.js +41 -0
  964. package/dist/core/human/answer-text.d.ts +5 -0
  965. package/dist/core/human/answer-text.js +100 -0
  966. package/dist/core/human/answer.d.ts +53 -0
  967. package/dist/core/human/answer.js +119 -0
  968. package/dist/core/human/claim.d.ts +23 -0
  969. package/dist/core/human/claim.js +67 -0
  970. package/dist/core/human/completion.d.ts +38 -0
  971. package/dist/core/human/completion.js +27 -0
  972. package/dist/core/human/component-docs.d.ts +18 -0
  973. package/dist/core/human/component-docs.js +442 -0
  974. package/dist/core/human/convention.d.ts +31 -0
  975. package/dist/core/human/convention.js +82 -0
  976. package/dist/core/human/feedback-companion.d.ts +19 -0
  977. package/dist/core/human/feedback-companion.js +92 -0
  978. package/dist/core/human/feedback.d.ts +62 -0
  979. package/dist/core/human/feedback.js +88 -0
  980. package/dist/core/human/page-authoring.d.ts +30 -0
  981. package/dist/core/human/page-authoring.js +19 -0
  982. package/dist/core/human/page-errors.d.ts +8 -0
  983. package/dist/core/human/page-errors.js +14 -0
  984. package/dist/core/human/page-eval.d.ts +25 -0
  985. package/dist/core/human/page-eval.js +125 -0
  986. package/dist/core/human/page-html-markdown.d.ts +8 -0
  987. package/dist/core/human/page-html-markdown.js +260 -0
  988. package/dist/core/human/page-markdown.d.ts +3 -0
  989. package/dist/core/human/page-markdown.js +295 -0
  990. package/dist/core/human/page-schema.d.ts +291 -0
  991. package/dist/core/human/page-schema.js +381 -0
  992. package/dist/core/human/page.d.ts +21 -0
  993. package/dist/core/human/page.js +251 -0
  994. package/dist/core/human/request-files.d.ts +14 -0
  995. package/dist/core/human/request-files.js +54 -0
  996. package/dist/core/human/requests.d.ts +156 -0
  997. package/dist/core/human/requests.js +619 -0
  998. package/dist/core/human/root.d.ts +4 -0
  999. package/dist/core/human/root.js +11 -0
  1000. package/dist/core/human/summary.d.ts +3 -0
  1001. package/dist/core/human/summary.js +5 -0
  1002. package/dist/core/human/tickets.d.ts +68 -0
  1003. package/dist/core/human/tickets.js +175 -0
  1004. package/dist/core/human/types.d.ts +118 -0
  1005. package/dist/core/human/types.js +1 -0
  1006. package/dist/core/human/visible-paths.d.ts +16 -0
  1007. package/dist/core/human/visible-paths.js +74 -0
  1008. package/dist/core/human-actions.d.ts +25 -0
  1009. package/dist/core/human-actions.js +101 -0
  1010. package/dist/core/import/bundle/blob-keys.d.ts +10 -0
  1011. package/dist/core/import/bundle/blob-keys.js +23 -0
  1012. package/dist/core/import/bundle/layout.d.ts +90 -0
  1013. package/dist/core/import/bundle/layout.js +117 -0
  1014. package/dist/core/import/export/archive.d.ts +11 -0
  1015. package/dist/core/import/export/archive.js +22 -0
  1016. package/dist/core/import/export/cloud.d.ts +23 -0
  1017. package/dist/core/import/export/cloud.js +47 -0
  1018. package/dist/core/import/export/dump.d.ts +34 -0
  1019. package/dist/core/import/export/dump.js +235 -0
  1020. package/dist/core/import/export/files.d.ts +22 -0
  1021. package/dist/core/import/export/files.js +107 -0
  1022. package/dist/core/import/export/inline.d.ts +3 -0
  1023. package/dist/core/import/export/inline.js +15 -0
  1024. package/dist/core/import/export/source.d.ts +2 -0
  1025. package/dist/core/import/export/source.js +5 -0
  1026. package/dist/core/import/export/stores.d.ts +9 -0
  1027. package/dist/core/import/export/stores.js +69 -0
  1028. package/dist/core/inspector/chrome.d.ts +6 -0
  1029. package/dist/core/inspector/chrome.js +14 -0
  1030. package/dist/core/inspector/contract.d.ts +105 -0
  1031. package/dist/core/inspector/contract.js +1 -0
  1032. package/dist/core/inspector/core.d.ts +39 -0
  1033. package/dist/core/inspector/core.js +296 -0
  1034. package/dist/core/inspector/host.d.ts +46 -0
  1035. package/dist/core/inspector/host.js +538 -0
  1036. package/dist/core/inspector/model.d.ts +88 -0
  1037. package/dist/core/inspector/model.js +225 -0
  1038. package/dist/core/inspector/text.d.ts +5 -0
  1039. package/dist/core/inspector/text.js +45 -0
  1040. package/dist/core/inspector/transport.d.ts +6 -0
  1041. package/dist/core/inspector/transport.js +36 -0
  1042. package/dist/core/inspector/tui.d.ts +3 -0
  1043. package/dist/core/inspector/tui.js +295 -0
  1044. package/dist/core/io.js +7 -0
  1045. package/dist/core/keybindings/background-bash.d.ts +13 -0
  1046. package/dist/core/keybindings/background-bash.js +33 -0
  1047. package/dist/core/keybindings/catalog.d.ts +1 -1
  1048. package/dist/core/keybindings/inbox.d.ts +18 -0
  1049. package/dist/core/keybindings/inbox.js +25 -0
  1050. package/dist/core/keybindings/index.d.ts +8 -0
  1051. package/dist/core/keybindings/index.js +7 -0
  1052. package/dist/core/keybindings/match.d.ts +44 -0
  1053. package/dist/core/keybindings/match.js +146 -0
  1054. package/dist/core/keybindings/persistence.d.ts +18 -0
  1055. package/dist/core/keybindings/persistence.js +49 -0
  1056. package/dist/core/keybindings/resolve.d.ts +28 -0
  1057. package/dist/core/keybindings/resolve.js +348 -0
  1058. package/dist/core/layout-migrate/index.d.ts +38 -0
  1059. package/dist/core/layout-migrate/index.js +523 -0
  1060. package/dist/core/layout-migrate/paths.d.ts +30 -0
  1061. package/dist/core/layout-migrate/paths.js +118 -0
  1062. package/dist/core/layout-migrate/stored-paths.d.ts +9 -0
  1063. package/dist/core/layout-migrate/stored-paths.js +424 -0
  1064. package/dist/core/layout-migrate/stores.d.ts +30 -0
  1065. package/dist/core/layout-migrate/stores.js +543 -0
  1066. package/dist/core/ledger/account.d.ts +12 -0
  1067. package/dist/core/ledger/account.js +13 -0
  1068. package/dist/core/ledger/charges.d.ts +16 -0
  1069. package/dist/core/ledger/charges.js +43 -0
  1070. package/dist/core/ledger/check.d.ts +48 -0
  1071. package/dist/core/ledger/check.js +38 -0
  1072. package/dist/core/ledger/chunks.d.ts +8 -0
  1073. package/dist/core/ledger/chunks.js +43 -0
  1074. package/dist/core/ledger/index.d.ts +9 -0
  1075. package/dist/core/ledger/index.js +10 -0
  1076. package/dist/core/ledger/infra-allowance.d.ts +7 -0
  1077. package/dist/core/ledger/infra-allowance.js +31 -0
  1078. package/dist/core/ledger/limits.d.ts +10 -0
  1079. package/dist/core/ledger/limits.js +35 -0
  1080. package/dist/core/ledger/months.d.ts +6 -0
  1081. package/dist/core/ledger/months.js +19 -0
  1082. package/dist/core/ledger/payer.d.ts +34 -0
  1083. package/dist/core/ledger/payer.js +14 -0
  1084. package/dist/core/ledger/read.d.ts +57 -0
  1085. package/dist/core/ledger/read.js +194 -0
  1086. package/dist/core/ledger/totals.d.ts +10 -0
  1087. package/dist/core/ledger/totals.js +34 -0
  1088. package/dist/core/ledger/types.d.ts +75 -0
  1089. package/dist/core/ledger/types.js +2 -0
  1090. package/dist/core/llm/app-rungs.d.ts +16 -0
  1091. package/dist/core/llm/app-rungs.js +59 -0
  1092. package/dist/core/llm/body-limits.d.ts +7 -0
  1093. package/dist/core/llm/body-limits.js +7 -0
  1094. package/dist/core/llm/refusal.d.ts +14 -0
  1095. package/dist/core/llm/refusal.js +22 -0
  1096. package/dist/core/locked-file.d.ts +27 -0
  1097. package/dist/core/locked-file.js +121 -0
  1098. package/dist/core/log.d.ts +2 -0
  1099. package/dist/core/log.js +5 -3
  1100. package/dist/core/manifest-stale.d.ts +18 -0
  1101. package/dist/core/manifest-stale.js +39 -0
  1102. package/dist/core/model-auth/api-credential-store.d.ts +10 -0
  1103. package/dist/core/model-auth/api-credential-store.js +40 -0
  1104. package/dist/core/model-auth/daemon-login.d.ts +13 -0
  1105. package/dist/core/model-auth/daemon-login.js +156 -0
  1106. package/dist/core/model-auth/readiness.d.ts +12 -0
  1107. package/dist/core/model-auth/readiness.js +48 -0
  1108. package/dist/core/model-routes-pool.d.ts +14 -0
  1109. package/dist/core/model-routes-pool.js +50 -0
  1110. package/dist/core/model-routes.d.ts +98 -0
  1111. package/dist/core/model-routes.js +190 -0
  1112. package/dist/core/northlight/previews.d.ts +22 -0
  1113. package/dist/core/northlight/previews.js +87 -0
  1114. package/dist/core/nvim-launch.d.ts +7 -0
  1115. package/dist/core/nvim-launch.js +45 -0
  1116. package/dist/core/output.d.ts +35 -0
  1117. package/dist/core/output.js +99 -0
  1118. package/dist/core/pagination.d.ts +35 -0
  1119. package/dist/core/pagination.js +88 -0
  1120. package/dist/core/peer/client.d.ts +61 -0
  1121. package/dist/core/peer/client.js +167 -0
  1122. package/dist/core/peer/directory.d.ts +71 -0
  1123. package/dist/core/peer/directory.js +167 -0
  1124. package/dist/core/peer/envelope.d.ts +46 -0
  1125. package/dist/core/peer/envelope.js +98 -0
  1126. package/dist/core/peer/names.d.ts +5 -0
  1127. package/dist/core/peer/names.js +8 -0
  1128. package/dist/core/peer/outbox-store.d.ts +76 -0
  1129. package/dist/core/peer/outbox-store.js +84 -0
  1130. package/dist/core/peer/receiver.d.ts +8 -0
  1131. package/dist/core/peer/receiver.js +54 -0
  1132. package/dist/core/peer/stubs.d.ts +90 -0
  1133. package/dist/core/peer/stubs.js +208 -0
  1134. package/dist/core/peer/token.d.ts +13 -0
  1135. package/dist/core/peer/token.js +29 -0
  1136. package/dist/core/peer/version.d.ts +16 -0
  1137. package/dist/core/peer/version.js +23 -0
  1138. package/dist/core/permissions/builtin.d.ts +8 -0
  1139. package/dist/core/permissions/builtin.js +27 -0
  1140. package/dist/core/permissions/ceiling.d.ts +57 -0
  1141. package/dist/core/permissions/ceiling.js +319 -0
  1142. package/dist/core/permissions/compile.d.ts +14 -0
  1143. package/dist/core/permissions/compile.js +175 -0
  1144. package/dist/core/permissions/errors.d.ts +7 -0
  1145. package/dist/core/permissions/errors.js +13 -0
  1146. package/dist/core/permissions/evaluator.d.ts +33 -0
  1147. package/dist/core/permissions/evaluator.js +96 -0
  1148. package/dist/core/permissions/facts.d.ts +56 -0
  1149. package/dist/core/permissions/facts.js +102 -0
  1150. package/dist/core/permissions/schema-parser.d.ts +29 -0
  1151. package/dist/core/permissions/schema-parser.js +151 -0
  1152. package/dist/core/permissions/schemas.d.ts +21 -0
  1153. package/dist/core/permissions/schemas.js +83 -0
  1154. package/dist/core/permissions/sql.d.ts +16 -0
  1155. package/dist/core/permissions/sql.js +31 -0
  1156. package/dist/core/plugin-app.d.ts +31 -0
  1157. package/dist/core/plugin-app.js +58 -0
  1158. package/dist/core/plugin-quarantine.d.ts +16 -0
  1159. package/dist/core/plugin-quarantine.js +70 -0
  1160. package/dist/core/pool-credential-store.d.ts +31 -0
  1161. package/dist/core/pool-credential-store.js +116 -0
  1162. package/dist/core/predicate.d.ts +65 -0
  1163. package/dist/core/predicate.js +191 -0
  1164. package/dist/core/preview-registry.d.ts +59 -0
  1165. package/dist/core/preview-registry.js +403 -0
  1166. package/dist/core/profiles/default-binding.d.ts +15 -0
  1167. package/dist/core/profiles/default-binding.js +29 -0
  1168. package/dist/core/profiles/deletion-reservation.d.ts +12 -0
  1169. package/dist/core/profiles/deletion-reservation.js +42 -0
  1170. package/dist/core/profiles/select.d.ts +46 -0
  1171. package/dist/core/profiles/select.js +738 -0
  1172. package/dist/core/provider-credential.d.ts +6 -0
  1173. package/dist/core/provider-credential.js +17 -0
  1174. package/dist/core/provider-error-recognition.d.ts +30 -0
  1175. package/dist/core/provider-error-recognition.js +82 -0
  1176. package/dist/core/provider-failure.d.ts +42 -0
  1177. package/dist/core/provider-failure.js +145 -0
  1178. package/dist/core/provider-management.d.ts +11 -0
  1179. package/dist/core/provider-management.js +9 -0
  1180. package/dist/core/providers/approval.d.ts +23 -0
  1181. package/dist/core/providers/approval.js +146 -0
  1182. package/dist/core/providers/audit.d.ts +30 -0
  1183. package/dist/core/providers/audit.js +52 -0
  1184. package/dist/core/providers/bundles.d.ts +66 -0
  1185. package/dist/core/providers/bundles.js +638 -0
  1186. package/dist/core/providers/call.d.ts +51 -0
  1187. package/dist/core/providers/call.js +480 -0
  1188. package/dist/core/providers/description.d.ts +34 -0
  1189. package/dist/core/providers/description.js +1 -0
  1190. package/dist/core/providers/device-libs.d.ts +71 -0
  1191. package/dist/core/providers/device-libs.js +202 -0
  1192. package/dist/core/providers/device.d.ts +42 -0
  1193. package/dist/core/providers/device.js +95 -0
  1194. package/dist/core/providers/errors.d.ts +99 -0
  1195. package/dist/core/providers/errors.js +136 -0
  1196. package/dist/core/providers/files.d.ts +90 -0
  1197. package/dist/core/providers/files.js +389 -0
  1198. package/dist/core/providers/inflight.d.ts +13 -0
  1199. package/dist/core/providers/inflight.js +14 -0
  1200. package/dist/core/providers/mint.d.ts +29 -0
  1201. package/dist/core/providers/mint.js +219 -0
  1202. package/dist/core/providers/receipts.d.ts +26 -0
  1203. package/dist/core/providers/receipts.js +61 -0
  1204. package/dist/core/providers/request.d.ts +27 -0
  1205. package/dist/core/providers/request.js +173 -0
  1206. package/dist/core/providers/roots.d.ts +23 -0
  1207. package/dist/core/providers/roots.js +118 -0
  1208. package/dist/core/providers/token-cache.d.ts +54 -0
  1209. package/dist/core/providers/token-cache.js +203 -0
  1210. package/dist/core/remote-canvas-target.d.ts +4 -0
  1211. package/dist/core/remote-canvas-target.js +30 -0
  1212. package/dist/core/review/comments.d.ts +69 -0
  1213. package/dist/core/review/comments.js +296 -0
  1214. package/dist/core/review/companion.d.ts +33 -0
  1215. package/dist/core/review/companion.js +208 -0
  1216. package/dist/core/review/signal.d.ts +5 -0
  1217. package/dist/core/review/signal.js +12 -0
  1218. package/dist/core/review/store.d.ts +44 -0
  1219. package/dist/core/review/store.js +178 -0
  1220. package/dist/core/review/types.d.ts +139 -0
  1221. package/dist/core/review/types.js +23 -0
  1222. package/dist/core/runs/activity.d.ts +11 -0
  1223. package/dist/core/runs/activity.js +57 -0
  1224. package/dist/core/runs/events.d.ts +41 -0
  1225. package/dist/core/runs/events.js +179 -0
  1226. package/dist/core/runs/operations.d.ts +85 -0
  1227. package/dist/core/runs/operations.js +741 -0
  1228. package/dist/core/runs/questions.d.ts +80 -0
  1229. package/dist/core/runs/questions.js +151 -0
  1230. package/dist/core/runtime/banner.d.ts +15 -0
  1231. package/dist/core/runtime/banner.js +53 -0
  1232. package/dist/core/runtime/bearings-render.d.ts +62 -0
  1233. package/dist/core/runtime/bearings-render.js +272 -0
  1234. package/dist/core/runtime/bearings.d.ts +56 -0
  1235. package/dist/core/runtime/bearings.js +199 -0
  1236. package/dist/core/runtime/bin-contributions.d.ts +44 -0
  1237. package/dist/core/runtime/bin-contributions.js +186 -0
  1238. package/dist/core/runtime/blaxel-environment.d.ts +2 -0
  1239. package/dist/core/runtime/blaxel-environment.js +8 -0
  1240. package/dist/core/runtime/broker/bash-job-launch.d.ts +12 -0
  1241. package/dist/core/runtime/broker/bash-job-launch.js +50 -0
  1242. package/dist/core/runtime/broker/model-adapter.d.ts +27 -0
  1243. package/dist/core/runtime/broker/model-adapter.js +413 -0
  1244. package/dist/core/runtime/broker/read-ops.d.ts +27 -0
  1245. package/dist/core/runtime/broker/read-ops.js +172 -0
  1246. package/dist/core/runtime/broker/turn-cause.d.ts +7 -0
  1247. package/dist/core/runtime/broker/turn-cause.js +30 -0
  1248. package/dist/core/runtime/broker-protocol.d.ts +727 -0
  1249. package/dist/core/runtime/broker-protocol.js +152 -0
  1250. package/dist/core/runtime/broker-request.d.ts +37 -0
  1251. package/dist/core/runtime/broker-request.js +86 -0
  1252. package/dist/core/runtime/broker-sdk.d.ts +36 -0
  1253. package/dist/core/runtime/broker-sdk.js +130 -0
  1254. package/dist/core/runtime/canvas-extensions.d.ts +34 -0
  1255. package/dist/core/runtime/canvas-extensions.js +100 -0
  1256. package/dist/core/runtime/close.d.ts +49 -0
  1257. package/dist/core/runtime/close.js +266 -0
  1258. package/dist/core/runtime/command-expansion.d.ts +19 -0
  1259. package/dist/core/runtime/command-expansion.js +104 -0
  1260. package/dist/core/runtime/command-surface.d.ts +38 -0
  1261. package/dist/core/runtime/command-surface.js +117 -0
  1262. package/dist/core/runtime/crtr-theme.d.ts +12 -0
  1263. package/dist/core/runtime/crtr-theme.js +146 -0
  1264. package/dist/core/runtime/deliver-live.d.ts +38 -0
  1265. package/dist/core/runtime/deliver-live.js +87 -0
  1266. package/dist/core/runtime/fault-recovery.d.ts +23 -0
  1267. package/dist/core/runtime/fault-recovery.js +83 -0
  1268. package/dist/core/runtime/fault.d.ts +6 -0
  1269. package/dist/core/runtime/fault.js +17 -0
  1270. package/dist/core/runtime/fleet.d.ts +106 -0
  1271. package/dist/core/runtime/fleet.js +75 -0
  1272. package/dist/core/runtime/focus-viewer.d.ts +45 -0
  1273. package/dist/core/runtime/focus-viewer.js +151 -0
  1274. package/dist/core/runtime/front-door-env.d.ts +5 -0
  1275. package/dist/core/runtime/front-door-env.js +16 -0
  1276. package/dist/core/runtime/headless-pi.d.ts +37 -0
  1277. package/dist/core/runtime/headless-pi.js +173 -0
  1278. package/dist/core/runtime/host.d.ts +74 -0
  1279. package/dist/core/runtime/host.js +695 -0
  1280. package/dist/core/runtime/interactive-deliver.d.ts +22 -0
  1281. package/dist/core/runtime/interactive-deliver.js +51 -0
  1282. package/dist/core/runtime/invocation.d.ts +15 -0
  1283. package/dist/core/runtime/invocation.js +10 -0
  1284. package/dist/core/runtime/kickoff.d.ts +37 -0
  1285. package/dist/core/runtime/kickoff.js +263 -0
  1286. package/dist/core/runtime/launch-prompt.d.ts +8 -0
  1287. package/dist/core/runtime/launch-prompt.js +13 -0
  1288. package/dist/core/runtime/launch-target.d.ts +43 -0
  1289. package/dist/core/runtime/launch-target.js +83 -0
  1290. package/dist/core/runtime/launch.d.ts +206 -0
  1291. package/dist/core/runtime/launch.js +498 -0
  1292. package/dist/core/runtime/ledger.d.ts +10 -0
  1293. package/dist/core/runtime/ledger.js +55 -0
  1294. package/dist/core/runtime/lifecycle.d.ts +47 -0
  1295. package/dist/core/runtime/lifecycle.js +283 -0
  1296. package/dist/core/runtime/managed-provider-cooling.d.ts +24 -0
  1297. package/dist/core/runtime/managed-provider-cooling.js +62 -0
  1298. package/dist/core/runtime/memory-admission.d.ts +38 -0
  1299. package/dist/core/runtime/memory-admission.js +68 -0
  1300. package/dist/core/runtime/model-registry.d.ts +3 -0
  1301. package/dist/core/runtime/model-registry.js +13 -0
  1302. package/dist/core/runtime/model-selection.d.ts +54 -0
  1303. package/dist/core/runtime/model-selection.js +135 -0
  1304. package/dist/core/runtime/model-swap.d.ts +26 -0
  1305. package/dist/core/runtime/model-swap.js +75 -0
  1306. package/dist/core/runtime/naming.d.ts +69 -0
  1307. package/dist/core/runtime/naming.js +298 -0
  1308. package/dist/core/runtime/nerd-font.d.ts +46 -0
  1309. package/dist/core/runtime/nerd-font.js +162 -0
  1310. package/dist/core/runtime/nodes.d.ts +140 -0
  1311. package/dist/core/runtime/nodes.js +506 -0
  1312. package/dist/core/runtime/outcome-document.d.ts +58 -0
  1313. package/dist/core/runtime/outcome-document.js +86 -0
  1314. package/dist/core/runtime/output-result.d.ts +15 -0
  1315. package/dist/core/runtime/output-result.js +32 -0
  1316. package/dist/core/runtime/output-schema-refs.d.ts +3 -0
  1317. package/dist/core/runtime/output-schema-refs.js +100 -0
  1318. package/dist/core/runtime/package-health.d.ts +34 -0
  1319. package/dist/core/runtime/package-health.js +100 -0
  1320. package/dist/core/runtime/persona.d.ts +21 -0
  1321. package/dist/core/runtime/persona.js +54 -0
  1322. package/dist/core/runtime/pi-cli.d.ts +8 -0
  1323. package/dist/core/runtime/pi-cli.js +65 -0
  1324. package/dist/core/runtime/pi-vendored.d.ts +28 -0
  1325. package/dist/core/runtime/pi-vendored.js +63 -0
  1326. package/dist/core/runtime/placement-tmux.d.ts +32 -0
  1327. package/dist/core/runtime/placement-tmux.js +81 -0
  1328. package/dist/core/runtime/placement.d.ts +116 -0
  1329. package/dist/core/runtime/placement.js +418 -0
  1330. package/dist/core/runtime/progress-bar.d.ts +13 -0
  1331. package/dist/core/runtime/progress-bar.js +50 -0
  1332. package/dist/core/runtime/provider-credential-gate.d.ts +8 -0
  1333. package/dist/core/runtime/provider-credential-gate.js +33 -0
  1334. package/dist/core/runtime/recovery-hold.d.ts +21 -0
  1335. package/dist/core/runtime/recovery-hold.js +46 -0
  1336. package/dist/core/runtime/reopen.d.ts +49 -0
  1337. package/dist/core/runtime/reopen.js +160 -0
  1338. package/dist/core/runtime/revive.d.ts +114 -0
  1339. package/dist/core/runtime/revive.js +739 -0
  1340. package/dist/core/runtime/roadmap.d.ts +24 -0
  1341. package/dist/core/runtime/roadmap.js +86 -0
  1342. package/dist/core/runtime/runner/blaxel/client.d.ts +83 -0
  1343. package/dist/core/runtime/runner/blaxel/client.js +140 -0
  1344. package/dist/core/runtime/runner/blaxel/image-build.d.ts +74 -0
  1345. package/dist/core/runtime/runner/blaxel/image-build.js +209 -0
  1346. package/dist/core/runtime/runner/index.d.ts +9 -0
  1347. package/dist/core/runtime/runner/index.js +37 -0
  1348. package/dist/core/runtime/runner/machine/call.d.ts +8 -0
  1349. package/dist/core/runtime/runner/machine/call.js +67 -0
  1350. package/dist/core/runtime/runner/machine/environment.d.ts +1 -0
  1351. package/dist/core/runtime/runner/machine/environment.js +7 -0
  1352. package/dist/core/runtime/runner/machine/ops.d.ts +127 -0
  1353. package/dist/core/runtime/runner/machine/ops.js +41 -0
  1354. package/dist/core/runtime/runner/machine/runner.d.ts +12 -0
  1355. package/dist/core/runtime/runner/machine/runner.js +90 -0
  1356. package/dist/core/runtime/runner/process.d.ts +11 -0
  1357. package/dist/core/runtime/runner/process.js +70 -0
  1358. package/dist/core/runtime/runner/types.d.ts +101 -0
  1359. package/dist/core/runtime/runner/types.js +16 -0
  1360. package/dist/core/runtime/session-branch.d.ts +7 -0
  1361. package/dist/core/runtime/session-branch.js +16 -0
  1362. package/dist/core/runtime/session-cycles.d.ts +45 -0
  1363. package/dist/core/runtime/session-cycles.js +110 -0
  1364. package/dist/core/runtime/session-list-cache.d.ts +37 -0
  1365. package/dist/core/runtime/session-list-cache.js +302 -0
  1366. package/dist/core/runtime/session-visibility.d.ts +37 -0
  1367. package/dist/core/runtime/session-visibility.js +99 -0
  1368. package/dist/core/runtime/setup-marker.d.ts +8 -0
  1369. package/dist/core/runtime/setup-marker.js +46 -0
  1370. package/dist/core/runtime/situational-context.d.ts +16 -0
  1371. package/dist/core/runtime/situational-context.js +54 -0
  1372. package/dist/core/runtime/situational-live.d.ts +9 -0
  1373. package/dist/core/runtime/situational-live.js +41 -0
  1374. package/dist/core/runtime/spawn-env-rows.d.ts +5 -0
  1375. package/dist/core/runtime/spawn-env-rows.js +15 -0
  1376. package/dist/core/runtime/spawn-env.d.ts +40 -0
  1377. package/dist/core/runtime/spawn-env.js +260 -0
  1378. package/dist/core/runtime/spawn.d.ts +160 -0
  1379. package/dist/core/runtime/spawn.js +699 -0
  1380. package/dist/core/runtime/stamp/protocol.d.ts +90 -0
  1381. package/dist/core/runtime/stamp/protocol.js +113 -0
  1382. package/dist/core/runtime/start-check.d.ts +15 -0
  1383. package/dist/core/runtime/start-check.js +31 -0
  1384. package/dist/core/runtime/stop-guard.d.ts +31 -0
  1385. package/dist/core/runtime/stop-guard.js +150 -0
  1386. package/dist/core/runtime/structured-output.d.ts +36 -0
  1387. package/dist/core/runtime/structured-output.js +112 -0
  1388. package/dist/core/runtime/surface-bg.d.ts +13 -0
  1389. package/dist/core/runtime/surface-bg.js +85 -0
  1390. package/dist/core/runtime/tmux-bindings.d.ts +30 -0
  1391. package/dist/core/runtime/tmux-bindings.js +743 -0
  1392. package/dist/core/runtime/tmux-chrome.d.ts +2 -0
  1393. package/dist/core/runtime/tmux-chrome.js +5 -0
  1394. package/dist/core/runtime/tmux-driver.d.ts +328 -0
  1395. package/dist/core/runtime/tmux-driver.js +713 -0
  1396. package/dist/core/runtime/unsandboxed.d.ts +3 -0
  1397. package/dist/core/runtime/unsandboxed.js +16 -0
  1398. package/dist/core/runtime/view-socket.d.ts +61 -0
  1399. package/dist/core/runtime/view-socket.js +194 -0
  1400. package/dist/core/runtime/warm-pool.d.ts +79 -0
  1401. package/dist/core/runtime/warm-pool.js +473 -0
  1402. package/dist/core/scoped-state/db.d.ts +17 -0
  1403. package/dist/core/scoped-state/db.js +261 -0
  1404. package/dist/core/scoped-state/legacy-profiles.d.ts +11 -0
  1405. package/dist/core/scoped-state/legacy-profiles.js +61 -0
  1406. package/dist/core/scoped-state/migrate.d.ts +15 -0
  1407. package/dist/core/scoped-state/migrate.js +332 -0
  1408. package/dist/core/scoped-state/person-rows.d.ts +10 -0
  1409. package/dist/core/scoped-state/person-rows.js +173 -0
  1410. package/dist/core/scoped-state/schema.d.ts +10 -0
  1411. package/dist/core/scoped-state/schema.js +47 -0
  1412. package/dist/core/scopes.d.ts +20 -0
  1413. package/dist/core/scopes.js +48 -0
  1414. package/dist/core/secrets/env-rows.d.ts +18 -0
  1415. package/dist/core/secrets/env-rows.js +40 -0
  1416. package/dist/core/secrets/environment-owner.d.ts +8 -0
  1417. package/dist/core/secrets/environment-owner.js +31 -0
  1418. package/dist/core/secrets/environment-secrets.d.ts +14 -0
  1419. package/dist/core/secrets/environment-secrets.js +14 -0
  1420. package/dist/core/secrets/index.d.ts +2 -0
  1421. package/dist/core/secrets/index.js +2 -0
  1422. package/dist/core/secrets/key.d.ts +3 -0
  1423. package/dist/core/secrets/key.js +33 -0
  1424. package/dist/core/secrets/seal.d.ts +18 -0
  1425. package/dist/core/secrets/seal.js +43 -0
  1426. package/dist/core/secrets.d.ts +50 -0
  1427. package/dist/core/secrets.js +147 -0
  1428. package/dist/core/self-update.d.ts +27 -0
  1429. package/dist/core/self-update.js +77 -0
  1430. package/dist/core/session-model/session-state.d.ts +53 -0
  1431. package/dist/core/session-model/session-state.js +180 -0
  1432. package/dist/core/shell-segments.d.ts +42 -0
  1433. package/dist/core/shell-segments.js +169 -0
  1434. package/dist/core/spaces/cache-env.d.ts +2 -0
  1435. package/dist/core/spaces/cache-env.js +15 -0
  1436. package/dist/core/spaces/file-root.d.ts +23 -0
  1437. package/dist/core/spaces/file-root.js +68 -0
  1438. package/dist/core/spaces/mounts.d.ts +41 -0
  1439. package/dist/core/spaces/mounts.js +126 -0
  1440. package/dist/core/spaces/permissions.d.ts +19 -0
  1441. package/dist/core/spaces/permissions.js +77 -0
  1442. package/dist/core/spaces/process.d.ts +61 -0
  1443. package/dist/core/spaces/process.js +172 -0
  1444. package/dist/core/spaces/runtime-home.d.ts +5 -0
  1445. package/dist/core/spaces/runtime-home.js +8 -0
  1446. package/dist/core/spaces/space.d.ts +9 -0
  1447. package/dist/core/spaces/space.js +58 -0
  1448. package/dist/core/spaces/stop.d.ts +24 -0
  1449. package/dist/core/spaces/stop.js +138 -0
  1450. package/dist/core/spaces/users.d.ts +20 -0
  1451. package/dist/core/spaces/users.js +43 -0
  1452. package/dist/core/sqlite-statements.d.ts +4 -0
  1453. package/dist/core/sqlite-statements.js +17 -0
  1454. package/dist/core/statements.d.ts +17 -0
  1455. package/dist/core/statements.js +81 -0
  1456. package/dist/core/storage/attachments.d.ts +36 -0
  1457. package/dist/core/storage/attachments.js +135 -0
  1458. package/dist/core/storage/client.d.ts +109 -0
  1459. package/dist/core/storage/client.js +231 -0
  1460. package/dist/core/storage/download.d.ts +24 -0
  1461. package/dist/core/storage/download.js +184 -0
  1462. package/dist/core/storage/purge.d.ts +6 -0
  1463. package/dist/core/storage/purge.js +52 -0
  1464. package/dist/core/storage/tables.d.ts +67 -0
  1465. package/dist/core/storage/tables.js +109 -0
  1466. package/dist/core/subscription-state.d.ts +96 -0
  1467. package/dist/core/subscription-state.js +438 -0
  1468. package/dist/core/substrate/delivery/corpus.d.ts +26 -0
  1469. package/dist/core/substrate/delivery/corpus.js +138 -0
  1470. package/dist/core/substrate/delivery/deliver.d.ts +71 -0
  1471. package/dist/core/substrate/delivery/deliver.js +333 -0
  1472. package/dist/core/substrate/delivery/listings.d.ts +30 -0
  1473. package/dist/core/substrate/delivery/listings.js +75 -0
  1474. package/dist/core/substrate/delivery/match.d.ts +28 -0
  1475. package/dist/core/substrate/delivery/match.js +146 -0
  1476. package/dist/core/substrate/delivery/plan.d.ts +57 -0
  1477. package/dist/core/substrate/delivery/plan.js +126 -0
  1478. package/dist/core/substrate/delivery/render-boot.d.ts +20 -0
  1479. package/dist/core/substrate/delivery/render-boot.js +329 -0
  1480. package/dist/core/substrate/delivery/render-event.d.ts +47 -0
  1481. package/dist/core/substrate/delivery/render-event.js +160 -0
  1482. package/dist/core/substrate/delivery/sub-persona-menu.d.ts +2 -0
  1483. package/dist/core/substrate/delivery/sub-persona-menu.js +24 -0
  1484. package/dist/core/substrate/delivery/types.d.ts +30 -0
  1485. package/dist/core/substrate/delivery/types.js +1 -0
  1486. package/dist/core/substrate/gate-explain.d.ts +35 -0
  1487. package/dist/core/substrate/gate-explain.js +397 -0
  1488. package/dist/core/substrate/schema.d.ts +29 -0
  1489. package/dist/core/substrate/schema.js +81 -0
  1490. package/dist/core/substrate/subject-fields.d.ts +52 -0
  1491. package/dist/core/substrate/subject-fields.js +39 -0
  1492. package/dist/core/substrate/subject.d.ts +13 -0
  1493. package/dist/core/substrate/subject.js +60 -0
  1494. package/dist/core/termrender/code-doc.d.ts +12 -0
  1495. package/dist/core/termrender/code-doc.js +92 -0
  1496. package/dist/core/termrender/display.d.ts +16 -0
  1497. package/dist/core/termrender/display.js +56 -0
  1498. package/dist/core/termrender/termrender.d.ts +71 -0
  1499. package/dist/core/termrender/termrender.js +719 -0
  1500. package/dist/core/termrender/version.d.ts +1 -0
  1501. package/dist/core/termrender/version.js +1 -0
  1502. package/dist/core/timing.d.ts +11 -0
  1503. package/dist/core/timing.js +94 -0
  1504. package/dist/core/tui/draw.d.ts +103 -0
  1505. package/dist/core/tui/draw.js +378 -0
  1506. package/dist/core/tui/fuzzy.d.ts +9 -0
  1507. package/dist/core/tui/fuzzy.js +38 -0
  1508. package/dist/core/tui/markdown.d.ts +17 -0
  1509. package/dist/core/tui/markdown.js +407 -0
  1510. package/dist/core/tui/page-host.d.ts +31 -0
  1511. package/dist/core/tui/page-host.js +74 -0
  1512. package/dist/core/tui/panel.d.ts +45 -0
  1513. package/dist/core/tui/panel.js +142 -0
  1514. package/dist/core/tui/terminal.d.ts +23 -0
  1515. package/dist/core/tui/terminal.js +100 -0
  1516. package/dist/core/wake.d.ts +89 -0
  1517. package/dist/core/wake.js +296 -0
  1518. package/dist/core/worktree-containment.d.ts +14 -0
  1519. package/dist/core/worktree-containment.js +48 -0
  1520. package/dist/core/worktree-landing.d.ts +44 -0
  1521. package/dist/core/worktree-landing.js +56 -0
  1522. package/dist/core/worktree-mutation-async.d.ts +23 -0
  1523. package/dist/core/worktree-mutation-async.js +335 -0
  1524. package/dist/core/worktree-remove.d.ts +15 -0
  1525. package/dist/core/worktree-remove.js +84 -0
  1526. package/dist/core/worktree.d.ts +121 -0
  1527. package/dist/core/worktree.js +909 -0
  1528. package/dist/daemon/api/deferred-head.d.ts +14 -0
  1529. package/dist/daemon/api/deferred-head.js +117 -0
  1530. package/dist/daemon/api/environment-of.d.ts +18 -0
  1531. package/dist/daemon/api/environment-of.js +40 -0
  1532. package/dist/daemon/api/handlers/git-credential.d.ts +11 -0
  1533. package/dist/daemon/api/handlers/git-credential.js +64 -0
  1534. package/dist/daemon/api/handlers/providers.d.ts +83 -0
  1535. package/dist/daemon/api/handlers/providers.js +283 -0
  1536. package/dist/daemon/api/handlers/validate.d.ts +23 -0
  1537. package/dist/daemon/api/handlers/validate.js +58 -0
  1538. package/dist/daemon/api/map.d.ts +167 -0
  1539. package/dist/daemon/api/map.js +764 -0
  1540. package/dist/daemon/api/operations.d.ts +18 -0
  1541. package/dist/daemon/api/operations.js +306 -0
  1542. package/dist/daemon/api/principal.d.ts +65 -0
  1543. package/dist/daemon/api/principal.js +143 -0
  1544. package/dist/daemon/api/reader.d.ts +24 -0
  1545. package/dist/daemon/api/reader.js +123 -0
  1546. package/dist/daemon/api/router.d.ts +193 -0
  1547. package/dist/daemon/api/router.js +536 -0
  1548. package/dist/daemon/api/sync-notice.d.ts +17 -0
  1549. package/dist/daemon/api/sync-notice.js +46 -0
  1550. package/dist/daemon/api/viewer-presence.d.ts +20 -0
  1551. package/dist/daemon/api/viewer-presence.js +100 -0
  1552. package/dist/daemon/broker-signals/bus.d.ts +3 -2
  1553. package/dist/daemon/broker-signals/bus.js +3 -2
  1554. package/dist/daemon/companion-retire.d.ts +4 -0
  1555. package/dist/daemon/companion-retire.js +44 -0
  1556. package/dist/daemon/control.d.ts +40 -0
  1557. package/dist/daemon/control.js +22 -0
  1558. package/dist/daemon/cron/authority.d.ts +38 -0
  1559. package/dist/daemon/cron/authority.js +90 -0
  1560. package/dist/daemon/cron/live-runs.d.ts +54 -0
  1561. package/dist/daemon/cron/live-runs.js +66 -0
  1562. package/dist/daemon/cron/run-socket.d.ts +30 -0
  1563. package/dist/daemon/cron/run-socket.js +170 -0
  1564. package/dist/daemon/drain.d.ts +25 -0
  1565. package/dist/daemon/drain.js +76 -0
  1566. package/dist/daemon/human/finish.d.ts +24 -0
  1567. package/dist/daemon/human/finish.js +178 -0
  1568. package/dist/daemon/human/settle.d.ts +44 -0
  1569. package/dist/daemon/human/settle.js +103 -0
  1570. package/dist/daemon/machine-link/config.d.ts +45 -0
  1571. package/dist/daemon/machine-link/config.js +63 -0
  1572. package/dist/daemon/machine-link/credential.d.ts +7 -0
  1573. package/dist/daemon/machine-link/credential.js +24 -0
  1574. package/dist/daemon/machine-link/forward.d.ts +16 -0
  1575. package/dist/daemon/machine-link/forward.js +181 -0
  1576. package/dist/daemon/machine-link/frames.d.ts +49 -0
  1577. package/dist/daemon/machine-link/frames.js +25 -0
  1578. package/dist/daemon/machine-link/holder.d.ts +73 -0
  1579. package/dist/daemon/machine-link/holder.js +272 -0
  1580. package/dist/daemon/machine-link/move-notify.d.ts +4 -0
  1581. package/dist/daemon/machine-link/move-notify.js +15 -0
  1582. package/dist/daemon/manage.d.ts +19 -3
  1583. package/dist/daemon/manage.js +21 -6
  1584. package/dist/daemon/park-activity.d.ts +10 -0
  1585. package/dist/daemon/park-activity.js +33 -0
  1586. package/dist/daemon/park-pending.d.ts +25 -0
  1587. package/dist/daemon/park-pending.js +76 -0
  1588. package/dist/daemon/postgres/binary.d.ts +17 -0
  1589. package/dist/daemon/postgres/binary.js +193 -0
  1590. package/dist/daemon/postgres/cluster.d.ts +37 -0
  1591. package/dist/daemon/postgres/cluster.js +111 -0
  1592. package/dist/daemon/postgres/pins.d.ts +7 -0
  1593. package/dist/daemon/postgres/pins.js +16 -0
  1594. package/dist/daemon/postgres/supervisor.d.ts +95 -0
  1595. package/dist/daemon/postgres/supervisor.js +177 -0
  1596. package/dist/daemon/readiness.d.ts +11 -0
  1597. package/dist/daemon/readiness.js +37 -0
  1598. package/dist/daemon/reconcilers/broker-supervision.d.ts +112 -0
  1599. package/dist/daemon/reconcilers/broker-supervision.js +842 -0
  1600. package/dist/daemon/reconcilers/ledger-sandbox.d.ts +54 -0
  1601. package/dist/daemon/reconcilers/ledger-sandbox.js +249 -0
  1602. package/dist/daemon/reconcilers/live-obligation.d.ts +77 -0
  1603. package/dist/daemon/reconcilers/live-obligation.js +114 -0
  1604. package/dist/daemon/reconcilers/node-lifecycle/launch-failure.d.ts +1 -0
  1605. package/dist/daemon/reconcilers/node-lifecycle/launch-failure.js +8 -0
  1606. package/dist/daemon/reconcilers/node-lifecycle/node-person.d.ts +9 -0
  1607. package/dist/daemon/reconcilers/node-lifecycle/node-person.js +40 -0
  1608. package/dist/daemon/reconcilers/node-lifecycle/remote-wake.d.ts +32 -0
  1609. package/dist/daemon/reconcilers/node-lifecycle/remote-wake.js +124 -0
  1610. package/dist/daemon/reconcilers/recipe-image.d.ts +49 -0
  1611. package/dist/daemon/reconcilers/recipe-image.js +145 -0
  1612. package/dist/daemon/reconcilers/throttled-lane.d.ts +11 -0
  1613. package/dist/daemon/reconcilers/throttled-lane.js +63 -0
  1614. package/dist/daemon/runs/append-section.d.ts +9 -0
  1615. package/dist/daemon/runs/append-section.js +135 -0
  1616. package/dist/daemon/runs/observer.d.ts +17 -0
  1617. package/dist/daemon/runs/observer.js +441 -0
  1618. package/dist/daemon/runs/view-transport.d.ts +19 -0
  1619. package/dist/daemon/runs/view-transport.js +81 -0
  1620. package/dist/daemon/structured-requests/sidecar.d.ts +4 -0
  1621. package/dist/daemon/structured-requests/sidecar.js +5 -0
  1622. package/dist/hook-authoring.d.ts +130 -0
  1623. package/dist/hook-authoring.js +447 -0
  1624. package/dist/hook-process.d.ts +7 -0
  1625. package/dist/hook-process.js +34 -0
  1626. package/dist/launcher/client.d.ts +6 -0
  1627. package/dist/launcher/client.js +52 -0
  1628. package/dist/launcher/limits/policy.d.ts +141 -0
  1629. package/dist/launcher/limits/policy.js +142 -0
  1630. package/dist/launcher/limits/settings.d.ts +19 -0
  1631. package/dist/launcher/limits/settings.js +94 -0
  1632. package/dist/launcher/spec.d.ts +181 -0
  1633. package/dist/launcher/spec.js +10 -0
  1634. package/dist/migrations/004-canvas-documents/apply.d.ts +8 -0
  1635. package/dist/migrations/004-canvas-documents/apply.js +113 -0
  1636. package/dist/migrations/004-canvas-documents/fields.d.ts +24 -0
  1637. package/dist/migrations/004-canvas-documents/fields.js +52 -0
  1638. package/dist/migrations/004-canvas-documents/index.d.ts +16 -0
  1639. package/dist/migrations/004-canvas-documents/index.js +88 -0
  1640. package/dist/migrations/004-canvas-documents/legacy/discover.d.ts +16 -0
  1641. package/dist/migrations/004-canvas-documents/legacy/discover.js +251 -0
  1642. package/dist/migrations/004-canvas-documents/legacy/history.d.ts +5 -0
  1643. package/dist/migrations/004-canvas-documents/legacy/history.js +37 -0
  1644. package/dist/migrations/004-canvas-documents/legacy/nested.d.ts +7 -0
  1645. package/dist/migrations/004-canvas-documents/legacy/nested.js +37 -0
  1646. package/dist/migrations/004-canvas-documents/legacy/parse.d.ts +14 -0
  1647. package/dist/migrations/004-canvas-documents/legacy/parse.js +24 -0
  1648. package/dist/migrations/004-canvas-documents/legacy/types.d.ts +91 -0
  1649. package/dist/migrations/004-canvas-documents/legacy/types.js +3 -0
  1650. package/dist/migrations/004-canvas-documents/plan.d.ts +102 -0
  1651. package/dist/migrations/004-canvas-documents/plan.js +410 -0
  1652. package/dist/migrations/004-canvas-documents/pointers.d.ts +23 -0
  1653. package/dist/migrations/004-canvas-documents/pointers.js +95 -0
  1654. package/dist/migrations/activation.d.ts +17 -0
  1655. package/dist/migrations/activation.js +46 -0
  1656. package/dist/shared/crtr-version.d.ts +2 -0
  1657. package/dist/shared/crtr-version.js +18 -0
  1658. package/dist/shared/inbox-entry-body.js +6 -2
  1659. package/dist/shared/inline-ref-grammar.d.ts +53 -0
  1660. package/dist/shared/inline-ref-grammar.js +99 -0
  1661. package/dist/shared/shell-quote.d.ts +3 -0
  1662. package/dist/shared/shell-quote.js +5 -0
  1663. package/dist/shared/strip-cd-prefix.d.ts +1 -0
  1664. package/dist/shared/strip-cd-prefix.js +13 -0
  1665. package/dist/shared/tool-groups.d.ts +26 -0
  1666. package/dist/shared/tool-groups.js +64 -0
  1667. package/dist/shared/traceparent.d.ts +6 -0
  1668. package/dist/shared/traceparent.js +28 -0
  1669. package/dist/shared/turn-replies.d.ts +27 -0
  1670. package/dist/shared/turn-replies.js +71 -0
  1671. package/package.json +1 -1
@@ -0,0 +1,1206 @@
1
+ // The canvas data-access layer. Nodes, their sessions, executions, and managed
2
+ // worktrees are SQL-authoritative. Node directories hold only artifacts.
3
+ import { envNodeId } from '../../shared/env.js';
4
+ import { lstatSync, realpathSync, rmdirSync, rmSync, statSync } from 'node:fs';
5
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
6
+ import { removeTreeBeneath } from '../spaces/open-beneath.js';
7
+ import { emitEvent } from '../events/emit.js';
8
+ import { withCanvasWrite, openDb } from './db.js';
9
+ import { conversationStore, ConversationNotFoundError } from '../conversation-store/index.js';
10
+ import { hasUnseenWakeMail, UNSEEN_WAKE_MAIL_SQL } from './deliveries.js';
11
+ import { isAppRun } from './app-run.js';
12
+ import { registerOutcomeAction } from './outcome-actions.js';
13
+ import { publish } from '../graph/events.js';
14
+ import { nodeObject } from '../graph/objects.js';
15
+ import { findNodeBySessionFileSql } from './sessions.js';
16
+ import { hydrateFault } from './recovery.js';
17
+ import { hasUnreconciledWorktree, openWorktree, readWorktree, worktreeFromRow } from './worktrees.js';
18
+ import { isPidAlive, isPidPresent, recordedPidLiveness } from './pid.js';
19
+ import { ensureHome, jobDir, nodeDir, nodeRunDir } from './paths.js';
20
+ import { appForNode, ensureNodeDirs, nodeAgentDir } from './node-agent-paths.js';
21
+ import { appSpace } from '../layout.js';
22
+ import { createObject, getById, ownerForGrantee, setObjectKind, setObjectName } from '../graph/objects.js';
23
+ import { profileObject } from '../graph/reader.js';
24
+ import { writeActsFor } from '../permissions/facts.js';
25
+ import { CrtrError } from '../errors.js';
26
+ import { deleteNodeWithOwned } from '../graph/deletion.js';
27
+ import { SUBTREE_ALL_IDS_SQL, SUBTREE_IDS_SQL } from './tree.js';
28
+ import { filterAsync, mapAsync } from '../async-array.js';
29
+ function jsonValue(value, field) {
30
+ if (value === undefined || value === null)
31
+ return null;
32
+ const encoded = JSON.stringify(value);
33
+ if (encoded === undefined)
34
+ throw new TypeError(`${field} must be JSON-serializable`);
35
+ return encoded;
36
+ }
37
+ export async function assertRunNotDeleting(db, runId) {
38
+ if ((await db.prepare('SELECT deleting_at FROM nodes WHERE node_id = ?').get(runId))?.deleting_at)
39
+ throw new Error('run is deleting');
40
+ }
41
+ /** The profile's object (made on first use), or null when the profile has no stored manifest to name one from. */
42
+ async function profileObjectFor(db, profileId, app) {
43
+ try {
44
+ return await profileObject(db, profileId, app);
45
+ }
46
+ catch (e) {
47
+ if (e instanceof CrtrError && e.code === 'not_found')
48
+ return null;
49
+ throw e;
50
+ }
51
+ }
52
+ async function seedRow(meta, db) {
53
+ const app = await ownerForGrantee(db, meta.grantee ?? 'app:terminal');
54
+ // The node sits under its profile's object when it has one; otherwise directly under its app.
55
+ const profile = meta.profile_id ? await profileObjectFor(db, meta.profile_id, app) : null;
56
+ await createObject(db, { id: meta.node_id, type: 'node', kind: meta.kind, owner: (profile ?? app).id, privacy: 'public', name: meta.name, preview: '' });
57
+ // A node directly under an app is readable by the person it was made for.
58
+ if (profile === null && meta.sub)
59
+ await writeActsFor(db, meta.node_id, meta.sub);
60
+ await db.prepare(`INSERT INTO nodes (node_id, description, title, icon, cycles, mode, lifecycle, cwd, host_kind, profile_id, parent, spawned_by, creator, fork_from, fork_source_file, created, passive_default, cycle_pending, model_override, persona_ack_json, review_binding_json, launch_config_json, scopes_json, isolated, status, intent, final_report, finalized_at, deadline_at, "window", tmux_session, pane, sub, grant_id, client_id, metadata_json, run_id, event_cursor, usage_json, deleting_at, caused_by, app) VALUES (${Array(42).fill('?').join(', ')})`)
61
+ .run(meta.node_id, meta.description ?? null, meta.title ?? null, meta.icon ?? null, meta.cycles ?? null, meta.mode, meta.lifecycle, meta.cwd, meta.host_kind ?? null, meta.profile_id ?? null, meta.parent ?? null, meta.spawned_by ?? null, meta.creator ?? null, meta.fork_from ?? null, meta.fork_source_file ?? null, meta.created, meta.passive_default === true ? 1 : 0, meta.cycle_pending === true ? 1 : 0, meta.model_override ?? null, jsonValue(meta.persona_ack, 'persona_ack'), jsonValue(meta.review_binding, 'review_binding'), jsonValue(meta.launch, 'launch'), jsonValue(meta.scopes, 'scopes'), meta.isolated === true ? 1 : 0, meta.status ?? 'active', meta.intent ?? null, meta.final_report ?? null, meta.finalized_at ?? null, meta.deadline_at ?? null, meta.window ?? null, meta.tmux_session ?? null, meta.pane ?? null, meta.sub ?? null, meta.grant_id ?? null, meta.client_id ?? null, meta.metadata_json ?? null, meta.run_id ?? null, meta.event_cursor ?? null, meta.usage_json ?? null, meta.deleting_at ?? null, meta.caused_by ?? null, app.id);
62
+ }
63
+ /** The `node_rows` view projects the active fault's columns under a `fault_`
64
+ * prefix; strip it and hydrate through the same mapper `readFault` uses. */
65
+ function faultFrom(r) {
66
+ if (r['fault_id'] == null)
67
+ return null;
68
+ const columns = Object.entries(r).filter(([key]) => key.startsWith('fault_')).map(([key, value]) => [key === 'fault_id' ? key : key.slice('fault_'.length), value]);
69
+ return hydrateFault(Object.fromEntries(columns));
70
+ }
71
+ function rowFrom(r) {
72
+ const node = {
73
+ node_id: r['node_id'],
74
+ name: r['name'],
75
+ description: r['description'] ?? undefined,
76
+ cycles: r['cycles'] ?? undefined,
77
+ kind: r['kind'],
78
+ mode: r['mode'],
79
+ lifecycle: r['lifecycle'],
80
+ status: r['status'],
81
+ cwd: r['cwd'],
82
+ host_kind: r['host_kind'] ?? null,
83
+ profile_id: r['profile_id'] ?? null,
84
+ scopes: r['scopes_json'] == null ? null : JSON.parse(r['scopes_json']),
85
+ isolated: r['isolated'] === 1,
86
+ grantee: r['grantee'],
87
+ sub: r['sub'] ?? null,
88
+ grant_id: r['grant_id'] ?? null,
89
+ client_id: r['client_id'] ?? null,
90
+ metadata_json: r['metadata_json'] ?? null,
91
+ run_id: r['run_id'] ?? null,
92
+ event_cursor: r['event_cursor'] ?? null,
93
+ last_activity_at: r['last_activity_at'] ?? null,
94
+ usage_json: r['usage_json'] ?? null,
95
+ caused_by: r['caused_by'] ?? null,
96
+ last_turn_error_json: r['last_turn_error_json'] ?? null,
97
+ deleting_at: r['deleting_at'] ?? null,
98
+ parent: r['parent'] ?? null,
99
+ created: r['created'],
100
+ intent: r['intent'] ?? null,
101
+ frozen_at: r['frozen_at'] ?? null,
102
+ respawn_failures: r['respawn_failures'] ?? 0,
103
+ respawn_not_before: r['respawn_not_before'] ?? null,
104
+ launched_at: r['launched_at'] ?? null,
105
+ last_settled_at: r['last_settled_at'] ?? null,
106
+ terminal_reason: r['terminal_reason'] ?? null,
107
+ final_report: r['final_report'] ?? null,
108
+ finalized_at: r['finalized_at'] ?? null,
109
+ outcome_kind: r['outcome_kind'] ?? null,
110
+ outcome_reason: r['outcome_reason'] ?? null,
111
+ outcome_at: r['outcome_at'] ?? null,
112
+ outcome_revision: r['outcome_revision'] ?? 0,
113
+ outcome_detail_json: r['outcome_detail_json'] ?? null,
114
+ deadline_at: r['deadline_at'] ?? null,
115
+ telemetry_tokens_in: r['telemetry_tokens_in'] ?? null,
116
+ telemetry_context_tokens: r['telemetry_context_tokens'] ?? null,
117
+ telemetry_last_activity: r['telemetry_last_activity'] ?? null,
118
+ telemetry_updated_at: r['telemetry_updated_at'] ?? null,
119
+ pi_pid: r['pi_pid'] ?? null,
120
+ pi_pid_identity: r['pi_pid_identity'] ?? null,
121
+ window: r['window'] ?? null,
122
+ tmux_session: r['tmux_session'] ?? null,
123
+ pane: r['pane'] ?? null,
124
+ fault: null,
125
+ streaming: false,
126
+ };
127
+ const pidAlive = isPidPresent(node.pi_pid);
128
+ const fault = faultFrom(r);
129
+ node.fault = fault?.link === 'pi→provider' && fault.retry.by === 'daemon' && fault.retry.disposition === 'auto' && !pidAlive
130
+ ? null
131
+ : fault;
132
+ node.streaming = r['turn_open_at'] !== null && r['turn_closed_at'] === null && pidAlive;
133
+ return node;
134
+ }
135
+ async function metaFrom(r, worktree) {
136
+ worktree ??= await readWorktree(r['node_id']);
137
+ return {
138
+ ...rowFrom(r),
139
+ title: r['title'] ?? undefined,
140
+ icon: r['icon'] ?? undefined,
141
+ spawned_by: r['spawned_by'] ?? null,
142
+ creator: r['creator'] ?? null,
143
+ fork_from: r['fork_from'] ?? null,
144
+ fork_source_file: r['fork_source_file'] ?? null,
145
+ passive_default: r['passive_default'] === 1,
146
+ cycle_pending: r['cycle_pending'] === 1,
147
+ model_override: r['model_override'] ?? null,
148
+ scopes: r['scopes_json'] == null ? null : JSON.parse(r['scopes_json']),
149
+ persona_ack: r['persona_ack_json'] == null ? undefined : JSON.parse(r['persona_ack_json']),
150
+ review_binding: r['review_binding_json'] == null ? undefined : JSON.parse(r['review_binding_json']),
151
+ launch: r['launch_config_json'] == null ? undefined : JSON.parse(r['launch_config_json']),
152
+ pi_session_id: r['pi_session_id'] ?? null,
153
+ pi_session_file: r['pi_session_file'] ?? null,
154
+ ...(worktree === null ? {} : { managed_worktree: worktree }),
155
+ };
156
+ }
157
+ // Nodes
158
+ /** Create a SQL-authoritative node, then ensure its artifact directories exist. */
159
+ export async function createNode(meta, opts = {}) {
160
+ ensureHome();
161
+ await withCanvasWrite(async (db) => {
162
+ await seedRow(meta, db);
163
+ if (meta.managed_worktree !== undefined && meta.managed_worktree !== null)
164
+ await openWorktree(meta.node_id, meta.managed_worktree, db);
165
+ if (opts.outcomeDelivery !== undefined)
166
+ await registerOutcomeAction(db, meta.node_id, opts.outcomeDelivery);
167
+ await opts.withinCreate?.(db, meta);
168
+ });
169
+ await ensureNodeDirs(meta.node_id);
170
+ return await getNode(meta.node_id);
171
+ }
172
+ /** The canonical node record, hydrated from SQL. Null if unknown. */
173
+ export async function getNode(nodeId) {
174
+ const row = await (await openDb()).prepare('SELECT * FROM node_rows WHERE node_id = ?').get(nodeId);
175
+ if (row === undefined)
176
+ return null;
177
+ return await metaFrom(row);
178
+ }
179
+ /** The canonical node records for `nodeIds` in the order given, read with their worktrees in one query. Unknown ids are skipped. */
180
+ export async function getNodes(nodeIds) {
181
+ if (nodeIds.length === 0)
182
+ return [];
183
+ const worktreeProjection = WORKTREE_COLUMNS.map((column) => `w.${column} AS worktree_${column}`).join(', ');
184
+ const rows = await (await openDb())
185
+ .prepareUncached(`SELECT n.*, ${worktreeProjection} FROM node_rows n LEFT JOIN worktrees w ON w.node_id = n.node_id WHERE n.node_id IN (${nodeIds.map(() => '?').join(',')})`)
186
+ .all(...nodeIds);
187
+ const byId = new Map(rows.map((row) => [row['node_id'], row]));
188
+ return await mapAsync(nodeIds.map((id) => byId.get(id)).filter((row) => row !== undefined), async (row) => await metaFrom(row, worktreeFromProjection(row)));
189
+ }
190
+ const CREATE_REQUEST_TTL_MS = 24 * 60 * 60 * 1000;
191
+ function createRequestRecord(row) {
192
+ return { requestKey: row.request_key, nodeId: row.node_id, state: row.state };
193
+ }
194
+ export async function findCreateRequest(requestKey) {
195
+ const existing = await (await openDb()).prepareUncached('SELECT request_key, node_id, state FROM create_requests WHERE request_key = ?').get(requestKey);
196
+ return existing === undefined ? null : createRequestRecord(existing);
197
+ }
198
+ /** Reserve an idempotency key before creation. A null node id means the request
199
+ * has not yet selected a cold-birth identity or claimed a warm spare. */
200
+ export async function reserveCreateRequest(requestKey) {
201
+ return await withCanvasWrite(async (db) => {
202
+ const now = Date.now();
203
+ await db.prepareUncached('DELETE FROM create_requests WHERE expires_at <= ?').run(now);
204
+ // One atomic claim: a concurrent reservation of the same key (another process) waits on the first insert, does nothing,
205
+ // and then reads the row that won.
206
+ await db.prepareUncached("INSERT INTO create_requests (request_key, node_id, expires_at, state) VALUES (?, NULL, ?, 'reserved') ON CONFLICT (request_key) DO NOTHING")
207
+ .run(requestKey, now + CREATE_REQUEST_TTL_MS);
208
+ const winner = await db.prepareUncached('SELECT request_key, node_id, state FROM create_requests WHERE request_key = ?').get(requestKey);
209
+ return createRequestRecord(winner);
210
+ });
211
+ }
212
+ /** Delete keys past their recovery window; returns how many were removed. */
213
+ export async function pruneExpiredCreateRequests(now = Date.now()) {
214
+ return Number((await (await openDb()).prepareUncached('DELETE FROM create_requests WHERE expires_at <= ?').run(now)).changes);
215
+ }
216
+ /** Bind a reserved key to the node it created (state `complete`). The mapping is
217
+ * durable so a retry after a daemon handover returns the original node. */
218
+ export async function recordCreateRequestNode(requestKey, nodeId) {
219
+ await (await openDb()).prepareUncached("UPDATE create_requests SET node_id = ?, state = 'complete' WHERE request_key = ?").run(nodeId, requestKey);
220
+ }
221
+ /** Reserve a cold-birth node id for a key (state stays `reserved`) so a retry
222
+ * after a daemon restart resumes the same identity instead of minting another.
223
+ * Only the first caller binds: two API processes holding one unbound key race
224
+ * here, and each gets back the id the key actually names. */
225
+ export async function reserveCreateRequestNode(requestKey, nodeId) {
226
+ const db = await openDb();
227
+ await db.prepareUncached("UPDATE create_requests SET node_id = ?, state = 'reserved' WHERE request_key = ? AND node_id IS NULL").run(nodeId, requestKey);
228
+ const bound = await db.prepareUncached('SELECT node_id FROM create_requests WHERE request_key = ?').get(requestKey);
229
+ return bound?.node_id ?? null;
230
+ }
231
+ export async function completeCreateRequest(requestKey, nodeId) {
232
+ await (await openDb()).prepareUncached("UPDATE create_requests SET state = 'complete' WHERE request_key = ? AND node_id = ?").run(requestKey, nodeId);
233
+ }
234
+ /** Forget an unserved reservation after a pre-birth failure. A record that
235
+ * names a durable node is never removed by this path. */
236
+ export async function abandonCreateRequest(requestKey, nodeId) {
237
+ await withCanvasWrite(async (db) => {
238
+ if (nodeId === null) {
239
+ await db.prepareUncached('DELETE FROM create_requests WHERE request_key = ? AND node_id IS NULL').run(requestKey);
240
+ return;
241
+ }
242
+ await db.prepareUncached('DELETE FROM create_requests WHERE request_key = ? AND node_id = ?').run(requestKey, nodeId);
243
+ });
244
+ }
245
+ export function canonicalSessionFile(sessionFile) {
246
+ return resolve(sessionFile);
247
+ }
248
+ /** Resolve the crouter node that owns one exact Pi session file. */
249
+ export async function findNodeBySessionFile(sessionFile) {
250
+ const nodeId = await findNodeBySessionFileSql(sessionFile);
251
+ return nodeId === null ? null : await getNode(nodeId);
252
+ }
253
+ /** The indexed row (from the db) — cheap for queries that don't need full meta. */
254
+ export async function getRow(nodeId) {
255
+ const r = await (await openDb()).prepare('SELECT * FROM node_rows WHERE node_id = ?').get(nodeId);
256
+ return r ? rowFrom(r) : null;
257
+ }
258
+ /** The node row whose durable LOCATION pane is `pane`, or null. Lets placement
259
+ * resolve "who sits in this pane" by the first-class `%pane_id` handle (e.g.
260
+ * to adopt a caller's pane as a focus). pane is not UNIQUE in the schema, but a
261
+ * live pane backs at most one node, so this returns the single match. */
262
+ export async function getRowByPane(pane) {
263
+ const r = await (await openDb()).prepare('SELECT * FROM node_rows WHERE pane = ?').get(pane);
264
+ return r ? rowFrom(r) : null;
265
+ }
266
+ /** Nodes whose persisted spawn deadline has elapsed and that remain live work. */
267
+ export async function dueNodeDeadlines(nowIso) {
268
+ return (await (await openDb()).prepare(`SELECT * FROM node_rows
269
+ WHERE deadline_at IS NOT NULL AND outcome_at IS NULL
270
+ AND deadline_at <= ? AND status IN ('active','idle') AND kind != 'human'
271
+ ORDER BY deadline_at, created, node_id`).all(nowIso)).map(rowFrom);
272
+ }
273
+ /** Write a claimed warm spare's deadline before it is handed to its caller. */
274
+ export async function setNodeDeadline(nodeId, deadlineAt) {
275
+ return Number((await (await openDb()).prepare('UPDATE nodes SET deadline_at = ? WHERE node_id = ?').run(deadlineAt, nodeId)).changes) === 1;
276
+ }
277
+ /** Shift active/idle profile deadlines by a completed profile pause duration. */
278
+ export async function shiftProfileNodeDeadlines(profileId, pauseDurationMs) {
279
+ if (!Number.isFinite(pauseDurationMs) || pauseDurationMs <= 0)
280
+ return 0;
281
+ return await withCanvasWrite(async (db) => {
282
+ const rows = await db.prepare(`SELECT node_id, deadline_at FROM nodes
283
+ WHERE profile_id = ? AND deadline_at IS NOT NULL AND status IN ('active', 'idle')`).all(profileId);
284
+ const update = db.prepare('UPDATE nodes SET deadline_at = ? WHERE node_id = ? AND deadline_at = ?');
285
+ let shifted = 0;
286
+ for (const row of rows) {
287
+ const at = Date.parse(row.deadline_at);
288
+ if (Number.isNaN(at))
289
+ continue;
290
+ shifted += Number((await update.run(new Date(at + pauseDurationMs).toISOString(), row.node_id, row.deadline_at)).changes);
291
+ }
292
+ return shifted;
293
+ });
294
+ }
295
+ function sqlInput(value, field) {
296
+ if (value === null || value === undefined)
297
+ return null;
298
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint' || value instanceof Uint8Array)
299
+ return value;
300
+ throw new TypeError(`${field} must be a SQLite scalar`);
301
+ }
302
+ /** Update node identity/configuration columns. Sessions and worktrees have named stores. */
303
+ export async function updateNode(nodeId, patch) {
304
+ const fields = [];
305
+ const add = (key, column = key) => {
306
+ if (Object.prototype.hasOwnProperty.call(patch, key))
307
+ fields.push([column, sqlInput(patch[key], key)]);
308
+ };
309
+ add('description');
310
+ add('title');
311
+ add('icon');
312
+ add('cycles');
313
+ add('mode');
314
+ add('lifecycle');
315
+ add('cwd');
316
+ add('host_kind');
317
+ add('profile_id');
318
+ add('parent');
319
+ add('spawned_by');
320
+ add('creator');
321
+ add('fork_from');
322
+ add('fork_source_file');
323
+ add('model_override');
324
+ if (Object.prototype.hasOwnProperty.call(patch, 'passive_default'))
325
+ fields.push(['passive_default', patch.passive_default === true ? 1 : 0]);
326
+ if (Object.prototype.hasOwnProperty.call(patch, 'cycle_pending'))
327
+ fields.push(['cycle_pending', patch.cycle_pending === true ? 1 : 0]);
328
+ if (Object.prototype.hasOwnProperty.call(patch, 'persona_ack'))
329
+ fields.push(['persona_ack_json', jsonValue(patch.persona_ack, 'persona_ack')]);
330
+ if (Object.prototype.hasOwnProperty.call(patch, 'review_binding'))
331
+ fields.push(['review_binding_json', jsonValue(patch.review_binding, 'review_binding')]);
332
+ // Isolation is fixed at birth; updateNode must never weaken it.
333
+ if (Object.prototype.hasOwnProperty.call(patch, 'isolated'))
334
+ throw new TypeError('isolated cannot change after node creation');
335
+ if (Object.prototype.hasOwnProperty.call(patch, 'scopes'))
336
+ fields.push(['scopes_json', jsonValue(patch.scopes, 'scopes')]);
337
+ if (Object.prototype.hasOwnProperty.call(patch, 'launch'))
338
+ fields.push(['launch_config_json', jsonValue(patch.launch, 'launch')]);
339
+ const has = (key) => Object.prototype.hasOwnProperty.call(patch, key);
340
+ await withCanvasWrite(async (db) => {
341
+ const object = await getById(db, nodeId);
342
+ if (object === null || object.type !== 'node')
343
+ throw new Error(`unknown node: ${nodeId}`);
344
+ if (has('name'))
345
+ await setObjectName(db, object, sqlInput(patch.name, 'name'));
346
+ if (has('kind'))
347
+ await setObjectKind(db, object, sqlInput(patch.kind, 'kind'));
348
+ if (fields.length === 0)
349
+ return;
350
+ // A profile change moves the node under the new profile's object, or back under its app when it has none.
351
+ if (has('profile_id')) {
352
+ const app = await db.prepare('SELECT app FROM nodes WHERE node_id = ?').get(nodeId);
353
+ const appObject = app?.app ? await getById(db, app.app) : null;
354
+ if (appObject) {
355
+ const profile = patch.profile_id ? await profileObjectFor(db, patch.profile_id, appObject) : null;
356
+ await db.prepare('UPDATE objects SET owner = ? WHERE id = ?').run((profile ?? appObject).id, nodeId);
357
+ const sub = (await db.prepare('SELECT sub FROM nodes WHERE node_id = ?').get(nodeId)).sub;
358
+ if (profile === null && sub)
359
+ await writeActsFor(db, nodeId, sub);
360
+ }
361
+ }
362
+ const result = await db.prepareUncached(`UPDATE nodes SET ${fields.map(([column]) => `${column} = ?`).join(', ')} WHERE node_id = ?`).run(...fields.map(([, value]) => value), nodeId);
363
+ if (result.changes !== 1)
364
+ throw new Error(`unknown node: ${nodeId}`);
365
+ });
366
+ return await getNode(nodeId);
367
+ }
368
+ // Atomic runtime setters — each one a single-statement UPDATE on the WAL'd row,
369
+ // the authoritative store for live state. No read-modify-write, so concurrent
370
+ // writers of DIFFERENT fields (the daemon stamping pi_pid while a node flips
371
+ // status) can never clobber each other: WAL serializes the two statements.
372
+ // `"window"` is quoted defensively — it is a SQLite keyword.
373
+ /** Set a node's status. Atomic single-column write. */
374
+ export async function setStatus(nodeId, status) {
375
+ await (await openDb()).prepare('UPDATE nodes SET status = ? WHERE node_id = ?').run(status, nodeId);
376
+ }
377
+ /** Set a node's exit intent. Atomic single-column write. */
378
+ export async function setIntent(nodeId, intent) {
379
+ await (await openDb()).prepare('UPDATE nodes SET intent = ? WHERE node_id = ?').run(intent ?? null, nodeId);
380
+ }
381
+ /** Atomically write status and/or intent, gated on an optional from-status set
382
+ * and/or on the row carrying no committed final_report. The lifecycle state
383
+ * machine (runtime/lifecycle.ts) is the one caller: it owns the legality
384
+ * table and the unknown-node/illegal-move/already-finalized-cancel branching,
385
+ * this only performs the single conditional UPDATE it needs. A PRESENT key in
386
+ * `fields` (even `intent: null`) writes that column; an ABSENT key leaves it
387
+ * unchanged. Returns the row-changed count so the caller can distinguish "no
388
+ * such node", "gate failed", and "already applied" without a second query. */
389
+ export async function transitionStatusIntent(nodeId, fields, opts = {}) {
390
+ // Keep the ordinary lifecycle write exactly as its pre-outcome form: one
391
+ // conditional UPDATE and no transaction boundary.
392
+ if (opts.outcome === undefined) {
393
+ const assignments = [];
394
+ const values = [];
395
+ if (Object.prototype.hasOwnProperty.call(fields, 'status')) {
396
+ assignments.push('status = ?');
397
+ values.push(fields.status ?? null);
398
+ }
399
+ if (Object.prototype.hasOwnProperty.call(fields, 'intent')) {
400
+ assignments.push('intent = ?');
401
+ values.push(fields.intent ?? null);
402
+ }
403
+ if (Object.prototype.hasOwnProperty.call(fields, 'terminal_reason')) {
404
+ assignments.push('terminal_reason = ?');
405
+ values.push(fields.terminal_reason ?? null);
406
+ }
407
+ const predicates = ['node_id = ?'];
408
+ values.push(nodeId);
409
+ if (opts.fromStatuses !== undefined) {
410
+ predicates.push(`status IN (${opts.fromStatuses.map(() => '?').join(', ')})`);
411
+ values.push(...opts.fromStatuses);
412
+ }
413
+ if (opts.requireNoFinalReport === true)
414
+ predicates.push('final_report IS NULL');
415
+ const result = await (await openDb())
416
+ .prepareUncached(`UPDATE nodes SET ${assignments.join(', ')} WHERE ${predicates.join(' AND ')}`)
417
+ .run(...values);
418
+ return Number(result.changes);
419
+ }
420
+ const outcome = opts.outcome;
421
+ return await withCanvasWrite(async (db) => {
422
+ const assignments = [];
423
+ const values = [];
424
+ if (Object.prototype.hasOwnProperty.call(fields, 'status')) {
425
+ assignments.push('status = ?');
426
+ values.push(fields.status ?? null);
427
+ }
428
+ if (Object.prototype.hasOwnProperty.call(fields, 'intent')) {
429
+ assignments.push('intent = ?');
430
+ values.push(fields.intent ?? null);
431
+ }
432
+ if (Object.prototype.hasOwnProperty.call(fields, 'terminal_reason')) {
433
+ assignments.push('terminal_reason = ?');
434
+ values.push(fields.terminal_reason ?? null);
435
+ }
436
+ const outcomeValue = (value, column) => outcome.supersede === true ? '?' : `CASE WHEN outcome_at IS NULL THEN ? ELSE ${column} END`;
437
+ assignments.push(`outcome_kind = ${outcomeValue(outcome.kind, 'outcome_kind')}`, `outcome_reason = ${outcomeValue(outcome.reason, 'outcome_reason')}`, `outcome_detail_json = ${outcomeValue(outcome.detailJson, 'outcome_detail_json')}`, `outcome_revision = ${outcome.supersede === true ? 'outcome_revision + 1' : 'CASE WHEN outcome_at IS NULL THEN outcome_revision + 1 ELSE outcome_revision END'}`, `outcome_at = ${outcomeValue(outcome.at, 'outcome_at')}`);
438
+ values.push(outcome.kind, outcome.reason, outcome.detailJson, outcome.at);
439
+ const predicates = ['node_id = ?'];
440
+ values.push(nodeId);
441
+ if (opts.fromStatuses !== undefined) {
442
+ predicates.push(`status IN (${opts.fromStatuses.map(() => '?').join(', ')})`);
443
+ values.push(...opts.fromStatuses);
444
+ }
445
+ if (opts.requireNoFinalReport === true)
446
+ predicates.push('final_report IS NULL');
447
+ const result = await db.prepareUncached(`UPDATE nodes SET ${assignments.join(', ')} WHERE ${predicates.join(' AND ')}`).run(...values);
448
+ if (Number(result.changes) === 0)
449
+ return 0;
450
+ const latched = await db.prepare('SELECT outcome_at FROM nodes WHERE node_id = ?').get(nodeId);
451
+ if ((outcome.supersede === true || latched.outcome_at === outcome.at) && outcome.documentJson !== null && outcome.documentJson !== undefined) {
452
+ await publish(db, { event: 'outcome', object: await nodeObject(db, nodeId), actor: null,
453
+ attrs: { revision: Number((await db.prepare('SELECT outcome_revision FROM nodes WHERE node_id = ?').get(nodeId)).outcome_revision) },
454
+ messageBody: JSON.parse(outcome.documentJson) });
455
+ }
456
+ return Number(result.changes);
457
+ });
458
+ }
459
+ /** Read a node's committed-final latch pointer. Pure read, no side effect. */
460
+ export async function getFinalReport(nodeId) {
461
+ const row = await (await openDb()).prepare('SELECT final_report FROM nodes WHERE node_id = ?').get(nodeId);
462
+ return row?.final_report ?? null;
463
+ }
464
+ /** CAS-clear a node's finalization latch (final_report + finalized_at) —
465
+ * retract-pointer-only. Gated on the exact final_report value the caller
466
+ * observed via getFinalReport, so a concurrent clear/refinalize can never be
467
+ * clobbered. Returns true iff the CAS matched and cleared. */
468
+ export async function clearFinalReportIfMatches(nodeId, expectedFinalReport) {
469
+ const result = await (await openDb()).prepare('UPDATE nodes SET final_report = NULL, finalized_at = NULL WHERE node_id = ? AND final_report = ?')
470
+ .run(nodeId, expectedFinalReport);
471
+ return result.changes > 0;
472
+ }
473
+ /** Set a node's tmux presence in one atomic write: the durable LOCATION anchor
474
+ * `pane` (the `%pane_id`) plus its derived cache (`tmux_session` + `window`).
475
+ * All three move together — `pane` joins the others inside the single UPDATE so
476
+ * a move never half-writes the location. `pane` is optional: a caller that does
477
+ * not yet track it (every caller, until the placement layer lands) writes null,
478
+ * which is harmless because nothing reads `pane` yet. */
479
+ export async function setPresence(nodeId, presence) {
480
+ await (await openDb()).prepare('UPDATE nodes SET tmux_session = ?, "window" = ?, pane = ? WHERE node_id = ?')
481
+ .run(presence.tmux_session ?? null, presence.window ?? null, presence.pane ?? null, nodeId);
482
+ }
483
+ export async function recordLaunch(nodeId, at) {
484
+ await (await openDb()).prepare('UPDATE nodes SET launched_at = ?, frozen_at = NULL, respawn_not_before = NULL WHERE node_id = ?')
485
+ .run(at, nodeId);
486
+ }
487
+ export async function recordSettledTurn(nodeId, at) {
488
+ await (await openDb()).prepare('UPDATE nodes SET last_settled_at = ? WHERE node_id = ?').run(at, nodeId);
489
+ }
490
+ export async function setFrozen(nodeId, at) {
491
+ await (await openDb()).prepare('UPDATE nodes SET frozen_at = ? WHERE node_id = ?').run(at, nodeId);
492
+ }
493
+ export async function clearFrozen(nodeId) {
494
+ await (await openDb()).prepare('UPDATE nodes SET frozen_at = NULL WHERE node_id = ?').run(nodeId);
495
+ }
496
+ export async function recordRespawnAttempt(nodeId, attempt) {
497
+ await (await openDb()).prepare('UPDATE nodes SET respawn_failures = ?, respawn_not_before = ? WHERE node_id = ?')
498
+ .run(attempt.failures, attempt.notBefore, nodeId);
499
+ }
500
+ /** The one clause that hides unclaimed warm-pool spares from every listing.
501
+ * A spare is a real node with a booted broker, but nobody has been handed it
502
+ * yet — surfacing it would put a phantom empty conversation in the user's
503
+ * sidebar. Claiming deletes the marker, which is what makes the node visible. */
504
+ const NOT_A_SPARE = 'node_id NOT IN (SELECT node_id FROM warm_pool)';
505
+ /** Every hydrated node whose durable profile identity equals `profileId`.
506
+ * Unlike `listNodes`, this includes unclaimed warm-pool spares: profile
507
+ * deletion owns every matching row, whether or not it is user-visible. */
508
+ const WORKTREE_COLUMNS = [
509
+ 'state', 'cleanup_state', 'path', 'branch', 'repo_root', 'base_ref', 'base_sha', 'created_at', 'closed_at',
510
+ 'next_attempt_at', 'attempts', 'quarantined', 'sweep_reason', 'sweep_detail', 'sweep_last_at', 'sweep_observed_json',
511
+ 'abandoned_json', 'land_intent_json', 'disposal_json',
512
+ ];
513
+ function worktreeFromProjection(r) {
514
+ if (r['worktree_state'] === null)
515
+ return null;
516
+ return worktreeFromRow(Object.fromEntries(WORKTREE_COLUMNS.map((column) => [column, r[`worktree_${column}`]])));
517
+ }
518
+ export async function listNodesByProfile(profileId) {
519
+ const worktreeProjection = WORKTREE_COLUMNS.map((column) => `w.${column} AS worktree_${column}`).join(', ');
520
+ const rows = await (await openDb())
521
+ .prepareUncached(`SELECT n.*, ${worktreeProjection} FROM node_rows n LEFT JOIN worktrees w ON w.node_id = n.node_id WHERE n.profile_id = ? ORDER BY n.created`)
522
+ .all(profileId);
523
+ return (await mapAsync(rows, async (row) => await metaFrom(row, worktreeFromProjection(row))));
524
+ }
525
+ /** Browse's first frame: select only fields its rows/tree use. Keep the fault and
526
+ * turn columns for rowFrom's live fault/streaming semantics, but never hydrate
527
+ * outcomes, placement, metadata or the (often large) telemetry activity text. */
528
+ export async function browseNodes() {
529
+ const db = await openDb();
530
+ const rows = await db.prepare(`SELECT
531
+ node_id, name, description, kind, mode, lifecycle, status, cwd, profile_id,
532
+ grantee, parent, created, frozen_at, terminal_reason, final_report,
533
+ telemetry_tokens_in, telemetry_updated_at, pi_pid, turn_open_at, turn_closed_at,
534
+ fault_id, fault_link, fault_op, fault_kind, fault_message, fault_since,
535
+ fault_operation_id, fault_anchor_entry_id, fault_retry_disposition,
536
+ fault_retry_by, fault_retry_attempt, fault_retry_max, fault_retry_next_at,
537
+ fault_provider_error_json
538
+ FROM node_rows WHERE ${NOT_A_SPARE} ORDER BY created`).all();
539
+ return rows.map(rowFrom);
540
+ }
541
+ /** All rows, optionally filtered by status and terminal execution traces. Unclaimed warm spares are excluded. */
542
+ export async function updateNodeTelemetry(nodeId, telemetry) {
543
+ await (await openDb()).prepare(`UPDATE nodes
544
+ SET telemetry_tokens_in = ?,
545
+ telemetry_context_tokens = COALESCE(?, telemetry_context_tokens),
546
+ telemetry_last_activity = COALESCE(?, telemetry_last_activity),
547
+ telemetry_updated_at = ?
548
+ WHERE node_id = ?
549
+ AND (telemetry_updated_at IS NULL OR telemetry_updated_at < ?)`).run(telemetry.tokensIn, telemetry.contextTokens, telemetry.lastActivity, telemetry.updatedAt, nodeId, telemetry.updatedAt);
550
+ }
551
+ /** Stored fields the attach graph displays, plus the two live execution cues it
552
+ * needs. This keeps the interactive graph off the full node-summary projection
553
+ * and its unused runtime, outcome, and placement fields. */
554
+ export async function graphNodes() {
555
+ const rows = await (await openDb()).prepare(`SELECT
556
+ node_id, name, description, cycles, kind, status, frozen_at,
557
+ telemetry_context_tokens, telemetry_last_activity,
558
+ pi_pid, turn_open_at, turn_closed_at,
559
+ fault_id, fault_link, fault_op, fault_kind, fault_message, fault_since,
560
+ fault_operation_id, fault_anchor_entry_id, fault_retry_disposition,
561
+ fault_retry_by, fault_retry_attempt, fault_retry_max, fault_retry_next_at,
562
+ fault_provider_error_json
563
+ FROM node_rows WHERE ${NOT_A_SPARE} ORDER BY created`).all();
564
+ return rows.map((row) => {
565
+ const pid = row['pi_pid'] ?? null;
566
+ const pidAlive = isPidPresent(pid);
567
+ const fault = faultFrom(row);
568
+ return {
569
+ node_id: row['node_id'],
570
+ name: row['name'],
571
+ description: row['description'] ?? null,
572
+ cycles: row['cycles'] ?? null,
573
+ kind: row['kind'],
574
+ status: row['status'],
575
+ frozen_at: row['frozen_at'] ?? null,
576
+ pi_pid: pid,
577
+ telemetry_context_tokens: row['telemetry_context_tokens'] ?? null,
578
+ telemetry_last_activity: row['telemetry_last_activity'] ?? null,
579
+ fault: fault?.link === 'pi→provider' && fault.retry.by === 'daemon' && fault.retry.disposition === 'auto' && !pidAlive
580
+ ? null
581
+ : fault,
582
+ streaming: row['turn_open_at'] !== null && row['turn_closed_at'] === null && pidAlive,
583
+ };
584
+ });
585
+ }
586
+ export async function listNodes(filter) {
587
+ const clauses = [NOT_A_SPARE];
588
+ const params = [];
589
+ if (filter?.under !== undefined) {
590
+ if (filter.underInclusive === true) {
591
+ clauses.push(`(node_id IN (${SUBTREE_ALL_IDS_SQL}) OR node_id = ?)`);
592
+ params.push(filter.under, filter.under, filter.under);
593
+ }
594
+ else {
595
+ clauses.push(`node_id IN (${SUBTREE_IDS_SQL})`);
596
+ params.push(filter.under, filter.under);
597
+ }
598
+ }
599
+ if (filter?.lifecycle !== undefined) {
600
+ clauses.push('lifecycle = ?');
601
+ params.push(filter.lifecycle);
602
+ }
603
+ if (filter?.kind !== undefined) {
604
+ clauses.push('kind = ?');
605
+ params.push(filter.kind);
606
+ }
607
+ if (filter?.mode !== undefined) {
608
+ clauses.push('mode = ?');
609
+ params.push(filter.mode);
610
+ }
611
+ if (filter?.profileId !== undefined) {
612
+ clauses.push('profile_id = ?');
613
+ params.push(filter.profileId);
614
+ }
615
+ if (filter?.profilePrefix !== undefined) {
616
+ clauses.push(`profile_id LIKE ? ESCAPE '\\'`);
617
+ params.push(`${filter.profilePrefix.replace(/[\\%_]/g, (c) => `\\${c}`)}%`);
618
+ }
619
+ if (filter?.parent !== undefined) {
620
+ clauses.push('parent = ?');
621
+ params.push(filter.parent);
622
+ }
623
+ if (filter?.topLevel === true)
624
+ clauses.push('parent IS NULL');
625
+ if (filter?.hanging === true)
626
+ clauses.push('parent IS NOT NULL AND parent NOT IN (SELECT node_id FROM node_rows)');
627
+ if (filter?.status !== undefined) {
628
+ const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
629
+ clauses.push(`status IN (${statuses.map(() => '?').join(',')})`);
630
+ params.push(...statuses);
631
+ }
632
+ if (filter?.withRecordedPid === true)
633
+ clauses.push('pi_pid IS NOT NULL');
634
+ if (filter?.withRecordedPidOrFrozen === true)
635
+ clauses.push('(pi_pid IS NOT NULL OR frozen_at IS NOT NULL)');
636
+ const rows = await (await openDb())
637
+ .prepareUncached(`SELECT * FROM node_rows WHERE ${clauses.join(' AND ')} ORDER BY created`)
638
+ .all(...params);
639
+ return rows.map(rowFrom);
640
+ }
641
+ // idx_nodes_terminal_placement_created (a partial index on placement presence)
642
+ // keeps this from enumerating every terminal row on old-heavy canvases.
643
+ export const terminalPlacementResidueSql = `SELECT
644
+ node_id, created, launched_at, last_settled_at, finalized_at,
645
+ outcome_at, last_activity_at, pane, "window", tmux_session
646
+ FROM nodes
647
+ WHERE ${NOT_A_SPARE}
648
+ AND status IN ('done', 'canceled', 'dead')
649
+ AND (pane IS NOT NULL OR "window" IS NOT NULL OR tmux_session IS NOT NULL)
650
+ ORDER BY created`;
651
+ export async function listTerminalPlacementResidue() {
652
+ return await (await openDb()).prepare(terminalPlacementResidueSql)
653
+ .all();
654
+ }
655
+ /** The daemon's complete supervision set. Live rows participate regardless of
656
+ * PID; terminal rows participate only while they retain a PID or freeze mark. */
657
+ // Materialize and deduplicate IDs first: the view must use node PK lookups,
658
+ // never enumerate its outer historical terminal-status range. The frozen branch
659
+ // matches the partial index idx_nodes_supervision_frozen.
660
+ export const nodesForSupervisionSql = `WITH candidates AS MATERIALIZED (
661
+ SELECT node_id FROM nodes WHERE status IN ('active', 'idle')
662
+ UNION
663
+ SELECT node_id FROM nodes
664
+ WHERE frozen_at IS NOT NULL AND status IN ('done', 'canceled', 'dead')
665
+ UNION
666
+ SELECT node_id FROM executions
667
+ WHERE state != 'exited' AND state = 'running' AND pid IS NOT NULL
668
+ )
669
+ SELECT v.* FROM candidates c CROSS JOIN node_rows v
670
+ WHERE v.node_id = c.node_id
671
+ AND v.node_id NOT IN (SELECT node_id FROM warm_pool)
672
+ AND v.kind != 'human'
673
+ AND (v.status IN ('active', 'idle') OR (v.status IN ('done', 'canceled', 'dead') AND (v.pi_pid IS NOT NULL OR v.frozen_at IS NOT NULL)))
674
+ ORDER BY v.created`;
675
+ export async function listNodesForSupervision() {
676
+ const rows = await (await openDb()).prepare(nodesForSupervisionSql)
677
+ .all();
678
+ return rows.map(rowFrom);
679
+ }
680
+ /** A parked resident the runtime may reopen when wake mail reaches it: `done` +
681
+ * `intent='parked'`, resident, no final latch, and not being deleted. Finalized,
682
+ * canceled, dead, terminal-lifecycle and deleting nodes are never reopened by mail.
683
+ * The SQL form of `isParkedResident` (runtime/lifecycle.ts), which must change with it; `n` is a `nodes` row. */
684
+ export const PARKED_RESIDENT_SQL = (n) => `(${n}.status = 'done' AND ${n}.intent = 'parked' AND ${n}.lifecycle = 'resident' AND ${n}.final_report IS NULL AND ${n}.deleting_at IS NULL)`;
685
+ /** A node the runtime can still bring back to life, so its cwd must keep existing: a live row
686
+ * (`active`/`idle`), a parked resident the lifecycle tick reopens when wake mail arrives
687
+ * (`PARKED_RESIDENT_SQL`), or a terminal row with no final latch that still carries a frozen
688
+ * mark, which the tick thaws (`node-lifecycle/tick.ts` `classifyRow`). `n` is a `nodes` row. */
689
+ export const RESUMABLE_NODE_SQL = (n) => `(${n}.status IN ('active', 'idle') OR ${PARKED_RESIDENT_SQL(n)} OR (${n}.status IN ('done', 'canceled', 'dead') AND ${n}.frozen_at IS NOT NULL AND ${n}.final_report IS NULL))`;
690
+ /** Every resumable node (`RESUMABLE_NODE_SQL`) other than `ownerId`, with the cwd it will run in. */
691
+ export async function resumableNodeCwds(ownerId) {
692
+ return await (await openDb()).prepare(`SELECT node_id, cwd FROM nodes WHERE ${RESUMABLE_NODE_SQL('nodes')} AND node_id != ?`).all(ownerId);
693
+ }
694
+ /** Parked residents with unseen wake mail (`UNSEEN_WAKE_MAIL_SQL`), which nothing else
695
+ * launches: the lifecycle tick reopens them. Each parked resident seeks its own mail
696
+ * through `deliveries_destination`. */
697
+ export async function listParkedResidentsWithWakeMail() {
698
+ const rows = await (await openDb()).prepare(`SELECT v.* FROM node_rows v
699
+ WHERE ${PARKED_RESIDENT_SQL('v')}
700
+ AND EXISTS (SELECT 1 FROM deliveries d WHERE d.destination_id = v.node_id AND ${UNSEEN_WAKE_MAIL_SQL('d')}) AND v.kind != 'human' AND v.node_id NOT IN (SELECT node_id FROM warm_pool)
701
+ ORDER BY v.created`).all();
702
+ return rows.map(rowFrom);
703
+ }
704
+ // Warm pool — spare booted roots awaiting a `prefer_warm` claim (see
705
+ // `runtime/warm-pool.ts` for the recipe key and the mint/refill policy).
706
+ /** Mark an already-spawned node as an unclaimed spare for `recipeKey`. Hides it
707
+ * from every listing until it is claimed. */
708
+ export async function registerWarmSpare(nodeId, recipeKey) {
709
+ await (await openDb()).prepare('INSERT INTO warm_pool (node_id, recipe_key, created) VALUES (?, ?, ?) ON CONFLICT (node_id) DO UPDATE SET recipe_key = excluded.recipe_key, created = excluded.created')
710
+ .run(nodeId, recipeKey, new Date().toISOString());
711
+ }
712
+ /** Take a parked spare OUT of the pool without claiming it — the reaper's
713
+ * first move. Returns false when the marker was already gone (a concurrent
714
+ * claim won it), which is the reaper's signal to leave that node alone: it is
715
+ * somebody's live conversation now, not a spare. Deleting the marker under the
716
+ * write lock is exactly what `claimWarmSpare` does, so the two can never both
717
+ * succeed on the same node. */
718
+ export async function unregisterWarmSpare(nodeId) {
719
+ return (await (await openDb()).prepare('DELETE FROM warm_pool WHERE node_id = ?').run(nodeId)).changes > 0;
720
+ }
721
+ async function warmSpareRowsFor(db, recipeKey) {
722
+ const sql = `SELECT w.node_id AS node_id, w.recipe_key AS recipe_key, w.created AS created,
723
+ n.status AS status, n.pi_pid AS pi_pid, n.pi_pid_identity AS pi_pid_identity
724
+ FROM warm_pool w JOIN node_rows n ON n.node_id = w.node_id` +
725
+ (recipeKey === undefined ? '' : ' WHERE w.recipe_key = ?') +
726
+ ' ORDER BY w.created';
727
+ const rows = (recipeKey === undefined ? await db.prepareUncached(sql).all() : await db.prepareUncached(sql).all(recipeKey));
728
+ return rows.map((r) => ({
729
+ node_id: r['node_id'],
730
+ recipe_key: r['recipe_key'],
731
+ created: r['created'],
732
+ status: r['status'],
733
+ pi_pid: r['pi_pid'] ?? null,
734
+ pi_pid_identity: r['pi_pid_identity'] ?? null,
735
+ }));
736
+ }
737
+ /** Every parked spare, oldest first — what the reaper (`runtime/warm-pool.ts`
738
+ * `reapStaleSpares`) sweeps. Deliberately NOT filtered by liveness: judging a
739
+ * spare is the caller's job. */
740
+ export async function listWarmSpares() {
741
+ return await warmSpareRowsFor(await openDb());
742
+ }
743
+ /** True while `nodeId` is an UNCLAIMED spare — nobody owns this conversation
744
+ * yet. `registerWarmSpare` runs the instant the row exists and BEFORE the
745
+ * broker launch, and a claim deletes the marker atomically, so this is a
746
+ * reliable read from inside the booting engine (the context-intro extension
747
+ * asks it at `session_start` to withhold bearings that would otherwise assert
748
+ * the spare's placeholder persona instead of its eventual claimant's). */
749
+ export async function isWarmSpare(nodeId) {
750
+ const row = await (await openDb()).prepare('SELECT 1 FROM warm_pool WHERE node_id = ?').get(nodeId);
751
+ return row !== undefined;
752
+ }
753
+ /** A spare is claimable only when its broker is CONFIRMED alive. Status alone
754
+ * is not enough: a broker torn down by a daemon handover leaves the row at
755
+ * `active`/`idle` with a dead pid, and handing that out would answer a create
756
+ * with a node that has no engine behind it. The probe is identity-aware, so a
757
+ * recycled pid never reads as alive; `indeterminate` (probe failed) is treated
758
+ * as not-claimable — a cold spawn is cheap, a broken node is not. */
759
+ function spareIsClaimable(row) {
760
+ if (row.status !== 'active' && row.status !== 'idle')
761
+ return false;
762
+ return recordedPidLiveness(row.pi_pid, row.pi_pid_identity) === 'alive';
763
+ }
764
+ /** Hand out the oldest CLAIMABLE spare matching `recipeKey`, or null when the
765
+ * pool has none. The select+delete run inside ONE canvas write-lock
766
+ * transaction, so two concurrent creates can never be handed the same spare.
767
+ * A spare whose broker is gone is skipped here and reaped by
768
+ * `reapStaleSpares` — nothing ever resumes a spare (the daemon's row query
769
+ * hides them), so a dead spare is garbage, not a parked one.
770
+ *
771
+ * The claim also restamps the row's `created` to `created` — birth time is a
772
+ * spare's MINT time, and consumers sort conversations on it, so an hour-old
773
+ * spare must not sort as an hour-old conversation. This is the one sanctioned
774
+ * write of `created` after birth. */
775
+ export async function claimWarmSpare(recipeKey, created, opts = {}) {
776
+ return await withCanvasWrite(async (db) => {
777
+ const row = (await warmSpareRowsFor(db, recipeKey)).find(spareIsClaimable);
778
+ if (row === undefined)
779
+ return null;
780
+ // Bind the key to the spare in the same transaction that takes it, so a
781
+ // retry after a handover finishes this spare rather than claiming a second.
782
+ if (opts.requestKey !== undefined) {
783
+ const bound = await db.prepareUncached("UPDATE create_requests SET node_id = ?, state = 'warm_claimed' WHERE request_key = ? AND node_id IS NULL").run(row.node_id, opts.requestKey);
784
+ if (bound.changes === 0)
785
+ return null;
786
+ }
787
+ const res = await db.prepare('DELETE FROM warm_pool WHERE node_id = ?').run(row.node_id);
788
+ if (res.changes === 0)
789
+ return null;
790
+ await db.prepare('UPDATE nodes SET created = ?, deadline_at = ? WHERE node_id = ?')
791
+ .run(created, opts.deadlineAt ?? null, row.node_id);
792
+ if (opts.outcomeDelivery !== undefined)
793
+ await registerOutcomeAction(db, row.node_id, opts.outcomeDelivery);
794
+ return row.node_id;
795
+ });
796
+ }
797
+ /** How many CLAIMABLE spares are parked for `recipeKey` (the depth check a
798
+ * refill reads before minting). Uses the same liveness test as the claim, so a
799
+ * spare the claim would skip can never hold the pool at depth 1 and starve
800
+ * every later create of a warm start. */
801
+ export async function warmSpareCount(recipeKey) {
802
+ return (await warmSpareRowsFor(await openDb(), recipeKey)).filter(spareIsClaimable).length;
803
+ }
804
+ /** Direct children of `id`, oldest first — an indexed point query
805
+ * (`idx_nodes_parent`) instead of a full-table `listNodes()` scan. */
806
+ export async function childrenOf(id) {
807
+ return (await (await openDb()).prepare('SELECT node_id FROM nodes WHERE parent = ? ORDER BY created')
808
+ .all(id)).map((r) => r.node_id);
809
+ }
810
+ /** Every node's lean roster row, oldest first — a single scan indexed by
811
+ * `idx_nodes_created`, with no per-row hydration or N+1 query. */
812
+ export async function rosterNodes() {
813
+ return (await (await openDb())
814
+ .prepareUncached(`SELECT node_id, name, kind, mode, lifecycle, status, cwd, host_kind, parent, created, description
815
+ FROM node_rows WHERE ${NOT_A_SPARE} ORDER BY created`)
816
+ .all()).map((r) => ({
817
+ node_id: r['node_id'],
818
+ name: r['name'],
819
+ kind: r['kind'],
820
+ mode: r['mode'],
821
+ lifecycle: r['lifecycle'],
822
+ status: r['status'],
823
+ cwd: r['cwd'],
824
+ host_kind: r['host_kind'] ?? null,
825
+ parent: r['parent'] ?? null,
826
+ created: r['created'],
827
+ description: r['description'] ?? null,
828
+ }));
829
+ }
830
+ /** Resumable ROOT conversations pinned to `cwd`, most-recently-created first.
831
+ * A "root" is the top of a spine (`parent IS NULL`) that is a real
832
+ * conversation (not a `kind:'human'` ask) and still resumable (`active`/`idle`,
833
+ * never a `done`/`dead`/`canceled` node). This backs the front-door
834
+ * `crtr -c`/`-r` resume: cwd is the key (the Claude-Code mental model — "my
835
+ * last session HERE"), so it never teleports across projects. */
836
+ export async function listResumableRoots(cwd) {
837
+ const rows = await (await openDb())
838
+ .prepareUncached(`SELECT * FROM node_rows
839
+ WHERE parent IS NULL AND kind != 'human'
840
+ AND status IN ('active','idle') AND cwd = ?
841
+ AND ${NOT_A_SPARE}
842
+ ORDER BY created DESC`)
843
+ .all(cwd);
844
+ return rows.map(rowFrom);
845
+ }
846
+ export * from './tree.js';
847
+ /** Close the TOCTOU between checking a target has a natural cycle ahead
848
+ * of it and the write that depends on that (for example, a deferred inbox
849
+ * append). Fresh-reads `nodeId`'s
850
+ * (status, final_report, frozen_at) and either runs `body` (a write) or short-circuits
851
+ * with a `'terminal'`/`'missing'` outcome — the read takes the node row
852
+ * `FOR UPDATE` and holds it through `body`'s write in the same transaction, so
853
+ * a concurrent finish/cancel/finalization/deletion either commits entirely
854
+ * before this reads (observed here, `body` never runs) or waits on the row
855
+ * until `body` commits — never in the gap a separate check-then-write left
856
+ * open. Pass the shared `hasNoNaturalCycle` predicate rather than
857
+ * a bespoke one so the two never drift.
858
+ *
859
+ * A dangling `nodeId` — the row deleted after the
860
+ * caller's own selection but before this guard's fresh read — MUST NEVER run
861
+ * `body`. Reporting `'missing'` distinctly from `'terminal'` (rather than
862
+ * folding it into either the terminal branch or a fabricated "safe" empty
863
+ * snapshot) keeps the two failure shapes from being conflated: a terminal
864
+ * target has a real `status`/`final_report` to report and its own
865
+ * `deferred_no_natural_cycle`-style rejection, while a missing target has
866
+ * nothing to report and belongs to the caller's own not-found contract. */
867
+ export async function withFreshTerminalGuard(nodeId, isTerminal, body) {
868
+ return await withCanvasWrite(async (db) => {
869
+ const row = await db.prepare('SELECT status, final_report, frozen_at FROM nodes WHERE node_id = ? FOR UPDATE')
870
+ .get(nodeId);
871
+ if (row === undefined) {
872
+ return { kind: 'missing' };
873
+ }
874
+ if (isTerminal(row)) {
875
+ return { kind: 'terminal', status: row.status, final_report: row.final_report };
876
+ }
877
+ return { kind: 'ran', result: await body() };
878
+ });
879
+ }
880
+ /** True when this node's identity is still required to own a managed checkout.
881
+ *
882
+ * Ownership outlives the OPEN state. A closed record whose cleanup is still
883
+ * pending names a checkout and a branch that are physically still there, and
884
+ * this node record is the only proof of who they belong to — deleting it turns
885
+ * a retained residual into an ownerless orphan the daemon sweep can never
886
+ * safely reclaim, because it must never guess at a worktree it cannot prove it
887
+ * created. So prune may take this node only once cleanup is COMPLETE. A
888
+ * historical closed record written before the cleanup field existed carries no
889
+ * such proof and counts as incomplete.
890
+ *
891
+ * An abandoned record is deliberately NOT protected: abandon already removed
892
+ * the checkout and retains its branch for a person on purpose, so there is no
893
+ * residual for the sweep to own. */
894
+ async function hasUnreconciledManagedWorktree(nodeId) {
895
+ return await hasUnreconciledWorktree(nodeId);
896
+ }
897
+ /** Whether a row may be removed by an automatic collection sweep. */
898
+ export async function isCollectible(row, opts = {}) {
899
+ if (!['done', 'dead', 'canceled'].includes(row.status)
900
+ || row.pi_pid !== null
901
+ || row.frozen_at !== null
902
+ || await hasUnreconciledManagedWorktree(row.node_id)
903
+ || row.node_id === envNodeId()
904
+ // App runs (e.g. chat conversations) are deleted only through the runs API.
905
+ || isAppRun(row))
906
+ return false;
907
+ return opts.pastTtl === true || !['crashed', 'stranded', null].includes(row.terminal_reason ?? null);
908
+ }
909
+ async function nodeConversationIds(nodeIds) {
910
+ if (nodeIds.length === 0)
911
+ return [];
912
+ const placeholders = nodeIds.map(() => '?').join(',');
913
+ const rows = await (await openDb()).prepareUncached(`SELECT s.session_id, s.transcript_path, s.node_id, n.grantee FROM sessions s JOIN node_rows n ON n.node_id = s.node_id WHERE s.node_id IN (${placeholders}) AND s.session_id IS NOT NULL AND s.transcript_path IS NOT NULL ORDER BY s.created_at, s.seq`).all(...nodeIds);
914
+ return [...new Map(rows.map((row) => [row.session_id, { id: row.session_id, path: row.transcript_path, dir: join(appSpace(row.grantee).conversations, row.node_id) }])).values()];
915
+ }
916
+ /** Delete conversations nothing still needs: no sessions row names them, and no fork
917
+ * that has not launched yet (a node with no sessions row) replays them as its source.
918
+ * Runs after the owner's rows are gone, so the store can no longer resolve a path: each file is
919
+ * removed by the path read before. */
920
+ async function deleteNodeConversations(conversations) {
921
+ const db = await openDb();
922
+ const referenced = db.prepare('SELECT 1 FROM sessions WHERE session_id = ? LIMIT 1');
923
+ const pendingFork = db.prepare(`SELECT 1 FROM nodes n WHERE n.fork_source_file LIKE '%\\_' || ? || '.jsonl' ESCAPE '\\'
924
+ AND NOT EXISTS (SELECT 1 FROM sessions s WHERE s.node_id = n.node_id) LIMIT 1`);
925
+ for (const { id, path, dir } of conversations) {
926
+ if (await referenced.get(id) !== undefined || await pendingFork.get(id) !== undefined)
927
+ continue;
928
+ if (lstatSync(path, { throwIfNoEntry: false }) === undefined)
929
+ continue;
930
+ if (!isBeneath(dir, path)) {
931
+ console.error(`[canvas] not deleting transcript outside its node's conversations directory: ${path}`);
932
+ continue;
933
+ }
934
+ try {
935
+ await conversationStore().delete(id, path);
936
+ }
937
+ catch (error) {
938
+ if (!(error instanceof ConversationNotFoundError))
939
+ throw error;
940
+ }
941
+ }
942
+ }
943
+ /** A node chooses the transcript path it binds, so only a file beneath the deleting
944
+ * node's own conversations directory (no link in the way) is ever removed. */
945
+ function isBeneath(dir, path) {
946
+ try {
947
+ const rel = relative(realpathSync(dir), join(realpathSync(dirname(path)), basename(path)));
948
+ return rel !== '' && rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
949
+ }
950
+ catch (error) {
951
+ if (error.code === 'ENOENT')
952
+ return false;
953
+ throw error;
954
+ }
955
+ }
956
+ /** Delete one node and what it owns, in the caller's transaction; false when it is already gone. */
957
+ async function deleteNodeObject(db, nodeId) {
958
+ const node = await getById(db, nodeId);
959
+ if (node === null || node.deleted_at !== null)
960
+ return false;
961
+ await deleteNodeWithOwned(db, node);
962
+ return true;
963
+ }
964
+ export async function nodeFiles(nodeId) {
965
+ return { nodeId, app: await getNode(nodeId) === null ? null : await appForNode(nodeId) };
966
+ }
967
+ /** Remove the trees an app can write into (the node's agent folder and run
968
+ * folder) without following any link inside them (R18G). Synchronous even on
969
+ * the retention sweep: a plain recursive rm would follow an app-planted link. */
970
+ async function removeNodeAppTrees({ nodeId, app }) {
971
+ if (app !== null)
972
+ removeTreeBeneath(appSpace(app).nodes, await nodeAgentDir(nodeId, app));
973
+ removeTreeBeneath(dirname(nodeRunDir(nodeId)), nodeRunDir(nodeId));
974
+ }
975
+ /** The daemon-owned directories a deleted node owned, removed whole with a plain rm. */
976
+ function nodeOwnedDirs({ nodeId }) {
977
+ return [nodeDir(nodeId)];
978
+ }
979
+ /** A conversation another node still references keeps its file, and so its
980
+ * conversations directory: remove it only when empty. */
981
+ function removeNodeConversationDir({ nodeId, app }) {
982
+ if (app === null)
983
+ return;
984
+ try {
985
+ rmdirSync(join(appSpace(app).conversations, nodeId));
986
+ }
987
+ catch (error) {
988
+ if (!['ENOENT', 'ENOTEMPTY'].includes(error.code ?? ''))
989
+ throw error;
990
+ }
991
+ }
992
+ /** Remove every directory a deleted node owned. A conversation another node
993
+ * still references keeps its file, and so its conversations directory. */
994
+ export async function removeNodeFiles(files) {
995
+ await removeNodeAppTrees(files);
996
+ for (const dir of nodeOwnedDirs(files))
997
+ rmSync(dir, { recursive: true, force: true });
998
+ removeNodeConversationDir(files);
999
+ }
1000
+ /** Delete ONE node with what it owns ({@link deleteNodeWithOwned}) and remove its on-disk `nodes/<id>/` dir. The single-node
1001
+ * analogue of {@link pruneNodes}, for IMMEDIATE reaping — e.g. an empty node the
1002
+ * user closed or detached from. An open managed worktree is never deleted: its
1003
+ * node retains the ownership needed for `node worktree close`. Pure persisted-state
1004
+ * removal: the caller MUST have already torn down the broker engine +
1005
+ * viewer (this does not signal any process). The node row and its FK-coupled
1006
+ * state are removed in one canvas write boundary. Best-effort dir removal
1007
+ * follows the commit. */
1008
+ export async function deleteNode(nodeId) {
1009
+ if (await hasUnreconciledManagedWorktree(nodeId))
1010
+ return { deleted: false };
1011
+ const files = await nodeFiles(nodeId);
1012
+ const conversations = await nodeConversationIds([nodeId]);
1013
+ const result = await withCanvasWrite(async (db) => {
1014
+ await deleteNodeObject(db, nodeId);
1015
+ return { deleted: true };
1016
+ });
1017
+ await deleteNodeConversations(conversations);
1018
+ await removeNodeFiles(files);
1019
+ return result;
1020
+ }
1021
+ /** Hard-delete a validated set of nodes in one row transaction, then remove
1022
+ * their directories. The caller must tear down engines and viewers first. */
1023
+ export async function deleteNodes(nodeIds) {
1024
+ const ids = [...new Set(nodeIds)];
1025
+ if (ids.length === 0)
1026
+ return [];
1027
+ const blocked = (await filterAsync(ids, hasUnreconciledManagedWorktree));
1028
+ if (blocked.length > 0) {
1029
+ throw new Error(`refusing to delete nodes with unreconciled managed worktrees: ${blocked.join(', ')}`);
1030
+ }
1031
+ const files = (await mapAsync(ids, nodeFiles));
1032
+ const conversations = await nodeConversationIds(ids);
1033
+ const placeholders = ids.map(() => '?').join(',');
1034
+ const existing = (await (await openDb())
1035
+ .prepareUncached(`SELECT node_id FROM nodes WHERE node_id IN (${placeholders}) ORDER BY created`)
1036
+ .all(...ids)).map(({ node_id }) => node_id);
1037
+ const deleted = (await filterAsync(existing, async (id) => await withCanvasWrite(async (db) => await deleteNodeObject(db, id))));
1038
+ await deleteNodeConversations(conversations);
1039
+ for (const id of deleted) {
1040
+ const node = files[ids.indexOf(id)];
1041
+ await eachNodeBestEffort(node, async () => await removeNodeFiles(node));
1042
+ }
1043
+ return deleted;
1044
+ }
1045
+ /** Retention sweep: remove TERMINAL nodes (status dead | done | canceled) whose
1046
+ * last activity ({@link lastActivityMs}) is older than `ttlDays`, bounding the
1047
+ * otherwise-unbounded growth of node rows + dirs. Only {@link isCollectible}
1048
+ * rows qualify, and never one `held` claims. Each node is deleted with what it
1049
+ * owns ({@link deleteNodeWithOwned}); the on-disk `nodes/<id>/` dir is removed too.
1050
+ *
1051
+ * With `includeStale`, ALSO prunes nominally-live (active | idle) nodes past the
1052
+ * TTL whose process is provably gone and that nothing will bring back: no live
1053
+ * `pi_pid`, not sleeping until a wake (`idle-release`), no unseen wake mail,
1054
+ * not frozen, not in respawn backoff, not an app run, not held, and never the CALLER
1055
+ * ($CRTR_NODE_ID). Without the flag, active | idle are NEVER touched.
1056
+ *
1057
+ * Each node's rows change in its own transaction. Dir removals follow after COMMIT — the fs isn't transactional, and by then
1058
+ * the rows are gone, so a re-run never re-finds a half-deleted node. `dryRun`
1059
+ * reports the candidate set and deletes NOTHING. */
1060
+ export async function pruneNodes(opts) {
1061
+ const dryRun = opts.dryRun ?? false;
1062
+ const includeStale = opts.includeStale ?? false;
1063
+ const cutoffMs = Date.now() - opts.ttlDays * 86_400_000;
1064
+ // `created` is a lower bound on last activity, so it is a sound SQL prefilter.
1065
+ const cutoff = new Date(cutoffMs).toISOString();
1066
+ const selfId = envNodeId() ?? '';
1067
+ const db = await openDb();
1068
+ const quiet = (row) => lastActivityMs(row) < cutoffMs;
1069
+ const toPruned = (row) => ({ node_id: row.node_id, status: row.status, created: row.created });
1070
+ const watchedOwners = await ownersOfWatchedDocuments();
1071
+ const terminal = (await filterAsync((await db.prepare(`SELECT * FROM node_rows
1072
+ WHERE status IN ('dead', 'done', 'canceled') AND created < ?
1073
+ ORDER BY created`)
1074
+ .all(cutoff))
1075
+ .map(rowFrom), async (row) => await isCollectible(row, { pastTtl: true }) && quiet(row) && !watchedOwners.has(row.node_id) && !await opts.held(row.node_id)))
1076
+ .map(toPruned);
1077
+ const stale = !includeStale ? [] : (await filterAsync((await db.prepare(`SELECT * FROM node_rows
1078
+ WHERE status IN ('active', 'idle') AND created < ?
1079
+ ORDER BY created`)
1080
+ .all(cutoff))
1081
+ .map(rowFrom), async (row) => row.node_id !== selfId
1082
+ && !isPidAlive(row.pi_pid ?? null)
1083
+ && (row.frozen_at ?? null) === null
1084
+ && (row.respawn_not_before ?? null) === null
1085
+ && row.intent !== 'idle-release'
1086
+ && !isAppRun(row)
1087
+ && !await hasUnseenWakeMail(row.node_id)
1088
+ && !await hasUnreconciledManagedWorktree(row.node_id)
1089
+ && quiet(row)
1090
+ && !await opts.held(row.node_id)))
1091
+ .map(toPruned);
1092
+ const candidates = await retainRunRootsWithMembers([...terminal, ...stale]);
1093
+ if (dryRun || candidates.length === 0)
1094
+ return { pruned: candidates, dryRun };
1095
+ await deletePrunedNodes(candidates, opts.removeDirs);
1096
+ return { pruned: candidates, dryRun };
1097
+ }
1098
+ /** Nodes that own a live document some other live object still watches. Deleting such a node deletes the document under
1099
+ * that watcher (only a link from a live document keeps one), so the sweep leaves the node until the watcher ends. A
1100
+ * watcher is live when it is not a node (a profile, an app, a person) or is a node that is active or idle; a finished
1101
+ * node's watches end with it. */
1102
+ async function ownersOfWatchedDocuments() {
1103
+ const rows = await (await openDb()).prepare(`SELECT DISTINCT d.owner AS owner FROM watches w
1104
+ JOIN objects d ON d.id = w.object AND d.type = 'document' AND d.deleted_at IS NULL
1105
+ JOIN objects o ON o.id = w.watcher AND o.deleted_at IS NULL
1106
+ LEFT JOIN nodes n ON n.node_id = w.watcher
1107
+ WHERE w.watcher != d.owner AND d.owner IS NOT NULL AND (n.node_id IS NULL OR n.status IN ('active', 'idle'))`)
1108
+ .all();
1109
+ return new Set(rows.map((r) => r.owner));
1110
+ }
1111
+ /** A run's nodes all carry the root's `run_id`, and the run observer and every
1112
+ * run-event append read the root's row. A sweep therefore never deletes a run
1113
+ * root while a node of its run survives: a member can be retained alone (its
1114
+ * managed worktree is unreconciled, `held` claims it, it is still live), and
1115
+ * deleting the root under it leaves a `run_id` that points at nothing. The
1116
+ * root goes on a later sweep, once its last member has. */
1117
+ async function retainRunRootsWithMembers(candidates) {
1118
+ const db = await openDb();
1119
+ const members = db.prepare('SELECT node_id FROM nodes WHERE run_id = ? AND node_id != ?');
1120
+ const sweeping = new Set(candidates.map((c) => c.node_id));
1121
+ return (await filterAsync(candidates, async (c) => (await members.all(c.node_id, c.node_id)).every((m) => sweeping.has(m.node_id))));
1122
+ }
1123
+ /** Delete a set of pruned nodes, each with what it owns in its own transaction, followed by best-effort
1124
+ * on-disk `nodes/<id>/` removal. Shared by TTL and count pruning so their
1125
+ * delete semantics never drift. `removeDirs` replaces the synchronous removal
1126
+ * (the daemon passes an async one so a large sweep never blocks its tick). */
1127
+ async function deletePrunedNodes(candidates, removeDirs) {
1128
+ if (candidates.length === 0)
1129
+ return;
1130
+ const files = (await mapAsync(candidates, async (c) => await nodeFiles(c.node_id)));
1131
+ const conversations = await nodeConversationIds(candidates.map((c) => c.node_id));
1132
+ for (const c of candidates)
1133
+ await withCanvasWrite(async (db) => await deleteNodeObject(db, c.node_id));
1134
+ await deleteNodeConversations(conversations);
1135
+ if (removeDirs !== undefined) {
1136
+ for (const node of files) {
1137
+ await eachNodeBestEffort(node, async () => {
1138
+ await removeNodeAppTrees(node);
1139
+ removeNodeConversationDir(node);
1140
+ });
1141
+ }
1142
+ removeDirs(files.flatMap(nodeOwnedDirs));
1143
+ return;
1144
+ }
1145
+ for (const node of files)
1146
+ await eachNodeBestEffort(node, async () => await removeNodeFiles(node));
1147
+ }
1148
+ /** The rows are already gone, so one node's refused or failed removal is
1149
+ * logged and the batch continues: nothing finds these directories later. */
1150
+ async function eachNodeBestEffort(node, remove) {
1151
+ try {
1152
+ remove();
1153
+ }
1154
+ catch (error) {
1155
+ emitEvent({ level: 'error', event: 'canvas.node_files.remove_failed', error, fields: { node_id: node.nodeId } });
1156
+ }
1157
+ }
1158
+ /** A node's most recent activity (epoch ms): the latest of its lifecycle
1159
+ * timestamps (created, launched, settled, finalized, outcome, last run event)
1160
+ * and the mtime of `job/telemetry.json`, which every turn_end rewrites. 0 when
1161
+ * none is readable. The single clock every retention decision uses. Never throws. */
1162
+ export function lastActivityMs(row) {
1163
+ let latest = 0;
1164
+ for (const value of [row.created, row.launched_at, row.last_settled_at, row.finalized_at, row.outcome_at, row.last_activity_at]) {
1165
+ if (value === null || value === undefined)
1166
+ continue;
1167
+ const t = Date.parse(value);
1168
+ if (Number.isFinite(t) && t > latest)
1169
+ latest = t;
1170
+ }
1171
+ try {
1172
+ const st = statSync(join(jobDir(row.node_id), 'telemetry.json'), { throwIfNoEntry: false });
1173
+ if (st !== undefined && st.mtimeMs > latest)
1174
+ latest = st.mtimeMs;
1175
+ }
1176
+ catch {
1177
+ /* telemetry is disposable */
1178
+ }
1179
+ return latest;
1180
+ }
1181
+ /** Count-based retention sweep: keep every row that is not collectible or that
1182
+ * `held` claims, plus the most recently active collectible rows up to
1183
+ * `maxNodes` in total, so the real retained floor is `max(maxNodes,
1184
+ * retainedCount)`. Bounds the growth the TTL sweep can't (a canvas that never
1185
+ * crosses the TTL still grows without limit). Recency is {@link lastActivityMs}.
1186
+ *
1187
+ * Mirrors {@link pruneNodes} exactly for the delete (shared `deletePrunedNodes`:
1188
+ * transactioned row sweep + FK edge cascade + best-effort dir removal). `dryRun`
1189
+ * reports the candidate set and deletes NOTHING. */
1190
+ export async function pruneToLimit(opts) {
1191
+ const dryRun = opts.dryRun ?? false;
1192
+ const rows = await listNodes();
1193
+ const collectible = (await filterAsync(rows, async (row) => await isCollectible(row) && !await opts.held(row.node_id)));
1194
+ const retainedCount = rows.length - collectible.length;
1195
+ const keep = Math.max(0, opts.maxNodes - retainedCount);
1196
+ const unfiltered = collectible
1197
+ .map((row) => ({ row, recency: lastActivityMs(row) }))
1198
+ .sort((a, b) => b.recency - a.recency)
1199
+ .slice(keep)
1200
+ .map(({ row }) => ({ node_id: row.node_id, status: row.status, created: row.created }));
1201
+ const candidates = await retainRunRootsWithMembers(unfiltered);
1202
+ if (dryRun || candidates.length === 0)
1203
+ return { pruned: candidates, dryRun };
1204
+ await deletePrunedNodes(candidates);
1205
+ return { pruned: candidates, dryRun };
1206
+ }