@north-light/crouter 0.3.352 → 0.3.354

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 (616) hide show
  1. package/dist/api/client.d.ts +35 -25
  2. package/dist/api/client.js +2 -2
  3. package/dist/api/dto/broker-ops.d.ts +2 -36
  4. package/dist/api/dto/canvas.d.ts +8 -13
  5. package/dist/api/dto/config.d.ts +4 -0
  6. package/dist/api/dto/delivery.d.ts +61 -0
  7. package/dist/api/dto/docs.d.ts +133 -0
  8. package/dist/api/dto/docs.js +1 -0
  9. package/dist/api/dto/health.d.ts +26 -79
  10. package/dist/api/dto/node-outcomes.d.ts +1 -3
  11. package/dist/api/dto/nodes.d.ts +5 -26
  12. package/dist/api/dto/objects.d.ts +167 -0
  13. package/dist/api/dto/objects.js +1 -0
  14. package/dist/api/dto/profiles.d.ts +14 -8
  15. package/dist/api/dto/reports.d.ts +9 -7
  16. package/dist/api/dto/reviews.d.ts +9 -3
  17. package/dist/api/dto/worktree.d.ts +1 -1
  18. package/dist/api/index.d.ts +0 -1
  19. package/dist/api/index.js +1 -1
  20. package/dist/api/routes.d.ts +14 -12
  21. package/dist/api/routes.js +1 -1
  22. package/dist/build-root.js +1 -1
  23. package/dist/builtin-memory/00-runtime-base/00-authoring.md +10 -5
  24. package/dist/builtin-memory/04-orchestration-kernel.md +7 -7
  25. package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +1 -1
  26. package/dist/builtin-memory/05-kinds/explore/00-base.md +2 -2
  27. package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +2 -2
  28. package/dist/builtin-memory/crouter-concepts/INDEX.md +2 -2
  29. package/dist/builtin-memory/crouter-concepts/lifecycle-and-wakes.md +1 -1
  30. package/dist/builtin-memory/crouter-concepts/memory.md +15 -15
  31. package/dist/builtin-memory/crouter-concepts/nodes-and-the-canvas.md +1 -1
  32. package/dist/builtin-memory/crouter-concepts/profiles-kinds-and-modes.md +5 -5
  33. package/dist/builtin-memory/crouter-concepts/scopes-and-trust.md +1 -1
  34. package/dist/builtin-memory/crouter-concepts/why-a-daemon.md +1 -1
  35. package/dist/builtin-memory/crouter-sdk/INDEX.md +2 -2
  36. package/dist/builtin-memory/crouter-sdk/README.md +5 -6
  37. package/dist/builtin-memory/crouter-sdk/errors.md +0 -13
  38. package/dist/builtin-memory/crouter-sdk/guides/README.md +0 -1
  39. package/dist/builtin-memory/crouter-sdk/guides/event-driven-assistant.md +2 -2
  40. package/dist/builtin-memory/crouter-sdk/nodes.md +0 -2
  41. package/dist/builtin-memory/crouter-sdk/resources.md +0 -1
  42. package/dist/builtin-memory/explore/exploration-doc.md +4 -4
  43. package/dist/builtin-memory/insights/capture.md +6 -6
  44. package/dist/builtin-memory/insights/init.md +14 -14
  45. package/dist/builtin-memory/internal/INDEX.md +4 -4
  46. package/dist/builtin-memory/internal/agent-shaping.md +20 -20
  47. package/dist/builtin-memory/internal/examples/imessage-assistant.md +2 -2
  48. package/dist/builtin-memory/internal/marketplaces.md +2 -2
  49. package/dist/builtin-memory/internal/memory-loading.md +31 -30
  50. package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
  51. package/dist/builtin-memory/internal/plugins.md +16 -14
  52. package/dist/builtin-memory/internal/storage-tiers.md +4 -4
  53. package/dist/builtin-memory/memory-read-orientation.md +1 -1
  54. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +32 -40
  55. package/dist/clients/attach/input/controller.js +1 -1
  56. package/dist/clients/attach/input/ref-autocomplete.js +1 -1
  57. package/dist/clients/attach/input/titled-editor.js +1 -1
  58. package/dist/clients/attach/render/chat-view.js +1 -1
  59. package/dist/clients/attach/render/crtr-output.d.ts +1 -2
  60. package/dist/clients/attach/render/crtr-output.js +17 -17
  61. package/dist/clients/attach/render/group-activity.d.ts +8 -8
  62. package/dist/clients/attach/render/group-activity.js +2 -2
  63. package/dist/clients/attach/render/group-recap.js +1 -1
  64. package/dist/clients/attach/render/tool-calls.d.ts +1 -1
  65. package/dist/clients/attach/session/profile-files.js +1 -1
  66. package/dist/clients/attach/slash/dispatch.js +1 -1
  67. package/dist/clients/attach/viewer.js +806 -1553
  68. package/dist/commands/api-client.d.ts +2 -0
  69. package/dist/commands/api-client.js +3 -3
  70. package/dist/commands/canvas/edges.d.ts +2 -0
  71. package/dist/commands/canvas/edges.js +2 -0
  72. package/dist/commands/canvas/list.d.ts +4 -0
  73. package/dist/commands/canvas/list.js +3 -0
  74. package/dist/commands/canvas/read.d.ts +8 -0
  75. package/dist/commands/canvas/read.js +5 -0
  76. package/dist/commands/canvas/search.d.ts +2 -0
  77. package/dist/commands/canvas/search.js +3 -0
  78. package/dist/commands/canvas/unwatch.d.ts +2 -0
  79. package/dist/commands/canvas/unwatch.js +1 -0
  80. package/dist/commands/canvas/watch.d.ts +3 -0
  81. package/dist/commands/canvas/watch.js +1 -0
  82. package/dist/commands/canvas-analytics.js +1 -1
  83. package/dist/commands/canvas-history/grep.js +4 -4
  84. package/dist/commands/canvas-history/read.js +2 -2
  85. package/dist/commands/canvas-history/search.js +7 -7
  86. package/dist/commands/canvas-history/shared.d.ts +0 -1
  87. package/dist/commands/canvas-history/shared.js +1 -1
  88. package/dist/commands/canvas-history/stats.js +2 -2
  89. package/dist/commands/canvas-history.js +1 -1
  90. package/dist/commands/canvas.js +1 -1
  91. package/dist/commands/doc/delete.d.ts +2 -0
  92. package/dist/commands/doc/delete.js +1 -0
  93. package/dist/commands/doc/edit.d.ts +2 -0
  94. package/dist/commands/doc/edit.js +1 -0
  95. package/dist/commands/doc/history.d.ts +2 -0
  96. package/dist/commands/doc/history.js +2 -0
  97. package/dist/commands/doc/lint.d.ts +2 -0
  98. package/dist/commands/doc/lint.js +2 -0
  99. package/dist/commands/doc/list.d.ts +2 -0
  100. package/dist/commands/doc/list.js +1 -0
  101. package/dist/commands/doc/move.d.ts +2 -0
  102. package/dist/commands/doc/move.js +1 -0
  103. package/dist/commands/doc/read.d.ts +2 -0
  104. package/dist/commands/doc/read.js +1 -0
  105. package/dist/commands/doc/shared.d.ts +25 -0
  106. package/dist/commands/doc/shared.js +2 -0
  107. package/dist/commands/doc/write.d.ts +2 -0
  108. package/dist/commands/doc/write.js +1 -0
  109. package/dist/commands/{memory.d.ts → doc.d.ts} +1 -1
  110. package/dist/commands/doc.js +1 -0
  111. package/dist/commands/human/review.js +1 -1
  112. package/dist/commands/node/bash.js +2 -2
  113. package/dist/commands/node/create.js +1 -1
  114. package/dist/commands/node/inspect.js +10 -10
  115. package/dist/commands/node/lifecycle.js +2 -2
  116. package/dist/commands/node/outcome.js +1 -1
  117. package/dist/commands/node/subscription.js +1 -1
  118. package/dist/commands/node-context.js +2 -2
  119. package/dist/commands/pkg/browse/catalog.js +1 -1
  120. package/dist/commands/pkg/browse/doc-view.js +1 -1
  121. package/dist/commands/pkg/browse/model.d.ts +9 -17
  122. package/dist/commands/pkg/plugin-inspect.js +1 -1
  123. package/dist/commands/pkg/plugin-manage.d.ts +4 -8
  124. package/dist/commands/pkg/plugin-manage.js +15 -17
  125. package/dist/commands/profile/list.js +1 -1
  126. package/dist/commands/profile/new.js +1 -1
  127. package/dist/commands/profile/project.js +1 -1
  128. package/dist/commands/profile/show.js +1 -1
  129. package/dist/commands/push.js +3 -3
  130. package/dist/commands/sys/config.js +1 -1
  131. package/dist/commands/sys/context/admin/actions.d.ts +18 -43
  132. package/dist/commands/sys/context/admin/actions.js +1 -2
  133. package/dist/commands/sys/context/admin/detail-panel.d.ts +17 -25
  134. package/dist/commands/sys/context/admin/detail-panel.js +2 -1
  135. package/dist/commands/sys/context/admin/docs-panel.d.ts +7 -6
  136. package/dist/commands/sys/context/admin/docs-panel.js +1 -1
  137. package/dist/commands/sys/context/admin/list-view.d.ts +12 -12
  138. package/dist/commands/sys/context/admin/list-view.js +1 -1
  139. package/dist/commands/sys/context/admin/model.d.ts +96 -69
  140. package/dist/commands/sys/context/admin/model.js +1 -1
  141. package/dist/commands/sys/context/admin/rail-panel.d.ts +7 -5
  142. package/dist/commands/sys/context/admin/rail-panel.js +1 -1
  143. package/dist/commands/sys/context/admin/read-view.d.ts +10 -14
  144. package/dist/commands/sys/context/admin/read-view.js +1 -2
  145. package/dist/commands/sys/context/admin/shell.d.ts +26 -31
  146. package/dist/commands/sys/context/admin/shell.js +1 -1
  147. package/dist/commands/sys/context/admin.js +2 -2
  148. package/dist/commands/sys/context/doc.js +2 -3
  149. package/dist/commands/sys/context/expose.js +2 -2
  150. package/dist/commands/sys/context/prompt-review.js +4 -4
  151. package/dist/commands/sys/context/resolve.d.ts +92 -65
  152. package/dist/commands/sys/context/resolve.js +7 -9
  153. package/dist/commands/sys/context.js +1 -1
  154. package/dist/commands/sys/doctor.js +1 -1
  155. package/dist/commands/sys/migrate.js +1 -1
  156. package/dist/commands/sys/panels/profiles-panel.d.ts +3 -1
  157. package/dist/commands/sys/panels/profiles-panel.js +1 -1
  158. package/dist/commands/sys/sync-deps.d.ts +6 -11
  159. package/dist/commands/sys/sync-deps.js +7 -8
  160. package/dist/commands/sys/sync-project-guidance.js +5 -4
  161. package/dist/commands/sys/sync-shared.d.ts +41 -4
  162. package/dist/commands/sys/sync-shared.js +1 -1
  163. package/dist/commands/sys/sync-skills.js +2 -2
  164. package/dist/commands/sys/sync.js +1 -1
  165. package/dist/core/bash-job-supervisor.d.ts +2 -3
  166. package/dist/core/bash-job-supervisor.js +3 -3
  167. package/dist/core/bash-jobs.d.ts +0 -5
  168. package/dist/core/bash-jobs.js +7 -7
  169. package/dist/core/bootstrap.js +2 -2
  170. package/dist/core/canvas/canvas.d.ts +6 -50
  171. package/dist/core/canvas/canvas.js +16 -21
  172. package/dist/core/canvas/db.d.ts +4 -1
  173. package/dist/core/canvas/db.js +2 -2
  174. package/dist/core/canvas/history.d.ts +11 -39
  175. package/dist/core/canvas/history.js +9 -20
  176. package/dist/core/canvas/install-id.d.ts +2 -2
  177. package/dist/core/canvas/install-id.js +1 -1
  178. package/dist/core/canvas/memory-reads.d.ts +5 -0
  179. package/dist/core/canvas/memory-reads.js +1 -1
  180. package/dist/core/canvas/migrations.js +215 -41
  181. package/dist/core/canvas/node-agent-paths.js +1 -1
  182. package/dist/core/canvas/node-tokens.js +1 -1
  183. package/dist/core/canvas/paths.d.ts +0 -4
  184. package/dist/core/canvas/paths.js +1 -1
  185. package/dist/core/canvas/remote-canvas-source.d.ts +0 -1
  186. package/dist/core/canvas/remote-canvas-source.js +1 -1
  187. package/dist/core/canvas/render-source.d.ts +9 -6
  188. package/dist/core/canvas/render-source.js +6 -6
  189. package/dist/core/canvas/sessions.js +2 -2
  190. package/dist/core/canvas/source.d.ts +6 -0
  191. package/dist/core/canvas/tree.d.ts +29 -0
  192. package/dist/core/canvas/tree.js +12 -0
  193. package/dist/core/canvas/types.d.ts +0 -20
  194. package/dist/core/command-plugins/bundle.js +1 -1
  195. package/dist/core/config.d.ts +1 -1
  196. package/dist/core/conversation-store/listener.js +4 -2
  197. package/dist/core/feed/feed.d.ts +9 -7
  198. package/dist/core/feed/feed.js +3 -7
  199. package/dist/core/feed/inbox.d.ts +3 -5
  200. package/dist/core/feed/inbox.js +1 -10
  201. package/dist/core/feed/messages.d.ts +33 -6
  202. package/dist/core/feed/messages.js +10 -7
  203. package/dist/core/feed/reports.d.ts +10 -0
  204. package/dist/core/feed/reports.js +2 -0
  205. package/dist/core/grants/remove.js +1 -1
  206. package/dist/core/graph/access.d.ts +24 -0
  207. package/dist/core/graph/access.js +8 -0
  208. package/dist/core/graph/bodies.d.ts +6 -0
  209. package/dist/core/graph/bodies.js +1 -0
  210. package/dist/core/graph/deletion.d.ts +9 -0
  211. package/dist/core/graph/deletion.js +5 -0
  212. package/dist/core/graph/diff.d.ts +4 -0
  213. package/dist/core/graph/diff.js +4 -0
  214. package/dist/core/graph/documents.d.ts +160 -0
  215. package/dist/core/graph/documents.js +7 -0
  216. package/dist/core/graph/edges.d.ts +24 -0
  217. package/dist/core/graph/edges.js +1 -0
  218. package/dist/core/graph/events.d.ts +26 -0
  219. package/dist/core/graph/events.js +6 -0
  220. package/dist/core/graph/exposures.d.ts +53 -0
  221. package/dist/core/graph/exposures.js +4 -0
  222. package/dist/core/graph/jobs.d.ts +31 -0
  223. package/dist/core/graph/jobs.js +2 -0
  224. package/dist/core/graph/names.d.ts +28 -0
  225. package/dist/core/graph/names.js +3 -0
  226. package/dist/core/graph/objects.d.ts +55 -0
  227. package/dist/core/graph/objects.js +9 -0
  228. package/dist/core/graph/package-docs.d.ts +31 -0
  229. package/dist/core/graph/package-docs.js +5 -0
  230. package/dist/core/graph/package-files.d.ts +20 -0
  231. package/dist/core/graph/package-files.js +2 -0
  232. package/dist/core/graph/reader.d.ts +21 -0
  233. package/dist/core/graph/reader.js +3 -0
  234. package/dist/core/graph/repo-sync/exchange.d.ts +34 -0
  235. package/dist/core/graph/repo-sync/exchange.js +2 -0
  236. package/dist/core/graph/repo-sync/identity.d.ts +30 -0
  237. package/dist/core/graph/repo-sync/identity.js +1 -0
  238. package/dist/core/graph/repo-sync/index.d.ts +4 -0
  239. package/dist/core/graph/repo-sync/index.js +1 -0
  240. package/dist/core/graph/repo-sync/mirror.d.ts +30 -0
  241. package/dist/core/graph/repo-sync/mirror.js +6 -0
  242. package/dist/core/graph/repo-sync/ref-format.d.ts +76 -0
  243. package/dist/core/graph/repo-sync/ref-format.js +2 -0
  244. package/dist/core/graph/repo-sync/repos.d.ts +17 -0
  245. package/dist/core/graph/repo-sync/repos.js +3 -0
  246. package/dist/core/graph/repo-sync/sync.d.ts +42 -0
  247. package/dist/core/graph/repo-sync/sync.js +2 -0
  248. package/dist/core/graph/rules.d.ts +26 -0
  249. package/dist/core/graph/rules.js +3 -0
  250. package/dist/core/graph/spaces/app.d.ts +3 -0
  251. package/dist/core/graph/spaces/app.js +1 -0
  252. package/dist/core/graph/spaces/index.d.ts +19 -0
  253. package/dist/core/graph/spaces/index.js +1 -0
  254. package/dist/core/graph/spaces/person.d.ts +5 -0
  255. package/dist/core/graph/spaces/person.js +2 -0
  256. package/dist/core/graph/spaces/repo.d.ts +4 -0
  257. package/dist/core/graph/spaces/repo.js +1 -0
  258. package/dist/core/graph/types.d.ts +75 -0
  259. package/dist/core/graph/types.js +1 -0
  260. package/dist/core/graph/watches.d.ts +62 -0
  261. package/dist/core/graph/watches.js +18 -0
  262. package/dist/core/human/feedback-companion.js +1 -1
  263. package/dist/core/human/requests.d.ts +3 -1
  264. package/dist/core/human/requests.js +6 -6
  265. package/dist/core/inspector/model.js +2 -2
  266. package/dist/core/io.js +5 -5
  267. package/dist/core/layout-migrate/index.d.ts +24 -1
  268. package/dist/core/layout-migrate/index.js +4 -4
  269. package/dist/core/layout-migrate/paths.d.ts +4 -0
  270. package/dist/core/layout-migrate/paths.js +1 -1
  271. package/dist/core/layout-migrate/stored-paths.d.ts +7 -0
  272. package/dist/core/layout-migrate/stored-paths.js +11 -11
  273. package/dist/core/layout-migrate/stores.d.ts +19 -6
  274. package/dist/core/layout-migrate/stores.js +3 -4
  275. package/dist/core/manifest.d.ts +0 -2
  276. package/dist/core/manifest.js +1 -1
  277. package/dist/core/{memory/extensions.d.ts → plugin-extensions.d.ts} +9 -10
  278. package/dist/core/plugin-extensions.js +1 -0
  279. package/dist/core/preview-registry.d.ts +1 -1
  280. package/dist/core/preview-registry.js +3 -2
  281. package/dist/core/profiles/manifest.d.ts +7 -7
  282. package/dist/core/profiles/manifest.js +1 -1
  283. package/dist/core/profiles/select.js +3 -3
  284. package/dist/core/review/birth.js +1 -1
  285. package/dist/core/review/companion.js +1 -1
  286. package/dist/core/review/stage.d.ts +12 -1
  287. package/dist/core/review/stage.js +1 -1
  288. package/dist/core/review/store.d.ts +2 -0
  289. package/dist/core/review/store.js +1 -1
  290. package/dist/core/review/types.d.ts +7 -1
  291. package/dist/core/runs/events.js +1 -1
  292. package/dist/core/runs/operations.js +5 -5
  293. package/dist/core/runs/questions.js +2 -2
  294. package/dist/core/runtime/bearings-render.d.ts +13 -7
  295. package/dist/core/runtime/bearings-render.js +12 -12
  296. package/dist/core/runtime/bearings.d.ts +8 -18
  297. package/dist/core/runtime/bearings.js +7 -7
  298. package/dist/core/runtime/broker/daemon-ops.d.ts +7 -12
  299. package/dist/core/runtime/broker/daemon-ops.js +1 -1
  300. package/dist/core/runtime/broker/fault-retry.d.ts +2 -0
  301. package/dist/core/runtime/broker/fault-retry.js +1 -1
  302. package/dist/core/runtime/broker/frame-dispatch.d.ts +1 -1
  303. package/dist/core/runtime/broker/frame-memory-refs.d.ts +7 -2
  304. package/dist/core/runtime/broker/frame-memory-refs.js +1 -1
  305. package/dist/core/runtime/broker/inbox.d.ts +1 -4
  306. package/dist/core/runtime/broker/inbox.js +1 -10
  307. package/dist/core/runtime/broker/rebind.js +1 -1
  308. package/dist/core/runtime/broker/retry-card-elision.d.ts +7 -0
  309. package/dist/core/runtime/broker/retry-card-elision.js +1 -0
  310. package/dist/core/runtime/broker-extension-render.d.ts +0 -13
  311. package/dist/core/runtime/broker-extension-render.js +2 -4
  312. package/dist/core/runtime/broker-persona-guidance.js +3 -3
  313. package/dist/core/runtime/broker-protocol.d.ts +1 -1
  314. package/dist/core/runtime/broker.js +1 -1
  315. package/dist/core/runtime/close.d.ts +9 -4
  316. package/dist/core/runtime/close.js +1 -1
  317. package/dist/core/runtime/deliver-live.js +1 -1
  318. package/dist/core/runtime/kickoff.js +17 -19
  319. package/dist/core/runtime/launch-target.d.ts +7 -0
  320. package/dist/core/runtime/launch-target.js +1 -1
  321. package/dist/core/runtime/ledger.d.ts +10 -0
  322. package/dist/core/runtime/ledger.js +3 -0
  323. package/dist/core/runtime/lifecycle.js +2 -2
  324. package/dist/core/runtime/nodes.d.ts +10 -2
  325. package/dist/core/runtime/nodes.js +1 -1
  326. package/dist/core/runtime/outcome-document.d.ts +2 -2
  327. package/dist/core/runtime/outcome-document.js +1 -1
  328. package/dist/core/runtime/persona.js +2 -2
  329. package/dist/core/runtime/placement.js +1 -1
  330. package/dist/core/runtime/promote.d.ts +2 -2
  331. package/dist/core/runtime/promote.js +1 -1
  332. package/dist/core/runtime/prospective-inventory-cli.js +2 -2
  333. package/dist/core/runtime/recycle.js +1 -1
  334. package/dist/core/runtime/reopen.js +1 -1
  335. package/dist/core/runtime/revive.js +2 -2
  336. package/dist/core/runtime/roadmap.d.ts +17 -9
  337. package/dist/core/runtime/roadmap.js +4 -4
  338. package/dist/core/runtime/spawn-env.js +1 -1
  339. package/dist/core/runtime/spawn.d.ts +5 -3
  340. package/dist/core/runtime/spawn.js +2 -2
  341. package/dist/core/runtime/structured-output.d.ts +3 -1
  342. package/dist/core/runtime/structured-output.js +4 -4
  343. package/dist/core/scope.d.ts +1 -32
  344. package/dist/core/scope.js +1 -1
  345. package/dist/core/scoped-state/db.js +2 -1
  346. package/dist/core/scoped-state/migrate.js +2 -2
  347. package/dist/core/scoped-state/profiles.d.ts +11 -0
  348. package/dist/core/scoped-state/profiles.js +1 -1
  349. package/dist/core/scoped-state/schema.d.ts +1 -1
  350. package/dist/core/scoped-state/schema.js +7 -5
  351. package/dist/core/spaces/permissions.d.ts +0 -14
  352. package/dist/core/spaces/permissions.js +1 -1
  353. package/dist/core/spaces/stop.d.ts +13 -0
  354. package/dist/core/spaces/stop.js +2 -2
  355. package/dist/core/storage/tables.d.ts +1 -1
  356. package/dist/core/substrate/delivery/corpus.d.ts +21 -0
  357. package/dist/core/substrate/delivery/corpus.js +3 -0
  358. package/dist/core/substrate/delivery/deliver.d.ts +76 -0
  359. package/dist/core/substrate/delivery/deliver.js +6 -0
  360. package/dist/core/substrate/delivery/listings.d.ts +27 -0
  361. package/dist/core/substrate/delivery/listings.js +4 -0
  362. package/dist/core/substrate/delivery/match.d.ts +28 -0
  363. package/dist/core/substrate/delivery/match.js +1 -0
  364. package/dist/core/substrate/delivery/plan.d.ts +67 -0
  365. package/dist/core/substrate/delivery/plan.js +3 -0
  366. package/dist/core/substrate/delivery/render-boot.d.ts +20 -0
  367. package/dist/core/substrate/delivery/render-boot.js +54 -0
  368. package/dist/core/substrate/delivery/render-event.d.ts +47 -0
  369. package/dist/core/substrate/delivery/render-event.js +6 -0
  370. package/dist/core/substrate/delivery/sub-persona-menu.d.ts +2 -0
  371. package/dist/core/substrate/delivery/sub-persona-menu.js +6 -0
  372. package/dist/core/substrate/delivery/types.d.ts +30 -0
  373. package/dist/core/substrate/delivery/types.js +0 -0
  374. package/dist/core/substrate/gate-explain.d.ts +0 -13
  375. package/dist/core/substrate/gate-explain.js +1 -1
  376. package/dist/core/substrate/schema.d.ts +11 -139
  377. package/dist/core/substrate/schema.js +1 -1
  378. package/dist/core/substrate/subject-fields.d.ts +3 -0
  379. package/dist/core/substrate/subject.d.ts +2 -1
  380. package/dist/core/substrate/subject.js +1 -1
  381. package/dist/daemon/api/app-listener.js +11 -11
  382. package/dist/daemon/api/handlers/app-profiles.js +1 -1
  383. package/dist/daemon/api/handlers/bash-jobs.js +1 -2
  384. package/dist/daemon/api/handlers/broker-ops.js +1 -1
  385. package/dist/daemon/api/handlers/canvas.js +5 -5
  386. package/dist/daemon/api/handlers/daemon.js +1 -1
  387. package/dist/daemon/api/handlers/delivery.d.ts +2 -0
  388. package/dist/daemon/api/handlers/delivery.js +1 -0
  389. package/dist/daemon/api/handlers/{memory.d.ts → docs.d.ts} +1 -1
  390. package/dist/daemon/api/handlers/docs.js +1 -0
  391. package/dist/daemon/api/handlers/hook-exec.js +1 -1
  392. package/dist/daemon/api/handlers/messages.js +2 -2
  393. package/dist/daemon/api/handlers/modelauth.d.ts +3 -0
  394. package/dist/daemon/api/handlers/modelauth.js +1 -1
  395. package/dist/daemon/api/handlers/node-records.js +2 -2
  396. package/dist/daemon/api/handlers/nodes.js +1 -1
  397. package/dist/daemon/api/handlers/objects.d.ts +2 -0
  398. package/dist/daemon/api/handlers/objects.js +5 -0
  399. package/dist/daemon/api/handlers/package-docs.d.ts +2 -0
  400. package/dist/daemon/api/handlers/package-docs.js +1 -0
  401. package/dist/daemon/api/handlers/profiles.js +1 -1
  402. package/dist/daemon/api/handlers/reports.d.ts +2 -2
  403. package/dist/daemon/api/handlers/reports.js +4 -4
  404. package/dist/daemon/api/handlers/reviews.js +1 -1
  405. package/dist/daemon/api/handlers/vendor-status.d.ts +8 -0
  406. package/dist/daemon/api/handlers/vendor-status.js +1 -0
  407. package/dist/daemon/api/map.d.ts +2 -2
  408. package/dist/daemon/api/map.js +2 -2
  409. package/dist/daemon/api/operations.d.ts +1 -1
  410. package/dist/daemon/api/operations.js +1 -1
  411. package/dist/daemon/api/principal.d.ts +5 -0
  412. package/dist/daemon/api/principal.js +1 -1
  413. package/dist/daemon/api/reader.d.ts +17 -0
  414. package/dist/daemon/api/reader.js +1 -0
  415. package/dist/daemon/api/server.js +1 -1
  416. package/dist/daemon/control.d.ts +2 -3
  417. package/dist/daemon/crtrd.js +8 -6
  418. package/dist/daemon/fleet.js +4 -4
  419. package/dist/daemon/reconcilers/bash-deadline.d.ts +11 -1
  420. package/dist/daemon/reconcilers/bash-deadline.js +2 -1
  421. package/dist/daemon/reconcilers/broker-supervision.js +4 -4
  422. package/dist/daemon/reconcilers/live-obligation.js +1 -1
  423. package/dist/daemon/reconcilers/node-deadline.js +1 -1
  424. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -1
  425. package/dist/daemon/reconcilers/storage-maintenance.d.ts +1 -0
  426. package/dist/daemon/reconcilers/storage-maintenance.js +1 -1
  427. package/dist/daemon/review/deliver.js +2 -2
  428. package/dist/daemon/review/finish.js +1 -1
  429. package/dist/hook-authoring.d.ts +0 -1
  430. package/dist/hook-authoring.js +3 -3
  431. package/dist/migrations/004-canvas-documents/apply.d.ts +10 -0
  432. package/dist/migrations/004-canvas-documents/apply.js +1 -0
  433. package/dist/migrations/004-canvas-documents/fields.d.ts +24 -0
  434. package/dist/migrations/004-canvas-documents/fields.js +2 -0
  435. package/dist/migrations/004-canvas-documents/index.d.ts +16 -0
  436. package/dist/migrations/004-canvas-documents/index.js +2 -0
  437. package/dist/migrations/004-canvas-documents/legacy/discover.d.ts +16 -0
  438. package/dist/migrations/004-canvas-documents/legacy/discover.js +1 -0
  439. package/dist/migrations/004-canvas-documents/legacy/history.d.ts +5 -0
  440. package/dist/migrations/004-canvas-documents/legacy/history.js +2 -0
  441. package/dist/migrations/004-canvas-documents/legacy/nested.d.ts +7 -0
  442. package/dist/migrations/004-canvas-documents/legacy/nested.js +1 -0
  443. package/dist/migrations/004-canvas-documents/legacy/parse.d.ts +14 -0
  444. package/dist/migrations/004-canvas-documents/legacy/parse.js +1 -0
  445. package/dist/migrations/004-canvas-documents/legacy/types.d.ts +91 -0
  446. package/dist/migrations/004-canvas-documents/legacy/types.js +0 -0
  447. package/dist/migrations/004-canvas-documents/legacy-edges.d.ts +6 -0
  448. package/dist/migrations/004-canvas-documents/legacy-edges.js +18 -0
  449. package/dist/migrations/004-canvas-documents/plan.d.ts +102 -0
  450. package/dist/migrations/004-canvas-documents/plan.js +3 -0
  451. package/dist/migrations/004-canvas-documents/pointers.d.ts +23 -0
  452. package/dist/migrations/004-canvas-documents/pointers.js +4 -0
  453. package/dist/migrations/activation.d.ts +9 -18
  454. package/dist/migrations/activation.js +2 -2
  455. package/dist/pi-extensions/broker-local.d.ts +2 -2
  456. package/dist/pi-extensions/broker-local.js +2 -2
  457. package/dist/pi-extensions/canvas-bash-valve.js +5 -4
  458. package/dist/pi-extensions/canvas-context-intro.js +2 -2
  459. package/dist/pi-extensions/canvas-doc-substrate.d.ts +0 -1
  460. package/dist/pi-extensions/canvas-doc-substrate.js +6 -6
  461. package/dist/pi-extensions/canvas-inbox-watcher.js +2 -2
  462. package/dist/pi-extensions/canvas-passive-context.js +1 -1
  463. package/dist/pi-extensions/canvas-recap.js +2 -2
  464. package/dist/pi-extensions/canvas-stophook.d.ts +1 -1
  465. package/dist/pi-extensions/canvas-stophook.js +1 -1
  466. package/dist/prompts/review.js +3 -3
  467. package/dist/shared/env.d.ts +5 -0
  468. package/dist/shared/env.js +1 -1
  469. package/dist/shared/generated-context.js +2 -10
  470. package/dist/shared/inbox-entry-body.d.ts +22 -0
  471. package/dist/shared/inbox-entry-body.js +10 -0
  472. package/dist/{core/memory → shared}/inline-ref-guidance.d.ts +2 -2
  473. package/dist/shared/inline-ref-guidance.js +2 -0
  474. package/dist/types.d.ts +3 -1
  475. package/docs/cli/memory-and-preferences.md +12 -14
  476. package/docs/concepts/README.md +1 -1
  477. package/docs/concepts/lifecycle-and-wakes.md +1 -1
  478. package/docs/concepts/memory.md +15 -15
  479. package/docs/concepts/nodes-and-the-canvas.md +1 -1
  480. package/docs/concepts/profiles-kinds-and-modes.md +5 -5
  481. package/docs/concepts/scopes-and-trust.md +1 -1
  482. package/docs/concepts/why-a-daemon.md +1 -1
  483. package/docs/sdk/README.md +5 -6
  484. package/docs/sdk/errors.md +0 -13
  485. package/docs/sdk/guides/README.md +0 -1
  486. package/docs/sdk/nodes.md +0 -2
  487. package/docs/sdk/resources.md +0 -1
  488. package/package.json +2 -2
  489. package/packages/crouter-identity/package.json +1 -1
  490. package/runtime.lock.json +11 -11
  491. package/dist/api/dto/memory.d.ts +0 -171
  492. package/dist/api/dto/memory.js +0 -1
  493. package/dist/builtin-memory/crouter-sdk/guides/app-memory.md +0 -73
  494. package/dist/builtin-memory/crouter-sdk/memory.md +0 -87
  495. package/dist/commands/broker-permissions.d.ts +0 -2
  496. package/dist/commands/broker-permissions.js +0 -1
  497. package/dist/commands/memory/client.d.ts +0 -11
  498. package/dist/commands/memory/client.js +0 -1
  499. package/dist/commands/memory/delete.d.ts +0 -1
  500. package/dist/commands/memory/delete.js +0 -1
  501. package/dist/commands/memory/edit.d.ts +0 -1
  502. package/dist/commands/memory/edit.js +0 -21
  503. package/dist/commands/memory/find.d.ts +0 -1
  504. package/dist/commands/memory/find.js +0 -1
  505. package/dist/commands/memory/history.d.ts +0 -1
  506. package/dist/commands/memory/history.js +0 -5
  507. package/dist/commands/memory/lint.d.ts +0 -1
  508. package/dist/commands/memory/lint.js +0 -1
  509. package/dist/commands/memory/list.d.ts +0 -1
  510. package/dist/commands/memory/list.js +0 -1
  511. package/dist/commands/memory/move.d.ts +0 -1
  512. package/dist/commands/memory/move.js +0 -1
  513. package/dist/commands/memory/origin.d.ts +0 -1
  514. package/dist/commands/memory/origin.js +0 -1
  515. package/dist/commands/memory/read.d.ts +0 -1
  516. package/dist/commands/memory/read.js +0 -6
  517. package/dist/commands/memory/shared.d.ts +0 -22
  518. package/dist/commands/memory/shared.js +0 -1
  519. package/dist/commands/memory/write.d.ts +0 -1
  520. package/dist/commands/memory/write.js +0 -13
  521. package/dist/commands/memory.js +0 -1
  522. package/dist/commands/node-inspect-artifacts.d.ts +0 -1
  523. package/dist/commands/node-inspect-artifacts.js +0 -8
  524. package/dist/core/help/memory-extensions.d.ts +0 -3
  525. package/dist/core/help/memory-extensions.js +0 -2
  526. package/dist/core/memory/cli-selector.d.ts +0 -13
  527. package/dist/core/memory/cli-selector.js +0 -1
  528. package/dist/core/memory/doc-link-grammar.d.ts +0 -20
  529. package/dist/core/memory/doc-link-grammar.js +0 -2
  530. package/dist/core/memory/extensions.js +0 -1
  531. package/dist/core/memory/history.d.ts +0 -87
  532. package/dist/core/memory/history.js +0 -6
  533. package/dist/core/memory/identity.d.ts +0 -65
  534. package/dist/core/memory/identity.js +0 -1
  535. package/dist/core/memory/inline-ref-guidance.js +0 -2
  536. package/dist/core/memory/inline-ref-inventory.d.ts +0 -9
  537. package/dist/core/memory/inline-ref-inventory.js +0 -1
  538. package/dist/core/memory/lint.d.ts +0 -163
  539. package/dist/core/memory/lint.js +0 -2
  540. package/dist/core/memory/mutation-domain.d.ts +0 -113
  541. package/dist/core/memory/mutation-domain.js +0 -12
  542. package/dist/core/memory/mutations.d.ts +0 -74
  543. package/dist/core/memory/mutations.js +0 -1
  544. package/dist/core/memory/project-namespace.d.ts +0 -31
  545. package/dist/core/memory/project-namespace.js +0 -2
  546. package/dist/core/memory/repository-association.d.ts +0 -31
  547. package/dist/core/memory/repository-association.js +0 -1
  548. package/dist/core/memory/service.d.ts +0 -145
  549. package/dist/core/memory/service.js +0 -2
  550. package/dist/core/memory/tree.d.ts +0 -39
  551. package/dist/core/memory/tree.js +0 -1
  552. package/dist/core/memory-resolver.d.ts +0 -280
  553. package/dist/core/memory-resolver.js +0 -2
  554. package/dist/core/nested-stores.d.ts +0 -18
  555. package/dist/core/nested-stores.js +0 -1
  556. package/dist/core/runtime/memory.d.ts +0 -3
  557. package/dist/core/runtime/memory.js +0 -1
  558. package/dist/core/substrate/frontmatter-validation.d.ts +0 -11
  559. package/dist/core/substrate/frontmatter-validation.js +0 -1
  560. package/dist/core/substrate/gate.d.ts +0 -16
  561. package/dist/core/substrate/gate.js +0 -1
  562. package/dist/core/substrate/index.d.ts +0 -18
  563. package/dist/core/substrate/index.js +0 -1
  564. package/dist/core/substrate/injected-store.d.ts +0 -75
  565. package/dist/core/substrate/injected-store.js +0 -2
  566. package/dist/core/substrate/listings.d.ts +0 -28
  567. package/dist/core/substrate/listings.js +0 -1
  568. package/dist/core/substrate/memory-events.d.ts +0 -6
  569. package/dist/core/substrate/memory-events.js +0 -1
  570. package/dist/core/substrate/on-read-node.d.ts +0 -6
  571. package/dist/core/substrate/on-read-node.js +0 -1
  572. package/dist/core/substrate/on-read.d.ts +0 -101
  573. package/dist/core/substrate/on-read.js +0 -9
  574. package/dist/core/substrate/plan.d.ts +0 -94
  575. package/dist/core/substrate/plan.js +0 -1
  576. package/dist/core/substrate/render-node.d.ts +0 -12
  577. package/dist/core/substrate/render-node.js +0 -1
  578. package/dist/core/substrate/render.d.ts +0 -41
  579. package/dist/core/substrate/render.js +0 -65
  580. package/dist/core/substrate/session-cache.d.ts +0 -27
  581. package/dist/core/substrate/session-cache.js +0 -1
  582. package/dist/core/substrate/surface-match.d.ts +0 -73
  583. package/dist/core/substrate/surface-match.js +0 -1
  584. package/dist/daemon/api/handlers/memory.js +0 -5
  585. package/dist/migrations/001-surfaces-frontmatter.d.ts +0 -2
  586. package/dist/migrations/001-surfaces-frontmatter.js +0 -1
  587. package/dist/migrations/002-profile-project-memory.d.ts +0 -2
  588. package/dist/migrations/002-profile-project-memory.js +0 -1
  589. package/dist/migrations/003-repository-root-memory-identity/front-door.d.ts +0 -26
  590. package/dist/migrations/003-repository-root-memory-identity/front-door.js +0 -11
  591. package/dist/migrations/003-repository-root-memory-identity/index.d.ts +0 -2
  592. package/dist/migrations/003-repository-root-memory-identity/index.js +0 -5
  593. package/dist/migrations/003-repository-root-memory-identity/references.d.ts +0 -95
  594. package/dist/migrations/003-repository-root-memory-identity/references.js +0 -5
  595. package/dist/migrations/003-repository-root-memory-identity/repository-facts.d.ts +0 -39
  596. package/dist/migrations/003-repository-root-memory-identity/repository-facts.js +0 -3
  597. package/dist/migrations/convergent.d.ts +0 -43
  598. package/dist/migrations/convergent.js +0 -2
  599. package/dist/migrations/corpus.d.ts +0 -75
  600. package/dist/migrations/corpus.js +0 -3
  601. package/dist/migrations/frontmatter-splice.d.ts +0 -15
  602. package/dist/migrations/frontmatter-splice.js +0 -8
  603. package/dist/migrations/profile-manifests.d.ts +0 -30
  604. package/dist/migrations/profile-manifests.js +0 -2
  605. package/dist/migrations/registry.d.ts +0 -7
  606. package/dist/migrations/registry.js +0 -1
  607. package/dist/migrations/runner.d.ts +0 -43
  608. package/dist/migrations/runner.js +0 -1
  609. package/dist/migrations/types.d.ts +0 -211
  610. package/dist/shared/birth-announcement.d.ts +0 -12
  611. package/dist/shared/birth-announcement.js +0 -1
  612. package/docs/sdk/guides/app-memory.md +0 -22
  613. package/docs/sdk/memory.md +0 -85
  614. /package/dist/{migrations/types.js → api/dto/delivery.js} +0 -0
  615. /package/dist/{core/memory → shared}/inline-ref-grammar.d.ts +0 -0
  616. /package/dist/{core/memory → shared}/inline-ref-grammar.js +0 -0
