@north-light/crouter 0.3.348 → 0.3.350

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 (634) hide show
  1. package/bin/crtr-launcher +4 -0
  2. package/bin/runtime-generation-manifest.mjs +12 -2
  3. package/dist/api/client.d.ts +50 -7
  4. package/dist/api/client.js +2 -2
  5. package/dist/api/command-manifest/schema.js +1 -1
  6. package/dist/api/dto/analytics.d.ts +184 -0
  7. package/dist/api/dto/analytics.js +0 -0
  8. package/dist/api/dto/broker-ops.d.ts +43 -1
  9. package/dist/api/dto/config.d.ts +11 -0
  10. package/dist/api/dto/grants.d.ts +14 -0
  11. package/dist/api/dto/grants.js +0 -0
  12. package/dist/api/dto/human-requests.d.ts +14 -0
  13. package/dist/api/dto/memory.d.ts +6 -0
  14. package/dist/api/dto/modelauth.d.ts +35 -0
  15. package/dist/api/dto/node-records.d.ts +35 -0
  16. package/dist/api/dto/node-records.js +0 -0
  17. package/dist/api/dto/nodes.d.ts +5 -0
  18. package/dist/api/dto/profiles.d.ts +38 -3
  19. package/dist/api/dto/worktree.d.ts +11 -0
  20. package/dist/api/errors.d.ts +23 -1
  21. package/dist/api/errors.js +1 -1
  22. package/dist/api/index.d.ts +2 -0
  23. package/dist/api/index.js +1 -1
  24. package/dist/api/node-transport.js +1 -1
  25. package/dist/api/routes.d.ts +22 -0
  26. package/dist/api/routes.js +1 -1
  27. package/dist/build-root.d.ts +6 -1
  28. package/dist/build-root.js +1 -1
  29. package/dist/builtin-memory/crouter-sdk/client.md +34 -0
  30. package/dist/builtin-memory/crouter-sdk/errors.md +2 -0
  31. package/dist/builtin-memory/crouter-sdk/memory.md +2 -2
  32. package/dist/builtin-memory/crouter-sdk/streaming.md +21 -0
  33. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +8 -4
  34. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +39 -118
  35. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.d.ts +6 -1
  36. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.js +41 -27
  37. package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +52 -29
  38. package/dist/cli.js +9 -8
  39. package/dist/clients/attach/chrome/inbox-strip.js +1 -1
  40. package/dist/clients/attach/chrome/roster.js +1 -1
  41. package/dist/clients/attach/config.js +1 -1
  42. package/dist/clients/attach/overlays/auth.js +2 -2
  43. package/dist/clients/attach/overlays/graph.js +1 -1
  44. package/dist/clients/attach/render/tool-calls.js +3 -3
  45. package/dist/clients/attach/session/connection.js +1 -1
  46. package/dist/clients/attach/session/profile-files.js +1 -1
  47. package/dist/clients/attach/viewer.js +1569 -816
  48. package/dist/commands/api-client.js +3 -3
  49. package/dist/commands/broker-permissions.d.ts +2 -0
  50. package/dist/commands/broker-permissions.js +1 -0
  51. package/dist/commands/canvas-analytics/chart.d.ts +52 -0
  52. package/dist/commands/canvas-analytics/chart.js +1 -0
  53. package/dist/commands/canvas-analytics/drilldown.d.ts +34 -0
  54. package/dist/commands/canvas-analytics/drilldown.js +1 -0
  55. package/dist/commands/canvas-analytics/format.d.ts +29 -0
  56. package/dist/commands/canvas-analytics/format.js +1 -0
  57. package/dist/commands/canvas-analytics/graph-detail.d.ts +2 -0
  58. package/dist/commands/canvas-analytics/graph-detail.js +2 -0
  59. package/dist/commands/canvas-analytics/graphs.d.ts +9 -0
  60. package/dist/commands/canvas-analytics/graphs.js +1 -0
  61. package/dist/commands/canvas-analytics/memory.d.ts +2 -0
  62. package/dist/commands/canvas-analytics/memory.js +1 -0
  63. package/dist/commands/canvas-analytics/overview.d.ts +2 -0
  64. package/dist/commands/canvas-analytics/overview.js +1 -0
  65. package/dist/commands/canvas-analytics/shell.d.ts +60 -0
  66. package/dist/commands/canvas-analytics/shell.js +2 -0
  67. package/dist/commands/canvas-analytics/time.d.ts +2 -0
  68. package/dist/commands/canvas-analytics/time.js +1 -0
  69. package/dist/commands/canvas-analytics/usage.d.ts +2 -0
  70. package/dist/commands/canvas-analytics/usage.js +1 -0
  71. package/dist/commands/canvas-analytics/view.d.ts +85 -0
  72. package/dist/commands/canvas-analytics/view.js +1 -0
  73. package/dist/commands/canvas-analytics.d.ts +2 -0
  74. package/dist/commands/canvas-analytics.js +1 -0
  75. package/dist/commands/canvas-prune.js +1 -1
  76. package/dist/commands/canvas.js +1 -1
  77. package/dist/commands/cron.js +5 -5
  78. package/dist/commands/human/components.d.ts +2 -0
  79. package/dist/commands/human/components.js +2 -2
  80. package/dist/commands/human/prompts.js +1 -1
  81. package/dist/commands/human/queue.js +1 -1
  82. package/dist/commands/memory/client.d.ts +11 -0
  83. package/dist/commands/memory/client.js +1 -0
  84. package/dist/commands/memory/delete.js +1 -1
  85. package/dist/commands/memory/edit.js +3 -3
  86. package/dist/commands/memory/find.js +1 -1
  87. package/dist/commands/memory/history.js +4 -4
  88. package/dist/commands/memory/lint.js +1 -1
  89. package/dist/commands/memory/list.d.ts +0 -2
  90. package/dist/commands/memory/list.js +1 -1
  91. package/dist/commands/memory/move.js +1 -1
  92. package/dist/commands/memory/origin.js +1 -1
  93. package/dist/commands/memory/read.d.ts +0 -5
  94. package/dist/commands/memory/read.js +3 -3
  95. package/dist/commands/memory/shared.d.ts +0 -178
  96. package/dist/commands/memory/shared.js +1 -12
  97. package/dist/commands/memory/write.js +5 -5
  98. package/dist/commands/node/bash.js +5 -5
  99. package/dist/commands/node/create.d.ts +0 -17
  100. package/dist/commands/node/create.js +2 -3
  101. package/dist/commands/node/inspect.js +6 -6
  102. package/dist/commands/node/lifecycle.js +2 -2
  103. package/dist/commands/node-context.js +2 -2
  104. package/dist/commands/node-inspect-artifacts.js +6 -6
  105. package/dist/commands/pkg/browse/catalog.js +1 -1
  106. package/dist/commands/pkg/browse/model.d.ts +1 -1
  107. package/dist/commands/pkg/market-manage.js +1 -1
  108. package/dist/commands/pkg/plugin-manage.js +10 -10
  109. package/dist/commands/profile/daemon-profiles.d.ts +13 -0
  110. package/dist/commands/profile/daemon-profiles.js +4 -0
  111. package/dist/commands/profile/delete.js +1 -1
  112. package/dist/commands/profile/env.d.ts +6 -0
  113. package/dist/commands/profile/env.js +2 -2
  114. package/dist/commands/profile/kind.js +1 -2
  115. package/dist/commands/profile/list.js +1 -1
  116. package/dist/commands/profile/meta.js +1 -1
  117. package/dist/commands/profile/new.js +1 -1
  118. package/dist/commands/profile/pause.js +1 -1
  119. package/dist/commands/profile/project.js +1 -1
  120. package/dist/commands/profile/rename.js +1 -1
  121. package/dist/commands/profile/show.js +1 -1
  122. package/dist/commands/profile.js +1 -1
  123. package/dist/commands/push.js +3 -3
  124. package/dist/commands/surface-inspect.js +1 -1
  125. package/dist/commands/sys/branch.js +1 -1
  126. package/dist/commands/sys/config.js +1 -1
  127. package/dist/commands/sys/connect.js +3 -3
  128. package/dist/commands/sys/context/admin/actions.js +1 -1
  129. package/dist/commands/sys/context/admin/model.d.ts +1 -0
  130. package/dist/commands/sys/context/admin/model.js +1 -1
  131. package/dist/commands/sys/context/admin.js +1 -1
  132. package/dist/commands/sys/context/expose.js +2 -1
  133. package/dist/commands/sys/context/prompt-review.js +2 -2
  134. package/dist/commands/sys/context/resolve.js +7 -7
  135. package/dist/commands/sys/context/sysprompt.js +1 -1
  136. package/dist/commands/sys/join.d.ts +1 -0
  137. package/dist/commands/sys/join.js +1 -0
  138. package/dist/commands/sys/migrate.js +1 -1
  139. package/dist/commands/sys/panels/models-panel.js +1 -1
  140. package/dist/commands/sys/panels/profiles-panel.d.ts +0 -1
  141. package/dist/commands/sys/panels/profiles-panel.js +1 -1
  142. package/dist/commands/sys/provider-login.js +6 -6
  143. package/dist/commands/sys/setup-core.d.ts +1 -1
  144. package/dist/commands/sys/setup-core.js +6 -6
  145. package/dist/commands/sys/setup-settings-runner.js +1 -1
  146. package/dist/commands/sys/setup.js +1 -1
  147. package/dist/commands/sys/spaces.d.ts +1 -0
  148. package/dist/commands/sys/spaces.js +2 -0
  149. package/dist/commands/sys/sync-deps.js +2 -2
  150. package/dist/commands/sys/sync-project-guidance.js +4 -4
  151. package/dist/commands/sys/sync-skills.js +2 -2
  152. package/dist/commands/sys/worktrees.d.ts +1 -0
  153. package/dist/commands/sys/worktrees.js +1 -1
  154. package/dist/commands/sys.js +1 -1
  155. package/dist/core/auth-file.js +2 -2
  156. package/dist/core/bash-job-supervisor.d.ts +6 -0
  157. package/dist/core/bash-job-supervisor.js +4 -0
  158. package/dist/core/bash-jobs.d.ts +13 -6
  159. package/dist/core/bash-jobs.js +8 -7
  160. package/dist/core/broker-client/transport-relay.d.ts +6 -3
  161. package/dist/core/broker-client/transport-relay.js +1 -1
  162. package/dist/core/broker-client/transport-socket.d.ts +6 -1
  163. package/dist/core/broker-client/transport-socket.js +1 -1
  164. package/dist/core/canvas/canvas.d.ts +39 -18
  165. package/dist/core/canvas/canvas.js +21 -20
  166. package/dist/core/canvas/context-strip.d.ts +20 -0
  167. package/dist/core/canvas/context-strip.js +5 -0
  168. package/dist/core/canvas/crons.d.ts +12 -20
  169. package/dist/core/canvas/crons.js +15 -13
  170. package/dist/core/canvas/db.js +2 -2
  171. package/dist/core/canvas/deliveries.d.ts +4 -1
  172. package/dist/core/canvas/deliveries.js +1 -1
  173. package/dist/core/canvas/executions.js +1 -1
  174. package/dist/core/canvas/history.d.ts +2 -1
  175. package/dist/core/canvas/history.js +17 -18
  176. package/dist/core/canvas/memory-reads.d.ts +19 -0
  177. package/dist/core/canvas/memory-reads.js +1 -0
  178. package/dist/core/canvas/migrations.d.ts +0 -4
  179. package/dist/core/canvas/migrations.js +99 -32
  180. package/dist/core/canvas/nav-render.js +1 -1
  181. package/dist/core/canvas/node-agent-paths.d.ts +8 -0
  182. package/dist/core/canvas/node-agent-paths.js +1 -0
  183. package/dist/core/canvas/node-recap.d.ts +2 -2
  184. package/dist/core/canvas/node-recap.js +2 -2
  185. package/dist/core/canvas/node-tokens.d.ts +24 -0
  186. package/dist/core/canvas/node-tokens.js +5 -0
  187. package/dist/core/canvas/paths.d.ts +16 -19
  188. package/dist/core/canvas/paths.js +1 -1
  189. package/dist/core/canvas/render-source.d.ts +2 -2
  190. package/dist/core/canvas/render-source.js +6 -9
  191. package/dist/core/canvas/sessions.d.ts +18 -0
  192. package/dist/core/canvas/sessions.js +4 -1
  193. package/dist/core/canvas/types.d.ts +22 -6
  194. package/dist/core/command-hooks/compose.js +1 -1
  195. package/dist/core/command-hooks/discovery.d.ts +15 -1
  196. package/dist/core/command-hooks/discovery.js +1 -1
  197. package/dist/core/command-hooks/help.d.ts +2 -2
  198. package/dist/core/command-hooks/lifecycle-create.d.ts +1 -1
  199. package/dist/core/command-hooks/lifecycle-create.js +1 -1
  200. package/dist/core/command-hooks/transport/exec-invoke.d.ts +2 -0
  201. package/dist/core/command-hooks/transport/exec-invoke.js +1 -1
  202. package/dist/core/command-hooks/transport/exec-lifecycle.d.ts +1 -0
  203. package/dist/core/command-hooks/transport/exec-lifecycle.js +1 -1
  204. package/dist/core/command-hooks/transport/plan.d.ts +3 -0
  205. package/dist/core/command-hooks/transport/plan.js +1 -0
  206. package/dist/core/command-plugins/discovery.js +1 -1
  207. package/dist/core/command-plugins/transport/http-invoke.js +2 -2
  208. package/dist/core/command.d.ts +6 -2
  209. package/dist/core/command.js +6 -6
  210. package/dist/core/config.d.ts +8 -5
  211. package/dist/core/config.js +1 -1
  212. package/dist/core/conversation-store/client-worker.d.ts +1 -0
  213. package/dist/core/conversation-store/client-worker.js +1 -0
  214. package/dist/core/conversation-store/client.d.ts +2 -0
  215. package/dist/core/conversation-store/client.js +2 -0
  216. package/dist/core/conversation-store/file-store.d.ts +37 -0
  217. package/dist/core/conversation-store/file-store.js +9 -0
  218. package/dist/core/conversation-store/index.d.ts +50 -0
  219. package/dist/core/conversation-store/index.js +1 -0
  220. package/dist/core/conversation-store/listener.d.ts +4 -0
  221. package/dist/core/conversation-store/listener.js +3 -0
  222. package/dist/core/conversation-store/patch.d.ts +1 -0
  223. package/dist/core/conversation-store/patch.js +1 -0
  224. package/dist/core/directory/join.d.ts +27 -0
  225. package/dist/core/directory/join.js +1 -0
  226. package/dist/core/disk-usage.d.ts +4 -0
  227. package/dist/core/disk-usage.js +1 -0
  228. package/dist/core/events/emit.d.ts +2 -0
  229. package/dist/core/events/emit.js +3 -1
  230. package/dist/core/feed/feed.js +4 -4
  231. package/dist/core/feed/messages.d.ts +3 -0
  232. package/dist/core/feed/messages.js +6 -6
  233. package/dist/core/fs-utils.d.ts +2 -0
  234. package/dist/core/fs-utils.js +3 -3
  235. package/dist/core/grants/local.d.ts +4 -0
  236. package/dist/core/grants/local.js +1 -0
  237. package/dist/core/grants/mirror.d.ts +44 -0
  238. package/dist/core/grants/mirror.js +4 -0
  239. package/dist/core/grants/on-sync.d.ts +22 -0
  240. package/dist/core/grants/on-sync.js +1 -0
  241. package/dist/core/grants/remove.d.ts +7 -0
  242. package/dist/core/grants/remove.js +1 -0
  243. package/dist/core/grants/sandboxes.d.ts +7 -0
  244. package/dist/core/grants/sandboxes.js +1 -0
  245. package/dist/core/grants/sync.d.ts +12 -0
  246. package/dist/core/grants/sync.js +1 -0
  247. package/dist/core/help/memory-extensions.d.ts +3 -0
  248. package/dist/core/help/memory-extensions.js +2 -0
  249. package/dist/core/help.d.ts +14 -0
  250. package/dist/core/help.js +7 -7
  251. package/dist/core/host-exports/builtins.js +3 -3
  252. package/dist/core/host-exports/export.js +3 -3
  253. package/dist/core/human/action-binding.d.ts +2 -0
  254. package/dist/core/human/action-binding.js +1 -1
  255. package/dist/core/human/feedback-companion.d.ts +0 -1
  256. package/dist/core/human/feedback-companion.js +1 -1
  257. package/dist/core/human/page-schema.d.ts +1 -1
  258. package/dist/core/inspector/core.d.ts +2 -0
  259. package/dist/core/inspector/core.js +1 -1
  260. package/dist/core/inspector/tui.js +2 -2
  261. package/dist/core/installed-plugins.js +1 -1
  262. package/dist/core/io.js +6 -6
  263. package/dist/core/keybindings/catalog.d.ts +1 -1
  264. package/dist/core/keybindings/catalog.js +1 -1
  265. package/dist/core/layout-migrate/index.d.ts +15 -0
  266. package/dist/core/layout-migrate/index.js +4 -0
  267. package/dist/core/layout-migrate/paths.d.ts +26 -0
  268. package/dist/core/layout-migrate/paths.js +1 -0
  269. package/dist/core/layout-migrate/stored-paths.d.ts +2 -0
  270. package/dist/core/layout-migrate/stored-paths.js +11 -0
  271. package/dist/core/layout-migrate/stores.d.ts +17 -0
  272. package/dist/core/layout-migrate/stores.js +4 -0
  273. package/dist/core/layout.d.ts +26 -0
  274. package/dist/core/layout.js +2 -0
  275. package/dist/core/llm/run.d.ts +60 -0
  276. package/dist/core/llm/run.js +4 -0
  277. package/dist/core/memory/cli-selector.d.ts +13 -0
  278. package/dist/core/memory/cli-selector.js +1 -0
  279. package/dist/core/memory/history.d.ts +5 -4
  280. package/dist/core/memory/history.js +6 -6
  281. package/dist/core/memory/inline-ref-inventory.d.ts +2 -1
  282. package/dist/core/memory/inline-ref-inventory.js +1 -1
  283. package/dist/core/memory/lint.js +2 -2
  284. package/dist/core/memory/mutation-domain.d.ts +2 -2
  285. package/dist/core/memory/mutation-domain.js +8 -7
  286. package/dist/core/memory/mutations.js +1 -1
  287. package/dist/core/memory/service.d.ts +5 -0
  288. package/dist/core/memory/service.js +2 -2
  289. package/dist/core/memory-resolver.d.ts +11 -7
  290. package/dist/core/memory-resolver.js +2 -2
  291. package/dist/core/model-auth/daemon-login.d.ts +13 -0
  292. package/dist/core/model-auth/daemon-login.js +1 -0
  293. package/dist/core/model-auth/flows.d.ts +45 -0
  294. package/dist/core/model-auth/flows.js +1 -0
  295. package/dist/core/model-auth/handoff-jti.d.ts +4 -0
  296. package/dist/core/model-auth/handoff-jti.js +1 -0
  297. package/dist/core/model-routes.js +1 -1
  298. package/dist/core/nested-stores.d.ts +2 -1
  299. package/dist/core/nested-stores.js +1 -2
  300. package/dist/core/preview-registry.js +2 -2
  301. package/dist/core/profiles/env-store.js +2 -2
  302. package/dist/core/profiles/manifest.d.ts +16 -5
  303. package/dist/core/profiles/manifest.js +1 -1
  304. package/dist/core/provider-management.js +1 -1
  305. package/dist/core/review/birth.js +1 -1
  306. package/dist/core/review/companion.d.ts +0 -2
  307. package/dist/core/review/companion.js +1 -1
  308. package/dist/core/review/fork.js +2 -2
  309. package/dist/core/review/realize.js +1 -1
  310. package/dist/core/review/stage.d.ts +1 -1
  311. package/dist/core/review/stage.js +1 -1
  312. package/dist/core/review/types.d.ts +1 -1
  313. package/dist/core/runs/events.d.ts +34 -0
  314. package/dist/core/runs/events.js +1 -0
  315. package/dist/core/runs/operations.d.ts +43 -0
  316. package/dist/core/runs/operations.js +12 -0
  317. package/dist/core/runtime/bearings-render.d.ts +2 -2
  318. package/dist/core/runtime/bearings-render.js +11 -11
  319. package/dist/core/runtime/bearings.js +2 -2
  320. package/dist/core/runtime/broker/cli-relay.d.ts +5 -0
  321. package/dist/core/runtime/broker/cli-relay.js +1 -0
  322. package/dist/core/runtime/broker/client-registry.d.ts +0 -5
  323. package/dist/core/runtime/broker/client-registry.js +1 -1
  324. package/dist/core/runtime/broker/daemon-ops.d.ts +28 -1
  325. package/dist/core/runtime/broker/daemon-ops.js +1 -1
  326. package/dist/core/runtime/broker/engine-drive.d.ts +0 -2
  327. package/dist/core/runtime/broker/engine-drive.js +1 -1
  328. package/dist/core/runtime/broker/fault-retry.d.ts +9 -0
  329. package/dist/core/runtime/broker/fault-retry.js +1 -1
  330. package/dist/core/runtime/broker/frame-dispatch.d.ts +5 -9
  331. package/dist/core/runtime/broker/frame-dispatch.js +1 -1
  332. package/dist/core/runtime/broker/frame-engine-control.d.ts +3 -2
  333. package/dist/core/runtime/broker/frame-engine-control.js +1 -1
  334. package/dist/core/runtime/broker/frame-memory-refs.d.ts +4 -3
  335. package/dist/core/runtime/broker/frame-memory-refs.js +1 -1
  336. package/dist/core/runtime/broker/frame-read.js +1 -1
  337. package/dist/core/runtime/broker/frame-session.js +1 -1
  338. package/dist/core/runtime/broker/held-deferred-inbox.d.ts +3 -1
  339. package/dist/core/runtime/broker/held-deferred-inbox.js +1 -1
  340. package/dist/core/runtime/broker/inbox.d.ts +1 -2
  341. package/dist/core/runtime/broker/inbox.js +7 -10
  342. package/dist/core/runtime/broker/model-adapter.d.ts +9 -0
  343. package/dist/core/runtime/broker/model-adapter.js +2 -0
  344. package/dist/core/runtime/broker/node-token.d.ts +3 -0
  345. package/dist/core/runtime/broker/node-token.js +1 -0
  346. package/dist/core/runtime/broker/read-ops.js +1 -1
  347. package/dist/core/runtime/broker/rebind.d.ts +2 -0
  348. package/dist/core/runtime/broker/rebind.js +1 -1
  349. package/dist/core/runtime/broker/tool-groups.js +1 -1
  350. package/dist/core/runtime/broker/turn-ignition.d.ts +3 -3
  351. package/dist/core/runtime/broker/turn-ignition.js +1 -1
  352. package/dist/core/runtime/broker-cli.js +3 -3
  353. package/dist/core/runtime/broker-extension-render.d.ts +2 -5
  354. package/dist/core/runtime/broker-extension-render.js +4 -4
  355. package/dist/core/runtime/broker-persona-guidance.js +3 -3
  356. package/dist/core/runtime/broker-protocol.d.ts +7 -8
  357. package/dist/core/runtime/broker.js +1 -1
  358. package/dist/core/runtime/canvas-extensions.d.ts +1 -0
  359. package/dist/core/runtime/canvas-extensions.js +1 -1
  360. package/dist/core/runtime/close.d.ts +9 -0
  361. package/dist/core/runtime/close.js +1 -1
  362. package/dist/core/runtime/deliver-live.js +1 -1
  363. package/dist/core/runtime/fleet.d.ts +1 -1
  364. package/dist/core/runtime/front-door-login.js +1 -1
  365. package/dist/core/runtime/front-door.js +2 -2
  366. package/dist/core/runtime/headless-pi.d.ts +1 -1
  367. package/dist/core/runtime/headless-pi.js +1 -1
  368. package/dist/core/runtime/host.d.ts +1 -1
  369. package/dist/core/runtime/host.js +3 -1
  370. package/dist/core/runtime/invocation.d.ts +3 -0
  371. package/dist/core/runtime/kickoff.d.ts +1 -0
  372. package/dist/core/runtime/kickoff.js +16 -16
  373. package/dist/core/runtime/launch-target.d.ts +1 -1
  374. package/dist/core/runtime/launch-target.js +1 -1
  375. package/dist/core/runtime/launch.d.ts +10 -35
  376. package/dist/core/runtime/launch.js +1 -1
  377. package/dist/core/runtime/lifecycle.js +2 -2
  378. package/dist/core/runtime/memory.d.ts +1 -1
  379. package/dist/core/runtime/memory.js +1 -1
  380. package/dist/core/runtime/model-registry.js +1 -1
  381. package/dist/core/runtime/model-swap.d.ts +17 -19
  382. package/dist/core/runtime/model-swap.js +1 -1
  383. package/dist/core/runtime/node-read.js +3 -2
  384. package/dist/core/runtime/nodes.d.ts +7 -0
  385. package/dist/core/runtime/nodes.js +1 -1
  386. package/dist/core/runtime/outcome-document.js +1 -1
  387. package/dist/core/runtime/package-health.js +2 -2
  388. package/dist/core/runtime/persona.js +2 -2
  389. package/dist/core/runtime/pi-vendored.js +1 -1
  390. package/dist/core/runtime/placement-tmux.d.ts +1 -1
  391. package/dist/core/runtime/placement-tmux.js +1 -1
  392. package/dist/core/runtime/placement.js +1 -1
  393. package/dist/core/runtime/promote.js +1 -1
  394. package/dist/core/runtime/provider-credential-gate.js +2 -2
  395. package/dist/core/runtime/recovery-hold.d.ts +2 -0
  396. package/dist/core/runtime/recovery-hold.js +1 -0
  397. package/dist/core/runtime/recycle.js +1 -1
  398. package/dist/core/runtime/reopen.js +1 -1
  399. package/dist/core/runtime/reset.js +1 -1
  400. package/dist/core/runtime/revive.d.ts +1 -1
  401. package/dist/core/runtime/revive.js +2 -3
  402. package/dist/core/runtime/roadmap.js +4 -4
  403. package/dist/core/runtime/run-command.d.ts +6 -0
  404. package/dist/core/runtime/run-command.js +1 -1
  405. package/dist/core/runtime/session-branch.d.ts +2 -8
  406. package/dist/core/runtime/session-branch.js +1 -1
  407. package/dist/core/runtime/session-list-cache.d.ts +6 -22
  408. package/dist/core/runtime/session-list-cache.js +1 -1
  409. package/dist/core/runtime/situational-context.js +2 -2
  410. package/dist/core/runtime/spawn-env.d.ts +6 -6
  411. package/dist/core/runtime/spawn-env.js +1 -1
  412. package/dist/core/runtime/spawn.d.ts +5 -0
  413. package/dist/core/runtime/spawn.js +2 -2
  414. package/dist/core/runtime/stop-guard.js +2 -2
  415. package/dist/core/runtime/stop-signals.d.ts +2 -2
  416. package/dist/core/runtime/stop-signals.js +1 -1
  417. package/dist/core/runtime/structured-output.d.ts +10 -4
  418. package/dist/core/runtime/structured-output.js +4 -4
  419. package/dist/core/runtime/tmux-bindings.js +3 -3
  420. package/dist/core/runtime/tmux-driver.d.ts +4 -0
  421. package/dist/core/runtime/tmux-driver.js +7 -7
  422. package/dist/core/runtime/view-socket.d.ts +9 -2
  423. package/dist/core/runtime/view-socket.js +1 -1
  424. package/dist/core/runtime/warm-pool.js +1 -1
  425. package/dist/core/scope.d.ts +3 -2
  426. package/dist/core/scope.js +1 -1
  427. package/dist/core/scoped-state/db.js +1 -1
  428. package/dist/core/scoped-state/migrate.js +3 -3
  429. package/dist/core/scoped-state/profiles.d.ts +2 -1
  430. package/dist/core/scoped-state/profiles.js +1 -1
  431. package/dist/core/scoped-state/schema.d.ts +2 -1
  432. package/dist/core/scoped-state/schema.js +4 -4
  433. package/dist/core/scopes.d.ts +2 -2
  434. package/dist/core/scopes.js +1 -1
  435. package/dist/core/secrets.d.ts +1 -0
  436. package/dist/core/secrets.js +2 -2
  437. package/dist/core/spaces/mounts.d.ts +32 -0
  438. package/dist/core/spaces/mounts.js +1 -0
  439. package/dist/core/spaces/open-beneath.d.ts +71 -0
  440. package/dist/core/spaces/open-beneath.js +1 -0
  441. package/dist/core/spaces/permissions.d.ts +46 -0
  442. package/dist/core/spaces/permissions.js +1 -0
  443. package/dist/core/spaces/process.d.ts +27 -0
  444. package/dist/core/spaces/process.js +1 -0
  445. package/dist/core/spaces/space.d.ts +8 -0
  446. package/dist/core/spaces/space.js +2 -0
  447. package/dist/core/spaces/stop.d.ts +8 -0
  448. package/dist/core/spaces/stop.js +2 -0
  449. package/dist/core/spaces/users.d.ts +19 -0
  450. package/dist/core/spaces/users.js +1 -0
  451. package/dist/core/subscription-state.d.ts +2 -0
  452. package/dist/core/subscription-state.js +3 -3
  453. package/dist/core/substrate/frontmatter-validation.js +1 -1
  454. package/dist/core/substrate/injected-store.d.ts +28 -3
  455. package/dist/core/substrate/injected-store.js +2 -1
  456. package/dist/core/substrate/listings.js +1 -1
  457. package/dist/core/substrate/memory-events.d.ts +6 -0
  458. package/dist/core/substrate/memory-events.js +1 -0
  459. package/dist/core/substrate/on-read-node.js +1 -1
  460. package/dist/core/substrate/on-read.d.ts +6 -6
  461. package/dist/core/substrate/on-read.js +5 -5
  462. package/dist/core/substrate/plan.js +1 -1
  463. package/dist/core/substrate/render-node.js +1 -1
  464. package/dist/core/substrate/render.d.ts +4 -3
  465. package/dist/core/substrate/render.js +38 -38
  466. package/dist/core/substrate/schema.d.ts +6 -0
  467. package/dist/core/substrate/schema.js +1 -1
  468. package/dist/core/tui/panel.js +1 -1
  469. package/dist/core/user-settings.d.ts +12 -0
  470. package/dist/core/user-settings.js +1 -1
  471. package/dist/core/worktree-mutation-async.js +5 -5
  472. package/dist/core/worktree-quarantine.js +1 -1
  473. package/dist/core/worktree-remove.d.ts +15 -0
  474. package/dist/core/worktree-remove.js +1 -0
  475. package/dist/core/worktree-sweep.js +6 -6
  476. package/dist/daemon/analytics/compute.d.ts +37 -0
  477. package/dist/daemon/analytics/compute.js +1 -0
  478. package/dist/daemon/analytics/scan-worker.d.ts +1 -0
  479. package/dist/daemon/analytics/scan-worker.js +2 -0
  480. package/dist/daemon/analytics/scan.d.ts +37 -0
  481. package/dist/daemon/analytics/scan.js +1 -0
  482. package/dist/daemon/api/app-listener.d.ts +11 -0
  483. package/dist/daemon/api/app-listener.js +21 -0
  484. package/dist/daemon/api/bridge.js +5 -5
  485. package/dist/daemon/api/handlers/analytics.d.ts +2 -0
  486. package/dist/daemon/api/handlers/analytics.js +1 -0
  487. package/dist/daemon/api/handlers/attach.js +1 -1
  488. package/dist/daemon/api/handlers/bash-jobs.js +2 -2
  489. package/dist/daemon/api/handlers/bash.js +1 -1
  490. package/dist/daemon/api/handlers/broker-ops.js +1 -1
  491. package/dist/daemon/api/handlers/canvas.d.ts +1 -1
  492. package/dist/daemon/api/handlers/canvas.js +6 -6
  493. package/dist/daemon/api/handlers/crons.js +1 -1
  494. package/dist/daemon/api/handlers/files.d.ts +1 -1
  495. package/dist/daemon/api/handlers/files.js +1 -1
  496. package/dist/daemon/api/handlers/health.js +2 -2
  497. package/dist/daemon/api/handlers/hook-exec.d.ts +2 -0
  498. package/dist/daemon/api/handlers/hook-exec.js +1 -0
  499. package/dist/daemon/api/handlers/human-requests.js +1 -1
  500. package/dist/daemon/api/handlers/inbox.js +1 -1
  501. package/dist/daemon/api/handlers/llm.d.ts +2 -0
  502. package/dist/daemon/api/handlers/llm.js +3 -0
  503. package/dist/daemon/api/handlers/memory-reads.d.ts +4 -0
  504. package/dist/daemon/api/handlers/memory-reads.js +1 -0
  505. package/dist/daemon/api/handlers/memory.js +5 -1
  506. package/dist/daemon/api/handlers/messages.js +2 -2
  507. package/dist/daemon/api/handlers/modelauth.js +1 -1
  508. package/dist/daemon/api/handlers/node-outcomes.js +1 -1
  509. package/dist/daemon/api/handlers/node-records.d.ts +2 -0
  510. package/dist/daemon/api/handlers/node-records.js +3 -0
  511. package/dist/daemon/api/handlers/nodes.d.ts +1 -1
  512. package/dist/daemon/api/handlers/nodes.js +1 -1
  513. package/dist/daemon/api/handlers/profiles.d.ts +4 -1
  514. package/dist/daemon/api/handlers/profiles.js +1 -1
  515. package/dist/daemon/api/handlers/reports.js +5 -3
  516. package/dist/daemon/api/handlers/reviews.d.ts +1 -1
  517. package/dist/daemon/api/handlers/reviews.js +1 -1
  518. package/dist/daemon/api/handlers/run-routes.d.ts +2 -0
  519. package/dist/daemon/api/handlers/run-routes.js +1 -0
  520. package/dist/daemon/api/handlers/runs.d.ts +9 -0
  521. package/dist/daemon/api/handlers/runs.js +1 -0
  522. package/dist/daemon/api/handlers/subscriptions.js +1 -1
  523. package/dist/daemon/api/handlers/worktree.js +1 -1
  524. package/dist/daemon/api/map.d.ts +10 -4
  525. package/dist/daemon/api/map.js +2 -2
  526. package/dist/daemon/api/operations.d.ts +18 -0
  527. package/dist/daemon/api/operations.js +1 -0
  528. package/dist/daemon/api/principal.d.ts +42 -0
  529. package/dist/daemon/api/principal.js +1 -0
  530. package/dist/daemon/api/router.d.ts +27 -3
  531. package/dist/daemon/api/router.js +1 -1
  532. package/dist/daemon/api/server.d.ts +4 -0
  533. package/dist/daemon/api/server.js +1 -1
  534. package/dist/daemon/api/vendor-signin.d.ts +7 -0
  535. package/dist/daemon/api/vendor-signin.js +77 -0
  536. package/dist/daemon/api/viewer-presence.d.ts +3 -0
  537. package/dist/daemon/api/viewer-presence.js +1 -0
  538. package/dist/daemon/cron/armed-context.d.ts +4 -0
  539. package/dist/daemon/cron/armed-context.js +1 -1
  540. package/dist/daemon/cron/escalation.js +3 -3
  541. package/dist/daemon/cron/lease-recovery.js +1 -1
  542. package/dist/daemon/cron/sinks.js +2 -2
  543. package/dist/daemon/cron-run.d.ts +5 -5
  544. package/dist/daemon/cron-run.js +1 -1
  545. package/dist/daemon/crtrd-cli.js +1 -1
  546. package/dist/daemon/crtrd.js +8 -7
  547. package/dist/daemon/delivery/run-delivery.d.ts +4 -0
  548. package/dist/daemon/delivery/run-delivery.js +1 -1
  549. package/dist/daemon/fleet.d.ts +1 -1
  550. package/dist/daemon/fleet.js +6 -6
  551. package/dist/daemon/http-dispatcher.d.ts +1 -0
  552. package/dist/daemon/http-dispatcher.js +1 -0
  553. package/dist/daemon/human/finish.js +7 -7
  554. package/dist/daemon/joined-owner.d.ts +5 -0
  555. package/dist/daemon/joined-owner.js +1 -0
  556. package/dist/daemon/manage.js +2 -2
  557. package/dist/daemon/messaging/node-message.js +1 -1
  558. package/dist/daemon/park-activity.js +1 -1
  559. package/dist/daemon/reconcilers/bash-deadline.js +1 -1
  560. package/dist/daemon/reconcilers/broker-supervision.d.ts +1 -1
  561. package/dist/daemon/reconcilers/broker-supervision.js +4 -4
  562. package/dist/daemon/reconcilers/delivery-lane.js +1 -1
  563. package/dist/daemon/reconcilers/live-obligation.d.ts +7 -0
  564. package/dist/daemon/reconcilers/live-obligation.js +1 -1
  565. package/dist/daemon/reconcilers/node-lifecycle/tick.js +1 -1
  566. package/dist/daemon/reconcilers/storage-maintenance.d.ts +20 -1
  567. package/dist/daemon/reconcilers/storage-maintenance.js +1 -1
  568. package/dist/daemon/runs/append-section.d.ts +6 -0
  569. package/dist/daemon/runs/append-section.js +2 -0
  570. package/dist/daemon/runs/observer.d.ts +5 -0
  571. package/dist/daemon/runs/observer.js +4 -0
  572. package/dist/launcher/bwrap.d.ts +4 -0
  573. package/dist/launcher/bwrap.js +2 -0
  574. package/dist/launcher/client.d.ts +2 -0
  575. package/dist/launcher/client.js +3 -0
  576. package/dist/launcher/main.d.ts +1 -0
  577. package/dist/launcher/main.js +3 -0
  578. package/dist/launcher/netrule.d.ts +1 -0
  579. package/dist/launcher/netrule.js +1 -0
  580. package/dist/launcher/seccomp.d.ts +1 -0
  581. package/dist/launcher/seccomp.js +1 -0
  582. package/dist/launcher/spec.d.ts +88 -0
  583. package/dist/launcher/spec.js +1 -0
  584. package/dist/launcher/users.d.ts +18 -0
  585. package/dist/launcher/users.js +7 -0
  586. package/dist/launcher/validate.d.ts +22 -0
  587. package/dist/launcher/validate.js +1 -0
  588. package/dist/migrations/corpus.js +3 -3
  589. package/dist/migrations/runner.js +1 -1
  590. package/dist/native/linux/addon.node +0 -0
  591. package/dist/native/linux.d.ts +29 -0
  592. package/dist/native/linux.js +1 -0
  593. package/dist/pi-extensions/broker-local.js +2 -2
  594. package/dist/pi-extensions/canvas-bash-valve.d.ts +1 -3
  595. package/dist/pi-extensions/canvas-bash-valve.js +4 -7
  596. package/dist/pi-extensions/canvas-context-intro.d.ts +1 -2
  597. package/dist/pi-extensions/canvas-context-intro.js +2 -2
  598. package/dist/pi-extensions/canvas-doc-substrate.js +6 -6
  599. package/dist/pi-extensions/canvas-inbox-watcher.d.ts +2 -1
  600. package/dist/pi-extensions/canvas-inbox-watcher.js +2 -1
  601. package/dist/pi-extensions/canvas-passive-context.d.ts +1 -1
  602. package/dist/pi-extensions/canvas-passive-context.js +11 -11
  603. package/dist/pi-extensions/canvas-recap.js +6 -6
  604. package/dist/pi-extensions/canvas-stophook.js +1 -1
  605. package/dist/pi-extensions/canvas-structured-output.js +4 -4
  606. package/dist/pi-extensions/canvas-tool-guide.js +1 -1
  607. package/dist/pi-extensions/system-prompt-entry.d.ts +15 -0
  608. package/dist/pi-extensions/system-prompt-entry.js +1 -0
  609. package/dist/shared/env.d.ts +5 -1
  610. package/dist/shared/env.js +1 -1
  611. package/dist/shared/strip-cd-prefix.d.ts +1 -0
  612. package/dist/shared/strip-cd-prefix.js +1 -0
  613. package/dist/types.d.ts +31 -15
  614. package/docs/cli/memory-and-preferences.md +3 -1
  615. package/docs/sdk/client.md +34 -0
  616. package/docs/sdk/errors.md +2 -0
  617. package/docs/sdk/memory.md +2 -2
  618. package/docs/sdk/streaming.md +21 -0
  619. package/package.json +19 -4
  620. package/packages/crouter-identity/dist/index.d.ts +54 -0
  621. package/packages/crouter-identity/dist/index.js +166 -0
  622. package/packages/crouter-identity/package.json +33 -0
  623. package/runtime.lock.json +44 -8
  624. package/scripts/build-native-linux.mjs +16 -0
  625. package/scripts/install-runtime.mjs +9 -7
  626. package/scripts/lib/isolation-env.mjs +42 -0
  627. package/scripts/runtime-smoke.mjs +49 -0
  628. package/src/native/linux/addon.c +249 -0
  629. package/dist/core/profiles/state-block.d.ts +0 -4
  630. package/dist/core/profiles/state-block.js +0 -3
  631. package/dist/core/runtime/broker/auth-reload.d.ts +0 -41
  632. package/dist/core/runtime/broker/auth-reload.js +0 -1
  633. package/dist/core/substrate/cli-context-delivery.d.ts +0 -22
  634. package/dist/core/substrate/cli-context-delivery.js +0 -1
