@north-light/cli 0.3.560 → 0.3.562

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 (573) hide show
  1. package/dist/api/client.d.ts +27 -4
  2. package/dist/api/client.js +3 -3
  3. package/dist/api/contract.d.ts +1 -1
  4. package/dist/api/contract.js +1 -1
  5. package/dist/api/dto/bash-jobs.d.ts +5 -1
  6. package/dist/api/dto/broker-ops.d.ts +25 -1
  7. package/dist/api/dto/charges.d.ts +9 -2
  8. package/dist/api/dto/delivery.d.ts +26 -2
  9. package/dist/api/dto/execution-start.d.ts +57 -0
  10. package/dist/api/dto/execution-start.js +0 -0
  11. package/dist/api/dto/modelauth.d.ts +5 -0
  12. package/dist/api/dto/node-records.d.ts +16 -0
  13. package/dist/api/dto/objects.d.ts +1 -1
  14. package/dist/api/dto/reports.d.ts +0 -3
  15. package/dist/api/dto/run-events.d.ts +7 -1
  16. package/dist/api/dto/settings.d.ts +55 -0
  17. package/dist/api/dto/settings.js +0 -0
  18. package/dist/api/index.d.ts +2 -0
  19. package/dist/api/index.js +1 -1
  20. package/dist/api/routes.d.ts +11 -0
  21. package/dist/api/routes.js +1 -1
  22. package/dist/builtin-memory/crouter-sdk/release-notes.md +4 -0
  23. package/dist/cli.js +7 -7
  24. package/dist/clients/attach/chrome/bash-jobs.d.ts +11 -1
  25. package/dist/clients/attach/chrome/bash-jobs.js +1 -1
  26. package/dist/clients/attach/chrome/canvas-panels.d.ts +1 -1
  27. package/dist/clients/attach/chrome/roster.js +6 -4
  28. package/dist/clients/attach/overlays/auth.js +2 -2
  29. package/dist/clients/attach/render/chat-view.js +1 -1
  30. package/dist/clients/attach/viewer.js +550 -567
  31. package/dist/commands/canvas-config.js +2 -2
  32. package/dist/commands/canvas-use.js +1 -1
  33. package/dist/commands/human.js +2 -2
  34. package/dist/commands/node/bash.js +3 -3
  35. package/dist/commands/node/create.js +2 -2
  36. package/dist/commands/person-settings.d.ts +1 -0
  37. package/dist/commands/person-settings.js +1 -0
  38. package/dist/commands/pkg/market-manage.d.ts +2 -2
  39. package/dist/commands/pkg/market-manage.js +1 -1
  40. package/dist/commands/pkg/plugin-manage.js +13 -13
  41. package/dist/commands/pkg/shared.js +1 -1
  42. package/dist/commands/profile/default.js +1 -1
  43. package/dist/commands/push.js +2 -3
  44. package/dist/commands/sys/config.js +1 -1
  45. package/dist/commands/sys/connect.js +1 -1
  46. package/dist/commands/sys/context/sysprompt.js +2 -2
  47. package/dist/commands/sys/doctor.js +1 -1
  48. package/dist/commands/sys/panels/broker-limits-panel.js +1 -1
  49. package/dist/commands/sys/panels/keybindings-panel.js +1 -1
  50. package/dist/commands/sys/panels/models-panel.d.ts +8 -2
  51. package/dist/commands/sys/panels/models-panel.js +1 -1
  52. package/dist/commands/sys/panels/prefs-panel.d.ts +1 -0
  53. package/dist/commands/sys/panels/prefs-panel.js +1 -1
  54. package/dist/commands/sys/panels/profiles-panel.js +1 -1
  55. package/dist/commands/sys/panels/provider-panel.d.ts +4 -0
  56. package/dist/commands/sys/panels/provider-panel.js +1 -1
  57. package/dist/commands/sys/provider-login.js +5 -5
  58. package/dist/commands/sys/setup-core.js +3 -3
  59. package/dist/commands/sys/setup-settings-runner.js +1 -1
  60. package/dist/commands/sys/spend.js +3 -3
  61. package/dist/commands/sys/update.js +1 -1
  62. package/dist/core/auth-file.d.ts +11 -19
  63. package/dist/core/auth-file.js +1 -2
  64. package/dist/core/auto-update.d.ts +1 -1
  65. package/dist/core/auto-update.js +4 -4
  66. package/dist/core/bash-jobs.d.ts +29 -71
  67. package/dist/core/bash-jobs.js +9 -10
  68. package/dist/core/blobs/directory.d.ts +3 -0
  69. package/dist/core/blobs/directory.js +1 -0
  70. package/dist/core/blobs/fault.d.ts +3 -0
  71. package/dist/core/blobs/fault.js +1 -0
  72. package/dist/core/blobs/index.d.ts +21 -0
  73. package/dist/core/blobs/index.js +1 -0
  74. package/dist/core/blobs/r2.d.ts +9 -0
  75. package/dist/core/blobs/r2.js +4 -0
  76. package/dist/core/bootstrap.d.ts +1 -1
  77. package/dist/core/bootstrap.js +2 -2
  78. package/dist/core/canvas/canvas.d.ts +9 -7
  79. package/dist/core/canvas/canvas.js +8 -8
  80. package/dist/core/canvas/crons.d.ts +3 -2
  81. package/dist/core/canvas/crons.js +3 -3
  82. package/dist/core/canvas/daemon-owner.d.ts +5 -0
  83. package/dist/core/canvas/daemon-owner.js +1 -1
  84. package/dist/core/canvas/db.d.ts +10 -9
  85. package/dist/core/canvas/db.js +4 -4
  86. package/dist/core/canvas/executions.d.ts +100 -4
  87. package/dist/core/canvas/executions.js +1 -1
  88. package/dist/core/canvas/export-sqlite.js +1 -1
  89. package/dist/core/canvas/focuses.d.ts +4 -0
  90. package/dist/core/canvas/focuses.js +1 -1
  91. package/dist/core/canvas/history.js +9 -9
  92. package/dist/core/canvas/managed-worktree-sweep-candidates.d.ts +2 -1
  93. package/dist/core/canvas/managed-worktree-sweep-candidates.js +3 -2
  94. package/dist/core/canvas/node-tokens.d.ts +1 -4
  95. package/dist/core/canvas/node-tokens.js +3 -3
  96. package/dist/core/canvas/paths.d.ts +0 -1
  97. package/dist/core/canvas/paths.js +1 -1
  98. package/dist/core/canvas/person-state.d.ts +26 -0
  99. package/dist/core/canvas/person-state.js +1 -0
  100. package/dist/core/canvas/person.d.ts +3 -10
  101. package/dist/core/canvas/person.js +7 -7
  102. package/dist/core/canvas/reconciler-leases.d.ts +12 -0
  103. package/dist/core/canvas/reconciler-leases.js +8 -0
  104. package/dist/core/canvas/recovery.d.ts +4 -0
  105. package/dist/core/canvas/recovery.js +1 -1
  106. package/dist/core/canvas/schema-pg/003-fleet-removals.sql +1 -1
  107. package/dist/core/canvas/schema-pg/005-fleet-blobs.sql +13 -0
  108. package/dist/core/canvas/schema-pg/006-job-rows.sql +20 -0
  109. package/dist/core/canvas/schema-pg/007-ledger-check.sql +117 -0
  110. package/dist/core/canvas/schema-version.d.ts +1 -1
  111. package/dist/core/canvas/schema-version.js +1 -1
  112. package/dist/core/canvas/sessions.d.ts +8 -11
  113. package/dist/core/canvas/sessions.js +1 -4
  114. package/dist/core/canvas/tree.d.ts +4 -2
  115. package/dist/core/canvas/tree.js +6 -6
  116. package/dist/core/canvas/types.d.ts +7 -0
  117. package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -1
  118. package/dist/core/command-plugins/bundle.d.ts +1 -1
  119. package/dist/core/command-plugins/bundle.js +1 -1
  120. package/dist/core/command-plugins/compose.d.ts +1 -1
  121. package/dist/core/command-plugins/discovery.d.ts +0 -1
  122. package/dist/core/command-plugins/discovery.js +1 -1
  123. package/dist/core/command-plugins/help-addenda.js +1 -1
  124. package/dist/core/command-plugins/presence.d.ts +2 -0
  125. package/dist/core/command-plugins/presence.js +1 -1
  126. package/dist/core/config.d.ts +16 -15
  127. package/dist/core/config.js +1 -1
  128. package/dist/core/conversation-store/client-worker.js +1 -1
  129. package/dist/core/conversation-store/client.js +2 -2
  130. package/dist/core/conversation-store/index.d.ts +9 -11
  131. package/dist/core/conversation-store/index.js +1 -1
  132. package/dist/core/conversation-store/patch.js +1 -1
  133. package/dist/core/conversation-store/row-store.d.ts +14 -0
  134. package/dist/core/conversation-store/row-store.js +13 -0
  135. package/dist/core/directory/join.js +1 -1
  136. package/dist/core/env-name.d.ts +1 -0
  137. package/dist/core/env-name.js +1 -1
  138. package/dist/core/environment-recipe.d.ts +15 -0
  139. package/dist/core/environment-recipe.js +1 -0
  140. package/dist/core/environments.js +1 -1
  141. package/dist/core/events/emit.js +2 -2
  142. package/dist/core/events/run-event-chunks.d.ts +25 -0
  143. package/dist/core/events/run-event-chunks.js +5 -0
  144. package/dist/core/feed/messages.js +5 -5
  145. package/dist/core/grants/mirror.d.ts +15 -0
  146. package/dist/core/grants/mirror.js +15 -3
  147. package/dist/core/grants/on-sync.d.ts +9 -5
  148. package/dist/core/grants/on-sync.js +1 -1
  149. package/dist/core/grants/remove.d.ts +1 -6
  150. package/dist/core/grants/remove.js +1 -1
  151. package/dist/core/grants/sync.js +1 -1
  152. package/dist/core/grants/watch.d.ts +15 -9
  153. package/dist/core/grants/watch.js +1 -1
  154. package/dist/core/graph/custom.js +8 -8
  155. package/dist/core/graph/jobs.d.ts +83 -5
  156. package/dist/core/graph/jobs.js +11 -2
  157. package/dist/core/graph/kinds/job.js +2 -2
  158. package/dist/core/graph/names.js +7 -7
  159. package/dist/core/graph/objects.d.ts +5 -1
  160. package/dist/core/graph/objects.js +11 -11
  161. package/dist/core/graph/reader.d.ts +3 -0
  162. package/dist/core/graph/reader.js +3 -3
  163. package/dist/core/graph/repo-sync/identity.d.ts +3 -1
  164. package/dist/core/graph/repo-sync/identity.js +1 -1
  165. package/dist/core/graph/repo-sync/repos.d.ts +1 -1
  166. package/dist/core/graph/repo-sync/repos.js +2 -2
  167. package/dist/core/graph/repo-sync/sync.js +2 -2
  168. package/dist/core/installed-plugins.js +1 -1
  169. package/dist/core/keybindings/persistence.d.ts +1 -1
  170. package/dist/core/keybindings/persistence.js +1 -1
  171. package/dist/core/layout-migrate/loose-keys.d.ts +1 -1
  172. package/dist/core/layout-migrate/loose-keys.js +1 -1
  173. package/dist/core/ledger/account.d.ts +12 -0
  174. package/dist/core/ledger/account.js +2 -0
  175. package/dist/core/ledger/charges.d.ts +2 -2
  176. package/dist/core/ledger/charges.js +1 -1
  177. package/dist/core/ledger/check.d.ts +5 -1
  178. package/dist/core/ledger/check.js +1 -7
  179. package/dist/core/ledger/chunks.d.ts +8 -0
  180. package/dist/core/ledger/chunks.js +2 -0
  181. package/dist/core/ledger/index.d.ts +2 -1
  182. package/dist/core/ledger/index.js +1 -1
  183. package/dist/core/ledger/infra-allowance.d.ts +9 -0
  184. package/dist/core/ledger/infra-allowance.js +1 -0
  185. package/dist/core/ledger/limits.js +3 -3
  186. package/dist/core/ledger/payer.d.ts +1 -1
  187. package/dist/core/ledger/payer.js +1 -1
  188. package/dist/core/ledger/read.d.ts +14 -4
  189. package/dist/core/ledger/read.js +2 -3
  190. package/dist/core/ledger/totals.d.ts +5 -16
  191. package/dist/core/ledger/totals.js +4 -4
  192. package/dist/core/ledger/types.d.ts +12 -3
  193. package/dist/core/llm/run.js +2 -2
  194. package/dist/core/managed-providers.d.ts +72 -0
  195. package/dist/core/managed-providers.js +1 -0
  196. package/dist/core/model-auth/api-credential-store.d.ts +10 -0
  197. package/dist/core/model-auth/api-credential-store.js +1 -0
  198. package/dist/core/model-auth/daemon-login.d.ts +1 -1
  199. package/dist/core/model-auth/daemon-login.js +1 -1
  200. package/dist/core/model-auth/flows.d.ts +5 -4
  201. package/dist/core/model-auth/flows.js +1 -1
  202. package/dist/core/model-auth/handoff-jti.d.ts +3 -4
  203. package/dist/core/model-auth/handoff-jti.js +1 -1
  204. package/dist/core/model-auth/readiness.js +1 -1
  205. package/dist/core/model-config.d.ts +1 -1
  206. package/dist/core/model-config.js +1 -1
  207. package/dist/core/model-routes-pool.d.ts +14 -0
  208. package/dist/core/model-routes-pool.js +1 -0
  209. package/dist/core/model-routes.d.ts +11 -16
  210. package/dist/core/model-routes.js +1 -1
  211. package/dist/core/peer/ingest.d.ts +2 -0
  212. package/dist/core/peer/ingest.js +1 -1
  213. package/dist/core/peer/stubs.d.ts +8 -0
  214. package/dist/core/peer/stubs.js +1 -1
  215. package/dist/core/permissions/evaluator.d.ts +7 -2
  216. package/dist/core/permissions/evaluator.js +2 -2
  217. package/dist/core/plugin-env.js +1 -1
  218. package/dist/core/pool-credential-store.d.ts +2 -5
  219. package/dist/core/pool-credential-store.js +1 -1
  220. package/dist/core/profiles/app-env-store.d.ts +5 -5
  221. package/dist/core/profiles/app-env-store.js +1 -2
  222. package/dist/core/profiles/default-binding.d.ts +5 -5
  223. package/dist/core/profiles/default-binding.js +1 -1
  224. package/dist/core/profiles/env-store.d.ts +10 -21
  225. package/dist/core/profiles/env-store.js +1 -2
  226. package/dist/core/profiles/manifest.d.ts +14 -18
  227. package/dist/core/profiles/manifest.js +1 -1
  228. package/dist/core/profiles/relocate.js +1 -1
  229. package/dist/core/profiles/select.js +21 -21
  230. package/dist/core/provider-credential.d.ts +1 -1
  231. package/dist/core/provider-credential.js +1 -1
  232. package/dist/core/provider-management.d.ts +3 -4
  233. package/dist/core/provider-management.js +1 -1
  234. package/dist/core/providers/bundles.js +2 -2
  235. package/dist/core/providers/call.d.ts +3 -34
  236. package/dist/core/providers/description.d.ts +34 -0
  237. package/dist/core/providers/description.js +0 -0
  238. package/dist/core/providers/token-cache.d.ts +14 -14
  239. package/dist/core/providers/token-cache.js +1 -1
  240. package/dist/core/review/companion.js +1 -1
  241. package/dist/core/runs/activity.d.ts +1 -1
  242. package/dist/core/runs/activity.js +1 -1
  243. package/dist/core/runs/events.d.ts +7 -5
  244. package/dist/core/runs/events.js +2 -6
  245. package/dist/core/runs/operations.d.ts +1 -1
  246. package/dist/core/runs/operations.js +6 -6
  247. package/dist/core/runtime/bearings.js +1 -1
  248. package/dist/core/runtime/broker/attachments-fetch.d.ts +5 -0
  249. package/dist/core/runtime/broker/attachments-fetch.js +1 -0
  250. package/dist/core/runtime/broker/bash-job-launch.d.ts +4 -2
  251. package/dist/core/runtime/broker/bash-job-launch.js +1 -1
  252. package/dist/core/runtime/broker/boot-state.d.ts +9 -0
  253. package/dist/core/runtime/broker/boot-state.js +1 -0
  254. package/dist/core/runtime/broker/cli-relay.d.ts +2 -1
  255. package/dist/core/runtime/broker/cli-relay.js +1 -1
  256. package/dist/core/runtime/broker/client-registry.d.ts +3 -3
  257. package/dist/core/runtime/broker/daemon-ops.d.ts +10 -1
  258. package/dist/core/runtime/broker/daemon-ops.js +1 -1
  259. package/dist/core/runtime/broker/fault-retry.d.ts +2 -0
  260. package/dist/core/runtime/broker/fault-retry.js +1 -1
  261. package/dist/core/runtime/broker/frame-engine-control.js +1 -1
  262. package/dist/core/runtime/broker/held-deferred-inbox.d.ts +3 -0
  263. package/dist/core/runtime/broker/held-deferred-inbox.js +1 -1
  264. package/dist/core/runtime/broker/job-reporter.d.ts +18 -0
  265. package/dist/core/runtime/broker/job-reporter.js +2 -0
  266. package/dist/core/runtime/broker/model-adapter.d.ts +3 -0
  267. package/dist/core/runtime/broker/model-adapter.js +3 -2
  268. package/dist/core/runtime/broker/signal-stream.js +1 -1
  269. package/dist/core/runtime/broker/spilled-body.d.ts +5 -0
  270. package/dist/core/runtime/broker/spilled-body.js +1 -0
  271. package/dist/core/runtime/broker/summaries-post.d.ts +5 -0
  272. package/dist/core/runtime/broker/summaries-post.js +1 -0
  273. package/dist/core/runtime/broker/tool-groups.d.ts +3 -0
  274. package/dist/core/runtime/broker/tool-groups.js +1 -1
  275. package/dist/core/runtime/broker/turn-replies.d.ts +1 -0
  276. package/dist/core/runtime/broker/turn-replies.js +1 -1
  277. package/dist/core/runtime/broker-persona-guidance.js +2 -2
  278. package/dist/core/runtime/broker.js +1 -1
  279. package/dist/core/runtime/deliver-live.js +1 -1
  280. package/dist/core/runtime/first-boot-rows.d.ts +8 -0
  281. package/dist/core/runtime/first-boot-rows.js +2 -0
  282. package/dist/core/runtime/fleet.d.ts +13 -12
  283. package/dist/core/runtime/front-door-login.js +1 -1
  284. package/dist/core/runtime/front-door.js +6 -6
  285. package/dist/core/runtime/headless-pi.js +1 -1
  286. package/dist/core/runtime/host.d.ts +14 -3
  287. package/dist/core/runtime/host.js +3 -3
  288. package/dist/core/runtime/invocation.d.ts +6 -0
  289. package/dist/core/runtime/kickoff.d.ts +2 -14
  290. package/dist/core/runtime/kickoff.js +17 -19
  291. package/dist/core/runtime/launch-config-worker.js +1 -1
  292. package/dist/core/runtime/launch.js +2 -2
  293. package/dist/core/runtime/model-registry.js +1 -1
  294. package/dist/core/runtime/node-read.d.ts +4 -6
  295. package/dist/core/runtime/node-read.js +3 -3
  296. package/dist/core/runtime/nodes.js +1 -1
  297. package/dist/core/runtime/outcome-document.d.ts +0 -1
  298. package/dist/core/runtime/outcome-document.js +1 -1
  299. package/dist/core/runtime/output-result.d.ts +15 -0
  300. package/dist/core/runtime/output-result.js +5 -0
  301. package/dist/core/runtime/placement.d.ts +17 -1
  302. package/dist/core/runtime/placement.js +1 -1
  303. package/dist/core/runtime/provider-credential-gate.d.ts +6 -2
  304. package/dist/core/runtime/provider-credential-gate.js +2 -2
  305. package/dist/core/runtime/recovery-hold.d.ts +21 -2
  306. package/dist/core/runtime/recovery-hold.js +2 -1
  307. package/dist/core/runtime/recycle.js +1 -1
  308. package/dist/core/runtime/reset.js +1 -1
  309. package/dist/core/runtime/revive.d.ts +2 -2
  310. package/dist/core/runtime/revive.js +2 -2
  311. package/dist/core/runtime/runner/blaxel/client.d.ts +81 -0
  312. package/dist/core/runtime/runner/blaxel/client.js +1 -0
  313. package/dist/core/runtime/runner/blaxel/image-build.d.ts +74 -0
  314. package/dist/core/runtime/runner/blaxel/image-build.js +5 -0
  315. package/dist/core/runtime/runner/blaxel/runner.d.ts +41 -0
  316. package/dist/core/runtime/runner/blaxel/runner.js +3 -0
  317. package/dist/core/runtime/runner/index.d.ts +8 -0
  318. package/dist/core/runtime/runner/index.js +1 -0
  319. package/dist/core/runtime/runner/process.d.ts +11 -0
  320. package/dist/core/runtime/runner/process.js +1 -0
  321. package/dist/core/runtime/runner/types.d.ts +95 -0
  322. package/dist/core/runtime/runner/types.js +0 -0
  323. package/dist/core/runtime/situational-context.d.ts +3 -6
  324. package/dist/core/runtime/situational-context.js +2 -2
  325. package/dist/core/runtime/situational-live.js +1 -1
  326. package/dist/core/runtime/spawn-env-rows.d.ts +5 -0
  327. package/dist/core/runtime/spawn-env-rows.js +1 -0
  328. package/dist/core/runtime/spawn-env.d.ts +4 -18
  329. package/dist/core/runtime/spawn-env.js +1 -1
  330. package/dist/core/runtime/spawn.js +2 -2
  331. package/dist/core/runtime/stop-guard.d.ts +1 -1
  332. package/dist/core/runtime/stop-guard.js +2 -8
  333. package/dist/core/runtime/structured-output.d.ts +0 -67
  334. package/dist/core/runtime/structured-output.js +3 -8
  335. package/dist/core/runtime/tmux-driver.d.ts +8 -0
  336. package/dist/core/runtime/tmux-driver.js +6 -6
  337. package/dist/core/runtime/view-socket.d.ts +20 -0
  338. package/dist/core/runtime/view-socket.js +3 -1
  339. package/dist/core/runtime/warm-pool.d.ts +13 -1
  340. package/dist/core/runtime/warm-pool.js +1 -1
  341. package/dist/core/scoped-state/legacy-profiles.d.ts +11 -0
  342. package/dist/core/scoped-state/legacy-profiles.js +1 -0
  343. package/dist/core/scoped-state/materialized-plugins.d.ts +18 -0
  344. package/dist/core/scoped-state/materialized-plugins.js +1 -0
  345. package/dist/core/scoped-state/migrate.d.ts +8 -1
  346. package/dist/core/scoped-state/migrate.js +3 -3
  347. package/dist/core/scoped-state/person-rows.d.ts +10 -0
  348. package/dist/core/scoped-state/person-rows.js +6 -0
  349. package/dist/core/scoped-state/person-store.d.ts +72 -0
  350. package/dist/core/scoped-state/person-store.js +1 -0
  351. package/dist/core/secrets/blaxel-launch.d.ts +24 -0
  352. package/dist/core/secrets/blaxel-launch.js +4 -0
  353. package/dist/core/secrets/blaxel-register.d.ts +2 -0
  354. package/dist/core/secrets/blaxel-register.js +1 -0
  355. package/dist/core/secrets/env-rows.d.ts +17 -0
  356. package/dist/core/secrets/env-rows.js +4 -0
  357. package/dist/core/secrets/environment-owner.d.ts +8 -0
  358. package/dist/core/secrets/environment-owner.js +1 -0
  359. package/dist/core/secrets/environment-secrets.d.ts +14 -0
  360. package/dist/core/secrets/environment-secrets.js +1 -0
  361. package/dist/core/secrets/index.d.ts +2 -0
  362. package/dist/core/secrets/index.js +1 -0
  363. package/dist/core/secrets/key.d.ts +3 -0
  364. package/dist/core/secrets/key.js +2 -0
  365. package/dist/core/secrets/seal.d.ts +18 -0
  366. package/dist/core/secrets/seal.js +1 -0
  367. package/dist/core/spaces/mounts.d.ts +1 -1
  368. package/dist/core/spaces/mounts.js +1 -1
  369. package/dist/core/spaces/process.d.ts +1 -1
  370. package/dist/core/spaces/stop.d.ts +7 -5
  371. package/dist/core/spaces/stop.js +2 -2
  372. package/dist/core/spaces/users.d.ts +2 -1
  373. package/dist/core/spaces/users.js +1 -1
  374. package/dist/core/storage/attachments.d.ts +11 -8
  375. package/dist/core/storage/attachments.js +1 -1
  376. package/dist/core/storage/tables.d.ts +4 -0
  377. package/dist/core/storage/tables.js +3 -3
  378. package/dist/core/subscription-state.d.ts +34 -72
  379. package/dist/core/subscription-state.js +1 -4
  380. package/dist/core/substrate/delivery/plan.js +1 -1
  381. package/dist/core/user-settings.js +1 -1
  382. package/dist/daemon/api/app-listener.js +10 -10
  383. package/dist/daemon/api/auth/person-bearer.d.ts +14 -0
  384. package/dist/daemon/api/auth/person-bearer.js +1 -0
  385. package/dist/daemon/api/bridge.js +4 -4
  386. package/dist/daemon/api/document-listener.js +3 -3
  387. package/dist/daemon/api/environment-of.d.ts +18 -0
  388. package/dist/daemon/api/environment-of.js +5 -0
  389. package/dist/daemon/api/handlers/analytics.js +1 -1
  390. package/dist/daemon/api/handlers/app-profiles.d.ts +2 -2
  391. package/dist/daemon/api/handlers/app-profiles.js +1 -1
  392. package/dist/daemon/api/handlers/bash-jobs.js +1 -1
  393. package/dist/daemon/api/handlers/bash.js +1 -1
  394. package/dist/daemon/api/handlers/broker-ops.d.ts +3 -0
  395. package/dist/daemon/api/handlers/broker-ops.js +1 -1
  396. package/dist/daemon/api/handlers/broker-recovery.js +1 -1
  397. package/dist/daemon/api/handlers/broker-signals.d.ts +0 -3
  398. package/dist/daemon/api/handlers/broker-signals.js +2 -2
  399. package/dist/daemon/api/handlers/canvas.js +4 -4
  400. package/dist/daemon/api/handlers/charges.d.ts +1 -1
  401. package/dist/daemon/api/handlers/charges.js +1 -1
  402. package/dist/daemon/api/handlers/conversations.d.ts +2 -0
  403. package/dist/daemon/api/handlers/conversations.js +3 -0
  404. package/dist/daemon/api/handlers/crons.js +1 -1
  405. package/dist/daemon/api/handlers/daemon.js +1 -1
  406. package/dist/daemon/api/handlers/delivery.d.ts +1 -1
  407. package/dist/daemon/api/handlers/delivery.js +1 -1
  408. package/dist/daemon/api/handlers/docs.js +1 -1
  409. package/dist/daemon/api/handlers/exec.js +1 -1
  410. package/dist/daemon/api/handlers/execution-start.d.ts +2 -0
  411. package/dist/daemon/api/handlers/execution-start.js +2 -0
  412. package/dist/daemon/api/handlers/files.js +1 -1
  413. package/dist/daemon/api/handlers/git-credential.d.ts +11 -0
  414. package/dist/daemon/api/handlers/git-credential.js +1 -0
  415. package/dist/daemon/api/handlers/hook-exec.d.ts +1 -1
  416. package/dist/daemon/api/handlers/hook-exec.js +1 -1
  417. package/dist/daemon/api/handlers/human-requests.js +1 -1
  418. package/dist/daemon/api/handlers/inbox.js +1 -1
  419. package/dist/daemon/api/handlers/messages.js +1 -1
  420. package/dist/daemon/api/handlers/model-config.js +1 -1
  421. package/dist/daemon/api/handlers/modelauth.d.ts +1 -1
  422. package/dist/daemon/api/handlers/modelauth.js +1 -1
  423. package/dist/daemon/api/handlers/node-events.d.ts +6 -0
  424. package/dist/daemon/api/handlers/node-events.js +3 -3
  425. package/dist/daemon/api/handlers/node-outcomes.js +1 -1
  426. package/dist/daemon/api/handlers/node-records.js +3 -2
  427. package/dist/daemon/api/handlers/nodes.js +1 -1
  428. package/dist/daemon/api/handlers/objects.js +3 -3
  429. package/dist/daemon/api/handlers/profiles.js +1 -1
  430. package/dist/daemon/api/handlers/providers.js +1 -1
  431. package/dist/daemon/api/handlers/reports.js +9 -13
  432. package/dist/daemon/api/handlers/reviews.js +1 -1
  433. package/dist/daemon/api/handlers/runs.js +1 -1
  434. package/dist/daemon/api/handlers/settings.d.ts +2 -0
  435. package/dist/daemon/api/handlers/settings.js +1 -0
  436. package/dist/daemon/api/handlers/structured-requests.js +1 -1
  437. package/dist/daemon/api/handlers/vendor-status.d.ts +1 -1
  438. package/dist/daemon/api/handlers/vendor-status.js +1 -1
  439. package/dist/daemon/api/handlers/worktree.js +1 -1
  440. package/dist/daemon/api/map.d.ts +2 -2
  441. package/dist/daemon/api/map.js +2 -2
  442. package/dist/daemon/api/operations.js +1 -1
  443. package/dist/daemon/api/reader.d.ts +8 -1
  444. package/dist/daemon/api/reader.js +1 -1
  445. package/dist/daemon/api/router.d.ts +4 -2
  446. package/dist/daemon/api/router.js +1 -1
  447. package/dist/daemon/api/server.d.ts +15 -3
  448. package/dist/daemon/api/server.js +1 -1
  449. package/dist/daemon/api/vendor-signin.d.ts +2 -1
  450. package/dist/daemon/api/vendor-signin.js +20 -20
  451. package/dist/daemon/api/viewer-presence.d.ts +20 -6
  452. package/dist/daemon/api/viewer-presence.js +2 -1
  453. package/dist/daemon/broker-signals/bus.d.ts +48 -11
  454. package/dist/daemon/broker-signals/bus.js +1 -1
  455. package/dist/daemon/cron/armed-context.js +1 -1
  456. package/dist/daemon/cron/lease-recovery.js +1 -1
  457. package/dist/daemon/cron/live-runs.d.ts +6 -0
  458. package/dist/daemon/cron/live-runs.js +1 -1
  459. package/dist/daemon/cron/run-socket.js +1 -1
  460. package/dist/daemon/cron-run.js +2 -2
  461. package/dist/daemon/crtrd-cli.js +1 -1
  462. package/dist/daemon/crtrd.d.ts +10 -0
  463. package/dist/daemon/crtrd.js +18 -17
  464. package/dist/daemon/delivery/run-delivery.d.ts +1 -1
  465. package/dist/daemon/delivery/run-delivery.js +1 -1
  466. package/dist/daemon/due-sources.d.ts +1 -1
  467. package/dist/daemon/due-sources.js +1 -1
  468. package/dist/daemon/due.js +7 -6
  469. package/dist/daemon/fleet.d.ts +6 -6
  470. package/dist/daemon/fleet.js +9 -9
  471. package/dist/daemon/park-activity.d.ts +2 -1
  472. package/dist/daemon/park-activity.js +1 -1
  473. package/dist/daemon/park-pending.d.ts +20 -13
  474. package/dist/daemon/park-pending.js +3 -1
  475. package/dist/daemon/profile-delete.js +1 -1
  476. package/dist/daemon/reconcilers/bash-deadline.d.ts +15 -10
  477. package/dist/daemon/reconcilers/bash-deadline.js +1 -3
  478. package/dist/daemon/reconcilers/broker-supervision.d.ts +13 -3
  479. package/dist/daemon/reconcilers/broker-supervision.js +4 -4
  480. package/dist/daemon/reconcilers/cron-lane.d.ts +0 -1
  481. package/dist/daemon/reconcilers/cron-lane.js +1 -1
  482. package/dist/daemon/reconcilers/fault-retry-backstop.d.ts +2 -9
  483. package/dist/daemon/reconcilers/fault-retry-backstop.js +1 -1
  484. package/dist/daemon/reconcilers/grant-effects.d.ts +8 -0
  485. package/dist/daemon/reconcilers/grant-effects.js +1 -0
  486. package/dist/daemon/reconcilers/grove-instance-sweep.d.ts +1 -3
  487. package/dist/daemon/reconcilers/grove-instance-sweep.js +1 -1
  488. package/dist/daemon/reconcilers/ledger-r2.d.ts +27 -0
  489. package/dist/daemon/reconcilers/ledger-r2.js +7 -0
  490. package/dist/daemon/reconcilers/ledger-sandbox.d.ts +55 -0
  491. package/dist/daemon/reconcilers/ledger-sandbox.js +9 -0
  492. package/dist/daemon/reconcilers/ledger-storage.d.ts +22 -0
  493. package/dist/daemon/reconcilers/ledger-storage.js +5 -0
  494. package/dist/daemon/reconcilers/live-obligation.d.ts +3 -2
  495. package/dist/daemon/reconcilers/live-obligation.js +1 -1
  496. package/dist/daemon/reconcilers/managed-worktree-sweep.d.ts +0 -5
  497. package/dist/daemon/reconcilers/managed-worktree-sweep.js +1 -1
  498. package/dist/daemon/reconcilers/node-deadline.d.ts +2 -1
  499. package/dist/daemon/reconcilers/node-deadline.js +1 -1
  500. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.d.ts +1 -2
  501. package/dist/daemon/reconcilers/node-lifecycle/freeze-lane.js +1 -1
  502. package/dist/daemon/reconcilers/node-lifecycle/remote-wake.d.ts +31 -0
  503. package/dist/daemon/reconcilers/node-lifecycle/remote-wake.js +1 -0
  504. package/dist/daemon/reconcilers/node-lifecycle/requested-stops.d.ts +5 -0
  505. package/dist/daemon/reconcilers/node-lifecycle/requested-stops.js +2 -0
  506. package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -1
  507. package/dist/daemon/reconcilers/pending-review-submit.js +1 -1
  508. package/dist/daemon/reconcilers/recipe-image.d.ts +49 -0
  509. package/dist/daemon/reconcilers/recipe-image.js +7 -0
  510. package/dist/daemon/reconcilers/row-claim.d.ts +19 -0
  511. package/dist/daemon/reconcilers/row-claim.js +2 -0
  512. package/dist/daemon/reconcilers/storage-due-work.d.ts +18 -3
  513. package/dist/daemon/reconcilers/storage-due-work.js +2 -1
  514. package/dist/daemon/reconcilers/storage-maintenance.d.ts +5 -13
  515. package/dist/daemon/reconcilers/storage-maintenance.js +1 -1
  516. package/dist/daemon/reconcilers/structured-request-lane.js +1 -1
  517. package/dist/daemon/reconcilers/throttled-lane.d.ts +11 -0
  518. package/dist/daemon/reconcilers/throttled-lane.js +1 -0
  519. package/dist/daemon/review/finish.js +1 -1
  520. package/dist/daemon/run-notices.d.ts +3 -0
  521. package/dist/daemon/run-notices.js +1 -1
  522. package/dist/daemon/runs/append-section.d.ts +4 -1
  523. package/dist/daemon/runs/append-section.js +2 -2
  524. package/dist/daemon/runs/observer.d.ts +3 -2
  525. package/dist/daemon/runs/observer.js +3 -2
  526. package/dist/daemon/runs/view-transport.d.ts +19 -0
  527. package/dist/daemon/runs/view-transport.js +1 -0
  528. package/dist/daemon/structured-requests/boot.d.ts +2 -1
  529. package/dist/daemon/structured-requests/boot.js +1 -1
  530. package/dist/daemon/structured-requests/effects.d.ts +4 -3
  531. package/dist/daemon/structured-requests/effects.js +1 -1
  532. package/dist/daemon/structured-requests/notifier.d.ts +2 -0
  533. package/dist/daemon/structured-requests/notifier.js +1 -1
  534. package/dist/daemon/structured-requests/sidecar.d.ts +4 -3
  535. package/dist/daemon/structured-requests/sidecar.js +1 -1
  536. package/dist/launcher/validate.js +1 -1
  537. package/dist/migrations/004-canvas-documents/index.js +2 -2
  538. package/dist/pi-extensions/broker-local.d.ts +3 -3
  539. package/dist/pi-extensions/broker-local.js +1 -2
  540. package/dist/pi-extensions/canvas-bash-valve.js +6 -6
  541. package/dist/pi-extensions/canvas-context-intro.js +2 -2
  542. package/dist/pi-extensions/canvas-elapsed.js +2 -2
  543. package/dist/pi-extensions/canvas-goal-capture.js +1 -1
  544. package/dist/pi-extensions/canvas-inbox-watcher.js +2 -2
  545. package/dist/pi-extensions/canvas-review-boundary.d.ts +11 -1
  546. package/dist/pi-extensions/canvas-review-boundary.js +3 -3
  547. package/dist/pi-extensions/canvas-stophook.js +1 -1
  548. package/dist/pi-extensions/canvas-structured-output.d.ts +5 -3
  549. package/dist/pi-extensions/canvas-structured-output.js +6 -11
  550. package/dist/pi-extensions/canvas-tool-guide.d.ts +9 -2
  551. package/dist/pi-extensions/canvas-tool-guide.js +6 -6
  552. package/dist/shared/inbox-entry-body.js +7 -7
  553. package/dist/types.d.ts +12 -0
  554. package/docs/sdk/release-notes.md +4 -0
  555. package/package.json +7 -4
  556. package/packages/crouter-identity/package.json +1 -1
  557. package/runtime.lock.json +13 -13
  558. package/scripts/git-credential-crtr +33 -0
  559. package/scripts/sandbox-bootstrap.sh +54 -0
  560. package/scripts/sandbox-start.mjs +320 -0
  561. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +0 -78
  562. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +0 -1179
  563. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +0 -1406
  564. package/dist/core/conversation-store/file-store.d.ts +0 -37
  565. package/dist/core/conversation-store/file-store.js +0 -9
  566. package/dist/core/conversation-store/listener.d.ts +0 -4
  567. package/dist/core/conversation-store/listener.js +0 -8
  568. package/dist/core/scoped-state/profiles.d.ts +0 -27
  569. package/dist/core/scoped-state/profiles.js +0 -1
  570. package/dist/core/scoped-state/providers.d.ts +0 -24
  571. package/dist/core/scoped-state/providers.js +0 -1
  572. package/dist/core/scoped-state/settings.d.ts +0 -28
  573. package/dist/core/scoped-state/settings.js +0 -1
