@ouro.bot/cli 0.1.0-alpha.92 → 0.1.0-alpha.920

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 (716) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -23
  3. package/RepairGuide.ouro/agent.json +5 -0
  4. package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
  5. package/RepairGuide.ouro/psyche/SOUL.md +55 -0
  6. package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
  7. package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
  8. package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
  9. package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
  10. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
  11. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  12. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  13. package/assets/bluebubbles-host +264 -0
  14. package/assets/sanctuary-host-launcher.sh +16 -0
  15. package/changelog.json +5819 -16
  16. package/deploy/unraid/Dockerfile +58 -0
  17. package/deploy/unraid/README.txt +2997 -0
  18. package/deploy/unraid/audit-container-spec.sh +4 -0
  19. package/deploy/unraid/container-runtime.json +1 -0
  20. package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
  21. package/deploy/unraid/docker-man-template-xml.cjs +105 -0
  22. package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
  23. package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
  24. package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
  25. package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
  26. package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
  27. package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
  28. package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
  29. package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
  30. package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
  31. package/deploy/unraid/sanctuary-authority-installation.json +36 -0
  32. package/deploy/unraid/sanctuary-authority-service.sh +30 -0
  33. package/deploy/unraid/sanctuary-butler-upgrade.mjs +1254 -0
  34. package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
  35. package/deploy/unraid/sanctuary-replay-gate.mjs +1564 -0
  36. package/deploy/unraid/sanctuary-safe-rename.py +24 -0
  37. package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2086 -0
  38. package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
  39. package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
  40. package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
  41. package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
  42. package/deploy/unraid/sanctuary.ouro/awaiting/house-care-sweep.md +17 -0
  43. package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
  44. package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
  45. package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +2231 -0
  46. package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
  47. package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
  48. package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
  49. package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +33 -0
  50. package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +27 -0
  51. package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +22 -0
  52. package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
  53. package/deploy/unraid/sanctuary.ouro/tool-profiles.json +232 -0
  54. package/deploy/unraid/sanctuary.xml +30 -0
  55. package/dist/a2a/card.js +57 -0
  56. package/dist/a2a/client.js +250 -0
  57. package/dist/a2a/config.js +50 -0
  58. package/dist/a2a/delegated-command-grants.js +93 -0
  59. package/dist/a2a/delegated-command.js +197 -0
  60. package/dist/a2a/delegation-stores.js +56 -0
  61. package/dist/a2a/did-resolution.js +93 -0
  62. package/dist/a2a/escalation-grants.js +84 -0
  63. package/dist/a2a/escalation-wiring.js +60 -0
  64. package/dist/a2a/identity.js +258 -0
  65. package/dist/a2a/inbound-share.js +110 -0
  66. package/dist/a2a/mission-result-wire.js +196 -0
  67. package/dist/a2a/onboarding.js +133 -0
  68. package/dist/a2a/operator-trust.js +382 -0
  69. package/dist/a2a/outbox-client.js +57 -0
  70. package/dist/a2a/outbox-store.js +188 -0
  71. package/dist/a2a/outbox-wire.js +95 -0
  72. package/dist/a2a/pin-store.js +132 -0
  73. package/dist/a2a/replay-grant-holders.js +33 -0
  74. package/dist/a2a/replay-harness.js +188 -0
  75. package/dist/a2a/resolution-proof.js +53 -0
  76. package/dist/a2a/sealed-chat.js +113 -0
  77. package/dist/a2a/seen-ledger.js +120 -0
  78. package/dist/a2a/server.js +771 -0
  79. package/dist/a2a/task-store.js +69 -0
  80. package/dist/a2a/transport.js +45 -0
  81. package/dist/a2a/trust-commands.js +203 -0
  82. package/dist/a2a/trusted-files.js +185 -0
  83. package/dist/a2a/types.js +3 -0
  84. package/dist/arc/attention-types.js +8 -0
  85. package/dist/arc/cares.js +360 -0
  86. package/dist/arc/episodes.js +118 -0
  87. package/dist/arc/evolution.js +490 -0
  88. package/dist/arc/flight-recorder.js +1034 -0
  89. package/dist/arc/intentions.js +134 -0
  90. package/dist/arc/json-store.js +117 -0
  91. package/dist/arc/obligations.js +386 -0
  92. package/dist/arc/packets.js +336 -0
  93. package/dist/arc/presence.js +185 -0
  94. package/dist/arc/task-lifecycle.js +57 -0
  95. package/dist/commerce/store.js +755 -0
  96. package/dist/commerce/types.js +3 -0
  97. package/dist/heart/active-work.js +798 -40
  98. package/dist/heart/agent-entry.js +252 -3
  99. package/dist/heart/approval-files.js +113 -0
  100. package/dist/heart/approval-store.js +960 -0
  101. package/dist/heart/attachments/image-normalize.js +194 -0
  102. package/dist/heart/attachments/materialize.js +97 -0
  103. package/dist/heart/attachments/originals.js +88 -0
  104. package/dist/heart/attachments/render.js +29 -0
  105. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  106. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  107. package/dist/heart/attachments/sources/index.js +18 -0
  108. package/dist/heart/attachments/sources/telegram.js +71 -0
  109. package/dist/heart/attachments/store.js +132 -0
  110. package/dist/heart/attachments/types.js +93 -0
  111. package/dist/heart/auth/auth-flow.js +495 -0
  112. package/dist/heart/autonomy-budget.js +478 -0
  113. package/dist/heart/awaiting/a2a-await-delivery.js +109 -0
  114. package/dist/heart/awaiting/await-alert.js +152 -0
  115. package/dist/heart/awaiting/await-expiry.js +143 -0
  116. package/dist/heart/awaiting/await-loader.js +91 -0
  117. package/dist/heart/awaiting/await-parser.js +152 -0
  118. package/dist/heart/awaiting/await-runtime-state.js +111 -0
  119. package/dist/heart/awaiting/await-scheduler.js +391 -0
  120. package/dist/heart/background-operations.js +281 -0
  121. package/dist/heart/bluebubbles-host-account.js +78 -0
  122. package/dist/heart/bridges/manager.js +137 -17
  123. package/dist/heart/bridges/store.js +14 -2
  124. package/dist/heart/bundle-state.js +168 -0
  125. package/dist/heart/commitments.js +44 -18
  126. package/dist/heart/config-registry.js +331 -0
  127. package/dist/heart/config.js +174 -131
  128. package/dist/heart/context-loss-gauntlet.js +387 -0
  129. package/dist/heart/context-loss-sentinel.js +1159 -0
  130. package/dist/heart/core.js +2364 -578
  131. package/dist/heart/cross-chat-delivery.js +9 -22
  132. package/dist/heart/daemon/agent-config-check.js +451 -0
  133. package/dist/heart/daemon/agent-discovery.js +283 -3
  134. package/dist/heart/daemon/agent-home.js +319 -0
  135. package/dist/heart/daemon/agent-service.js +542 -0
  136. package/dist/heart/daemon/agentic-repair.js +547 -0
  137. package/dist/heart/daemon/await-private-wake.js +59 -0
  138. package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
  139. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  140. package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
  141. package/dist/heart/daemon/bluebubbles-host.js +273 -0
  142. package/dist/heart/daemon/boot-sync-probe.js +197 -0
  143. package/dist/heart/daemon/cadence.js +180 -0
  144. package/dist/heart/daemon/cli-arg-redaction.js +26 -0
  145. package/dist/heart/daemon/cli-defaults.js +876 -0
  146. package/dist/heart/daemon/cli-desk.js +322 -0
  147. package/dist/heart/daemon/cli-exec.js +9199 -0
  148. package/dist/heart/daemon/cli-help.js +735 -0
  149. package/dist/heart/daemon/cli-parse.js +3211 -0
  150. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  151. package/dist/heart/daemon/cli-render.js +819 -0
  152. package/dist/heart/daemon/cli-types.js +8 -0
  153. package/dist/heart/daemon/connect-bay.js +323 -0
  154. package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
  155. package/dist/heart/daemon/container-healthcheck.js +112 -0
  156. package/dist/heart/daemon/container-runtime.js +97 -0
  157. package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
  158. package/dist/heart/daemon/container-spec-auditor.js +235 -0
  159. package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
  160. package/dist/heart/daemon/daemon-cli.js +29 -2350
  161. package/dist/heart/daemon/daemon-entry.js +953 -11
  162. package/dist/heart/daemon/daemon-health.js +186 -0
  163. package/dist/heart/daemon/daemon-rollup.js +57 -0
  164. package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
  165. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  166. package/dist/heart/daemon/daemon.js +2084 -105
  167. package/dist/heart/daemon/dns-workflow.js +394 -0
  168. package/dist/heart/daemon/doctor-types.js +8 -0
  169. package/dist/heart/daemon/doctor.js +1766 -0
  170. package/dist/heart/daemon/freshness.js +345 -0
  171. package/dist/heart/daemon/habit-private-wake.js +61 -0
  172. package/dist/heart/daemon/health-monitor.js +154 -11
  173. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  174. package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
  175. package/dist/heart/daemon/http-health-probe.js +80 -0
  176. package/dist/heart/daemon/human-command-screens.js +234 -0
  177. package/dist/heart/daemon/human-readiness.js +114 -0
  178. package/dist/heart/daemon/inner-status.js +78 -0
  179. package/dist/heart/daemon/interactive-repair.js +394 -0
  180. package/dist/heart/daemon/launchd.js +37 -8
  181. package/dist/heart/daemon/log-tailer.js +79 -10
  182. package/dist/heart/daemon/logs-prune.js +132 -0
  183. package/dist/heart/daemon/mcp-canary.js +524 -0
  184. package/dist/heart/daemon/message-router.js +65 -5
  185. package/dist/heart/daemon/migrate-to-desk.js +848 -0
  186. package/dist/heart/daemon/os-cron-deps.js +135 -0
  187. package/dist/heart/daemon/os-cron.js +22 -14
  188. package/dist/heart/daemon/ouro-bot-entry.js +6 -3
  189. package/dist/heart/daemon/ouro-entry.js +5 -2
  190. package/dist/heart/daemon/plugin-cli.js +432 -0
  191. package/dist/heart/daemon/process-manager.js +760 -61
  192. package/dist/heart/daemon/provider-discovery.js +137 -0
  193. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  194. package/dist/heart/daemon/prunable-bundle.js +144 -0
  195. package/dist/heart/daemon/pulse.js +511 -0
  196. package/dist/heart/daemon/readiness-repair.js +365 -0
  197. package/dist/heart/daemon/run-hooks.js +2 -0
  198. package/dist/heart/daemon/runtime-logging.js +47 -14
  199. package/dist/heart/daemon/runtime-metadata.js +2 -30
  200. package/dist/heart/daemon/runtime-mode.js +13 -2
  201. package/dist/heart/daemon/safe-mode.js +161 -0
  202. package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
  203. package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
  204. package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
  205. package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
  206. package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
  207. package/dist/heart/daemon/sanctuary-authority-epoch.js +281 -0
  208. package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
  209. package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
  210. package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1267 -0
  211. package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
  212. package/dist/heart/daemon/sanctuary-bundle-migration.js +730 -0
  213. package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
  214. package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -0
  215. package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
  216. package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
  217. package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
  218. package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
  219. package/dist/heart/daemon/sanctuary-package-management.js +103 -0
  220. package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
  221. package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
  222. package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +475 -0
  223. package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
  224. package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
  225. package/dist/heart/daemon/sense-manager.js +733 -48
  226. package/dist/heart/daemon/session-id-resolver.js +131 -0
  227. package/dist/heart/daemon/skill-management-installer.js +1 -1
  228. package/dist/heart/daemon/socket-client.js +180 -12
  229. package/dist/heart/daemon/stale-bundle-prune.js +113 -0
  230. package/dist/heart/daemon/startup-tui.js +339 -0
  231. package/dist/heart/daemon/supercronic-supervisor.js +282 -0
  232. package/dist/heart/daemon/task-scheduler.js +117 -39
  233. package/dist/heart/daemon/terminal-ui.js +503 -0
  234. package/dist/heart/daemon/thoughts.js +138 -54
  235. package/dist/heart/daemon/up-progress.js +366 -0
  236. package/dist/heart/daemon/vault-items.js +56 -0
  237. package/dist/heart/delegation.js +1 -4
  238. package/dist/heart/external-events/router.js +1516 -0
  239. package/dist/heart/failure-reports.js +336 -0
  240. package/dist/heart/file-lock.js +109 -0
  241. package/dist/heart/frontend-approval-runtime.js +506 -0
  242. package/dist/heart/frontend-journal.js +215 -0
  243. package/dist/heart/frontend-session-service.js +237 -0
  244. package/dist/heart/frontend-socket-client.js +164 -0
  245. package/dist/heart/frontend-socket.js +400 -0
  246. package/dist/heart/habits/habit-cancel.js +810 -0
  247. package/dist/heart/habits/habit-lifecycle.js +1327 -0
  248. package/dist/heart/habits/habit-migration.js +194 -0
  249. package/dist/heart/habits/habit-parser.js +278 -0
  250. package/dist/heart/habits/habit-runtime-state.js +93 -0
  251. package/dist/heart/habits/habit-scheduler.js +653 -0
  252. package/dist/heart/habits/habit-session-summary.js +318 -0
  253. package/dist/heart/habits/habit-session.js +636 -0
  254. package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
  255. package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
  256. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  257. package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
  258. package/dist/heart/identity.js +230 -59
  259. package/dist/heart/kept-notes.js +289 -0
  260. package/dist/heart/kicks.js +1 -1
  261. package/dist/heart/machine-identity.js +175 -0
  262. package/dist/heart/mail-import-discovery.js +356 -0
  263. package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
  264. package/dist/heart/mailbox/mailbox-http-response.js +7 -0
  265. package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
  266. package/dist/heart/mailbox/mailbox-http-static.js +103 -0
  267. package/dist/heart/mailbox/mailbox-http-transport.js +272 -0
  268. package/dist/heart/mailbox/mailbox-http.js +99 -0
  269. package/dist/heart/mailbox/mailbox-read.js +39 -0
  270. package/dist/heart/mailbox/mailbox-types.js +27 -0
  271. package/dist/heart/mailbox/mailbox-view.js +197 -0
  272. package/dist/heart/mailbox/readers/agent-machine.js +428 -0
  273. package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
  274. package/dist/heart/mailbox/readers/mail.js +375 -0
  275. package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
  276. package/dist/heart/mailbox/readers/sessions.js +231 -0
  277. package/dist/heart/mailbox/readers/shared.js +111 -0
  278. package/dist/heart/mcp/mcp-server.js +696 -0
  279. package/dist/heart/migrate-config.js +100 -0
  280. package/dist/heart/model-capabilities.js +83 -16
  281. package/dist/heart/orientation-frame.js +345 -0
  282. package/dist/heart/platform.js +81 -0
  283. package/dist/heart/primitives.js +1 -1
  284. package/dist/heart/private-runtime/decision-renderer.js +158 -0
  285. package/dist/heart/private-runtime/index.js +18 -0
  286. package/dist/heart/private-runtime/ledger.js +221 -0
  287. package/dist/heart/private-runtime/policy.js +260 -0
  288. package/dist/heart/private-runtime/types.js +2 -0
  289. package/dist/heart/progress-story.js +1 -1
  290. package/dist/heart/provider-attempt.js +137 -0
  291. package/dist/heart/provider-binding-resolver.js +273 -0
  292. package/dist/heart/provider-credentials.js +449 -0
  293. package/dist/heart/provider-failover.js +311 -0
  294. package/dist/heart/provider-models.js +96 -0
  295. package/dist/heart/provider-ping.js +265 -0
  296. package/dist/heart/provider-readiness-cache.js +119 -0
  297. package/dist/heart/provider-visibility.js +188 -0
  298. package/dist/heart/providers/anthropic-token.js +131 -0
  299. package/dist/heart/providers/anthropic.js +173 -60
  300. package/dist/heart/providers/azure.js +23 -11
  301. package/dist/heart/providers/error-classification.js +127 -0
  302. package/dist/heart/providers/github-copilot.js +38 -39
  303. package/dist/heart/providers/minimax-vlm.js +189 -0
  304. package/dist/heart/providers/minimax.js +26 -8
  305. package/dist/heart/providers/openai-codex-token.js +349 -0
  306. package/dist/heart/providers/openai-codex.js +55 -40
  307. package/dist/heart/providers/openai-compatible.js +177 -0
  308. package/dist/heart/reply-style.js +52 -0
  309. package/dist/heart/run-ledger.js +247 -0
  310. package/dist/heart/runtime-capability-check.js +170 -0
  311. package/dist/heart/runtime-credentials.js +607 -0
  312. package/dist/heart/runtime-cwd.js +87 -0
  313. package/dist/heart/sense-truth.js +24 -4
  314. package/dist/heart/session-activity.js +92 -24
  315. package/dist/heart/session-events.js +1504 -0
  316. package/dist/heart/session-playback-cli-main.js +5 -0
  317. package/dist/heart/session-playback-cli.js +36 -0
  318. package/dist/heart/session-playback.js +231 -0
  319. package/dist/heart/session-redaction-repair-cli-main.js +31 -0
  320. package/dist/heart/session-redaction-repair.js +552 -0
  321. package/dist/heart/session-stats-cli-main.js +5 -0
  322. package/dist/heart/session-stats.js +183 -0
  323. package/dist/heart/session-transcript.js +133 -0
  324. package/dist/heart/shelf-claims.js +78 -0
  325. package/dist/heart/shepherd-config.js +113 -0
  326. package/dist/heart/source-grounding.js +297 -0
  327. package/dist/heart/start-of-turn-packet.js +372 -0
  328. package/dist/heart/steward-policy.js +656 -0
  329. package/dist/heart/streaming.js +609 -207
  330. package/dist/heart/structured-output.js +196 -0
  331. package/dist/heart/sync-classification.js +176 -0
  332. package/dist/heart/sync-health.js +152 -0
  333. package/dist/heart/sync.js +726 -0
  334. package/dist/heart/target-resolution.js +11 -7
  335. package/dist/heart/tempo.js +93 -0
  336. package/dist/heart/temporal-view.js +41 -0
  337. package/dist/heart/timeouts.js +101 -0
  338. package/dist/heart/tool-activity-callbacks.js +59 -0
  339. package/dist/heart/tool-approval.js +382 -0
  340. package/dist/heart/tool-description.js +155 -0
  341. package/dist/heart/tool-friction.js +55 -0
  342. package/dist/heart/tool-loop.js +206 -0
  343. package/dist/heart/turn-context.js +496 -0
  344. package/dist/heart/turn-execution-lease.js +30 -0
  345. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
  346. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +3 -2
  347. package/dist/heart/versioning/ouro-path-installer.js +432 -0
  348. package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
  349. package/dist/heart/versioning/ouro-version-manager.js +432 -0
  350. package/dist/heart/versioning/release-sources.js +173 -0
  351. package/dist/heart/versioning/self-update-defaults.js +294 -0
  352. package/dist/heart/versioning/self-update.js +196 -0
  353. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  354. package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
  355. package/dist/heart/versioning/update-hooks.js +154 -0
  356. package/dist/heart/versioning/update-state.js +126 -0
  357. package/dist/heart/versioning/updater-launchd.js +150 -0
  358. package/dist/heart/versioning/version-intent.js +114 -0
  359. package/dist/heart/work-card.js +380 -0
  360. package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
  361. package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
  362. package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
  363. package/dist/mailbox-ui/index.html +16 -0
  364. package/dist/mailroom/attention.js +167 -0
  365. package/dist/mailroom/autonomy.js +209 -0
  366. package/dist/mailroom/blob-store.js +889 -0
  367. package/dist/mailroom/body-cache.js +61 -0
  368. package/dist/mailroom/cache-sync-cli.js +58 -0
  369. package/dist/mailroom/core.js +803 -0
  370. package/dist/mailroom/entry.js +160 -0
  371. package/dist/mailroom/file-store.js +568 -0
  372. package/dist/mailroom/hosted-cache-sync.js +384 -0
  373. package/dist/mailroom/mbox-import.js +393 -0
  374. package/dist/mailroom/migration.js +164 -0
  375. package/dist/mailroom/outbound.js +380 -0
  376. package/dist/mailroom/policy.js +263 -0
  377. package/dist/mailroom/reader.js +292 -0
  378. package/dist/mailroom/search-cache.js +513 -0
  379. package/dist/mailroom/search-relevance.js +319 -0
  380. package/dist/mailroom/smtp-ingress.js +176 -0
  381. package/dist/mailroom/source-state.js +176 -0
  382. package/dist/mailroom/thread.js +109 -0
  383. package/dist/mailroom/travel-extract.js +89 -0
  384. package/dist/mind/bundle-manifest.js +24 -2
  385. package/dist/mind/context.js +307 -139
  386. package/dist/mind/desk-section.js +362 -0
  387. package/dist/mind/diary-integrity.js +60 -0
  388. package/dist/mind/{memory.js → diary.js} +68 -77
  389. package/dist/mind/embedding-provider.js +60 -0
  390. package/dist/mind/file-state.js +179 -0
  391. package/dist/mind/friend-link-codes.js +209 -0
  392. package/dist/mind/friend-merge.js +330 -0
  393. package/dist/mind/{associative-recall.js → note-search.js} +47 -58
  394. package/dist/mind/obligation-steering.js +199 -3
  395. package/dist/mind/pending.js +36 -10
  396. package/dist/mind/prompt-budget.js +479 -0
  397. package/dist/mind/prompt-refresh.js +3 -2
  398. package/dist/mind/prompt.js +1085 -198
  399. package/dist/mind/provenance-trust.js +26 -0
  400. package/dist/mind/record-paths.js +312 -0
  401. package/dist/mind/scrutiny.js +173 -0
  402. package/dist/mind/session-transaction.js +564 -0
  403. package/dist/nerves/cli-logging.js +7 -1
  404. package/dist/nerves/coverage/audit-rules.js +15 -6
  405. package/dist/nerves/coverage/audit.js +28 -2
  406. package/dist/nerves/coverage/cli.js +1 -1
  407. package/dist/nerves/coverage/contract.js +5 -5
  408. package/dist/nerves/coverage/file-completeness.js +139 -5
  409. package/dist/nerves/coverage/run-artifacts.js +55 -35
  410. package/dist/nerves/coverage/source-scanner.js +4 -4
  411. package/dist/nerves/event-buffer.js +111 -0
  412. package/dist/nerves/index.js +293 -9
  413. package/dist/nerves/observation.js +20 -0
  414. package/dist/nerves/redact.js +79 -0
  415. package/dist/nerves/review/cli-main.js +5 -0
  416. package/dist/nerves/review/cli.js +156 -0
  417. package/dist/nerves/review/core.js +159 -0
  418. package/dist/nerves/runtime.js +17 -1
  419. package/dist/repertoire/ado-client.js +15 -56
  420. package/dist/repertoire/ado-semantic.js +16 -10
  421. package/dist/repertoire/api-client.js +97 -0
  422. package/dist/repertoire/bitwarden-store.js +1201 -0
  423. package/dist/repertoire/bundle-templates.js +71 -0
  424. package/dist/repertoire/bw-installer.js +231 -0
  425. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  426. package/dist/repertoire/coding/context-pack.js +331 -0
  427. package/dist/repertoire/coding/feedback.js +174 -32
  428. package/dist/repertoire/coding/index.js +15 -3
  429. package/dist/repertoire/coding/manager.js +159 -10
  430. package/dist/repertoire/coding/spawner.js +40 -11
  431. package/dist/repertoire/coding/tools.js +182 -18
  432. package/dist/repertoire/coding/workbench-client.js +272 -0
  433. package/dist/repertoire/coding/workbench-manager.js +346 -0
  434. package/dist/repertoire/commerce-errors.js +109 -0
  435. package/dist/repertoire/commerce-self-test.js +156 -0
  436. package/dist/repertoire/credential-access.js +183 -0
  437. package/dist/repertoire/desk/classifier.js +362 -0
  438. package/dist/repertoire/duffel-client.js +185 -0
  439. package/dist/repertoire/github-client.js +14 -55
  440. package/dist/repertoire/graph-client.js +11 -52
  441. package/dist/repertoire/guardrails.js +968 -20
  442. package/dist/repertoire/house-sweep.js +469 -0
  443. package/dist/repertoire/mcp-client.js +58 -5
  444. package/dist/repertoire/mcp-manager.js +427 -139
  445. package/dist/repertoire/mcp-tools.js +132 -0
  446. package/dist/repertoire/mcp-write-guard.js +46 -0
  447. package/dist/repertoire/plugin-mcp.js +175 -0
  448. package/dist/repertoire/plugins.js +253 -0
  449. package/dist/repertoire/relationship-authorization.js +322 -0
  450. package/dist/repertoire/sanctuary-container-policy.js +46 -0
  451. package/dist/repertoire/shell-sessions.js +134 -0
  452. package/dist/repertoire/skills.js +48 -4
  453. package/dist/repertoire/stripe-client.js +131 -0
  454. package/dist/repertoire/tool-arguments.js +182 -0
  455. package/dist/repertoire/tool-results.js +29 -0
  456. package/dist/repertoire/tools-a2a.js +699 -0
  457. package/dist/repertoire/tools-attachments.js +322 -0
  458. package/dist/repertoire/tools-awaiting.js +872 -0
  459. package/dist/repertoire/tools-base.js +83 -1168
  460. package/dist/repertoire/tools-bluebubbles.js +2 -0
  461. package/dist/repertoire/tools-bridge.js +144 -0
  462. package/dist/repertoire/tools-bundle.js +995 -0
  463. package/dist/repertoire/tools-commerce.js +253 -0
  464. package/dist/repertoire/tools-config.js +186 -0
  465. package/dist/repertoire/tools-continuity.js +575 -0
  466. package/dist/repertoire/tools-credential.js +383 -0
  467. package/dist/repertoire/tools-escalation.js +84 -0
  468. package/dist/repertoire/tools-evolution.js +527 -0
  469. package/dist/repertoire/tools-files.js +344 -0
  470. package/dist/repertoire/tools-flight.js +290 -0
  471. package/dist/repertoire/tools-flow.js +119 -0
  472. package/dist/repertoire/tools-friend-link.js +57 -0
  473. package/dist/repertoire/tools-github.js +3 -8
  474. package/dist/repertoire/tools-habits.js +103 -0
  475. package/dist/repertoire/tools-house-care.js +174 -0
  476. package/dist/repertoire/tools-mail.js +1828 -0
  477. package/dist/repertoire/tools-notes.js +496 -0
  478. package/dist/repertoire/tools-obligations.js +182 -0
  479. package/dist/repertoire/tools-orientation.js +31 -0
  480. package/dist/repertoire/tools-record.js +482 -0
  481. package/dist/repertoire/tools-rsvp.js +139 -0
  482. package/dist/repertoire/tools-runtime.js +238 -0
  483. package/dist/repertoire/tools-sanctuary-host.js +202 -0
  484. package/dist/repertoire/tools-session.js +1133 -0
  485. package/dist/repertoire/tools-shell.js +149 -0
  486. package/dist/repertoire/tools-shepherd.js +262 -0
  487. package/dist/repertoire/tools-steward-policy.js +147 -0
  488. package/dist/repertoire/tools-stripe.js +224 -0
  489. package/dist/repertoire/tools-surface.js +369 -0
  490. package/dist/repertoire/tools-teams.js +12 -39
  491. package/dist/repertoire/tools-telegram-contacts.js +37 -0
  492. package/dist/repertoire/tools-travel.js +125 -0
  493. package/dist/repertoire/tools-trip.js +982 -0
  494. package/dist/repertoire/tools-unraid.js +556 -0
  495. package/dist/repertoire/tools-user-profile.js +146 -0
  496. package/dist/repertoire/tools-vault.js +40 -0
  497. package/dist/repertoire/tools-voice-local.js +198 -0
  498. package/dist/repertoire/tools-voice.js +145 -0
  499. package/dist/repertoire/tools.js +514 -156
  500. package/dist/repertoire/travel-api-client.js +360 -0
  501. package/dist/repertoire/unraid-client.js +155 -0
  502. package/dist/repertoire/unraid-restart.js +339 -0
  503. package/dist/repertoire/user-profile.js +131 -0
  504. package/dist/repertoire/vault-setup.js +246 -0
  505. package/dist/repertoire/vault-unlock.js +686 -0
  506. package/dist/rsvp/aisleplanner-client.js +354 -0
  507. package/dist/rsvp/cli.js +936 -0
  508. package/dist/rsvp/config.js +327 -0
  509. package/dist/rsvp/cutover.js +433 -0
  510. package/dist/rsvp/diagnostics.js +232 -0
  511. package/dist/rsvp/diff-renderer.js +176 -0
  512. package/dist/rsvp/habit-policy.js +110 -0
  513. package/dist/rsvp/habit-stage.js +123 -0
  514. package/dist/rsvp/incident-bundle.js +97 -0
  515. package/dist/rsvp/migration.js +204 -0
  516. package/dist/rsvp/native-habit-runner.js +630 -0
  517. package/dist/rsvp/outbound-state.js +628 -0
  518. package/dist/rsvp/query.js +118 -0
  519. package/dist/rsvp/replay.js +233 -0
  520. package/dist/rsvp/snapshot.js +232 -0
  521. package/dist/rsvp/spend-ledger.js +175 -0
  522. package/dist/scripts/claude-code-hook.js +41 -0
  523. package/dist/scripts/claude-code-stop-hook.js +47 -0
  524. package/dist/senses/a2a-entry.js +132 -0
  525. package/dist/senses/acp-server.js +386 -0
  526. package/dist/senses/attention-queue.js +186 -0
  527. package/dist/senses/await-turn-message.js +65 -0
  528. package/dist/senses/bluebubbles/active-turns.js +216 -0
  529. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  530. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  531. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +379 -41
  532. package/dist/senses/bluebubbles/context-packet.js +207 -0
  533. package/dist/senses/bluebubbles/context-smoke.js +144 -0
  534. package/dist/senses/bluebubbles/entry.js +90 -0
  535. package/dist/senses/bluebubbles/host-account-verifier.js +88 -0
  536. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
  537. package/dist/senses/bluebubbles/index.js +3878 -0
  538. package/dist/senses/bluebubbles/latest-turn.js +311 -0
  539. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
  540. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
  541. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
  542. package/dist/senses/bluebubbles/outbound-state.js +308 -0
  543. package/dist/senses/bluebubbles/processed-log.js +133 -0
  544. package/dist/senses/bluebubbles/reaction-policy.js +47 -0
  545. package/dist/senses/bluebubbles/replay.js +284 -0
  546. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
  547. package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
  548. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  549. package/dist/senses/bluebubbles/webhook-registration.js +257 -0
  550. package/dist/senses/bluebubbles-meta-guard.js +39 -0
  551. package/dist/senses/cli/bracketed-paste.js +82 -0
  552. package/dist/senses/cli/image-paste.js +287 -0
  553. package/dist/senses/cli/image-ref-navigation.js +75 -0
  554. package/dist/senses/cli/ink-app.js +156 -0
  555. package/dist/senses/cli/inline-diff.js +64 -0
  556. package/dist/senses/cli/input-keys.js +174 -0
  557. package/dist/senses/cli/kill-ring.js +86 -0
  558. package/dist/senses/cli/message-list.js +51 -0
  559. package/dist/senses/cli/ouro-tui.js +607 -0
  560. package/dist/senses/cli/spinner-imperative.js +135 -0
  561. package/dist/senses/cli/spinner.js +101 -0
  562. package/dist/senses/cli/status-line.js +60 -0
  563. package/dist/senses/cli/streaming-markdown.js +526 -0
  564. package/dist/senses/cli/tool-display.js +85 -0
  565. package/dist/senses/cli/tool-render.js +85 -0
  566. package/dist/senses/cli/tui-store.js +241 -0
  567. package/dist/senses/cli/virtual-list.js +35 -0
  568. package/dist/senses/cli-entry.js +60 -8
  569. package/dist/senses/cli.js +601 -304
  570. package/dist/senses/commands.js +66 -3
  571. package/dist/senses/context-packet-ledger.js +371 -0
  572. package/dist/senses/context-packets.js +154 -0
  573. package/dist/senses/habit-lifecycle-guard.js +24 -0
  574. package/dist/senses/habit-turn-message.js +160 -0
  575. package/dist/senses/ingress-evidence.js +2 -0
  576. package/dist/senses/mail-entry.js +66 -0
  577. package/dist/senses/mail.js +524 -0
  578. package/dist/senses/pipeline.js +1158 -204
  579. package/dist/senses/private-runtime-worker.js +859 -0
  580. package/dist/senses/private-runtime.js +1627 -0
  581. package/dist/senses/proactive-content-guard.js +51 -0
  582. package/dist/senses/root-host-approval-port.js +345 -0
  583. package/dist/senses/root-host-approval-runtime.js +393 -0
  584. package/dist/senses/sanctuary-authority-resident.js +102 -0
  585. package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
  586. package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
  587. package/dist/senses/sanctuary-grounding.js +118 -0
  588. package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
  589. package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
  590. package/dist/senses/sanctuary-health-runner.js +104 -0
  591. package/dist/senses/sanctuary-health.js +422 -0
  592. package/dist/senses/sanctuary-install-state-contract.js +169 -0
  593. package/dist/senses/sanctuary-interactive-control.js +410 -0
  594. package/dist/senses/sanctuary-media-catalog-contract.js +259 -0
  595. package/dist/senses/sanctuary-media-optimization.js +514 -0
  596. package/dist/senses/sanctuary-runtime.js +369 -0
  597. package/dist/senses/sanctuary-sab.js +85 -0
  598. package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
  599. package/dist/senses/shared-turn.js +793 -0
  600. package/dist/senses/shepherd/client.js +196 -0
  601. package/dist/senses/shepherd/cmux.js +344 -0
  602. package/dist/senses/shepherd/herdr.js +315 -0
  603. package/dist/senses/shepherd/host.js +14 -0
  604. package/dist/senses/shepherd/judge.js +137 -0
  605. package/dist/senses/shepherd/owner-notice.js +245 -0
  606. package/dist/senses/shepherd/redact.js +66 -0
  607. package/dist/senses/shepherd/returns.js +79 -0
  608. package/dist/senses/shepherd/sense.js +309 -0
  609. package/dist/senses/shepherd-entry.js +78 -0
  610. package/dist/senses/surface-tool.js +109 -0
  611. package/dist/senses/teams-entry.js +68 -8
  612. package/dist/senses/teams.js +598 -233
  613. package/dist/senses/telegram-admission.js +718 -0
  614. package/dist/senses/telegram-approval-runtime.js +793 -0
  615. package/dist/senses/telegram-attachments.js +186 -0
  616. package/dist/senses/telegram-audit-ledger.js +220 -0
  617. package/dist/senses/telegram-authority-transport.js +231 -0
  618. package/dist/senses/telegram-client.js +1749 -0
  619. package/dist/senses/telegram-effect-adapter.js +900 -0
  620. package/dist/senses/telegram-entry.js +83 -0
  621. package/dist/senses/telegram-handoff.js +80 -0
  622. package/dist/senses/telegram.js +2405 -0
  623. package/dist/senses/trust-gate.js +104 -9
  624. package/dist/senses/voice/audio-playback.js +237 -0
  625. package/dist/senses/voice/audio-routing.js +119 -0
  626. package/dist/senses/voice/call-auth.js +250 -0
  627. package/dist/senses/voice/elevenlabs.js +202 -0
  628. package/dist/senses/voice/floor-control.js +431 -0
  629. package/dist/senses/voice/floor-controller.js +115 -0
  630. package/dist/senses/voice/golden-path.js +116 -0
  631. package/dist/senses/voice/index.js +29 -0
  632. package/dist/senses/voice/local-audio-control.js +344 -0
  633. package/dist/senses/voice/local-audio-devices.js +516 -0
  634. package/dist/senses/voice/local-audio-disclosure.js +174 -0
  635. package/dist/senses/voice/local-audio-identity.js +103 -0
  636. package/dist/senses/voice/local-audio-join.js +325 -0
  637. package/dist/senses/voice/local-audio-mute.js +199 -0
  638. package/dist/senses/voice/local-audio-notify.js +121 -0
  639. package/dist/senses/voice/local-audio-prompts.js +116 -0
  640. package/dist/senses/voice/local-audio-transport.js +427 -0
  641. package/dist/senses/voice/local-audio.js +281 -0
  642. package/dist/senses/voice/local-media-stream.js +145 -0
  643. package/dist/senses/voice/meeting.js +113 -0
  644. package/dist/senses/voice/outbound.js +190 -0
  645. package/dist/senses/voice/phone.js +33 -0
  646. package/dist/senses/voice/playback.js +139 -0
  647. package/dist/senses/voice/process-guards.js +51 -0
  648. package/dist/senses/voice/realtime-eval.js +496 -0
  649. package/dist/senses/voice/realtime-tool-schema.js +195 -0
  650. package/dist/senses/voice/realtime-trace.js +531 -0
  651. package/dist/senses/voice/transcript.js +70 -0
  652. package/dist/senses/voice/turn.js +191 -0
  653. package/dist/senses/voice/twilio-phone-runtime.js +836 -0
  654. package/dist/senses/voice/twilio-phone.js +5454 -0
  655. package/dist/senses/voice/types.js +2 -0
  656. package/dist/senses/voice/whisper.js +161 -0
  657. package/dist/senses/voice-entry.js +83 -0
  658. package/dist/senses/voice-realtime-eval-command.js +99 -0
  659. package/dist/senses/voice-realtime-eval-entry.js +21 -0
  660. package/dist/senses/voice-twilio-entry.js +87 -0
  661. package/dist/trips/core.js +138 -0
  662. package/dist/trips/store.js +265 -0
  663. package/dist/util/frontmatter.js +69 -0
  664. package/npm-shrinkwrap.json +8100 -0
  665. package/package.json +74 -13
  666. package/skills/agent-commerce.md +113 -0
  667. package/skills/browser-navigation.md +117 -0
  668. package/skills/commerce-setup-guide.md +116 -0
  669. package/skills/commerce-setup.md +84 -0
  670. package/skills/configure-dev-tools.md +99 -0
  671. package/skills/travel-planning.md +138 -0
  672. package/dist/heart/daemon/auth-flow.js +0 -430
  673. package/dist/heart/daemon/ouro-path-installer.js +0 -260
  674. package/dist/heart/daemon/ouro-version-manager.js +0 -171
  675. package/dist/heart/daemon/update-hooks.js +0 -138
  676. package/dist/heart/obligations.js +0 -191
  677. package/dist/heart/safe-workspace.js +0 -362
  678. package/dist/heart/session-recall.js +0 -116
  679. package/dist/mind/friends/channel.js +0 -84
  680. package/dist/mind/friends/group-context.js +0 -144
  681. package/dist/mind/friends/resolver.js +0 -84
  682. package/dist/mind/friends/store-file.js +0 -190
  683. package/dist/mind/friends/store.js +0 -4
  684. package/dist/mind/friends/tokens.js +0 -26
  685. package/dist/mind/friends/trust-explanation.js +0 -74
  686. package/dist/mind/friends/types.js +0 -29
  687. package/dist/repertoire/tasks/board.js +0 -134
  688. package/dist/repertoire/tasks/index.js +0 -224
  689. package/dist/repertoire/tasks/lifecycle.js +0 -80
  690. package/dist/repertoire/tasks/middleware.js +0 -65
  691. package/dist/repertoire/tasks/parser.js +0 -173
  692. package/dist/repertoire/tasks/scanner.js +0 -132
  693. package/dist/repertoire/tasks/transitions.js +0 -144
  694. package/dist/senses/bluebubbles-entry.js +0 -13
  695. package/dist/senses/bluebubbles.js +0 -1181
  696. package/dist/senses/debug-activity.js +0 -154
  697. package/dist/senses/inner-dialog-worker.js +0 -90
  698. package/dist/senses/inner-dialog.js +0 -525
  699. package/subagents/README.md +0 -7
  700. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  701. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  702. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  703. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  704. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  705. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  706. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  707. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  708. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  709. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  710. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  711. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  712. /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
  713. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  714. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  715. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  716. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -1,111 +1,447 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FinalAnswerStreamer = exports.FinalAnswerParser = void 0;