@@ -1,4 +1,6 @@
1
1
  import type { AgentSessionServices, ModelRegistry } from '@earendil-works/pi-coding-agent';
2
+ import { type AssistantMessage } from '@earendil-works/pi-ai';
3
+ import { classify } from '../../fault-classifier.js';
2
4
  import type { Fault } from '../../fault-classifier.js';
3
5
  import type { RecoveryFaultDTO } from '../../../api/dto/recovery.js';
4
6
  import type { BrokerSdkConfig } from '../launch.js';
@@ -18,6 +20,13 @@ type FaultRetryDeps = {
18
20
  broadcastModelChanged: (persist?: boolean) => Promise<void>;
19
21
  turnAdmission: TurnAdmissionGate;
20
22
  };
23
+ /** The kind and retry disposition of a turn that settled on a provider error.
24
+ * A final daemon refusal (the model adapter's refusal diagnostic) is fatal
25
+ * whatever its text says; every other error follows the classifier. */
26
+ export declare function settledProviderFault(last: AssistantMessage): {
27
+ classified: ReturnType<typeof classify>;
28
+ disposition: ReturnType<typeof classify>['disposition'];
29
+ };
21
30
  /** Owns provider fallback and daemon-driven fault retry state for one broker session. */
22
31
  export declare class FaultRetry {
23
32
  private readonly deps;
@@ -1 +1 @@
1
- var j=Object.defineProperty;var w=(s,e)=>j(s,"name",{value:e,configurable:!0});import{envModelIntent as P,envNodeCwd as G,envProfileId as O}from"../../../shared/env.js";import{isContextOverflow as X}from"@earendil-works/pi-ai";import{classify as $}from"../../fault-classifier.js";import{isModelNotFoundError as z,isProviderUnconfiguredError as H}from"../fault.js";import{brokerRecovery as J,mutateBrokerFault as L,mutateBrokerProviderRetry as b}from"./daemon-ops.js";import{extractCoolingDeadline as K}from"../managed-provider-cooling.js";import{extractProviderFailureDetails as Q}from"../../provider-failure.js";import{expandModelCandidates as D,modelRequestFromConfig as T,probeRouteAvailability as Z}from"../../model-routes.js";import{operationIdContext as N}from"../../events/operation-id.js";import{emitEvent as v}from"../../events/emit.js";import{CONNECTION_FAULT_RECOVERY_BODY as ee,PROVIDER_FAULT_RECOVERY_BODY as te,formatCard as U,formatModelFallbackRecovery as ie}from"../../../shared/generated-context.js";import{markFatalOnExhaust as B,nextFaultRetry as q,policyFor as Y}from"../fault-recovery.js";import{parseModelSpec as V}from"../model-selection.js";import{endedByAbort as ne}from"../session-cycles.js";import{resolveProviderCandidates as re}from"../../subscription-state.js";import{announceMessageOrigin as W}from"../stamp/channel.js";const se=2147483647;function I(s){return{link:s.link,op:s.op,kind:s.kind,retry:s.retry,message:s.message,since:s.since,operation_id:s.operation_id,...s.anchor_entry_id===void 0?{}:{anchorEntryId:s.anchor_entry_id},...s.provider_error===void 0?{}:{providerError:s.provider_error}}}w(I,"policyFault");function M(s){return{link:s.link,op:s.op,kind:s.kind,retry:s.retry,message:s.message,...s.operation_id===void 0?{}:{operation_id:s.operation_id},...s.since===void 0?{}:{since:s.since},...s.anchorEntryId===void 0?{}:{anchor_entry_id:s.anchorEntryId},...s.providerError===void 0?{}:{provider_error:s.providerError}}}w(M,"faultInput");class we{static{w(this,"FaultRetry")}deps;timer=null;failedRetryRoutes=new Set;notFoundModels=new Set;providerFallbackInFlight=null;notFoundFallbackInFlight=null;stagedCapacityFailure=null;personaGateFailed=!1;constructor(e){this.deps=e}clearTimer(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}reset(){this.clearTimer(),this.providerFallbackInFlight=null,this.notFoundFallbackInFlight=null,this.stagedCapacityFailure=null,this.personaGateFailed=!1}notePersonaGateFailure(){this.personaGateFailed=!0}state(){return J(this.deps.nodeId)}async recordFault(e){return(await L(this.deps.nodeId,{op:"record",input:e})).fault}async clearFault(e,t=!1){await L(this.deps.nodeId,{op:"clear",...e===void 0?{}:{link:e},...t?{preserve_episode:!0}:{}})}sessionId(e){const t=e.sessionManager.getSessionId?.();return typeof t=="string"&&t!==""?t:null}async clearEpisode(e){const t=this.sessionId(e);t!==null&&await b(this.deps.nodeId,{op:"clear",session_id:t})}onEvent(e){this.maybeSwitchProviderForRetry(e),this.maybeFallbackOnUnusableModel(e)}isActiveAutoFault(e){return e===null||e.retry.disposition!=="auto"||e.retry.by!=="daemon"?!1:e.kind==="connection"||e.kind==="rate-limit"||e.kind==="overloaded"}async publishSettledProviderFault(e){const t=e.stagedProviderAgentEnd,n=e.stagedWatchdogAbort,i=e.stagedRefreshAbort,o=e.stagedOverflowFailure,l=this.stagedCapacityFailure?.generation===e?this.stagedCapacityFailure:null,d=this.personaGateFailed;this.stagedCapacityFailure=null,this.personaGateFailed=!1,e.stagedProviderAgentEnd=null,e.stagedWatchdogAbort=!1,e.stagedRefreshAbort=!1,e.stagedOverflowFailure=null;const r=e.session,u=await this.state(),m=u.fault,h=u.episode,p=this.sessionId(r),g=this.isActiveAutoFault(m)&&m.link==="pi\u2192provider"?m:h?.state==="admitted"&&h.session_id===p&&this.isActiveAutoFault(h.fault)?h.fault:null,a=g===null?null:{since:g.since,anchorEntryId:g.anchor_entry_id,attempt:g.retry.attempt},c=[...Array.isArray(t?.messages)?t.messages:[]].reverse().find(E=>typeof E=="object"&&E!==null&&E.role==="assistant");if(d){await this.clearEpisode(r);return}if(l!==null||o!==null){await this.clearFault("pi\u2192provider"),await this.clearEpisode(r),await this.recordFault({link:"pi\u2192provider",op:"context overflow recovery",kind:"context-overflow",retry:{disposition:"fatal"},message:l?.errorMessage??o.errorMessage,anchor_entry_id:r.sessionManager.getLeafId?.()??void 0});return}if(n&&c?.stopReason==="aborted"){await this.recordPendingProviderFault(r,{link:"pi\u2192provider",op:"generation turn",kind:"connection",retry:{disposition:"auto",by:"daemon",...a?.attempt!==void 0?{attempt:a.attempt}:{}},message:typeof c.errorMessage=="string"?c.errorMessage:"engine error (no errorMessage recorded)",...a!==null?{since:a.since}:{},anchor_entry_id:a?.anchorEntryId??r.sessionManager.getLeafId?.()??void 0});return}if(c?.stopReason!=="error"){c!==void 0&&await this.clearEpisode(r);return}if(i){await this.clearEpisode(r);return}const F=typeof c.errorMessage=="string"?c.errorMessage:"engine error (no errorMessage recorded)";if(ne({stopReason:"error",errorMessage:F})){await this.clearEpisode(r);return}const y=X(c,r.model?.contextWindow),k=$("pi\u2192provider",c),A=K(c),R=Q(c),S=typeof c.provider=="string"&&c.provider!==""?c.provider:r.model?.provider,x=typeof c.model=="string"&&c.model!==""?c.model:r.model?.id,C=R===void 0||S===void 0||x===void 0?void 0:{provider:S,model:x,...R};y&&(await this.clearFault("pi\u2192provider"),await this.clearEpisode(r));const _={link:"pi\u2192provider",op:"generation turn",kind:y?"context-overflow":k.kind,retry:y?{disposition:"fatal"}:k.disposition==="auto"?{disposition:"auto",by:"daemon",...A!==void 0?{nextAt:new Date(A).toISOString()}:{},...a?.attempt!==void 0?{attempt:a.attempt}:{}}:{disposition:k.disposition},message:F,...!y&&k.disposition==="auto"&&a!==null?{since:a.since}:{},anchor_entry_id:!y&&k.disposition==="auto"&&a?.anchorEntryId!==void 0?a.anchorEntryId:r.sessionManager.getLeafId?.()??void 0,...C===void 0?{}:{provider_error:C}};_.retry.disposition==="auto"?await this.recordPendingProviderFault(r,_):(await this.clearEpisode(r),await this.recordFault(_))}async recoverOnStartup(){const e=this.deps.installedGeneration();if(e===void 0)return"none";const t=(await this.state()).episode,n=this.sessionId(e.session);if(this.deps.cfg.newCycle===!0)return t!==null&&n!==null&&t.session_id===n&&await b(this.deps.nodeId,{op:"invalidate",session_id:n}),"none";if(t===null||n===null||t.session_id!==n)return"none";if(t.state==="admitted")if(t.fault.anchor_entry_id!==void 0&&!this.hasProgressPastAnchor(e.session,t.fault.anchor_entry_id)){if(!(await b(this.deps.nodeId,{op:"reopen",session_id:n})).applied)return"none"}else return await this.clearEpisode(e.session),"none";else if(t.state!=="pending")return"none";return await this.recordFault(M(I(t.fault))),await this.schedule(),"retry-armed"}hasProgressPastAnchor(e,t){const n=e.sessionManager.getBranch(),i=n.findIndex(l=>l.id===t);return(i===-1?n:n.slice(i+1)).some(l=>{if(l.type!=="message")return!1;const{message:d}=l;return d.role==="toolResult"?!0:d.role==="assistant"&&Array.isArray(d.content)&&d.content.length>0})}async schedule(){const e=this.deps.installedGeneration(),t=this.deps.currentSession();if(e===void 0||t.isStreaming||this.timer!==null)return;const n=await this.state(),i=n.fault;if(!this.isActiveAutoFault(i)||this.sessionId(t)!==null&&!this.pendingEpisodeMatches(t,i,n)){this.clearTimer();return}const o=this.faultRetryDelayMs(i,Date.now());o!==null&&this.clearAndArmFaultRetry(o,e)}maybeSwitchProviderForRetry(e){if(e.type!=="auto_retry_start")return;const t=$("pi\u2192provider",e.errorMessage??"").kind;if(t!=="rate-limit"&&t!=="connection"||this.providerFallbackInFlight!==null||this.deps.cfg.modelExact===!0)return;const n=this.deps.installedGeneration();if(n===void 0)return;const i=this.deps.currentSession(),o=this.deps.currentServices(),l=this.deps.formatModelSpec(i.model,i.thinkingLevel);if(l===null)return;const d=T(this.deps.cfg.model,P(),!1);if(d===void 0)return;const r=D(d,G()??this.deps.cfg.cwd,O()),u=V(l),m=r.find(a=>`${a.providerId}/${a.modelId}`===u.modelSpec&&a.thinkingLevel===u.thinkingLevel)?.rank,h=m===void 0?{route:void 0,capacityExhausted:!1}:this.nextEligibleFallbackRoute(r.slice(m+1),this.deps.registryOf(o),i.getContextUsage()?.tokens,a=>!this.failedRetryRoutes.has(a.routeId));if(h.route===void 0){h.capacityExhausted&&(this.stageCapacityFailure(n,i),queueMicrotask(()=>{this.deps.installedGeneration()===n&&this.deps.currentSession()===i&&i.abortRetry()}));return}const p=h.route,g=(async()=>{const a=this.deps.registryOf(o).find(p.providerId,p.modelId);a&&(await i.setModel(a),!(this.deps.installedGeneration()!==n||this.deps.currentSession()!==i)&&(i.setThinkingLevel(p.thinkingLevel??"off"),this.failedRetryRoutes.add(p.routeId),await this.deps.broadcastModelChanged(!1)))})().catch(a=>{v({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`provider route fallback failed: ${a instanceof Error?a.message:String(a)}`}})}).finally(()=>{this.deps.installedGeneration()===n&&(this.providerFallbackInFlight=null)});this.providerFallbackInFlight=g}maybeFallbackOnUnusableModel(e){if(e.type!=="message_end"||e.message.role!=="assistant"||e.message.stopReason!=="error")return;const t=H(e.message.errorMessage??"");if(!t&&!z(e.message.errorMessage??"")||this.deps.cfg.modelExact===!0||this.notFoundFallbackInFlight!==null)return;const n=this.deps.installedGeneration();if(n===void 0)return;const i=this.deps.currentSession(),o=this.deps.currentServices(),l=this.deps.formatModelSpec(i.model,i.thinkingLevel);if(l===null)return;const d=V(l);this.notFoundModels.add(d.modelSpec);const r=T(this.deps.cfg.model,P(),!1),u=r?D(r,G()??this.deps.cfg.cwd,O()):[],m=u.find(f=>`${f.providerId}/${f.modelId}`===d.modelSpec&&f.thinkingLevel===d.thinkingLevel)?.rank,h=m===void 0?{route:void 0,capacityExhausted:!1}:this.nextEligibleFallbackRoute(u.slice(m+1),this.deps.registryOf(o),i.getContextUsage()?.tokens,f=>!this.notFoundModels.has(`${f.providerId}/${f.modelId}`));if(h.route===void 0){h.capacityExhausted&&this.stageCapacityFailure(n,i);return}const p=h.route,g=`${p.providerId}/${p.modelId}${p.thinkingLevel?`:${p.thinkingLevel}`:""}`,a=(async()=>{const f=this.deps.registryOf(o).find(p.providerId,p.modelId);if(f===void 0){v({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`${t?"unconfigured-provider":"not_found"} fallback skipped: ${g} is not registered`}});return}if(await i.setModel(f),this.deps.installedGeneration()!==n||this.deps.currentSession()!==i)return;i.setThinkingLevel(p.thinkingLevel??"off"),await this.deps.broadcastModelChanged();const c=this.deps.formatModelSpec(i.model,i.thinkingLevel)??g;if(v({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`${t?"unconfigured-provider":"not_found"} fallback: ${l} unavailable \u2192 ${c}; re-driving turn`}}),await i.agent.waitForIdle(),this.deps.installedGeneration()!==n||this.deps.currentSession()!==i)return;t&&await this.clearFault("pi\u2192provider");const F=U("recovery",{},ie(l,c,t?"credential":"not-found"));W(F,{type:"runtime",kind:"recovery"}),await this.deps.turnAdmission.admit(y=>N.fresh(()=>i.prompt(F,{preflightResult:y})))})().catch(f=>{v({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`${t?"unconfigured-provider":"not_found"} fallback failed: ${f instanceof Error?f.message:String(f)}`}})}).finally(()=>{this.deps.installedGeneration()===n&&(this.notFoundFallbackInFlight=null)});this.notFoundFallbackInFlight=a}nextEligibleFallbackRoute(e,t,n,i){let o=0,l=0;for(const d of e){if(!i(d)||re([{...d,...Z(d,t),automaticFallback:!0}]).candidates.length===0)continue;const r=t.find(d.providerId,d.modelId);if(r!==void 0){if(o++,this.targetCannotFitContext(r.contextWindow,n)){l++;continue}return{route:d,capacityExhausted:!1}}}return{route:void 0,capacityExhausted:o>0&&o===l}}targetCannotFitContext(e,t){return Number.isFinite(e)&&Number.isFinite(t)&&e<t}stageCapacityFailure(e,t){const n=t.getContextUsage()?.tokens;this.stagedCapacityFailure={generation:e,errorMessage:Number.isFinite(n)?`All available fallback models have context windows smaller than the current conversation (${n} tokens).`:"All available fallback models have context windows smaller than the current conversation."}}async recordPendingProviderFault(e,t){const n=this.sessionId(e);if(n===null){await this.recordFault(t);return}await b(this.deps.nodeId,{op:"record-pending",session_id:n,input:t})}pendingEpisodeMatches(e,t,n){const i=this.sessionId(e),o=n.episode;return i!==null&&o!==null&&o.state==="pending"&&o.session_id===i&&o.fault.fault_id===t.fault_id}faultRetryDelayMs(e,t){if(e.retry.nextAt!==void 0){const n=Date.parse(e.retry.nextAt)-t;return Number.isFinite(n)?Math.max(0,n):null}return q(I(e),t)?.delayMs??null}clearAndArmFaultRetry(e,t){if(this.deps.installedGeneration()!==t)return;this.clearTimer();const n=Math.min(Math.max(0,e),se),i=Math.max(0,e-n);this.timer=setTimeout(()=>{if(this.timer=null,this.deps.installedGeneration()===t){if(i>0){this.clearAndArmFaultRetry(i,t);return}this.runFaultRetry().catch(o=>{v({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`fault retry fire failed: ${o instanceof Error?o.message:String(o)}`}})})}},n),typeof this.timer.unref=="function"&&this.timer.unref()}async runFaultRetry(){const e=this.deps.installedGeneration();if(e===void 0)return;const t=e.session;if(t.isStreaming)return;const n=(await this.state()).fault;if(!this.isActiveAutoFault(n))return;let i=n;if(n.kind==="connection"){const r=await this.deps.retryProbe();if(this.deps.installedGeneration()!==e||this.deps.currentSession()!==t||t.isStreaming)return;const u=(await this.state()).fault;if(!this.isActiveAutoFault(u)||u.since!==n.since)return;if(!r){this.clearAndArmFaultRetry(Y(u.kind).baseDelayMs,e);return}i=u}const o=i.retry.attempt??0,l=Y(i.kind);if(o>=l.max){await this.recordFault(M(B(I(i)))),await this.clearEpisode(t);return}const d=q(I(i),Date.now());if(d===null){await this.recordFault(M(B(I(i)))),await this.clearEpisode(t);return}if(i.anchor_entry_id!==void 0)try{if((t.sessionManager.getLeafId?.()??null)!==i.anchor_entry_id&&(await t.navigateTree(i.anchor_entry_id),this.deps.installedGeneration()!==e||this.deps.currentSession()!==t))return}catch(r){v({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`fault retry rewind skipped: ${r instanceof Error?r.message:String(r)}`}})}this.deps.installedGeneration()!==e||this.deps.currentSession()!==t||await this.deps.turnAdmission.admit(async r=>{const u=(await this.state()).fault;if(this.deps.installedGeneration()!==e||this.deps.currentSession()!==t||t.isStreaming||!this.isActiveAutoFault(u)||u.since!==i.since){r();return}const m=this.sessionId(t);if(m===null){r();return}if(!(await b(this.deps.nodeId,{op:"admit",session_id:m,fault_id:u.fault_id,retry:d.fault.retry})).applied){r();return}const p=U("recovery",{attempt:d.attempt,max:d.max},i.kind==="connection"?ee:te);return W(p,{type:"runtime",kind:"recovery"}),N.fresh(()=>t.prompt(p,{preflightResult:r}))})}}export{we as FaultRetry};
1
+ var z=Object.defineProperty;var v=(s,e)=>z(s,"name",{value:e,configurable:!0});import{envModelIntent as P,envNodeCwd as G,envProfileId as O}from"../../../shared/env.js";import{isContextOverflow as H}from"@earendil-works/pi-ai";import{classify as L}from"../../fault-classifier.js";import{isModelNotFoundError as J,isProviderUnconfiguredError as K}from"../fault.js";import{brokerRecovery as Q,mutateBrokerFault as $,mutateBrokerProviderRetry as b}from"./daemon-ops.js";import{extractCoolingDeadline as Z}from"../managed-provider-cooling.js";import{extractProviderFailureDetails as ee}from"../../provider-failure.js";import{expandModelCandidates as D,modelRequestFromConfig as T,probeRouteAvailability as te}from"../../model-routes.js";import{operationIdContext as N}from"../../events/operation-id.js";import{emitEvent as F}from"../../events/emit.js";import{CONNECTION_FAULT_RECOVERY_BODY as ie,PROVIDER_FAULT_RECOVERY_BODY as ne,formatCard as U,formatModelFallbackRecovery as re}from"../../../shared/generated-context.js";import{markFatalOnExhaust as B,nextFaultRetry as q,policyFor as Y}from"../fault-recovery.js";import{parseModelSpec as V}from"../model-selection.js";import{endedByAbort as se}from"../session-cycles.js";import{resolveProviderCandidates as oe}from"../../subscription-state.js";import{announceMessageOrigin as W}from"../stamp/channel.js";import{LLM_REFUSAL_DIAGNOSTIC as ae}from"./model-adapter.js";const de=2147483647;function I(s){return{link:s.link,op:s.op,kind:s.kind,retry:s.retry,message:s.message,since:s.since,operation_id:s.operation_id,...s.anchor_entry_id===void 0?{}:{anchorEntryId:s.anchor_entry_id},...s.provider_error===void 0?{}:{providerError:s.provider_error}}}v(I,"policyFault");function M(s){return{link:s.link,op:s.op,kind:s.kind,retry:s.retry,message:s.message,...s.operation_id===void 0?{}:{operation_id:s.operation_id},...s.since===void 0?{}:{since:s.since},...s.anchorEntryId===void 0?{}:{anchor_entry_id:s.anchorEntryId},...s.providerError===void 0?{}:{provider_error:s.providerError}}}v(M,"faultInput");function j(s,e){const t=v(i=>`${i.providerId}/${i.modelId}`===e.modelSpec,"onLiveModel");return(s.find(i=>t(i)&&i.thinkingLevel===e.thinkingLevel)??s.find(t))?.rank}v(j,"liveRouteRank");function le(s){const e=L("pi\u2192provider",s),t=s.diagnostics?.some(i=>i.type===ae)??!1;return{classified:e,disposition:t?"fatal":e.disposition}}v(le,"settledProviderFault");class Ae{static{v(this,"FaultRetry")}deps;timer=null;failedRetryRoutes=new Set;notFoundModels=new Set;providerFallbackInFlight=null;notFoundFallbackInFlight=null;stagedCapacityFailure=null;personaGateFailed=!1;constructor(e){this.deps=e}clearTimer(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}reset(){this.clearTimer(),this.providerFallbackInFlight=null,this.notFoundFallbackInFlight=null,this.stagedCapacityFailure=null,this.personaGateFailed=!1}notePersonaGateFailure(){this.personaGateFailed=!0}state(){return Q(this.deps.nodeId)}async recordFault(e){return(await $(this.deps.nodeId,{op:"record",input:e})).fault}async clearFault(e,t=!1){await $(this.deps.nodeId,{op:"clear",...e===void 0?{}:{link:e},...t?{preserve_episode:!0}:{}})}sessionId(e){const t=e.sessionManager.getSessionId?.();return typeof t=="string"&&t!==""?t:null}async clearEpisode(e){const t=this.sessionId(e);t!==null&&await b(this.deps.nodeId,{op:"clear",session_id:t})}onEvent(e){this.maybeSwitchProviderForRetry(e),this.maybeFallbackOnUnusableModel(e)}isActiveAutoFault(e){return e===null||e.retry.disposition!=="auto"||e.retry.by!=="daemon"?!1:e.kind==="connection"||e.kind==="rate-limit"||e.kind==="overloaded"}async publishSettledProviderFault(e){const t=e.stagedProviderAgentEnd,i=e.stagedWatchdogAbort,n=e.stagedRefreshAbort,o=e.stagedOverflowFailure,l=this.stagedCapacityFailure?.generation===e?this.stagedCapacityFailure:null,a=this.personaGateFailed;this.stagedCapacityFailure=null,this.personaGateFailed=!1,e.stagedProviderAgentEnd=null,e.stagedWatchdogAbort=!1,e.stagedRefreshAbort=!1,e.stagedOverflowFailure=null;const r=e.session,p=await this.state(),h=p.fault,f=p.episode,u=this.sessionId(r),g=this.isActiveAutoFault(h)&&h.link==="pi\u2192provider"?h:f?.state==="admitted"&&f.session_id===u&&this.isActiveAutoFault(f.fault)?f.fault:null,d=g===null?null:{since:g.since,anchorEntryId:g.anchor_entry_id,attempt:g.retry.attempt},c=[...Array.isArray(t?.messages)?t.messages:[]].reverse().find(E=>typeof E=="object"&&E!==null&&E.role==="assistant");if(a){await this.clearEpisode(r);return}if(l!==null||o!==null){await this.clearFault("pi\u2192provider"),await this.clearEpisode(r),await this.recordFault({link:"pi\u2192provider",op:"context overflow recovery",kind:"context-overflow",retry:{disposition:"fatal"},message:l?.errorMessage??o.errorMessage,anchor_entry_id:r.sessionManager.getLeafId?.()??void 0});return}if(i&&c?.stopReason==="aborted"){await this.recordPendingProviderFault(r,{link:"pi\u2192provider",op:"generation turn",kind:"connection",retry:{disposition:"auto",by:"daemon",...d?.attempt!==void 0?{attempt:d.attempt}:{}},message:typeof c.errorMessage=="string"?c.errorMessage:"engine error (no errorMessage recorded)",...d!==null?{since:d.since}:{},anchor_entry_id:d?.anchorEntryId??r.sessionManager.getLeafId?.()??void 0});return}if(c?.stopReason!=="error"){c!==void 0&&await this.clearEpisode(r);return}if(n){await this.clearEpisode(r);return}const k=typeof c.errorMessage=="string"?c.errorMessage:"engine error (no errorMessage recorded)";if(se({stopReason:"error",errorMessage:k})){await this.clearEpisode(r);return}const y=H(c,r.model?.contextWindow),{classified:X,disposition:w}=le(c),R=Z(c),A=ee(c),S=typeof c.provider=="string"&&c.provider!==""?c.provider:r.model?.provider,x=typeof c.model=="string"&&c.model!==""?c.model:r.model?.id,C=A===void 0||S===void 0||x===void 0?void 0:{provider:S,model:x,...A};y&&(await this.clearFault("pi\u2192provider"),await this.clearEpisode(r));const _={link:"pi\u2192provider",op:"generation turn",kind:y?"context-overflow":X.kind,retry:y?{disposition:"fatal"}:w==="auto"?{disposition:"auto",by:"daemon",...R!==void 0?{nextAt:new Date(R).toISOString()}:{},...d?.attempt!==void 0?{attempt:d.attempt}:{}}:{disposition:w},message:k,...!y&&w==="auto"&&d!==null?{since:d.since}:{},anchor_entry_id:!y&&w==="auto"&&d?.anchorEntryId!==void 0?d.anchorEntryId:r.sessionManager.getLeafId?.()??void 0,...C===void 0?{}:{provider_error:C}};_.retry.disposition==="auto"?await this.recordPendingProviderFault(r,_):(await this.clearEpisode(r),await this.recordFault(_))}async recoverOnStartup(){const e=this.deps.installedGeneration();if(e===void 0)return"none";const t=(await this.state()).episode,i=this.sessionId(e.session);if(this.deps.cfg.newCycle===!0)return t!==null&&i!==null&&t.session_id===i&&await b(this.deps.nodeId,{op:"invalidate",session_id:i}),"none";if(t===null||i===null||t.session_id!==i)return"none";if(t.state==="admitted")if(t.fault.anchor_entry_id!==void 0&&!this.hasProgressPastAnchor(e.session,t.fault.anchor_entry_id)){if(!(await b(this.deps.nodeId,{op:"reopen",session_id:i})).applied)return"none"}else return await this.clearEpisode(e.session),"none";else if(t.state!=="pending")return"none";return await this.recordFault(M(I(t.fault))),await this.schedule(),"retry-armed"}hasProgressPastAnchor(e,t){const i=e.sessionManager.getBranch(),n=i.findIndex(l=>l.id===t);return(n===-1?i:i.slice(n+1)).some(l=>{if(l.type!=="message")return!1;const{message:a}=l;return a.role==="toolResult"?!0:a.role==="assistant"&&Array.isArray(a.content)&&a.content.length>0})}async schedule(){const e=this.deps.installedGeneration(),t=this.deps.currentSession();if(e===void 0||t.isStreaming||this.timer!==null)return;const i=await this.state(),n=i.fault;if(!this.isActiveAutoFault(n)||this.sessionId(t)!==null&&!this.pendingEpisodeMatches(t,n,i)){this.clearTimer();return}const o=this.faultRetryDelayMs(n,Date.now());o!==null&&this.clearAndArmFaultRetry(o,e)}maybeSwitchProviderForRetry(e){if(e.type!=="auto_retry_start")return;const t=L("pi\u2192provider",e.errorMessage??"").kind;if(t!=="rate-limit"&&t!=="connection"||this.providerFallbackInFlight!==null||this.deps.cfg.modelExact===!0)return;const i=this.deps.installedGeneration();if(i===void 0)return;const n=this.deps.currentSession(),o=this.deps.currentServices(),l=this.deps.formatModelSpec(n.model,n.thinkingLevel);if(l===null)return;const a=T(this.deps.cfg.model,P(),!1);if(a===void 0)return;const r=D(a,G()??this.deps.cfg.cwd,O()),p=V(l),h=j(r,p),f=h===void 0?{route:void 0,capacityExhausted:!1}:this.nextEligibleFallbackRoute(r.slice(h+1),this.deps.registryOf(o),n.getContextUsage()?.tokens,d=>!this.failedRetryRoutes.has(d.routeId));if(f.route===void 0){f.capacityExhausted&&(this.stageCapacityFailure(i,n),queueMicrotask(()=>{this.deps.installedGeneration()===i&&this.deps.currentSession()===n&&n.abortRetry()}));return}const u=f.route,g=(async()=>{const d=this.deps.registryOf(o).find(u.providerId,u.modelId);if(!d||(await n.setModel(d),this.deps.installedGeneration()!==i||this.deps.currentSession()!==n))return;const m=`${u.providerId}/${u.modelId}`===p.modelSpec?p.thinkingLevel:u.thinkingLevel;n.setThinkingLevel(m??"off"),this.failedRetryRoutes.add(u.routeId),await this.deps.broadcastModelChanged(!1)})().catch(d=>{F({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`provider route fallback failed: ${d instanceof Error?d.message:String(d)}`}})}).finally(()=>{this.deps.installedGeneration()===i&&(this.providerFallbackInFlight=null)});this.providerFallbackInFlight=g}maybeFallbackOnUnusableModel(e){if(e.type!=="message_end"||e.message.role!=="assistant"||e.message.stopReason!=="error")return;const t=K(e.message.errorMessage??"");if(!t&&!J(e.message.errorMessage??"")||this.deps.cfg.modelExact===!0||this.notFoundFallbackInFlight!==null)return;const i=this.deps.installedGeneration();if(i===void 0)return;const n=this.deps.currentSession(),o=this.deps.currentServices(),l=this.deps.formatModelSpec(n.model,n.thinkingLevel);if(l===null)return;const a=V(l);this.notFoundModels.add(a.modelSpec);const r=T(this.deps.cfg.model,P(),!1),p=r?D(r,G()??this.deps.cfg.cwd,O()):[],h=j(p,a),f=h===void 0?{route:void 0,capacityExhausted:!1}:this.nextEligibleFallbackRoute(p.slice(h+1),this.deps.registryOf(o),n.getContextUsage()?.tokens,m=>!this.notFoundModels.has(`${m.providerId}/${m.modelId}`));if(f.route===void 0){f.capacityExhausted&&this.stageCapacityFailure(i,n);return}const u=f.route,g=`${u.providerId}/${u.modelId}${u.thinkingLevel?`:${u.thinkingLevel}`:""}`,d=(async()=>{const m=this.deps.registryOf(o).find(u.providerId,u.modelId);if(m===void 0){F({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`${t?"unconfigured-provider":"not_found"} fallback skipped: ${g} is not registered`}});return}if(await n.setModel(m),this.deps.installedGeneration()!==i||this.deps.currentSession()!==n)return;n.setThinkingLevel(u.thinkingLevel??"off"),await this.deps.broadcastModelChanged();const c=this.deps.formatModelSpec(n.model,n.thinkingLevel)??g;if(F({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`${t?"unconfigured-provider":"not_found"} fallback: ${l} unavailable \u2192 ${c}; re-driving turn`}}),await n.agent.waitForIdle(),this.deps.installedGeneration()!==i||this.deps.currentSession()!==n)return;t&&await this.clearFault("pi\u2192provider");const k=U("recovery",{},re(l,c,t?"credential":"not-found"));W(k,{type:"runtime",kind:"recovery"}),await this.deps.turnAdmission.admit(y=>N.fresh(()=>n.prompt(k,{preflightResult:y})))})().catch(m=>{F({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`${t?"unconfigured-provider":"not_found"} fallback failed: ${m instanceof Error?m.message:String(m)}`}})}).finally(()=>{this.deps.installedGeneration()===i&&(this.notFoundFallbackInFlight=null)});this.notFoundFallbackInFlight=d}nextEligibleFallbackRoute(e,t,i,n){let o=0,l=0;for(const a of e){if(!n(a)||oe([{...a,...te(a,t),automaticFallback:!0}]).candidates.length===0)continue;const r=t.find(a.providerId,a.modelId);if(r!==void 0){if(o++,this.targetCannotFitContext(r.contextWindow,i)){l++;continue}return{route:a,capacityExhausted:!1}}}return{route:void 0,capacityExhausted:o>0&&o===l}}targetCannotFitContext(e,t){return Number.isFinite(e)&&Number.isFinite(t)&&e<t}stageCapacityFailure(e,t){const i=t.getContextUsage()?.tokens;this.stagedCapacityFailure={generation:e,errorMessage:Number.isFinite(i)?`All available fallback models have context windows smaller than the current conversation (${i} tokens).`:"All available fallback models have context windows smaller than the current conversation."}}async recordPendingProviderFault(e,t){const i=this.sessionId(e);if(i===null){await this.recordFault(t);return}await b(this.deps.nodeId,{op:"record-pending",session_id:i,input:t})}pendingEpisodeMatches(e,t,i){const n=this.sessionId(e),o=i.episode;return n!==null&&o!==null&&o.state==="pending"&&o.session_id===n&&o.fault.fault_id===t.fault_id}faultRetryDelayMs(e,t){if(e.retry.nextAt!==void 0){const i=Date.parse(e.retry.nextAt)-t;return Number.isFinite(i)?Math.max(0,i):null}return q(I(e),t)?.delayMs??null}clearAndArmFaultRetry(e,t){if(this.deps.installedGeneration()!==t)return;this.clearTimer();const i=Math.min(Math.max(0,e),de),n=Math.max(0,e-i);this.timer=setTimeout(()=>{if(this.timer=null,this.deps.installedGeneration()===t){if(n>0){this.clearAndArmFaultRetry(n,t);return}this.runFaultRetry().catch(o=>{F({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`fault retry fire failed: ${o instanceof Error?o.message:String(o)}`}})})}},i),typeof this.timer.unref=="function"&&this.timer.unref()}async runFaultRetry(){const e=this.deps.installedGeneration();if(e===void 0)return;const t=e.session;if(t.isStreaming)return;const i=(await this.state()).fault;if(!this.isActiveAutoFault(i))return;let n=i;if(i.kind==="connection"){const r=await this.deps.retryProbe();if(this.deps.installedGeneration()!==e||this.deps.currentSession()!==t||t.isStreaming)return;const p=(await this.state()).fault;if(!this.isActiveAutoFault(p)||p.since!==i.since)return;if(!r){this.clearAndArmFaultRetry(Y(p.kind).baseDelayMs,e);return}n=p}const o=n.retry.attempt??0,l=Y(n.kind);if(o>=l.max){await this.recordFault(M(B(I(n)))),await this.clearEpisode(t);return}const a=q(I(n),Date.now());if(a===null){await this.recordFault(M(B(I(n)))),await this.clearEpisode(t);return}if(n.anchor_entry_id!==void 0)try{if((t.sessionManager.getLeafId?.()??null)!==n.anchor_entry_id&&(await t.navigateTree(n.anchor_entry_id),this.deps.installedGeneration()!==e||this.deps.currentSession()!==t))return}catch(r){F({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`fault retry rewind skipped: ${r instanceof Error?r.message:String(r)}`}})}this.deps.installedGeneration()!==e||this.deps.currentSession()!==t||await this.deps.turnAdmission.admit(async r=>{const p=(await this.state()).fault;if(this.deps.installedGeneration()!==e||this.deps.currentSession()!==t||t.isStreaming||!this.isActiveAutoFault(p)||p.since!==n.since){r();return}const h=this.sessionId(t);if(h===null){r();return}if(!(await b(this.deps.nodeId,{op:"admit",session_id:h,fault_id:p.fault_id,retry:a.fault.retry})).applied){r();return}const u=U("recovery",{attempt:a.attempt,max:a.max},n.kind==="connection"?ie:ne);return W(u,{type:"runtime",kind:"recovery"}),N.fresh(()=>t.prompt(u,{preflightResult:r}))})}}export{Ae as FaultRetry,le as settledProviderFault};
@@ -1,5 +1,4 @@
1
1
  import type { AgentSessionServices, ModelRegistry } from '@earendil-works/pi-coding-agent';
