@ouro.bot/cli 0.1.0-alpha.50 → 0.1.0-alpha.501

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 (369) hide show
  1. package/README.md +133 -19
  2. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
  3. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
  4. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
  5. package/changelog.json +3184 -0
  6. package/dist/arc/attention-types.js +8 -0
  7. package/dist/arc/cares.js +140 -0
  8. package/dist/arc/episodes.js +117 -0
  9. package/dist/arc/intentions.js +133 -0
  10. package/dist/arc/json-store.js +117 -0
  11. package/dist/arc/obligations.js +237 -0
  12. package/dist/arc/packets.js +193 -0
  13. package/dist/arc/presence.js +185 -0
  14. package/dist/arc/task-lifecycle.js +65 -0
  15. package/dist/heart/active-work.js +867 -35
  16. package/dist/heart/agent-entry.js +58 -3
  17. package/dist/heart/attachments/image-normalize.js +194 -0
  18. package/dist/heart/attachments/materialize.js +97 -0
  19. package/dist/heart/attachments/originals.js +88 -0
  20. package/dist/heart/attachments/render.js +29 -0
  21. package/dist/heart/attachments/sources/adapter.js +2 -0
  22. package/dist/heart/attachments/sources/bluebubbles.js +156 -0
  23. package/dist/heart/attachments/sources/cli-local-file.js +78 -0
  24. package/dist/heart/attachments/sources/index.js +16 -0
  25. package/dist/heart/attachments/store.js +103 -0
  26. package/dist/heart/attachments/types.js +93 -0
  27. package/dist/heart/auth/auth-flow.js +426 -0
  28. package/dist/heart/background-operations.js +281 -0
  29. package/dist/heart/bundle-state.js +168 -0
  30. package/dist/heart/commitments.js +111 -0
  31. package/dist/heart/config-registry.js +304 -0
  32. package/dist/heart/config.js +119 -129
  33. package/dist/heart/core.js +898 -244
  34. package/dist/heart/cross-chat-delivery.js +131 -0
  35. package/dist/heart/daemon/agent-config-check.js +490 -0
  36. package/dist/heart/daemon/agent-discovery.js +79 -3
  37. package/dist/heart/daemon/agent-service.js +360 -0
  38. package/dist/heart/daemon/agentic-repair.js +216 -0
  39. package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
  40. package/dist/heart/daemon/cadence.js +70 -0
  41. package/dist/heart/daemon/cli-defaults.js +640 -0
  42. package/dist/heart/daemon/cli-exec.js +7239 -0
  43. package/dist/heart/daemon/cli-help.js +493 -0
  44. package/dist/heart/daemon/cli-parse.js +1533 -0
  45. package/dist/heart/daemon/cli-render-doctor.js +57 -0
  46. package/dist/heart/daemon/cli-render.js +561 -0
  47. package/dist/heart/daemon/cli-types.js +8 -0
  48. package/dist/heart/daemon/connect-bay.js +323 -0
  49. package/dist/heart/daemon/daemon-cli.js +29 -1631
  50. package/dist/heart/daemon/daemon-entry.js +345 -3
  51. package/dist/heart/daemon/daemon-health.js +141 -0
  52. package/dist/heart/daemon/daemon-runtime-sync.js +190 -12
  53. package/dist/heart/daemon/daemon-tombstone.js +236 -0
  54. package/dist/heart/daemon/daemon.js +677 -58
  55. package/dist/heart/daemon/dns-workflow.js +394 -0
  56. package/dist/heart/daemon/doctor-types.js +8 -0
  57. package/dist/heart/daemon/doctor.js +615 -0
  58. package/dist/heart/daemon/health-monitor.js +92 -1
  59. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  60. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  61. package/dist/heart/daemon/http-health-probe.js +80 -0
  62. package/dist/heart/daemon/human-command-screens.js +234 -0
  63. package/dist/heart/daemon/human-readiness.js +114 -0
  64. package/dist/heart/daemon/inner-status.js +89 -0
  65. package/dist/heart/daemon/interactive-repair.js +394 -0
  66. package/dist/heart/daemon/launchd.js +25 -5
  67. package/dist/heart/daemon/log-tailer.js +82 -12
  68. package/dist/heart/daemon/logs-prune.js +110 -0
  69. package/dist/heart/daemon/message-router.js +2 -2
  70. package/dist/heart/daemon/os-cron-deps.js +134 -0
  71. package/dist/heart/daemon/ouro-bot-entry.js +4 -2
  72. package/dist/heart/daemon/ouro-entry.js +3 -1
  73. package/dist/heart/daemon/process-manager.js +214 -0
  74. package/dist/heart/daemon/provider-discovery.js +137 -0
  75. package/dist/heart/daemon/provider-ping-progress.js +83 -0
  76. package/dist/heart/daemon/pulse.js +475 -0
  77. package/dist/heart/daemon/readiness-repair.js +365 -0
  78. package/dist/heart/daemon/run-hooks.js +2 -0
  79. package/dist/heart/daemon/runtime-logging.js +67 -16
  80. package/dist/heart/daemon/runtime-metadata.js +73 -0
  81. package/dist/heart/daemon/runtime-mode.js +67 -0
  82. package/dist/heart/daemon/safe-mode.js +161 -0
  83. package/dist/heart/daemon/sense-manager.js +178 -37
  84. package/dist/heart/daemon/session-id-resolver.js +131 -0
  85. package/dist/heart/daemon/skill-management-installer.js +94 -0
  86. package/dist/heart/daemon/socket-client.js +109 -4
  87. package/dist/heart/daemon/stale-bundle-prune.js +96 -0
  88. package/dist/heart/daemon/startup-tui.js +264 -0
  89. package/dist/heart/daemon/task-scheduler.js +3 -25
  90. package/dist/heart/daemon/terminal-ui.js +499 -0
  91. package/dist/heart/daemon/thoughts.js +162 -17
  92. package/dist/heart/daemon/up-progress.js +366 -0
  93. package/dist/heart/daemon/vault-items.js +56 -0
  94. package/dist/heart/delegation.js +1 -1
  95. package/dist/heart/habits/habit-migration.js +189 -0
  96. package/dist/heart/habits/habit-parser.js +140 -0
  97. package/dist/heart/habits/habit-runtime-state.js +100 -0
  98. package/dist/heart/habits/habit-scheduler.js +372 -0
  99. package/dist/heart/{daemon → hatch}/hatch-flow.js +52 -117
  100. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  101. package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
  102. package/dist/heart/{daemon → hatch}/specialist-tools.js +35 -12
  103. package/dist/heart/identity.js +201 -66
  104. package/dist/heart/kept-notes.js +357 -0
  105. package/dist/heart/kicks.js +1 -1
  106. package/dist/heart/machine-identity.js +161 -0
  107. package/dist/heart/mail-import-discovery.js +353 -0
  108. package/dist/heart/mcp/mcp-server.js +653 -0
  109. package/dist/heart/migrate-config.js +100 -0
  110. package/dist/heart/model-capabilities.js +59 -0
  111. package/dist/heart/outlook/outlook-http-hooks.js +66 -0
  112. package/dist/heart/outlook/outlook-http-response.js +7 -0
  113. package/dist/heart/outlook/outlook-http-routes.js +244 -0
  114. package/dist/heart/outlook/outlook-http-static.js +103 -0
  115. package/dist/heart/outlook/outlook-http-transport.js +116 -0
  116. package/dist/heart/outlook/outlook-http.js +99 -0
  117. package/dist/heart/outlook/outlook-read.js +31 -0
  118. package/dist/heart/outlook/outlook-types.js +27 -0
  119. package/dist/heart/outlook/outlook-view.js +195 -0
  120. package/dist/heart/outlook/readers/agent-machine.js +382 -0
  121. package/dist/heart/outlook/readers/continuity-readers.js +336 -0
  122. package/dist/heart/outlook/readers/mail.js +362 -0
  123. package/dist/heart/outlook/readers/runtime-readers.js +644 -0
  124. package/dist/heart/outlook/readers/sessions.js +232 -0
  125. package/dist/heart/outlook/readers/shared.js +111 -0
  126. package/dist/heart/platform.js +81 -0
  127. package/dist/heart/provider-attempt.js +134 -0
  128. package/dist/heart/provider-binding-resolver.js +255 -0
  129. package/dist/heart/provider-credentials.js +424 -0
  130. package/dist/heart/provider-failover.js +301 -0
  131. package/dist/heart/provider-models.js +81 -0
  132. package/dist/heart/provider-ping.js +262 -0
  133. package/dist/heart/provider-state.js +216 -0
  134. package/dist/heart/provider-visibility.js +188 -0
  135. package/dist/heart/providers/anthropic-token.js +131 -0
  136. package/dist/heart/providers/anthropic.js +193 -55
  137. package/dist/heart/providers/azure.js +104 -13
  138. package/dist/heart/providers/error-classification.js +63 -0
  139. package/dist/heart/providers/github-copilot.js +145 -0
  140. package/dist/heart/providers/minimax-vlm.js +189 -0
  141. package/dist/heart/providers/minimax.js +29 -7
  142. package/dist/heart/providers/openai-codex.js +63 -39
  143. package/dist/heart/runtime-capability-check.js +170 -0
  144. package/dist/heart/runtime-credentials.js +260 -0
  145. package/dist/heart/sense-truth.js +11 -4
  146. package/dist/heart/session-activity.js +43 -22
  147. package/dist/heart/session-events.js +1089 -0
  148. package/dist/heart/session-playback-cli-main.js +5 -0
  149. package/dist/heart/session-playback-cli.js +36 -0
  150. package/dist/heart/session-playback.js +231 -0
  151. package/dist/heart/session-transcript.js +167 -0
  152. package/dist/heart/start-of-turn-packet.js +345 -0
  153. package/dist/heart/streaming.js +48 -28
  154. package/dist/heart/sync.js +332 -0
  155. package/dist/heart/target-resolution.js +127 -0
  156. package/dist/heart/tempo.js +93 -0
  157. package/dist/heart/temporal-view.js +41 -0
  158. package/dist/heart/tool-activity-callbacks.js +36 -0
  159. package/dist/heart/tool-description.js +135 -0
  160. package/dist/heart/tool-friction.js +55 -0
  161. package/dist/heart/tool-loop.js +200 -0
  162. package/dist/heart/turn-context.js +372 -0
  163. package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
  164. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  165. package/dist/heart/versioning/ouro-path-installer.js +425 -0
  166. package/dist/heart/versioning/ouro-version-manager.js +295 -0
  167. package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
  168. package/dist/heart/{daemon → versioning}/update-checker.js +5 -1
  169. package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
  170. package/dist/mailroom/attention.js +167 -0
  171. package/dist/mailroom/autonomy.js +209 -0
  172. package/dist/mailroom/blob-store.js +606 -0
  173. package/dist/mailroom/core.js +672 -0
  174. package/dist/mailroom/entry.js +160 -0
  175. package/dist/mailroom/file-store.js +426 -0
  176. package/dist/mailroom/mbox-import.js +382 -0
  177. package/dist/mailroom/outbound.js +380 -0
  178. package/dist/mailroom/policy.js +263 -0
  179. package/dist/mailroom/reader.js +219 -0
  180. package/dist/mailroom/search-cache.js +182 -0
  181. package/dist/mailroom/search-relevance.js +319 -0
  182. package/dist/mailroom/smtp-ingress.js +176 -0
  183. package/dist/mailroom/source-state.js +176 -0
  184. package/dist/mailroom/thread.js +109 -0
  185. package/dist/mailroom/travel-extract.js +89 -0
  186. package/dist/mind/bundle-manifest.js +7 -1
  187. package/dist/mind/context.js +164 -101
  188. package/dist/mind/diary-integrity.js +60 -0
  189. package/dist/mind/{memory.js → diary.js} +74 -93
  190. package/dist/mind/embedding-provider.js +60 -0
  191. package/dist/mind/file-state.js +179 -0
  192. package/dist/mind/friends/channel.js +30 -0
  193. package/dist/mind/friends/group-context.js +144 -0
  194. package/dist/mind/friends/resolver.js +54 -2
  195. package/dist/mind/friends/store-file.js +39 -3
  196. package/dist/mind/friends/trust-explanation.js +74 -0
  197. package/dist/mind/friends/types.js +2 -2
  198. package/dist/mind/journal-index.js +161 -0
  199. package/dist/mind/note-search.js +268 -0
  200. package/dist/mind/obligation-steering.js +221 -0
  201. package/dist/mind/pending.js +4 -0
  202. package/dist/mind/prompt-refresh.js +3 -2
  203. package/dist/mind/prompt.js +948 -110
  204. package/dist/mind/provenance-trust.js +26 -0
  205. package/dist/mind/scrutiny.js +173 -0
  206. package/dist/nerves/cli-logging.js +7 -1
  207. package/dist/nerves/coverage/audit-rules.js +15 -6
  208. package/dist/nerves/coverage/audit.js +28 -2
  209. package/dist/nerves/coverage/cli.js +1 -1
  210. package/dist/nerves/coverage/contract.js +5 -5
  211. package/dist/nerves/coverage/file-completeness.js +106 -5
  212. package/dist/nerves/coverage/run-artifacts.js +1 -1
  213. package/dist/nerves/event-buffer.js +111 -0
  214. package/dist/nerves/index.js +224 -4
  215. package/dist/nerves/observation.js +20 -0
  216. package/dist/nerves/redact.js +79 -0
  217. package/dist/nerves/review/cli-main.js +5 -0
  218. package/dist/nerves/review/cli.js +156 -0
  219. package/dist/nerves/review/core.js +152 -0
  220. package/dist/nerves/runtime.js +5 -1
  221. package/dist/outlook-ui/assets/index-BPr5vNuM.css +1 -0
  222. package/dist/outlook-ui/assets/index-Cm51CY9W.js +61 -0
  223. package/dist/outlook-ui/index.html +15 -0
  224. package/dist/repertoire/ado-client.js +15 -56
  225. package/dist/repertoire/ado-semantic.js +11 -10
  226. package/dist/repertoire/api-client.js +97 -0
  227. package/dist/repertoire/bitwarden-store.js +774 -0
  228. package/dist/repertoire/bundle-templates.js +72 -0
  229. package/dist/repertoire/bw-installer.js +180 -0
  230. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  231. package/dist/repertoire/coding/context-pack.js +330 -0
  232. package/dist/repertoire/coding/feedback.js +197 -30
  233. package/dist/repertoire/coding/manager.js +158 -9
  234. package/dist/repertoire/coding/spawner.js +55 -9
  235. package/dist/repertoire/coding/tools.js +170 -7
  236. package/dist/repertoire/commerce-errors.js +109 -0
  237. package/dist/repertoire/commerce-self-test.js +156 -0
  238. package/dist/repertoire/credential-access.js +111 -0
  239. package/dist/repertoire/duffel-client.js +185 -0
  240. package/dist/repertoire/github-client.js +14 -55
  241. package/dist/repertoire/graph-client.js +11 -52
  242. package/dist/repertoire/guardrails.js +396 -0
  243. package/dist/repertoire/mcp-client.js +255 -0
  244. package/dist/repertoire/mcp-manager.js +305 -0
  245. package/dist/repertoire/mcp-tools.js +63 -0
  246. package/dist/repertoire/shell-sessions.js +133 -0
  247. package/dist/repertoire/skills.js +15 -24
  248. package/dist/repertoire/stripe-client.js +131 -0
  249. package/dist/repertoire/tasks/board.js +31 -5
  250. package/dist/repertoire/tasks/fix.js +182 -0
  251. package/dist/repertoire/tasks/index.js +16 -4
  252. package/dist/repertoire/tasks/lifecycle.js +2 -2
  253. package/dist/repertoire/tasks/parser.js +3 -2
  254. package/dist/repertoire/tasks/scanner.js +194 -37
  255. package/dist/repertoire/tasks/transitions.js +16 -78
  256. package/dist/repertoire/tool-results.js +29 -0
  257. package/dist/repertoire/tools-attachments.js +317 -0
  258. package/dist/repertoire/tools-base.js +46 -921
  259. package/dist/repertoire/tools-bluebubbles.js +1 -0
  260. package/dist/repertoire/tools-bridge.js +141 -0
  261. package/dist/repertoire/tools-bundle.js +984 -0
  262. package/dist/repertoire/tools-config.js +185 -0
  263. package/dist/repertoire/tools-continuity.js +248 -0
  264. package/dist/repertoire/tools-credential.js +381 -0
  265. package/dist/repertoire/tools-files.js +342 -0
  266. package/dist/repertoire/tools-flight.js +224 -0
  267. package/dist/repertoire/tools-flow.js +105 -0
  268. package/dist/repertoire/tools-github.js +1 -7
  269. package/dist/repertoire/tools-mail.js +1377 -0
  270. package/dist/repertoire/tools-notes.js +376 -0
  271. package/dist/repertoire/tools-session.js +749 -0
  272. package/dist/repertoire/tools-shell.js +120 -0
  273. package/dist/repertoire/tools-stripe.js +180 -0
  274. package/dist/repertoire/tools-surface.js +243 -0
  275. package/dist/repertoire/tools-teams.js +9 -39
  276. package/dist/repertoire/tools-travel.js +125 -0
  277. package/dist/repertoire/tools-trip.js +356 -0
  278. package/dist/repertoire/tools-user-profile.js +144 -0
  279. package/dist/repertoire/tools-vault.js +40 -0
  280. package/dist/repertoire/tools.js +144 -115
  281. package/dist/repertoire/travel-api-client.js +360 -0
  282. package/dist/repertoire/user-profile.js +131 -0
  283. package/dist/repertoire/vault-setup.js +246 -0
  284. package/dist/repertoire/vault-unlock.js +561 -0
  285. package/dist/scripts/claude-code-hook.js +41 -0
  286. package/dist/scripts/claude-code-stop-hook.js +47 -0
  287. package/dist/senses/attention-queue.js +116 -0
  288. package/dist/senses/bluebubbles/attachment-cache.js +53 -0
  289. package/dist/senses/bluebubbles/attachment-download.js +137 -0
  290. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +219 -18
  291. package/dist/senses/bluebubbles/entry.js +73 -0
  292. package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
  293. package/dist/senses/bluebubbles/index.js +1881 -0
  294. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
  295. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
  296. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
  297. package/dist/senses/bluebubbles/processed-log.js +111 -0
  298. package/dist/senses/bluebubbles/replay.js +129 -0
  299. package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +2 -2
  300. package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
  301. package/dist/senses/cli/bracketed-paste.js +82 -0
  302. package/dist/senses/cli/image-paste.js +287 -0
  303. package/dist/senses/cli/image-ref-navigation.js +75 -0
  304. package/dist/senses/cli/ink-app.js +156 -0
  305. package/dist/senses/cli/inline-diff.js +64 -0
  306. package/dist/senses/cli/input-keys.js +174 -0
  307. package/dist/senses/cli/kill-ring.js +86 -0
  308. package/dist/senses/cli/message-list.js +51 -0
  309. package/dist/senses/cli/ouro-tui.js +605 -0
  310. package/dist/senses/cli/spinner-imperative.js +135 -0
  311. package/dist/senses/cli/spinner.js +101 -0
  312. package/dist/senses/cli/status-line.js +60 -0
  313. package/dist/senses/cli/streaming-markdown.js +526 -0
  314. package/dist/senses/cli/tool-display.js +83 -0
  315. package/dist/senses/cli/tool-render.js +85 -0
  316. package/dist/senses/cli/tui-store.js +240 -0
  317. package/dist/senses/cli/virtual-list.js +35 -0
  318. package/dist/senses/cli-entry.js +60 -8
  319. package/dist/senses/cli-layout.js +187 -0
  320. package/dist/senses/cli.js +511 -209
  321. package/dist/senses/commands.js +66 -3
  322. package/dist/senses/habit-turn-message.js +108 -0
  323. package/dist/senses/inner-dialog-worker.js +175 -21
  324. package/dist/senses/inner-dialog.js +330 -27
  325. package/dist/senses/mail-entry.js +66 -0
  326. package/dist/senses/mail.js +379 -0
  327. package/dist/senses/pipeline.js +573 -164
  328. package/dist/senses/proactive-content-guard.js +51 -0
  329. package/dist/senses/shared-turn.js +248 -0
  330. package/dist/senses/surface-tool.js +68 -0
  331. package/dist/senses/teams-entry.js +60 -8
  332. package/dist/senses/teams.js +405 -170
  333. package/dist/senses/trust-gate.js +100 -5
  334. package/dist/trips/core.js +138 -0
  335. package/dist/trips/store.js +146 -0
  336. package/package.json +39 -8
  337. package/skills/agent-commerce.md +106 -0
  338. package/skills/browser-navigation.md +117 -0
  339. package/skills/commerce-setup-guide.md +116 -0
  340. package/skills/commerce-setup.md +84 -0
  341. package/skills/configure-dev-tools.md +101 -0
  342. package/skills/travel-planning.md +138 -0
  343. package/dist/heart/daemon/ouro-path-installer.js +0 -178
  344. package/dist/heart/daemon/subagent-installer.js +0 -166
  345. package/dist/heart/session-recall.js +0 -116
  346. package/dist/mind/associative-recall.js +0 -209
  347. package/dist/senses/bluebubbles-entry.js +0 -13
  348. package/dist/senses/bluebubbles.js +0 -1142
  349. package/dist/senses/debug-activity.js +0 -148
  350. package/subagents/README.md +0 -86
  351. package/subagents/work-doer.md +0 -237
  352. package/subagents/work-merger.md +0 -618
  353. package/subagents/work-planner.md +0 -390
  354. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  355. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  356. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  357. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  358. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  359. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  360. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  361. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  362. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  363. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  364. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  365. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  366. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  367. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  368. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
  369. /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
