@north-light/crouter 0.3.233 → 0.3.234

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 (379) hide show
  1. package/dist/api/client.js +16 -15
  2. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/integration/provider-rotation.test.ts +1 -1
  3. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +14 -17
  4. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/index.ts +7 -11
  5. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +8 -8
  6. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +10 -11
  7. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/pi-shell-runner.ts +2 -2
  8. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +3 -3
  9. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +7 -7
  10. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +8 -8
  11. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +6 -6
  12. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +3 -3
  13. package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.ts +1 -1
  14. package/dist/clients/attach/chrome/ticket-panel.js +15 -2
  15. package/dist/clients/attach/overlays/graph.js +0 -3
  16. package/dist/clients/attach/overlays/mcp.js +1 -2
  17. package/dist/clients/attach/render/chat-view.js +0 -12
  18. package/dist/clients/attach/render/crtr-output.js +0 -2
  19. package/dist/clients/attach/render/tool-calls.js +0 -6
  20. package/dist/clients/attach/slash/dispatch.js +8 -11
  21. package/dist/clients/attach/viewer.js +532 -534
  22. package/dist/clients/conversation/projection.js +0 -2
  23. package/dist/clients/inbox/controller.js +22 -3
  24. package/dist/clients/inbox/review/companion-pane.js +0 -4
  25. package/dist/clients/inbox/review-adapter.js +0 -7
  26. package/dist/clients/inbox/tui/slots.d.ts +3 -3
  27. package/dist/clients/inbox/tui/types.d.ts +2 -2
  28. package/dist/commands/api-client.js +0 -8
  29. package/dist/commands/attention.js +0 -8
  30. package/dist/commands/canvas-browse.js +2 -1
  31. package/dist/commands/canvas-config.js +0 -10
  32. package/dist/commands/canvas-history.js +2 -1
  33. package/dist/commands/cron.js +5 -18
  34. package/dist/commands/dashboard.js +0 -2
  35. package/dist/commands/human/feedback.js +2 -1
  36. package/dist/commands/human/prompts.js +2 -5
  37. package/dist/commands/human/queue.js +2 -7
  38. package/dist/commands/human/request.js +0 -14
  39. package/dist/commands/human/review.js +2 -1
  40. package/dist/commands/memory/__tests__/command-selector-and-mutation-guards.test.js +4 -4
  41. package/dist/commands/memory/find.js +2 -2
  42. package/dist/commands/memory/lint.js +2 -1
  43. package/dist/commands/memory/read.d.ts +2 -7
  44. package/dist/commands/memory/read.js +5 -16
  45. package/dist/commands/memory/shared.js +4 -7
  46. package/dist/commands/memory/write.js +4 -3
  47. package/dist/commands/node/bash.js +2 -1
  48. package/dist/commands/node/create.js +2 -1
  49. package/dist/commands/node/inspect.js +0 -6
  50. package/dist/commands/node/lifecycle.js +4 -13
  51. package/dist/commands/node/message.js +3 -2
  52. package/dist/commands/node/subscription.js +2 -1
  53. package/dist/commands/node/wait.js +4 -3
  54. package/dist/commands/node-context.js +2 -1
  55. package/dist/commands/node-lifecycle-revive.js +0 -2
  56. package/dist/commands/node-worktree.js +2 -1
  57. package/dist/commands/pkg/browse/actions.d.ts +1 -1
  58. package/dist/commands/pkg/browse/actions.js +4 -4
  59. package/dist/commands/pkg/browse/catalog.d.ts +1 -1
  60. package/dist/commands/pkg/browse/catalog.js +15 -15
  61. package/dist/commands/pkg/browse/command-view.d.ts +1 -1
  62. package/dist/commands/pkg/browse/command-view.js +3 -3
  63. package/dist/commands/pkg/browse/detail-panel.d.ts +1 -1
  64. package/dist/commands/pkg/browse/detail-panel.js +8 -8
  65. package/dist/commands/pkg/browse/doc-view.d.ts +1 -1
  66. package/dist/commands/pkg/browse/doc-view.js +3 -3
  67. package/dist/commands/pkg/browse/list-panel.d.ts +1 -1
  68. package/dist/commands/pkg/browse/list-panel.js +3 -3
  69. package/dist/commands/pkg/browse/model.d.ts +3 -3
  70. package/dist/commands/pkg/browse/shell.d.ts +2 -2
  71. package/dist/commands/pkg/browse/shell.js +13 -13
  72. package/dist/commands/pkg/plugin-manage.js +2 -1
  73. package/dist/commands/pkg/shared.js +0 -2
  74. package/dist/commands/profile/delete.js +2 -1
  75. package/dist/commands/push.js +2 -3
  76. package/dist/commands/revive.js +0 -2
  77. package/dist/commands/surface/node/placement.js +2 -1
  78. package/dist/commands/surface-edit.js +2 -1
  79. package/dist/commands/sys/config.js +0 -4
  80. package/dist/commands/sys/daemon.js +0 -10
  81. package/dist/commands/sys/doctor.js +3 -2
  82. package/dist/commands/sys/panels/broker-limits-panel.d.ts +2 -2
  83. package/dist/commands/sys/panels/broker-limits-panel.js +4 -4
  84. package/dist/commands/sys/panels/dependencies-panel.d.ts +2 -2
  85. package/dist/commands/sys/panels/dependencies-panel.js +2 -2
  86. package/dist/commands/sys/panels/keybindings-panel.d.ts +1 -1
  87. package/dist/commands/sys/panels/keybindings-panel.js +5 -5
  88. package/dist/commands/sys/panels/models-panel.d.ts +4 -4
  89. package/dist/commands/sys/panels/models-panel.js +11 -10
  90. package/dist/commands/sys/panels/plugins-panel.d.ts +2 -2
  91. package/dist/commands/sys/panels/plugins-panel.js +2 -2
  92. package/dist/commands/sys/panels/prefs-panel.d.ts +2 -2
  93. package/dist/commands/sys/panels/prefs-panel.js +4 -4
  94. package/dist/commands/sys/panels/profiles-panel.d.ts +1 -1
  95. package/dist/commands/sys/panels/profiles-panel.js +14 -13
  96. package/dist/commands/sys/panels/provider-panel.d.ts +3 -3
  97. package/dist/commands/sys/panels/provider-panel.js +8 -8
  98. package/dist/commands/sys/settings-shell.d.ts +3 -3
  99. package/dist/commands/sys/settings-shell.js +15 -15
  100. package/dist/commands/sys/setup-settings-runner.d.ts +3 -3
  101. package/dist/commands/sys/setup-settings-runner.js +5 -5
  102. package/dist/commands/sys/setup-wizard.d.ts +4 -4
  103. package/dist/commands/sys/setup-wizard.js +8 -8
  104. package/dist/commands/sys/support/prepare.js +4 -4
  105. package/dist/commands/sys/support/submit.js +2 -2
  106. package/dist/commands/sys/sync-deps.js +0 -2
  107. package/dist/commands/sys/sync-project-guidance.js +2 -1
  108. package/dist/commands/sys/sysprompt.js +2 -1
  109. package/dist/core/__tests__/boot.test.js +0 -8
  110. package/dist/core/__tests__/broker-extension-canvas-db-boundary.test.js +23 -1
  111. package/dist/core/__tests__/canvas-db-boundary.test.d.ts +1 -0
  112. package/dist/core/__tests__/canvas-db-boundary.test.js +46 -0
  113. package/dist/core/__tests__/canvas.test.js +1 -1
  114. package/dist/core/__tests__/child-death-wake.test.js +0 -2
  115. package/dist/core/__tests__/cron-armed-context-failure.test.d.ts +1 -0
  116. package/dist/core/__tests__/cron-armed-context-failure.test.js +145 -0
  117. package/dist/core/__tests__/daemon-wedge.test.js +0 -4
  118. package/dist/core/__tests__/dead-node-policy-table.test.js +0 -4
  119. package/dist/core/__tests__/fixtures/fake-engine.js +4 -14
  120. package/dist/core/__tests__/fixtures/fake-pi-host.js +5 -5
  121. package/dist/core/__tests__/focuses.test.js +0 -6
  122. package/dist/core/__tests__/fs-utils.test.d.ts +1 -0
  123. package/dist/core/__tests__/fs-utils.test.js +50 -0
  124. package/dist/core/__tests__/helpers/harness.js +1 -1
  125. package/dist/core/__tests__/inline-memory-refs.test.js +0 -2
  126. package/dist/core/__tests__/integration/broker-fork-seam.test.js +0 -2
  127. package/dist/core/__tests__/integration/broker-sdk-wiring.test.js +3 -16
  128. package/dist/core/__tests__/integration/command-plugins.test.js +0 -24
  129. package/dist/core/__tests__/integration/deferred-no-wake.test.js +0 -6
  130. package/dist/core/__tests__/integration/flagship-lifecycle.test.js +0 -26
  131. package/dist/core/__tests__/integration/live-mutation-verbs.test.js +0 -4
  132. package/dist/core/__tests__/integration/live-mutation.test.js +1 -5
  133. package/dist/core/__tests__/integration/refresh-stall-recycle.test.js +1 -5
  134. package/dist/core/__tests__/integration/revive.test.js +0 -12
  135. package/dist/core/__tests__/integration/subscription-delivery.test.js +0 -6
  136. package/dist/core/__tests__/integration/tmux-surface.test.js +24 -8
  137. package/dist/core/__tests__/integration/worktree-reap.test.js +0 -6
  138. package/dist/core/__tests__/lifecycle.test.js +0 -18
  139. package/dist/core/__tests__/memory-resolver-precedence.test.js +1 -1
  140. package/dist/core/__tests__/migration.test.js +2 -2
  141. package/dist/core/__tests__/on-read-dedup-resume.test.js +3 -3
  142. package/dist/core/__tests__/pid-identity-match.test.js +1 -1
  143. package/dist/core/__tests__/plugin-kinds.test.js +1 -1
  144. package/dist/core/__tests__/plugin-page-components.test.js +1 -1
  145. package/dist/core/__tests__/preview-registry-sync.test.js +42 -1
  146. package/dist/core/__tests__/respawn-throttle.test.js +0 -4
  147. package/dist/core/__tests__/revive-all.test.js +5 -5
  148. package/dist/core/__tests__/revive-parked-fresh.test.js +62 -11
  149. package/dist/core/__tests__/seam/broker-attach-multiclient.test.js +0 -8
  150. package/dist/core/__tests__/seam/broker-attach-stream.test.js +0 -8
  151. package/dist/core/__tests__/seam/broker-crash-teardown.test.js +0 -2
  152. package/dist/core/__tests__/tmux-driver-boundary.test.d.ts +1 -0
  153. package/dist/core/__tests__/tmux-driver-boundary.test.js +50 -0
  154. package/dist/core/activity-signal.d.ts +7 -0
  155. package/dist/core/activity-signal.js +38 -0
  156. package/dist/core/auto-update.js +2 -1
  157. package/dist/core/bootstrap.js +2 -1
  158. package/dist/core/canvas/__tests__/remote-canvas-source.test.js +1 -1
  159. package/dist/core/canvas/__tests__/remote-transport.test.js +1 -1
  160. package/dist/core/canvas/__tests__/render-remote.test.js +1 -1
  161. package/dist/core/canvas/browse/app.js +3 -2
  162. package/dist/core/canvas/browse/model.d.ts +1 -1
  163. package/dist/core/canvas/browse/model.js +0 -4
  164. package/dist/core/canvas/canvas.d.ts +22 -0
  165. package/dist/core/canvas/canvas.js +50 -18
  166. package/dist/core/canvas/crons.js +0 -6
  167. package/dist/core/canvas/db.d.ts +14 -20
  168. package/dist/core/canvas/db.js +30 -1332
  169. package/dist/core/canvas/focuses.js +0 -4
  170. package/dist/core/canvas/history.js +2 -1
  171. package/dist/core/canvas/migrations.d.ts +20 -0
  172. package/dist/core/canvas/migrations.js +1339 -0
  173. package/dist/core/canvas/nav-model.js +1 -11
  174. package/dist/core/canvas/nav-render.js +0 -8
  175. package/dist/core/canvas/remote-canvas-source.js +0 -2
  176. package/dist/core/canvas/render-source.js +31 -13
  177. package/dist/core/command-manifests/manifest.js +0 -10
  178. package/dist/core/command-manifests/schema.js +0 -4
  179. package/dist/core/command-plugins/transport/http-invoke.js +0 -14
  180. package/dist/core/command.js +0 -4
  181. package/dist/core/config.js +2 -1
  182. package/dist/core/feed/inbox.d.ts +10 -0
  183. package/dist/core/feed/inbox.js +18 -12
  184. package/dist/core/fs-utils.d.ts +9 -2
  185. package/dist/core/fs-utils.js +7 -15
  186. package/dist/core/help.js +0 -8
  187. package/dist/core/host-exports/export.d.ts +2 -2
  188. package/dist/core/host-exports/export.js +9 -12
  189. package/dist/core/human/answer.d.ts +2 -2
  190. package/dist/core/human/convention.d.ts +2 -5
  191. package/dist/core/human/convention.js +3 -13
  192. package/dist/core/human/page-schema.d.ts +2 -2
  193. package/dist/core/human/page-schema.js +2 -2
  194. package/dist/core/human/root.js +6 -23
  195. package/dist/core/human/scan.js +24 -7
  196. package/dist/core/human/tickets.d.ts +4 -1
  197. package/dist/core/human/tickets.js +20 -6
  198. package/dist/core/io.js +0 -12
  199. package/dist/core/memory/identity.js +0 -4
  200. package/dist/core/memory/inline-ref-inventory.js +3 -2
  201. package/dist/core/memory/lint.js +3 -6
  202. package/dist/core/memory-resolver.d.ts +5 -0
  203. package/dist/core/memory-resolver.js +14 -12
  204. package/dist/core/pagination.js +0 -2
  205. package/dist/core/preview-registry.d.ts +14 -0
  206. package/dist/core/preview-registry.js +2 -4
  207. package/dist/core/preview-result-path.js +2 -1
  208. package/dist/core/profiles/manifest.d.ts +37 -5
  209. package/dist/core/profiles/manifest.js +44 -24
  210. package/dist/core/profiles/select.js +0 -4
  211. package/dist/core/review/signal.js +4 -23
  212. package/dist/core/review/ticket-filter.d.ts +3 -3
  213. package/dist/core/review/ticket-filter.js +4 -9
  214. package/dist/core/runtime/__tests__/engine-route.test.js +1 -1
  215. package/dist/core/runtime/__tests__/spawn-env.test.js +0 -8
  216. package/dist/core/runtime/bearings-render.d.ts +56 -0
  217. package/dist/core/runtime/bearings-render.js +241 -0
  218. package/dist/core/runtime/bearings.d.ts +2 -17
  219. package/dist/core/runtime/bearings.js +12 -198
  220. package/dist/core/runtime/broker/auth-reload.d.ts +39 -0
  221. package/dist/core/runtime/broker/auth-reload.js +149 -0
  222. package/dist/core/runtime/broker/engine-drive.d.ts +26 -0
  223. package/dist/core/runtime/broker/engine-drive.js +257 -0
  224. package/dist/core/runtime/broker/engine-routing.d.ts +143 -0
  225. package/dist/core/runtime/broker/engine-routing.js +211 -0
  226. package/dist/core/runtime/broker/event-projection.js +3 -2
  227. package/dist/core/runtime/broker/fault-retry.js +5 -4
  228. package/dist/core/runtime/broker/frame-client.d.ts +38 -0
  229. package/dist/core/runtime/broker/frame-client.js +129 -0
  230. package/dist/core/runtime/broker/frame-dispatch.d.ts +12 -189
  231. package/dist/core/runtime/broker/frame-dispatch.js +89 -1476
  232. package/dist/core/runtime/broker/frame-engine-control.d.ts +20 -0
  233. package/dist/core/runtime/broker/frame-engine-control.js +231 -0
  234. package/dist/core/runtime/broker/frame-memory-refs.d.ts +19 -0
  235. package/dist/core/runtime/broker/frame-memory-refs.js +41 -0
  236. package/dist/core/runtime/broker/frame-model-query.d.ts +13 -0
  237. package/dist/core/runtime/broker/frame-model-query.js +69 -0
  238. package/dist/core/runtime/broker/frame-read.d.ts +19 -0
  239. package/dist/core/runtime/broker/frame-read.js +116 -0
  240. package/dist/core/runtime/broker/frame-replies.d.ts +24 -0
  241. package/dist/core/runtime/broker/frame-replies.js +64 -0
  242. package/dist/core/runtime/broker/frame-session.d.ts +34 -0
  243. package/dist/core/runtime/broker/frame-session.js +203 -0
  244. package/dist/core/runtime/broker/turn-ignition.d.ts +42 -0
  245. package/dist/core/runtime/broker/turn-ignition.js +74 -0
  246. package/dist/core/runtime/broker-extension-render.js +9 -85
  247. package/dist/core/runtime/broker-protocol.js +0 -4
  248. package/dist/core/runtime/broker-sdk.js +2 -1
  249. package/dist/core/runtime/broker.d.ts +1 -1
  250. package/dist/core/runtime/broker.js +5 -23
  251. package/dist/core/runtime/fault.js +3 -2
  252. package/dist/core/runtime/headless-pi.js +3 -2
  253. package/dist/core/runtime/host.js +2 -3
  254. package/dist/core/runtime/kickoff.js +0 -4
  255. package/dist/core/runtime/launch-target.js +2 -1
  256. package/dist/core/runtime/launch.js +3 -6
  257. package/dist/core/runtime/lifecycle.js +17 -26
  258. package/dist/core/runtime/managed-provider-cooling.d.ts +1 -1
  259. package/dist/core/runtime/naming.js +0 -2
  260. package/dist/core/runtime/nodes.js +2 -1
  261. package/dist/core/runtime/persona.js +0 -6
  262. package/dist/core/runtime/placement-tmux.js +2 -5
  263. package/dist/core/runtime/placement.js +4 -11
  264. package/dist/core/runtime/recap.js +4 -3
  265. package/dist/core/runtime/reopen.js +4 -7
  266. package/dist/core/runtime/reset.js +0 -4
  267. package/dist/core/runtime/resume-root.js +0 -2
  268. package/dist/core/runtime/revive.js +17 -13
  269. package/dist/core/runtime/session-list-cache.js +2 -2
  270. package/dist/core/runtime/shell-expansion.js +0 -2
  271. package/dist/core/runtime/spawn.js +0 -2
  272. package/dist/core/runtime/stream-watchdog.d.ts +0 -1
  273. package/dist/core/runtime/stream-watchdog.js +13 -18
  274. package/dist/core/runtime/tmux-bindings.js +0 -2
  275. package/dist/core/runtime/tmux-driver.d.ts +12 -0
  276. package/dist/core/runtime/tmux-driver.js +18 -13
  277. package/dist/core/runtime/warm-pool.js +0 -4
  278. package/dist/core/scope.js +4 -3
  279. package/dist/core/spawn.js +2 -3
  280. package/dist/core/subscription-state.js +10 -17
  281. package/dist/core/substrate/__tests__/surface-match-pre-command.test.js +3 -3
  282. package/dist/core/substrate/render.js +0 -12
  283. package/dist/core/substrate/schema.js +0 -12
  284. package/dist/core/substrate/surface-match.js +0 -2
  285. package/dist/core/termrender/display.js +2 -1
  286. package/dist/core/tui/page-host.d.ts +3 -3
  287. package/dist/core/tui/page-host.js +4 -4
  288. package/dist/core/tui/panel.js +3 -3
  289. package/dist/core/wake.js +0 -12
  290. package/dist/core/worktree.js +0 -2
  291. package/dist/daemon/__tests__/reconciler-signature.test.d.ts +1 -0
  292. package/dist/daemon/__tests__/reconciler-signature.test.js +36 -0
  293. package/dist/daemon/api/__tests__/seam/api-server.test.js +2 -16
  294. package/dist/daemon/api/__tests__/seam/b10-attach-modelauth.test.js +3 -11
  295. package/dist/daemon/api/__tests__/seam/leaf-api-parity.test.js +0 -6
  296. package/dist/daemon/api/handlers/attach.js +2 -1
  297. package/dist/daemon/api/handlers/broker-ops.js +3 -6
  298. package/dist/daemon/api/handlers/canvas.js +12 -18
  299. package/dist/daemon/api/handlers/feedback-comments.js +0 -8
  300. package/dist/daemon/api/handlers/health.js +3 -2
  301. package/dist/daemon/api/handlers/human-requests.js +0 -10
  302. package/dist/daemon/api/handlers/human.js +1 -5
  303. package/dist/daemon/api/handlers/inbox.js +0 -18
  304. package/dist/daemon/api/handlers/memory.js +1 -1
  305. package/dist/daemon/api/handlers/messages.js +4 -8
  306. package/dist/daemon/api/handlers/nodes.js +10 -21
  307. package/dist/daemon/api/handlers/reports.js +1 -1
  308. package/dist/daemon/api/handlers/reviews.js +1 -6
  309. package/dist/daemon/api/map.js +0 -6
  310. package/dist/daemon/api/router.js +0 -4
  311. package/dist/daemon/api/server.js +2 -5
  312. package/dist/daemon/boot-migrations.d.ts +14 -0
  313. package/dist/daemon/boot-migrations.js +31 -0
  314. package/dist/daemon/cron/armed-context.d.ts +21 -0
  315. package/dist/daemon/cron/armed-context.js +100 -0
  316. package/dist/daemon/cron/capture.d.ts +20 -0
  317. package/dist/daemon/cron/capture.js +45 -0
  318. package/dist/daemon/cron/disposition.d.ts +19 -0
  319. package/dist/daemon/cron/disposition.js +52 -0
  320. package/dist/daemon/cron/escalation.d.ts +12 -0
  321. package/dist/daemon/cron/escalation.js +124 -0
  322. package/dist/daemon/cron/held.d.ts +4 -0
  323. package/dist/daemon/cron/held.js +20 -0
  324. package/dist/daemon/cron/lease-recovery.d.ts +3 -0
  325. package/dist/daemon/cron/lease-recovery.js +119 -0
  326. package/dist/daemon/cron/live-runs.d.ts +11 -0
  327. package/dist/daemon/cron/live-runs.js +23 -0
  328. package/dist/daemon/cron/passes.d.ts +11 -0
  329. package/dist/daemon/cron/passes.js +78 -0
  330. package/dist/daemon/cron/settle.d.ts +28 -0
  331. package/dist/daemon/cron/settle.js +37 -0
  332. package/dist/daemon/cron/sinks.d.ts +2 -0
  333. package/dist/daemon/cron/sinks.js +100 -0
  334. package/dist/daemon/cron-run.d.ts +5 -41
  335. package/dist/daemon/cron-run.js +193 -882
  336. package/dist/daemon/crtrd-cli.js +2 -1
  337. package/dist/daemon/crtrd.js +22 -22
  338. package/dist/daemon/fleet.js +0 -4
  339. package/dist/daemon/human/deliver-action.js +2 -1
  340. package/dist/daemon/human/sweep.js +15 -4
  341. package/dist/daemon/manage.d.ts +2 -2
  342. package/dist/daemon/manage.js +4 -13
  343. package/dist/daemon/pidfile.js +2 -2
  344. package/dist/daemon/reconcilers/broker-supervision.js +26 -29
  345. package/dist/daemon/reconcilers/dormant-inbox.d.ts +1 -1
  346. package/dist/daemon/reconcilers/dormant-inbox.js +2 -1
  347. package/dist/daemon/reconcilers/live-obligation.js +2 -2
  348. package/dist/daemon/reconcilers/pending-review-submit.d.ts +1 -1
  349. package/dist/daemon/reconcilers/pending-review-submit.js +2 -1
  350. package/dist/daemon/reconcilers/storage-maintenance.d.ts +2 -1
  351. package/dist/daemon/reconcilers/storage-maintenance.js +2 -1
  352. package/dist/daemon/review/companion.js +2 -2
  353. package/dist/daemon/review/sweep.js +8 -3
  354. package/dist/migrations/001-surfaces-frontmatter.js +0 -6
  355. package/dist/migrations/corpus.js +2 -5
  356. package/dist/migrations/registry.js +15 -2
  357. package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +0 -4
  358. package/dist/pi-extensions/broker-local.js +2 -1
  359. package/dist/pi-extensions/canvas-bash-valve.js +3 -17
  360. package/dist/pi-extensions/canvas-context-intro.js +2 -7
  361. package/dist/pi-extensions/canvas-doc-substrate.js +2 -3
  362. package/dist/pi-extensions/canvas-goal-capture.js +2 -1
  363. package/dist/pi-extensions/canvas-inbox-watcher.js +5 -12
  364. package/dist/pi-extensions/canvas-passive-context.js +2 -5
  365. package/dist/pi-extensions/canvas-preview-result.js +2 -1
  366. package/dist/pi-extensions/canvas-prompt-scrub.js +2 -1
  367. package/dist/pi-extensions/canvas-recap.js +3 -16
  368. package/dist/pi-extensions/canvas-review-boundary.js +2 -5
  369. package/dist/pi-extensions/canvas-stophook.js +2 -26
  370. package/dist/pi-extensions/canvas-structured-output.js +2 -1
  371. package/dist/pi-extensions/canvas-tool-guide.js +2 -1
  372. package/dist/shared/__tests__/env-boundary.test.d.ts +1 -0
  373. package/dist/shared/__tests__/env-boundary.test.js +93 -0
  374. package/dist/shared/env.d.ts +68 -0
  375. package/dist/shared/env.js +171 -0
  376. package/package.json +3 -1
  377. package/runtime.lock.json +2 -2
  378. package/dist/core/canvas/render.d.ts +0 -47
  379. package/dist/core/canvas/render.js +0 -245