2
- import type { BrokerSdkConfig } from '../launch.js';
3
2
  import type { ClientToBroker } from '../broker-protocol.js';
4
3
  import type { BrokerClient, BrokerClientRegistry } from './client-registry.js';
5
4
  import type { BrokerSession } from './read-ops.js';
@@ -9,9 +8,9 @@ import type { TurnAdmissionGate } from './turn-admission.js';
9
8
  import type { ToolGroupTracker } from './tool-groups.js';
10
9
  import type { EventProjection } from './event-projection.js';
11
10
  import type { RebindDriver } from './rebind.js';
11
+ import type { ModelIntent } from '../../../types.js';
12
12
  export type FrameDispatchDeps = {
13
13
  nodeId: string;
14
- cfg: BrokerSdkConfig;
15
14
  registry: BrokerClientRegistry;
16
15
  toolGroups: ToolGroupTracker;
17
16
  projection: EventProjection;
@@ -24,16 +23,13 @@ export type FrameDispatchDeps = {
24
23
  replayExtraPendingDialogsTo: (client: BrokerClient) => void;
25
24
  reWelcomeAll: () => void;
26
25
  disposeAndExit: (reason: string, status?: number) => void;
27
- persistModelChoice: (pinnedOverride?: boolean, userSelected?: boolean) => Promise<string | null>;
28
- broadcastModelChanged: (persist?: boolean, pinnedOverride?: boolean, userSelected?: boolean) => Promise<void>;
26
+ persistModelChoice: (intent?: ModelIntent, userSelected?: boolean) => Promise<string | null>;
27
+ broadcastModelChanged: (persist?: boolean, intent?: ModelIntent, userSelected?: boolean) => Promise<void>;
29
28
  registryOf: (services: AgentSessionServices) => ModelRegistry;
30
29
  formatModelSpec: (model: BrokerSession['model'], thinkingLevel?: string) => string | null;
31
30
  formatExactModelSpec: (model: BrokerSession['model'], thinkingLevel?: string) => string | null;
32
31
  turnAdmission: TurnAdmissionGate;
33
- resolveLaunchModel: (services: AgentSessionServices, cfg: BrokerSdkConfig) => Promise<{
34
- model: NonNullable<ReturnType<ModelRegistry['find']>>;
35
- thinkingLevel: string | undefined;
36
- } | undefined>;
32
+ memoryInventory: import('../../../api/dto/broker-ops.js').BrokerMemoryRefsDTO;
37
33
  };
38
34
  export type FrameDispatchContext = ReturnType<typeof createFrameDispatchContext>;
39
35
  /** Owns frame-local input state while dispatching through explicit broker collaborators. */
@@ -56,7 +52,7 @@ export declare function createFrameDispatchContext(deps: FrameDispatchDeps): {
56
52
  bye: (client: BrokerClient) => void;
57
53
  shutdown: () => void;
58
54
  };
59
- kickoff: (prompt: string) => void;
55
+ kickoff: (prompt: string, messageIds?: string[]) => void;
60
56
  notifyTurnAccepted: () => void;
61
57
  pendingPromptDispatches: () => number;
62
58
  resetForSession: () => void;
@@ -1 +1 @@
1
- var O=Object.defineProperty;var n=(e,s)=>O(e,"name",{value:s,configurable:!0});import{createFrameReplies as j}from"./frame-replies.js";import{createEngineDriver as q}from"./engine-drive.js";import{announceMessageOrigin as L}from"../stamp/channel.js";import{createClientHandlers as x}from"./frame-client.js";import{createMemoryRefGuidance as z}from"./frame-memory-refs.js";import{createAuthReloadGate as B}from"./auth-reload.js";import{createEngineControlHandler as J}from"./frame-engine-control.js";import{createReadHandler as N}from"./frame-read.js";import{createSessionHandler as Q}from"./frame-session.js";import{createKickoffDriver as U,createPromptDispatchTracker as V,createTurnAcceptanceGate as X}from"./turn-ignition.js";function ce(e){const{nodeId:s,cfg:r,registry:a,toolGroups:b,projection:D,rebind:c,boundaryReviewId:_,pendingDialogs:F,sendWelcome:A,replayExtraPendingDialogsTo:C,reWelcomeAll:R,disposeAndExit:S,persistModelChoice:E,broadcastModelChanged:g,registryOf:M,formatModelSpec:f,formatExactModelSpec:G,turnAdmission:p,resolveLaunchModel:H}=e,o=n(()=>c.session(),"currentSession"),v=n(()=>c.services(),"currentServices"),t=j(a),{notWritable:P}=t,h=z(o),u=V(o),y=X(),k=U({session:o,dispatches:u,turnAdmission:p}),m=B({nodeId:s,cfg:r,replies:t,rebind:c,session:o,services:v,broadcastModelChanged:g,formatModelSpec:f,resolveLaunchModel:H,driveKickoff:k.drivePending,turnAdmission:p}),w=q({nodeId:s,registry:a,replies:t,session:o,dispatches:u,memoryRefs:h,authReloadGate:m,rebind:c,projection:D,toolGroups:b,turnAdmission:p}),T=n((i,l)=>{P(i,"drive the engine")||((l.type==="prompt"||l.type==="steer"||l.type==="follow_up")&&L(l.text,{type:"human",channel:{type:"viewer"}}),w(i,l))},"handleDriveFrame"),d=x({registry:a,replies:t,session:o,driveEngine:w,turnAcceptance:y,pendingDialogs:F,sendWelcome:A,replayExtraPendingDialogsTo:C,disposeAndExit:S}),W=J({registry:a,replies:t,session:o,services:v,registryOf:M,persistModelChoice:E,broadcastModelChanged:g,formatModelSpec:f}),I=N({registry:a,replies:t,session:o,boundaryReviewId:_,memoryRefs:h,formatExactModelSpec:G}),K=Q({registry:a,replies:t,rebind:c,session:o,boundaryReviewId:_,memoryRefs:h,reWelcomeAll:R});return{handlers:{hello:d.hello,drive:T,deliver:d.deliver,dialog:d.dialog,engineControl:W,read:I,session:K,authentication:n(i=>m.handle(i),"authentication"),bye:d.bye,shutdown:d.shutdown},kickoff:n(i=>k.kickoff(i),"kickoff"),notifyTurnAccepted:y.notifyAccepted,pendingPromptDispatches:u.pending,resetForSession:m.resetForSession}}n(ce,"createFrameDispatchContext");function de(e,s,r){switch(r.type){case"hello":e.handlers.hello(s,r);return;case"prompt":case"steer":case"follow_up":case"abort":case"bash":e.handlers.drive(s,r);return;case"deliver":e.handlers.deliver(s,r);return;case"extension_ui_response":e.handlers.dialog(s,r);return;case"set_model":case"deliver_custom_message":case"cycle_model":case"cycle_ladder":case"cycle_thinking":case"dequeue":case"set_thinking_level":case"set_auto_retry":case"set_auto_compaction":case"compact":case"set_session_name":e.handlers.engineControl(s,r);return;case"get_commands":case"list_models":case"list_scoped_models":case"list_memory_refs":case"get_tree":case"get_settings":case"list_sessions":case"get_human_fork_coordinates":e.handlers.read(s,r);return;case"navigate_tree":case"reload":case"export":case"new_session":case"switch_session":case"fork":case"clone":case"share":e.handlers.session(s,r);return;case"reload_auth":e.handlers.authentication(s);return;case"bye":e.handlers.bye(s);return;case"shutdown":e.handlers.shutdown();return}}n(de,"handleFrame");export{ce as createFrameDispatchContext,de as handleFrame};
1
+ var W=Object.defineProperty;var o=(s,r)=>W(s,"name",{value:r,configurable:!0});import{createFrameReplies as O}from"./frame-replies.js";import{createEngineDriver as j}from"./engine-drive.js";import{announceMessageOrigin as q}from"../stamp/channel.js";import{createClientHandlers as K}from"./frame-client.js";import{createMemoryRefGuidance as x}from"./frame-memory-refs.js";import{createEngineControlHandler as z}from"./frame-engine-control.js";import{createReadHandler as B}from"./frame-read.js";import{createSessionHandler as J}from"./frame-session.js";import{createKickoffDriver as L,createPromptDispatchTracker as N,createTurnAcceptanceGate as Q}from"./turn-ignition.js";function ne(s){const{nodeId:r,registry:e,toolGroups:g,projection:y,rebind:d,boundaryReviewId:h,pendingDialogs:f,sendWelcome:v,replayExtraPendingDialogsTo:k,reWelcomeAll:w,disposeAndExit:b,persistModelChoice:D,broadcastModelChanged:C,registryOf:F,formatModelSpec:A,formatExactModelSpec:E,turnAdmission:m,memoryInventory:S}=s,n=o(()=>d.session(),"currentSession"),M=o(()=>d.services(),"currentServices"),t=O(e),{notWritable:R}=t,l=x(n,r,S),p=N(n),u=Q(),H=L({session:n,dispatches:p,turnAdmission:m}),_=j({nodeId:r,registry:e,replies:t,session:n,dispatches:p,memoryRefs:l,rebind:d,projection:y,toolGroups:g,turnAdmission:m}),T=o((c,a)=>{R(c,"drive the engine")||((a.type==="prompt"||a.type==="steer"||a.type==="follow_up")&&q(a.text,{type:"human",channel:{type:"viewer"}}),_(c,a))},"handleDriveFrame"),i=K({registry:e,replies:t,session:n,driveEngine:_,turnAcceptance:u,pendingDialogs:f,sendWelcome:v,replayExtraPendingDialogsTo:k,disposeAndExit:b}),G=z({registry:e,replies:t,session:n,services:M,registryOf:F,persistModelChoice:D,broadcastModelChanged:C,formatModelSpec:A}),I=B({registry:e,replies:t,session:n,boundaryReviewId:h,memoryRefs:l,formatExactModelSpec:E}),P=J({registry:e,replies:t,rebind:d,session:n,boundaryReviewId:h,memoryRefs:l,reWelcomeAll:w});return{handlers:{hello:i.hello,drive:T,deliver:i.deliver,dialog:i.dialog,engineControl:G,read:I,session:P,authentication:o(c=>{t.ackTo(c,"reload_auth")},"authentication"),bye:i.bye,shutdown:i.shutdown},kickoff:o((c,a)=>H.kickoff(c,a),"kickoff"),notifyTurnAccepted:u.notifyAccepted,pendingPromptDispatches:p.pending,resetForSession:o(()=>{},"resetForSession")}}o(ne,"createFrameDispatchContext");function te(s,r,e){switch(e.type){case"hello":s.handlers.hello(r,e);return;case"prompt":case"steer":case"follow_up":case"abort":case"bash":s.handlers.drive(r,e);return;case"deliver":s.handlers.deliver(r,e);return;case"extension_ui_response":s.handlers.dialog(r,e);return;case"set_model":case"deliver_custom_message":case"cycle_model":case"cycle_ladder":case"cycle_thinking":case"dequeue":case"set_thinking_level":case"set_auto_retry":case"set_auto_compaction":case"compact":case"set_session_name":s.handlers.engineControl(r,e);return;case"get_commands":case"list_models":case"list_scoped_models":case"list_memory_refs":case"get_tree":case"get_settings":case"list_sessions":case"get_human_fork_coordinates":s.handlers.read(r,e);return;case"navigate_tree":case"reload":case"export":case"new_session":case"switch_session":case"fork":case"clone":case"share":s.handlers.session(r,e);return;case"reload_auth":s.handlers.authentication(r);return;case"bye":s.handlers.bye(r);return;case"shutdown":s.handlers.shutdown();return}}o(te,"handleFrame");export{ne as createFrameDispatchContext,te as handleFrame};
@@ -1,5 +1,6 @@
1
1
  import type { AgentSessionServices, ModelRegistry } from '@earendil-works/pi-coding-agent';
2
2
  import type { ClientToBroker } from '../broker-protocol.js';
3
+ import type { ModelIntent } from '../../../types.js';
3
4
  import type { BrokerClient, BrokerClientRegistry } from './client-registry.js';
4
5
  import type { FrameReplies } from './frame-replies.js';
5
6
  import type { BrokerSession } from './read-ops.js';
@@ -14,7 +15,7 @@ export declare function createEngineControlHandler(deps: {
14
15
  session: () => BrokerSession;
15
16
  services: () => AgentSessionServices;
16
17
  registryOf: (services: AgentSessionServices) => ModelRegistry;
17
- persistModelChoice: (pinnedOverride?: boolean, userSelected?: boolean) => Promise<string | null>;
18
- broadcastModelChanged: (persist?: boolean, pinnedOverride?: boolean, userSelected?: boolean) => Promise<void>;
18
+ persistModelChoice: (intent?: ModelIntent, userSelected?: boolean) => Promise<string | null>;
19
+ broadcastModelChanged: (persist?: boolean, intent?: ModelIntent, userSelected?: boolean) => Promise<void>;
19
20
  formatModelSpec: (model: BrokerSession['model'], thinkingLevel?: string) => string | null;
20
21
  }): (client: BrokerClient, frame: EngineControlFrame) => void;
@@ -1 +1 @@
1
- var N=Object.defineProperty;var r=(h,l)=>N(h,"name",{value:l,configurable:!0});import{configuredLadderProviders as Q,isProviderPinnedModelToken as $,nextLadderModel as H,normalizeModel as O}from"../launch.js";import{isManagedProvider as U,readSubscriptionPool as W}from"../../subscription-state.js";import{parseModelSpec as v}from"../model-selection.js";import{resolveModelQuery as f}from"./frame-model-query.js";function K(h){const{registry:l,replies:M,session:n,services:L,registryOf:S,persistModelChoice:_,broadcastModelChanged:y,formatModelSpec:T}=h,{notWritable:d,ackTo:c,engineErrorTo:s}=M,g=r(()=>S(L()),"modelRegistry"),k=r((e,t)=>l.sendFrame(e,{type:"error",code:"engine_error",message:t}),"noSuchModel"),b=r((e,t)=>{if(d(e,"set the model"))return;const o=v(t.model);let a,i;try{i=v(O(o.modelSpec)),a=f(g(),i.modelSpec)}catch(u){s(e)(u);return}if(a===void 0){k(e,`no model matching '${t.model}' in the registry`);return}n().setModel(a).then(async()=>{const u=o.thinkingLevel??i.thinkingLevel;u!==void 0&&n().setThinkingLevel(u),await y(!0,t.pinned!==void 0?t.pinned:$(t.model),!0),c(e,"set_model")}).catch(s(e))},"setModel"),w=r((e,t)=>{d(e,"deliver a custom message")||n().sendCustomMessage({customType:t.customType,content:t.content,display:!0,...t.details!==void 0?{details:t.details}:{}},...t.deliverAs!==void 0?[{deliverAs:t.deliverAs}]:[]).then(()=>c(e,"deliver_custom_message")).catch(s(e))},"deliverCustomMessage"),A=r((e,t)=>{d(e,"cycle the model")||n().cycleModel(t.direction).then(async()=>{await y(!0,void 0,!0),c(e,"cycle_model")}).catch(s(e))},"cycleModel"),C=r((e,t)=>{if(d(e,"cycle the model ladder"))return;const o=(()=>{try{const m=g();return Q(p=>U(p)&&W(p).length>0||m.getProviderAuthStatus(p).configured)}catch{return}})(),a=T(n().model,n().thinkingLevel)??"",i=v(H(a,t.direction==="backward"?-1:1,o));let u;try{u=f(g(),i.modelSpec)}catch(m){s(e)(m);return}if(u===void 0){k(e,`ladder model '${i.modelSpec}' not in the registry`);return}n().setModel(u).then(async()=>{i.thinkingLevel!==void 0&&n().setThinkingLevel(i.thinkingLevel),await y(!0,void 0,!0),c(e,"cycle_ladder")}).catch(s(e))},"cycleLadder"),P=r(e=>{d(e,"cycle the thinking level")||(async()=>{n().cycleThinkingLevel(),await _(void 0,!0),c(e,"cycle_thinking")})().catch(s(e))},"cycleThinking"),q=r((e,t)=>{if(!d(e,"dequeue messages",t.id))try{const{steering:o,followUp:a}=n().clearQueue();l.sendFrame(e,{type:"data",id:t.id,kind:"dequeue",steering:o,followUp:a})}catch(o){s(e,t.id)(o)}},"dequeue"),E=r((e,t)=>{d(e,"set the thinking level")||(async()=>{n().setThinkingLevel(t.level),await _(void 0,!0),c(e,"set_thinking_level")})().catch(s(e))},"setThinkingLevel"),x=r((e,t)=>{if(!d(e,"set auto-retry"))try{n().setAutoRetryEnabled(t.enabled),c(e,"set_auto_retry")}catch(o){s(e)(o)}},"setAutoRetry"),R=r((e,t)=>{if(!d(e,"set auto-compaction"))try{n().setAutoCompactionEnabled(t.enabled),c(e,"set_auto_compaction")}catch(o){s(e)(o)}},"setAutoCompaction"),z=r((e,t)=>{d(e,"compact the session")||n().compact(t.instructions).then(()=>c(e,"compact")).catch(s(e))},"compact"),F=r((e,t)=>{if(!d(e,"rename the session"))try{n().setSessionName(t.name),c(e,"set_session_name")}catch(o){s(e)(o)}},"setSessionName");return(e,t)=>{switch(t.type){case"set_model":return b(e,t);case"deliver_custom_message":return w(e,t);case"cycle_model":return A(e,t);case"cycle_ladder":return C(e,t);case"cycle_thinking":return P(e);case"dequeue":return q(e,t);case"set_thinking_level":return E(e,t);case"set_auto_retry":return x(e,t);case"set_auto_compaction":return R(e,t);case"compact":return z(e,t);case"set_session_name":return F(e,t)}}}r(K,"createEngineControlHandler");export{K as createEngineControlHandler};
1
+ var $=Object.defineProperty;var r=(h,l)=>$(h,"name",{value:l,configurable:!0});import{configuredLadderProviders as H,explicitModelIntent as f,nextLadderModel as O,normalizeModel as U}from"../launch.js";import{isManagedProvider as W,readSubscriptionPool as j}from"../../subscription-state.js";import{parseModelSpec as v}from"../model-selection.js";import{envModelIntent as B}from"../../../shared/env.js";import{resolveModelQuery as M}from"./frame-model-query.js";function X(h){const{registry:l,replies:L,session:n,services:S,registryOf:T,persistModelChoice:b,broadcastModelChanged:m,formatModelSpec:w}=h,{notWritable:d,ackTo:i,engineErrorTo:s}=L,y=r(()=>T(S()),"modelRegistry"),_=r((e,t)=>l.sendFrame(e,{type:"error",code:"engine_error",message:t}),"noSuchModel"),k=r(()=>{const e=B();return b(e===void 0?void 0:f(e),!0)},"persistThinkingChoice"),A=r((e,t)=>{if(d(e,"set the model"))return;const o=v(t.model);let u,c;try{c=v(U(o.modelSpec)),u=M(y(),c.modelSpec)}catch(a){s(e)(a);return}if(u===void 0){_(e,`no model matching '${t.model}' in the registry`);return}n().setModel(u).then(async()=>{const a=o.thinkingLevel??c.thinkingLevel;a!==void 0&&n().setThinkingLevel(a),await m(!0,t.intent??f(t.model),!0),i(e,"set_model")}).catch(s(e))},"setModel"),C=r((e,t)=>{d(e,"deliver a custom message")||n().sendCustomMessage({customType:t.customType,content:t.content,display:!0,...t.details!==void 0?{details:t.details}:{}},...t.deliverAs!==void 0?[{deliverAs:t.deliverAs}]:[]).then(()=>i(e,"deliver_custom_message")).catch(s(e))},"deliverCustomMessage"),q=r((e,t)=>{d(e,"cycle the model")||n().cycleModel(t.direction).then(async()=>{await m(!0,void 0,!0),i(e,"cycle_model")}).catch(s(e))},"cycleModel"),E=r((e,t)=>{if(d(e,"cycle the model ladder"))return;const o=(()=>{try{const g=y();return H(p=>W(p)&&j(p).length>0||g.getProviderAuthStatus(p).configured)}catch{return}})(),u=w(n().model,n().thinkingLevel)??"",c=v(O(u,t.direction==="backward"?-1:1,o));let a;try{a=M(y(),c.modelSpec)}catch(g){s(e)(g);return}if(a===void 0){_(e,`ladder model '${c.modelSpec}' not in the registry`);return}n().setModel(a).then(async()=>{c.thinkingLevel!==void 0&&n().setThinkingLevel(c.thinkingLevel),await m(!0,void 0,!0),i(e,"cycle_ladder")}).catch(s(e))},"cycleLadder"),P=r(e=>{d(e,"cycle the thinking level")||(async()=>{n().cycleThinkingLevel(),await k(),i(e,"cycle_thinking")})().catch(s(e))},"cycleThinking"),x=r((e,t)=>{if(!d(e,"dequeue messages",t.id))try{const{steering:o,followUp:u}=n().clearQueue();l.sendFrame(e,{type:"data",id:t.id,kind:"dequeue",steering:o,followUp:u})}catch(o){s(e,t.id)(o)}},"dequeue"),R=r((e,t)=>{d(e,"set the thinking level")||(async()=>{n().setThinkingLevel(t.level),await k(),i(e,"set_thinking_level")})().catch(s(e))},"setThinkingLevel"),z=r((e,t)=>{if(!d(e,"set auto-retry"))try{if(t.enabled)throw new Error("The daemon model adapter owns retries for broker sessions; pi auto-retry cannot be enabled");n().setAutoRetryEnabled(!1),i(e,"set_auto_retry")}catch(o){s(e)(o)}},"setAutoRetry"),F=r((e,t)=>{if(!d(e,"set auto-compaction"))try{n().setAutoCompactionEnabled(t.enabled),i(e,"set_auto_compaction")}catch(o){s(e)(o)}},"setAutoCompaction"),N=r((e,t)=>{d(e,"compact the session")||n().compact(t.instructions).then(()=>i(e,"compact")).catch(s(e))},"compact"),Q=r((e,t)=>{if(!d(e,"rename the session"))try{n().setSessionName(t.name),i(e,"set_session_name")}catch(o){s(e)(o)}},"setSessionName");return(e,t)=>{switch(t.type){case"set_model":return A(e,t);case"deliver_custom_message":return C(e,t);case"cycle_model":return q(e,t);case"cycle_ladder":return E(e,t);case"cycle_thinking":return P(e);case"dequeue":return x(e,t);case"set_thinking_level":return R(e,t);case"set_auto_retry":return z(e,t);case"set_auto_compaction":return F(e,t);case"compact":return N(e,t);case"set_session_name":return Q(e,t)}}}r(X,"createEngineControlHandler");export{X as createEngineControlHandler};
@@ -1,3 +1,4 @@
1
+ import type { BrokerMemoryRefsDTO } from '../../../api/dto/broker-ops.js';
1
2
  import type { RefMeta } from '../broker-protocol.js';
2
3
  import type { BrokerSession } from './read-ops.js';
3
4
  /**
@@ -13,7 +14,7 @@ export type MemoryRefGuidance = {
13
14
  refs(): RefMeta[];
14
15
  /** The hidden guidance text for a human frame's verbatim text, or `null`. */
15
16
  guidanceFor(text: string): string | null;
16
- /** Drop the memo AND the shared substrate parse cache it reads through. */
17
- invalidate(): void;
17
+ /** Refresh the inventory after a successful session reload. */
18
+ invalidate(): Promise<void>;
18
19
  };
