@ouro.bot/cli 0.1.0-alpha.83 → 0.1.0-alpha.831
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +154 -23
- package/RepairGuide.ouro/agent.json +5 -0
- package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
- package/RepairGuide.ouro/psyche/SOUL.md +55 -0
- package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
- package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
- package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
- package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/assets/bluebubbles-host +264 -0
- package/assets/sanctuary-host-launcher.sh +16 -0
- package/changelog.json +5308 -16
- package/deploy/unraid/Dockerfile +54 -0
- package/deploy/unraid/README.txt +2983 -0
- package/deploy/unraid/audit-container-spec.sh +4 -0
- package/deploy/unraid/container-runtime.json +1 -0
- package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
- package/deploy/unraid/docker-man-template-xml.cjs +105 -0
- package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
- package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
- package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
- package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
- package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
- package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
- package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
- package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
- package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
- package/deploy/unraid/sanctuary-authority-installation.json +36 -0
- package/deploy/unraid/sanctuary-authority-service.sh +30 -0
- package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
- package/deploy/unraid/sanctuary-safe-rename.py +24 -0
- package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2084 -0
- package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
- package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
- package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
- package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
- package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
- package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
- package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +795 -0
- package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
- package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +15 -0
- package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
- package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +15 -0
- package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
- package/deploy/unraid/sanctuary.ouro/tool-profiles.json +135 -0
- package/deploy/unraid/sanctuary.xml +28 -0
- package/dist/a2a/card.js +57 -0
- package/dist/a2a/client.js +180 -0
- package/dist/a2a/config.js +50 -0
- package/dist/a2a/delegation-stores.js +56 -0
- package/dist/a2a/did-resolution.js +93 -0
- package/dist/a2a/identity.js +170 -0
- package/dist/a2a/inbound-share.js +107 -0
- package/dist/a2a/mission-result-wire.js +196 -0
- package/dist/a2a/onboarding.js +115 -0
- package/dist/a2a/pin-store.js +132 -0
- package/dist/a2a/seen-ledger.js +120 -0
- package/dist/a2a/server.js +604 -0
- package/dist/a2a/task-store.js +69 -0
- package/dist/a2a/transport.js +45 -0
- package/dist/a2a/types.js +3 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +360 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/evolution.js +490 -0
- package/dist/arc/flight-recorder.js +1034 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +386 -0
- package/dist/arc/packets.js +336 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +57 -0
- package/dist/commerce/store.js +755 -0
- package/dist/commerce/types.js +3 -0
- package/dist/heart/active-work.js +798 -40
- package/dist/heart/agent-entry.js +252 -3
- package/dist/heart/approval-files.js +113 -0
- package/dist/heart/approval-store.js +960 -0
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +18 -0
- package/dist/heart/attachments/sources/telegram.js +71 -0
- package/dist/heart/attachments/store.js +132 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +495 -0
- package/dist/heart/autonomy-budget.js +478 -0
- package/dist/heart/awaiting/await-alert.js +148 -0
- package/dist/heart/awaiting/await-expiry.js +143 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +149 -0
- package/dist/heart/awaiting/await-runtime-state.js +111 -0
- package/dist/heart/awaiting/await-scheduler.js +382 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +137 -17
- package/dist/heart/bridges/store.js +14 -2
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +44 -18
- package/dist/heart/config-registry.js +331 -0
- package/dist/heart/config.js +174 -131
- package/dist/heart/context-loss-gauntlet.js +387 -0
- package/dist/heart/context-loss-sentinel.js +1157 -0
- package/dist/heart/core.js +2169 -581
- package/dist/heart/cross-chat-delivery.js +9 -22
- package/dist/heart/daemon/agent-config-check.js +451 -0
- package/dist/heart/daemon/agent-discovery.js +185 -3
- package/dist/heart/daemon/agent-service.js +542 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/await-private-wake.js +59 -0
- package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
- package/dist/heart/daemon/bluebubbles-host.js +273 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +180 -0
- package/dist/heart/daemon/cli-defaults.js +854 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +8822 -0
- package/dist/heart/daemon/cli-help.js +716 -0
- package/dist/heart/daemon/cli-parse.js +2771 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +777 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
- package/dist/heart/daemon/container-healthcheck.js +112 -0
- package/dist/heart/daemon/container-runtime.js +97 -0
- package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
- package/dist/heart/daemon/container-spec-auditor.js +229 -0
- package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
- package/dist/heart/daemon/daemon-cli.js +29 -2349
- package/dist/heart/daemon/daemon-entry.js +930 -11
- package/dist/heart/daemon/daemon-health.js +186 -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 +2084 -105
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +1755 -0
- package/dist/heart/daemon/freshness.js +345 -0
- package/dist/heart/daemon/habit-private-wake.js +61 -0
- package/dist/heart/daemon/health-monitor.js +142 -11
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
- package/dist/heart/daemon/http-health-probe.js +80 -0
- package/dist/heart/daemon/human-command-screens.js +234 -0
- package/dist/heart/daemon/human-readiness.js +114 -0
- package/dist/heart/daemon/inner-status.js +78 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +37 -8
- package/dist/heart/daemon/log-tailer.js +79 -10
- package/dist/heart/daemon/logs-prune.js +132 -0
- package/dist/heart/daemon/mcp-canary.js +524 -0
- package/dist/heart/daemon/message-router.js +65 -5
- package/dist/heart/daemon/migrate-to-desk.js +848 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +22 -14
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/plugin-cli.js +432 -0
- package/dist/heart/daemon/process-manager.js +733 -61
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/prunable-bundle.js +144 -0
- package/dist/heart/daemon/pulse.js +511 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +47 -14
- package/dist/heart/daemon/runtime-metadata.js +2 -30
- package/dist/heart/daemon/runtime-mode.js +13 -2
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
- package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
- package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
- package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
- package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
- package/dist/heart/daemon/sanctuary-authority-epoch.js +256 -0
- package/dist/heart/daemon/sanctuary-authority-installation.js +140 -0
- package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
- package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +819 -0
- package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
- package/dist/heart/daemon/sanctuary-bundle-migration.js +729 -0
- package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
- package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +494 -0
- package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
- package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
- package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
- package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
- package/dist/heart/daemon/sanctuary-package-management.js +103 -0
- package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
- package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +445 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-service.js +630 -0
- package/dist/heart/daemon/sense-manager.js +699 -48
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +1 -1
- package/dist/heart/daemon/socket-client.js +180 -12
- package/dist/heart/daemon/stale-bundle-prune.js +113 -0
- package/dist/heart/daemon/startup-tui.js +339 -0
- package/dist/heart/daemon/supercronic-supervisor.js +282 -0
- package/dist/heart/daemon/task-scheduler.js +117 -39
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +138 -54
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -4
- package/dist/heart/external-events/router.js +1430 -0
- package/dist/heart/frontend-approval-runtime.js +506 -0
- package/dist/heart/frontend-journal.js +215 -0
- package/dist/heart/frontend-session-service.js +237 -0
- package/dist/heart/frontend-socket-client.js +164 -0
- package/dist/heart/frontend-socket.js +400 -0
- package/dist/heart/habits/habit-cancel.js +810 -0
- package/dist/heart/habits/habit-lifecycle.js +1327 -0
- package/dist/heart/habits/habit-migration.js +194 -0
- package/dist/heart/habits/habit-parser.js +278 -0
- package/dist/heart/habits/habit-runtime-state.js +93 -0
- package/dist/heart/habits/habit-scheduler.js +653 -0
- package/dist/heart/habits/habit-session-summary.js +318 -0
- package/dist/heart/habits/habit-session.js +636 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
- package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
- package/dist/heart/identity.js +196 -59
- package/dist/heart/kept-notes.js +289 -0
- package/dist/heart/kicks.js +1 -1
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +356 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +39 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +197 -0
- package/dist/heart/mailbox/readers/agent-machine.js +428 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
- package/dist/heart/mailbox/readers/sessions.js +231 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +696 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +11 -0
- package/dist/heart/orientation-frame.js +345 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/primitives.js +1 -1
- package/dist/heart/private-runtime/decision-renderer.js +158 -0
- package/dist/heart/private-runtime/index.js +18 -0
- package/dist/heart/private-runtime/ledger.js +221 -0
- package/dist/heart/private-runtime/policy.js +252 -0
- package/dist/heart/private-runtime/types.js +2 -0
- package/dist/heart/progress-story.js +1 -1
- package/dist/heart/provider-attempt.js +137 -0
- package/dist/heart/provider-binding-resolver.js +273 -0
- package/dist/heart/provider-credentials.js +449 -0
- package/dist/heart/provider-failover.js +311 -0
- package/dist/heart/provider-models.js +96 -0
- package/dist/heart/provider-ping.js +265 -0
- package/dist/heart/provider-readiness-cache.js +119 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +173 -60
- package/dist/heart/providers/azure.js +23 -11
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +34 -38
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +26 -8
- package/dist/heart/providers/openai-codex-token.js +349 -0
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/providers/openai-compatible.js +177 -0
- package/dist/heart/run-ledger.js +247 -0
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +607 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +22 -4
- package/dist/heart/session-activity.js +92 -24
- package/dist/heart/session-events.js +1504 -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-redaction-repair-cli-main.js +31 -0
- package/dist/heart/session-redaction-repair.js +552 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +183 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/start-of-turn-packet.js +372 -0
- package/dist/heart/steward-policy.js +618 -0
- package/dist/heart/streaming.js +604 -207
- package/dist/heart/structured-output.js +196 -0
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +11 -7
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-approval.js +382 -0
- package/dist/heart/tool-description.js +155 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +482 -0
- package/dist/heart/turn-execution-lease.js +30 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +432 -0
- package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
- package/dist/heart/versioning/ouro-version-manager.js +409 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/versioning/update-hooks.js +154 -0
- package/dist/heart/versioning/version-intent.js +114 -0
- package/dist/heart/work-card.js +380 -0
- package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
- package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
- package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
- package/dist/mailbox-ui/index.html +16 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +889 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/cache-sync-cli.js +58 -0
- package/dist/mailroom/core.js +803 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +568 -0
- package/dist/mailroom/hosted-cache-sync.js +384 -0
- package/dist/mailroom/mbox-import.js +393 -0
- package/dist/mailroom/migration.js +164 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +292 -0
- package/dist/mailroom/search-cache.js +513 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +24 -2
- package/dist/mind/context.js +309 -111
- package/dist/mind/desk-section.js +362 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +68 -77
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/{associative-recall.js → note-search.js} +47 -58
- package/dist/mind/obligation-steering.js +199 -3
- package/dist/mind/pending.js +36 -10
- package/dist/mind/prompt-budget.js +479 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1050 -189
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/record-paths.js +312 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/session-transaction.js +564 -0
- package/dist/nerves/cli-logging.js +7 -1
- package/dist/nerves/coverage/audit-rules.js +15 -6
- package/dist/nerves/coverage/audit.js +28 -2
- package/dist/nerves/coverage/cli.js +1 -1
- package/dist/nerves/coverage/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +139 -5
- package/dist/nerves/coverage/run-artifacts.js +55 -35
- package/dist/nerves/coverage/source-scanner.js +4 -4
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +293 -9
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/review/cli-main.js +5 -0
- package/dist/nerves/review/cli.js +156 -0
- package/dist/nerves/review/core.js +159 -0
- package/dist/nerves/runtime.js +17 -1
- package/dist/repertoire/ado-client.js +15 -56
- package/dist/repertoire/ado-semantic.js +16 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +1045 -0
- package/dist/repertoire/bundle-templates.js +71 -0
- package/dist/repertoire/bw-installer.js +180 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +331 -0
- package/dist/repertoire/coding/feedback.js +174 -32
- package/dist/repertoire/coding/index.js +15 -3
- package/dist/repertoire/coding/manager.js +159 -10
- package/dist/repertoire/coding/spawner.js +58 -11
- package/dist/repertoire/coding/tools.js +221 -15
- package/dist/repertoire/coding/workbench-client.js +272 -0
- package/dist/repertoire/coding/workbench-manager.js +346 -0
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +178 -0
- package/dist/repertoire/desk/classifier.js +362 -0
- package/dist/repertoire/duffel-client.js +185 -0
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +811 -18
- package/dist/repertoire/mcp-client.js +44 -3
- package/dist/repertoire/mcp-manager.js +427 -139
- package/dist/repertoire/mcp-tools.js +124 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/relationship-authorization.js +322 -0
- package/dist/repertoire/shell-sessions.js +134 -0
- package/dist/repertoire/skills.js +48 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-arguments.js +170 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +699 -0
- package/dist/repertoire/tools-attachments.js +322 -0
- package/dist/repertoire/tools-awaiting.js +575 -0
- package/dist/repertoire/tools-base.js +77 -1138
- package/dist/repertoire/tools-bluebubbles.js +2 -0
- package/dist/repertoire/tools-bridge.js +144 -0
- package/dist/repertoire/tools-bundle.js +993 -0
- package/dist/repertoire/tools-commerce.js +253 -0
- package/dist/repertoire/tools-config.js +186 -0
- package/dist/repertoire/tools-continuity.js +575 -0
- package/dist/repertoire/tools-credential.js +383 -0
- package/dist/repertoire/tools-evolution.js +527 -0
- package/dist/repertoire/tools-files.js +344 -0
- package/dist/repertoire/tools-flight.js +290 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-habits.js +103 -0
- package/dist/repertoire/tools-mail.js +1828 -0
- package/dist/repertoire/tools-notes.js +485 -0
- package/dist/repertoire/tools-obligations.js +182 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +482 -0
- package/dist/repertoire/tools-rsvp.js +139 -0
- package/dist/repertoire/tools-runtime.js +150 -0
- package/dist/repertoire/tools-sanctuary-host.js +202 -0
- package/dist/repertoire/tools-session.js +1133 -0
- package/dist/repertoire/tools-shell.js +149 -0
- package/dist/repertoire/tools-steward-policy.js +119 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +369 -0
- package/dist/repertoire/tools-teams.js +12 -39
- package/dist/repertoire/tools-telegram-contacts.js +37 -0
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -0
- package/dist/repertoire/tools-unraid.js +531 -0
- package/dist/repertoire/tools-user-profile.js +146 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice.js +145 -0
- package/dist/repertoire/tools.js +494 -148
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/unraid-client.js +155 -0
- package/dist/repertoire/unraid-restart.js +339 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +628 -0
- package/dist/rsvp/aisleplanner-client.js +354 -0
- package/dist/rsvp/cli.js +926 -0
- package/dist/rsvp/config.js +327 -0
- package/dist/rsvp/cutover.js +433 -0
- package/dist/rsvp/diagnostics.js +232 -0
- package/dist/rsvp/diff-renderer.js +176 -0
- package/dist/rsvp/habit-policy.js +110 -0
- package/dist/rsvp/habit-stage.js +123 -0
- package/dist/rsvp/incident-bundle.js +97 -0
- package/dist/rsvp/migration.js +204 -0
- package/dist/rsvp/native-habit-runner.js +630 -0
- package/dist/rsvp/outbound-state.js +628 -0
- package/dist/rsvp/query.js +118 -0
- package/dist/rsvp/replay.js +233 -0
- package/dist/rsvp/snapshot.js +232 -0
- package/dist/rsvp/spend-ledger.js +175 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/a2a-entry.js +115 -0
- package/dist/senses/acp-server.js +386 -0
- package/dist/senses/attention-queue.js +186 -0
- package/dist/senses/await-turn-message.js +58 -0
- package/dist/senses/bluebubbles/active-turns.js +216 -0
- package/dist/senses/bluebubbles/attachment-cache.js +53 -0
- package/dist/senses/bluebubbles/attachment-download.js +137 -0
- package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
- package/dist/senses/bluebubbles/context-packet.js +207 -0
- package/dist/senses/bluebubbles/context-smoke.js +144 -0
- package/dist/senses/bluebubbles/entry.js +90 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
- package/dist/senses/bluebubbles/index.js +3841 -0
- package/dist/senses/bluebubbles/latest-turn.js +311 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
- package/dist/senses/bluebubbles/outbound-state.js +308 -0
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/reaction-policy.js +47 -0
- package/dist/senses/bluebubbles/replay.js +284 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/bluebubbles/webhook-registration.js +228 -0
- package/dist/senses/bluebubbles-meta-guard.js +39 -0
- package/dist/senses/cli/bracketed-paste.js +82 -0
- package/dist/senses/cli/image-paste.js +287 -0
- package/dist/senses/cli/image-ref-navigation.js +75 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/input-keys.js +174 -0
- package/dist/senses/cli/kill-ring.js +86 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +607 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +85 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +241 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli.js +604 -320
- package/dist/senses/commands.js +66 -3
- package/dist/senses/context-packet-ledger.js +371 -0
- package/dist/senses/context-packets.js +154 -0
- package/dist/senses/habit-lifecycle-guard.js +24 -0
- package/dist/senses/habit-turn-message.js +160 -0
- package/dist/senses/ingress-evidence.js +2 -0
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +524 -0
- package/dist/senses/pipeline.js +1115 -204
- package/dist/senses/private-runtime-worker.js +859 -0
- package/dist/senses/private-runtime.js +1517 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/root-host-approval-port.js +345 -0
- package/dist/senses/root-host-approval-runtime.js +393 -0
- package/dist/senses/sanctuary-authority-resident.js +102 -0
- package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
- package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
- package/dist/senses/sanctuary-grounding.js +118 -0
- package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
- package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
- package/dist/senses/sanctuary-health-runner.js +100 -0
- package/dist/senses/sanctuary-health.js +408 -0
- package/dist/senses/sanctuary-install-state-contract.js +126 -0
- package/dist/senses/sanctuary-interactive-control.js +410 -0
- package/dist/senses/sanctuary-media-catalog-contract.js +297 -0
- package/dist/senses/sanctuary-media-optimization.js +514 -0
- package/dist/senses/sanctuary-runtime.js +340 -0
- package/dist/senses/sanctuary-sab.js +85 -0
- package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
- package/dist/senses/shared-turn.js +772 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +519 -218
- package/dist/senses/telegram-admission.js +718 -0
- package/dist/senses/telegram-approval-runtime.js +793 -0
- package/dist/senses/telegram-attachments.js +186 -0
- package/dist/senses/telegram-audit-ledger.js +220 -0
- package/dist/senses/telegram-authority-transport.js +231 -0
- package/dist/senses/telegram-client.js +1749 -0
- package/dist/senses/telegram-effect-adapter.js +896 -0
- package/dist/senses/telegram-entry.js +83 -0
- package/dist/senses/telegram.js +2324 -0
- package/dist/senses/trust-gate.js +104 -9
- package/dist/senses/voice/audio-playback.js +237 -0
- package/dist/senses/voice/audio-routing.js +119 -0
- package/dist/senses/voice/elevenlabs.js +202 -0
- package/dist/senses/voice/floor-control.js +431 -0
- package/dist/senses/voice/floor-controller.js +115 -0
- package/dist/senses/voice/golden-path.js +116 -0
- package/dist/senses/voice/index.js +29 -0
- package/dist/senses/voice/meeting.js +113 -0
- package/dist/senses/voice/outbound.js +190 -0
- package/dist/senses/voice/phone.js +33 -0
- package/dist/senses/voice/playback.js +139 -0
- package/dist/senses/voice/realtime-eval.js +496 -0
- package/dist/senses/voice/realtime-trace.js +531 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +191 -0
- package/dist/senses/voice/twilio-phone-runtime.js +807 -0
- package/dist/senses/voice/twilio-phone.js +5031 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +81 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/dist/util/frontmatter.js +69 -0
- package/npm-shrinkwrap.json +8138 -0
- package/package.json +72 -13
- package/skills/agent-commerce.md +113 -0
- package/skills/browser-navigation.md +117 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +99 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/auth-flow.js +0 -430
- package/dist/heart/daemon/ouro-path-installer.js +0 -260
- package/dist/heart/daemon/ouro-version-manager.js +0 -171
- package/dist/heart/daemon/update-hooks.js +0 -138
- package/dist/heart/obligations.js +0 -191
- package/dist/heart/safe-workspace.js +0 -228
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/friends/channel.js +0 -84
- package/dist/mind/friends/group-context.js +0 -144
- package/dist/mind/friends/resolver.js +0 -84
- package/dist/mind/friends/store-file.js +0 -190
- package/dist/mind/friends/store.js +0 -4
- package/dist/mind/friends/tokens.js +0 -26
- package/dist/mind/friends/trust-explanation.js +0 -74
- package/dist/mind/friends/types.js +0 -29
- package/dist/repertoire/tasks/board.js +0 -134
- package/dist/repertoire/tasks/index.js +0 -224
- package/dist/repertoire/tasks/lifecycle.js +0 -80
- package/dist/repertoire/tasks/middleware.js +0 -65
- package/dist/repertoire/tasks/parser.js +0 -173
- package/dist/repertoire/tasks/scanner.js +0 -132
- package/dist/repertoire/tasks/transitions.js +0 -144
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1181
- package/dist/senses/debug-activity.js +0 -154
- package/dist/senses/inner-dialog-worker.js +0 -90
- package/dist/senses/inner-dialog.js +0 -525
- package/subagents/README.md +0 -7
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reserveObservation = reserveObservation;
|
|
4
|
+
exports.beginObservationBatch = beginObservationBatch;
|
|
5
|
+
exports.reserveObservationFromBatch = reserveObservationFromBatch;
|
|
6
|
+
exports.clearPending = clearPending;
|
|
7
|
+
exports.reactivateObservation = reactivateObservation;
|
|
8
|
+
exports.mergeObservationReservations = mergeObservationReservations;
|
|
9
|
+
exports.promote = promote;
|
|
10
|
+
exports.isCurrent = isCurrent;
|
|
11
|
+
exports.observationSchedulingKeys = observationSchedulingKeys;
|
|
12
|
+
exports.awaitDeliveryAdmission = awaitDeliveryAdmission;
|
|
13
|
+
exports.isDeliveryAdmittedNow = isDeliveryAdmittedNow;
|
|
14
|
+
exports.cancel = cancel;
|
|
15
|
+
exports.finish = finish;
|
|
16
|
+
exports.__resetBlueBubblesLatestTurnsForTests = __resetBlueBubblesLatestTurnsForTests;
|
|
17
|
+
const node_crypto_1 = require("node:crypto");
|
|
18
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
19
|
+
const AMBIGUOUS_IDENTIFIER = Symbol("ambiguous-bluebubbles-identifier");
|
|
20
|
+
const UNRESOLVED_SCHEDULING_KEY = "unresolved:*";
|
|
21
|
+
const pending = new Map();
|
|
22
|
+
const lanes = new Map();
|
|
23
|
+
const identifierBindings = new Map();
|
|
24
|
+
const reservationHints = new WeakMap();
|
|
25
|
+
const batchReservations = new WeakMap();
|
|
26
|
+
const observationEpoch = `${new Date().toISOString()}/${(0, node_crypto_1.randomUUID)()}`;
|
|
27
|
+
let nextOrdinal = 0;
|
|
28
|
+
function clean(value) {
|
|
29
|
+
const trimmed = value?.trim();
|
|
30
|
+
return trimmed && trimmed.toLowerCase() !== "unknown" ? trimmed : null;
|
|
31
|
+
}
|
|
32
|
+
function canonicalIdentifier(value) {
|
|
33
|
+
const trimmed = clean(value);
|
|
34
|
+
if (!trimmed)
|
|
35
|
+
return null;
|
|
36
|
+
if (trimmed.includes("@"))
|
|
37
|
+
return trimmed.toLowerCase();
|
|
38
|
+
if (/^[+\d\s().-]+$/.test(trimmed)) {
|
|
39
|
+
const compact = trimmed.replace(/[^\d+]/g, "");
|
|
40
|
+
if (compact)
|
|
41
|
+
return compact;
|
|
42
|
+
}
|
|
43
|
+
return trimmed;
|
|
44
|
+
}
|
|
45
|
+
function guidAlias(guid) {
|
|
46
|
+
return `guid:${guid}`;
|
|
47
|
+
}
|
|
48
|
+
function identifierAlias(identifier) {
|
|
49
|
+
return `identifier:${identifier}`;
|
|
50
|
+
}
|
|
51
|
+
function observationHints(input) {
|
|
52
|
+
const guid = clean(input.chatGuid);
|
|
53
|
+
const identifier = canonicalIdentifier(input.chatIdentifier);
|
|
54
|
+
return [
|
|
55
|
+
...(guid ? [guidAlias(guid)] : []),
|
|
56
|
+
...(identifier ? [identifierAlias(identifier)] : []),
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
function settlePending(ordinal) {
|
|
60
|
+
const entry = pending.get(ordinal);
|
|
61
|
+
if (!entry)
|
|
62
|
+
return;
|
|
63
|
+
pending.delete(ordinal);
|
|
64
|
+
entry.settle();
|
|
65
|
+
}
|
|
66
|
+
function createReservation(ordinal, input) {
|
|
67
|
+
const knownHints = new Set(observationHints(input));
|
|
68
|
+
const reservation = Object.freeze({
|
|
69
|
+
observationEpoch,
|
|
70
|
+
ordinal,
|
|
71
|
+
get hints() {
|
|
72
|
+
return Object.freeze([...knownHints]);
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
reservationHints.set(reservation, knownHints);
|
|
76
|
+
let settle;
|
|
77
|
+
const settled = new Promise((resolve) => {
|
|
78
|
+
settle = resolve;
|
|
79
|
+
});
|
|
80
|
+
pending.set(ordinal, {
|
|
81
|
+
reservation,
|
|
82
|
+
hints: new Set(knownHints),
|
|
83
|
+
settled,
|
|
84
|
+
settle,
|
|
85
|
+
});
|
|
86
|
+
return reservation;
|
|
87
|
+
}
|
|
88
|
+
function reserveObservation(input) {
|
|
89
|
+
return createReservation(++nextOrdinal, input);
|
|
90
|
+
}
|
|
91
|
+
function beginObservationBatch(size) {
|
|
92
|
+
if (!Number.isSafeInteger(size) || size <= 0)
|
|
93
|
+
throw new Error("bluebubbles_observation_batch_size_invalid");
|
|
94
|
+
// BlueBubbles' `before` filter is inclusive. Subtract one millisecond so a
|
|
95
|
+
// row created in the same clock tick after this reservation cannot be
|
|
96
|
+
// backdated into the already-reserved ordinal range.
|
|
97
|
+
const batch = Object.freeze({
|
|
98
|
+
highOrdinal: nextOrdinal + size,
|
|
99
|
+
size,
|
|
100
|
+
beforeTimestamp: Date.now() - 1,
|
|
101
|
+
});
|
|
102
|
+
nextOrdinal = batch.highOrdinal;
|
|
103
|
+
batchReservations.set(batch, new Set());
|
|
104
|
+
return batch;
|
|
105
|
+
}
|
|
106
|
+
function reserveObservationFromBatch(batch, newestOffset, input) {
|
|
107
|
+
const used = batchReservations.get(batch);
|
|
108
|
+
if (!used || !Number.isSafeInteger(newestOffset) || newestOffset < 0 || newestOffset >= batch.size) {
|
|
109
|
+
throw new Error("bluebubbles_observation_batch_offset_invalid");
|
|
110
|
+
}
|
|
111
|
+
const ordinal = batch.highOrdinal - newestOffset;
|
|
112
|
+
if (used.has(ordinal))
|
|
113
|
+
throw new Error("bluebubbles_observation_batch_offset_reused");
|
|
114
|
+
used.add(ordinal);
|
|
115
|
+
return createReservation(ordinal, input);
|
|
116
|
+
}
|
|
117
|
+
function clearPending(reservation) {
|
|
118
|
+
settlePending(reservation.ordinal);
|
|
119
|
+
}
|
|
120
|
+
function reactivateObservation(reservation) {
|
|
121
|
+
if (pending.has(reservation.ordinal))
|
|
122
|
+
return;
|
|
123
|
+
const knownHints = reservationHints.get(reservation);
|
|
124
|
+
if (!knownHints)
|
|
125
|
+
throw new Error("bluebubbles_observation_reservation_unknown");
|
|
126
|
+
let settle;
|
|
127
|
+
const settled = new Promise((resolve) => {
|
|
128
|
+
settle = resolve;
|
|
129
|
+
});
|
|
130
|
+
pending.set(reservation.ordinal, {
|
|
131
|
+
reservation,
|
|
132
|
+
hints: new Set(knownHints),
|
|
133
|
+
settled,
|
|
134
|
+
settle,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
function mergeObservationReservations(primary, duplicate) {
|
|
138
|
+
if (primary === duplicate)
|
|
139
|
+
return primary;
|
|
140
|
+
const primaryHints = reservationHints.get(primary);
|
|
141
|
+
const duplicateHints = reservationHints.get(duplicate);
|
|
142
|
+
if (!primaryHints || !duplicateHints)
|
|
143
|
+
throw new Error("bluebubbles_observation_reservation_unknown");
|
|
144
|
+
for (const hint of duplicateHints)
|
|
145
|
+
primaryHints.add(hint);
|
|
146
|
+
const primaryPending = pending.get(primary.ordinal);
|
|
147
|
+
if (primaryPending) {
|
|
148
|
+
for (const hint of duplicateHints)
|
|
149
|
+
primaryPending.hints.add(hint);
|
|
150
|
+
}
|
|
151
|
+
settlePending(duplicate.ordinal);
|
|
152
|
+
return primary;
|
|
153
|
+
}
|
|
154
|
+
function bindIdentifier(identifier, guid) {
|
|
155
|
+
const existing = identifierBindings.get(identifier);
|
|
156
|
+
if (existing === undefined) {
|
|
157
|
+
identifierBindings.set(identifier, guid);
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
if (existing === guid)
|
|
161
|
+
return true;
|
|
162
|
+
identifierBindings.set(identifier, AMBIGUOUS_IDENTIFIER);
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
function resolveCanonicalChat(input) {
|
|
166
|
+
const inputGuid = clean(input.chatGuid);
|
|
167
|
+
const observedIdentifier = clean(input.chatIdentifier);
|
|
168
|
+
const identifier = canonicalIdentifier(input.chatIdentifier);
|
|
169
|
+
let guid = inputGuid;
|
|
170
|
+
if (guid && identifier)
|
|
171
|
+
bindIdentifier(identifier, guid);
|
|
172
|
+
if (!guid && identifier) {
|
|
173
|
+
const binding = identifierBindings.get(identifier);
|
|
174
|
+
if (typeof binding === "string")
|
|
175
|
+
guid = binding;
|
|
176
|
+
}
|
|
177
|
+
if (!guid)
|
|
178
|
+
return null;
|
|
179
|
+
return {
|
|
180
|
+
chatGuid: guid,
|
|
181
|
+
...(observedIdentifier && identifier && identifierBindings.get(identifier) === guid
|
|
182
|
+
? { chatIdentifier: observedIdentifier }
|
|
183
|
+
: {}),
|
|
184
|
+
sessionKey: `chat:${guid}`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function promote(reservation, input, options = {}) {
|
|
188
|
+
const canonicalChat = resolveCanonicalChat(input);
|
|
189
|
+
settlePending(reservation.ordinal);
|
|
190
|
+
if (!canonicalChat)
|
|
191
|
+
return { status: "unresolved" };
|
|
192
|
+
const chatKey = guidAlias(canonicalChat.chatGuid);
|
|
193
|
+
const lane = lanes.get(chatKey) ?? { highWater: 0, current: null };
|
|
194
|
+
const sameGenerationRetry = reservation.ordinal === lane.highWater
|
|
195
|
+
&& options.allowSameGenerationRetry === true
|
|
196
|
+
&& lane.current === null;
|
|
197
|
+
if (reservation.ordinal < lane.highWater || (reservation.ordinal === lane.highWater && !sameGenerationRetry)) {
|
|
198
|
+
return { status: "stale" };
|
|
199
|
+
}
|
|
200
|
+
lane.current?.controller.abort(new Error("superseded"));
|
|
201
|
+
const controller = new AbortController();
|
|
202
|
+
const capability = Object.freeze({
|
|
203
|
+
ordinal: reservation.ordinal,
|
|
204
|
+
chatKey,
|
|
205
|
+
canonicalChat: Object.freeze(canonicalChat),
|
|
206
|
+
signal: controller.signal,
|
|
207
|
+
controller,
|
|
208
|
+
});
|
|
209
|
+
lane.highWater = reservation.ordinal;
|
|
210
|
+
lane.current = capability;
|
|
211
|
+
lanes.set(chatKey, lane);
|
|
212
|
+
(0, runtime_1.emitNervesEvent)({
|
|
213
|
+
component: "senses",
|
|
214
|
+
event: "senses.bluebubbles_latest_turn_promoted",
|
|
215
|
+
message: "promoted the latest process-local bluebubbles turn",
|
|
216
|
+
meta: {
|
|
217
|
+
chatKey,
|
|
218
|
+
ordinal: reservation.ordinal,
|
|
219
|
+
aliasCount: 1 + [...identifierBindings.values()].filter((binding) => binding === canonicalChat.chatGuid).length,
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
return { status: "promoted", capability };
|
|
223
|
+
}
|
|
224
|
+
function internal(capability) {
|
|
225
|
+
return capability;
|
|
226
|
+
}
|
|
227
|
+
function isCurrent(capability) {
|
|
228
|
+
const lane = lanes.get(capability.chatKey);
|
|
229
|
+
return lane?.current === capability && !capability.signal.aborted;
|
|
230
|
+
}
|
|
231
|
+
function pendingIntersects(capability, entry) {
|
|
232
|
+
if (entry.reservation.ordinal <= capability.ordinal)
|
|
233
|
+
return false;
|
|
234
|
+
const hasGuidHint = [...entry.hints].some((hint) => hint.startsWith("guid:"));
|
|
235
|
+
if (entry.hints.size === 0)
|
|
236
|
+
return true;
|
|
237
|
+
for (const hint of entry.hints) {
|
|
238
|
+
if (hint === capability.chatKey)
|
|
239
|
+
return true;
|
|
240
|
+
if (hint.startsWith("identifier:")) {
|
|
241
|
+
const identifier = hint.slice("identifier:".length);
|
|
242
|
+
const binding = identifierBindings.get(identifier);
|
|
243
|
+
if (binding === capability.canonicalChat.chatGuid)
|
|
244
|
+
return true;
|
|
245
|
+
// An identifier-only observation can repair into any GUID lane. Until
|
|
246
|
+
// that relation is proved, it is a temporary global delivery fence—not
|
|
247
|
+
// an active shared chat lane. A direct GUID hint keeps paired events
|
|
248
|
+
// independently schedulable through that exact coordinate.
|
|
249
|
+
if (!hasGuidHint && typeof binding !== "string")
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
function observationSchedulingKeys(reservation) {
|
|
256
|
+
const hints = reservationHints.get(reservation);
|
|
257
|
+
if (!hints)
|
|
258
|
+
throw new Error("bluebubbles_observation_reservation_unknown");
|
|
259
|
+
const keys = new Set();
|
|
260
|
+
const hasGuidHint = [...hints].some((hint) => hint.startsWith("guid:"));
|
|
261
|
+
if (hints.size === 0)
|
|
262
|
+
keys.add(UNRESOLVED_SCHEDULING_KEY);
|
|
263
|
+
for (const hint of hints) {
|
|
264
|
+
if (hint.startsWith("identifier:")) {
|
|
265
|
+
const identifier = hint.slice("identifier:".length);
|
|
266
|
+
const binding = identifierBindings.get(identifier);
|
|
267
|
+
keys.add(typeof binding === "string"
|
|
268
|
+
? guidAlias(binding)
|
|
269
|
+
: hasGuidHint ? hint : UNRESOLVED_SCHEDULING_KEY);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
keys.add(hint);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return Object.freeze([...keys]);
|
|
276
|
+
}
|
|
277
|
+
async function awaitDeliveryAdmission(capability) {
|
|
278
|
+
const value = internal(capability);
|
|
279
|
+
while (isCurrent(value)) {
|
|
280
|
+
const blockers = [...pending.values()].filter((entry) => pendingIntersects(value, entry));
|
|
281
|
+
if (blockers.length === 0)
|
|
282
|
+
return true;
|
|
283
|
+
await Promise.all(blockers.map((entry) => entry.settled));
|
|
284
|
+
}
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
function isDeliveryAdmittedNow(capability) {
|
|
288
|
+
const value = internal(capability);
|
|
289
|
+
return isCurrent(value)
|
|
290
|
+
&& ![...pending.values()].some((entry) => pendingIntersects(value, entry));
|
|
291
|
+
}
|
|
292
|
+
function cancel(capability, reason = "cancelled") {
|
|
293
|
+
const lane = lanes.get(capability.chatKey);
|
|
294
|
+
if (lane?.current !== capability)
|
|
295
|
+
return;
|
|
296
|
+
internal(capability).controller.abort(new Error(reason));
|
|
297
|
+
lane.current = null;
|
|
298
|
+
}
|
|
299
|
+
function finish(capability) {
|
|
300
|
+
const lane = lanes.get(capability.chatKey);
|
|
301
|
+
if (lane?.current === capability)
|
|
302
|
+
lane.current = null;
|
|
303
|
+
}
|
|
304
|
+
function __resetBlueBubblesLatestTurnsForTests() {
|
|
305
|
+
for (const entry of pending.values())
|
|
306
|
+
entry.settle();
|
|
307
|
+
pending.clear();
|
|
308
|
+
lanes.clear();
|
|
309
|
+
identifierBindings.clear();
|
|
310
|
+
nextOrdinal = 0;
|
|
311
|
+
}
|
|
@@ -33,16 +33,31 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.downloadBlueBubblesAttachment = exports.VLM_TEXT_WRAPPERS = void 0;
|
|
36
37
|
exports.hydrateBlueBubblesAttachments = hydrateBlueBubblesAttachments;
|
|
37
38
|
const node_child_process_1 = require("node:child_process");
|
|
38
39
|
const fs = __importStar(require("node:fs/promises"));
|
|
39
40
|
const os = __importStar(require("node:os"));
|
|
40
41
|
const path = __importStar(require("node:path"));
|
|
41
|
-
const runtime_1 = require("
|
|
42
|
-
const identity_1 = require("
|
|
43
|
-
const
|
|
42
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
43
|
+
const identity_1 = require("../../heart/identity");
|
|
44
|
+
const model_capabilities_1 = require("../../heart/model-capabilities");
|
|
45
|
+
const image_normalize_1 = require("../../heart/attachments/image-normalize");
|
|
46
|
+
const store_1 = require("../../heart/attachments/store");
|
|
47
|
+
const bluebubbles_1 = require("../../heart/attachments/sources/bluebubbles");
|
|
48
|
+
const attachment_download_1 = require("./attachment-download");
|
|
49
|
+
// Pin the exact wrapper strings so tests and code read from one source.
|
|
50
|
+
exports.VLM_TEXT_WRAPPERS = {
|
|
51
|
+
description: (desc) => `[image description: ${desc}]`,
|
|
52
|
+
failure: (reason) => `[image description failed: ${reason}]`,
|
|
53
|
+
};
|
|
54
|
+
// D3 prompt template. Included here (not templated out) because the contract
|
|
55
|
+
// is load-bearing — see planning doc section D3 and AX-4.
|
|
56
|
+
function buildVlmPrompt(userText) {
|
|
57
|
+
const body = userText ?? "";
|
|
58
|
+
return `User message: "${body}"\n\nDescribe this image in detail, focusing on anything relevant to what the user said above.\nInclude any text visible in the image verbatim.`;
|
|
59
|
+
}
|
|
44
60
|
const AUDIO_EXTENSIONS = new Set([".mp3", ".wav", ".m4a", ".caf", ".ogg"]);
|
|
45
|
-
const IMAGE_EXTENSIONS = new Set([".jpg", ".jpeg", ".png", ".gif", ".webp", ".heic", ".heif"]);
|
|
46
61
|
const AUDIO_EXTENSION_BY_CONTENT_TYPE = {
|
|
47
62
|
"audio/wav": ".wav",
|
|
48
63
|
"audio/x-wav": ".wav",
|
|
@@ -66,31 +81,19 @@ const AUDIO_INPUT_FORMAT_BY_EXTENSION = {
|
|
|
66
81
|
const WHISPER_CPP_FORMULA = "whisper-cpp";
|
|
67
82
|
const WHISPER_CPP_MODEL_NAME = "ggml-base.en.bin";
|
|
68
83
|
const WHISPER_CPP_MODEL_URL = `https://huggingface.co/ggerganov/whisper.cpp/resolve/main/${WHISPER_CPP_MODEL_NAME}`;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
84
|
+
// Lazy — getAgentToolsRoot() requires identity to be resolved, which isn't
|
|
85
|
+
// true at module-load time in most unit test contexts. Tests that only touch
|
|
86
|
+
// the image/VLM path shouldn't break because the audio path asked for a
|
|
87
|
+
// tools root they don't need.
|
|
88
|
+
function whisperCppPaths() {
|
|
89
|
+
const toolsDir = path.join((0, identity_1.getAgentToolsRoot)(), "whisper-cpp");
|
|
90
|
+
const modelsDir = path.join(toolsDir, "models");
|
|
91
|
+
const modelPath = path.join(modelsDir, WHISPER_CPP_MODEL_NAME);
|
|
92
|
+
return { toolsDir, modelsDir, modelPath };
|
|
77
93
|
}
|
|
78
94
|
function describeAttachment(attachment) {
|
|
79
95
|
return attachment.transferName?.trim() || attachment.guid?.trim() || "attachment";
|
|
80
96
|
}
|
|
81
|
-
function inferContentType(attachment, responseType) {
|
|
82
|
-
const normalizedResponseType = responseType?.split(";")[0]?.trim().toLowerCase();
|
|
83
|
-
if (normalizedResponseType) {
|
|
84
|
-
return normalizedResponseType;
|
|
85
|
-
}
|
|
86
|
-
return attachment.mimeType?.trim().toLowerCase() || undefined;
|
|
87
|
-
}
|
|
88
|
-
function isImageAttachment(attachment, contentType) {
|
|
89
|
-
if (contentType?.startsWith("image/"))
|
|
90
|
-
return true;
|
|
91
|
-
const extension = path.extname(attachment.transferName ?? "").toLowerCase();
|
|
92
|
-
return IMAGE_EXTENSIONS.has(extension);
|
|
93
|
-
}
|
|
94
97
|
function isAudioAttachment(attachment, contentType) {
|
|
95
98
|
if (contentType?.startsWith("audio/"))
|
|
96
99
|
return true;
|
|
@@ -170,12 +173,13 @@ async function resolveWhisperCppBinary(timeoutMs) {
|
|
|
170
173
|
return candidate;
|
|
171
174
|
}
|
|
172
175
|
async function ensureWhisperCppModel(timeoutMs, fetchImpl) {
|
|
176
|
+
const { modelsDir, modelPath } = whisperCppPaths();
|
|
173
177
|
try {
|
|
174
|
-
await fs.access(
|
|
175
|
-
return
|
|
178
|
+
await fs.access(modelPath);
|
|
179
|
+
return modelPath;
|
|
176
180
|
}
|
|
177
181
|
catch {
|
|
178
|
-
await fs.mkdir(
|
|
182
|
+
await fs.mkdir(modelsDir, { recursive: true });
|
|
179
183
|
const response = await fetchImpl(WHISPER_CPP_MODEL_URL, {
|
|
180
184
|
method: "GET",
|
|
181
185
|
signal: AbortSignal.timeout(Math.max(timeoutMs, 300_000)),
|
|
@@ -183,8 +187,8 @@ async function ensureWhisperCppModel(timeoutMs, fetchImpl) {
|
|
|
183
187
|
if (!response.ok) {
|
|
184
188
|
throw new Error(`failed to download whisper.cpp model: HTTP ${response.status}`);
|
|
185
189
|
}
|
|
186
|
-
await fs.writeFile(
|
|
187
|
-
return
|
|
190
|
+
await fs.writeFile(modelPath, Buffer.from(await response.arrayBuffer()));
|
|
191
|
+
return modelPath;
|
|
188
192
|
}
|
|
189
193
|
}
|
|
190
194
|
async function convertAudioForWhisperCpp(sourcePath, outputPath, timeoutMs) {
|
|
@@ -236,59 +240,105 @@ async function transcribeAudioWithWhisperCpp(params, modelFetchImpl = fetch) {
|
|
|
236
240
|
await fs.rm(workDir, { recursive: true, force: true }).catch(() => undefined);
|
|
237
241
|
}
|
|
238
242
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
if (!guid) {
|
|
242
|
-
throw new Error("attachment guid missing");
|
|
243
|
-
}
|
|
244
|
-
if (typeof attachment.totalBytes === "number" && attachment.totalBytes > MAX_ATTACHMENT_BYTES) {
|
|
245
|
-
throw new Error(`attachment exceeds ${MAX_ATTACHMENT_BYTES} byte limit`);
|
|
246
|
-
}
|
|
247
|
-
const url = buildBlueBubblesApiUrl(config.serverUrl, `/api/v1/attachment/${encodeURIComponent(guid)}/download`, config.password);
|
|
248
|
-
const response = await fetchImpl(url, {
|
|
249
|
-
method: "GET",
|
|
250
|
-
signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
|
|
251
|
-
});
|
|
252
|
-
if (!response.ok) {
|
|
253
|
-
throw new Error(`HTTP ${response.status}`);
|
|
254
|
-
}
|
|
255
|
-
const buffer = Buffer.from(await response.arrayBuffer());
|
|
256
|
-
if (buffer.length > MAX_ATTACHMENT_BYTES) {
|
|
257
|
-
throw new Error(`attachment exceeds ${MAX_ATTACHMENT_BYTES} byte limit`);
|
|
258
|
-
}
|
|
259
|
-
return {
|
|
260
|
-
buffer,
|
|
261
|
-
contentType: inferContentType(attachment, response.headers.get("content-type")),
|
|
262
|
-
};
|
|
263
|
-
}
|
|
243
|
+
var attachment_download_2 = require("./attachment-download");
|
|
244
|
+
Object.defineProperty(exports, "downloadBlueBubblesAttachment", { enumerable: true, get: function () { return attachment_download_2.downloadBlueBubblesAttachment; } });
|
|
264
245
|
async function hydrateBlueBubblesAttachments(attachments, config, channelConfig, deps = {}) {
|
|
265
|
-
(0, runtime_1.emitNervesEvent)({
|
|
266
|
-
component: "senses",
|
|
267
|
-
event: "senses.bluebubbles_media_hydrate",
|
|
268
|
-
message: "hydrating bluebubbles attachments",
|
|
269
|
-
meta: {
|
|
270
|
-
attachmentCount: attachments.length,
|
|
271
|
-
preferAudioInput: deps.preferAudioInput ?? false,
|
|
272
|
-
},
|
|
273
|
-
});
|
|
274
246
|
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
275
247
|
const modelFetchImpl = deps.modelFetchImpl ?? fetch;
|
|
276
248
|
const transcribeAudio = deps.transcribeAudio ?? ((params) => transcribeAudioWithWhisperCpp(params, modelFetchImpl));
|
|
277
249
|
const preferAudioInput = deps.preferAudioInput ?? false;
|
|
250
|
+
const chatModel = deps.chatModel;
|
|
251
|
+
const visionCapable = chatModel ? (0, model_capabilities_1.getModelCapabilities)(chatModel).vision === true : true;
|
|
252
|
+
const agentName = (0, identity_1.getAgentName)();
|
|
253
|
+
const agentRoot = (0, identity_1.getAgentRoot)(agentName);
|
|
278
254
|
const inputParts = [];
|
|
279
255
|
const transcriptAdditions = [];
|
|
280
256
|
const notices = [];
|
|
281
257
|
for (const attachment of attachments) {
|
|
282
258
|
const name = describeAttachment(attachment);
|
|
259
|
+
const initialRecord = attachment.guid?.trim()
|
|
260
|
+
? (0, store_1.cacheRecentAttachment)(agentName, (0, bluebubbles_1.buildBlueBubblesAttachmentRecord)(attachment), agentRoot)
|
|
261
|
+
: null;
|
|
283
262
|
try {
|
|
284
|
-
const downloaded = await
|
|
263
|
+
const downloaded = await (0, attachment_download_1.downloadBlueBubblesAttachment)(attachment, config, channelConfig, fetchImpl);
|
|
285
264
|
const base64 = downloaded.buffer.toString("base64");
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
265
|
+
const byteCount = downloaded.buffer.length;
|
|
266
|
+
const persistedRecord = initialRecord && initialRecord.source === "bluebubbles"
|
|
267
|
+
? await (0, bluebubbles_1.persistBlueBubblesAttachmentSource)(agentName, initialRecord, {
|
|
268
|
+
buffer: downloaded.buffer,
|
|
269
|
+
mimeType: downloaded.contentType,
|
|
270
|
+
byteCount,
|
|
271
|
+
}, agentRoot)
|
|
272
|
+
: null;
|
|
273
|
+
if ((0, attachment_download_1.isBlueBubblesImageAttachment)(attachment, downloaded.contentType)) {
|
|
274
|
+
const mimeType = downloaded.contentType ?? "application/octet-stream";
|
|
275
|
+
if (visionCapable) {
|
|
276
|
+
inputParts.push({
|
|
277
|
+
type: "image_url",
|
|
278
|
+
image_url: {
|
|
279
|
+
url: `data:${mimeType};base64,${base64}`,
|
|
280
|
+
detail: "auto",
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
(0, runtime_1.emitNervesEvent)({
|
|
284
|
+
level: "warn",
|
|
285
|
+
component: "senses",
|
|
286
|
+
event: "senses.bluebubbles_media_hydrate",
|
|
287
|
+
message: "bluebubbles media hydrate",
|
|
288
|
+
meta: {
|
|
289
|
+
attachmentGuid: attachment.guid,
|
|
290
|
+
mimeType,
|
|
291
|
+
byteCount,
|
|
292
|
+
hydrationPath: "native-passthrough",
|
|
293
|
+
},
|
|
294
|
+
});
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
try {
|
|
298
|
+
if (!deps.vlmDescribe) {
|
|
299
|
+
throw new Error("no VLM describer configured — wire a vlmDescribe dep or configure a vision-capable chat model");
|
|
300
|
+
}
|
|
301
|
+
if (!persistedRecord?.sourceData.localPath) {
|
|
302
|
+
throw new Error("image attachment could not be persisted for normalization");
|
|
303
|
+
}
|
|
304
|
+
const normalized = await (0, image_normalize_1.normalizeImageForVision)({
|
|
305
|
+
attachment: persistedRecord,
|
|
306
|
+
sourcePath: persistedRecord.sourceData.localPath,
|
|
307
|
+
agentName,
|
|
308
|
+
agentRoot,
|
|
309
|
+
});
|
|
310
|
+
const normalizedBuffer = await fs.readFile(normalized.path);
|
|
311
|
+
const normalizedMime = normalized.mimeType ?? persistedRecord.mimeType ?? "image/jpeg";
|
|
312
|
+
const dataUrl = `data:${normalizedMime};base64,${normalizedBuffer.toString("base64")}`;
|
|
313
|
+
const description = await deps.vlmDescribe({
|
|
314
|
+
prompt: buildVlmPrompt(deps.userText),
|
|
315
|
+
imageDataUrl: dataUrl,
|
|
316
|
+
attachmentGuid: attachment.guid,
|
|
317
|
+
mimeType: normalizedMime,
|
|
318
|
+
chatModel,
|
|
319
|
+
});
|
|
320
|
+
inputParts.push({
|
|
321
|
+
type: "text",
|
|
322
|
+
text: exports.VLM_TEXT_WRAPPERS.description(description),
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
catch (vlmError) {
|
|
326
|
+
const reason = vlmError instanceof Error ? vlmError.message : String(vlmError);
|
|
327
|
+
inputParts.push({
|
|
328
|
+
type: "text",
|
|
329
|
+
text: exports.VLM_TEXT_WRAPPERS.failure(reason),
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
(0, runtime_1.emitNervesEvent)({
|
|
333
|
+
level: "warn",
|
|
334
|
+
component: "senses",
|
|
335
|
+
event: "senses.bluebubbles_media_hydrate",
|
|
336
|
+
message: "bluebubbles media hydrate",
|
|
337
|
+
meta: {
|
|
338
|
+
attachmentGuid: attachment.guid,
|
|
339
|
+
mimeType: persistedRecord?.mimeType ?? mimeType,
|
|
340
|
+
byteCount,
|
|
341
|
+
hydrationPath: "vlm-describe",
|
|
292
342
|
},
|
|
293
343
|
});
|
|
294
344
|
continue;
|