@ouro.bot/cli 0.1.0-alpha.92 → 0.1.0-alpha.921
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 +5826 -16
- package/deploy/unraid/Dockerfile +58 -0
- package/deploy/unraid/README.txt +2997 -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-butler-upgrade.mjs +1254 -0
- package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
- package/deploy/unraid/sanctuary-replay-gate.mjs +1564 -0
- package/deploy/unraid/sanctuary-safe-rename.py +24 -0
- package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2086 -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/awaiting/house-care-sweep.md +17 -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 +2231 -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 +33 -0
- package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +27 -0
- package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +22 -0
- package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
- package/deploy/unraid/sanctuary.ouro/tool-profiles.json +232 -0
- package/deploy/unraid/sanctuary.xml +30 -0
- package/dist/a2a/card.js +57 -0
- package/dist/a2a/client.js +250 -0
- package/dist/a2a/config.js +50 -0
- package/dist/a2a/delegated-command-grants.js +93 -0
- package/dist/a2a/delegated-command.js +197 -0
- package/dist/a2a/delegation-stores.js +56 -0
- package/dist/a2a/did-resolution.js +93 -0
- package/dist/a2a/escalation-grants.js +84 -0
- package/dist/a2a/escalation-wiring.js +60 -0
- package/dist/a2a/identity.js +258 -0
- package/dist/a2a/inbound-share.js +110 -0
- package/dist/a2a/mission-result-wire.js +196 -0
- package/dist/a2a/onboarding.js +133 -0
- package/dist/a2a/operator-trust.js +382 -0
- package/dist/a2a/outbox-client.js +57 -0
- package/dist/a2a/outbox-store.js +188 -0
- package/dist/a2a/outbox-wire.js +95 -0
- package/dist/a2a/pin-store.js +132 -0
- package/dist/a2a/replay-grant-holders.js +33 -0
- package/dist/a2a/replay-harness.js +188 -0
- package/dist/a2a/resolution-proof.js +53 -0
- package/dist/a2a/sealed-chat.js +113 -0
- package/dist/a2a/seen-ledger.js +120 -0
- package/dist/a2a/server.js +771 -0
- package/dist/a2a/task-store.js +69 -0
- package/dist/a2a/transport.js +45 -0
- package/dist/a2a/trust-commands.js +203 -0
- package/dist/a2a/trusted-files.js +185 -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/a2a-await-delivery.js +109 -0
- package/dist/heart/awaiting/await-alert.js +152 -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 +152 -0
- package/dist/heart/awaiting/await-runtime-state.js +111 -0
- package/dist/heart/awaiting/await-scheduler.js +391 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bluebubbles-host-account.js +78 -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 +1159 -0
- package/dist/heart/core.js +2364 -578
- 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 +283 -3
- package/dist/heart/daemon/agent-home.js +319 -0
- 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-arg-redaction.js +26 -0
- package/dist/heart/daemon/cli-defaults.js +876 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +9199 -0
- package/dist/heart/daemon/cli-help.js +735 -0
- package/dist/heart/daemon/cli-parse.js +3211 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +819 -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 +235 -0
- package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
- package/dist/heart/daemon/daemon-cli.js +29 -2350
- package/dist/heart/daemon/daemon-entry.js +953 -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 +1766 -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 +154 -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 +6 -3
- package/dist/heart/daemon/ouro-entry.js +5 -2
- package/dist/heart/daemon/plugin-cli.js +432 -0
- package/dist/heart/daemon/process-manager.js +760 -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 +281 -0
- package/dist/heart/daemon/sanctuary-authority-installation.js +161 -0
- package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
- package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +1267 -0
- package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
- package/dist/heart/daemon/sanctuary-bundle-migration.js +730 -0
- package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
- package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +493 -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 +475 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-service.js +676 -0
- package/dist/heart/daemon/sense-manager.js +733 -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 +503 -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 +1516 -0
- package/dist/heart/failure-reports.js +336 -0
- package/dist/heart/file-lock.js +109 -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 +230 -59
- package/dist/heart/kept-notes.js +289 -0
- package/dist/heart/kicks.js +1 -1
- package/dist/heart/machine-identity.js +175 -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 +272 -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 +83 -16
- 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 +260 -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 +38 -39
- 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/reply-style.js +52 -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 +24 -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/shelf-claims.js +78 -0
- package/dist/heart/shepherd-config.js +113 -0
- package/dist/heart/source-grounding.js +297 -0
- package/dist/heart/start-of-turn-packet.js +372 -0
- package/dist/heart/steward-policy.js +656 -0
- package/dist/heart/streaming.js +609 -207
- package/dist/heart/structured-output.js +196 -0
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync-health.js +152 -0
- package/dist/heart/sync.js +726 -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 +206 -0
- package/dist/heart/turn-context.js +496 -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 +3 -2
- 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 +432 -0
- package/dist/heart/versioning/release-sources.js +173 -0
- package/dist/heart/versioning/self-update-defaults.js +294 -0
- package/dist/heart/versioning/self-update.js +196 -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/update-state.js +126 -0
- package/dist/heart/versioning/updater-launchd.js +150 -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 +307 -139
- 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/friend-link-codes.js +209 -0
- package/dist/mind/friend-merge.js +330 -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 +1085 -198
- 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 +1201 -0
- package/dist/repertoire/bundle-templates.js +71 -0
- package/dist/repertoire/bw-installer.js +231 -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 +40 -11
- package/dist/repertoire/coding/tools.js +182 -18
- 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 +183 -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 +968 -20
- package/dist/repertoire/house-sweep.js +469 -0
- package/dist/repertoire/mcp-client.js +58 -5
- package/dist/repertoire/mcp-manager.js +427 -139
- package/dist/repertoire/mcp-tools.js +132 -0
- package/dist/repertoire/mcp-write-guard.js +46 -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/sanctuary-container-policy.js +46 -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 +182 -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 +872 -0
- package/dist/repertoire/tools-base.js +83 -1168
- package/dist/repertoire/tools-bluebubbles.js +2 -0
- package/dist/repertoire/tools-bridge.js +144 -0
- package/dist/repertoire/tools-bundle.js +995 -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-escalation.js +84 -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-friend-link.js +57 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-habits.js +103 -0
- package/dist/repertoire/tools-house-care.js +174 -0
- package/dist/repertoire/tools-mail.js +1828 -0
- package/dist/repertoire/tools-notes.js +496 -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 +238 -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-shepherd.js +262 -0
- package/dist/repertoire/tools-steward-policy.js +147 -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 +556 -0
- package/dist/repertoire/tools-user-profile.js +146 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice-local.js +198 -0
- package/dist/repertoire/tools-voice.js +145 -0
- package/dist/repertoire/tools.js +514 -156
- 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 +686 -0
- package/dist/rsvp/aisleplanner-client.js +354 -0
- package/dist/rsvp/cli.js +936 -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 +132 -0
- package/dist/senses/acp-server.js +386 -0
- package/dist/senses/attention-queue.js +186 -0
- package/dist/senses/await-turn-message.js +65 -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} +379 -41
- 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/host-account-verifier.js +88 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
- package/dist/senses/bluebubbles/index.js +3878 -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 +257 -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 +601 -304
- 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 +1158 -204
- package/dist/senses/private-runtime-worker.js +859 -0
- package/dist/senses/private-runtime.js +1627 -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 +104 -0
- package/dist/senses/sanctuary-health.js +422 -0
- package/dist/senses/sanctuary-install-state-contract.js +169 -0
- package/dist/senses/sanctuary-interactive-control.js +410 -0
- package/dist/senses/sanctuary-media-catalog-contract.js +259 -0
- package/dist/senses/sanctuary-media-optimization.js +514 -0
- package/dist/senses/sanctuary-runtime.js +369 -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 +793 -0
- package/dist/senses/shepherd/client.js +196 -0
- package/dist/senses/shepherd/cmux.js +352 -0
- package/dist/senses/shepherd/herdr.js +315 -0
- package/dist/senses/shepherd/host.js +14 -0
- package/dist/senses/shepherd/judge.js +137 -0
- package/dist/senses/shepherd/owner-notice.js +251 -0
- package/dist/senses/shepherd/redact.js +66 -0
- package/dist/senses/shepherd/returns.js +79 -0
- package/dist/senses/shepherd/sense.js +310 -0
- package/dist/senses/shepherd/terminal-process.js +99 -0
- package/dist/senses/shepherd-entry.js +78 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +68 -8
- package/dist/senses/teams.js +598 -233
- 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 +900 -0
- package/dist/senses/telegram-entry.js +83 -0
- package/dist/senses/telegram-handoff.js +80 -0
- package/dist/senses/telegram.js +2405 -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/call-auth.js +250 -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/local-audio-control.js +344 -0
- package/dist/senses/voice/local-audio-devices.js +516 -0
- package/dist/senses/voice/local-audio-disclosure.js +174 -0
- package/dist/senses/voice/local-audio-identity.js +103 -0
- package/dist/senses/voice/local-audio-join.js +325 -0
- package/dist/senses/voice/local-audio-mute.js +199 -0
- package/dist/senses/voice/local-audio-notify.js +121 -0
- package/dist/senses/voice/local-audio-prompts.js +116 -0
- package/dist/senses/voice/local-audio-transport.js +427 -0
- package/dist/senses/voice/local-audio.js +281 -0
- package/dist/senses/voice/local-media-stream.js +145 -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/process-guards.js +51 -0
- package/dist/senses/voice/realtime-eval.js +496 -0
- package/dist/senses/voice/realtime-tool-schema.js +195 -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 +836 -0
- package/dist/senses/voice/twilio-phone.js +5454 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +83 -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 +8100 -0
- package/package.json +74 -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 -362
- 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
|
@@ -1,12 +1,65 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.BlueBubblesSendError = void 0;
|
|
3
37
|
exports.createBlueBubblesClient = createBlueBubblesClient;
|
|
4
38
|
const node_crypto_1 = require("node:crypto");
|
|
5
|
-
const config_1 = require("
|
|
6
|
-
const identity_1 = require("
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
39
|
+
const config_1 = require("../../heart/config");
|
|
40
|
+
const identity_1 = require("../../heart/identity");
|
|
41
|
+
const bluebubbles_health_diagnostics_1 = require("../../heart/daemon/bluebubbles-health-diagnostics");
|
|
42
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
43
|
+
const minimax_1 = require("../../heart/providers/minimax");
|
|
44
|
+
const minimax_vlm_1 = require("../../heart/providers/minimax-vlm");
|
|
45
|
+
const model_1 = require("./model");
|
|
46
|
+
const media_1 = require("./media");
|
|
47
|
+
const host_account_verifier_1 = require("./host-account-verifier");
|
|
48
|
+
class BlueBubblesSendError extends Error {
|
|
49
|
+
httpStatus;
|
|
50
|
+
status;
|
|
51
|
+
errorCode;
|
|
52
|
+
transportInvoked;
|
|
53
|
+
constructor(input) {
|
|
54
|
+
super(input.message, input.cause === undefined ? undefined : { cause: input.cause });
|
|
55
|
+
this.name = "BlueBubblesSendError";
|
|
56
|
+
this.httpStatus = input.httpStatus;
|
|
57
|
+
this.status = input.httpStatus;
|
|
58
|
+
this.errorCode = input.errorCode;
|
|
59
|
+
this.transportInvoked = input.transportInvoked;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.BlueBubblesSendError = BlueBubblesSendError;
|
|
10
63
|
function buildBlueBubblesApiUrl(baseUrl, endpoint, password) {
|
|
11
64
|
const root = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
12
65
|
const url = new URL(endpoint.replace(/^\//, ""), root);
|
|
@@ -55,6 +108,31 @@ async function parseJsonBody(response) {
|
|
|
55
108
|
return null;
|
|
56
109
|
}
|
|
57
110
|
}
|
|
111
|
+
function describeCaughtValue(error) {
|
|
112
|
+
return error instanceof Error ? error.message : String(error);
|
|
113
|
+
}
|
|
114
|
+
function sendTransportErrorCode(error) {
|
|
115
|
+
if (error instanceof Error && error.name === "TimeoutError")
|
|
116
|
+
return "timeout";
|
|
117
|
+
if (error instanceof Error && error.name === "AbortError")
|
|
118
|
+
return "abort";
|
|
119
|
+
if (error instanceof TypeError)
|
|
120
|
+
return "socket";
|
|
121
|
+
return "transport_error";
|
|
122
|
+
}
|
|
123
|
+
function emitBlueBubblesSendError(input) {
|
|
124
|
+
(0, runtime_1.emitNervesEvent)({
|
|
125
|
+
level: "error",
|
|
126
|
+
component: "senses",
|
|
127
|
+
event: "senses.bluebubbles_send_error",
|
|
128
|
+
message: "bluebubbles send failed",
|
|
129
|
+
meta: {
|
|
130
|
+
status: input.status,
|
|
131
|
+
errorCode: input.errorCode,
|
|
132
|
+
reason: input.reason,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
}
|
|
58
136
|
function buildRepairUrl(baseUrl, messageGuid, password) {
|
|
59
137
|
const url = buildBlueBubblesApiUrl(baseUrl, `/api/v1/message/${encodeURIComponent(messageGuid)}`, password);
|
|
60
138
|
const parsed = new URL(url);
|
|
@@ -99,6 +177,23 @@ function extractChatQueryRows(payload) {
|
|
|
99
177
|
}
|
|
100
178
|
return data.map((entry) => asRecord(entry)).filter((entry) => entry !== null);
|
|
101
179
|
}
|
|
180
|
+
function extractMessageQueryRows(payload) {
|
|
181
|
+
const record = asRecord(payload);
|
|
182
|
+
const data = asRecord(record?.data);
|
|
183
|
+
const rows = Array.isArray(record?.data) ? record.data
|
|
184
|
+
: Array.isArray(data?.messages) ? data.messages
|
|
185
|
+
: Array.isArray(data?.results) ? data.results
|
|
186
|
+
: Array.isArray(record?.messages) ? record.messages
|
|
187
|
+
: Array.isArray(payload) ? payload
|
|
188
|
+
: [];
|
|
189
|
+
return rows;
|
|
190
|
+
}
|
|
191
|
+
function hasValidRawMessageCausalTimestamp(row) {
|
|
192
|
+
const record = asRecord(row);
|
|
193
|
+
return typeof record?.dateCreated === "number"
|
|
194
|
+
&& Number.isFinite(record.dateCreated)
|
|
195
|
+
&& record.dateCreated > 0;
|
|
196
|
+
}
|
|
102
197
|
async function resolveChatGuidForIdentifier(config, channelConfig, chatIdentifier) {
|
|
103
198
|
const trimmedIdentifier = chatIdentifier.trim();
|
|
104
199
|
if (!trimmedIdentifier)
|
|
@@ -209,13 +304,27 @@ async function resolveChatGuid(chat, config, channelConfig) {
|
|
|
209
304
|
return chat.chatGuid
|
|
210
305
|
?? await resolveChatGuidForIdentifier(config, channelConfig, chat.chatIdentifier ?? "");
|
|
211
306
|
}
|
|
212
|
-
function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(), channelConfig = (0, config_1.getBlueBubblesChannelConfig)()) {
|
|
307
|
+
function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(), channelConfig = (0, config_1.getBlueBubblesChannelConfig)(), hostOptions = {}) {
|
|
308
|
+
// Everything that acts as the signed-in Apple ID first confirms the server
|
|
309
|
+
// runs under the agent's declared macOS host account.
|
|
310
|
+
// Sends recheck every time; quieter actions may reuse a recent confirmation.
|
|
311
|
+
const assertHostAccount = (options = {}) => (0, host_account_verifier_1.verifyBlueBubblesServerAccount)({
|
|
312
|
+
agent: hostOptions.agent ?? (0, identity_1.getAgentName)(),
|
|
313
|
+
hostUsername: "hostUsername" in hostOptions
|
|
314
|
+
? hostOptions.hostUsername
|
|
315
|
+
: (0, identity_1.loadAgentConfig)().senses?.bluebubbles.hostUsername,
|
|
316
|
+
serverUrl: config.serverUrl,
|
|
317
|
+
password: config.password,
|
|
318
|
+
requestTimeoutMs: channelConfig.requestTimeoutMs,
|
|
319
|
+
fresh: options.fresh,
|
|
320
|
+
});
|
|
213
321
|
return {
|
|
214
322
|
async sendText(params) {
|
|
215
323
|
const trimmedText = params.text.trim();
|
|
216
324
|
if (!trimmedText) {
|
|
217
325
|
throw new Error("BlueBubbles send requires non-empty text.");
|
|
218
326
|
}
|
|
327
|
+
await assertHostAccount({ fresh: true });
|
|
219
328
|
const resolvedChatGuid = await resolveChatGuid(params.chat, config, channelConfig);
|
|
220
329
|
if (!resolvedChatGuid) {
|
|
221
330
|
throw new Error("BlueBubbles send currently requires chat.chatGuid from the inbound event.");
|
|
@@ -223,7 +332,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
223
332
|
const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/text", config.password);
|
|
224
333
|
const body = {
|
|
225
334
|
chatGuid: resolvedChatGuid,
|
|
226
|
-
tempGuid: (0, node_crypto_1.randomUUID)(),
|
|
335
|
+
tempGuid: params.tempGuid?.trim() || (0, node_crypto_1.randomUUID)(),
|
|
227
336
|
message: trimmedText,
|
|
228
337
|
};
|
|
229
338
|
if (params.replyToMessageGuid?.trim()) {
|
|
@@ -240,27 +349,70 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
240
349
|
hasReplyTarget: Boolean(params.replyToMessageGuid?.trim()),
|
|
241
350
|
},
|
|
242
351
|
});
|
|
243
|
-
const
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
352
|
+
const requestTimeoutSignal = AbortSignal.timeout(channelConfig.requestTimeoutMs);
|
|
353
|
+
if (params.beforeTransportInvocation && !params.beforeTransportInvocation()) {
|
|
354
|
+
throw new BlueBubblesSendError({
|
|
355
|
+
message: "BlueBubbles send was not admitted at the transport boundary.",
|
|
356
|
+
httpStatus: null,
|
|
357
|
+
errorCode: "admission_denied",
|
|
358
|
+
transportInvoked: false,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
params.onTransportInvocation?.();
|
|
362
|
+
let response;
|
|
363
|
+
try {
|
|
364
|
+
response = await fetch(url, {
|
|
365
|
+
method: "POST",
|
|
366
|
+
headers: { "Content-Type": "application/json" },
|
|
367
|
+
body: JSON.stringify(body),
|
|
368
|
+
redirect: "manual",
|
|
369
|
+
signal: params.signal
|
|
370
|
+
? AbortSignal.any([params.signal, requestTimeoutSignal])
|
|
371
|
+
: requestTimeoutSignal,
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
const errorCode = sendTransportErrorCode(error);
|
|
376
|
+
const reason = describeCaughtValue(error);
|
|
377
|
+
emitBlueBubblesSendError({ status: null, errorCode, reason });
|
|
378
|
+
throw new BlueBubblesSendError({
|
|
379
|
+
message: `BlueBubbles send failed (${errorCode}): ${reason}`,
|
|
380
|
+
httpStatus: null,
|
|
381
|
+
errorCode,
|
|
382
|
+
transportInvoked: true,
|
|
383
|
+
cause: error,
|
|
384
|
+
});
|
|
385
|
+
}
|
|
249
386
|
if (!response.ok) {
|
|
250
387
|
const errorText = await response.text().catch(() => "");
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
message:
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
},
|
|
388
|
+
const reason = errorText || "unknown";
|
|
389
|
+
const errorCode = `http_${response.status}`;
|
|
390
|
+
emitBlueBubblesSendError({ status: response.status, errorCode, reason });
|
|
391
|
+
throw new BlueBubblesSendError({
|
|
392
|
+
message: `BlueBubbles send failed (${response.status}): ${reason}`,
|
|
393
|
+
httpStatus: response.status,
|
|
394
|
+
errorCode,
|
|
395
|
+
transportInvoked: true,
|
|
260
396
|
});
|
|
261
|
-
throw new Error(`BlueBubbles send failed (${response.status}): ${errorText || "unknown"}`);
|
|
262
397
|
}
|
|
263
|
-
const
|
|
398
|
+
const rawPayload = await response.text();
|
|
399
|
+
let payload = null;
|
|
400
|
+
if (rawPayload.trim()) {
|
|
401
|
+
try {
|
|
402
|
+
payload = JSON.parse(rawPayload);
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
const errorCode = "malformed_response";
|
|
406
|
+
emitBlueBubblesSendError({ status: response.status, errorCode, reason: errorCode });
|
|
407
|
+
throw new BlueBubblesSendError({
|
|
408
|
+
message: `BlueBubbles send failed (${response.status}): malformed response`,
|
|
409
|
+
httpStatus: response.status,
|
|
410
|
+
errorCode,
|
|
411
|
+
transportInvoked: true,
|
|
412
|
+
cause: error,
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
}
|
|
264
416
|
const messageGuid = extractMessageGuid(payload);
|
|
265
417
|
(0, runtime_1.emitNervesEvent)({
|
|
266
418
|
component: "senses",
|
|
@@ -274,6 +426,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
274
426
|
return { messageGuid };
|
|
275
427
|
},
|
|
276
428
|
async editMessage(params) {
|
|
429
|
+
await assertHostAccount();
|
|
277
430
|
const messageGuid = params.messageGuid.trim();
|
|
278
431
|
const text = params.text.trim();
|
|
279
432
|
if (!messageGuid) {
|
|
@@ -299,30 +452,34 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
299
452
|
throw new Error(`BlueBubbles edit failed (${response.status}): ${errorText || "unknown"}`);
|
|
300
453
|
}
|
|
301
454
|
},
|
|
302
|
-
async setTyping(chat, typing) {
|
|
455
|
+
async setTyping(chat, typing, signal) {
|
|
456
|
+
await assertHostAccount();
|
|
303
457
|
const resolvedChatGuid = await resolveChatGuid(chat, config, channelConfig);
|
|
304
458
|
if (!resolvedChatGuid) {
|
|
305
459
|
return;
|
|
306
460
|
}
|
|
307
461
|
const url = buildBlueBubblesApiUrl(config.serverUrl, `/api/v1/chat/${encodeURIComponent(resolvedChatGuid)}/typing`, config.password);
|
|
462
|
+
const requestTimeoutSignal = AbortSignal.timeout(channelConfig.requestTimeoutMs);
|
|
308
463
|
const response = await fetch(url, {
|
|
309
464
|
method: typing ? "POST" : "DELETE",
|
|
310
|
-
signal: AbortSignal.
|
|
465
|
+
signal: signal ? AbortSignal.any([signal, requestTimeoutSignal]) : requestTimeoutSignal,
|
|
311
466
|
});
|
|
312
467
|
if (!response.ok) {
|
|
313
468
|
const errorText = await response.text().catch(() => "");
|
|
314
469
|
throw new Error(`BlueBubbles typing failed (${response.status}): ${errorText || "unknown"}`);
|
|
315
470
|
}
|
|
316
471
|
},
|
|
317
|
-
async markChatRead(chat) {
|
|
472
|
+
async markChatRead(chat, signal) {
|
|
473
|
+
await assertHostAccount();
|
|
318
474
|
const resolvedChatGuid = await resolveChatGuid(chat, config, channelConfig);
|
|
319
475
|
if (!resolvedChatGuid) {
|
|
320
476
|
return;
|
|
321
477
|
}
|
|
322
478
|
const url = buildBlueBubblesApiUrl(config.serverUrl, `/api/v1/chat/${encodeURIComponent(resolvedChatGuid)}/read`, config.password);
|
|
479
|
+
const requestTimeoutSignal = AbortSignal.timeout(channelConfig.requestTimeoutMs);
|
|
323
480
|
const response = await fetch(url, {
|
|
324
481
|
method: "POST",
|
|
325
|
-
signal: AbortSignal.
|
|
482
|
+
signal: signal ? AbortSignal.any([signal, requestTimeoutSignal]) : requestTimeoutSignal,
|
|
326
483
|
});
|
|
327
484
|
if (!response.ok) {
|
|
328
485
|
const errorText = await response.text().catch(() => "");
|
|
@@ -330,19 +487,19 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
330
487
|
}
|
|
331
488
|
},
|
|
332
489
|
async checkHealth() {
|
|
333
|
-
const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/count", config.password);
|
|
334
490
|
(0, runtime_1.emitNervesEvent)({
|
|
335
491
|
component: "senses",
|
|
336
492
|
event: "senses.bluebubbles_healthcheck_start",
|
|
337
493
|
message: "probing bluebubbles upstream health",
|
|
338
494
|
meta: { serverUrl: config.serverUrl },
|
|
339
495
|
});
|
|
340
|
-
const
|
|
341
|
-
|
|
342
|
-
|
|
496
|
+
const result = await (0, bluebubbles_health_diagnostics_1.probeBlueBubblesHealth)({
|
|
497
|
+
serverUrl: config.serverUrl,
|
|
498
|
+
password: config.password,
|
|
499
|
+
requestTimeoutMs: channelConfig.requestTimeoutMs,
|
|
500
|
+
fetchImpl: fetch,
|
|
343
501
|
});
|
|
344
|
-
if (!
|
|
345
|
-
const errorText = await response.text().catch(() => "");
|
|
502
|
+
if (!result.ok) {
|
|
346
503
|
(0, runtime_1.emitNervesEvent)({
|
|
347
504
|
level: "warn",
|
|
348
505
|
component: "senses",
|
|
@@ -350,12 +507,15 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
350
507
|
message: "bluebubbles upstream health probe failed",
|
|
351
508
|
meta: {
|
|
352
509
|
serverUrl: config.serverUrl,
|
|
353
|
-
status:
|
|
354
|
-
reason:
|
|
510
|
+
status: result.status,
|
|
511
|
+
reason: result.reason,
|
|
512
|
+
classification: result.classification,
|
|
513
|
+
detail: (0, bluebubbles_health_diagnostics_1.redactBlueBubblesHealthDetailForNerves)(result.detail),
|
|
355
514
|
},
|
|
356
515
|
});
|
|
357
|
-
throw new Error(
|
|
516
|
+
throw new Error(result.detail);
|
|
358
517
|
}
|
|
518
|
+
await assertHostAccount();
|
|
359
519
|
(0, runtime_1.emitNervesEvent)({
|
|
360
520
|
component: "senses",
|
|
361
521
|
event: "senses.bluebubbles_healthcheck_end",
|
|
@@ -363,6 +523,98 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
363
523
|
meta: { serverUrl: config.serverUrl },
|
|
364
524
|
});
|
|
365
525
|
},
|
|
526
|
+
async queryRecentMessagesWithMetadata(params = {}) {
|
|
527
|
+
const limit = Math.max(1, Math.min(100, Math.floor(params.limit ?? 50)));
|
|
528
|
+
const offset = Math.max(0, Math.floor(params.offset ?? 0));
|
|
529
|
+
// Reading messages is gated like sending: never read another account's iMessages.
|
|
530
|
+
await assertHostAccount();
|
|
531
|
+
const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/query", config.password);
|
|
532
|
+
(0, runtime_1.emitNervesEvent)({
|
|
533
|
+
component: "senses",
|
|
534
|
+
event: "senses.bluebubbles_query_recent_start",
|
|
535
|
+
message: "querying recent bluebubbles messages",
|
|
536
|
+
meta: { limit, offset },
|
|
537
|
+
});
|
|
538
|
+
const request = {
|
|
539
|
+
limit,
|
|
540
|
+
offset,
|
|
541
|
+
sort: "DESC",
|
|
542
|
+
...(params.chatGuid?.trim() ? { chatGuid: params.chatGuid.trim() } : {}),
|
|
543
|
+
...(params.chatIdentifier?.trim() ? { chatIdentifier: params.chatIdentifier.trim() } : {}),
|
|
544
|
+
...(typeof params.beforeTimestamp === "number" && Number.isFinite(params.beforeTimestamp)
|
|
545
|
+
? { beforeTimestamp: params.beforeTimestamp }
|
|
546
|
+
: {}),
|
|
547
|
+
};
|
|
548
|
+
const { beforeTimestamp, ...wireRequest } = request;
|
|
549
|
+
const body = {
|
|
550
|
+
...wireRequest,
|
|
551
|
+
// BlueBubbles names its inclusive message-date upper bound `before`.
|
|
552
|
+
...(beforeTimestamp !== undefined ? { before: beforeTimestamp } : {}),
|
|
553
|
+
with: ["chats", "attachments", "payloadData", "messageSummaryInfo"],
|
|
554
|
+
};
|
|
555
|
+
const response = await fetch(url, {
|
|
556
|
+
method: "POST",
|
|
557
|
+
headers: { "Content-Type": "application/json" },
|
|
558
|
+
body: JSON.stringify(body),
|
|
559
|
+
signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
|
|
560
|
+
});
|
|
561
|
+
if (!response.ok) {
|
|
562
|
+
const errorText = await response.text().catch(() => "");
|
|
563
|
+
(0, runtime_1.emitNervesEvent)({
|
|
564
|
+
level: "warn",
|
|
565
|
+
component: "senses",
|
|
566
|
+
event: "senses.bluebubbles_query_recent_error",
|
|
567
|
+
message: "bluebubbles recent message query failed",
|
|
568
|
+
meta: {
|
|
569
|
+
status: response.status,
|
|
570
|
+
reason: errorText || "unknown",
|
|
571
|
+
},
|
|
572
|
+
});
|
|
573
|
+
throw new Error(`BlueBubbles recent message query failed (${response.status}): ${errorText || "unknown"}`);
|
|
574
|
+
}
|
|
575
|
+
const payload = await parseJsonBody(response);
|
|
576
|
+
const rows = extractMessageQueryRows(payload);
|
|
577
|
+
const invalidCausalTimestampRowCount = rows.filter((row) => !hasValidRawMessageCausalTimestamp(row)).length;
|
|
578
|
+
const messages = [];
|
|
579
|
+
for (const row of rows) {
|
|
580
|
+
try {
|
|
581
|
+
messages.push((0, model_1.normalizeBlueBubblesEvent)({ type: "new-message", data: row }));
|
|
582
|
+
}
|
|
583
|
+
catch (error) {
|
|
584
|
+
(0, runtime_1.emitNervesEvent)({
|
|
585
|
+
level: "warn",
|
|
586
|
+
component: "senses",
|
|
587
|
+
event: "senses.bluebubbles_query_recent_skip",
|
|
588
|
+
message: "skipped unusable bluebubbles recent message row",
|
|
589
|
+
meta: {
|
|
590
|
+
reason: describeCaughtValue(error),
|
|
591
|
+
},
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
(0, runtime_1.emitNervesEvent)({
|
|
596
|
+
component: "senses",
|
|
597
|
+
event: "senses.bluebubbles_query_recent_end",
|
|
598
|
+
message: "queried recent bluebubbles messages",
|
|
599
|
+
meta: {
|
|
600
|
+
rows: rows.length,
|
|
601
|
+
normalized: messages.length,
|
|
602
|
+
skipped: rows.length - messages.length,
|
|
603
|
+
},
|
|
604
|
+
});
|
|
605
|
+
return {
|
|
606
|
+
messages,
|
|
607
|
+
rawRowCount: rows.length,
|
|
608
|
+
normalizedRowCount: messages.length,
|
|
609
|
+
skippedRowCount: rows.length - messages.length,
|
|
610
|
+
invalidCausalTimestampRowCount,
|
|
611
|
+
request,
|
|
612
|
+
};
|
|
613
|
+
},
|
|
614
|
+
async listRecentMessages(params = {}) {
|
|
615
|
+
const result = await this.queryRecentMessagesWithMetadata(params);
|
|
616
|
+
return result.messages;
|
|
617
|
+
},
|
|
366
618
|
async repairEvent(event) {
|
|
367
619
|
if (!event.requiresRepair) {
|
|
368
620
|
(0, runtime_1.emitNervesEvent)({
|
|
@@ -377,6 +629,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
377
629
|
return event;
|
|
378
630
|
}
|
|
379
631
|
(0, runtime_1.emitNervesEvent)({
|
|
632
|
+
level: "warn",
|
|
380
633
|
component: "senses",
|
|
381
634
|
event: "senses.bluebubbles_repair_start",
|
|
382
635
|
message: "repairing bluebubbles event by guid",
|
|
@@ -386,6 +639,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
386
639
|
eventType: event.eventType,
|
|
387
640
|
},
|
|
388
641
|
});
|
|
642
|
+
await assertHostAccount();
|
|
389
643
|
const url = buildRepairUrl(config.serverUrl, event.messageGuid, config.password);
|
|
390
644
|
try {
|
|
391
645
|
const response = await fetch(url, {
|
|
@@ -423,13 +677,13 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
423
677
|
});
|
|
424
678
|
return repaired;
|
|
425
679
|
}
|
|
426
|
-
const normalized = (0,
|
|
680
|
+
const normalized = (0, model_1.normalizeBlueBubblesEvent)({
|
|
427
681
|
type: event.eventType,
|
|
428
682
|
data,
|
|
429
683
|
});
|
|
430
684
|
const recoveredMessage = event.kind === "mutation"
|
|
431
685
|
&& !event.shouldNotifyAgent
|
|
432
|
-
? (0,
|
|
686
|
+
? (0, model_1.normalizeBlueBubblesEvent)({
|
|
433
687
|
type: "new-message",
|
|
434
688
|
data,
|
|
435
689
|
})
|
|
@@ -440,8 +694,42 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
440
694
|
if (hydrated.kind === "message" &&
|
|
441
695
|
hydrated.balloonBundleId !== "com.apple.messages.URLBalloonProvider" &&
|
|
442
696
|
hydrated.attachments.length > 0) {
|
|
443
|
-
const
|
|
444
|
-
|
|
697
|
+
const agentConfig = (0, identity_1.loadAgentConfig)();
|
|
698
|
+
const chatModel = agentConfig.humanFacing.model;
|
|
699
|
+
const chatProvider = agentConfig.humanFacing.provider;
|
|
700
|
+
const vlmDescribe = async (params) => {
|
|
701
|
+
if (chatProvider !== "minimax") {
|
|
702
|
+
throw new Error("VLM fallback requires a minimax credential for this agent — " +
|
|
703
|
+
"configure one or switch to a vision-capable chat model");
|
|
704
|
+
}
|
|
705
|
+
const { readProviderCredentialRecord } = await Promise.resolve().then(() => __importStar(require("../../heart/provider-credentials")));
|
|
706
|
+
const credential = await readProviderCredentialRecord((0, identity_1.getAgentName)(), "minimax");
|
|
707
|
+
const apiKey = credential.ok ? credential.record.credentials.apiKey : undefined;
|
|
708
|
+
if (!apiKey) {
|
|
709
|
+
throw new Error("VLM fallback: minimax API key not found in the agent vault — " +
|
|
710
|
+
"run `ouro auth --agent <agent> --provider minimax`");
|
|
711
|
+
}
|
|
712
|
+
return (0, minimax_vlm_1.minimaxVlmDescribe)({
|
|
713
|
+
apiKey: String(apiKey),
|
|
714
|
+
prompt: params.prompt,
|
|
715
|
+
imageDataUrl: params.imageDataUrl,
|
|
716
|
+
baseURL: minimax_1.MINIMAX_PROVIDER_BASE_URL,
|
|
717
|
+
attachmentGuid: params.attachmentGuid,
|
|
718
|
+
mimeType: params.mimeType,
|
|
719
|
+
chatModel: params.chatModel,
|
|
720
|
+
});
|
|
721
|
+
};
|
|
722
|
+
// VLM prompt context wants the user's raw inbound text — NOT
|
|
723
|
+
// the agent-facing rendering, which now carries the attachment
|
|
724
|
+
// marker after the B2 fix. Pull it from the source payload.
|
|
725
|
+
const rawUserText = typeof data.text === "string"
|
|
726
|
+
? (data.text).trim()
|
|
727
|
+
: "";
|
|
728
|
+
const media = await (0, media_1.hydrateBlueBubblesAttachments)(hydrated.attachments, config, channelConfig, {
|
|
729
|
+
preferAudioInput: providerSupportsAudioInput(chatProvider),
|
|
730
|
+
chatModel,
|
|
731
|
+
vlmDescribe,
|
|
732
|
+
userText: rawUserText,
|
|
445
733
|
});
|
|
446
734
|
const transcriptSuffix = media.transcriptAdditions.map((entry) => `[${entry}]`).join("\n");
|
|
447
735
|
const noticeSuffix = media.notices.map((entry) => `[${entry}]`).join("\n");
|
|
@@ -453,6 +741,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
453
741
|
};
|
|
454
742
|
}
|
|
455
743
|
(0, runtime_1.emitNervesEvent)({
|
|
744
|
+
level: "warn",
|
|
456
745
|
component: "senses",
|
|
457
746
|
event: "senses.bluebubbles_repair_end",
|
|
458
747
|
message: "bluebubbles event repaired",
|
|
@@ -480,5 +769,54 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
480
769
|
return applyRepairNotice(event, `BlueBubbles repair failed: ${reason}`);
|
|
481
770
|
}
|
|
482
771
|
},
|
|
772
|
+
async getMessageText(messageGuid) {
|
|
773
|
+
await assertHostAccount();
|
|
774
|
+
const url = buildRepairUrl(config.serverUrl, messageGuid, config.password);
|
|
775
|
+
try {
|
|
776
|
+
const response = await fetch(url, {
|
|
777
|
+
method: "GET",
|
|
778
|
+
signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
|
|
779
|
+
});
|
|
780
|
+
if (!response.ok) {
|
|
781
|
+
(0, runtime_1.emitNervesEvent)({
|
|
782
|
+
level: "warn",
|
|
783
|
+
component: "senses",
|
|
784
|
+
event: "senses.bluebubbles_get_message_text_error",
|
|
785
|
+
message: "failed to fetch message text",
|
|
786
|
+
meta: { messageGuid, status: response.status },
|
|
787
|
+
});
|
|
788
|
+
return null;
|
|
789
|
+
}
|
|
790
|
+
const payload = await parseJsonBody(response);
|
|
791
|
+
const data = extractRepairData(payload);
|
|
792
|
+
if (!data || typeof data.text !== "string") {
|
|
793
|
+
(0, runtime_1.emitNervesEvent)({
|
|
794
|
+
level: "warn",
|
|
795
|
+
component: "senses",
|
|
796
|
+
event: "senses.bluebubbles_get_message_text_error",
|
|
797
|
+
message: "message payload missing text field",
|
|
798
|
+
meta: { messageGuid, hasData: !!data, textType: data ? typeof data.text : "n/a" },
|
|
799
|
+
});
|
|
800
|
+
return null;
|
|
801
|
+
}
|
|
802
|
+
(0, runtime_1.emitNervesEvent)({
|
|
803
|
+
component: "senses",
|
|
804
|
+
event: "senses.bluebubbles_get_message_text",
|
|
805
|
+
message: "fetched message text by guid",
|
|
806
|
+
meta: { messageGuid },
|
|
807
|
+
});
|
|
808
|
+
return data.text.trim() || null;
|
|
809
|
+
}
|
|
810
|
+
catch (error) {
|
|
811
|
+
(0, runtime_1.emitNervesEvent)({
|
|
812
|
+
level: "warn",
|
|
813
|
+
component: "senses",
|
|
814
|
+
event: "senses.bluebubbles_get_message_text_error",
|
|
815
|
+
message: "exception fetching message text",
|
|
816
|
+
meta: { messageGuid, reason: error instanceof Error ? error.message : String(error) },
|
|
817
|
+
});
|
|
818
|
+
return null;
|
|
819
|
+
}
|
|
820
|
+
},
|
|
483
821
|
};
|
|
484
822
|
}
|