@@ -1 +1 @@
1
- var Ce=Object.defineProperty;var n=(t,i)=>Ce(t,"name",{value:i,configurable:!0});import{envModelIntent as Me,envNodeCwd as Ae,envNodeId as xe,envProfileId as Pe}from"../../shared/env.js";import{createServer as Ie}from"node:net";import{existsSync as he,readFileSync as Oe,unlinkSync as _e}from"node:fs";import{join as Se}from"node:path";import{randomUUID as C}from"node:crypto";import{mark as Ne}from"../timing.js";import{installSessionManagerStorePatch as De}from"../conversation-store/index.js";import{getAgentDir as ee,initTheme as Fe,ModelRegistry as Le,ModelRuntime as $e}from"@earendil-works/pi-coding-agent";import{nodeRunDir as Be,viewSocketPath as Ue}from"../canvas/paths.js";import{bindBrokerEventSource as Ge}from"../events/source.js";import{emitEvent as E,flushBrokerLog as je}from"../events/emit.js";import{operationIdContext as Ke}from"../events/operation-id.js";import{findMissingPackagePaths as We}from"./package-health.js";import{installBrokerConfigSnapshot as qe}from"../config.js";import{FRONT_DOOR_ENV as Ve}from"./front-door.js";import{CANVAS_EXTENSIONS as ne,piInvocationToSdkConfig as Xe}from"./launch.js";import{assertEngineVersion as He,loadBrokerEngine as Ye}from"./broker-sdk.js";import{resolveBundledPiPackageDir as ze}from"./pi-cli.js";import{captureSessionChatCapabilities as Je}from"./command-surface.js";import{InMemoryCredentialStore as Qe}from"@earendil-works/pi-ai";import{configureBrokerModelRuntime as Ze}from"./broker/model-adapter.js";import{mutateBrokerFault as H,recordBrokerTurn as ye}from"./broker/daemon-ops.js";import{modelRequestFromConfig as en,expandModelCandidates as nn,parseModelSpec as tn,unregisteredConcreteModel as on}from"../model-routes.js";import{KNOWN_STREAM_WAIT_UI as rn}from"./stream-watchdog.js";import{probeOnline as sn}from"./connectivity.js";import{CRTR_CYCLE_CUSTOM_TYPE as an,cycleAwareMessages as dn}from"./session-cycles.js";import{projectTranscript as ln}from"./session-visibility.js";import{currentTurnVisibility as cn}from"./turn-visibility.js";import{isUnknownModel as te}from"./model-selection.js";import{BrokerClientRegistry as mn}from"./broker/client-registry.js";import{ToolGroupTracker as un}from"./broker/tool-groups.js";import{onNodeNamed as fn}from"./broker/node-named.js";import{FaultRetry as pn}from"./broker/fault-retry.js";import{createTurnAdmissionGate as gn}from"./broker/turn-admission.js";import{BROKER_IDLE_TURN_START as vn,BROKER_RUN_TURN_BUSY as hn}from"./broker/held-deferred-inbox.js";import{EventProjection as _n}from"./broker/event-projection.js";import{createFrameDispatchContext as Sn,handleFrame as yn}from"./broker/frame-dispatch.js";import{hydratePersistedAdvertisedCommandMessages as wn,installAdvertisedCommandInvocationContract as bn}from"./advertised-command-invocation.js";import{RebindDriver as Rn}from"./broker/rebind.js";import{beginRuntimeTeardown as Tn}from"./broker/extension-abort.js";import{receiveNodeToken as En}from"./broker/node-token.js";import{serveCliRelay as kn}from"./broker/cli-relay.js";import{decodeKickoffOrigin as Cn,KICKOFF_ORIGIN_ENV as Mn}from"./stamp/protocol.js";import{announceMessageOrigin as An}from"./stamp/channel.js";import{brokerExtensionState as xn,brokerMemoryRefs as Pn,commitBrokerModel as In}from"./broker/daemon-ops.js";import{FrameOverflowError as On,normalizeSnapshotTail as Nn}from"./broker-protocol.js";import{ReviewBoundaryNavigationError as Ut,REVIEW_BOUNDARY_NAVIGATION_CODE as Gt}from"./broker/frame-replies.js";function oe(t){return new Le(t.modelRuntime)}n(oe,"registryOf");function L(t,i){if(t==null||te(t))return null;const s=i!==void 0&&i!==""&&i!=="off"?`:${i}`:"";return`${t.provider}/${t.id}${s}`}n(L,"formatModelSpec");function Dn(t,i){const s=L(t,void 0);return s===null?null:`${s}:${i===void 0||i===""?"off":i}`}n(Dn,"formatExactModelSpec");const Fn=12e4;let Y=null;function Ln(){const t=Y;if(Y=null,t!==null)try{t.dispose()}catch{}}n(Ln,"disposeActiveSession");async function Lt(t,i=process.hrtime.bigint(),s=new Date().toISOString()){Ge(t);const p=await En(),r=await kn(t,p);process.env.CRTR_API_SOCKET=r.path,Ke.fresh(()=>{E({level:"info",event:"broker.startup.cli_entry",ts:s,duration_ms:0,fields:{runtime_version:process.version,engine_version:null,model:null}}),E({level:"info",event:"broker.startup.module_loaded",duration_ms:Number(process.hrtime.bigint()-i)/1e6,fields:{runtime_version:process.version,engine_version:null,model:null}})});const a=new Set;let c=null;const l=n((e,o=null)=>{a.has(e)||(a.add(e),Ne(e,{duration_ms:Number(process.hrtime.bigint()-i)/1e6}),E({level:"info",event:e,duration_ms:Number(process.hrtime.bigint()-i)/1e6,fields:{runtime_version:process.version,engine_version:c,model:o}}))},"emitStartupMilestone");process.env[Ve]="1",process.env.CRTR_BROKER_PID=String(process.pid),delete process.env.TMUX_PANE,delete process.env.TMUX,De(t);const f=await Ye();He(f.VERSION),c=f.VERSION;const h=Be(t),T=Se(h,"broker-launch.json"),_=JSON.parse(Oe(T,"utf8"));if(!_.configSnapshot)throw new Error("broker launch is missing its config snapshot");qe(_.configSnapshot);const g=Xe(_);g.modelExact===!0?process.env.CRTR_MODEL_EXACT="1":delete process.env.CRTR_MODEL_EXACT;const y=await Pn(t);let b,M;const K=n(e=>{b!==void 0?b(e):M??=e},"onSignal");process.on("SIGTERM",()=>K("SIGTERM")),process.on("SIGINT",()=>K("SIGINT"));let{session:$,services:A,resuming:ie,runtime:B}=await jn(f,g);const P=(await xn(t)).node.review_binding?.review_id,w=process.env.CRTR_RUN_ID!==void 0&&process.env.CRTR_RUN_ID!=="";Y=$;const N=sn;try{process.env.PI_PACKAGE_DIR=ze(),Fe(A.settingsManager.getTheme(),!1)}catch(e){E({level:"error",event:"broker.theme.initialization_failed",error:e})}try{for(const e of We(ee()))E({level:"warn",event:"broker.startup.warning",fields:{stage:"package_health",source:e.source,resolved_path:e.resolved}})}catch{}const U=Ue(t),v=new mn(t),W=new Map,I=new un(t,e=>v.broadcast(e));fn(e=>v.broadcast({type:"node_named",...e}));let D=!1,re=!1,q,se,m,V,F,ae=n(()=>{},"notifyTurnAccepted"),de=n(()=>{},"resetFrameState");const z=gn(),J=[];let G=!1,le;const Q=n(()=>{if(G||m.isReplacing()||m.isAgentRunActive()||m.session().isStreaming)return;const e=J.shift();e&&ce(e.text,e.messageIds)},"drainPendingRunPrompt"),ce=n((e,o=[])=>{if(w&&(G||m.isReplacing()||m.isAgentRunActive()||m.session().isStreaming)){J.push({text:e,messageIds:o});return}w&&(G=!0),z.admit(d=>{const u=m.session();return w&&u.isStreaming?(J.unshift({text:e,messageIds:o}),d(),Promise.resolve()):(w&&o.length>0&&u.sessionManager.appendCustomEntry("crtr-turn-input",{message_ids:o}),u.prompt(e,{preflightResult:d,...!w&&u.isStreaming?{streamingBehavior:"steer"}:{}}))}).catch(d=>{E({level:"error",event:"broker.inbox.idle_prompt_failed",error:d})}).finally(()=>{w&&(G=!1,Q())})},"startIdleInboxTurn");globalThis[vn]=ce,m=new Rn({nodeId:t,cfg:g,session:$,services:A,runtime:B,registry:v,toolGroups:I,uiContext:n(()=>se,"uiContext"),faultRetry:n(()=>V,"faultRetry"),projection:n(()=>F,"projection"),setActiveSession:n(e=>{if(Y=e,le?.(),w){let o="stop";le=e.subscribe(d=>{if(d.type==="agent_start"&&(o="stop"),d.type==="agent_end"){const u=[...d.messages??[]].reverse().find(S=>S.role==="assistant");u&&(o=u.stopReason)}d.type==="agent_settled"&&(e.sessionManager.appendCustomEntry("crtr-turn-end",{stop_reason:o}),queueMicrotask(()=>{m.session()===e&&Q()}))})}},"setActiveSession"),disposeAndExit:n((e,o)=>j(e,o),"disposeAndExit"),onSessionRebind:n(()=>{de()},"onSessionRebind"),onReplacementIdle:n(()=>{w&&Q()},"onReplacementIdle"),reWelcomeAll:n(()=>pe(),"reWelcomeAll")});const me=n(async(e,o=!1)=>{const d=m.session(),u=L(d.model,d.thinkingLevel);if(u===null)return null;const S=await In(t,{spec:u,...e!==void 0?{intent:e}:{},userSelected:o});return o&&(g.model=S.modelOverride,e!==void 0?(process.env.CRTR_MODEL_INTENT=`${e.family}/${e.strength}`,delete process.env.CRTR_MODEL_EXACT,g.modelExact=void 0):(delete process.env.CRTR_MODEL_INTENT,process.env.CRTR_MODEL_EXACT="1",g.modelExact=!0)),S.modelOverride},"persistModelChoice"),ue=n(async(e=!0,o,d=!1)=>{const u=m.session(),S=L(u.model,u.thinkingLevel),R=e?await me(o,d):S;v.broadcast({type:"model_changed",model:te(u.model)?void 0:u.model,spec:R})},"broadcastModelChanged");V=new pn({nodeId:t,cfg:g,retryProbe:N,currentSession:n(()=>m.session(),"currentSession"),currentServices:n(()=>m.services(),"currentServices"),installedGeneration:n(()=>m.installedGeneration(),"installedGeneration"),registryOf:oe,formatModelSpec:L,broadcastModelChanged:ue,turnAdmission:z}),F=new _n({registry:v,faultRetry:V,installedGeneration:n(()=>m.installedGeneration(),"installedGeneration"),currentSession:n(()=>m.session(),"currentSession"),notifyTurnAccepted:n(()=>ae(),"notifyTurnAccepted"),emitStartupMilestone:l,formatModelSpec:L});const be=n(e=>{const o=m.session(),d=Bn(o,P),u=Nn(e.snapshotTail),S=d===void 0||u===void 0?d:d.slice(-u),R=S?.map(({message:O})=>O)??o.sessionManager.buildSessionContext().messages,X=I.summaries(),ve=S!==void 0&&u!==void 0?$n(R):void 0,ke=ve===void 0?X:Object.fromEntries(Object.entries(X).filter(([O])=>ve.has(O)));return{messages:R,...S===void 0?{}:{messageIds:S.map(({id:O})=>O)},messageVisibility:S?.map(({visibility:O})=>O)??R.map(()=>"visible"),turnVisibility:cn(),stats:o.getSessionStats(),state:{model:te(o.model)?void 0:o.model,thinkingLevel:o.thinkingLevel,isStreaming:o.isStreaming,isCompacting:o.isCompacting,steeringMode:o.steeringMode,followUpMode:o.followUpMode,sessionFile:o.sessionFile,sessionId:o.sessionId,sessionName:o.sessionName,autoCompactionEnabled:o.autoCompactionEnabled,messageCount:o.messages.length,pendingMessageCount:o.pendingMessageCount},display:{...v.displaySnapshot()},toolGroupSummaries:ke,workingActivity:F.currentWorkingActivity(),queued:{steering:[...o.getSteeringMessages()],followUp:[...o.getFollowUpMessages()]}}},"buildSnapshot"),fe=n(e=>{const o=e.role==="controller"?W.values().next().value:void 0;v.sendFrame(e,{type:"welcome",snapshot:be(e),role:e.role,pending_dialog:o!==void 0?o.request:null,agentDir:ee()},!0)},"sendWelcome"),Re=n(e=>{const o=[...W.values()];for(let d=1;d<o.length;d++)v.sendFrame(e,o[d].request)},"replayExtraPendingDialogsTo"),pe=n(()=>{v.forEachHelloed(fe)},"reWelcomeAll"),ge=n(async e=>{if(!D){D=!0,I.persistPendingSummary(),F.dispose(),Ln();try{q?.close()}catch{}r.close(),v.dispose();try{he(U)&&_e(U)}catch{}v.clearAttachState(),await je(),process.exit(e)}},"completeExit"),j=n((e,o=0)=>{if(D)return;const d=e==="shutdown-hook"||e==="shutdown-after-settle";if(d&&I.finishOpenToolGroup(!0),d&&I.hasSummaryTasks()){if(re)return;re=!0,I.waitForSummaryTasks().finally(()=>ge(o));return}ge(o)},"disposeAndExit");se=Kn({writable:n(()=>v.writableClients(),"writable"),forward:n((e,o)=>v.sendFrame(e,o),"forward"),pending:W,broadcast:n(e=>v.broadcastUi(e),"broadcast"),onKnownStreamWait:n(e=>F.knownStreamWait(e),"onKnownStreamWait")}),m.setRebindSession(),await m.enqueueRebind($,A);const k=Sn({nodeId:t,registry:v,toolGroups:I,projection:F,rebind:m,boundaryReviewId:P,pendingDialogs:W,sendWelcome:fe,replayExtraPendingDialogsTo:Re,reWelcomeAll:pe,disposeAndExit:j,persistModelChoice:me,broadcastModelChanged:ue,registryOf:oe,formatModelSpec:L,formatExactModelSpec:Dn,turnAdmission:z,memoryInventory:y});ae=k.notifyTurnAccepted,de=k.resetForSession,globalThis[hn]=()=>G||k.pendingPromptDispatches()>0||m.isAgentRunActive()||m.session().isStreaming;const Te=2500;let Z=!1;const Ee=n(async e=>{if(D||Z)return;if(Z=!0,m.isAgentRunActive()||m.session().isStreaming||k.pendingPromptDispatches()>0){const d=Date.now()+Te;for(;k.pendingPromptDispatches()>0&&!m.session().isStreaming&&Date.now()<d;)await new Promise(u=>setTimeout(u,25));if(m.session().isStreaming){const u=d-Date.now();if(u>0){let S;try{Tn(),await Promise.race([m.session().abort().then(()=>!0,()=>!1),new Promise(X=>{S=setTimeout(()=>X(!1),u)})])&&await ye(t,{event:"closed",end_reason:"teardown-aborted"})}finally{S!==void 0&&clearTimeout(S)}}}else(k.pendingPromptDispatches()>0||m.isAgentRunActive())&&await ye(t,{event:"interrupted"})}j(e)},"abortAndExit");if(b=n(e=>{Ee(e)},"signalTeardown"),M!==void 0){b(M);return}try{he(U)&&_e(U)}catch{}q=Ie(e=>{const o=v.create(e);e.on("data",u=>{let S;try{S=o.decoder.push(u)}catch(R){R instanceof On?(v.sendFrame(o,{type:"error",code:"frame_overflow",message:R.message}),v.dropClient(o,`frame overflow: ${R.message}`)):v.dropClient(o,`decoder error: ${String(R)}`);return}for(const R of S)try{yn(k,o,R)}catch{}});const d=n(()=>{v.removeClient(o)},"drop");e.on("close",d),e.on("error",()=>{})}),q.on("error",e=>{D||(E({level:"error",event:"broker.socket.failed",error:e}),j("socket-error",1))}),q.listen(U,async()=>{Promise.all([H(t,{op:"clear",link:"viewer\u2194broker"}),H(t,{op:"clear",link:"relay\u2194broker"})]).catch(o=>E({level:"error",event:"broker.daemon.operation.failed",node_id:t,error:o,fields:{operation:"broker_socket_bound_fault_clear"}}));let e;try{e=await V.recoverOnStartup()}catch(o){E({level:"error",event:"broker.daemon.operation.failed",node_id:t,error:o,fields:{operation:"recovery_startup"}}),j("recovery-startup-failed",1);return}if(!(D||Z)&&e!=="retry-armed"&&g.firstPrompt!==void 0&&g.firstPrompt!==""){const o=Cn(process.env[Mn]);o!==null&&An(g.firstPrompt,o);const d=process.env.CRTR_KICKOFF_MESSAGE_IDS;k.kickoff(g.firstPrompt,d?JSON.parse(d):[])}}),v.persistAttachState()}n(Lt,"runBroker");function $n(t){const i=new Set;for(const s of t)if(!(s.role!=="assistant"||!Array.isArray(s.content)))for(const p of s.content)p!==null&&typeof p=="object"&&p.type==="toolCall"&&typeof p.id=="string"&&i.add(p.id);return i}n($n,"toolCallIds");function Bn(t,i){const s=t.sessionManager,p=dn(s);return p!==void 0&&wn(p.map(({message:r})=>r)),p===void 0?void 0:ln(p,{boundaryReviewId:i,sessionEntries:s.getEntries?.()})}n(Bn,"snapshotMessages");function we(){const t=xe();if(t===void 0||t==="")throw new Error("broker launch is missing CRTR_NODE_ID");return t}n(we,"currentBrokerNodeId");async function Un(t,i){const s=en(i.model,Me(),i.modelExact===!0);if(s===void 0)return;const p=oe(t),r={cwd:Ae()??i.cwd,profileId:Pe()},a=on(s,p,r);if(a!==void 0)throw await H(we(),{op:"record",input:{link:"crtr\u2192pi",op:"model resolution at launch",kind:"model-not-found",retry:{disposition:"fatal"},message:`model '${a.request.spec}' is not registered in the serving model registry`}}),new Error(`[broker] FATAL: model '${a.request.spec}' is not registered in the serving model registry`);const c=nn(s,r.cwd,r.profileId),l=tn(s.spec);for(const f of c){const h=p.find(f.providerId,f.modelId);if(h===void 0)continue;const _=l?.providerId===f.providerId&&l.modelId===f.modelId?l.thinkingLevel??(f.thinkingLevel===void 0?void 0:"off"):f.thinkingLevel;return{model:h,thinkingLevel:_}}if(i.modelExact===!0){const f=c.map(h=>`'${h.providerId}/${h.modelId}' unregistered`).join("; ");throw await H(we(),{op:"record",input:{link:"crtr\u2192pi",op:"model resolution at launch",kind:"model-not-found",retry:{disposition:"fatal"},message:`exact-consult model '${i.model}' is unavailable \u2014 refusing to substitute (${f})`}}),new Error(`[broker] FATAL: exact-consult model '${i.model}' is unavailable`)}E({level:"warn",event:"broker.model.none_viable",fields:{rejected_candidates:c.map(f=>({provider:f.providerId,model:f.modelId,reason:"unregistered"})).slice(0,16)}})}n(Un,"resolveLaunchModel");function Gn(t){let i=!0;return{runtime:new Proxy(t,{get(p,r,a){return i&&r==="getAvailableSnapshot"?()=>[]:i&&r==="getAvailable"?async()=>[]:i&&r==="getModel"?()=>{}:Reflect.get(p,r,a)}}),reveal:n(()=>{i=!1},"reveal")}}n(Gn,"modelLessRegistry");async function jn(t,i){const s=ee(),p=n(async _=>{const g=await $e.create({credentials:new Qe,modelsPath:Se(_.agentDir,"models.json")});Ze(g);const y=await t.createAgentSessionServices({cwd:_.cwd,agentDir:_.agentDir,modelRuntime:g,resourceLoaderOptions:{additionalExtensionPaths:i.extensionPaths,appendSystemPrompt:i.appendSystemPromptPath!==void 0?[i.appendSystemPromptPath]:void 0,noContextFiles:!0,extensionsOverride:n(x=>({...x,extensions:x.extensions.filter(P=>!/[/\\]provider-rotation\.(?:ts|js)$/.test(P.path))}),"extensionsOverride")}}),b=y.resourceLoader.getExtensions();if(i.extensionPaths.some(x=>ne.includes(x))){const x=new Set(b.extensions.map(w=>w.path)),P=ne.filter(w=>!x.has(w));if(P.length>0){const w=b.errors.filter(N=>ne.includes(N.path)).map(N=>`${N.path}: ${N.error}`).join("; ");throw new Error(`[broker] FATAL: mandatory canvas extensions failed to load: ${P.join(", ")}${w===""?"":` (${w})`}`)}}y.settingsManager.getRetryEnabled=()=>!1;const M=await Un(y,i),K=M?.model,$=M?.thinkingLevel,A=M===void 0?Gn(y.modelRuntime):void 0,ie=A!==void 0?{...y,modelRuntime:A.runtime}:y,B=await t.createAgentSessionFromServices({services:ie,sessionManager:_.sessionManager,model:K,thinkingLevel:$,tools:i.tools,sessionStartEvent:_.sessionStartEvent});return bn(B.session),Je(B.session),A?.reveal(),{...B,services:y}},"buildForManager"),r=i.resumeSessionPath,a=i.forkFrom!==void 0&&i.forkFrom!=="";if(!a&&(r===void 0||r==="")&&i.resumeSessionId!==void 0&&i.resumeSessionId!=="")throw new Error(`[broker] resume requires a session .jsonl PATH; got only a bare id '${i.resumeSessionId}' (pi_session_file was never captured for this node)`);const c=!a&&r!==void 0&&r!=="",l=c&&i.newCycle===!0,f=c&&!l;let h;if(a)h=t.SessionManager.forkFrom(i.forkFrom,i.cwd);else if(f||l){if(h=t.SessionManager.open(r),l){const _=h.getLeafId();h.resetLeaf(),h.appendCustomEntry(an,{cycle:Number(process.env.CRTR_CYCLES),fromLeaf:_})}}else h=t.SessionManager.create(i.cwd);if(t.createAgentSessionRuntime!==void 0){const _=n(async y=>{const b=await p({cwd:y.cwd,agentDir:y.agentDir,sessionManager:y.sessionManager,sessionStartEvent:y.sessionStartEvent});return{...b,diagnostics:b.services.diagnostics??[]}},"factory"),g=await t.createAgentSessionRuntime(_,{cwd:i.cwd,agentDir:s,sessionManager:h});return{session:g.session,services:g.services,resuming:f,runtime:g}}const T=await p({cwd:i.cwd,agentDir:s,sessionManager:h});return{session:T.session,services:T.services,resuming:f,runtime:void 0}}n(jn,"buildBrokerSession");function Kn(t){const i=n((r,a,c,l)=>{if(l?.signal?.aborted)return Promise.resolve(r);const f=t.writable();return f.length===0?Promise.resolve(r):new Promise(h=>{let T;const _=n(()=>{T!==void 0&&clearTimeout(T),l?.signal?.removeEventListener("abort",g),t.pending.delete(a.id)},"cleanup"),g=n(()=>{_(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),h(r)},"onAbort");l?.signal?.addEventListener("abort",g,{once:!0});const y=l?.timeout!==void 0?l.timeout:Fn;T=setTimeout(()=>{_(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),h(r)},y),typeof T.unref=="function"&&T.unref(),t.pending.set(a.id,{request:a,resolve:n(b=>{_(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),h(c(b))},"resolve")});for(const b of f)t.forward(b,a)})},"dialogPromise"),s=n(()=>{},"noop");return{[rn]:t.onKnownStreamWait??(r=>()=>{}),get theme(){const r=globalThis[Symbol.for("@earendil-works/pi-coding-agent:theme")];if(r==null)throw new Error("Theme not initialized. Call initTheme() first.");return r},select:n((r,a,c)=>i(void 0,{type:"extension_ui_request",id:C(),method:"select",title:r,options:a,timeout:c?.timeout},l=>"cancelled"in l&&l.cancelled?void 0:"value"in l?l.value:void 0,c),"select"),confirm:n((r,a,c)=>i(!1,{type:"extension_ui_request",id:C(),method:"confirm",title:r,message:a,timeout:c?.timeout},l=>"cancelled"in l&&l.cancelled?!1:"confirmed"in l?l.confirmed:!1,c),"confirm"),input:n((r,a,c)=>i(void 0,{type:"extension_ui_request",id:C(),method:"input",title:r,placeholder:a,timeout:c?.timeout},l=>"cancelled"in l&&l.cancelled?void 0:"value"in l?l.value:void 0,c),"input"),editor:n((r,a)=>i(void 0,{type:"extension_ui_request",id:C(),method:"editor",title:r,prefill:a},c=>"cancelled"in c&&c.cancelled?void 0:"value"in c?c.value:void 0),"editor"),setStatus:n((r,a)=>t.broadcast({type:"extension_ui_request",id:C(),method:"setStatus",statusKey:r,statusText:a}),"setStatus"),setWidget:n((r,a,c)=>{typeof a!="function"&&t.broadcast({type:"extension_ui_request",id:C(),method:"setWidget",widgetKey:r,widgetLines:a,widgetPlacement:c?.placement})},"setWidget"),setTitle:n(r=>t.broadcast({type:"extension_ui_request",id:C(),method:"setTitle",title:r}),"setTitle"),notify:n((r,a)=>{const c=a==="warn"?"warning":a;t.broadcast({type:"extension_ui_request",id:C(),method:"notify",message:r,notifyType:c})},"notify"),onTerminalInput:n(()=>s,"onTerminalInput"),setWorkingMessage:s,setWorkingVisible:s,setWorkingIndicator:s,setHiddenThinkingLabel:s,setFooter:s,setHeader:s,custom:n(()=>Promise.resolve(void 0),"custom"),pasteToEditor:s,setEditorText:s,getEditorText:n(()=>"","getEditorText"),addAutocompleteProvider:s,setEditorComponent:s,getEditorComponent:n(()=>{},"getEditorComponent"),getAllThemes:n(()=>[],"getAllThemes"),getTheme:n(()=>{},"getTheme"),setTheme:s,getToolsExpanded:n(()=>!1,"getToolsExpanded"),setToolsExpanded:s}}n(Kn,"makeBrokerUiContext");export{Gt as REVIEW_BOUNDARY_NAVIGATION_CODE,Ut as ReviewBoundaryNavigationError,jn as buildBrokerSession,Ln as disposeActiveSession,Kn as makeBrokerUiContext,Lt as runBroker,Bn as snapshotMessages};
1
+ var Ce=Object.defineProperty;var n=(t,i)=>Ce(t,"name",{value:i,configurable:!0});import{envInboxBetweenTurns as Me,envModelIntent as Ae,envNodeCwd as xe,envNodeId as Pe,envProfileId as Ie}from"../../shared/env.js";import{createServer as Oe}from"node:net";import{existsSync as he,readFileSync as Ne,unlinkSync as _e}from"node:fs";import{join as Se}from"node:path";import{randomUUID as C}from"node:crypto";import{mark as De}from"../timing.js";import{installSessionManagerStorePatch as Fe}from"../conversation-store/index.js";import{getAgentDir as ne,initTheme as Le,ModelRegistry as Be,ModelRuntime as $e}from"@earendil-works/pi-coding-agent";import{nodeRunDir as Ue,viewSocketPath as Ge}from"../canvas/paths.js";import{bindBrokerEventSource as je}from"../events/source.js";import{emitEvent as R,flushBrokerLog as We}from"../events/emit.js";import{operationIdContext as Ke}from"../events/operation-id.js";import{findMissingPackagePaths as qe}from"./package-health.js";import{installBrokerConfigSnapshot as Ve}from"../config.js";import{FRONT_DOOR_ENV as Xe}from"./front-door.js";import{CANVAS_EXTENSIONS as te,piInvocationToSdkConfig as He}from"./launch.js";import{assertEngineVersion as Ye,loadBrokerEngine as ze}from"./broker-sdk.js";import{resolveBundledPiPackageDir as Je}from"./pi-cli.js";import{captureSessionChatCapabilities as Qe}from"./command-surface.js";import{InMemoryCredentialStore as Ze}from"@earendil-works/pi-ai";import{configureBrokerModelRuntime as en}from"./broker/model-adapter.js";import{mutateBrokerFault as H,recordBrokerTurn as ye}from"./broker/daemon-ops.js";import{modelRequestFromConfig as nn,expandModelCandidates as tn,parseModelSpec as on,unregisteredConcreteModel as rn}from"../model-routes.js";import{KNOWN_STREAM_WAIT_UI as sn}from"./stream-watchdog.js";import{probeOnline as an}from"./connectivity.js";import{CRTR_CYCLE_CUSTOM_TYPE as dn,cycleAwareMessages as ln}from"./session-cycles.js";import{projectTranscript as cn}from"./session-visibility.js";import{currentTurnVisibility as mn}from"./turn-visibility.js";import{isUnknownModel as oe}from"./model-selection.js";import{BrokerClientRegistry as un}from"./broker/client-registry.js";import{ToolGroupTracker as fn}from"./broker/tool-groups.js";import{onNodeNamed as pn}from"./broker/node-named.js";import{FaultRetry as gn}from"./broker/fault-retry.js";import{createTurnAdmissionGate as vn}from"./broker/turn-admission.js";import{BROKER_IDLE_TURN_START as hn,BROKER_RUN_TURN_BUSY as _n}from"./broker/held-deferred-inbox.js";import{EventProjection as Sn}from"./broker/event-projection.js";import{createFrameDispatchContext as yn,handleFrame as wn}from"./broker/frame-dispatch.js";import{hydratePersistedAdvertisedCommandMessages as bn,installAdvertisedCommandInvocationContract as Tn}from"./advertised-command-invocation.js";import{RebindDriver as En}from"./broker/rebind.js";import{beginRuntimeTeardown as Rn}from"./broker/extension-abort.js";import{receiveNodeToken as kn}from"./broker/node-token.js";import{serveCliRelay as Cn}from"./broker/cli-relay.js";import{decodeKickoffOrigin as Mn,KICKOFF_ORIGIN_ENV as An}from"./stamp/protocol.js";import{announceMessageOrigin as xn}from"./stamp/channel.js";import{brokerExtensionState as Pn,commitBrokerModel as In}from"./broker/daemon-ops.js";import{composerNames as On}from"./broker/frame-memory-refs.js";import{FrameOverflowError as Nn,normalizeSnapshotTail as Dn}from"./broker-protocol.js";import{ReviewBoundaryNavigationError as jt,REVIEW_BOUNDARY_NAVIGATION_CODE as Wt}from"./broker/frame-replies.js";function ie(t){return new Be(t.modelRuntime)}n(ie,"registryOf");function L(t,i){if(t==null||oe(t))return null;const s=i!==void 0&&i!==""&&i!=="off"?`:${i}`:"";return`${t.provider}/${t.id}${s}`}n(L,"formatModelSpec");function Fn(t,i){const s=L(t,void 0);return s===null?null:`${s}:${i===void 0||i===""?"off":i}`}n(Fn,"formatExactModelSpec");const Ln=12e4;let Y=null;function Bn(){const t=Y;if(Y=null,t!==null)try{t.dispose()}catch{}}n(Bn,"disposeActiveSession");async function $t(t,i=process.hrtime.bigint(),s=new Date().toISOString()){je(t);const p=await kn(),r=await Cn(t,p);process.env.CRTR_API_SOCKET=r.path,Ke.fresh(()=>{R({level:"info",event:"broker.startup.cli_entry",ts:s,duration_ms:0,fields:{runtime_version:process.version,engine_version:null,model:null}}),R({level:"info",event:"broker.startup.module_loaded",duration_ms:Number(process.hrtime.bigint()-i)/1e6,fields:{runtime_version:process.version,engine_version:null,model:null}})});const a=new Set;let c=null;const l=n((e,o=null)=>{a.has(e)||(a.add(e),De(e,{duration_ms:Number(process.hrtime.bigint()-i)/1e6}),R({level:"info",event:e,duration_ms:Number(process.hrtime.bigint()-i)/1e6,fields:{runtime_version:process.version,engine_version:c,model:o}}))},"emitStartupMilestone");process.env[Xe]="1",process.env.CRTR_BROKER_PID=String(process.pid),delete process.env.TMUX_PANE,delete process.env.TMUX,Fe(t);const f=await ze();Ye(f.VERSION),c=f.VERSION;const h=Ue(t),E=Se(h,"broker-launch.json"),_=JSON.parse(Ne(E,"utf8"));if(!_.configSnapshot)throw new Error("broker launch is missing its config snapshot");Ve(_.configSnapshot);const g=He(_);g.modelExact===!0?process.env.CRTR_MODEL_EXACT="1":delete process.env.CRTR_MODEL_EXACT;const y=await On(t);let b,M;const W=n(e=>{b!==void 0?b(e):M??=e},"onSignal");process.on("SIGTERM",()=>W("SIGTERM")),process.on("SIGINT",()=>W("SIGINT"));let{session:B,services:A,resuming:re,runtime:$}=await Wn(f,g);const P=(await Pn(t)).node.review_binding?.review_id,w=Me();Y=B;const N=an;try{process.env.PI_PACKAGE_DIR=Je(),Le(A.settingsManager.getTheme(),!1)}catch(e){R({level:"error",event:"broker.theme.initialization_failed",error:e})}try{for(const e of qe(ne()))R({level:"warn",event:"broker.startup.warning",fields:{stage:"package_health",source:e.source,resolved_path:e.resolved}})}catch{}const U=Ge(t),v=new un(t),K=new Map,I=new fn(t,e=>v.broadcast(e));pn(e=>v.broadcast({type:"node_named",...e}));let D=!1,se=!1,q,ae,m,V,F,de=n(()=>{},"notifyTurnAccepted"),le=n(()=>{},"resetFrameState");const z=vn(),J=[];let G=!1,ce;const Q=n(()=>{if(G||m.isReplacing()||m.isAgentRunActive()||m.session().isStreaming)return;const e=J.shift();e&&me(e.text,e.messageIds)},"drainPendingRunPrompt"),me=n((e,o=[])=>{if(w&&(G||m.isReplacing()||m.isAgentRunActive()||m.session().isStreaming)){J.push({text:e,messageIds:o});return}w&&(G=!0),z.admit(d=>{const u=m.session();return w&&u.isStreaming?(J.unshift({text:e,messageIds:o}),d(),Promise.resolve()):(w&&o.length>0&&u.sessionManager.appendCustomEntry("crtr-turn-input",{message_ids:o}),u.prompt(e,{preflightResult:d,...!w&&u.isStreaming?{streamingBehavior:"steer"}:{}}))}).catch(d=>{R({level:"error",event:"broker.inbox.idle_prompt_failed",error:d})}).finally(()=>{w&&(G=!1,Q())})},"startIdleInboxTurn");globalThis[hn]=me,m=new En({nodeId:t,cfg:g,session:B,services:A,runtime:$,registry:v,toolGroups:I,uiContext:n(()=>ae,"uiContext"),faultRetry:n(()=>V,"faultRetry"),projection:n(()=>F,"projection"),setActiveSession:n(e=>{if(Y=e,ce?.(),w){let o="stop";ce=e.subscribe(d=>{if(d.type==="agent_start"&&(o="stop"),d.type==="agent_end"){const u=[...d.messages??[]].reverse().find(S=>S.role==="assistant");u&&(o=u.stopReason)}d.type==="agent_settled"&&(e.sessionManager.appendCustomEntry("crtr-turn-end",{stop_reason:o}),queueMicrotask(()=>{m.session()===e&&Q()}))})}},"setActiveSession"),disposeAndExit:n((e,o)=>j(e,o),"disposeAndExit"),onSessionRebind:n(()=>{le()},"onSessionRebind"),onReplacementIdle:n(()=>{w&&Q()},"onReplacementIdle"),reWelcomeAll:n(()=>Z(),"reWelcomeAll")});const ue=n(async(e,o=!1)=>{const d=m.session(),u=L(d.model,d.thinkingLevel);if(u===null)return null;const S=await In(t,{spec:u,...e!==void 0?{intent:e}:{},userSelected:o});return o&&(g.model=S.modelOverride,e!==void 0?(process.env.CRTR_MODEL_INTENT=`${e.family}/${e.strength}`,delete process.env.CRTR_MODEL_EXACT,g.modelExact=void 0):(delete process.env.CRTR_MODEL_INTENT,process.env.CRTR_MODEL_EXACT="1",g.modelExact=!0)),S.modelOverride},"persistModelChoice"),fe=n(async(e=!0,o,d=!1)=>{const u=m.session(),S=L(u.model,u.thinkingLevel),T=e?await ue(o,d):S;v.broadcast({type:"model_changed",model:oe(u.model)?void 0:u.model,spec:T})},"broadcastModelChanged");V=new gn({nodeId:t,cfg:g,retryProbe:N,currentSession:n(()=>m.session(),"currentSession"),currentServices:n(()=>m.services(),"currentServices"),installedGeneration:n(()=>m.installedGeneration(),"installedGeneration"),registryOf:ie,formatModelSpec:L,broadcastModelChanged:fe,turnAdmission:z,reWelcomeAll:n(()=>Z(),"reWelcomeAll")}),F=new Sn({registry:v,faultRetry:V,installedGeneration:n(()=>m.installedGeneration(),"installedGeneration"),currentSession:n(()=>m.session(),"currentSession"),notifyTurnAccepted:n(()=>de(),"notifyTurnAccepted"),emitStartupMilestone:l,formatModelSpec:L});const be=n(e=>{const o=m.session(),d=Un(o,P),u=Dn(e.snapshotTail),S=d===void 0||u===void 0?d:d.slice(-u),T=S?.map(({message:O})=>O)??o.sessionManager.buildSessionContext().messages,X=I.summaries(),ve=S!==void 0&&u!==void 0?$n(T):void 0,ke=ve===void 0?X:Object.fromEntries(Object.entries(X).filter(([O])=>ve.has(O)));return{messages:T,...S===void 0?{}:{messageIds:S.map(({id:O})=>O)},messageVisibility:S?.map(({visibility:O})=>O)??T.map(()=>"visible"),turnVisibility:mn(),stats:o.getSessionStats(),state:{model:oe(o.model)?void 0:o.model,thinkingLevel:o.thinkingLevel,isStreaming:o.isStreaming,isCompacting:o.isCompacting,steeringMode:o.steeringMode,followUpMode:o.followUpMode,sessionFile:o.sessionFile,sessionId:o.sessionId,sessionName:o.sessionName,autoCompactionEnabled:o.autoCompactionEnabled,messageCount:o.messages.length,pendingMessageCount:o.pendingMessageCount},display:{...v.displaySnapshot()},toolGroupSummaries:ke,workingActivity:F.currentWorkingActivity(),queued:{steering:[...o.getSteeringMessages()],followUp:[...o.getFollowUpMessages()]}}},"buildSnapshot"),pe=n(e=>{const o=e.role==="controller"?K.values().next().value:void 0;v.sendFrame(e,{type:"welcome",snapshot:be(e),role:e.role,pending_dialog:o!==void 0?o.request:null,agentDir:ne()},!0)},"sendWelcome"),Te=n(e=>{const o=[...K.values()];for(let d=1;d<o.length;d++)v.sendFrame(e,o[d].request)},"replayExtraPendingDialogsTo"),Z=n(()=>{v.forEachHelloed(pe)},"reWelcomeAll"),ge=n(async e=>{if(!D){D=!0,I.persistPendingSummary(),F.dispose(),Bn();try{q?.close()}catch{}r.close(),v.dispose();try{he(U)&&_e(U)}catch{}v.clearAttachState(),await We(),process.exit(e)}},"completeExit"),j=n((e,o=0)=>{if(D)return;const d=e==="shutdown-hook"||e==="shutdown-after-settle";if(d&&I.finishOpenToolGroup(!0),d&&I.hasSummaryTasks()){if(se)return;se=!0,I.waitForSummaryTasks().finally(()=>ge(o));return}ge(o)},"disposeAndExit");ae=Kn({writable:n(()=>v.writableClients(),"writable"),forward:n((e,o)=>v.sendFrame(e,o),"forward"),pending:K,broadcast:n(e=>v.broadcastUi(e),"broadcast"),onKnownStreamWait:n(e=>F.knownStreamWait(e),"onKnownStreamWait")}),m.setRebindSession(),await m.enqueueRebind(B,A);const k=yn({nodeId:t,registry:v,toolGroups:I,projection:F,rebind:m,boundaryReviewId:P,pendingDialogs:K,sendWelcome:pe,replayExtraPendingDialogsTo:Te,reWelcomeAll:Z,disposeAndExit:j,persistModelChoice:ue,broadcastModelChanged:fe,registryOf:ie,formatModelSpec:L,formatExactModelSpec:Fn,turnAdmission:z,memoryInventory:y});de=k.notifyTurnAccepted,le=k.resetForSession,globalThis[_n]=()=>G||k.pendingPromptDispatches()>0||m.isAgentRunActive()||m.session().isStreaming;const Ee=2500;let ee=!1;const Re=n(async e=>{if(D||ee)return;if(ee=!0,m.isAgentRunActive()||m.session().isStreaming||k.pendingPromptDispatches()>0){const d=Date.now()+Ee;for(;k.pendingPromptDispatches()>0&&!m.session().isStreaming&&Date.now()<d;)await new Promise(u=>setTimeout(u,25));if(m.session().isStreaming){const u=d-Date.now();if(u>0){let S;try{Rn(),await Promise.race([m.session().abort().then(()=>!0,()=>!1),new Promise(X=>{S=setTimeout(()=>X(!1),u)})])&&await ye(t,{event:"closed",end_reason:"teardown-aborted"})}finally{S!==void 0&&clearTimeout(S)}}}else(k.pendingPromptDispatches()>0||m.isAgentRunActive())&&await ye(t,{event:"interrupted"})}j(e)},"abortAndExit");if(b=n(e=>{Re(e)},"signalTeardown"),M!==void 0){b(M);return}try{he(U)&&_e(U)}catch{}q=Oe(e=>{const o=v.create(e);e.on("data",u=>{let S;try{S=o.decoder.push(u)}catch(T){T instanceof Nn?(v.sendFrame(o,{type:"error",code:"frame_overflow",message:T.message}),v.dropClient(o,`frame overflow: ${T.message}`)):v.dropClient(o,`decoder error: ${String(T)}`);return}for(const T of S)try{wn(k,o,T)}catch{}});const d=n(()=>{v.removeClient(o)},"drop");e.on("close",d),e.on("error",()=>{})}),q.on("error",e=>{D||(R({level:"error",event:"broker.socket.failed",error:e}),j("socket-error",1))}),q.listen(U,async()=>{Promise.all([H(t,{op:"clear",link:"viewer\u2194broker"}),H(t,{op:"clear",link:"relay\u2194broker"})]).catch(o=>R({level:"error",event:"broker.daemon.operation.failed",node_id:t,error:o,fields:{operation:"broker_socket_bound_fault_clear"}}));let e;try{e=await V.recoverOnStartup()}catch(o){R({level:"error",event:"broker.daemon.operation.failed",node_id:t,error:o,fields:{operation:"recovery_startup"}}),j("recovery-startup-failed",1);return}if(!(D||ee)&&e!=="retry-armed"&&g.firstPrompt!==void 0&&g.firstPrompt!==""){const o=Mn(process.env[An]);o!==null&&xn(g.firstPrompt,o);const d=process.env.CRTR_KICKOFF_MESSAGE_IDS;k.kickoff(g.firstPrompt,d?JSON.parse(d):[])}}),v.persistAttachState()}n($t,"runBroker");function $n(t){const i=new Set;for(const s of t)if(!(s.role!=="assistant"||!Array.isArray(s.content)))for(const p of s.content)p!==null&&typeof p=="object"&&p.type==="toolCall"&&typeof p.id=="string"&&i.add(p.id);return i}n($n,"toolCallIds");function Un(t,i){const s=t.sessionManager,p=ln(s);return p!==void 0&&bn(p.map(({message:r})=>r)),p===void 0?void 0:cn(p,{boundaryReviewId:i,sessionEntries:s.getEntries?.()})}n(Un,"snapshotMessages");function we(){const t=Pe();if(t===void 0||t==="")throw new Error("broker launch is missing CRTR_NODE_ID");return t}n(we,"currentBrokerNodeId");async function Gn(t,i){const s=nn(i.model,Ae(),i.modelExact===!0);if(s===void 0)return;const p=ie(t),r={cwd:xe()??i.cwd,profileId:Ie()},a=rn(s,p,r);if(a!==void 0)throw await H(we(),{op:"record",input:{link:"crtr\u2192pi",op:"model resolution at launch",kind:"model-not-found",retry:{disposition:"fatal"},message:`model '${a.request.spec}' is not registered in the serving model registry`}}),new Error(`[broker] FATAL: model '${a.request.spec}' is not registered in the serving model registry`);const c=tn(s,r.cwd,r.profileId),l=on(s.spec);for(const f of c){const h=p.find(f.providerId,f.modelId);if(h===void 0)continue;const _=l?.providerId===f.providerId&&l.modelId===f.modelId?l.thinkingLevel??(f.thinkingLevel===void 0?void 0:"off"):f.thinkingLevel;return{model:h,thinkingLevel:_}}if(i.modelExact===!0){const f=c.map(h=>`'${h.providerId}/${h.modelId}' unregistered`).join("; ");throw await H(we(),{op:"record",input:{link:"crtr\u2192pi",op:"model resolution at launch",kind:"model-not-found",retry:{disposition:"fatal"},message:`exact-consult model '${i.model}' is unavailable \u2014 refusing to substitute (${f})`}}),new Error(`[broker] FATAL: exact-consult model '${i.model}' is unavailable`)}R({level:"warn",event:"broker.model.none_viable",fields:{rejected_candidates:c.map(f=>({provider:f.providerId,model:f.modelId,reason:"unregistered"})).slice(0,16)}})}n(Gn,"resolveLaunchModel");function jn(t){let i=!0;return{runtime:new Proxy(t,{get(p,r,a){return i&&r==="getAvailableSnapshot"?()=>[]:i&&r==="getAvailable"?async()=>[]:i&&r==="getModel"?()=>{}:Reflect.get(p,r,a)}}),reveal:n(()=>{i=!1},"reveal")}}n(jn,"modelLessRegistry");async function Wn(t,i){const s=ne(),p=n(async _=>{const g=await $e.create({credentials:new Ze,modelsPath:Se(_.agentDir,"models.json")});en(g);const y=await t.createAgentSessionServices({cwd:_.cwd,agentDir:_.agentDir,modelRuntime:g,resourceLoaderOptions:{additionalExtensionPaths:i.extensionPaths,appendSystemPrompt:i.appendSystemPromptPath!==void 0?[i.appendSystemPromptPath]:void 0,noContextFiles:!0,extensionsOverride:n(x=>({...x,extensions:x.extensions.filter(P=>!/[/\\]provider-rotation\.(?:ts|js)$/.test(P.path))}),"extensionsOverride")}}),b=y.resourceLoader.getExtensions();if(i.extensionPaths.some(x=>te.includes(x))){const x=new Set(b.extensions.map(w=>w.path)),P=te.filter(w=>!x.has(w));if(P.length>0){const w=b.errors.filter(N=>te.includes(N.path)).map(N=>`${N.path}: ${N.error}`).join("; ");throw new Error(`[broker] FATAL: mandatory canvas extensions failed to load: ${P.join(", ")}${w===""?"":` (${w})`}`)}}y.settingsManager.getRetryEnabled=()=>!1;const M=await Gn(y,i),W=M?.model,B=M?.thinkingLevel,A=M===void 0?jn(y.modelRuntime):void 0,re=A!==void 0?{...y,modelRuntime:A.runtime}:y,$=await t.createAgentSessionFromServices({services:re,sessionManager:_.sessionManager,model:W,thinkingLevel:B,tools:i.tools,sessionStartEvent:_.sessionStartEvent});return Tn($.session),Qe($.session),A?.reveal(),{...$,services:y}},"buildForManager"),r=i.resumeSessionPath,a=i.forkFrom!==void 0&&i.forkFrom!=="";if(!a&&(r===void 0||r==="")&&i.resumeSessionId!==void 0&&i.resumeSessionId!=="")throw new Error(`[broker] resume requires a session .jsonl PATH; got only a bare id '${i.resumeSessionId}' (pi_session_file was never captured for this node)`);const c=!a&&r!==void 0&&r!=="",l=c&&i.newCycle===!0,f=c&&!l;let h;if(a)h=t.SessionManager.forkFrom(i.forkFrom,i.cwd);else if(f||l){if(h=t.SessionManager.open(r),l){const _=h.getLeafId();h.resetLeaf(),h.appendCustomEntry(dn,{cycle:Number(process.env.CRTR_CYCLES),fromLeaf:_})}}else h=t.SessionManager.create(i.cwd);if(t.createAgentSessionRuntime!==void 0){const _=n(async y=>{const b=await p({cwd:y.cwd,agentDir:y.agentDir,sessionManager:y.sessionManager,sessionStartEvent:y.sessionStartEvent});return{...b,diagnostics:b.services.diagnostics??[]}},"factory"),g=await t.createAgentSessionRuntime(_,{cwd:i.cwd,agentDir:s,sessionManager:h});return{session:g.session,services:g.services,resuming:f,runtime:g}}const E=await p({cwd:i.cwd,agentDir:s,sessionManager:h});return{session:E.session,services:E.services,resuming:f,runtime:void 0}}n(Wn,"buildBrokerSession");function Kn(t){const i=n((r,a,c,l)=>{if(l?.signal?.aborted)return Promise.resolve(r);const f=t.writable();return f.length===0?Promise.resolve(r):new Promise(h=>{let E;const _=n(()=>{E!==void 0&&clearTimeout(E),l?.signal?.removeEventListener("abort",g),t.pending.delete(a.id)},"cleanup"),g=n(()=>{_(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),h(r)},"onAbort");l?.signal?.addEventListener("abort",g,{once:!0});const y=l?.timeout!==void 0?l.timeout:Ln;E=setTimeout(()=>{_(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),h(r)},y),typeof E.unref=="function"&&E.unref(),t.pending.set(a.id,{request:a,resolve:n(b=>{_(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),h(c(b))},"resolve")});for(const b of f)t.forward(b,a)})},"dialogPromise"),s=n(()=>{},"noop");return{[sn]:t.onKnownStreamWait??(r=>()=>{}),get theme(){const r=globalThis[Symbol.for("@earendil-works/pi-coding-agent:theme")];if(r==null)throw new Error("Theme not initialized. Call initTheme() first.");return r},select:n((r,a,c)=>i(void 0,{type:"extension_ui_request",id:C(),method:"select",title:r,options:a,timeout:c?.timeout},l=>"cancelled"in l&&l.cancelled?void 0:"value"in l?l.value:void 0,c),"select"),confirm:n((r,a,c)=>i(!1,{type:"extension_ui_request",id:C(),method:"confirm",title:r,message:a,timeout:c?.timeout},l=>"cancelled"in l&&l.cancelled?!1:"confirmed"in l?l.confirmed:!1,c),"confirm"),input:n((r,a,c)=>i(void 0,{type:"extension_ui_request",id:C(),method:"input",title:r,placeholder:a,timeout:c?.timeout},l=>"cancelled"in l&&l.cancelled?void 0:"value"in l?l.value:void 0,c),"input"),editor:n((r,a)=>i(void 0,{type:"extension_ui_request",id:C(),method:"editor",title:r,prefill:a},c=>"cancelled"in c&&c.cancelled?void 0:"value"in c?c.value:void 0),"editor"),setStatus:n((r,a)=>t.broadcast({type:"extension_ui_request",id:C(),method:"setStatus",statusKey:r,statusText:a}),"setStatus"),setWidget:n((r,a,c)=>{typeof a!="function"&&t.broadcast({type:"extension_ui_request",id:C(),method:"setWidget",widgetKey:r,widgetLines:a,widgetPlacement:c?.placement})},"setWidget"),setTitle:n(r=>t.broadcast({type:"extension_ui_request",id:C(),method:"setTitle",title:r}),"setTitle"),notify:n((r,a)=>{const c=a==="warn"?"warning":a;t.broadcast({type:"extension_ui_request",id:C(),method:"notify",message:r,notifyType:c})},"notify"),onTerminalInput:n(()=>s,"onTerminalInput"),setWorkingMessage:s,setWorkingVisible:s,setWorkingIndicator:s,setHiddenThinkingLabel:s,setFooter:s,setHeader:s,custom:n(()=>Promise.resolve(void 0),"custom"),pasteToEditor:s,setEditorText:s,getEditorText:n(()=>"","getEditorText"),addAutocompleteProvider:s,setEditorComponent:s,getEditorComponent:n(()=>{},"getEditorComponent"),getAllThemes:n(()=>[],"getAllThemes"),getTheme:n(()=>{},"getTheme"),setTheme:s,getToolsExpanded:n(()=>!1,"getToolsExpanded"),setToolsExpanded:s}}n(Kn,"makeBrokerUiContext");export{Wt as REVIEW_BOUNDARY_NAVIGATION_CODE,jt as ReviewBoundaryNavigationError,Wn as buildBrokerSession,Bn as disposeActiveSession,Kn as makeBrokerUiContext,$t as runBroker,Un as snapshotMessages};
@@ -1,8 +1,11 @@
1
- import { type SubscriptionRef } from '../canvas/index.js';
2
1
  import type { InboxTier } from '../feed/inbox.js';
