@north-light/crouter 0.3.349 → 0.3.351

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 (629) hide show
  1. package/bin/crtr-launcher +4 -0
  2. package/bin/runtime-generation-manifest.mjs +12 -2
  3. package/dist/api/client.d.ts +50 -7
  4. package/dist/api/client.js +2 -2
  5. package/dist/api/dto/analytics.d.ts +184 -0
  6. package/dist/api/dto/analytics.js +0 -0
  7. package/dist/api/dto/broker-ops.d.ts +43 -1
  8. package/dist/api/dto/config.d.ts +11 -0
  9. package/dist/api/dto/grants.d.ts +14 -0
  10. package/dist/api/dto/grants.js +0 -0
  11. package/dist/api/dto/human-requests.d.ts +14 -0
  12. package/dist/api/dto/memory.d.ts +6 -0
  13. package/dist/api/dto/modelauth.d.ts +35 -0
  14. package/dist/api/dto/node-records.d.ts +35 -0
  15. package/dist/api/dto/node-records.js +0 -0
  16. package/dist/api/dto/nodes.d.ts +5 -0
  17. package/dist/api/dto/profiles.d.ts +38 -3
  18. package/dist/api/dto/worktree.d.ts +11 -0
  19. package/dist/api/errors.d.ts +23 -1
  20. package/dist/api/errors.js +1 -1
  21. package/dist/api/index.d.ts +2 -0
  22. package/dist/api/index.js +1 -1
  23. package/dist/api/node-transport.js +1 -1
  24. package/dist/api/routes.d.ts +22 -0
  25. package/dist/api/routes.js +1 -1
  26. package/dist/build-root.d.ts +6 -1
  27. package/dist/build-root.js +1 -1
  28. package/dist/builtin-memory/crouter-sdk/client.md +34 -0
  29. package/dist/builtin-memory/crouter-sdk/errors.md +2 -0
  30. package/dist/builtin-memory/crouter-sdk/memory.md +2 -2
  31. package/dist/builtin-memory/crouter-sdk/streaming.md +21 -0
  32. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +8 -4
  33. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +39 -118
  34. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +6 -1
  35. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +41 -27
  36. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +52 -29
  37. package/dist/cli.js +9 -8
  38. package/dist/clients/attach/chrome/inbox-strip.js +1 -1
  39. package/dist/clients/attach/chrome/roster.js +1 -1
  40. package/dist/clients/attach/config.js +1 -1
  41. package/dist/clients/attach/overlays/auth.js +2 -2
  42. package/dist/clients/attach/overlays/graph.js +1 -1
  43. package/dist/clients/attach/render/tool-calls.js +3 -3
  44. package/dist/clients/attach/session/connection.js +1 -1
  45. package/dist/clients/attach/session/profile-files.js +1 -1
  46. package/dist/clients/attach/viewer.js +1569 -816
  47. package/dist/commands/api-client.js +3 -3
  48. package/dist/commands/broker-permissions.d.ts +2 -0
  49. package/dist/commands/broker-permissions.js +1 -0
  50. package/dist/commands/canvas-analytics/chart.d.ts +52 -0
  51. package/dist/commands/canvas-analytics/chart.js +1 -0
  52. package/dist/commands/canvas-analytics/drilldown.d.ts +34 -0
  53. package/dist/commands/canvas-analytics/drilldown.js +1 -0
  54. package/dist/commands/canvas-analytics/format.d.ts +29 -0
  55. package/dist/commands/canvas-analytics/format.js +1 -0
  56. package/dist/commands/canvas-analytics/graph-detail.d.ts +2 -0
  57. package/dist/commands/canvas-analytics/graph-detail.js +2 -0
  58. package/dist/commands/canvas-analytics/graphs.d.ts +9 -0
  59. package/dist/commands/canvas-analytics/graphs.js +1 -0
  60. package/dist/commands/canvas-analytics/memory.d.ts +2 -0
  61. package/dist/commands/canvas-analytics/memory.js +1 -0
  62. package/dist/commands/canvas-analytics/overview.d.ts +2 -0
  63. package/dist/commands/canvas-analytics/overview.js +1 -0
  64. package/dist/commands/canvas-analytics/shell.d.ts +60 -0
  65. package/dist/commands/canvas-analytics/shell.js +2 -0
  66. package/dist/commands/canvas-analytics/time.d.ts +2 -0
  67. package/dist/commands/canvas-analytics/time.js +1 -0
  68. package/dist/commands/canvas-analytics/usage.d.ts +2 -0
  69. package/dist/commands/canvas-analytics/usage.js +1 -0
  70. package/dist/commands/canvas-analytics/view.d.ts +85 -0
  71. package/dist/commands/canvas-analytics/view.js +1 -0
  72. package/dist/commands/canvas-analytics.d.ts +2 -0
  73. package/dist/commands/canvas-analytics.js +1 -0
  74. package/dist/commands/canvas-prune.js +1 -1
  75. package/dist/commands/canvas.js +1 -1
  76. package/dist/commands/cron.js +5 -5
  77. package/dist/commands/human/components.d.ts +2 -0
  78. package/dist/commands/human/components.js +2 -2
  79. package/dist/commands/human/prompts.js +1 -1
  80. package/dist/commands/human/queue.js +1 -1
  81. package/dist/commands/memory/client.d.ts +11 -0
  82. package/dist/commands/memory/client.js +1 -0
  83. package/dist/commands/memory/delete.js +1 -1
  84. package/dist/commands/memory/edit.js +3 -3
  85. package/dist/commands/memory/find.js +1 -1
  86. package/dist/commands/memory/history.js +4 -4
  87. package/dist/commands/memory/lint.js +1 -1
  88. package/dist/commands/memory/list.d.ts +0 -2
  89. package/dist/commands/memory/list.js +1 -1
  90. package/dist/commands/memory/move.js +1 -1
  91. package/dist/commands/memory/origin.js +1 -1
  92. package/dist/commands/memory/read.d.ts +0 -5
  93. package/dist/commands/memory/read.js +3 -3
  94. package/dist/commands/memory/shared.d.ts +0 -178
  95. package/dist/commands/memory/shared.js +1 -12
  96. package/dist/commands/memory/write.js +5 -5
  97. package/dist/commands/node/bash.js +5 -5
  98. package/dist/commands/node/create.d.ts +0 -17
  99. package/dist/commands/node/create.js +2 -3
  100. package/dist/commands/node/inspect.js +6 -6
  101. package/dist/commands/node/lifecycle.js +2 -2
  102. package/dist/commands/node-context.js +2 -2
  103. package/dist/commands/node-inspect-artifacts.js +6 -6
  104. package/dist/commands/pkg/browse/catalog.js +1 -1
  105. package/dist/commands/pkg/browse/model.d.ts +1 -1
  106. package/dist/commands/pkg/market-manage.js +1 -1
  107. package/dist/commands/pkg/plugin-manage.js +10 -10
  108. package/dist/commands/profile/daemon-profiles.d.ts +13 -0
  109. package/dist/commands/profile/daemon-profiles.js +4 -0
  110. package/dist/commands/profile/delete.js +1 -1
  111. package/dist/commands/profile/env.d.ts +6 -0
  112. package/dist/commands/profile/env.js +2 -2
  113. package/dist/commands/profile/kind.js +1 -2
  114. package/dist/commands/profile/list.js +1 -1
  115. package/dist/commands/profile/meta.js +1 -1
  116. package/dist/commands/profile/new.js +1 -1
  117. package/dist/commands/profile/pause.js +1 -1
  118. package/dist/commands/profile/project.js +1 -1
  119. package/dist/commands/profile/rename.js +1 -1
  120. package/dist/commands/profile/show.js +1 -1
  121. package/dist/commands/profile.js +1 -1
  122. package/dist/commands/push.js +3 -3
  123. package/dist/commands/surface-inspect.js +1 -1
  124. package/dist/commands/sys/branch.js +1 -1
  125. package/dist/commands/sys/config.js +1 -1
  126. package/dist/commands/sys/connect.js +3 -3
  127. package/dist/commands/sys/context/admin/actions.js +1 -1
  128. package/dist/commands/sys/context/admin/model.d.ts +1 -0
  129. package/dist/commands/sys/context/admin/model.js +1 -1
  130. package/dist/commands/sys/context/admin.js +1 -1
  131. package/dist/commands/sys/context/expose.js +2 -1
  132. package/dist/commands/sys/context/prompt-review.js +2 -2
  133. package/dist/commands/sys/context/resolve.js +7 -7
  134. package/dist/commands/sys/context/sysprompt.js +1 -1
  135. package/dist/commands/sys/join.d.ts +1 -0
  136. package/dist/commands/sys/join.js +1 -0
  137. package/dist/commands/sys/migrate.js +1 -1
  138. package/dist/commands/sys/panels/models-panel.js +1 -1
  139. package/dist/commands/sys/panels/profiles-panel.d.ts +0 -1
  140. package/dist/commands/sys/panels/profiles-panel.js +1 -1
  141. package/dist/commands/sys/provider-login.js +6 -6
  142. package/dist/commands/sys/setup-core.d.ts +1 -1
  143. package/dist/commands/sys/setup-core.js +6 -6
  144. package/dist/commands/sys/setup-settings-runner.js +1 -1
  145. package/dist/commands/sys/setup.js +1 -1
  146. package/dist/commands/sys/spaces.d.ts +1 -0
  147. package/dist/commands/sys/spaces.js +2 -0
  148. package/dist/commands/sys/sync-deps.js +2 -2
  149. package/dist/commands/sys/sync-project-guidance.js +4 -4
  150. package/dist/commands/sys/sync-skills.js +2 -2
  151. package/dist/commands/sys/worktrees.d.ts +1 -0
  152. package/dist/commands/sys/worktrees.js +1 -1
  153. package/dist/commands/sys.js +1 -1
  154. package/dist/core/auth-file.js +2 -2
  155. package/dist/core/bash-job-supervisor.d.ts +6 -0
  156. package/dist/core/bash-job-supervisor.js +4 -0
  157. package/dist/core/bash-jobs.d.ts +13 -6
  158. package/dist/core/bash-jobs.js +8 -7
  159. package/dist/core/broker-client/transport-relay.d.ts +6 -3
  160. package/dist/core/broker-client/transport-relay.js +1 -1
  161. package/dist/core/broker-client/transport-socket.d.ts +6 -1
  162. package/dist/core/broker-client/transport-socket.js +1 -1
  163. package/dist/core/canvas/canvas.d.ts +39 -18
  164. package/dist/core/canvas/canvas.js +21 -20
  165. package/dist/core/canvas/context-strip.d.ts +20 -0
  166. package/dist/core/canvas/context-strip.js +5 -0
  167. package/dist/core/canvas/crons.d.ts +12 -20
  168. package/dist/core/canvas/crons.js +15 -13
  169. package/dist/core/canvas/db.js +2 -2
  170. package/dist/core/canvas/deliveries.d.ts +4 -1
  171. package/dist/core/canvas/deliveries.js +1 -1
  172. package/dist/core/canvas/executions.js +1 -1
  173. package/dist/core/canvas/history.d.ts +2 -1
  174. package/dist/core/canvas/history.js +17 -18
  175. package/dist/core/canvas/memory-reads.d.ts +19 -0
  176. package/dist/core/canvas/memory-reads.js +1 -0
  177. package/dist/core/canvas/migrations.d.ts +0 -4
  178. package/dist/core/canvas/migrations.js +99 -32
  179. package/dist/core/canvas/nav-render.js +1 -1
  180. package/dist/core/canvas/node-agent-paths.d.ts +8 -0
  181. package/dist/core/canvas/node-agent-paths.js +1 -0
  182. package/dist/core/canvas/node-recap.d.ts +2 -2
  183. package/dist/core/canvas/node-recap.js +2 -2
  184. package/dist/core/canvas/node-tokens.d.ts +24 -0
  185. package/dist/core/canvas/node-tokens.js +5 -0
  186. package/dist/core/canvas/paths.d.ts +16 -19
  187. package/dist/core/canvas/paths.js +1 -1
  188. package/dist/core/canvas/render-source.d.ts +2 -2
  189. package/dist/core/canvas/render-source.js +6 -9
  190. package/dist/core/canvas/sessions.d.ts +18 -0
  191. package/dist/core/canvas/sessions.js +4 -1
  192. package/dist/core/canvas/types.d.ts +22 -6
  193. package/dist/core/command-hooks/compose.js +1 -1
  194. package/dist/core/command-hooks/discovery.d.ts +15 -1
  195. package/dist/core/command-hooks/discovery.js +1 -1
  196. package/dist/core/command-hooks/help.d.ts +2 -2
  197. package/dist/core/command-hooks/lifecycle-create.d.ts +1 -1
  198. package/dist/core/command-hooks/lifecycle-create.js +1 -1
  199. package/dist/core/command-hooks/transport/exec-invoke.d.ts +2 -0
  200. package/dist/core/command-hooks/transport/exec-invoke.js +1 -1
  201. package/dist/core/command-hooks/transport/exec-lifecycle.d.ts +1 -0
  202. package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -1
  203. package/dist/core/command-hooks/transport/plan.d.ts +3 -0
  204. package/dist/core/command-hooks/transport/plan.js +1 -0
  205. package/dist/core/command-plugins/discovery.js +1 -1
  206. package/dist/core/command.d.ts +6 -2
  207. package/dist/core/command.js +6 -6
  208. package/dist/core/config.d.ts +8 -5
  209. package/dist/core/config.js +1 -1
  210. package/dist/core/conversation-store/client-worker.d.ts +1 -0
  211. package/dist/core/conversation-store/client-worker.js +1 -0
  212. package/dist/core/conversation-store/client.d.ts +2 -0
  213. package/dist/core/conversation-store/client.js +2 -0
  214. package/dist/core/conversation-store/file-store.d.ts +37 -0
  215. package/dist/core/conversation-store/file-store.js +9 -0
  216. package/dist/core/conversation-store/index.d.ts +50 -0
  217. package/dist/core/conversation-store/index.js +1 -0
  218. package/dist/core/conversation-store/listener.d.ts +4 -0
  219. package/dist/core/conversation-store/listener.js +3 -0
  220. package/dist/core/conversation-store/patch.d.ts +1 -0
  221. package/dist/core/conversation-store/patch.js +1 -0
  222. package/dist/core/directory/join.d.ts +27 -0
  223. package/dist/core/directory/join.js +1 -0
  224. package/dist/core/disk-usage.d.ts +4 -0
  225. package/dist/core/disk-usage.js +1 -0
  226. package/dist/core/events/emit.d.ts +2 -0
  227. package/dist/core/events/emit.js +3 -1
  228. package/dist/core/feed/feed.js +4 -4
  229. package/dist/core/feed/messages.d.ts +3 -0
  230. package/dist/core/feed/messages.js +6 -6
  231. package/dist/core/fs-utils.d.ts +2 -0
  232. package/dist/core/fs-utils.js +3 -3
  233. package/dist/core/grants/local.d.ts +4 -0
  234. package/dist/core/grants/local.js +1 -0
  235. package/dist/core/grants/mirror.d.ts +44 -0
  236. package/dist/core/grants/mirror.js +4 -0
  237. package/dist/core/grants/on-sync.d.ts +22 -0
  238. package/dist/core/grants/on-sync.js +1 -0
  239. package/dist/core/grants/remove.d.ts +7 -0
  240. package/dist/core/grants/remove.js +1 -0
  241. package/dist/core/grants/sandboxes.d.ts +7 -0
  242. package/dist/core/grants/sandboxes.js +1 -0
  243. package/dist/core/grants/sync.d.ts +12 -0
  244. package/dist/core/grants/sync.js +1 -0
  245. package/dist/core/help/memory-extensions.d.ts +3 -0
  246. package/dist/core/help/memory-extensions.js +2 -0
  247. package/dist/core/help.d.ts +14 -0
  248. package/dist/core/help.js +7 -7
  249. package/dist/core/host-exports/builtins.js +3 -3
  250. package/dist/core/host-exports/export.js +3 -3
  251. package/dist/core/human/action-binding.d.ts +2 -0
  252. package/dist/core/human/action-binding.js +1 -1
  253. package/dist/core/human/feedback-companion.d.ts +0 -1
  254. package/dist/core/human/feedback-companion.js +1 -1
  255. package/dist/core/human/page-schema.d.ts +1 -1
  256. package/dist/core/inspector/core.d.ts +2 -0
  257. package/dist/core/inspector/core.js +1 -1
  258. package/dist/core/inspector/tui.js +2 -2
  259. package/dist/core/installed-plugins.js +1 -1
  260. package/dist/core/io.js +6 -6
  261. package/dist/core/keybindings/catalog.d.ts +1 -1
  262. package/dist/core/keybindings/catalog.js +1 -1
  263. package/dist/core/layout-migrate/index.d.ts +15 -0
  264. package/dist/core/layout-migrate/index.js +4 -0
  265. package/dist/core/layout-migrate/paths.d.ts +26 -0
  266. package/dist/core/layout-migrate/paths.js +1 -0
  267. package/dist/core/layout-migrate/stored-paths.d.ts +2 -0
  268. package/dist/core/layout-migrate/stored-paths.js +11 -0
  269. package/dist/core/layout-migrate/stores.d.ts +17 -0
  270. package/dist/core/layout-migrate/stores.js +4 -0
  271. package/dist/core/layout.d.ts +26 -0
  272. package/dist/core/layout.js +2 -0
  273. package/dist/core/llm/run.d.ts +60 -0
  274. package/dist/core/llm/run.js +4 -0
  275. package/dist/core/memory/cli-selector.d.ts +13 -0
  276. package/dist/core/memory/cli-selector.js +1 -0
  277. package/dist/core/memory/history.d.ts +5 -4
  278. package/dist/core/memory/history.js +6 -6
  279. package/dist/core/memory/inline-ref-inventory.d.ts +2 -1
  280. package/dist/core/memory/inline-ref-inventory.js +1 -1
  281. package/dist/core/memory/lint.js +2 -2
  282. package/dist/core/memory/mutation-domain.d.ts +2 -2
  283. package/dist/core/memory/mutation-domain.js +8 -7
  284. package/dist/core/memory/mutations.js +1 -1
  285. package/dist/core/memory/service.d.ts +5 -0
  286. package/dist/core/memory/service.js +2 -2
  287. package/dist/core/memory-resolver.d.ts +11 -7
  288. package/dist/core/memory-resolver.js +2 -2
  289. package/dist/core/model-auth/daemon-login.d.ts +13 -0
  290. package/dist/core/model-auth/daemon-login.js +1 -0
  291. package/dist/core/model-auth/flows.d.ts +45 -0
  292. package/dist/core/model-auth/flows.js +1 -0
  293. package/dist/core/model-auth/handoff-jti.d.ts +4 -0
  294. package/dist/core/model-auth/handoff-jti.js +1 -0
  295. package/dist/core/model-routes.js +1 -1
  296. package/dist/core/nested-stores.d.ts +2 -1
  297. package/dist/core/nested-stores.js +1 -2
  298. package/dist/core/preview-registry.js +2 -2
  299. package/dist/core/profiles/env-store.js +2 -2
  300. package/dist/core/profiles/manifest.d.ts +16 -5
  301. package/dist/core/profiles/manifest.js +1 -1
  302. package/dist/core/provider-management.js +1 -1
  303. package/dist/core/review/birth.js +1 -1
  304. package/dist/core/review/companion.d.ts +0 -2
  305. package/dist/core/review/companion.js +1 -1
  306. package/dist/core/review/fork.js +2 -2
  307. package/dist/core/review/realize.js +1 -1
  308. package/dist/core/review/stage.d.ts +1 -1
  309. package/dist/core/review/stage.js +1 -1
  310. package/dist/core/review/types.d.ts +1 -1
  311. package/dist/core/runs/events.d.ts +34 -0
  312. package/dist/core/runs/events.js +1 -0
  313. package/dist/core/runs/operations.d.ts +43 -0
  314. package/dist/core/runs/operations.js +12 -0
  315. package/dist/core/runtime/bearings-render.d.ts +2 -2
  316. package/dist/core/runtime/bearings-render.js +11 -11
  317. package/dist/core/runtime/bearings.js +2 -2
  318. package/dist/core/runtime/broker/cli-relay.d.ts +5 -0
  319. package/dist/core/runtime/broker/cli-relay.js +1 -0
  320. package/dist/core/runtime/broker/client-registry.d.ts +0 -5
  321. package/dist/core/runtime/broker/client-registry.js +1 -1
  322. package/dist/core/runtime/broker/daemon-ops.d.ts +28 -1
  323. package/dist/core/runtime/broker/daemon-ops.js +1 -1
  324. package/dist/core/runtime/broker/engine-drive.d.ts +0 -2
  325. package/dist/core/runtime/broker/engine-drive.js +1 -1
  326. package/dist/core/runtime/broker/fault-retry.d.ts +9 -0
  327. package/dist/core/runtime/broker/fault-retry.js +1 -1
  328. package/dist/core/runtime/broker/frame-dispatch.d.ts +5 -9
  329. package/dist/core/runtime/broker/frame-dispatch.js +1 -1
  330. package/dist/core/runtime/broker/frame-engine-control.d.ts +3 -2
  331. package/dist/core/runtime/broker/frame-engine-control.js +1 -1
  332. package/dist/core/runtime/broker/frame-memory-refs.d.ts +4 -3
  333. package/dist/core/runtime/broker/frame-memory-refs.js +1 -1
  334. package/dist/core/runtime/broker/frame-read.js +1 -1
  335. package/dist/core/runtime/broker/frame-session.js +1 -1
  336. package/dist/core/runtime/broker/held-deferred-inbox.d.ts +3 -1
  337. package/dist/core/runtime/broker/held-deferred-inbox.js +1 -1
  338. package/dist/core/runtime/broker/inbox.d.ts +1 -2
  339. package/dist/core/runtime/broker/inbox.js +7 -10
  340. package/dist/core/runtime/broker/model-adapter.d.ts +9 -0
  341. package/dist/core/runtime/broker/model-adapter.js +2 -0
  342. package/dist/core/runtime/broker/node-token.d.ts +3 -0
  343. package/dist/core/runtime/broker/node-token.js +1 -0
  344. package/dist/core/runtime/broker/read-ops.js +1 -1
  345. package/dist/core/runtime/broker/rebind.d.ts +2 -0
  346. package/dist/core/runtime/broker/rebind.js +1 -1
  347. package/dist/core/runtime/broker/tool-groups.js +1 -1
  348. package/dist/core/runtime/broker/turn-ignition.d.ts +3 -3
  349. package/dist/core/runtime/broker/turn-ignition.js +1 -1
  350. package/dist/core/runtime/broker-cli.js +3 -3
  351. package/dist/core/runtime/broker-extension-render.d.ts +2 -5
  352. package/dist/core/runtime/broker-extension-render.js +4 -4
  353. package/dist/core/runtime/broker-persona-guidance.js +3 -3
  354. package/dist/core/runtime/broker-protocol.d.ts +7 -8
  355. package/dist/core/runtime/broker.js +1 -1
  356. package/dist/core/runtime/canvas-extensions.d.ts +1 -0
  357. package/dist/core/runtime/canvas-extensions.js +1 -1
  358. package/dist/core/runtime/close.d.ts +9 -0
  359. package/dist/core/runtime/close.js +1 -1
  360. package/dist/core/runtime/deliver-live.js +1 -1
  361. package/dist/core/runtime/fleet.d.ts +1 -1
  362. package/dist/core/runtime/front-door-login.js +1 -1
  363. package/dist/core/runtime/front-door.js +2 -2
  364. package/dist/core/runtime/headless-pi.d.ts +1 -1
  365. package/dist/core/runtime/headless-pi.js +1 -1
  366. package/dist/core/runtime/host.d.ts +1 -1
  367. package/dist/core/runtime/host.js +3 -1
  368. package/dist/core/runtime/invocation.d.ts +3 -0
  369. package/dist/core/runtime/kickoff.d.ts +1 -0
  370. package/dist/core/runtime/kickoff.js +16 -16
  371. package/dist/core/runtime/launch-target.d.ts +1 -1
  372. package/dist/core/runtime/launch-target.js +1 -1
  373. package/dist/core/runtime/launch.d.ts +10 -35
  374. package/dist/core/runtime/launch.js +1 -1
  375. package/dist/core/runtime/lifecycle.js +2 -2
  376. package/dist/core/runtime/memory.d.ts +1 -1
  377. package/dist/core/runtime/memory.js +1 -1
  378. package/dist/core/runtime/model-registry.js +1 -1
  379. package/dist/core/runtime/model-swap.d.ts +17 -19
  380. package/dist/core/runtime/model-swap.js +1 -1
  381. package/dist/core/runtime/node-read.js +3 -2
  382. package/dist/core/runtime/nodes.d.ts +7 -0
  383. package/dist/core/runtime/nodes.js +1 -1
  384. package/dist/core/runtime/outcome-document.js +1 -1
  385. package/dist/core/runtime/package-health.js +2 -2
  386. package/dist/core/runtime/persona.js +2 -2
  387. package/dist/core/runtime/pi-vendored.js +1 -1
  388. package/dist/core/runtime/placement-tmux.d.ts +1 -1
  389. package/dist/core/runtime/placement-tmux.js +1 -1
  390. package/dist/core/runtime/placement.js +1 -1
  391. package/dist/core/runtime/promote.js +1 -1
  392. package/dist/core/runtime/provider-credential-gate.js +2 -2
  393. package/dist/core/runtime/recovery-hold.d.ts +2 -0
  394. package/dist/core/runtime/recovery-hold.js +1 -0
  395. package/dist/core/runtime/recycle.js +1 -1
  396. package/dist/core/runtime/reopen.js +1 -1
  397. package/dist/core/runtime/reset.js +1 -1
  398. package/dist/core/runtime/revive.d.ts +1 -1
  399. package/dist/core/runtime/revive.js +2 -3
  400. package/dist/core/runtime/roadmap.js +4 -4
  401. package/dist/core/runtime/run-command.d.ts +6 -0
  402. package/dist/core/runtime/run-command.js +1 -1
  403. package/dist/core/runtime/session-branch.d.ts +2 -8
  404. package/dist/core/runtime/session-branch.js +1 -1
  405. package/dist/core/runtime/session-list-cache.d.ts +6 -22
  406. package/dist/core/runtime/session-list-cache.js +1 -1
  407. package/dist/core/runtime/situational-context.js +2 -2
  408. package/dist/core/runtime/spawn-env.d.ts +6 -6
  409. package/dist/core/runtime/spawn-env.js +1 -1
  410. package/dist/core/runtime/spawn.d.ts +5 -0
  411. package/dist/core/runtime/spawn.js +2 -2
  412. package/dist/core/runtime/stop-guard.js +2 -2
  413. package/dist/core/runtime/stop-signals.d.ts +2 -2
  414. package/dist/core/runtime/stop-signals.js +1 -1
  415. package/dist/core/runtime/structured-output.d.ts +10 -4
  416. package/dist/core/runtime/structured-output.js +4 -4
  417. package/dist/core/runtime/tmux-bindings.js +3 -3
  418. package/dist/core/runtime/tmux-driver.d.ts +4 -0
  419. package/dist/core/runtime/tmux-driver.js +7 -7
  420. package/dist/core/runtime/view-socket.d.ts +9 -2
  421. package/dist/core/runtime/view-socket.js +1 -1
  422. package/dist/core/runtime/warm-pool.js +1 -1
  423. package/dist/core/scope.d.ts +3 -2
  424. package/dist/core/scope.js +1 -1
  425. package/dist/core/scoped-state/db.js +1 -1
  426. package/dist/core/scoped-state/migrate.js +3 -3
  427. package/dist/core/scoped-state/profiles.d.ts +2 -1
  428. package/dist/core/scoped-state/profiles.js +1 -1
  429. package/dist/core/scoped-state/schema.d.ts +2 -1
  430. package/dist/core/scoped-state/schema.js +4 -4
  431. package/dist/core/scopes.d.ts +2 -2
  432. package/dist/core/scopes.js +1 -1
  433. package/dist/core/secrets.d.ts +1 -0
  434. package/dist/core/secrets.js +2 -2
  435. package/dist/core/spaces/mounts.d.ts +32 -0
  436. package/dist/core/spaces/mounts.js +1 -0
  437. package/dist/core/spaces/open-beneath.d.ts +71 -0
  438. package/dist/core/spaces/open-beneath.js +1 -0
  439. package/dist/core/spaces/permissions.d.ts +46 -0
  440. package/dist/core/spaces/permissions.js +1 -0
  441. package/dist/core/spaces/process.d.ts +27 -0
  442. package/dist/core/spaces/process.js +1 -0
  443. package/dist/core/spaces/space.d.ts +8 -0
  444. package/dist/core/spaces/space.js +2 -0
  445. package/dist/core/spaces/stop.d.ts +8 -0
  446. package/dist/core/spaces/stop.js +2 -0
  447. package/dist/core/spaces/users.d.ts +19 -0
  448. package/dist/core/spaces/users.js +1 -0
  449. package/dist/core/subscription-state.d.ts +2 -0
  450. package/dist/core/subscription-state.js +3 -3
  451. package/dist/core/substrate/frontmatter-validation.js +1 -1
  452. package/dist/core/substrate/injected-store.d.ts +28 -3
  453. package/dist/core/substrate/injected-store.js +2 -1
  454. package/dist/core/substrate/listings.js +1 -1
  455. package/dist/core/substrate/memory-events.d.ts +6 -0
  456. package/dist/core/substrate/memory-events.js +1 -0
  457. package/dist/core/substrate/on-read-node.js +1 -1
  458. package/dist/core/substrate/on-read.d.ts +6 -6
  459. package/dist/core/substrate/on-read.js +5 -5
  460. package/dist/core/substrate/plan.js +1 -1
  461. package/dist/core/substrate/render-node.js +1 -1
  462. package/dist/core/substrate/render.d.ts +4 -3
  463. package/dist/core/substrate/render.js +38 -38
  464. package/dist/core/substrate/schema.d.ts +6 -0
  465. package/dist/core/substrate/schema.js +1 -1
  466. package/dist/core/tui/panel.js +1 -1
  467. package/dist/core/user-settings.d.ts +12 -0
  468. package/dist/core/user-settings.js +1 -1
  469. package/dist/core/worktree-mutation-async.js +5 -5
  470. package/dist/core/worktree-quarantine.js +1 -1
  471. package/dist/core/worktree-remove.d.ts +15 -0
  472. package/dist/core/worktree-remove.js +1 -0
  473. package/dist/core/worktree-sweep.js +6 -6
  474. package/dist/daemon/analytics/compute.d.ts +37 -0
  475. package/dist/daemon/analytics/compute.js +1 -0
  476. package/dist/daemon/analytics/scan-worker.d.ts +1 -0
  477. package/dist/daemon/analytics/scan-worker.js +2 -0
  478. package/dist/daemon/analytics/scan.d.ts +37 -0
  479. package/dist/daemon/analytics/scan.js +1 -0
  480. package/dist/daemon/api/app-listener.d.ts +11 -0
  481. package/dist/daemon/api/app-listener.js +21 -0
  482. package/dist/daemon/api/bridge.js +5 -5
  483. package/dist/daemon/api/handlers/analytics.d.ts +2 -0
  484. package/dist/daemon/api/handlers/analytics.js +1 -0
  485. package/dist/daemon/api/handlers/attach.js +1 -1
  486. package/dist/daemon/api/handlers/bash-jobs.js +2 -2
  487. package/dist/daemon/api/handlers/bash.js +1 -1
  488. package/dist/daemon/api/handlers/broker-ops.js +1 -1
  489. package/dist/daemon/api/handlers/canvas.d.ts +1 -1
  490. package/dist/daemon/api/handlers/canvas.js +6 -6
  491. package/dist/daemon/api/handlers/crons.js +1 -1
  492. package/dist/daemon/api/handlers/files.d.ts +1 -1
  493. package/dist/daemon/api/handlers/files.js +1 -1
  494. package/dist/daemon/api/handlers/health.js +2 -2
  495. package/dist/daemon/api/handlers/hook-exec.d.ts +2 -0
  496. package/dist/daemon/api/handlers/hook-exec.js +1 -0
  497. package/dist/daemon/api/handlers/human-requests.js +1 -1
  498. package/dist/daemon/api/handlers/inbox.js +1 -1
  499. package/dist/daemon/api/handlers/llm.d.ts +2 -0
  500. package/dist/daemon/api/handlers/llm.js +3 -0
  501. package/dist/daemon/api/handlers/memory-reads.d.ts +4 -0
  502. package/dist/daemon/api/handlers/memory-reads.js +1 -0
  503. package/dist/daemon/api/handlers/memory.js +5 -1
  504. package/dist/daemon/api/handlers/messages.js +2 -2
  505. package/dist/daemon/api/handlers/modelauth.js +1 -1
  506. package/dist/daemon/api/handlers/node-outcomes.js +1 -1
  507. package/dist/daemon/api/handlers/node-records.d.ts +2 -0
  508. package/dist/daemon/api/handlers/node-records.js +3 -0
  509. package/dist/daemon/api/handlers/nodes.d.ts +1 -1
  510. package/dist/daemon/api/handlers/nodes.js +1 -1
  511. package/dist/daemon/api/handlers/profiles.d.ts +4 -1
  512. package/dist/daemon/api/handlers/profiles.js +1 -1
  513. package/dist/daemon/api/handlers/reports.js +5 -3
  514. package/dist/daemon/api/handlers/reviews.d.ts +1 -1
  515. package/dist/daemon/api/handlers/reviews.js +1 -1
  516. package/dist/daemon/api/handlers/run-routes.d.ts +2 -0
  517. package/dist/daemon/api/handlers/run-routes.js +1 -0
  518. package/dist/daemon/api/handlers/runs.d.ts +9 -0
  519. package/dist/daemon/api/handlers/runs.js +1 -0
  520. package/dist/daemon/api/handlers/subscriptions.js +1 -1
  521. package/dist/daemon/api/handlers/worktree.js +1 -1
  522. package/dist/daemon/api/map.d.ts +10 -4
  523. package/dist/daemon/api/map.js +2 -2
  524. package/dist/daemon/api/operations.d.ts +18 -0
  525. package/dist/daemon/api/operations.js +1 -0
  526. package/dist/daemon/api/principal.d.ts +42 -0
  527. package/dist/daemon/api/principal.js +1 -0
  528. package/dist/daemon/api/router.d.ts +27 -3
  529. package/dist/daemon/api/router.js +1 -1
  530. package/dist/daemon/api/server.d.ts +4 -0
  531. package/dist/daemon/api/server.js +1 -1
  532. package/dist/daemon/api/vendor-signin.d.ts +7 -0
  533. package/dist/daemon/api/vendor-signin.js +77 -0
  534. package/dist/daemon/api/viewer-presence.d.ts +3 -0
  535. package/dist/daemon/api/viewer-presence.js +1 -0
  536. package/dist/daemon/cron/armed-context.d.ts +4 -0
  537. package/dist/daemon/cron/armed-context.js +1 -1
  538. package/dist/daemon/cron/escalation.js +3 -3
  539. package/dist/daemon/cron/lease-recovery.js +1 -1
  540. package/dist/daemon/cron/sinks.js +2 -2
  541. package/dist/daemon/cron-run.d.ts +5 -5
  542. package/dist/daemon/cron-run.js +1 -1
  543. package/dist/daemon/crtrd.js +8 -7
  544. package/dist/daemon/delivery/run-delivery.d.ts +4 -0
  545. package/dist/daemon/delivery/run-delivery.js +1 -1
  546. package/dist/daemon/fleet.d.ts +1 -1
  547. package/dist/daemon/fleet.js +6 -6
  548. package/dist/daemon/human/finish.js +7 -7
  549. package/dist/daemon/joined-owner.d.ts +5 -0
  550. package/dist/daemon/joined-owner.js +1 -0
  551. package/dist/daemon/manage.js +2 -2
  552. package/dist/daemon/messaging/node-message.js +1 -1
  553. package/dist/daemon/park-activity.js +1 -1
  554. package/dist/daemon/reconcilers/bash-deadline.js +1 -1
  555. package/dist/daemon/reconcilers/broker-supervision.d.ts +1 -1
  556. package/dist/daemon/reconcilers/broker-supervision.js +4 -4
  557. package/dist/daemon/reconcilers/delivery-lane.js +1 -1
  558. package/dist/daemon/reconcilers/live-obligation.d.ts +7 -0
  559. package/dist/daemon/reconcilers/live-obligation.js +1 -1
  560. package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -1
  561. package/dist/daemon/reconcilers/storage-maintenance.d.ts +20 -1
  562. package/dist/daemon/reconcilers/storage-maintenance.js +1 -1
  563. package/dist/daemon/runs/append-section.d.ts +6 -0
  564. package/dist/daemon/runs/append-section.js +2 -0
  565. package/dist/daemon/runs/observer.d.ts +5 -0
  566. package/dist/daemon/runs/observer.js +4 -0
  567. package/dist/launcher/bwrap.d.ts +4 -0
  568. package/dist/launcher/bwrap.js +2 -0
  569. package/dist/launcher/client.d.ts +2 -0
  570. package/dist/launcher/client.js +3 -0
  571. package/dist/launcher/main.d.ts +1 -0
  572. package/dist/launcher/main.js +3 -0
  573. package/dist/launcher/netrule.d.ts +1 -0
  574. package/dist/launcher/netrule.js +1 -0
  575. package/dist/launcher/seccomp.d.ts +1 -0
  576. package/dist/launcher/seccomp.js +1 -0
  577. package/dist/launcher/spec.d.ts +88 -0
  578. package/dist/launcher/spec.js +1 -0
  579. package/dist/launcher/users.d.ts +18 -0
  580. package/dist/launcher/users.js +7 -0
  581. package/dist/launcher/validate.d.ts +22 -0
  582. package/dist/launcher/validate.js +1 -0
  583. package/dist/migrations/corpus.js +3 -3
  584. package/dist/migrations/runner.js +1 -1
  585. package/dist/native/linux/addon.node +0 -0
  586. package/dist/native/linux.d.ts +29 -0
  587. package/dist/native/linux.js +1 -0
  588. package/dist/pi-extensions/broker-local.js +2 -2
  589. package/dist/pi-extensions/canvas-bash-valve.d.ts +1 -3
  590. package/dist/pi-extensions/canvas-bash-valve.js +4 -7
  591. package/dist/pi-extensions/canvas-context-intro.d.ts +1 -2
  592. package/dist/pi-extensions/canvas-context-intro.js +2 -2
  593. package/dist/pi-extensions/canvas-doc-substrate.js +6 -6
  594. package/dist/pi-extensions/canvas-inbox-watcher.d.ts +2 -1
  595. package/dist/pi-extensions/canvas-inbox-watcher.js +2 -1
  596. package/dist/pi-extensions/canvas-passive-context.d.ts +1 -1
  597. package/dist/pi-extensions/canvas-passive-context.js +11 -11
  598. package/dist/pi-extensions/canvas-recap.js +6 -6
  599. package/dist/pi-extensions/canvas-stophook.js +1 -1
  600. package/dist/pi-extensions/canvas-structured-output.js +4 -4
  601. package/dist/pi-extensions/canvas-tool-guide.js +1 -1
  602. package/dist/pi-extensions/system-prompt-entry.d.ts +15 -0
  603. package/dist/pi-extensions/system-prompt-entry.js +1 -0
  604. package/dist/shared/env.d.ts +5 -1
  605. package/dist/shared/env.js +1 -1
  606. package/dist/shared/strip-cd-prefix.d.ts +1 -0
  607. package/dist/shared/strip-cd-prefix.js +1 -0
  608. package/dist/types.d.ts +31 -15
  609. package/docs/cli/memory-and-preferences.md +3 -1
  610. package/docs/sdk/client.md +34 -0
  611. package/docs/sdk/errors.md +2 -0
  612. package/docs/sdk/memory.md +2 -2
  613. package/docs/sdk/streaming.md +21 -0
  614. package/package.json +18 -4
  615. package/packages/crouter-identity/dist/index.d.ts +54 -0
  616. package/packages/crouter-identity/dist/index.js +166 -0
  617. package/packages/crouter-identity/package.json +33 -0
  618. package/runtime.lock.json +34 -8
  619. package/scripts/build-native-linux.mjs +16 -0
  620. package/scripts/install-runtime.mjs +9 -7
  621. package/scripts/lib/isolation-env.mjs +42 -0
  622. package/scripts/runtime-smoke.mjs +49 -0
  623. package/src/native/linux/addon.c +249 -0
  624. package/dist/core/profiles/state-block.d.ts +0 -4
  625. package/dist/core/profiles/state-block.js +0 -3
  626. package/dist/core/runtime/broker/auth-reload.d.ts +0 -41
  627. package/dist/core/runtime/broker/auth-reload.js +0 -1
  628. package/dist/core/substrate/cli-context-delivery.d.ts +0 -22
  629. package/dist/core/substrate/cli-context-delivery.js +0 -1
