@ouro.bot/cli 0.1.0-alpha.83 → 0.1.0-alpha.831

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