@@ -0,0 +1,345 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.buildCapabilitiesSection = buildCapabilitiesSection;
37
+ exports.buildStartOfTurnPacket = buildStartOfTurnPacket;
38
+ exports.renderStartOfTurnPacket = renderStartOfTurnPacket;
39
+ exports.renderCompactStartOfTurnPacket = renderCompactStartOfTurnPacket;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const runtime_1 = require("../nerves/runtime");
43
+ const bundle_state_1 = require("./bundle-state");
44
+ const tempo_1 = require("./tempo");
45
+ function estimateTokens(text) {
46
+ return Math.ceil(text.length / 4);
47
+ }
48
+ // --- Section builders (pure derivation from authored data, no embellishment) ---
49
+ function buildPlotLine(episodes, tempo) {
50
+ if (episodes.length === 0)
51
+ return "";
52
+ const limit = tempo === "crisis" ? 3 : tempo === "brief" ? 2 : 5;
53
+ const selected = episodes.slice(0, limit);
54
+ const lines = selected.map((ep) => {
55
+ const parts = [`- ${ep.summary}`];
56
+ if (ep.whyItMattered && tempo !== "brief") {
57
+ parts[0] += ` (${ep.whyItMattered})`;
58
+ }
59
+ return parts[0];
60
+ });
61
+ return lines.join("\n");
62
+ }
63
+ function buildObligationsSection(obligations) {
64
+ if (obligations.length === 0)
65
+ return "";
66
+ return obligations
67
+ .map((ob) => {
68
+ const parts = [`- ${ob.content}`];
69
+ if (ob.meaning?.resumeHint) {
70
+ parts.push(` [hint: ${ob.meaning.resumeHint}]`);
71
+ }
72
+ if (ob.meaning?.stalenessClass && ob.meaning.stalenessClass !== "fresh") {
73
+ parts.push(` (${ob.meaning.stalenessClass})`);
74
+ }
75
+ if (ob.meaning?.waitingOn) {
76
+ parts.push(` waiting on ${ob.meaning.waitingOn.kind}: ${ob.meaning.waitingOn.target}`);
77
+ }
78
+ return parts.join("");
79
+ })
80
+ .join("\n");
81
+ }
82
+ function buildCaresSection(cares) {
83
+ if (cares.length === 0)
84
+ return "";
85
+ return cares
86
+ .map((c) => {
87
+ const parts = [`- ${c.label}`];
88
+ if (c.salience !== "low") {
89
+ parts.push(` [${c.salience}]`);
90
+ }
91
+ if (c.currentRisk) {
92
+ parts.push(` risk: ${c.currentRisk}`);
93
+ }
94
+ return parts.join("");
95
+ })
96
+ .join("\n");
97
+ }
98
+ function buildPresenceSection(peers) {
99
+ if (peers.length === 0)
100
+ return "";
101
+ return peers
102
+ .map((p) => `- ${p.agentName}: ${p.availability}/${p.lane}`)
103
+ .join("\n");
104
+ }
105
+ function buildResumeHint(view, obligations) {
106
+ // Compose from authored obligation resumeHints and top intentions
107
+ const hints = [];
108
+ const effectiveObligations = obligations ?? view.activeObligations;
109
+ for (const ob of effectiveObligations) {
110
+ if (ob.meaning?.resumeHint) {
111
+ hints.push(ob.meaning.resumeHint);
112
+ }
113
+ }
114
+ for (const intent of view.openIntentions.slice(0, 3)) {
115
+ hints.push(intent.content);
116
+ }
117
+ if (hints.length === 0) {
118
+ // Fall back to top obligation content
119
+ if (effectiveObligations.length > 0) {
120
+ hints.push(effectiveObligations[0].content);
121
+ }
122
+ }
123
+ if (hints.length === 0)
124
+ return "";
125
+ return hints.join("; ");
126
+ }
127
+ /**
128
+ * Build a compact summary of capability changes between runtime versions.
129
+ * Reads bundle-meta.json for version info and changelog.json for change descriptions.
130
+ * Returns undefined if no version change detected or files are missing/malformed.
131
+ */
132
+ function buildCapabilitiesSection(bundleRoot) {
133
+ let meta;
134
+ try {
135
+ const raw = fs.readFileSync(path.join(bundleRoot, "bundle-meta.json"), "utf-8");
136
+ meta = JSON.parse(raw);
137
+ }
138
+ catch {
139
+ (0, runtime_1.emitNervesEvent)({
140
+ component: "heart",
141
+ event: "heart.capabilities_check",
142
+ message: "bundle-meta.json missing or malformed",
143
+ meta: { bundleRoot },
144
+ });
145
+ return undefined;
146
+ }
147
+ const currentVersion = meta.runtimeVersion;
148
+ const previousVersion = meta.previousRuntimeVersion;
149
+ if (typeof currentVersion !== "string" || typeof previousVersion !== "string") {
150
+ return undefined;
151
+ }
152
+ if (currentVersion === previousVersion) {
153
+ return undefined;
154
+ }
155
+ (0, runtime_1.emitNervesEvent)({
156
+ component: "heart",
157
+ event: "heart.capabilities_version_change",
158
+ message: `runtime version changed from ${previousVersion} to ${currentVersion}`,
159
+ meta: { previousVersion, currentVersion },
160
+ });
161
+ let changelog;
162
+ try {
163
+ const raw = fs.readFileSync(path.join(bundleRoot, "changelog.json"), "utf-8");
164
+ changelog = JSON.parse(raw);
165
+ }
166
+ catch {
167
+ // changelog missing -- still report the version change
168
+ }
169
+ const parts = [`Updated from ${previousVersion} to ${currentVersion}`];
170
+ if (changelog && Array.isArray(changelog)) {
171
+ const relevantChanges = [];
172
+ for (const entry of changelog) {
173
+ if (entry.version === previousVersion)
174
+ break;
175
+ if (Array.isArray(entry.changes)) {
176
+ relevantChanges.push(...entry.changes);
177
+ }
178
+ }
179
+ if (relevantChanges.length > 0) {
180
+ parts.push(`: ${relevantChanges.join("; ")}`);
181
+ }
182
+ }
183
+ return parts.join("");
184
+ }
185
+ function buildStartOfTurnPacket(view, opts) {
186
+ const tempo = view.tempo;
187
+ const tokenBudget = tempo_1.TEMPO_BUDGETS[tempo];
188
+ const effectiveObligations = opts?.canonicalObligations ? opts.canonicalObligations.all : view.activeObligations;
189
+ const packet = {
190
+ plotLine: buildPlotLine(view.recentEpisodes, tempo),
191
+ obligations: buildObligationsSection(effectiveObligations),
192
+ cares: buildCaresSection(view.activeCares),
193
+ presence: buildPresenceSection(view.peerPresence),
194
+ resumeHint: buildResumeHint(view, opts?.canonicalObligations ? effectiveObligations : undefined),
195
+ currentSessionTiming: opts?.currentSessionTiming,
196
+ tempo,
197
+ tokenBudget,
198
+ assembledAt: new Date().toISOString(),
199
+ };
200
+ (0, runtime_1.emitNervesEvent)({
201
+ component: "heart",
202
+ event: "heart.start_of_turn_packet_built",
203
+ message: `start-of-turn packet built: tempo=${tempo}`,
204
+ meta: {
205
+ tempo,
206
+ plotLineTokens: estimateTokens(packet.plotLine),
207
+ obligationsTokens: estimateTokens(packet.obligations),
208
+ caresTokens: estimateTokens(packet.cares),
209
+ presenceTokens: estimateTokens(packet.presence),
210
+ resumeHintTokens: estimateTokens(packet.resumeHint),
211
+ },
212
+ });
213
+ return packet;
214
+ }
215
+ /**
216
+ * Renders a start-of-turn packet to prompt text, respecting token budget.
217
+ * Truncation priority (last truncated first):
218
+ * resumeHint (PROTECTED) > obligations > cares > plotLine > presence
219
+ * So presence is truncated first, then plotLine, then cares, then obligations.
220
+ * resumeHint is never truncated.
221
+ */
222
+ function renderStartOfTurnPacket(packet) {
223
+ const budget = packet.tokenBudget;
224
+ // Assemble sections in priority order (highest priority first for budget allocation)
225
+ // Each section is { label, content, priority } where lower priority number = truncated first
226
+ const sections = [
227
+ // bundleState and syncFailure share the top remediation tier — both
228
+ // are actionable "fix your git" signals. bundleState is preferred
229
+ // because it's structured (array of enum values) while syncFailure is
230
+ // a legacy free-form string; both render when populated.
231
+ { label: "provider", content: packet.providerState ?? "", priority: 8 },
232
+ { label: "bundleState", content: (0, bundle_state_1.renderBundleStateHint)(packet.bundleState ?? []), priority: 7 },
233
+ { label: "syncFailure", content: packet.syncFailure ?? "", priority: 7 },
234
+ { label: "resume", content: packet.resumeHint, priority: 6 },
235
+ { label: "sessionTiming", content: packet.currentSessionTiming ?? "", priority: 5 },
236
+ { label: "obligations", content: packet.obligations, priority: 5 },
237
+ { label: "cares", content: packet.cares, priority: 4 },
238
+ { label: "plot", content: packet.plotLine, priority: 3 },
239
+ { label: "capabilities", content: packet.capabilities ?? "", priority: 2 },
240
+ { label: "presence", content: packet.presence, priority: 1 },
241
+ ].filter((s) => s.content.length > 0);
242
+ if (sections.length === 0) {
243
+ (0, runtime_1.emitNervesEvent)({
244
+ component: "heart",
245
+ event: "heart.start_of_turn_packet_rendered",
246
+ message: "start-of-turn packet rendered: empty",
247
+ meta: { tokens: 0, tempo: packet.tempo },
248
+ });
249
+ return "";
250
+ }
251
+ // Build the rendered output, truncating lower-priority sections first
252
+ let rendered = formatSections(sections);
253
+ let tokens = estimateTokens(rendered);
254
+ // Truncate sections from lowest priority until we fit budget
255
+ const sortedByPriority = [...sections].sort((a, b) => a.priority - b.priority);
256
+ for (const section of sortedByPriority) {
257
+ if (tokens <= budget.max)
258
+ break;
259
+ // Skip resumeHint — it's PROTECTED
260
+ if (section.label === "resume")
261
+ continue;
262
+ // Remove this section entirely
263
+ const idx = sections.findIndex((s) => s.label === section.label);
264
+ sections.splice(idx, 1);
265
+ rendered = formatSections(sections);
266
+ tokens = estimateTokens(rendered);
267
+ }
268
+ // If still over budget after removing all non-protected sections, trim what's left
269
+ if (tokens > budget.max) {
270
+ const maxChars = budget.max * 4;
271
+ rendered = rendered.slice(0, maxChars);
272
+ }
273
+ (0, runtime_1.emitNervesEvent)({
274
+ component: "heart",
275
+ event: "heart.start_of_turn_packet_rendered",
276
+ message: `start-of-turn packet rendered: ${tokens} tokens`,
277
+ meta: { tokens, tempo: packet.tempo, sectionCount: sections.length },
278
+ });
279
+ return rendered;
280
+ }
281
+ function formatSections(sections) {
282
+ const parts = [];
283
+ for (const section of sections) {
284
+ switch (section.label) {
285
+ case "resume":
286
+ parts.push(`**Next:** ${section.content}`);
287
+ break;
288
+ case "obligations":
289
+ parts.push(`**Owed:**\n${section.content}`);
290
+ break;
291
+ case "cares":
292
+ parts.push(`**Cares:**\n${section.content}`);
293
+ break;
294
+ case "plot":
295
+ parts.push(`**Recent:**\n${section.content}`);
296
+ break;
297
+ case "presence":
298
+ parts.push(`**Peers:**\n${section.content}`);
299
+ break;
300
+ case "capabilities":
301
+ parts.push(`**Capabilities:** ${section.content}`);
302
+ break;
303
+ case "syncFailure":
304
+ parts.push(`**Sync warning:** ${section.content}`);
305
+ break;
306
+ case "bundleState":
307
+ parts.push(`**Bundle:** ${section.content}`);
308
+ break;
309
+ case "provider":
310
+ parts.push(`**Provider:**\n${section.content}`);
311
+ break;
312
+ }
313
+ }
314
+ return parts.join("\n\n");
315
+ }
316
+ /**
317
+ * Ultra-compact version for coding context (max 200 tokens).
318
+ * Just resumeHint + top obligation + top care, single-line bullets.
319
+ */
320
+ function renderCompactStartOfTurnPacket(packet) {
321
+ const parts = [];
322
+ if (packet.resumeHint) {
323
+ parts.push(`next: ${packet.resumeHint}`);
324
+ }
325
+ if (packet.obligations) {
326
+ // Just first line of obligations
327
+ const firstOb = packet.obligations.split("\n")[0];
328
+ parts.push(`owed: ${firstOb.replace(/^- /, "")}`);
329
+ }
330
+ if (packet.cares) {
331
+ const firstCare = packet.cares.split("\n")[0];
332
+ parts.push(`care: ${firstCare.replace(/^- /, "")}`);
333
+ }
334
+ const compact = parts.join(" | ");
335
+ // Hard cap at 200 tokens (800 chars)
336
+ const maxChars = 200 * 4;
337
+ const result = compact.length > maxChars ? compact.slice(0, maxChars) : compact;
338
+ (0, runtime_1.emitNervesEvent)({
339
+ component: "heart",
340
+ event: "heart.start_of_turn_packet_compact_rendered",
341
+ message: `compact start-of-turn packet: ${estimateTokens(result)} tokens`,
342
+ meta: { tokens: estimateTokens(result) },
343
+ });
344
+ return result;
345
+ }
@@ -1,16 +1,17 @@
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.SettleStreamer = exports.SettleParser = void 0;
4
+ exports.truncateResponsesFunctionCallOutput = truncateResponsesFunctionCallOutput;
4
5
  exports.toResponsesInput = toResponsesInput;
