@ouro.bot/cli 0.1.0-alpha.56 → 0.1.0-alpha.561
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 +127 -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/changelog.json +3604 -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 +837 -26
- 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 +479 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +111 -0
- package/dist/heart/config-registry.js +322 -0
- package/dist/heart/config.js +114 -118
- package/dist/heart/core.js +913 -246
- package/dist/heart/cross-chat-delivery.js +3 -18
- package/dist/heart/daemon/agent-config-check.js +419 -0
- package/dist/heart/daemon/agent-discovery.js +102 -3
- package/dist/heart/daemon/agent-service.js +522 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +776 -0
- package/dist/heart/daemon/cli-exec.js +7457 -0
- package/dist/heart/daemon/cli-help.js +498 -0
- package/dist/heart/daemon/cli-parse.js +1592 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +763 -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 -1698
- package/dist/heart/daemon/daemon-entry.js +387 -2
- 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 +796 -71
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +826 -0
- package/dist/heart/daemon/health-monitor.js +122 -1
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +115 -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 +89 -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 +82 -12
- package/dist/heart/daemon/logs-prune.js +110 -0
- package/dist/heart/daemon/mcp-canary.js +297 -0
- package/dist/heart/daemon/message-router.js +2 -2
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +14 -12
- 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 +375 -33
- 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 +2 -0
- package/dist/heart/daemon/runtime-logging.js +67 -16
- package/dist/heart/daemon/runtime-metadata.js +3 -31
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +389 -38
- 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 +158 -11
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +330 -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 +162 -17
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -1
- 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-flow.js +32 -56
- 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 +35 -12
- package/dist/heart/identity.js +203 -57
- package/dist/heart/kept-notes.js +357 -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 +66 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +246 -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 +31 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +195 -0
- package/dist/heart/mailbox/readers/agent-machine.js +382 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
- package/dist/heart/mailbox/readers/mail.js +362 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +651 -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 +683 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +19 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +267 -0
- package/dist/heart/provider-credentials.js +425 -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-readiness-cache.js +40 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +139 -52
- package/dist/heart/providers/azure.js +97 -13
- package/dist/heart/providers/error-classification.js +127 -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 +26 -8
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +367 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +13 -4
- package/dist/heart/session-activity.js +43 -22
- package/dist/heart/session-events.js +1149 -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 +243 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +44 -27
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +9 -5
- 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-description.js +139 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +389 -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 +426 -0
- package/dist/heart/versioning/ouro-version-manager.js +295 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
- package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
- package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
- package/dist/mailbox-ui/index.html +15 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +674 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/core.js +720 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +430 -0
- package/dist/mailroom/mbox-import.js +383 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +233 -0
- package/dist/mailroom/search-cache.js +256 -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 +7 -1
- package/dist/mind/context.js +165 -101
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +62 -75
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/friends/channel.js +39 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +39 -3
- package/dist/mind/friends/types.js +2 -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 +4 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1011 -123
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/scrutiny.js +173 -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 +129 -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/review/cli-main.js +5 -0
- package/dist/nerves/review/cli.js +156 -0
- package/dist/nerves/review/core.js +152 -0
- package/dist/nerves/runtime.js +5 -1
- package/dist/repertoire/ado-client.js +15 -56
- package/dist/repertoire/ado-semantic.js +11 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +963 -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 +197 -30
- package/dist/repertoire/coding/manager.js +158 -9
- package/dist/repertoire/coding/spawner.js +55 -9
- package/dist/repertoire/coding/tools.js +170 -7
- 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/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 +295 -0
- package/dist/repertoire/mcp-manager.js +362 -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 +31 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +16 -4
- 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 -78
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-base.js +47 -1075
- package/dist/repertoire/tools-bluebubbles.js +1 -0
- package/dist/repertoire/tools-bridge.js +142 -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 +119 -0
- package/dist/repertoire/tools-github.js +1 -7
- package/dist/repertoire/tools-mail.js +1857 -0
- package/dist/repertoire/tools-notes.js +421 -0
- package/dist/repertoire/tools-session.js +750 -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 +9 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +604 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools.js +108 -100
- 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/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/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} +219 -18
- package/dist/senses/bluebubbles/entry.js +77 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
- package/dist/senses/bluebubbles/index.js +2305 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/replay.js +137 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- 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 +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 +520 -209
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +175 -21
- package/dist/senses/inner-dialog.js +330 -27
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +549 -181
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +251 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +387 -98
- package/dist/senses/trust-gate.js +100 -5
- package/dist/senses/voice/audio-routing.js +119 -0
- package/dist/senses/voice/elevenlabs.js +178 -0
- package/dist/senses/voice/golden-path.js +116 -0
- package/dist/senses/voice/index.js +26 -0
- package/dist/senses/voice/meeting.js +113 -0
- package/dist/senses/voice/playback.js +139 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +85 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +80 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +146 -0
- package/package.json +38 -7
- 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/dist/heart/daemon/auth-flow.js +0 -351
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/daemon/subagent-installer.js +0 -166
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/associative-recall.js +0 -209
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1177
- package/dist/senses/debug-activity.js +0 -148
- package/subagents/README.md +0 -86
- package/subagents/work-doer.md +0 -237
- package/subagents/work-merger.md +0 -618
- package/subagents/work-planner.md +0 -390
- /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/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
|
@@ -0,0 +1,139 @@
|
|
|
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.writeVoicePlaybackArtifact = writeVoicePlaybackArtifact;
|
|
37
|
+
const fs = __importStar(require("fs/promises"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
40
|
+
const audio_routing_1 = require("./audio-routing");
|
|
41
|
+
function audioExtension(mimeType) {
|
|
42
|
+
if (mimeType === "audio/mpeg")
|
|
43
|
+
return "mp3";
|
|
44
|
+
if (mimeType === "audio/wav" || mimeType === "audio/x-wav")
|
|
45
|
+
return "wav";
|
|
46
|
+
if (mimeType.startsWith("audio/pcm"))
|
|
47
|
+
return "pcm";
|
|
48
|
+
return "audio";
|
|
49
|
+
}
|
|
50
|
+
function safeFileStem(input) {
|
|
51
|
+
const stem = input
|
|
52
|
+
.trim()
|
|
53
|
+
.toLowerCase()
|
|
54
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
55
|
+
.replace(/^-+|-+$/g, "");
|
|
56
|
+
return stem || "utterance";
|
|
57
|
+
}
|
|
58
|
+
function commandFailureMessage(exitCode, result) {
|
|
59
|
+
const stderr = result.stderr?.trim();
|
|
60
|
+
if (stderr)
|
|
61
|
+
return `exit ${exitCode}: ${stderr}`;
|
|
62
|
+
const stdout = result.stdout?.trim();
|
|
63
|
+
if (stdout)
|
|
64
|
+
return `exit ${exitCode}: ${stdout}`;
|
|
65
|
+
return `exit ${exitCode}`;
|
|
66
|
+
}
|
|
67
|
+
async function writeVoicePlaybackArtifact(request) {
|
|
68
|
+
const mkdir = request.mkdir ?? fs.mkdir;
|
|
69
|
+
const writeFile = request.writeFile ?? fs.writeFile;
|
|
70
|
+
const commandRunner = request.commandRunner ?? (0, audio_routing_1.createNodeVoiceCommandRunner)();
|
|
71
|
+
const timeoutMs = request.timeoutMs ?? 30_000;
|
|
72
|
+
const playbackCommandPath = request.playbackCommandPath ?? "afplay";
|
|
73
|
+
const audioPath = path.join(request.outputDir, `${safeFileStem(request.utteranceId)}.${audioExtension(request.delivery.mimeType)}`);
|
|
74
|
+
await mkdir(request.outputDir, { recursive: true });
|
|
75
|
+
await writeFile(audioPath, request.delivery.audio);
|
|
76
|
+
(0, runtime_1.emitNervesEvent)({
|
|
77
|
+
component: "senses",
|
|
78
|
+
event: "senses.voice_playback_artifact_written",
|
|
79
|
+
message: "voice playback artifact written",
|
|
80
|
+
meta: {
|
|
81
|
+
utteranceId: request.utteranceId,
|
|
82
|
+
audioPath,
|
|
83
|
+
byteLength: request.delivery.byteLength,
|
|
84
|
+
mimeType: request.delivery.mimeType,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
if (request.playAudio !== true) {
|
|
88
|
+
return {
|
|
89
|
+
status: "written",
|
|
90
|
+
audioPath,
|
|
91
|
+
byteLength: request.delivery.byteLength,
|
|
92
|
+
mimeType: request.delivery.mimeType,
|
|
93
|
+
playbackAttempted: false,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
(0, runtime_1.emitNervesEvent)({
|
|
97
|
+
component: "senses",
|
|
98
|
+
event: "senses.voice_playback_start",
|
|
99
|
+
message: "starting voice playback",
|
|
100
|
+
meta: { utteranceId: request.utteranceId, audioPath, playbackCommandPath },
|
|
101
|
+
});
|
|
102
|
+
try {
|
|
103
|
+
const result = await commandRunner(playbackCommandPath, [audioPath], { timeoutMs });
|
|
104
|
+
if (typeof result.exitCode === "number" && result.exitCode !== 0) {
|
|
105
|
+
throw new Error(commandFailureMessage(result.exitCode, result));
|
|
106
|
+
}
|
|
107
|
+
(0, runtime_1.emitNervesEvent)({
|
|
108
|
+
component: "senses",
|
|
109
|
+
event: "senses.voice_playback_end",
|
|
110
|
+
message: "finished voice playback",
|
|
111
|
+
meta: { utteranceId: request.utteranceId, audioPath },
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
status: "played",
|
|
115
|
+
audioPath,
|
|
116
|
+
byteLength: request.delivery.byteLength,
|
|
117
|
+
mimeType: request.delivery.mimeType,
|
|
118
|
+
playbackAttempted: true,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
123
|
+
(0, runtime_1.emitNervesEvent)({
|
|
124
|
+
level: "error",
|
|
125
|
+
component: "senses",
|
|
126
|
+
event: "senses.voice_playback_error",
|
|
127
|
+
message: "voice playback failed",
|
|
128
|
+
meta: { utteranceId: request.utteranceId, audioPath, error: message },
|
|
129
|
+
});
|
|
130
|
+
return {
|
|
131
|
+
status: "failed",
|
|
132
|
+
audioPath,
|
|
133
|
+
byteLength: request.delivery.byteLength,
|
|
134
|
+
mimeType: request.delivery.mimeType,
|
|
135
|
+
playbackAttempted: true,
|
|
136
|
+
error: message,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildVoiceTranscript = buildVoiceTranscript;
|
|
4
|
+
exports.transcriptToPromptText = transcriptToPromptText;
|
|
5
|
+
exports.normalizeVoiceSessionKey = normalizeVoiceSessionKey;
|
|
6
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
7
|
+
function compactSpeechText(text) {
|
|
8
|
+
return text.replace(/\s+/g, " ").trim();
|
|
9
|
+
}
|
|
10
|
+
function buildVoiceTranscript(input) {
|
|
11
|
+
const text = compactSpeechText(input.text);
|
|
12
|
+
if (!text) {
|
|
13
|
+
(0, runtime_1.emitNervesEvent)({
|
|
14
|
+
level: "error",
|
|
15
|
+
component: "senses",
|
|
16
|
+
event: "senses.voice_transcript_error",
|
|
17
|
+
message: "voice transcript text is empty",
|
|
18
|
+
meta: { utteranceId: input.utteranceId },
|
|
19
|
+
});
|
|
20
|
+
throw new Error("voice transcript text is empty");
|
|
21
|
+
}
|
|
22
|
+
const transcript = {
|
|
23
|
+
utteranceId: input.utteranceId,
|
|
24
|
+
text,
|
|
25
|
+
source: input.source,
|
|
26
|
+
audioPath: input.audioPath ?? null,
|
|
27
|
+
language: input.language ?? null,
|
|
28
|
+
startedAt: input.startedAt ?? null,
|
|
29
|
+
endedAt: input.endedAt ?? null,
|
|
30
|
+
};
|
|
31
|
+
(0, runtime_1.emitNervesEvent)({
|
|
32
|
+
component: "senses",
|
|
33
|
+
event: "senses.voice_transcript_built",
|
|
34
|
+
message: "built voice transcript",
|
|
35
|
+
meta: { utteranceId: transcript.utteranceId, source: transcript.source, length: transcript.text.length },
|
|
36
|
+
});
|
|
37
|
+
return transcript;
|
|
38
|
+
}
|
|
39
|
+
function transcriptToPromptText(transcript) {
|
|
40
|
+
const text = compactSpeechText(transcript.text);
|
|
41
|
+
if (!text) {
|
|
42
|
+
(0, runtime_1.emitNervesEvent)({
|
|
43
|
+
level: "error",
|
|
44
|
+
component: "senses",
|
|
45
|
+
event: "senses.voice_transcript_error",
|
|
46
|
+
message: "voice prompt text is empty",
|
|
47
|
+
meta: { utteranceId: transcript.utteranceId },
|
|
48
|
+
});
|
|
49
|
+
throw new Error("voice transcript text is empty");
|
|
50
|
+
}
|
|
51
|
+
return text;
|
|
52
|
+
}
|
|
53
|
+
function normalizeVoiceSessionKey(value) {
|
|
54
|
+
const normalized = value
|
|
55
|
+
.trim()
|
|
56
|
+
.toLowerCase()
|
|
57
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
58
|
+
.replace(/^-+|-+$/g, "");
|
|
59
|
+
if (!normalized) {
|
|
60
|
+
(0, runtime_1.emitNervesEvent)({
|
|
61
|
+
level: "error",
|
|
62
|
+
component: "senses",
|
|
63
|
+
event: "senses.voice_transcript_error",
|
|
64
|
+
message: "voice session key is empty",
|
|
65
|
+
meta: { inputLength: value.length },
|
|
66
|
+
});
|
|
67
|
+
throw new Error("voice session key is empty");
|
|
68
|
+
}
|
|
69
|
+
return normalized;
|
|
70
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runVoiceLoopbackTurn = runVoiceLoopbackTurn;
|
|
4
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
5
|
+
const shared_turn_1 = require("../shared-turn");
|
|
6
|
+
const transcript_1 = require("./transcript");
|
|
7
|
+
async function runVoiceLoopbackTurn(options) {
|
|
8
|
+
const runSenseTurn = options.runSenseTurn ?? shared_turn_1.runSenseTurn;
|
|
9
|
+
let userMessage;
|
|
10
|
+
try {
|
|
11
|
+
userMessage = (0, transcript_1.transcriptToPromptText)(options.transcript);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
(0, runtime_1.emitNervesEvent)({
|
|
15
|
+
level: "error",
|
|
16
|
+
component: "senses",
|
|
17
|
+
event: "senses.voice_turn_error",
|
|
18
|
+
message: "voice turn rejected transcript",
|
|
19
|
+
meta: { utteranceId: options.transcript.utteranceId, error: error instanceof Error ? error.message : String(error) },
|
|
20
|
+
});
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
(0, runtime_1.emitNervesEvent)({
|
|
24
|
+
component: "senses",
|
|
25
|
+
event: "senses.voice_turn_start",
|
|
26
|
+
message: "starting voice loopback turn",
|
|
27
|
+
meta: {
|
|
28
|
+
agentName: options.agentName,
|
|
29
|
+
friendId: options.friendId,
|
|
30
|
+
sessionKey: options.sessionKey,
|
|
31
|
+
utteranceId: options.transcript.utteranceId,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
const turn = await runSenseTurn({
|
|
35
|
+
agentName: options.agentName,
|
|
36
|
+
channel: "voice",
|
|
37
|
+
friendId: options.friendId,
|
|
38
|
+
sessionKey: options.sessionKey,
|
|
39
|
+
userMessage,
|
|
40
|
+
});
|
|
41
|
+
try {
|
|
42
|
+
const spoken = await options.tts.synthesize({
|
|
43
|
+
utteranceId: options.transcript.utteranceId,
|
|
44
|
+
text: turn.response,
|
|
45
|
+
});
|
|
46
|
+
const result = {
|
|
47
|
+
responseText: turn.response,
|
|
48
|
+
ponderDeferred: turn.ponderDeferred,
|
|
49
|
+
tts: {
|
|
50
|
+
status: "delivered",
|
|
51
|
+
audio: spoken.audio,
|
|
52
|
+
byteLength: spoken.byteLength,
|
|
53
|
+
chunkCount: spoken.chunkCount,
|
|
54
|
+
mimeType: spoken.mimeType,
|
|
55
|
+
modelId: spoken.modelId,
|
|
56
|
+
voiceId: spoken.voiceId,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
(0, runtime_1.emitNervesEvent)({
|
|
60
|
+
component: "senses",
|
|
61
|
+
event: "senses.voice_turn_end",
|
|
62
|
+
message: "voice loopback turn delivered speech",
|
|
63
|
+
meta: { utteranceId: options.transcript.utteranceId, responseLength: turn.response.length, byteLength: spoken.byteLength },
|
|
64
|
+
});
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
69
|
+
(0, runtime_1.emitNervesEvent)({
|
|
70
|
+
level: "error",
|
|
71
|
+
component: "senses",
|
|
72
|
+
event: "senses.voice_turn_tts_error",
|
|
73
|
+
message: "voice loopback TTS failed after text response",
|
|
74
|
+
meta: { utteranceId: options.transcript.utteranceId, error: message, responseLength: turn.response.length },
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
responseText: turn.response,
|
|
78
|
+
ponderDeferred: turn.ponderDeferred,
|
|
79
|
+
tts: {
|
|
80
|
+
status: "failed",
|
|
81
|
+
error: message,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
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.parseWhisperCppTranscriptJson = parseWhisperCppTranscriptJson;
|
|
37
|
+
exports.createNodeWhisperCppProcessRunner = createNodeWhisperCppProcessRunner;
|
|
38
|
+
exports.createWhisperCppTranscriber = createWhisperCppTranscriber;
|
|
39
|
+
const fs = __importStar(require("fs/promises"));
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const child_process_1 = require("child_process");
|
|
43
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
44
|
+
const transcript_1 = require("./transcript");
|
|
45
|
+
function parseWhisperCppTranscriptJson(raw) {
|
|
46
|
+
let parsed;
|
|
47
|
+
try {
|
|
48
|
+
parsed = JSON.parse(raw);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
throw new Error(`invalid whisper.cpp JSON: ${String(error)}`);
|
|
52
|
+
}
|
|
53
|
+
const text = typeof parsed.text === "string"
|
|
54
|
+
? parsed.text.trim()
|
|
55
|
+
: Array.isArray(parsed.transcription)
|
|
56
|
+
? parsed.transcription
|
|
57
|
+
.map((entry) => typeof entry.text === "string" ? entry.text.trim() : "")
|
|
58
|
+
.filter(Boolean)
|
|
59
|
+
.join(" ")
|
|
60
|
+
.trim()
|
|
61
|
+
: "";
|
|
62
|
+
if (!text) {
|
|
63
|
+
throw new Error("empty whisper.cpp transcript");
|
|
64
|
+
}
|
|
65
|
+
return text;
|
|
66
|
+
}
|
|
67
|
+
async function defaultMakeTempDir() {
|
|
68
|
+
return fs.mkdtemp(path.join(os.tmpdir(), "ouro-voice-whisper-"));
|
|
69
|
+
}
|
|
70
|
+
async function defaultRemoveDir(dir) {
|
|
71
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
72
|
+
}
|
|
73
|
+
function createNodeWhisperCppProcessRunner() {
|
|
74
|
+
return (command, args, options) => new Promise((resolve, reject) => {
|
|
75
|
+
const child = (0, child_process_1.spawn)(command, args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
76
|
+
const stdout = [];
|
|
77
|
+
const stderr = [];
|
|
78
|
+
const timer = setTimeout(() => {
|
|
79
|
+
child.kill("SIGTERM");
|
|
80
|
+
reject(new Error(`command timed out after ${options.timeoutMs}ms`));
|
|
81
|
+
}, options.timeoutMs);
|
|
82
|
+
child.stdout.on("data", (chunk) => stdout.push(chunk));
|
|
83
|
+
child.stderr.on("data", (chunk) => stderr.push(chunk));
|
|
84
|
+
child.on("error", (error) => {
|
|
85
|
+
clearTimeout(timer);
|
|
86
|
+
reject(error);
|
|
87
|
+
});
|
|
88
|
+
child.on("close", (exitCode) => {
|
|
89
|
+
clearTimeout(timer);
|
|
90
|
+
resolve({
|
|
91
|
+
stdout: Buffer.concat(stdout).toString("utf8"),
|
|
92
|
+
stderr: Buffer.concat(stderr).toString("utf8"),
|
|
93
|
+
exitCode: exitCode ?? 0,
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function createWhisperCppTranscriber(options) {
|
|
99
|
+
const timeoutMs = options.timeoutMs ?? 120_000;
|
|
100
|
+
const readFile = options.readFile ?? fs.readFile;
|
|
101
|
+
const makeTempDir = options.makeTempDir ?? defaultMakeTempDir;
|
|
102
|
+
const removeDir = options.removeDir ?? defaultRemoveDir;
|
|
103
|
+
const processRunner = options.processRunner ?? createNodeWhisperCppProcessRunner();
|
|
104
|
+
return {
|
|
105
|
+
async transcribe(request) {
|
|
106
|
+
const workDir = await makeTempDir();
|
|
107
|
+
const outputBase = path.join(workDir, "transcript");
|
|
108
|
+
const args = [
|
|
109
|
+
"-m",
|
|
110
|
+
options.modelPath,
|
|
111
|
+
"-f",
|
|
112
|
+
request.audioPath,
|
|
113
|
+
"-oj",
|
|
114
|
+
"-of",
|
|
115
|
+
outputBase,
|
|
116
|
+
...(request.language ? ["-l", request.language] : []),
|
|
117
|
+
];
|
|
118
|
+
(0, runtime_1.emitNervesEvent)({
|
|
119
|
+
component: "senses",
|
|
120
|
+
event: "senses.voice_stt_start",
|
|
121
|
+
message: "starting Whisper.cpp transcription",
|
|
122
|
+
meta: { utteranceId: request.utteranceId, audioPath: request.audioPath },
|
|
123
|
+
});
|
|
124
|
+
try {
|
|
125
|
+
const result = await processRunner(options.whisperCliPath, args, { timeoutMs });
|
|
126
|
+
if (typeof result.exitCode === "number" && result.exitCode !== 0) {
|
|
127
|
+
throw new Error(`exit ${result.exitCode}${result.stderr ? `: ${result.stderr}` : ""}`);
|
|
128
|
+
}
|
|
129
|
+
const raw = await readFile(`${outputBase}.json`, "utf8");
|
|
130
|
+
const text = parseWhisperCppTranscriptJson(raw);
|
|
131
|
+
const transcript = (0, transcript_1.buildVoiceTranscript)({
|
|
132
|
+
utteranceId: request.utteranceId,
|
|
133
|
+
text,
|
|
134
|
+
audioPath: request.audioPath,
|
|
135
|
+
language: request.language,
|
|
136
|
+
source: "whisper.cpp",
|
|
137
|
+
});
|
|
138
|
+
(0, runtime_1.emitNervesEvent)({
|
|
139
|
+
component: "senses",
|
|
140
|
+
event: "senses.voice_stt_end",
|
|
141
|
+
message: "finished Whisper.cpp transcription",
|
|
142
|
+
meta: { utteranceId: request.utteranceId, length: transcript.text.length },
|
|
143
|
+
});
|
|
144
|
+
return transcript;
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
(0, runtime_1.emitNervesEvent)({
|
|
148
|
+
level: "error",
|
|
149
|
+
component: "senses",
|
|
150
|
+
event: "senses.voice_stt_error",
|
|
151
|
+
message: "Whisper.cpp transcription failed",
|
|
152
|
+
meta: { utteranceId: request.utteranceId, error: error instanceof Error ? error.message : String(error) },
|
|
153
|
+
});
|
|
154
|
+
throw new Error(`whisper.cpp transcription failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
await removeDir(workDir);
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
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
|
+
const agentArgIndex = process.argv.indexOf("--agent");
|
|
37
|
+
const agentName = agentArgIndex >= 0 ? process.argv[agentArgIndex + 1] : undefined;
|
|
38
|
+
if (!agentName) {
|
|
39
|
+
// eslint-disable-next-line no-console -- pre-boot guard: --agent check before imports
|
|
40
|
+
console.error("Missing required --agent <name> argument.\nUsage: node dist/senses/voice-entry.js --agent ouroboros");
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
const runtime_logging_1 = require("../heart/daemon/runtime-logging");
|
|
44
|
+
const runtime_1 = require("../nerves/runtime");
|
|
45
|
+
(0, runtime_logging_1.configureDaemonRuntimeLogger)("voice");
|
|
46
|
+
(0, runtime_1.emitNervesEvent)({
|
|
47
|
+
component: "senses",
|
|
48
|
+
event: "senses.entry_boot",
|
|
49
|
+
message: "booting Voice entrypoint",
|
|
50
|
+
meta: { entry: "voice", agentName },
|
|
51
|
+
});
|
|
52
|
+
Promise.resolve().then(() => __importStar(require("../heart/runtime-credentials"))).then(async ({ readMachineRuntimeCredentialConfig, refreshMachineRuntimeCredentialConfig, refreshRuntimeCredentialConfig, waitForRuntimeCredentialBootstrap, }) => {
|
|
53
|
+
await waitForRuntimeCredentialBootstrap(agentName);
|
|
54
|
+
const { loadOrCreateMachineIdentity } = await Promise.resolve().then(() => __importStar(require("../heart/machine-identity")));
|
|
55
|
+
const machine = loadOrCreateMachineIdentity();
|
|
56
|
+
const machineConfig = readMachineRuntimeCredentialConfig(agentName);
|
|
57
|
+
if (!machineConfig.ok) {
|
|
58
|
+
await refreshMachineRuntimeCredentialConfig(agentName, machine.machineId, { preserveCachedOnFailure: true }).catch(() => undefined);
|
|
59
|
+
}
|
|
60
|
+
void refreshRuntimeCredentialConfig(agentName, { preserveCachedOnFailure: true }).catch(() => undefined);
|
|
61
|
+
(0, runtime_1.emitNervesEvent)({
|
|
62
|
+
component: "senses",
|
|
63
|
+
event: "senses.voice_entry_ready",
|
|
64
|
+
message: "Voice entrypoint is ready for managed voice turns",
|
|
65
|
+
meta: { entry: "voice", agentName, machineId: machine.machineId },
|
|
66
|
+
});
|
|
67
|
+
setInterval(() => undefined, 60_000);
|
|
68
|
+
})
|
|
69
|
+
.catch((error) => {
|
|
70
|
+
(0, runtime_1.emitNervesEvent)({
|
|
71
|
+
level: "error",
|
|
72
|
+
component: "senses",
|
|
73
|
+
event: "senses.entry_error",
|
|
74
|
+
message: "Voice entrypoint failed",
|
|
75
|
+
meta: { entry: "voice", agentName, error: error instanceof Error ? error.message : String(error) },
|
|
76
|
+
});
|
|
77
|
+
// eslint-disable-next-line no-console -- fatal startup guard for sense process
|
|
78
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
79
|
+
process.exit(1);
|
|
80
|
+
});
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Harness-side trip ledger primitive.
|
|
3
|
+
//
|
|
4
|
+
// Mirrors the substrate's @ouro/work-protocol/src/trip.ts contract (vendored
|
|
5
|
+
// the same way mailroom/core.ts vendors mail). Slugger's framing: today,
|
|
6
|
+
// doc-edits-from-mail keep falling back on freeform parsing because there is
|
|
7
|
+
// no structured object between "mail body" and "travel doc". TripRecord +
|
|
8
|
+
// TripLeg are that object — every leg fact carries non-optional provenance
|
|
9
|
+
// (TripEvidence with discoveryMethod) so the ledger can be audited cleanly
|
|
10
|
+
// and reasoned about under conflict.
|
|
11
|
+
//
|
|
12
|
+
// Per-agent ledger keypair design: in v1 each agent has ONE ledger keypair.
|
|
13
|
+
// All TripRecord blobs are encrypted with that key. Cross-trip sharing
|
|
14
|
+
// (handing one trip's facts to another party without their owning the whole
|
|
15
|
+
// ledger) is a follow-on; it would shard to per-trip keys, which the
|
|
16
|
+
// substrate's TripLedgerRegistry can already represent.
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.generateTripKeyPair = generateTripKeyPair;
|
|
52
|
+
exports.encryptTripRecord = encryptTripRecord;
|
|
53
|
+
exports.decryptTripRecord = decryptTripRecord;
|
|
54
|
+
exports.newTripId = newTripId;
|
|
55
|
+
exports.newLegId = newLegId;
|
|
56
|
+
exports.newTripLedgerRecord = newTripLedgerRecord;
|
|
57
|
+
const crypto = __importStar(require("node:crypto"));
|
|
58
|
+
// ── Helpers: keys + crypto ─────────────────────────────────────────
|
|
59
|
+
function safeLabel(label) {
|
|
60
|
+
return label.toLowerCase().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
61
|
+
}
|
|
62
|
+
function generateTripKeyPair(label) {
|
|
63
|
+
const { publicKey, privateKey } = crypto.generateKeyPairSync("rsa", {
|
|
64
|
+
modulusLength: 2048,
|
|
65
|
+
publicKeyEncoding: { type: "spki", format: "pem" },
|
|
66
|
+
privateKeyEncoding: { type: "pkcs8", format: "pem" },
|
|
67
|
+
});
|
|
68
|
+
const slug = safeLabel(label) || "ledger";
|
|
69
|
+
const fingerprint = crypto.createHash("sha256").update(publicKey).digest("hex").slice(0, 16);
|
|
70
|
+
return {
|
|
71
|
+
keyId: `trip_${slug}_${fingerprint}`,
|
|
72
|
+
publicKeyPem: publicKey,
|
|
73
|
+
privateKeyPem: privateKey,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function encryptTripRecord(trip, publicKeyPem, keyId) {
|
|
77
|
+
const contentKey = crypto.randomBytes(32);
|
|
78
|
+
const iv = crypto.randomBytes(12);
|
|
79
|
+
const cipher = crypto.createCipheriv("aes-256-gcm", contentKey, iv);
|
|
80
|
+
const ciphertext = Buffer.concat([cipher.update(Buffer.from(JSON.stringify(trip), "utf-8")), cipher.final()]);
|
|
81
|
+
const authTag = cipher.getAuthTag();
|
|
82
|
+
const wrappedKey = crypto.publicEncrypt({ key: publicKeyPem, oaepHash: "sha256" }, contentKey);
|
|
83
|
+
return {
|
|
84
|
+
algorithm: "RSA-OAEP-SHA256+A256GCM",
|
|
85
|
+
keyId,
|
|
86
|
+
wrappedKey: wrappedKey.toString("base64"),
|
|
87
|
+
iv: iv.toString("base64"),
|
|
88
|
+
authTag: authTag.toString("base64"),
|
|
89
|
+
ciphertext: ciphertext.toString("base64"),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function decryptTripRecord(payload, privateKeyPem) {
|
|
93
|
+
const contentKey = crypto.privateDecrypt({
|
|
94
|
+
key: privateKeyPem,
|
|
95
|
+
oaepHash: "sha256",
|
|
96
|
+
}, Buffer.from(payload.wrappedKey, "base64"));
|
|
97
|
+
const decipher = crypto.createDecipheriv("aes-256-gcm", contentKey, Buffer.from(payload.iv, "base64"));
|
|
98
|
+
decipher.setAuthTag(Buffer.from(payload.authTag, "base64"));
|
|
99
|
+
const plaintext = Buffer.concat([
|
|
100
|
+
decipher.update(Buffer.from(payload.ciphertext, "base64")),
|
|
101
|
+
decipher.final(),
|
|
102
|
+
]);
|
|
103
|
+
return JSON.parse(plaintext.toString("utf-8"));
|
|
104
|
+
}
|
|
105
|
+
// ── Helpers: deterministic ids ─────────────────────────────────────
|
|
106
|
+
function newTripId(agentId, name, createdAt) {
|
|
107
|
+
const fingerprint = crypto.createHash("sha256")
|
|
108
|
+
.update(`${agentId}\n${name}\n${createdAt}`)
|
|
109
|
+
.digest("hex")
|
|
110
|
+
.slice(0, 16);
|
|
111
|
+
const slug = safeLabel(name) || "trip";
|
|
112
|
+
return `trip_${slug}_${fingerprint}`;
|
|
113
|
+
}
|
|
114
|
+
function newLegId(input) {
|
|
115
|
+
const distinguish = input.vendor || input.confirmationCode || crypto.randomUUID();
|
|
116
|
+
const fingerprint = crypto.createHash("sha256")
|
|
117
|
+
.update(`${input.tripId}\n${input.kind}\n${distinguish}\n${input.createdAt}`)
|
|
118
|
+
.digest("hex")
|
|
119
|
+
.slice(0, 16);
|
|
120
|
+
return `leg_${input.kind}_${fingerprint}`;
|
|
121
|
+
}
|
|
122
|
+
// ── Ledger record helpers ──────────────────────────────────────────
|
|
123
|
+
function newTripLedgerRecord(input) {
|
|
124
|
+
const now = (input.now ?? (() => new Date().toISOString()))();
|
|
125
|
+
const keypair = generateTripKeyPair(input.label ?? input.agentId);
|
|
126
|
+
const ledgerId = `ledger_${safeLabel(input.agentId) || "agent"}_${crypto.createHash("sha256").update(`${input.agentId}\n${now}\n${keypair.keyId}`).digest("hex").slice(0, 16)}`;
|
|
127
|
+
return {
|
|
128
|
+
ledger: {
|
|
129
|
+
schemaVersion: 1,
|
|
130
|
+
agentId: input.agentId,
|
|
131
|
+
ledgerId,
|
|
132
|
+
keyId: keypair.keyId,
|
|
133
|
+
publicKeyPem: keypair.publicKeyPem,
|
|
134
|
+
createdAt: now,
|
|
135
|
+
},
|
|
136
|
+
keypair,
|
|
137
|
+
};
|
|
138
|
+
}
|