@ouro.bot/cli 0.1.0-alpha.69 → 0.1.0-alpha.691
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -23
- package/RepairGuide.ouro/agent.json +5 -0
- package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
- package/RepairGuide.ouro/psyche/SOUL.md +55 -0
- package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
- package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
- package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
- package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/changelog.json +4398 -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 +810 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +326 -0
- package/dist/arc/packets.js +288 -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 +867 -43
- package/dist/heart/agent-entry.js +160 -3
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/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/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 +122 -119
- package/dist/heart/context-loss-gauntlet.js +354 -0
- package/dist/heart/context-loss-sentinel.js +993 -0
- package/dist/heart/core.js +1297 -269
- 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 +523 -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-health-diagnostics.js +122 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +780 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +8100 -0
- package/dist/heart/daemon/cli-help.js +601 -0
- package/dist/heart/daemon/cli-parse.js +1995 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +770 -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 -1814
- package/dist/heart/daemon/daemon-entry.js +668 -6
- 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 +1222 -84
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +873 -0
- package/dist/heart/daemon/habit-private-wake.js +56 -0
- package/dist/heart/daemon/health-monitor.js +131 -3
- 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 +110 -0
- package/dist/heart/daemon/mcp-canary.js +297 -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 +14 -12
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/plugin-cli.js +432 -0
- package/dist/heart/daemon/process-manager.js +519 -40
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/pulse.js +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 +583 -43
- 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 +171 -12
- package/dist/heart/daemon/stale-bundle-prune.js +96 -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-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +211 -0
- package/dist/heart/habits/habit-runtime-state.js +114 -0
- package/dist/heart/habits/habit-scheduler.js +411 -0
- package/dist/heart/habits/habit-session-summary.js +318 -0
- package/dist/heart/habits/habit-session.js +618 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +51 -57
- 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 -58
- 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 +96 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +375 -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 +37 -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 +815 -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 +19 -0
- package/dist/heart/orientation-frame.js +217 -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 +134 -0
- package/dist/heart/provider-binding-resolver.js +273 -0
- package/dist/heart/provider-credentials.js +425 -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 +139 -52
- package/dist/heart/providers/azure.js +23 -11
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +145 -0
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +26 -8
- package/dist/heart/providers/openai-codex-token.js +349 -0
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +389 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +17 -4
- package/dist/heart/session-activity.js +90 -24
- package/dist/heart/session-events.js +1133 -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 +365 -0
- package/dist/heart/streaming.js +44 -27
- 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-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 +450 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +426 -0
- package/dist/heart/versioning/ouro-version-manager.js +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/work-card.js +390 -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 +715 -0
- package/dist/mailroom/body-cache.js +61 -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/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 +233 -0
- package/dist/mailroom/search-cache.js +334 -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 +250 -101
- 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 +221 -0
- package/dist/mind/pending.js +13 -8
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1009 -169
- 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/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/event-buffer.js +111 -0
- package/dist/nerves/index.js +224 -4
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/review/cli-main.js +5 -0
- package/dist/nerves/review/cli.js +156 -0
- package/dist/nerves/review/core.js +152 -0
- package/dist/nerves/runtime.js +5 -1
- package/dist/repertoire/ado-client.js +15 -56
- package/dist/repertoire/ado-semantic.js +16 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +1042 -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 +159 -27
- 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-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 +63 -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-mail.js +1975 -0
- package/dist/repertoire/tools-notes.js +459 -0
- package/dist/repertoire/tools-obligations.js +143 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +482 -0
- package/dist/repertoire/tools-runtime.js +150 -0
- package/dist/repertoire/tools-session.js +881 -0
- package/dist/repertoire/tools-shell.js +120 -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 +250 -80
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +594 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/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} +219 -18
- package/dist/senses/bluebubbles/entry.js +77 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
- package/dist/senses/bluebubbles/index.js +2732 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +33 -12
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +3 -3
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/replay.js +137 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/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 +240 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli-layout.js +100 -0
- package/dist/senses/cli.js +521 -214
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +160 -0
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +395 -0
- package/dist/senses/pipeline.js +873 -179
- package/dist/senses/private-runtime-worker.js +584 -0
- package/dist/senses/private-runtime.js +1145 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +416 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +397 -112
- 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 +5077 -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 +57 -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 -351
- 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
|
@@ -7,61 +7,20 @@ exports.graphRequest = graphRequest;
|
|
|
7
7
|
exports.getProfile = getProfile;
|
|
8
8
|
const api_error_1 = require("../heart/api-error");
|
|
9
9
|
const runtime_1 = require("../nerves/runtime");
|
|
10
|
+
const api_client_1 = require("./api-client");
|
|
10
11
|
const GRAPH_BASE = "https://graph.microsoft.com/v1.0";
|
|
11
12
|
// Generic Graph API request. Returns response body as pretty-printed JSON string.
|
|
12
13
|
async function graphRequest(token, method, path, body) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
headers: {
|
|
24
|
-
Authorization: `Bearer ${token}`,
|
|
25
|
-
"Content-Type": "application/json",
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
if (body)
|
|
29
|
-
opts.body = body;
|
|
30
|
-
const res = await fetch(url, opts);
|
|
31
|
-
if (!res.ok) {
|
|
32
|
-
(0, runtime_1.emitNervesEvent)({
|
|
33
|
-
level: "error",
|
|
34
|
-
event: "client.error",
|
|
35
|
-
component: "clients",
|
|
36
|
-
message: "Graph request failed",
|
|
37
|
-
meta: { client: "graph", method, path, status: res.status },
|
|
38
|
-
});
|
|
39
|
-
return (0, api_error_1.handleApiError)(res, "Graph", "graph");
|
|
40
|
-
}
|
|
41
|
-
const data = await res.json();
|
|
42
|
-
(0, runtime_1.emitNervesEvent)({
|
|
43
|
-
event: "client.request_end",
|
|
44
|
-
component: "clients",
|
|
45
|
-
message: "Graph request completed",
|
|
46
|
-
meta: { client: "graph", method, path, success: true },
|
|
47
|
-
});
|
|
48
|
-
return JSON.stringify(data, null, 2);
|
|
49
|
-
}
|
|
50
|
-
catch (err) {
|
|
51
|
-
(0, runtime_1.emitNervesEvent)({
|
|
52
|
-
level: "error",
|
|
53
|
-
event: "client.error",
|
|
54
|
-
component: "clients",
|
|
55
|
-
message: "Graph request threw exception",
|
|
56
|
-
meta: {
|
|
57
|
-
client: "graph",
|
|
58
|
-
method,
|
|
59
|
-
path,
|
|
60
|
-
reason: err instanceof Error ? err.message : String(err),
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
return (0, api_error_1.handleApiError)(err, "Graph", "graph");
|
|
64
|
-
}
|
|
14
|
+
return (0, api_client_1.apiRequest)({
|
|
15
|
+
baseUrl: GRAPH_BASE,
|
|
16
|
+
method,
|
|
17
|
+
path,
|
|
18
|
+
token,
|
|
19
|
+
clientName: "graph",
|
|
20
|
+
serviceLabel: "Graph",
|
|
21
|
+
connectionName: "graph",
|
|
22
|
+
body,
|
|
23
|
+
});
|
|
65
24
|
}
|
|
66
25
|
// Backward-compatible thin wrapper: fetches /me and formats as human-readable text.
|
|
67
26
|
async function getProfile(token) {
|
|
@@ -36,9 +36,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.OURO_CLI_TRUST_MANIFEST = void 0;
|
|
37
37
|
exports.guardInvocation = guardInvocation;
|
|
38
38
|
const fs = __importStar(require("node:fs"));
|
|
39
|
-
const
|
|
40
|
-
const
|
|
39
|
+
const path = __importStar(require("node:path"));
|
|
40
|
+
const friends_1 = require("@ouro.bot/friends");
|
|
41
41
|
const runtime_1 = require("../nerves/runtime");
|
|
42
|
+
const store_1 = require("../commerce/store");
|
|
42
43
|
const deny = (reason) => ({ allowed: false, reason });
|
|
43
44
|
const allow = { allowed: true };
|
|
44
45
|
// --- reason templates ---
|
|
@@ -48,7 +49,6 @@ const REASONS = {
|
|
|
48
49
|
readBeforeOverwrite: "i need to read that file first before i can overwrite it.",
|
|
49
50
|
protectedPath: "that path is protected — i can read it but not modify it.",
|
|
50
51
|
destructiveCommand: "that command is too dangerous to run — it could cause irreversible damage.",
|
|
51
|
-
compoundCommand: "i can only run simple commands for you — no chaining with && or ;",
|
|
52
52
|
// Trust reasons (vary by relationship)
|
|
53
53
|
needsTrust: "i'd need a closer friend to vouch for you before i can do that.",
|
|
54
54
|
needsTrustForWrite: "i'd need a closer friend to vouch for you before i can write files outside my home.",
|
|
@@ -56,17 +56,19 @@ const REASONS = {
|
|
|
56
56
|
// --- read-only tools that never need guardrails ---
|
|
57
57
|
const READ_ONLY_TOOLS = new Set(["read_file", "glob", "grep"]);
|
|
58
58
|
// --- protected path detection ---
|
|
59
|
-
const PROTECTED_PATH_SEGMENTS = [
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
const PROTECTED_PATH_SEGMENTS = [
|
|
60
|
+
".git/",
|
|
61
|
+
".ouro-cli/vault-unlock/",
|
|
62
|
+
".ouro-cli/vault-unlock-dpapi/",
|
|
63
|
+
];
|
|
64
|
+
const PROTECTED_FILENAMES = ["agent.json"];
|
|
63
65
|
function isProtectedPath(filePath) {
|
|
64
66
|
for (const segment of PROTECTED_PATH_SEGMENTS) {
|
|
65
67
|
if (filePath.includes(`/${segment}`) || filePath.startsWith(segment))
|
|
66
68
|
return true;
|
|
67
69
|
}
|
|
68
|
-
for (const
|
|
69
|
-
if (
|
|
70
|
+
for (const name of PROTECTED_FILENAMES) {
|
|
71
|
+
if (path.basename(filePath) === name)
|
|
70
72
|
return true;
|
|
71
73
|
}
|
|
72
74
|
return false;
|
|
@@ -90,9 +92,6 @@ function splitShellCommands(command) {
|
|
|
90
92
|
return [command];
|
|
91
93
|
return command.split(COMPOUND_SEPARATORS).filter(Boolean);
|
|
92
94
|
}
|
|
93
|
-
function isCompoundCommand(command) {
|
|
94
|
-
return SUBSHELL_PATTERN.test(command) || splitShellCommands(command).length > 1;
|
|
95
|
-
}
|
|
96
95
|
// --- shell commands that write to protected paths ---
|
|
97
96
|
function shellWritesToProtectedPath(command) {
|
|
98
97
|
const redirectMatch = command.match(/>\s*(\S+)/);
|
|
@@ -159,19 +158,19 @@ exports.OURO_CLI_TRUST_MANIFEST = {
|
|
|
159
158
|
whoami: "acquaintance",
|
|
160
159
|
changelog: "acquaintance",
|
|
161
160
|
"session list": "acquaintance",
|
|
162
|
-
"task board": "friend",
|
|
163
|
-
"task create": "friend",
|
|
164
|
-
"task update": "friend",
|
|
165
|
-
"task show": "friend",
|
|
166
|
-
"task actionable": "friend",
|
|
167
|
-
"task deps": "friend",
|
|
168
|
-
"task sessions": "friend",
|
|
169
161
|
"friend list": "friend",
|
|
170
162
|
"friend show": "friend",
|
|
171
163
|
"friend create": "friend",
|
|
172
|
-
"
|
|
164
|
+
"friend update": "family",
|
|
165
|
+
"config model": "friend",
|
|
166
|
+
"config models": "friend",
|
|
173
167
|
"mcp list": "acquaintance",
|
|
174
168
|
"mcp call": "friend",
|
|
169
|
+
auth: "family",
|
|
170
|
+
"auth verify": "family",
|
|
171
|
+
"auth switch": "family",
|
|
172
|
+
rollback: "family",
|
|
173
|
+
versions: "acquaintance",
|
|
175
174
|
};
|
|
176
175
|
// --- trust level comparison ---
|
|
177
176
|
const LEVEL_ORDER = {
|
|
@@ -206,6 +205,26 @@ function resolveOuroSubcommand(command) {
|
|
|
206
205
|
return tokens[0];
|
|
207
206
|
return null;
|
|
208
207
|
}
|
|
208
|
+
// --- MCP server-specific trust rules ---
|
|
209
|
+
const MCP_SERVER_TRUST = {
|
|
210
|
+
browser: { minTrust: "friend", blockGroupChat: true },
|
|
211
|
+
};
|
|
212
|
+
function checkMcpServerTrust(command, context) {
|
|
213
|
+
const match = command.match(/^ouro\s+mcp\s+call\s+(\S+)/);
|
|
214
|
+
if (!match)
|
|
215
|
+
return allow;
|
|
216
|
+
const serverName = match[1];
|
|
217
|
+
const rules = MCP_SERVER_TRUST[serverName];
|
|
218
|
+
if (!rules)
|
|
219
|
+
return allow; // no special rules for this server
|
|
220
|
+
if (!trustLevelSatisfied(rules.minTrust, context.trustLevel ?? "friend")) {
|
|
221
|
+
return deny(REASONS.needsTrust);
|
|
222
|
+
}
|
|
223
|
+
if (rules.blockGroupChat && context.isGroupChat) {
|
|
224
|
+
return deny("browser tools are only available in 1:1 conversations, not group chats.");
|
|
225
|
+
}
|
|
226
|
+
return allow;
|
|
227
|
+
}
|
|
209
228
|
function checkSingleShellCommandTrust(command, trustLevel) {
|
|
210
229
|
const trimmed = command.trim();
|
|
211
230
|
const tokens = trimmed.split(/\s+/);
|
|
@@ -231,11 +250,21 @@ function checkSingleShellCommandTrust(command, trustLevel) {
|
|
|
231
250
|
return deny(REASONS.needsTrust);
|
|
232
251
|
}
|
|
233
252
|
function checkShellTrustGuardrails(command, trustLevel) {
|
|
234
|
-
//
|
|
235
|
-
|
|
236
|
-
if (
|
|
237
|
-
return
|
|
238
|
-
|
|
253
|
+
// Subshell patterns ($(), backticks) can't be reliably split — check as single command
|
|
254
|
+
/* v8 ignore next -- subshell branch: tested via guardrails.test.ts @preserve */
|
|
255
|
+
if (SUBSHELL_PATTERN.test(command)) {
|
|
256
|
+
return checkSingleShellCommandTrust(command, trustLevel);
|
|
257
|
+
}
|
|
258
|
+
// Compound commands: check each subcommand individually
|
|
259
|
+
const subcommands = splitShellCommands(command);
|
|
260
|
+
if (subcommands.length === 0)
|
|
261
|
+
return checkSingleShellCommandTrust(command, trustLevel);
|
|
262
|
+
for (const sub of subcommands) {
|
|
263
|
+
const result = checkSingleShellCommandTrust(sub, trustLevel);
|
|
264
|
+
if (!result.allowed)
|
|
265
|
+
return result;
|
|
266
|
+
}
|
|
267
|
+
return allow;
|
|
239
268
|
}
|
|
240
269
|
function checkWriteTrustGuardrails(toolName, args, context) {
|
|
241
270
|
if (toolName !== "write_file" && toolName !== "edit_file")
|
|
@@ -247,9 +276,112 @@ function checkWriteTrustGuardrails(toolName, args, context) {
|
|
|
247
276
|
return allow;
|
|
248
277
|
return deny(REASONS.needsTrustForWrite);
|
|
249
278
|
}
|
|
279
|
+
// --- credential tool trust gating ---
|
|
280
|
+
// Credential write tools: family only
|
|
281
|
+
const CREDENTIAL_FAMILY_TOOLS = new Set([
|
|
282
|
+
"credential_generate_password", "credential_store", "credential_delete", "vault_setup",
|
|
283
|
+
// User profile tools: family only
|
|
284
|
+
"user_profile_store", "user_profile_get", "user_profile_delete",
|
|
285
|
+
// Payment tools: family only
|
|
286
|
+
"stripe_create_card", "stripe_deactivate_card", "stripe_list_cards",
|
|
287
|
+
// Booking tools that involve payment: family only
|
|
288
|
+
"flight_book", "flight_hold", "flight_cancel",
|
|
289
|
+
]);
|
|
290
|
+
// Credential read tools: friend+
|
|
291
|
+
const CREDENTIAL_TRUSTED_TOOLS = new Set(["credential_get", "credential_list"]);
|
|
292
|
+
// Travel tools: friend+ (weather_lookup accesses vault credentials indirectly;
|
|
293
|
+
// advisory and geocode are public APIs but gated for consistency)
|
|
294
|
+
// Flight search is also friend+ (read-only, no payment)
|
|
295
|
+
const TRAVEL_TRUSTED_TOOLS = new Set(["weather_lookup", "travel_advisory", "geocode_search", "flight_search"]);
|
|
296
|
+
const A2A_TRUSTED_TOOLS = new Set(["a2a_list_peers", "a2a_send_message", "a2a_get_task"]);
|
|
297
|
+
const COMMERCE_FAMILY_TOOLS = new Set(["commerce_checkout_preview", "commerce_checkout_commit", "commerce_receipt_get", "commerce_access_log"]);
|
|
298
|
+
const COMMERCE_AUTHORITY_TOOLS = new Set(["stripe_create_card", "flight_hold", "flight_book"]);
|
|
299
|
+
const MAIL_FAMILY_TOOLS = new Set(["mail_screener", "mail_decide", "mail_access_log", "mail_send", "mail_index_refresh"]);
|
|
300
|
+
const MAIL_DELEGATED_READ_TOOLS = new Set(["mail_recent", "mail_search"]);
|
|
301
|
+
function mailTrustGuardrail(toolName, args, context) {
|
|
302
|
+
if (MAIL_FAMILY_TOOLS.has(toolName)) {
|
|
303
|
+
if (context.trustLevel === undefined || context.trustLevel === "family")
|
|
304
|
+
return allow;
|
|
305
|
+
if (toolName === "mail_send")
|
|
306
|
+
return deny("outbound mail sends require family trust.");
|
|
307
|
+
return deny(toolName === "mail_decide"
|
|
308
|
+
? "mail screener decisions require family trust."
|
|
309
|
+
: "delegated human mail requires family trust.");
|
|
310
|
+
}
|
|
311
|
+
if (MAIL_DELEGATED_READ_TOOLS.has(toolName)) {
|
|
312
|
+
const scope = (args.scope ?? "").trim().toLowerCase();
|
|
313
|
+
if (scope === "delegated" || scope === "all") {
|
|
314
|
+
if (context.trustLevel === undefined || context.trustLevel === "family")
|
|
315
|
+
return allow;
|
|
316
|
+
return deny("delegated human mail requires family trust.");
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return allow;
|
|
320
|
+
}
|
|
321
|
+
function checkCredentialTrustGuardrails(toolName, context) {
|
|
322
|
+
if (CREDENTIAL_FAMILY_TOOLS.has(toolName) || COMMERCE_FAMILY_TOOLS.has(toolName)) {
|
|
323
|
+
if (context.trustLevel === "family")
|
|
324
|
+
return allow;
|
|
325
|
+
return deny(REASONS.needsTrust);
|
|
326
|
+
}
|
|
327
|
+
if (CREDENTIAL_TRUSTED_TOOLS.has(toolName) || TRAVEL_TRUSTED_TOOLS.has(toolName) || A2A_TRUSTED_TOOLS.has(toolName)) {
|
|
328
|
+
if ((0, friends_1.isTrustedLevel)(context.trustLevel))
|
|
329
|
+
return allow;
|
|
330
|
+
return deny(REASONS.needsTrust);
|
|
331
|
+
}
|
|
332
|
+
return allow;
|
|
333
|
+
}
|
|
334
|
+
function checkCommerceAuthorityGuardrails(toolName, args, context) {
|
|
335
|
+
if (!COMMERCE_AUTHORITY_TOOLS.has(toolName))
|
|
336
|
+
return allow;
|
|
337
|
+
if (!context.agentRoot)
|
|
338
|
+
return deny("commerce authority unavailable: agent root could not be resolved.");
|
|
339
|
+
const result = (0, store_1.validateCommerceAuthority)({
|
|
340
|
+
agentRoot: context.agentRoot,
|
|
341
|
+
token: args.commerce_authority,
|
|
342
|
+
toolName,
|
|
343
|
+
args,
|
|
344
|
+
friendId: context.friendId,
|
|
345
|
+
});
|
|
346
|
+
if (result.ok)
|
|
347
|
+
return allow;
|
|
348
|
+
return deny(`commerce authority required: ${result.reason}`);
|
|
349
|
+
}
|
|
350
|
+
function checkFirstClassMcpTrust(context) {
|
|
351
|
+
if (!context.mcpServerName)
|
|
352
|
+
return allow;
|
|
353
|
+
const rules = MCP_SERVER_TRUST[context.mcpServerName] ?? { minTrust: "friend", blockGroupChat: false };
|
|
354
|
+
if (!trustLevelSatisfied(rules.minTrust, context.trustLevel ?? "friend")) {
|
|
355
|
+
return deny(REASONS.needsTrust);
|
|
356
|
+
}
|
|
357
|
+
if (rules.blockGroupChat && context.isGroupChat) {
|
|
358
|
+
return deny("browser tools are only available in 1:1 conversations, not group chats.");
|
|
359
|
+
}
|
|
360
|
+
return allow;
|
|
361
|
+
}
|
|
250
362
|
function checkTrustLevelGuardrails(toolName, args, context) {
|
|
251
|
-
|
|
252
|
-
if (
|
|
363
|
+
const mailResult = mailTrustGuardrail(toolName, args, context);
|
|
364
|
+
if (!mailResult.allowed)
|
|
365
|
+
return mailResult;
|
|
366
|
+
// Credential tools have their own trust rules that apply at all levels
|
|
367
|
+
const credentialResult = checkCredentialTrustGuardrails(toolName, context);
|
|
368
|
+
if (!credentialResult.allowed)
|
|
369
|
+
return credentialResult;
|
|
370
|
+
const commerceAuthorityResult = checkCommerceAuthorityGuardrails(toolName, args, context);
|
|
371
|
+
if (!commerceAuthorityResult.allowed)
|
|
372
|
+
return commerceAuthorityResult;
|
|
373
|
+
// First-class MCP tool trust (e.g. browser_navigate) — applies at all trust levels
|
|
374
|
+
const firstClassMcpResult = checkFirstClassMcpTrust(context);
|
|
375
|
+
if (!firstClassMcpResult.allowed)
|
|
376
|
+
return firstClassMcpResult;
|
|
377
|
+
// MCP server-specific trust via shell (e.g. ouro mcp call browser) — applies at all trust levels
|
|
378
|
+
if (toolName === "shell") {
|
|
379
|
+
const mcpResult = checkMcpServerTrust(args.command || "", context);
|
|
380
|
+
if (!mcpResult.allowed)
|
|
381
|
+
return mcpResult;
|
|
382
|
+
}
|
|
383
|
+
// Trusted levels (family/friend) — no further trust guardrails. Undefined defaults to friend.
|
|
384
|
+
if ((0, friends_1.isTrustedLevel)(context.trustLevel))
|
|
253
385
|
return allow;
|
|
254
386
|
if (toolName === "shell") {
|
|
255
387
|
return checkShellTrustGuardrails(args.command || "", context.trustLevel);
|
|
@@ -1,11 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.McpClient = void 0;
|
|
4
|
+
exports.isMcpTransportError = isMcpTransportError;
|
|
4
5
|
const child_process_1 = require("child_process");
|
|
5
6
|
const readline_1 = require("readline");
|
|
6
7
|
const runtime_1 = require("../nerves/runtime");
|
|
8
|
+
const runtime_cwd_1 = require("../heart/runtime-cwd");
|
|
7
9
|
const MCP_PROTOCOL_VERSION = "2024-11-05";
|
|
10
|
+
const DEFAULT_REQUEST_TIMEOUT = 10_000;
|
|
8
11
|
const DEFAULT_TOOL_CALL_TIMEOUT = 30_000;
|
|
12
|
+
function isMcpTransportError(error) {
|
|
13
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
14
|
+
const normalized = message.toLowerCase();
|
|
15
|
+
return normalized.includes("disconnected")
|
|
16
|
+
|| normalized.includes("transport")
|
|
17
|
+
|| normalized.includes("closed")
|
|
18
|
+
|| normalized.includes("econnreset")
|
|
19
|
+
|| normalized.includes("econnrefused")
|
|
20
|
+
|| normalized.includes("enoent")
|
|
21
|
+
|| normalized.includes("epipe")
|
|
22
|
+
|| normalized.includes("broken pipe")
|
|
23
|
+
|| normalized.includes("not writable");
|
|
24
|
+
}
|
|
9
25
|
class McpClient {
|
|
10
26
|
config;
|
|
11
27
|
process = null;
|
|
@@ -18,6 +34,9 @@ class McpClient {
|
|
|
18
34
|
this.config = config;
|
|
19
35
|
}
|
|
20
36
|
async connect() {
|
|
37
|
+
if (this.connected)
|
|
38
|
+
return;
|
|
39
|
+
this.shutdownProcessOnly();
|
|
21
40
|
(0, runtime_1.emitNervesEvent)({
|
|
22
41
|
event: "mcp.connect_start",
|
|
23
42
|
component: "repertoire",
|
|
@@ -25,9 +44,11 @@ class McpClient {
|
|
|
25
44
|
meta: { command: this.config.command },
|
|
26
45
|
});
|
|
27
46
|
const env = { ...process.env, ...this.config.env };
|
|
47
|
+
const spawnCwd = this.config.cwd ?? (0, runtime_cwd_1.recoverRuntimeCwd)();
|
|
28
48
|
this.process = (0, child_process_1.spawn)(this.config.command, this.config.args ?? [], {
|
|
29
49
|
env,
|
|
30
50
|
stdio: ["pipe", "pipe", "pipe"],
|
|
51
|
+
cwd: spawnCwd,
|
|
31
52
|
});
|
|
32
53
|
this.setupLineReader();
|
|
33
54
|
this.setupProcessHandlers();
|
|
@@ -43,6 +64,7 @@ class McpClient {
|
|
|
43
64
|
}
|
|
44
65
|
catch (error) {
|
|
45
66
|
this.connected = false;
|
|
67
|
+
this.shutdownProcessOnly();
|
|
46
68
|
(0, runtime_1.emitNervesEvent)({
|
|
47
69
|
level: "error",
|
|
48
70
|
event: "mcp.connect_error",
|
|
@@ -75,6 +97,10 @@ class McpClient {
|
|
|
75
97
|
this.cachedTools = allTools;
|
|
76
98
|
return allTools;
|
|
77
99
|
}
|
|
100
|
+
async refreshTools() {
|
|
101
|
+
this.cachedTools = null;
|
|
102
|
+
return this.listTools();
|
|
103
|
+
}
|
|
78
104
|
async callTool(name, args, timeout = DEFAULT_TOOL_CALL_TIMEOUT) {
|
|
79
105
|
(0, runtime_1.emitNervesEvent)({
|
|
80
106
|
event: "mcp.tool_call_start",
|
|
@@ -138,7 +164,7 @@ class McpClient {
|
|
|
138
164
|
});
|
|
139
165
|
return result;
|
|
140
166
|
}
|
|
141
|
-
sendRequest(method, params, timeout) {
|
|
167
|
+
sendRequest(method, params, timeout = DEFAULT_REQUEST_TIMEOUT) {
|
|
142
168
|
return new Promise((resolve, reject) => {
|
|
143
169
|
if (!this.process || !this.connected && method !== "initialize") {
|
|
144
170
|
reject(new Error("MCP client is disconnected"));
|
|
@@ -159,14 +185,21 @@ class McpClient {
|
|
|
159
185
|
method,
|
|
160
186
|
params,
|
|
161
187
|
};
|
|
162
|
-
this.writeMessage(request)
|
|
188
|
+
if (!this.writeMessage(request)) {
|
|
189
|
+
this.pending.delete(id);
|
|
190
|
+
if (pending.timer) {
|
|
191
|
+
clearTimeout(pending.timer);
|
|
192
|
+
}
|
|
193
|
+
reject(new Error(`MCP transport is not writable for request: ${method}`));
|
|
194
|
+
}
|
|
163
195
|
});
|
|
164
196
|
}
|
|
165
197
|
writeMessage(message) {
|
|
166
|
-
/* v8 ignore next -- defensive: stdin always writable during active connection @preserve */
|
|
167
198
|
if (this.process?.stdin?.writable) {
|
|
168
199
|
this.process.stdin.write(JSON.stringify(message) + "\n");
|
|
200
|
+
return true;
|
|
169
201
|
}
|
|
202
|
+
return false;
|
|
170
203
|
}
|
|
171
204
|
setupLineReader() {
|
|
172
205
|
/* v8 ignore next -- defensive: stdout always exists after spawn @preserve */
|
|
@@ -250,5 +283,13 @@ class McpClient {
|
|
|
250
283
|
this.pending.delete(id);
|
|
251
284
|
}
|
|
252
285
|
}
|
|
286
|
+
shutdownProcessOnly() {
|
|
287
|
+
this.rejectAllPending(new Error("MCP transport closed during reconnect"));
|
|
288
|
+
/* v8 ignore next -- defensive: process may already be absent @preserve */
|
|
289
|
+
if (this.process && !this.process.killed) {
|
|
290
|
+
this.process.kill();
|
|
291
|
+
}
|
|
292
|
+
this.process = null;
|
|
293
|
+
}
|
|
253
294
|
}
|
|
254
295
|
exports.McpClient = McpClient;
|