5
6
  exports.toResponsesTools = toResponsesTools;
6
7
  exports.streamChatCompletion = streamChatCompletion;
7
8
  exports.streamResponsesApi = streamResponsesApi;
8
9
  const runtime_1 = require("../nerves/runtime");
9
10
  // Character-level state machine that extracts the answer value from
10
- // `final_answer` tool call JSON arguments as they stream in.
11
+ // `settle` tool call JSON arguments as they stream in.
11
12
  // Scans for prefix `"answer":"` or `"answer": "` in the character stream,
12
13
  // then emits text handling JSON escapes, stopping at unescaped closing `"`.
13
- class FinalAnswerParser {
14
+ class SettleParser {
14
15
  // Possible prefixes to match (with and without space after colon)
15
16
  static PREFIXES = ['"answer":"', '"answer": "'];
16
17
  // Buffer of characters seen so far (pre-activation only)
@@ -29,7 +30,7 @@ class FinalAnswerParser {
29
30
  if (!this._active) {
30
31
  this.buf += ch;
31
32
  // Check if any prefix has been fully matched in the buffer
32
- for (const prefix of FinalAnswerParser.PREFIXES) {
33
+ for (const prefix of SettleParser.PREFIXES) {
33
34
  if (this.buf.endsWith(prefix)) {
34
35
  this._active = true;
35
36
  break;
@@ -76,21 +77,25 @@ class FinalAnswerParser {
76
77
  return out;
77
78
  }
78
79
  }
79
- exports.FinalAnswerParser = FinalAnswerParser;
80
- // Shared helper: wraps FinalAnswerParser with onClearText + onTextChunk wiring.
80
+ exports.SettleParser = SettleParser;
81
+ // Shared helper: wraps SettleParser with onClearText + onTextChunk wiring.
81
82
  // 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();
83
+ // so the eager-match settle streaming pattern lives in one place.
84
+ class SettleStreamer {
85
+ parser = new SettleParser();
85
86
  _detected = false;
86
87
  callbacks;
87
- constructor(callbacks) {
88
+ enabled;
89
+ constructor(callbacks, enabled = true) {
88
90
  this.callbacks = callbacks;
91
+ this.enabled = enabled;
89
92
  }
90
93
  get detected() { return this._detected; }
91
94
  get streamed() { return this.parser.active; }
92
- /** Mark final_answer as detected. Calls onClearText on the callbacks. */
95
+ /** Mark settle as detected. Calls onClearText on the callbacks. */
93
96
  activate() {
97
+ if (!this.enabled)
98
+ return;
94
99
  if (this._detected)
95
100
  return;
96
101
  this._detected = true;
@@ -98,6 +103,8 @@ class FinalAnswerStreamer {
98
103
  }
99
104
  /** Feed an argument delta through the parser. Emits text via onTextChunk. */
100
105
  processDelta(delta) {
106
+ if (!this.enabled)
107
+ return;
101
108
  if (!this._detected)
102
109
  return;
103
110
  const text = this.parser.process(delta);
@@ -105,7 +112,17 @@ class FinalAnswerStreamer {
105
112
  this.callbacks.onTextChunk(text);
106
113
  }
107
114
  }
108
- exports.FinalAnswerStreamer = FinalAnswerStreamer;
115
+ exports.SettleStreamer = SettleStreamer;
116
+ exports.RESPONSES_FUNCTION_CALL_OUTPUT_CAP = 200_000;
117
+ function truncateResponsesFunctionCallOutput(output, maxChars = exports.RESPONSES_FUNCTION_CALL_OUTPUT_CAP) {
118
+ if (output.length <= maxChars)
119
+ return output;
120
+ const marker = `\n\n[truncated — function_call_output exceeded ${maxChars} chars; original length ${output.length} chars]\n\n`;
121
+ const remainingBudget = Math.max(0, maxChars - marker.length);
122
+ const headLength = Math.ceil(remainingBudget * 0.75);
123
+ const tailLength = Math.max(0, remainingBudget - headLength);
124
+ return `${output.slice(0, headLength)}${marker}${output.slice(-tailLength)}`;
125
+ }
109
126
  function toResponsesUserContent(content) {
110
127
  if (typeof content === "string") {
111
128
  return content;
@@ -185,7 +202,10 @@ function toResponsesInput(messages) {
185
202
  }
186
203
  }
187
204
  if (a.content) {
188
- input.push({ role: "assistant", content: typeof a.content === "string" ? a.content : "" });
205
+ const assistantItem = { role: "assistant", content: typeof a.content === "string" ? a.content : "" };
206
+ if (a.phase)
207
+ assistantItem.phase = a.phase;
208
+ input.push(assistantItem);
189
209
  }
190
210
  if (a.tool_calls) {
191
211
  for (const tc of a.tool_calls) {
@@ -208,7 +228,7 @@ function toResponsesInput(messages) {
208
228
  input.push({
209
229
  type: "function_call_output",
210
230
  call_id: t.tool_call_id,
211
- output: typeof t.content === "string" ? t.content : "",
231
+ output: truncateResponsesFunctionCallOutput(typeof t.content === "string" ? t.content : ""),
212
232
  });
213
233
  continue;
214
234
  }
@@ -224,7 +244,7 @@ function toResponsesTools(ccTools) {
224
244
  strict: false,
225
245
  }));
226
246
  }
227
- async function streamChatCompletion(client, createParams, callbacks, signal) {
247
+ async function streamChatCompletion(client, createParams, callbacks, signal, eagerSettleStreaming = true) {
228
248
  (0, runtime_1.emitNervesEvent)({
229
249
  component: "engine",
230
250
  event: "engine.stream_start",
@@ -238,7 +258,7 @@ async function streamChatCompletion(client, createParams, callbacks, signal) {
238
258
  let toolCalls = {};
239
259
  let streamStarted = false;
240
260
  let usage;
241
- const answerStreamer = new FinalAnswerStreamer(callbacks);
261
+ const answerStreamer = new SettleStreamer(callbacks, eagerSettleStreaming);
242
262
  // State machine for parsing inline <think> tags (MiniMax pattern)
243
263
  let contentBuf = "";
244
264
  let inThinkTag = false;
@@ -353,19 +373,19 @@ async function streamChatCompletion(client, createParams, callbacks, signal) {
353
373
  toolCalls[tc.index].id = tc.id;
354
374
  if (tc.function?.name) {
355
375
  toolCalls[tc.index].name = tc.function.name;
356
- // Detect final_answer tool call on first name delta.
376
+ // Detect settle tool call on first name delta.
357
377
  // Only activate streaming if this is the sole tool call (index 0
358
378
  // and no other indices seen). Mixed calls are rejected by core.ts.
359
- if (tc.function.name === "final_answer" && !answerStreamer.detected
379
+ if (tc.function.name === "settle" && !answerStreamer.detected
360
380
  && tc.index === 0 && Object.keys(toolCalls).length === 1) {
361
381
  answerStreamer.activate();
362
382
  }
363
383
  }
364
384
  if (tc.function?.arguments) {
365
385
  toolCalls[tc.index].arguments += tc.function.arguments;
366
- // Feed final_answer argument deltas to the parser for progressive
386
+ // Feed settle argument deltas to the parser for progressive
367
387
  // streaming, but only when it appears to be the sole tool call.
368
- if (answerStreamer.detected && toolCalls[tc.index].name === "final_answer"
388
+ if (answerStreamer.detected && toolCalls[tc.index].name === "settle"
369
389
  && Object.keys(toolCalls).length === 1) {
370
390
  answerStreamer.processDelta(tc.function.arguments);
371
391
  }
@@ -381,10 +401,10 @@ async function streamChatCompletion(client, createParams, callbacks, signal) {
381
401
  toolCalls: Object.values(toolCalls),
382
402
  outputItems: [],
383
403
  usage,
384
- finalAnswerStreamed: answerStreamer.streamed,
404
+ settleStreamed: answerStreamer.streamed,
385
405
  };
386
406
  }
387
- async function streamResponsesApi(client, createParams, callbacks, signal) {
407
+ async function streamResponsesApi(client, createParams, callbacks, signal, eagerSettleStreaming = true) {
388
408
  (0, runtime_1.emitNervesEvent)({
389
409
  component: "engine",
390
410
  event: "engine.stream_start",
@@ -399,7 +419,7 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
399
419
  const outputItems = [];
400
420
  let currentToolCall = null;
401
421
  let usage;
402
- const answerStreamer = new FinalAnswerStreamer(callbacks);
422
+ const answerStreamer = new SettleStreamer(callbacks, eagerSettleStreaming);
403
423
  let functionCallCount = 0;
404
424
  for await (const event of response) {
405
425
  if (signal?.aborted)
@@ -429,10 +449,10 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
429
449
  name: String(event.item.name),
430
450
  arguments: "",
431
451
  };
432
- // Detect final_answer function call -- clear any streamed noise.
452
+ // Detect settle function call -- clear any streamed noise.
433
453
  // Only activate when this is the first (and so far only) function call.
434
454
  // Mixed calls are rejected by core.ts; no need to stream their args.
435
- if (String(event.item.name) === "final_answer" && functionCallCount === 1) {
455
+ if (String(event.item.name) === "settle" && functionCallCount === 1) {
436
456
  answerStreamer.activate();
437
457
  }
438
458
  }
@@ -441,9 +461,9 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
441
461
  case "response.function_call_arguments.delta": {
442
462
  if (currentToolCall) {
443
463
  currentToolCall.arguments += event.delta;
444
- // Feed final_answer argument deltas to the parser for progressive
464
+ // Feed settle argument deltas to the parser for progressive
445
465
  // streaming, but only when it appears to be the sole function call.
446
- if (answerStreamer.detected && currentToolCall.name === "final_answer"
466
+ if (answerStreamer.detected && currentToolCall.name === "settle"
447
467
  && functionCallCount === 1) {
448
468
  answerStreamer.processDelta(String(event.delta));
449
469
  }
@@ -485,6 +505,6 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
485
505
  toolCalls,
486
506
  outputItems,
487
507
  usage,
488
- finalAnswerStreamed: answerStreamer.streamed,
508
+ settleStreamed: answerStreamer.streamed,
489
509
  };
490
510
  }