@ouro.bot/cli 0.1.0-alpha.74 → 0.1.0-alpha.741
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +154 -23
- package/RepairGuide.ouro/agent.json +5 -0
- package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
- package/RepairGuide.ouro/psyche/SOUL.md +55 -0
- package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
- package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
- package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
- package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/assets/bluebubbles-host +264 -0
- package/changelog.json +4730 -16
- package/deploy/unraid/Dockerfile +43 -0
- package/deploy/unraid/README.txt +1623 -0
- package/deploy/unraid/audit-container-spec.sh +4 -0
- package/deploy/unraid/container-runtime.json +1 -0
- package/deploy/unraid/sanctuary-acceptance-adapter.sh +37 -0
- package/deploy/unraid/sanctuary-acceptance-contract.json +200 -0
- package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
- package/deploy/unraid/sanctuary-deployment-target.mjs +709 -0
- package/deploy/unraid/sanctuary-safe-rename.py +24 -0
- package/deploy/unraid/sanctuary-unit16-host-broker.mjs +1796 -0
- package/deploy/unraid/sanctuary-unit16-run.sh +520 -0
- package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
- package/deploy/unraid/sanctuary.ouro/agent.json +24 -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/provider-readiness.json +18 -0
- package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +3 -0
- package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +3 -0
- package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +3 -0
- package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +7 -0
- package/deploy/unraid/sanctuary.ouro/tool-profiles.json +21 -0
- package/deploy/unraid/sanctuary.xml +25 -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 +144 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/evolution.js +490 -0
- package/dist/arc/flight-recorder.js +1034 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +348 -0
- package/dist/arc/packets.js +336 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +57 -0
- package/dist/commerce/store.js +755 -0
- package/dist/commerce/types.js +3 -0
- package/dist/heart/active-work.js +874 -43
- package/dist/heart/agent-entry.js +190 -3
- package/dist/heart/approval-files.js +113 -0
- package/dist/heart/approval-store.js +950 -0
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +16 -0
- package/dist/heart/attachments/store.js +103 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +495 -0
- package/dist/heart/autonomy-budget.js +477 -0
- package/dist/heart/awaiting/await-alert.js +146 -0
- package/dist/heart/awaiting/await-expiry.js +108 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +141 -0
- package/dist/heart/awaiting/await-runtime-state.js +100 -0
- package/dist/heart/awaiting/await-scheduler.js +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 +135 -0
- package/dist/heart/config-registry.js +331 -0
- package/dist/heart/config.js +128 -129
- package/dist/heart/context-loss-gauntlet.js +354 -0
- package/dist/heart/context-loss-sentinel.js +1155 -0
- package/dist/heart/core.js +1759 -331
- package/dist/heart/cross-chat-delivery.js +8 -22
- package/dist/heart/daemon/agent-config-check.js +451 -0
- package/dist/heart/daemon/agent-discovery.js +185 -3
- package/dist/heart/daemon/agent-service.js +542 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/await-private-wake.js +59 -0
- package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
- package/dist/heart/daemon/bluebubbles-host.js +273 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +180 -0
- package/dist/heart/daemon/cli-defaults.js +832 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +8692 -0
- package/dist/heart/daemon/cli-help.js +710 -0
- package/dist/heart/daemon/cli-parse.js +2714 -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 +94 -0
- package/dist/heart/daemon/container-runtime.js +84 -0
- package/dist/heart/daemon/container-spec-auditor-main.js +156 -0
- package/dist/heart/daemon/container-spec-auditor.js +156 -0
- package/dist/heart/daemon/daemon-bootstrap-startup.js +41 -0
- package/dist/heart/daemon/daemon-cli.js +29 -2144
- package/dist/heart/daemon/daemon-entry.js +930 -10
- 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 +1698 -88
- 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 +45 -5
- package/dist/heart/daemon/migrate-to-desk.js +848 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +22 -14
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/plugin-cli.js +432 -0
- package/dist/heart/daemon/process-manager.js +624 -61
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/prunable-bundle.js +144 -0
- package/dist/heart/daemon/pulse.js +511 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +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 +2365 -0
- package/dist/heart/daemon/sanctuary-acceptance-harness.js +1624 -0
- package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
- package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +985 -0
- package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
- package/dist/heart/daemon/sanctuary-scheduler-origin.js +126 -0
- package/dist/heart/daemon/sense-manager.js +689 -48
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +1 -1
- package/dist/heart/daemon/socket-client.js +180 -12
- package/dist/heart/daemon/stale-bundle-prune.js +113 -0
- package/dist/heart/daemon/startup-tui.js +338 -0
- package/dist/heart/daemon/supercronic-supervisor.js +267 -0
- package/dist/heart/daemon/task-scheduler.js +117 -39
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +255 -43
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -4
- package/dist/heart/external-events/router.js +121 -0
- package/dist/heart/habits/habit-cancel.js +810 -0
- package/dist/heart/habits/habit-lifecycle.js +1327 -0
- package/dist/heart/habits/habit-migration.js +194 -0
- package/dist/heart/habits/habit-parser.js +278 -0
- package/dist/heart/habits/habit-runtime-state.js +93 -0
- package/dist/heart/habits/habit-scheduler.js +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 +184 -59
- package/dist/heart/kept-notes.js +289 -0
- package/dist/heart/kicks.js +1 -1
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +353 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +39 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +197 -0
- package/dist/heart/mailbox/readers/agent-machine.js +428 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
- package/dist/heart/mailbox/readers/sessions.js +232 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +696 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +11 -0
- package/dist/heart/orientation-frame.js +345 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/primitives.js +1 -1
- package/dist/heart/private-runtime/decision-renderer.js +156 -0
- package/dist/heart/private-runtime/index.js +18 -0
- package/dist/heart/private-runtime/ledger.js +218 -0
- package/dist/heart/private-runtime/policy.js +214 -0
- package/dist/heart/private-runtime/types.js +2 -0
- package/dist/heart/progress-story.js +1 -1
- package/dist/heart/provider-attempt.js +137 -0
- package/dist/heart/provider-binding-resolver.js +273 -0
- package/dist/heart/provider-credentials.js +449 -0
- package/dist/heart/provider-failover.js +311 -0
- package/dist/heart/provider-models.js +89 -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 +90 -24
- package/dist/heart/session-events.js +1300 -0
- package/dist/heart/session-playback-cli-main.js +5 -0
- package/dist/heart/session-playback-cli.js +36 -0
- package/dist/heart/session-playback.js +231 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +182 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/start-of-turn-packet.js +368 -0
- package/dist/heart/streaming.js +604 -207
- package/dist/heart/structured-output.js +196 -0
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +11 -7
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-approval.js +340 -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 +480 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +432 -0
- package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
- package/dist/heart/versioning/ouro-version-manager.js +409 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/versioning/update-hooks.js +154 -0
- package/dist/heart/versioning/version-intent.js +114 -0
- package/dist/heart/work-card.js +380 -0
- package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
- package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
- package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
- package/dist/mailbox-ui/index.html +16 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +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 +273 -111
- package/dist/mind/desk-section.js +362 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +68 -77
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/{associative-recall.js → note-search.js} +47 -58
- package/dist/mind/obligation-steering.js +227 -0
- package/dist/mind/pending.js +13 -8
- package/dist/mind/prompt-budget.js +479 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1067 -172
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/record-paths.js +312 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/session-transaction.js +379 -0
- package/dist/nerves/cli-logging.js +7 -1
- package/dist/nerves/coverage/audit-rules.js +15 -6
- package/dist/nerves/coverage/audit.js +28 -2
- package/dist/nerves/coverage/cli.js +1 -1
- package/dist/nerves/coverage/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +139 -5
- package/dist/nerves/coverage/run-artifacts.js +55 -35
- package/dist/nerves/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 +218 -30
- package/dist/repertoire/coding/index.js +15 -3
- package/dist/repertoire/coding/manager.js +166 -10
- package/dist/repertoire/coding/spawner.js +58 -11
- package/dist/repertoire/coding/tools.js +242 -14
- package/dist/repertoire/coding/workbench-client.js +272 -0
- package/dist/repertoire/coding/workbench-manager.js +346 -0
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +178 -0
- package/dist/repertoire/desk/classifier.js +362 -0
- package/dist/repertoire/duffel-client.js +185 -0
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +812 -18
- package/dist/repertoire/mcp-client.js +44 -3
- package/dist/repertoire/mcp-manager.js +259 -20
- package/dist/repertoire/mcp-tools.js +83 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +48 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-arguments.js +143 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +699 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +372 -0
- package/dist/repertoire/tools-base.js +67 -1095
- package/dist/repertoire/tools-bluebubbles.js +2 -0
- package/dist/repertoire/tools-bridge.js +144 -0
- package/dist/repertoire/tools-bundle.js +993 -0
- package/dist/repertoire/tools-commerce.js +253 -0
- package/dist/repertoire/tools-config.js +186 -0
- package/dist/repertoire/tools-continuity.js +252 -0
- package/dist/repertoire/tools-credential.js +383 -0
- package/dist/repertoire/tools-evolution.js +527 -0
- package/dist/repertoire/tools-files.js +344 -0
- package/dist/repertoire/tools-flight.js +290 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-habits.js +103 -0
- package/dist/repertoire/tools-mail.js +1828 -0
- package/dist/repertoire/tools-notes.js +459 -0
- package/dist/repertoire/tools-obligations.js +182 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +482 -0
- package/dist/repertoire/tools-rsvp.js +139 -0
- package/dist/repertoire/tools-runtime.js +150 -0
- package/dist/repertoire/tools-session.js +881 -0
- package/dist/repertoire/tools-shell.js +133 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +355 -0
- package/dist/repertoire/tools-teams.js +12 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -0
- package/dist/repertoire/tools-unraid.js +353 -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 +276 -79
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/unraid-client.js +155 -0
- package/dist/repertoire/unraid-restart.js +130 -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/attention-queue.js +186 -0
- package/dist/senses/await-turn-message.js +58 -0
- package/dist/senses/bluebubbles/active-turns.js +216 -0
- package/dist/senses/bluebubbles/attachment-cache.js +53 -0
- package/dist/senses/bluebubbles/attachment-download.js +137 -0
- package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
- package/dist/senses/bluebubbles/context-packet.js +207 -0
- package/dist/senses/bluebubbles/context-smoke.js +144 -0
- package/dist/senses/bluebubbles/entry.js +90 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
- package/dist/senses/bluebubbles/index.js +3839 -0
- package/dist/senses/bluebubbles/latest-turn.js +311 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
- package/dist/senses/bluebubbles/outbound-state.js +308 -0
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/reaction-policy.js +47 -0
- package/dist/senses/bluebubbles/replay.js +284 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/bluebubbles/webhook-registration.js +228 -0
- package/dist/senses/bluebubbles-meta-guard.js +39 -0
- package/dist/senses/cli/bracketed-paste.js +82 -0
- package/dist/senses/cli/image-paste.js +287 -0
- package/dist/senses/cli/image-ref-navigation.js +75 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/input-keys.js +174 -0
- package/dist/senses/cli/kill-ring.js +86 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +607 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +85 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +241 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli-layout.js +100 -0
- package/dist/senses/cli.js +621 -321
- package/dist/senses/commands.js +66 -3
- package/dist/senses/context-packet-ledger.js +371 -0
- package/dist/senses/context-packets.js +154 -0
- package/dist/senses/habit-lifecycle-guard.js +24 -0
- package/dist/senses/habit-turn-message.js +160 -0
- package/dist/senses/ingress-evidence.js +2 -0
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +524 -0
- package/dist/senses/pipeline.js +1075 -176
- package/dist/senses/private-runtime-worker.js +741 -0
- package/dist/senses/private-runtime.js +1212 -0
- package/dist/senses/proactive-content-guard.js +51 -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 +772 -0
- package/dist/senses/sanctuary-health-runner.js +146 -0
- package/dist/senses/sanctuary-health.js +447 -0
- package/dist/senses/sanctuary-interactive-control.js +306 -0
- package/dist/senses/sanctuary-runtime.js +206 -0
- package/dist/senses/shared-turn.js +432 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +515 -217
- package/dist/senses/telegram-approval-runtime.js +526 -0
- package/dist/senses/telegram-audit-ledger.js +220 -0
- package/dist/senses/telegram-client.js +1471 -0
- package/dist/senses/telegram-entry.js +80 -0
- package/dist/senses/telegram.js +1232 -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 +5081 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +81 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/dist/util/frontmatter.js +69 -0
- package/npm-shrinkwrap.json +8129 -0
- package/package.json +71 -12
- package/skills/agent-commerce.md +113 -0
- package/skills/browser-navigation.md +117 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +99 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/auth-flow.js +0 -430
- package/dist/heart/daemon/ouro-path-installer.js +0 -178
- package/dist/heart/daemon/update-hooks.js +0 -138
- package/dist/heart/safe-workspace.js +0 -228
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/friends/channel.js +0 -84
- package/dist/mind/friends/group-context.js +0 -144
- package/dist/mind/friends/resolver.js +0 -84
- package/dist/mind/friends/store-file.js +0 -190
- package/dist/mind/friends/store.js +0 -4
- package/dist/mind/friends/tokens.js +0 -26
- package/dist/mind/friends/trust-explanation.js +0 -74
- package/dist/mind/friends/types.js +0 -29
- package/dist/repertoire/tasks/board.js +0 -134
- package/dist/repertoire/tasks/index.js +0 -224
- package/dist/repertoire/tasks/lifecycle.js +0 -80
- package/dist/repertoire/tasks/middleware.js +0 -65
- package/dist/repertoire/tasks/parser.js +0 -173
- package/dist/repertoire/tasks/scanner.js +0 -132
- package/dist/repertoire/tasks/transitions.js +0 -144
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1180
- package/dist/senses/debug-activity.js +0 -148
- package/dist/senses/inner-dialog-worker.js +0 -90
- package/dist/senses/inner-dialog.js +0 -480
- package/subagents/README.md +0 -7
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
|
@@ -1,12 +1,64 @@
|
|
|
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
|
+
class BlueBubblesSendError extends Error {
|
|
48
|
+
httpStatus;
|
|
49
|
+
status;
|
|
50
|
+
errorCode;
|
|
51
|
+
transportInvoked;
|
|
52
|
+
constructor(input) {
|
|
53
|
+
super(input.message, input.cause === undefined ? undefined : { cause: input.cause });
|
|
54
|
+
this.name = "BlueBubblesSendError";
|
|
55
|
+
this.httpStatus = input.httpStatus;
|
|
56
|
+
this.status = input.httpStatus;
|
|
57
|
+
this.errorCode = input.errorCode;
|
|
58
|
+
this.transportInvoked = input.transportInvoked;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.BlueBubblesSendError = BlueBubblesSendError;
|
|
10
62
|
function buildBlueBubblesApiUrl(baseUrl, endpoint, password) {
|
|
11
63
|
const root = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
12
64
|
const url = new URL(endpoint.replace(/^\//, ""), root);
|
|
@@ -55,6 +107,31 @@ async function parseJsonBody(response) {
|
|
|
55
107
|
return null;
|
|
56
108
|
}
|
|
57
109
|
}
|
|
110
|
+
function describeCaughtValue(error) {
|
|
111
|
+
return error instanceof Error ? error.message : String(error);
|
|
112
|
+
}
|
|
113
|
+
function sendTransportErrorCode(error) {
|
|
114
|
+
if (error instanceof Error && error.name === "TimeoutError")
|
|
115
|
+
return "timeout";
|
|
116
|
+
if (error instanceof Error && error.name === "AbortError")
|
|
117
|
+
return "abort";
|
|
118
|
+
if (error instanceof TypeError)
|
|
119
|
+
return "socket";
|
|
120
|
+
return "transport_error";
|
|
121
|
+
}
|
|
122
|
+
function emitBlueBubblesSendError(input) {
|
|
123
|
+
(0, runtime_1.emitNervesEvent)({
|
|
124
|
+
level: "error",
|
|
125
|
+
component: "senses",
|
|
126
|
+
event: "senses.bluebubbles_send_error",
|
|
127
|
+
message: "bluebubbles send failed",
|
|
128
|
+
meta: {
|
|
129
|
+
status: input.status,
|
|
130
|
+
errorCode: input.errorCode,
|
|
131
|
+
reason: input.reason,
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
}
|
|
58
135
|
function buildRepairUrl(baseUrl, messageGuid, password) {
|
|
59
136
|
const url = buildBlueBubblesApiUrl(baseUrl, `/api/v1/message/${encodeURIComponent(messageGuid)}`, password);
|
|
60
137
|
const parsed = new URL(url);
|
|
@@ -99,6 +176,23 @@ function extractChatQueryRows(payload) {
|
|
|
99
176
|
}
|
|
100
177
|
return data.map((entry) => asRecord(entry)).filter((entry) => entry !== null);
|
|
101
178
|
}
|
|
179
|
+
function extractMessageQueryRows(payload) {
|
|
180
|
+
const record = asRecord(payload);
|
|
181
|
+
const data = asRecord(record?.data);
|
|
182
|
+
const rows = Array.isArray(record?.data) ? record.data
|
|
183
|
+
: Array.isArray(data?.messages) ? data.messages
|
|
184
|
+
: Array.isArray(data?.results) ? data.results
|
|
185
|
+
: Array.isArray(record?.messages) ? record.messages
|
|
186
|
+
: Array.isArray(payload) ? payload
|
|
187
|
+
: [];
|
|
188
|
+
return rows;
|
|
189
|
+
}
|
|
190
|
+
function hasValidRawMessageCausalTimestamp(row) {
|
|
191
|
+
const record = asRecord(row);
|
|
192
|
+
return typeof record?.dateCreated === "number"
|
|
193
|
+
&& Number.isFinite(record.dateCreated)
|
|
194
|
+
&& record.dateCreated > 0;
|
|
195
|
+
}
|
|
102
196
|
async function resolveChatGuidForIdentifier(config, channelConfig, chatIdentifier) {
|
|
103
197
|
const trimmedIdentifier = chatIdentifier.trim();
|
|
104
198
|
if (!trimmedIdentifier)
|
|
@@ -223,7 +317,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
223
317
|
const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/text", config.password);
|
|
224
318
|
const body = {
|
|
225
319
|
chatGuid: resolvedChatGuid,
|
|
226
|
-
tempGuid: (0, node_crypto_1.randomUUID)(),
|
|
320
|
+
tempGuid: params.tempGuid?.trim() || (0, node_crypto_1.randomUUID)(),
|
|
227
321
|
message: trimmedText,
|
|
228
322
|
};
|
|
229
323
|
if (params.replyToMessageGuid?.trim()) {
|
|
@@ -240,27 +334,70 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
240
334
|
hasReplyTarget: Boolean(params.replyToMessageGuid?.trim()),
|
|
241
335
|
},
|
|
242
336
|
});
|
|
243
|
-
const
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
337
|
+
const requestTimeoutSignal = AbortSignal.timeout(channelConfig.requestTimeoutMs);
|
|
338
|
+
if (params.beforeTransportInvocation && !params.beforeTransportInvocation()) {
|
|
339
|
+
throw new BlueBubblesSendError({
|
|
340
|
+
message: "BlueBubbles send was not admitted at the transport boundary.",
|
|
341
|
+
httpStatus: null,
|
|
342
|
+
errorCode: "admission_denied",
|
|
343
|
+
transportInvoked: false,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
params.onTransportInvocation?.();
|
|
347
|
+
let response;
|
|
348
|
+
try {
|
|
349
|
+
response = await fetch(url, {
|
|
350
|
+
method: "POST",
|
|
351
|
+
headers: { "Content-Type": "application/json" },
|
|
352
|
+
body: JSON.stringify(body),
|
|
353
|
+
redirect: "manual",
|
|
354
|
+
signal: params.signal
|
|
355
|
+
? AbortSignal.any([params.signal, requestTimeoutSignal])
|
|
356
|
+
: requestTimeoutSignal,
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
const errorCode = sendTransportErrorCode(error);
|
|
361
|
+
const reason = describeCaughtValue(error);
|
|
362
|
+
emitBlueBubblesSendError({ status: null, errorCode, reason });
|
|
363
|
+
throw new BlueBubblesSendError({
|
|
364
|
+
message: `BlueBubbles send failed (${errorCode}): ${reason}`,
|
|
365
|
+
httpStatus: null,
|
|
366
|
+
errorCode,
|
|
367
|
+
transportInvoked: true,
|
|
368
|
+
cause: error,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
249
371
|
if (!response.ok) {
|
|
250
372
|
const errorText = await response.text().catch(() => "");
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
message:
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
},
|
|
373
|
+
const reason = errorText || "unknown";
|
|
374
|
+
const errorCode = `http_${response.status}`;
|
|
375
|
+
emitBlueBubblesSendError({ status: response.status, errorCode, reason });
|
|
376
|
+
throw new BlueBubblesSendError({
|
|
377
|
+
message: `BlueBubbles send failed (${response.status}): ${reason}`,
|
|
378
|
+
httpStatus: response.status,
|
|
379
|
+
errorCode,
|
|
380
|
+
transportInvoked: true,
|
|
260
381
|
});
|
|
261
|
-
throw new Error(`BlueBubbles send failed (${response.status}): ${errorText || "unknown"}`);
|
|
262
382
|
}
|
|
263
|
-
const
|
|
383
|
+
const rawPayload = await response.text();
|
|
384
|
+
let payload = null;
|
|
385
|
+
if (rawPayload.trim()) {
|
|
386
|
+
try {
|
|
387
|
+
payload = JSON.parse(rawPayload);
|
|
388
|
+
}
|
|
389
|
+
catch (error) {
|
|
390
|
+
const errorCode = "malformed_response";
|
|
391
|
+
emitBlueBubblesSendError({ status: response.status, errorCode, reason: errorCode });
|
|
392
|
+
throw new BlueBubblesSendError({
|
|
393
|
+
message: `BlueBubbles send failed (${response.status}): malformed response`,
|
|
394
|
+
httpStatus: response.status,
|
|
395
|
+
errorCode,
|
|
396
|
+
transportInvoked: true,
|
|
397
|
+
cause: error,
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
}
|
|
264
401
|
const messageGuid = extractMessageGuid(payload);
|
|
265
402
|
(0, runtime_1.emitNervesEvent)({
|
|
266
403
|
component: "senses",
|
|
@@ -299,30 +436,32 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
299
436
|
throw new Error(`BlueBubbles edit failed (${response.status}): ${errorText || "unknown"}`);
|
|
300
437
|
}
|
|
301
438
|
},
|
|
302
|
-
async setTyping(chat, typing) {
|
|
439
|
+
async setTyping(chat, typing, signal) {
|
|
303
440
|
const resolvedChatGuid = await resolveChatGuid(chat, config, channelConfig);
|
|
304
441
|
if (!resolvedChatGuid) {
|
|
305
442
|
return;
|
|
306
443
|
}
|
|
307
444
|
const url = buildBlueBubblesApiUrl(config.serverUrl, `/api/v1/chat/${encodeURIComponent(resolvedChatGuid)}/typing`, config.password);
|
|
445
|
+
const requestTimeoutSignal = AbortSignal.timeout(channelConfig.requestTimeoutMs);
|
|
308
446
|
const response = await fetch(url, {
|
|
309
447
|
method: typing ? "POST" : "DELETE",
|
|
310
|
-
signal: AbortSignal.
|
|
448
|
+
signal: signal ? AbortSignal.any([signal, requestTimeoutSignal]) : requestTimeoutSignal,
|
|
311
449
|
});
|
|
312
450
|
if (!response.ok) {
|
|
313
451
|
const errorText = await response.text().catch(() => "");
|
|
314
452
|
throw new Error(`BlueBubbles typing failed (${response.status}): ${errorText || "unknown"}`);
|
|
315
453
|
}
|
|
316
454
|
},
|
|
317
|
-
async markChatRead(chat) {
|
|
455
|
+
async markChatRead(chat, signal) {
|
|
318
456
|
const resolvedChatGuid = await resolveChatGuid(chat, config, channelConfig);
|
|
319
457
|
if (!resolvedChatGuid) {
|
|
320
458
|
return;
|
|
321
459
|
}
|
|
322
460
|
const url = buildBlueBubblesApiUrl(config.serverUrl, `/api/v1/chat/${encodeURIComponent(resolvedChatGuid)}/read`, config.password);
|
|
461
|
+
const requestTimeoutSignal = AbortSignal.timeout(channelConfig.requestTimeoutMs);
|
|
323
462
|
const response = await fetch(url, {
|
|
324
463
|
method: "POST",
|
|
325
|
-
signal: AbortSignal.
|
|
464
|
+
signal: signal ? AbortSignal.any([signal, requestTimeoutSignal]) : requestTimeoutSignal,
|
|
326
465
|
});
|
|
327
466
|
if (!response.ok) {
|
|
328
467
|
const errorText = await response.text().catch(() => "");
|
|
@@ -330,19 +469,19 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
330
469
|
}
|
|
331
470
|
},
|
|
332
471
|
async checkHealth() {
|
|
333
|
-
const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/count", config.password);
|
|
334
472
|
(0, runtime_1.emitNervesEvent)({
|
|
335
473
|
component: "senses",
|
|
336
474
|
event: "senses.bluebubbles_healthcheck_start",
|
|
337
475
|
message: "probing bluebubbles upstream health",
|
|
338
476
|
meta: { serverUrl: config.serverUrl },
|
|
339
477
|
});
|
|
340
|
-
const
|
|
341
|
-
|
|
342
|
-
|
|
478
|
+
const result = await (0, bluebubbles_health_diagnostics_1.probeBlueBubblesHealth)({
|
|
479
|
+
serverUrl: config.serverUrl,
|
|
480
|
+
password: config.password,
|
|
481
|
+
requestTimeoutMs: channelConfig.requestTimeoutMs,
|
|
482
|
+
fetchImpl: fetch,
|
|
343
483
|
});
|
|
344
|
-
if (!
|
|
345
|
-
const errorText = await response.text().catch(() => "");
|
|
484
|
+
if (!result.ok) {
|
|
346
485
|
(0, runtime_1.emitNervesEvent)({
|
|
347
486
|
level: "warn",
|
|
348
487
|
component: "senses",
|
|
@@ -350,11 +489,13 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
350
489
|
message: "bluebubbles upstream health probe failed",
|
|
351
490
|
meta: {
|
|
352
491
|
serverUrl: config.serverUrl,
|
|
353
|
-
status:
|
|
354
|
-
reason:
|
|
492
|
+
status: result.status,
|
|
493
|
+
reason: result.reason,
|
|
494
|
+
classification: result.classification,
|
|
495
|
+
detail: (0, bluebubbles_health_diagnostics_1.redactBlueBubblesHealthDetailForNerves)(result.detail),
|
|
355
496
|
},
|
|
356
497
|
});
|
|
357
|
-
throw new Error(
|
|
498
|
+
throw new Error(result.detail);
|
|
358
499
|
}
|
|
359
500
|
(0, runtime_1.emitNervesEvent)({
|
|
360
501
|
component: "senses",
|
|
@@ -363,6 +504,96 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
363
504
|
meta: { serverUrl: config.serverUrl },
|
|
364
505
|
});
|
|
365
506
|
},
|
|
507
|
+
async queryRecentMessagesWithMetadata(params = {}) {
|
|
508
|
+
const limit = Math.max(1, Math.min(100, Math.floor(params.limit ?? 50)));
|
|
509
|
+
const offset = Math.max(0, Math.floor(params.offset ?? 0));
|
|
510
|
+
const url = buildBlueBubblesApiUrl(config.serverUrl, "/api/v1/message/query", config.password);
|
|
511
|
+
(0, runtime_1.emitNervesEvent)({
|
|
512
|
+
component: "senses",
|
|
513
|
+
event: "senses.bluebubbles_query_recent_start",
|
|
514
|
+
message: "querying recent bluebubbles messages",
|
|
515
|
+
meta: { limit, offset },
|
|
516
|
+
});
|
|
517
|
+
const request = {
|
|
518
|
+
limit,
|
|
519
|
+
offset,
|
|
520
|
+
sort: "DESC",
|
|
521
|
+
...(params.chatGuid?.trim() ? { chatGuid: params.chatGuid.trim() } : {}),
|
|
522
|
+
...(params.chatIdentifier?.trim() ? { chatIdentifier: params.chatIdentifier.trim() } : {}),
|
|
523
|
+
...(typeof params.beforeTimestamp === "number" && Number.isFinite(params.beforeTimestamp)
|
|
524
|
+
? { beforeTimestamp: params.beforeTimestamp }
|
|
525
|
+
: {}),
|
|
526
|
+
};
|
|
527
|
+
const { beforeTimestamp, ...wireRequest } = request;
|
|
528
|
+
const body = {
|
|
529
|
+
...wireRequest,
|
|
530
|
+
// BlueBubbles names its inclusive message-date upper bound `before`.
|
|
531
|
+
...(beforeTimestamp !== undefined ? { before: beforeTimestamp } : {}),
|
|
532
|
+
with: ["chats", "attachments", "payloadData", "messageSummaryInfo"],
|
|
533
|
+
};
|
|
534
|
+
const response = await fetch(url, {
|
|
535
|
+
method: "POST",
|
|
536
|
+
headers: { "Content-Type": "application/json" },
|
|
537
|
+
body: JSON.stringify(body),
|
|
538
|
+
signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
|
|
539
|
+
});
|
|
540
|
+
if (!response.ok) {
|
|
541
|
+
const errorText = await response.text().catch(() => "");
|
|
542
|
+
(0, runtime_1.emitNervesEvent)({
|
|
543
|
+
level: "warn",
|
|
544
|
+
component: "senses",
|
|
545
|
+
event: "senses.bluebubbles_query_recent_error",
|
|
546
|
+
message: "bluebubbles recent message query failed",
|
|
547
|
+
meta: {
|
|
548
|
+
status: response.status,
|
|
549
|
+
reason: errorText || "unknown",
|
|
550
|
+
},
|
|
551
|
+
});
|
|
552
|
+
throw new Error(`BlueBubbles recent message query failed (${response.status}): ${errorText || "unknown"}`);
|
|
553
|
+
}
|
|
554
|
+
const payload = await parseJsonBody(response);
|
|
555
|
+
const rows = extractMessageQueryRows(payload);
|
|
556
|
+
const invalidCausalTimestampRowCount = rows.filter((row) => !hasValidRawMessageCausalTimestamp(row)).length;
|
|
557
|
+
const messages = [];
|
|
558
|
+
for (const row of rows) {
|
|
559
|
+
try {
|
|
560
|
+
messages.push((0, model_1.normalizeBlueBubblesEvent)({ type: "new-message", data: row }));
|
|
561
|
+
}
|
|
562
|
+
catch (error) {
|
|
563
|
+
(0, runtime_1.emitNervesEvent)({
|
|
564
|
+
level: "warn",
|
|
565
|
+
component: "senses",
|
|
566
|
+
event: "senses.bluebubbles_query_recent_skip",
|
|
567
|
+
message: "skipped unusable bluebubbles recent message row",
|
|
568
|
+
meta: {
|
|
569
|
+
reason: describeCaughtValue(error),
|
|
570
|
+
},
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
(0, runtime_1.emitNervesEvent)({
|
|
575
|
+
component: "senses",
|
|
576
|
+
event: "senses.bluebubbles_query_recent_end",
|
|
577
|
+
message: "queried recent bluebubbles messages",
|
|
578
|
+
meta: {
|
|
579
|
+
rows: rows.length,
|
|
580
|
+
normalized: messages.length,
|
|
581
|
+
skipped: rows.length - messages.length,
|
|
582
|
+
},
|
|
583
|
+
});
|
|
584
|
+
return {
|
|
585
|
+
messages,
|
|
586
|
+
rawRowCount: rows.length,
|
|
587
|
+
normalizedRowCount: messages.length,
|
|
588
|
+
skippedRowCount: rows.length - messages.length,
|
|
589
|
+
invalidCausalTimestampRowCount,
|
|
590
|
+
request,
|
|
591
|
+
};
|
|
592
|
+
},
|
|
593
|
+
async listRecentMessages(params = {}) {
|
|
594
|
+
const result = await this.queryRecentMessagesWithMetadata(params);
|
|
595
|
+
return result.messages;
|
|
596
|
+
},
|
|
366
597
|
async repairEvent(event) {
|
|
367
598
|
if (!event.requiresRepair) {
|
|
368
599
|
(0, runtime_1.emitNervesEvent)({
|
|
@@ -377,6 +608,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
377
608
|
return event;
|
|
378
609
|
}
|
|
379
610
|
(0, runtime_1.emitNervesEvent)({
|
|
611
|
+
level: "warn",
|
|
380
612
|
component: "senses",
|
|
381
613
|
event: "senses.bluebubbles_repair_start",
|
|
382
614
|
message: "repairing bluebubbles event by guid",
|
|
@@ -423,13 +655,13 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
423
655
|
});
|
|
424
656
|
return repaired;
|
|
425
657
|
}
|
|
426
|
-
const normalized = (0,
|
|
658
|
+
const normalized = (0, model_1.normalizeBlueBubblesEvent)({
|
|
427
659
|
type: event.eventType,
|
|
428
660
|
data,
|
|
429
661
|
});
|
|
430
662
|
const recoveredMessage = event.kind === "mutation"
|
|
431
663
|
&& !event.shouldNotifyAgent
|
|
432
|
-
? (0,
|
|
664
|
+
? (0, model_1.normalizeBlueBubblesEvent)({
|
|
433
665
|
type: "new-message",
|
|
434
666
|
data,
|
|
435
667
|
})
|
|
@@ -440,8 +672,42 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
440
672
|
if (hydrated.kind === "message" &&
|
|
441
673
|
hydrated.balloonBundleId !== "com.apple.messages.URLBalloonProvider" &&
|
|
442
674
|
hydrated.attachments.length > 0) {
|
|
443
|
-
const
|
|
444
|
-
|
|
675
|
+
const agentConfig = (0, identity_1.loadAgentConfig)();
|
|
676
|
+
const chatModel = agentConfig.humanFacing.model;
|
|
677
|
+
const chatProvider = agentConfig.humanFacing.provider;
|
|
678
|
+
const vlmDescribe = async (params) => {
|
|
679
|
+
if (chatProvider !== "minimax") {
|
|
680
|
+
throw new Error("VLM fallback requires a minimax credential for this agent — " +
|
|
681
|
+
"configure one or switch to a vision-capable chat model");
|
|
682
|
+
}
|
|
683
|
+
const { readProviderCredentialRecord } = await Promise.resolve().then(() => __importStar(require("../../heart/provider-credentials")));
|
|
684
|
+
const credential = await readProviderCredentialRecord((0, identity_1.getAgentName)(), "minimax");
|
|
685
|
+
const apiKey = credential.ok ? credential.record.credentials.apiKey : undefined;
|
|
686
|
+
if (!apiKey) {
|
|
687
|
+
throw new Error("VLM fallback: minimax API key not found in the agent vault — " +
|
|
688
|
+
"run `ouro auth --agent <agent> --provider minimax`");
|
|
689
|
+
}
|
|
690
|
+
return (0, minimax_vlm_1.minimaxVlmDescribe)({
|
|
691
|
+
apiKey: String(apiKey),
|
|
692
|
+
prompt: params.prompt,
|
|
693
|
+
imageDataUrl: params.imageDataUrl,
|
|
694
|
+
baseURL: minimax_1.MINIMAX_PROVIDER_BASE_URL,
|
|
695
|
+
attachmentGuid: params.attachmentGuid,
|
|
696
|
+
mimeType: params.mimeType,
|
|
697
|
+
chatModel: params.chatModel,
|
|
698
|
+
});
|
|
699
|
+
};
|
|
700
|
+
// VLM prompt context wants the user's raw inbound text — NOT
|
|
701
|
+
// the agent-facing rendering, which now carries the attachment
|
|
702
|
+
// marker after the B2 fix. Pull it from the source payload.
|
|
703
|
+
const rawUserText = typeof data.text === "string"
|
|
704
|
+
? (data.text).trim()
|
|
705
|
+
: "";
|
|
706
|
+
const media = await (0, media_1.hydrateBlueBubblesAttachments)(hydrated.attachments, config, channelConfig, {
|
|
707
|
+
preferAudioInput: providerSupportsAudioInput(chatProvider),
|
|
708
|
+
chatModel,
|
|
709
|
+
vlmDescribe,
|
|
710
|
+
userText: rawUserText,
|
|
445
711
|
});
|
|
446
712
|
const transcriptSuffix = media.transcriptAdditions.map((entry) => `[${entry}]`).join("\n");
|
|
447
713
|
const noticeSuffix = media.notices.map((entry) => `[${entry}]`).join("\n");
|
|
@@ -453,6 +719,7 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
453
719
|
};
|
|
454
720
|
}
|
|
455
721
|
(0, runtime_1.emitNervesEvent)({
|
|
722
|
+
level: "warn",
|
|
456
723
|
component: "senses",
|
|
457
724
|
event: "senses.bluebubbles_repair_end",
|
|
458
725
|
message: "bluebubbles event repaired",
|
|
@@ -480,5 +747,53 @@ function createBlueBubblesClient(config = (0, config_1.getBlueBubblesConfig)(),
|
|
|
480
747
|
return applyRepairNotice(event, `BlueBubbles repair failed: ${reason}`);
|
|
481
748
|
}
|
|
482
749
|
},
|
|
750
|
+
async getMessageText(messageGuid) {
|
|
751
|
+
const url = buildRepairUrl(config.serverUrl, messageGuid, config.password);
|
|
752
|
+
try {
|
|
753
|
+
const response = await fetch(url, {
|
|
754
|
+
method: "GET",
|
|
755
|
+
signal: AbortSignal.timeout(channelConfig.requestTimeoutMs),
|
|
756
|
+
});
|
|
757
|
+
if (!response.ok) {
|
|
758
|
+
(0, runtime_1.emitNervesEvent)({
|
|
759
|
+
level: "warn",
|
|
760
|
+
component: "senses",
|
|
761
|
+
event: "senses.bluebubbles_get_message_text_error",
|
|
762
|
+
message: "failed to fetch message text",
|
|
763
|
+
meta: { messageGuid, status: response.status },
|
|
764
|
+
});
|
|
765
|
+
return null;
|
|
766
|
+
}
|
|
767
|
+
const payload = await parseJsonBody(response);
|
|
768
|
+
const data = extractRepairData(payload);
|
|
769
|
+
if (!data || typeof data.text !== "string") {
|
|
770
|
+
(0, runtime_1.emitNervesEvent)({
|
|
771
|
+
level: "warn",
|
|
772
|
+
component: "senses",
|
|
773
|
+
event: "senses.bluebubbles_get_message_text_error",
|
|
774
|
+
message: "message payload missing text field",
|
|
775
|
+
meta: { messageGuid, hasData: !!data, textType: data ? typeof data.text : "n/a" },
|
|
776
|
+
});
|
|
777
|
+
return null;
|
|
778
|
+
}
|
|
779
|
+
(0, runtime_1.emitNervesEvent)({
|
|
780
|
+
component: "senses",
|
|
781
|
+
event: "senses.bluebubbles_get_message_text",
|
|
782
|
+
message: "fetched message text by guid",
|
|
783
|
+
meta: { messageGuid },
|
|
784
|
+
});
|
|
785
|
+
return data.text.trim() || null;
|
|
786
|
+
}
|
|
787
|
+
catch (error) {
|
|
788
|
+
(0, runtime_1.emitNervesEvent)({
|
|
789
|
+
level: "warn",
|
|
790
|
+
component: "senses",
|
|
791
|
+
event: "senses.bluebubbles_get_message_text_error",
|
|
792
|
+
message: "exception fetching message text",
|
|
793
|
+
meta: { messageGuid, reason: error instanceof Error ? error.message : String(error) },
|
|
794
|
+
});
|
|
795
|
+
return null;
|
|
796
|
+
}
|
|
797
|
+
},
|
|
483
798
|
};
|
|
484
799
|
}
|