@@ -7,6 +7,7 @@
7
7
  // into the command text — the executed script has to stay exactly what the
8
8
  // agent wrote, because `cmd.sh`, job inspection, and the doc substrate's
9
9
  // `command` surfaces all read that text as the agent's own words.
10
+ import { envNodeId } from '../shared/env.js';
10
11
  import { tmpdir } from 'node:os';
11
12
  import { join } from 'node:path';
12
13
  export const PREVIEW_RESULT_PATH_ENV = 'CRTR_PREVIEW_RESULT_PATH';
@@ -16,7 +17,7 @@ export const PREVIEW_RESULT_PATH_ENV = 'CRTR_PREVIEW_RESULT_PATH';
16
17
  * Node id and pid are equal across both sides of the transport (they run in
17
18
  * the same broker process) without either side sharing state. */
18
19
  function brokerToken() {
19
- return `${encodeURIComponent(process.env['CRTR_NODE_ID'] ?? 'no-node')}-${process.pid}`;
20
+ return `${encodeURIComponent(envNodeId() ?? 'no-node')}-${process.pid}`;
20
21
  }
21
22
  /** Deterministic from the tool call id, so the spawning side and the result
22
23
  * side derive the same path without sharing state. */
@@ -24,12 +24,44 @@ export interface ProfileEntry {
24
24
  profileId: string;
25
25
  manifest: ProfileManifest;
26
26
  }