3
- /** Fan a lifecycle or birth notice to every given subscriber. A passive
4
- * subscription is a non-waking delivery; active subscriptions wake. */
5
- export declare function fanDoctrineWake(fromId: string, subscribers: readonly SubscriptionRef[], label: string, data: Record<string, unknown>, tier?: InboxTier): void;
2
+ import type { ObjectRow } from '../graph/types.js';
3
+ export type NoticeEvent = 'notice.crash' | 'notice.deadline' | 'notice.close';
4
+ /** Publish a lifecycle notice on `nodeId` to its watchers, inside the caller's write when one
5
+ * is open. The message body carries today's sentence (as `body`, which the inbox card shows)
6
+ * and data; `publish` picks the recipients, their tier and wake from each watch. A node whose
7
+ * object is already gone publishes nothing. */
8
+ export declare function publishNotice(nodeId: string, event: NoticeEvent, label: string, data: Record<string, unknown>, tier?: InboxTier, actor?: ObjectRow | null): void;
6
9
  export interface CloseNodeResult {
7
10
  /** The focused node that was closed — the cascade root. */
8
11
  root: string;
@@ -38,4 +41,6 @@ export declare function closeNode(rootId: string, opts?: {
38
41
  registerDetached?: (work: Promise<void>) => void;
39
42
  /** Reason recorded when an active turn or background job is stopped. */
40
43
  stopReason?: string;
44
+ /** The node that asked for the close; absent means the local person. */
45
+ closer?: string;
41
46
  }): CloseNodeResult;
@@ -1 +1 @@
1
- var k=Object.defineProperty;var a=(r,o)=>k(r,"name",{value:o,configurable:!0});import{getNode as h,subscriptionsOf as f,subscribersOf as _}from"../canvas/index.js";import{transition as g}from"./lifecycle.js";import{stopNodeSandboxes as D}from"../spaces/stop.js";import{tearDownNode as $,reapIfEmpty as E}from"./placement.js";import{crtrHome as N,jobDir as x}from"../canvas/paths.js";import{contextDir as L,nodeAgentDir as S,reportsDir as O}from"../canvas/node-agent-paths.js";import{readLiveSession as H}from"../canvas/sessions.js";import{discoverLifecycleHookRegistry as j}from"../command-hooks/discovery.js";import{invokeLifecycleHooks as R}from"../command-hooks/transport/exec-lifecycle.js";import{emitEvent as m}from"../events/emit.js";import{enqueueNodeMail as v}from"../feed/messages.js";function Y(r,o,t,s,l="normal"){for(const i of o)try{v(i.node_id,{senderNodeId:r,kind:"message",label:t,bodyJson:s,urgency:l,wake:i.active?1:0})}catch{}}a(Y,"fanDoctrineWake");function q(r){const o=new Set([r]);let t=!0;for(;t;){t=!1;for(const s of[...o])for(const l of f(s)){const i=l.node_id;o.has(i)||_(i).every(d=>o.has(d.node_id))&&(o.add(i),t=!0)}}return o}a(q,"closingSet");function A(r,o){const t=[],s=new Set([r]),l=[r];for(;l.length>0;){const i=l.shift();t.push(i);for(const d of f(i))o.has(d.node_id)&&!s.has(d.node_id)&&(s.add(d.node_id),l.push(d.node_id))}for(const i of o)s.has(i)||t.push(i);return t.reverse()}a(A,"killOrder");function J(r,o){const t=r?"You were CLOSED by the user from the canvas":"You were CANCELED \u2014 an ancestor of yours was closed from the canvas";if(o.length===0)return`${t}. Your pi session is preserved; this resume reopened it.`;const s=o.slice(0,4).map(i=>{const d=h(i);return d!==null?`${d.name} (${i})`:i}),l=o.length>s.length?` +${o.length-s.length} more`:"";return`${t}. ${o.length} child node(s) you subscribe to were canceled with you and are no longer running: ${s.join(", ")}${l}. Resuming will NOT restore them \u2014 re-spawn if you still need that work.`}a(J,"cancellationLabel");function V(r,o={}){if(h(r)===null)throw new Error(`closeNode: unknown node ${r}`);const t=o.rootEvent??"cancel",s=q(r),l=A(r,s),i=[];for(const e of s)for(const n of f(e))!s.has(n.node_id)&&!i.includes(n.node_id)&&i.push(n.node_id);const d=[];for(const e of l)try{const n=h(e);if(n===null)continue;const p=f(e).map(c=>c.node_id).filter(c=>s.has(c)),w=_(e).filter(c=>!s.has(c.node_id));let u;try{const c=j(n.cwd,n.profile_id).plans.get("node:close")??[];if(c.length>0){const b={node:{id:e,name:n.name,kind:n.kind,mode:n.mode,lifecycle:n.lifecycle,cwd:n.cwd,nodeDir:S(e),contextDir:L(e),jobDir:x(e),reportsDir:O(e)},runtime:{isBirth:!1,canvasHome:N(),profile:n.profile_id??null}};u=a(()=>R(c,b),"afterTeardown")}}catch(c){m({level:"error",event:"node.close_hook.discovery_failed",node_id:e,error:c})}const y=D(e,o.stopReason??"node_closed",{...e===r?{excludePid:o.callerPid}:{},...u?{after:u}:{}});try{o.registerDetached?.(y.then(()=>{}))}catch(c){m({level:"error",event:"node.close_hook.detached_registration_failed",node_id:e,error:c})}if(o.preserveEmpty||n.run_id!==null&&n.pi_pid!==null&&H(e)?.sessionId!=null||!E(e,void 0,!1)){const c=n.final_report!==null&&n.final_report!==void 0;e===r&&t==="finish"||c?(n.status==="active"||n.status==="idle")&&g(e,"finish"):g(e,"cancel",{reason:"closed"}),$(e),v(e,{kind:"message",label:J(e===r,p),bodyJson:{reason:"user-close",cascade_root:r,canceled_children:p},urgency:"normal",wake:1})}Y(e,w,`Child closed \u2014 ${n.name} (${e}) was closed from the canvas and is no longer running.`,{reason:"child-closed",child:e}),d.push(e)}catch(n){m({level:"error",event:"node.close.failed",node_id:e,error:n})}return{root:r,closed:d,spared:i}}a(V,"closeNode");export{V as closeNode,q as closingSet,Y as fanDoctrineWake};
1
+ var k=Object.defineProperty;var a=(r,o)=>k(r,"name",{value:o,configurable:!0});import{getNode as h,subscriptionsOf as u,subscribersOf as E}from"../canvas/index.js";import{transition as w}from"./lifecycle.js";import{stopNodeSandboxes as $}from"../spaces/stop.js";import{tearDownNode as D,reapIfEmpty as N}from"./placement.js";import{crtrHome as L,jobDir as O}from"../canvas/paths.js";import{contextDir as x,nodeAgentDir as S}from"../canvas/node-agent-paths.js";import{readLiveSession as j}from"../canvas/sessions.js";import{discoverLifecycleHookRegistry as H}from"../command-hooks/discovery.js";import{invokeLifecycleHooks as A}from"../command-hooks/transport/exec-lifecycle.js";import{emitEvent as p}from"../events/emit.js";import{enqueueNodeMail as B}from"../feed/messages.js";import{withCanvasWrite as v}from"../canvas/db.js";import{recordActedOn as C}from"../graph/edges.js";import{publish as R}from"../graph/events.js";import{getById as y,nodeObject as T,ownerForGrantee as Y}from"../graph/objects.js";const q={deferred:3,normal:5,urgent:7,critical:7};function P(r,o,l,s,d="normal",t=null){v(c=>{const e=y(c,r);e===null||e.type!=="node"||R(c,{event:o,object:e,actor:t,level:q[d],attrs:{},messageBody:{...s,body:l}})})}a(P,"publishNotice");function z(r){const o=new Set([r]);let l=!0;for(;l;){l=!1;for(const s of[...o])for(const d of u(s)){const t=d.node_id;o.has(t)||E(t).every(c=>o.has(c.node_id))&&(o.add(t),l=!0)}}return o}a(z,"closingSet");function F(r,o){const l=[],s=new Set([r]),d=[r];for(;d.length>0;){const t=d.shift();l.push(t);for(const c of u(t))o.has(c.node_id)&&!s.has(c.node_id)&&(s.add(c.node_id),d.push(c.node_id))}for(const t of o)s.has(t)||l.push(t);return l.reverse()}a(F,"killOrder");function G(r,o){const l=r?"You were CLOSED by the user from the canvas":"You were CANCELED \u2014 an ancestor of yours was closed from the canvas";if(o.length===0)return`${l}. Your pi session is preserved; this resume reopened it.`;const s=o.slice(0,4).map(t=>{const c=h(t);return c!==null?`${c.name} (${t})`:t}),d=o.length>s.length?` +${o.length-s.length} more`:"";return`${l}. ${o.length} child node(s) you subscribe to were canceled with you and are no longer running: ${s.join(", ")}${d}. Resuming will NOT restore them \u2014 re-spawn if you still need that work.`}a(G,"cancellationLabel");function se(r,o={}){if(h(r)===null)throw new Error(`closeNode: unknown node ${r}`);const l=o.rootEvent??"cancel",s=z(r),d=F(r,s),t=[];for(const e of s)for(const n of u(e))!s.has(n.node_id)&&!t.includes(n.node_id)&&t.push(n.node_id);const c=[];for(const e of d)try{const n=h(e);if(n===null)continue;const _=u(e).map(i=>i.node_id).filter(i=>s.has(i));let m;try{const i=H(n.cwd,n.profile_id).plans.get("node:close")??[];if(i.length>0){const f={node:{id:e,name:n.name,kind:n.kind,mode:n.mode,lifecycle:n.lifecycle,cwd:n.cwd,nodeDir:S(e),contextDir:x(e),jobDir:O(e)},runtime:{isBirth:!1,canvasHome:L(),profile:n.profile_id??null}};m=a(()=>A(i,f),"afterTeardown")}}catch(i){p({level:"error",event:"node.close_hook.discovery_failed",node_id:e,error:i})}const b=$(e,o.stopReason??"node_closed",{...e===r?{excludePid:o.callerPid}:{},...m?{after:m}:{}});try{o.registerDetached?.(b.then(()=>{}))}catch(i){p({level:"error",event:"node.close_hook.detached_registration_failed",node_id:e,error:i})}if(v(i=>{const f=y(i,e);if(f===null||f.type!=="node")return;const g=o.closer!==void 0?T(i,o.closer):Y(i,"user:local");C(i,g,f),P(e,"notice.close",`Child closed \u2014 ${n.name} (${e}) was closed from the canvas and is no longer running.`,{reason:"child-closed",child:e},"normal",g)}),o.preserveEmpty||n.run_id!==null&&n.pi_pid!==null&&j(e)?.sessionId!=null||!N(e,void 0,!1)){const i=n.final_report!==null&&n.final_report!==void 0;e===r&&l==="finish"||i?(n.status==="active"||n.status==="idle")&&w(e,"finish"):w(e,"cancel",{reason:"closed"}),D(e),B(e,{kind:"message",label:G(e===r,_),bodyJson:{reason:"user-close",cascade_root:r,canceled_children:_},urgency:"normal",wake:1})}c.push(e)}catch(n){p({level:"error",event:"node.close.failed",node_id:e,error:n})}return{root:r,closed:c,spared:t}}a(se,"closeNode");export{se as closeNode,z as closingSet,P as publishNotice};
@@ -1 +1 @@
1
- var l=Object.defineProperty;var o=(e,r)=>l(e,"name",{value:r,configurable:!0});import{insertMemoryReads as u}from"../canvas/memory-reads.js";import{memoryEvents as f}from"../substrate/memory-events.js";import{getNode as n}from"../canvas/index.js";import{appForNode as m}from"../canvas/node-agent-paths.js";import{oneShotControllerRequest as p}from"./broker-request.js";import{isBrokerLive as v}from"./model-swap.js";import{buildContextBearings as y,CONTEXT_INTRO_CUSTOM_TYPE as T}from"./bearings.js";import{renderPreferencesForNodeSubject as x}from"./broker-extension-render.js";import{assembleNodeSubject as d}from"../substrate/subject.js";import{exposureTarget as a,freezePreferenceSnapshot as w,loadContextExposureState as C,saveContextExposureState as g}from"../substrate/injected-store.js";import{formatCard as E}from"../../shared/generated-context.js";import{automaticMemoryTarget as S}from"../spaces/permissions.js";async function b(e,r){const t=n(e);if(t===null)throw new Error(`deliverCustomMessageLive: unknown node ${e}`);v(t)&&await p({nodeId:e,what:`the ${r.customType} delivery`,ackFor:"deliver_custom_message",frame:o(()=>({type:"deliver_custom_message",customType:r.customType,content:r.content,...r.deliverAs!==void 0?{deliverAs:r.deliverAs}:{},...r.details!==void 0?{details:r.details}:{}}),"frame"),result:o(()=>{},"result")})}o(b,"deliverCustomMessageLive");async function R(e){const r=C(e),t=[];await b(e,{customType:T,content:E("bearings",{},y(e,a(r,"transcript",t))),details:{nodeId:e}});const i=d(e),s=n(e);if(i===null||s===null)throw new Error(`deliverBearingsLive: no document subject for ${e}`);w(r,x(e,i,a(r,"system",t),m(e),S({...s,grantee:m(e)}))),g(e,r);try{u(e,f(t,"loaded"))}catch(c){console.warn(`memory-read log insert failed for ${e}: ${String(c)}`)}}o(R,"deliverBearingsLive");export{R as deliverBearingsLive,b as deliverCustomMessageLive};
1
+ var n=Object.defineProperty;var r=(t,e)=>n(t,"name",{value:e,configurable:!0});import{getNode as m}from"../canvas/index.js";import{withCanvasWrite as a}from"../canvas/db.js";import{readerForNode as s}from"../graph/reader.js";import{noteNodeBooting as f}from"../graph/repo-sync/index.js";import{reposForCwd as l}from"../graph/repo-sync/repos.js";import{deliver as c}from"../substrate/delivery/deliver.js";import{oneShotControllerRequest as p}from"./broker-request.js";import{isBrokerLive as u}from"./model-swap.js";import{CONTEXT_INTRO_CUSTOM_TYPE as v}from"./bearings.js";import{formatCard as d}from"../../shared/generated-context.js";async function w(t,e){const o=m(t);if(o===null)throw new Error(`deliverCustomMessageLive: unknown node ${t}`);u(o)&&await p({nodeId:t,what:`the ${e.customType} delivery`,ackFor:"deliver_custom_message",frame:r(()=>({type:"deliver_custom_message",customType:e.customType,content:e.content,...e.deliverAs!==void 0?{deliverAs:e.deliverAs}:{},...e.details!==void 0?{details:e.details}:{}}),"frame"),result:r(()=>{},"result")})}r(w,"deliverCustomMessageLive");async function F(t){await f(t);const{content:e}=a(o=>c(o,s(o,t,i=>l(o,i)),{activity:"boot"}));await w(t,{customType:v,content:d("bearings",{},e),details:{nodeId:t}})}r(F,"deliverBearingsLive");export{F as deliverBearingsLive,w as deliverCustomMessageLive};
@@ -1,30 +1,28 @@
1
- var E=Object.defineProperty;var i=(t,n)=>E(t,"name",{value:n,configurable:!0});import{join as w}from"node:path";import{getNode as x,subscriptionsOf as k,subscribersOf as M}from"../canvas/index.js";import{contextDir as h,nodeAgentDir as f,reportsDir as v}from"../canvas/node-agent-paths.js";import{readdirBeneath as A,readTextBeneathIfExists as j,unlinkBeneath as N,writeFileBeneath as R}from"../spaces/open-beneath.js";import{activeBackgroundBashJobs as O,bashJobCommandLine as I,formatBashElapsed as D}from"../bash-jobs.js";import{readRoadmap as C,roadmapPath as G}from"./roadmap.js";import{buildWakeBearings as Y}from"./bearings.js";import{personaDrift as P}from"./persona.js";import{coalesce as S,nodeMailEntry as U}from"../feed/inbox.js";import{claimKickoffMail as L}from"../canvas/deliveries.js";import{formatCard as _}from"../../shared/generated-context.js";const ct=_("restart-continuation",{},"continue");function y(t){return w(h(t),"initial-prompt.md")}i(y,"goalPath");function B(t){return j(f(t),y(t))}i(B,"readGoal");function J(t,n){const e=n.trim();e!==""&&R(f(t),y(t),e+`
2
- `)}i(J,"writeGoal");function pt(t,n){const e=B(t);if(e!==null&&e.trim()!=="")return!1;const o=n.trim();return o===""?!1:(J(t,o),!0)}i(pt,"captureGoalIfAbsent");function b(t){return w(h(t),"yield-message.md")}i(b,"yieldMessagePath");function ft(t,n){const e=n.trim();e!==""&&R(f(t),b(t),e+`
3
- `)}i(ft,"writeYieldMessage");function K(t){const n=j(f(t),b(t))?.trim()??"";return n!==""?n:null}i(K,"readYieldMessage");function ht(t){try{N(f(t),b(t))}catch{}}i(ht,"clearYieldMessage");function W(t){return $(t,h(t)).sort()}i(W,"listContextDir");function F(t){return $(t,v(t)).some(n=>n.endsWith(".md"))}i(F,"hasRetainedReports");function $(t,n){try{return A(f(t),n).map(e=>e.name)}catch(e){if(e.code==="ENOENT")return[];throw e}}i($,"agentDirNames");function mt(t,n){const e=t.node_id,o=K(e),s=t.run_id?[]:L(e,n),r=s.map(c=>c.message.messageId),d=s.map(U);let l=null;if(d.length>0){const c=i(p=>{const g=p.data?.cards;return Array.isArray(g)?g.filter(T=>typeof T=="string"):[]},"cardsFor"),m=[];for(const p of d)(c(p).length>0||m.length===0)&&m.push([]),m.at(-1).push(p);l=m.map(p=>[...c(p[0]),S(p).map(g=>g.text).join(`
1
+ var B=Object.defineProperty;var i=(t,e)=>B(t,"name",{value:e,configurable:!0});import{join as w}from"node:path";import{getNode as M,subscriptionsOf as R,subscribersOf as N}from"../canvas/index.js";import{contextDir as h,nodeAgentDir as c}from"../canvas/node-agent-paths.js";import{hasReportDocuments as A}from"../feed/reports.js";import{readdirBeneath as E,readTextBeneathIfExists as x,unlinkBeneath as T,writeFileBeneath as $}from"../spaces/open-beneath.js";import{activeBackgroundBashJobs as D,bashJobCommandLine as G,formatBashElapsed as I}from"../bash-jobs.js";import{readRoadmap as O}from"./roadmap.js";import{buildWakeBearings as _}from"./bearings.js";import{personaDrift as Y}from"./persona.js";import{coalesce as C,nodeMailEntry as L}from"../feed/inbox.js";import{claimKickoffMail as U}from"../canvas/deliveries.js";import{formatCard as k}from"../../shared/generated-context.js";const ut=k("restart-continuation",{},"continue");function y(t){return w(h(t),"initial-prompt.md")}i(y,"goalPath");function j(t){return x(c(t),y(t))}i(j,"readGoal");function J(t,e){const n=e.trim();n!==""&&$(c(t),y(t),n+`
2
+ `)}i(J,"writeGoal");function lt(t,e){const n=j(t);if(n!==null&&n.trim()!=="")return!1;const r=e.trim();return r===""?!1:(J(t,r),!0)}i(lt,"captureGoalIfAbsent");function b(t){return w(h(t),"yield-message.md")}i(b,"yieldMessagePath");function dt(t,e){const n=e.trim();n!==""&&$(c(t),b(t),n+`
3
+ `)}i(dt,"writeYieldMessage");function P(t){const e=x(c(t),b(t))?.trim()??"";return e!==""?e:null}i(P,"readYieldMessage");function ct(t){try{T(c(t),b(t))}catch{}}i(ct,"clearYieldMessage");function F(t){return S(t,h(t)).sort()}i(F,"listContextDir");function K(t){return A(t)}i(K,"hasRetainedReports");function S(t,e){try{return E(c(t),e).map(n=>n.name)}catch(n){if(n.code==="ENOENT")return[];throw n}}i(S,"agentDirNames");function ft(t,e){const n=t.node_id,r=P(n),o=t.run_id?[]:U(n,e),s=o.map(u=>u.message.messageId),f=o.map(L);let l=null;if(f.length>0){const u=i(d=>{const m=d.data?.cards;return Array.isArray(m)?m.filter(v=>typeof v=="string"):[]},"cardsFor"),p=[];for(const d of f)(u(d).length>0||p.length===0)&&p.push([]),p.at(-1).push(d);l=p.map(d=>[...u(d[0]),C(d).map(m=>m.text).join(`
4
4
 
5
5
  `)].join(`
6
6
 
7
7
  `)).join(`
8
8
 
9
- `)}const a=P(e),u=a?.guidance===void 0||a.guidance===""?null:a.guidance;return{yieldMsg:o,unreadDigest:l,unreadMessageIds:r,driftGuidance:u}}i(mt,"drainBearings");const H=8;function q(t){return t.match(/^[0-9]{8}T[0-9]{6}-(.+)\.md$/)?.[1]??"report"}i(q,"reportKind");function z(t){const n=[];for(const e of k(t).filter(o=>o.active)){const o=$(e.node_id,v(e.node_id)).filter(r=>r.endsWith(".md")).sort().reverse();if(o.length===0)continue;const s=x(e.node_id);n.push({nodeId:e.node_id,name:s?.name??e.node_id,count:o.length,latest:o[0]})}return n.sort((e,o)=>o.latest.localeCompare(e.latest))}i(z,"reportHistorySources");function Q(t,n){const e=k(t).filter(r=>r.active).map(r=>x(r.node_id)).filter(r=>r!==null&&(r.status==="active"||r.status==="idle")),o=[];if(e.length>0){const r=e.length,d=r===1?"it is":"they are",l=r===1?"it":"they",a=r===1?"pushes":"push";o.push(`Awaiting ${r} node${r===1?"":"s"} \u2014 ${d} alive and running right now, and will wake you the moment ${l} ${a}. The wake is automatic; nothing to check, poll, or verify.`);for(const u of e)o.push(` - ${u.name} (${u.node_id}) \u2014 ${u.status}`);o.push("",n??"(no unread reports yet \u2014 expected while they run: a worker leaves no pointer until it pushes, so an empty feed means still working, not stalled)")}else o.push("Awaiting 0 nodes."),o.push("",n??"(no unread reports)");const s=z(t);if(s.length>0){const r=s.slice(0,H),d=s.length-r.length,l=s.reduce((a,u)=>a+u.count,0);o.push("",`Report history on disk (collapsed): ${l} report${l===1?"":"s"} across ${s.length} subscribed node${s.length===1?"":"s"}. This is a catch-up index for earlier reports; read only what matters.`,...r.map(a=>{const u=`${a.nodeId}:reports/${a.latest}`;return` - ${a.name} (${a.nodeId}): ${a.count} report${a.count===1?"":"s"}; latest ${q(a.latest)}: ${u}`}),...d>0?[` - \u2026 ${d} more subscribed node${d===1?"":"s"} with reports hidden`]:[],"Expand: `crtr canvas history read <ref>` for one listed report; `crtr node inspect artifacts <node-id> --type report` for that node's full report list; `crtr node inspect artifacts <node-id> --type inbox` for retained inbox history including full message bodies.")}return`<feed>
10
- ${o.join(`
9
+ `)}const a=Y(n),g=a?.guidance===void 0||a.guidance===""?null:a.guidance;return{yieldMsg:r,unreadDigest:l,unreadMessageIds:s,driftGuidance:g}}i(ft,"drainBearings");function q(t,e){const n=R(t).filter(o=>o.active).map(o=>M(o.node_id)).filter(o=>o!==null&&(o.status==="active"||o.status==="idle")),r=[];if(n.length>0){const o=n.length,s=o===1?"it is":"they are",f=o===1?"it":"they",l=o===1?"pushes":"push";r.push(`Awaiting ${o} node${o===1?"":"s"} \u2014 ${s} alive and running right now, and will wake you the moment ${f} ${l}. The wake is automatic; nothing to check, poll, or verify.`);for(const a of n)r.push(` - ${a.name} (${a.node_id}) \u2014 ${a.status}`);r.push("",e??"(no unread reports yet \u2014 expected while they run: a worker leaves no pointer until it pushes, so an empty feed means still working, not stalled)")}else r.push("Awaiting 0 nodes."),r.push("",e??"(no unread reports)");return`<feed>
10
+ ${r.join(`
11
11
  `)}
12
- </feed>`}i(Q,"feedBlock");function V(t,n){const e=(t??I(n)).trim()||"(no command)";return e.length>120?`${e.slice(0,117)}\u2026`:e}i(V,"jobLabel");function X(t){const n=O(h(t));if(n.length===0)return null;const e=Date.now(),o=n.length===1,s=[`${n.length} background bash job${o?"":"s"} you started ${o?"is":"are"} STILL RUNNING, detached from any turn and unaffected by your refresh. Each one sends you a message when it exits \u2014 that wake is automatic, so do not poll it and do not relaunch the same command.`];for(const r of n)s.push(` - ${r.jobId} \u2014 ${V(r.purpose,r.command)} \xB7 running ${D(e-r.startedAtMs)} \xB7 log ${r.logPath}`);return s.push("","Read output so far: `tail -n 50 <log>` (or `crtr node bash list --tail 20`). Abandon one: `crtr node bash kill <job-id>`."),`<background-jobs>
13
- ${s.join(`
12
+ </feed>`}i(q,"feedBlock");function W(t,e){const n=(t??G(e)).trim()||"(no command)";return n.length>120?`${n.slice(0,117)}\u2026`:n}i(W,"jobLabel");function z(t){const e=D(h(t));if(e.length===0)return null;const n=Date.now(),r=e.length===1,o=[`${e.length} background bash job${r?"":"s"} you started ${r?"is":"are"} STILL RUNNING, detached from any turn and unaffected by your refresh. Each one sends you a message when it exits \u2014 that wake is automatic, so do not poll it and do not relaunch the same command.`];for(const s of e)o.push(` - ${s.jobId} \u2014 ${W(s.purpose,s.command)} \xB7 running ${I(n-s.startedAtMs)} \xB7 log ${s.logPath}`);return o.push("","Read output so far: `tail -n 50 <log>` (or `crtr node bash list --tail 20`). Abandon one: `crtr node bash kill <job-id>`."),`<background-jobs>
13
+ ${o.join(`
14
14
  `)}
15
- </background-jobs>`}i(X,"backgroundJobsBlock");function gt(t,n,e){const o=t.node_id,s=["You have been revived fresh after a context refresh \u2014 your previous in-memory context is gone, by design. Everything below was just read from disk; it is your full bearings. Rebuild from it and continue toward your goal."];e!==void 0&&s.push(Y(e));const r=C(o),d=r!==null&&r.trim()!=="";if(s.push(`<roadmap file="${G(o)}">
16
- ${d?r.trim():"(no roadmap on disk yet)"}
17
- </roadmap>`),!d&&!F(o)){const c=B(o);c!==null&&c.trim()!==""&&s.push(`<goal file="${y(o)}">
18
- ${c.trim()}
19
- </goal>`)}const l=W(o).filter(c=>c!=="yield-message.md");s.push(`<context-dir path="${h(o)}">
15
+ </background-jobs>`}i(z,"backgroundJobsBlock");function ht(t,e,n){const r=t.node_id,o=["You have been revived fresh after a context refresh \u2014 your previous in-memory context is gone, by design. Everything below was just read from disk; it is your full bearings. Rebuild from it and continue toward your goal."];n!==void 0&&o.push(_(n));const s=O(r);if(!(s!==null&&s.trim()!=="")&&!K(r)){const u=j(r);u!==null&&u.trim()!==""&&o.push(`<goal file="${y(r)}">
16
+ ${u.trim()}
17
+ </goal>`)}const l=F(r).filter(u=>u!=="yield-message.md");o.push(`<context-dir path="${h(r)}">
20
18
  ${l.length>0?l.join(`
21
19
  `):"(empty)"}
22
- </context-dir>`);const a=X(o);a!==null&&s.push(a),s.push(Q(o,n.unreadDigest)),s.push(n.yieldMsg!==null?`<yield-message>
23
- ${n.yieldMsg.trim()}
24
- </yield-message>`:"<yield-message/>");const u=M(o).length>0;return s.push(u?"If there is work to do, perform it. Otherwise stop \u2014 pipe the result to `crtr push final` through a single-quoted heredoc if the goal is met, or end your turn without a message to stay dormant awaiting your workers.":"If there is work to do, perform it. Otherwise end your turn without writing a message \u2014 the user already has your last reply, and a status recap would only bury it. You are working directly with the user, so stay available and continue when they write back."),n.driftGuidance!==null&&s.push(`<persona-transition>
25
- Your role was changed while you were away. ${n.driftGuidance}
26
- </persona-transition>`),_("revive",{},`
27
- ${s.join(`
20
+ </context-dir>`);const a=z(r);a!==null&&o.push(a),o.push(q(r,e.unreadDigest)),o.push(e.yieldMsg!==null?`<yield-message>
21
+ ${e.yieldMsg.trim()}
22
+ </yield-message>`:"<yield-message/>");const g=N(r).length>0;return o.push(g?"If there is work to do, perform it. Otherwise stop \u2014 pipe the result to `crtr push final` through a single-quoted heredoc if the goal is met, or end your turn without a message to stay dormant awaiting your workers.":"If there is work to do, perform it. Otherwise end your turn without writing a message \u2014 the user already has your last reply, and a status recap would only bury it. You are working directly with the user, so stay available and continue when they write back."),e.driftGuidance!==null&&o.push(`<persona-transition>
23
+ Your role was changed while you were away. ${e.driftGuidance}
24
+ </persona-transition>`),k("revive",{},`
25
+ ${o.join(`
28
26
 
29
27
  `)}
30
- `)}i(gt,"buildReviveKickoff");export{ct as RUNTIME_RESTART_CONTINUATION,gt as buildReviveKickoff,pt as captureGoalIfAbsent,ht as clearYieldMessage,mt as drainBearings,y as goalPath,F as hasRetainedReports,W as listContextDir,B as readGoal,K as readYieldMessage,J as writeGoal,ft as writeYieldMessage,b as yieldMessagePath};
28
+ `)}i(ht,"buildReviveKickoff");export{ut as RUNTIME_RESTART_CONTINUATION,ht as buildReviveKickoff,lt as captureGoalIfAbsent,ct as clearYieldMessage,ft as drainBearings,y as goalPath,K as hasRetainedReports,F as listContextDir,j as readGoal,P as readYieldMessage,J as writeGoal,dt as writeYieldMessage,b as yieldMessagePath};
@@ -11,6 +11,13 @@ export interface ResolvedLaunchTarget {
11
11
  launch: Awaited<ReturnType<typeof buildLaunchSpecAsync>>['launch'];
12
12
  }
13
13
  export declare function resolveCreateKind(kind: string | undefined, profile: ProfileEntry | null): string;
14
+ /** The daemon's default kind for an app-started run (`run.start`) whose profile
15
+ * stores no `default_kind` — every app's own default profile, which
16
+ * `ensureAppProfile` creates without one. */
17
+ export declare const RUN_DEFAULT_KIND = "developer";
18
+ /** The kind a `run.start` root gets: its profile's `default_kind`, else
19
+ * {@link RUN_DEFAULT_KIND}. `profile.list` reports this same value. */
20
+ export declare function resolveRunKind(profile: ProfileEntry): string;
14
21
  /** Validate a kind against the same cwd/profile configuration used to build its launch.
15
22
  * Resolution is subprocess-isolated: crtrd is single-threaded and a config read can
16
23
  * block indefinitely on a network filesystem. */
@@ -1 +1 @@
1
- var u=Object.defineProperty;var d=(e,n)=>u(e,"name",{value:n,configurable:!0});import{appSpace as p}from"../layout.js";import{envProfileId as m}from"../../shared/env.js";import{resolve as s}from"node:path";import{getNode as w}from"../canvas/canvas.js";import{usage as v}from"../errors.js";import{assertProfileActive as y}from"../profiles/manifest.js";import{buildLaunchSpecAsync as h,readMergedLaunchConfigAsync as g}from"./launch.js";import{resolveProfileId as k}from"./spawn.js";function x(e,n){return e??n?.manifest.default_kind??"general"}d(x,"resolveCreateKind");async function _(e,n=process.cwd(),t=m()||null){const i=Object.keys((await g(n,t)).kinds);if(!i.includes(e))throw v(`unknown kind: ${e}`,{received:e,next:`Valid kinds: ${i.sort().join(", ")}.`})}d(_,"assertLaunchKind");async function M(e,n={}){const t=e.parent??void 0,i=e.cwd??process.cwd(),o=await k(e.profile,t??null,i,{readOnlySelection:n.readOnlyProfileSelection}),l=y(o),r=x(e.kind,l);await n.validateKind?.(r);const c=C({...e,kind:r},t,o,i);n.validateKind===void 0&&await _(r,c,o);const a=e.mode??"base",f=(await h(r,a,{lifecycle:e.root_lifecycle??(e.root===!0?"resident":"terminal"),hasManager:e.root!==!0,...e.model!==void 0?{model:e.model,modelOverride:!0}:{},cwd:c,profileId:o})).launch;return{profileId:o,profile:l,kind:r,mode:a,cwd:c,launch:f}}d(M,"resolveLaunchTarget");function C(e,n,t,i){if(e.pin_cwd!==void 0&&e.pin_cwd!=="")return s(e.pin_cwd);if(n!=null){const o=w(n);if(o!==null)return o.cwd}return e.cwd!==void 0&&e.cwd!==""?s(e.cwd):process.platform==="linux"?p("terminal").files:i}d(C,"resolveNodeCwd");export{_ as assertLaunchKind,x as resolveCreateKind,M as resolveLaunchTarget,C as resolveNodeCwd};
1
+ var u=Object.defineProperty;var i=(e,n)=>u(e,"name",{value:n,configurable:!0});import{appSpace as p}from"../layout.js";import{envProfileId as m}from"../../shared/env.js";import{resolve as s}from"node:path";import{getNode as w}from"../canvas/canvas.js";import{usage as v}from"../errors.js";import{assertProfileActive as x}from"../profiles/manifest.js";import{buildLaunchSpecAsync as y,readMergedLaunchConfigAsync as _}from"./launch.js";import{resolveProfileId as h}from"./spawn.js";function k(e,n){return e??n?.manifest.default_kind??"general"}i(k,"resolveCreateKind");const g="developer";function D(e){return e.manifest.default_kind??g}i(D,"resolveRunKind");async function K(e,n=process.cwd(),r=m()||null){const t=Object.keys((await _(n,r)).kinds);if(!t.includes(e))throw v(`unknown kind: ${e}`,{received:e,next:`Valid kinds: ${t.sort().join(", ")}.`})}i(K,"assertLaunchKind");async function M(e,n={}){const r=e.parent??void 0,t=e.cwd??process.cwd(),o=await h(e.profile,r??null,t,{readOnlySelection:n.readOnlyProfileSelection}),l=x(o),d=k(e.kind,l);await n.validateKind?.(d);const c=I({...e,kind:d},r,o,t);n.validateKind===void 0&&await K(d,c,o);const a=e.mode??"base",f=(await y(d,a,{lifecycle:e.root_lifecycle??(e.root===!0?"resident":"terminal"),hasManager:e.root!==!0,...e.model!==void 0?{model:e.model,modelOverride:!0}:{},cwd:c,profileId:o})).launch;return{profileId:o,profile:l,kind:d,mode:a,cwd:c,launch:f}}i(M,"resolveLaunchTarget");function I(e,n,r,t){if(e.pin_cwd!==void 0&&e.pin_cwd!=="")return s(e.pin_cwd);if(n!=null){const o=w(n);if(o!==null)return o.cwd}return e.cwd!==void 0&&e.cwd!==""?s(e.cwd):process.platform==="linux"?p("terminal").files:t}i(I,"resolveNodeCwd");export{g as RUN_DEFAULT_KIND,K as assertLaunchKind,k as resolveCreateKind,M as resolveLaunchTarget,I as resolveNodeCwd,D as resolveRunKind};
@@ -0,0 +1,10 @@
1
+ /** End the node's context session: its ledger holds nothing. */
2
+ export declare function clearNodeLedger(nodeId: string): void;
3
+ /** Seed a fork's ledger once with the transcript rows its source holds; no
4
+ * source → empty. A fork already seeded (at spawn, or by an earlier birth
5
+ * attempt) keeps its ledger, so a retry after the source is deleted loses nothing. */
6
+ export declare function forkNodeLedger(forkId: string, sourceId: string | null): void;
7
+ /** Queue one inbox entry for a node revived from done listing the watched
8
+ * documents that got a newer revision (by someone else) since `since`.
9
+ * Returns whether a notice was queued. */
10
+ export declare function noticeChangedWhileDone(nodeId: string, since: string): boolean;
@@ -0,0 +1,3 @@
1
+ var y=Object.defineProperty;var i=(e,o)=>y(e,"name",{value:o,configurable:!0});import{withCanvasWrite as u}from"../canvas/db.js";import{changedWhileDone as $}from"../substrate/delivery/deliver.js";import{queueNodeNotice as L}from"../feed/messages.js";import{clearLedger as f,forkLedger as k,hasLedger as N}from"../graph/exposures.js";import{getById as m,getByRowid as j,nodeObject as c}from"../graph/objects.js";function q(e){u(o=>f(o,c(o,e).rowid))}i(q,"clearNodeLedger");function H(e,o){u(n=>{const r=c(n,e);if(N(n,r.rowid))return;const t=o===null?null:m(n,o);t===null||t.type!=="node"?f(n,r.rowid):k(n,t.rowid,r.rowid)})}i(H,"forkNodeLedger");function d(e){return e===null?"?":e.type==="node"?e.id:e.name}i(d,"ownerHandle");function O(e,o){return u(n=>{const r=$(n,c(n,e),o);if(r.length===0)return!1;const t=r.map(({doc:l,from:g,to:w,authors:a})=>{const h=l.owner===null?null:j(n,l.owner),s=a.length===0?"":`, by ${a.map(p=>d(m(n,p))).join(", ")}`;return`- ${d(h)}/${l.name} \u2014 revision ${g??"none"} \u2192 ${w}${s}`});return L(n,e,{body:`Documents you watch changed while you were done:
2
+ ${t.join(`
3
+ `)}`,label:"documents changed while you were done",tier:"normal",wake:0}),!0})}i(O,"noticeChangedWhileDone");export{q as clearNodeLedger,H as forkNodeLedger,O as noticeChangedWhileDone};
@@ -1,2 +1,2 @@
1
- var S=Object.defineProperty;var a=(t,e)=>S(t,"name",{value:e,configurable:!0});import{getNode as k,cancelCronsOnWake as A,transitionStatusIntent as N}from"../canvas/index.js";import{readExternalActionDelivery as _}from"../canvas/deliveries.js";import{composeNodeOutcomeDocument as b}from"./outcome-document.js";const f="*",J={finish:"finished",park:"parked",cancel:"stranded",crash:"crashed","refresh-launch":null,revive:null},c=["active","idle"],v={finish:{status:"done",intent:"done",from:c},park:{status:"done",intent:"parked",from:c},cancel:{status:"canceled",intent:null,from:f},crash:{status:"dead",from:c},yield:{intent:"refresh",from:c},release:{status:"idle",intent:"idle-release",from:[...c,"done"]},"refresh-launch":{status:"active",intent:"refresh",from:f},revive:{status:"active",intent:null,from:f}};function E(t,e){const r=t.split(`
2
- `)[0]??"";let n=0,u="";for(const l of r){const i=Buffer.byteLength(l,"utf8");if(n+i>e)break;n+=i,u+=l}return u}a(E,"firstLineAtMost");function R(t){if(t===void 0)return null;const e=t.message===void 0?void 0:E(t.message,500),r={...t,...e===void 0?{}:{message:e}},n=JSON.stringify(r);return Buffer.byteLength(n,"utf8")<=4*1024?n:JSON.stringify({schema:"crtr.node-outcome-detail/v1",truncated:!0,...e===void 0?{}:{message:e}})}a(R,"detailJson");function $(t){const e=_(`node-outcome:${t}`);if(e===null||e.state!=="armed")return null;const r=e.adapter;if(r?.adapter!=="subprocess"||!Array.isArray(r.argv)||!r.argv.every(n=>typeof n=="string")||typeof r.cwd!="string")throw new Error(`outcome delivery ${e.deliveryId} has an invalid subprocess adapter`);return{name:e.destinationId,payload:r.payload??null}}a($,"armedOutcomeAction");function x(t,e){let r,n;return e==="finished"||e==="declined"?(r="done",n="done"):e==="parked"?(r="done",n="parked"):e==="closed"||e==="retired"||e==="stranded"||e==="deadline_exceeded"?(r="canceled",n=null):(r="dead",n=null),{...t,status:r,intent:n,terminal_reason:e}}a(x,"nodeAtOutcome");function B(t,e,r){const n=v[e],u=Object.prototype.hasOwnProperty.call(n,"status"),l=Object.prototype.hasOwnProperty.call(n,"intent"),i=r?.reason??J[e],d={};u&&(d.status=n.status),l&&(d.intent=n.intent??null),i!==void 0&&(d.terminal_reason=i);const m=e==="finish"||e==="park"||e==="cancel"||e==="crash",o=m?k(t):null,p=m&&o?.kind!=="human",h=i,g=m?new Date().toISOString():null,O=R(r?.outcome?.detail),w=p&&o?.run_id!=null&&i!=="parked"&&o.outcome_at!==null&&(c.includes(o.status)||o.outcome_reason==="parked");let y;if(p&&o!==null&&(o.outcome_at===null||w)){const s=$(t);s!==null&&(y=JSON.stringify(b({node:x(o,h),outcome:{kind:"failure",reason:h,at:g,revision:(o.outcome_revision??0)+1,detailJson:O},action:s})))}if(N(t,d,{fromStatuses:n.from===f?void 0:n.from,requireNoFinalReport:e==="cancel",...p?{outcome:{kind:"failure",reason:h,detailJson:O,at:g,...w?{supersede:!0}:{},...y===void 0?{}:{documentJson:y}}}:{}})===0){const s=k(t);if(s===null)throw new Error(`transition: unknown node ${t}`);if(e==="cancel"&&s.final_report!==null&&s.final_report!==void 0)return s;throw new Error(`illegal lifecycle transition: '${e}' from status='${s.status}' (node ${t})`)}return(e==="finish"||e==="park"||e==="cancel")&&A(t),k(t)}a(B,"transition");function I(t){return t.status==="done"&&t.intent==="parked"}a(I,"isParked");export{I as isParked,B as transition};
1
+ var A=Object.defineProperty;var a=(t,e)=>A(t,"name",{value:e,configurable:!0});import{getNode as g,cancelCronsOnWake as N,transitionStatusIntent as _}from"../canvas/index.js";import{readExternalActionDelivery as b}from"../canvas/deliveries.js";import{composeNodeOutcomeDocument as v}from"./outcome-document.js";import{withCanvasWrite as J}from"../canvas/db.js";import{nodeObject as E}from"../graph/objects.js";import{endMessageSubscriptions as R}from"../graph/watches.js";const m="*",$={finish:"finished",park:"parked",cancel:"stranded",crash:"crashed","refresh-launch":null,revive:null},c=["active","idle"],x={finish:{status:"done",intent:"done",from:c},park:{status:"done",intent:"parked",from:c},cancel:{status:"canceled",intent:null,from:m},crash:{status:"dead",from:c},yield:{intent:"refresh",from:c},release:{status:"idle",intent:"idle-release",from:[...c,"done"]},"refresh-launch":{status:"active",intent:"refresh",from:m},revive:{status:"active",intent:null,from:m}};function L(t,e){const r=t.split(`
2
+ `)[0]??"";let n=0,u="";for(const l of r){const i=Buffer.byteLength(l,"utf8");if(n+i>e)break;n+=i,u+=l}return u}a(L,"firstLineAtMost");function D(t){if(t===void 0)return null;const e=t.message===void 0?void 0:L(t.message,500),r={...t,...e===void 0?{}:{message:e}},n=JSON.stringify(r);return Buffer.byteLength(n,"utf8")<=4*1024?n:JSON.stringify({schema:"crtr.node-outcome-detail/v1",truncated:!0,...e===void 0?{}:{message:e}})}a(D,"detailJson");function j(t){const e=b(`node-outcome:${t}`);if(e===null||e.state!=="armed")return null;const r=e.adapter;if(r?.adapter!=="subprocess"||!Array.isArray(r.argv)||!r.argv.every(n=>typeof n=="string")||typeof r.cwd!="string")throw new Error(`outcome delivery ${e.deliveryId} has an invalid subprocess adapter`);return{name:e.destinationId,payload:r.payload??null}}a(j,"armedOutcomeAction");function M(t,e){let r,n;return e==="finished"||e==="declined"?(r="done",n="done"):e==="parked"?(r="done",n="parked"):e==="closed"||e==="retired"||e==="stranded"||e==="deadline_exceeded"?(r="canceled",n=null):(r="dead",n=null),{...t,status:r,intent:n,terminal_reason:e}}a(M,"nodeAtOutcome");function I(t,e,r){const n=x[e],u=Object.prototype.hasOwnProperty.call(n,"status"),l=Object.prototype.hasOwnProperty.call(n,"intent"),i=r?.reason??$[e],d={};u&&(d.status=n.status),l&&(d.intent=n.intent??null),i!==void 0&&(d.terminal_reason=i);const f=e==="finish"||e==="park"||e==="cancel"||e==="crash",s=f?g(t):null,p=f&&s?.kind!=="human",h=i,k=f?new Date().toISOString():null,O=D(r?.outcome?.detail),w=p&&s?.run_id!=null&&i!=="parked"&&s.outcome_at!==null&&(c.includes(s.status)||s.outcome_reason==="parked");let y;if(p&&s!==null&&(s.outcome_at===null||w)){const o=j(t);o!==null&&(y=JSON.stringify(v({node:M(s,h),outcome:{kind:"failure",reason:h,at:k,revision:(s.outcome_revision??0)+1,detailJson:O},action:o})))}if(J(o=>{const S=_(t,d,{fromStatuses:n.from===m?void 0:n.from,requireNoFinalReport:e==="cancel",...p?{outcome:{kind:"failure",reason:h,detailJson:O,at:k,...w?{supersede:!0}:{},...y===void 0?{}:{documentJson:y}}}:{}});return f&&S>0&&R(o,E(o,t),"done"),S})===0){const o=g(t);if(o===null)throw new Error(`transition: unknown node ${t}`);if(e==="cancel"&&o.final_report!==null&&o.final_report!==void 0)return o;throw new Error(`illegal lifecycle transition: '${e}' from status='${o.status}' (node ${t})`)}return(e==="finish"||e==="park"||e==="cancel")&&N(t),g(t)}a(I,"transition");function V(t){return t.status==="done"&&t.intent==="parked"}a(V,"isParked");export{V as isParked,I as transition};
@@ -48,6 +48,9 @@ export interface NodeContext {
48
48
  * runs with CRTR_NODE_ID set; its own `crtr` invocations spawn children under
49
49
  * it by reading CRTR_NODE_ID as the parent. */
50
50
  export declare function currentNodeContext(): NodeContext;
51
+ /** Whether a node's broker admits inbox mail only between agent runs: an
52
+ * app-started run and its descendants, never a person's terminal node. */
53
+ export declare function inboxBetweenTurns(meta: Pick<NodeMeta, 'run_id' | 'grantee'>): boolean;
51
54
  /** The env injected into a node's pi process. Self-gating extensions read
52
55
  * CRTR_KIND/CRTR_MODE to flip behavior on polymorph without a respawn; the
53
56
  * feed/inbox machinery reads CRTR_NODE_ID. */
@@ -62,10 +65,15 @@ export interface SpawnNodeOpts {
62
65
  description?: string;
63
66
  /** Parent node id: the spine manager. Omit for a user-opened root. */
64
67
  parent?: string | null;
65
- /** Actor that created this node. Unlike parent (manager) and spawnedBy
66
- * (audit provenance), it decides whether the parent gets a birth notice.
68
+ /** Node that created this node. Unlike parent (manager) and spawnedBy
69
+ * (audit provenance), it is the actor of `created`, so the parent is pushed
70
+ * `created` only when someone else created the child.
67
71
  * Null/omitted means an external process. */
68
72
  creator?: string | null;
73
+ /** Node acting when neither creator nor parent is (a node forking another). */
74
+ actor?: string | null;
75
+ /** Node whose watches the new node copies (`fork`, never in the tree). */
76
+ forkSourceNode?: string | null;
69
77
  /** Who spawned me (the `spawned_by` provenance edge), when it differs from
70
78
  * `parent` — e.g. an independent root (parent=null) still records its
71
79
  * spawner. Defaults to `parent`. */
@@ -1 +1 @@
1
- var $=Object.defineProperty;var o=(e,r)=>$(e,"name",{value:r,configurable:!0});import{envHomeOverride as A,envRuntimeHomeOverride as M,scopeAllowed as m}from"../../shared/env.js";import{validateScopes as B}from"../scopes.js";import{activeGrant as N,terminalGrant as w}from"../grants/mirror.js";import{appendRunEvent as F}from"../runs/events.js";import{readConfig as h}from"../config.js";import{InputError as v}from"../io.js";import{randomBytes as P}from"node:crypto";import{existsSync as H,mkdirSync as U}from"node:fs";import{createNode as L,assertRunNotDeleting as j,conversationOwner as q,getNode as s,getRow as G,subscribe as J,recordSpawn as K,subscribersOf as W}from"../canvas/index.js";import{memoryDir as z}from"./memory.js";import{ensureAppSpace as X}from"../spaces/space.js";import{LAUNCHER_SOCKET as Y}from"../../launcher/spec.js";import{resolveInstallId as Q}from"../canvas/install-id.js";import{canvasDbPath as V,contextDir as Z}from"../canvas/paths.js";import{conversationIdFromPath as ee}from"../conversation-store/index.js";import{usage as T}from"../errors.js";import{assertProfileAvailableForBirth as ne}from"../profiles/deletion-reservation.js";import{loadExactProfileManifest as re}from"../profiles/manifest.js";import{admitNodeCreate as ie}from"../command-hooks/lifecycle-create.js";import{fanDoctrineWake as te}from"./close.js";import{BIRTH_ANNOUNCEMENT_MARKER as oe,birthAnnouncementBody as le}from"../../shared/birth-announcement.js";let E;const D=new Map;function Be(e){E=e}o(Be,"setInstallId");function de(){if(E!==void 0)return E;const e=V(),r=D.get(e);if(r!==void 0)return r;const i=Q();return D.set(e,i),i}o(de,"installId");function ae(){return`${Date.now().toString(36)}-${P(4).toString("hex")}`}o(ae,"newJobId");function se(){return`${de()}-${ae()}`}o(se,"newNodeId");const C=128,ce=/^[a-z0-9-]+$/;class S extends Error{static{o(this,"NodeIdConflictError")}nodeId;constructor(r){super(`node already exists: ${r}`),this.nodeId=r,this.name="NodeIdConflictError"}}function I(e){if(e.length===0||e.length>C)throw T(`invalid --node-id '${e}': must be 1-${C} characters`,{next:`Pass an id-safe string (lowercase letters, digits, hyphens) of at most ${C} characters.`});if(!ce.test(e))throw T(`invalid --node-id '${e}': must contain only lowercase letters, digits, and hyphens (e.g. 'remote42', 'my-node-1')`,{next:"Use only lowercase letters, digits, and hyphens."})}o(I,"validateNodeIdFormat");function Fe(e){if(I(e),s(e)!==null)throw new S(e)}o(Fe,"preflightNodeId");function ue(e){if(I(e),s(e)!==null)throw new S(e);return e}o(ue,"validatedExplicitNodeId");function Pe(e){let r=e;const i=new Set;for(;;){if(i.has(r))return r;i.add(r);const t=G(r);if(t===null||t.parent==null)return r;r=t.parent}}o(Pe,"rootOfSpine");function He(){const e=process.env;return{nodeId:e.CRTR_NODE_ID??null,kind:e.CRTR_KIND??null,mode:e.CRTR_MODE??null}}o(He,"currentNodeContext");function Ue(e){const r={CRTR_NODE_ID:e.node_id,CRTR_KIND:e.kind,CRTR_MODE:e.mode,CRTR_LIFECYCLE:e.lifecycle,CRTR_NODE_CWD:e.cwd,CRTR_CONTEXT_DIR:Z(e.node_id,e.grantee),CRTR_CYCLES:(e.cycles??0).toString(),CRTR_PROFILE_ID:e.profile_id??"",PI_CLAUDE_OAUTH_REINJECT_SCOPE:"never"};e.parent&&(r.CRTR_PARENT_NODE_ID=e.parent),e.run_id&&(r.CRTR_RUN_ID=e.run_id),e.scopes!==null&&e.scopes!==void 0&&(r.CRTR_SCOPES=e.scopes.join(",")),r.CRTR_GRANTEE=e.grantee??"app:terminal";const i=A();i!==void 0&&i!==""&&(r.CRTR_HOME=i);const t=M();t!==void 0&&t!==""&&(r.CRTR_RUNTIME_HOME=t);const a=process.env.CRTR_SUBTREE;return a!==void 0&&a!==""&&(r.CRTR_SUBTREE=a),{...r,...e.launch?.env??{}}}o(Ue,"nodeEnv");function fe(e){const r=ee(e),i=r===null?null:q(r);return i===null?null:s(i)}o(fe,"forkSourceNode");async function Le(e){const r=e.nodeId!==void 0?(I(e.nodeId),e.nodeId):se(),i=e.parent??null,t=i===null,a=e.spawnedBy??i,c=e.creator??null,y=e.mode??"base",R=e.lifecycle??(t?"resident":"terminal"),_=e.run===void 0?w():null;if(e.run===void 0&&h("user").runtime?.issuer&&_===null)throw new Error("terminal grant is not active");const n={node_id:r,name:e.name??e.kind,description:e.description,cycles:0,created:new Date().toISOString(),cwd:e.cwd,host_kind:"broker",profile_id:e.profile_id??null,kind:e.kind,mode:y,lifecycle:R,persona_ack:{kind:e.kind,mode:y,lifecycle:R},status:"active",parent:i,spawned_by:a,creator:c,fork_from:e.forkFrom,fork_source_file:e.forkSourceFile,review_binding:e.reviewBinding,model_override:e.modelOverride??null,scopes:e.scopes??null,grantee:e.run?.grantee??"app:terminal",sub:e.run?.sub??_?.sub??null,grant_id:e.run?.grant_id??_?.id??null,client_id:e.run?.client_id??null,metadata_json:t?e.run?.metadata_json??null:null,run_id:t?r:e.run?.run_id??null,event_cursor:t?e.run?.event_cursor??1:null,usage_json:t?e.run?.usage_json??JSON.stringify({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}):null,passive_default:e.passiveDefault??!1,...e.managedWorktree!==void 0?{managed_worktree:e.managedWorktree}:{},intent:null,deadline_at:e.deadlineAt??null,pi_session_id:null,pi_session_file:null,launch:e.launch},p=e.scopes===void 0?void 0:B(e.scopes),g=i===null?null:s(i);if(i!==null&&g===null)throw new Error(`cannot spawn under unknown parent node: ${i}`);if(g?.run_id&&s(g.run_id)?.deleting_at)throw new Error("run is deleting");const k=c===null?null:s(c);if(c!==null&&k===null)throw new Error(`cannot spawn from unknown creator node: ${c}`);const O=e.forkSourceFile==null?null:fe(e.forkSourceFile),b=e.replaces==null?null:s(e.replaces),l=g??O??b??k??(a===null?null:s(a));if(l!==null){const u=l.grantee==="app:terminal"?w():l.grant_id?N(l.grant_id):null,d=l.grantee==="app:terminal"&&!h("user").runtime?.issuer;if(p!==void 0&&!p.every(f=>m(l.scopes,f)&&(u?m(u.resolved,f):d)))throw new v({error:"unknown_scope",message:"child scopes must be covered by the creating node and its current grant",received:p,field:"scopes",next:"Request only scopes the creating node currently holds."});if(n.scopes=p??l.scopes??null,n.scopes?.includes("crtr:act")&&!m(n.scopes,"crtr:llm"))throw new v({error:"invalid_scope",message:"crtr:act requires crtr:llm",received:n.scopes,field:"scopes",next:"Include crtr:llm or omit crtr:act."});n.grantee=l.grantee==="user:local"?"app:terminal":l.grantee,n.sub=l.sub??_?.sub??null,n.grant_id=l.grant_id??_?.id??null,n.client_id=l.client_id,n.run_id=t?r:l.run_id??null}if(n.profile_id){const u=re(n.profile_id).manifest.grantee??"app:terminal";if(u!==n.grantee){const d=`crtr:memory:rw:${u}:profile:${n.profile_id}`,f=n.grantee==="app:terminal"?w():n.grant_id?N(n.grant_id):null;if(!(n.grantee==="app:terminal"&&!h("user").runtime?.issuer)&&(!f||f.grantee!==n.grantee||!m(f.resolved,d))||!m(n.scopes,d))throw new v({error:"scope_missing",message:`missing scope ${d}`,received:n.profile_id,field:"profile",next:"Select a profile covered by this run and its current grant."})}}if(ne(n.profile_id??null),!n.grantee)throw new Error("node creation requires an app");const x=await ie({kind:n.kind,mode:n.mode,cwd:n.cwd,profile:n.profile_id??null,root:t,parentId:i,requestingNodeId:c,lifecycle:R,replaces:e.replaces??null},n.grantee);try{e.nodeId!==void 0&&ue(e.nodeId),await e.beforeCreate?.(),(process.platform!=="linux"||H(Y))&&await X(n.grantee??"app:terminal"),L(n,{outcomeDelivery:e.outcomeDelivery,withinCreate:o((u,d)=>{d.run_id&&d.run_id!==d.node_id&&j(u,d.run_id),t&&e.run===void 0&&F(u,r,r,"run.started",{scopes:d.scopes,payer:"user",usage:JSON.parse(d.usage_json)}),e.withinCreate?.(u,d)},"withinCreate")})}finally{x()}if(n.kind!=="human"&&U(z(n.node_id,n.grantee),{recursive:!0}),i!==null&&e.subscribe!==!1&&J(i,n.node_id,!0),i!==null&&c!==i)try{te(n.node_id,W(n.node_id),`Child created \u2014 ${n.name} (${n.node_id}, ${n.kind})`,{birth_announcement:oe,body:le({name:n.name,nodeId:n.node_id,kind:n.kind,creator:c===null?"an external process":s(c).name})},"deferred")}catch{}return a!=null&&s(a)!==null&&K(n.node_id,a),n}o(Le,"spawnNode");export{S as NodeIdConflictError,He as currentNodeContext,fe as forkSourceNode,ae as newJobId,se as newNodeId,Ue as nodeEnv,Fe as preflightNodeId,Pe as rootOfSpine,Be as setInstallId,Le as spawnNode};
1
+ var M=Object.defineProperty;var l=(e,n)=>M(e,"name",{value:n,configurable:!0});import{envHomeOverride as P,envRuntimeHomeOverride as U,INBOX_BETWEEN_TURNS_ENV as j,scopeAllowed as m}from"../../shared/env.js";import{validateScopes as H}from"../scopes.js";import{activeGrant as D,terminalGrant as v}from"../grants/mirror.js";import{appendRunEvent as L}from"../runs/events.js";import{readConfig as E}from"../config.js";import{InputError as C}from"../io.js";import{randomBytes as G}from"node:crypto";import{existsSync as W}from"node:fs";import{createNode as q,assertRunNotDeleting as J,conversationOwner as K,getNode as f,getRow as X}from"../canvas/index.js";import{ensureAppSpace as z}from"../spaces/space.js";import{LAUNCHER_SOCKET as Y}from"../../launcher/spec.js";import{resolveInstallId as V}from"../canvas/install-id.js";import{canvasDbPath as Q,contextDir as Z}from"../canvas/paths.js";import{conversationIdFromPath as ee}from"../conversation-store/index.js";import{usage as O}from"../errors.js";import{assertProfileAvailableForBirth as ne}from"../profiles/deletion-reservation.js";import{loadExactProfileManifest as re}from"../profiles/manifest.js";import{admitNodeCreate as ie}from"../command-hooks/lifecycle-create.js";import{getById as te,nodeObject as w,ownerForGrantee as oe}from"../graph/objects.js";import{recordActedOn as le}from"../graph/edges.js";import{recordWatch as ae,copyWatchesForFork as ce}from"../graph/watches.js";import{publish as de}from"../graph/events.js";let N;const x=new Map;function je(e){N=e}l(je,"setInstallId");function se(){if(N!==void 0)return N;const e=Q(),n=x.get(e);if(n!==void 0)return n;const i=V();return x.set(e,i),i}l(se,"installId");function ue(){return`${Date.now().toString(36)}-${G(4).toString("hex")}`}l(ue,"newJobId");function fe(){return`${se()}-${ue()}`}l(fe,"newNodeId");const I=128,_e=/^[a-z0-9-]+$/;class $ extends Error{static{l(this,"NodeIdConflictError")}nodeId;constructor(n){super(`node already exists: ${n}`),this.nodeId=n,this.name="NodeIdConflictError"}}function T(e){if(e.length===0||e.length>I)throw O(`invalid --node-id '${e}': must be 1-${I} characters`,{next:`Pass an id-safe string (lowercase letters, digits, hyphens) of at most ${I} characters.`});if(!_e.test(e))throw O(`invalid --node-id '${e}': must contain only lowercase letters, digits, and hyphens (e.g. 'remote42', 'my-node-1')`,{next:"Use only lowercase letters, digits, and hyphens."})}l(T,"validateNodeIdFormat");function He(e){if(T(e),f(e)!==null)throw new $(e)}l(He,"preflightNodeId");function me(e){if(T(e),f(e)!==null)throw new $(e);return e}l(me,"validatedExplicitNodeId");function Le(e){let n=e;const i=new Set;for(;;){if(i.has(n))return n;i.add(n);const a=X(n);if(a===null||a.parent==null)return n;n=a.parent}}l(Le,"rootOfSpine");function Ge(){const e=process.env;return{nodeId:e.CRTR_NODE_ID??null,kind:e.CRTR_KIND??null,mode:e.CRTR_MODE??null}}l(Ge,"currentNodeContext");function pe(e){return!!e.run_id&&(e.grantee??"app:terminal")!=="app:terminal"}l(pe,"inboxBetweenTurns");function We(e){const n={CRTR_NODE_ID:e.node_id,CRTR_KIND:e.kind,CRTR_MODE:e.mode,CRTR_LIFECYCLE:e.lifecycle,CRTR_NODE_CWD:e.cwd,CRTR_CONTEXT_DIR:Z(e.node_id,e.grantee),CRTR_CYCLES:(e.cycles??0).toString(),CRTR_PROFILE_ID:e.profile_id??"",PI_CLAUDE_OAUTH_REINJECT_SCOPE:"never"};e.parent&&(n.CRTR_PARENT_NODE_ID=e.parent),e.run_id&&(n.CRTR_RUN_ID=e.run_id),pe(e)&&(n[j]="1"),e.scopes!==null&&e.scopes!==void 0&&(n.CRTR_SCOPES=e.scopes.join(",")),n.CRTR_GRANTEE=e.grantee??"app:terminal";const i=P();i!==void 0&&i!==""&&(n.CRTR_HOME=i);const a=U();a!==void 0&&a!==""&&(n.CRTR_RUNTIME_HOME=a);const s=process.env.CRTR_SUBTREE;return s!==void 0&&s!==""&&(n.CRTR_SUBTREE=s),{...n,...e.launch?.env??{}}}l(We,"nodeEnv");function ge(e){const n=ee(e),i=n===null?null:K(n);return i===null?null:f(i)}l(ge,"forkSourceNode");async function qe(e){const n=e.nodeId!==void 0?(T(e.nodeId),e.nodeId):fe(),i=e.parent??null,a=i===null,s=e.spawnedBy??i,u=e.creator??null,k=e.mode??"base",h=e.lifecycle??(a?"resident":"terminal"),_=e.run===void 0?v():null;if(e.run===void 0&&E("user").runtime?.issuer&&_===null)throw new Error("terminal grant is not active");const r={node_id:n,name:e.name??e.kind,description:e.description,cycles:0,created:new Date().toISOString(),cwd:e.cwd,host_kind:"broker",profile_id:e.profile_id??null,kind:e.kind,mode:k,lifecycle:h,persona_ack:{kind:e.kind,mode:k,lifecycle:h},status:"active",parent:i,spawned_by:s,creator:u,fork_from:e.forkFrom,fork_source_file:e.forkSourceFile,review_binding:e.reviewBinding,model_override:e.modelOverride??null,scopes:e.scopes??null,grantee:e.run?.grantee??"app:terminal",sub:e.run?.sub??_?.sub??null,grant_id:e.run?.grant_id??_?.id??null,client_id:e.run?.client_id??null,metadata_json:a?e.run?.metadata_json??null:null,run_id:a?n:e.run?.run_id??null,event_cursor:a?e.run?.event_cursor??1:null,usage_json:a?e.run?.usage_json??JSON.stringify({input_tokens:0,output_tokens:0,cache_read_tokens:0,cache_write_tokens:0,cost_usd:0}):null,passive_default:e.passiveDefault??!1,...e.managedWorktree!==void 0?{managed_worktree:e.managedWorktree}:{},intent:null,deadline_at:e.deadlineAt??null,pi_session_id:null,pi_session_file:null,launch:e.launch},p=e.scopes===void 0?void 0:H(e.scopes),g=i===null?null:f(i);if(i!==null&&g===null)throw new Error(`cannot spawn under unknown parent node: ${i}`);if(g?.run_id&&f(g.run_id)?.deleting_at)throw new Error("run is deleting");const y=u===null?null:f(u);if(u!==null&&y===null)throw new Error(`cannot spawn from unknown creator node: ${u}`);const b=e.forkSourceFile==null?null:ge(e.forkSourceFile),A=e.replaces==null?null:f(e.replaces),c=g??b??A??y??(s===null?null:f(s));if(c!==null){const t=c.grantee==="app:terminal"?v():c.grant_id?D(c.grant_id):null,o=c.grantee==="app:terminal"&&!E("user").runtime?.issuer;if(p!==void 0&&!p.every(d=>m(c.scopes,d)&&(t?m(t.resolved,d):o)))throw new C({error:"unknown_scope",message:"child scopes must be covered by the creating node and its current grant",received:p,field:"scopes",next:"Request only scopes the creating node currently holds."});if(r.scopes=p??c.scopes??null,r.scopes?.includes("crtr:act")&&!m(r.scopes,"crtr:llm"))throw new C({error:"invalid_scope",message:"crtr:act requires crtr:llm",received:r.scopes,field:"scopes",next:"Include crtr:llm or omit crtr:act."});r.grantee=c.grantee==="user:local"?"app:terminal":c.grantee,r.sub=c.sub??_?.sub??null,r.grant_id=c.grant_id??_?.id??null,r.client_id=c.client_id,r.run_id=a?n:c.run_id??null}if(r.profile_id){const t=re(r.profile_id).manifest.grantee??"app:terminal";if(t!==r.grantee){const o=`crtr:memory:rw:${t}:profile:${r.profile_id}`,d=r.grantee==="app:terminal"?v():r.grant_id?D(r.grant_id):null;if(!(r.grantee==="app:terminal"&&!E("user").runtime?.issuer)&&(!d||d.grantee!==r.grantee||!m(d.resolved,o))||!m(r.scopes,o))throw new C({error:"scope_missing",message:`missing scope ${o}`,received:r.profile_id,field:"profile",next:"Select a profile covered by this run and its current grant."})}}if(ne(r.profile_id??null),!r.grantee)throw new Error("node creation requires an app");const B=await ie({kind:r.kind,mode:r.mode,cwd:r.cwd,profile:r.profile_id??null,root:a,parentId:i,requestingNodeId:u,lifecycle:h,replaces:e.replaces??null},r.grantee),F=l((t,o)=>{const d=w(t,o.node_id),R=u??i??e.actor??s??null,S=R!==null&&te(t,R)?.type==="node"?w(t,R):oe(t,e.run===void 0?"user:local":o.grantee);le(t,S,d),i!==null&&e.subscribe!==!1&&ae(t,w(t,i),d,"spawn"),e.forkSourceNode&&ce(t,w(t,e.forkSourceNode),d),de(t,{event:"created",object:d,actor:S,level:4,attrs:{name:o.name,kind:o.kind,creator:u??null}})},"recordBirth");try{e.nodeId!==void 0&&me(e.nodeId),await e.beforeCreate?.(),(process.platform!=="linux"||W(Y))&&await z(r.grantee??"app:terminal"),q(r,{outcomeDelivery:e.outcomeDelivery,withinCreate:l((t,o)=>{o.run_id&&o.run_id!==o.node_id&&J(t,o.run_id),a&&e.run===void 0&&L(t,n,n,"run.started",{scopes:o.scopes,payer:"user",usage:JSON.parse(o.usage_json)}),e.withinCreate?.(t,o),F(t,o)},"withinCreate")})}finally{B()}return r}l(qe,"spawnNode");export{$ as NodeIdConflictError,Ge as currentNodeContext,ge as forkSourceNode,pe as inboxBetweenTurns,ue as newJobId,fe as newNodeId,We as nodeEnv,He as preflightNodeId,Le as rootOfSpine,je as setInstallId,qe as spawnNode};
@@ -21,9 +21,9 @@ export interface NodeOutcomeDocumentV1 {
21
21
  spawnedBy: string | null;
22
22
  };
23
23
  result?: {
24
+ /** The final report document's ref (`<nodeId>/reports/<name>`), read with `crtr canvas read`. */
24
25
  finalReport: {
25
- basename: string;
26
- path: string;
26
+ name: string;
27
27
  };
28
28
  structuredResult?: unknown;
29
29
  structuredResultOmitted?: true;
@@ -1 +1 @@
1
- var f=Object.defineProperty;var s=(t,e)=>f(t,"name",{value:e,configurable:!0});import{contextDir as m,reportsDir as p}from"../canvas/node-agent-paths.js";import{readOutputResult as y}from"./structured-output.js";const _=256*1024;function R(t,e){try{return y(t,e)}catch{return}}s(R,"structuredResult");function h(t){if(t===null)return null;try{return JSON.parse(t)}catch{return null}}s(h,"parseDetail");function c(t){if(Buffer.byteLength(t,"utf8")<=1024)return t;const n="\u2026";let l=Buffer.byteLength(n,"utf8"),r="";for(const d of t){const i=Buffer.byteLength(d,"utf8");if(l+i>1024)break;l+=i,r+=d}return`${r}${n}`}s(c,"truncateDescription");function $(t){const{node:e,outcome:n,action:l}=t,r=h(n.detailJson),d=t.finalReport??e.final_report??"",i=c(e.name),o=e.description===void 0?void 0:c(e.description),a=n.kind==="result"?t.structuredResult===void 0?R(e.node_id,e.grantee):t.structuredResult:void 0,u={schema:"crtr.node-outcome/v1",outcomeId:`${e.node_id}:${n.revision}`,nodeId:e.node_id,revision:n.revision,kind:n.kind,reason:n.reason,settledAt:n.at,node:{name:i,...o===void 0?{}:{description:o},kind:e.kind,mode:e.mode,lifecycle:e.lifecycle,status:e.status,terminalReason:e.terminal_reason??null,cwd:e.cwd,createdAt:e.created,parent:e.parent??null,spawnedBy:e.spawned_by??null},...n.kind==="result"?{result:{finalReport:{basename:d,path:`${p(e.node_id)}/${d}`},...a===void 0?{}:{structuredResult:a}}}:{failure:{message:r?.message??null,faultKind:r?.fault_kind??null,errorClass:r?.error_class??null,respawnFailures:r?.respawn_failures??null,deadline:r?.deadline===void 0?null:{deadlineAt:r.deadline.deadline_at,elapsedMs:r.deadline.elapsed_ms},declined:r?.declined??null}},action:l,delivery:{attempt:0}};return Buffer.byteLength(JSON.stringify(u),"utf8")>_&&u.result?.structuredResult!==void 0&&(delete u.result.structuredResult,u.result.structuredResultOmitted=!0,u.result.structuredResultPath=`${m(e.node_id,e.grantee)}/result.json`),u}s($,"composeNodeOutcomeDocument");export{$ as composeNodeOutcomeDocument};
1
+ var f=Object.defineProperty;var d=(t,e)=>f(t,"name",{value:e,configurable:!0});import{contextDir as m}from"../canvas/node-agent-paths.js";import{readOutputResult as p}from"./structured-output.js";const y=256*1024;function _(t,e){try{return p(t,e)}catch{return}}d(_,"structuredResult");function R(t){if(t===null)return null;try{return JSON.parse(t)}catch{return null}}d(R,"parseDetail");function c(t){if(Buffer.byteLength(t,"utf8")<=1024)return t;const n="\u2026";let s=Buffer.byteLength(n,"utf8"),r="";for(const l of t){const i=Buffer.byteLength(l,"utf8");if(s+i>1024)break;s+=i,r+=l}return`${r}${n}`}d(c,"truncateDescription");function b(t){const{node:e,outcome:n,action:s}=t,r=R(n.detailJson),l=t.finalReport??e.final_report??"",i=c(e.name),o=e.description===void 0?void 0:c(e.description),a=n.kind==="result"?t.structuredResult===void 0?_(e.node_id,e.grantee):t.structuredResult:void 0,u={schema:"crtr.node-outcome/v1",outcomeId:`${e.node_id}:${n.revision}`,nodeId:e.node_id,revision:n.revision,kind:n.kind,reason:n.reason,settledAt:n.at,node:{name:i,...o===void 0?{}:{description:o},kind:e.kind,mode:e.mode,lifecycle:e.lifecycle,status:e.status,terminalReason:e.terminal_reason??null,cwd:e.cwd,createdAt:e.created,parent:e.parent??null,spawnedBy:e.spawned_by??null},...n.kind==="result"?{result:{finalReport:{name:`${e.node_id}/${l}`},...a===void 0?{}:{structuredResult:a}}}:{failure:{message:r?.message??null,faultKind:r?.fault_kind??null,errorClass:r?.error_class??null,respawnFailures:r?.respawn_failures??null,deadline:r?.deadline===void 0?null:{deadlineAt:r.deadline.deadline_at,elapsedMs:r.deadline.elapsed_ms},declined:r?.declined??null}},action:s,delivery:{attempt:0}};return Buffer.byteLength(JSON.stringify(u),"utf8")>y&&u.result?.structuredResult!==void 0&&(delete u.result.structuredResult,u.result.structuredResultOmitted=!0,u.result.structuredResultPath=`${m(e.node_id,e.grantee)}/result.json`),u}d(b,"composeNodeOutcomeDocument");export{b as composeNodeOutcomeDocument};
@@ -1,2 +1,2 @@
1
- var c=Object.defineProperty;var a=(o,e)=>c(o,"name",{value:e,configurable:!0});import{getNode as s,updateNode as l}from"../canvas/index.js";import{readRoadmap as d,roadmapPath as u}from"./roadmap.js";import{orchestratorContextNote as m}from"./bearings.js";function f(o,e,r){const t=d(o)??"(no roadmap yet)",n=u(o),i=[`You are now a ${e.toUpperCase()} ORCHESTRATOR. Your scarce resource is your own context window.`,"Your job is to manage context and delegate \u2014 not to do the goal yourself."];return i.push("",`Your roadmap scaffold (\`${n}\`) \u2014 author it now: state the goal, exit criteria, and the phase skeleton, using your orchestration protocol. Current contents:`,"",t,"",m(o,r),"",'Your three long-term memory scopes (user-global, project, node-local) already surface in your bearings at boot. What promotion changes is USE, not access: you now persist across refresh cycles, so node-local carries what THIS goal needs between your refreshes, and durable facts you commit to user-global or project outlive this node. Use `crtr memory write` to save a document; `crtr memory list` to browse; `crtr memory find` to search (see "Your long-term memory" above for the full substrate flow).',"","Then delegate each phase with `crtr node new --kind <kind>`. When your context fills, run `crtr node yield` to refresh against this roadmap."),i.join(`
2
- `)}a(f,"orchestrationGuidance");function p(){return"You are HANDS-ON again \u2014 base mode. Do the work yourself in THIS window and finish it here; stop delegating by default. You no longer drive a roadmap, so `crtr node yield` is not your exit. Spawn a child only for a cleanly separable unit, never as your first move."}a(p,"baseModeGuidance");function h(o,e,r){if(e.mode===r.mode)return"";if(r.mode==="base")return p();const t=s(o);return f(o,t?.kind??"general",t?.grantee)}a(h,"transitionGuidance");function b(o){const e=s(o);if(e===null)return null;const r={kind:e.kind,mode:e.mode,lifecycle:e.lifecycle},t=e.persona_ack,n=t===void 0?r:{kind:t.kind??e.kind,mode:t.mode,lifecycle:t.lifecycle};return n.kind===r.kind&&n.mode===r.mode&&n.lifecycle===r.lifecycle?null:{from:n,to:r,guidance:h(o,n,r)}}a(b,"personaDrift");function x(o,e){l(o,{persona_ack:e})}a(x,"commitPersonaAck");export{x as commitPersonaAck,b as personaDrift,h as transitionGuidance};
1
+ var s=Object.defineProperty;var t=(o,e)=>s(o,"name",{value:e,configurable:!0});import{getNode as i,updateNode as d}from"../canvas/index.js";import{readRoadmap as c}from"./roadmap.js";import{orchestratorContextNote as u}from"./bearings.js";function l(o,e){const r=c(o)??"(no roadmap yet)",n=[`You are now a ${e.toUpperCase()} ORCHESTRATOR. Your scarce resource is your own context window.`,"Your job is to manage context and delegate \u2014 not to do the goal yourself."];return n.push("","Your roadmap is your document `roadmap`; it loads at every new session of yours. Author it now with `crtr doc edit roadmap`: state the goal, exit criteria, and the phase skeleton, using your orchestration protocol. Current contents:","",r,"",u(),"","What promotion changes is how long your documents matter: you now persist across refresh cycles, so the documents you own (`crtr doc write`) carry what this goal needs between your refreshes, and a lesson that should outlive this node gets another owner (`--owner user|repo|profile`).","","Then delegate each phase with `crtr node new --kind <kind>`. When your context fills, run `crtr node yield` to refresh against this roadmap."),n.join(`
2
+ `)}t(l,"orchestrationGuidance");function m(){return"You are HANDS-ON again \u2014 base mode. Do the work yourself in THIS window and finish it here; stop delegating by default. You no longer drive a roadmap, so `crtr node yield` is not your exit. Spawn a child only for a cleanly separable unit, never as your first move."}t(m,"baseModeGuidance");function f(o,e,r){if(e.mode===r.mode)return"";if(r.mode==="base")return m();const n=i(o);return l(o,n?.kind??"general")}t(f,"transitionGuidance");function g(o){const e=i(o);if(e===null)return null;const r={kind:e.kind,mode:e.mode,lifecycle:e.lifecycle},n=e.persona_ack,a=n===void 0?r:{kind:n.kind??e.kind,mode:n.mode,lifecycle:n.lifecycle};return a.kind===r.kind&&a.mode===r.mode&&a.lifecycle===r.lifecycle?null:{from:a,to:r,guidance:f(o,a,r)}}t(g,"personaDrift");function k(o,e){d(o,{persona_ack:e})}t(k,"commitPersonaAck");export{k as commitPersonaAck,g as personaDrift,f as transitionGuidance};
@@ -1 +1 @@
1
- var V=Object.defineProperty;var r=(e,n)=>V(e,"name",{value:n,configurable:!0});import{envNodeId as $}from"../../shared/env.js";import{getNode as P,fullName as H,deleteNode as b,listNodes as D,subscribersOf as M,openFocusRow as z,closeFocusRow as a,getFocusByNode as k,getFocusByPane as x,getFocusById as J,listFocuses as Q}from"../canvas/index.js";import{nodeHasAssistantMessage as U}from"../canvas/render-source.js";import{headlessBrokerHost as R}from"./host.js";import{fanDoctrineWake as X}from"./close.js";import{paneExists as w,paneLocation as y,closePane as v,currentTmux as j,switchClient as q,selectWindow as G,selectLayout as K,selectPane as T,getPaneOption as Y,setPaneOption as Z,respawnPaneSync as I,windowOfPane as ee,renameWindow as ne}from"./tmux-driver.js";import{openViewerPane as se,viewerSplitEnv as W,waitForBrokerViewSocket as oe}from"./placement-tmux.js";import{newJobId as ie}from"./nodes.js";import{isPidAlive as h}from"../canvas/pid.js";import{splitWindow as be,breakPane as ke,selectLayout as Re,selectPane as Te,focusWindow as We,selectWindow as Se,switchClient as Ae,openNodeWindow as Be,ensureSession as Ee,paneLocation as Ce,paneExists as Le,paneRunning as Ve,paneCurrentPath as $e,currentTmux as He,inTmux as De,paneOfNode as Me,setPaneOption as ze,getPaneOption as Je,piCommand as Qe,shellQuote as Ue,respawnPaneSync as Xe,closePane as je,displayPopup as qe,windowOfPane as Ge,renameWindow as Ke,paneOfWindow as Ye,windowAlive as Ze,listLivePanes as Ie,listLivePanesAsync as en}from"./tmux-driver.js";import{installTmuxBindings as sn}from"./tmux-bindings.js";function g(e){return e===null?null:e.pane!==null&&!w(e.pane)?(a(e.focus_id),null):e}r(g,"liveOrPrune");function p(e){return g(k(e))}r(p,"focusOf");function xe(e){return p(e)!==null}r(xe,"isFocused");function te(e){return g(x(e))}r(te,"focusByPane");function ye(){return new Set(re().map(e=>e.node_id))}r(ye,"focusedNodes");function re(){const e=[];for(const n of Q())g(n)!==null&&e.push(n);return e}r(re,"listFocuses");function le(){return`f-${ie()}`}r(le,"newFocusId");function S(e,n,s,o){const u=x(n);if(u!==null)return u;const t=k(e);if(t!==null)return t;const l=le();return z(l,n,s,e),J(l)}r(S,"registerViewerFocus");function A(e,n,s={}){const o=se(e,n,s);return o===null?null:S(e,o.pane,o.session,o.window)}r(A,"openViewerWindow");function B(e){const n=y(e)?.window??null;n!==null&&K(n,"even-horizontal"),T(e)}r(B,"surfaceNewPane");async function he(e,n){const s=P(e);if(s===null)return{focused:!1,session:null,inPlace:!1,revived:!1};const o=n.pane??process.env.TMUX_PANE??j()?.pane;if(o===void 0||o==="")return{focused:!1,session:null,inPlace:!1,revived:!1};const u=h(s.pi_pid??null),t=n.revive(e),l=!u;if(!await oe(e,t?.launch?.exited))return{focused:!1,session:null,inPlace:!1,revived:l};const d=y(o)?.session??null,N=d??"";if(n.inPlace===!0){const i=p(e);i!==null&&(i.pane!==null&&i.pane!==o&&w(i.pane)&&v(i.pane),a(i.focus_id));const c=x(o);c!==null&&c.node_id!==e&&a(c.focus_id);try{Z(o,"@crtr_node","")}catch{}const _=ee(o),F=c?.node_id,L=F===void 0?W():{...W(),CRTR_ATTACH_ROSTER:F},O=I({pane:o,cwd:s.cwd,env:L,command:`crtr surface attach to ${e}`});return O&&(_!==null&&ne(_,H(s)),S(e,o,d,_)),{focused:O,session:d,inPlace:!0,revived:l}}if(n.newPane===!0){const i=p(e);i!==null&&(i.pane!==null&&w(i.pane)&&v(i.pane),a(i.focus_id));const c=A(e,N,{cwd:s.cwd,besidePane:o});return c===null?{focused:!1,session:null,inPlace:!1,revived:l}:(c.pane!==null&&B(c.pane),{focused:!0,session:c.session,inPlace:!1,revived:l})}const f=p(e);if(f!==null&&f.pane!==null)if(Y(f.pane,"@crtr_node")===e){const i=y(f.pane);if(i!==null)return q(i.session),G(i.session,i.window),T(f.pane),{focused:!0,session:i.session,inPlace:!0,revived:l};a(f.focus_id)}else a(f.focus_id);const m=A(e,N,{cwd:s.cwd,besidePane:o});return m===null?{focused:!1,session:null,inPlace:!1,revived:l}:(m.pane!==null&&B(m.pane),{focused:!0,session:m.session,inPlace:!1,revived:l})}r(he,"focus");function E(e,n){const s=p(e);s!==null&&(s.pane!==null&&s.pane!==n&&w(s.pane)&&v(s.pane),a(s.focus_id))}r(E,"tearDownNode");function ge(e,n){const s=n??p(e)?.pane??null;if(s===null||!w(s))return!1;const o=te(s);o!==null&&a(o.focus_id);const u=v(s);return ue(e),u}r(ge,"detachToBackground");function C(e){const n=P(e);return n===null||n.streaming===!0&&h(n.pi_pid)?!1:!U(n.pi_session_file)}r(C,"isEmptyNode");function ue(e,n,s=!0){return P(e)?.managed_worktree?.state==="open"||!C(e)?!1:(s&&R.teardown(e),E(e,n),b(e).deleted)}r(ue,"reapIfEmpty");function Ne(e={}){const n=e.dryRun??!1,s=$()??"",o=[];for(const u of D()){const t=u.node_id,l=P(t);if(t===s||u.status==="dead"||h(u.pi_pid)||l?.managed_worktree?.state==="open"||!C(t))continue;const d=M(t);!n&&(X(t,d,`Child closed \u2014 ${l?.name??t} (${t}) was closed from the canvas and is no longer running.`,{reason:"child-closed",child:t}),R.teardown(t),E(t),!b(t).deleted)||o.push(t)}return o}r(Ne,"reapEmptyNodes");export{ke as breakPane,je as closePane,He as currentTmux,ge as detachToBackground,qe as displayPopup,Ee as ensureSession,he as focus,te as focusByPane,p as focusOf,We as focusWindow,ye as focusedNodes,Je as getPaneOption,De as inTmux,sn as installTmuxBindings,xe as isFocused,re as listFocuses,Ie as listLivePanes,en as listLivePanesAsync,Be as openNodeWindow,A as openViewerWindow,$e as paneCurrentPath,Le as paneExists,Ce as paneLocation,Me as paneOfNode,Ye as paneOfWindow,Ve as paneRunning,Qe as piCommand,Ne as reapEmptyNodes,ue as reapIfEmpty,S as registerViewerFocus,Ke as renameWindow,Xe as respawnPaneSync,Re as selectLayout,Te as selectPane,Se as selectWindow,ze as setPaneOption,Ue as shellQuote,be as splitWindow,Ae as switchClient,E as tearDownNode,Ze as windowAlive,Ge as windowOfPane};
1
+ var V=Object.defineProperty;var t=(e,n)=>V(e,"name",{value:n,configurable:!0});import{envNodeId as $}from"../../shared/env.js";import{getNode as m,fullName as H,deleteNode as R,listNodes as M,openFocusRow as z,closeFocusRow as a,getFocusByNode as T,getFocusByPane as x,getFocusById as D,listFocuses as J}from"../canvas/index.js";import{nodeHasAssistantMessage as Q}from"../canvas/render-source.js";import{headlessBrokerHost as k}from"./host.js";import{publishNotice as U}from"./close.js";import{paneExists as d,paneLocation as h,closePane as P,currentTmux as X,switchClient as j,selectWindow as q,selectLayout as G,selectPane as S,getPaneOption as K,setPaneOption as Y,respawnPaneSync as Z,windowOfPane as I,renameWindow as ee}from"./tmux-driver.js";import{openViewerPane as ne,viewerSplitEnv as W,waitForBrokerViewSocket as oe}from"./placement-tmux.js";import{newJobId as se}from"./nodes.js";import{isPidAlive as y}from"../canvas/pid.js";import{splitWindow as Oe,breakPane as Re,selectLayout as Te,selectPane as ke,focusWindow as Se,selectWindow as We,switchClient as be,openNodeWindow as Ae,ensureSession as Be,paneLocation as Ee,paneExists as Ce,paneRunning as Le,paneCurrentPath as Ve,currentTmux as $e,inTmux as He,paneOfNode as Me,setPaneOption as ze,getPaneOption as De,piCommand as Je,shellQuote as Qe,respawnPaneSync as Ue,closePane as Xe,displayPopup as je,windowOfPane as qe,renameWindow as Ge,paneOfWindow as Ke,windowAlive as Ye,listLivePanes as Ze,listLivePanesAsync as Ie}from"./tmux-driver.js";import{installTmuxBindings as nn}from"./tmux-bindings.js";function g(e){return e===null?null:e.pane!==null&&!d(e.pane)?(a(e.focus_id),null):e}t(g,"liveOrPrune");function p(e){return g(T(e))}t(p,"focusOf");function _e(e){return p(e)!==null}t(_e,"isFocused");function ie(e){return g(x(e))}t(ie,"focusByPane");function xe(){return new Set(te().map(e=>e.node_id))}t(xe,"focusedNodes");function te(){const e=[];for(const n of J())g(n)!==null&&e.push(n);return e}t(te,"listFocuses");function re(){return`f-${se()}`}t(re,"newFocusId");function b(e,n,o,s){const u=x(n);if(u!==null)return u;const r=T(e);if(r!==null)return r;const l=re();return z(l,n,o,e),D(l)}t(b,"registerViewerFocus");function A(e,n,o={}){const s=ne(e,n,o);return s===null?null:b(e,s.pane,s.session,s.window)}t(A,"openViewerWindow");function B(e){const n=h(e)?.window??null;n!==null&&G(n,"even-horizontal"),S(e)}t(B,"surfaceNewPane");async function he(e,n){const o=m(e);if(o===null)return{focused:!1,session:null,inPlace:!1,revived:!1};const s=n.pane??process.env.TMUX_PANE??X()?.pane;if(s===void 0||s==="")return{focused:!1,session:null,inPlace:!1,revived:!1};const u=y(o.pi_pid??null),r=n.revive(e),l=!u;if(!await oe(e,r?.launch?.exited))return{focused:!1,session:null,inPlace:!1,revived:l};const v=h(s)?.session??null,N=v??"";if(n.inPlace===!0){const i=p(e);i!==null&&(i.pane!==null&&i.pane!==s&&d(i.pane)&&P(i.pane),a(i.focus_id));const c=x(s);c!==null&&c.node_id!==e&&a(c.focus_id);try{Y(s,"@crtr_node","")}catch{}const _=I(s),F=c?.node_id,L=F===void 0?W():{...W(),CRTR_ATTACH_ROSTER:F},O=Z({pane:s,cwd:o.cwd,env:L,command:`crtr surface attach to ${e}`});return O&&(_!==null&&ee(_,H(o)),b(e,s,v,_)),{focused:O,session:v,inPlace:!0,revived:l}}if(n.newPane===!0){const i=p(e);i!==null&&(i.pane!==null&&d(i.pane)&&P(i.pane),a(i.focus_id));const c=A(e,N,{cwd:o.cwd,besidePane:s});return c===null?{focused:!1,session:null,inPlace:!1,revived:l}:(c.pane!==null&&B(c.pane),{focused:!0,session:c.session,inPlace:!1,revived:l})}const f=p(e);if(f!==null&&f.pane!==null)if(K(f.pane,"@crtr_node")===e){const i=h(f.pane);if(i!==null)return j(i.session),q(i.session,i.window),S(f.pane),{focused:!0,session:i.session,inPlace:!0,revived:l};a(f.focus_id)}else a(f.focus_id);const w=A(e,N,{cwd:o.cwd,besidePane:s});return w===null?{focused:!1,session:null,inPlace:!1,revived:l}:(w.pane!==null&&B(w.pane),{focused:!0,session:w.session,inPlace:!1,revived:l})}t(he,"focus");function E(e,n){const o=p(e);o!==null&&(o.pane!==null&&o.pane!==n&&d(o.pane)&&P(o.pane),a(o.focus_id))}t(E,"tearDownNode");function ye(e,n){const o=n??p(e)?.pane??null;if(o===null||!d(o))return!1;const s=ie(o);s!==null&&a(s.focus_id);const u=P(o);return le(e),u}t(ye,"detachToBackground");function C(e){const n=m(e);return n===null||n.streaming===!0&&y(n.pi_pid)?!1:!Q(n.pi_session_file)}t(C,"isEmptyNode");function le(e,n,o=!0){return m(e)?.managed_worktree?.state==="open"||!C(e)?!1:(o&&k.teardown(e),E(e,n),R(e).deleted)}t(le,"reapIfEmpty");function ge(e={}){const n=e.dryRun??!1,o=$()??"",s=[];for(const u of M()){const r=u.node_id,l=m(r);r===o||u.status==="dead"||y(u.pi_pid)||l?.managed_worktree?.state==="open"||!C(r)||!n&&(U(r,"notice.close",`Child closed \u2014 ${l?.name??r} (${r}) was closed from the canvas and is no longer running.`,{reason:"child-closed",child:r}),k.teardown(r),E(r),!R(r).deleted)||s.push(r)}return s}t(ge,"reapEmptyNodes");export{Re as breakPane,Xe as closePane,$e as currentTmux,ye as detachToBackground,je as displayPopup,Be as ensureSession,he as focus,ie as focusByPane,p as focusOf,Se as focusWindow,xe as focusedNodes,De as getPaneOption,He as inTmux,nn as installTmuxBindings,_e as isFocused,te as listFocuses,Ze as listLivePanes,Ie as listLivePanesAsync,Ae as openNodeWindow,A as openViewerWindow,Ve as paneCurrentPath,Ce as paneExists,Ee as paneLocation,Me as paneOfNode,Ke as paneOfWindow,Le as paneRunning,Je as piCommand,ge as reapEmptyNodes,le as reapIfEmpty,b as registerViewerFocus,Ge as renameWindow,Ue as respawnPaneSync,Te as selectLayout,ke as selectPane,We as selectWindow,ze as setPaneOption,Qe as shellQuote,Oe as splitWindow,be as switchClient,E as tearDownNode,Ye as windowAlive,qe as windowOfPane};
@@ -2,8 +2,8 @@ import { type NodeMeta, type Mode, type Lifecycle } from '../canvas/index.js';
2
2
  export interface PromoteResult {
3
3
  meta: NodeMeta;
4
4
  roadmapWritten: boolean;
5
- /** Absolute path to the node's roadmap doc (context/roadmap.md). */
6
- roadmapPath: string;
5
+ /** The node's roadmap document ref (`<node>/roadmap`), read with `crtr canvas read`. */
6
+ roadmapRef: string;
7
7
  /** Absolute path to the node's goal doc (context/initial-prompt.md). */
8
8
  goalPath: string;
9
9
  }
@@ -1 +1 @@
1
- var g=Object.defineProperty;var l=(n,e)=>g(n,"name",{value:e,configurable:!0});import{getNode as m,updateNode as x}from"../canvas/index.js";import{transition as E}from"./lifecycle.js";import{ensureDaemon as P}from"../../daemon/manage.js";import{buildLaunchSpec as $,buildLaunchSpecAsync as A}from"./launch.js";import{hasRoadmap as t,seedRoadmap as u,roadmapPath as c}from"./roadmap.js";import{readGoal as f,goalPath as k}from"./kickoff.js";function h(n,e){const d=m(n);if(d===null)throw new Error(`unknown node: ${n}`);const r=e.kind??d.kind,o=e.mode??d.mode,i=e.lifecycle??d.lifecycle,a=e.profileId===void 0?d.profile_id??null:e.profileId;return{node:d,kind:r,mode:o,lifecycle:i,profileId:a,launchOpts:{lifecycle:i,hasManager:d.parent!==null,model:e.model??d.model_override??void 0,modelOverride:e.model!==void 0,modelIntent:e.model===void 0?d.launch?.modelIntent:void 0,modelExact:e.model===void 0?d.launch?.modelExact:void 0,cwd:d.cwd,profileId:a}}}l(h,"reshapeInputs");function w(n,e,d,r,o){o?.();const i=d.node.name===d.node.kind&&d.kind!==d.node.kind;return x(n,{kind:d.kind,mode:d.mode,lifecycle:d.lifecycle,profile_id:d.profileId,launch:r,...i?{name:d.kind}:{},...e.model!==void 0?{model_override:r?.model??e.model}:{}})}l(w,"persistReshape");function s(n,e={},d){const r=h(n,e);return w(n,e,r,$(r.kind,r.mode,r.launchOpts).launch,d)}l(s,"reshapeNode");async function y(n,e={},d){const r=h(n,e),{launch:o}=await A(r.kind,r.mode,r.launchOpts);return w(n,e,r,o,d)}l(y,"reshapeNodeAsync");function N(n,e={}){const d=m(n);if(d===null)throw new Error(`unknown node: ${n}`);let r=!1;return{meta:s(n,{...e.kind!==void 0?{kind:e.kind}:{},...e.model!==void 0?{model:e.model}:{},mode:"orchestrator",lifecycle:e.resident===!0?"resident":d.lifecycle},()=>{if(!t(n)){const i=f(n);u(n,i!==null&&i.trim()!==""?{goal:i.trim()}:{}),r=!0}}),roadmapWritten:r,roadmapPath:c(n),goalPath:k(n)}}l(N,"promote");async function O(n,e={}){const d=m(n);if(d===null)throw new Error(`unknown node: ${n}`);let r=!1;return{meta:await y(n,{...e.kind!==void 0?{kind:e.kind}:{},...e.model!==void 0?{model:e.model}:{},mode:"orchestrator",lifecycle:e.resident===!0?"resident":d.lifecycle},()=>{if(!t(n)){const i=f(n);u(n,i!==null&&i.trim()!==""?{goal:i.trim()}:{}),r=!0}}),roadmapWritten:r,roadmapPath:c(n),goalPath:k(n)}}l(O,"promoteAsync");async function Y(n,e={},d={}){if(m(n)===null)throw new Error(`unknown node: ${n}`);return e.promote===!0?await O(n,{...e.kind!==void 0?{kind:e.kind}:{},...e.model!==void 0?{model:e.model}:{}}):(e.kind!==void 0||e.model!==void 0)&&await y(n,{...e.kind!==void 0?{kind:e.kind}:{},...e.model!==void 0?{model:e.model}:{}}),{...R(n,{},d),promoted:e.promote===!0}}l(Y,"requestYieldAsync");function R(n,e={},d={}){const r=d.ensure??P;if(m(n)===null)throw new Error(`unknown node: ${n}`);const i=e.kind!==void 0||e.model!==void 0;let a=!1;return e.promote===!0?(N(n,{...e.kind!==void 0?{kind:e.kind}:{},...e.model!==void 0?{model:e.model}:{}}),a=!0):i&&s(n,{...e.kind!==void 0?{kind:e.kind}:{},...e.model!==void 0?{model:e.model}:{}}),r(),E(n,"yield"),{meta:m(n),promoted:a,willRefresh:!0}}l(R,"requestYield");export{N as promote,O as promoteAsync,R as requestYield,Y as requestYieldAsync,s as reshapeNode,y as reshapeNodeAsync};
1
+ var g=Object.defineProperty;var l=(n,e)=>g(n,"name",{value:e,configurable:!0});import{getNode as m,updateNode as x}from"../canvas/index.js";import{transition as E}from"./lifecycle.js";import{ensureDaemon as R}from"../../daemon/manage.js";import{buildLaunchSpec as $,buildLaunchSpecAsync as A}from"./launch.js";import{ensureRoadmap as u,hasRoadmap as f,roadmapRef as t}from"./roadmap.js";import{readGoal as c,goalPath as k}from"./kickoff.js";function h(n,e){const d=m(n);if(d===null)throw new Error(`unknown node: ${n}`);const i=e.kind??d.kind,o=e.mode??d.mode,r=e.lifecycle??d.lifecycle,a=e.profileId===void 0?d.profile_id??null:e.profileId;return{node:d,kind:i,mode:o,lifecycle:r,profileId:a,launchOpts:{lifecycle:r,hasManager:d.parent!==null,model:e.model??d.model_override??void 0,modelOverride:e.model!==void 0,modelIntent:e.model===void 0?d.launch?.modelIntent:void 0,modelExact:e.model===void 0?d.launch?.modelExact:void 0,cwd:d.cwd,profileId:a}}}l(h,"reshapeInputs");function w(n,e,d,i,o){o?.();const r=d.node.name===d.node.kind&&d.kind!==d.node.kind;return x(n,{kind:d.kind,mode:d.mode,lifecycle:d.lifecycle,profile_id:d.profileId,launch:i,...r?{name:d.kind}:{},...e.model!==void 0?{model_override:i?.model??e.model}:{}})}l(w,"persistReshape");function s(n,e={},d){const i=h(n,e);return w(n,e,i,$(i.kind,i.mode,i.launchOpts).launch,d)}l(s,"reshapeNode");async function y(n,e={},d){const i=h(n,e),{launch:o}=await A(i.kind,i.mode,i.launchOpts);return w(n,e,i,o,d)}l(y,"reshapeNodeAsync");function N(n,e={}){const d=m(n);if(d===null)throw new Error(`unknown node: ${n}`);let i=!1;return{meta:s(n,{...e.kind!==void 0?{kind:e.kind}:{},...e.model!==void 0?{model:e.model}:{},mode:"orchestrator",lifecycle:e.resident===!0?"resident":d.lifecycle},()=>{if(!f(n)){const r=c(n);i=u(n,r!==null&&r.trim()!==""?{goal:r.trim()}:{})}}),roadmapWritten:i,roadmapRef:t(n),goalPath:k(n)}}l(N,"promote");async function O(n,e={}){const d=m(n);if(d===null)throw new Error(`unknown node: ${n}`);let i=!1;return{meta:await y(n,{...e.kind!==void 0?{kind:e.kind}:{},...e.model!==void 0?{model:e.model}:{},mode:"orchestrator",lifecycle:e.resident===!0?"resident":d.lifecycle},()=>{if(!f(n)){const r=c(n);i=u(n,r!==null&&r.trim()!==""?{goal:r.trim()}:{})}}),roadmapWritten:i,roadmapRef:t(n),goalPath:k(n)}}l(O,"promoteAsync");async function Y(n,e={},d={}){if(m(n)===null)throw new Error(`unknown node: ${n}`);return e.promote===!0?await O(n,{...e.kind!==void 0?{kind:e.kind}:{},...e.model!==void 0?{model:e.model}:{}}):(e.kind!==void 0||e.model!==void 0)&&await y(n,{...e.kind!==void 0?{kind:e.kind}:{},...e.model!==void 0?{model:e.model}:{}}),{..._(n,{},d),promoted:e.promote===!0}}l(Y,"requestYieldAsync");function _(n,e={},d={}){const i=d.ensure??R;if(m(n)===null)throw new Error(`unknown node: ${n}`);const r=e.kind!==void 0||e.model!==void 0;let a=!1;return e.promote===!0?(N(n,{...e.kind!==void 0?{kind:e.kind}:{},...e.model!==void 0?{model:e.model}:{}}),a=!0):r&&s(n,{...e.kind!==void 0?{kind:e.kind}:{},...e.model!==void 0?{model:e.model}:{}}),i(),E(n,"yield"),{meta:m(n),promoted:a,willRefresh:!0}}l(_,"requestYield");export{N as promote,O as promoteAsync,_ as requestYield,Y as requestYieldAsync,s as reshapeNode,y as reshapeNodeAsync};