@ouro.bot/cli 0.1.0-alpha.73 → 0.1.0-alpha.731
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.
- package/LICENSE +21 -0
- package/README.md +154 -23
- package/RepairGuide.ouro/agent.json +5 -0
- package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
- package/RepairGuide.ouro/psyche/SOUL.md +55 -0
- package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
- package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
- package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
- package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/assets/bluebubbles-host +264 -0
- package/changelog.json +4645 -14
- package/dist/a2a/card.js +57 -0
- package/dist/a2a/client.js +180 -0
- package/dist/a2a/config.js +50 -0
- package/dist/a2a/delegation-stores.js +56 -0
- package/dist/a2a/did-resolution.js +93 -0
- package/dist/a2a/identity.js +170 -0
- package/dist/a2a/inbound-share.js +107 -0
- package/dist/a2a/mission-result-wire.js +196 -0
- package/dist/a2a/onboarding.js +115 -0
- package/dist/a2a/pin-store.js +132 -0
- package/dist/a2a/seen-ledger.js +120 -0
- package/dist/a2a/server.js +604 -0
- package/dist/a2a/task-store.js +69 -0
- package/dist/a2a/transport.js +45 -0
- package/dist/a2a/types.js +3 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +144 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/evolution.js +490 -0
- package/dist/arc/flight-recorder.js +1034 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +348 -0
- package/dist/arc/packets.js +336 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +57 -0
- package/dist/commerce/store.js +755 -0
- package/dist/commerce/types.js +3 -0
- package/dist/heart/active-work.js +874 -43
- package/dist/heart/agent-entry.js +190 -3
- package/dist/heart/approval-store.js +791 -0
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +16 -0
- package/dist/heart/attachments/store.js +103 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +479 -0
- package/dist/heart/autonomy-budget.js +434 -0
- package/dist/heart/awaiting/await-alert.js +146 -0
- package/dist/heart/awaiting/await-expiry.js +108 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +141 -0
- package/dist/heart/awaiting/await-runtime-state.js +100 -0
- package/dist/heart/awaiting/await-scheduler.js +378 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +137 -17
- package/dist/heart/bridges/store.js +14 -2
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +135 -0
- package/dist/heart/config-registry.js +331 -0
- package/dist/heart/config.js +120 -129
- package/dist/heart/context-loss-gauntlet.js +354 -0
- package/dist/heart/context-loss-sentinel.js +1155 -0
- package/dist/heart/core.js +1763 -320
- package/dist/heart/cross-chat-delivery.js +8 -22
- package/dist/heart/daemon/agent-config-check.js +451 -0
- package/dist/heart/daemon/agent-discovery.js +185 -3
- package/dist/heart/daemon/agent-service.js +542 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/await-private-wake.js +59 -0
- package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
- package/dist/heart/daemon/bluebubbles-host.js +273 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +180 -0
- package/dist/heart/daemon/cli-defaults.js +832 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +8620 -0
- package/dist/heart/daemon/cli-help.js +705 -0
- package/dist/heart/daemon/cli-parse.js +2712 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +777 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/daemon-cli.js +29 -2093
- package/dist/heart/daemon/daemon-entry.js +842 -10
- package/dist/heart/daemon/daemon-health.js +176 -0
- package/dist/heart/daemon/daemon-rollup.js +57 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +1610 -87
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +1689 -0
- package/dist/heart/daemon/freshness.js +345 -0
- package/dist/heart/daemon/habit-private-wake.js +61 -0
- package/dist/heart/daemon/health-monitor.js +142 -11
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
- package/dist/heart/daemon/http-health-probe.js +80 -0
- package/dist/heart/daemon/human-command-screens.js +234 -0
- package/dist/heart/daemon/human-readiness.js +114 -0
- package/dist/heart/daemon/inner-status.js +78 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +37 -8
- package/dist/heart/daemon/log-tailer.js +79 -10
- package/dist/heart/daemon/logs-prune.js +132 -0
- package/dist/heart/daemon/mcp-canary.js +524 -0
- package/dist/heart/daemon/message-router.js +45 -5
- package/dist/heart/daemon/migrate-to-desk.js +848 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +22 -14
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/plugin-cli.js +432 -0
- package/dist/heart/daemon/process-manager.js +624 -61
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/prunable-bundle.js +144 -0
- package/dist/heart/daemon/pulse.js +511 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +41 -14
- package/dist/heart/daemon/runtime-metadata.js +2 -30
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +670 -48
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +1 -1
- package/dist/heart/daemon/socket-client.js +180 -12
- package/dist/heart/daemon/stale-bundle-prune.js +113 -0
- package/dist/heart/daemon/startup-tui.js +338 -0
- package/dist/heart/daemon/task-scheduler.js +117 -39
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +255 -43
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -4
- package/dist/heart/external-events/router.js +121 -0
- package/dist/heart/habits/habit-cancel.js +810 -0
- package/dist/heart/habits/habit-lifecycle.js +1327 -0
- package/dist/heart/habits/habit-migration.js +194 -0
- package/dist/heart/habits/habit-parser.js +278 -0
- package/dist/heart/habits/habit-runtime-state.js +93 -0
- package/dist/heart/habits/habit-scheduler.js +649 -0
- package/dist/heart/habits/habit-session-summary.js +318 -0
- package/dist/heart/habits/habit-session.js +636 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
- package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
- package/dist/heart/identity.js +174 -59
- package/dist/heart/kept-notes.js +289 -0
- package/dist/heart/kicks.js +1 -1
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +353 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +39 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +197 -0
- package/dist/heart/mailbox/readers/agent-machine.js +428 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
- package/dist/heart/mailbox/readers/sessions.js +232 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +696 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +11 -0
- package/dist/heart/orientation-frame.js +345 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/primitives.js +1 -1
- package/dist/heart/private-runtime/decision-renderer.js +156 -0
- package/dist/heart/private-runtime/index.js +18 -0
- package/dist/heart/private-runtime/ledger.js +218 -0
- package/dist/heart/private-runtime/policy.js +214 -0
- package/dist/heart/private-runtime/types.js +2 -0
- package/dist/heart/progress-story.js +1 -1
- package/dist/heart/provider-attempt.js +137 -0
- package/dist/heart/provider-binding-resolver.js +273 -0
- package/dist/heart/provider-credentials.js +441 -0
- package/dist/heart/provider-failover.js +311 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -0
- package/dist/heart/provider-readiness-cache.js +119 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +173 -60
- package/dist/heart/providers/azure.js +23 -11
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +34 -38
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +26 -8
- package/dist/heart/providers/openai-codex-token.js +349 -0
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/run-ledger.js +247 -0
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +398 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +20 -4
- package/dist/heart/session-activity.js +90 -24
- package/dist/heart/session-events.js +1300 -0
- package/dist/heart/session-playback-cli-main.js +5 -0
- package/dist/heart/session-playback-cli.js +36 -0
- package/dist/heart/session-playback.js +231 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +182 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/start-of-turn-packet.js +368 -0
- package/dist/heart/streaming.js +604 -207
- package/dist/heart/structured-output.js +196 -0
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +11 -7
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-approval.js +339 -0
- package/dist/heart/tool-description.js +155 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +472 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +432 -0
- package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
- package/dist/heart/versioning/ouro-version-manager.js +409 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/versioning/update-hooks.js +154 -0
- package/dist/heart/versioning/version-intent.js +114 -0
- package/dist/heart/work-card.js +380 -0
- package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
- package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
- package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
- package/dist/mailbox-ui/index.html +16 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +811 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/cache-sync-cli.js +54 -0
- package/dist/mailroom/core.js +788 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +568 -0
- package/dist/mailroom/hosted-cache-sync.js +249 -0
- package/dist/mailroom/mbox-import.js +393 -0
- package/dist/mailroom/migration.js +164 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +292 -0
- package/dist/mailroom/search-cache.js +404 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +24 -2
- package/dist/mind/context.js +273 -111
- package/dist/mind/desk-section.js +362 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +68 -77
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/{associative-recall.js → note-search.js} +47 -58
- package/dist/mind/obligation-steering.js +227 -0
- package/dist/mind/pending.js +13 -8
- package/dist/mind/prompt-budget.js +479 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1058 -172
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/record-paths.js +312 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/session-transaction.js +379 -0
- package/dist/nerves/cli-logging.js +7 -1
- package/dist/nerves/coverage/audit-rules.js +15 -6
- package/dist/nerves/coverage/audit.js +28 -2
- package/dist/nerves/coverage/cli.js +1 -1
- package/dist/nerves/coverage/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +139 -5
- package/dist/nerves/coverage/run-artifacts.js +55 -35
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +234 -4
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/review/cli-main.js +5 -0
- package/dist/nerves/review/cli.js +156 -0
- package/dist/nerves/review/core.js +159 -0
- package/dist/nerves/runtime.js +5 -1
- package/dist/repertoire/ado-client.js +15 -56
- package/dist/repertoire/ado-semantic.js +16 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +1045 -0
- package/dist/repertoire/bundle-templates.js +71 -0
- package/dist/repertoire/bw-installer.js +180 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +331 -0
- package/dist/repertoire/coding/feedback.js +218 -30
- package/dist/repertoire/coding/index.js +15 -3
- package/dist/repertoire/coding/manager.js +166 -10
- package/dist/repertoire/coding/spawner.js +58 -11
- package/dist/repertoire/coding/tools.js +242 -14
- package/dist/repertoire/coding/workbench-client.js +272 -0
- package/dist/repertoire/coding/workbench-manager.js +346 -0
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +178 -0
- package/dist/repertoire/desk/classifier.js +362 -0
- package/dist/repertoire/duffel-client.js +185 -0
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +812 -18
- package/dist/repertoire/mcp-client.js +44 -3
- package/dist/repertoire/mcp-manager.js +259 -20
- package/dist/repertoire/mcp-tools.js +83 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +48 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-arguments.js +104 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +699 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +372 -0
- package/dist/repertoire/tools-base.js +67 -1095
- package/dist/repertoire/tools-bluebubbles.js +2 -0
- package/dist/repertoire/tools-bridge.js +144 -0
- package/dist/repertoire/tools-bundle.js +993 -0
- package/dist/repertoire/tools-commerce.js +253 -0
- package/dist/repertoire/tools-config.js +186 -0
- package/dist/repertoire/tools-continuity.js +252 -0
- package/dist/repertoire/tools-credential.js +383 -0
- package/dist/repertoire/tools-evolution.js +527 -0
- package/dist/repertoire/tools-files.js +344 -0
- package/dist/repertoire/tools-flight.js +290 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-habits.js +103 -0
- package/dist/repertoire/tools-mail.js +1828 -0
- package/dist/repertoire/tools-notes.js +459 -0
- package/dist/repertoire/tools-obligations.js +182 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +482 -0
- package/dist/repertoire/tools-rsvp.js +139 -0
- package/dist/repertoire/tools-runtime.js +150 -0
- package/dist/repertoire/tools-session.js +881 -0
- package/dist/repertoire/tools-shell.js +133 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +355 -0
- package/dist/repertoire/tools-teams.js +12 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -0
- package/dist/repertoire/tools-user-profile.js +146 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice.js +145 -0
- package/dist/repertoire/tools.js +258 -79
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +594 -0
- package/dist/rsvp/aisleplanner-client.js +354 -0
- package/dist/rsvp/cli.js +926 -0
- package/dist/rsvp/config.js +327 -0
- package/dist/rsvp/cutover.js +433 -0
- package/dist/rsvp/diagnostics.js +232 -0
- package/dist/rsvp/diff-renderer.js +176 -0
- package/dist/rsvp/habit-policy.js +110 -0
- package/dist/rsvp/habit-stage.js +123 -0
- package/dist/rsvp/incident-bundle.js +97 -0
- package/dist/rsvp/migration.js +204 -0
- package/dist/rsvp/native-habit-runner.js +630 -0
- package/dist/rsvp/outbound-state.js +628 -0
- package/dist/rsvp/query.js +118 -0
- package/dist/rsvp/replay.js +233 -0
- package/dist/rsvp/snapshot.js +232 -0
- package/dist/rsvp/spend-ledger.js +175 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/a2a-entry.js +115 -0
- package/dist/senses/attention-queue.js +186 -0
- package/dist/senses/await-turn-message.js +58 -0
- package/dist/senses/bluebubbles/active-turns.js +216 -0
- package/dist/senses/bluebubbles/attachment-cache.js +53 -0
- package/dist/senses/bluebubbles/attachment-download.js +137 -0
- package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
- package/dist/senses/bluebubbles/context-packet.js +207 -0
- package/dist/senses/bluebubbles/context-smoke.js +144 -0
- package/dist/senses/bluebubbles/entry.js +90 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
- package/dist/senses/bluebubbles/index.js +3839 -0
- package/dist/senses/bluebubbles/latest-turn.js +311 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
- package/dist/senses/bluebubbles/outbound-state.js +308 -0
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/reaction-policy.js +47 -0
- package/dist/senses/bluebubbles/replay.js +284 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/bluebubbles/webhook-registration.js +228 -0
- package/dist/senses/bluebubbles-meta-guard.js +39 -0
- package/dist/senses/cli/bracketed-paste.js +82 -0
- package/dist/senses/cli/image-paste.js +287 -0
- package/dist/senses/cli/image-ref-navigation.js +75 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/input-keys.js +174 -0
- package/dist/senses/cli/kill-ring.js +86 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +607 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +85 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +241 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli-layout.js +100 -0
- package/dist/senses/cli.js +640 -312
- package/dist/senses/commands.js +66 -3
- package/dist/senses/context-packet-ledger.js +371 -0
- package/dist/senses/context-packets.js +154 -0
- package/dist/senses/habit-lifecycle-guard.js +24 -0
- package/dist/senses/habit-turn-message.js +160 -0
- package/dist/senses/ingress-evidence.js +2 -0
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +524 -0
- package/dist/senses/pipeline.js +1075 -176
- package/dist/senses/private-runtime-worker.js +740 -0
- package/dist/senses/private-runtime.js +1212 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +424 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +515 -217
- package/dist/senses/trust-gate.js +104 -9
- package/dist/senses/voice/audio-playback.js +237 -0
- package/dist/senses/voice/audio-routing.js +119 -0
- package/dist/senses/voice/elevenlabs.js +202 -0
- package/dist/senses/voice/floor-control.js +431 -0
- package/dist/senses/voice/floor-controller.js +115 -0
- package/dist/senses/voice/golden-path.js +116 -0
- package/dist/senses/voice/index.js +29 -0
- package/dist/senses/voice/meeting.js +113 -0
- package/dist/senses/voice/outbound.js +190 -0
- package/dist/senses/voice/phone.js +33 -0
- package/dist/senses/voice/playback.js +139 -0
- package/dist/senses/voice/realtime-eval.js +496 -0
- package/dist/senses/voice/realtime-trace.js +531 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +191 -0
- package/dist/senses/voice/twilio-phone-runtime.js +807 -0
- package/dist/senses/voice/twilio-phone.js +5081 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +81 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/dist/util/frontmatter.js +69 -0
- package/package.json +65 -12
- package/skills/agent-commerce.md +113 -0
- package/skills/browser-navigation.md +117 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +99 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/auth-flow.js +0 -430
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/daemon/update-hooks.js +0 -138
- package/dist/heart/safe-workspace.js +0 -228
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/friends/channel.js +0 -84
- package/dist/mind/friends/group-context.js +0 -144
- package/dist/mind/friends/resolver.js +0 -84
- package/dist/mind/friends/store-file.js +0 -190
- package/dist/mind/friends/store.js +0 -4
- package/dist/mind/friends/tokens.js +0 -26
- package/dist/mind/friends/trust-explanation.js +0 -74
- package/dist/mind/friends/types.js +0 -29
- package/dist/repertoire/tasks/board.js +0 -134
- package/dist/repertoire/tasks/index.js +0 -224
- package/dist/repertoire/tasks/lifecycle.js +0 -80
- package/dist/repertoire/tasks/middleware.js +0 -65
- package/dist/repertoire/tasks/parser.js +0 -173
- package/dist/repertoire/tasks/scanner.js +0 -132
- package/dist/repertoire/tasks/transitions.js +0 -144
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1180
- package/dist/senses/debug-activity.js +0 -148
- package/dist/senses/inner-dialog-worker.js +0 -90
- package/dist/senses/inner-dialog.js +0 -480
- package/subagents/README.md +0 -7
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
package/dist/heart/streaming.js
CHANGED
|
@@ -1,111 +1,446 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
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.
|
|
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 (
|
|
30
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
65
|
-
this.
|
|
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
|
-
|
|
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.
|
|
80
|
-
// Shared helper: wraps
|
|
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
|
|
84
|
-
parser = new
|
|
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
|
-
|
|
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.
|
|
92
|
-
/** Mark
|
|
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.
|
|
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.
|
|
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
|
-
|
|
499
|
+
const instructionParts = [];
|
|
165
500
|
const input = [];
|
|
166
501
|
for (const msg of messages) {
|
|
167
502
|
if (msg.role === "system") {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
638
|
+
textOutput.emit(text);
|
|
303
639
|
contentBuf = contentBuf.slice(-retain);
|
|
304
640
|
return;
|
|
305
641
|
}
|
|
306
642
|
}
|
|
307
643
|
// All content, flush it
|
|
308
|
-
|
|
644
|
+
textOutput.emit(contentBuf);
|
|
309
645
|
contentBuf = "";
|
|
310
646
|
}
|
|
311
647
|
}
|
|
312
648
|
}
|
|
313
649
|
}
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
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
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
streamStarted
|
|
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
|
-
|
|
344
|
-
|
|
345
|
-
|
|
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
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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:
|
|
744
|
+
toolCalls: completedToolCalls,
|
|
385
745
|
outputItems: [],
|
|
386
746
|
usage,
|
|
387
|
-
|
|
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
|
|
766
|
+
const answerStreamer = new SettleStreamer(callbacks, eagerSettleStreaming);
|
|
767
|
+
const textOutput = new ProviderTextOutput(callbacks);
|
|
406
768
|
let functionCallCount = 0;
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
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
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
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
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
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
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
}
|
|
464
|
-
|
|
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
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
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
|
-
|
|
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
|
-
|
|
482
|
-
|
|
483
|
-
|
|
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
|
-
|
|
887
|
+
settleStreamed: answerStreamer.streamed,
|
|
888
|
+
...(settleFinalization ? { settleFinalization } : {}),
|
|
492
889
|
};
|
|
493
890
|
}
|