27
- /** Every profile with a readable manifest, in directory-listing order.
28
- * Enumerates ONLY immediate children of `profilesRoot()` — never recurses,
29
- * never trusts a caller-supplied id. A dir whose name doesn't match the
30
- * generated id shape, or whose `profile.json` is missing/corrupt, is skipped
31
- * rather than crashing the whole listing. */
27
+ export interface ProfileEnumeration {
28
+ /** Every profile with a readable manifest, in directory-listing order. */
29
+ entries: ProfileEntry[];
30
+ /** Ids whose directory is present under the profiles root but whose manifest
31
+ * did not read — corrupt JSON, a pre-object project shape, an unreadable or
32
+ * missing `profile.json`. These are NOT deleted profiles, and a caller that
33
+ * cannot tell the two apart silently substitutes another identity. */
34
+ unreadableIds: string[];
35
+ }
36
+ /** Every profile with a readable manifest, in directory-listing order. A
37
+ * profile whose manifest is missing or corrupt is skipped rather than
38
+ * crashing the whole listing — `lookupProfile` is how a caller that must not
39
+ * confuse "skipped" with "gone" asks. */
32
40
  export declare function listProfiles(): ProfileEntry[];
41
+ /** What a stored profile id resolves to — including the case every
42
+ * null-returning resolver here erases: the profile is THERE and could not be
43
+ * read. A caller that treats that as "deleted" substitutes another identity
44
+ * (root) for the one its work was pinned to. */
45
+ export type ProfileLookup = {
46
+ kind: 'resolved';
47
+ entry: ProfileEntry;
48
+ }
49
+ /** Nothing on this host answers to the id or name — a deleted profile. */
50
+ | {
51
+ kind: 'absent';
52
+ }
53
+ /** The id's directory is present; its manifest did not read. */
54
+ | {
55
+ kind: 'unreadable';
56
+ profileId: string;
57
+ manifestPath: string;
58
+ };
59
+ /** Exact resolution (generated id, else a unique manifest `name`) that reports
60
+ * WHY it failed. Only an ID can come back `unreadable`: a name lives inside
61
+ * the manifest that could not be read, so an unreadable profile has no name to
62
+ * match on. Throws on an ambiguous name, exactly as `loadProfileManifest`
63
+ * does. */
64
+ export declare function lookupProfile(profileIdOrName: string): ProfileLookup;
33
65
  /** Read one exact profile id without falling back to manifest-name matching.
34
66
  * Used at persistence gates that already hold a resolved durable identity. */
