@ouro.bot/cli 0.1.0-alpha.83 → 0.1.0-alpha.831
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +154 -23
- package/RepairGuide.ouro/agent.json +5 -0
- package/RepairGuide.ouro/psyche/IDENTITY.md +19 -0
- package/RepairGuide.ouro/psyche/SOUL.md +55 -0
- package/RepairGuide.ouro/skills/diagnose-broken-remote.md +63 -0
- package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +35 -0
- package/RepairGuide.ouro/skills/diagnose-sync-blocked.md +54 -0
- package/RepairGuide.ouro/skills/diagnose-vault-expired.md +60 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +4 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/assets/bluebubbles-host +264 -0
- package/assets/sanctuary-host-launcher.sh +16 -0
- package/changelog.json +5308 -16
- package/deploy/unraid/Dockerfile +54 -0
- package/deploy/unraid/README.txt +2983 -0
- package/deploy/unraid/audit-container-spec.sh +4 -0
- package/deploy/unraid/container-runtime.json +1 -0
- package/deploy/unraid/docker-man-template-transaction.mjs +711 -0
- package/deploy/unraid/docker-man-template-xml.cjs +105 -0
- package/deploy/unraid/migrate-sanctuary-bundle.mjs +60 -0
- package/deploy/unraid/ouro-events/bootstrap-spool.sh +92 -0
- package/deploy/unraid/ouro-events/emit-event.mjs +310 -0
- package/deploy/unraid/ouro-events/emit-usenet-event.sh +54 -0
- package/deploy/unraid/ouro-events/install-usenet-guard.sh +435 -0
- package/deploy/unraid/ouro-events/usenet-health.sh +176 -0
- package/deploy/unraid/sanctuary-acceptance-adapter.sh +43 -0
- package/deploy/unraid/sanctuary-acceptance-contract.json +198 -0
- package/deploy/unraid/sanctuary-acceptance-harness.sh +23 -0
- package/deploy/unraid/sanctuary-authority-installation.json +36 -0
- package/deploy/unraid/sanctuary-authority-service.sh +30 -0
- package/deploy/unraid/sanctuary-deployment-target.mjs +710 -0
- package/deploy/unraid/sanctuary-safe-rename.py +24 -0
- package/deploy/unraid/sanctuary-unit16-host-broker.mjs +2084 -0
- package/deploy/unraid/sanctuary-unit16-run.sh +560 -0
- package/deploy/unraid/sanctuary-unit18-target-audit.sh +27 -0
- package/deploy/unraid/sanctuary.ouro/agent.json +66 -0
- package/deploy/unraid/sanctuary.ouro/arc/README.md +3 -0
- package/deploy/unraid/sanctuary.ouro/bundle-meta.json +5 -0
- package/deploy/unraid/sanctuary.ouro/habits/sanctuary-health.md +8 -0
- package/deploy/unraid/sanctuary.ouro/mcp/media-mcp.mjs +795 -0
- package/deploy/unraid/sanctuary.ouro/provider-readiness.json +11 -0
- package/deploy/unraid/sanctuary.ouro/psyche/ASPIRATIONS.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/IDENTITY.md +5 -0
- package/deploy/unraid/sanctuary.ouro/psyche/LORE.md +15 -0
- package/deploy/unraid/sanctuary.ouro/psyche/SOUL.md +25 -0
- package/deploy/unraid/sanctuary.ouro/psyche/TACIT.md +15 -0
- package/deploy/unraid/sanctuary.ouro/state/policy/steward.json +7 -0
- package/deploy/unraid/sanctuary.ouro/tool-profiles.json +135 -0
- package/deploy/unraid/sanctuary.xml +28 -0
- package/dist/a2a/card.js +57 -0
- package/dist/a2a/client.js +180 -0
- package/dist/a2a/config.js +50 -0
- package/dist/a2a/delegation-stores.js +56 -0
- package/dist/a2a/did-resolution.js +93 -0
- package/dist/a2a/identity.js +170 -0
- package/dist/a2a/inbound-share.js +107 -0
- package/dist/a2a/mission-result-wire.js +196 -0
- package/dist/a2a/onboarding.js +115 -0
- package/dist/a2a/pin-store.js +132 -0
- package/dist/a2a/seen-ledger.js +120 -0
- package/dist/a2a/server.js +604 -0
- package/dist/a2a/task-store.js +69 -0
- package/dist/a2a/transport.js +45 -0
- package/dist/a2a/types.js +3 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +360 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/evolution.js +490 -0
- package/dist/arc/flight-recorder.js +1034 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +386 -0
- package/dist/arc/packets.js +336 -0
- package/dist/arc/presence.js +185 -0
- package/dist/arc/task-lifecycle.js +57 -0
- package/dist/commerce/store.js +755 -0
- package/dist/commerce/types.js +3 -0
- package/dist/heart/active-work.js +798 -40
- package/dist/heart/agent-entry.js +252 -3
- package/dist/heart/approval-files.js +113 -0
- package/dist/heart/approval-store.js +960 -0
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +18 -0
- package/dist/heart/attachments/sources/telegram.js +71 -0
- package/dist/heart/attachments/store.js +132 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +495 -0
- package/dist/heart/autonomy-budget.js +478 -0
- package/dist/heart/awaiting/await-alert.js +148 -0
- package/dist/heart/awaiting/await-expiry.js +143 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +149 -0
- package/dist/heart/awaiting/await-runtime-state.js +111 -0
- package/dist/heart/awaiting/await-scheduler.js +382 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +137 -17
- package/dist/heart/bridges/store.js +14 -2
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +44 -18
- package/dist/heart/config-registry.js +331 -0
- package/dist/heart/config.js +174 -131
- package/dist/heart/context-loss-gauntlet.js +387 -0
- package/dist/heart/context-loss-sentinel.js +1157 -0
- package/dist/heart/core.js +2169 -581
- package/dist/heart/cross-chat-delivery.js +9 -22
- package/dist/heart/daemon/agent-config-check.js +451 -0
- package/dist/heart/daemon/agent-discovery.js +185 -3
- package/dist/heart/daemon/agent-service.js +542 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/await-private-wake.js +59 -0
- package/dist/heart/daemon/bluebubbles-cli-integration.js +71 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/bluebubbles-host-protocol.js +433 -0
- package/dist/heart/daemon/bluebubbles-host.js +273 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +180 -0
- package/dist/heart/daemon/cli-defaults.js +854 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +8822 -0
- package/dist/heart/daemon/cli-help.js +716 -0
- package/dist/heart/daemon/cli-parse.js +2771 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +777 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/container-credential-bootstrap.js +273 -0
- package/dist/heart/daemon/container-healthcheck.js +112 -0
- package/dist/heart/daemon/container-runtime.js +97 -0
- package/dist/heart/daemon/container-spec-auditor-main.js +171 -0
- package/dist/heart/daemon/container-spec-auditor.js +229 -0
- package/dist/heart/daemon/daemon-bootstrap-startup.js +115 -0
- package/dist/heart/daemon/daemon-cli.js +29 -2349
- package/dist/heart/daemon/daemon-entry.js +930 -11
- package/dist/heart/daemon/daemon-health.js +186 -0
- package/dist/heart/daemon/daemon-rollup.js +57 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +88 -13
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +2084 -105
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +1755 -0
- package/dist/heart/daemon/freshness.js +345 -0
- package/dist/heart/daemon/habit-private-wake.js +61 -0
- package/dist/heart/daemon/health-monitor.js +142 -11
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +135 -1
- package/dist/heart/daemon/http-health-probe.js +80 -0
- package/dist/heart/daemon/human-command-screens.js +234 -0
- package/dist/heart/daemon/human-readiness.js +114 -0
- package/dist/heart/daemon/inner-status.js +78 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +37 -8
- package/dist/heart/daemon/log-tailer.js +79 -10
- package/dist/heart/daemon/logs-prune.js +132 -0
- package/dist/heart/daemon/mcp-canary.js +524 -0
- package/dist/heart/daemon/message-router.js +65 -5
- package/dist/heart/daemon/migrate-to-desk.js +848 -0
- package/dist/heart/daemon/os-cron-deps.js +135 -0
- package/dist/heart/daemon/os-cron.js +22 -14
- package/dist/heart/daemon/ouro-bot-entry.js +4 -2
- package/dist/heart/daemon/ouro-entry.js +3 -1
- package/dist/heart/daemon/plugin-cli.js +432 -0
- package/dist/heart/daemon/process-manager.js +733 -61
- package/dist/heart/daemon/provider-discovery.js +137 -0
- package/dist/heart/daemon/provider-ping-progress.js +83 -0
- package/dist/heart/daemon/prunable-bundle.js +144 -0
- package/dist/heart/daemon/pulse.js +511 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +47 -14
- package/dist/heart/daemon/runtime-metadata.js +2 -30
- package/dist/heart/daemon/runtime-mode.js +13 -2
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sanctuary-acceptance-adapter.js +2654 -0
- package/dist/heart/daemon/sanctuary-acceptance-harness.js +1830 -0
- package/dist/heart/daemon/sanctuary-acceptance-marker.js +267 -0
- package/dist/heart/daemon/sanctuary-acceptance-scenarios.js +955 -0
- package/dist/heart/daemon/sanctuary-authority-codec.js +86 -0
- package/dist/heart/daemon/sanctuary-authority-epoch.js +256 -0
- package/dist/heart/daemon/sanctuary-authority-installation.js +140 -0
- package/dist/heart/daemon/sanctuary-authority-ledger.js +241 -0
- package/dist/heart/daemon/sanctuary-authority-root-lifecycle.js +819 -0
- package/dist/heart/daemon/sanctuary-authority-vault-migration.js +79 -0
- package/dist/heart/daemon/sanctuary-bundle-migration.js +729 -0
- package/dist/heart/daemon/sanctuary-host-authority.js +1008 -0
- package/dist/heart/daemon/sanctuary-host-detached-supervisor.js +494 -0
- package/dist/heart/daemon/sanctuary-host-executor.js +670 -0
- package/dist/heart/daemon/sanctuary-host-linux-kernel.js +334 -0
- package/dist/heart/daemon/sanctuary-host-supervisor-entry.js +207 -0
- package/dist/heart/daemon/sanctuary-host-supervisor.js +95 -0
- package/dist/heart/daemon/sanctuary-package-management.js +103 -0
- package/dist/heart/daemon/sanctuary-scheduler-liveness.js +227 -0
- package/dist/heart/daemon/sanctuary-scheduler-origin.js +132 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-entry.js +445 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-gateway.js +585 -0
- package/dist/heart/daemon/sanctuary-telegram-authority-service.js +630 -0
- package/dist/heart/daemon/sense-manager.js +699 -48
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +1 -1
- package/dist/heart/daemon/socket-client.js +180 -12
- package/dist/heart/daemon/stale-bundle-prune.js +113 -0
- package/dist/heart/daemon/startup-tui.js +339 -0
- package/dist/heart/daemon/supercronic-supervisor.js +282 -0
- package/dist/heart/daemon/task-scheduler.js +117 -39
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +138 -54
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +1 -4
- package/dist/heart/external-events/router.js +1430 -0
- package/dist/heart/frontend-approval-runtime.js +506 -0
- package/dist/heart/frontend-journal.js +215 -0
- package/dist/heart/frontend-session-service.js +237 -0
- package/dist/heart/frontend-socket-client.js +164 -0
- package/dist/heart/frontend-socket.js +400 -0
- package/dist/heart/habits/habit-cancel.js +810 -0
- package/dist/heart/habits/habit-lifecycle.js +1327 -0
- package/dist/heart/habits/habit-migration.js +194 -0
- package/dist/heart/habits/habit-parser.js +278 -0
- package/dist/heart/habits/habit-runtime-state.js +93 -0
- package/dist/heart/habits/habit-scheduler.js +653 -0
- package/dist/heart/habits/habit-session-summary.js +318 -0
- package/dist/heart/habits/habit-session.js +636 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +55 -62
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +12 -9
- package/dist/heart/{daemon → hatch}/specialist-tools.js +53 -18
- package/dist/heart/identity.js +196 -59
- package/dist/heart/kept-notes.js +289 -0
- package/dist/heart/kicks.js +1 -1
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +356 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +98 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +398 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +129 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +39 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +197 -0
- package/dist/heart/mailbox/readers/agent-machine.js +428 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +823 -0
- package/dist/heart/mailbox/readers/sessions.js +231 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +696 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +11 -0
- package/dist/heart/orientation-frame.js +345 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/primitives.js +1 -1
- package/dist/heart/private-runtime/decision-renderer.js +158 -0
- package/dist/heart/private-runtime/index.js +18 -0
- package/dist/heart/private-runtime/ledger.js +221 -0
- package/dist/heart/private-runtime/policy.js +252 -0
- package/dist/heart/private-runtime/types.js +2 -0
- package/dist/heart/progress-story.js +1 -1
- package/dist/heart/provider-attempt.js +137 -0
- package/dist/heart/provider-binding-resolver.js +273 -0
- package/dist/heart/provider-credentials.js +449 -0
- package/dist/heart/provider-failover.js +311 -0
- package/dist/heart/provider-models.js +96 -0
- package/dist/heart/provider-ping.js +265 -0
- package/dist/heart/provider-readiness-cache.js +119 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +173 -60
- package/dist/heart/providers/azure.js +23 -11
- package/dist/heart/providers/error-classification.js +127 -0
- package/dist/heart/providers/github-copilot.js +34 -38
- package/dist/heart/providers/minimax-vlm.js +189 -0
- package/dist/heart/providers/minimax.js +26 -8
- package/dist/heart/providers/openai-codex-token.js +349 -0
- package/dist/heart/providers/openai-codex.js +55 -40
- package/dist/heart/providers/openai-compatible.js +177 -0
- package/dist/heart/run-ledger.js +247 -0
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +607 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +22 -4
- package/dist/heart/session-activity.js +92 -24
- package/dist/heart/session-events.js +1504 -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-redaction-repair-cli-main.js +31 -0
- package/dist/heart/session-redaction-repair.js +552 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +183 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/start-of-turn-packet.js +372 -0
- package/dist/heart/steward-policy.js +618 -0
- package/dist/heart/streaming.js +604 -207
- package/dist/heart/structured-output.js +196 -0
- package/dist/heart/sync-classification.js +176 -0
- package/dist/heart/sync.js +449 -0
- package/dist/heart/target-resolution.js +11 -7
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-approval.js +382 -0
- package/dist/heart/tool-description.js +155 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +482 -0
- package/dist/heart/turn-execution-lease.js +30 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +6 -5
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +432 -0
- package/dist/heart/versioning/ouro-recovery-launcher.js +76 -0
- package/dist/heart/versioning/ouro-version-manager.js +409 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +40 -8
- package/dist/heart/{daemon → versioning}/update-checker.js +6 -1
- package/dist/heart/versioning/update-hooks.js +154 -0
- package/dist/heart/versioning/version-intent.js +114 -0
- package/dist/heart/work-card.js +380 -0
- package/dist/mailbox-ui/assets/index-Cyv4mw3Y.js +1 -0
- package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
- package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
- package/dist/mailbox-ui/index.html +16 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +889 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/cache-sync-cli.js +58 -0
- package/dist/mailroom/core.js +803 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +568 -0
- package/dist/mailroom/hosted-cache-sync.js +384 -0
- package/dist/mailroom/mbox-import.js +393 -0
- package/dist/mailroom/migration.js +164 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +292 -0
- package/dist/mailroom/search-cache.js +513 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +24 -2
- package/dist/mind/context.js +309 -111
- package/dist/mind/desk-section.js +362 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +68 -77
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/{associative-recall.js → note-search.js} +47 -58
- package/dist/mind/obligation-steering.js +199 -3
- package/dist/mind/pending.js +36 -10
- package/dist/mind/prompt-budget.js +479 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1050 -189
- package/dist/mind/provenance-trust.js +26 -0
- package/dist/mind/record-paths.js +312 -0
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/session-transaction.js +564 -0
- package/dist/nerves/cli-logging.js +7 -1
- package/dist/nerves/coverage/audit-rules.js +15 -6
- package/dist/nerves/coverage/audit.js +28 -2
- package/dist/nerves/coverage/cli.js +1 -1
- package/dist/nerves/coverage/contract.js +5 -5
- package/dist/nerves/coverage/file-completeness.js +139 -5
- package/dist/nerves/coverage/run-artifacts.js +55 -35
- package/dist/nerves/coverage/source-scanner.js +4 -4
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +293 -9
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/redact.js +79 -0
- package/dist/nerves/review/cli-main.js +5 -0
- package/dist/nerves/review/cli.js +156 -0
- package/dist/nerves/review/core.js +159 -0
- package/dist/nerves/runtime.js +17 -1
- package/dist/repertoire/ado-client.js +15 -56
- package/dist/repertoire/ado-semantic.js +16 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +1045 -0
- package/dist/repertoire/bundle-templates.js +71 -0
- package/dist/repertoire/bw-installer.js +180 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +331 -0
- package/dist/repertoire/coding/feedback.js +174 -32
- package/dist/repertoire/coding/index.js +15 -3
- package/dist/repertoire/coding/manager.js +159 -10
- package/dist/repertoire/coding/spawner.js +58 -11
- package/dist/repertoire/coding/tools.js +221 -15
- package/dist/repertoire/coding/workbench-client.js +272 -0
- package/dist/repertoire/coding/workbench-manager.js +346 -0
- package/dist/repertoire/commerce-errors.js +109 -0
- package/dist/repertoire/commerce-self-test.js +156 -0
- package/dist/repertoire/credential-access.js +178 -0
- package/dist/repertoire/desk/classifier.js +362 -0
- package/dist/repertoire/duffel-client.js +185 -0
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +811 -18
- package/dist/repertoire/mcp-client.js +44 -3
- package/dist/repertoire/mcp-manager.js +427 -139
- package/dist/repertoire/mcp-tools.js +124 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/relationship-authorization.js +322 -0
- package/dist/repertoire/shell-sessions.js +134 -0
- package/dist/repertoire/skills.js +48 -4
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-arguments.js +170 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +699 -0
- package/dist/repertoire/tools-attachments.js +322 -0
- package/dist/repertoire/tools-awaiting.js +575 -0
- package/dist/repertoire/tools-base.js +77 -1138
- package/dist/repertoire/tools-bluebubbles.js +2 -0
- package/dist/repertoire/tools-bridge.js +144 -0
- package/dist/repertoire/tools-bundle.js +993 -0
- package/dist/repertoire/tools-commerce.js +253 -0
- package/dist/repertoire/tools-config.js +186 -0
- package/dist/repertoire/tools-continuity.js +575 -0
- package/dist/repertoire/tools-credential.js +383 -0
- package/dist/repertoire/tools-evolution.js +527 -0
- package/dist/repertoire/tools-files.js +344 -0
- package/dist/repertoire/tools-flight.js +290 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-habits.js +103 -0
- package/dist/repertoire/tools-mail.js +1828 -0
- package/dist/repertoire/tools-notes.js +485 -0
- package/dist/repertoire/tools-obligations.js +182 -0
- package/dist/repertoire/tools-orientation.js +31 -0
- package/dist/repertoire/tools-record.js +482 -0
- package/dist/repertoire/tools-rsvp.js +139 -0
- package/dist/repertoire/tools-runtime.js +150 -0
- package/dist/repertoire/tools-sanctuary-host.js +202 -0
- package/dist/repertoire/tools-session.js +1133 -0
- package/dist/repertoire/tools-shell.js +149 -0
- package/dist/repertoire/tools-steward-policy.js +119 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +369 -0
- package/dist/repertoire/tools-teams.js +12 -39
- package/dist/repertoire/tools-telegram-contacts.js +37 -0
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -0
- package/dist/repertoire/tools-unraid.js +531 -0
- package/dist/repertoire/tools-user-profile.js +146 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice.js +145 -0
- package/dist/repertoire/tools.js +494 -148
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/unraid-client.js +155 -0
- package/dist/repertoire/unraid-restart.js +339 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +628 -0
- package/dist/rsvp/aisleplanner-client.js +354 -0
- package/dist/rsvp/cli.js +926 -0
- package/dist/rsvp/config.js +327 -0
- package/dist/rsvp/cutover.js +433 -0
- package/dist/rsvp/diagnostics.js +232 -0
- package/dist/rsvp/diff-renderer.js +176 -0
- package/dist/rsvp/habit-policy.js +110 -0
- package/dist/rsvp/habit-stage.js +123 -0
- package/dist/rsvp/incident-bundle.js +97 -0
- package/dist/rsvp/migration.js +204 -0
- package/dist/rsvp/native-habit-runner.js +630 -0
- package/dist/rsvp/outbound-state.js +628 -0
- package/dist/rsvp/query.js +118 -0
- package/dist/rsvp/replay.js +233 -0
- package/dist/rsvp/snapshot.js +232 -0
- package/dist/rsvp/spend-ledger.js +175 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/a2a-entry.js +115 -0
- package/dist/senses/acp-server.js +386 -0
- package/dist/senses/attention-queue.js +186 -0
- package/dist/senses/await-turn-message.js +58 -0
- package/dist/senses/bluebubbles/active-turns.js +216 -0
- package/dist/senses/bluebubbles/attachment-cache.js +53 -0
- package/dist/senses/bluebubbles/attachment-download.js +137 -0
- package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +355 -40
- package/dist/senses/bluebubbles/context-packet.js +207 -0
- package/dist/senses/bluebubbles/context-smoke.js +144 -0
- package/dist/senses/bluebubbles/entry.js +90 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +21 -3
- package/dist/senses/bluebubbles/index.js +3841 -0
- package/dist/senses/bluebubbles/latest-turn.js +311 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +121 -71
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +159 -28
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +24 -13
- package/dist/senses/bluebubbles/outbound-state.js +308 -0
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/reaction-policy.js +47 -0
- package/dist/senses/bluebubbles/replay.js +284 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +30 -2
- package/dist/senses/bluebubbles/semantic-receipts.js +1986 -0
- package/dist/senses/{bluebubbles-session-cleanup.js → bluebubbles/session-cleanup.js} +1 -1
- package/dist/senses/bluebubbles/webhook-registration.js +228 -0
- package/dist/senses/bluebubbles-meta-guard.js +39 -0
- package/dist/senses/cli/bracketed-paste.js +82 -0
- package/dist/senses/cli/image-paste.js +287 -0
- package/dist/senses/cli/image-ref-navigation.js +75 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/input-keys.js +174 -0
- package/dist/senses/cli/kill-ring.js +86 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +607 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +85 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +241 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +60 -8
- package/dist/senses/cli.js +604 -320
- package/dist/senses/commands.js +66 -3
- package/dist/senses/context-packet-ledger.js +371 -0
- package/dist/senses/context-packets.js +154 -0
- package/dist/senses/habit-lifecycle-guard.js +24 -0
- package/dist/senses/habit-turn-message.js +160 -0
- package/dist/senses/ingress-evidence.js +2 -0
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +524 -0
- package/dist/senses/pipeline.js +1115 -204
- package/dist/senses/private-runtime-worker.js +859 -0
- package/dist/senses/private-runtime.js +1517 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/root-host-approval-port.js +345 -0
- package/dist/senses/root-host-approval-runtime.js +393 -0
- package/dist/senses/sanctuary-authority-resident.js +102 -0
- package/dist/senses/sanctuary-download-credit-presentation.js +31 -0
- package/dist/senses/sanctuary-full-visibility-contract.js +302 -0
- package/dist/senses/sanctuary-grounding.js +118 -0
- package/dist/senses/sanctuary-health-acceptance-probe-entry.js +12 -0
- package/dist/senses/sanctuary-health-acceptance-probe.js +774 -0
- package/dist/senses/sanctuary-health-runner.js +100 -0
- package/dist/senses/sanctuary-health.js +408 -0
- package/dist/senses/sanctuary-install-state-contract.js +126 -0
- package/dist/senses/sanctuary-interactive-control.js +410 -0
- package/dist/senses/sanctuary-media-catalog-contract.js +297 -0
- package/dist/senses/sanctuary-media-optimization.js +514 -0
- package/dist/senses/sanctuary-runtime.js +340 -0
- package/dist/senses/sanctuary-sab.js +85 -0
- package/dist/senses/sanctuary-storage-optimization-contract.js +32 -0
- package/dist/senses/shared-turn.js +772 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +519 -218
- package/dist/senses/telegram-admission.js +718 -0
- package/dist/senses/telegram-approval-runtime.js +793 -0
- package/dist/senses/telegram-attachments.js +186 -0
- package/dist/senses/telegram-audit-ledger.js +220 -0
- package/dist/senses/telegram-authority-transport.js +231 -0
- package/dist/senses/telegram-client.js +1749 -0
- package/dist/senses/telegram-effect-adapter.js +896 -0
- package/dist/senses/telegram-entry.js +83 -0
- package/dist/senses/telegram.js +2324 -0
- package/dist/senses/trust-gate.js +104 -9
- package/dist/senses/voice/audio-playback.js +237 -0
- package/dist/senses/voice/audio-routing.js +119 -0
- package/dist/senses/voice/elevenlabs.js +202 -0
- package/dist/senses/voice/floor-control.js +431 -0
- package/dist/senses/voice/floor-controller.js +115 -0
- package/dist/senses/voice/golden-path.js +116 -0
- package/dist/senses/voice/index.js +29 -0
- package/dist/senses/voice/meeting.js +113 -0
- package/dist/senses/voice/outbound.js +190 -0
- package/dist/senses/voice/phone.js +33 -0
- package/dist/senses/voice/playback.js +139 -0
- package/dist/senses/voice/realtime-eval.js +496 -0
- package/dist/senses/voice/realtime-trace.js +531 -0
- package/dist/senses/voice/transcript.js +70 -0
- package/dist/senses/voice/turn.js +191 -0
- package/dist/senses/voice/twilio-phone-runtime.js +807 -0
- package/dist/senses/voice/twilio-phone.js +5031 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +81 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/dist/util/frontmatter.js +69 -0
- package/npm-shrinkwrap.json +8138 -0
- package/package.json +72 -13
- package/skills/agent-commerce.md +113 -0
- package/skills/browser-navigation.md +117 -0
- package/skills/commerce-setup-guide.md +116 -0
- package/skills/commerce-setup.md +84 -0
- package/skills/configure-dev-tools.md +99 -0
- package/skills/travel-planning.md +138 -0
- package/dist/heart/daemon/auth-flow.js +0 -430
- package/dist/heart/daemon/ouro-path-installer.js +0 -260
- package/dist/heart/daemon/ouro-version-manager.js +0 -171
- package/dist/heart/daemon/update-hooks.js +0 -138
- package/dist/heart/obligations.js +0 -191
- package/dist/heart/safe-workspace.js +0 -228
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/friends/channel.js +0 -84
- package/dist/mind/friends/group-context.js +0 -144
- package/dist/mind/friends/resolver.js +0 -84
- package/dist/mind/friends/store-file.js +0 -190
- package/dist/mind/friends/store.js +0 -4
- package/dist/mind/friends/tokens.js +0 -26
- package/dist/mind/friends/trust-explanation.js +0 -74
- package/dist/mind/friends/types.js +0 -29
- package/dist/repertoire/tasks/board.js +0 -134
- package/dist/repertoire/tasks/index.js +0 -224
- package/dist/repertoire/tasks/lifecycle.js +0 -80
- package/dist/repertoire/tasks/middleware.js +0 -65
- package/dist/repertoire/tasks/parser.js +0 -173
- package/dist/repertoire/tasks/scanner.js +0 -132
- package/dist/repertoire/tasks/transitions.js +0 -144
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1181
- package/dist/senses/debug-activity.js +0 -154
- package/dist/senses/inner-dialog-worker.js +0 -90
- package/dist/senses/inner-dialog.js +0 -525
- package/subagents/README.md +0 -7
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/{repertoire/tasks/types.js → heart/attachments/sources/adapter.js} +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CLI command types and dependency interface.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from daemon-cli.ts — the OuroCliCommand union and OuroCliDeps
|
|
6
|
+
* interface are the contract between parsing, execution, and default wiring.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.summarizeProviderLane = summarizeProviderLane;
|
|
4
|
+
exports.summarizeProvidersForConnect = summarizeProvidersForConnect;
|
|
5
|
+
exports.connectEntryNeedsAttention = connectEntryNeedsAttention;
|
|
6
|
+
exports.renderConnectBay = renderConnectBay;
|
|
7
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
8
|
+
const terminal_ui_1 = require("./terminal-ui");
|
|
9
|
+
const readiness_repair_1 = require("./readiness-repair");
|
|
10
|
+
const CONNECT_STATUS_PRIORITY = {
|
|
11
|
+
"needs attention": 0,
|
|
12
|
+
locked: 1,
|
|
13
|
+
"needs credentials": 2,
|
|
14
|
+
"needs setup": 3,
|
|
15
|
+
missing: 4,
|
|
16
|
+
"not attached": 5,
|
|
17
|
+
ready: 6,
|
|
18
|
+
attached: 6,
|
|
19
|
+
};
|
|
20
|
+
function escapeRegExp(value) {
|
|
21
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
22
|
+
}
|
|
23
|
+
function cleanExtractedCommand(command) {
|
|
24
|
+
const cleaned = command?.trim().replace(/[`'",;:.)]+$/g, "").trim();
|
|
25
|
+
return cleaned && cleaned.length > 0 ? cleaned : undefined;
|
|
26
|
+
}
|
|
27
|
+
function extractCommand(fixHint, commandPrefix) {
|
|
28
|
+
const escapedPrefix = escapeRegExp(commandPrefix);
|
|
29
|
+
const commandBody = `${escapedPrefix}(?=\\s|$)[^\`'"]*`;
|
|
30
|
+
const quoted = fixHint.match(new RegExp(`[\`'"](${commandBody})[\`'"]`, "i"))?.[1];
|
|
31
|
+
const unquoted = fixHint.match(new RegExp(`(${escapedPrefix}(?=\\s|$)[^\\n,;.]+)`, "i"))?.[1];
|
|
32
|
+
return cleanExtractedCommand(quoted) ?? cleanExtractedCommand(unquoted);
|
|
33
|
+
}
|
|
34
|
+
function resolveProviderHealthStatus(providerHealth) {
|
|
35
|
+
if (!providerHealth || providerHealth.ok)
|
|
36
|
+
return undefined;
|
|
37
|
+
const issue = providerHealth.issue;
|
|
38
|
+
if (issue?.kind === "vault-locked")
|
|
39
|
+
return "locked";
|
|
40
|
+
if (issue?.kind === "vault-unconfigured")
|
|
41
|
+
return "needs setup";
|
|
42
|
+
if (issue?.kind === "provider-credentials-missing")
|
|
43
|
+
return "needs credentials";
|
|
44
|
+
if (issue?.kind === "provider-live-check-failed")
|
|
45
|
+
return "needs attention";
|
|
46
|
+
const error = String(providerHealth.error).toLowerCase();
|
|
47
|
+
const fix = String(providerHealth.fix).toLowerCase();
|
|
48
|
+
if (error.includes("failed live check"))
|
|
49
|
+
return "needs attention";
|
|
50
|
+
if (error.includes("has no credentials"))
|
|
51
|
+
return "needs credentials";
|
|
52
|
+
if (error.includes("missing") && error.includes("provider"))
|
|
53
|
+
return "needs setup";
|
|
54
|
+
if (error.includes("vault is locked") || error.includes("vault locked"))
|
|
55
|
+
return "locked";
|
|
56
|
+
if (fix.includes("ouro auth verify"))
|
|
57
|
+
return "needs attention";
|
|
58
|
+
if (fix.includes("ouro auth"))
|
|
59
|
+
return "needs credentials";
|
|
60
|
+
if (fix.includes("ouro use"))
|
|
61
|
+
return "needs setup";
|
|
62
|
+
if (fix.includes("vault unlock"))
|
|
63
|
+
return "locked";
|
|
64
|
+
return "needs attention";
|
|
65
|
+
}
|
|
66
|
+
function resolveProviderHealthCommand(providerHealth, status) {
|
|
67
|
+
const issueCommand = (0, readiness_repair_1.preferredConnectRepairAction)(providerHealth?.issue)?.command;
|
|
68
|
+
if (issueCommand)
|
|
69
|
+
return issueCommand;
|
|
70
|
+
const fixHint = providerHealth?.fix;
|
|
71
|
+
if (!fixHint)
|
|
72
|
+
return undefined;
|
|
73
|
+
const prefixes = status === "locked"
|
|
74
|
+
? ["ouro vault unlock", "ouro vault replace", "ouro vault recover"]
|
|
75
|
+
: status === "needs credentials"
|
|
76
|
+
? ["ouro auth", "ouro connect", "ouro provider refresh", "ouro up"]
|
|
77
|
+
: status === "needs setup"
|
|
78
|
+
? ["ouro use", "ouro connect", "ouro auth", "ouro up"]
|
|
79
|
+
: ["ouro auth verify", "ouro auth", "ouro provider refresh", "ouro use", "ouro connect", "ouro vault unlock", "ouro up"];
|
|
80
|
+
for (const prefix of prefixes) {
|
|
81
|
+
const command = extractCommand(fixHint, prefix);
|
|
82
|
+
if (command)
|
|
83
|
+
return command;
|
|
84
|
+
}
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
function providerHealthTargetLane(providerHealth) {
|
|
88
|
+
const issue = providerHealth?.issue;
|
|
89
|
+
const actionLane = issue?.actions
|
|
90
|
+
.map((action) => "lane" in action && action.lane ? action.lane : undefined)
|
|
91
|
+
.find((lane) => lane === "outward" || lane === "inner");
|
|
92
|
+
if (actionLane)
|
|
93
|
+
return actionLane;
|
|
94
|
+
const text = [issue?.summary, issue?.detail, providerHealth?.error]
|
|
95
|
+
.filter(Boolean)
|
|
96
|
+
.join(" ")
|
|
97
|
+
.toLowerCase();
|
|
98
|
+
if (/\boutward provider\b/.test(text) || /\boutward lane\b/.test(text))
|
|
99
|
+
return "outward";
|
|
100
|
+
if (/\binner provider\b/.test(text) || /\binner lane\b/.test(text))
|
|
101
|
+
return "inner";
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
function providerHealthAppliesToLane(providerHealth, lane) {
|
|
105
|
+
const targetLane = providerHealthTargetLane(providerHealth);
|
|
106
|
+
return !targetLane || targetLane === lane.lane;
|
|
107
|
+
}
|
|
108
|
+
function providerHealthDetail(providerHealth, status) {
|
|
109
|
+
if (status === "locked")
|
|
110
|
+
return "vault locked on this machine";
|
|
111
|
+
if (status === "needs credentials")
|
|
112
|
+
return "credentials missing";
|
|
113
|
+
if (status === "needs setup") {
|
|
114
|
+
return providerHealth?.issue?.detail ?? providerHealth?.error ?? "needs setup";
|
|
115
|
+
}
|
|
116
|
+
const detail = providerHealth?.issue?.detail ?? providerHealth?.error;
|
|
117
|
+
if (!detail)
|
|
118
|
+
return "live check needs attention";
|
|
119
|
+
return /failed live check/i.test(detail) ? detail : `failed live check: ${detail}`;
|
|
120
|
+
}
|
|
121
|
+
function isProblemStatus(status) {
|
|
122
|
+
return status !== "ready" && status !== "attached";
|
|
123
|
+
}
|
|
124
|
+
function providerEntrySummary(entry) {
|
|
125
|
+
return entry.description ?? "Selected provider lanes for this machine.";
|
|
126
|
+
}
|
|
127
|
+
function providerEntryDetailLines(entry) {
|
|
128
|
+
const lines = [];
|
|
129
|
+
if (entry.nextNote && !/^(Outward|Inner) lane: /.test(entry.nextNote)) {
|
|
130
|
+
lines.push(entry.nextNote);
|
|
131
|
+
}
|
|
132
|
+
if (entry.laneSummaries && entry.laneSummaries.length > 0) {
|
|
133
|
+
for (const lane of entry.laneSummaries) {
|
|
134
|
+
const laneLabel = lane.lane === "outward" ? "Outward lane" : "Inner lane";
|
|
135
|
+
lines.push(`${laneLabel}: ${lane.title} — ${lane.detail}`);
|
|
136
|
+
}
|
|
137
|
+
return lines;
|
|
138
|
+
}
|
|
139
|
+
return [...lines, ...(entry.detailLines ?? [])];
|
|
140
|
+
}
|
|
141
|
+
function capabilityEntryDetailLines(entry) {
|
|
142
|
+
return [
|
|
143
|
+
...(entry.detailLines ?? []),
|
|
144
|
+
...(entry.nextNote ? [entry.nextNote] : []),
|
|
145
|
+
];
|
|
146
|
+
}
|
|
147
|
+
function entryToWizardItem(entry) {
|
|
148
|
+
return {
|
|
149
|
+
key: entry.option,
|
|
150
|
+
label: entry.name,
|
|
151
|
+
status: entry.status,
|
|
152
|
+
...(entry.section === "Providers"
|
|
153
|
+
? { summary: providerEntrySummary(entry) }
|
|
154
|
+
: entry.description
|
|
155
|
+
? { summary: entry.description }
|
|
156
|
+
: {}),
|
|
157
|
+
detailLines: entry.section === "Providers"
|
|
158
|
+
? providerEntryDetailLines(entry)
|
|
159
|
+
: capabilityEntryDetailLines(entry),
|
|
160
|
+
...(entry.nextAction ? { command: entry.nextAction } : {}),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
function nextStepFor(entries) {
|
|
164
|
+
const nextEntry = entries.find((entry) => isProblemStatus(entry.status));
|
|
165
|
+
if (!nextEntry) {
|
|
166
|
+
return {
|
|
167
|
+
label: "Everything here is already connected.",
|
|
168
|
+
detail: "Pick any capability if you want to review it, refresh it, or change its setup.",
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
label: `Start with ${nextEntry.name}.`,
|
|
173
|
+
detail: nextEntry.nextNote ?? nextEntry.description ?? `Status: ${nextEntry.status}.`,
|
|
174
|
+
command: nextEntry.nextAction,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function sectionToWizard(entries, section, summary) {
|
|
178
|
+
return {
|
|
179
|
+
title: section,
|
|
180
|
+
summary,
|
|
181
|
+
items: entries.filter((entry) => entry.section === section).map((entry) => entryToWizardItem(entry)),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function summarizeProviderLane(agent, lane, providerHealth) {
|
|
185
|
+
const providerHealthStatus = resolveProviderHealthStatus(providerHealth);
|
|
186
|
+
const providerHealthCommand = resolveProviderHealthCommand(providerHealth, providerHealthStatus);
|
|
187
|
+
if (lane.status === "unconfigured") {
|
|
188
|
+
return {
|
|
189
|
+
lane: lane.lane,
|
|
190
|
+
status: "needs setup",
|
|
191
|
+
title: "choose provider and model",
|
|
192
|
+
detail: "needs setup",
|
|
193
|
+
action: lane.repairCommand,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
const fallbackAction = providerHealthCommand ?? lane.credential.repairCommand;
|
|
197
|
+
if (providerHealth?.ok) {
|
|
198
|
+
return {
|
|
199
|
+
lane: lane.lane,
|
|
200
|
+
status: "ready",
|
|
201
|
+
title: `${lane.provider} / ${lane.model}`,
|
|
202
|
+
detail: "ready",
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
if (providerHealthStatus && providerHealthAppliesToLane(providerHealth, lane)) {
|
|
206
|
+
return {
|
|
207
|
+
lane: lane.lane,
|
|
208
|
+
status: providerHealthStatus,
|
|
209
|
+
title: `${lane.provider} / ${lane.model}`,
|
|
210
|
+
detail: providerHealthDetail(providerHealth, providerHealthStatus),
|
|
211
|
+
action: fallbackAction,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
if (lane.credential.status === "missing") {
|
|
215
|
+
return {
|
|
216
|
+
lane: lane.lane,
|
|
217
|
+
status: "needs credentials",
|
|
218
|
+
title: `${lane.provider} / ${lane.model}`,
|
|
219
|
+
detail: "credentials missing",
|
|
220
|
+
action: fallbackAction,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
if (lane.credential.status === "invalid-pool") {
|
|
224
|
+
return {
|
|
225
|
+
lane: lane.lane,
|
|
226
|
+
status: providerHealthStatus === "locked" ? "locked" : "needs attention",
|
|
227
|
+
title: `${lane.provider} / ${lane.model}`,
|
|
228
|
+
detail: providerHealthStatus === "locked" ? "vault locked on this machine" : "vault unavailable",
|
|
229
|
+
action: fallbackAction,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
if (lane.readiness.status === "failed") {
|
|
233
|
+
return {
|
|
234
|
+
lane: lane.lane,
|
|
235
|
+
status: "needs attention",
|
|
236
|
+
title: `${lane.provider} / ${lane.model}`,
|
|
237
|
+
detail: `failed live check: ${lane.readiness.error ?? "unknown error"}`,
|
|
238
|
+
action: providerHealthCommand ?? providerHealth?.fix ?? `ouro auth --agent ${agent} --provider ${lane.provider}`,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
if (lane.readiness.status === "stale") {
|
|
242
|
+
return {
|
|
243
|
+
lane: lane.lane,
|
|
244
|
+
status: "needs attention",
|
|
245
|
+
title: `${lane.provider} / ${lane.model}`,
|
|
246
|
+
detail: ["live check is stale", lane.readiness.reason].filter(Boolean).join(": "),
|
|
247
|
+
action: providerHealth?.fix,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
if (lane.readiness.status === "ready") {
|
|
251
|
+
return {
|
|
252
|
+
lane: lane.lane,
|
|
253
|
+
status: "ready",
|
|
254
|
+
title: `${lane.provider} / ${lane.model}`,
|
|
255
|
+
detail: "ready",
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
lane: lane.lane,
|
|
260
|
+
status: "needs attention",
|
|
261
|
+
title: `${lane.provider} / ${lane.model}`,
|
|
262
|
+
detail: "live check did not complete yet",
|
|
263
|
+
action: providerHealth?.fix,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function summarizeProvidersForConnect(agent, visibility, providerHealth) {
|
|
267
|
+
const laneSummaries = visibility.lanes.map((lane) => summarizeProviderLane(agent, lane, providerHealth));
|
|
268
|
+
const worstLaneStatus = laneSummaries.reduce((worst, lane) => CONNECT_STATUS_PRIORITY[lane.status] < CONNECT_STATUS_PRIORITY[worst] ? lane.status : worst, "ready");
|
|
269
|
+
const providerHealthStatus = resolveProviderHealthStatus(providerHealth);
|
|
270
|
+
const providerHealthCommand = resolveProviderHealthCommand(providerHealth, providerHealthStatus);
|
|
271
|
+
const nextLane = laneSummaries.find((lane) => isProblemStatus(lane.status));
|
|
272
|
+
return {
|
|
273
|
+
status: providerHealthStatus ?? worstLaneStatus,
|
|
274
|
+
laneSummaries,
|
|
275
|
+
detailLines: laneSummaries.flatMap((lane) => [
|
|
276
|
+
`${lane.lane === "outward" ? "Outward lane" : "Inner lane"}: ${lane.title}`,
|
|
277
|
+
lane.detail,
|
|
278
|
+
]),
|
|
279
|
+
nextAction: providerHealthCommand ?? nextLane?.action,
|
|
280
|
+
nextNote: providerHealthStatus === "locked"
|
|
281
|
+
? "Unlock this agent's credential vault on this machine."
|
|
282
|
+
: nextLane
|
|
283
|
+
? `${nextLane.lane === "outward" ? "Outward lane" : "Inner lane"}: ${nextLane.detail}`
|
|
284
|
+
: undefined,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
function connectEntryNeedsAttention(entry) {
|
|
288
|
+
return isProblemStatus(entry.status);
|
|
289
|
+
}
|
|
290
|
+
function renderConnectBay(entries, options) {
|
|
291
|
+
(0, runtime_1.emitNervesEvent)({
|
|
292
|
+
component: "daemon",
|
|
293
|
+
event: "daemon.connect_bay_rendered",
|
|
294
|
+
message: "rendered connect bay",
|
|
295
|
+
meta: {
|
|
296
|
+
agent: options.agent,
|
|
297
|
+
isTTY: options.isTTY,
|
|
298
|
+
entryCount: entries.length,
|
|
299
|
+
columns: options.columns ?? null,
|
|
300
|
+
},
|
|
301
|
+
});
|
|
302
|
+
return (0, terminal_ui_1.renderTerminalWizard)({
|
|
303
|
+
isTTY: options.isTTY,
|
|
304
|
+
columns: options.columns,
|
|
305
|
+
masthead: {
|
|
306
|
+
subtitle: "Set up connections one step at a time.",
|
|
307
|
+
},
|
|
308
|
+
title: `Connect ${options.agent}`,
|
|
309
|
+
summary: "Choose one capability to bring online. Each row tells you whether Ouro checked it live just now or is showing saved setup on this machine.",
|
|
310
|
+
nextStep: nextStepFor(entries),
|
|
311
|
+
sections: [
|
|
312
|
+
sectionToWizard(entries, "Providers", "Selected outward and inner lanes for this machine."),
|
|
313
|
+
sectionToWizard(entries, "Portable", "These travel with the agent bundle when their secrets are portable."),
|
|
314
|
+
sectionToWizard(entries, "This machine", "These depend on local attachments or machine-specific setup."),
|
|
315
|
+
],
|
|
316
|
+
footerLines: [
|
|
317
|
+
"6. Not now",
|
|
318
|
+
"Choose a number, or type the capability name.",
|
|
319
|
+
],
|
|
320
|
+
prompt: options.prompt,
|
|
321
|
+
suppressEvent: true,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
@@ -0,0 +1,273 @@
|
|
|
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.getDefaultContainerCredentialBootstrapPath = getDefaultContainerCredentialBootstrapPath;
|
|
37
|
+
exports.loadContainerCredentialBootstrap = loadContainerCredentialBootstrap;
|
|
38
|
+
const fs = __importStar(require("node:fs"));
|
|
39
|
+
const os = __importStar(require("node:os"));
|
|
40
|
+
const path = __importStar(require("node:path"));
|
|
41
|
+
const runtime_credentials_1 = require("../runtime-credentials");
|
|
42
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
43
|
+
const machine_identity_1 = require("../machine-identity");
|
|
44
|
+
const MAX_BOOTSTRAP_BYTES = 128 * 1024;
|
|
45
|
+
function isRecord(value) {
|
|
46
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
47
|
+
}
|
|
48
|
+
function parseEnvelope(raw) {
|
|
49
|
+
const value = JSON.parse(raw);
|
|
50
|
+
if (!isRecord(value) || value.schemaVersion !== 1 || !Array.isArray(value.credentials)) {
|
|
51
|
+
throw new Error("container credential bootstrap envelope is invalid");
|
|
52
|
+
}
|
|
53
|
+
if (Object.keys(value).sort().join(",") !== "credentials,schemaVersion") {
|
|
54
|
+
throw new Error("container credential bootstrap has unsupported fields");
|
|
55
|
+
}
|
|
56
|
+
if (value.credentials.length === 0) {
|
|
57
|
+
throw new Error("container credential bootstrap must contain at least one credential");
|
|
58
|
+
}
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
function fsyncDirectory(directoryPath) {
|
|
62
|
+
const descriptor = fs.openSync(directoryPath, "r");
|
|
63
|
+
try {
|
|
64
|
+
fs.fsyncSync(descriptor);
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
fs.closeSync(descriptor);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function deleteDurably(filePath) {
|
|
71
|
+
fs.unlinkSync(filePath);
|
|
72
|
+
fsyncDirectory(path.dirname(filePath));
|
|
73
|
+
}
|
|
74
|
+
function assertSafeBootstrapFile(stat, label) {
|
|
75
|
+
if (!stat.isFile() || stat.isSymbolicLink()) {
|
|
76
|
+
throw new Error(`container credential ${label} must be a regular file`);
|
|
77
|
+
}
|
|
78
|
+
if ((stat.mode & 0o077) !== 0)
|
|
79
|
+
throw new Error("container credential bootstrap must have mode 0600");
|
|
80
|
+
if (typeof process.getuid === "function" && stat.uid !== process.getuid()) {
|
|
81
|
+
throw new Error("container credential bootstrap must be owned by the runtime user");
|
|
82
|
+
}
|
|
83
|
+
if (stat.size > MAX_BOOTSTRAP_BYTES)
|
|
84
|
+
throw new Error("container credential bootstrap is too large");
|
|
85
|
+
}
|
|
86
|
+
function getDefaultContainerCredentialBootstrapPath() {
|
|
87
|
+
return path.join(os.homedir(), ".ouro-cli", "container-credentials.json");
|
|
88
|
+
}
|
|
89
|
+
function optionalStat(filePath) {
|
|
90
|
+
try {
|
|
91
|
+
return fs.lstatSync(filePath);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT")
|
|
95
|
+
return null;
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function loadContainerCredentialBootstrap(enabledAgents, options = {}) {
|
|
100
|
+
const filePath = options.path ?? getDefaultContainerCredentialBootstrapPath();
|
|
101
|
+
const consumingPath = `${filePath}.consuming`;
|
|
102
|
+
let sourceStat = optionalStat(filePath);
|
|
103
|
+
const claimedStat = optionalStat(consumingPath);
|
|
104
|
+
if (sourceStat && claimedStat) {
|
|
105
|
+
assertSafeBootstrapFile(sourceStat, "bootstrap");
|
|
106
|
+
assertSafeBootstrapFile(claimedStat, "consuming state");
|
|
107
|
+
const sourceBytes = fs.readFileSync(filePath);
|
|
108
|
+
const claimedBytes = fs.readFileSync(consumingPath);
|
|
109
|
+
if (!sourceBytes.equals(claimedBytes)) {
|
|
110
|
+
throw new Error("human-required: container credential source and claim differ; securely compare and quarantine them without printing their contents");
|
|
111
|
+
}
|
|
112
|
+
deleteDurably(filePath);
|
|
113
|
+
sourceStat = null;
|
|
114
|
+
}
|
|
115
|
+
if (claimedStat)
|
|
116
|
+
assertSafeBootstrapFile(claimedStat, "consuming state");
|
|
117
|
+
let stat;
|
|
118
|
+
if (sourceStat) {
|
|
119
|
+
if (!sourceStat.isFile() || sourceStat.isSymbolicLink()) {
|
|
120
|
+
throw new Error("container credential bootstrap must be a regular file");
|
|
121
|
+
}
|
|
122
|
+
fs.renameSync(filePath, consumingPath);
|
|
123
|
+
fsyncDirectory(path.dirname(filePath));
|
|
124
|
+
stat = sourceStat;
|
|
125
|
+
}
|
|
126
|
+
else if (claimedStat) {
|
|
127
|
+
stat = claimedStat;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
assertSafeBootstrapFile(stat, claimedStat ? "consuming state" : "bootstrap");
|
|
133
|
+
const envelope = parseEnvelope(fs.readFileSync(consumingPath, "utf8"));
|
|
134
|
+
const allowed = new Set(enabledAgents);
|
|
135
|
+
const loaded = new Set();
|
|
136
|
+
for (const message of envelope.credentials) {
|
|
137
|
+
if (!isRecord(message) || typeof message.agentName !== "string" || !allowed.has(message.agentName)) {
|
|
138
|
+
throw new Error("container credential bootstrap agent is not enabled");
|
|
139
|
+
}
|
|
140
|
+
if (loaded.has(message.agentName))
|
|
141
|
+
throw new Error("container credential bootstrap contains a duplicate agent");
|
|
142
|
+
loaded.add(message.agentName);
|
|
143
|
+
}
|
|
144
|
+
const migration = options.machineIdMigration;
|
|
145
|
+
const discardProviderCredentialRecords = migration?.discardProviderCredentialRecords;
|
|
146
|
+
if (discardProviderCredentialRecords === undefined) {
|
|
147
|
+
for (const message of envelope.credentials) {
|
|
148
|
+
if (!(0, runtime_credentials_1.isRuntimeCredentialBootstrapMessage)(message)) {
|
|
149
|
+
throw new Error("container credential bootstrap message is invalid");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const machineId = (0, machine_identity_1.loadOrCreateMachineIdentity)().machineId;
|
|
154
|
+
let messages = envelope.credentials;
|
|
155
|
+
let discardedProviderRecordCount = 0;
|
|
156
|
+
if (migration) {
|
|
157
|
+
const { sourceMachineId, targetMachineId } = migration;
|
|
158
|
+
if (!sourceMachineId
|
|
159
|
+
|| !targetMachineId
|
|
160
|
+
|| sourceMachineId !== sourceMachineId.trim()
|
|
161
|
+
|| targetMachineId !== targetMachineId.trim()
|
|
162
|
+
|| sourceMachineId === targetMachineId) {
|
|
163
|
+
throw new Error("container credential bootstrap machineId migration is invalid");
|
|
164
|
+
}
|
|
165
|
+
if (machineId !== targetMachineId) {
|
|
166
|
+
throw new Error("container credential bootstrap machineId migration target does not match this machine");
|
|
167
|
+
}
|
|
168
|
+
for (const message of messages) {
|
|
169
|
+
if (!isRecord(message) || message.machineId !== sourceMachineId) {
|
|
170
|
+
throw new Error("container credential bootstrap machineId migration source does not match");
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (discardProviderCredentialRecords !== undefined) {
|
|
174
|
+
if (!isRecord(discardProviderCredentialRecords) || !Array.isArray(discardProviderCredentialRecords.providers)) {
|
|
175
|
+
throw new Error("container credential bootstrap provider discard policy is invalid");
|
|
176
|
+
}
|
|
177
|
+
const configuredProviders = discardProviderCredentialRecords.providers;
|
|
178
|
+
if (configuredProviders.length === 0
|
|
179
|
+
|| configuredProviders.some((provider) => (typeof provider !== "string" || provider.length === 0 || provider !== provider.trim()))
|
|
180
|
+
|| new Set(configuredProviders).size !== configuredProviders.length) {
|
|
181
|
+
throw new Error("container credential bootstrap provider discard allowlist is invalid");
|
|
182
|
+
}
|
|
183
|
+
const legacyProviders = [];
|
|
184
|
+
for (const message of messages) {
|
|
185
|
+
const records = message.providerCredentialRecords;
|
|
186
|
+
if (records === undefined)
|
|
187
|
+
continue;
|
|
188
|
+
if (!Array.isArray(records) || records.length === 0) {
|
|
189
|
+
throw new Error("container credential bootstrap discarded provider records are invalid");
|
|
190
|
+
}
|
|
191
|
+
for (const record of records) {
|
|
192
|
+
if (!isRecord(record) || typeof record.provider !== "string" || record.provider.length === 0) {
|
|
193
|
+
throw new Error("container credential bootstrap discarded provider record is invalid");
|
|
194
|
+
}
|
|
195
|
+
legacyProviders.push(record.provider);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (new Set(legacyProviders).size !== legacyProviders.length) {
|
|
199
|
+
throw new Error("container credential bootstrap discarded providers contain duplicates");
|
|
200
|
+
}
|
|
201
|
+
if ([...legacyProviders].sort().join(",")
|
|
202
|
+
!== [...configuredProviders].sort().join(",")) {
|
|
203
|
+
throw new Error("container credential bootstrap discarded providers do not match the allowlist");
|
|
204
|
+
}
|
|
205
|
+
discardedProviderRecordCount = legacyProviders.length;
|
|
206
|
+
}
|
|
207
|
+
messages = messages.map((message) => {
|
|
208
|
+
const projected = { ...message, machineId: targetMachineId };
|
|
209
|
+
if (discardProviderCredentialRecords !== undefined)
|
|
210
|
+
delete projected.providerCredentialRecords;
|
|
211
|
+
return projected;
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
for (const message of messages) {
|
|
216
|
+
if (isRecord(message) && typeof message.machineId === "string" && message.machineId !== machineId) {
|
|
217
|
+
throw new Error("container credential bootstrap machineId does not match this machine");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (discardProviderCredentialRecords !== undefined) {
|
|
222
|
+
for (const message of messages) {
|
|
223
|
+
if (!(0, runtime_credentials_1.isRuntimeCredentialBootstrapMessage)(message)) {
|
|
224
|
+
throw new Error("container credential bootstrap message is invalid");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const persist = options.persist ?? ((message) => (0, runtime_credentials_1.persistRuntimeCredentialBootstrapMessage)(message, {
|
|
229
|
+
machineId,
|
|
230
|
+
}));
|
|
231
|
+
try {
|
|
232
|
+
for (const message of messages) {
|
|
233
|
+
if (!await persist(message))
|
|
234
|
+
throw new Error("invalid bootstrap message");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
(0, runtime_1.emitNervesEvent)({
|
|
239
|
+
level: "error",
|
|
240
|
+
component: "config/identity",
|
|
241
|
+
event: "config.container_credentials_persist_error",
|
|
242
|
+
message: "container credential bootstrap persistence failed; recoverable claim retained",
|
|
243
|
+
meta: { agents: [...loaded].sort(), count: loaded.size, claimedPath: consumingPath },
|
|
244
|
+
});
|
|
245
|
+
throw new Error("container credential bootstrap persistence failed; recoverable claim retained for reconciliation");
|
|
246
|
+
}
|
|
247
|
+
if (options.apply) {
|
|
248
|
+
for (const message of messages) {
|
|
249
|
+
if (!options.apply(message))
|
|
250
|
+
throw new Error("container credential bootstrap message is invalid");
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
deleteDurably(consumingPath);
|
|
254
|
+
if (discardedProviderRecordCount > 0) {
|
|
255
|
+
(0, runtime_1.emitNervesEvent)({
|
|
256
|
+
component: "config/identity",
|
|
257
|
+
event: "config.container_provider_credentials_discarded",
|
|
258
|
+
message: "discarded allowlisted legacy provider credentials during container migration",
|
|
259
|
+
meta: {
|
|
260
|
+
agentCount: loaded.size,
|
|
261
|
+
recordCount: discardedProviderRecordCount,
|
|
262
|
+
mode: "machine-id-migration",
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
(0, runtime_1.emitNervesEvent)({
|
|
267
|
+
component: "config/identity",
|
|
268
|
+
event: "config.container_credentials_loaded",
|
|
269
|
+
message: "loaded container credential bootstrap",
|
|
270
|
+
meta: { agents: [...loaded].sort(), count: loaded.size },
|
|
271
|
+
});
|
|
272
|
+
return [...loaded].sort();
|
|
273
|
+
}
|