@ouro.bot/cli 0.1.0-alpha.5 → 0.1.0-alpha.500
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/README.md +226 -183
- package/SerpentGuide.ouro/agent.json +82 -0
- package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/assets/ouroboros.png +0 -0
- package/changelog.json +3418 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +140 -0
- package/dist/arc/episodes.js +117 -0
- package/dist/arc/intentions.js +133 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +237 -0
- package/dist/arc/packets.js +193 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +65 -0
- package/dist/heart/active-work.js +989 -0
- package/dist/heart/agent-entry.js +58 -3
- 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/adapter.js +2 -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 +426 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +358 -0
- package/dist/heart/bridges/state-machine.js +135 -0
- package/dist/heart/bridges/store.js +123 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +111 -0
- package/dist/heart/config-registry.js +304 -0
- package/dist/heart/config.js +193 -130
- package/dist/heart/core.js +1010 -261
- package/dist/heart/cross-chat-delivery.js +131 -0
- package/dist/heart/daemon/agent-config-check.js +490 -0
- package/dist/heart/daemon/agent-discovery.js +157 -0
- package/dist/heart/daemon/agent-service.js +360 -0
- package/dist/heart/daemon/agentic-repair.js +216 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +640 -0
- package/dist/heart/daemon/cli-exec.js +7239 -0
- package/dist/heart/daemon/cli-help.js +493 -0
- package/dist/heart/daemon/cli-parse.js +1533 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +561 -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 +30 -697
- package/dist/heart/daemon/daemon-entry.js +359 -8
- package/dist/heart/daemon/daemon-health.js +141 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +268 -0
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +813 -19
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +615 -0
- package/dist/heart/daemon/health-monitor.js +92 -1
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +206 -0
- 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 +89 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +171 -0
- package/dist/heart/daemon/log-tailer.js +82 -12
- package/dist/heart/daemon/logs-prune.js +110 -0
- package/dist/heart/daemon/message-router.js +17 -8
- package/dist/heart/daemon/os-cron-deps.js +134 -0
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/process-manager.js +215 -1
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/pulse.js +475 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +39 -0
- package/dist/heart/daemon/runtime-logging.js +67 -16
- package/dist/heart/daemon/runtime-metadata.js +191 -0
- package/dist/heart/daemon/runtime-mode.js +67 -0
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +431 -0
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +94 -0
- package/dist/heart/daemon/socket-client.js +307 -0
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +264 -0
- package/dist/heart/daemon/task-scheduler.js +3 -25
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +524 -0
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +62 -0
- package/dist/heart/habits/habit-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +140 -0
- package/dist/heart/habits/habit-runtime-state.js +100 -0
- package/dist/heart/habits/habit-scheduler.js +372 -0
- package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
- package/dist/heart/{daemon → hatch}/hatch-flow.js +54 -136
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
- package/dist/heart/hatch/specialist-orchestrator.js +129 -0
- package/dist/heart/hatch/specialist-prompt.js +102 -0
- package/dist/heart/hatch/specialist-tools.js +306 -0
- package/dist/heart/identity.js +274 -61
- package/dist/heart/kept-notes.js +357 -0
- package/dist/heart/kicks.js +2 -20
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +353 -0
- package/dist/heart/mcp/mcp-server.js +653 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +59 -0
- package/dist/heart/outlook/outlook-http-hooks.js +66 -0
- package/dist/heart/outlook/outlook-http-response.js +7 -0
- package/dist/heart/outlook/outlook-http-routes.js +244 -0
- package/dist/heart/outlook/outlook-http-static.js +103 -0
- package/dist/heart/outlook/outlook-http-transport.js +116 -0
- package/dist/heart/outlook/outlook-http.js +99 -0
- package/dist/heart/outlook/outlook-read.js +31 -0
- package/dist/heart/outlook/outlook-types.js +27 -0
- package/dist/heart/outlook/outlook-view.js +195 -0
- package/dist/heart/outlook/readers/agent-machine.js +382 -0
- package/dist/heart/outlook/readers/continuity-readers.js +336 -0
- package/dist/heart/outlook/readers/mail.js +362 -0
- package/dist/heart/outlook/readers/runtime-readers.js +644 -0
- package/dist/heart/outlook/readers/sessions.js +232 -0
- package/dist/heart/outlook/readers/shared.js +111 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +255 -0
- package/dist/heart/provider-credentials.js +424 -0
- package/dist/heart/provider-failover.js +301 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -0
- package/dist/heart/provider-state.js +216 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +202 -50
- package/dist/heart/providers/azure.js +104 -13
- package/dist/heart/providers/error-classification.js +63 -0
- package/dist/heart/providers/github-copilot.js +145 -0
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +29 -7
- package/dist/heart/providers/openai-codex.js +63 -39
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +260 -0
- package/dist/heart/sense-truth.js +68 -0
- package/dist/heart/session-activity.js +190 -0
- package/dist/heart/session-events.js +1089 -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-transcript.js +167 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +129 -34
- package/dist/heart/sync.js +332 -0
- package/dist/heart/target-resolution.js +127 -0
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/tool-activity-callbacks.js +36 -0
- package/dist/heart/tool-description.js +135 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +372 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/heart/versioning/ouro-bot-global-installer.js +128 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +425 -0
- package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
- package/dist/heart/versioning/ouro-version-manager.js +295 -0
- package/dist/heart/versioning/staged-restart.js +146 -0
- package/dist/heart/versioning/update-checker.js +115 -0
- package/dist/heart/versioning/update-hooks.js +142 -0
- package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +606 -0
- package/dist/mailroom/core.js +672 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +426 -0
- package/dist/mailroom/mbox-import.js +382 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +219 -0
- package/dist/mailroom/search-cache.js +182 -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 +77 -1
- package/dist/mind/context.js +173 -94
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +84 -96
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/first-impressions.js +16 -2
- package/dist/mind/friends/channel.js +73 -0
- package/dist/mind/friends/group-context.js +144 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +58 -3
- package/dist/mind/friends/trust-explanation.js +74 -0
- package/dist/mind/friends/types.js +10 -2
- package/dist/mind/journal-index.js +161 -0
- package/dist/mind/note-search.js +268 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +76 -9
- package/dist/mind/phrases.js +1 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1144 -117
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/token-estimate.js +8 -12
- package/dist/nerves/cli-logging.js +22 -3
- 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 +101 -5
- package/dist/nerves/coverage/run-artifacts.js +1 -1
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +224 -4
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/runtime.js +5 -1
- package/dist/outlook-ui/assets/index-BPr5vNuM.css +1 -0
- package/dist/outlook-ui/assets/index-Cm51CY9W.js +61 -0
- package/dist/outlook-ui/index.html +15 -0
- package/dist/repertoire/ado-client.js +17 -56
- package/dist/repertoire/ado-semantic.js +11 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +774 -0
- package/dist/repertoire/bundle-templates.js +72 -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 +330 -0
- package/dist/repertoire/coding/feedback.js +301 -0
- package/dist/repertoire/coding/index.js +4 -1
- package/dist/repertoire/coding/manager.js +220 -13
- package/dist/repertoire/coding/spawner.js +58 -12
- package/dist/repertoire/coding/tools.js +209 -7
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +111 -0
- package/dist/repertoire/data/ado-endpoints.json +188 -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 +396 -0
- package/dist/repertoire/mcp-client.js +255 -0
- package/dist/repertoire/mcp-manager.js +305 -0
- package/dist/repertoire/mcp-tools.js +63 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +15 -24
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tasks/board.js +43 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +39 -13
- package/dist/repertoire/tasks/lifecycle.js +2 -2
- package/dist/repertoire/tasks/parser.js +3 -2
- package/dist/repertoire/tasks/scanner.js +194 -37
- package/dist/repertoire/tasks/transitions.js +16 -79
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-base.js +49 -707
- package/dist/repertoire/tools-bluebubbles.js +94 -0
- package/dist/repertoire/tools-bridge.js +141 -0
- package/dist/repertoire/tools-bundle.js +984 -0
- package/dist/repertoire/tools-config.js +185 -0
- package/dist/repertoire/tools-continuity.js +248 -0
- package/dist/repertoire/tools-credential.js +381 -0
- package/dist/repertoire/tools-files.js +342 -0
- package/dist/repertoire/tools-flight.js +224 -0
- package/dist/repertoire/tools-flow.js +105 -0
- package/dist/repertoire/tools-github.js +1 -7
- package/dist/repertoire/tools-mail.js +1377 -0
- package/dist/repertoire/tools-notes.js +376 -0
- package/dist/repertoire/tools-session.js +749 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +180 -0
- package/dist/repertoire/tools-surface.js +243 -0
- package/dist/repertoire/tools-teams.js +64 -61
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +356 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools.js +149 -98
- 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 +561 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/attention-queue.js +116 -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 +685 -0
- package/dist/senses/bluebubbles/entry.js +73 -0
- package/dist/senses/bluebubbles/inbound-log.js +126 -0
- package/dist/senses/bluebubbles/index.js +1881 -0
- package/dist/senses/bluebubbles/media.js +389 -0
- package/dist/senses/bluebubbles/model.js +282 -0
- package/dist/senses/bluebubbles/mutation-log.js +116 -0
- package/dist/senses/bluebubbles/processed-log.js +111 -0
- package/dist/senses/bluebubbles/replay.js +129 -0
- package/dist/senses/bluebubbles/runtime-state.js +109 -0
- package/dist/senses/bluebubbles/session-cleanup.js +72 -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 +605 -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 +83 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +240 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli-layout.js +187 -0
- package/dist/senses/cli.js +768 -264
- package/dist/senses/commands.js +66 -3
- package/dist/senses/continuity.js +94 -0
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +199 -16
- package/dist/senses/inner-dialog.js +640 -91
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +665 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +248 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +844 -197
- package/dist/senses/trust-gate.js +207 -2
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +146 -0
- package/package.json +47 -6
- package/skills/agent-commerce.md +106 -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 +101 -0
- package/skills/travel-planning.md +138 -0
- package/AdoptionSpecialist.ouro/agent.json +0 -20
- package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
- package/dist/heart/daemon/specialist-orchestrator.js +0 -160
- package/dist/heart/daemon/specialist-prompt.js +0 -40
- package/dist/heart/daemon/specialist-session.js +0 -142
- package/dist/heart/daemon/specialist-tools.js +0 -128
- package/dist/heart/daemon/subagent-installer.js +0 -125
- package/dist/inner-worker-entry.js +0 -4
- package/dist/mind/associative-recall.js +0 -197
- package/subagents/README.md +0 -73
- package/subagents/work-doer.md +0 -233
- package/subagents/work-merger.md +0 -624
- package/subagents/work-planner.md +0 -373
- /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/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
|
@@ -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
|
+
}
|
package/dist/heart/streaming.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
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
|
-
// `
|
|
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
|
|
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
|
|
33
|
+
for (const prefix of SettleParser.PREFIXES) {
|
|
33
34
|
if (this.buf.endsWith(prefix)) {
|
|
34
35
|
this._active = true;
|
|
35
36
|
break;
|
|
@@ -76,7 +77,106 @@ class FinalAnswerParser {
|
|
|
76
77
|
return out;
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
|
-
exports.
|
|
80
|
+
exports.SettleParser = SettleParser;
|
|
81
|
+
// Shared helper: wraps SettleParser with onClearText + onTextChunk wiring.
|
|
82
|
+
// Used by all streaming providers (Chat Completions, Responses API, Anthropic)
|
|
83
|
+
// so the eager-match settle streaming pattern lives in one place.
|
|
84
|
+
class SettleStreamer {
|
|
85
|
+
parser = new SettleParser();
|
|
86
|
+
_detected = false;
|
|
87
|
+
callbacks;
|
|
88
|
+
enabled;
|
|
89
|
+
constructor(callbacks, enabled = true) {
|
|
90
|
+
this.callbacks = callbacks;
|
|
91
|
+
this.enabled = enabled;
|
|
92
|
+
}
|
|
93
|
+
get detected() { return this._detected; }
|
|
94
|
+
get streamed() { return this.parser.active; }
|
|
95
|
+
/** Mark settle as detected. Calls onClearText on the callbacks. */
|
|
96
|
+
activate() {
|
|
97
|
+
if (!this.enabled)
|
|
98
|
+
return;
|
|
99
|
+
if (this._detected)
|
|
100
|
+
return;
|
|
101
|
+
this._detected = true;
|
|
102
|
+
this.callbacks.onClearText?.();
|
|
103
|
+
}
|
|
104
|
+
/** Feed an argument delta through the parser. Emits text via onTextChunk. */
|
|
105
|
+
processDelta(delta) {
|
|
106
|
+
if (!this.enabled)
|
|
107
|
+
return;
|
|
108
|
+
if (!this._detected)
|
|
109
|
+
return;
|
|
110
|
+
const text = this.parser.process(delta);
|
|
111
|
+
if (text)
|
|
112
|
+
this.callbacks.onTextChunk(text);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
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
|
+
}
|
|
126
|
+
function toResponsesUserContent(content) {
|
|
127
|
+
if (typeof content === "string") {
|
|
128
|
+
return content;
|
|
129
|
+
}
|
|
130
|
+
if (!Array.isArray(content)) {
|
|
131
|
+
return "";
|
|
132
|
+
}
|
|
133
|
+
const parts = [];
|
|
134
|
+
for (const part of content) {
|
|
135
|
+
if (!part || typeof part !== "object") {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (part.type === "text" && typeof part.text === "string") {
|
|
139
|
+
parts.push({ type: "input_text", text: part.text });
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (part.type === "image_url") {
|
|
143
|
+
const imageUrl = typeof part.image_url?.url === "string" ? part.image_url.url : "";
|
|
144
|
+
if (!imageUrl)
|
|
145
|
+
continue;
|
|
146
|
+
parts.push({
|
|
147
|
+
type: "input_image",
|
|
148
|
+
image_url: imageUrl,
|
|
149
|
+
detail: part.image_url?.detail ?? "auto",
|
|
150
|
+
});
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (part.type === "input_audio" &&
|
|
154
|
+
typeof part.input_audio?.data === "string" &&
|
|
155
|
+
(part.input_audio.format === "mp3" || part.input_audio.format === "wav")) {
|
|
156
|
+
parts.push({
|
|
157
|
+
type: "input_audio",
|
|
158
|
+
input_audio: {
|
|
159
|
+
data: part.input_audio.data,
|
|
160
|
+
format: part.input_audio.format,
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (part.type === "file") {
|
|
166
|
+
const fileRecord = { type: "input_file" };
|
|
167
|
+
if (typeof part.file?.file_data === "string")
|
|
168
|
+
fileRecord.file_data = part.file.file_data;
|
|
169
|
+
if (typeof part.file?.file_id === "string")
|
|
170
|
+
fileRecord.file_id = part.file.file_id;
|
|
171
|
+
if (typeof part.file?.filename === "string")
|
|
172
|
+
fileRecord.filename = part.file.filename;
|
|
173
|
+
if (typeof part.file?.file_data === "string" || typeof part.file?.file_id === "string") {
|
|
174
|
+
parts.push(fileRecord);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return parts.length > 0 ? parts : "";
|
|
179
|
+
}
|
|
80
180
|
function toResponsesInput(messages) {
|
|
81
181
|
let instructions = "";
|
|
82
182
|
const input = [];
|
|
@@ -90,7 +190,7 @@ function toResponsesInput(messages) {
|
|
|
90
190
|
}
|
|
91
191
|
if (msg.role === "user") {
|
|
92
192
|
const u = msg;
|
|
93
|
-
input.push({ role: "user", content:
|
|
193
|
+
input.push({ role: "user", content: toResponsesUserContent(u.content) });
|
|
94
194
|
continue;
|
|
95
195
|
}
|
|
96
196
|
if (msg.role === "assistant") {
|
|
@@ -102,7 +202,10 @@ function toResponsesInput(messages) {
|
|
|
102
202
|
}
|
|
103
203
|
}
|
|
104
204
|
if (a.content) {
|
|
105
|
-
|
|
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);
|
|
106
209
|
}
|
|
107
210
|
if (a.tool_calls) {
|
|
108
211
|
for (const tc of a.tool_calls) {
|
|
@@ -125,7 +228,7 @@ function toResponsesInput(messages) {
|
|
|
125
228
|
input.push({
|
|
126
229
|
type: "function_call_output",
|
|
127
230
|
call_id: t.tool_call_id,
|
|
128
|
-
output: typeof t.content === "string" ? t.content : "",
|
|
231
|
+
output: truncateResponsesFunctionCallOutput(typeof t.content === "string" ? t.content : ""),
|
|
129
232
|
});
|
|
130
233
|
continue;
|
|
131
234
|
}
|
|
@@ -141,7 +244,7 @@ function toResponsesTools(ccTools) {
|
|
|
141
244
|
strict: false,
|
|
142
245
|
}));
|
|
143
246
|
}
|
|
144
|
-
async function streamChatCompletion(client, createParams, callbacks, signal) {
|
|
247
|
+
async function streamChatCompletion(client, createParams, callbacks, signal, eagerSettleStreaming = true) {
|
|
145
248
|
(0, runtime_1.emitNervesEvent)({
|
|
146
249
|
component: "engine",
|
|
147
250
|
event: "engine.stream_start",
|
|
@@ -155,8 +258,7 @@ async function streamChatCompletion(client, createParams, callbacks, signal) {
|
|
|
155
258
|
let toolCalls = {};
|
|
156
259
|
let streamStarted = false;
|
|
157
260
|
let usage;
|
|
158
|
-
const
|
|
159
|
-
let finalAnswerDetected = false;
|
|
261
|
+
const answerStreamer = new SettleStreamer(callbacks, eagerSettleStreaming);
|
|
160
262
|
// State machine for parsing inline <think> tags (MiniMax pattern)
|
|
161
263
|
let contentBuf = "";
|
|
162
264
|
let inThinkTag = false;
|
|
@@ -271,24 +373,21 @@ async function streamChatCompletion(client, createParams, callbacks, signal) {
|
|
|
271
373
|
toolCalls[tc.index].id = tc.id;
|
|
272
374
|
if (tc.function?.name) {
|
|
273
375
|
toolCalls[tc.index].name = tc.function.name;
|
|
274
|
-
// Detect
|
|
376
|
+
// Detect settle tool call on first name delta.
|
|
275
377
|
// Only activate streaming if this is the sole tool call (index 0
|
|
276
378
|
// and no other indices seen). Mixed calls are rejected by core.ts.
|
|
277
|
-
if (tc.function.name === "
|
|
379
|
+
if (tc.function.name === "settle" && !answerStreamer.detected
|
|
278
380
|
&& tc.index === 0 && Object.keys(toolCalls).length === 1) {
|
|
279
|
-
|
|
280
|
-
callbacks.onClearText?.();
|
|
381
|
+
answerStreamer.activate();
|
|
281
382
|
}
|
|
282
383
|
}
|
|
283
384
|
if (tc.function?.arguments) {
|
|
284
385
|
toolCalls[tc.index].arguments += tc.function.arguments;
|
|
285
|
-
// Feed
|
|
386
|
+
// Feed settle argument deltas to the parser for progressive
|
|
286
387
|
// streaming, but only when it appears to be the sole tool call.
|
|
287
|
-
if (
|
|
388
|
+
if (answerStreamer.detected && toolCalls[tc.index].name === "settle"
|
|
288
389
|
&& Object.keys(toolCalls).length === 1) {
|
|
289
|
-
|
|
290
|
-
if (text)
|
|
291
|
-
callbacks.onTextChunk(text);
|
|
390
|
+
answerStreamer.processDelta(tc.function.arguments);
|
|
292
391
|
}
|
|
293
392
|
}
|
|
294
393
|
}
|
|
@@ -302,10 +401,10 @@ async function streamChatCompletion(client, createParams, callbacks, signal) {
|
|
|
302
401
|
toolCalls: Object.values(toolCalls),
|
|
303
402
|
outputItems: [],
|
|
304
403
|
usage,
|
|
305
|
-
|
|
404
|
+
settleStreamed: answerStreamer.streamed,
|
|
306
405
|
};
|
|
307
406
|
}
|
|
308
|
-
async function streamResponsesApi(client, createParams, callbacks, signal) {
|
|
407
|
+
async function streamResponsesApi(client, createParams, callbacks, signal, eagerSettleStreaming = true) {
|
|
309
408
|
(0, runtime_1.emitNervesEvent)({
|
|
310
409
|
component: "engine",
|
|
311
410
|
event: "engine.stream_start",
|
|
@@ -320,9 +419,8 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
|
|
|
320
419
|
const outputItems = [];
|
|
321
420
|
let currentToolCall = null;
|
|
322
421
|
let usage;
|
|
323
|
-
const
|
|
422
|
+
const answerStreamer = new SettleStreamer(callbacks, eagerSettleStreaming);
|
|
324
423
|
let functionCallCount = 0;
|
|
325
|
-
let finalAnswerDetected = false;
|
|
326
424
|
for await (const event of response) {
|
|
327
425
|
if (signal?.aborted)
|
|
328
426
|
break;
|
|
@@ -351,12 +449,11 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
|
|
|
351
449
|
name: String(event.item.name),
|
|
352
450
|
arguments: "",
|
|
353
451
|
};
|
|
354
|
-
// Detect
|
|
452
|
+
// Detect settle function call -- clear any streamed noise.
|
|
355
453
|
// Only activate when this is the first (and so far only) function call.
|
|
356
454
|
// Mixed calls are rejected by core.ts; no need to stream their args.
|
|
357
|
-
if (String(event.item.name) === "
|
|
358
|
-
|
|
359
|
-
callbacks.onClearText?.();
|
|
455
|
+
if (String(event.item.name) === "settle" && functionCallCount === 1) {
|
|
456
|
+
answerStreamer.activate();
|
|
360
457
|
}
|
|
361
458
|
}
|
|
362
459
|
break;
|
|
@@ -364,13 +461,11 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
|
|
|
364
461
|
case "response.function_call_arguments.delta": {
|
|
365
462
|
if (currentToolCall) {
|
|
366
463
|
currentToolCall.arguments += event.delta;
|
|
367
|
-
// Feed
|
|
464
|
+
// Feed settle argument deltas to the parser for progressive
|
|
368
465
|
// streaming, but only when it appears to be the sole function call.
|
|
369
|
-
if (
|
|
466
|
+
if (answerStreamer.detected && currentToolCall.name === "settle"
|
|
370
467
|
&& functionCallCount === 1) {
|
|
371
|
-
|
|
372
|
-
if (text)
|
|
373
|
-
callbacks.onTextChunk(text);
|
|
468
|
+
answerStreamer.processDelta(String(event.delta));
|
|
374
469
|
}
|
|
375
470
|
}
|
|
376
471
|
break;
|
|
@@ -410,6 +505,6 @@ async function streamResponsesApi(client, createParams, callbacks, signal) {
|
|
|
410
505
|
toolCalls,
|
|
411
506
|
outputItems,
|
|
412
507
|
usage,
|
|
413
|
-
|
|
508
|
+
settleStreamed: answerStreamer.streamed,
|
|
414
509
|
};
|
|
415
510
|
}
|