35
67
  export declare function loadExactProfileManifest(profileId: string): ProfileEntry;
@@ -15,10 +15,8 @@ import { ensureDir, nowIso } from '../fs-utils.js';
15
15
  import { usage, notFound, ambiguous, general } from '../errors.js';
16
16
  import { withExclusiveDirectoryLock } from '../exclusive-lock.js';
17
17
  import { fuzzyMatchProfile } from './fuzzy-match.js';
18
- // ---------------------------------------------------------------------------
19
18
  // Path safety — the only code in the tree that builds a path under the
20
19
  // profiles root. Every other module reaches profile paths through this file.
21
- // ---------------------------------------------------------------------------
22
20
  /** `<slug>-<shortid>`: slug is lower-case, non-alphanumeric collapsed to `-`,
23
21
  * trimmed to 40 chars (defaulting to `profile`); shortid is 8 lowercase hex
24
22
  * chars. The char class alone rules out `/`, `\`, `.`, and `..` segments —
@@ -71,11 +69,9 @@ export function profileManifestPath(profileId) {
71
69
  export function profileMemoryDir(profileId) {
72
70
  return join(profileRoot(profileId), 'memory');
73
71
  }
74
- // ---------------------------------------------------------------------------
75
72
  // Enumeration + resolution — the ONLY functions that turn a CLI operand into
76
73
  // a profile id. Both walk immediate children of the canonical root; neither
77
74
  // ever joins an unvalidated operand into a path.
78
- // ---------------------------------------------------------------------------
79
75
  /** A profile's `home` DEFAULTS to its first project dir. Normalizing here (the
80
76
  * single read path) rather than at write time means a manifest written before
81
77
  * homes existed, and one whose explicit home was later removed from purview,
@@ -175,16 +171,15 @@ export function profileHome(profileId) {
175
171
  return null;
176
172
  }
177
173
  }
178
- /** Every profile with a readable manifest, in directory-listing order.
179
- * Enumerates ONLY immediate children of `profilesRoot()` — never recurses,
180
- * never trusts a caller-supplied id. A dir whose name doesn't match the
181
- * generated id shape, or whose `profile.json` is missing/corrupt, is skipped
182
- * rather than crashing the whole listing. */
183
- export function listProfiles() {
174
+ /** The one walk of the profiles root: immediate children only — never
175
+ * recurses, never trusts a caller-supplied id. A dir whose name doesn't match
176
+ * the generated id shape is not a profile at all and is ignored. */
177
+ function enumerateProfiles() {
184
178
  const root = profilesRoot();
185
179
  if (!existsSync(root))
186
- return [];
187
- const out = [];
180
+ return { entries: [], unreadableIds: [] };
181
+ const entries = [];
182
+ const unreadableIds = [];
188
183
  for (const dirent of readdirSync(root, { withFileTypes: true })) {
189
184
  if (!dirent.isDirectory())
190
185
  continue;
@@ -193,10 +188,37 @@ export function listProfiles() {
193
188
  continue;
194
189
  const manifest = readManifestFile(join(root, profileId, 'profile.json'), profileId);
195
190
  if (manifest === null)
196
- continue;
197
- out.push({ profileId, manifest });
191
+ unreadableIds.push(profileId);
192
+ else
193
+ entries.push({ profileId, manifest });
198
194
  }
199
- return out;
195
+ return { entries, unreadableIds };
196
+ }
197
+ /** Every profile with a readable manifest, in directory-listing order. A
198
+ * profile whose manifest is missing or corrupt is skipped rather than
199
+ * crashing the whole listing — `lookupProfile` is how a caller that must not
200
+ * confuse "skipped" with "gone" asks. */
201
+ export function listProfiles() {
202
+ return enumerateProfiles().entries;
203
+ }
204
+ /** Exact resolution (generated id, else a unique manifest `name`) that reports
205
+ * WHY it failed. Only an ID can come back `unreadable`: a name lives inside
206
+ * the manifest that could not be read, so an unreadable profile has no name to
207
+ * match on. Throws on an ambiguous name, exactly as `loadProfileManifest`
208
+ * does. */
209
+ export function lookupProfile(profileIdOrName) {
210
+ const { entries, unreadableIds } = enumerateProfiles();
211
+ const exact = findExactProfile(entries, profileIdOrName);
212
+ if (exact !== null)
213
+ return { kind: 'resolved', entry: exact };
214
+ if (unreadableIds.includes(profileIdOrName)) {
215
+ return {
216
+ kind: 'unreadable',
217
+ profileId: profileIdOrName,
218
+ manifestPath: join(profilesRoot(), profileIdOrName, 'profile.json'),
219
+ };
220
+ }
221
+ return { kind: 'absent' };
200
222
  }
201
223
  // Three resolvers, in descending tolerance. `resolveProfileOperand` is what a
202
224
  // command leaf calls for a value the USER TYPED: exact id, exact name, then a
@@ -255,11 +277,13 @@ function profileNotFound(all, profileIdOrName) {
255
277
  });
256
278
  }