3
+ exports.RESPONSES_FUNCTION_CALL_OUTPUT_CAP = exports.ProviderTextOutput = exports.SettleStreamer = exports.SettleParser = exports.SettleFinalizationCallbackError = void 0;
4
+ exports.finalizeSettleStream = finalizeSettleStream;
5
+ exports.truncateResponsesFunctionCallOutput = truncateResponsesFunctionCallOutput;
4
6
  exports.toResponsesInput = toResponsesInput;
5
7
  exports.toResponsesTools = toResponsesTools;
8
+ exports.toolArgumentsOrEmptyObject = toolArgumentsOrEmptyObject;
6
9
  exports.streamChatCompletion = streamChatCompletion;
7
10
  exports.streamResponsesApi = streamResponsesApi;
8
11
  const runtime_1 = require("../nerves/runtime");
9
- // Character-level state machine that extracts the answer value from
10
- // `final_answer` tool call JSON arguments as they stream in.
11
- // Scans for prefix `"answer":"` or `"answer": "` in the character stream,
12
- // then emits text handling JSON escapes, stopping at unescaped closing `"`.
13
- class FinalAnswerParser {
14
- // Possible prefixes to match (with and without space after colon)
15
- static PREFIXES = ['"answer":"', '"answer": "'];
16
- // Buffer of characters seen so far (pre-activation only)
17
- buf = "";
12
+ class SettleFinalizationCallbackError extends Error {
13
+ retryable = false;
14
+ cause;
15
+ constructor(cause) {
16
+ const normalized = cause instanceof Error ? cause : new Error(String(cause));
17
+ super(`settle finalization callback failed: ${normalized.message}`);
18
+ this.name = "SettleFinalizationCallbackError";
19
+ this.cause = normalized;
20
+ }
21
+ }
22
+ exports.SettleFinalizationCallbackError = SettleFinalizationCallbackError;
23
+ function isJsonWhitespace(character) {
24
+ return character === " " || character === "\t" || character === "\n" || character === "\r";
25
+ }
26
+ function isHighSurrogate(character) {
27
+ const code = character.charCodeAt(0);
28
+ return code >= 0xD800 && code <= 0xDBFF;
29
+ }
30
+ function isLowSurrogate(character) {
31
+ const code = character.charCodeAt(0);
32
+ return code >= 0xDC00 && code <= 0xDFFF;
33
+ }
34
+ // Incremental JSON string decoder for the top-level `answer` property in
35
+ // streamed settle arguments. JSON.parse remains the terminal authority; this
36
+ // state machine exists only to emit validated string units before EOF.
37
+ class SettleParser {
38
+ rawArguments = "";
18
39
  _active = false;
19
40
  _complete = false;
20
- inEscape = false;
41
+ invalid = false;
42
+ terminalResult;
43
+ containers = [];
44
+ rootLastSignificant = "";
45
+ scanInString = false;
46
+ scanEscape = false;
47
+ scanStringRaw = "";
48
+ scanStringIsRootKey = false;
49
+ answerKeyState = "none";
50
+ decodeState = "normal";
51
+ unicodeDigits = "";
52
+ pendingHighSurrogate = "";
53
+ decodedAnswer = "";
21
54
  get active() { return this._active; }
22
55
  get complete() { return this._complete; }
23
56
  process(delta) {
24
- if (this._complete)
57
+ if (this.terminalResult)
58
+ return "";
59
+ this.rawArguments += delta;
60
+ if (this._complete || this.invalid)
25
61
  return "";
26
62
  let out = "";
27
63
  for (let i = 0; i < delta.length; i++) {
28
64
  const ch = delta[i];
29
- if (!this._active) {
30
- this.buf += ch;
31
- // Check if any prefix has been fully matched in the buffer
32
- for (const prefix of FinalAnswerParser.PREFIXES) {
33
- if (this.buf.endsWith(prefix)) {
34
- this._active = true;
35
- break;
36
- }
37
- }
65
+ if (this._active) {
66
+ out += this.processAnswerCharacter(ch);
38
67
  }
39
68
  else {
40
- // Active: emit characters, handling JSON escapes
41
- if (this.inEscape) {
42
- this.inEscape = false;
43
- switch (ch) {
44
- case '"':
45
- out += '"';
46
- break;
47
- case '\\':
48
- out += '\\';
49
- break;
50
- case 'n':
51
- out += '\n';
52
- break;
53
- case 't':
54
- out += '\t';
55
- break;
56
- case '/':
57
- out += '/';
58
- break;
59
- default:
60
- out += ch;
61
- break; // unknown escape: pass through character
69
+ this.scanForTopLevelAnswer(ch);
70
+ }
71
+ if (this._complete || this.invalid)
72
+ break;
73
+ }
74
+ return out;
75
+ }
76
+ finish() {
77
+ if (this.terminalResult)
78
+ return this.terminalResult;
79
+ if (this.invalid) {
80
+ return this.setTerminalFailure("invalid_settle_arguments");
81
+ }
82
+ let parsed;
83
+ try {
84
+ parsed = JSON.parse(this.rawArguments);
85
+ }
86
+ catch (error) {
87
+ const errorCode = this.isIncompleteAtEof(error)
88
+ ? "incomplete_settle_arguments"
89
+ : "invalid_settle_arguments";
90
+ return this.setTerminalFailure(errorCode);
91
+ }
92
+ if (typeof parsed !== "object"
93
+ || parsed === null
94
+ || Array.isArray(parsed)
95
+ || typeof parsed.answer !== "string"
96
+ || !this._active
97
+ || !this._complete) {
98
+ return this.setTerminalFailure("invalid_settle_arguments");
99
+ }
100
+ const answer = parsed.answer;
101
+ if (answer !== this.decodedAnswer) {
102
+ return this.setTerminalFailure("invalid_settle_arguments");
103
+ }
104
+ this.terminalResult = { ok: true, answer };
105
+ return this.terminalResult;
106
+ }
107
+ scanForTopLevelAnswer(character) {
108
+ if (this.scanInString) {
109
+ if (this.scanEscape) {
110
+ this.scanStringRaw += character;
111
+ this.scanEscape = false;
112
+ return;
113
+ }
114
+ if (character === "\\") {
115
+ this.scanStringRaw += character;
116
+ this.scanEscape = true;
117
+ return;
118
+ }
119
+ if (character !== '"') {
120
+ this.scanStringRaw += character;
121
+ return;
122
+ }
123
+ this.scanInString = false;
124
+ this.rootLastSignificant = '"';
125
+ if (this.scanStringIsRootKey) {
126
+ try {
127
+ if (JSON.parse(`"${this.scanStringRaw}"`) === "answer") {
128
+ this.answerKeyState = "after_key";
62
129
  }
63
130
  }
64
- else if (ch === '\\') {
65
- this.inEscape = true;
66
- }
67
- else if (ch === '"') {
68
- this._complete = true;
69
- return out; // stop processing, closing quote found
70
- }
71
- else {
72
- out += ch;
131
+ catch {
132
+ this.invalid = true;
73
133
  }
74
134
  }
135
+ this.scanStringRaw = "";
136
+ this.scanStringIsRootKey = false;
137
+ return;
75
138
  }
76
- return out;
139
+ if (this.answerKeyState === "after_key") {
140
+ if (isJsonWhitespace(character))
141
+ return;
142
+ if (character === ":") {
143
+ this.answerKeyState = "after_colon";
144
+ this.rootLastSignificant = character;
145
+ return;
146
+ }
147
+ this.invalid = true;
148
+ return;
149
+ }
150
+ if (this.answerKeyState === "after_colon") {
151
+ if (isJsonWhitespace(character))
152
+ return;
153
+ this.answerKeyState = "none";
154
+ if (character === '"') {
155
+ this._active = true;
156
+ this.rootLastSignificant = "value";
157
+ return;
158
+ }
159
+ }
160
+ if (isJsonWhitespace(character))
161
+ return;
162
+ const atRootObject = this.containers.length === 1 && this.containers[0] === "object";
163
+ if (character === '"') {
164
+ this.scanInString = true;
165
+ this.scanEscape = false;
166
+ this.scanStringRaw = "";
167
+ this.scanStringIsRootKey = atRootObject
168
+ && (this.rootLastSignificant === "{" || this.rootLastSignificant === ",");
169
+ return;
170
+ }
171
+ if (character === "{" || character === "[") {
172
+ if (atRootObject)
173
+ this.rootLastSignificant = "value";
174
+ this.containers.push(character === "{" ? "object" : "array");
175
+ if (this.containers.length === 1 && character === "{") {
176
+ this.rootLastSignificant = character;
177
+ }
178
+ return;
179
+ }
180
+ if (character === "}" || character === "]") {
181
+ const expected = character === "}" ? "object" : "array";
182
+ if (this.containers.at(-1) !== expected) {
183
+ this.invalid = true;
184
+ return;
185
+ }
186
+ this.containers.pop();
187
+ if (this.containers.length === 1 && this.containers[0] === "object") {
188
+ this.rootLastSignificant = "value";
189
+ }
190
+ return;
191
+ }
192
+ if (atRootObject)
193
+ this.rootLastSignificant = character;
194
+ }
195
+ processAnswerCharacter(character) {
196
+ if (this.decodeState === "unicode") {
197
+ if (!/^[0-9A-Fa-f]$/.test(character)) {
198
+ this.invalid = true;
199
+ return "";
200
+ }
201
+ this.unicodeDigits += character;
202
+ if (this.unicodeDigits.length < 4)
203
+ return "";
204
+ const decoded = String.fromCharCode(Number.parseInt(this.unicodeDigits, 16));
205
+ this.unicodeDigits = "";
206
+ this.decodeState = "normal";
207
+ return this.appendDecodedUnit(decoded);
208
+ }
209
+ if (this.decodeState === "escape") {
210
+ this.decodeState = "normal";
211
+ switch (character) {
212
+ case '"': return this.appendDecodedUnit('"');
213
+ case "\\": return this.appendDecodedUnit("\\");
214
+ case "/": return this.appendDecodedUnit("/");
215
+ case "b": return this.appendDecodedUnit("\b");
216
+ case "f": return this.appendDecodedUnit("\f");
217
+ case "n": return this.appendDecodedUnit("\n");
218
+ case "r": return this.appendDecodedUnit("\r");
219
+ case "t": return this.appendDecodedUnit("\t");
220
+ case "u":
221
+ this.decodeState = "unicode";
222
+ return "";
223
+ default:
224
+ this.invalid = true;
225
+ return "";
226
+ }
227
+ }
228
+ if (character === "\\") {
229
+ this.decodeState = "escape";
230
+ return "";
231
+ }
232
+ if (character === '"') {
233
+ const trailing = this.flushPendingHighSurrogate();
234
+ this._complete = true;
235
+ return trailing;
236
+ }
237
+ if (character.charCodeAt(0) <= 0x1F) {
238
+ this.invalid = true;
239
+ return "";
240
+ }
241
+ return this.appendDecodedUnit(character);
242
+ }
243
+ appendDecodedUnit(character) {
244
+ let out = "";
245
+ if (this.pendingHighSurrogate) {
246
+ if (isLowSurrogate(character)) {
247
+ const pair = this.pendingHighSurrogate + character;
248
+ this.pendingHighSurrogate = "";
249
+ this.decodedAnswer += pair;
250
+ return pair;
251
+ }
252
+ out = this.flushPendingHighSurrogate();
253
+ }
254
+ if (isHighSurrogate(character)) {
255
+ this.pendingHighSurrogate = character;
256
+ return out;
257
+ }
258
+ this.decodedAnswer += character;
259
+ return out + character;
260
+ }
261
+ flushPendingHighSurrogate() {
262
+ if (!this.pendingHighSurrogate)
263
+ return "";
264
+ const pending = this.pendingHighSurrogate;
265
+ this.pendingHighSurrogate = "";
266
+ this.decodedAnswer += pending;
267
+ return pending;
268
+ }
269
+ isIncompleteAtEof(error) {
270
+ if (this._active && !this._complete)
271
+ return true;
272
+ if (this.rawArguments.length === 0)
273
+ return true;
274
+ if (!(error instanceof SyntaxError))
275
+ return false;
276
+ if (/Unexpected end|Unterminated string/i.test(error.message))
277
+ return true;
278
+ const position = /position (\d+)/i.exec(error.message);
279
+ return position ? Number(position[1]) >= this.rawArguments.length : false;
280
+ }
281
+ setTerminalFailure(errorCode) {
282
+ this.terminalResult = { ok: false, errorCode };
283
+ return this.terminalResult;
77
284
  }
78
285
  }
79
- exports.FinalAnswerParser = FinalAnswerParser;
80
- // Shared helper: wraps FinalAnswerParser with onClearText + onTextChunk wiring.
286
+ exports.SettleParser = SettleParser;
287
+ // Shared helper: wraps SettleParser with onClearText + onTextChunk wiring.
81
288
  // Used by all streaming providers (Chat Completions, Responses API, Anthropic)
82
- // so the eager-match streaming pattern lives in one place.
83
- class FinalAnswerStreamer {
84
- parser = new FinalAnswerParser();
289
+ // so the eager-match settle streaming pattern lives in one place.
290
+ class SettleStreamer {
291
+ parser = new SettleParser();
85
292
  _detected = false;
293
+ _streamed = false;
86
294
  callbacks;
87
- constructor(callbacks) {
295
+ enabled;
296
+ mode;
297
+ observedArguments = "";
298
+ eagerAnswer = "";
299
+ terminalResult;
300
+ cancelled = false;
301
+ constructor(callbacks, enabled = true) {
88
302
  this.callbacks = callbacks;
303
+ this.enabled = enabled;
304
+ // Production callback owners declare their mode explicitly. Retain the
305
+ // historical retractable default for third-party/in-test callback objects.
306
+ this.mode = callbacks.settleOutputMode ?? "retractable_buffer";
89
307
  }
90
308
  get detected() { return this._detected; }
91
- get streamed() { return this.parser.active; }
92
- /** Mark final_answer as detected. Calls onClearText on the callbacks. */
309
+ get streamed() { return this._streamed; }
310
+ /** Mark settle as detected. Calls onClearText on the callbacks. */
93
311
  activate() {
312
+ if (!this.enabled)
313
+ return;
94
314
  if (this._detected)
95
315
  return;
96
316
  this._detected = true;
97
- this.callbacks.onClearText?.();
317
+ if (this.mode === "retractable_buffer")
318
+ this.callbacks.onClearText?.();
98
319
  }
99
320
  /** Feed an argument delta through the parser. Emits text via onTextChunk. */
100
321
  processDelta(delta) {
322
+ if (!this.enabled)
323
+ return;
101
324
  if (!this._detected)
102
325
  return;
326
+ if (this.cancelled || this.terminalResult)
327
+ return;
328
+ this.observedArguments += delta;
103
329
  const text = this.parser.process(delta);
104
- if (text)
330
+ if (text && this.mode === "retractable_buffer") {
331
+ this.callbacks.onTextChunk(text);
332
+ this.eagerAnswer += text;
333
+ }
334
+ }
335
+ /** Validate the completed provider arguments exactly once, then commit or
336
+ * retract callback-visible output according to the callback owner's mode. */
337
+ finish(completedArguments) {
338
+ if (!this.enabled || !this._detected || this.cancelled)
339
+ return undefined;
340
+ if (this.terminalResult)
341
+ return this.terminalResult;
342
+ let finalSuffix = "";
343
+ let replacedObservedArguments = false;
344
+ if (completedArguments.startsWith(this.observedArguments)) {
345
+ const suffix = completedArguments.slice(this.observedArguments.length);
346
+ this.observedArguments = completedArguments;
347
+ finalSuffix = this.parser.process(suffix);
348
+ }
349
+ else {
350
+ // A provider may normalize or replace its streamed argument fragments in
351
+ // the completed tool call. Re-parse that one authoritative final value;
352
+ // any eager output from the divergent fragment is retracted below.
353
+ replacedObservedArguments = true;
354
+ this.parser = new SettleParser();
355
+ this.observedArguments = completedArguments;
356
+ finalSuffix = this.parser.process(completedArguments);
357
+ }
358
+ const result = this.parser.finish();
359
+ // Cache before invoking callbacks: a callback failure must never make a
360
+ // repeated finish parse or commit the answer again.
361
+ this.terminalResult = result;
362
+ if (!result.ok) {
363
+ if (this.mode === "retractable_buffer")
364
+ this.callbacks.onClearText?.();
365
+ return result;
366
+ }
367
+ if (this.mode === "retractable_buffer") {
368
+ if (replacedObservedArguments) {
369
+ this.callbacks.onClearText?.();
370
+ this.callbacks.onTextChunk(result.answer);
371
+ }
372
+ else if (finalSuffix) {
373
+ this.callbacks.onTextChunk(finalSuffix);
374
+ }
375
+ this._streamed = true;
376
+ }
377
+ return result;
378
+ }
379
+ /** Cancel a partial provider stream without terminal parsing or commit. */
380
+ cancel() {
381
+ if (!this.enabled || !this._detected || this.cancelled || this.terminalResult)
382
+ return;
383
+ this.cancelled = true;
384
+ if (this.mode === "retractable_buffer" && this.eagerAnswer) {
385
+ this.callbacks.onClearText?.();
386
+ }
387
+ }
388
+ }
389
+ exports.SettleStreamer = SettleStreamer;
390
+ function finalizeSettleStream(streamer, completedArguments) {
391
+ try {
392
+ return streamer.finish(completedArguments);
393
+ }
394
+ catch (error) {
395
+ throw new SettleFinalizationCallbackError(error);
396
+ }
397
+ }
398
+ /** Holds ordinary provider text until a final-only response is known not to be
399
+ * an invalid settle. Retractable callback owners continue receiving deltas. */
400
+ class ProviderTextOutput {
401
+ callbacks;
402
+ bufferedText = "";
403
+ deferred;
404
+ suppressed = false;
405
+ constructor(callbacks) {
406
+ this.callbacks = callbacks;
407
+ this.deferred = callbacks.settleOutputMode === "final_only";
408
+ }
409
+ emit(text) {
410
+ if (this.suppressed)
411
+ return;
412
+ if (this.deferred) {
413
+ this.bufferedText += text;
414
+ }
415
+ else {
105
416
  this.callbacks.onTextChunk(text);
417
+ }
418
+ }
419
+ suppress() {
420
+ this.bufferedText = "";
421
+ this.suppressed = true;
422
+ }
423
+ discard() {
424
+ this.bufferedText = "";
425
+ }
426
+ flush() {
427
+ if (!this.bufferedText)
428
+ return;
429
+ const text = this.bufferedText;
430
+ this.bufferedText = "";
431
+ this.callbacks.onTextChunk(text);
106
432
  }
107
433
  }
108
- exports.FinalAnswerStreamer = FinalAnswerStreamer;
434
+ exports.ProviderTextOutput = ProviderTextOutput;
435
+ exports.RESPONSES_FUNCTION_CALL_OUTPUT_CAP = 200_000;
436
+ function truncateResponsesFunctionCallOutput(output, maxChars = exports.RESPONSES_FUNCTION_CALL_OUTPUT_CAP) {
437
+ if (output.length <= maxChars)
438
+ return output;
439
+ const marker = `\n\n[truncated — function_call_output exceeded ${maxChars} chars; original length ${output.length} chars]\n\n`;
440
+ const remainingBudget = Math.max(0, maxChars - marker.length);
441
+ const headLength = Math.ceil(remainingBudget * 0.75);
442
+ const tailLength = Math.max(0, remainingBudget - headLength);
443
+ return `${output.slice(0, headLength)}${marker}${output.slice(-tailLength)}`;
444
+ }
109
445
  function toResponsesUserContent(content) {
110
446
  if (typeof content === "string") {
111
447
  return content;
@@ -161,14 +497,14 @@ function toResponsesUserContent(content) {
161
497
  return parts.length > 0 ? parts : "";
162
498
  }
163
499
  function toResponsesInput(messages) {
164
- let instructions = "";
500
+ const instructionParts = [];
165
501
  const input = [];
166
502
  for (const msg of messages) {
167
503
  if (msg.role === "system") {
168
- if (!instructions) {
169
- const sys = msg;
170
- instructions = (typeof sys.content === "string" ? sys.content : "") || "";
171
- }
504
+ const sys = msg;
505
+ const content = (typeof sys.content === "string" ? sys.content : "").trim();
506
+ if (content)
507
+ instructionParts.push(content);
172
508
  continue;
173
509
  }
174
510
  if (msg.role === "user") {
@@ -211,12 +547,12 @@ function toResponsesInput(messages) {
211
547
  input.push({
212
548
  type: "function_call_output",
213
549
  call_id: t.tool_call_id,
214
- output: typeof t.content === "string" ? t.content : "",
550
+ output: truncateResponsesFunctionCallOutput(typeof t.content === "string" ? t.content : ""),
215
551
  });
216
552
  continue;
217
553
  }
218
554
  }
219
- return { instructions, input };
555
+ return { instructions: instructionParts.join("\n\n"), input };
220
556
  }
221
557
  function toResponsesTools(ccTools) {
222
558
  return ccTools.map((t) => ({
@@ -227,7 +563,11 @@ function toResponsesTools(ccTools) {
227
563
  strict: false,
228
564
  }));
229
565
  }
230
- async function streamChatCompletion(client, createParams, callbacks, signal) {
566
+ /** Providers send an empty string for a tool called with no arguments; every reader expects a JSON object. */
567
+ function toolArgumentsOrEmptyObject(raw) {
568
+ return raw.trim() === "" ? "{}" : raw;
569
+ }
570
+ async function streamChatCompletion(client, createParams, callbacks, signal, eagerSettleStreaming = true) {
231
571
  (0, runtime_1.emitNervesEvent)({
232
572
  component: "engine",
233
573
  event: "engine.stream_start",
@@ -241,7 +581,8 @@ async function streamChatCompletion(client, createParams, callbacks, signal) {
241
581
  let toolCalls = {};
242
582
  let streamStarted = false;
243
583
  let usage;
244
- const answerStreamer = new FinalAnswerStreamer(callbacks);
584
+ const answerStreamer = new SettleStreamer(callbacks, eagerSettleStreaming);
585
+ const textOutput = new ProviderTextOutput(callbacks);
245
586
  // State machine for parsing inline <think> tags (MiniMax pattern)
246
587
  let contentBuf = "";
247
588
  let inThinkTag = false;
@@ -284,7 +625,7 @@ async function streamChatCompletion(client, createParams, callbacks, signal) {
284
625
  if (start !== -1) {
285
626
  const text = contentBuf.slice(0, start);
286
627
  if (text)
287
- callbacks.onTextChunk(text);
628
+ textOutput.emit(text);
288
629
  contentBuf = contentBuf.slice(start + OPEN_TAG.length);
289
630
  inThinkTag = true;
290
631
  }
@@ -299,95 +640,120 @@ async function streamChatCompletion(client, createParams, callbacks, signal) {
299
640
  if (retain > 0) {
300
641
  const text = contentBuf.slice(0, -retain);
301
642
  if (text)
302
- callbacks.onTextChunk(text);
643
+ textOutput.emit(text);
303
644
  contentBuf = contentBuf.slice(-retain);
304
645
  return;
305
646
  }
306
647
  }
307
648
  // All content, flush it
308
- callbacks.onTextChunk(contentBuf);
649
+ textOutput.emit(contentBuf);
309
650
  contentBuf = "";
310
651
  }
311
652
  }
312
653
  }
313
654
  }
314
- for await (const chunk of response) {
315
- if (signal?.aborted)
316
- break;
317
- // Capture usage from final chunk (sent when stream_options.include_usage is true)
318
- if (chunk.usage) {
319
- const u = chunk.usage;
320
- usage = {
321
- input_tokens: u.prompt_tokens,
322
- output_tokens: u.completion_tokens,
323
- reasoning_tokens: u.completion_tokens_details?.reasoning_tokens ?? 0,
324
- total_tokens: u.total_tokens,
325
- };
326
- }
327
- const d = chunk.choices[0]?.delta;
328
- if (!d)
329
- continue;
330
- // Handle reasoning_content (Azure AI models like DeepSeek-R1)
331
- if (d.reasoning_content) {
332
- if (!streamStarted) {
333
- callbacks.onModelStreamStart();
334
- streamStarted = true;
655
+ try {
656
+ for await (const chunk of response) {
657
+ if (signal?.aborted)
658
+ break;
659
+ // Capture usage from final chunk (sent when stream_options.include_usage is true)
660
+ if (chunk.usage) {
661
+ const u = chunk.usage;
662
+ usage = {
663
+ input_tokens: u.prompt_tokens,
664
+ output_tokens: u.completion_tokens,
665
+ reasoning_tokens: u.completion_tokens_details?.reasoning_tokens ?? 0,
666
+ total_tokens: u.total_tokens,
667
+ };
335
668
  }
336
- callbacks.onReasoningChunk(d.reasoning_content);
337
- }
338
- if (d.content) {
339
- if (!streamStarted) {
340
- callbacks.onModelStreamStart();
341
- streamStarted = true;
669
+ const d = chunk.choices[0]?.delta;
670
+ if (!d)
671
+ continue;
672
+ // Handle reasoning_content (Azure AI models like DeepSeek-R1)
673
+ if (d.reasoning_content) {
674
+ if (!streamStarted) {
675
+ callbacks.onModelStreamStart();
676
+ streamStarted = true;
677
+ }
678
+ callbacks.onReasoningChunk(d.reasoning_content);
342
679
  }
343
- content += d.content;
344
- contentBuf += d.content;
345
- processContentBuf(false);
346
- }
347
- if (d.tool_calls) {
348
- for (const tc of d.tool_calls) {
349
- if (!toolCalls[tc.index])
350
- toolCalls[tc.index] = {
351
- id: tc.id ?? "",
352
- name: tc.function?.name ?? "",
353
- arguments: "",
354
- };
355
- if (tc.id)
356
- toolCalls[tc.index].id = tc.id;
357
- if (tc.function?.name) {
358
- toolCalls[tc.index].name = tc.function.name;
359
- // Detect final_answer tool call on first name delta.
360
- // Only activate streaming if this is the sole tool call (index 0
361
- // and no other indices seen). Mixed calls are rejected by core.ts.
362
- if (tc.function.name === "final_answer" && !answerStreamer.detected
363
- && tc.index === 0 && Object.keys(toolCalls).length === 1) {
364
- answerStreamer.activate();
365
- }
680
+ if (d.content) {
681
+ if (!streamStarted) {
682
+ callbacks.onModelStreamStart();
683
+ streamStarted = true;
366
684
  }
367
- if (tc.function?.arguments) {
368
- toolCalls[tc.index].arguments += tc.function.arguments;
369
- // Feed final_answer argument deltas to the parser for progressive
370
- // streaming, but only when it appears to be the sole tool call.
371
- if (answerStreamer.detected && toolCalls[tc.index].name === "final_answer"
372
- && Object.keys(toolCalls).length === 1) {
373
- answerStreamer.processDelta(tc.function.arguments);
685
+ content += d.content;
686
+ contentBuf += d.content;
687
+ processContentBuf(false);
688
+ }
689
+ if (d.tool_calls) {
690
+ for (const tc of d.tool_calls) {
691
+ if (!toolCalls[tc.index])
692
+ toolCalls[tc.index] = {
693
+ id: tc.id ?? "",
694
+ name: tc.function?.name ?? "",
695
+ arguments: "",
696
+ };
697
+ if (tc.id)
698
+ toolCalls[tc.index].id = tc.id;
699
+ if (tc.function?.name) {
700
+ toolCalls[tc.index].name = tc.function.name;
701
+ // Detect settle tool call on first name delta.
702
+ // Only activate streaming if this is the sole tool call (index 0
703
+ // and no other indices seen). Mixed calls are rejected by core.ts.
704
+ if (tc.function.name === "settle" && !answerStreamer.detected
705
+ && tc.index === 0 && Object.keys(toolCalls).length === 1) {
706
+ answerStreamer.activate();
707
+ textOutput.suppress();
708
+ }
709
+ }
710
+ if (tc.function?.arguments) {
711
+ toolCalls[tc.index].arguments += tc.function.arguments;
712
+ // Feed settle argument deltas to the parser for progressive
713
+ // streaming, but only when it appears to be the sole tool call.
714
+ if (answerStreamer.detected && toolCalls[tc.index].name === "settle"
715
+ && Object.keys(toolCalls).length === 1) {
716
+ answerStreamer.processDelta(tc.function.arguments);
717
+ }
374
718
  }
375
719
  }
376
720
  }
377
721
  }
378
722
  }
723
+ catch (error) {
724
+ textOutput.discard();
725
+ answerStreamer.cancel();
726
+ throw error;
727
+ }
379
728
  // Flush any remaining buffer at end of stream
380
729
  if (contentBuf)
381
730
  processContentBuf(true);
731
+ const completedToolCalls = Object.values(toolCalls).map((call) => ({ ...call, arguments: toolArgumentsOrEmptyObject(call.arguments) }));
732
+ let settleFinalization;
733
+ if (signal?.aborted) {
734
+ textOutput.discard();
735
+ answerStreamer.cancel();
736
+ }
737
+ else if (completedToolCalls.length === 1
738
+ && completedToolCalls[0].name === "settle"
739
+ && answerStreamer.detected) {
740
+ textOutput.discard();
741
+ settleFinalization = finalizeSettleStream(answerStreamer, completedToolCalls[0].arguments);
742
+ }
743
+ else {
744
+ answerStreamer.cancel();
745
+ textOutput.flush();
746
+ }
382
747
  return {
383
748
  content,
384
- toolCalls: Object.values(toolCalls),
749
+ toolCalls: completedToolCalls,
385
750
  outputItems: [],
386
751
  usage,
387
- finalAnswerStreamed: answerStreamer.streamed,
752
+ settleStreamed: answerStreamer.streamed,
753
+ ...(settleFinalization ? { settleFinalization } : {}),
388
754
  };
389
755
  }
390
- async function streamResponsesApi(client, createParams, callbacks, signal) {
756
+ async function streamResponsesApi(client, createParams, callbacks, signal, eagerSettleStreaming = true) {
391
757
  (0, runtime_1.emitNervesEvent)({
392
758
  component: "engine",
393
759
  event: "engine.stream_start",
@@ -402,85 +768,120 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
402
768
  const outputItems = [];
403
769
  let currentToolCall = null;
404
770
  let usage;
405
- const answerStreamer = new FinalAnswerStreamer(callbacks);
771
+ const answerStreamer = new SettleStreamer(callbacks, eagerSettleStreaming);
772
+ const textOutput = new ProviderTextOutput(callbacks);
406
773
  let functionCallCount = 0;
407
- for await (const event of response) {
408
- if (signal?.aborted)
409
- break;
410
- switch (event.type) {
411
- case "response.output_text.delta":
412
- case "response.reasoning_summary_text.delta": {
413
- if (!streamStarted) {
414
- callbacks.onModelStreamStart();
415
- streamStarted = true;
416
- }
417
- const delta = String(event.delta);
418
- if (event.type === "response.output_text.delta") {
419
- callbacks.onTextChunk(delta);
420
- content += delta;
421
- }
422
- else {
423
- callbacks.onReasoningChunk(delta);
424
- }
774
+ try {
775
+ for await (const event of response) {
776
+ if (signal?.aborted)
425
777
  break;
426
- }
427
- case "response.output_item.added": {
428
- if (event.item?.type === "function_call") {
429
- functionCallCount++;
430
- currentToolCall = {
431
- call_id: String(event.item.call_id),
432
- name: String(event.item.name),
433
- arguments: "",
434
- };
435
- // Detect final_answer function call -- clear any streamed noise.
436
- // Only activate when this is the first (and so far only) function call.
437
- // Mixed calls are rejected by core.ts; no need to stream their args.
438
- if (String(event.item.name) === "final_answer" && functionCallCount === 1) {
439
- answerStreamer.activate();
778
+ switch (event.type) {
779
+ case "response.output_text.delta":
780
+ case "response.reasoning_summary_text.delta": {
781
+ if (!streamStarted) {
782
+ callbacks.onModelStreamStart();
783
+ streamStarted = true;
784
+ }
785
+ const delta = String(event.delta);
786
+ if (event.type === "response.output_text.delta") {
787
+ textOutput.emit(delta);
788
+ content += delta;
789
+ }
790
+ else {
791
+ callbacks.onReasoningChunk(delta);
440
792
  }
793
+ break;
441
794
  }
442
- break;
443
- }
444
- case "response.function_call_arguments.delta": {
445
- if (currentToolCall) {
446
- currentToolCall.arguments += event.delta;
447
- // Feed final_answer argument deltas to the parser for progressive
448
- // streaming, but only when it appears to be the sole function call.
449
- if (answerStreamer.detected && currentToolCall.name === "final_answer"
450
- && functionCallCount === 1) {
451
- answerStreamer.processDelta(String(event.delta));
795
+ case "response.output_item.added": {
796
+ if (event.item?.type === "function_call") {
797
+ functionCallCount++;
798
+ currentToolCall = {
799
+ call_id: String(event.item.call_id),
800
+ name: String(event.item.name),
801
+ arguments: "",
802
+ };
803
+ // Detect settle function call -- clear any streamed noise.
804
+ // Only activate when this is the first (and so far only) function call.
805
+ // Mixed calls are rejected by core.ts; no need to stream their args.
806
+ if (String(event.item.name) === "settle" && functionCallCount === 1) {
807
+ answerStreamer.activate();
808
+ textOutput.suppress();
809
+ }
452
810
  }
811
+ break;
453
812
  }
454
- break;
455
- }
456
- case "response.output_item.done": {
457
- outputItems.push(event.item);
458
- if (event.item?.type === "function_call") {
459
- toolCalls.push({
460
- id: String(event.item.call_id),
461
- name: String(event.item.name),
462
- arguments: String(event.item.arguments),
463
- });
464
- currentToolCall = null;
813
+ case "response.function_call_arguments.delta": {
814
+ if (currentToolCall) {
815
+ currentToolCall.arguments += event.delta;
816
+ // Feed settle argument deltas to the parser for progressive
817
+ // streaming, but only when it appears to be the sole function call.
818
+ if (answerStreamer.detected && currentToolCall.name === "settle"
819
+ && functionCallCount === 1) {
820
+ answerStreamer.processDelta(String(event.delta));
821
+ }
822
+ }
823
+ break;
465
824
  }
466
- break;
467
- }
468
- case "response.completed":
469
- case "response.done": {
470
- const u = event.response?.usage;
471
- if (u) {
472
- usage = {
473
- input_tokens: u.input_tokens,
474
- output_tokens: u.output_tokens,
475
- reasoning_tokens: u.output_tokens_details?.reasoning_tokens ?? 0,
476
- total_tokens: u.total_tokens,
477
- };
825
+ case "response.output_item.done": {
826
+ outputItems.push(event.item);
827
+ if (event.item?.type === "function_call") {
828
+ toolCalls.push({
829
+ id: String(event.item.call_id),
830
+ name: String(event.item.name),
831
+ arguments: toolArgumentsOrEmptyObject(String(event.item.arguments)),
832
+ });
833
+ currentToolCall = null;
834
+ }
835
+ break;
478
836
  }
479
- break;
837
+ case "response.completed":
838
+ case "response.done": {
839
+ const u = event.response?.usage;
840
+ if (u) {
841
+ usage = {
842
+ input_tokens: u.input_tokens,
843
+ output_tokens: u.output_tokens,
844
+ reasoning_tokens: u.output_tokens_details?.reasoning_tokens ?? 0,
845
+ total_tokens: u.total_tokens,
846
+ };
847
+ }
848
+ break;
849
+ }
850
+ default:
851
+ // Unknown/unhandled events silently ignored
852
+ break;
480
853
  }
481
- default:
482
- // Unknown/unhandled events silently ignored
483
- break;
854
+ }
855
+ }
856
+ catch (error) {
857
+ textOutput.discard();
858
+ answerStreamer.cancel();
859
+ throw error;
860
+ }
861
+ let settleFinalization;
862
+ if (signal?.aborted) {
863
+ textOutput.discard();
864
+ answerStreamer.cancel();
865
+ }
866
+ else {
867
+ if (toolCalls.length === 0 && functionCallCount === 1 && currentToolCall?.name === "settle") {
868
+ toolCalls.push({
869
+ id: currentToolCall.call_id,
870
+ name: currentToolCall.name,
871
+ arguments: currentToolCall.arguments,
872
+ });
873
+ currentToolCall = null;
874
+ }
875
+ const completedSettle = toolCalls.length === 1 && toolCalls[0].name === "settle"
876
+ ? toolCalls[0]
877
+ : undefined;
878
+ if (completedSettle && answerStreamer.detected) {
879
+ textOutput.discard();
880
+ settleFinalization = finalizeSettleStream(answerStreamer, completedSettle.arguments);
881
+ }
882
+ else {
883
+ answerStreamer.cancel();
884
+ textOutput.flush();
484
885
  }
485
886
  }
486
887
  return {
@@ -488,6 +889,7 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
488
889
  toolCalls,
489
890
  outputItems,
490
891
  usage,
491
- finalAnswerStreamed: answerStreamer.streamed,
892
+ settleStreamed: answerStreamer.streamed,
893
+ ...(settleFinalization ? { settleFinalization } : {}),
492
894
  };
493
895
  }