@ouro.bot/cli 0.1.0-alpha.56 → 0.1.0-alpha.560
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 +3596 -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 +248 -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/elevenlabs.js +125 -0
- package/dist/senses/voice/index.js +22 -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 +133 -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
|
@@ -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
|
-
}
|
|
@@ -1,178 +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.installOuroCommand = installOuroCommand;
|
|
37
|
-
const fs = __importStar(require("fs"));
|
|
38
|
-
const os = __importStar(require("os"));
|
|
39
|
-
const path = __importStar(require("path"));
|
|
40
|
-
const runtime_1 = require("../../nerves/runtime");
|
|
41
|
-
const CLI_PACKAGE_SPECIFIER = "@ouro.bot/cli@alpha";
|
|
42
|
-
const WRAPPER_SCRIPT = `#!/bin/sh
|
|
43
|
-
exec npx --yes ${CLI_PACKAGE_SPECIFIER} "$@"
|
|
44
|
-
`;
|
|
45
|
-
function detectShellProfile(homeDir, shell) {
|
|
46
|
-
if (!shell)
|
|
47
|
-
return null;
|
|
48
|
-
const base = path.basename(shell);
|
|
49
|
-
if (base === "zsh")
|
|
50
|
-
return path.join(homeDir, ".zshrc");
|
|
51
|
-
if (base === "bash") {
|
|
52
|
-
// macOS uses .bash_profile, Linux uses .bashrc
|
|
53
|
-
const profilePath = path.join(homeDir, ".bash_profile");
|
|
54
|
-
return profilePath;
|
|
55
|
-
}
|
|
56
|
-
if (base === "fish")
|
|
57
|
-
return path.join(homeDir, ".config", "fish", "config.fish");
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
function isBinDirInPath(binDir, envPath) {
|
|
61
|
-
return envPath.split(path.delimiter).some((p) => p === binDir);
|
|
62
|
-
}
|
|
63
|
-
function buildPathExportLine(binDir, shell) {
|
|
64
|
-
const base = shell ? path.basename(shell) : /* v8 ignore next -- unreachable: only called when detectShellProfile returns non-null, which requires shell @preserve */ "";
|
|
65
|
-
if (base === "fish") {
|
|
66
|
-
return `\n# Added by ouro\nset -gx PATH ${binDir} $PATH\n`;
|
|
67
|
-
}
|
|
68
|
-
return `\n# Added by ouro\nexport PATH="${binDir}:$PATH"\n`;
|
|
69
|
-
}
|
|
70
|
-
function installOuroCommand(deps = {}) {
|
|
71
|
-
/* v8 ignore start -- dep defaults: only used in real runtime, tests always inject @preserve */
|
|
72
|
-
const platform = deps.platform ?? process.platform;
|
|
73
|
-
const homeDir = deps.homeDir ?? os.homedir();
|
|
74
|
-
const existsSync = deps.existsSync ?? fs.existsSync;
|
|
75
|
-
const mkdirSync = deps.mkdirSync ?? fs.mkdirSync;
|
|
76
|
-
const writeFileSync = deps.writeFileSync ?? fs.writeFileSync;
|
|
77
|
-
const readFileSync = deps.readFileSync ?? ((p, enc) => fs.readFileSync(p, enc));
|
|
78
|
-
const appendFileSync = deps.appendFileSync ?? fs.appendFileSync;
|
|
79
|
-
const chmodSync = deps.chmodSync ?? fs.chmodSync;
|
|
80
|
-
const envPath = deps.envPath ?? process.env.PATH ?? "";
|
|
81
|
-
const shell = deps.shell ?? process.env.SHELL;
|
|
82
|
-
/* v8 ignore stop */
|
|
83
|
-
if (platform === "win32") {
|
|
84
|
-
(0, runtime_1.emitNervesEvent)({
|
|
85
|
-
component: "daemon",
|
|
86
|
-
event: "daemon.ouro_path_install_skip",
|
|
87
|
-
message: "skipped ouro PATH install on Windows",
|
|
88
|
-
meta: { platform },
|
|
89
|
-
});
|
|
90
|
-
return { installed: false, scriptPath: null, pathReady: false, shellProfileUpdated: null, skippedReason: "windows" };
|
|
91
|
-
}
|
|
92
|
-
const binDir = path.join(homeDir, ".local", "bin");
|
|
93
|
-
const scriptPath = path.join(binDir, "ouro");
|
|
94
|
-
(0, runtime_1.emitNervesEvent)({
|
|
95
|
-
component: "daemon",
|
|
96
|
-
event: "daemon.ouro_path_install_start",
|
|
97
|
-
message: "installing ouro command to PATH",
|
|
98
|
-
meta: { scriptPath, binDir },
|
|
99
|
-
});
|
|
100
|
-
// If ouro already exists, check content and repair if stale
|
|
101
|
-
if (existsSync(scriptPath)) {
|
|
102
|
-
let existingContent = "";
|
|
103
|
-
try {
|
|
104
|
-
existingContent = readFileSync(scriptPath, "utf-8");
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
// Can't read — treat as stale, will overwrite below
|
|
108
|
-
}
|
|
109
|
-
if (existingContent === WRAPPER_SCRIPT) {
|
|
110
|
-
(0, runtime_1.emitNervesEvent)({
|
|
111
|
-
component: "daemon",
|
|
112
|
-
event: "daemon.ouro_path_install_skip",
|
|
113
|
-
message: "ouro command already installed",
|
|
114
|
-
meta: { scriptPath },
|
|
115
|
-
});
|
|
116
|
-
return { installed: false, scriptPath, pathReady: isBinDirInPath(binDir, envPath), shellProfileUpdated: null, skippedReason: "already-installed" };
|
|
117
|
-
}
|
|
118
|
-
// Content is stale — repair by overwriting
|
|
119
|
-
(0, runtime_1.emitNervesEvent)({
|
|
120
|
-
component: "daemon",
|
|
121
|
-
event: "daemon.ouro_path_install_repair",
|
|
122
|
-
message: "repairing stale ouro wrapper script",
|
|
123
|
-
meta: { scriptPath },
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
try {
|
|
127
|
-
mkdirSync(binDir, { recursive: true });
|
|
128
|
-
writeFileSync(scriptPath, WRAPPER_SCRIPT, { mode: 0o755 });
|
|
129
|
-
chmodSync(scriptPath, 0o755);
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
(0, runtime_1.emitNervesEvent)({
|
|
133
|
-
level: "warn",
|
|
134
|
-
component: "daemon",
|
|
135
|
-
event: "daemon.ouro_path_install_error",
|
|
136
|
-
message: "failed to install ouro command",
|
|
137
|
-
meta: { error: error instanceof Error ? error.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(error) },
|
|
138
|
-
});
|
|
139
|
-
return { installed: false, scriptPath: null, pathReady: false, shellProfileUpdated: null, skippedReason: error instanceof Error ? error.message : /* v8 ignore next -- defensive @preserve */ String(error) };
|
|
140
|
-
}
|
|
141
|
-
// Check if ~/.local/bin is already in PATH
|
|
142
|
-
let shellProfileUpdated = null;
|
|
143
|
-
const pathReady = isBinDirInPath(binDir, envPath);
|
|
144
|
-
if (!pathReady) {
|
|
145
|
-
const profilePath = detectShellProfile(homeDir, shell);
|
|
146
|
-
if (profilePath) {
|
|
147
|
-
try {
|
|
148
|
-
let existing = "";
|
|
149
|
-
try {
|
|
150
|
-
existing = readFileSync(profilePath, "utf-8");
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
// Profile doesn't exist yet — that's fine, we'll create it
|
|
154
|
-
}
|
|
155
|
-
if (!existing.includes(binDir)) {
|
|
156
|
-
appendFileSync(profilePath, buildPathExportLine(binDir, shell));
|
|
157
|
-
shellProfileUpdated = profilePath;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
catch (error) {
|
|
161
|
-
(0, runtime_1.emitNervesEvent)({
|
|
162
|
-
level: "warn",
|
|
163
|
-
component: "daemon",
|
|
164
|
-
event: "daemon.ouro_path_profile_error",
|
|
165
|
-
message: "failed to update shell profile for PATH",
|
|
166
|
-
meta: { profilePath, error: error instanceof Error ? error.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(error) },
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
(0, runtime_1.emitNervesEvent)({
|
|
172
|
-
component: "daemon",
|
|
173
|
-
event: "daemon.ouro_path_install_end",
|
|
174
|
-
message: "ouro command installed",
|
|
175
|
-
meta: { scriptPath, pathReady, shellProfileUpdated },
|
|
176
|
-
});
|
|
177
|
-
return { installed: true, scriptPath, pathReady, shellProfileUpdated };
|
|
178
|
-
}
|
|
@@ -1,166 +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.installSubagentsForAvailableCli = installSubagentsForAvailableCli;
|
|
37
|
-
const fs = __importStar(require("fs"));
|
|
38
|
-
const os = __importStar(require("os"));
|
|
39
|
-
const path = __importStar(require("path"));
|
|
40
|
-
const child_process_1 = require("child_process");
|
|
41
|
-
const runtime_1 = require("../../nerves/runtime");
|
|
42
|
-
function detectCliBinary(binary) {
|
|
43
|
-
const result = (0, child_process_1.spawnSync)("which", [binary], { encoding: "utf-8" });
|
|
44
|
-
if (result.status !== 0)
|
|
45
|
-
return null;
|
|
46
|
-
const resolved = result.stdout.trim();
|
|
47
|
-
return resolved.length > 0 ? resolved : null;
|
|
48
|
-
}
|
|
49
|
-
function listSubagentSources(subagentsDir) {
|
|
50
|
-
if (!fs.existsSync(subagentsDir))
|
|
51
|
-
return [];
|
|
52
|
-
return fs.readdirSync(subagentsDir)
|
|
53
|
-
.filter((name) => name.endsWith(".md"))
|
|
54
|
-
.filter((name) => name !== "README.md")
|
|
55
|
-
.map((name) => path.join(subagentsDir, name))
|
|
56
|
-
.sort((a, b) => a.localeCompare(b));
|
|
57
|
-
}
|
|
58
|
-
function pathExists(target) {
|
|
59
|
-
try {
|
|
60
|
-
fs.lstatSync(target);
|
|
61
|
-
return true;
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
function isSameFile(source, target) {
|
|
68
|
-
try {
|
|
69
|
-
const sourceStats = fs.statSync(source);
|
|
70
|
-
const targetStats = fs.statSync(target);
|
|
71
|
-
return sourceStats.dev === targetStats.dev && sourceStats.ino === targetStats.ino;
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
function ensureSymlink(source, target) {
|
|
78
|
-
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
79
|
-
if (pathExists(target)) {
|
|
80
|
-
const stats = fs.lstatSync(target);
|
|
81
|
-
if (stats.isSymbolicLink()) {
|
|
82
|
-
const linkedPath = fs.readlinkSync(target);
|
|
83
|
-
if (linkedPath === source)
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
fs.unlinkSync(target);
|
|
87
|
-
}
|
|
88
|
-
fs.symlinkSync(source, target);
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
function ensureHardLink(source, target) {
|
|
92
|
-
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
93
|
-
if (pathExists(target)) {
|
|
94
|
-
const stats = fs.lstatSync(target);
|
|
95
|
-
if (!stats.isSymbolicLink() && isSameFile(source, target)) {
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
fs.unlinkSync(target);
|
|
99
|
-
}
|
|
100
|
-
fs.linkSync(source, target);
|
|
101
|
-
return true;
|
|
102
|
-
}
|
|
103
|
-
function hasOpenAiSkillHome(homeDir) {
|
|
104
|
-
return pathExists(path.join(homeDir, ".codex")) || pathExists(path.join(homeDir, ".agents"));
|
|
105
|
-
}
|
|
106
|
-
function openAiSkillTargets(homeDir, source) {
|
|
107
|
-
const skillName = path.basename(source, ".md");
|
|
108
|
-
return [path.join(homeDir, ".agents", "skills", skillName, "SKILL.md")];
|
|
109
|
-
}
|
|
110
|
-
async function installSubagentsForAvailableCli(options = {}) {
|
|
111
|
-
const repoRoot = options.repoRoot ?? path.resolve(__dirname, "..", "..", "..");
|
|
112
|
-
const homeDir = options.homeDir ?? os.homedir();
|
|
113
|
-
const which = options.which ?? detectCliBinary;
|
|
114
|
-
const subagentsDir = path.join(repoRoot, "subagents");
|
|
115
|
-
const sources = listSubagentSources(subagentsDir);
|
|
116
|
-
const notes = [];
|
|
117
|
-
(0, runtime_1.emitNervesEvent)({
|
|
118
|
-
component: "daemon",
|
|
119
|
-
event: "daemon.subagent_install_start",
|
|
120
|
-
message: "starting subagent auto-install",
|
|
121
|
-
meta: { sources: sources.length },
|
|
122
|
-
});
|
|
123
|
-
if (sources.length === 0) {
|
|
124
|
-
notes.push(`no subagent files found at ${subagentsDir}`);
|
|
125
|
-
return { claudeInstalled: 0, codexInstalled: 0, notes };
|
|
126
|
-
}
|
|
127
|
-
let claudeInstalled = 0;
|
|
128
|
-
let codexInstalled = 0;
|
|
129
|
-
const claudePath = which("claude");
|
|
130
|
-
if (!claudePath) {
|
|
131
|
-
notes.push("claude CLI not found; skipping subagent install");
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
const claudeAgentsDir = path.join(homeDir, ".claude", "agents");
|
|
135
|
-
for (const source of sources) {
|
|
136
|
-
const target = path.join(claudeAgentsDir, path.basename(source));
|
|
137
|
-
if (ensureSymlink(source, target)) {
|
|
138
|
-
claudeInstalled += 1;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
const codexPath = which("codex");
|
|
143
|
-
if (!codexPath && !hasOpenAiSkillHome(homeDir)) {
|
|
144
|
-
notes.push("codex CLI/config not found; skipping subagent install");
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
for (const source of sources) {
|
|
148
|
-
let installedForSkill = false;
|
|
149
|
-
for (const target of openAiSkillTargets(homeDir, source)) {
|
|
150
|
-
if (ensureHardLink(source, target)) {
|
|
151
|
-
installedForSkill = true;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
if (installedForSkill) {
|
|
155
|
-
codexInstalled += 1;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
(0, runtime_1.emitNervesEvent)({
|
|
160
|
-
component: "daemon",
|
|
161
|
-
event: "daemon.subagent_install_end",
|
|
162
|
-
message: "completed subagent auto-install",
|
|
163
|
-
meta: { claudeInstalled, codexInstalled, notes: notes.length },
|
|
164
|
-
});
|
|
165
|
-
return { claudeInstalled, codexInstalled, notes };
|
|
166
|
-
}
|