257
279
  export function loadProfileManifest(profileIdOrName) {
258
- const all = listProfiles();
259
- const exact = findExactProfile(all, profileIdOrName);
260
- if (exact !== null)
261
- return exact;
262
- throw profileNotFound(all, profileIdOrName);
280
+ const lookup = lookupProfile(profileIdOrName);
281
+ if (lookup.kind === 'resolved')
282
+ return lookup.entry;
283
+ // Unreadable and absent both answer not-found here: this is the tolerant
284
+ // resolver every runtime consumer already handles that way. A caller that
285
+ // must NOT substitute another identity calls `lookupProfile` directly.
286
+ throw profileNotFound(listProfiles(), profileIdOrName);
263
287
  }
264
288
  /** Resolve a profile the USER TYPED — a `--profile` flag or a `<profile>`
265
289
  * operand. Exact id or name wins outright; only when nothing matches exactly
@@ -316,10 +340,8 @@ function writeManifestAtomic(path, manifest) {
316
340
  writeFileSync(tmp, JSON.stringify(manifest, null, 2) + '\n', 'utf8');
317
341
  renameSync(tmp, path);
318
342
  }
319
- // ---------------------------------------------------------------------------
320
343
  // Project dirs — resolved to absolute real paths, must exist + be a directory
321
344
  // on add/create, deduped by real path, stored in manifest order.
322
- // ---------------------------------------------------------------------------
323
345
  function resolveExistingProjectDir(dir) {
324
346
  const abs = resolvePath(dir);
325
347
  if (!existsSync(abs) || !statSync(abs).isDirectory()) {
@@ -364,11 +386,9 @@ function generateProfileId(name) {
364
386
  }
365
387
  throw general(`failed to generate a unique profile id for "${name}" after 20 attempts`);
366
388
  }
367
- // ---------------------------------------------------------------------------
368
389
  // Mutations — all under withProfileManifestLock, all atomic writes, all call
369
390
  // resetScopeCache() when they can change project dirs or the profile name
370
391
  // (never for a bare last-used-at touch).
371
- // ---------------------------------------------------------------------------
372
392
  export function ensureRootProfile() {
373
393
  return withProfileManifestLock(ROOT_PROFILE_ID, () => {
374
394
  const manifestPath = profileManifestPath(ROOT_PROFILE_ID);
@@ -120,7 +120,6 @@ export function selectProfileForCwdReadOnly(cwd) {
120
120
  function isInteractive() {
121
121
  return Boolean(process.stdin.isTTY) && Boolean(process.stdout.isTTY);
122
122
  }
123
- // ---------------------------------------------------------------------------
124
123
  // Pre-boot prompt presentation. These prompts print to the raw controlling
125
124
  // terminal BEFORE pi takes it over (not the attach viewer), so styling is
126
125
  // plain ANSI via the house `stdoutColor` helper (NO_COLOR / non-TTY aware) and
@@ -129,7 +128,6 @@ function isInteractive() {
129
128
  // dim subtitle, then accent-keyed option rows. We deliberately do NOT echo the
130
129
  // user's own cwd back at them (they know where they are) — the only paths
131
130
  // worth showing are OTHER dirs: which project root a covering profile owns.
132
- // ---------------------------------------------------------------------------
133
131
  const dim = stdoutColor.dim;
134
132
  const bold = stdoutColor.bold;
135
133
  const accent = stdoutColor.cyan;
@@ -310,7 +308,6 @@ function runMenu(bindings, title, subtitle, rows, opts = {}) {
310
308
  draw();
311
309
  });
312
310
  }
313
- // ---------------------------------------------------------------------------
314
311
  // The profile manager. `v` on either selection gate opens the Profiles page of
315
312
  // `crtr sys settings` in a tmux popup: this menu is a CHOOSER filtered to cwd,
316
313
  // while that page is the whole map — every profile, every directory each one
@@ -318,7 +315,6 @@ function runMenu(bindings, title, subtitle, rows, opts = {}) {
318
315
  // torn down (runMenu cleans up before resolving an action), and the caller then
319
316
  // re-runs the whole selector, so a directory just adopted or a default just
320
317
  // pinned decides the menu you come back to.
321
- // ---------------------------------------------------------------------------
322
318
  /** Open the profiles page in a tmux popup and block until it closes. False when
323
319
  * there is no tmux to host it — possible only on the `crtr node new` path, as
324
320
  * the front door requires tmux before it ever selects — after printing the
@@ -1,31 +1,12 @@
1
- import { basename, dirname, join } from 'node:path';
2
- import { mkdirSync, watch, writeFileSync } from 'node:fs';
3
- import { crtrHome } from '../canvas/paths.js';
1
+ import { activityPath, signalActivity, watchActivity } from '../activity-signal.js';
4
2
  /** Signal one durable review mutation to every open viewer without watching every review directory. */