@@ -1 +1 @@
1
- var n=Object.defineProperty;var r=(o,t)=>n(o,"name",{value:t,configurable:!0});const e=Symbol.for("@crouton-kit/crtr:held-deferred-inbox-prompt-join"),u=Symbol.for("@crouton-kit/crtr:broker-idle-turn-start"),c=Symbol.for("@crouton-kit/crtr:broker-run-turn-busy");function f(){const o=globalThis[c];return typeof o=="function"&&o()}r(f,"brokerRunTurnBusy");function b(){const o=globalThis[e];return typeof o=="function"?o:void 0}r(b,"heldDeferredInboxPromptJoin");function l(){const o=globalThis[u];return typeof o=="function"?o:void 0}r(l,"brokerIdleTurnStart");export{u as BROKER_IDLE_TURN_START,c as BROKER_RUN_TURN_BUSY,e as HELD_DEFERRED_INBOX_PROMPT_JOIN,l as brokerIdleTurnStart,f as brokerRunTurnBusy,b as heldDeferredInboxPromptJoin};
1
+ var n=Object.defineProperty;var r=(o,t)=>n(o,"name",{value:t,configurable:!0});const e=Symbol.for("@crouton-kit/crtr:held-deferred-inbox-prompt-join"),i=Symbol.for("@crouton-kit/crtr:broker-idle-turn-start"),u=Symbol.for("@crouton-kit/crtr:broker-run-turn-busy"),c=Symbol.for("@crouton-kit/crtr:broker-dispose-and-exit");function s(){const o=globalThis[c];return typeof o=="function"?o:void 0}r(s,"brokerDisposeAndExit");function b(){const o=globalThis[u];return typeof o=="function"&&o()}r(b,"brokerRunTurnBusy");function p(){const o=globalThis[e];return typeof o=="function"?o:void 0}r(p,"heldDeferredInboxPromptJoin");function d(){const o=globalThis[i];return typeof o=="function"?o:void 0}r(d,"brokerIdleTurnStart");export{c as BROKER_DISPOSE_AND_EXIT,i as BROKER_IDLE_TURN_START,u as BROKER_RUN_TURN_BUSY,e as HELD_DEFERRED_INBOX_PROMPT_JOIN,s as brokerDisposeAndExit,d as brokerIdleTurnStart,b as brokerRunTurnBusy,p as heldDeferredInboxPromptJoin};
@@ -0,0 +1,18 @@
1
+ import type { JobReportRequest } from '../../../api/dto/delivery.js';
2
+ /** Job output is reported in chunks of this size; the control plane stores one blob per chunk. */
3
+ export declare const JOB_OUTPUT_CHUNK_BYTES: number;
4
+ export type PostJobReport = (jobId: string, request: Omit<JobReportRequest, 'expected_execution_id'>) => Promise<void>;
5
+ export declare class JobReporter {
6
+ private readonly contextDir;
7
+ private readonly post;
8
+ /** What was last sent for each job, so an unchanged process identity or activity sample is not sent again. */
9
+ private readonly sent;
10
+ constructor(contextDir: string, post: PostJobReport);
11
+ /** One pass over this node's backgrounded jobs. Never throws: a failed report is retried on the next pass. */
12
+ tick(): Promise<void>;
13
+ private report;
14
+ /** Report the log from `offset` on: chunks already full are final, the one holding `offset` is sent again as it grows. */
15
+ private uploadOutput;
16
+ /** Run `tick` every couple of seconds until the process ends; returns the stop function. */
17
+ start(): () => void;
18
+ }
@@ -0,0 +1,2 @@
1
+ var l=Object.defineProperty;var f=(o,t)=>l(o,"name",{value:t,configurable:!0});import{existsSync as p,readFileSync as m,readdirSync as v,statSync as x}from"node:fs";import{readFileBeneath as S,writeFileBeneath as b}from"../../spaces/open-beneath.js";import{bashJobPaths as _,bashJobsDir as w,isBashJobProcessConfirmedGone as J,isSafeBashJobId as O,readJobSupervisorState as y,signalBashJob as B}from"../../bash-jobs.js";import{ApiError as g}from"../../../api/errors.js";const c=64*1024,C=2e3;function R(o){try{const t=JSON.parse(S(o.root,o.jobReported).toString("utf8"));return{offset:Number.isSafeInteger(t.offset)?t.offset:0,done:t.done===!0}}catch{return{offset:0,done:!1}}}f(R,"readReported");function u(o,t){b(o.root,o.jobReported,JSON.stringify(t),{atomic:!0})}f(u,"writeReported");class A{static{f(this,"JobReporter")}contextDir;post;sent=new Map;constructor(t,i){this.contextDir=t,this.post=i}async tick(){let t;try{t=v(w(this.contextDir)).filter(O)}catch{return}for(const i of t)try{await this.report(i)}catch(n){n instanceof g&&(n.status===404||n.status===409)||process.stderr.write(`crtr: job ${i} report failed: ${n.message}
2
+ `)}}async report(t){const i=_(this.contextDir,t);if(!p(i.jobBg)||!p(i.cmdSh))return;const n=R(i);if(n.done)return;const e=y(this.contextDir,t),s=this.sent.get(t)??{};this.sent.set(t,s);try{const r={...e.pgid===void 0||e.pgid===s.pgid?{}:{pgid:e.pgid},...e.pgidIdentity===void 0||e.pgidIdentity===s.identity?{}:{pgid_identity:e.pgidIdentity}},d=e.activity===void 0?void 0:JSON.stringify(e.activity),a=e.activity===void 0||d===s.activity?{}:{activity:{last_ms:e.activity.lastActivityMs,sampled_ms:e.activity.sampledAtMs,files:e.activity.files}};(Object.keys(r).length>0||Object.keys(a).length>0)&&(await this.post(t,{...r,...a}),e.pgid!==void 0&&(s.pgid=e.pgid),e.pgidIdentity!==void 0&&(s.identity=e.pgidIdentity),s.activity=d);const h=e.exitCode===void 0&&J(e.pgid,e.pgidIdentity)&&y(this.contextDir,t).exitCode===void 0;n.offset=await this.uploadOutput(t,i,n.offset),u(i,n),(e.exitCode!==void 0||h)&&(await this.post(t,e.exitCode!==void 0?{exit_code:e.exitCode}:{vanished:!0}),u(i,{...n,done:!0}),this.sent.delete(t))}catch(r){if(!(r instanceof g&&r.code==="job_not_running"))throw r;const d=e.pgid,a=e.pgidIdentity;d!==void 0&&a!==void 0&&e.exitCode===void 0&&await B(d,a,void 0),u(i,{...n,done:!0}),this.sent.delete(t)}}async uploadOutput(t,i,n){let e;try{e=x(i.jobLog).size}catch{return n}if(e<=n)return n;const s=m(i.jobLog);for(let r=Math.floor(n/c);r*c<s.length;r++){const d=s.subarray(r*c,(r+1)*c);await this.post(t,{output:{seq:r,data_base64:d.toString("base64")}}),n=r*c+d.length}return n}start(){let t=!1;const i=setInterval(()=>{t||(t=!0,this.tick().finally(()=>{t=!1}))},C);return i.unref(),()=>clearInterval(i)}}export{c as JOB_OUTPUT_CHUNK_BYTES,A as JobReporter};
@@ -20,5 +20,8 @@ export declare function refusalRetryAt(message: {
20
20
  * too. */
21
21
  export declare function wireHistory(messages: Context['messages']): Context['messages'];
22
22
  export declare function requestBody(model: Model<any>, context: Context, options: ModelsSimpleStreamOptions, intentOverride?: string): Record<string, unknown>;
23
+ /** The real response under a deferred-head framing (`daemon/api/deferred-head.ts`): the magic line, keep-alive
24
+ * blank lines, one JSON head line, then the body unchanged. Any other response is returned as it is. */
25
+ export declare function unwrapDeferredHead(response: Response): Promise<Response>;
23
26
  /** One pi stream, backed exclusively by the authenticated daemon llm route. `intent` replaces the node's own `CRTR_MODEL_INTENT` for one stream: a background one-shot of an app-paid node asks for `app/light`, not the node's rung. */
24
27
  export declare function streamBrokerModel(model: Model<any>, context: Context, options?: ModelsSimpleStreamOptions, intent?: string): AssistantMessageEventStream;
@@ -1,2 +1,3 @@
1
- var W=Object.defineProperty;var c=(e,t)=>W(e,"name",{value:t,configurable:!0});import{setTimeout as j}from"node:timers/promises";import{createAssistantMessageEventStream as J,getCurrentSystemPrompt as Y,getCurrentTools as z}from"@earendil-works/pi-ai";import{socketFetch as H}from"../../../api/node-transport.js";import{apiSocketPath as X}from"../../canvas/paths.js";import{currentNodeToken as G}from"./node-token.js";import{currentCausedBy as K}from"./turn-cause.js";import{envModelExact as C,envModelIntent as V}from"../../../shared/env.js";import{MODEL_CONTEXT_BODY_MAX_BYTES as b}from"../../llm/body-limits.js";import{modelRequestFromConfig as Q}from"../../model-routes.js";import{parseProviderRateLimit as Z,providerFailureDiagnostic as E}from"../../provider-failure.js";import{UPSTREAM_MODEL_UNAVAILABLE as R}from"../../fault-classifier.js";function ye(e,t){e.checkAuth=async n=>e.getProvider(n)?{type:"api_key"}:void 0,e.getAvailable=async n=>e.getModels(n),e.getAvailableSnapshot=()=>e.getModels(),e.streamSimple=(n,d,r)=>re(n,d,r,t)}c(ye,"configureBrokerModelRuntime");const ee=300,B="crtr:llm-refusal";class k extends Error{static{c(this,"LlmRefusalError")}retryAt;rateLimit;code;status;constructor(t,n,d,r,o){super(t),this.retryAt=n,this.rateLimit=d,this.code=r,this.status=o}}class S extends Error{static{c(this,"UpstreamModelUnavailableError")}}function N(e,t){const n=e===void 0?"the request body":`the request body (${e} bytes)`;return new Error(`request_too_large: ${n} exceeds the ${t}-byte model request limit; compact the conversation to shrink the context`)}c(N,"contextTooLargeError");function A(e){const t=e.details?.rate_limit;if(!t||typeof t!="object")return;const n=Z(t);if(n===void 0)return;const{provider:d,model:r}=t;return typeof d=="string"&&d!==""&&typeof r=="string"&&r!==""?{...n,model:`${d}/${r}`}:n}c(A,"refusalRateLimit");function _e(e){for(const t of e.diagnostics??[]){if(t.type!==B)continue;const n=t.details?.retryAt;if(typeof n=="number"&&Number.isFinite(n)&&n>0)return n}}c(_e,"refusalRetryAt");class D extends Error{static{c(this,"ContentFilteredError")}}function q(e){return typeof e=="string"?e:e.map(t=>t.type==="text"?{type:"text",text:t.text}:{type:"image_url",image_url:{url:`data:${t.mimeType};base64,${t.data}`}})}c(q,"wireContent");function te(e){const t=c(r=>r.role==="assistant"&&(r.stopReason==="error"||r.stopReason==="aborted"),"incomplete"),n=e.some(t)?e.filter(r=>!t(r)):e;let d=n.length;for(;d>0&&n[d-1]?.role==="assistant";)d--;return d===n.length?n:n.slice(0,d)}c(te,"wireHistory");function ne(e,t,n,d){const r=[],o=Y(t.messages),a=z(t.messages);o?r.push({role:"system",content:o}):t.systemPrompt&&r.push({role:"system",content:t.systemPrompt});for(const p of te(t.messages))p.role==="user"?r.push({role:"user",content:q(p.content)}):p.role==="toolResult"?r.push({role:"tool",content:q(p.content),tool_call_id:p.toolCallId}):p.role==="assistant"&&r.push({role:"assistant",content:p.content.filter(u=>u.type==="text").map(u=>u.text).join("")||null,tool_calls:p.content.filter(u=>u.type==="toolCall").map(u=>({id:u.id,type:"function",function:{name:u.name,arguments:JSON.stringify(u.arguments)}}))});const x=`${e.provider}/${e.id}`,_=d??V();return{model:Q(x,_,C())?.kind==="logical"?_:x,model_policy:C()?"exact":"substitute",stream:!0,messages:r,...a.length?{tools:a.map(p=>({type:"function",function:{name:p.name,description:p.description,parameters:p.parameters}}))}:{},...n.reasoning?{reasoning_effort:n.reasoning}:{},...n.temperature!==void 0?{temperature:n.temperature}:{},...n.maxTokens!==void 0?{max_tokens:n.maxTokens}:{}}}c(ne,"requestBody");function L(e,t){if(typeof t!="string")return!1;const n=t.indexOf("/");return n<1||n===t.length-1?!1:(e.provider=t.slice(0,n),e.model=t.slice(n+1),!0)}c(L,"applyServedModel");function F(e){if(e.details?.served_model!==void 0)return e.details.served_model;const t=e.details?.rate_limit;return typeof t?.provider=="string"&&typeof t.model=="string"?`${t.provider}/${t.model}`:void 0}c(F,"refusalRoute");function P(e){if(!e||typeof e!="object"||!("error"in e))throw new Error("llm returned an invalid response");const t=e.error;if(!t||typeof t.message!="string")throw new Error("llm returned an invalid refusal");return t}c(P,"parseRefusal");function oe(){const e=K();return e===void 0?{}:{"crtr-caused-by":e}}c(oe,"causedByHeader");function re(e,t,n={},d){const r=J(),o={role:"assistant",content:[],api:e.api,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()};return(async()=>{const a=G();if(!a)throw new Error("llm requires a node token");const x=JSON.stringify(ne(e,t,n,d)),_=Buffer.byteLength(x);if(_>b)throw N(_,b);let p=0;for(;;){n.signal?.throwIfAborted();const u=await H(X())("http://localhost/v1/llm",{method:"POST",headers:{authorization:`Bearer ${a}`,"content-type":"application/json",...oe()},body:x,signal:n.signal});if(!u.ok){const l=P(await u.json());if(u.status===413||l.code==="payload_too_large")throw N(_,b);if(L(o,F(l)),l.retryable!==!0)throw new k(l.message,void 0,A(l),l.code,u.status);const s=l.retry_after_s;if(typeof s!="number"||!Number.isFinite(s)||s<=0)throw l.code===R?new S(l.message):new Error(l.message);const m=ee-p;if(s>m){const f=Date.now()+s*1e3;throw new k(`${l.message} (retry after ${s}s, at ${new Date(f).toISOString()})`,f,A(l))}await j(s*1e3,void 0,{signal:n.signal}),p+=s;continue}if(!u.body)throw new Error("llm returned no stream");r.push({type:"start",partial:o});const U=u.body.getReader(),I=new TextDecoder;let g="",w="stop",M,T=!1,O=!1;const $=c(l=>{const s=JSON.parse(l);if(s.error){const i=P(s);throw L(o,F(i)),i.retryable!==!0?new k(i.message,void 0,A(i),i.code):i.code===R?new S(i.message):new Error(i.message)}if(s.served_model){if(O=!0,s.served_model.indexOf("/")<1)throw new Error("llm returned an invalid served_model");L(o,s.served_model)}const m=s.choices?.[0],f=m?.delta;if(f?.reasoning_content){const i=o.content.findIndex(v=>v.type==="thinking"),h=i<0?{type:"thinking",thinking:""}:o.content[i],y=i<0?o.content.push(h)-1:i;if(i<0&&r.push({type:"thinking_start",contentIndex:y,partial:o}),h.type!=="thinking")throw new Error("invalid thinking block");h.thinking+=f.reasoning_content,r.push({type:"thinking_delta",contentIndex:y,delta:f.reasoning_content,partial:o})}if(f?.content){const i=o.content.findIndex(v=>v.type==="text"),h=i<0?{type:"text",text:""}:o.content[i],y=i<0?o.content.push(h)-1:i;if(i<0&&r.push({type:"text_start",contentIndex:y,partial:o}),h.type!=="text")throw new Error("invalid text block");h.text+=f.content,r.push({type:"text_delta",contentIndex:y,delta:f.content,partial:o})}for(const i of f?.tool_calls??[]){const h={type:"toolCall",id:i.id,name:i.function.name,arguments:JSON.parse(i.function.arguments)},y=o.content.push(h)-1;r.push({type:"toolcall_start",contentIndex:y,partial:o}),r.push({type:"toolcall_end",contentIndex:y,toolCall:h,partial:o})}m?.finish_reason&&(w=m.finish_reason),m?.message?.refusal&&(M=m.message.refusal),s.usage&&(T=!0,o.usage={input:s.usage.prompt_tokens,output:s.usage.completion_tokens,cacheRead:s.usage.cache_read_tokens,cacheWrite:s.usage.cache_write_tokens,totalTokens:s.usage.total_tokens,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:typeof s.usage.usd_equivalent=="number"&&Number.isFinite(s.usage.usd_equivalent)?s.usage.usd_equivalent:0}})},"apply");for(;;){const{value:l,done:s}=await U.read();if(s)break;g+=I.decode(l,{stream:!0});let m;for(;(m=g.indexOf(`
2
- `))>=0;){const f=g.slice(0,m).trim();g=g.slice(m+1),f&&$(f)}}if(g+=I.decode(),g.trim()&&$(g.trim()),!T||!O)throw new Error("llm stream ended without usage or served_model");for(const[l,s]of o.content.entries())s.type==="text"&&r.push({type:"text_end",contentIndex:l,content:s.text,partial:o}),s.type==="thinking"&&r.push({type:"thinking_end",contentIndex:l,content:s.thinking,partial:o});if(w==="content_filter")throw new D(M??"Content filtered");if(!["stop","tool_calls","length"].includes(w))throw new Error(`llm returned unknown finish reason: ${w}`);o.stopReason=w==="tool_calls"?"toolUse":w==="length"?"length":"stop",r.push({type:"done",reason:o.stopReason,message:o}),r.end();return}})().catch(a=>{o.stopReason=n.signal?.aborted?"aborted":"error",o.errorMessage=a instanceof Error?a.message:String(a),a instanceof k&&(o.diagnostics=[{type:B,timestamp:Date.now(),...a.retryAt!==void 0?{details:{retryAt:a.retryAt}}:{}},...a.rateLimit!==void 0?[E({status:429,ratelimit:a.rateLimit})]:[],...a.rateLimit===void 0&&a.code==="cap_exhausted"?[E({status:a.status??402,code:a.code})]:[]]),a instanceof S&&(o.diagnostics=[E({status:503,code:R})]),a instanceof D&&o.stopReason==="error"&&(o.rawStopReason="content_filter"),r.push({type:"error",reason:o.stopReason,error:o}),r.end()}),r}c(re,"streamBrokerModel");export{ee as LLM_BROKER_RETRY_WINDOW_S,B as LLM_REFUSAL_DIAGNOSTIC,ye as configureBrokerModelRuntime,_e as refusalRetryAt,ne as requestBody,re as streamBrokerModel,te as wireHistory};
1
+ var j=Object.defineProperty;var c=(e,n)=>j(e,"name",{value:n,configurable:!0});import{setTimeout as W}from"node:timers/promises";import{createAssistantMessageEventStream as J,getCurrentSystemPrompt as Y,getCurrentTools as z}from"@earendil-works/pi-ai";import{socketFetch as G}from"../../../api/node-transport.js";import{DEFER_HEAD_REQUEST_HEADER as X,DEFERRED_HEAD_CONTENT_TYPE as K,DEFERRED_HEAD_MAGIC as Q}from"../../../daemon/api/deferred-head.js";import{apiSocketPath as V}from"../../canvas/paths.js";import{currentNodeToken as Z}from"./node-token.js";import{brokerApiUrl as C}from"./daemon-ops.js";import{currentCausedBy as ee}from"./turn-cause.js";import{envModelExact as N,envModelIntent as te}from"../../../shared/env.js";import{MODEL_CONTEXT_BODY_MAX_BYTES as v}from"../../llm/body-limits.js";import{modelRequestFromConfig as ne}from"../../model-routes.js";import{parseProviderRateLimit as re,providerFailureDiagnostic as A}from"../../provider-failure.js";import{UPSTREAM_MODEL_UNAVAILABLE as S}from"../../fault-classifier.js";function Ae(e,n){e.checkAuth=async t=>e.getProvider(t)?{type:"api_key"}:void 0,e.getAvailable=async t=>e.getModels(t),e.getAvailableSnapshot=()=>e.getModels(),e.streamSimple=(t,d,o)=>ue(t,d,o,n)}c(Ae,"configureBrokerModelRuntime");const oe=300,U="crtr:llm-refusal";class k extends Error{static{c(this,"LlmRefusalError")}retryAt;rateLimit;code;status;constructor(n,t,d,o,r){super(n),this.retryAt=t,this.rateLimit=d,this.code=o,this.status=r}}class T extends Error{static{c(this,"UpstreamModelUnavailableError")}}function q(e,n){const t=e===void 0?"the request body":`the request body (${e} bytes)`;return new Error(`request_too_large: ${t} exceeds the ${n}-byte model request limit; compact the conversation to shrink the context`)}c(q,"contextTooLargeError");function D(e){const n=e.details?.rate_limit;if(!n||typeof n!="object")return;const t=re(n);if(t===void 0)return;const{provider:d,model:o}=n;return typeof d=="string"&&d!==""&&typeof o=="string"&&o!==""?{...t,model:`${d}/${o}`}:t}c(D,"refusalRateLimit");function Se(e){for(const n of e.diagnostics??[]){if(n.type!==U)continue;const t=n.details?.retryAt;if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t}}c(Se,"refusalRetryAt");class B extends Error{static{c(this,"ContentFilteredError")}}function F(e){return typeof e=="string"?e:e.map(n=>n.type==="text"?{type:"text",text:n.text}:{type:"image_url",image_url:{url:`data:${n.mimeType};base64,${n.data}`}})}c(F,"wireContent");function se(e){const n=c(o=>o.role==="assistant"&&(o.stopReason==="error"||o.stopReason==="aborted"),"incomplete"),t=e.some(n)?e.filter(o=>!n(o)):e;let d=t.length;for(;d>0&&t[d-1]?.role==="assistant";)d--;return d===t.length?t:t.slice(0,d)}c(se,"wireHistory");function ie(e,n,t,d){const o=[],r=Y(n.messages),a=z(n.messages);r?o.push({role:"system",content:r}):n.systemPrompt&&o.push({role:"system",content:n.systemPrompt});for(const f of se(n.messages))f.role==="user"?o.push({role:"user",content:F(f.content)}):f.role==="toolResult"?o.push({role:"tool",content:F(f.content),tool_call_id:f.toolCallId}):f.role==="assistant"&&o.push({role:"assistant",content:f.content.filter(i=>i.type==="text").map(i=>i.text).join("")||null,tool_calls:f.content.filter(i=>i.type==="toolCall").map(i=>({id:i.id,type:"function",function:{name:i.name,arguments:JSON.stringify(i.arguments)}}))});const _=`${e.provider}/${e.id}`,y=d??te();return{model:ne(_,y,N())?.kind==="logical"?y:_,model_policy:N()?"exact":"substitute",stream:!0,messages:o,...a.length?{tools:a.map(f=>({type:"function",function:{name:f.name,description:f.description,parameters:f.parameters}}))}:{},...t.reasoning?{reasoning_effort:t.reasoning}:{},...t.temperature!==void 0?{temperature:t.temperature}:{},...t.maxTokens!==void 0?{max_tokens:t.maxTokens}:{}}}c(ie,"requestBody");function L(e,n){if(typeof n!="string")return!1;const t=n.indexOf("/");return t<1||t===n.length-1?!1:(e.provider=n.slice(0,t),e.model=n.slice(t+1),!0)}c(L,"applyServedModel");function P(e){if(e.details?.served_model!==void 0)return e.details.served_model;const n=e.details?.rate_limit;return typeof n?.provider=="string"&&typeof n.model=="string"?`${n.provider}/${n.model}`:void 0}c(P,"refusalRoute");function H(e){if(!e||typeof e!="object"||!("error"in e))throw new Error("llm returned an invalid response");const n=e.error;if(!n||typeof n.message!="string")throw new Error("llm returned an invalid refusal");return n}c(H,"parseRefusal");function ae(){const e=C();return e===void 0?"http://localhost/v1/llm":new URL("/v1/llm",e).toString()}c(ae,"llmUrl");function le(){return C()===void 0?G(V()):globalThis.fetch}c(le,"llmFetch");async function ce(e){if(!e.headers.get("content-type")?.startsWith(K))return e;if(!e.body)throw new Error("deferred head response has no body");const n=e.body.getReader();let t=new Uint8Array(0),d=!1;for(;;){const o=t.indexOf(10);if(o<0){const{value:i,done:w}=await n.read();if(w)throw new Error("deferred head response ended before its head");const h=new Uint8Array(t.length+i.length);h.set(t),h.set(i,t.length),t=h;continue}const r=new TextDecoder().decode(t.subarray(0,o)).trim();if(t=t.subarray(o+1),!d){if(`${r}
2
+ `!==Q)throw new Error("deferred head response has no magic line");d=!0;continue}if(r==="")continue;const a=JSON.parse(r),_=new Headers;for(const[i,w]of Object.entries(a.headers))for(const h of Array.isArray(w)?w:[w])_.append(i,h);const y=t,f=new ReadableStream({start(i){y.length>0&&i.enqueue(y)},async pull(i){const{value:w,done:h}=await n.read();h?i.close():i.enqueue(w)},cancel(i){return n.cancel(i)}});return new Response(a.status===204?null:f,{status:a.status,headers:_})}}c(ce,"unwrapDeferredHead");function de(){const e=ee();return e===void 0?{}:{"crtr-caused-by":e}}c(de,"causedByHeader");function ue(e,n,t={},d){const o=J(),r={role:"assistant",content:[],api:e.api,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()};return(async()=>{const a=Z();if(!a)throw new Error("llm requires a node token");const _=JSON.stringify(ie(e,n,t,d)),y=Buffer.byteLength(_);if(y>v)throw q(y,v);let f=0;for(;;){t.signal?.throwIfAborted();const i=await ce(await le()(ae(),{method:"POST",headers:{authorization:`Bearer ${a}`,"content-type":"application/json",[X]:"1",...de()},body:_,signal:t.signal}));if(!i.ok){const u=H(await i.json());if(i.status===413||u.code==="payload_too_large")throw q(y,v);if(L(r,P(u)),u.retryable!==!0)throw new k(u.message,void 0,D(u),u.code,i.status);const s=u.retry_after_s;if(typeof s!="number"||!Number.isFinite(s)||s<=0)throw u.code===S?new T(u.message):new Error(u.message);const m=oe-f;if(s>m){const p=Date.now()+s*1e3;throw new k(`${u.message} (retry after ${s}s, at ${new Date(p).toISOString()})`,p,D(u))}await W(s*1e3,void 0,{signal:t.signal}),f+=s;continue}if(!i.body)throw new Error("llm returned no stream");o.push({type:"start",partial:r});const w=i.body.getReader(),h=new TextDecoder;let x="",b="stop",O,I=!1,M=!1;const $=c(u=>{const s=JSON.parse(u);if(s.error){const l=H(s);throw L(r,P(l)),l.retryable!==!0?new k(l.message,void 0,D(l),l.code):l.code===S?new T(l.message):new Error(l.message)}if(s.served_model){if(M=!0,s.served_model.indexOf("/")<1)throw new Error("llm returned an invalid served_model");L(r,s.served_model)}const m=s.choices?.[0],p=m?.delta;if(p?.reasoning_content){const l=r.content.findIndex(R=>R.type==="thinking"),g=l<0?{type:"thinking",thinking:""}:r.content[l],E=l<0?r.content.push(g)-1:l;if(l<0&&o.push({type:"thinking_start",contentIndex:E,partial:r}),g.type!=="thinking")throw new Error("invalid thinking block");g.thinking+=p.reasoning_content,o.push({type:"thinking_delta",contentIndex:E,delta:p.reasoning_content,partial:r})}if(p?.content){const l=r.content.findIndex(R=>R.type==="text"),g=l<0?{type:"text",text:""}:r.content[l],E=l<0?r.content.push(g)-1:l;if(l<0&&o.push({type:"text_start",contentIndex:E,partial:r}),g.type!=="text")throw new Error("invalid text block");g.text+=p.content,o.push({type:"text_delta",contentIndex:E,delta:p.content,partial:r})}for(const l of p?.tool_calls??[]){const g={type:"toolCall",id:l.id,name:l.function.name,arguments:JSON.parse(l.function.arguments)},E=r.content.push(g)-1;o.push({type:"toolcall_start",contentIndex:E,partial:r}),o.push({type:"toolcall_end",contentIndex:E,toolCall:g,partial:r})}m?.finish_reason&&(b=m.finish_reason),m?.message?.refusal&&(O=m.message.refusal),s.usage&&(I=!0,r.usage={input:s.usage.prompt_tokens,output:s.usage.completion_tokens,cacheRead:s.usage.cache_read_tokens,cacheWrite:s.usage.cache_write_tokens,totalTokens:s.usage.total_tokens,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:typeof s.usage.usd_equivalent=="number"&&Number.isFinite(s.usage.usd_equivalent)?s.usage.usd_equivalent:0}})},"apply");for(;;){const{value:u,done:s}=await w.read();if(s)break;x+=h.decode(u,{stream:!0});let m;for(;(m=x.indexOf(`
3
+ `))>=0;){const p=x.slice(0,m).trim();x=x.slice(m+1),p&&$(p)}}if(x+=h.decode(),x.trim()&&$(x.trim()),!I||!M)throw new Error("llm stream ended without usage or served_model");for(const[u,s]of r.content.entries())s.type==="text"&&o.push({type:"text_end",contentIndex:u,content:s.text,partial:r}),s.type==="thinking"&&o.push({type:"thinking_end",contentIndex:u,content:s.thinking,partial:r});if(b==="content_filter")throw new B(O??"Content filtered");if(!["stop","tool_calls","length"].includes(b))throw new Error(`llm returned unknown finish reason: ${b}`);r.stopReason=b==="tool_calls"?"toolUse":b==="length"?"length":"stop",o.push({type:"done",reason:r.stopReason,message:r}),o.end();return}})().catch(a=>{r.stopReason=t.signal?.aborted?"aborted":"error",r.errorMessage=a instanceof Error?a.message:String(a),a instanceof k&&(r.diagnostics=[{type:U,timestamp:Date.now(),...a.retryAt!==void 0?{details:{retryAt:a.retryAt}}:{}},...a.rateLimit!==void 0?[A({status:429,ratelimit:a.rateLimit})]:[],...a.rateLimit===void 0&&a.code==="cap_exhausted"?[A({status:a.status??402,code:a.code})]:[]]),a instanceof T&&(r.diagnostics=[A({status:503,code:S})]),a instanceof B&&r.stopReason==="error"&&(r.rawStopReason="content_filter"),o.push({type:"error",reason:r.stopReason,error:r}),o.end()}),o}c(ue,"streamBrokerModel");export{oe as LLM_BROKER_RETRY_WINDOW_S,U as LLM_REFUSAL_DIAGNOSTIC,Ae as configureBrokerModelRuntime,Se as refusalRetryAt,ie as requestBody,ue as streamBrokerModel,ce as unwrapDeferredHead,se as wireHistory};
@@ -1 +1 @@
1
- var a=Object.defineProperty;var s=(i,t)=>a(i,"name",{value:t,configurable:!0});import{localClient as o}from"../../../api/node-transport.js";import{ApiError as n}from"../../../api/errors.js";const h=Symbol.for("@crouton-kit/crtr:broker-signal-client");class l{static{s(this,"BrokerSignalClient")}stateValue="disconnected";latestNodeValue;listeners=new Map;controller;retryTimer;heartbeatTimer;retryMs=250;running=!1;nodeId;executionId;get state(){return this.stateValue}get latestNode(){return this.latestNodeValue}subscribe(t,r){let e=this.listeners.get(t);return e||(e=new Set,this.listeners.set(t,e)),e.add(r),(t==="state"||t==="resync"&&this.stateValue==="connected"||t==="node"&&this.latestNodeValue!==void 0)&&r(),()=>{e.delete(r)}}start(t,r){if(this.running){if(this.nodeId===t&&this.executionId===r)return;this.stop()}this.nodeId=t,this.executionId=r,this.running=!0,this.retryMs=250,this.connect()}stop(){this.running=!1,this.controller?.abort(),this.controller=void 0,this.clearTimers(),this.setState("stopped")}emit(t){for(const r of this.listeners.get(t)??[])try{r()}catch{}}setState(t){this.stateValue!==t&&(this.stateValue=t,this.emit("state"))}clearTimers(){this.retryTimer&&clearTimeout(this.retryTimer),this.heartbeatTimer&&clearTimeout(this.heartbeatTimer),this.retryTimer=this.heartbeatTimer=void 0}armHeartbeat(t){this.heartbeatTimer&&clearTimeout(this.heartbeatTimer),this.heartbeatTimer=setTimeout(()=>t.abort(),35e3),this.heartbeatTimer.unref?.()}connect(){if(!this.running||!this.nodeId||!this.executionId)return;const t=new AbortController;this.controller=t,(async()=>{try{for await(const e of o({autostart:!1}).getBrokerSignals(this.nodeId,this.executionId,{signal:t.signal,maxRetries:0})){if(!this.running||this.controller!==t)return;this.armHeartbeat(t),this.handleLine(e)}}catch(e){if(!this.running||this.controller!==t)return;if(e instanceof n&&(e.status===404||e.status===405)){this.clearTimers(),this.controller=void 0,this.setState("unsupported");return}if(e instanceof n&&e.status===409){this.stop();return}}if(!this.running||this.controller!==t)return;this.controller=void 0,this.clearTimers(),this.setState("disconnected");const r=Math.round(this.retryMs*(.8+Math.random()*.4));this.retryMs=Math.min(this.retryMs*2,5e3),this.retryTimer=setTimeout(()=>{this.retryTimer=void 0,this.connect()},r),this.retryTimer.unref?.()})()}handleLine(t){switch(t.type){case"hello":if(t.execution_id!==this.executionId){this.stop();return}this.retryMs=250,this.latestNodeValue=t.node,this.setState("connected"),this.emit("node"),this.emit("resync");break;case"mail":this.emit("mail");break;case"node":this.latestNodeValue=t.node,this.emit("node");break;case"fault-retry":this.emit("fault-retry");break;case"ping":break}}}function m(){const i=globalThis;return i[h]??=new l}s(m,"brokerSignalClient");export{l as BrokerSignalClient,m as brokerSignalClient};
1
+ var a=Object.defineProperty;var s=(i,t)=>a(i,"name",{value:t,configurable:!0});import{daemonClient as o}from"./daemon-ops.js";import{ApiError as n}from"../../../api/errors.js";const h=Symbol.for("@crouton-kit/crtr:broker-signal-client");class l{static{s(this,"BrokerSignalClient")}stateValue="disconnected";latestNodeValue;listeners=new Map;controller;retryTimer;heartbeatTimer;retryMs=250;running=!1;nodeId;executionId;get state(){return this.stateValue}get latestNode(){return this.latestNodeValue}subscribe(t,r){let e=this.listeners.get(t);return e||(e=new Set,this.listeners.set(t,e)),e.add(r),(t==="state"||t==="resync"&&this.stateValue==="connected"||t==="node"&&this.latestNodeValue!==void 0)&&r(),()=>{e.delete(r)}}start(t,r){if(this.running){if(this.nodeId===t&&this.executionId===r)return;this.stop()}this.nodeId=t,this.executionId=r,this.running=!0,this.retryMs=250,this.connect()}stop(){this.running=!1,this.controller?.abort(),this.controller=void 0,this.clearTimers(),this.setState("stopped")}emit(t){for(const r of this.listeners.get(t)??[])try{r()}catch{}}setState(t){this.stateValue!==t&&(this.stateValue=t,this.emit("state"))}clearTimers(){this.retryTimer&&clearTimeout(this.retryTimer),this.heartbeatTimer&&clearTimeout(this.heartbeatTimer),this.retryTimer=this.heartbeatTimer=void 0}armHeartbeat(t){this.heartbeatTimer&&clearTimeout(this.heartbeatTimer),this.heartbeatTimer=setTimeout(()=>t.abort(),35e3),this.heartbeatTimer.unref?.()}connect(){if(!this.running||!this.nodeId||!this.executionId)return;const t=new AbortController;this.controller=t,(async()=>{try{for await(const e of o().getBrokerSignals(this.nodeId,this.executionId,{signal:t.signal,maxRetries:0})){if(!this.running||this.controller!==t)return;this.armHeartbeat(t),this.handleLine(e)}}catch(e){if(!this.running||this.controller!==t)return;if(e instanceof n&&(e.status===404||e.status===405)){this.clearTimers(),this.controller=void 0,this.setState("unsupported");return}if(e instanceof n&&e.status===409){this.stop();return}}if(!this.running||this.controller!==t)return;this.controller=void 0,this.clearTimers(),this.setState("disconnected");const r=Math.round(this.retryMs*(.8+Math.random()*.4));this.retryMs=Math.min(this.retryMs*2,5e3),this.retryTimer=setTimeout(()=>{this.retryTimer=void 0,this.connect()},r),this.retryTimer.unref?.()})()}handleLine(t){switch(t.type){case"hello":if(t.execution_id!==this.executionId){this.stop();return}this.retryMs=250,this.latestNodeValue=t.node,this.setState("connected"),this.emit("node"),this.emit("resync");break;case"mail":this.emit("mail");break;case"node":this.latestNodeValue=t.node,this.emit("node");break;case"fault-retry":this.emit("fault-retry");break;case"ping":break}}}function m(){const i=globalThis;return i[h]??=new l}s(m,"brokerSignalClient");export{l as BrokerSignalClient,m as brokerSignalClient};
@@ -0,0 +1,5 @@
1
+ import type { MailEntryDTO } from '../../../api/dto/mail.js';
2
+ /** A message whose body overflowed the digest carries the full text in its row (`data.body_full`) and names a path as
3
+ * its `ref`. The broker writes the text at that path in its own filesystem so the agent reads it as it always has,
4
+ * and drops the copy from the entry it renders. */
5
+ export declare function materializeSpilledBody(entry: MailEntryDTO): MailEntryDTO;
@@ -0,0 +1 @@
1
+ var t=Object.defineProperty;var f=(i,r)=>t(i,"name",{value:r,configurable:!0});import{mkdirSync as d,writeFileSync as l}from"node:fs";import{dirname as o}from"node:path";function c(i){const r=i.data?.body_full;if(typeof r!="string"||i.ref===void 0||!i.ref.startsWith("/"))return i;d(o(i.ref),{recursive:!0}),l(i.ref,r,"utf8");const{body_full:a,...e}=i.data;return{...i,data:e}}f(c,"materializeSpilledBody");export{c as materializeSpilledBody};
@@ -0,0 +1,5 @@
1
+ /** Post the broker's tool-group summaries and/or consolidated turn replies, whole, to the node's row. */
2
+ export declare function putBrokerSummaries(nodeId: string, records: {
3
+ tool_summaries?: Record<string, unknown>;
4
+ turn_replies?: Record<string, unknown>;
5
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ var t=Object.defineProperty;var o=(e,r)=>t(e,"name",{value:r,configurable:!0});import{brokerExecutionId as i,daemonClient as u}from"./daemon-ops.js";function d(e,r){return u().putNodeSummaries(e,{...r,expected_execution_id:i()})}o(d,"putBrokerSummaries");export{d as putBrokerSummaries};
@@ -2,6 +2,7 @@ import { type ToolGroupSummary } from '../../../shared/tool-groups.js';
2
2
  import type { BrokerToClient } from '../broker-protocol.js';
3
3
  /** Owns transcript tool-group state and its durable summary sidecars. */
4
4
  export declare class ToolGroupTracker {
5
+ private readonly nodeId;
5
6
  private readonly broadcast;
6
7
  private readonly toolSummariesPath;
7
8
  private readonly pendingToolSummaryPath;
@@ -14,6 +15,8 @@ export declare class ToolGroupTracker {
14
15
  private lastToolGroupBoundaryProse;
15
16
  private sawAssistantProse;
16
17
  constructor(nodeId: string, broadcast: (frame: BrokerToClient) => void);
18
+ /** The control plane reads a dormant node's summaries from its row; a failed post only withholds them there. */
19
+ private postSummaries;
17
20
  summaries(): Record<string, ToolGroupSummary>;
18
21
  resetForSession(): void;
19
22
  finishOpenToolGroup(settleInterruptedTools?: boolean): void;
@@ -1 +1 @@
1
- var T=Object.defineProperty;var l=(a,e)=>T(a,"name",{value:e,configurable:!0});import{existsSync as G,unlinkSync as u}from"node:fs";import{join as d}from"node:path";import{nodeRunJobDir as y}from"../../canvas/paths.js";import{readConfig as S}from"../../config.js";import{emitEvent as m}from"../../events/emit.js";import{atomicWriteJson as h,readJsonIfExists as p}from"../../fs-utils.js";import{assistantVisibleText as k,isGroupBoundaryKind as P,isTrueUserMessage as _,normalizeToolGroupSummaryRecord as b}from"../../../shared/tool-groups.js";import{generatedContextText as f,parseCard as I}from"../../../shared/generated-context.js";import{headlessToolGroupSummary as w,serializeToolGroup as A}from"../tool-group-summary.js";const C=1e3,O=1e4;function g(a){if(a===null||typeof a!="object"||Array.isArray(a))return null;const e=a;return Object.keys(e).sort().join(",")!=="key,segment,version"||e.version!==1||typeof e.key!="string"||typeof e.segment!="string"||e.key.length===0||e.key.length>C||e.segment.length===0||e.segment.length>O?null:{version:1,key:e.key,segment:e.segment}}l(g,"normalizePendingToolGroupSummary");class J{static{l(this,"ToolGroupTracker")}broadcast;toolSummariesPath;pendingToolSummaryPath;toolGroupSummaries=new Map;summaryAttempted;generatingToolGroups=new Map;toolGroupsByCallId=new Map;summaryTasks=new Set;openToolGroup;lastToolGroupBoundaryProse="";sawAssistantProse=!1;constructor(e,o){this.broadcast=o,this.toolSummariesPath=d(y(e),"tool-summaries.json"),this.pendingToolSummaryPath=d(y(e),"pending-tool-summary.json");try{const t=p(this.toolSummariesPath);for(const[i,n]of Object.entries(b(t)))this.toolGroupSummaries.set(i,n)}catch{}this.summaryAttempted=new Set(this.toolGroupSummaries.keys()),this.resumePendingSummary()}summaries(){return Object.fromEntries(this.toolGroupSummaries)}resetForSession(){this.openToolGroup=void 0,this.toolGroupsByCallId.clear(),this.sawAssistantProse=!1}finishOpenToolGroup(e=!1){const o=this.openToolGroup;if(this.openToolGroup=void 0,o!==void 0){if(o.closed=!0,e){for(const t of o.pendingToolIds)this.toolGroupsByCallId.delete(t);o.pendingToolIds.clear()}o.summarizeWhenSettled=S("user").summarize_tool_calls,this.generateSettledToolGroup(o)}}observeToolGroupEvent(e){if(e.type==="compaction_end"||e.type==="auto_retry_end"&&e.success!==!0){this.finishOpenToolGroup();return}if(e.type==="message_end"){const s=e.message;if(s!==null&&typeof s=="object"){const r=s;r.role==="assistant"&&(r.stopReason==="aborted"||r.stopReason==="error")&&this.finishOpenToolGroup(!0)}return}if(e.type==="tool_execution_start"){const s=this.ensureOpenToolGroup(),r=typeof e.toolCallId=="string"?e.toolCallId:"";s.key===void 0&&r!==""&&(s.key=r),r!==""&&(s.pendingToolIds.add(r),this.toolGroupsByCallId.set(r,s)),s.toolCount+=1,s.pieces.push({type:"tool",name:typeof e.toolName=="string"?e.toolName:"tool",args:e.args});return}if(e.type==="tool_execution_end"){const s=typeof e.toolCallId=="string"?e.toolCallId:"",r=s===""?this.openToolGroup:this.toolGroupsByCallId.get(s);r!==void 0&&(r.pieces.push({type:"result",name:typeof e.toolName=="string"?e.toolName:"tool",result:e.result,isError:e.isError===!0}),s!==""&&(r.pendingToolIds.delete(s),this.toolGroupsByCallId.delete(s)),this.generateSettledToolGroup(r));return}if(e.type!=="message_start"&&e.type!=="message_update")return;const o=e.message;if(o===null||typeof o!="object")return;const t=o;if(t.role==="assistant"){e.type==="message_start"&&(this.sawAssistantProse=!1);const s=k(t);!this.sawAssistantProse&&s.trim()!==""&&(this.sawAssistantProse=!0,this.visibleBoundary(s));return}if(e.type!=="message_start")return;if(t.role==="compactionSummary"||t.role==="branchSummary"||t.role==="bashExecution"||t.role==="status"||t.role==="error"||t.customType==="crtr-cycle-divider"){this.finishOpenToolGroup();return}if(_(t)){this.visibleBoundary(f(t));return}if(t.display===!1)return;const i=f(t),n=I(t);if(n!==null&&P(n.kind)){this.visibleBoundary(i);return}const c=this.ensureOpenToolGroup();i!==""&&c.pieces.push({type:"text",text:i})}persistPendingSummary(){const e=[...this.generatingToolGroups.values()].at(-1);if(e!==void 0)try{h(this.pendingToolSummaryPath,e)}catch(o){m({level:"warn",event:"broker.runtime.diagnostic",fields:{message:`failed to persist pending tool summary: ${o instanceof Error?o.message:String(o)}`}})}}hasSummaryTasks(){return this.summaryTasks.size>0}waitForSummaryTasks(){return Promise.allSettled([...this.summaryTasks])}ensureOpenToolGroup(){return this.openToolGroup===void 0&&(this.openToolGroup={toolCount:0,pieces:[],boundaryProse:this.lastToolGroupBoundaryProse,pendingToolIds:new Set,closed:!1,summarizeWhenSettled:!1}),this.openToolGroup}visibleBoundary(e){this.finishOpenToolGroup(),this.lastToolGroupBoundaryProse=e}clearPendingToolGroupSummary(e){try{const o=g(p(this.pendingToolSummaryPath));o?.key===e.key&&o.segment===e.segment&&u(this.pendingToolSummaryPath)}catch{}}generateToolGroupSummary(e){const{key:o,segment:t}=e;if(this.summaryAttempted.has(o)||this.generatingToolGroups.has(o))return;this.summaryAttempted.add(o),this.generatingToolGroups.set(o,e);let i;i=w(t).then(n=>{if(n!==null){this.toolGroupSummaries.set(o,n);try{h(this.toolSummariesPath,Object.fromEntries(this.toolGroupSummaries))}catch{this.toolGroupSummaries.delete(o);return}this.clearPendingToolGroupSummary(e),this.broadcast({type:"tool_group_summary",key:o,summary:n})}}).catch(()=>{}).finally(()=>{this.generatingToolGroups.delete(o),this.summaryTasks.delete(i)}),this.summaryTasks.add(i)}generateSettledToolGroup(e){!e.closed||e.pendingToolIds.size>0||e.key===void 0||!e.summarizeWhenSettled||this.generateToolGroupSummary({version:1,key:e.key,segment:A(e.boundaryProse,e.pieces)})}resumePendingSummary(){try{const e=g(p(this.pendingToolSummaryPath));e===null?G(this.pendingToolSummaryPath)&&(u(this.pendingToolSummaryPath),m({level:"warn",event:"broker.startup.warning",fields:{stage:"pending_tool_summary",message:"removed an invalid pending tool summary"}})):this.toolGroupSummaries.has(e.key)?u(this.pendingToolSummaryPath):this.generateToolGroupSummary(e)}catch(e){m({level:"warn",event:"broker.startup.warning",fields:{stage:"pending_tool_summary",message:e instanceof Error?e.message:String(e)}})}}}export{J as ToolGroupTracker};
1
+ var T=Object.defineProperty;var m=(a,e)=>T(a,"name",{value:e,configurable:!0});import{existsSync as S,unlinkSync as p}from"node:fs";import{join as h}from"node:path";import{nodeRunJobDir as y}from"../../canvas/paths.js";import{readConfig as G}from"../../config.js";import{emitEvent as u}from"../../events/emit.js";import{atomicWriteJson as f,readJsonIfExists as d}from"../../fs-utils.js";import{assistantVisibleText as k,isGroupBoundaryKind as _,isTrueUserMessage as P,normalizeToolGroupSummaryRecord as b}from"../../../shared/tool-groups.js";import{generatedContextText as g,parseCard as I}from"../../../shared/generated-context.js";import{headlessToolGroupSummary as w,serializeToolGroup as A}from"../tool-group-summary.js";import{putBrokerSummaries as C}from"./summaries-post.js";const E=1e3,O=1e4;function c(a){if(a===null||typeof a!="object"||Array.isArray(a))return null;const e=a;return Object.keys(e).sort().join(",")!=="key,segment,version"||e.version!==1||typeof e.key!="string"||typeof e.segment!="string"||e.key.length===0||e.key.length>E||e.segment.length===0||e.segment.length>O?null:{version:1,key:e.key,segment:e.segment}}m(c,"normalizePendingToolGroupSummary");class Y{static{m(this,"ToolGroupTracker")}nodeId;broadcast;toolSummariesPath;pendingToolSummaryPath;toolGroupSummaries=new Map;summaryAttempted;generatingToolGroups=new Map;toolGroupsByCallId=new Map;summaryTasks=new Set;openToolGroup;lastToolGroupBoundaryProse="";sawAssistantProse=!1;constructor(e,o){this.nodeId=e,this.broadcast=o,this.toolSummariesPath=h(y(e),"tool-summaries.json"),this.pendingToolSummaryPath=h(y(e),"pending-tool-summary.json");try{const s=d(this.toolSummariesPath);for(const[i,n]of Object.entries(b(s)))this.toolGroupSummaries.set(i,n)}catch{}this.summaryAttempted=new Set(this.toolGroupSummaries.keys()),this.resumePendingSummary()}postSummaries(e){C(this.nodeId,{tool_summaries:e}).catch(o=>{u({level:"warn",event:"broker.runtime.diagnostic",fields:{message:`failed to post tool summaries: ${o instanceof Error?o.message:String(o)}`}})})}summaries(){return Object.fromEntries(this.toolGroupSummaries)}resetForSession(){this.openToolGroup=void 0,this.toolGroupsByCallId.clear(),this.sawAssistantProse=!1}finishOpenToolGroup(e=!1){const o=this.openToolGroup;if(this.openToolGroup=void 0,o!==void 0){if(o.closed=!0,e){for(const s of o.pendingToolIds)this.toolGroupsByCallId.delete(s);o.pendingToolIds.clear()}o.summarizeWhenSettled=G("user").summarize_tool_calls,this.generateSettledToolGroup(o)}}observeToolGroupEvent(e){if(e.type==="compaction_end"||e.type==="auto_retry_end"&&e.success!==!0){this.finishOpenToolGroup();return}if(e.type==="message_end"){const t=e.message;if(t!==null&&typeof t=="object"){const r=t;r.role==="assistant"&&(r.stopReason==="aborted"||r.stopReason==="error")&&this.finishOpenToolGroup(!0)}return}if(e.type==="tool_execution_start"){const t=this.ensureOpenToolGroup(),r=typeof e.toolCallId=="string"?e.toolCallId:"";t.key===void 0&&r!==""&&(t.key=r),r!==""&&(t.pendingToolIds.add(r),this.toolGroupsByCallId.set(r,t)),t.toolCount+=1,t.pieces.push({type:"tool",name:typeof e.toolName=="string"?e.toolName:"tool",args:e.args});return}if(e.type==="tool_execution_end"){const t=typeof e.toolCallId=="string"?e.toolCallId:"",r=t===""?this.openToolGroup:this.toolGroupsByCallId.get(t);r!==void 0&&(r.pieces.push({type:"result",name:typeof e.toolName=="string"?e.toolName:"tool",result:e.result,isError:e.isError===!0}),t!==""&&(r.pendingToolIds.delete(t),this.toolGroupsByCallId.delete(t)),this.generateSettledToolGroup(r));return}if(e.type!=="message_start"&&e.type!=="message_update")return;const o=e.message;if(o===null||typeof o!="object")return;const s=o;if(s.role==="assistant"){e.type==="message_start"&&(this.sawAssistantProse=!1);const t=k(s);!this.sawAssistantProse&&t.trim()!==""&&(this.sawAssistantProse=!0,this.visibleBoundary(t));return}if(e.type!=="message_start")return;if(s.role==="compactionSummary"||s.role==="branchSummary"||s.role==="bashExecution"||s.role==="status"||s.role==="error"||s.customType==="crtr-cycle-divider"){this.finishOpenToolGroup();return}if(P(s)){this.visibleBoundary(g(s));return}if(s.display===!1)return;const i=g(s),n=I(s);if(n!==null&&_(n.kind)){this.visibleBoundary(i);return}const l=this.ensureOpenToolGroup();i!==""&&l.pieces.push({type:"text",text:i})}persistPendingSummary(){const e=[...this.generatingToolGroups.values()].at(-1);if(e!==void 0)try{f(this.pendingToolSummaryPath,e)}catch(o){u({level:"warn",event:"broker.runtime.diagnostic",fields:{message:`failed to persist pending tool summary: ${o instanceof Error?o.message:String(o)}`}})}}hasSummaryTasks(){return this.summaryTasks.size>0}waitForSummaryTasks(){return Promise.allSettled([...this.summaryTasks])}ensureOpenToolGroup(){return this.openToolGroup===void 0&&(this.openToolGroup={toolCount:0,pieces:[],boundaryProse:this.lastToolGroupBoundaryProse,pendingToolIds:new Set,closed:!1,summarizeWhenSettled:!1}),this.openToolGroup}visibleBoundary(e){this.finishOpenToolGroup(),this.lastToolGroupBoundaryProse=e}clearPendingToolGroupSummary(e){try{const o=c(d(this.pendingToolSummaryPath));o?.key===e.key&&o.segment===e.segment&&p(this.pendingToolSummaryPath)}catch{}}generateToolGroupSummary(e){const{key:o,segment:s}=e;if(this.summaryAttempted.has(o)||this.generatingToolGroups.has(o))return;this.summaryAttempted.add(o),this.generatingToolGroups.set(o,e);let i;i=w(s).then(n=>{if(n!==null){this.toolGroupSummaries.set(o,n);try{const l=Object.fromEntries(this.toolGroupSummaries);f(this.toolSummariesPath,l),this.postSummaries(l)}catch{this.toolGroupSummaries.delete(o);return}this.clearPendingToolGroupSummary(e),this.broadcast({type:"tool_group_summary",key:o,summary:n})}}).catch(()=>{}).finally(()=>{this.generatingToolGroups.delete(o),this.summaryTasks.delete(i)}),this.summaryTasks.add(i)}generateSettledToolGroup(e){!e.closed||e.pendingToolIds.size>0||e.key===void 0||!e.summarizeWhenSettled||this.generateToolGroupSummary({version:1,key:e.key,segment:A(e.boundaryProse,e.pieces)})}resumePendingSummary(){try{const e=c(d(this.pendingToolSummaryPath));e===null?S(this.pendingToolSummaryPath)&&(p(this.pendingToolSummaryPath),u({level:"warn",event:"broker.startup.warning",fields:{stage:"pending_tool_summary",message:"removed an invalid pending tool summary"}})):this.toolGroupSummaries.has(e.key)?p(this.pendingToolSummaryPath):this.generateToolGroupSummary(e)}catch(e){u({level:"warn",event:"broker.startup.warning",fields:{stage:"pending_tool_summary",message:e instanceof Error?e.message:String(e)}})}}}export{Y as ToolGroupTracker};
@@ -19,6 +19,7 @@ export interface TurnReplyTrackerOptions {
19
19
  * and the viewer — which honours a rewrite only when all its sources are still
20
20
  * in the turn — falls back to showing every message verbatim. */
21
21
  export declare class TurnReplyTracker {
22
+ private readonly nodeId;
22
23
  private readonly broadcast;
23
24
  private readonly path;
24
25
  private readonly replies;
@@ -1 +1 @@
1
- var c=Object.defineProperty;var o=(n,t)=>c(n,"name",{value:t,configurable:!0});import{join as l}from"node:path";import{nodeRunJobDir as m}from"../../canvas/paths.js";import{readConfig as y}from"../../config.js";import{emitEvent as k}from"../../events/emit.js";import{atomicWriteJson as g,readJsonIfExists as b}from"../../fs-utils.js";import{assistantVisibleText as T,isTrueUserMessage as h}from"../../../shared/tool-groups.js";import{generatedContextText as p}from"../../../shared/generated-context.js";import{isSettledAssistant as x,messageKey as a,normalizeTurnReplyRecord as j,START_TURN_KEY as d}from"../../../shared/turn-replies.js";import{headlessTurnReply as w}from"../turn-reply-summary.js";function f(n,t){return n!==void 0&&n.sources.length===t.length&&n.sources.every((s,e)=>s===t[e].key)}o(f,"sameSources");class A{static{o(this,"TurnReplyTracker")}broadcast;path;replies=new Map;tasks=new Set;turn={key:d,userText:"",prose:[]};inFlight;queued;epoch=0;generate;enabled;constructor(t,s,e={}){this.broadcast=s,this.generate=e.generate??w,this.enabled=e.enabled??(()=>y("user").consolidate_replies),this.path=l(m(t),"turn-replies.json");try{for(const[r,i]of Object.entries(j(b(this.path))))this.replies.set(r,i)}catch{}}snapshot(){return Object.fromEntries(this.replies)}seed(t){this.epoch+=1,this.queued=void 0;let s={key:d,userText:"",prose:[]};for(const e of t){if(e===null||typeof e!="object")continue;const r=e;if(h(r)){const u=a(r);u!==void 0&&(s={key:u,userText:p(r),prose:[]});continue}const i=this.proseOf(r);i!==void 0&&s.prose.push(i)}this.turn=s,this.maybeGenerate()}observe(t){if(t.type!=="message_start"&&t.type!=="message_end")return;const s=t.message;if(s===null||typeof s!="object")return;const e=s;if(t.type==="message_start"){if(!h(e))return;const i=a(e);i!==void 0&&i!==this.turn.key&&(this.turn={key:i,userText:p(e),prose:[]});return}const r=this.proseOf(e);r===void 0||this.turn.prose.some(i=>i.key===r.key)||(this.turn.prose.push(r),this.maybeGenerate())}hasTasks(){return this.tasks.size>0}async waitForTasks(){for(;this.tasks.size>0;)await Promise.allSettled([...this.tasks])}proseOf(t){if(t.role!=="assistant"||!x(t))return;const s=T(t).trim(),e=a(t);return s===""||e===void 0?void 0:{key:e,text:s}}maybeGenerate(){const{key:t,userText:s,prose:e}=this.turn;if(e.length<2||!this.enabled()||f(this.replies.get(t),e))return;const r={key:t,userText:s,prose:[...e],epoch:this.epoch};if(this.inFlight!==void 0){this.queued=r;return}this.run(r)}run(t){this.inFlight=t;let s;s=this.generate(t.userText,t.prose.map(e=>e.text)).then(e=>{if(e===null||t.epoch!==this.epoch)return;const r={version:1,sources:t.prose.map(i=>i.key),text:e};this.replies.set(t.key,r);try{g(this.path,Object.fromEntries(this.replies))}catch(i){k({level:"warn",event:"broker.runtime.diagnostic",fields:{message:`failed to persist turn reply: ${i instanceof Error?i.message:String(i)}`}})}this.broadcast({type:"turn_reply",key:t.key,reply:r})}).catch(()=>{}).finally(()=>{this.tasks.delete(s),this.inFlight=void 0;const e=this.queued;this.queued=void 0,e!==void 0&&!f(this.replies.get(e.key),e.prose)&&this.run(e)}),this.tasks.add(s)}}export{A as TurnReplyTracker};
1
+ var l=Object.defineProperty;var a=(n,e)=>l(n,"name",{value:e,configurable:!0});import{join as m}from"node:path";import{nodeRunJobDir as y}from"../../canvas/paths.js";import{readConfig as k}from"../../config.js";import{emitEvent as h}from"../../events/emit.js";import{atomicWriteJson as g,readJsonIfExists as b}from"../../fs-utils.js";import{assistantVisibleText as T,isTrueUserMessage as p}from"../../../shared/tool-groups.js";import{generatedContextText as d}from"../../../shared/generated-context.js";import{isSettledAssistant as x,messageKey as u,normalizeTurnReplyRecord as w,START_TURN_KEY as f}from"../../../shared/turn-replies.js";import{headlessTurnReply as S}from"../turn-reply-summary.js";import{putBrokerSummaries as _}from"./summaries-post.js";function c(n,e){return n!==void 0&&n.sources.length===e.length&&n.sources.every((s,t)=>s===e[t].key)}a(c,"sameSources");class C{static{a(this,"TurnReplyTracker")}nodeId;broadcast;path;replies=new Map;tasks=new Set;turn={key:f,userText:"",prose:[]};inFlight;queued;epoch=0;generate;enabled;constructor(e,s,t={}){this.nodeId=e,this.broadcast=s,this.generate=t.generate??S,this.enabled=t.enabled??(()=>k("user").consolidate_replies),this.path=m(y(e),"turn-replies.json");try{for(const[i,r]of Object.entries(w(b(this.path))))this.replies.set(i,r)}catch{}}snapshot(){return Object.fromEntries(this.replies)}seed(e){this.epoch+=1,this.queued=void 0;let s={key:f,userText:"",prose:[]};for(const t of e){if(t===null||typeof t!="object")continue;const i=t;if(p(i)){const o=u(i);o!==void 0&&(s={key:o,userText:d(i),prose:[]});continue}const r=this.proseOf(i);r!==void 0&&s.prose.push(r)}this.turn=s,this.maybeGenerate()}observe(e){if(e.type!=="message_start"&&e.type!=="message_end")return;const s=e.message;if(s===null||typeof s!="object")return;const t=s;if(e.type==="message_start"){if(!p(t))return;const r=u(t);r!==void 0&&r!==this.turn.key&&(this.turn={key:r,userText:d(t),prose:[]});return}const i=this.proseOf(t);i===void 0||this.turn.prose.some(r=>r.key===i.key)||(this.turn.prose.push(i),this.maybeGenerate())}hasTasks(){return this.tasks.size>0}async waitForTasks(){for(;this.tasks.size>0;)await Promise.allSettled([...this.tasks])}proseOf(e){if(e.role!=="assistant"||!x(e))return;const s=T(e).trim(),t=u(e);return s===""||t===void 0?void 0:{key:t,text:s}}maybeGenerate(){const{key:e,userText:s,prose:t}=this.turn;if(t.length<2||!this.enabled()||c(this.replies.get(e),t))return;const i={key:e,userText:s,prose:[...t],epoch:this.epoch};if(this.inFlight!==void 0){this.queued=i;return}this.run(i)}run(e){this.inFlight=e;let s;s=this.generate(e.userText,e.prose.map(t=>t.text)).then(t=>{if(t===null||e.epoch!==this.epoch)return;const i={version:1,sources:e.prose.map(r=>r.key),text:t};this.replies.set(e.key,i);try{const r=Object.fromEntries(this.replies);g(this.path,r),_(this.nodeId,{turn_replies:r}).catch(o=>{h({level:"warn",event:"broker.runtime.diagnostic",fields:{message:`failed to post turn replies: ${o instanceof Error?o.message:String(o)}`}})})}catch(r){h({level:"warn",event:"broker.runtime.diagnostic",fields:{message:`failed to persist turn reply: ${r instanceof Error?r.message:String(r)}`}})}this.broadcast({type:"turn_reply",key:e.key,reply:i})}).catch(()=>{}).finally(()=>{this.tasks.delete(s),this.inFlight=void 0;const t=this.queued;this.queued=void 0,t!==void 0&&!c(this.replies.get(t.key),t.prose)&&this.run(t)}),this.tasks.add(s)}}export{C as TurnReplyTracker};
@@ -1,4 +1,4 @@
1
1
  var k=Object.defineProperty;var a=(o,e)=>k(o,"name",{value:e,configurable:!0});import{emitEvent as g}from"../events/emit.js";import{brokerDelivery as b,brokerExtensionState as f,commitBrokerPersonaAck as p}from"./broker/daemon-ops.js";import{buildSubPersonaMenu as m}from"../substrate/delivery/sub-persona-menu.js";import{orchestratorContextNote as v}from"./bearings-render.js";import{formatCard as x}from"../../shared/generated-context.js";function T(o){return[`You are now a ${o.kind.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.","","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 and exit criteria, and set the preview to the goal\u2019s first line, using the approach below.","",v(),"","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 unit with `crtr node new --kind <kind>`. When your context fills, run `crtr node yield` to refresh against this roadmap."].join(`
2
- `)}a(T,"orchestrationGuidance");function C(){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(C,"baseModeGuidance");function P(o,e){if(o.kind===e.kind)return"";const r=m(o.kind),n=m(e.kind);return r===n?"":n===""?`The ${e.kind} kind has no specialist sub-personas available.`:n}a(P,"subPersonaGuidance");function S(o,e,r,n){const t=[];return e.mode!==r.mode&&t.push(r.mode==="orchestrator"?T(o.node):C()),t.push(P(e,r)),t.push(n),t.filter(i=>i!=="").join(`
2
+ `)}a(T,"orchestrationGuidance");function C(){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(C,"baseModeGuidance");function P(o,e){if(o.kind===e.kind)return"";const t=m(o.kind),n=m(e.kind);return t===n?"":n===""?`The ${e.kind} kind has no specialist sub-personas available.`:n}a(P,"subPersonaGuidance");function S(o,e,t,n){const r=[];return e.mode!==t.mode&&r.push(t.mode==="orchestrator"?T(o.node):C()),r.push(P(e,t)),r.push(n),r.filter(i=>i!=="").join(`
3
3
 
4
- `)}a(S,"transitionGuidance");function u(o){const e=o.node,r={kind:e.kind,mode:e.mode,lifecycle:e.lifecycle},n=e.persona_ack,t=n===void 0?r:{kind:n.kind??e.kind,mode:n.mode,lifecycle:n.lifecycle};return t.kind===r.kind&&t.mode===r.mode&&t.lifecycle===r.lifecycle?null:{from:t,to:r}}a(u,"personaDriftFromBrokerState");async function M(o){const e=u(o);if(e===null)return!1;if(!(await p(o.node.node_id,e)).applied)throw new Error(`persona baseline acknowledgment was rejected for ${o.node.node_id}`);return!0}a(M,"acknowledgePersonaBaseline");async function D(o,e){const r=o.node.node_id;let n=o,t=u(n);if(t===null)return!1;let i=t.from;for(;;){const s={kind:n.node.kind,mode:n.node.mode,lifecycle:n.node.lifecycle};if(i.kind!==s.kind||i.mode!==s.mode||i.lifecycle!==s.lifecycle){const l=await b(r,{activity:"persona"}),c=S(n,i,s,l.content);c!==""&&await e(x("persona-transition",{},c)),i=s}if(t=u(n),t===null||(await p(r,t)).applied)return!0;n=await f(r)}}a(D,"deliverPendingPersonaTransition");function B(o,e){const{agent:r}=e,n=r.transformContext;r.transformContext=async(t,i)=>{const s=n===void 0?t:await n(t,i);try{const d=await f(o);return await D(d,l=>{const c={nodeId:o},h={role:"custom",customType:"crtr-persona-transition",content:l,display:!0,details:c,timestamp:Date.now()};e.sessionManager.appendCustomMessageEntry("crtr-persona-transition",l,!0,c);const w=r.state.messages;for(const y of new Set([w,t,s]))y.push(h)}),s}catch(d){throw g({event:"broker.daemon.operation.failed",level:"error",node_id:o,error:d,fields:{operation:"persona_transition"}}),d}}}a(B,"installPersonaTransitionGate");export{M as acknowledgePersonaBaseline,D as deliverPendingPersonaTransition,B as installPersonaTransitionGate,u as personaDriftFromBrokerState};
4
+ `)}a(S,"transitionGuidance");function u(o){const e=o.node,t={kind:e.kind,mode:e.mode,lifecycle:e.lifecycle},n=e.persona_ack,r=n===void 0?t:{kind:n.kind??e.kind,mode:n.mode,lifecycle:n.lifecycle};return r.kind===t.kind&&r.mode===t.mode&&r.lifecycle===t.lifecycle?null:{from:r,to:t}}a(u,"personaDriftFromBrokerState");async function M(o){const e=u(o);if(e===null)return!1;if(!(await p(o.node.node_id,e)).applied)throw new Error(`persona baseline acknowledgment was rejected for ${o.node.node_id}`);return!0}a(M,"acknowledgePersonaBaseline");async function D(o,e){const t=o.node.node_id;let n=o,r=u(n);if(r===null)return!1;let i=r.from;for(;;){const s={kind:n.node.kind,mode:n.node.mode,lifecycle:n.node.lifecycle};if(i.kind!==s.kind||i.mode!==s.mode||i.lifecycle!==s.lifecycle){const l=await b(t,{activity:"persona"}),c=S(n,i,s,l.content);c!==""&&await e(x("persona-transition",{},c)),i=s}if(r=u(n),r===null||(await p(t,r)).applied)return!0;n=await f(t)}}a(D,"deliverPendingPersonaTransition");function B(o,e){const{agent:t}=e,n=t.transformContext;t.transformContext=async(r,i)=>{const s=n===void 0?r:await n(r,i);try{const d=await f(o);return await D(d,async l=>{const c={nodeId:o},h={role:"custom",customType:"crtr-persona-transition",content:l,display:!0,details:c,timestamp:Date.now()};await e.sessionManager.appendCustomMessageEntry("crtr-persona-transition",l,!0,c);const w=t.state.messages;for(const y of new Set([w,r,s]))y.push(h)}),s}catch(d){throw g({event:"broker.daemon.operation.failed",level:"error",node_id:o,error:d,fields:{operation:"persona_transition"}}),d}}}a(B,"installPersonaTransitionGate");export{M as acknowledgePersonaBaseline,D as deliverPendingPersonaTransition,B as installPersonaTransitionGate,u as personaDriftFromBrokerState};
@@ -1 +1 @@
1
- var Pe=Object.defineProperty;var n=(t,r)=>Pe(t,"name",{value:r,configurable:!0});import{envInboxBetweenTurns as Oe,envModelIntent as Ie,envNodeCwd as De,envNodeId as Ne,envProfileId as Fe,envScopes as Le,isSandboxedNode as $e,scopeAllowed as Be}from"../../shared/env.js";import{createServer as Ue}from"node:net";import{existsSync as be,readFileSync as Ge,unlinkSync as ye}from"node:fs";import{join as Te}from"node:path";import{randomUUID as M}from"node:crypto";import{mark as Ke}from"../timing.js";import{SUBMIT_RESULT_TOOL as je}from"./structured-output.js";import{installSessionManagerStorePatch as We}from"../conversation-store/index.js";import{getAgentDir as Y,ModelRegistry as qe,ModelRuntime as Ve}from"@earendil-works/pi-coding-agent";import{nodeRunDir as Xe,viewSocketPath as He}from"../canvas/paths.js";import{bindBrokerEventSource as Ye}from"../events/source.js";import{emitEvent as T,flushBrokerLog as ze}from"../events/emit.js";import{operationIdContext as Je}from"../events/operation-id.js";import{findMissingPackagePaths as Qe}from"./package-health.js";import{installBrokerConfigSnapshot as Ze}from"../config.js";import{FRONT_DOOR_ENV as en}from"./front-door.js";import{CANVAS_EXTENSIONS as oe,piInvocationToSdkConfig as nn}from"./launch.js";import{assertEngineVersion as tn,loadBrokerEngine as on}from"./broker-sdk.js";import{initCrtrTheme as rn}from"./crtr-theme.js";import{resolveBundledPiPackageDir as sn}from"./pi-cli.js";import{captureSessionChatCapabilities as an}from"./command-surface.js";import{InMemoryCredentialStore as dn}from"@earendil-works/pi-ai";import{configureBrokerModelRuntime as ln}from"./broker/model-adapter.js";import{mutateBrokerFault as z,recordBrokerTurn as Re}from"./broker/daemon-ops.js";import{modelRequestFromConfig as cn,expandModelCandidates as mn,parseModelSpec as un,unregisteredConcreteModel as fn}from"../model-routes.js";import{KNOWN_STREAM_WAIT_UI as pn}from"./stream-watchdog.js";import{probeOnline as gn}from"./connectivity.js";import{CRTR_CYCLE_CUSTOM_TYPE as vn,cycleAwareMessages as hn,endedByAbort as wn}from"./session-cycles.js";import{turnErrorOf as Sn}from"../llm/refusal.js";import{projectTranscript as _n}from"./session-visibility.js";import{currentTurnVisibility as bn}from"./turn-visibility.js";import{isUnknownModel as re}from"./model-selection.js";import{BrokerClientRegistry as yn}from"./broker/client-registry.js";import{ToolGroupTracker as Tn}from"./broker/tool-groups.js";import{TurnReplyTracker as Rn}from"./broker/turn-replies.js";import{onNodeNamed as kn}from"./broker/node-named.js";import{FaultRetry as En,willDaemonRetry as Cn}from"./broker/fault-retry.js";import{RunTurnEnds as Mn}from"./broker/run-turn-end.js";import{createTurnAdmissionGate as xn}from"./broker/turn-admission.js";import{BROKER_IDLE_TURN_START as An,BROKER_RUN_TURN_BUSY as Pn}from"./broker/held-deferred-inbox.js";import{prependRunDeferredMail as On,settleRunDeferredMail as In}from"./broker/run-deferred-mail.js";import{createRunTurnQueue as Dn}from"./broker/run-turn-queue.js";import{EventProjection as Nn}from"./broker/event-projection.js";import{createFrameDispatchContext as Fn,handleFrame as Ln}from"./broker/frame-dispatch.js";import{hydratePersistedAdvertisedCommandMessages as $n,installAdvertisedCommandInvocationContract as Bn}from"./advertised-command-invocation.js";import{RebindDriver as Un}from"./broker/rebind.js";import{beginRuntimeTeardown as Gn}from"./broker/extension-abort.js";import{receiveNodeToken as Kn}from"./broker/node-token.js";import{serveCliRelay as jn}from"./broker/cli-relay.js";import{setTurnCauseSource as Wn}from"./broker/turn-cause.js";import{decodeKickoffOrigin as qn,KICKOFF_ORIGIN_ENV as Vn}from"./stamp/protocol.js";import{announceMessageOrigin as Xn}from"./stamp/channel.js";import{brokerExtensionState as Hn,commitBrokerModel as Yn}from"./broker/daemon-ops.js";import{composerNames as zn}from"./broker/frame-memory-refs.js";import{FrameOverflowError as Jn,normalizeSnapshotTail as Qn}from"./broker-protocol.js";import{ReviewBoundaryNavigationError as go,REVIEW_BOUNDARY_NAVIGATION_CODE as vo}from"./broker/frame-replies.js";function se(t){return new qe(t.modelRuntime)}n(se,"registryOf");function B(t,r){if(t==null||re(t))return null;const i=r!==void 0&&r!==""&&r!=="off"?`:${r}`:"";return`${t.provider}/${t.id}${i}`}n(B,"formatModelSpec");function Zn(t,r){const i=B(t,void 0);return i===null?null:`${i}:${r===void 0||r===""?"off":r}`}n(Zn,"formatExactModelSpec");const et=12e4;let J=null;import{brokerSignalClient as Q}from"./broker/signal-stream.js";function nt(){Q().stop();const t=J;if(J=null,t!==null)try{t.dispose()}catch{}}n(nt,"disposeActiveSession");function tt(t,r){const i=Be(r,"crtr:act")?void 0:["bash"],u=t!==void 0&&t.length>0?[...new Set([...t,je])]:t===void 0?void 0:[...t];return{...u!==void 0?{tools:u}:{},...i!==void 0?{excludeTools:i}:{}}}n(tt,"brokerToolOptions");async function uo(t,r=process.hrtime.bigint(),i=new Date().toISOString()){Ye(t);const u=await Kn(),s=await jn(t,u);process.env.CRTR_API_SOCKET=s.path,Je.fresh(()=>{T({level:"info",event:"broker.startup.cli_entry",ts:i,duration_ms:0,fields:{runtime_version:process.version,engine_version:null,model:null}}),T({level:"info",event:"broker.startup.module_loaded",duration_ms:Number(process.hrtime.bigint()-r)/1e6,fields:{runtime_version:process.version,engine_version:null,model:null}})});const a=new Set;let l=null;const d=n((e,o=null)=>{a.has(e)||(a.add(e),Ke(e,{duration_ms:Number(process.hrtime.bigint()-r)/1e6}),T({level:"info",event:e,duration_ms:Number(process.hrtime.bigint()-r)/1e6,fields:{runtime_version:process.version,engine_version:l,model:o}}))},"emitStartupMilestone");process.env[en]="1",process.env.CRTR_BROKER_PID=String(process.pid),delete process.env.TMUX_PANE,delete process.env.TMUX,We(t);const p=await on();tn(p.VERSION),l=p.VERSION;const S=Xe(t),k=Te(S,"broker-launch.json"),_=JSON.parse(Ge(k,"utf8"));if($e()){if(!_.configSnapshot)throw new Error("broker launch is missing its config snapshot");Ze(_.configSnapshot)}const f=nn(_);f.modelExact===!0?process.env.CRTR_MODEL_EXACT="1":delete process.env.CRTR_MODEL_EXACT;const b=await zn(t);let y,x;const V=n(e=>{y!==void 0?y(e):x??=e},"onSignal");process.on("SIGTERM",()=>V("SIGTERM")),process.on("SIGINT",()=>V("SIGINT"));let{session:U,services:A,resuming:ae,runtime:G}=await it(p,f);d("broker.startup.session_built");const E=(await Hn(t)).node.review_binding?.review_id,R=Oe();J=U;const D=gn;try{process.env.PI_PACKAGE_DIR=sn(),rn(A.settingsManager.getTheme(),Y(),!1)}catch(e){T({level:"error",event:"broker.theme.initialization_failed",error:e})}try{for(const e of Qe(Y()))T({level:"warn",event:"broker.startup.warning",fields:{stage:"package_health",source:e.source,resolved_path:e.resolved}})}catch{}const K=He(t),g=new yn(t),X=new Map,O=new Tn(t,e=>g.broadcast(e)),j=new Rn(t,e=>g.broadcast(e));kn(e=>g.broadcast({type:"node_named",...e}));let N=!1,de=!1,H,le,m,W;const Z=new Mn;let F,ce=n(()=>{},"notifyTurnAccepted"),me=n(()=>{},"resetFrameState");const ee=xn();let ue=n(()=>0,"pendingPromptDispatches"),fe;const L=Dn({runNode:R,session:n(()=>m.session(),"session"),isReplacing:n(()=>m.isReplacing(),"isReplacing"),pendingRebind:n(()=>m.pendingRebind(),"pendingRebind"),isAgentRunActive:n(()=>m.isAgentRunActive(),"isAgentRunActive"),pendingDispatches:n(()=>ue(),"pendingDispatches"),turnAdmission:ee,prependDeferred:n(e=>On(t,e),"prependDeferred"),onError:n(e=>T({level:"error",event:"broker.inbox.idle_prompt_failed",error:e}),"onError")});Wn(()=>m.session());const pe=L.drain;f.firstPrompt!==void 0&&f.firstPrompt!==""&&L.holdForKickoff(),globalThis[An]=L.start,globalThis[Pn]=L.busy,m=new Un({nodeId:t,cfg:f,session:U,services:A,runtime:G,registry:g,toolGroups:O,turnReplies:j,transcriptMessages:n(e=>ie(e,E)?.map(({message:o})=>o)??e.sessionManager.buildSessionContext().messages,"transcriptMessages"),uiContext:n(()=>le,"uiContext"),faultRetry:n(()=>W,"faultRetry"),projection:n(()=>F,"projection"),setActiveSession:n(e=>{if(J=e,fe?.(),R){let o="stop",c,v=!1;fe=e.subscribe(h=>{if(h.type==="agent_start"&&(o="stop",c=void 0,v=!1,Z.started()),h.type==="agent_end"){const w=[...h.messages??[]].reverse().find($=>$.role==="assistant");w&&(o=w.stopReason,c=wn(w)?void 0:Sn(w),v=w.role==="assistant"&&Cn(w,e.model?.contextWindow))}h.type==="agent_settled"&&(Z.settled(e.sessionManager,{stop_reason:o,...c?{error:c}:{}},v),In(t,e).catch(w=>{T({level:"error",event:"broker.run_deferred_mail.settle_failed",error:w})}),queueMicrotask(()=>{m.session()===e&&pe()}))})}},"setActiveSession"),disposeAndExit:n((e,o)=>q(e,o),"disposeAndExit"),onSessionRebind:n(()=>{me()},"onSessionRebind"),onReplacementIdle:n(()=>{R&&pe()},"onReplacementIdle"),reWelcomeAll:n(()=>ne(),"reWelcomeAll")});const ge=n(async(e,o=!1)=>{const c=m.session(),v=B(c.model,c.thinkingLevel);if(v===null)return null;const h=await Yn(t,{spec:v,...e!==void 0?{intent:e}:{},userSelected:o});return o&&(f.model=h.modelOverride,e!==void 0?(process.env.CRTR_MODEL_INTENT=`${e.family}/${e.strength}`,delete process.env.CRTR_MODEL_EXACT,f.modelExact=void 0):(delete process.env.CRTR_MODEL_INTENT,process.env.CRTR_MODEL_EXACT="1",f.modelExact=!0)),h.modelOverride},"persistModelChoice"),ve=n(async(e=!0,o,c=!1)=>{const v=m.session(),h=B(v.model,v.thinkingLevel),w=e?await ge(o,c):h;g.broadcast({type:"model_changed",model:re(v.model)?void 0:v.model,spec:w})},"broadcastModelChanged");W=new En({nodeId:t,cfg:f,retryProbe:D,currentSession:n(()=>m.session(),"currentSession"),currentServices:n(()=>m.services(),"currentServices"),installedGeneration:n(()=>m.installedGeneration(),"installedGeneration"),registryOf:se,formatModelSpec:B,broadcastModelChanged:ve,turnAdmission:ee,reWelcomeAll:n(()=>ne(),"reWelcomeAll"),...R?{turnEnds:Z}:{}});const he=n(()=>{W.rearmIfStranded().catch(e=>{T({level:"warn",event:"broker.runtime.diagnostic",fields:{message:`fault retry re-arm failed: ${e instanceof Error?e.message:String(e)}`}})})},"rearmStrandedRetry");Q().subscribe("resync",he),Q().subscribe("fault-retry",he),F=new Nn({registry:g,faultRetry:W,installedGeneration:n(()=>m.installedGeneration(),"installedGeneration"),currentSession:n(()=>m.session(),"currentSession"),notifyTurnAccepted:n(()=>ce(),"notifyTurnAccepted"),emitStartupMilestone:d,formatModelSpec:B});const Ee=n(e=>{const o=m.session(),c=ie(o,E),v=Qn(e.snapshotTail),h=c===void 0||v===void 0?c:c.slice(-v),w=h?.map(({message:I})=>I)??o.sessionManager.buildSessionContext().messages,$=O.summaries(),_e=h!==void 0&&v!==void 0?ot(w):void 0,Ae=_e===void 0?$:Object.fromEntries(Object.entries($).filter(([I])=>_e.has(I)));return{messages:w,...h===void 0?{}:{messageIds:h.map(({id:I})=>I)},messageVisibility:h?.map(({visibility:I})=>I)??w.map(()=>"visible"),turnVisibility:bn(),stats:o.getSessionStats(),state:{model:re(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:{...g.displaySnapshot()},toolGroupSummaries:Ae,turnReplies:j.snapshot(),workingActivity:F.currentWorkingActivity(),queued:{steering:[...o.getSteeringMessages()],followUp:[...o.getFollowUpMessages()]}}},"buildSnapshot"),we=n(e=>{const o=e.role==="controller"?X.values().next().value:void 0;g.sendFrame(e,{type:"welcome",snapshot:Ee(e),role:e.role,pending_dialog:o!==void 0?o.request:null,agentDir:Y()},!0)},"sendWelcome"),Ce=n(e=>{const o=[...X.values()];for(let c=1;c<o.length;c++)g.sendFrame(e,o[c].request)},"replayExtraPendingDialogsTo"),ne=n(()=>{try{const e=m.session();j.seed(ie(e,E)?.map(({message:o})=>o)??e.sessionManager.buildSessionContext().messages)}catch(e){T({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`turn reply reseed failed: ${String(e)}`}})}g.forEachHelloed(we)},"reWelcomeAll"),Se=n(async e=>{if(!N){N=!0,Q().stop(),O.persistPendingSummary(),F.dispose(),nt();try{H?.close()}catch{}s.close(),g.dispose();try{be(K)&&ye(K)}catch{}g.clearAttachState(),await ze(),process.exit(e)}},"completeExit"),q=n((e,o=0)=>{if(N)return;const c=e==="shutdown-hook"||e==="shutdown-after-settle";if(c&&O.finishOpenToolGroup(!0),c&&(O.hasSummaryTasks()||j.hasTasks())){if(de)return;de=!0,Promise.allSettled([O.waitForSummaryTasks(),j.waitForTasks()]).finally(()=>Se(o));return}Se(o)},"disposeAndExit");le=at({writable:n(()=>g.writableClients(),"writable"),forward:n((e,o)=>g.sendFrame(e,o),"forward"),pending:X,broadcast:n(e=>g.broadcastUi(e),"broadcast"),onKnownStreamWait:n(e=>F.knownStreamWait(e),"onKnownStreamWait")}),m.setRebindSession(),await m.enqueueRebind(U,A),d("broker.startup.extensions_bound");const C=Fn({nodeId:t,registry:g,toolGroups:O,projection:F,rebind:m,boundaryReviewId:E,pendingDialogs:X,sendWelcome:we,replayExtraPendingDialogsTo:Ce,reWelcomeAll:ne,disposeAndExit:q,persistModelChoice:ge,broadcastModelChanged:ve,registryOf:se,formatModelSpec:B,formatExactModelSpec:Zn,turnAdmission:ee,memoryInventory:b,runNode:R,onKickoffAdmitted:L.releaseKickoff});ce=C.notifyTurnAccepted,me=C.resetForSession,ue=C.pendingPromptDispatches;const Me=2500;let te=!1;const xe=n(async e=>{if(N||te)return;if(te=!0,m.isAgentRunActive()||m.session().isStreaming||C.pendingPromptDispatches()>0){const c=Date.now()+Me;for(;C.pendingPromptDispatches()>0&&!m.session().isStreaming&&Date.now()<c;)await new Promise(v=>setTimeout(v,25));if(m.session().isStreaming){const v=c-Date.now();if(v>0){let h;try{Gn(),await Promise.race([m.session().abort().then(()=>!0,()=>!1),new Promise($=>{h=setTimeout(()=>$(!1),v)})])&&await Re(t,{event:"closed",end_reason:"teardown-aborted"})}finally{h!==void 0&&clearTimeout(h)}}}else(C.pendingPromptDispatches()>0||m.isAgentRunActive())&&await Re(t,{event:"interrupted"})}q(e)},"abortAndExit");if(y=n(e=>{xe(e)},"signalTeardown"),x!==void 0){y(x);return}try{be(K)&&ye(K)}catch{}H=Ue(e=>{const o=g.create(e);e.on("data",v=>{let h;try{h=o.decoder.push(v)}catch(w){w instanceof Jn?(g.sendFrame(o,{type:"error",code:"frame_overflow",message:w.message}),g.dropClient(o,`frame overflow: ${w.message}`)):g.dropClient(o,`decoder error: ${String(w)}`);return}for(const w of h)try{Ln(C,o,w)}catch{}});const c=n(()=>{g.removeClient(o)},"drop");e.on("close",c),e.on("error",()=>{})}),H.on("error",e=>{N||(T({level:"error",event:"broker.socket.failed",error:e}),q("socket-error",1))}),H.listen(K,async()=>{Promise.all([z(t,{op:"clear",link:"viewer\u2194broker"}),z(t,{op:"clear",link:"relay\u2194broker"})]).catch(o=>T({level:"error",event:"broker.daemon.operation.failed",node_id:t,error:o,fields:{operation:"broker_socket_bound_fault_clear"}}));let e;try{e=await W.recoverOnStartup()}catch(o){T({level:"error",event:"broker.daemon.operation.failed",node_id:t,error:o,fields:{operation:"recovery_startup"}}),q("recovery-startup-failed",1);return}if(!(N||te))if(e==="none"&&f.firstPrompt!==void 0&&f.firstPrompt!==""){const o=qn(process.env[Vn]);o!==null&&Xn(f.firstPrompt,o);const c=process.env.CRTR_KICKOFF_MESSAGE_IDS;C.kickoff(f.firstPrompt,c?JSON.parse(c):[])}else L.releaseKickoff()}),g.persistAttachState()}n(uo,"runBroker");function ot(t){const r=new Set;for(const i of t)if(!(i.role!=="assistant"||!Array.isArray(i.content)))for(const u of i.content)u!==null&&typeof u=="object"&&u.type==="toolCall"&&typeof u.id=="string"&&r.add(u.id);return r}n(ot,"toolCallIds");function ie(t,r){const i=t.sessionManager,u=hn(i);return u!==void 0&&$n(u.map(({message:s})=>s)),u===void 0?void 0:_n(u,{boundaryReviewId:r,sessionEntries:i.getEntries?.()})}n(ie,"snapshotMessages");function ke(){const t=Ne();if(t===void 0||t==="")throw new Error("broker launch is missing CRTR_NODE_ID");return t}n(ke,"currentBrokerNodeId");async function rt(t,r){const i=cn(r.model,Ie(),r.modelExact===!0);if(i===void 0)return;const u=se(t),s={cwd:De()??r.cwd,profileId:Fe()},a=fn(i,u,s);if(a!==void 0)throw await z(ke(),{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 l=mn(i,s.cwd,s.profileId),d=un(i.spec);for(const p of l){const S=u.find(p.providerId,p.modelId);if(S===void 0)continue;const _=d?.providerId===p.providerId&&d.modelId===p.modelId?d.thinkingLevel??(p.thinkingLevel===void 0?void 0:"off"):p.thinkingLevel;return{model:S,thinkingLevel:_}}if(r.modelExact===!0){const p=l.map(S=>`'${S.providerId}/${S.modelId}' unregistered`).join("; ");throw await z(ke(),{op:"record",input:{link:"crtr\u2192pi",op:"model resolution at launch",kind:"model-not-found",retry:{disposition:"fatal"},message:`exact-consult model '${r.model}' is unavailable \u2014 refusing to substitute (${p})`}}),new Error(`[broker] FATAL: exact-consult model '${r.model}' is unavailable`)}T({level:"warn",event:"broker.model.none_viable",fields:{rejected_candidates:l.map(p=>({provider:p.providerId,model:p.modelId,reason:"unregistered"})).slice(0,16)}})}n(rt,"resolveLaunchModel");function st(t){let r=!0;return{runtime:new Proxy(t,{get(u,s,a){return r&&s==="getAvailableSnapshot"?()=>[]:r&&s==="getAvailable"?async()=>[]:r&&s==="getModel"?()=>{}:Reflect.get(u,s,a)}}),reveal:n(()=>{r=!1},"reveal")}}n(st,"modelLessRegistry");async function it(t,r){const i=Y(),u=n(async _=>{const f=await Ve.create({credentials:new dn,modelsPath:Te(_.agentDir,"models.json")});ln(f);const b=await t.createAgentSessionServices({cwd:_.cwd,agentDir:_.agentDir,modelRuntime:f,resourceLoaderOptions:{additionalExtensionPaths:r.extensionPaths,appendSystemPrompt:r.appendSystemPromptPath!==void 0?[r.appendSystemPromptPath]:void 0,noContextFiles:!0,extensionsOverride:n(P=>({...P,extensions:P.extensions.filter(E=>!/[/\\]provider-rotation\.(?:ts|js)$/.test(E.path))}),"extensionsOverride")}}),y=b.resourceLoader.getExtensions();if(r.extensionPaths.some(P=>oe.includes(P))){const P=new Set(y.extensions.map(R=>R.path)),E=oe.filter(R=>!P.has(R));if(E.length>0){const R=y.errors.filter(D=>oe.includes(D.path)).map(D=>`${D.path}: ${D.error}`).join("; ");throw new Error(`[broker] FATAL: mandatory canvas extensions failed to load: ${E.join(", ")}${R===""?"":` (${R})`}`)}}b.settingsManager.getRetryEnabled=()=>!1;const x=await rt(b,r),V=x?.model,U=x?.thinkingLevel,A=x===void 0?st(b.modelRuntime):void 0,ae=A!==void 0?{...b,modelRuntime:A.runtime}:b,G=await t.createAgentSessionFromServices({services:ae,sessionManager:_.sessionManager,model:V,thinkingLevel:U,...tt(r.tools,Le()),sessionStartEvent:_.sessionStartEvent});return Bn(G.session),an(G.session),A?.reveal(),{...G,services:b}},"buildForManager"),s=r.resumeSessionPath,a=r.forkFrom!==void 0&&r.forkFrom!=="";if(!a&&(s===void 0||s==="")&&r.resumeSessionId!==void 0&&r.resumeSessionId!=="")throw new Error(`[broker] resume requires a session .jsonl PATH; got only a bare id '${r.resumeSessionId}' (pi_session_file was never captured for this node)`);const l=!a&&s!==void 0&&s!=="",d=l&&r.newCycle===!0,p=l&&!d;let S;if(a)S=await t.SessionManager.forkFrom(r.forkFrom,r.cwd);else if(p||d){if(S=await t.SessionManager.open(s),d){const _=S.getLeafId();S.resetLeaf(),S.appendCustomEntry(vn,{cycle:Number(process.env.CRTR_CYCLES),fromLeaf:_})}}else S=await t.SessionManager.create(r.cwd);if(t.createAgentSessionRuntime!==void 0){const _=n(async b=>{const y=await u({cwd:b.cwd,agentDir:b.agentDir,sessionManager:b.sessionManager,sessionStartEvent:b.sessionStartEvent});return{...y,diagnostics:y.services.diagnostics??[]}},"factory"),f=await t.createAgentSessionRuntime(_,{cwd:r.cwd,agentDir:i,sessionManager:S});return{session:f.session,services:f.services,resuming:p,runtime:f}}const k=await u({cwd:r.cwd,agentDir:i,sessionManager:S});return{session:k.session,services:k.services,resuming:p,runtime:void 0}}n(it,"buildBrokerSession");function at(t){const r=n((s,a,l,d)=>{if(d?.signal?.aborted)return Promise.resolve(s);const p=t.writable();return p.length===0?Promise.resolve(s):new Promise(S=>{let k;const _=n(()=>{k!==void 0&&clearTimeout(k),d?.signal?.removeEventListener("abort",f),t.pending.delete(a.id)},"cleanup"),f=n(()=>{_(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),S(s)},"onAbort");d?.signal?.addEventListener("abort",f,{once:!0});const b=d?.timeout!==void 0?d.timeout:et;k=setTimeout(()=>{_(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),S(s)},b),typeof k.unref=="function"&&k.unref(),t.pending.set(a.id,{request:a,resolve:n(y=>{_(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),S(l(y))},"resolve")});for(const y of p)t.forward(y,a)})},"dialogPromise"),i=n(()=>{},"noop");return{[pn]:t.onKnownStreamWait??(s=>()=>{}),get theme(){const s=globalThis[Symbol.for("@earendil-works/pi-coding-agent:theme")];if(s==null)throw new Error("Theme not initialized. Call initTheme() first.");return s},select:n((s,a,l)=>r(void 0,{type:"extension_ui_request",id:M(),method:"select",title:s,options:a,timeout:l?.timeout},d=>"cancelled"in d&&d.cancelled?void 0:"value"in d?d.value:void 0,l),"select"),confirm:n((s,a,l)=>r(!1,{type:"extension_ui_request",id:M(),method:"confirm",title:s,message:a,timeout:l?.timeout},d=>"cancelled"in d&&d.cancelled?!1:"confirmed"in d?d.confirmed:!1,l),"confirm"),input:n((s,a,l)=>r(void 0,{type:"extension_ui_request",id:M(),method:"input",title:s,placeholder:a,timeout:l?.timeout},d=>"cancelled"in d&&d.cancelled?void 0:"value"in d?d.value:void 0,l),"input"),editor:n((s,a)=>r(void 0,{type:"extension_ui_request",id:M(),method:"editor",title:s,prefill:a},l=>"cancelled"in l&&l.cancelled?void 0:"value"in l?l.value:void 0),"editor"),setStatus:n((s,a)=>t.broadcast({type:"extension_ui_request",id:M(),method:"setStatus",statusKey:s,statusText:a}),"setStatus"),setWidget:n((s,a,l)=>{typeof a!="function"&&t.broadcast({type:"extension_ui_request",id:M(),method:"setWidget",widgetKey:s,widgetLines:a,widgetPlacement:l?.placement})},"setWidget"),setTitle:n(s=>t.broadcast({type:"extension_ui_request",id:M(),method:"setTitle",title:s}),"setTitle"),notify:n((s,a)=>{const l=a==="warn"?"warning":a;t.broadcast({type:"extension_ui_request",id:M(),method:"notify",message:s,notifyType:l})},"notify"),onTerminalInput:n(()=>i,"onTerminalInput"),setWorkingMessage:i,setWorkingVisible:i,setWorkingIndicator:i,setHiddenThinkingLabel:i,setFooter:i,setHeader:i,custom:n(()=>Promise.resolve(void 0),"custom"),pasteToEditor:i,setEditorText:i,getEditorText:n(()=>"","getEditorText"),addAutocompleteProvider:i,setEditorComponent:i,getEditorComponent:n(()=>{},"getEditorComponent"),getAllThemes:n(()=>[],"getAllThemes"),getTheme:n(()=>{},"getTheme"),setTheme:i,getToolsExpanded:n(()=>!1,"getToolsExpanded"),setToolsExpanded:i}}n(at,"makeBrokerUiContext");export{vo as REVIEW_BOUNDARY_NAVIGATION_CODE,go as ReviewBoundaryNavigationError,tt as brokerToolOptions,it as buildBrokerSession,nt as disposeActiveSession,at as makeBrokerUiContext,uo as runBroker,ie as snapshotMessages};
1
+ var De=Object.defineProperty;var n=(t,o)=>De(t,"name",{value:o,configurable:!0});import{envInboxBetweenTurns as Ne,envModelIntent as Fe,envNodeCwd as Le,envNodeId as Be,envProfileId as Ue,envScopes as $e,scopeAllowed as Ke}from"../../shared/env.js";import{createServer as We}from"node:net";import{WebSocketServer as Ge,createWebSocketStream as je}from"ws";import{BROKER_VIEW_PORT as qe}from"./view-socket.js";import{existsSync as Re,readFileSync as Ve,unlinkSync as Te}from"node:fs";import{join as Ee}from"node:path";import{randomUUID as M}from"node:crypto";import{mark as Xe}from"../timing.js";import{SUBMIT_RESULT_TOOL as He}from"./structured-output.js";import{flushConversation as ke,installSessionManagerStorePatch as Ye}from"../conversation-store/index.js";import{getAgentDir as J,ModelRegistry as ze,ModelRuntime as Je}from"@earendil-works/pi-coding-agent";import{nodeRunDir as Qe,viewSocketPath as Ze}from"../canvas/paths.js";import{bindBrokerEventSource as en}from"../events/source.js";import{emitEvent as b,flushBrokerLog as nn}from"../events/emit.js";import{operationIdContext as tn}from"../events/operation-id.js";import{findMissingPackagePaths as rn}from"./package-health.js";import{installBrokerConfigSnapshot as on}from"../config.js";import{FRONT_DOOR_ENV as sn}from"./front-door.js";import{CANVAS_EXTENSIONS as oe,piInvocationToSdkConfig as an}from"./launch.js";import{assertEngineVersion as dn,loadBrokerEngine as ln}from"./broker-sdk.js";import{initCrtrTheme as cn}from"./crtr-theme.js";import{resolveBundledPiPackageDir as mn}from"./pi-cli.js";import{captureSessionChatCapabilities as un}from"./command-surface.js";import{InMemoryCredentialStore as fn}from"@earendil-works/pi-ai";import{configureBrokerModelRuntime as pn}from"./broker/model-adapter.js";import{brokerApiUrl as gn,mutateBrokerFault as Q,recordBrokerTurn as Ce}from"./broker/daemon-ops.js";import{fetchRunAttachments as vn}from"./broker/attachments-fetch.js";import{modelRequestFromConfig as _n,expandModelCandidates as hn,parseModelSpec as wn,unregisteredConcreteModel as Sn}from"../model-routes.js";import{KNOWN_STREAM_WAIT_UI as bn}from"./stream-watchdog.js";import{probeOnline as yn}from"./connectivity.js";import{CRTR_CYCLE_CUSTOM_TYPE as Rn,cycleAwareMessages as Tn,endedByAbort as En}from"./session-cycles.js";import{turnErrorOf as kn}from"../llm/refusal.js";import{projectTranscript as Cn}from"./session-visibility.js";import{currentTurnVisibility as xn}from"./turn-visibility.js";import{isUnknownModel as ie}from"./model-selection.js";import{BrokerClientRegistry as Mn}from"./broker/client-registry.js";import{ToolGroupTracker as An}from"./broker/tool-groups.js";import{TurnReplyTracker as Pn}from"./broker/turn-replies.js";import{onNodeNamed as On}from"./broker/node-named.js";import{FaultRetry as In,willDaemonRetry as Dn}from"./broker/fault-retry.js";import{RunTurnEnds as Nn}from"./broker/run-turn-end.js";import{createTurnAdmissionGate as Fn}from"./broker/turn-admission.js";import{BROKER_DISPOSE_AND_EXIT as Ln,BROKER_IDLE_TURN_START as Bn,BROKER_RUN_TURN_BUSY as Un}from"./broker/held-deferred-inbox.js";import{prependRunDeferredMail as $n,settleRunDeferredMail as Kn}from"./broker/run-deferred-mail.js";import{createRunTurnQueue as Wn}from"./broker/run-turn-queue.js";import{EventProjection as Gn}from"./broker/event-projection.js";import{createFrameDispatchContext as jn,handleFrame as qn}from"./broker/frame-dispatch.js";import{hydratePersistedAdvertisedCommandMessages as Vn,installAdvertisedCommandInvocationContract as Xn}from"./advertised-command-invocation.js";import{RebindDriver as Hn}from"./broker/rebind.js";import{beginRuntimeTeardown as Yn}from"./broker/extension-abort.js";import{receiveNodeToken as zn}from"./broker/node-token.js";import{serveCliRelay as Jn}from"./broker/cli-relay.js";import{recordBrokerRelease as Qn}from"./lifecycle.js";import{setTurnCauseSource as Zn}from"./broker/turn-cause.js";import{decodeKickoffOrigin as et,KICKOFF_ORIGIN_ENV as nt}from"./stamp/protocol.js";import{announceMessageOrigin as tt}from"./stamp/channel.js";import{commitBrokerModel as rt}from"./broker/daemon-ops.js";import{bootExtensionState as ot}from"./broker/boot-state.js";import{composerNames as it}from"./broker/frame-memory-refs.js";import{BROKER_READ_CAPS as st,FrameOverflowError as at,normalizeSnapshotTail as dt}from"./broker-protocol.js";import{ReviewBoundaryNavigationError as Mr,REVIEW_BOUNDARY_NAVIGATION_CODE as Ar}from"./broker/frame-replies.js";function se(t){return new ze(t.modelRuntime)}n(se,"registryOf");function $(t,o){if(t==null||ie(t))return null;const s=o!==void 0&&o!==""&&o!=="off"?`:${o}`:"";return`${t.provider}/${t.id}${s}`}n($,"formatModelSpec");function lt(t,o){const s=$(t,void 0);return s===null?null:`${s}:${o===void 0||o===""?"off":o}`}n(lt,"formatExactModelSpec");const ct=12e4;let Z=null;import{brokerSignalClient as K}from"./broker/signal-stream.js";function mt(){K().stop();const t=Z;if(Z=null,t!==null)try{t.dispose()}catch{}}n(mt,"disposeActiveSession");function ut(t,o){const s=Ke(o,"crtr:act")?void 0:["bash"],u=t!==void 0&&t.length>0?[...new Set([...t,He])]:t===void 0?void 0:[...t];return{...u!==void 0?{tools:u}:{},...s!==void 0?{excludeTools:s}:{}}}n(ut,"brokerToolOptions");async function kr(t,o=process.hrtime.bigint(),s=new Date().toISOString()){en(t);const u=await zn(),i=await Jn(t,u);process.env.CRTR_API_SOCKET=i.path,tn.fresh(()=>{b({level:"info",event:"broker.startup.cli_entry",ts:s,duration_ms:0,fields:{runtime_version:process.version,engine_version:null,model:null}}),b({level:"info",event:"broker.startup.module_loaded",duration_ms:Number(process.hrtime.bigint()-o)/1e6,fields:{runtime_version:process.version,engine_version:null,model:null}})});const a=new Set;let c=null;const d=n((e,r=null)=>{a.has(e)||(a.add(e),Xe(e,{duration_ms:Number(process.hrtime.bigint()-o)/1e6}),b({level:"info",event:e,duration_ms:Number(process.hrtime.bigint()-o)/1e6,fields:{runtime_version:process.version,engine_version:c,model:r}}))},"emitStartupMilestone");process.env[sn]="1",process.env.CRTR_BROKER_PID=String(process.pid),delete process.env.TMUX_PANE,delete process.env.TMUX,Ye(t);const v=await ln();dn(v.VERSION),c=v.VERSION;const w=Qe(t),E=Ee(w,"broker-launch.json"),S=JSON.parse(Ve(E,"utf8"));if(!S.configSnapshot)throw new Error("broker launch is missing its config snapshot");on(S.configSnapshot);const g=an(S);g.modelExact===!0?process.env.CRTR_MODEL_EXACT="1":delete process.env.CRTR_MODEL_EXACT;const y=await it(t);let R,A;const X=n(e=>{R!==void 0?R(e):A??=e},"onSignal");process.on("SIGTERM",()=>X("SIGTERM")),process.on("SIGINT",()=>X("SIGINT")),process.on("SIGUSR1",()=>{const e=process.env.CRTR_EXECUTION_ID;e!==void 0&&e!==""&&K().start(t,e)});let{session:W,services:P,resuming:de,runtime:G}=await vt(v,g);d("broker.startup.session_built");const k=(await ot(t)).node.review_binding?.review_id,T=Ne();Z=W;const F=yn;try{process.env.PI_PACKAGE_DIR=mn(),cn(P.settingsManager.getTheme(),J(),!1)}catch(e){b({level:"error",event:"broker.theme.initialization_failed",error:e})}try{for(const e of rn(J()))b({level:"warn",event:"broker.startup.warning",fields:{stage:"package_health",source:e.source,resolved_path:e.resolved}})}catch{}const j=Ze(t),_=new Mn(t),H=new Map,I=new An(t,e=>_.broadcast(e)),q=new Pn(t,e=>_.broadcast(e));On(e=>_.broadcast({type:"node_named",...e}));let D=!1,le=!1,Y,z,ce,m,V;const ee=new Nn;let L,me=n(()=>{},"notifyTurnAccepted"),ue=n(()=>{},"resetFrameState");const ne=Fn();let fe=n(()=>0,"pendingPromptDispatches"),pe;const B=Wn({runNode:T,session:n(()=>m.session(),"session"),isReplacing:n(()=>m.isReplacing(),"isReplacing"),pendingRebind:n(()=>m.pendingRebind(),"pendingRebind"),isAgentRunActive:n(()=>m.isAgentRunActive(),"isAgentRunActive"),pendingDispatches:n(()=>fe(),"pendingDispatches"),turnAdmission:ne,prependDeferred:n(e=>$n(t,e),"prependDeferred"),onError:n(e=>b({level:"error",event:"broker.inbox.idle_prompt_failed",error:e}),"onError")});Zn(()=>m.session());const ge=B.drain;g.firstPrompt!==void 0&&g.firstPrompt!==""&&B.holdForKickoff(),globalThis[Bn]=B.start,globalThis[Un]=B.busy,m=new Hn({nodeId:t,cfg:g,session:W,services:P,runtime:G,registry:_,toolGroups:I,turnReplies:q,transcriptMessages:n(e=>ae(e,k)?.map(({message:r})=>r)??e.sessionManager.buildSessionContext().messages,"transcriptMessages"),uiContext:n(()=>ce,"uiContext"),faultRetry:n(()=>V,"faultRetry"),projection:n(()=>L,"projection"),setActiveSession:n(e=>{if(Z=e,pe?.(),T||process.env.CRTR_RUN_ID){let r="stop",l,f=!1;pe=e.subscribe(h=>{if(h.type==="agent_start"&&(r="stop",l=void 0,f=!1,ee.started()),h.type==="agent_end"){const p=[...h.messages??[]].reverse().find(U=>U.role==="assistant");p&&(r=p.stopReason,l=En(p)?void 0:kn(p),f=p.role==="assistant"&&Dn(p,e.model?.contextWindow))}h.type==="agent_settled"&&(ee.settled(e.sessionManager,{stop_reason:r,...l?{error:l}:{}},f),T&&(ke().then(()=>Kn(t,e)).catch(p=>{if(String(p?.message).startsWith("conversation_write_failed")){b({level:"error",event:"broker.exited",node_id:t,error:p,fields:{fault:"conversation_write_failed"}}),C("conversation_write_failed",1);return}b({level:"error",event:"broker.run_deferred_mail.settle_failed",error:p})}),queueMicrotask(()=>{m.session()===e&&ge()})))})}},"setActiveSession"),disposeAndExit:n((e,r)=>C(e,r),"disposeAndExit"),onSessionRebind:n(()=>{ue()},"onSessionRebind"),onReplacementIdle:n(()=>{T&&ge()},"onReplacementIdle"),reWelcomeAll:n(()=>te(),"reWelcomeAll")});const ve=n(async(e,r=!1)=>{const l=m.session(),f=$(l.model,l.thinkingLevel);if(f===null)return null;const h=await rt(t,{spec:f,...e!==void 0?{intent:e}:{},userSelected:r});return r&&(g.model=h.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)),h.modelOverride},"persistModelChoice"),_e=n(async(e=!0,r,l=!1)=>{const f=m.session(),h=$(f.model,f.thinkingLevel),p=e?await ve(r,l):h;_.broadcast({type:"model_changed",model:ie(f.model)?void 0:f.model,spec:p})},"broadcastModelChanged");V=new In({nodeId:t,cfg:g,retryProbe:F,currentSession:n(()=>m.session(),"currentSession"),currentServices:n(()=>m.services(),"currentServices"),installedGeneration:n(()=>m.installedGeneration(),"installedGeneration"),registryOf:se,formatModelSpec:$,broadcastModelChanged:_e,turnAdmission:ne,reWelcomeAll:n(()=>te(),"reWelcomeAll"),...T?{turnEnds:ee}:{}});const he=n(()=>{V.rearmIfStranded().catch(e=>{b({level:"warn",event:"broker.runtime.diagnostic",fields:{message:`fault retry re-arm failed: ${e instanceof Error?e.message:String(e)}`}})})},"rearmStrandedRetry");K().subscribe("resync",he),K().subscribe("fault-retry",he),L=new Gn({registry:_,faultRetry:V,installedGeneration:n(()=>m.installedGeneration(),"installedGeneration"),currentSession:n(()=>m.session(),"currentSession"),notifyTurnAccepted:n(()=>me(),"notifyTurnAccepted"),emitStartupMilestone:d,formatModelSpec:$});const Me=n(e=>{const r=m.session(),l=ae(r,k),f=dt(e.snapshotTail),h=l===void 0||f===void 0?l:l.slice(-f),p=h?.map(({message:N})=>N)??r.sessionManager.buildSessionContext().messages,U=I.summaries(),ye=h!==void 0&&f!==void 0?ft(p):void 0,Ie=ye===void 0?U:Object.fromEntries(Object.entries(U).filter(([N])=>ye.has(N)));return{messages:p,...h===void 0?{}:{messageIds:h.map(({id:N})=>N)},messageVisibility:h?.map(({visibility:N})=>N)??p.map(()=>"visible"),turnVisibility:xn(),stats:r.getSessionStats(),state:{model:ie(r.model)?void 0:r.model,thinkingLevel:r.thinkingLevel,isStreaming:r.isStreaming,isCompacting:r.isCompacting,steeringMode:r.steeringMode,followUpMode:r.followUpMode,sessionFile:r.sessionFile,sessionId:r.sessionId,sessionName:r.sessionName,autoCompactionEnabled:r.autoCompactionEnabled,messageCount:r.messages.length,pendingMessageCount:r.pendingMessageCount},display:{..._.displaySnapshot()},toolGroupSummaries:Ie,turnReplies:q.snapshot(),workingActivity:L.currentWorkingActivity(),queued:{steering:[...r.getSteeringMessages()],followUp:[...r.getFollowUpMessages()]}}},"buildSnapshot"),we=n(e=>{const r=e.role==="controller"?H.values().next().value:void 0;_.sendFrame(e,{type:"welcome",snapshot:Me(e),role:e.role,pending_dialog:r!==void 0?r.request:null,agentDir:J()},!0)},"sendWelcome"),Ae=n(e=>{const r=[...H.values()];for(let l=1;l<r.length;l++)_.sendFrame(e,r[l].request)},"replayExtraPendingDialogsTo"),te=n(()=>{try{const e=m.session();q.seed(ae(e,k)?.map(({message:r})=>r)??e.sessionManager.buildSessionContext().messages)}catch(e){b({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`turn reply reseed failed: ${String(e)}`}})}_.forEachHelloed(we)},"reWelcomeAll"),Se=n(async e=>{if(D)return;D=!0;const r=K().latestNode;r!==void 0&&(r.intent==="idle-release"||r.status==="done")&&Qn(t,process.env.CRTR_EXECUTION_ID??null),K().stop(),e===0&&await ke().catch(l=>{e=1,b({level:"error",event:"broker.exited",node_id:t,error:l,fields:{fault:"conversation_write_failed"}})}),I.persistPendingSummary(),L.dispose(),mt();try{Y?.close(),z?.close()}catch{}i.close(),_.dispose();try{Re(j)&&Te(j)}catch{}_.clearAttachState(),await nn(),process.exit(e)},"completeExit"),C=n((e,r=0)=>{if(D)return;const l=e==="shutdown-hook"||e==="shutdown-after-settle";if(l&&I.finishOpenToolGroup(!0),l&&(I.hasSummaryTasks()||q.hasTasks())){if(le)return;le=!0,Promise.allSettled([I.waitForSummaryTasks(),q.waitForTasks()]).finally(()=>Se(r));return}Se(r)},"disposeAndExit");globalThis[Ln]=C,ce=_t({writable:n(()=>_.writableClients(),"writable"),forward:n((e,r)=>_.sendFrame(e,r),"forward"),pending:H,broadcast:n(e=>_.broadcastUi(e),"broadcast"),onKnownStreamWait:n(e=>L.knownStreamWait(e),"onKnownStreamWait")}),m.setRebindSession(),await m.enqueueRebind(W,P),d("broker.startup.extensions_bound");const x=jn({nodeId:t,registry:_,toolGroups:I,projection:L,rebind:m,boundaryReviewId:k,pendingDialogs:H,sendWelcome:we,replayExtraPendingDialogsTo:Ae,reWelcomeAll:te,disposeAndExit:C,persistModelChoice:ve,broadcastModelChanged:_e,registryOf:se,formatModelSpec:$,formatExactModelSpec:lt,turnAdmission:ne,memoryInventory:y,runNode:T,onKickoffAdmitted:B.releaseKickoff});me=x.notifyTurnAccepted,ue=x.resetForSession,fe=x.pendingPromptDispatches;const Pe=2500;let re=!1;const Oe=n(async e=>{if(D||re)return;if(re=!0,m.isAgentRunActive()||m.session().isStreaming||x.pendingPromptDispatches()>0){const l=Date.now()+Pe;for(;x.pendingPromptDispatches()>0&&!m.session().isStreaming&&Date.now()<l;)await new Promise(f=>setTimeout(f,25));if(m.session().isStreaming){const f=l-Date.now();if(f>0){let h;try{Yn(),await Promise.race([m.session().abort().then(()=>!0,()=>!1),new Promise(U=>{h=setTimeout(()=>U(!1),f)})])&&await Ce(t,{event:"closed",end_reason:"teardown-aborted"})}finally{h!==void 0&&clearTimeout(h)}}}else(x.pendingPromptDispatches()>0||m.isAgentRunActive())&&await Ce(t,{event:"interrupted"})}C(e)},"abortAndExit");if(R=n(e=>{Oe(e)},"signalTeardown"),A!==void 0){R(A);return}try{Re(j)&&Te(j)}catch{}const be=n(e=>{const r=_.create(e);e.on("data",f=>{let h;try{h=r.decoder.push(f)}catch(p){p instanceof at?(_.sendFrame(r,{type:"error",code:"frame_overflow",message:p.message}),_.dropClient(r,`frame overflow: ${p.message}`)):_.dropClient(r,`decoder error: ${String(p)}`);return}for(const p of h)try{qn(x,r,p)}catch{}});const l=n(()=>{_.removeClient(r)},"drop");e.on("close",l),e.on("error",()=>{})},"serveViewer");Y=We(be),gn()!==void 0&&(z=new Ge({host:"127.0.0.1",port:qe,path:"/view",maxPayload:st.maxLineBytes}),z.on("connection",e=>be(je(e))),z.on("error",e=>{D||(b({level:"error",event:"broker.socket.failed",error:e}),C("socket-error",1))})),Y.on("error",e=>{D||(b({level:"error",event:"broker.socket.failed",error:e}),C("socket-error",1))}),Y.listen(j,async()=>{Promise.all([Q(t,{op:"clear",link:"viewer\u2194broker"}),Q(t,{op:"clear",link:"relay\u2194broker"})]).catch(r=>b({level:"error",event:"broker.daemon.operation.failed",node_id:t,error:r,fields:{operation:"broker_socket_bound_fault_clear"}}));let e;try{e=await V.recoverOnStartup()}catch(r){b({level:"error",event:"broker.daemon.operation.failed",node_id:t,error:r,fields:{operation:"recovery_startup"}}),C("recovery-startup-failed",1);return}if(!(D||re))if(e==="none"&&g.firstPrompt!==void 0&&g.firstPrompt!==""){const r=et(process.env[nt]);r!==null&&tt(g.firstPrompt,r);try{await vn(t)}catch(f){b({level:"error",event:"broker.daemon.operation.failed",node_id:t,error:f,fields:{operation:"attachments_fetch"}}),C("attachments-fetch-failed",1);return}const l=process.env.CRTR_KICKOFF_MESSAGE_IDS;x.kickoff(g.firstPrompt,l?JSON.parse(l):[])}else B.releaseKickoff()}),_.persistAttachState()}n(kr,"runBroker");function ft(t){const o=new Set;for(const s of t)if(!(s.role!=="assistant"||!Array.isArray(s.content)))for(const u of s.content)u!==null&&typeof u=="object"&&u.type==="toolCall"&&typeof u.id=="string"&&o.add(u.id);return o}n(ft,"toolCallIds");function ae(t,o){const s=t.sessionManager,u=Tn(s);return u!==void 0&&Vn(u.map(({message:i})=>i)),u===void 0?void 0:Cn(u,{boundaryReviewId:o,sessionEntries:s.getEntries?.()})}n(ae,"snapshotMessages");function xe(){const t=Be();if(t===void 0||t==="")throw new Error("broker launch is missing CRTR_NODE_ID");return t}n(xe,"currentBrokerNodeId");async function pt(t,o){const s=_n(o.model,Fe(),o.modelExact===!0);if(s===void 0)return;const u=se(t),i={cwd:Le()??o.cwd,profileId:Ue()},a=await Sn(s,u,i);if(a!==void 0)throw await Q(xe(),{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=await hn(s,i.cwd,i.profileId),d=wn(s.spec);for(const v of c){const w=u.find(v.providerId,v.modelId);if(w===void 0)continue;const S=d?.providerId===v.providerId&&d.modelId===v.modelId?d.thinkingLevel??(v.thinkingLevel===void 0?void 0:"off"):v.thinkingLevel;return{model:w,thinkingLevel:S}}if(o.modelExact===!0){const v=c.map(w=>`'${w.providerId}/${w.modelId}' unregistered`).join("; ");throw await Q(xe(),{op:"record",input:{link:"crtr\u2192pi",op:"model resolution at launch",kind:"model-not-found",retry:{disposition:"fatal"},message:`exact-consult model '${o.model}' is unavailable \u2014 refusing to substitute (${v})`}}),new Error(`[broker] FATAL: exact-consult model '${o.model}' is unavailable`)}b({level:"warn",event:"broker.model.none_viable",fields:{rejected_candidates:c.map(v=>({provider:v.providerId,model:v.modelId,reason:"unregistered"})).slice(0,16)}})}n(pt,"resolveLaunchModel");function gt(t){let o=!0;return{runtime:new Proxy(t,{get(u,i,a){return o&&i==="getAvailableSnapshot"?()=>[]:o&&i==="getAvailable"?async()=>[]:o&&i==="getModel"?()=>{}:Reflect.get(u,i,a)}}),reveal:n(()=>{o=!1},"reveal")}}n(gt,"modelLessRegistry");async function vt(t,o){const s=J(),u=n(async S=>{const g=await Je.create({credentials:new fn,modelsPath:Ee(S.agentDir,"models.json")});pn(g);const y=await t.createAgentSessionServices({cwd:S.cwd,agentDir:S.agentDir,modelRuntime:g,resourceLoaderOptions:{additionalExtensionPaths:o.extensionPaths,appendSystemPrompt:o.appendSystemPromptPath!==void 0?[o.appendSystemPromptPath]:void 0,noContextFiles:!0,extensionsOverride:n(O=>({...O,extensions:O.extensions.filter(k=>!/[/\\]provider-rotation\.(?:ts|js)$/.test(k.path))}),"extensionsOverride")}}),R=y.resourceLoader.getExtensions();if(o.extensionPaths.some(O=>oe.includes(O))){const O=new Set(R.extensions.map(T=>T.path)),k=oe.filter(T=>!O.has(T));if(k.length>0){const T=R.errors.filter(F=>oe.includes(F.path)).map(F=>`${F.path}: ${F.error}`).join("; ");throw new Error(`[broker] FATAL: mandatory canvas extensions failed to load: ${k.join(", ")}${T===""?"":` (${T})`}`)}}y.settingsManager.getRetryEnabled=()=>!1;const A=await pt(y,o),X=A?.model,W=A?.thinkingLevel,P=A===void 0?gt(y.modelRuntime):void 0,de=P!==void 0?{...y,modelRuntime:P.runtime}:y,G=await t.createAgentSessionFromServices({services:de,sessionManager:S.sessionManager,model:X,thinkingLevel:W,...ut(o.tools,$e()),sessionStartEvent:S.sessionStartEvent});return Xn(G.session),un(G.session),P?.reveal(),{...G,services:y}},"buildForManager"),i=o.resumeSessionPath,a=o.forkFrom!==void 0&&o.forkFrom!=="";if(!a&&(i===void 0||i==="")&&o.resumeSessionId!==void 0&&o.resumeSessionId!=="")throw new Error(`[broker] resume requires a session .jsonl PATH; got only a bare id '${o.resumeSessionId}' (pi_session_file was never captured for this node)`);const c=!a&&i!==void 0&&i!=="",d=c&&o.newCycle===!0,v=c&&!d;let w;if(a)w=await t.SessionManager.forkFrom(o.forkFrom,o.cwd);else if(v||d){if(w=await t.SessionManager.open(i),d){const S=w.getLeafId();w.resetLeaf(),w.appendCustomEntry(Rn,{cycle:Number(process.env.CRTR_CYCLES),fromLeaf:S})}}else w=await t.SessionManager.create(o.cwd);if(t.createAgentSessionRuntime!==void 0){const S=n(async y=>{const R=await u({cwd:y.cwd,agentDir:y.agentDir,sessionManager:y.sessionManager,sessionStartEvent:y.sessionStartEvent});return{...R,diagnostics:R.services.diagnostics??[]}},"factory"),g=await t.createAgentSessionRuntime(S,{cwd:o.cwd,agentDir:s,sessionManager:w});return{session:g.session,services:g.services,resuming:v,runtime:g}}const E=await u({cwd:o.cwd,agentDir:s,sessionManager:w});return{session:E.session,services:E.services,resuming:v,runtime:void 0}}n(vt,"buildBrokerSession");function _t(t){const o=n((i,a,c,d)=>{if(d?.signal?.aborted)return Promise.resolve(i);const v=t.writable();return v.length===0?Promise.resolve(i):new Promise(w=>{let E;const S=n(()=>{E!==void 0&&clearTimeout(E),d?.signal?.removeEventListener("abort",g),t.pending.delete(a.id)},"cleanup"),g=n(()=>{S(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),w(i)},"onAbort");d?.signal?.addEventListener("abort",g,{once:!0});const y=d?.timeout!==void 0?d.timeout:ct;E=setTimeout(()=>{S(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),w(i)},y),typeof E.unref=="function"&&E.unref(),t.pending.set(a.id,{request:a,resolve:n(R=>{S(),t.broadcast({type:"extension_ui_dismiss",id:a.id}),w(c(R))},"resolve")});for(const R of v)t.forward(R,a)})},"dialogPromise"),s=n(()=>{},"noop");return{[bn]:t.onKnownStreamWait??(i=>()=>{}),get theme(){const i=globalThis[Symbol.for("@earendil-works/pi-coding-agent:theme")];if(i==null)throw new Error("Theme not initialized. Call initTheme() first.");return i},select:n((i,a,c)=>o(void 0,{type:"extension_ui_request",id:M(),method:"select",title:i,options:a,timeout:c?.timeout},d=>"cancelled"in d&&d.cancelled?void 0:"value"in d?d.value:void 0,c),"select"),confirm:n((i,a,c)=>o(!1,{type:"extension_ui_request",id:M(),method:"confirm",title:i,message:a,timeout:c?.timeout},d=>"cancelled"in d&&d.cancelled?!1:"confirmed"in d?d.confirmed:!1,c),"confirm"),input:n((i,a,c)=>o(void 0,{type:"extension_ui_request",id:M(),method:"input",title:i,placeholder:a,timeout:c?.timeout},d=>"cancelled"in d&&d.cancelled?void 0:"value"in d?d.value:void 0,c),"input"),editor:n((i,a)=>o(void 0,{type:"extension_ui_request",id:M(),method:"editor",title:i,prefill:a},c=>"cancelled"in c&&c.cancelled?void 0:"value"in c?c.value:void 0),"editor"),setStatus:n((i,a)=>t.broadcast({type:"extension_ui_request",id:M(),method:"setStatus",statusKey:i,statusText:a}),"setStatus"),setWidget:n((i,a,c)=>{typeof a!="function"&&t.broadcast({type:"extension_ui_request",id:M(),method:"setWidget",widgetKey:i,widgetLines:a,widgetPlacement:c?.placement})},"setWidget"),setTitle:n(i=>t.broadcast({type:"extension_ui_request",id:M(),method:"setTitle",title:i}),"setTitle"),notify:n((i,a)=>{const c=a==="warn"?"warning":a;t.broadcast({type:"extension_ui_request",id:M(),method:"notify",message:i,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(_t,"makeBrokerUiContext");export{Ar as REVIEW_BOUNDARY_NAVIGATION_CODE,Mr as ReviewBoundaryNavigationError,ut as brokerToolOptions,vt as buildBrokerSession,mt as disposeActiveSession,_t as makeBrokerUiContext,kr as runBroker,ae as snapshotMessages};
@@ -1 +1 @@
1
- var a=Object.defineProperty;var r=(e,t)=>a(e,"name",{value:t,configurable:!0});import{getNode as n}from"../canvas/index.js";import{withCanvasWrite as m}from"../canvas/db.js";import{readerForNode as s}from"../graph/reader.js";import{noteNodeBooting as c}from"../graph/repo-sync/index.js";import{checkoutsForCwd as f}from"../graph/repo-sync/repos.js";import{deliver as l}from"../substrate/delivery/deliver.js";import{oneShotControllerRequest as u}from"./broker-request.js";import{isBrokerLive as p}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(e,t){const o=await n(e);if(o===null)throw new Error(`deliverCustomMessageLive: unknown node ${e}`);p(o)&&await u({nodeId:e,what:`the ${t.customType} delivery`,ackFor:"deliver_custom_message",frame:r(()=>({type:"deliver_custom_message",customType:t.customType,content:t.content,...t.deliverAs!==void 0?{deliverAs:t.deliverAs}:{},...t.details!==void 0?{details:t.details}:{}}),"frame"),result:r(()=>{},"result")})}r(w,"deliverCustomMessageLive");async function F(e){await c(e);const{content:t}=await m(async o=>await l(o,await s(o,e,async i=>await f(o,i)),{activity:"boot"}));await w(e,{customType:v,content:d("bearings",{},t),details:{nodeId:e}})}r(F,"deliverBearingsLive");export{F as deliverBearingsLive,w as deliverCustomMessageLive};
1
+ var a=Object.defineProperty;var r=(t,e)=>a(t,"name",{value:e,configurable:!0});import{getNode as n}from"../canvas/index.js";import{openDb as m,withCanvasWrite as s}from"../canvas/db.js";import{readerForNode as c,warmNodeRepos as f}from"../graph/reader.js";import{noteNodeBooting as l}from"../graph/repo-sync/index.js";import{checkoutsForCwd as p}from"../graph/repo-sync/repos.js";import{deliver as u}from"../substrate/delivery/deliver.js";import{oneShotControllerRequest as w}from"./broker-request.js";import{isBrokerLive as v}from"./model-swap.js";import{CONTEXT_INTRO_CUSTOM_TYPE as d}from"./bearings.js";import{formatCard as y}from"../../shared/generated-context.js";async function T(t,e){const o=await n(t);if(o===null)throw new Error(`deliverCustomMessageLive: unknown node ${t}`);v(o)&&await w({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(T,"deliverCustomMessageLive");async function O(t){await l(t),await f(await m(),t);const{content:e}=await s(async o=>await u(o,await c(o,t,async i=>await p(o,i)),{activity:"boot"}));await T(t,{customType:d,content:y("bearings",{},e),details:{nodeId:t}})}r(O,"deliverBearingsLive");export{O as deliverBearingsLive,T as deliverCustomMessageLive};
@@ -0,0 +1,8 @@
1
+ export interface FirstBootRowCounts {
2
+ initialPrompts: number;
3
+ yieldNotes: number;
4
+ situationalCards: number;
5
+ reprompts: number;
6
+ messageBodies: number;
7
+ }
8
+ export declare function copyNodeFilesToRows(): Promise<FirstBootRowCounts>;
@@ -0,0 +1,2 @@
1
+ var _=Object.defineProperty;var d=(e,n)=>_(e,"name",{value:n,configurable:!0});import{existsSync as y,readFileSync as E}from"node:fs";import{join as i}from"node:path";import{openDb as N}from"../canvas/db.js";import{nodeAgentDir as f,nodeDir as b,nodeRunDir as L}from"../canvas/paths.js";function a(e){if(!y(e))return null;const n=E(e,"utf8");return n.trim()===""?null:n}d(a,"readText");async function w(){const e=await N(),n=await e.prepare(`SELECT node_id, grantee FROM node_rows
2
+ WHERE grantee IS NOT NULL AND (initial_prompt IS NULL OR yield_note IS NULL OR situational_card IS NULL OR EXISTS (SELECT 1 FROM structured_requests r WHERE r.node_id = node_rows.node_id AND r.state = 'pending' AND r.reprompt_count = 0))`).all(),r={initialPrompts:0,yieldNotes:0,situationalCards:0,reprompts:0,messageBodies:0};for(const{node_id:o,grantee:p}of n){const s=i(f(o,p),"context"),u=d(async(t,l)=>l===null?0:(await e.prepare(`UPDATE nodes SET ${t} = ? WHERE node_id = ? AND ${t} IS NULL`).run(l,o)).changes,"copy");r.initialPrompts+=await u("initial_prompt",a(i(s,"initial-prompt.md"))),r.yieldNotes+=await u("yield_note",a(i(s,"yield-message.md"))),r.situationalCards+=await u("situational_card",a(i(L(o),"situational-context.md")));const c=a(i(b(o),"output-schema-reprompts.json"));if(c!==null)try{const t=JSON.parse(c);typeof t.count=="number"&&Number.isSafeInteger(t.count)&&typeof t.at=="number"&&Number.isFinite(t.at)&&(r.reprompts+=(await e.prepare("UPDATE structured_requests SET reprompt_count = ?, reprompted_at = ? WHERE node_id = ? AND state = 'pending' AND reprompt_count = 0").run(t.count,t.at,o)).changes)}catch{}}const m=await e.prepare("SELECT message_id, body_ref FROM messages WHERE body_ref LIKE '/%' AND body_json IS NOT NULL AND body_json ->> 'body_full' IS NULL").all();for(const{message_id:o,body_ref:p}of m){const s=a(p);s!==null&&(r.messageBodies+=(await e.prepare("UPDATE messages SET body_json = jsonb_set(body_json, '{body_full}', to_jsonb(?::text)) WHERE message_id = ? AND body_json ->> 'body_full' IS NULL").run(s,o)).changes)}return r}d(w,"copyNodeFilesToRows");export{w as copyNodeFilesToRows};
@@ -49,41 +49,42 @@ export interface FleetRegistry {
49
49
  * a second launch for a live node is a programming error, never silently
50
50
  * tolerated. */
51
51
  register(nodeId: string, handle: HostHandle): void;
52
- /** The reviveNode double-launch guard: a fleet entry IS liveness. */
53
- has(nodeId: string): boolean;
52
+ /** The reviveNode double-launch guard: a handle this process holds for a broker it spawned, or a `running`
53
+ * execution row on a runner whose children this process cannot hold (Blaxel). */
54
+ has(nodeId: string): Promise<boolean>;
54
55
  /** True while ANY launch claim exists for this node — a registered broker OR
55
56
  * an in-flight reservation. `has` alone reads false during the window
56
57
  * between `reserveSlot` and registration, so a caller asking "could this
57
58
  * node come back to life right now?" (the managed-worktree sweep, before it
58
59
  * destroys a checkout) must ask this instead. */
59
- isClaimed(nodeId: string): boolean;
60
+ isClaimed(nodeId: string): Promise<boolean>;
60
61
  /** Live-fleet checks pass (yield-stall, wedge, fatal-fault). */
61
62
  get(nodeId: string): FleetEntry | undefined;
62
63
  /** The capacity count: registered brokers only, excluding reservations. */
63
64
  size(): number;
64
- /** Every slot the cap accounts for — registered brokers plus launch
65
- * reservations that have not registered yet. */
66
- occupancy(): number;
65
+ /** Every slot the cap accounts for — nodes with a live execution row (any process), plus this process's
66
+ * brokers and launch reservations that have no row yet. */
67
+ occupancy(): Promise<number>;
67
68
  /** Claim a slot for `nodeId`. True means the caller may launch; false means
68
69
  * the cap is reached and the caller must freeze or refuse. Idempotent — a
69
70
  * node that already holds a slot (reserved or registered) gets true without
70
71
  * consuming a second one. */
71
- reserveSlot(nodeId: string): boolean;
72
+ reserveSlot(nodeId: string): Promise<boolean>;
72
73
  /** Give back a slot claimed by `reserveSlot` and not consumed by a launch. */
73
74
  releaseReservation(nodeId: string): void;
74
75
  entries(): Iterable<[string, FleetEntry]>;
75
76
  /** Mark this exact broker's pause interruption before directly sending it
76
77
  * SIGTERM. An explicit pid is the identity-checked fallback when the daemon
77
78
  * has not registered a handle yet. */
78
- interruptForProfilePause(nodeId: string, pid?: number): void;
79
+ interruptForProfilePause(nodeId: string, pid?: number): Promise<void>;
79
80
  /** Whether the next dead-row policy pass must absorb this pause interruption
80
- * before a later pass may recover the row normally. */
81
- hasProfilePauseInterruption(nodeId: string): boolean;
81
+ * before a later pass may recover the row normally (`executions.stop_reason`). */
82
+ hasProfilePauseInterruption(nodeId: string): Promise<boolean>;
82
83
  /** Drop an entry without policy (terminal exits + close paths). */
83
84
  forget(nodeId: string): void;
84
85
  /** Wired by `headlessBrokerHost.launch` to the handle's `exited` promise.
85
- * Removes the entry (freeing the capacity slot), then enqueues its
86
- * observation on the daemon's serial work lane — it never runs inline on
86
+ * Removes the entry (freeing the capacity slot), records the exit status on the
87
+ * execution row (`exit_reason`), then enqueues its observation on the daemon's serial work lane — it never runs inline on
87
88
  * the Node event callback (design D-3). */
88
89
  onChildExit(nodeId: string, status: FleetExitStatus, executionId?: string): Promise<void>;
89
90
  /** Test seam — delivers a synthetic exit through the SAME path as
@@ -1 +1 @@
1
- var h=Object.defineProperty;var r=(a,t)=>h(a,"name",{value:t,configurable:!0});import{CredentialSynchronizationError as u,LoginDialogComponent as l,OAuthSelectorComponent as d}from"@earendil-works/pi-coding-agent";import{execFile as p}from"node:child_process";import{join as f}from"node:path";import{setAuthCredential as g}from"../auth-file.js";import{secretsDir as w}from"../layout.js";import{dialogAuthInteraction as y}from"../auth-interaction.js";import{isManagedProvider as C}from"../subscription-state.js";import{daemonManagedLogin as b}from"../model-auth/daemon-login.js";import{cliClient as D}from"../../commands/api-client.js";import{runSetupSettingsProcess as I}from"../../commands/sys/setup-settings-runner.js";import{buildProviderCatalog as L}from"../../commands/sys/panels/provider-panel.js";function P(a){const t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",e=process.platform==="win32"?["/c","start","",a]:[a];p(t,e,{timeout:5e3},()=>{})}r(P,"openBrowser");class A{static{r(this,"FrontDoorLogin")}tui;runtime;agentDir;finish;component;dialog;settled=!1;constructor(t,e,s,o,n){this.tui=t,this.runtime=e,this.agentDir=s,this.finish=n,this.component=new d("login",o,i=>this.startLogin(o.find(m=>m.id===i)),()=>this.complete(!1))}get focused(){return this.component.focused}set focused(t){this.component.focused=t}handleInput(t){this.component.handleInput?.(t)}invalidate(){this.tui.requestRender()}render(t){return this.component.render(t)}dispose(){this.settled||this.dialog?.handleInput("\x1B")}complete(t){this.settled||(this.settled=!0,this.finish(t))}startLogin(t){if(!t){this.complete(!1);return}const e=new l(this.tui,t.id,i=>this.complete(i),t.name);this.dialog=e,this.component=e,this.tui.setFocus(this),this.tui.requestRender();const s=y(e,{openBrowser:P,onChange:r(()=>this.tui.requestRender(),"onChange"),isActive:r(()=>!this.settled&&!e.signal.aborted,"isActive")}),o=r(()=>{e.signal.aborted||this.complete(!1)},"fail");if(t.authType==="api_key"){e.showPrompt(`Enter API key for ${t.name}:`,"sk-...").then(async i=>{if(!i.trim()||this.settled){this.complete(!1);return}await g(t.id,{type:"api_key",key:i.trim()},f(w(),"auth.json")),this.complete(!0)}).catch(o);return}const n=t.id;if(C(n)){b(D(),n,s).then(()=>{this.settled||e.signal.aborted||this.complete(!0)}).catch(o);return}if(!this.runtime.getProvider(n)?.auth.oauth){this.complete(!1);return}this.runtime.login(n,"oauth",s).then(()=>this.complete(!0)).catch(i=>{if(i instanceof u){this.complete(!0);return}o()})}}async function B(){return await I(({tui:t,agentDir:e,runtime:s,registry:o},n)=>new A(t,s,e,L(s,o).map(({providerId:i,name:m,authType:c})=>({id:i,name:m,authType:c})),n.submit))===!0}r(B,"runFrontDoorLogin");export{B as runFrontDoorLogin};
1
+ var u=Object.defineProperty;var r=(a,t)=>u(a,"name",{value:t,configurable:!0});import{CredentialSynchronizationError as l,LoginDialogComponent as d,OAuthSelectorComponent as p}from"@earendil-works/pi-coding-agent";import{execFile as f}from"node:child_process";import{dialogAuthInteraction as g}from"../auth-interaction.js";import{isManagedProvider as w}from"../managed-providers.js";import{daemonManagedLogin as y}from"../model-auth/daemon-login.js";import{cliClient as h}from"../../commands/api-client.js";import{runSetupSettingsProcess as C}from"../../commands/sys/setup-settings-runner.js";import{buildProviderCatalog as b}from"../../commands/sys/panels/provider-panel.js";function I(a){const t=process.platform==="darwin"?"open":process.platform==="win32"?"cmd":"xdg-open",e=process.platform==="win32"?["/c","start","",a]:[a];f(t,e,{timeout:5e3},()=>{})}r(I,"openBrowser");class L{static{r(this,"FrontDoorLogin")}tui;runtime;agentDir;finish;component;dialog;settled=!1;constructor(t,e,s,o,n){this.tui=t,this.runtime=e,this.agentDir=s,this.finish=n,this.component=new p("login",o,i=>this.startLogin(o.find(c=>c.id===i)),()=>this.complete(!1))}get focused(){return this.component.focused}set focused(t){this.component.focused=t}handleInput(t){this.component.handleInput?.(t)}invalidate(){this.tui.requestRender()}render(t){return this.component.render(t)}dispose(){this.settled||this.dialog?.handleInput("\x1B")}complete(t){this.settled||(this.settled=!0,this.finish(t))}startLogin(t){if(!t){this.complete(!1);return}const e=new d(this.tui,t.id,i=>this.complete(i),t.name);this.dialog=e,this.component=e,this.tui.setFocus(this),this.tui.requestRender();const s=g(e,{openBrowser:I,onChange:r(()=>this.tui.requestRender(),"onChange"),isActive:r(()=>!this.settled&&!e.signal.aborted,"isActive")}),o=r(()=>{e.signal.aborted||this.complete(!1)},"fail");if(t.authType==="api_key"){e.showPrompt(`Enter API key for ${t.name}:`,"sk-...").then(async i=>{if(!i.trim()||this.settled){this.complete(!1);return}await h().installCredential(t.id,{kind:"api_key",api_key:i.trim()}),this.complete(!0)}).catch(o);return}const n=t.id;if(w(n)){y(h(),n,s).then(()=>{this.settled||e.signal.aborted||this.complete(!0)}).catch(o);return}if(!this.runtime.getProvider(n)?.auth.oauth){this.complete(!1);return}this.runtime.login(n,"oauth",s).then(()=>this.complete(!0)).catch(i=>{if(i instanceof l){this.complete(!0);return}o()})}}async function R(){return await C(({tui:t,agentDir:e,runtime:s,registry:o},n)=>new L(t,s,e,b(s,o).map(({providerId:i,name:c,authType:m})=>({id:i,name:c,authType:m})),n.submit))===!0}r(R,"runFrontDoorLogin");export{R as runFrontDoorLogin};
@@ -1,11 +1,11 @@
1
- var D=Object.defineProperty;var w=(o,s)=>D(o,"name",{value:s,configurable:!0});import{existsSync as _,statSync as x}from"node:fs";import{resolve as T}from"node:path";import{SUBTREE_NAMES as C}from"../../build-root.js";import{FRONT_DOOR_ENV as E}from"./front-door-env.js";import{frontDoorBootPrompt as L}from"./first-run-offer.js";import{looksLikeNodeIdToken as b}from"./node-id-token.js";import{markTourOffered as A,recordSetupCompleted as W,setupCompleted as $,tourOfferPending as B}from"./setup-marker.js";function I(o){try{return _(o)&&x(o).isDirectory()}catch{return!1}}w(I,"isDir");const M=new Set(["--name","--kind","--profile","--pick-profile","--continue","-c","--resume","-r"]);async function G(){let o=!1;const s=w(()=>{o=!0},"onSigint");process.once("SIGINT",s);try{const{runSetup:r}=await import("../../commands/sys/setup-wizard.js"),e=await r();if(o){const l=new Error("Interrupted");throw l.name="AbortError",l}await W(e)}finally{process.removeListener("SIGINT",s)}}w(G,"runFirstSetup");function V(o){let s=process.cwd(),r,e,l,c=!1,p,u;const i=[];for(let f=0;f<o.length;f++){const n=o[f];if(n==="--name")r=o[++f];else if(n==="--kind")e=o[++f];else if(n==="--profile")l=o[++f];else if(n==="--pick-profile")c=!0;else if(n==="--continue"||n==="-c")p="continue";else if(n==="--resume"||n==="-r"){p="pick";const m=o[f+1];m!==void 0&&b(m)&&!I(T(m))&&(u=m,f++)}else n.startsWith("--")||i.push(n)}i.length>0&&I(T(i[0]))&&(s=T(i.shift()));const g=i.length>0?i.join(" "):void 0;return{cwd:s,prompt:g,name:r,kind:e,profile:l,pickProfile:c,resume:p,resumeId:u}}w(V,"parseRootArgs");import{FRONT_DOOR_ENV as re}from"./front-door-env.js";async function Q(o){const s=o.slice(2),r=s[0];if(process.env[E]||r==="-h"||r==="--help"||r==="--version"||r==="-v"||r!==void 0&&C.includes(r))return!1;if(r!==void 0){const t=/\s/.test(r),a=!r.startsWith("-")&&I(T(r)),d=M.has(r);if(!t&&!a&&!d)return!1;if(a){const{buildRoot:F}=await import("../../build-root.js");if((await F()).subtrees.some(N=>N.name===r))return!1}}const e=V(s),l=w(async()=>{if(e.profile===void 0)return;const{resolveProfileOperand:t}=await import("../profiles/manifest.js");e.profile=t(e.profile).profileId},"resolveProfileFlag");e.resumeId===void 0&&await l();const c=process.stdin.isTTY&&process.stdout.isTTY;let p=!1;c&&!$()&&(await G(),p=!0);let u=null,i,g=process.cwd();if(e.resumeId!==void 0){const{resolveResumeTarget:t,noResumeTargetMessage:a}=await import("./resume-root.js"),d=await t(e.resumeId);"error"in d&&(process.stderr.write(`${d.error}
2
- `),process.exit(1)),"none"in d?(e.resumeId.includes("-")&&(process.stderr.write(`${a(e.resumeId)}
3
- `),process.exit(1)),e.prompt=e.prompt===void 0?e.resumeId:`${e.resumeId} ${e.prompt}`,e.resumeId=void 0,await l()):(u=d.node.profile_id,i=d.node.node_id,I(d.node.cwd)&&(g=d.node.cwd))}if(i===void 0){const{selectProfileForCwd:t,selectProfileForCwdReadOnly:a}=await import("../profiles/select.js");p&&e.profile===void 0&&process.stdout.write(`
1
+ var _=Object.defineProperty;var m=(i,s)=>_(i,"name",{value:s,configurable:!0});import{existsSync as x,statSync as C}from"node:fs";import{resolve as T}from"node:path";import{SUBTREE_NAMES as L}from"../../build-root.js";import{FRONT_DOOR_ENV as b}from"./front-door-env.js";import{frontDoorBootPrompt as A}from"./first-run-offer.js";import{looksLikeNodeIdToken as W}from"./node-id-token.js";import{markTourOffered as $,recordSetupCompleted as B,setupCompleted as M,tourOfferPending as G}from"./setup-marker.js";function I(i){try{return x(i)&&C(i).isDirectory()}catch{return!1}}m(I,"isDir");const V=new Set(["--name","--kind","--profile","--pick-profile","--continue","-c","--resume","-r"]);async function U(){let i=!1;const s=m(()=>{i=!0},"onSigint");process.once("SIGINT",s);try{const{runSetup:r}=await import("../../commands/sys/setup-wizard.js"),e=await r();if(i){const c=new Error("Interrupted");throw c.name="AbortError",c}await B(e)}finally{process.removeListener("SIGINT",s)}}m(U,"runFirstSetup");function Y(i){let s=process.cwd(),r,e,c,u=!1,p,d;const o=[];for(let f=0;f<i.length;f++){const n=i[f];if(n==="--name")r=i[++f];else if(n==="--kind")e=i[++f];else if(n==="--profile")c=i[++f];else if(n==="--pick-profile")u=!0;else if(n==="--continue"||n==="-c")p="continue";else if(n==="--resume"||n==="-r"){p="pick";const w=i[f+1];w!==void 0&&W(w)&&!I(T(w))&&(d=w,f++)}else n.startsWith("--")||o.push(n)}o.length>0&&I(T(o[0]))&&(s=T(o.shift()));const g=o.length>0?o.join(" "):void 0;return{cwd:s,prompt:g,name:r,kind:e,profile:c,pickProfile:u,resume:p,resumeId:d}}m(Y,"parseRootArgs");import{FRONT_DOOR_ENV as ie}from"./front-door-env.js";async function ee(i){const s=i.slice(2),r=s[0];if(process.env[b]||r==="-h"||r==="--help"||r==="--version"||r==="-v"||r!==void 0&&L.includes(r))return!1;if(r!==void 0){const t=/\s/.test(r),a=!r.startsWith("-")&&I(T(r)),l=V.has(r);if(!t&&!a&&!l)return!1;if(a){const{buildRoot:D}=await import("../../build-root.js");if((await D()).subtrees.some(E=>E.name===r))return!1}}const e=Y(s),c=m(async()=>{if(e.profile===void 0)return;const{resolveProfileOperand:t}=await import("../profiles/manifest.js");e.profile=t(e.profile).profileId},"resolveProfileFlag");e.resumeId===void 0&&await c();const u=process.stdin.isTTY&&process.stdout.isTTY;let p=!1;u&&!M()&&(await U(),p=!0);let d=null,o,g=process.cwd();if(e.resumeId!==void 0){const{resolveResumeTarget:t,noResumeTargetMessage:a}=await import("./resume-root.js"),l=await t(e.resumeId);"error"in l&&(process.stderr.write(`${l.error}
2
+ `),process.exit(1)),"none"in l?(e.resumeId.includes("-")&&(process.stderr.write(`${a(e.resumeId)}
3
+ `),process.exit(1)),e.prompt=e.prompt===void 0?e.resumeId:`${e.resumeId} ${e.prompt}`,e.resumeId=void 0,await c()):(d=l.node.profile_id,o=l.node.node_id,I(l.node.cwd)&&(g=l.node.cwd))}if(o===void 0){const{selectProfileForCwd:t,selectProfileForCwdReadOnly:a}=await import("../profiles/select.js");p&&e.profile===void 0&&process.stdout.write(`
4
4
  Choose a profile
5
- `),u=e.profile??(c?await t(e.cwd,void 0,e.pickProfile):a(e.cwd))}const{exitForMissingProviderCredential:f,hasConfiguredProviderCredential:n}=await import("./provider-credential-gate.js");if(!await n(u)){c||f();const{runFrontDoorLogin:t}=await import("./front-door-login.js");await t()||f()}const{inTmux:m}=await import("./placement-tmux.js");if(c&&!m()){const{TMUX_STARTED_ENV:t,handoffToTmux:a}=await import("./tmux-handoff.js");process.env[t]===void 0&&a(s,i!==void 0?null:u,g)}const[{bootRoot:R},{resumeRoot:k},{rendererWarning:P,missingPackageWarning:v,piAgentDir:y}]=await Promise.all([import("./boot-root.js"),import("./resume-root.js"),import("./package-health.js")]);try{const t=v(y());t!==null&&process.stderr.write(`
5
+ `),d=e.profile??(u?await t(e.cwd,void 0,e.pickProfile):a(e.cwd))}const{exitForMissingProviderCredential:f,hasConfiguredProviderCredential:n}=await import("./provider-credential-gate.js"),{cliClient:w}=await import("../../commands/api-client.js"),R=d===null?[]:(await w().listProfileEnv(d)).names;if(!await n(R)){u||f();const{runFrontDoorLogin:t}=await import("./front-door-login.js");await t()||f()}const{inTmux:h}=await import("./placement-tmux.js");if(u&&!h()){const{TMUX_STARTED_ENV:t,handoffToTmux:a}=await import("./tmux-handoff.js");process.env[t]===void 0&&a(s,o!==void 0?null:d,g)}const[{bootRoot:k},{resumeRoot:v},{rendererWarning:y,missingPackageWarning:N,piAgentDir:O}]=await Promise.all([import("./boot-root.js"),import("./resume-root.js"),import("./package-health.js")]);try{const t=N(O());t!==null&&process.stderr.write(`
6
6
  ${t}
7
7
 
8
- `);const a=P();a!==null&&process.stderr.write(`
8
+ `);const a=y();a!==null&&process.stderr.write(`
9
9
  ${a}
10
10
 
11
- `)}catch{}if(i!==void 0){const{resumeNodeById:t}=await import("./resume-root.js");await t(i)}if(e.resume!==void 0&&await k(e.cwd,e.resume==="pick")==="aborted")return!0;const h=c&&(p||await B()),{prompt:O,initialWhip:S}=L({offerTour:h,userPrompt:e.prompt});return h&&m()&&await A(),await R({...e,prompt:O,initialWhip:S,selectedProfileId:u??void 0}),!0}w(Q,"maybeBootRoot");export{re as FRONT_DOOR_ENV,Q as maybeBootRoot,V as parseRootArgs};
11
+ `)}catch{}if(o!==void 0){const{resumeNodeById:t}=await import("./resume-root.js");await t(o)}if(e.resume!==void 0&&await v(e.cwd,e.resume==="pick")==="aborted")return!0;const P=u&&(p||await G()),{prompt:S,initialWhip:F}=A({offerTour:P,userPrompt:e.prompt});return P&&h()&&await $(),await k({...e,prompt:S,initialWhip:F,selectedProfileId:d??void 0}),!0}m(ee,"maybeBootRoot");export{ie as FRONT_DOOR_ENV,ee as maybeBootRoot,Y as parseRootArgs};