@@ -1,26 +1,25 @@
1
- var G=Object.defineProperty;var c=(n,t)=>G(n,"name",{value:t,configurable:!0});import{envNodeId as H}from"../../shared/env.js";import{statSync as D,readdirSync as q}from"node:fs";import{join as x,relative as z,sep as Y}from"node:path";import{getNode as _,listNodes as v,view as P}from"./canvas.js";import{contextDir as Q,reportsDir as w,nodeDir as C}from"./paths.js";import{openDb as U}from"./db.js";import{readTextIfExists as g,walkFiles as V,pathExists as I}from"../fs-utils.js";import{parseFrontmatterGeneric as S}from"../frontmatter.js";import{warn as X}from"../output.js";import{readStamps as Z}from"../runtime/stamp/protocol.js";const wn=["human","inbox","wake","revive","restart-continuation","stop-guard","park","recovery","context-nudge","kickoff","unknown"],Sn=["user","assistant","toolResult"];function nn(){const n=H();if(n!==void 0&&n!==""){const t=_(n);if(t!==null)return t.cwd}return process.cwd()}c(nn,"callerCwd");function A(n){const t=n.match(/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})$/);return t===null?n:`${t[1]}-${t[2]}-${t[3]}T${t[4]}:${t[5]}:${t[6]}`}c(A,"compactToIso");function b(n){const t=Date.parse(n);return Number.isNaN(t)?0:t}c(b,"toMs");function T(n){const t=n.split(`
2
- `);for(const e of t){const o=e.trim();if(o.startsWith("#"))return o.replace(/^#+\s*/,"").trim()}for(const e of t){const o=e.trim();if(o!=="")return o.length>120?o.slice(0,120):o}return""}c(T,"firstHeading");function O(n){let t=null;const e=c(()=>{if(t!==null)return t;const s=g(n);return t=s===null?"":S(s).body,t},"load"),o=g(n),i=o===null?"":o;return o!==null&&(t=S(o).body),{load:e,head:i}}c(O,"fileBodyLoader");function B(n,t,e){const o=x(w(n.node_id),e),i=e.match(/^([0-9]{8}T[0-9]{6})-(\w+)\.md$/),{load:s,head:r}=O(o),a=S(r).data,d=(typeof a?.kind=="string"?a.kind:void 0)??(i?i[2]:"report"),u=(typeof a?.ts=="string"?a.ts:void 0)??(i?A(i[1]):new Date(D(o).mtimeMs).toISOString()),f=s();return{ref:`${n.node_id}:reports/${e}`,nodeId:n.node_id,relpath:`reports/${e}`,source:"report",reportKind:d,ts:u,tsMs:b(u),title:T(f),nodeName:n.name,nodeKind:n.kind,nodeStatus:n.status,nodeCwd:n.cwd,nodeDesc:t,path:o,loadBody:s}}c(B,"reportArtifact");function K(n,t,e){const o=z(C(n.node_id),e).split(Y).join("/"),i=o==="context/roadmap.md",{load:s}=O(e);let r;try{r=new Date(D(e).mtimeMs).toISOString()}catch{r=n.created}const a=s();return{ref:`${n.node_id}:${o}`,nodeId:n.node_id,relpath:o,source:i?"roadmap":"doc",ts:r,tsMs:b(r),title:T(a)||o.replace(/^context\//,""),nodeName:n.name,nodeKind:n.kind,nodeStatus:n.status,nodeCwd:n.cwd,nodeDesc:t,path:e,loadBody:s}}c(K,"docArtifact");function E(n){return U().prepare(`SELECT m.created_at, m.sender_node_id, d.urgency, m.kind, m.label, m.body_ref, m.body_json
1
+ var Y=Object.defineProperty;var a=(n,t)=>Y(n,"name",{value:t,configurable:!0});import{envNodeId as Q}from"../../shared/env.js";import{join as x,relative as U,sep as V}from"node:path";import{getNode as _,listNodes as B,view as X}from"./canvas.js";import{contextDir as Z,reportsDir as k,nodeAgentDir as $}from"./node-agent-paths.js";import{openDb as nn}from"./db.js";import{pathExists as C,readTextIfExists as en}from"../fs-utils.js";import{readdirBeneath as tn,readTextBeneathIfExists as v,statBeneath as E,walkFilesBeneath as on}from"../spaces/open-beneath.js";import{conversationIdFromPath as S,conversationStore as w,ConversationNotFoundError as sn}from"../conversation-store/index.js";import{parseFrontmatterGeneric as N}from"../frontmatter.js";import{warn as rn}from"../output.js";import{readStamps as dn}from"../runtime/stamp/protocol.js";const On=["human","inbox","wake","revive","restart-continuation","stop-guard","park","recovery","context-nudge","kickoff","unknown"],Rn=["user","assistant","toolResult"];function an(){const n=Q();if(n!==void 0&&n!==""){const t=_(n);if(t!==null)return t.cwd}return process.cwd()}a(an,"callerCwd");function A(n){const t=n.match(/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})$/);return t===null?n:`${t[1]}-${t[2]}-${t[3]}T${t[4]}:${t[5]}:${t[6]}`}a(A,"compactToIso");function g(n){const t=Date.parse(n);return Number.isNaN(t)?0:t}a(g,"toMs");function T(n){const t=n.split(`
2
+ `);for(const e of t){const i=e.trim();if(i.startsWith("#"))return i.replace(/^#+\s*/,"").trim()}for(const e of t){const i=e.trim();if(i!=="")return i.length>120?i.slice(0,120):i}return""}a(T,"firstHeading");function F(n,t){let e=null;const i=a(()=>{if(e!==null)return e;const d=v(n,t);return e=d===null?"":N(d).body,e},"load"),o=v(n,t),s=o===null?"":o;return o!==null&&(e=N(o).body),{load:i,head:s}}a(F,"fileBodyLoader");function K(n,t,e){const i=$(n.node_id),o=x(k(n.node_id),e),s=e.match(/^([0-9]{8}T[0-9]{6})-(\w+)\.md$/),{load:d,head:c}=F(i,o),r=N(c).data,u=(typeof r?.kind=="string"?r.kind:void 0)??(s?s[2]:"report"),f=(typeof r?.ts=="string"?r.ts:void 0)??(s?A(s[1]):new Date(E(i,o).mtimeMs).toISOString()),m=d();return{ref:`${n.node_id}:reports/${e}`,nodeId:n.node_id,relpath:`reports/${e}`,source:"report",reportKind:u,ts:f,tsMs:g(f),title:T(m),nodeName:n.name,nodeKind:n.kind,nodeStatus:n.status,nodeCwd:n.cwd,nodeDesc:t,path:o,loadBody:d}}a(K,"reportArtifact");function W(n,t,e){const i=$(n.node_id),o=U(i,e).split(V).join("/"),s=o==="context/roadmap.md",{load:d}=F(i,e);let c;try{c=new Date(E(i,e).mtimeMs).toISOString()}catch{c=n.created}const r=d();return{ref:`${n.node_id}:${o}`,nodeId:n.node_id,relpath:o,source:s?"roadmap":"doc",ts:c,tsMs:g(c),title:T(r)||o.replace(/^context\//,""),nodeName:n.name,nodeKind:n.kind,nodeStatus:n.status,nodeCwd:n.cwd,nodeDesc:t,path:e,loadBody:d}}a(W,"docArtifact");function O(n){return nn().prepare(`SELECT m.created_at, m.sender_node_id, d.urgency, m.kind, m.label, m.body_ref, m.body_json
3
3
  FROM deliveries d JOIN messages m ON m.message_id = d.message_id
4
4
  WHERE d.destination_kind = 'node_inbox' AND d.destination_id = ? AND d.wake = 1
5
- ORDER BY m.seq, d.created_at, d.delivery_id`).all(n).map(e=>({ts:e.created_at,from:e.sender_node_id,tier:e.urgency,kind:e.kind,label:e.label,ref:e.body_ref,data:e.body_json===null?null:JSON.parse(e.body_json)}))}c(E,"allInboxEntries");function en(n){try{const t=un(n);if(t?.source==="report")return t.body}catch{}return null}c(en,"reportBodyFromRef");function F(n){const t=[`from: ${n.from??"system"}`,`tier: ${n.tier}`].join(`
6
- `),e=`[${n.kind}] ${n.label}`,o=typeof n.data=="object"&&n.data!==null&&!Array.isArray(n.data)?n.data.body:void 0,i=typeof o=="string"?o.trim():"",s=typeof o=="string",r=n.ref!==null?s?g(n.ref)??"":en(n.ref)??O(n.ref).load():i,a=r!==""&&r!==n.label,d=[t,e];return n.ref!==null&&d.push(`ref: ${n.ref}`),a&&d.push(r),d.join(`
5
+ ORDER BY m.seq, d.created_at, d.delivery_id`).all(n).map(e=>({ts:e.created_at,from:e.sender_node_id,tier:e.urgency,kind:e.kind,label:e.label,ref:e.body_ref,data:e.body_json===null?null:JSON.parse(e.body_json)}))}a(O,"allInboxEntries");function cn(n){try{const t=bn(n);if(t?.source==="report")return t.body}catch{}return null}a(cn,"reportBodyFromRef");function L(n){const t=[`from: ${n.from??"system"}`,`tier: ${n.tier}`].join(`
6
+ `),e=`[${n.kind}] ${n.label}`,i=typeof n.data=="object"&&n.data!==null&&!Array.isArray(n.data)?n.data.body:void 0,o=typeof i=="string"?i.trim():"",s=typeof i=="string",d=n.ref!==null?s?en(n.ref)??"":cn(n.ref)??"":o,c=d!==""&&d!==n.label,r=[t,e];return n.ref!==null&&r.push(`ref: ${n.ref}`),c&&r.push(d),r.join(`
7
7
 
8
- `)}c(F,"inboxEntryBody");function W(n,t,e,o){const i=`inbox/${String(o).padStart(6,"0")}`,s=F(e),r={ref:`${n.node_id}:${i}`,nodeId:n.node_id,relpath:i,source:"inbox",ts:e.ts,tsMs:b(e.ts),title:`[${e.kind}] from ${e.from??"system"}: ${e.label}`,nodeName:n.name,nodeKind:n.kind,nodeStatus:n.status,nodeCwd:n.cwd,nodeDesc:t,path:null,loadBody:c(()=>s,"loadBody"),origin:"inbox"};return typeof e.from=="string"&&e.from!==""&&(r.from=e.from),r}c(W,"inboxArtifact");function L(n){const t=_(n)?.pi_session_file;return typeof t=="string"&&t!==""&&I(t)?t:null}c(L,"resolveSessionFile");function tn(n){if(typeof n=="string")return n;if(!Array.isArray(n))return"";const t=[];for(const e of n){if(e===null||typeof e!="object")continue;const o=e;o.type==="text"&&typeof o.text=="string"?t.push(o.text):o.type==="toolCall"&&t.push(`Tool: ${typeof o.name=="string"?o.name:"call"}`)}return t.join(`
9
- `)}c(tn,"textFromBlocks");function on(n){return n==null?"unknown":n.type==="human"?"human":n.kind}c(on,"originToken");function sn(n){if(n==null||n.type!=="runtime")return;const t=n.entries;if(t===void 0||t.length===0)return;const e=new Set;for(const o of t){const i=o.fromName??o.from;typeof i=="string"&&i!==""&&e.add(i)}return e.size===0?void 0:[...e].join(", ")}c(sn,"sendersOf");function R(n){const t=L(n);if(t===null)return[];const e=g(t);if(e===null)return[];const o=[];for(const r of e.split(`
10
- `))if(r.trim()!=="")try{o.push(JSON.parse(r))}catch{}const i=new Map;for(const r of Z(o)){if(r.kind!=="message")continue;const a=r.payload;typeof a.msgTs=="number"&&i.set(a.msgTs,a.origin)}const s=[];for(const r of o){if(r===null||typeof r!="object")continue;const a=r;if(a.type!=="message")continue;const d=a.message;if(d===null||typeof d!="object")continue;const u=d,f=typeof u.role=="string"?u.role:"";if(f==="")continue;const l=typeof u.timestamp=="number"?u.timestamp:void 0,p=typeof a.timestamp=="string"?a.timestamp:l!==void 0?new Date(l).toISOString():"",m=tn(u.content),h={index:s.length,role:f,text:m,ts:p,tsMs:l??b(p)};if(f==="user"){const y=l!==void 0&&i.has(l)?i.get(l):null;h.origin=on(y);const $=sn(y);$!==void 0&&(h.from=$)}s.push(h)}return s}c(R,"sessionMessages");function rn(n,t){const e=g(n);if(e===null)return null;let o=0;for(const i of e.split(`
11
- `)){if(i.trim()==="")continue;let s;try{s=JSON.parse(i)}catch{continue}if(s===null||typeof s!="object")continue;const r=s;if(r.type!=="message")continue;const a=r.message;if(!(a===null||typeof a!="object"||typeof a.role!="string")){if(o===t)return i;o++}}return null}c(rn,"rawSessionLine");function J(n,t,e){const o=`session/${String(e.index).padStart(6,"0")}`,i=e.text.split(`
12
- `).map(r=>r.trim()).find(r=>r!=="")??"",s={ref:`${n.node_id}:${o}`,nodeId:n.node_id,relpath:o,source:"transcript",ts:e.ts,tsMs:e.tsMs,title:`[${e.role}] ${i.length>80?`${i.slice(0,80)}\u2026`:i}`,nodeName:n.name,nodeKind:n.kind,nodeStatus:n.status,nodeCwd:n.cwd,nodeDesc:t,path:null,loadBody:c(()=>e.text,"loadBody"),role:e.role};return e.origin!==void 0&&(s.origin=e.origin),e.from!==void 0&&(s.from=e.from),s}c(J,"transcriptArtifact");function dn(n,t){const e=`${n.name}
8
+ `)}a(L,"inboxEntryBody");function J(n,t,e,i){const o=`inbox/${String(i).padStart(6,"0")}`,s=L(e),d={ref:`${n.node_id}:${o}`,nodeId:n.node_id,relpath:o,source:"inbox",ts:e.ts,tsMs:g(e.ts),title:`[${e.kind}] from ${e.from??"system"}: ${e.label}`,nodeName:n.name,nodeKind:n.kind,nodeStatus:n.status,nodeCwd:n.cwd,nodeDesc:t,path:null,loadBody:a(()=>s,"loadBody"),origin:"inbox"};return typeof e.from=="string"&&e.from!==""&&(d.from=e.from),d}a(J,"inboxArtifact");function G(n){const t=_(n)?.pi_session_file,e=typeof t=="string"?S(t):null;if(e===null)return null;try{return w().header(e).path}catch(i){if(i instanceof sn)return null;throw i}}a(G,"resolveSessionFile");function fn(n){if(typeof n=="string")return n;if(!Array.isArray(n))return"";const t=[];for(const e of n){if(e===null||typeof e!="object")continue;const i=e;i.type==="text"&&typeof i.text=="string"?t.push(i.text):i.type==="toolCall"&&t.push(`Tool: ${typeof i.name=="string"?i.name:"call"}`)}return t.join(`
9
+ `)}a(fn,"textFromBlocks");function un(n){return n==null?"unknown":n.type==="human"?"human":n.kind}a(un,"originToken");function ln(n){if(n==null||n.type!=="runtime")return;const t=n.entries;if(t===void 0||t.length===0)return;const e=new Set;for(const i of t){const o=i.fromName??i.from;typeof o=="string"&&o!==""&&e.add(o)}return e.size===0?void 0:[...e].join(", ")}a(ln,"sendersOf");function R(n){const t=G(n);if(t===null)return[];const e=w().read(S(t)).entries,i=new Map;for(const s of dn(e)){if(s.kind!=="message")continue;const d=s.payload;typeof d.msgTs=="number"&&i.set(d.msgTs,d.origin)}const o=[];for(const s of e){if(s===null||typeof s!="object")continue;const d=s;if(d.type!=="message")continue;const c=d.message;if(c===null||typeof c!="object")continue;const r=c,u=typeof r.role=="string"?r.role:"";if(u==="")continue;const f=typeof r.timestamp=="number"?r.timestamp:void 0,m=typeof d.timestamp=="string"?d.timestamp:f!==void 0?new Date(f).toISOString():"",h=fn(r.content),l={index:o.length,role:u,text:h,ts:m,tsMs:f??g(m)};if(u==="user"){const p=f!==void 0&&i.has(f)?i.get(f):null;l.origin=un(p);const y=ln(p);y!==void 0&&(l.from=y)}o.push(l)}return o}a(R,"sessionMessages");function mn(n,t){const e=w().read(S(n)).entries;let i=0;for(const o of e){if(o.type!=="message")continue;const s=o.message;if(!(s===null||typeof s!="object"||typeof s.role!="string")){if(i===t)return JSON.stringify(o);i++}}return null}a(mn,"rawSessionLine");function H(n,t,e){const i=`session/${String(e.index).padStart(6,"0")}`,o=e.text.split(`
10
+ `).map(d=>d.trim()).find(d=>d!=="")??"",s={ref:`${n.node_id}:${i}`,nodeId:n.node_id,relpath:i,source:"transcript",ts:e.ts,tsMs:e.tsMs,title:`[${e.role}] ${o.length>80?`${o.slice(0,80)}\u2026`:o}`,nodeName:n.name,nodeKind:n.kind,nodeStatus:n.status,nodeCwd:n.cwd,nodeDesc:t,path:null,loadBody:a(()=>e.text,"loadBody"),role:e.role};return e.origin!==void 0&&(s.origin=e.origin),e.from!==void 0&&(s.from=e.from),s}a(H,"transcriptArtifact");function pn(n,t){const e=`${n.name}
13
11
  ${t}
14
- ${n.kind}`;return{ref:`${n.node_id}:meta`,nodeId:n.node_id,relpath:"meta",source:"meta",ts:n.created,tsMs:b(n.created),title:n.name,nodeName:n.name,nodeKind:n.kind,nodeStatus:n.status,nodeCwd:n.cwd,nodeDesc:t,path:null,loadBody:c(()=>e,"loadBody")}}c(dn,"metaArtifact");function N(n){const t=w(n);if(!I(t))return[];try{return q(t).filter(e=>e.endsWith(".md"))}catch{return[]}}c(N,"listReportFiles");function Nn(n){let t=null;for(const e of N(n))(t===null||e>t)&&(t=e);return t===null?null:`${n}:reports/${t}`}c(Nn,"newestReportRef");function j(n){const t=Q(n);if(!I(t))return[];try{return V(t,e=>e.endsWith(".md"))}catch{return[]}}c(j,"listDocFiles");function M(n,t){const e=(t instanceof Error?t.message:String(t)).split(`
15
- `)[0];X(`invalid frontmatter in ${n}: ${e}`)}c(M,"warnInvalidFrontmatter");function an(n){return _(n)?.description??""}c(an,"nodeDescOf");function Mn(n,t){const e=fn(n),o=t.kinds,i=t.statuses,s=e.filter(f=>!(o!==void 0&&o.length>0&&!o.includes(f.kind)||i!==void 0&&i.length>0&&!i.includes(f.status))),r=t.reportKind,a=t.types!==void 0&&t.types.length>0?t.types:r!==void 0?["report"]:["report","doc","roadmap","meta"],d=new Set(a),u=[];for(const f of s){const l=d.has("meta")||d.has("report")||d.has("doc")||d.has("roadmap")||d.has("inbox")?an(f.node_id):"";if(d.has("meta")&&u.push(dn(f,l)),d.has("report"))for(const p of N(f.node_id)){const m=x(w(f.node_id),p);let h;try{h=B(f,l,p)}catch(y){M(m,y);continue}h!==null&&(r!==void 0&&h.reportKind!==r||u.push(h))}if(d.has("doc")||d.has("roadmap"))for(const p of j(f.node_id)){let m;try{m=K(f,l,p)}catch(h){M(p,h);continue}m.source==="roadmap"&&!d.has("roadmap")||m.source==="doc"&&!d.has("doc")||u.push(m)}if(d.has("inbox")&&E(f.node_id).forEach((p,m)=>u.push(W(f,l,p,m))),d.has("transcript"))for(const p of R(f.node_id))u.push(J(f,l,p))}return u.filter(f=>t.sinceMs!==void 0&&f.tsMs<t.sinceMs||t.untilMs!==void 0&&f.tsMs>t.untilMs?!1:cn(f,t))}c(Mn,"buildCorpus");function cn(n,t){const{origins:e,roles:o,from:i}=t;return!(e!==void 0&&e.length>0&&(n.origin===void 0||!e.includes(n.origin))||o!==void 0&&o.length>0&&(n.role===void 0||!o.includes(n.role))||i!==void 0&&i!==""&&(n.from===void 0||!n.from.toLowerCase().includes(i.toLowerCase())))}c(cn,"matchesMessageFilters");function Dn(n,t){const e=new Map;for(const o of n){let i;switch(t){case"origin":i=o.origin;break;case"role":i=o.role;break;case"node":i=`${o.nodeName} (${o.nodeId})`;break;case"kind":i=o.nodeKind;break;case"type":i=o.source;break;case"day":i=o.ts.slice(0,10)||void 0;break}i===void 0||i===""||e.set(i,(e.get(i)??0)+1)}return[...e.entries()].map(([o,i])=>({key:o,count:i})).sort((o,i)=>i.count-o.count||o.key.localeCompare(i.key))}c(Dn,"groupCorpus");function fn(n){const t=v(),e=new Map(t.map(i=>[i.node_id,i]));if(n.nodes!==void 0&&n.nodes.length>0)return n.nodes.map(i=>e.get(i)).filter(i=>i!==void 0);if(n.under!==void 0&&n.under!=="")return[n.under,...P(n.under)].map(s=>e.get(s)).filter(s=>s!==void 0);if(n.allCwds===!0)return t;const o=n.cwd!==void 0&&n.cwd!==""?n.cwd:nn();return t.filter(i=>i.cwd===o)}c(fn,"scopedRows");function un(n){const t=n.indexOf(":");if(t===-1)return null;const e=n.slice(0,t),o=n.slice(t+1),i=_(e);if(i===null)return null;if(o==="meta"){const p=`# ${i.name}
12
+ ${n.kind}`;return{ref:`${n.node_id}:meta`,nodeId:n.node_id,relpath:"meta",source:"meta",ts:n.created,tsMs:g(n.created),title:n.name,nodeName:n.name,nodeKind:n.kind,nodeStatus:n.status,nodeCwd:n.cwd,nodeDesc:t,path:null,loadBody:a(()=>e,"loadBody")}}a(pn,"metaArtifact");function M(n){const t=k(n);if(!C(t))return[];try{return tn($(n),t).filter(e=>!e.isDirectory()&&e.name.endsWith(".md")).map(e=>e.name)}catch{return[]}}a(M,"listReportFiles");function jn(n){let t=null;for(const e of M(n))(t===null||e>t)&&(t=e);return t===null?null:`${n}:reports/${t}`}a(jn,"newestReportRef");function j(n){const t=Z(n);if(!C(t))return[];try{return on($(n),t,e=>e.endsWith(".md"))}catch{return[]}}a(j,"listDocFiles");function D(n,t){const e=(t instanceof Error?t.message:String(t)).split(`
13
+ `)[0];rn(`invalid frontmatter in ${n}: ${e}`)}a(D,"warnInvalidFrontmatter");function hn(n){return _(n)?.description??""}a(hn,"nodeDescOf");function Bn(n,t){const e=gn(n),i=t.kinds,o=t.statuses,s=e.filter(f=>!(i!==void 0&&i.length>0&&!i.includes(f.kind)||o!==void 0&&o.length>0&&!o.includes(f.status))),d=t.reportKind,c=t.types!==void 0&&t.types.length>0?t.types:d!==void 0?["report"]:["report","doc","roadmap","meta"],r=new Set(c),u=[];for(const f of s){const m=r.has("meta")||r.has("report")||r.has("doc")||r.has("roadmap")||r.has("inbox")?hn(f.node_id):"";if(r.has("meta")&&u.push(pn(f,m)),r.has("report"))for(const h of M(f.node_id)){const l=x(k(f.node_id),h);let p;try{p=K(f,m,h)}catch(y){D(l,y);continue}p!==null&&(d!==void 0&&p.reportKind!==d||u.push(p))}if(r.has("doc")||r.has("roadmap"))for(const h of j(f.node_id)){let l;try{l=W(f,m,h)}catch(p){D(h,p);continue}l.source==="roadmap"&&!r.has("roadmap")||l.source==="doc"&&!r.has("doc")||u.push(l)}if(r.has("inbox")&&O(f.node_id).forEach((h,l)=>u.push(J(f,m,h,l))),r.has("transcript"))for(const h of R(f.node_id))u.push(H(f,m,h))}return u.filter(f=>t.sinceMs!==void 0&&f.tsMs<t.sinceMs||t.untilMs!==void 0&&f.tsMs>t.untilMs?!1:yn(f,t))}a(Bn,"buildCorpus");function yn(n,t){const{origins:e,roles:i,from:o}=t;return!(e!==void 0&&e.length>0&&(n.origin===void 0||!e.includes(n.origin))||i!==void 0&&i.length>0&&(n.role===void 0||!i.includes(n.role))||o!==void 0&&o!==""&&(n.from===void 0||!n.from.toLowerCase().includes(o.toLowerCase())))}a(yn,"matchesMessageFilters");function Cn(n,t){const e=new Map;for(const i of n){let o;switch(t){case"origin":o=i.origin;break;case"role":o=i.role;break;case"node":o=`${i.nodeName} (${i.nodeId})`;break;case"kind":o=i.nodeKind;break;case"type":o=i.source;break;case"day":o=i.ts.slice(0,10)||void 0;break}o===void 0||o===""||e.set(o,(e.get(o)??0)+1)}return[...e.entries()].map(([i,o])=>({key:i,count:o})).sort((i,o)=>o.count-i.count||i.key.localeCompare(o.key))}a(Cn,"groupCorpus");function gn(n){const t=B(),e=new Map(t.map(o=>[o.node_id,o]));if(n.nodes!==void 0&&n.nodes.length>0)return n.nodes.map(o=>e.get(o)).filter(o=>o!==void 0);if(n.under!==void 0&&n.under!=="")return[n.under,...X(n.under)].map(s=>e.get(s)).filter(s=>s!==void 0);if(n.allCwds===!0)return t;const i=n.cwd!==void 0&&n.cwd!==""?n.cwd:an();return t.filter(o=>o.cwd===i)}a(gn,"scopedRows");function bn(n){const t=n.indexOf(":");if(t===-1)return null;const e=n.slice(0,t),i=n.slice(t+1),o=_(e);if(o===null)return null;if(i==="meta"){const l=`# ${o.name}
16
14
 
17
- - kind: ${i.kind}
18
- - status: ${i.status}
19
- - cwd: ${i.cwd}
20
- - created: ${i.created}
15
+ - kind: ${o.kind}
16
+ - status: ${o.status}
17
+ - cwd: ${o.cwd}
18
+ - created: ${o.created}
21
19
 
22
- ${i.description??""}`;return{nodeId:e,relpath:o,source:"meta",ts:i.created,nodeName:i.name,body:p,raw:null,path:null}}if(o.startsWith("inbox/")){const p=Number(o.slice(6)),m=E(e)[p];return m===void 0?null:{nodeId:e,relpath:o,source:"inbox",ts:m.ts,nodeName:i.name,body:F(m),raw:null,path:null}}if(o==="session"||o.startsWith("session/")){const p=L(e);if(p===null)return null;const m=R(e);if(o==="session"){const $=m.map(k=>`## ${k.role}${k.origin!==void 0?` (origin: ${k.origin})`:""}
20
+ ${o.description??""}`;return{nodeId:e,relpath:i,source:"meta",ts:o.created,nodeName:o.name,body:l,raw:null,path:null}}if(i.startsWith("inbox/")){const l=Number(i.slice(6)),p=O(e)[l];return p===void 0?null:{nodeId:e,relpath:i,source:"inbox",ts:p.ts,nodeName:o.name,body:L(p),raw:null,path:null}}if(i==="session"||i.startsWith("session/")){const l=G(e);if(l===null)return null;const p=R(e);if(i==="session"){const q=p.map(b=>`## ${b.role}${b.origin!==void 0?` (origin: ${b.origin})`:""}
23
21
 
24
- ${k.text}`).join(`
22
+ ${b.text}`).join(`
25
23
 
26
- `);return{nodeId:e,relpath:o,source:"transcript",ts:m[m.length-1]?.ts??i.created,nodeName:i.name,body:$,raw:g(p),path:p}}const h=Number(o.slice(8)),y=m[h];return y===void 0?null:{nodeId:e,relpath:o,source:"transcript",ts:y.ts,nodeName:i.name,body:y.text,raw:rn(p,h),path:p}}if(o.includes("..")||o.startsWith("/"))throw new Error(`illegal relpath in ref: ${o}`);const s=x(C(e),o),r=g(s);if(r===null)return null;const{body:a,data:d}=S(r),u=o.startsWith("reports/"),f=o==="context/roadmap.md";let l;if(typeof d?.ts=="string")l=d.ts;else try{l=new Date(D(s).mtimeMs).toISOString()}catch{l=i.created}return{nodeId:e,relpath:o,source:u?"report":f?"roadmap":"doc",reportKind:u&&typeof d?.kind=="string"?d.kind:void 0,ts:l,nodeName:i.name,body:a,raw:r,path:s}}c(un,"resolveRef");function In(n,t){const e=_(n);if(e===null)return[];const o={node_id:e.node_id,name:e.name,kind:e.kind,mode:e.mode,lifecycle:e.lifecycle,status:e.status,cwd:e.cwd,host_kind:e.host_kind??null,profile_id:e.profile_id??null,scopes:e.scopes??null,parent:e.parent??null,created:e.created,intent:e.intent??null,waiting_for:e.waiting_for??null,pi_pid:e.pi_pid??null,pi_pid_identity:e.pi_pid_identity??null,window:e.window??null,tmux_session:e.tmux_session??null,pane:e.pane??null},i=new Set(t!==void 0&&t.length>0?t:["report","doc","roadmap"]),s=e.description??"",r=[];if(i.has("report"))for(const a of N(n)){let d;try{d=B(o,s,a)}catch(u){M(x(w(n),a),u);continue}d!==null&&r.push(d)}if(i.has("doc")||i.has("roadmap"))for(const a of j(n)){let d;try{d=K(o,s,a)}catch(u){M(a,u);continue}d.source==="roadmap"&&!i.has("roadmap")||d.source==="doc"&&!i.has("doc")||r.push(d)}if(i.has("inbox")&&E(n).forEach((a,d)=>r.push(W(o,s,a,d))),i.has("transcript"))for(const a of R(n))r.push(J(o,s,a));return r}c(In,"nodeArtifacts");function On(n){const t=v().filter(a=>a.cwd===n);let e=0,o=0,i=1/0,s=-1/0;for(const a of t){const d=b(a.created);d>0&&(d<i&&(i=d),d>s&&(s=d));for(const u of N(a.node_id)){e++;const f=u.match(/^([0-9]{8}T[0-9]{6})-/);if(f!==null){const l=b(A(f[1]));l>0&&(l<i&&(i=l),l>s&&(s=l))}}o+=j(a.node_id).length}const r=i!==1/0&&s!==-1/0?{from:new Date(i).toISOString().slice(0,10),to:new Date(s).toISOString().slice(0,10)}:null;return{cwd:n,nodes:t.length,reports:e,docs:o,span:r}}c(On,"corpusStats");export{Sn as MESSAGE_ROLES,wn as ORIGIN_TOKENS,Mn as buildCorpus,nn as callerCwd,On as corpusStats,Dn as groupCorpus,Nn as newestReportRef,In as nodeArtifacts,un as resolveRef};
24
+ `);return{nodeId:e,relpath:i,source:"transcript",ts:p[p.length-1]?.ts??o.created,nodeName:o.name,body:q,raw:(()=>{const{header:b,entries:z}=w().read(S(l));return[b,...z].map(P=>`${JSON.stringify(P)}
25
+ `).join("")})(),path:l}}const y=Number(i.slice(8)),I=p[y];return I===void 0?null:{nodeId:e,relpath:i,source:"transcript",ts:I.ts,nodeName:o.name,body:I.text,raw:mn(l,y),path:l}}if(i.includes("..")||i.startsWith("/"))throw new Error(`illegal relpath in ref: ${i}`);const s=$(e),d=x(s,i),c=v(s,d);if(c===null)return null;const{body:r,data:u}=N(c),f=i.startsWith("reports/"),m=i==="context/roadmap.md";let h;if(typeof u?.ts=="string")h=u.ts;else try{h=new Date(E(s,d).mtimeMs).toISOString()}catch{h=o.created}return{nodeId:e,relpath:i,source:f?"report":m?"roadmap":"doc",reportKind:f&&typeof u?.kind=="string"?u.kind:void 0,ts:h,nodeName:o.name,body:r,raw:c,path:d}}a(bn,"resolveRef");function An(n,t){const e=_(n);if(e===null)return[];const i={node_id:e.node_id,name:e.name,kind:e.kind,mode:e.mode,lifecycle:e.lifecycle,status:e.status,cwd:e.cwd,host_kind:e.host_kind??null,profile_id:e.profile_id??null,scopes:e.scopes??null,parent:e.parent??null,created:e.created,intent:e.intent??null,waiting_for:e.waiting_for??null,pi_pid:e.pi_pid??null,pi_pid_identity:e.pi_pid_identity??null,window:e.window??null,tmux_session:e.tmux_session??null,pane:e.pane??null},o=new Set(t!==void 0&&t.length>0?t:["report","doc","roadmap"]),s=e.description??"",d=[];if(o.has("report"))for(const c of M(n)){let r;try{r=K(i,s,c)}catch(u){D(x(k(n),c),u);continue}r!==null&&d.push(r)}if(o.has("doc")||o.has("roadmap"))for(const c of j(n)){let r;try{r=W(i,s,c)}catch(u){D(c,u);continue}r.source==="roadmap"&&!o.has("roadmap")||r.source==="doc"&&!o.has("doc")||d.push(r)}if(o.has("inbox")&&O(n).forEach((c,r)=>d.push(J(i,s,c,r))),o.has("transcript"))for(const c of R(n))d.push(H(i,s,c));return d}a(An,"nodeArtifacts");function Tn(n){const t=B().filter(c=>c.cwd===n);let e=0,i=0,o=1/0,s=-1/0;for(const c of t){const r=g(c.created);r>0&&(r<o&&(o=r),r>s&&(s=r));for(const u of M(c.node_id)){e++;const f=u.match(/^([0-9]{8}T[0-9]{6})-/);if(f!==null){const m=g(A(f[1]));m>0&&(m<o&&(o=m),m>s&&(s=m))}}i+=j(c.node_id).length}const d=o!==1/0&&s!==-1/0?{from:new Date(o).toISOString().slice(0,10),to:new Date(s).toISOString().slice(0,10)}:null;return{cwd:n,nodes:t.length,reports:e,docs:i,span:d}}a(Tn,"corpusStats");export{Rn as MESSAGE_ROLES,On as ORIGIN_TOKENS,Bn as buildCorpus,an as callerCwd,Tn as corpusStats,Cn as groupCorpus,jn as newestReportRef,An as nodeArtifacts,bn as resolveRef};
@@ -0,0 +1,19 @@
1
+ import type { MemoryReadEventDTO } from '../../api/dto/analytics.js';
2
+ /** Entries older than this are deleted by the hourly storage-maintenance pass. */
3
+ export declare const MEMORY_READS_RETENTION_MS: number;
4
+ export interface MemoryReadRow {
5
+ node_id: string;
6
+ name: string;
7
+ scope: string;
8
+ at: string;
9
+ type: 'read' | 'loaded';
10
+ }
11
+ /** Insert every event for one node in one transaction. `at` must already be a
12
+ * canonical ISO UTC string (`Date#toISOString`) so range reads compare as text. */
13
+ export declare function insertMemoryReads(nodeId: string, events: MemoryReadEventDTO[]): void;
14
+ /** Entries with `fromIso <= at < toIso`, oldest first. */
15
+ export declare function listMemoryReads(fromIso: string, toIso: string): MemoryReadRow[];
16
+ /** Delete entries older than the retention window; returns the count deleted. */
17
+ export declare function pruneMemoryReads(nowMs: number): number;
18
+ /** When recording began: the time the memory_reads migration ran. */
19
+ export declare function memoryReadsStartedAt(): string | null;
@@ -0,0 +1 @@
1
+ var m=Object.defineProperty;var t=(e,r)=>m(e,"name",{value:r,configurable:!0});import{openDb as o,withCanvasWrite as n}from"./db.js";const E=720*60*60*1e3;function u(e,r){n(p=>{const s=p.prepare("INSERT INTO memory_reads (node_id, name, scope, at, type) VALUES (?, ?, ?, ?, ?)");for(const a of r)s.run(e,a.name,a.scope,a.at,a.type)})}t(u,"insertMemoryReads");function c(e,r){return o().prepare("SELECT node_id, name, scope, at, type FROM memory_reads WHERE at >= ? AND at < ? ORDER BY at").all(e,r)}t(c,"listMemoryReads");function i(e){return n(r=>Number(r.prepare("DELETE FROM memory_reads WHERE at < ?").run(new Date(e-E).toISOString()).changes))}t(i,"pruneMemoryReads");function y(){return o().prepare("SELECT value FROM canvas_meta WHERE key = 'memory_reads.started_at'").get()?.value??null}t(y,"memoryReadsStartedAt");export{E as MEMORY_READS_RETENTION_MS,u as insertMemoryReads,c as listMemoryReads,y as memoryReadsStartedAt,i as pruneMemoryReads};
@@ -1,8 +1,4 @@
1
1
  import { DatabaseSync } from 'node:sqlite';