5
3
  export function reviewActivityPath() {
6
- return join(crtrHome(), 'signals', 'review-activity');
4
+ return activityPath('review-activity');
7
5
  }
8
6
  /** Signal one review mutation (comment create/edit/resolve/delete/reanchor/delivery) to every open review surface. */
9
7
  export function signalReviewActivity() {
10
- try {
11
- mkdirSync(dirname(reviewActivityPath()), { recursive: true, mode: 0o700 });
12
- writeFileSync(reviewActivityPath(), `${Date.now()}\n`, { mode: 0o600 });
13
- }
14
- catch {
15
- // A later review read is still authoritative.
16
- }
8
+ signalActivity('review-activity');
17
9
  }
18
10
  export function watchReviewActivity(onChange) {
19
- const activityPath = reviewActivityPath();
20
- try {
21
- mkdirSync(dirname(activityPath), { recursive: true, mode: 0o700 });
22
- const watcher = watch(dirname(activityPath), (_event, filename) => {
23
- if (String(filename) === basename(activityPath))
24
- onChange();
25
- });
26
- return () => watcher.close();
27
- }
28
- catch {
29
- return () => { };
30
- }
11
+ return watchActivity('review-activity', onChange);
31
12
  }
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Terminal-review ticket visibility filter.
3
- * Hides canonical review tickets by state; passes pre-cutover tickets unchanged.
3
+ * Hides review tickets by canonical state.
4
4
  * This module never imports canvas DB directly; daemon call sites apply the filter.