19
- export declare function createMemoryRefGuidance(session: () => BrokerSession): MemoryRefGuidance;
20
+ export declare function createMemoryRefGuidance(session: () => BrokerSession, nodeId: string, initial: BrokerMemoryRefsDTO): MemoryRefGuidance;
@@ -1 +1 @@
1
- var l=Object.defineProperty;var r=(n,e)=>l(n,"name",{value:e,configurable:!0});import{emitEvent as m}from"../../events/emit.js";import{buildRefInventory as u}from"../../memory/inline-ref-inventory.js";import{buildGuidance as a}from"../../memory/inline-ref-guidance.js";import{clearSessionCache as f}from"../../substrate/session-cache.js";import{isLeadingEngineCommand as c}from"./engine-routing.js";function b(n){let e=null;const i=r(()=>(e===null&&(e=u()),e),"inventory");return{refs:r(()=>i().refs,"refs"),guidanceFor(o){try{return c(o,n())?null:a(o,i().names)}catch(t){return m({level:"warn",event:"broker.memory_refs.guidance_resolve_failed",error:t}),null}},invalidate(){e=null,f()}}}r(b,"createMemoryRefGuidance");export{b as createMemoryRefGuidance};
1
+ var i=Object.defineProperty;var t=(r,n)=>i(r,"name",{value:n,configurable:!0});import{emitEvent as s}from"../../events/emit.js";import{brokerMemoryRefs as f}from"./daemon-ops.js";import{buildGuidance as u}from"../../memory/inline-ref-guidance.js";import{isLeadingEngineCommand as c}from"./engine-routing.js";function g(r,n,m){let o={refs:m.refs,names:new Set(m.names)};return{refs:t(()=>o.refs,"refs"),guidanceFor(e){try{return c(e,r())?null:u(e,o.names)}catch(a){return s({level:"warn",event:"broker.memory_refs.guidance_resolve_failed",error:a}),null}},async invalidate(){const e=await f(n);o={refs:e.refs,names:new Set(e.names)}}}}t(g,"createMemoryRefGuidance");export{g as createMemoryRefGuidance};
@@ -1 +1 @@
1
- var h=Object.defineProperty;var g=(n,d)=>h(n,"name",{value:d,configurable:!0});import{SessionListCache as k}from"../session-list-cache.js";import{sessionListCachePath as p}from"../../canvas/paths.js";import{engineLeadingCommandTokens as y}from"./engine-routing.js";import{buildCommandList as _,buildGetTreeData as T,buildListMemoryRefsData as l,buildListModelsData as E,buildScopedModelsData as S,buildSessionsData as F,buildSettingsData as L}from"./read-ops.js";function R(n){const{registry:d,replies:i,session:o,boundaryReviewId:m,memoryRefs:u,formatExactModelSpec:b}=n,t=new k(p());return t.prewarm(o().sessionManager.getSessionDir()),(s,r)=>{switch(r.type){case"get_commands":{try{i.ackTo(s,"get_commands",!0,JSON.stringify(_(o())))}catch(e){i.engineErrorTo(s)(e)}break}case"list_models":{try{d.sendFrame(s,E(r.id,o()))}catch(e){i.engineErrorTo(s,r.id)(e)}break}case"list_scoped_models":{try{d.sendFrame(s,S(r.id,o()))}catch(e){i.engineErrorTo(s,r.id)(e)}break}case"list_memory_refs":{try{d.sendFrame(s,l(r.id,u.refs(),y(o())))}catch(e){i.engineErrorTo(s,r.id)(e)}break}case"get_tree":{try{d.sendFrame(s,T(r.id,o(),m))}catch(e){i.engineErrorTo(s,r.id)(e)}break}case"get_settings":{try{d.sendFrame(s,L(r.id,o()))}catch(e){i.engineErrorTo(s,r.id)(e)}break}case"list_sessions":{F(r.id,r.scope??"cwd",o(),t).then(e=>d.sendFrame(s,e)).catch(i.engineErrorTo(s,r.id));break}case"get_human_fork_coordinates":{try{const e=o().sessionManager,a=e.getSessionFile(),c=e.getLeafId();if(a===void 0||a===""||c===null){i.engineErrorTo(s,r.id)(new Error("no persisted source session leaf"));break}d.sendFrame(s,{type:"data",id:r.id,kind:"human_fork_coordinates",sourceFile:a,sourceSessionId:e.getSessionId(),leafId:c,modelSpec:b(o().model,o().thinkingLevel)})}catch(e){i.engineErrorTo(s,r.id)(e)}break}}}}g(R,"createReadHandler");export{R as createReadHandler};
1
+ var h=Object.defineProperty;var c=(t,d)=>h(t,"name",{value:d,configurable:!0});import{SessionListCache as k}from"../session-list-cache.js";import{sessionListCachePath as y}from"../../canvas/paths.js";import{engineLeadingCommandTokens as _}from"./engine-routing.js";import{buildCommandList as p,buildGetTreeData as T,buildListMemoryRefsData as l,buildListModelsData as E,buildScopedModelsData as S,buildSessionsData as F,buildSettingsData as L}from"./read-ops.js";function R(t){const{registry:d,replies:o,session:i,boundaryReviewId:g,memoryRefs:m,formatExactModelSpec:u}=t,b=new k(y());return(s,r)=>{switch(r.type){case"get_commands":{try{o.ackTo(s,"get_commands",!0,JSON.stringify(p(i())))}catch(e){o.engineErrorTo(s)(e)}break}case"list_models":{try{d.sendFrame(s,E(r.id,i()))}catch(e){o.engineErrorTo(s,r.id)(e)}break}case"list_scoped_models":{try{d.sendFrame(s,S(r.id,i()))}catch(e){o.engineErrorTo(s,r.id)(e)}break}case"list_memory_refs":{try{d.sendFrame(s,l(r.id,m.refs(),_(i())))}catch(e){o.engineErrorTo(s,r.id)(e)}break}case"get_tree":{try{d.sendFrame(s,T(r.id,i(),g))}catch(e){o.engineErrorTo(s,r.id)(e)}break}case"get_settings":{try{d.sendFrame(s,L(r.id,i()))}catch(e){o.engineErrorTo(s,r.id)(e)}break}case"list_sessions":{F(r.id,r.scope??"cwd",i(),b).then(e=>d.sendFrame(s,e)).catch(o.engineErrorTo(s,r.id));break}case"get_human_fork_coordinates":{try{const e=i().sessionManager,n=e.getSessionFile(),a=e.getLeafId();if(n===void 0||n===""||a===null){o.engineErrorTo(s,r.id)(new Error("no persisted source session leaf"));break}d.sendFrame(s,{type:"data",id:r.id,kind:"human_fork_coordinates",sourceFile:n,sourceSessionId:e.getSessionId(),leafId:a,modelSpec:u(i().model,i().thinkingLevel)})}catch(e){o.engineErrorTo(s,r.id)(e)}break}}}}c(R,"createReadHandler");export{R as createReadHandler};
@@ -1,4 +1,4 @@
1
1
  var m=Object.defineProperty;var h=(i,a)=>m(i,"name",{value:a,configurable:!0});import{execFile as k}from"node:child_process";import{existsSync as y,readFileSync as w,unlinkSync as T,writeFileSync as S}from"node:fs";import{tmpdir as x}from"node:os";import{join as v}from"node:path";import{captureSessionChatCapabilities as I}from"../command-surface.js";import{isPreBoundaryReviewEntry as g}from"./frame-replies.js";function E(i){if(i===null||typeof i!="object")return!1;const a=i;return a.type==="custom_message"&&a.display===!1||a.type==="message"&&a.message?.role==="custom"&&a.message.display===!1}h(E,"isHiddenJsonlBranchEntry");function R(i){const r=w(i,"utf8").split(`
2
2
  `).filter(f=>f!=="");if(r.length===0)return;const[l,...o]=r;let d=null;const p=[];for(const f of o){const e=JSON.parse(f);E(e)||(p.push(JSON.stringify({...e,parentId:d})),typeof e.id=="string"&&(d=e.id))}S(i,`${[l,...p].join(`
3
3
  `)}
4
- `)}h(R,"stripHiddenEntriesFromJsonlExport");function j(i){const{registry:a,replies:r,rebind:l,session:o,boundaryReviewId:d,memoryRefs:p,reWelcomeAll:f}=i;return(e,n)=>{switch(n.type){case"navigate_tree":{if(r.notWritable(e,"navigate the session tree"))break;if(g(o(),d,n.targetId)){r.reviewBoundaryRefusalTo(e,n.targetId);break}o().navigateTree(n.targetId,n.options).then(t=>{t.cancelled||f(),r.ackTo(e,"navigate_tree",!t.cancelled,t.editorText)}).catch(r.engineErrorTo(e));break}case"reload":{if(r.notWritable(e,"reload"))break;o().reload({beforeSessionStart:h(()=>I(o()),"beforeSessionStart")}).then(()=>{const t=o().agent;t&&(t.steeringMode="all",t.followUpMode="all"),p.invalidate(),a.forEachHelloed(s=>{s.role==="observer"&&a.sendFrame(s,{type:"resources_reloaded"})}),r.ackTo(e,"reload")}).catch(r.engineErrorTo(e));break}case"export":{if(r.notWritable(e,"export the session"))break;if(n.format==="jsonl")try{const t=o().exportToJsonl(n.path);R(t),r.ackTo(e,"export")}catch(t){r.engineErrorTo(e)(t)}else o().exportToHtml(n.path).then(()=>r.ackTo(e,"export")).catch(r.engineErrorTo(e));break}case"new_session":{if(r.notWritable(e,"start a new session"))break;l.runReplacement(e,"new_session",t=>t.newSession());break}case"switch_session":{if(r.notWritable(e,"switch sessions"))break;l.runReplacement(e,"switch_session",t=>t.switchSession(n.path));break}case"fork":{if(r.notWritable(e,"fork the session"))break;if(g(o(),d,n.entryId)){r.reviewBoundaryRefusalTo(e,n.entryId);break}l.runReplacement(e,"fork",t=>t.fork(n.entryId));break}case"clone":{if(r.notWritable(e,"clone the session"))break;l.runReplacement(e,"clone",async t=>{const s=o().sessionManager,c=s.getLeafId();if(c===null)return{cancelled:!0,detail:"no current leaf to clone from"};const u=s.createBranchedSession(c);return u===void 0?{cancelled:!0,detail:"createBranchedSession returned no path"}:t.switchSession(u)});break}case"share":{if(r.notWritable(e,"share the session"))break;const t=v(x(),`pi-share-${Date.now()}.html`);o().exportToHtml(t).then(()=>new Promise((s,c)=>{k("gh",["gist","create","--secret",t],{timeout:3e4,maxBuffer:1024*1024},(u,b)=>{try{y(t)&&T(t)}catch{}if(u){c(u);return}s(b.trim())})})).then(s=>{r.ackTo(e,"share",!0,s)}).catch(s=>{const c=String(s?.message??s);r.ackTo(e,"share",!1,c.includes("not found")||c.includes("gh: command not found")||c.includes("ENOENT")?"`gh` CLI not found \u2014 install GitHub CLI and authenticate with `gh auth login`":`share failed: ${c}`)});break}}}}h(j,"createSessionHandler");export{j as createSessionHandler,E as isHiddenJsonlBranchEntry,R as stripHiddenEntriesFromJsonlExport};
4
+ `)}h(R,"stripHiddenEntriesFromJsonlExport");function j(i){const{registry:a,replies:r,rebind:l,session:o,boundaryReviewId:d,memoryRefs:p,reWelcomeAll:f}=i;return(e,n)=>{switch(n.type){case"navigate_tree":{if(r.notWritable(e,"navigate the session tree"))break;if(g(o(),d,n.targetId)){r.reviewBoundaryRefusalTo(e,n.targetId);break}o().navigateTree(n.targetId,n.options).then(t=>{t.cancelled||f(),r.ackTo(e,"navigate_tree",!t.cancelled,t.editorText)}).catch(r.engineErrorTo(e));break}case"reload":{if(r.notWritable(e,"reload"))break;o().reload({beforeSessionStart:h(()=>I(o()),"beforeSessionStart")}).then(()=>{const t=o().agent;return t&&(t.steeringMode="all",t.followUpMode="all"),p.invalidate().then(()=>{a.forEachHelloed(s=>{s.role==="observer"&&a.sendFrame(s,{type:"resources_reloaded"})}),r.ackTo(e,"reload")})}).catch(r.engineErrorTo(e));break}case"export":{if(r.notWritable(e,"export the session"))break;if(n.format==="jsonl")try{const t=o().exportToJsonl(n.path);R(t),r.ackTo(e,"export")}catch(t){r.engineErrorTo(e)(t)}else o().exportToHtml(n.path).then(()=>r.ackTo(e,"export")).catch(r.engineErrorTo(e));break}case"new_session":{if(r.notWritable(e,"start a new session"))break;l.runReplacement(e,"new_session",t=>t.newSession());break}case"switch_session":{if(r.notWritable(e,"switch sessions"))break;l.runReplacement(e,"switch_session",t=>t.switchSession(n.path));break}case"fork":{if(r.notWritable(e,"fork the session"))break;if(g(o(),d,n.entryId)){r.reviewBoundaryRefusalTo(e,n.entryId);break}l.runReplacement(e,"fork",t=>t.fork(n.entryId));break}case"clone":{if(r.notWritable(e,"clone the session"))break;l.runReplacement(e,"clone",async t=>{const s=o().sessionManager,c=s.getLeafId();if(c===null)return{cancelled:!0,detail:"no current leaf to clone from"};const u=s.createBranchedSession(c);return u===void 0?{cancelled:!0,detail:"createBranchedSession returned no path"}:t.switchSession(u)});break}case"share":{if(r.notWritable(e,"share the session"))break;const t=v(x(),`pi-share-${Date.now()}.html`);o().exportToHtml(t).then(()=>new Promise((s,c)=>{k("gh",["gist","create","--secret",t],{timeout:3e4,maxBuffer:1024*1024},(u,b)=>{try{y(t)&&T(t)}catch{}if(u){c(u);return}s(b.trim())})})).then(s=>{r.ackTo(e,"share",!0,s)}).catch(s=>{const c=String(s?.message??s);r.ackTo(e,"share",!1,c.includes("not found")||c.includes("gh: command not found")||c.includes("ENOENT")?"`gh` CLI not found \u2014 install GitHub CLI and authenticate with `gh auth login`":`share failed: ${c}`)});break}}}}h(j,"createSessionHandler");export{j as createSessionHandler,E as isHiddenJsonlBranchEntry,R as stripHiddenEntriesFromJsonlExport};
@@ -1,5 +1,7 @@
1
1
  export declare const HELD_DEFERRED_INBOX_PROMPT_JOIN: unique symbol;
2
2
  export declare const BROKER_IDLE_TURN_START: unique symbol;
3
+ export declare const BROKER_RUN_TURN_BUSY: unique symbol;
4
+ export declare function brokerRunTurnBusy(): boolean;
3
5
  export type HeldDeferredInboxPromptJoin = (session: {
4
6
  sendCustomMessage: (message: {
5
7
  customType: string;
@@ -9,5 +11,5 @@ export type HeldDeferredInboxPromptJoin = (session: {
9
11
  }) => Promise<void>;
10
12
  export declare function heldDeferredInboxPromptJoin(): HeldDeferredInboxPromptJoin | undefined;
11
13
  /** Starts an inbox-delivered idle turn through the broker's admission gate. */
12
- export type BrokerIdleTurnStart = (text: string) => void;
14
+ export type BrokerIdleTurnStart = (text: string, messageIds?: string[]) => void;
13
15
  export declare function brokerIdleTurnStart(): BrokerIdleTurnStart | undefined;
@@ -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"),i=Symbol.for("@crouton-kit/crtr:broker-idle-turn-start");function f(){const o=globalThis[e];return typeof o=="function"?o:void 0}r(f,"heldDeferredInboxPromptJoin");function u(){const o=globalThis[i];return typeof o=="function"?o:void 0}r(u,"brokerIdleTurnStart");export{i as BROKER_IDLE_TURN_START,e as HELD_DEFERRED_INBOX_PROMPT_JOIN,u as brokerIdleTurnStart,f 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"),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,5 +1,4 @@
1
1
  import type { MailEntryDTO } from '../../../api/dto/mail.js';
2
- import type { BrokerReportNodeDTO } from '../../../api/dto/broker-ops.js';
3
2
  export type BrokerInboxEntryId = string;
4
3
  export type BrokerInboxEntry = MailEntryDTO;
5
4
  /** The node id a canonical report ref points at, or undefined when the ref is
@@ -23,4 +22,4 @@ export interface InboxDelivery {
23
22
  entries: readonly BrokerInboxEntry[];
24
23
  }
25
24
  /** Keep each person's words separate and in order; fold preceding deferred context into that same input. */
26
- export declare function coalesceBrokerInbox(entries: readonly BrokerInboxEntry[], reportNodes: ReadonlyMap<string, BrokerReportNodeDTO>): readonly InboxDelivery[];
25
+ export declare function coalesceBrokerInbox(entries: readonly BrokerInboxEntry[]): readonly InboxDelivery[];
@@ -1,13 +1,10 @@
1
- var b=Object.defineProperty;var d=(n,t)=>b(n,"name",{value:t,configurable:!0});import{readFileSync as x}from"node:fs";import{nodeDir as g}from"../../canvas/paths.js";import{formatInboxCard as I,formatInboxRefInstruction as u}from"../../../shared/generated-context.js";import{renderBirthAnnouncementBody as $}from"../../../shared/birth-announcement.js";const l=12,a=1e3,k=1e3;function p(n){const t=typeof n.data?.body=="string"?String(n.data.body).trim():"";return t===""||t===n.label?"":t}d(p,"inlineBody");function y(n){let t=n,e=!1;const i=t.split(`
2
- `);return i.length>l&&(t=i.slice(0,l).join(`
3
- `),e=!0),t.length>a&&(t=t.slice(0,a),e=!0),{text:t.trimEnd(),clipped:e}}d(y,"clipBody");function A(n){if(n===void 0||n.startsWith("/"))return;const t=n.indexOf(":");if(t<=0)return;const e=n.slice(t+1);if(!(!e.startsWith("reports/")||e.includes("..")||e.startsWith("/")))return n.slice(0,t)}d(A,"reportRefNodeId");function B(n){if(!n.startsWith(`---
4
- `))return n;const t=n.indexOf(`
5
- ---
6
- `,4);return t===-1?n:n.slice(t+5)}d(B,"stripFrontmatter");function R(n,t){const e=A(n.ref);if(e===void 0||!t.has(e))return null;const i=n.ref.slice(n.ref.indexOf(":")+1);try{const c=B(x(`${g(e)}/${i}`,"utf8"));return c.length>=k?null:c}catch{return null}}d(R,"inlineReport");function _(n,t){const e=$(n.data,n.ts);if(e!==null)return e;const i=R(n,t);if(i!==null)return`${i.trimEnd()}
1
+ var h=Object.defineProperty;var s=(n,t)=>h(n,"name",{value:t,configurable:!0});import{formatInboxCard as m,formatInboxRefInstruction as f}from"../../../shared/generated-context.js";import{renderBirthAnnouncementBody as b}from"../../../shared/birth-announcement.js";const u=12,a=1e3,x=1e3;function g(n){const t=typeof n.data?.body=="string"?String(n.data.body).trim():"";return t===""||t===n.label?"":t}s(g,"inlineBody");function y(n){let t=n,r=!1;const d=t.split(`
2
+ `);return d.length>u&&(t=d.slice(0,u).join(`
3
+ `),r=!0),t.length>a&&(t=t.slice(0,a),r=!0),{text:t.trimEnd(),clipped:r}}s(y,"clipBody");function k(n){if(n===void 0||n.startsWith("/"))return;const t=n.indexOf(":");if(t<=0)return;const r=n.slice(t+1);if(!(!r.startsWith("reports/")||r.includes("..")||r.startsWith("/")))return n.slice(0,t)}s(k,"reportRefNodeId");function A(n){if(k(n.ref)===void 0)return null;const t=n.data?.report_body;return typeof t=="string"&&t.length<x?t:null}s(A,"inlineReport");function B(n){const t=b(n.data,n.ts);if(t!==null)return t;const r=A(n);if(r!==null)return`${r.trimEnd()}
7
4
 
8
- ${u(n.ref)}`;const c=p(n);if(c==="")return n.ref===void 0?n.label:`${n.label}
5
+ ${f(n.ref)}`;const d=g(n);if(d==="")return n.ref===void 0?n.label:`${n.label}
9
6
 
10
- ${u(n.ref)}`;const{text:r,clipped:o}=y(c);return n.ref!==void 0?`${r}
7
+ ${f(n.ref)}`;const{text:e,clipped:i}=y(d);return n.ref!==void 0?`${e}
11
8
 
12
- ${u(n.ref)}`:o?`${r}
13
- \u2026 (body clipped)`:r}d(_,"entryBody");function E(n,t){return{kind:n.kind,body:_(n,t),...n.ref===void 0?{}:{ref:n.ref},...n.disposition===void 0?{}:{disposition:n.disposition}}}d(E,"cardEntry");function h(n){const t=n.data?.cards;return Array.isArray(t)?t.filter(e=>typeof e=="string"):[]}d(h,"entryCards");function W(n,t){const e=[];let i=[];const c=d(()=>{if(i.length===0)return;const r=new Map;for(const s of i){const f=s.from??"system";r.has(f)||r.set(f,[]),r.get(f).push(s)}const o=[...r].map(([s,f])=>({id:s,entries:f.map(m=>E(m,t))}));e.push({kind:"card",text:I(o),cards:i.flatMap(s=>h(s)),entries:i}),i=[]},"flushRun");for(const r of n){if((r.from??"system")!=="human"){i.push(r);continue}c();const o=p(r);e.push({kind:"human",text:o===""?r.label:o,cards:h(r),entries:[r]})}c();for(let r=e.length-2;r>=0;r-=1){const o=e[r],s=e[r+1];o.kind!=="card"||s.kind!=="human"||o.entries.every(f=>f.tier==="deferred")&&(e[r]={...s,cards:[...o.cards,o.text,...s.cards],entries:[...o.entries,...s.entries]},e.splice(r+1,1))}return e}d(W,"coalesceBrokerInbox");export{W as coalesceBrokerInbox,h as entryCards,A as reportRefNodeId};
9
+ ${f(n.ref)}`:i?`${e}
10
+ \u2026 (body clipped)`:e}s(B,"entryBody");function I(n){return{kind:n.kind,body:B(n),...n.ref===void 0?{}:{ref:n.ref},...n.disposition===void 0?{}:{disposition:n.disposition}}}s(I,"cardEntry");function l(n){const t=n.data?.cards;return Array.isArray(t)?t.filter(r=>typeof r=="string"):[]}s(l,"entryCards");function E(n){const t=[];let r=[];const d=s(()=>{if(r.length===0)return;const e=new Map;for(const o of r){const c=o.from??"system";e.has(c)||e.set(c,[]),e.get(c).push(o)}const i=[...e].map(([o,c])=>({id:o,entries:c.map(p=>I(p))}));t.push({kind:"card",text:m(i),cards:r.flatMap(o=>l(o)),entries:r}),r=[]},"flushRun");for(const e of n){if((e.from??"system")!=="human"){r.push(e);continue}d();const i=e.data?.body;t.push({kind:"human",text:typeof i=="string"?i:e.label,cards:l(e),entries:[e]})}d();for(let e=t.length-2;e>=0;e-=1){const i=t[e],o=t[e+1];i.kind!=="card"||o.kind!=="human"||i.entries.every(c=>c.tier==="deferred")&&(t[e]={...o,cards:[...i.cards,i.text,...o.cards],entries:[...i.entries,...o.entries]},t.splice(e+1,1))}return t}s(E,"coalesceBrokerInbox");export{E as coalesceBrokerInbox,l as entryCards,k as reportRefNodeId};
@@ -0,0 +1,9 @@
1
+ import { type AssistantMessageEventStream, type Context, type Model, type ModelsSimpleStreamOptions } from '@earendil-works/pi-ai';
2
+ import type { ModelRuntime } from '@earendil-works/pi-coding-agent';
3
+ /** Pi uses availability and auth for its model controls; only the daemon can
4
+ * decide whether a route has credentials. Keep the broker's metadata selectable. */
5
+ export declare function configureBrokerModelRuntime(runtime: ModelRuntime): void;
6
+ export declare const LLM_BROKER_RETRY_WINDOW_S = 300;
7
+ export declare const LLM_REFUSAL_DIAGNOSTIC = "crtr:llm-refusal";
8
+ /** One pi stream, backed exclusively by the authenticated daemon llm route. */
9
+ export declare function streamBrokerModel(model: Model<any>, context: Context, options?: ModelsSimpleStreamOptions): AssistantMessageEventStream;
@@ -0,0 +1,2 @@
1
+ var O=Object.defineProperty;var g=(t,o)=>O(t,"name",{value:o,configurable:!0});import{setTimeout as N}from"node:timers/promises";import{createAssistantMessageEventStream as A,getCurrentSystemPrompt as L,getCurrentTools as P}from"@earendil-works/pi-ai";import{socketFetch as W}from"../../../api/node-transport.js";import{apiSocketPath as $}from"../../canvas/paths.js";import{currentNodeToken as B}from"./node-token.js";import{envModelExact as S,envModelIntent as D}from"../../../shared/env.js";import{modelRequestFromConfig as j}from"../../model-routes.js";function X(t){t.checkAuth=async o=>t.getProvider(o)?{type:"api_key"}:void 0,t.getAvailable=async o=>t.getModels(o),t.getAvailableSnapshot=()=>t.getModels(),t.streamSimple=q}g(X,"configureBrokerModelRuntime");const M=300,F="crtr:llm-refusal";class x extends Error{static{g(this,"LlmRefusalError")}}function T(t){return typeof t=="string"?t:t.map(o=>o.type==="text"?{type:"text",text:o.text}:{type:"image_url",image_url:{url:`data:${o.mimeType};base64,${o.data}`}})}g(T,"wireContent");function J(t,o,c){const r=[],e=L(o.messages),u=P(o.messages);e?r.push({role:"system",content:e}):o.systemPrompt&&r.push({role:"system",content:o.systemPrompt});for(const a of o.messages)a.role==="user"?r.push({role:"user",content:T(a.content)}):a.role==="toolResult"?r.push({role:"tool",content:T(a.content),tool_call_id:a.toolCallId}):a.role==="assistant"&&r.push({role:"assistant",content:a.content.filter(p=>p.type==="text").map(p=>p.text).join("")||null,tool_calls:a.content.filter(p=>p.type==="toolCall").map(p=>({id:p.id,type:"function",function:{name:p.name,arguments:JSON.stringify(p.arguments)}}))});const w=`${t.provider}/${t.id}`,y=D();return{model:j(w,y,S())?.kind==="logical"?y:w,model_policy:S()?"exact":"substitute",stream:!0,messages:r,...u.length?{tools:u.map(a=>({type:"function",function:{name:a.name,description:a.description,parameters:a.parameters}}))}:{},...c.reasoning?{reasoning_effort:c.reasoning}:{},...c.temperature!==void 0?{temperature:c.temperature}:{},...c.maxTokens!==void 0?{max_tokens:c.maxTokens}:{}}}g(J,"requestBody");function C(t){if(!t||typeof t!="object"||!("error"in t))throw new Error("llm returned an invalid response");const o=t.error;if(!o||typeof o.message!="string")throw new Error("llm returned an invalid refusal");return o}g(C,"parseRefusal");function q(t,o,c={}){const r=A(),e={role:"assistant",content:[],api:t.api,provider:t.provider,model:t.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 u=B();if(!u)throw new Error("llm requires a node token");const w=JSON.stringify(J(t,o,c));let y=0;for(;;){c.signal?.throwIfAborted();const a=await W($())("http://localhost/v1/llm",{method:"POST",headers:{authorization:`Bearer ${u}`,"content-type":"application/json"},body:w,signal:c.signal});if(!a.ok){const l=C(await a.json());if(l.retryable!==!0)throw new x(l.message);const n=l.retry_after_s;if(typeof n!="number"||!Number.isFinite(n)||n<=0)throw new Error(l.message);const d=M-y;if(d<=0)throw new x(l.message);const i=Math.min(n,d);if(await N(i*1e3,void 0,{signal:c.signal}),y+=i,i<n||y>=M)throw new x(l.message);continue}if(!a.body)throw new Error("llm returned no stream");r.push({type:"start",partial:e});const p=a.body.getReader(),v=new TextDecoder;let f="",_="stop",E,R=!1,b=!1;const I=g(l=>{const n=JSON.parse(l);if(n.error)throw new Error(C(n).message);if(n.served_model){b=!0;const s=n.served_model.indexOf("/");if(s<1)throw new Error("llm returned an invalid served_model");e.provider=n.served_model.slice(0,s),e.model=n.served_model.slice(s+1)}const d=n.choices?.[0],i=d?.delta;if(i?.reasoning_content){const s=e.content.findIndex(k=>k.type==="thinking"),m=s<0?{type:"thinking",thinking:""}:e.content[s],h=s<0?e.content.push(m)-1:s;if(s<0&&r.push({type:"thinking_start",contentIndex:h,partial:e}),m.type!=="thinking")throw new Error("invalid thinking block");m.thinking+=i.reasoning_content,r.push({type:"thinking_delta",contentIndex:h,delta:i.reasoning_content,partial:e})}if(i?.content){const s=e.content.findIndex(k=>k.type==="text"),m=s<0?{type:"text",text:""}:e.content[s],h=s<0?e.content.push(m)-1:s;if(s<0&&r.push({type:"text_start",contentIndex:h,partial:e}),m.type!=="text")throw new Error("invalid text block");m.text+=i.content,r.push({type:"text_delta",contentIndex:h,delta:i.content,partial:e})}for(const s of i?.tool_calls??[]){const m={type:"toolCall",id:s.id,name:s.function.name,arguments:JSON.parse(s.function.arguments)},h=e.content.push(m)-1;r.push({type:"toolcall_start",contentIndex:h,partial:e}),r.push({type:"toolcall_end",contentIndex:h,toolCall:m,partial:e})}d?.finish_reason&&(_=d.finish_reason),d?.message?.refusal&&(E=d.message.refusal),n.usage&&(R=!0,e.usage={input:n.usage.prompt_tokens,output:n.usage.completion_tokens,cacheRead:n.usage.cache_read_tokens,cacheWrite:n.usage.cache_write_tokens,totalTokens:n.usage.total_tokens,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}})},"apply");for(;;){const{value:l,done:n}=await p.read();if(n)break;f+=v.decode(l,{stream:!0});let d;for(;(d=f.indexOf(`
2
+ `))>=0;){const i=f.slice(0,d).trim();f=f.slice(d+1),i&&I(i)}}if(f+=v.decode(),f.trim()&&I(f.trim()),!R||!b)throw new Error("llm stream ended without usage or served_model");for(const[l,n]of e.content.entries())n.type==="text"&&r.push({type:"text_end",contentIndex:l,content:n.text,partial:e}),n.type==="thinking"&&r.push({type:"thinking_end",contentIndex:l,content:n.thinking,partial:e});if(_==="content_filter")throw new Error(E??"Content filtered");if(!["stop","tool_calls","length"].includes(_))throw new Error(`llm returned unknown finish reason: ${_}`);e.stopReason=_==="tool_calls"?"toolUse":_==="length"?"length":"stop",r.push({type:"done",reason:e.stopReason,message:e}),r.end();return}})().catch(u=>{e.stopReason=c.signal?.aborted?"aborted":"error",e.errorMessage=u instanceof Error?u.message:String(u),u instanceof x&&(e.diagnostics=[{type:F,timestamp:Date.now()}]),r.push({type:"error",reason:e.stopReason,error:e}),r.end()}),r}g(q,"streamBrokerModel");export{M as LLM_BROKER_RETRY_WINDOW_S,F as LLM_REFUSAL_DIAGNOSTIC,X as configureBrokerModelRuntime,q as streamBrokerModel};
@@ -0,0 +1,3 @@
1
+ /** fd 3 is a one-shot pipe from the daemon, not a file or an environment value. */
2
+ export declare function receiveNodeToken(): Promise<string>;
3
+ export declare function currentNodeToken(): string | undefined;
@@ -0,0 +1 @@
1
+ var c=Object.defineProperty;var n=(r,e)=>c(r,"name",{value:e,configurable:!0});import{createReadStream as u}from"node:fs";let o=null;async function i(){if(o!==null)throw new Error("node token was already received");const r=[];for await(const t of u("",{fd:3,autoClose:!0}))r.push(Buffer.from(t));const e=Buffer.concat(r).toString("utf8");if(!/^[A-Za-z0-9_-]{43}$/.test(e))throw new Error("broker received an invalid node token");return o=e,e}n(i,"receiveNodeToken");function d(){return o??void 0}n(d,"currentNodeToken");export{d as currentNodeToken,i as receiveNodeToken};
@@ -1 +1 @@
1
- var p=Object.defineProperty;var a=(n,t)=>p(n,"name",{value:t,configurable:!0});import{ModelRegistry as f}from"@earendil-works/pi-coding-agent";import{boundaryRootedTree as h}from"../session-visibility.js";import{isUnknownModel as M}from"../model-selection.js";import{BUILTIN_SLASH_COMMANDS as b,piSessionsRoot as y}from"../pi-vendored.js";import{isDeterministicCommandExpansion as k}from"../command-expansion.js";import{registrationChatSurface as T,templateChatSurface as S}from"../command-surface.js";function m(n){return new f(n.modelRuntime)}a(m,"registryOf");const u=a(n=>n===void 0||M(n)?null:{provider:n.provider,id:n.id},"toModelRef"),C=a(n=>`${n.provider}/${n.id}`,"modelKey");function R(n){const t=[];for(const e of b)t.push({name:e.name,description:e.description,source:"builtin",gatewayCapable:!1});try{for(const e of n.extensionRunner.getRegisteredCommands()){const o=e.expansion;t.push({name:e.invocationName,description:e.description??"",source:"command",...k(o)?{expansion:o}:{},...T(e)})}}catch{}try{for(const e of n.promptTemplates)t.push({name:e.name,description:e.description,source:"template",template:e.content,...S(e)})}catch{}return t}a(R,"buildCommandList");function A(n,t,e){return{type:"data",id:n,kind:"list_memory_refs",refs:t,engineLeadingCommandNames:e}}a(A,"buildListMemoryRefsData");function P(n,t){const e=m(t);let o=[];try{o=e.getAvailable().map(C)}catch{}return{type:"data",id:n,kind:"list_models",models:e.getAll(),current:u(t.model),availableIds:o,scopedModels:t.scopedModels.map(r=>({model:r.model,thinkingLevel:r.thinkingLevel})),enabledModelIds:t.settingsManager.getEnabledModels()??null}}a(P,"buildListModelsData");function _(n,t){return{type:"data",id:n,kind:"list_scoped_models",allModels:m(t).getAll(),enabledModelIds:t.settingsManager.getEnabledModels()??null}}a(_,"buildScopedModelsData");function F(n,t,e){const o=t.sessionManager,r=e!==void 0?h(o.getTree(),e):o.getTree(),l=new Set,i=a(s=>{for(const c of s)l.add(c.entry.id),i(c.children)},"collectEntryIds");i(r);const g=t.getUserMessagesForForking().filter(s=>l.has(s.entryId)).map(s=>({id:s.entryId,text:s.text,timestamp:o.getEntry(s.entryId)?.timestamp})),d=o.getLeafId();return{type:"data",id:n,kind:"get_tree",tree:r,currentLeafId:d!==null&&l.has(d)?d:null,forkPoints:g}}a(F,"buildGetTreeData");function O(n,t){const e=t.settingsManager;let o=[];try{o=t.resourceLoader.getThemes().themes.map(d=>d.name??"").filter(d=>d!=="")}catch{}const r=e.getDefaultProvider(),l=e.getDefaultModel();let i=[];try{i=t.modelRuntime.getAvailableSnapshot()}catch{}const g={autoCompact:t.autoCompactionEnabled,defaultModel:r&&l?`${r}/${l}`:"not set",availableDefaultModels:i,showImages:e.getShowImages(),imageWidthCells:e.getImageWidthCells(),autoResizeImages:e.getImageAutoResize(),blockImages:e.getBlockImages(),enableSkillCommands:e.getEnableSkillCommands(),steeringMode:t.steeringMode,followUpMode:t.followUpMode,transport:e.getTransport(),httpIdleTimeoutMs:e.getHttpIdleTimeoutMs(),thinkingLevel:t.thinkingLevel,availableThinkingLevels:t.getAvailableThinkingLevels(),modelThinkingLevels:e.getAllModelThinkingLevels(),currentTheme:e.getTheme()??"",terminalTheme:"dark",availableThemes:o,hideThinkingBlock:e.getHideThinkingBlock(),mermaidRenderingMode:e.getMermaidRenderingMode(),collapseChangelog:e.getCollapseChangelog(),enableInstallTelemetry:e.getEnableInstallTelemetry(),doubleEscapeAction:e.getDoubleEscapeAction(),treeFilterMode:e.getTreeFilterMode(),showHardwareCursor:e.getShowHardwareCursor(),editorPaddingX:e.getEditorPaddingX(),autocompleteMaxVisible:e.getAutocompleteMaxVisible(),quietStartup:e.getQuietStartup(),clearOnShrink:e.getClearOnShrink(),showTerminalProgress:e.getShowTerminalProgress(),tuiMode:e.getTuiMode(),fullscreenExitOutput:e.getFullscreenExitOutput(),fullscreenScrollbar:e.getFullscreenScrollbar(),fullscreenCopyOnSelect:e.getFullscreenCopyOnSelect(),warnings:e.getWarnings(),defaultProjectTrust:e.getDefaultProjectTrust(),showCacheMissNotices:e.getShowCacheMissNotices(),cacheWarmingMode:e.getCacheWarmingMode(),outputPad:e.getOutputPad(),autoRetry:t.autoRetryEnabled,model:u(t.model)};return{type:"data",id:n,kind:"get_settings",settings:g}}a(O,"buildSettingsData");function H(n,t,e,o){const l=e.sessionManager.getSessionDir();return(t==="all"?o.listAll(y()):o.listDir(l)).then(i=>({type:"data",id:n,kind:"list_sessions",scope:t,sessions:i,currentSessionFile:e.sessionFile}))}a(H,"buildSessionsData");export{R as buildCommandList,F as buildGetTreeData,A as buildListMemoryRefsData,P as buildListModelsData,_ as buildScopedModelsData,H as buildSessionsData,O as buildSettingsData,C as modelKey};
1
+ var p=Object.defineProperty;var a=(n,t)=>p(n,"name",{value:t,configurable:!0});import{ModelRegistry as f}from"@earendil-works/pi-coding-agent";import{boundaryRootedTree as h}from"../session-visibility.js";import{isUnknownModel as M}from"../model-selection.js";import{BUILTIN_SLASH_COMMANDS as b}from"../pi-vendored.js";import{isDeterministicCommandExpansion as y}from"../command-expansion.js";import{registrationChatSurface as k,templateChatSurface as T}from"../command-surface.js";function m(n){return new f(n.modelRuntime)}a(m,"registryOf");const u=a(n=>n===void 0||M(n)?null:{provider:n.provider,id:n.id},"toModelRef"),C=a(n=>`${n.provider}/${n.id}`,"modelKey");function D(n){const t=[];for(const e of b)t.push({name:e.name,description:e.description,source:"builtin",gatewayCapable:!1});try{for(const e of n.extensionRunner.getRegisteredCommands()){const o=e.expansion;t.push({name:e.invocationName,description:e.description??"",source:"command",...y(o)?{expansion:o}:{},...k(e)})}}catch{}try{for(const e of n.promptTemplates)t.push({name:e.name,description:e.description,source:"template",template:e.content,...T(e)})}catch{}return t}a(D,"buildCommandList");function A(n,t,e){return{type:"data",id:n,kind:"list_memory_refs",refs:t,engineLeadingCommandNames:e}}a(A,"buildListMemoryRefsData");function R(n,t){const e=m(t);let o=[];try{o=e.getAvailable().map(C)}catch{}return{type:"data",id:n,kind:"list_models",models:e.getAll(),current:u(t.model),availableIds:o,scopedModels:t.scopedModels.map(l=>({model:l.model,thinkingLevel:l.thinkingLevel})),enabledModelIds:t.settingsManager.getEnabledModels()??null}}a(R,"buildListModelsData");function P(n,t){return{type:"data",id:n,kind:"list_scoped_models",allModels:m(t).getAll(),enabledModelIds:t.settingsManager.getEnabledModels()??null}}a(P,"buildScopedModelsData");function _(n,t,e){const o=t.sessionManager,l=e!==void 0?h(o.getTree(),e):o.getTree(),r=new Set,s=a(d=>{for(const c of d)r.add(c.entry.id),s(c.children)},"collectEntryIds");s(l);const g=t.getUserMessagesForForking().filter(d=>r.has(d.entryId)).map(d=>({id:d.entryId,text:d.text,timestamp:o.getEntry(d.entryId)?.timestamp})),i=o.getLeafId();return{type:"data",id:n,kind:"get_tree",tree:l,currentLeafId:i!==null&&r.has(i)?i:null,forkPoints:g}}a(_,"buildGetTreeData");function F(n,t){const e=t.settingsManager;let o=[];try{o=t.resourceLoader.getThemes().themes.map(i=>i.name??"").filter(i=>i!=="")}catch{}const l=e.getDefaultProvider(),r=e.getDefaultModel();let s=[];try{s=t.modelRuntime.getAvailableSnapshot()}catch{}const g={autoCompact:t.autoCompactionEnabled,defaultModel:l&&r?`${l}/${r}`:"not set",availableDefaultModels:s,showImages:e.getShowImages(),imageWidthCells:e.getImageWidthCells(),autoResizeImages:e.getImageAutoResize(),blockImages:e.getBlockImages(),enableSkillCommands:e.getEnableSkillCommands(),steeringMode:t.steeringMode,followUpMode:t.followUpMode,transport:e.getTransport(),httpIdleTimeoutMs:e.getHttpIdleTimeoutMs(),thinkingLevel:t.thinkingLevel,availableThinkingLevels:t.getAvailableThinkingLevels(),modelThinkingLevels:e.getAllModelThinkingLevels(),currentTheme:e.getTheme()??"",terminalTheme:"dark",availableThemes:o,hideThinkingBlock:e.getHideThinkingBlock(),mermaidRenderingMode:e.getMermaidRenderingMode(),collapseChangelog:e.getCollapseChangelog(),enableInstallTelemetry:e.getEnableInstallTelemetry(),doubleEscapeAction:e.getDoubleEscapeAction(),treeFilterMode:e.getTreeFilterMode(),showHardwareCursor:e.getShowHardwareCursor(),editorPaddingX:e.getEditorPaddingX(),autocompleteMaxVisible:e.getAutocompleteMaxVisible(),quietStartup:e.getQuietStartup(),clearOnShrink:e.getClearOnShrink(),showTerminalProgress:e.getShowTerminalProgress(),tuiMode:e.getTuiMode(),fullscreenExitOutput:e.getFullscreenExitOutput(),fullscreenScrollbar:e.getFullscreenScrollbar(),fullscreenCopyOnSelect:e.getFullscreenCopyOnSelect(),warnings:e.getWarnings(),defaultProjectTrust:e.getDefaultProjectTrust(),showCacheMissNotices:e.getShowCacheMissNotices(),cacheWarmingMode:e.getCacheWarmingMode(),outputPad:e.getOutputPad(),autoRetry:t.autoRetryEnabled,model:u(t.model)};return{type:"data",id:n,kind:"get_settings",settings:g}}a(F,"buildSettingsData");function O(n,t,e,o){const l=e.sessionManager;return(t==="all"?o.listAll():o.listDir(l.getCwd())).then(r=>({type:"data",id:n,kind:"list_sessions",scope:t,sessions:r,currentSessionFile:e.sessionFile}))}a(O,"buildSessionsData");export{D as buildCommandList,_ as buildGetTreeData,A as buildListMemoryRefsData,R as buildListModelsData,P as buildScopedModelsData,O as buildSessionsData,F as buildSettingsData,C as modelKey};
@@ -39,6 +39,7 @@ type RebindDriverDeps = {
39
39
  }) => void;
40
40
  disposeAndExit: (reason: string, status?: number) => void;
41
41
  onSessionRebind: () => void;
42
+ onReplacementIdle?: () => void;
42
43
  reWelcomeAll: () => void;
43
44
  };
44
45
  /** Owns session subscription replacement, its serialization lane, and replacement admission policy. */
@@ -60,6 +61,7 @@ export declare class RebindDriver {
60
61
  services(): AgentSessionServices;
61
62
  installedGeneration(): SubscriptionGeneration | undefined;
62
63
  isAgentRunActive(): boolean;
64
+ isReplacing(): boolean;
63
65
  requestShutdown(): void;
64
66
  setRebindSession(): void;
65
67
  enqueueRebind(candidateSession: BrokerSession, candidateServices: AgentSessionServices): Promise<void>;
@@ -1 +1 @@
1
- var R=Object.defineProperty;var l=(a,e)=>R(a,"name",{value:e,configurable:!0});import{mkdirSync as v,writeFileSync as _}from"node:fs";import{join as A}from"node:path";import{jobDir as E}from"../../canvas/paths.js";import{emitEvent as u}from"../../events/emit.js";import{operationIdContext as c}from"../../events/operation-id.js";import{installPersonaTransitionGate as I}from"../broker-persona-guidance.js";import{abortSessionFromExtension as T}from"./extension-abort.js";import{brokerRecovery as w,mutateBrokerFault as S,mutateBrokerProviderRetry as x}from"./daemon-ops.js";const f=2,m=3e4,b=Symbol("replacement-deadline-exceeded"),P="(interrupted)",g=Symbol.for("crtr.trailing-thinking-guard");function V(a){for(let e=a.length-1;e>=0;e--){const t=a[e];if(t!==void 0){if(t.type==="text"){if(t.text.trim().length===0)continue;return t}if(t.type==="thinking"){const n=t.thinkingSignature,r=typeof n=="string"&&n.trim().length>0;if(t.redacted!==!0&&t.thinking.trim().length===0&&!r)continue;return t}return t}}}l(V,"lastSerializedBlock");function y(a){return a.map(e=>e.role!=="assistant"||V(e.content)?.type!=="thinking"?e:{...e,content:[...e.content,{type:"text",text:P}]})}l(y,"guardTrailingThinking");function N(a){const e=a.convertToLlm;if(e[g]===!0)return;const t=l(n=>{const r=e(n);return r instanceof Promise?r.then(y):y(r)},"wrapped");t[g]=!0,a.convertToLlm=t}l(N,"installTrailingThinkingGuard");class O{static{l(this,"RebindDriver")}deps;sessionValue;servicesValue;unsubscribe;installed;nextSubscriptionGeneration=0;rebindTail=Promise.resolve();latestRebindRequest=0;replacementTail=Promise.resolve();admittedReplacements=0;agentRunActiveValue=!1;shutdownRequested=!1;constructor(e){this.deps=e,this.sessionValue=e.session,this.servicesValue=e.services}session(){return this.sessionValue}services(){return this.servicesValue}installedGeneration(){return this.installed}isAgentRunActive(){return this.agentRunActiveValue}requestShutdown(){if(!this.agentRunActiveValue){this.deps.disposeAndExit("shutdown-hook");return}this.shutdownRequested=!0}setRebindSession(){this.deps.runtime?.setRebindSession(e=>this.enqueueRebind(e,this.deps.runtime.services))}enqueueRebind(e,t){const n=++this.latestRebindRequest,r=this.rebindTail.then(async()=>{if(n!==this.latestRebindRequest)return;if(this.installed!==void 0){typeof this.sessionValue.sessionFile=="string"&&this.sessionValue.sessionFile!==""&&await x(this.deps.nodeId,{op:"invalidate",session_id:this.sessionValue.sessionManager.getSessionId()});const s=(await w(this.deps.nodeId)).fault;s?.link==="pi\u2192provider"&&s.retry.disposition==="auto"&&s.retry.by==="daemon"&&await S(this.deps.nodeId,{op:"clear",link:"pi\u2192provider",preserve_episode:!0})}if(this.installed?.executingTools.clear(),this.removeInstalledSubscription(),this.deps.setActiveSession(e),this.deps.projection().reset(),this.deps.faultRetry().reset(),this.agentRunActiveValue=!1,this.deps.onSessionRebind(),this.deps.toolGroups.resetForSession(),await e.bindExtensions({uiContext:this.deps.uiContext(),mode:"rpc",abortHandler:l(()=>T(e,()=>{const s=this.installed;s?.session===e&&(s.stagedRefreshAbort=!0)}),"abortHandler"),shutdownHandler:l(()=>this.requestShutdown(),"shutdownHandler")}),n!==this.latestRebindRequest)return;this.removeInstalledSubscription(),this.sessionValue=e,this.servicesValue=t;const d=e.agent;if(d&&(I(this.deps.nodeId,{agent:d,sessionManager:e.sessionManager},()=>this.deps.faultRetry().notePersonaGateFailure()),d.steeringMode="all",d.followUpMode="all",N(d)),this.deps.cfg.editorName!==void 0&&this.deps.cfg.editorName!=="")try{e.setSessionName(this.deps.cfg.editorName)}catch{}const o={id:++this.nextSubscriptionGeneration,session:e,fallback:{blocked:!1},stagedProviderAgentEnd:null,stagedWatchdogAbort:!1,stagedRefreshAbort:!1,stagedOverflowFailure:null,executingTools:new Set};this.unsubscribe=this.sessionValue.subscribe(s=>{if(!this.deps.projection().isCurrent(o))return;if(c.current()!==void 0){this.executeSubscriptionCallback(o,s);return}const i=o.fallback;if(s.type==="turn_start"&&i.storedId!==void 0){i.storedId=void 0,i.blocked=!0,c.fresh(()=>{u({level:"warn",event:"broker.turn.fallback_overlap",fields:{generation:o.id,engine_event:s.type}}),this.executeSubscriptionCallback(o,s)});return}if(s.type==="turn_start"&&!i.blocked){c.fresh(k=>{i.storedId=k,this.executeSubscriptionCallback(o,s)});return}const h=i.storedId;if(h!==void 0&&!i.blocked){c.run(h,()=>{this.executeSubscriptionCallback(o,s),s.type==="agent_settled"&&i.storedId===h&&(i.storedId=void 0)});return}this.executeSubscriptionCallback(o,s)}),this.installed=o,this.deps.projection().rearmIfStreaming(o),this.captureSystemPrompt(e)});return this.rebindTail=r.catch(()=>{}),r}runReplacement(e,t,n){const r=this.deps.runtime;if(r===void 0){this.deps.registry.sendFrame(e,{type:"error",code:"engine_error",message:"session replacement unsupported at this engine pin"});return}if(this.admittedReplacements>=f){c.fresh(()=>u({level:"warn",event:"broker.session_replacement.rejected",outcome:"skipped",fields:{op:t,reason:"capacity",admitted:f,cap:f}})),this.ackTo(e,t,!1,`session replacement busy (${f} active or queued)`);return}this.admittedReplacements++;const d=this.replacementTail.then(async()=>{try{await c.fresh(async()=>{const o=process.hrtime.bigint();let s;try{const p=new Promise(h=>{s=setTimeout(()=>h(b),m)}),i=await Promise.race([n(r),p]);if(i===b){u({level:"error",event:"broker.session_replacement.timed_out",outcome:"failed",duration_ms:Number(process.hrtime.bigint()-o)/1e6,fields:{op:t,deadline_ms:m,mutation_outcome:"indeterminate"}}),this.ackTo(e,t,!1,"session replacement timed out; broker restarting because session state is indeterminate"),this.deps.disposeAndExit("session-replacement-timeout",1);return}i.cancelled||this.deps.reWelcomeAll(),this.ackTo(e,t,!i.cancelled,i.cancelled?i.detail??"cancelled by extension":void 0)}catch(p){u({level:"error",event:"broker.session_replacement.failed",outcome:"failed",error:p,fields:{op:t,mutation_outcome:"indeterminate"}}),this.ackTo(e,t,!1,"session replacement failed; broker restarting because session state is indeterminate"),this.deps.disposeAndExit("session-replacement-failed",1)}finally{clearTimeout(s)}})}finally{this.admittedReplacements--}});this.replacementTail=d.catch(()=>{})}removeInstalledSubscription(){this.unsubscribe?.(),this.unsubscribe=void 0,this.installed=void 0}captureSystemPrompt(e){try{const t=E(this.deps.nodeId);v(t,{recursive:!0}),_(A(t,"system-prompt.md"),e.systemPrompt,"utf8")}catch{}}executeSubscriptionCallback(e,t){try{t.type==="agent_start"&&(this.agentRunActiveValue=!0),t.type==="agent_end"&&(e.stagedProviderAgentEnd=t,e.stagedOverflowFailure=null),t.type==="compaction_end"&&t.reason==="overflow"&&t.willRetry===!1&&typeof t.errorMessage=="string"&&(e.stagedOverflowFailure={errorMessage:t.errorMessage}),t.type==="agent_settled"&&(this.agentRunActiveValue=!1,this.publishAndScheduleProviderRecovery(e)),this.deps.toolGroups.observeToolGroupEvent(t),this.deps.projection().relayEvent(t,e)}catch(n){u({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`event relay threw: ${String(n)}`}})}}async publishAndScheduleProviderRecovery(e){try{if(await this.deps.faultRetry().publishSettledProviderFault(e),this.shutdownRequested){this.deps.disposeAndExit("shutdown-after-settle");return}await this.deps.faultRetry().schedule()}catch(t){u({level:"error",event:"broker.daemon.operation.failed",node_id:this.deps.nodeId,error:t,fields:{operation:"provider_fault_settlement"}}),this.shutdownRequested&&this.deps.disposeAndExit("shutdown-after-settle")}}ackTo(e,t,n=!0,r,d){this.deps.registry.sendFrame(e,{type:"ack",for:t,ok:n,...r!==void 0?{detail:r}:{},...d!==void 0?{id:d}:{}})}}export{O as RebindDriver};
1
+ var k=Object.defineProperty;var l=(a,e)=>k(a,"name",{value:e,configurable:!0});import{mkdirSync as v,writeFileSync as _}from"node:fs";import{join as A}from"node:path";import{nodeRunJobDir as I}from"../../canvas/paths.js";import{emitEvent as u}from"../../events/emit.js";import{operationIdContext as c}from"../../events/operation-id.js";import{installPersonaTransitionGate as E}from"../broker-persona-guidance.js";import{abortSessionFromExtension as T}from"./extension-abort.js";import{brokerRecovery as w,mutateBrokerFault as S,mutateBrokerProviderRetry as x}from"./daemon-ops.js";const f=2,m=3e4,b=Symbol("replacement-deadline-exceeded"),P="(interrupted)",g=Symbol.for("crtr.trailing-thinking-guard");function V(a){for(let e=a.length-1;e>=0;e--){const t=a[e];if(t!==void 0){if(t.type==="text"){if(t.text.trim().length===0)continue;return t}if(t.type==="thinking"){const n=t.thinkingSignature,r=typeof n=="string"&&n.trim().length>0;if(t.redacted!==!0&&t.thinking.trim().length===0&&!r)continue;return t}return t}}}l(V,"lastSerializedBlock");function y(a){return a.map(e=>e.role!=="assistant"||V(e.content)?.type!=="thinking"?e:{...e,content:[...e.content,{type:"text",text:P}]})}l(y,"guardTrailingThinking");function N(a){const e=a.convertToLlm;if(e[g]===!0)return;const t=l(n=>{const r=e(n);return r instanceof Promise?r.then(y):y(r)},"wrapped");t[g]=!0,a.convertToLlm=t}l(N,"installTrailingThinkingGuard");class O{static{l(this,"RebindDriver")}deps;sessionValue;servicesValue;unsubscribe;installed;nextSubscriptionGeneration=0;rebindTail=Promise.resolve();latestRebindRequest=0;replacementTail=Promise.resolve();admittedReplacements=0;agentRunActiveValue=!1;shutdownRequested=!1;constructor(e){this.deps=e,this.sessionValue=e.session,this.servicesValue=e.services}session(){return this.sessionValue}services(){return this.servicesValue}installedGeneration(){return this.installed}isAgentRunActive(){return this.agentRunActiveValue}isReplacing(){return this.admittedReplacements>0}requestShutdown(){if(!this.agentRunActiveValue){this.deps.disposeAndExit("shutdown-hook");return}this.shutdownRequested=!0}setRebindSession(){this.deps.runtime?.setRebindSession(e=>this.enqueueRebind(e,this.deps.runtime.services))}enqueueRebind(e,t){const n=++this.latestRebindRequest,r=this.rebindTail.then(async()=>{if(n!==this.latestRebindRequest)return;if(this.installed!==void 0){typeof this.sessionValue.sessionFile=="string"&&this.sessionValue.sessionFile!==""&&await x(this.deps.nodeId,{op:"invalidate",session_id:this.sessionValue.sessionManager.getSessionId()});const s=(await w(this.deps.nodeId)).fault;s?.link==="pi\u2192provider"&&s.retry.disposition==="auto"&&s.retry.by==="daemon"&&await S(this.deps.nodeId,{op:"clear",link:"pi\u2192provider",preserve_episode:!0})}if(this.installed?.executingTools.clear(),this.removeInstalledSubscription(),this.deps.setActiveSession(e),this.deps.projection().reset(),this.deps.faultRetry().reset(),this.agentRunActiveValue=!1,this.deps.onSessionRebind(),this.deps.toolGroups.resetForSession(),await e.bindExtensions({uiContext:this.deps.uiContext(),mode:"rpc",abortHandler:l(()=>T(e,()=>{const s=this.installed;s?.session===e&&(s.stagedRefreshAbort=!0)}),"abortHandler"),shutdownHandler:l(()=>this.requestShutdown(),"shutdownHandler")}),n!==this.latestRebindRequest)return;this.removeInstalledSubscription(),this.sessionValue=e,this.servicesValue=t;const d=e.agent;if(d&&(E(this.deps.nodeId,{agent:d,sessionManager:e.sessionManager},()=>this.deps.faultRetry().notePersonaGateFailure()),d.steeringMode="all",d.followUpMode="all",N(d)),this.deps.cfg.editorName!==void 0&&this.deps.cfg.editorName!=="")try{e.setSessionName(this.deps.cfg.editorName)}catch{}const o={id:++this.nextSubscriptionGeneration,session:e,fallback:{blocked:!1},stagedProviderAgentEnd:null,stagedWatchdogAbort:!1,stagedRefreshAbort:!1,stagedOverflowFailure:null,executingTools:new Set};this.unsubscribe=this.sessionValue.subscribe(s=>{if(!this.deps.projection().isCurrent(o))return;if(c.current()!==void 0){this.executeSubscriptionCallback(o,s);return}const i=o.fallback;if(s.type==="turn_start"&&i.storedId!==void 0){i.storedId=void 0,i.blocked=!0,c.fresh(()=>{u({level:"warn",event:"broker.turn.fallback_overlap",fields:{generation:o.id,engine_event:s.type}}),this.executeSubscriptionCallback(o,s)});return}if(s.type==="turn_start"&&!i.blocked){c.fresh(R=>{i.storedId=R,this.executeSubscriptionCallback(o,s)});return}const h=i.storedId;if(h!==void 0&&!i.blocked){c.run(h,()=>{this.executeSubscriptionCallback(o,s),s.type==="agent_settled"&&i.storedId===h&&(i.storedId=void 0)});return}this.executeSubscriptionCallback(o,s)}),this.installed=o,this.deps.projection().rearmIfStreaming(o),this.captureSystemPrompt(e)});return this.rebindTail=r.catch(()=>{}),r}runReplacement(e,t,n){const r=this.deps.runtime;if(r===void 0){this.deps.registry.sendFrame(e,{type:"error",code:"engine_error",message:"session replacement unsupported at this engine pin"});return}if(this.admittedReplacements>=f){c.fresh(()=>u({level:"warn",event:"broker.session_replacement.rejected",outcome:"skipped",fields:{op:t,reason:"capacity",admitted:f,cap:f}})),this.ackTo(e,t,!1,`session replacement busy (${f} active or queued)`);return}this.admittedReplacements++;const d=this.replacementTail.then(async()=>{try{await c.fresh(async()=>{const o=process.hrtime.bigint();let s;try{const p=new Promise(h=>{s=setTimeout(()=>h(b),m)}),i=await Promise.race([n(r),p]);if(i===b){u({level:"error",event:"broker.session_replacement.timed_out",outcome:"failed",duration_ms:Number(process.hrtime.bigint()-o)/1e6,fields:{op:t,deadline_ms:m,mutation_outcome:"indeterminate"}}),this.ackTo(e,t,!1,"session replacement timed out; broker restarting because session state is indeterminate"),this.deps.disposeAndExit("session-replacement-timeout",1);return}i.cancelled||this.deps.reWelcomeAll(),this.ackTo(e,t,!i.cancelled,i.cancelled?i.detail??"cancelled by extension":void 0)}catch(p){u({level:"error",event:"broker.session_replacement.failed",outcome:"failed",error:p,fields:{op:t,mutation_outcome:"indeterminate"}}),this.ackTo(e,t,!1,"session replacement failed; broker restarting because session state is indeterminate"),this.deps.disposeAndExit("session-replacement-failed",1)}finally{clearTimeout(s)}})}finally{this.admittedReplacements--,this.admittedReplacements===0&&this.deps.onReplacementIdle?.()}});this.replacementTail=d.catch(()=>{})}removeInstalledSubscription(){this.unsubscribe?.(),this.unsubscribe=void 0,this.installed=void 0}captureSystemPrompt(e){try{const t=I(this.deps.nodeId);v(t,{recursive:!0}),_(A(t,"system-prompt.md"),e.systemPrompt,"utf8")}catch{}}executeSubscriptionCallback(e,t){try{t.type==="agent_start"&&(this.agentRunActiveValue=!0),t.type==="agent_end"&&(e.stagedProviderAgentEnd=t,e.stagedOverflowFailure=null),t.type==="compaction_end"&&t.reason==="overflow"&&t.willRetry===!1&&typeof t.errorMessage=="string"&&(e.stagedOverflowFailure={errorMessage:t.errorMessage}),t.type==="agent_settled"&&(this.agentRunActiveValue=!1,this.publishAndScheduleProviderRecovery(e)),this.deps.toolGroups.observeToolGroupEvent(t),this.deps.projection().relayEvent(t,e)}catch(n){u({level:"debug",event:"broker.runtime.diagnostic",fields:{message:`event relay threw: ${String(n)}`}})}}async publishAndScheduleProviderRecovery(e){try{if(await this.deps.faultRetry().publishSettledProviderFault(e),this.shutdownRequested){this.deps.disposeAndExit("shutdown-after-settle");return}await this.deps.faultRetry().schedule()}catch(t){u({level:"error",event:"broker.daemon.operation.failed",node_id:this.deps.nodeId,error:t,fields:{operation:"provider_fault_settlement"}}),this.shutdownRequested&&this.deps.disposeAndExit("shutdown-after-settle")}}ackTo(e,t,n=!0,r,d){this.deps.registry.sendFrame(e,{type:"ack",for:t,ok:n,...r!==void 0?{detail:r}:{},...d!==void 0?{id:d}:{}})}}export{O as RebindDriver};
@@ -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{jobDir 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 U{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{U as ToolGroupTracker};
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};
@@ -30,11 +30,11 @@ export type TurnAcceptanceGate = {
30
30
  export declare function createTurnAcceptanceGate(): TurnAcceptanceGate;
31
31
  /**
32
32
  * The launch prompt, held until the session actually has a model. A model-less
33
- * tier-3 boot leaves it pending; `drivePending` is a no-op until the
34
- * `reload_auth` re-drive resolves a model, at which point it fires.
33
+ * tier-3 boot leaves it pending; `drivePending` is a no-op while the session
34
+ * has no model, and a model-less boot stays model-less until the node is revived.
35
35
  */
36
36
  export type KickoffDriver = {
37
- kickoff(prompt: string): void;
37
+ kickoff(prompt: string, messageIds?: string[]): void;
38
38
  drivePending(): void;
39
39
  };
40
40
  export declare function createKickoffDriver(deps: {
@@ -1 +1 @@
1
- var m=Object.defineProperty;var r=(t,e)=>m(t,"name",{value:e,configurable:!0});import{emitEvent as p}from"../../events/emit.js";import{operationIdContext as u}from"../../events/operation-id.js";import{isUnknownModel as v}from"../model-selection.js";const g=5e3,w=25;function S(t){let e=0;return{track(n){e++;const i=Promise.resolve(n);return i.finally(()=>{e--}),i},pending:r(()=>e,"pending"),async waitUntilAbortable(){if(t().isStreaming||e===0)return;const n=Date.now()+g;for(;Date.now()<n&&!t().isStreaming&&e>0;)await new Promise(i=>setTimeout(i,w))}}}r(S,"createPromptDispatchTracker");function T(){const t=new Set;return{waitFor:r(e=>{t.add(e)},"waitFor"),cancel:r(e=>{t.delete(e)},"cancel"),notifyAccepted(){const e=[...t];t.clear();for(const n of e)n()}}}r(T,"createTurnAcceptanceGate");function _(t){const{session:e,dispatches:n,turnAdmission:i}=t;let o,a=!1;const c=r(()=>e().model===void 0||v(e().model),"sessionHasNoModel"),d=r(()=>{o===void 0||a||c()||(a=!0,i.admit(s=>{const f=o;return f===void 0||c()?(s(),a=!1,Promise.resolve()):(o=void 0,n.track(u.fresh(()=>e().prompt(f,{preflightResult:s,...e().isStreaming?{streamingBehavior:"steer"}:{}}).catch(l=>{p({level:"error",event:"broker.prompt.first_failed",error:l})}).finally(()=>{a=!1}))))}))},"drivePending");return{kickoff(s){o=s,d()},drivePending:d}}r(_,"createKickoffDriver");export{_ as createKickoffDriver,S as createPromptDispatchTracker,T as createTurnAcceptanceGate};
1
+ var u=Object.defineProperty;var n=(t,e)=>u(t,"name",{value:e,configurable:!0});import{emitEvent as g}from"../../events/emit.js";import{operationIdContext as v}from"../../events/operation-id.js";import{isUnknownModel as w}from"../model-selection.js";const h=5e3,k=25;function S(t){let e=0;return{track(r){e++;const i=Promise.resolve(r);return i.finally(()=>{e--}),i},pending:n(()=>e,"pending"),async waitUntilAbortable(){if(t().isStreaming||e===0)return;const r=Date.now()+h;for(;Date.now()<r&&!t().isStreaming&&e>0;)await new Promise(i=>setTimeout(i,k))}}}n(S,"createPromptDispatchTracker");function T(){const t=new Set;return{waitFor:n(e=>{t.add(e)},"waitFor"),cancel:n(e=>{t.delete(e)},"cancel"),notifyAccepted(){const e=[...t];t.clear();for(const r of e)r()}}}n(T,"createTurnAcceptanceGate");function y(t){const{session:e,dispatches:r,turnAdmission:i}=t;let o,c=[],s=!1;const f=n(()=>e().model===void 0||w(e().model),"sessionHasNoModel"),l=n(()=>{o===void 0||s||f()||(s=!0,i.admit(a=>{const d=o;if(d===void 0||f())return a(),s=!1,Promise.resolve();o=void 0;const p=c;return c=[],p.length>0&&e().sessionManager.appendCustomEntry("crtr-turn-input",{message_ids:p}),r.track(v.fresh(()=>e().prompt(d,{preflightResult:a,...e().isStreaming?{streamingBehavior:"steer"}:{}}).catch(m=>{g({level:"error",event:"broker.prompt.first_failed",error:m})}).finally(()=>{s=!1})))}))},"drivePending");return{kickoff(a,d=[]){o=a,c=d,l()},drivePending:l}}n(y,"createKickoffDriver");export{y as createKickoffDriver,S as createPromptDispatchTracker,T as createTurnAcceptanceGate};
@@ -1,3 +1,3 @@
1
- var a=Object.defineProperty;var n=(e,r)=>a(e,"name",{value:r,configurable:!0});import{isSafeNodeId as d}from"../canvas/paths.js";import{emitEvent as p}from"../events/emit.js";import{mark as c,timingProc as u}from"../timing.js";const f=process.hrtime.bigint(),l=new Date().toISOString(),t=process.argv.length>2?process.argv.at(-1):void 0;(t===void 0||!d(t))&&(process.stderr.write(`[broker] usage: broker-cli [--canvas-home <path>] [--epoch <id>] <nodeId>
2
- `),process.exit(1)),u("broker"),c("broker.entry",{node:t});const{runBroker:m,disposeActiveSession:h}=await import("./broker.js");c("broker.module_loaded");function s(e){try{h()}catch{}process.exit(e)}n(s,"disposeAndExit");function i(e,r){let o;try{o=p({level:"error",event:"broker.runtime.fatal",error:r,fields:{origin:e}})}catch{o=!1}o||process.stderr.write(`[broker] fatal (${e}): ${r instanceof Error?r.stack??r.message:String(r)}
3
- `)}n(i,"reportFatal"),process.on("uncaughtException",e=>{i("uncaughtException",e),s(1)}),process.on("unhandledRejection",e=>{i("unhandledRejection",e),s(1)}),m(t,f,l).catch(e=>{i("run_failure",e),s(1)});
1
+ var c=Object.defineProperty;var n=(e,r)=>c(e,"name",{value:r,configurable:!0});import{isSafeNodeId as d}from"../canvas/paths.js";import{emitEvent as p,flushBrokerLog as u}from"../events/emit.js";import{mark as a,timingProc as f}from"../timing.js";const l=process.hrtime.bigint(),m=new Date().toISOString(),t=process.argv.length>2?process.argv.at(-1):void 0;(t===void 0||!d(t))&&(process.stderr.write(`[broker] usage: broker-cli [--canvas-home <path>] [--epoch <id>] <nodeId>
2
+ `),process.exit(1)),f("broker"),a("broker.entry",{node:t});const{runBroker:h,disposeActiveSession:g}=await import("./broker.js");a("broker.module_loaded");function s(e){try{g()}catch{}u().finally(()=>process.exit(e))}n(s,"disposeAndExit");function i(e,r){let o;try{o=p({level:"error",event:"broker.runtime.fatal",error:r,fields:{origin:e}})}catch{o=!1}o||process.stderr.write(`[broker] fatal (${e}): ${r instanceof Error?r.stack??r.message:String(r)}
3
+ `)}n(i,"reportFatal"),process.on("uncaughtException",e=>{i("uncaughtException",e),s(1)}),process.on("unhandledRejection",e=>{i("unhandledRejection",e),s(1)}),h(t,l,m).catch(e=>{i("run_failure",e),s(1)});