2
- /** The ordered migration list. Index `i` is migration version `i + 1`; the db's
3
- * `user_version` tracks how many have been applied. Append only. Journaled
4
- * entries from `src/migrations/registry.ts` follow the local steps, so a new
5
- * registry migration lands as the next version. */
6
2
  export declare const MIGRATIONS: ReadonlyArray<(db: DatabaseSync) => void>;
7
3
  /** Bring `db` up to the latest schema version. Reads `user_version`, runs each
8
4
  * pending migration in order, and bumps `user_version` after each so the work
@@ -1,4 +1,4 @@
1
- var J=Object.defineProperty;var i=(e,n)=>J(e,"name",{value:n,configurable:!0});import{importNodeSqlAuthority as Q,recreateNodeRowsView as V}from"./node-sql-migration.js";import{migrateRecoveryWitnesses as Z}from"./recovery.js";import{migrateMessagingState as ee}from"./deliveries.js";import{migrateHumanRequestsState as ne}from"../human/requests.js";import{existsSync as p,readFileSync as S,readdirSync as U,realpathSync as te,statSync as oe}from"node:fs";import{basename as ie,join as w,resolve as H}from"node:path";import{crtrHome as re,isSafeNodeId as se,nodesRoot as I,nodeMetaPath as X}from"./paths.js";import{STATE_MIGRATIONS as Te}from"../../migrations/registry.js";import{customExtensionPaths as Ee}from"./extensions.js";import{readMetaObject as P,updateJsonFileDurably as b,withMetaLock as ae,writeMetaObjectLocked as de}from"./meta-file.js";function _e(e){e.exec(`
1
+ var te=Object.defineProperty;var o=(e,n)=>te(e,"name",{value:n,configurable:!0});import{parseScope as oe}from"@north-light/crouter-identity";import{importNodeSqlAuthority as ie,recreateNodeRowsView as re}from"./node-sql-migration.js";import{migrateRecoveryWitnesses as se}from"./recovery.js";import{migrateMessagingState as Te}from"./deliveries.js";import{migrateHumanRequestsState as Ee}from"../human/requests.js";import{existsSync as p,readFileSync as U,readdirSync as S,realpathSync as ae,statSync as de}from"node:fs";import{basename as _e,join as w,resolve as H}from"node:path";import{crtrHome as ce,isSafeNodeId as Ne,nodesRoot as X,nodeMetaPath as I}from"./paths.js";import{STATE_MIGRATIONS as ue}from"../../migrations/registry.js";import{customExtensionPaths as Le}from"./extensions.js";import{readMetaObject as P,updateJsonFileDurably as Y,withMetaLock as le,writeMetaObjectLocked as pe}from"./meta-file.js";function Ae(e){e.exec(`
2
2
  CREATE TABLE IF NOT EXISTS nodes (
3
3
  node_id TEXT PRIMARY KEY,
4
4
  name TEXT NOT NULL,
@@ -23,7 +23,7 @@ CREATE TABLE IF NOT EXISTS edges (
23
23
  CREATE INDEX IF NOT EXISTS idx_edges_to ON edges(type, to_id);
24
24
  CREATE INDEX IF NOT EXISTS idx_edges_from ON edges(type, from_id);
25
25
  CREATE INDEX IF NOT EXISTS idx_nodes_status ON nodes(status);
26
- `)}i(_e,"baselineSchema");function x(e,n){return new Set(e.prepare(`PRAGMA table_info(${n})`).all().map(t=>t.name))}i(x,"tableColumns");function Y(e,n,t,o){n.has(t)||(e.exec(o),n.add(t))}i(Y,"addColumnIfMissing");function l(e){return x(e,"nodes")}i(l,"nodeColumns");const E=Y;function ce(e){const n=l(e);E(e,n,"intent","ALTER TABLE nodes ADD COLUMN intent TEXT;"),E(e,n,"pi_pid","ALTER TABLE nodes ADD COLUMN pi_pid INTEGER;"),E(e,n,"window","ALTER TABLE nodes ADD COLUMN window TEXT;"),E(e,n,"tmux_session","ALTER TABLE nodes ADD COLUMN tmux_session TEXT;")}i(ce,"addRuntimeColumns");function Ne(e){const n=I();if(!p(n))return;const t=e.prepare('UPDATE nodes SET intent = ?, pi_pid = ?, "window" = ?, tmux_session = ? WHERE node_id = ?');for(const o of U(n)){const T=X(o);if(!p(T))continue;let r;try{r=JSON.parse(S(T,"utf8"))}catch{continue}t.run(r.intent??null,r.pi_pid??null,r.window??null,r.tmux_session??null,o)}}i(Ne,"backfillRuntime");function ue(e){if(!(e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'edges'").get()!==void 0)){e.exec(`
26
+ `)}o(Ae,"baselineSchema");function x(e,n){return new Set(e.prepare(`PRAGMA table_info(${n})`).all().map(t=>t.name))}o(x,"tableColumns");function W(e,n,t,i){n.has(t)||(e.exec(i),n.add(t))}o(W,"addColumnIfMissing");function u(e){return x(e,"nodes")}o(u,"nodeColumns");const E=W;function Oe(e){const n=u(e);E(e,n,"intent","ALTER TABLE nodes ADD COLUMN intent TEXT;"),E(e,n,"pi_pid","ALTER TABLE nodes ADD COLUMN pi_pid INTEGER;"),E(e,n,"window","ALTER TABLE nodes ADD COLUMN window TEXT;"),E(e,n,"tmux_session","ALTER TABLE nodes ADD COLUMN tmux_session TEXT;")}o(Oe,"addRuntimeColumns");function Re(e){const n=X();if(!p(n))return;const t=e.prepare('UPDATE nodes SET intent = ?, pi_pid = ?, "window" = ?, tmux_session = ? WHERE node_id = ?');for(const i of S(n)){const T=I(i);if(!p(T))continue;let r;try{r=JSON.parse(U(T,"utf8"))}catch{continue}t.run(r.intent??null,r.pi_pid??null,r.window??null,r.tmux_session??null,i)}}o(Re,"backfillRuntime");function me(e){if(!(e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'edges'").get()!==void 0)){e.exec(`
27
27
  CREATE TABLE edges (
28
28
  type TEXT NOT NULL,
29
29
  from_id TEXT NOT NULL,
@@ -57,14 +57,14 @@ DROP TABLE edges;
57
57
  ALTER TABLE edges_new RENAME TO edges;
58
58
  CREATE INDEX IF NOT EXISTS idx_edges_to ON edges(type, to_id);
59
59
  CREATE INDEX IF NOT EXISTS idx_edges_from ON edges(type, from_id);
60
- `);const o=e.prepare("SELECT COUNT(*) AS n FROM edges").get().n;if(o!==t)throw new Error(`edges FK rebuild lost rows: expected ${t} non-orphan edge(s), got ${o}`);const T=e.prepare("PRAGMA foreign_key_check").all();if(T.length>0)throw new Error(`edges FK rebuild left ${T.length} foreign-key violation(s)`);e.exec("COMMIT")}catch(o){throw e.exec("ROLLBACK"),o}}finally{e.exec("PRAGMA foreign_keys = ON;")}}i(ue,"edgesForeignKeyCascade");function le(e){const n=l(e);E(e,n,"pane","ALTER TABLE nodes ADD COLUMN pane TEXT;")}i(le,"addPaneColumn");function Le(e){e.exec(`
60
+ `);const i=e.prepare("SELECT COUNT(*) AS n FROM edges").get().n;if(i!==t)throw new Error(`edges FK rebuild lost rows: expected ${t} non-orphan edge(s), got ${i}`);const T=e.prepare("PRAGMA foreign_key_check").all();if(T.length>0)throw new Error(`edges FK rebuild left ${T.length} foreign-key violation(s)`);e.exec("COMMIT")}catch(i){throw e.exec("ROLLBACK"),i}}finally{e.exec("PRAGMA foreign_keys = ON;")}}o(me,"edgesForeignKeyCascade");function fe(e){const n=u(e);E(e,n,"pane","ALTER TABLE nodes ADD COLUMN pane TEXT;")}o(fe,"addPaneColumn");function Xe(e){e.exec(`
61
61
  CREATE TABLE IF NOT EXISTS focuses (
62
62
  focus_id TEXT PRIMARY KEY, -- stable internal id for the viewport
63
63
  pane TEXT, -- the durable %pane_id realizing the focus
64
64
  session TEXT, -- derived cache of the user session (reconciled from pane)
65
65
  node_id TEXT NOT NULL UNIQUE -- the node shown; UNIQUE \u2192 a node occupies <=1 focus
66
66
  );
67
- `)}i(Le,"addFocusesTable");function pe(e){e.exec(`
67
+ `)}o(Xe,"addFocusesTable");function Ie(e){e.exec(`
68
68
  CREATE TABLE IF NOT EXISTS wakeups (
69
69
  wakeup_id TEXT PRIMARY KEY,
70
70
  node_id TEXT, -- TARGET + node-anchored cancel anchor; NULL = canvas-detached
@@ -80,7 +80,7 @@ CREATE INDEX IF NOT EXISTS idx_wakeups_fire ON wakeups(fire_at);
80
80
  CREATE INDEX IF NOT EXISTS idx_wakeups_node ON wakeups(node_id); -- by-node cancel / list
81
81
  CREATE INDEX IF NOT EXISTS idx_wakeups_owner ON wakeups(owner_id); -- by-owner reap (ruling A)
82
82
  CREATE UNIQUE INDEX IF NOT EXISTS idx_wakeups_deadline ON wakeups(node_id) WHERE kind = 'deadline';
83
- `)}i(pe,"appendWakeupsTable");function Oe(e){e.exec(`
83
+ `)}o(Ie,"appendWakeupsTable");function Ue(e){e.exec(`
84
84
  CREATE TABLE IF NOT EXISTS triggers (
85
85
  trigger_id TEXT PRIMARY KEY,
86
86
  owner_id TEXT NOT NULL,
@@ -131,12 +131,12 @@ SELECT
131
131
  FROM wakeups;
132
132
 
133
133
  DROP TABLE wakeups;
134
- `)}i(Oe,"migrateWakeupsToTriggers");function Ae(e){const n=l(e);E(e,n,"host_kind","ALTER TABLE nodes ADD COLUMN host_kind TEXT;")}i(Ae,"addHostKindColumn");function fe(e){e.exec(`
134
+ `)}o(Ue,"migrateWakeupsToTriggers");function Se(e){const n=u(e);E(e,n,"host_kind","ALTER TABLE nodes ADD COLUMN host_kind TEXT;")}o(Se,"addHostKindColumn");function Ce(e){e.exec(`
135
135
  CREATE TABLE IF NOT EXISTS canvas_meta (
136
136
  key TEXT PRIMARY KEY,
137
137
  value TEXT NOT NULL
138
138
  );
139
- `)}i(fe,"addCanvasMetaTable");function me(e){const n=l(e);E(e,n,"profile_id","ALTER TABLE nodes ADD COLUMN profile_id TEXT;")}i(me,"addProfileIdColumn");function Re(e){const n=l(e);E(e,n,"pi_pid_identity","ALTER TABLE nodes ADD COLUMN pi_pid_identity TEXT;")}i(Re,"addPidIdentityColumn");function Ie(e){const n=l(e);E(e,n,"waiting_for","ALTER TABLE nodes ADD COLUMN waiting_for TEXT;")}i(Ie,"addMessageWaitColumn");function W(e){const n=l(e);if(n.size===0)return;E(e,n,"final_report","ALTER TABLE nodes ADD COLUMN final_report TEXT;"),E(e,n,"finalized_at","ALTER TABLE nodes ADD COLUMN finalized_at TEXT;");const t=e.prepare("SELECT node_id FROM nodes WHERE status = 'done' AND final_report IS NULL").all(),o=e.prepare("UPDATE nodes SET final_report = ?, finalized_at = ? WHERE node_id = ? AND final_report IS NULL");for(const{node_id:T}of t){const r=w(I(),T,"reports");if(!p(r))continue;let s=null;for(const a of U(r))if(a.endsWith(".md"))try{const d=S(w(r,a),"utf8"),_=/^---\nnode: [^\n]+\nkind: final\nts: ([^\n]+)\n---\n/.exec(d);if(_===null||Number.isNaN(Date.parse(_[1])))continue;const c={name:a,ts:_[1]};(s===null||c.ts>s.ts||c.ts===s.ts&&c.name>s.name)&&(s=c)}catch{}s!==null&&o.run(s.name,s.ts,T)}}i(W,"addCanonicalFinalColumns");function Xe(e){const n=I();if(p(n))for(const t of U(n)){const o=X(t);p(o)&&b(o,T=>{const r=T.launch;if(typeof r!="object"||r===null||Array.isArray(r))return!1;const s=r.extensions;if(!Array.isArray(s)||!s.every(d=>typeof d=="string"))return!1;const a=Ee(s);return a.length===s.length?!1:(r.extensions=a,!0)})}}i(Xe,"normalizePersistedLaunchExtensions");function Se(e){const n=l(e);E(e,n,"waiting_for_generation","ALTER TABLE nodes ADD COLUMN waiting_for_generation INTEGER NOT NULL DEFAULT 0;")}i(Se,"addMessageWaitGenerationColumn");function Ue(e){e.exec(`
139
+ `)}o(Ce,"addCanvasMetaTable");function De(e){const n=u(e);E(e,n,"profile_id","ALTER TABLE nodes ADD COLUMN profile_id TEXT;")}o(De,"addProfileIdColumn");function ge(e){const n=u(e);E(e,n,"pi_pid_identity","ALTER TABLE nodes ADD COLUMN pi_pid_identity TEXT;")}o(ge,"addPidIdentityColumn");function he(e){const n=u(e);E(e,n,"waiting_for","ALTER TABLE nodes ADD COLUMN waiting_for TEXT;")}o(he,"addMessageWaitColumn");function K(e){const n=u(e);if(n.size===0)return;E(e,n,"final_report","ALTER TABLE nodes ADD COLUMN final_report TEXT;"),E(e,n,"finalized_at","ALTER TABLE nodes ADD COLUMN finalized_at TEXT;");const t=e.prepare("SELECT node_id FROM nodes WHERE status = 'done' AND final_report IS NULL").all(),i=e.prepare("UPDATE nodes SET final_report = ?, finalized_at = ? WHERE node_id = ? AND final_report IS NULL");for(const{node_id:T}of t){const r=w(X(),T,"reports");if(!p(r))continue;let s=null;for(const a of S(r))if(a.endsWith(".md"))try{const d=U(w(r,a),"utf8"),_=/^---\nnode: [^\n]+\nkind: final\nts: ([^\n]+)\n---\n/.exec(d);if(_===null||Number.isNaN(Date.parse(_[1])))continue;const c={name:a,ts:_[1]};(s===null||c.ts>s.ts||c.ts===s.ts&&c.name>s.name)&&(s=c)}catch{}s!==null&&i.run(s.name,s.ts,T)}}o(K,"addCanonicalFinalColumns");function we(e){const n=X();if(p(n))for(const t of S(n)){const i=I(t);p(i)&&Y(i,T=>{const r=T.launch;if(typeof r!="object"||r===null||Array.isArray(r))return!1;const s=r.extensions;if(!Array.isArray(s)||!s.every(d=>typeof d=="string"))return!1;const a=Le(s);return a.length===s.length?!1:(r.extensions=a,!0)})}}o(we,"normalizePersistedLaunchExtensions");function xe(e){const n=u(e);E(e,n,"waiting_for_generation","ALTER TABLE nodes ADD COLUMN waiting_for_generation INTEGER NOT NULL DEFAULT 0;")}o(xe,"addMessageWaitGenerationColumn");function ye(e){e.exec(`
140
140
  CREATE TABLE IF NOT EXISTS consult_outbox (
141
141
  node_id TEXT PRIMARY KEY, -- legacy work node id
142
142
  dir TEXT NOT NULL, -- legacy ticket directory
@@ -150,15 +150,15 @@ CREATE INDEX IF NOT EXISTS idx_consult_outbox_status ON consult_outbox(status);
150
150
  CREATE INDEX IF NOT EXISTS idx_consult_outbox_dir ON consult_outbox(dir);
151
151
  CREATE INDEX IF NOT EXISTS idx_consult_outbox_dir_request_status ON consult_outbox(dir, request_id, status);
152
152
  CREATE INDEX IF NOT EXISTS idx_consult_outbox_dir_status ON consult_outbox(dir, status);
153
- `)}i(Ue,"addHumanWorkOutboxTable");function ge(e){const n=x(e,"consult_outbox"),t=i((o,T)=>Y(e,n,o,T),"add");t("work_kind","ALTER TABLE consult_outbox ADD COLUMN work_kind TEXT NOT NULL DEFAULT 'follow_up';"),t("interaction_id","ALTER TABLE consult_outbox ADD COLUMN interaction_id TEXT;"),t("generation_id","ALTER TABLE consult_outbox ADD COLUMN generation_id TEXT;"),t("interaction_snapshot","ALTER TABLE consult_outbox ADD COLUMN interaction_snapshot TEXT;"),t("handler_command","ALTER TABLE consult_outbox ADD COLUMN handler_command TEXT;"),t("handler_args_json","ALTER TABLE consult_outbox ADD COLUMN handler_args_json TEXT;"),t("claim_token","ALTER TABLE consult_outbox ADD COLUMN claim_token TEXT;"),e.exec(`
153
+ `)}o(ye,"addHumanWorkOutboxTable");function ve(e){const n=x(e,"consult_outbox"),t=o((i,T)=>W(e,n,i,T),"add");t("work_kind","ALTER TABLE consult_outbox ADD COLUMN work_kind TEXT NOT NULL DEFAULT 'follow_up';"),t("interaction_id","ALTER TABLE consult_outbox ADD COLUMN interaction_id TEXT;"),t("generation_id","ALTER TABLE consult_outbox ADD COLUMN generation_id TEXT;"),t("interaction_snapshot","ALTER TABLE consult_outbox ADD COLUMN interaction_snapshot TEXT;"),t("handler_command","ALTER TABLE consult_outbox ADD COLUMN handler_command TEXT;"),t("handler_args_json","ALTER TABLE consult_outbox ADD COLUMN handler_args_json TEXT;"),t("claim_token","ALTER TABLE consult_outbox ADD COLUMN claim_token TEXT;"),e.exec(`
154
154
  CREATE INDEX IF NOT EXISTS idx_consult_outbox_human_work_status ON consult_outbox(work_kind, status);
155
155
  CREATE INDEX IF NOT EXISTS idx_consult_outbox_human_work_dir_status ON consult_outbox(dir, work_kind, status);
156
156
  CREATE INDEX IF NOT EXISTS idx_consult_outbox_human_work_request_status ON consult_outbox(dir, request_id, work_kind, status);
157
157
  CREATE UNIQUE INDEX IF NOT EXISTS idx_consult_outbox_visual_request ON consult_outbox(dir, request_id, work_kind) WHERE work_kind = 'visual';
158
- `)}i(ge,"addHumanWorkColumns");function De(e){e.exec(`
158
+ `)}o(ve,"addHumanWorkColumns");function Fe(e){e.exec(`
159
159
  CREATE INDEX IF NOT EXISTS idx_nodes_parent ON nodes(parent);
160
160
  CREATE INDEX IF NOT EXISTS idx_nodes_created ON nodes(created);
161
- `)}i(De,"addNodeParentCreatedIndexes");function Ce(e){e.exec(`
161
+ `)}o(Fe,"addNodeParentCreatedIndexes");function ke(e){e.exec(`
162
162
  CREATE TABLE IF NOT EXISTS crons (
163
163
  cron_id TEXT PRIMARY KEY,
164
164
  name TEXT NOT NULL, -- agent-legible label; how it shows in list
@@ -213,38 +213,38 @@ CREATE TABLE IF NOT EXISTS cron_runs ( -- bounded ring, last 20 p
213
213
  FOREIGN KEY (cron_id) REFERENCES crons(cron_id) ON DELETE CASCADE
214
214
  );
215
215
  CREATE INDEX IF NOT EXISTS idx_cron_runs_cron ON cron_runs(cron_id, started);
216
- `)}i(Ce,"addCronsTables");function f(e){return`'${e.replace(/'/g,`'"'"'`)}'`}i(f,"shellSingleQuote");function he(e,n){let t=0;for(;;){const o=`${n}_${t}`;if(!e.split(`
217
- `).includes(o))return o;t++}}i(he,"uniqueHeredocDelimiter");function $(e,n,t){const o=he(n,t);return`${e} <<'${o}'
216
+ `)}o(ke,"addCronsTables");function R(e){return`'${e.replace(/'/g,`'"'"'`)}'`}o(R,"shellSingleQuote");function Me(e,n){let t=0;for(;;){const i=`${n}_${t}`;if(!e.split(`
217
+ `).includes(i))return i;t++}}o(Me,"uniqueHeredocDelimiter");function b(e,n,t){const i=Me(n,t);return`${e} <<'${i}'
218
218
  ${n}
219
- ${o}`}i($,"heredocCommand");function we(e){if(typeof e!="string")return{};try{const n=JSON.parse(e);return typeof n!="object"||n===null||Array.isArray(n)?{}:n}catch{return{}}}i(we,"migrationPayload");function L(e,n,t){const o=e[n];if(typeof o!="string"||o.trim()==="")throw new Error(`trigger ${t} payload requires non-empty ${n}`);return o}i(L,"requiredString");function g(e,n){const t=e[n];return typeof t=="string"&&t.trim()!==""?t:void 0}i(g,"optionalString");function m(e,n){const t=e[n];return typeof t=="string"&&t.trim()!==""?t:void 0}i(m,"optionalColumn");function K(e,n,t,o){return $(`crtr node message send --to ${f(e)} --tier ${f(n)}`,t,`CRTR_MIGRATED_${o.replace(/[^A-Za-z0-9]/g,"_")}`)}i(K,"migratedMessageCommand");function xe(e,n){return`printf '%s\\n' "$CRTR_GATE_STDOUT" | crtr node message send --to ${f(e)} --tier ${f(n)}`}i(xe,"migratedGateStdoutMessageCommand");function ye(e,n){const t=[`crtr node new --kind ${f(L(e,"kind",n))}`],o=[["mode","mode"],["cwd","cwd"],["name","name"],["parent","parent"],["worktreeBase","worktree"],["forkFrom","fork-from"],["model","model"],["profile","profile"],["situationalContext","situational-context"]];for(const[r,s]of o){const a=g(e,r);a!==void 0&&t.push(`--${s} ${f(a)}`)}e.root===!0&&t.push("--root");const T=L(e,"prompt",n);return $(t.join(" "),T,`CRTR_MIGRATED_${n.replace(/[^A-Za-z0-9]/g,"_")}`)}i(ye,"migratedSpawnCommand");const q="migration.v22.skipped";function ve(e){const n=e.prepare("SELECT cwd FROM nodes WHERE parent IS NULL ORDER BY created LIMIT 1").get();return(n!==void 0?m(n,"cwd"):void 0)??process.cwd()}i(ve,"ambientMigrationCwd");function Fe(e){let n;try{n=e.prepare("SELECT eval_pid FROM triggers WHERE eval_state = 'running' AND eval_pid IS NOT NULL").all()}catch{return}for(const t of n){const o=t.eval_pid;if(!(typeof o!="number"||!Number.isInteger(o)||o<=1))try{process.kill(-o,"SIGTERM")}catch{}}}i(Fe,"reapRunningPredicateEvaluations");function ke(e){const n=[],t=e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'triggers'").get()!==void 0;t&&Fe(e);let o=[];if(t)try{o=e.prepare("SELECT * FROM triggers ORDER BY created, trigger_id").all()}catch(s){n.push({trigger_id:"<unreadable table>",reason:`triggers table could not be read: ${s instanceof Error?s.message:String(s)}`})}const T=ve(e),r=e.prepare(`
219
+ ${i}`}o(b,"heredocCommand");function Be(e){if(typeof e!="string")return{};try{const n=JSON.parse(e);return typeof n!="object"||n===null||Array.isArray(n)?{}:n}catch{return{}}}o(Be,"migrationPayload");function l(e,n,t){const i=e[n];if(typeof i!="string"||i.trim()==="")throw new Error(`trigger ${t} payload requires non-empty ${n}`);return i}o(l,"requiredString");function C(e,n){const t=e[n];return typeof t=="string"&&t.trim()!==""?t:void 0}o(C,"optionalString");function m(e,n){const t=e[n];return typeof t=="string"&&t.trim()!==""?t:void 0}o(m,"optionalColumn");function q(e,n,t,i){return b(`crtr node message send --to ${R(e)} --tier ${R(n)}`,t,`CRTR_MIGRATED_${i.replace(/[^A-Za-z0-9]/g,"_")}`)}o(q,"migratedMessageCommand");function Ge(e,n){return`printf '%s\\n' "$CRTR_GATE_STDOUT" | crtr node message send --to ${R(e)} --tier ${R(n)}`}o(Ge,"migratedGateStdoutMessageCommand");function He(e,n){const t=[`crtr node new --kind ${R(l(e,"kind",n))}`],i=[["mode","mode"],["cwd","cwd"],["name","name"],["parent","parent"],["worktreeBase","worktree"],["forkFrom","fork-from"],["model","model"],["profile","profile"],["situationalContext","situational-context"]];for(const[r,s]of i){const a=C(e,r);a!==void 0&&t.push(`--${s} ${R(a)}`)}e.root===!0&&t.push("--root");const T=l(e,"prompt",n);return b(t.join(" "),T,`CRTR_MIGRATED_${n.replace(/[^A-Za-z0-9]/g,"_")}`)}o(He,"migratedSpawnCommand");const $="migration.v22.skipped";function Pe(e){const n=e.prepare("SELECT cwd FROM nodes WHERE parent IS NULL ORDER BY created LIMIT 1").get();return(n!==void 0?m(n,"cwd"):void 0)??process.cwd()}o(Pe,"ambientMigrationCwd");function Ye(e){let n;try{n=e.prepare("SELECT eval_pid FROM triggers WHERE eval_state = 'running' AND eval_pid IS NOT NULL").all()}catch{return}for(const t of n){const i=t.eval_pid;if(!(typeof i!="number"||!Number.isInteger(i)||i<=1))try{process.kill(-i,"SIGTERM")}catch{}}}o(Ye,"reapRunningPredicateEvaluations");function We(e){const n=[],t=e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'triggers'").get()!==void 0;t&&Ye(e);let i=[];if(t)try{i=e.prepare("SELECT * FROM triggers ORDER BY created, trigger_id").all()}catch(s){n.push({trigger_id:"<unreadable table>",reason:`triggers table could not be read: ${s instanceof Error?s.message:String(s)}`})}const T=Pe(e),r=e.prepare(`
220
220
  INSERT OR REPLACE INTO crons (
221
221
  cron_id, name, created_by, command, fire_at, recur, tz, expires_at,
222
222
  anchor_node, cancel_on_wake, cwd, env_json, profile, scope,
223
223
  run_timeout_s, overlap, on_output, sink, tier, created, updated
224
- ) VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL, ?, 'profile', ?, 'skip', 'on-failure', '{}', ?, ?, ?)`);for(const s of o){const a=m(s,"trigger_id");if(a===void 0){n.push({trigger_id:"<unidentified row>",reason:"row carries no trigger_id"});continue}try{Me(e,r,s,a,T)}catch(d){n.push({trigger_id:a,reason:d instanceof Error?d.message:String(d)})}}n.length>0&&(e.prepare("INSERT INTO canvas_meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(q,JSON.stringify(n)),console.warn(`[canvas migration v22] ${n.length} retired schedule(s) could not be converted to crons and were dropped; see canvas_meta['${q}']: `+n.map(s=>`${s.trigger_id} (${s.reason})`).join("; "))),e.exec(`
224
+ ) VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, NULL, ?, 'profile', ?, 'skip', 'on-failure', '{}', ?, ?, ?)`);for(const s of i){const a=m(s,"trigger_id");if(a===void 0){n.push({trigger_id:"<unidentified row>",reason:"row carries no trigger_id"});continue}try{Ke(e,r,s,a,T)}catch(d){n.push({trigger_id:a,reason:d instanceof Error?d.message:String(d)})}}n.length>0&&(e.prepare("INSERT INTO canvas_meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run($,JSON.stringify(n)),console.warn(`[canvas migration v22] ${n.length} retired schedule(s) could not be converted to crons and were dropped; see canvas_meta['${$}']: `+n.map(s=>`${s.trigger_id} (${s.reason})`).join("; "))),e.exec(`
225
225
  DROP INDEX IF EXISTS idx_triggers_fire;
226
226
  DROP INDEX IF EXISTS idx_triggers_node;
227
227
  DROP INDEX IF EXISTS idx_triggers_owner;
228
228
  DROP INDEX IF EXISTS idx_triggers_eval;
229
229
  DROP INDEX IF EXISTS idx_triggers_deadline;
230
230
  DROP TABLE IF EXISTS triggers;
231
- `)}i(ke,"migrateTriggersToCrons");function Me(e,n,t,o,T){const r=L(t,"owner_id",o),s=e.prepare("SELECT cwd, profile_id FROM nodes WHERE node_id = ?").get(r),a=(s===void 0?void 0:m(s,"cwd"))??T,d=s===void 0?null:m(s,"profile_id")??null,_=m(t,"node_id")??null,c=L(t,"action",o),N=L(t,"action_mode",o),u=L(t,"trigger_type",o),R=we(t.payload),M=m(t,"created")??new Date().toISOString(),C=N==="deadline_message"?"urgent":g(R,"tier")??"normal",y=g(R,"label");let O,h,B=!1;if(c==="msg"&&(N==="inbox_message"||N==="deadline_message")){if(_===null)throw new Error("has no message target");const A=g(R,"body");A!==void 0?O=K(_,C,A,o):u==="when"?(B=!0,O=xe(_,C)):O=K(_,C,y??"Scheduled message (no body was recorded when this schedule was armed).",o),h=y??(N==="deadline_message"?"deadline":"scheduled message")}else if(c==="msg"&&N==="fresh_revive"){if(_===null)throw new Error("has no revive target");O=`crtr node lifecycle revive ${f(_)} --fresh`,h=y??"scheduled fresh revive"}else if(c==="new"&&N==="node_birth")O=ye(R,o),h=g(R,"name")??`scheduled ${L(R,"kind",o)} node`;else throw new Error(`has unsupported action ${c}/${N}`);let v,F,G=null;if(u==="when"){v=L(t,"next_eval_at",o),F=L(t,"eval_every",o),G=m(t,"timeout_at")??null;const A=L(t,"when_script",o);O=`${B?`if ! CRTR_GATE_STDOUT="$(
232
- ${A}
231
+ `)}o(We,"migrateTriggersToCrons");function Ke(e,n,t,i,T){const r=l(t,"owner_id",i),s=e.prepare("SELECT cwd, profile_id FROM nodes WHERE node_id = ?").get(r),a=(s===void 0?void 0:m(s,"cwd"))??T,d=s===void 0?null:m(s,"profile_id")??null,_=m(t,"node_id")??null,c=l(t,"action",i),N=l(t,"action_mode",i),L=l(t,"trigger_type",i),f=Be(t.payload),M=m(t,"created")??new Date().toISOString(),g=N==="deadline_message"?"urgent":C(f,"tier")??"normal",y=C(f,"label");let A,h,B=!1;if(c==="msg"&&(N==="inbox_message"||N==="deadline_message")){if(_===null)throw new Error("has no message target");const O=C(f,"body");O!==void 0?A=q(_,g,O,i):L==="when"?(B=!0,A=Ge(_,g)):A=q(_,g,y??"Scheduled message (no body was recorded when this schedule was armed).",i),h=y??(N==="deadline_message"?"deadline":"scheduled message")}else if(c==="msg"&&N==="fresh_revive"){if(_===null)throw new Error("has no revive target");A=`crtr node lifecycle revive ${R(_)} --fresh`,h=y??"scheduled fresh revive"}else if(c==="new"&&N==="node_birth")A=He(f,i),h=C(f,"name")??`scheduled ${l(f,"kind",i)} node`;else throw new Error(`has unsupported action ${c}/${N}`);let v,F,G=null;if(L==="when"){v=l(t,"next_eval_at",i),F=l(t,"eval_every",i),G=m(t,"timeout_at")??null;const O=l(t,"when_script",i);A=`${B?`if ! CRTR_GATE_STDOUT="$(
232
+ ${O}
233
233
  )"; then`:`if ! (
234
- ${A}
234
+ ${O}
235
235
  ); then`}
236
236
  exit 0
237
237
  fi
238
238
  {
239
- ${O}
240
- } && crtr cron cancel "$CRTR_CRON_ID"`}else if(u==="at"||u==="every"||u==="until")v=L(t,"fire_at",o),F=u==="every"?L(t,"recur",o):null;else throw new Error(`has unknown timing type ${u}`);if(N==="deadline_message"&&_!==null){const A=e.prepare("SELECT cron_id FROM crons WHERE anchor_node = ? AND cancel_on_wake = 1 AND cron_id <> ?").get(_,o);if(A!==void 0)throw new Error(`node ${_} already has a migrated deadline (${String(A.cron_id)}); only one is allowed`)}n.run(o,h,r,O,v,F,G,_,N==="deadline_message"?1:0,a,d,300,C,M,M)}i(Me,"convertTriggerRow");function Be(e){const n=x(e,"crons");n.size===0||n.has("run_pid_identity")||e.exec("ALTER TABLE crons ADD COLUMN run_pid_identity TEXT;")}i(Be,"addCronRunPidIdentityColumn");function Ge(e){const n=x(e,"crons");n.size!==0&&(n.has("run_out_of_band")||e.exec("ALTER TABLE crons ADD COLUMN run_out_of_band INTEGER NOT NULL DEFAULT 0;"),n.has("queued")&&e.exec("ALTER TABLE crons DROP COLUMN queued;"))}i(Ge,"addCronOutOfBandColumn");function He(e){e.exec(`
239
+ ${A}
240
+ } && crtr cron cancel "$CRTR_CRON_ID"`}else if(L==="at"||L==="every"||L==="until")v=l(t,"fire_at",i),F=L==="every"?l(t,"recur",i):null;else throw new Error(`has unknown timing type ${L}`);if(N==="deadline_message"&&_!==null){const O=e.prepare("SELECT cron_id FROM crons WHERE anchor_node = ? AND cancel_on_wake = 1 AND cron_id <> ?").get(_,i);if(O!==void 0)throw new Error(`node ${_} already has a migrated deadline (${String(O.cron_id)}); only one is allowed`)}n.run(i,h,r,A,v,F,G,_,N==="deadline_message"?1:0,a,d,300,g,M,M)}o(Ke,"convertTriggerRow");function be(e){const n=x(e,"crons");n.size===0||n.has("run_pid_identity")||e.exec("ALTER TABLE crons ADD COLUMN run_pid_identity TEXT;")}o(be,"addCronRunPidIdentityColumn");function qe(e){const n=x(e,"crons");n.size!==0&&(n.has("run_out_of_band")||e.exec("ALTER TABLE crons ADD COLUMN run_out_of_band INTEGER NOT NULL DEFAULT 0;"),n.has("queued")&&e.exec("ALTER TABLE crons DROP COLUMN queued;"))}o(qe,"addCronOutOfBandColumn");function $e(e){e.exec(`
241
241
  CREATE TABLE IF NOT EXISTS warm_pool (
242
242
  node_id TEXT PRIMARY KEY REFERENCES nodes(node_id) ON DELETE CASCADE,
243
243
  recipe_key TEXT NOT NULL, -- frozen launch tuple this spare was minted for
244
244
  created TEXT NOT NULL -- ISO 8601, mint time (oldest spare claimed first)
245
245
  );
246
246
  CREATE INDEX IF NOT EXISTS idx_warm_pool_recipe ON warm_pool(recipe_key, created);
247
- `)}i(He,"addWarmPoolTable");function Pe(e){const n=e.prepare("SELECT node_id, dir, root, request_id, work_kind, status, final_report, updated_at FROM consult_outbox").all();e.exec(`
247
+ `)}o($e,"addWarmPoolTable");function je(e){const n=e.prepare("SELECT node_id, dir, root, request_id, work_kind, status, final_report, updated_at FROM consult_outbox").all();e.exec(`
248
248
  CREATE TABLE consult_outbox_new (
249
249
  node_id TEXT PRIMARY KEY,
250
250
  ticket_node_id TEXT NOT NULL,
@@ -256,7 +256,7 @@ CREATE TABLE consult_outbox_new (
256
256
  );
257
257
  `);const t=e.prepare(`
258
258
  INSERT INTO consult_outbox_new (node_id, ticket_node_id, request_id, work_kind, status, final_report, updated_at)
259
- VALUES (?, ?, ?, ?, ?, ?, ?)`);let o=0;for(const T of n){const r=ie(T.dir);if(!(T.root===H(T.root)&&T.dir===w(T.root,r))||!se(r)){o+=1;continue}t.run(T.node_id,r,T.request_id,T.work_kind,T.status,T.final_report,T.updated_at)}o>0&&console.warn(`[canvas migration v26] dropped ${o} consult_outbox row(s) whose legacy ticket path cannot safely map to a ticket node id`),e.exec(`
259
+ VALUES (?, ?, ?, ?, ?, ?, ?)`);let i=0;for(const T of n){const r=_e(T.dir);if(!(T.root===H(T.root)&&T.dir===w(T.root,r))||!Ne(r)){i+=1;continue}t.run(T.node_id,r,T.request_id,T.work_kind,T.status,T.final_report,T.updated_at)}i>0&&console.warn(`[canvas migration v26] dropped ${i} consult_outbox row(s) whose legacy ticket path cannot safely map to a ticket node id`),e.exec(`
260
260
  DROP TABLE consult_outbox;
261
261
  ALTER TABLE consult_outbox_new RENAME TO consult_outbox;
262
262
 
@@ -265,7 +265,7 @@ CREATE INDEX IF NOT EXISTS idx_consult_outbox_human_work_status ON consult_outbo
265
265
  CREATE INDEX IF NOT EXISTS idx_consult_outbox_ticket_status ON consult_outbox(ticket_node_id, work_kind, status);
266
266
  CREATE INDEX IF NOT EXISTS idx_consult_outbox_ticket_request_status ON consult_outbox(ticket_node_id, request_id, work_kind, status);
267
267
  CREATE UNIQUE INDEX IF NOT EXISTS idx_consult_outbox_visual_request ON consult_outbox(ticket_node_id, request_id, work_kind) WHERE work_kind = 'visual';
268
- `)}i(Pe,"narrowHumanWorkOutbox");function be(e){e.exec(`
268
+ `)}o(je,"narrowHumanWorkOutbox");function ze(e){e.exec(`
269
269
  CREATE TABLE IF NOT EXISTS reviews (
270
270
  review_id TEXT PRIMARY KEY,
271
271
  idempotency_key TEXT NOT NULL UNIQUE,
@@ -309,7 +309,7 @@ CREATE INDEX IF NOT EXISTS idx_reviews_state ON reviews(state);
309
309
  CREATE INDEX IF NOT EXISTS idx_reviews_origin ON reviews(origin_node_id);
310
310
  CREATE INDEX IF NOT EXISTS idx_reviews_file ON reviews(file);
311
311
  CREATE INDEX IF NOT EXISTS idx_reviews_bridge ON reviews(bridge_node_id);
312
- `)}i(be,"addReviewsTable");function Ye(e){e.exec(`
312
+ `)}o(ze,"addReviewsTable");function Je(e){e.exec(`
313
313
  CREATE TABLE IF NOT EXISTS review_comments (
314
314
  comment_id TEXT PRIMARY KEY,
315
315
  review_id TEXT NOT NULL,
@@ -354,13 +354,13 @@ CREATE INDEX IF NOT EXISTS idx_review_comment_events_review_seq
354
354
  ON review_comment_events(review_id, seq);
355
355
  CREATE INDEX IF NOT EXISTS idx_review_comment_events_comment_seq
356
356
  ON review_comment_events(comment_id, seq);
357
- `)}i(Ye,"addReviewCommentTables");function We(e){e.exec(`
357
+ `)}o(Je,"addReviewCommentTables");function Qe(e){e.exec(`
358
358
  ALTER TABLE review_comments
359
359
  ADD COLUMN anchor_state TEXT NOT NULL DEFAULT 'live' CHECK (anchor_state IN ('live', 'detached'));
360
- `)}i(We,"addReviewCommentAnchorState");function $e(e){e.exec("DROP TABLE IF EXISTS consult_outbox")}i($e,"dropConsultOutbox");function Ke(e){e.exec("ALTER TABLE reviews ADD COLUMN submit_requested_at TEXT")}i(Ke,"addReviewSubmitRequested");function qe(e){e.exec(`
360
+ `)}o(Qe,"addReviewCommentAnchorState");function Ve(e){e.exec("DROP TABLE IF EXISTS consult_outbox")}o(Ve,"dropConsultOutbox");function Ze(e){e.exec("ALTER TABLE reviews ADD COLUMN submit_requested_at TEXT")}o(Ze,"addReviewSubmitRequested");function en(e){e.exec(`
361
361
  ALTER TABLE crons ADD COLUMN held INTEGER NOT NULL DEFAULT 0;
362
362
  ALTER TABLE crons ADD COLUMN last_poke_at TEXT;
363
- `)}i(qe,"addCronHeldColumns");function je(e){e.exec(`
363
+ `)}o(en,"addCronHeldColumns");function nn(e){e.exec(`
364
364
  CREATE TABLE human_action_deliveries (
365
365
  request_id TEXT PRIMARY KEY,
366
366
  state TEXT NOT NULL,
@@ -378,7 +378,7 @@ CREATE TABLE human_action_deliveries (
378
378
  updated_at INTEGER NOT NULL
379
379
  );
380
380
  CREATE INDEX idx_human_action_deliveries_due ON human_action_deliveries(state, next_attempt_at);
381
- `)}i(je,"addHumanActionDeliveries");function ze(e){const n=l(e);E(e,n,"pi_session_file","ALTER TABLE nodes ADD COLUMN pi_session_file TEXT;");for(const t of U(I(),{withFileTypes:!0}))if(t.isDirectory())try{const o=JSON.parse(S(X(t.name),"utf8"));typeof o.pi_session_file=="string"&&e.prepare("UPDATE nodes SET pi_session_file = ? WHERE node_id = ?").run(o.pi_session_file,t.name)}catch{}e.exec("CREATE INDEX IF NOT EXISTS idx_nodes_pi_session_file ON nodes(pi_session_file);")}i(ze,"addNodeSessionFileIndex");function j(e,n){const t=i(a=>{const d=H(a);return p(d)?te(d):d},"canonical"),o=e.prepare("UPDATE nodes SET pi_session_file = ? WHERE node_id = ?");e.exec("DROP INDEX IF EXISTS idx_nodes_pi_session_file;");const T=e.prepare("SELECT node_id FROM nodes ORDER BY created ASC, node_id ASC").all();for(const{node_id:a}of T){const d=X(a);if(P(d)===null){o.run(null,a);continue}const _=ae(d,()=>{const c=P(d);if(c===null)throw new Error(`node ${a} session metadata changed during ownership migration`);if(typeof c.pi_session_file!="string")return null;const N=c.pi_session_file,u=t(N);return u!==N&&(c.pi_session_file=u,de(d,c)),u});o.run(_,a)}const r=e.prepare(`
381
+ `)}o(nn,"addHumanActionDeliveries");function tn(e){const n=u(e);E(e,n,"pi_session_file","ALTER TABLE nodes ADD COLUMN pi_session_file TEXT;");for(const t of S(X(),{withFileTypes:!0}))if(t.isDirectory())try{const i=JSON.parse(U(I(t.name),"utf8"));typeof i.pi_session_file=="string"&&e.prepare("UPDATE nodes SET pi_session_file = ? WHERE node_id = ?").run(i.pi_session_file,t.name)}catch{}e.exec("CREATE INDEX IF NOT EXISTS idx_nodes_pi_session_file ON nodes(pi_session_file);")}o(tn,"addNodeSessionFileIndex");function j(e,n){const t=o(a=>{const d=H(a);return p(d)?ae(d):d},"canonical"),i=e.prepare("UPDATE nodes SET pi_session_file = ? WHERE node_id = ?");e.exec("DROP INDEX IF EXISTS idx_nodes_pi_session_file;");const T=e.prepare("SELECT node_id FROM nodes ORDER BY created ASC, node_id ASC").all();for(const{node_id:a}of T){const d=I(a);if(P(d)===null){i.run(null,a);continue}const _=le(d,()=>{const c=P(d);if(c===null)throw new Error(`node ${a} session metadata changed during ownership migration`);if(typeof c.pi_session_file!="string")return null;const N=c.pi_session_file,L=t(N);return L!==N&&(c.pi_session_file=L,pe(d,c)),L});i.run(_,a)}const r=e.prepare(`
382
382
  SELECT pi_session_file
383
383
  FROM nodes
384
384
  WHERE pi_session_file IS NOT NULL
@@ -389,7 +389,7 @@ SELECT node_id
389
389
  FROM nodes
390
390
  WHERE pi_session_file = ?
391
391
  ORDER BY created ASC, node_id ASC
392
- `).all(a);for(const{node_id:_}of d.slice(1)){if(!b(X(_),N=>{const u=N.pi_session_file;if(typeof u!="string"||t(u)!==a)throw new Error(`node ${_} session metadata changed during ownership migration`);return N.pi_session_id=null,N.pi_session_file=null,!0}))throw new Error(`node ${_} session metadata changed during ownership migration`);s.run(_)}}e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_nodes_pi_session_file ON nodes(pi_session_file);")}i(j,"reconcileNodeSessionFileOwners");function Je(e){j(e,!0)}i(Je,"makeNodeSessionFileUnique");function Qe(e){j(e,!1)}i(Qe,"repairNodeSessionFileUniqueIndex");function Ve(e){const n=l(e);E(e,n,"frozen_at","ALTER TABLE nodes ADD COLUMN frozen_at TEXT;"),E(e,n,"respawn_failures","ALTER TABLE nodes ADD COLUMN respawn_failures INTEGER NOT NULL DEFAULT 0;"),E(e,n,"respawn_not_before","ALTER TABLE nodes ADD COLUMN respawn_not_before TEXT;"),E(e,n,"launched_at","ALTER TABLE nodes ADD COLUMN launched_at TEXT;"),E(e,n,"last_settled_at","ALTER TABLE nodes ADD COLUMN last_settled_at TEXT;"),E(e,n,"terminal_reason","ALTER TABLE nodes ADD COLUMN terminal_reason TEXT;"),e.exec(`
392
+ `).all(a);for(const{node_id:_}of d.slice(1)){if(!Y(I(_),N=>{const L=N.pi_session_file;if(typeof L!="string"||t(L)!==a)throw new Error(`node ${_} session metadata changed during ownership migration`);return N.pi_session_id=null,N.pi_session_file=null,!0}))throw new Error(`node ${_} session metadata changed during ownership migration`);s.run(_)}}e.exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_nodes_pi_session_file ON nodes(pi_session_file);")}o(j,"reconcileNodeSessionFileOwners");function on(e){j(e,!0)}o(on,"makeNodeSessionFileUnique");function rn(e){j(e,!1)}o(rn,"repairNodeSessionFileUniqueIndex");function sn(e){const n=u(e);E(e,n,"frozen_at","ALTER TABLE nodes ADD COLUMN frozen_at TEXT;"),E(e,n,"respawn_failures","ALTER TABLE nodes ADD COLUMN respawn_failures INTEGER NOT NULL DEFAULT 0;"),E(e,n,"respawn_not_before","ALTER TABLE nodes ADD COLUMN respawn_not_before TEXT;"),E(e,n,"launched_at","ALTER TABLE nodes ADD COLUMN launched_at TEXT;"),E(e,n,"last_settled_at","ALTER TABLE nodes ADD COLUMN last_settled_at TEXT;"),E(e,n,"terminal_reason","ALTER TABLE nodes ADD COLUMN terminal_reason TEXT;"),e.exec(`
393
393
  UPDATE nodes SET terminal_reason = CASE
394
394
  WHEN status = 'done' AND final_report IS NOT NULL THEN 'finalized'
395
395
  WHEN status = 'done' AND intent = 'parked' THEN 'parked'
@@ -398,7 +398,7 @@ UPDATE nodes SET terminal_reason = CASE
398
398
  WHEN status = 'dead' THEN 'crashed'
399
399
  END
400
400
  WHERE status IN ('done','canceled','dead') AND terminal_reason IS NULL;
401
- `)}i(Ve,"addNodeLifecycleColumns");function Ze(e){const n=l(e);E(e,n,"description","ALTER TABLE nodes ADD COLUMN description TEXT;"),E(e,n,"cycles","ALTER TABLE nodes ADD COLUMN cycles INTEGER;");const t=I();if(!p(t))return;const o=e.prepare("UPDATE nodes SET description = ?, cycles = ? WHERE node_id = ?");for(const T of U(t)){const r=X(T);if(!p(r))continue;let s;try{s=JSON.parse(S(r,"utf8"))}catch{continue}const a=typeof s.description=="string"?s.description:null,d=typeof s.cycles=="number"?s.cycles:null;o.run(a,d,T)}}i(Ze,"addNodeLabelColumns");function en(e){const n=l(e);E(e,n,"outcome_kind","ALTER TABLE nodes ADD COLUMN outcome_kind TEXT;"),E(e,n,"outcome_reason","ALTER TABLE nodes ADD COLUMN outcome_reason TEXT;"),E(e,n,"outcome_at","ALTER TABLE nodes ADD COLUMN outcome_at TEXT;"),E(e,n,"outcome_revision","ALTER TABLE nodes ADD COLUMN outcome_revision INTEGER NOT NULL DEFAULT 0;"),E(e,n,"outcome_detail_json","ALTER TABLE nodes ADD COLUMN outcome_detail_json TEXT;"),E(e,n,"deadline_at","ALTER TABLE nodes ADD COLUMN deadline_at TEXT;"),e.exec(`
401
+ `)}o(sn,"addNodeLifecycleColumns");function Tn(e){const n=u(e);E(e,n,"description","ALTER TABLE nodes ADD COLUMN description TEXT;"),E(e,n,"cycles","ALTER TABLE nodes ADD COLUMN cycles INTEGER;");const t=X();if(!p(t))return;const i=e.prepare("UPDATE nodes SET description = ?, cycles = ? WHERE node_id = ?");for(const T of S(t)){const r=I(T);if(!p(r))continue;let s;try{s=JSON.parse(U(r,"utf8"))}catch{continue}const a=typeof s.description=="string"?s.description:null,d=typeof s.cycles=="number"?s.cycles:null;i.run(a,d,T)}}o(Tn,"addNodeLabelColumns");function En(e){const n=u(e);E(e,n,"outcome_kind","ALTER TABLE nodes ADD COLUMN outcome_kind TEXT;"),E(e,n,"outcome_reason","ALTER TABLE nodes ADD COLUMN outcome_reason TEXT;"),E(e,n,"outcome_at","ALTER TABLE nodes ADD COLUMN outcome_at TEXT;"),E(e,n,"outcome_revision","ALTER TABLE nodes ADD COLUMN outcome_revision INTEGER NOT NULL DEFAULT 0;"),E(e,n,"outcome_detail_json","ALTER TABLE nodes ADD COLUMN outcome_detail_json TEXT;"),E(e,n,"deadline_at","ALTER TABLE nodes ADD COLUMN deadline_at TEXT;"),e.exec(`
402
402
  CREATE TABLE IF NOT EXISTS node_outcome_deliveries (
403
403
  node_id TEXT PRIMARY KEY,
404
404
  state TEXT NOT NULL,
@@ -431,14 +431,81 @@ UPDATE nodes SET outcome_kind='failure',
431
431
  outcome_reason=COALESCE(terminal_reason,'crashed'),
432
432
  outcome_at=COALESCE(finalized_at, created), outcome_revision=1
433
433
  WHERE final_report IS NULL AND status IN ('done','dead','canceled') AND outcome_at IS NULL;
434
- `)}i(en,"addNodeOutcomeAndDeadline");function nn(e){const n=l(e);E(e,n,"telemetry_tokens_in","ALTER TABLE nodes ADD COLUMN telemetry_tokens_in INTEGER;"),E(e,n,"telemetry_context_tokens","ALTER TABLE nodes ADD COLUMN telemetry_context_tokens INTEGER;"),E(e,n,"telemetry_last_activity","ALTER TABLE nodes ADD COLUMN telemetry_last_activity TEXT;"),E(e,n,"telemetry_updated_at","ALTER TABLE nodes ADD COLUMN telemetry_updated_at TEXT;");const t=e.prepare(`UPDATE nodes
434
+ `)}o(En,"addNodeOutcomeAndDeadline");function an(e){const n=u(e);E(e,n,"telemetry_tokens_in","ALTER TABLE nodes ADD COLUMN telemetry_tokens_in INTEGER;"),E(e,n,"telemetry_context_tokens","ALTER TABLE nodes ADD COLUMN telemetry_context_tokens INTEGER;"),E(e,n,"telemetry_last_activity","ALTER TABLE nodes ADD COLUMN telemetry_last_activity TEXT;"),E(e,n,"telemetry_updated_at","ALTER TABLE nodes ADD COLUMN telemetry_updated_at TEXT;");const t=e.prepare(`UPDATE nodes
435
435
  SET telemetry_tokens_in = ?, telemetry_context_tokens = ?,
436
436
  telemetry_last_activity = ?, telemetry_updated_at = ?
437
- WHERE node_id = ?`);for(const{node_id:o}of e.prepare("SELECT node_id FROM nodes").all()){const T=w(I(),o,"job","telemetry.json");if(p(T))try{const r=JSON.parse(S(T,"utf8")),s=typeof r.tokens_in=="number"&&Number.isFinite(r.tokens_in)?r.tokens_in:null,a=typeof r.context_tokens=="number"&&Number.isFinite(r.context_tokens)?r.context_tokens:null,d=typeof r.last_activity=="string"?r.last_activity:null,_=oe(T).mtime.toISOString();t.run(s,a,d,_,o)}catch{}}}i(nn,"addNodeTelemetryColumns");function tn(e){e.exec(`
437
+ WHERE node_id = ?`);for(const{node_id:i}of e.prepare("SELECT node_id FROM nodes").all()){const T=w(X(),i,"job","telemetry.json");if(p(T))try{const r=JSON.parse(U(T,"utf8")),s=typeof r.tokens_in=="number"&&Number.isFinite(r.tokens_in)?r.tokens_in:null,a=typeof r.context_tokens=="number"&&Number.isFinite(r.context_tokens)?r.context_tokens:null,d=typeof r.last_activity=="string"?r.last_activity:null,_=de(T).mtime.toISOString();t.run(s,a,d,_,i)}catch{}}}o(an,"addNodeTelemetryColumns");function dn(e){e.exec(`
438
438
  CREATE INDEX IF NOT EXISTS deliveries_external_due_order
439
439
  ON deliveries(state, next_attempt_at, created_at, delivery_id)
440
440
  WHERE destination_kind = 'external_action' AND canceled_at IS NULL;
441
441
  DROP INDEX IF EXISTS deliveries_external_due;
442
442
  CREATE INDEX IF NOT EXISTS idx_nodes_parent_created ON nodes(parent, created);
443
443
  CREATE INDEX IF NOT EXISTS idx_edges_type_created ON edges(type, created);
444
- `)}i(tn,"addRecurringLaneIndexes");const on=Te.filter(e=>e.lane==="journaled").map(e=>n=>e.apply(n,re()));function rn(e){V(e)}i(rn,"projectLiveNodeState");function sn(e){E(e,l(e),"scopes_json","ALTER TABLE nodes ADD COLUMN scopes_json TEXT;")}i(sn,"addNodeScopes");const D=[_e,ce,Ne,ue,le,Le,pe,Ae,Oe,fe,me,Re,Ie,W,Xe,W,Se,Ue,ge,De,Ce,ke,Be,Ge,He,Pe,be,Ye,We,$e,Ke,qe,je,ze,Ve,Je,Qe,Ze,en,...on,e=>{Q(e),Z(e),ee(e),ne(e)},tn,rn,nn,sn],Tn=new Set([3]);function k(e){return e.prepare("PRAGMA user_version").get().user_version}i(k,"currentUserVersion");function z(e,n){D[n](e),e.exec(`PRAGMA user_version = ${n+1}`)}i(z,"applyMigration");function mn(e){const n=k(e);if(n>D.length)throw new Error(`unsupported canvas schema version ${n} (latest supported ${D.length})`);if(n===D.length)return;const t=e.prepare("PRAGMA busy_timeout").get().timeout;e.exec("PRAGMA busy_timeout = 60000;");try{En(e)}finally{e.exec(`PRAGMA busy_timeout = ${t};`)}}i(mn,"migrate");function En(e){for(;;){const n=k(e);if(n>=D.length)return;if(e.isTransaction||Tn.has(n)){z(e,n);continue}e.exec("BEGIN IMMEDIATE");try{k(e)===n&&z(e,n),e.exec("COMMIT")}catch(t){try{e.exec("ROLLBACK")}catch{}throw t}}}i(En,"runPendingMigrations");export{D as MIGRATIONS,mn as migrate};
444
+ `)}o(dn,"addRecurringLaneIndexes");const _n=ue.filter(e=>e.lane==="journaled").map(e=>n=>e.apply(n,ce()));function cn(e){re(e)}o(cn,"projectLiveNodeState");function Nn(e){E(e,u(e),"scopes_json","ALTER TABLE nodes ADD COLUMN scopes_json TEXT;")}o(Nn,"addNodeScopes");function un(e){const n=u(e);E(e,n,"grantee","ALTER TABLE nodes ADD COLUMN grantee TEXT NOT NULL DEFAULT 'user:local';"),E(e,n,"sub","ALTER TABLE nodes ADD COLUMN sub TEXT;"),E(e,n,"grant_id","ALTER TABLE nodes ADD COLUMN grant_id TEXT;"),E(e,n,"client_id","ALTER TABLE nodes ADD COLUMN client_id TEXT;"),E(e,n,"metadata_json","ALTER TABLE nodes ADD COLUMN metadata_json TEXT;"),E(e,n,"run_id","ALTER TABLE nodes ADD COLUMN run_id TEXT;"),E(e,n,"event_cursor","ALTER TABLE nodes ADD COLUMN event_cursor INTEGER;"),E(e,n,"usage_json","ALTER TABLE nodes ADD COLUMN usage_json TEXT;"),E(e,n,"deleting_at","ALTER TABLE nodes ADD COLUMN deleting_at TEXT;"),e.exec(`
445
+ ALTER TABLE sessions ADD COLUMN event_offset INTEGER;
446
+ CREATE INDEX idx_nodes_run_id ON nodes(run_id);
447
+ -- Child nodes may be pruned while their root run and event history remain.
448
+ CREATE TABLE run_events (
449
+ run_id TEXT NOT NULL REFERENCES nodes(node_id) ON DELETE CASCADE,
450
+ sequence_number INTEGER NOT NULL,
451
+ node_id TEXT NOT NULL,
452
+ type TEXT NOT NULL,
453
+ ts TEXT NOT NULL,
454
+ body_json TEXT NOT NULL,
455
+ grantee TEXT NOT NULL,
456
+ PRIMARY KEY (run_id, sequence_number)
457
+ );
458
+ CREATE INDEX idx_run_events_ts ON run_events(ts);
459
+ CREATE TABLE idempotency_keys (
460
+ grantee TEXT NOT NULL,
461
+ key TEXT NOT NULL,
462
+ body_hash TEXT NOT NULL,
463
+ run_id TEXT NOT NULL REFERENCES nodes(node_id) ON DELETE CASCADE,
464
+ response_json TEXT NOT NULL,
465
+ created_at TEXT NOT NULL,
466
+ PRIMARY KEY (grantee, key)
467
+ );
468
+ CREATE INDEX idx_idempotency_keys_created_at ON idempotency_keys(created_at);
469
+ `)}o(un,"addRunFoundation");function Ln(e){e.exec("ALTER TABLE nodes ADD COLUMN last_activity_at TEXT;"),e.exec(`UPDATE nodes SET last_activity_at = (
470
+ SELECT e.ts FROM run_events e WHERE e.run_id = nodes.node_id
471
+ ORDER BY e.sequence_number DESC LIMIT 1
472
+ ) WHERE run_id = node_id`)}o(Ln,"addRunLastActivity");function ln(e){e.exec(`
473
+ CREATE TABLE grants (
474
+ id TEXT PRIMARY KEY, runtime TEXT NOT NULL, sub TEXT NOT NULL, grantee TEXT NOT NULL,
475
+ rev INTEGER NOT NULL, scopes_json TEXT NOT NULL, resolved_scopes_json TEXT NOT NULL,
476
+ spend_cap REAL, expires_at TEXT, status TEXT NOT NULL, revoked_at TEXT,
477
+ approved_at TEXT, payer TEXT, synced_at TEXT NOT NULL
478
+ );
479
+ CREATE UNIQUE INDEX idx_grants_grantee_sub ON grants(grantee, sub);
480
+ CREATE TABLE runtime_state (key TEXT PRIMARY KEY, value TEXT NOT NULL);
481
+ `)}o(ln,"addGrantMirror");function pn(e){e.exec("UPDATE nodes SET grantee = 'app:terminal' WHERE grantee = 'user:local';")}o(pn,"migrateTerminalGrantees");function An(e){const n={llm:"crtr:llm",act:"crtr:act",schedule:"crtr:schedule","memory:read":"crtr:memory:read:user","memory:write":"crtr:memory:rw:user"},t=e.prepare("SELECT node_id, scopes_json FROM nodes WHERE scopes_json IS NOT NULL").all(),i=e.prepare("UPDATE nodes SET scopes_json = ? WHERE node_id = ?");for(const T of t){const r=JSON.parse(T.scopes_json);if(!Array.isArray(r))throw new Error(`invalid launched scopes for node ${T.node_id}`);const s=[];for(const a of r){if(typeof a!="string")continue;const d=n[a]??a;try{oe(d),s.push(d)}catch(_){if(!(_ instanceof TypeError))throw _}}i.run(JSON.stringify([...new Set(s)]),T.node_id)}}o(An,"migrateLaunchedScopes");function On(e){e.exec(`CREATE TABLE node_tokens (
482
+ broker_process_id TEXT PRIMARY KEY REFERENCES executions(execution_id) ON DELETE CASCADE,
483
+ node_id TEXT NOT NULL REFERENCES nodes(node_id) ON DELETE CASCADE,
484
+ token_hash TEXT NOT NULL UNIQUE, grantee TEXT NOT NULL, uid INTEGER NOT NULL,
485
+ sub TEXT NOT NULL, grant TEXT, client_id TEXT, scopes_json TEXT,
486
+ issued_at TEXT NOT NULL, revoked_at TEXT
487
+ );`)}o(On,"addNodeTokens");function z(e,n){return e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?").get(n)!==void 0}o(z,"hasTable");function J(e,n,t){return e.prepare(`PRAGMA table_info(${n})`).all().some(i=>i.name===t)}o(J,"hasColumn");function Q(e){z(e,"memory_reads")||e.exec(`CREATE TABLE memory_reads (
488
+ node_id TEXT NOT NULL REFERENCES nodes(node_id) ON DELETE CASCADE,
489
+ name TEXT NOT NULL,
490
+ scope TEXT NOT NULL,
491
+ at TEXT NOT NULL,
492
+ type TEXT NOT NULL CHECK (type IN ('read','loaded'))
493
+ );
494
+ CREATE INDEX idx_memory_reads_at ON memory_reads(at);
495
+ CREATE INDEX idx_memory_reads_node ON memory_reads(node_id);
496
+ INSERT OR IGNORE INTO canvas_meta(key, value) VALUES ('memory_reads.started_at', strftime('%Y-%m-%dT%H:%M:%fZ','now'));`)}o(Q,"addMemoryReads");function V(e){J(e,"sessions","indexed_entry_id")||e.exec("ALTER TABLE sessions ADD COLUMN indexed_entry_id TEXT; ALTER TABLE sessions ADD COLUMN input_ids_json TEXT NOT NULL DEFAULT '[]';")}o(V,"addConversationIndex");function Z(e){z(e,"app_users")||e.exec(`CREATE TABLE app_users (
497
+ app TEXT PRIMARY KEY, uid INTEGER NOT NULL UNIQUE,
498
+ created TEXT NOT NULL, status TEXT NOT NULL CHECK (status IN ('active', 'retired'))
499
+ );`)}o(Z,"addAppUsers");function ee(e){J(e,"crons","grantee")||(e.exec("ALTER TABLE crons ADD COLUMN grantee TEXT NOT NULL DEFAULT 'app:terminal'"),e.exec(`UPDATE crons SET grantee = COALESCE(
500
+ (SELECT COALESCE(nodes.grantee, 'app:terminal') FROM nodes WHERE nodes.node_id = crons.anchor_node),
501
+ 'app:terminal') WHERE anchor_node IS NOT NULL`))}o(ee,"addCronGrantee");function Rn(e){Q(e),V(e),Z(e),ee(e)}o(Rn,"convergeSharedVersions");function mn(e){(e.prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'app_users'").get()?.sql??"").includes("'removed'")||e.exec(`CREATE TABLE app_users_new (
502
+ uid INTEGER PRIMARY KEY, app TEXT NOT NULL,
503
+ created TEXT NOT NULL, status TEXT NOT NULL CHECK (status IN ('active', 'removed')),
504
+ removed_at TEXT
505
+ );
506
+ INSERT INTO app_users_new (uid, app, created, status, removed_at)
507
+ SELECT uid, app, created, CASE status WHEN 'active' THEN 'active' ELSE 'removed' END,
508
+ CASE status WHEN 'active' THEN NULL ELSE created END FROM app_users;
509
+ DROP TABLE app_users;
510
+ ALTER TABLE app_users_new RENAME TO app_users;
511
+ CREATE UNIQUE INDEX idx_app_users_active_app ON app_users(app) WHERE status = 'active';`)}o(mn,"appUsersRemoved");const D=[Ae,Oe,Re,me,fe,Xe,Ie,Se,Ue,Ce,De,ge,he,K,we,K,xe,ye,ve,Fe,ke,We,be,qe,$e,je,ze,Je,Qe,Ve,Ze,en,nn,tn,sn,on,rn,Tn,En,..._n,e=>{ie(e),se(e),Te(e),Ee(e)},dn,cn,an,Nn,un,Ln,ln,On,pn,An,Q,V,Z,ee,Rn,mn],fn=new Set([3]);function k(e){return e.prepare("PRAGMA user_version").get().user_version}o(k,"currentUserVersion");function ne(e,n){D[n](e),e.exec(`PRAGMA user_version = ${n+1}`)}o(ne,"applyMigration");function Mn(e){const n=k(e);if(n>D.length)throw new Error(`unsupported canvas schema version ${n} (latest supported ${D.length})`);if(n===D.length)return;const t=e.prepare("PRAGMA busy_timeout").get().timeout;e.exec("PRAGMA busy_timeout = 60000;");try{Xn(e)}finally{e.exec(`PRAGMA busy_timeout = ${t};`)}}o(Mn,"migrate");function Xn(e){for(;;){const n=k(e);if(n>=D.length)return;if(e.isTransaction||fn.has(n)){ne(e,n);continue}e.exec("BEGIN IMMEDIATE");try{k(e)===n&&ne(e,n),e.exec("COMMIT")}catch(t){try{e.exec("ROLLBACK")}catch{}throw t}}}o(Xn,"runPendingMigrations");export{D as MIGRATIONS,Mn as migrate};
@@ -1 +1 @@
1
- var p=Object.defineProperty;var n=(t,e)=>p(t,"name",{value:e,configurable:!0});import{execFileSync as m}from"node:child_process";import{existsSync as x,readFileSync as $}from"node:fs";import{join as h}from"node:path";import{jobDir as g}from"./paths.js";import{isFrozenRow as v,resolveNodeVisual as _}from"./status-glyph.js";const y=10,E=30,c="\x1B[",i=`${c}0m`,C=`${c}1m`,a=`${c}2m`,D=`${c}7m`,G=`${c}48;5;22m`,d=`${c}32m`,O=`${c}31m`,S=`${c}33m`,j=`${c}36m`,F=`${c}90m`;function k(t){return t.status!=="active"&&t.status!=="idle"?!1:t.streaming===!0}n(k,"streamingFor");function V(t){if(t===null)return"?";const e=_(t.status,{streaming:k(t),frozen:v(t),hanging:t.fault??null});return`${c}${e.color}m${e.glyph}${i}`}n(V,"nodeGlyph");const l=/\x1b\[[0-9;]*m/g;function H(t){return t.replace(l,"")}n(H,"stripSgr");function f(t){return t.replace(l,"").length}n(f,"visibleWidth");function A(t,e=R()){if(f(t)<=e)return t;let r="",o=0,s=0;for(;s<t.length&&o<e-1;){if(t[s]==="\x1B"){const u=/^\x1b\[[0-9;]*m/.exec(t.slice(s));if(u){r+=u[0],s+=u[0].length;continue}}r+=t[s],o++,s++}return`${r}\u2026${i}`}n(A,"truncate");function R(){return Math.max(20,Math.min((process.stdout.columns??80)-2,180))}n(R,"fillWidth");function P(t,e,r){const o=A(t,e),s=o.replace(/\x1b\[0m/g,`${i}${r}`),u=Math.max(0,e-f(o));return`${r}${s}${" ".repeat(u)}${i}`}n(P,"fillBar");function w(t){return t<1e3?`${t}`:`${Math.round(t/1e3)}k`}n(w,"fmtTokens");function Y(t,e=!1){return w(e?0:t?.telemetry_context_tokens??0)}n(Y,"tokensCell");function z(t,e=!1){if(e||t?.status!=="active")return"";const r=(t.telemetry_last_activity??"").trim();return r===""?"":` ${a}\xB7 ${r}${i}`}n(z,"activityCell");function J(t){const e=t?.cycles??0;return e>0?` ${a}\u27F3${e}${i}`:""}n(J,"cycleBadge");function K(t,e){if(t===null)return B(e);const r=t.name&&t.name!==t.kind?t.name:"";if(r!=="")return r;const o=(t.description??"").trim();return o!==""?o:t.name}n(K,"navLabel");function B(t){return t.slice(0,8)}n(B,"shortId");function b(t,e,r=!1){if(r||e?.status!=="active")return!1;try{const o=h(g(t),"attach.json");if(!x(o))return!1;const s=JSON.parse($(o,"utf8"));return typeof s.viewers=="number"&&s.viewers>0}catch{return!1}}n(b,"hasBrokerViewers");function X(t,e,r,o=!1){return o?!1:r.has(t)?!0:b(t,e,o)}n(X,"isAttached");function q(t,e){const r=e[t]??0;return r>0?` ${S}\u2691${r}${i}`:""}n(q,"askBadge");function Q(t,e){if(t===null||t.status==="active")return"";const r=e.get(t.node_id)??0;return r>0?` ${d}\u21E3${r}${i}`:""}n(Q,"liveBelowBadge");function U(t){try{const e=m("crtr",["canvas","attention","map","--view",t,"--json"],{timeout:2500,encoding:"utf8"});return JSON.parse(e.trim()).counts??{}}catch{return{}}}n(U,"fetchAsksMap");function Z(){const t=process.stdout.rows??E;return Math.max(4,Math.min(y,t-4))}n(Z,"graphWidgetBudget");const tt=`${a}jk move \xB7 hl fold \xB7 \u21B5 focus \xB7 e expand \xB7 x kill \xB7 m mgr \xB7 esc${i}`;export{G as BG_ATTACHED,C as BOLD,j as CYAN,a as DIM,c as ESC,tt as GRAPH_HINT,F as GRAY,d as GREEN,y as PI_MAX_WIDGET_LINES,O as RED,i as RESET,D as REVERSE,E as VIEWPORT_FALLBACK_ROWS,S as YELLOW,z as activityCell,q as askBadge,J as cycleBadge,U as fetchAsksMap,P as fillBar,R as fillWidth,w as fmtTokens,Z as graphWidgetBudget,b as hasBrokerViewers,X as isAttached,Q as liveBelowBadge,K as navLabel,V as nodeGlyph,B as shortId,H as stripSgr,Y as tokensCell,A as truncate,f as visibleWidth};
1
+ var f=Object.defineProperty;var n=(t,e)=>f(t,"name",{value:e,configurable:!0});import{execFileSync as m}from"node:child_process";import{join as x}from"node:path";import{nodeRunDir as $,nodeRunJobDir as h}from"./paths.js";import{readFileBeneath as g}from"../spaces/open-beneath.js";import{isFrozenRow as v,resolveNodeVisual as _}from"./status-glyph.js";const E=10,d=30,s="\x1B[",c=`${s}0m`,W=`${s}1m`,a=`${s}2m`,C=`${s}7m`,G=`${s}48;5;22m`,y=`${s}32m`,O=`${s}31m`,R=`${s}33m`,F=`${s}36m`,j=`${s}90m`;function k(t){return t.status!=="active"&&t.status!=="idle"?!1:t.streaming===!0}n(k,"streamingFor");function V(t){if(t===null)return"?";const e=_(t.status,{streaming:k(t),frozen:v(t),hanging:t.fault??null});return`${s}${e.color}m${e.glyph}${c}`}n(V,"nodeGlyph");const l=/\x1b\[[0-9;]*m/g;function H(t){return t.replace(l,"")}n(H,"stripSgr");function p(t){return t.replace(l,"").length}n(p,"visibleWidth");function A(t,e=B()){if(p(t)<=e)return t;let r="",o=0,i=0;for(;i<t.length&&o<e-1;){if(t[i]==="\x1B"){const u=/^\x1b\[[0-9;]*m/.exec(t.slice(i));if(u){r+=u[0],i+=u[0].length;continue}}r+=t[i],o++,i++}return`${r}\u2026${c}`}n(A,"truncate");function B(){return Math.max(20,Math.min((process.stdout.columns??80)-2,180))}n(B,"fillWidth");function J(t,e,r){const o=A(t,e),i=o.replace(/\x1b\[0m/g,`${c}${r}`),u=Math.max(0,e-p(o));return`${r}${i}${" ".repeat(u)}${c}`}n(J,"fillBar");function S(t){return t<1e3?`${t}`:`${Math.round(t/1e3)}k`}n(S,"fmtTokens");function P(t,e=!1){return S(e?0:t?.telemetry_context_tokens??0)}n(P,"tokensCell");function Y(t,e=!1){if(e||t?.status!=="active")return"";const r=(t.telemetry_last_activity??"").trim();return r===""?"":` ${a}\xB7 ${r}${c}`}n(Y,"activityCell");function z(t){const e=t?.cycles??0;return e>0?` ${a}\u27F3${e}${c}`:""}n(z,"cycleBadge");function K(t,e){if(t===null)return w(e);const r=t.name&&t.name!==t.kind?t.name:"";if(r!=="")return r;const o=(t.description??"").trim();return o!==""?o:t.name}n(K,"navLabel");function w(t){return t.slice(0,8)}n(w,"shortId");function b(t,e,r=!1){if(r||e?.status!=="active")return!1;try{const o=JSON.parse(g($(t),x(h(t),"attach.json")).toString("utf8"));return typeof o.viewers=="number"&&o.viewers>0}catch{return!1}}n(b,"hasBrokerViewers");function X(t,e,r,o=!1){return o?!1:r.has(t)?!0:b(t,e,o)}n(X,"isAttached");function q(t,e){const r=e[t]??0;return r>0?` ${R}\u2691${r}${c}`:""}n(q,"askBadge");function Q(t,e){if(t===null||t.status==="active")return"";const r=e.get(t.node_id)??0;return r>0?` ${y}\u21E3${r}${c}`:""}n(Q,"liveBelowBadge");function U(t){try{const e=m("crtr",["canvas","attention","map","--view",t,"--json"],{timeout:2500,encoding:"utf8"});return JSON.parse(e.trim()).counts??{}}catch{return{}}}n(U,"fetchAsksMap");function Z(){const t=process.stdout.rows??d;return Math.max(4,Math.min(E,t-4))}n(Z,"graphWidgetBudget");const tt=`${a}jk move \xB7 hl fold \xB7 \u21B5 focus \xB7 e expand \xB7 x kill \xB7 m mgr \xB7 esc${c}`;export{G as BG_ATTACHED,W as BOLD,F as CYAN,a as DIM,s as ESC,tt as GRAPH_HINT,j as GRAY,y as GREEN,E as PI_MAX_WIDGET_LINES,O as RED,c as RESET,C as REVERSE,d as VIEWPORT_FALLBACK_ROWS,R as YELLOW,Y as activityCell,q as askBadge,z as cycleBadge,U as fetchAsksMap,J as fillBar,B as fillWidth,S as fmtTokens,Z as graphWidgetBudget,b as hasBrokerViewers,X as isAttached,Q as liveBelowBadge,K as navLabel,V as nodeGlyph,w as shortId,H as stripSgr,P as tokensCell,A as truncate,p as visibleWidth};
@@ -0,0 +1,8 @@
1
+ /** Resolve an existing node's app from the sole durable assignment, its row.
2
+ * Brokers have only their own app in their launch environment, not the DB. */
3
+ export declare function appForNode(nodeId: string): string;
4
+ export declare function nodeAgentDir(nodeId: string, grantee?: string): string;
5
+ export declare function contextDir(nodeId: string, grantee?: string): string;
6
+ export declare function reportsDir(nodeId: string, grantee?: string): string;
7
+ export declare function interpolateNodePaths(text: string, nodeId: string): string;
8
+ export declare function ensureNodeDirs(nodeId: string, grantee?: string): void;
@@ -0,0 +1 @@
1
+ var s=Object.defineProperty;var t=(r,e)=>s(r,"name",{value:e,configurable:!0});import{join as p}from"node:path";import{envGrantee as a,envNodeId as u}from"../../shared/env.js";import{openDb as f}from"./db.js";import{nodeAgentDir as c,ensureNodeDirs as m,interpolateNodePaths as D}from"./paths.js";function o(r){const e=a();if(u()===r&&e)return e;const n=f().prepare("SELECT grantee FROM nodes WHERE node_id = ?").get(r);if(!n?.grantee)throw new Error(`node ${r} has no app assignment`);return n.grantee}t(o,"appForNode");function i(r,e){return c(r,e??o(r))}t(i,"nodeAgentDir");function E(r,e){return p(i(r,e),"context")}t(E,"contextDir");function F(r,e){return p(i(r,e),"reports")}t(F,"reportsDir");function w(r,e){return D(r,e,o(e))}t(w,"interpolateNodePaths");function d(r,e){m(r,e??o(r))}t(d,"ensureNodeDirs");export{o as appForNode,E as contextDir,d as ensureNodeDirs,w as interpolateNodePaths,i as nodeAgentDir,F as reportsDir};
@@ -14,8 +14,8 @@ export declare function parseRecapBriefing(briefing: string): {
14
14
  goal: string;
15
15
  state: string;
16
16
  } | null;
17
- /** Persist a freshly generated briefing. Best-effort — a write failure only costs
18
- * the browse preview one stale panel, so it must never disturb the broker. */
17
+ /** Persist a generated briefing. A failed write leaves the prior recap intact
18
+ * and must be reported to the broker before it paints the replacement. */
19
19
  export declare function writeNodeRecap(nodeId: string, briefing: string): void;
20
20
  /** The node's stored briefing, or undefined when it never generated one (a node
21
21
  * that finished before its first idle window, or one last run before this file