5
5
  */
6
6
  import type { TicketSummary } from '../human/types.js';
7
7
  /**
8
8
  * Determines if a review ticket should be visible based on its canonical review state.
9
- * A review ticket is hidden when a matching canonical row exists and its state is
10
- * 'binding', 'approved', or 'canceled'. Pre-cutover tickets (no canonical row) remain visible.
9
+ * Only an open row is visible: 'binding', 'approved', and 'canceled' are hidden, and so is a
10
+ * ticket with no row at all — a row is committed before its ticket is ever published.
11
11
  */
12
12
  export declare function isReviewTicketVisible(bridgeNodeId: string): boolean;
13
13
  /**
@@ -1,21 +1,16 @@
1
1
  /**
2
2
  * Terminal-review ticket visibility filter.
3
- * Hides canonical review tickets by state; passes pre-cutover tickets unchanged.
3
+ * Hides review tickets by canonical state.
4
4
  * This module never imports canvas DB directly; daemon call sites apply the filter.
5
5
  */
6
6
  import { getReviewByBridge } from './store.js';
7
7
  /**
8
8
  * Determines if a review ticket should be visible based on its canonical review state.
9
- * A review ticket is hidden when a matching canonical row exists and its state is
10
- * 'binding', 'approved', or 'canceled'. Pre-cutover tickets (no canonical row) remain visible.
9
+ * Only an open row is visible: 'binding', 'approved', and 'canceled' are hidden, and so is a
10
+ * ticket with no row at all — a row is committed before its ticket is ever published.
11
11
  */
12
12
  export function isReviewTicketVisible(bridgeNodeId) {
13
- const review = getReviewByBridge(bridgeNodeId);
14
- // Pre-cutover ticket with no record: visible
15
- if (review === null)
16
- return true;
17
- // Canonical review exists: hide terminal states, show open
18
- return review.state === 'open';
13
+ return getReviewByBridge(bridgeNodeId)?.state === 'open';
19
14
  }
