@ouro.bot/cli 0.1.0-alpha.73 → 0.1.0-alpha.731
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 +4645 -14
- 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-store.js +791 -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 +479 -0
- package/dist/heart/autonomy-budget.js +434 -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 +378 -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 +120 -129
- package/dist/heart/context-loss-gauntlet.js +354 -0
- package/dist/heart/context-loss-sentinel.js +1155 -0
- package/dist/heart/core.js +1763 -320
- 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 +8620 -0
- package/dist/heart/daemon/cli-help.js +705 -0
- package/dist/heart/daemon/cli-parse.js +2712 -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/daemon-cli.js +29 -2093
- package/dist/heart/daemon/daemon-entry.js +842 -10
- package/dist/heart/daemon/daemon-health.js +176 -0
- package/dist/heart/daemon/daemon-rollup.js +57 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +1610 -87
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +1689 -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 +41 -14
- package/dist/heart/daemon/runtime-metadata.js +2 -30
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +670 -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/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 +649 -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 +174 -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 +441 -0
- package/dist/heart/provider-failover.js +311 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -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/run-ledger.js +247 -0
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +398 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +20 -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 +339 -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 +472 -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 +811 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/cache-sync-cli.js +54 -0
- package/dist/mailroom/core.js +788 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +568 -0
- package/dist/mailroom/hosted-cache-sync.js +249 -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 +404 -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 +1058 -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/event-buffer.js +111 -0
- package/dist/nerves/index.js +234 -4
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/review/cli-main.js +5 -0
- package/dist/nerves/review/cli.js +156 -0
- package/dist/nerves/review/core.js +159 -0
- package/dist/nerves/runtime.js +5 -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 +104 -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-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 +258 -79
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +594 -0
- package/dist/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 +640 -312
- 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 +740 -0
- package/dist/senses/private-runtime.js +1212 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +424 -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/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/package.json +65 -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
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.migrateLocalMailroomToPlaintext = migrateLocalMailroomToPlaintext;
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const runtime_1 = require("../nerves/runtime");
|
|
40
|
+
function readJson(filePath) {
|
|
41
|
+
try {
|
|
42
|
+
return JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function listJsonEntries(dir) {
|
|
49
|
+
if (!fs.existsSync(dir))
|
|
50
|
+
return [];
|
|
51
|
+
return fs.readdirSync(dir).filter((name) => name.endsWith(".json"));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* One-time, idempotent cleanup of pre-plaintext residue.
|
|
55
|
+
*
|
|
56
|
+
* Wipes:
|
|
57
|
+
* - `messages/*.json` for this agent that are not already in the new plaintext
|
|
58
|
+
* shape (no `bodyForm: "plaintext"` AND no `private` field). Unparseable JSON
|
|
59
|
+
* also goes — we cannot safely keep ambiguous bytes.
|
|
60
|
+
* - `raw/*.json` files that look like an `EncryptedPayload` JSON wrapper (the
|
|
61
|
+
* pre-change raw-storage shape). Plaintext `.eml` files are preserved.
|
|
62
|
+
* Non-EncryptedPayload JSON in `raw/` is left alone.
|
|
63
|
+
* - Coverage records in `searchCacheRoot/coverage/` whose `storeKind` is no
|
|
64
|
+
* longer reachable (`azure-blob` from a previous hosted attachment) or whose
|
|
65
|
+
* JSON is unreadable. `file` coverage records are preserved.
|
|
66
|
+
* - Orphan search-cache docs in `searchCacheRoot/*.json` that belong to this
|
|
67
|
+
* agent but reference a `messageId` no longer present in `messages/`.
|
|
68
|
+
*
|
|
69
|
+
* Idempotent: a second run finds nothing to wipe and returns zeroed counts.
|
|
70
|
+
*/
|
|
71
|
+
function migrateLocalMailroomToPlaintext(input) {
|
|
72
|
+
const messagesDir = path.join(input.mailroomRoot, "messages");
|
|
73
|
+
const rawDir = path.join(input.mailroomRoot, "raw");
|
|
74
|
+
const coverageDir = path.join(input.searchCacheRoot, "coverage");
|
|
75
|
+
let wipedEnvelopes = 0;
|
|
76
|
+
let wipedRaw = 0;
|
|
77
|
+
let wipedCoverageRecords = 0;
|
|
78
|
+
let wipedOrphanSearchDocs = 0;
|
|
79
|
+
// 1. Messages: drop pre-plaintext or malformed shapes for this agent.
|
|
80
|
+
const surviving = new Set();
|
|
81
|
+
for (const entry of listJsonEntries(messagesDir)) {
|
|
82
|
+
const filePath = path.join(messagesDir, entry);
|
|
83
|
+
const value = readJson(filePath);
|
|
84
|
+
if (value === null) {
|
|
85
|
+
// Unparseable JSON — we cannot tell whose it is or what shape, but the
|
|
86
|
+
// pre-change codebase wrote message JSON here; treat as wipeable.
|
|
87
|
+
fs.unlinkSync(filePath);
|
|
88
|
+
wipedEnvelopes += 1;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const isCurrentShape = value.bodyForm === "plaintext" && value.private !== undefined && value.private !== null;
|
|
92
|
+
if (isCurrentShape) {
|
|
93
|
+
const stem = entry.slice(0, -".json".length);
|
|
94
|
+
surviving.add(stem);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
// We don't restrict to a specific agentId here because the file store is
|
|
98
|
+
// single-agent: the bundle owns this directory and the migration is
|
|
99
|
+
// initiated from inside that bundle.
|
|
100
|
+
fs.unlinkSync(filePath);
|
|
101
|
+
wipedEnvelopes += 1;
|
|
102
|
+
}
|
|
103
|
+
// 2. Raw artifacts: drop pre-change encrypted JSON wrappers.
|
|
104
|
+
if (fs.existsSync(rawDir)) {
|
|
105
|
+
for (const entry of fs.readdirSync(rawDir)) {
|
|
106
|
+
if (!entry.endsWith(".json"))
|
|
107
|
+
continue;
|
|
108
|
+
const filePath = path.join(rawDir, entry);
|
|
109
|
+
const value = readJson(filePath);
|
|
110
|
+
const isEncryptedPayload = value !== null
|
|
111
|
+
&& typeof value.algorithm === "string"
|
|
112
|
+
&& value.algorithm.startsWith("RSA-OAEP")
|
|
113
|
+
&& typeof value.ciphertext === "string";
|
|
114
|
+
if (!isEncryptedPayload)
|
|
115
|
+
continue;
|
|
116
|
+
fs.unlinkSync(filePath);
|
|
117
|
+
wipedRaw += 1;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// 3. Coverage records: drop azure-blob (no longer reachable) and malformed.
|
|
121
|
+
for (const entry of listJsonEntries(coverageDir)) {
|
|
122
|
+
const filePath = path.join(coverageDir, entry);
|
|
123
|
+
const value = readJson(filePath);
|
|
124
|
+
if (value === null) {
|
|
125
|
+
fs.unlinkSync(filePath);
|
|
126
|
+
wipedCoverageRecords += 1;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (value.agentId !== input.agentId)
|
|
130
|
+
continue;
|
|
131
|
+
if (value.storeKind === "file")
|
|
132
|
+
continue;
|
|
133
|
+
fs.unlinkSync(filePath);
|
|
134
|
+
wipedCoverageRecords += 1;
|
|
135
|
+
}
|
|
136
|
+
// 4. Orphan search-cache docs.
|
|
137
|
+
for (const entry of listJsonEntries(input.searchCacheRoot)) {
|
|
138
|
+
const filePath = path.join(input.searchCacheRoot, entry);
|
|
139
|
+
const value = readJson(filePath);
|
|
140
|
+
if (value === null)
|
|
141
|
+
continue;
|
|
142
|
+
if (value.agentId !== input.agentId)
|
|
143
|
+
continue;
|
|
144
|
+
if (typeof value.messageId !== "string")
|
|
145
|
+
continue;
|
|
146
|
+
if (surviving.has(value.messageId))
|
|
147
|
+
continue;
|
|
148
|
+
fs.unlinkSync(filePath);
|
|
149
|
+
wipedOrphanSearchDocs += 1;
|
|
150
|
+
}
|
|
151
|
+
(0, runtime_1.emitNervesEvent)({
|
|
152
|
+
component: "senses",
|
|
153
|
+
event: "senses.mail_local_migration_executed",
|
|
154
|
+
message: "local mailroom plaintext migration executed",
|
|
155
|
+
meta: {
|
|
156
|
+
agentId: input.agentId,
|
|
157
|
+
wipedEnvelopes,
|
|
158
|
+
wipedRaw,
|
|
159
|
+
wipedCoverageRecords,
|
|
160
|
+
wipedOrphanSearchDocs,
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
return { wipedEnvelopes, wipedRaw, wipedCoverageRecords, wipedOrphanSearchDocs };
|
|
164
|
+
}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.parseAcsEmailDeliveryReportEvent = void 0;
|
|
37
|
+
exports.createAcsEmailProviderClient = createAcsEmailProviderClient;
|
|
38
|
+
exports.resolveOutboundProviderClient = resolveOutboundProviderClient;
|
|
39
|
+
exports.resolveOutboundTransport = resolveOutboundTransport;
|
|
40
|
+
exports.createMailDraft = createMailDraft;
|
|
41
|
+
exports.confirmMailDraftSend = confirmMailDraftSend;
|
|
42
|
+
exports.listMailOutboundRecords = listMailOutboundRecords;
|
|
43
|
+
exports.reconcileOutboundDeliveryEvent = reconcileOutboundDeliveryEvent;
|
|
44
|
+
const crypto = __importStar(require("node:crypto"));
|
|
45
|
+
const fs = __importStar(require("node:fs"));
|
|
46
|
+
const path = __importStar(require("node:path"));
|
|
47
|
+
const runtime_1 = require("../nerves/runtime");
|
|
48
|
+
const autonomy_1 = require("./autonomy");
|
|
49
|
+
const core_1 = require("./core");
|
|
50
|
+
Object.defineProperty(exports, "parseAcsEmailDeliveryReportEvent", { enumerable: true, get: function () { return core_1.parseAcsEmailDeliveryReportEvent; } });
|
|
51
|
+
function isRecord(value) {
|
|
52
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
53
|
+
}
|
|
54
|
+
function textField(value, key) {
|
|
55
|
+
const raw = value[key];
|
|
56
|
+
return typeof raw === "string" ? raw.trim() : "";
|
|
57
|
+
}
|
|
58
|
+
function credentialFields(value) {
|
|
59
|
+
if (!isRecord(value))
|
|
60
|
+
return undefined;
|
|
61
|
+
const accessKey = textField(value, "accessKey");
|
|
62
|
+
const connectionString = textField(value, "connectionString");
|
|
63
|
+
const fields = {
|
|
64
|
+
...(accessKey ? { accessKey } : {}),
|
|
65
|
+
...(connectionString ? { connectionString } : {}),
|
|
66
|
+
};
|
|
67
|
+
return Object.keys(fields).length > 0 ? fields : undefined;
|
|
68
|
+
}
|
|
69
|
+
function normalizeList(values) {
|
|
70
|
+
return values
|
|
71
|
+
.map((value) => value.trim())
|
|
72
|
+
.filter(Boolean)
|
|
73
|
+
.map(core_1.normalizeMailAddress);
|
|
74
|
+
}
|
|
75
|
+
function contentHash(body) {
|
|
76
|
+
return crypto.createHash("sha256").update(body, "utf-8").digest("base64");
|
|
77
|
+
}
|
|
78
|
+
function hmacSignature(input) {
|
|
79
|
+
const stringToSign = `${input.method}\n${input.pathAndQuery}\n${input.date};${input.host};${input.contentHash}`;
|
|
80
|
+
return crypto.createHmac("sha256", Buffer.from(input.accessKey, "base64")).update(stringToSign, "utf-8").digest("base64");
|
|
81
|
+
}
|
|
82
|
+
function recipientObjects(addresses) {
|
|
83
|
+
return addresses.map((address) => ({ address }));
|
|
84
|
+
}
|
|
85
|
+
function providerMessageIdFromOperationLocation(operationLocation) {
|
|
86
|
+
const match = operationLocation.match(/\/operations\/([^?/#]+)/);
|
|
87
|
+
return match?.[1] ?? "";
|
|
88
|
+
}
|
|
89
|
+
function createAcsEmailProviderClient(input) {
|
|
90
|
+
const endpoint = input.endpoint.replace(/\/+$/, "");
|
|
91
|
+
const fetchImpl = input.fetch ?? fetch;
|
|
92
|
+
return {
|
|
93
|
+
async submit(submitInput) {
|
|
94
|
+
const url = new URL(`${endpoint}/emails:send?api-version=2025-09-01`);
|
|
95
|
+
const senderAddress = submitInput.transport.senderAddress ?? submitInput.draft.from;
|
|
96
|
+
const body = JSON.stringify({
|
|
97
|
+
senderAddress,
|
|
98
|
+
recipients: {
|
|
99
|
+
to: recipientObjects(submitInput.draft.to),
|
|
100
|
+
cc: recipientObjects(submitInput.draft.cc),
|
|
101
|
+
bcc: recipientObjects(submitInput.draft.bcc),
|
|
102
|
+
},
|
|
103
|
+
content: {
|
|
104
|
+
subject: submitInput.draft.subject,
|
|
105
|
+
plainText: submitInput.draft.text,
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
const date = (input.now ?? (() => new Date()))().toUTCString();
|
|
109
|
+
const hash = contentHash(body);
|
|
110
|
+
const signature = hmacSignature({
|
|
111
|
+
method: "POST",
|
|
112
|
+
pathAndQuery: `${url.pathname}${url.search}`,
|
|
113
|
+
date,
|
|
114
|
+
host: url.host,
|
|
115
|
+
contentHash: hash,
|
|
116
|
+
accessKey: input.accessKey,
|
|
117
|
+
});
|
|
118
|
+
const response = await fetchImpl(url.toString(), {
|
|
119
|
+
method: "POST",
|
|
120
|
+
headers: {
|
|
121
|
+
"content-type": "application/json",
|
|
122
|
+
"x-ms-date": date,
|
|
123
|
+
"x-ms-content-sha256": hash,
|
|
124
|
+
authorization: `HMAC-SHA256 SignedHeaders=x-ms-date;host;x-ms-content-sha256&Signature=${signature}`,
|
|
125
|
+
},
|
|
126
|
+
body,
|
|
127
|
+
});
|
|
128
|
+
const operationLocation = response.headers.get("operation-location") ?? undefined;
|
|
129
|
+
const providerRequestId = response.headers.get("x-ms-request-id") ?? undefined;
|
|
130
|
+
const payload = await response.json().catch(() => ({}));
|
|
131
|
+
if (!response.ok) {
|
|
132
|
+
const reason = typeof payload.error?.message === "string" ? payload.error.message : `HTTP ${response.status}`;
|
|
133
|
+
throw new Error(`ACS outbound send failed: ${reason}`);
|
|
134
|
+
}
|
|
135
|
+
const providerMessageId = typeof payload.id === "string"
|
|
136
|
+
? payload.id
|
|
137
|
+
: operationLocation
|
|
138
|
+
? providerMessageIdFromOperationLocation(operationLocation)
|
|
139
|
+
: "";
|
|
140
|
+
if (!providerMessageId)
|
|
141
|
+
throw new Error("ACS outbound send did not return an operation id");
|
|
142
|
+
return {
|
|
143
|
+
provider: "azure-communication-services",
|
|
144
|
+
providerMessageId,
|
|
145
|
+
...(operationLocation ? { operationLocation } : {}),
|
|
146
|
+
...(providerRequestId ? { providerRequestId } : {}),
|
|
147
|
+
submittedAt: submitInput.submittedAt,
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
async function resolveOutboundProviderClient(transport, reader, options = {}) {
|
|
153
|
+
if (transport.kind !== "azure-communication-services")
|
|
154
|
+
return undefined;
|
|
155
|
+
const credentialItem = transport.credentialItem?.trim();
|
|
156
|
+
if (!credentialItem) {
|
|
157
|
+
throw new Error("outbound Azure Communication Services transport is missing credentialItem");
|
|
158
|
+
}
|
|
159
|
+
const accessKeyField = transport.credentialFields?.accessKey?.trim() || "accessKey";
|
|
160
|
+
const accessKey = (await reader.readSecretField(credentialItem, accessKeyField)).trim();
|
|
161
|
+
if (!accessKey) {
|
|
162
|
+
throw new Error(`outbound Azure Communication Services required secret field ${accessKeyField} is blank`);
|
|
163
|
+
}
|
|
164
|
+
return createAcsEmailProviderClient({
|
|
165
|
+
endpoint: transport.endpoint,
|
|
166
|
+
accessKey,
|
|
167
|
+
...(options.fetch ? { fetch: options.fetch } : {}),
|
|
168
|
+
...(options.now ? { now: options.now } : {}),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function draftId() {
|
|
172
|
+
return `draft_${crypto.randomBytes(12).toString("hex")}`;
|
|
173
|
+
}
|
|
174
|
+
function ensureRecipients(to) {
|
|
175
|
+
if (to.length === 0)
|
|
176
|
+
throw new Error("at least one recipient is required");
|
|
177
|
+
}
|
|
178
|
+
function resolveOutboundTransport(config) {
|
|
179
|
+
const outbound = isRecord(config) && isRecord(config.outbound) ? config.outbound : null;
|
|
180
|
+
if (!outbound) {
|
|
181
|
+
throw new Error("outbound mail transport is not configured; human-required: set mailroom.outbound before confirmed sends");
|
|
182
|
+
}
|
|
183
|
+
const transport = textField(outbound, "transport");
|
|
184
|
+
if (transport === "local-sink") {
|
|
185
|
+
const sinkPath = textField(outbound, "sinkPath");
|
|
186
|
+
if (!sinkPath)
|
|
187
|
+
throw new Error("outbound local-sink transport is missing sinkPath");
|
|
188
|
+
return { kind: "local-sink", sinkPath };
|
|
189
|
+
}
|
|
190
|
+
if (transport === "azure-communication-services") {
|
|
191
|
+
if ("credentialItemNoteQuery" in outbound || "noteQuery" in outbound || "notes" in outbound) {
|
|
192
|
+
throw new Error("outbound provider binding must not infer credentials from vault notes");
|
|
193
|
+
}
|
|
194
|
+
const endpoint = textField(outbound, "endpoint");
|
|
195
|
+
if (!endpoint)
|
|
196
|
+
throw new Error("outbound Azure Communication Services transport is missing endpoint");
|
|
197
|
+
const senderAddress = textField(outbound, "senderAddress");
|
|
198
|
+
const credentialItem = textField(outbound, "credentialItem");
|
|
199
|
+
const fields = credentialFields(outbound.credentialFields);
|
|
200
|
+
return {
|
|
201
|
+
kind: "azure-communication-services",
|
|
202
|
+
endpoint,
|
|
203
|
+
...(senderAddress ? { senderAddress } : {}),
|
|
204
|
+
...(credentialItem ? { credentialItem } : {}),
|
|
205
|
+
...(fields ? { credentialFields: fields } : {}),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
throw new Error("outbound mail transport is not configured; human-required: choose local-sink or azure-communication-services");
|
|
209
|
+
}
|
|
210
|
+
async function createMailDraft(input) {
|
|
211
|
+
const now = (input.now ?? (() => new Date()))().toISOString();
|
|
212
|
+
const to = normalizeList(input.to);
|
|
213
|
+
ensureRecipients(to);
|
|
214
|
+
const record = {
|
|
215
|
+
schemaVersion: 1,
|
|
216
|
+
id: draftId(),
|
|
217
|
+
agentId: input.agentId,
|
|
218
|
+
status: "draft",
|
|
219
|
+
mailboxRole: "agent-native-mailbox",
|
|
220
|
+
sendAuthority: "agent-native",
|
|
221
|
+
ownerEmail: null,
|
|
222
|
+
source: null,
|
|
223
|
+
from: (0, core_1.normalizeMailAddress)(input.from),
|
|
224
|
+
to,
|
|
225
|
+
cc: normalizeList(input.cc ?? []),
|
|
226
|
+
bcc: normalizeList(input.bcc ?? []),
|
|
227
|
+
subject: input.subject.trim(),
|
|
228
|
+
text: input.text,
|
|
229
|
+
actor: input.actor,
|
|
230
|
+
reason: input.reason,
|
|
231
|
+
createdAt: now,
|
|
232
|
+
updatedAt: now,
|
|
233
|
+
};
|
|
234
|
+
await input.store.upsertMailOutbound(record);
|
|
235
|
+
(0, runtime_1.emitNervesEvent)({
|
|
236
|
+
component: "senses",
|
|
237
|
+
event: "senses.mail_draft_created",
|
|
238
|
+
message: "mail draft created",
|
|
239
|
+
meta: { agentId: record.agentId, id: record.id, toCount: record.to.length },
|
|
240
|
+
});
|
|
241
|
+
return record;
|
|
242
|
+
}
|
|
243
|
+
function appendLocalSink(transport, record, sentAt) {
|
|
244
|
+
fs.mkdirSync(path.dirname(transport.sinkPath), { recursive: true });
|
|
245
|
+
const transportMessageId = `local_${crypto.randomBytes(10).toString("hex")}`;
|
|
246
|
+
fs.appendFileSync(transport.sinkPath, `${JSON.stringify({
|
|
247
|
+
schemaVersion: 1,
|
|
248
|
+
transportMessageId,
|
|
249
|
+
draftId: record.id,
|
|
250
|
+
agentId: record.agentId,
|
|
251
|
+
from: record.from,
|
|
252
|
+
to: record.to,
|
|
253
|
+
cc: record.cc,
|
|
254
|
+
bcc: record.bcc,
|
|
255
|
+
subject: record.subject,
|
|
256
|
+
text: record.text,
|
|
257
|
+
sendMode: record.sendMode,
|
|
258
|
+
policyId: record.policyDecision?.policyId ?? null,
|
|
259
|
+
sentAt,
|
|
260
|
+
})}\n`, "utf-8");
|
|
261
|
+
return transportMessageId;
|
|
262
|
+
}
|
|
263
|
+
function transportSend(transport, record, sentAt) {
|
|
264
|
+
return appendLocalSink(transport, record, sentAt);
|
|
265
|
+
}
|
|
266
|
+
async function confirmMailDraftSend(input) {
|
|
267
|
+
const draft = await input.store.getMailOutbound(input.draftId);
|
|
268
|
+
if (!draft || draft.agentId !== input.agentId)
|
|
269
|
+
throw new Error(`No draft found for ${input.draftId}`);
|
|
270
|
+
if (draft.status !== "draft")
|
|
271
|
+
throw new Error(`Draft ${input.draftId} is already ${draft.status}`);
|
|
272
|
+
const sentAt = (input.now ?? (() => new Date()))().toISOString();
|
|
273
|
+
const recentOutbound = await input.store.listMailOutbound(input.agentId);
|
|
274
|
+
const policyDecision = input.autonomous
|
|
275
|
+
? (() => {
|
|
276
|
+
if (!input.autonomyPolicy) {
|
|
277
|
+
throw new Error("Autonomous mail sending requires an enabled native-agent policy");
|
|
278
|
+
}
|
|
279
|
+
const decision = (0, autonomy_1.evaluateNativeMailSendPolicy)({
|
|
280
|
+
policy: input.autonomyPolicy,
|
|
281
|
+
draft,
|
|
282
|
+
recentOutbound,
|
|
283
|
+
now: new Date(sentAt),
|
|
284
|
+
});
|
|
285
|
+
if (!decision.allowed) {
|
|
286
|
+
if (decision.mode === "confirmation-required") {
|
|
287
|
+
throw new Error(`Autonomous mail send ${decision.code} requires confirmation=CONFIRM_SEND: ${decision.reason}`);
|
|
288
|
+
}
|
|
289
|
+
throw new Error(`${decision.code}: ${decision.reason}`);
|
|
290
|
+
}
|
|
291
|
+
return decision;
|
|
292
|
+
})()
|
|
293
|
+
: (() => {
|
|
294
|
+
if (input.confirmation !== "CONFIRM_SEND") {
|
|
295
|
+
throw new Error("mail_send requires confirmation=CONFIRM_SEND before any outbound mail leaves the agent");
|
|
296
|
+
}
|
|
297
|
+
return (0, autonomy_1.buildConfirmedMailSendDecision)({
|
|
298
|
+
draft,
|
|
299
|
+
policy: input.autonomyPolicy,
|
|
300
|
+
now: new Date(sentAt),
|
|
301
|
+
});
|
|
302
|
+
})();
|
|
303
|
+
const pendingSent = {
|
|
304
|
+
...draft,
|
|
305
|
+
status: input.transport.kind === "local-sink" ? "sent" : "submitted",
|
|
306
|
+
actor: input.actor,
|
|
307
|
+
reason: input.reason,
|
|
308
|
+
updatedAt: sentAt,
|
|
309
|
+
sendMode: input.autonomous ? "autonomous" : "confirmed",
|
|
310
|
+
policyDecision,
|
|
311
|
+
sentAt,
|
|
312
|
+
};
|
|
313
|
+
if (input.transport.kind === "azure-communication-services") {
|
|
314
|
+
if (!input.providerClient) {
|
|
315
|
+
throw new Error("Azure Communication Services outbound send is configured but not enabled on this machine; human-required setup is still needed");
|
|
316
|
+
}
|
|
317
|
+
const submission = await input.providerClient.submit({
|
|
318
|
+
draft: pendingSent,
|
|
319
|
+
transport: input.transport,
|
|
320
|
+
submittedAt: sentAt,
|
|
321
|
+
});
|
|
322
|
+
const submitted = {
|
|
323
|
+
...(0, core_1.buildMailProviderSubmission)({
|
|
324
|
+
draft: pendingSent,
|
|
325
|
+
provider: submission.provider,
|
|
326
|
+
providerMessageId: submission.providerMessageId,
|
|
327
|
+
submittedAt: submission.submittedAt ?? sentAt,
|
|
328
|
+
...(submission.operationLocation ? { operationLocation: submission.operationLocation } : {}),
|
|
329
|
+
...(submission.providerRequestId ? { providerRequestId: submission.providerRequestId } : {}),
|
|
330
|
+
}),
|
|
331
|
+
transport: input.transport.kind,
|
|
332
|
+
};
|
|
333
|
+
await input.store.upsertMailOutbound(submitted);
|
|
334
|
+
(0, runtime_1.emitNervesEvent)({
|
|
335
|
+
component: "senses",
|
|
336
|
+
event: "senses.mail_draft_submitted",
|
|
337
|
+
message: "mail draft submitted to outbound provider",
|
|
338
|
+
meta: { agentId: submitted.agentId, id: submitted.id, provider: submitted.provider, providerMessageId: submitted.providerMessageId },
|
|
339
|
+
});
|
|
340
|
+
return submitted;
|
|
341
|
+
}
|
|
342
|
+
const transportMessageId = transportSend(input.transport, pendingSent, sentAt);
|
|
343
|
+
const sent = {
|
|
344
|
+
...pendingSent,
|
|
345
|
+
transport: input.transport.kind,
|
|
346
|
+
transportMessageId,
|
|
347
|
+
};
|
|
348
|
+
await input.store.upsertMailOutbound(sent);
|
|
349
|
+
(0, runtime_1.emitNervesEvent)({
|
|
350
|
+
component: "senses",
|
|
351
|
+
event: "senses.mail_draft_sent",
|
|
352
|
+
message: "mail draft sent",
|
|
353
|
+
meta: { agentId: sent.agentId, id: sent.id, transport: sent.transport },
|
|
354
|
+
});
|
|
355
|
+
return sent;
|
|
356
|
+
}
|
|
357
|
+
function listMailOutboundRecords(store, agentId) {
|
|
358
|
+
return store.listMailOutbound(agentId);
|
|
359
|
+
}
|
|
360
|
+
async function reconcileOutboundDeliveryEvent(input) {
|
|
361
|
+
const records = await input.store.listMailOutbound(input.agentId);
|
|
362
|
+
const outbound = records.find((record) => record.providerMessageId === input.event.providerMessageId);
|
|
363
|
+
if (!outbound)
|
|
364
|
+
throw new Error(`No outbound record found for provider message ${input.event.providerMessageId}`);
|
|
365
|
+
const updated = (0, core_1.reconcileMailDeliveryEvent)({ outbound, event: input.event });
|
|
366
|
+
await input.store.upsertMailOutbound(updated);
|
|
367
|
+
(0, runtime_1.emitNervesEvent)({
|
|
368
|
+
component: "senses",
|
|
369
|
+
event: "senses.mail_delivery_event_reconciled",
|
|
370
|
+
message: "mail delivery event reconciled",
|
|
371
|
+
meta: {
|
|
372
|
+
agentId: updated.agentId,
|
|
373
|
+
id: updated.id,
|
|
374
|
+
provider: input.event.provider,
|
|
375
|
+
providerEventId: input.event.providerEventId,
|
|
376
|
+
outcome: input.event.outcome,
|
|
377
|
+
},
|
|
378
|
+
});
|
|
379
|
+
return updated;
|
|
380
|
+
}
|