@ouro.bot/cli 0.1.0-alpha.56 → 0.1.0-alpha.561
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 +127 -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 +3604 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +140 -0
- package/dist/arc/episodes.js +117 -0
- package/dist/arc/intentions.js +133 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +237 -0
- package/dist/arc/packets.js +193 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +65 -0
- package/dist/heart/active-work.js +837 -26
- package/dist/heart/agent-entry.js +58 -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/adapter.js +2 -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/background-operations.js +281 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +111 -0
- package/dist/heart/config-registry.js +322 -0
- package/dist/heart/config.js +114 -118
- package/dist/heart/core.js +913 -246
- package/dist/heart/cross-chat-delivery.js +3 -18
- package/dist/heart/daemon/agent-config-check.js +419 -0
- package/dist/heart/daemon/agent-discovery.js +102 -3
- package/dist/heart/daemon/agent-service.js +522 -0
- package/dist/heart/daemon/agentic-repair.js +547 -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 +776 -0
- package/dist/heart/daemon/cli-exec.js +7457 -0
- package/dist/heart/daemon/cli-help.js +498 -0
- package/dist/heart/daemon/cli-parse.js +1592 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +763 -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 -1698
- package/dist/heart/daemon/daemon-entry.js +387 -2
- 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 +796 -71
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +826 -0
- package/dist/heart/daemon/health-monitor.js +122 -1
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +115 -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 +89 -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 +82 -12
- 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 +2 -2
- 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/process-manager.js +375 -33
- 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 +475 -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 +67 -16
- package/dist/heart/daemon/runtime-metadata.js +3 -31
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +389 -38
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +94 -0
- package/dist/heart/daemon/socket-client.js +158 -11
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +330 -0
- package/dist/heart/daemon/task-scheduler.js +3 -25
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +162 -17
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -1
- package/dist/heart/habits/habit-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +140 -0
- package/dist/heart/habits/habit-runtime-state.js +100 -0
- package/dist/heart/habits/habit-scheduler.js +372 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +32 -56
- 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 +35 -12
- package/dist/heart/identity.js +203 -57
- package/dist/heart/kept-notes.js +357 -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 +66 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +246 -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 +31 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +195 -0
- package/dist/heart/mailbox/readers/agent-machine.js +382 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +338 -0
- package/dist/heart/mailbox/readers/mail.js +362 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +651 -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 +683 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +19 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +267 -0
- package/dist/heart/provider-credentials.js +425 -0
- package/dist/heart/provider-failover.js +301 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -0
- package/dist/heart/provider-readiness-cache.js +40 -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 +97 -13
- 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.js +55 -40
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +367 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +13 -4
- package/dist/heart/session-activity.js +43 -22
- package/dist/heart/session-events.js +1149 -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 +243 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +44 -27
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +9 -5
- 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 +139 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +389 -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 +295 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
- package/dist/mailbox-ui/assets/index-B-461hes.js +61 -0
- package/dist/mailbox-ui/assets/index-BPr5vNuM.css +1 -0
- package/dist/mailbox-ui/index.html +15 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +674 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/core.js +720 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +430 -0
- package/dist/mailroom/mbox-import.js +383 -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 +256 -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 +7 -1
- package/dist/mind/context.js +165 -101
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +62 -75
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/friends/channel.js +39 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +39 -3
- package/dist/mind/friends/types.js +2 -2
- package/dist/mind/journal-index.js +161 -0
- package/dist/mind/note-search.js +268 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +4 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1011 -123
- package/dist/mind/provenance-trust.js +26 -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 +129 -5
- package/dist/nerves/coverage/run-artifacts.js +1 -1
- 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 +11 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +963 -0
- package/dist/repertoire/bundle-templates.js +72 -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 +330 -0
- package/dist/repertoire/coding/feedback.js +197 -30
- package/dist/repertoire/coding/manager.js +158 -9
- package/dist/repertoire/coding/spawner.js +55 -9
- package/dist/repertoire/coding/tools.js +170 -7
- 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/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 +396 -0
- package/dist/repertoire/mcp-client.js +295 -0
- package/dist/repertoire/mcp-manager.js +362 -0
- package/dist/repertoire/mcp-tools.js +63 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +15 -24
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tasks/board.js +31 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +16 -4
- package/dist/repertoire/tasks/lifecycle.js +2 -2
- package/dist/repertoire/tasks/parser.js +3 -2
- package/dist/repertoire/tasks/scanner.js +194 -37
- package/dist/repertoire/tasks/transitions.js +16 -78
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-base.js +47 -1075
- package/dist/repertoire/tools-bluebubbles.js +1 -0
- package/dist/repertoire/tools-bridge.js +142 -0
- package/dist/repertoire/tools-bundle.js +984 -0
- package/dist/repertoire/tools-config.js +185 -0
- package/dist/repertoire/tools-continuity.js +248 -0
- package/dist/repertoire/tools-credential.js +381 -0
- package/dist/repertoire/tools-files.js +342 -0
- package/dist/repertoire/tools-flight.js +224 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +1 -7
- package/dist/repertoire/tools-mail.js +1857 -0
- package/dist/repertoire/tools-notes.js +421 -0
- package/dist/repertoire/tools-session.js +750 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +180 -0
- package/dist/repertoire/tools-surface.js +243 -0
- package/dist/repertoire/tools-teams.js +9 -39
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +604 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools.js +108 -100
- 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/attention-queue.js +116 -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 +2305 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -70
- 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/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 +187 -0
- package/dist/senses/cli.js +520 -209
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +175 -21
- package/dist/senses/inner-dialog.js +330 -27
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +549 -181
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +251 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +387 -98
- package/dist/senses/trust-gate.js +100 -5
- package/dist/senses/voice/audio-routing.js +119 -0
- package/dist/senses/voice/elevenlabs.js +178 -0
- package/dist/senses/voice/golden-path.js +116 -0
- package/dist/senses/voice/index.js +26 -0
- package/dist/senses/voice/meeting.js +113 -0
- package/dist/senses/voice/playback.js +139 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +85 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +80 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +146 -0
- package/package.json +38 -7
- package/skills/agent-commerce.md +106 -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 +101 -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/subagent-installer.js +0 -166
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/associative-recall.js +0 -209
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1177
- package/dist/senses/debug-activity.js +0 -148
- package/subagents/README.md +0 -86
- package/subagents/work-doer.md +0 -237
- package/subagents/work-merger.md +0 -618
- package/subagents/work-planner.md +0 -390
- /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/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,101 @@
|
|
|
1
|
+
# Configure Dev Tools for MCP Agent Bridge
|
|
2
|
+
|
|
3
|
+
Set up your development tools (Claude Code, Codex) to communicate with Ouroboros agents via MCP. One command does everything — including cross-platform WSL2 bridging on Windows.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
### Claude Code
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
ouro setup --tool claude-code --agent <agent-name>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
This command:
|
|
14
|
+
1. Registers the MCP server with Claude Code via `claude mcp add`
|
|
15
|
+
2. Configures lifecycle hooks (SessionStart, Stop, PostToolUse) for passive awareness
|
|
16
|
+
3. Detects dev vs installed mode automatically and uses the correct command path
|
|
17
|
+
|
|
18
|
+
**On WSL2 (Windows):** The command automatically detects the WSL environment and:
|
|
19
|
+
- Calls `claude.exe` (the Windows binary) instead of `claude`
|
|
20
|
+
- Prefixes MCP serve and hook commands with `wsl` so Windows-side Claude Code spawns them through WSL
|
|
21
|
+
- Resolves the Windows-side home directory and writes config to the Windows-side `~/.claude/`
|
|
22
|
+
- After setup, open Claude Code in PowerShell — the agent is there
|
|
23
|
+
|
|
24
|
+
**On native Windows (no WSL):** Not yet supported. The command prints a message directing you to install WSL2.
|
|
25
|
+
|
|
26
|
+
For the full cross-machine setup flow (including cloning an agent to a new machine), see `docs/cross-machine-setup.md` in the harness repo.
|
|
27
|
+
|
|
28
|
+
### Codex
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
ouro setup --tool codex --agent <agent-name>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
This command:
|
|
35
|
+
1. Registers the MCP server with Codex via `codex mcp add`
|
|
36
|
+
2. Detects dev vs installed mode automatically
|
|
37
|
+
|
|
38
|
+
## Verification
|
|
39
|
+
|
|
40
|
+
After setup, verify the connection:
|
|
41
|
+
|
|
42
|
+
1. **Check daemon is running**: `ouro up` (installed) or `ouro dev --repo-path <path>` (dev mode).
|
|
43
|
+
2. **Test from Claude Code**: Start a new session and use the `status` tool.
|
|
44
|
+
3. **Test from Codex**: Run `codex exec "Use the <agent-name> status tool"`.
|
|
45
|
+
4. **Check registration**: `claude mcp list` or `codex mcp list`.
|
|
46
|
+
|
|
47
|
+
## Available MCP Tools
|
|
48
|
+
|
|
49
|
+
Once connected, these tools are available:
|
|
50
|
+
|
|
51
|
+
### Conversation tools (new)
|
|
52
|
+
- **send_message** -- Send a message and get a synchronous agent response (full turn with tools)
|
|
53
|
+
- **check_response** -- Check for pending messages from the agent (after ponder or proactive surface)
|
|
54
|
+
|
|
55
|
+
### Read-only tools
|
|
56
|
+
- **ask** -- Ask the agent a question (uses diary, journal, and context)
|
|
57
|
+
- **status** -- Get agent's current status and activity
|
|
58
|
+
- **catchup** -- Get recent activity summary
|
|
59
|
+
- **get_context** -- Get agent's current working context
|
|
60
|
+
- **search_notes** -- Search the agent's diary for specific topics
|
|
61
|
+
- **get_task** -- Get details of the agent's current task
|
|
62
|
+
- **check_scope** -- Verify if something is in scope for current work
|
|
63
|
+
- **check_guidance** -- Get guidance on how to approach something
|
|
64
|
+
|
|
65
|
+
### Write tools
|
|
66
|
+
- **delegate** -- Request the agent to handle a task (runs full conversation turn)
|
|
67
|
+
- **request_decision** -- Ask agent to make a decision about something
|
|
68
|
+
- **report_progress** -- Report progress on delegated work
|
|
69
|
+
- **report_blocker** -- Report a blocker on delegated work
|
|
70
|
+
- **report_complete** -- Report completion of delegated work
|
|
71
|
+
|
|
72
|
+
## Troubleshooting
|
|
73
|
+
|
|
74
|
+
### "Daemon not running" error
|
|
75
|
+
Most read-only tools work without the daemon (reads filesystem directly). For write operations and `send_message`, start the daemon with `ouro up` or `ouro dev`.
|
|
76
|
+
|
|
77
|
+
### MCP server not appearing
|
|
78
|
+
- Run `claude mcp list` or `codex mcp list` to verify registration
|
|
79
|
+
- Re-run `ouro setup` to fix
|
|
80
|
+
- Restart your dev tool (MCP loads at session start)
|
|
81
|
+
|
|
82
|
+
### Connection timeouts
|
|
83
|
+
- Ensure `dist/` is built: `npm run build`
|
|
84
|
+
- Check that the entry point path is correct (setup auto-detects this)
|
|
85
|
+
|
|
86
|
+
### WSL2-specific issues
|
|
87
|
+
|
|
88
|
+
**`claude.exe` not found** — Windows executables must be accessible from WSL. This is the default, but enterprise environments may disable it via `/etc/wsl.conf` setting `appendWindowsPath = false`. Check with `which claude.exe`. If missing, add Claude Code's install directory to WSL's PATH manually or update `wsl.conf`.
|
|
89
|
+
|
|
90
|
+
**`cmd.exe` or `wslpath` fails** — The setup command resolves the Windows home directory using `cmd.exe /C echo %USERPROFILE%` piped through `wslpath`. If either is unavailable, the setup will fail. `wslpath` ships with all standard WSL distributions. `cmd.exe` requires Windows executables to be on PATH (see above).
|
|
91
|
+
|
|
92
|
+
**MCP server hangs or returns empty** — The MCP server runs inside WSL via `wsl ouro mcp-serve --agent <name>`. If stdio piping between Windows and WSL is broken, check that the WSL distribution is running (`wsl --status`) and that no other process has claimed stdin.
|
|
93
|
+
|
|
94
|
+
**Hooks not firing** — Claude Code hooks use `wsl ouro hook <event> --agent <name>`. If hooks fail silently, check that `ouro` is on PATH inside WSL (run `wsl ouro --version` from PowerShell to verify).
|
|
95
|
+
|
|
96
|
+
### Removing
|
|
97
|
+
```bash
|
|
98
|
+
claude mcp remove ouro-<agent-name>
|
|
99
|
+
# or
|
|
100
|
+
codex mcp remove ouro-<agent-name>
|
|
101
|
+
```
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Travel Planning Skill
|
|
2
|
+
|
|
3
|
+
Compose all travel infrastructure to plan and book trips effectively.
|
|
4
|
+
|
|
5
|
+
## Research Phase
|
|
6
|
+
|
|
7
|
+
### Destination Research
|
|
8
|
+
1. Use `geocode_search` to find candidate destinations and get coordinates
|
|
9
|
+
2. Use `weather_lookup` to check climate for travel dates
|
|
10
|
+
3. Use `travel_advisory` to check US State Dept safety levels (1-4):
|
|
11
|
+
- Level 1: Exercise Normal Precautions
|
|
12
|
+
- Level 2: Exercise Increased Caution
|
|
13
|
+
- Level 3: Reconsider Travel
|
|
14
|
+
- Level 4: Do Not Travel
|
|
15
|
+
4. Use browser tools (see `browser-navigation` skill) for destination reviews, travel blogs, local tips
|
|
16
|
+
5. Compare multiple destinations on weather, safety, cost, and flight availability
|
|
17
|
+
|
|
18
|
+
### Information Gathering Workflow
|
|
19
|
+
```
|
|
20
|
+
geocode_search -> get coordinates
|
|
21
|
+
weather_lookup -> check weather at coordinates
|
|
22
|
+
travel_advisory -> check safety level
|
|
23
|
+
browser tools -> reviews, local info, pricing
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Flight Search
|
|
27
|
+
|
|
28
|
+
### Using Duffel MCP (when available)
|
|
29
|
+
- Search via `duffel_search_flights` tool (first-class MCP tool)
|
|
30
|
+
- Provide: origin, destination, dates, passengers, cabin class
|
|
31
|
+
- Compare options on price, duration, stops, airline
|
|
32
|
+
|
|
33
|
+
### Using Browser (fallback)
|
|
34
|
+
- Use browser-navigation skill patterns for Google Flights, airline sites
|
|
35
|
+
- Add delays between searches to avoid detection
|
|
36
|
+
|
|
37
|
+
### Comparison Criteria
|
|
38
|
+
Present top 3-5 options comparing:
|
|
39
|
+
- Total price (including bags, seat selection)
|
|
40
|
+
- Duration and number of stops
|
|
41
|
+
- Airline and aircraft
|
|
42
|
+
- Departure/arrival times
|
|
43
|
+
- Cancellation/change policy
|
|
44
|
+
|
|
45
|
+
## Accommodation Search
|
|
46
|
+
|
|
47
|
+
### Hotel Search
|
|
48
|
+
- Use Expedia MCP when available (`expedia_search_hotels` tool)
|
|
49
|
+
- Compare: price per night, total stay cost, location, rating, amenities
|
|
50
|
+
- Check cancellation policies (crucial for travel planning)
|
|
51
|
+
|
|
52
|
+
### Vacation Rentals (Browser-based)
|
|
53
|
+
- Use browser-navigation skill for Airbnb/VRBO
|
|
54
|
+
- Search by location, dates, guests, budget
|
|
55
|
+
- Compare: price, location proximity, reviews, amenities, host rating
|
|
56
|
+
- Screenshot listings for user review
|
|
57
|
+
|
|
58
|
+
### Comparison Criteria
|
|
59
|
+
- Price per night and total cost
|
|
60
|
+
- Location (distance to key attractions/activities)
|
|
61
|
+
- Reviews and ratings
|
|
62
|
+
- Amenities (WiFi, kitchen, parking, pool)
|
|
63
|
+
- Cancellation flexibility
|
|
64
|
+
|
|
65
|
+
## Booking Workflow
|
|
66
|
+
|
|
67
|
+
### Critical Safety Gates
|
|
68
|
+
- **ALWAYS confirm with user before any booking action**
|
|
69
|
+
- **ALWAYS confirm before entering payment information**
|
|
70
|
+
- **ALWAYS confirm before agreeing to terms**
|
|
71
|
+
- **Never proceed with a financial commitment without explicit approval**
|
|
72
|
+
|
|
73
|
+
### Credential Handling
|
|
74
|
+
|
|
75
|
+
Credentials are managed through the credential access layer, which stores
|
|
76
|
+
agent-owned secrets in the agent's Bitwarden/Vaultwarden credential vault.
|
|
77
|
+
Stored passwords stay in the vault. A brand-new signup password may enter
|
|
78
|
+
model context briefly when the agent explicitly generates or types it during
|
|
79
|
+
an interactive sign-up flow.
|
|
80
|
+
|
|
81
|
+
- Use `credential_get` to check what credentials exist for a domain (metadata only, never passwords)
|
|
82
|
+
- Use `credential_generate_password` to mint a strong password for a new sign-up
|
|
83
|
+
- Use `credential_store` to save credentials the agent acquired after the site accepts them
|
|
84
|
+
- The credential gateway automatically injects secrets into API requests via `getRawSecret()`
|
|
85
|
+
- Use browser-navigation skill form patterns for entering credentials during interactive sessions
|
|
86
|
+
|
|
87
|
+
**How credentials work:**
|
|
88
|
+
- Agent-owned credentials live in the agent's Bitwarden/Vaultwarden vault
|
|
89
|
+
- Travel credentials such as Duffel and Stripe are ordinary vault credential items
|
|
90
|
+
- The agent can sign up for services and store its own credentials
|
|
91
|
+
- Existing stored passwords are never returned to the model — only metadata (domain, username, notes)
|
|
92
|
+
|
|
93
|
+
### Post-Booking
|
|
94
|
+
- Save confirmation details (confirmation number, dates, hotel name, airline, booking reference)
|
|
95
|
+
- Save to diary/journal for future reference
|
|
96
|
+
- Set reminders for check-in windows
|
|
97
|
+
- Note cancellation deadlines
|
|
98
|
+
|
|
99
|
+
## Preference Management
|
|
100
|
+
|
|
101
|
+
### Storing Preferences
|
|
102
|
+
Track and reference these travel preferences:
|
|
103
|
+
- Preferred airlines and alliance status
|
|
104
|
+
- Preferred hotel chains and loyalty numbers
|
|
105
|
+
- Seat preferences (window/aisle, extra legroom)
|
|
106
|
+
- Dietary needs for in-flight meals
|
|
107
|
+
- Budget ranges (per night for hotels, per flight)
|
|
108
|
+
- Must-have amenities (WiFi, gym, pool)
|
|
109
|
+
|
|
110
|
+
### Using Preferences
|
|
111
|
+
- Reference stored preferences when searching
|
|
112
|
+
- Apply airline preferences to flight comparisons
|
|
113
|
+
- Apply hotel brand preferences to accommodation searches
|
|
114
|
+
- Adjust budget ranges based on destination
|
|
115
|
+
|
|
116
|
+
## Tool Reference
|
|
117
|
+
|
|
118
|
+
### Native Tools (always available)
|
|
119
|
+
- `weather_lookup` - Current weather and daily forecast by city or coordinates (Open-Meteo, zero config)
|
|
120
|
+
- `travel_advisory` - US State Dept advisory by country code
|
|
121
|
+
- `geocode_search` - Location/POI search with coordinates
|
|
122
|
+
- `credential_get` - Check credential metadata for a domain (never returns passwords)
|
|
123
|
+
- `credential_generate_password` - Generate a strong password for a new sign-up (family trust)
|
|
124
|
+
- `credential_store` - Store credentials the agent acquired (family trust)
|
|
125
|
+
- `credential_list` - List stored credential domains
|
|
126
|
+
- `credential_delete` - Delete stored credentials (family trust)
|
|
127
|
+
|
|
128
|
+
### MCP Tools (when configured)
|
|
129
|
+
- Browser tools via `@playwright/mcp` - see `browser-navigation` skill
|
|
130
|
+
- Duffel flight search (when MCP server available)
|
|
131
|
+
- Expedia hotel search (when MCP server available)
|
|
132
|
+
|
|
133
|
+
### Human Confirmation Required For
|
|
134
|
+
- Any booking or payment
|
|
135
|
+
- Entering personal information
|
|
136
|
+
- Agreeing to terms of service
|
|
137
|
+
- Creating financial obligations
|
|
138
|
+
- Sharing credentials with third parties
|
|
@@ -1,351 +0,0 @@
|
|
|
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.readAgentConfigForAgent = readAgentConfigForAgent;
|
|
37
|
-
exports.writeAgentProviderSelection = writeAgentProviderSelection;
|
|
38
|
-
exports.loadAgentSecrets = loadAgentSecrets;
|
|
39
|
-
exports.writeProviderCredentials = writeProviderCredentials;
|
|
40
|
-
exports.collectRuntimeAuthCredentials = collectRuntimeAuthCredentials;
|
|
41
|
-
exports.resolveHatchCredentials = resolveHatchCredentials;
|
|
42
|
-
exports.runRuntimeAuthFlow = runRuntimeAuthFlow;
|
|
43
|
-
const child_process_1 = require("child_process");
|
|
44
|
-
const fs = __importStar(require("fs"));
|
|
45
|
-
const os = __importStar(require("os"));
|
|
46
|
-
const path = __importStar(require("path"));
|
|
47
|
-
const runtime_1 = require("../../nerves/runtime");
|
|
48
|
-
const identity_1 = require("../identity");
|
|
49
|
-
const ANTHROPIC_SETUP_TOKEN_PREFIX = "sk-ant-oat01-";
|
|
50
|
-
const ANTHROPIC_SETUP_TOKEN_MIN_LENGTH = 80;
|
|
51
|
-
const DEFAULT_SECRETS_TEMPLATE = {
|
|
52
|
-
providers: {
|
|
53
|
-
azure: {
|
|
54
|
-
modelName: "gpt-4o-mini",
|
|
55
|
-
apiKey: "",
|
|
56
|
-
endpoint: "",
|
|
57
|
-
deployment: "",
|
|
58
|
-
apiVersion: "2025-04-01-preview",
|
|
59
|
-
},
|
|
60
|
-
minimax: {
|
|
61
|
-
model: "minimax-text-01",
|
|
62
|
-
apiKey: "",
|
|
63
|
-
},
|
|
64
|
-
anthropic: {
|
|
65
|
-
model: "claude-opus-4-6",
|
|
66
|
-
setupToken: "",
|
|
67
|
-
},
|
|
68
|
-
"openai-codex": {
|
|
69
|
-
model: "gpt-5.4",
|
|
70
|
-
oauthAccessToken: "",
|
|
71
|
-
},
|
|
72
|
-
},
|
|
73
|
-
teams: {
|
|
74
|
-
clientId: "",
|
|
75
|
-
clientSecret: "",
|
|
76
|
-
tenantId: "",
|
|
77
|
-
},
|
|
78
|
-
oauth: {
|
|
79
|
-
graphConnectionName: "graph",
|
|
80
|
-
adoConnectionName: "ado",
|
|
81
|
-
githubConnectionName: "",
|
|
82
|
-
},
|
|
83
|
-
teamsChannel: {
|
|
84
|
-
skipConfirmation: true,
|
|
85
|
-
port: 3978,
|
|
86
|
-
},
|
|
87
|
-
integrations: {
|
|
88
|
-
perplexityApiKey: "",
|
|
89
|
-
openaiEmbeddingsApiKey: "",
|
|
90
|
-
},
|
|
91
|
-
};
|
|
92
|
-
function deepMerge(defaults, partial) {
|
|
93
|
-
const result = { ...defaults };
|
|
94
|
-
for (const key of Object.keys(partial)) {
|
|
95
|
-
const left = result[key];
|
|
96
|
-
const right = partial[key];
|
|
97
|
-
if (right !== null &&
|
|
98
|
-
typeof right === "object" &&
|
|
99
|
-
!Array.isArray(right) &&
|
|
100
|
-
left !== null &&
|
|
101
|
-
typeof left === "object" &&
|
|
102
|
-
!Array.isArray(left)) {
|
|
103
|
-
result[key] = deepMerge(left, right);
|
|
104
|
-
continue;
|
|
105
|
-
}
|
|
106
|
-
result[key] = right;
|
|
107
|
-
}
|
|
108
|
-
return result;
|
|
109
|
-
}
|
|
110
|
-
function readJsonRecord(filePath, label) {
|
|
111
|
-
try {
|
|
112
|
-
const raw = fs.readFileSync(filePath, "utf8");
|
|
113
|
-
const parsed = JSON.parse(raw);
|
|
114
|
-
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
115
|
-
throw new Error("expected object");
|
|
116
|
-
}
|
|
117
|
-
return parsed;
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
throw new Error(`Failed to read ${label} at ${filePath}: ${String(error)}`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
function readAgentConfigForAgent(agentName, bundlesRoot = (0, identity_1.getAgentBundlesRoot)()) {
|
|
124
|
-
const configPath = path.join(bundlesRoot, `${agentName}.ouro`, "agent.json");
|
|
125
|
-
const parsed = readJsonRecord(configPath, "agent config");
|
|
126
|
-
const provider = parsed.provider;
|
|
127
|
-
if (provider !== "azure" &&
|
|
128
|
-
provider !== "anthropic" &&
|
|
129
|
-
provider !== "minimax" &&
|
|
130
|
-
provider !== "openai-codex") {
|
|
131
|
-
throw new Error(`agent.json at ${configPath} has unsupported provider '${String(provider)}'`);
|
|
132
|
-
}
|
|
133
|
-
return {
|
|
134
|
-
configPath,
|
|
135
|
-
config: parsed,
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
function writeAgentProviderSelection(agentName, provider, bundlesRoot = (0, identity_1.getAgentBundlesRoot)()) {
|
|
139
|
-
const { configPath, config } = readAgentConfigForAgent(agentName, bundlesRoot);
|
|
140
|
-
const nextConfig = { ...config, provider };
|
|
141
|
-
fs.writeFileSync(configPath, `${JSON.stringify(nextConfig, null, 2)}\n`, "utf8");
|
|
142
|
-
(0, runtime_1.emitNervesEvent)({
|
|
143
|
-
component: "daemon",
|
|
144
|
-
event: "daemon.auth_provider_selected",
|
|
145
|
-
message: "updated agent provider selection after auth flow",
|
|
146
|
-
meta: { agentName, provider, configPath },
|
|
147
|
-
});
|
|
148
|
-
return configPath;
|
|
149
|
-
}
|
|
150
|
-
function resolveAgentSecretsPath(agentName, deps = {}) {
|
|
151
|
-
if (deps.secretsRoot)
|
|
152
|
-
return path.join(deps.secretsRoot, agentName, "secrets.json");
|
|
153
|
-
const homeDir = deps.homeDir ?? os.homedir();
|
|
154
|
-
return (0, identity_1.getAgentSecretsPath)(agentName).replace(os.homedir(), homeDir);
|
|
155
|
-
}
|
|
156
|
-
function loadAgentSecrets(agentName, deps = {}) {
|
|
157
|
-
const secretsPath = resolveAgentSecretsPath(agentName, deps);
|
|
158
|
-
const secretsDir = path.dirname(secretsPath);
|
|
159
|
-
fs.mkdirSync(secretsDir, { recursive: true });
|
|
160
|
-
let onDisk = {};
|
|
161
|
-
try {
|
|
162
|
-
onDisk = readJsonRecord(secretsPath, "secrets config");
|
|
163
|
-
}
|
|
164
|
-
catch (error) {
|
|
165
|
-
const message = error.message;
|
|
166
|
-
if (!message.includes("ENOENT"))
|
|
167
|
-
throw error;
|
|
168
|
-
}
|
|
169
|
-
return {
|
|
170
|
-
secretsPath,
|
|
171
|
-
secrets: deepMerge(DEFAULT_SECRETS_TEMPLATE, onDisk),
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
function writeSecrets(secretsPath, secrets) {
|
|
175
|
-
fs.writeFileSync(secretsPath, `${JSON.stringify(secrets, null, 2)}\n`, "utf8");
|
|
176
|
-
}
|
|
177
|
-
function writeProviderCredentials(agentName, provider, credentials, deps = {}) {
|
|
178
|
-
const { secretsPath, secrets } = loadAgentSecrets(agentName, deps);
|
|
179
|
-
applyCredentials(secrets, provider, credentials);
|
|
180
|
-
writeSecrets(secretsPath, secrets);
|
|
181
|
-
return { secretsPath, secrets };
|
|
182
|
-
}
|
|
183
|
-
function readCodexAccessToken(homeDir) {
|
|
184
|
-
const authPath = path.join(homeDir, ".codex", "auth.json");
|
|
185
|
-
try {
|
|
186
|
-
const raw = fs.readFileSync(authPath, "utf8");
|
|
187
|
-
const parsed = JSON.parse(raw);
|
|
188
|
-
const token = parsed?.tokens?.access_token;
|
|
189
|
-
return typeof token === "string" ? token.trim() : "";
|
|
190
|
-
}
|
|
191
|
-
catch {
|
|
192
|
-
return "";
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
function ensurePromptInput(promptInput, provider) {
|
|
196
|
-
if (promptInput)
|
|
197
|
-
return promptInput;
|
|
198
|
-
throw new Error(`No prompt input is available for ${provider} authentication.`);
|
|
199
|
-
}
|
|
200
|
-
function validateAnthropicToken(token) {
|
|
201
|
-
const trimmed = token.trim();
|
|
202
|
-
if (!trimmed) {
|
|
203
|
-
throw new Error("No Anthropic setup token was provided.");
|
|
204
|
-
}
|
|
205
|
-
if (!trimmed.startsWith(ANTHROPIC_SETUP_TOKEN_PREFIX)) {
|
|
206
|
-
throw new Error(`Invalid Anthropic setup token format. Expected prefix ${ANTHROPIC_SETUP_TOKEN_PREFIX}.`);
|
|
207
|
-
}
|
|
208
|
-
if (trimmed.length < ANTHROPIC_SETUP_TOKEN_MIN_LENGTH) {
|
|
209
|
-
throw new Error("Anthropic setup token looks too short.");
|
|
210
|
-
}
|
|
211
|
-
return trimmed;
|
|
212
|
-
}
|
|
213
|
-
async function collectRuntimeAuthCredentials(input, deps) {
|
|
214
|
-
const spawnSync = deps.spawnSync ?? child_process_1.spawnSync;
|
|
215
|
-
const homeDir = deps.homeDir ?? os.homedir();
|
|
216
|
-
if (input.provider === "openai-codex") {
|
|
217
|
-
let token = readCodexAccessToken(homeDir);
|
|
218
|
-
if (!token) {
|
|
219
|
-
(0, runtime_1.emitNervesEvent)({
|
|
220
|
-
component: "daemon",
|
|
221
|
-
event: "daemon.auth_codex_login_start",
|
|
222
|
-
message: "starting codex login for runtime auth",
|
|
223
|
-
meta: { agentName: input.agentName },
|
|
224
|
-
});
|
|
225
|
-
const result = spawnSync("codex", ["login"], { stdio: "inherit" });
|
|
226
|
-
if (result.error) {
|
|
227
|
-
throw new Error(`Failed to run 'codex login': ${result.error.message}`);
|
|
228
|
-
}
|
|
229
|
-
if (result.status !== 0) {
|
|
230
|
-
throw new Error(`'codex login' exited with status ${result.status}.`);
|
|
231
|
-
}
|
|
232
|
-
token = readCodexAccessToken(homeDir);
|
|
233
|
-
if (!token) {
|
|
234
|
-
throw new Error("Codex login completed but no token was found in ~/.codex/auth.json. Re-run `codex login` and try again.");
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
return { oauthAccessToken: token };
|
|
238
|
-
}
|
|
239
|
-
if (input.provider === "anthropic") {
|
|
240
|
-
(0, runtime_1.emitNervesEvent)({
|
|
241
|
-
component: "daemon",
|
|
242
|
-
event: "daemon.auth_claude_setup_start",
|
|
243
|
-
message: "starting claude setup-token for runtime auth",
|
|
244
|
-
meta: { agentName: input.agentName },
|
|
245
|
-
});
|
|
246
|
-
const result = spawnSync("claude", ["setup-token"], { stdio: "inherit" });
|
|
247
|
-
if (result.error) {
|
|
248
|
-
throw new Error(`Failed to run 'claude setup-token': ${result.error.message}`);
|
|
249
|
-
}
|
|
250
|
-
if (result.status !== 0) {
|
|
251
|
-
throw new Error(`'claude setup-token' exited with status ${result.status}.`);
|
|
252
|
-
}
|
|
253
|
-
const prompt = ensurePromptInput(input.promptInput, input.provider);
|
|
254
|
-
const setupToken = validateAnthropicToken(await prompt("Paste the setup token from `claude setup-token`: "));
|
|
255
|
-
return { setupToken };
|
|
256
|
-
}
|
|
257
|
-
if (input.provider === "minimax") {
|
|
258
|
-
const prompt = ensurePromptInput(input.promptInput, input.provider);
|
|
259
|
-
const apiKey = (await prompt("MiniMax API key: ")).trim();
|
|
260
|
-
if (!apiKey)
|
|
261
|
-
throw new Error("MiniMax API key is required.");
|
|
262
|
-
return { apiKey };
|
|
263
|
-
}
|
|
264
|
-
const prompt = ensurePromptInput(input.promptInput, input.provider);
|
|
265
|
-
const apiKey = (await prompt("Azure API key: ")).trim();
|
|
266
|
-
const endpoint = (await prompt("Azure endpoint: ")).trim();
|
|
267
|
-
const deployment = (await prompt("Azure deployment: ")).trim();
|
|
268
|
-
if (!apiKey || !endpoint || !deployment) {
|
|
269
|
-
throw new Error("Azure API key, endpoint, and deployment are required.");
|
|
270
|
-
}
|
|
271
|
-
return { apiKey, endpoint, deployment };
|
|
272
|
-
}
|
|
273
|
-
async function resolveHatchCredentials(input) {
|
|
274
|
-
const prompt = input.promptInput;
|
|
275
|
-
const credentials = { ...(input.credentials ?? {}) };
|
|
276
|
-
if (input.provider === "anthropic" && !credentials.setupToken && input.runAuthFlow) {
|
|
277
|
-
const result = await input.runAuthFlow({
|
|
278
|
-
agentName: input.agentName,
|
|
279
|
-
provider: "anthropic",
|
|
280
|
-
promptInput: prompt,
|
|
281
|
-
});
|
|
282
|
-
Object.assign(credentials, result.credentials);
|
|
283
|
-
}
|
|
284
|
-
if (input.provider === "anthropic" && !credentials.setupToken && prompt) {
|
|
285
|
-
credentials.setupToken = await prompt("Anthropic setup-token: ");
|
|
286
|
-
}
|
|
287
|
-
if (input.provider === "openai-codex" && !credentials.oauthAccessToken && input.runAuthFlow) {
|
|
288
|
-
const result = await input.runAuthFlow({
|
|
289
|
-
agentName: input.agentName,
|
|
290
|
-
provider: "openai-codex",
|
|
291
|
-
promptInput: prompt,
|
|
292
|
-
});
|
|
293
|
-
Object.assign(credentials, result.credentials);
|
|
294
|
-
}
|
|
295
|
-
if (input.provider === "openai-codex" && !credentials.oauthAccessToken && prompt) {
|
|
296
|
-
credentials.oauthAccessToken = await prompt("OpenAI Codex OAuth token: ");
|
|
297
|
-
}
|
|
298
|
-
if (input.provider === "minimax" && !credentials.apiKey && prompt) {
|
|
299
|
-
credentials.apiKey = await prompt("MiniMax API key: ");
|
|
300
|
-
}
|
|
301
|
-
if (input.provider === "azure") {
|
|
302
|
-
if (!credentials.apiKey && prompt)
|
|
303
|
-
credentials.apiKey = await prompt("Azure API key: ");
|
|
304
|
-
if (!credentials.endpoint && prompt)
|
|
305
|
-
credentials.endpoint = await prompt("Azure endpoint: ");
|
|
306
|
-
if (!credentials.deployment && prompt)
|
|
307
|
-
credentials.deployment = await prompt("Azure deployment: ");
|
|
308
|
-
}
|
|
309
|
-
return credentials;
|
|
310
|
-
}
|
|
311
|
-
function applyCredentials(secrets, provider, credentials) {
|
|
312
|
-
if (provider === "anthropic") {
|
|
313
|
-
secrets.providers.anthropic.setupToken = credentials.setupToken.trim();
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
if (provider === "openai-codex") {
|
|
317
|
-
secrets.providers["openai-codex"].oauthAccessToken = credentials.oauthAccessToken.trim();
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
if (provider === "minimax") {
|
|
321
|
-
secrets.providers.minimax.apiKey = credentials.apiKey.trim();
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
secrets.providers.azure.apiKey = credentials.apiKey.trim();
|
|
325
|
-
secrets.providers.azure.endpoint = credentials.endpoint.trim();
|
|
326
|
-
secrets.providers.azure.deployment = credentials.deployment.trim();
|
|
327
|
-
}
|
|
328
|
-
async function runRuntimeAuthFlow(input, deps = {}) {
|
|
329
|
-
(0, runtime_1.emitNervesEvent)({
|
|
330
|
-
component: "daemon",
|
|
331
|
-
event: "daemon.auth_flow_start",
|
|
332
|
-
message: "starting runtime auth flow",
|
|
333
|
-
meta: { agentName: input.agentName, provider: input.provider },
|
|
334
|
-
});
|
|
335
|
-
const homeDir = deps.homeDir ?? os.homedir();
|
|
336
|
-
const credentials = await collectRuntimeAuthCredentials(input, deps);
|
|
337
|
-
const { secretsPath } = writeProviderCredentials(input.agentName, input.provider, credentials, { homeDir });
|
|
338
|
-
(0, runtime_1.emitNervesEvent)({
|
|
339
|
-
component: "daemon",
|
|
340
|
-
event: "daemon.auth_flow_end",
|
|
341
|
-
message: "completed runtime auth flow",
|
|
342
|
-
meta: { agentName: input.agentName, provider: input.provider, secretsPath },
|
|
343
|
-
});
|
|
344
|
-
return {
|
|
345
|
-
agentName: input.agentName,
|
|
346
|
-
provider: input.provider,
|
|
347
|
-
secretsPath,
|
|
348
|
-
message: `authenticated ${input.agentName} with ${input.provider}`,
|
|
349
|
-
credentials,
|
|
350
|
-
};
|
|
351
|
-
}
|