20
15
  /**
21
16
  * Filters a ticket summary array to remove hidden terminal-review tickets.
@@ -9,7 +9,7 @@
9
9
  // session). An idle follow_up must run as a prompt.
10
10
  import { test } from 'node:test';
11
11
  import assert from 'node:assert/strict';
12
- import { resolveEngineRoute } from '../broker/frame-dispatch.js';
12
+ import { resolveEngineRoute } from '../broker/engine-routing.js';
13
13
  const IMAGES = [{ type: 'image', data: 'aGk=', mimeType: 'image/png' }];
14
14
  test('m-C: follow_up on an IDLE session escalates to prompt (no streamingBehavior)', () => {
15
15
  const route = resolveEngineRoute({ type: 'follow_up' }, false);
@@ -102,12 +102,10 @@ test('B: configured model-provider keys cross by exact name', () => {
102
102
  assert.equal(env.ANTHROPIC_API_KEY, 'fake-anthropic');
103
103
  assert.equal(env.OPENAI_API_KEY, 'fake-openai');
104
104
  });
105
- // ---------------------------------------------------------------------------
106
105
  // A2 — proxy userinfo guard (Major 1 fix): must reject username-only,
107
106
  // password-only, and scheme-less userinfo, for BOTH uppercase and lowercase
108
107
  // var names; must keep a plain proxy URL, for both cases; NO_PROXY always
109
108
  // keeps.
110
- // ---------------------------------------------------------------------------
111
109
  test('A2: a credentialed proxy URL is dropped, a plain one crosses (uppercase)', () => {
112
110
  const env = base(LEAK_CLASS_HOST_ENV);
113
111
  assert.equal(env.HTTP_PROXY, undefined, 'userinfo-bearing proxy must not cross');
@@ -142,10 +140,8 @@ test('A2: a non-http(s) scheme or hostless value is dropped, never admitted', ()
142
140
  const env = base({ HTTP_PROXY: 'not a url at all' });
143
141
  assert.equal(env.HTTP_PROXY, undefined);
144
142
  });
145
- // ---------------------------------------------------------------------------
146
143
  // buildBrokerEnv: overlay + drop the leak class through the real process.env
147
144
  // path.
148
- // ---------------------------------------------------------------------------
149
145
  test('buildBrokerEnv overlays inv.env + FRONT_DOOR_ENV on top of the sanitized base, and drops the leak class', () => {
150
146
  const inv = {
151
147
  argv: [],
@@ -170,9 +166,7 @@ test('buildBrokerEnv overlays inv.env + FRONT_DOOR_ENV on top of the sanitized b
170
166
  delete process.env.GIT_ASKPASS;
171
167
  }
172
168
  });
173
- // ---------------------------------------------------------------------------
174
169
  // C — explicit spawnEnv.allow escape hatch: literal names + globs.
175
- // ---------------------------------------------------------------------------
176
170
  test('C: an explicit spawnEnv.allow literal name admits a var that would otherwise be dropped', () => {
177
171
  mkdirSync(join(isolatedHome, '.crouter'), { recursive: true });
178
172
  writeFileSync(join(isolatedHome, '.crouter', 'config.json'), JSON.stringify({ spawnEnv: { allow: ['GOOGLE_GENERATIVE_AI_API_KEY'] } }));
@@ -198,10 +192,8 @@ test('C (glob, Minor fix): a bare "*" (inherit-all) is rejected loud at config r
198
192
  resetScopeCache();
199
193
  assert.throws(() => readMergedLaunchConfig(isolatedCwd, null), /matches every env var name/, 'a bare "*" must fail loud at config read, per cto-rejects-fallback-hedges — never silently literal, never silently dropped');
200
194
  });
201
- // ---------------------------------------------------------------------------
202
195
  // Major 2 fix — spawnEnv.allow resolves from the TARGET's own cwd/profile,
203
196
  // never the calling/launcher process's ambient scope.
204
- // ---------------------------------------------------------------------------
205
197
  test('target-scope: spawnEnv.allow is read from the TARGET cwd, not process.cwd() (the ambient/launcher cwd)', () => {
206
198
  const launcherCwd = realpathSync(mkdtempSync(join(tmpdir(), 'crtr-spawn-env-launcher-')));
207
199
  const targetCwd = realpathSync(mkdtempSync(join(tmpdir(), 'crtr-spawn-env-target-')));
@@ -0,0 +1,56 @@
1
+ import { type NamedNode } from '../canvas/labels.js';
2
+ export declare function escapeAttribute(value: string): string;
3
+ /** The `<project_context>` block — the `<environment>` snapshot only: a
4
+ * host/runtime line (platform, hostname, node version, tmux-or-not — the
5
+ * headless engine's own process env, which its bash tools inherit), the cwd
6
+ * dir listing, and git status/worktrees. Project guidance lives in the
7
+ * document substrate, so this wrapper stays environment-only. It always emits
8
+ * because the environment snapshot is always present. */
9
+ export declare function buildProjectContextBlock(cwd: string): string;
10
+ /** The context-directory note — names the path INLINE (no XML attribute, so it
11
+ * never scopes a sibling block) and frames the dir as durable, shared scratch.
12
+ * Present for every node, rendered as the `## Your context directory`
13
+ * subsection of <crtr-bearings>. */
14
+ export declare function contextDirNote(nodeId: string): string;
15
+ /** The profile-purview note — rendered ONLY when the profile resolves to a
16
+ * manifest that names at least one project dir. Phrased as PURVIEW, not a cwd
17
+ * replacement: the node's cwd is still its one working dir (bash/edits run
18
+ * there), the profile just widens what it may ALSO read/act on. Omitted
19
+ * entirely for a profile with no project purview (including the stable root
20
+ * profile) or a deleted/unreadable manifest — never throws. This absolute-path
21
+ * disclosure is intentional (spec-approved): the agent must know its full
22
+ * purview, not a redacted count. */
23
+ export declare function profileNote(cwd: string, profileId: string | null | undefined): string;
24
+ /** Orchestrator-only framing: a resident orchestrator survives refresh cycles,
25
+ * so its context dir is also where a future cycle of itself resumes the work.
26
+ * Used inside the bearings block AND in the promotion guidance dump, so a
27
+ * promoted node gets the same note a born-orchestrator gets. */
28
+ export declare function orchestratorContextNote(nodeId: string): string;
29
+ export interface RelativeLabelNode extends NamedNode {
30
+ node_id: string;
31
+ kind: string;
32
+ status: string;
33
+ name: string;
34
+ description?: string;
35
+ icon?: string;
36
+ }
37
+ /** One relative's line in the map: `<id> — <kind> · <status>`, plus the node's
38
+ * task description when it carries one (orientation: what that relative is for). */
39
+ export declare function relativeLabel(node: RelativeLabelNode): string;
40
+ /** The graph mini-map: the ancestry trunk (root first), then this node marked
41
+ * `● you`, then its immediate children. Returns '' for a lone root with no
42
+ * children (nothing to map). */
43
+ export declare function renderGraphMap(nodeId: string, kind: string, mode: string, trunk: readonly RelativeLabelNode[], children: readonly RelativeLabelNode[]): string;
44
+ /** The identity assertion injected at session start. A fork names its source
45
+ * while treating the copied first-person narrative as reference. The caller
46
+ * resolves `sourceLabel`: the bare `forkFrom` id when the source lookup
47
+ * fails/is unsafe, else `${forkFrom} ("${fullName(src)}")`. */
48
+ export declare function buildIdentityAssertion(nodeId: string, kind: string, mode: string, forkFrom: string | null | undefined, sourceLabel: string): string;
49
+ export interface ManagedWorktreeLike {
50
+ state: string;
51
+ path: string;
52
+ branch: string;
53
+ base_ref: string;
54
+ base_sha: string;
55
+ }
56
+ export declare function worktreeNote(worktree: ManagedWorktreeLike | null | undefined): string;