@ouro.bot/cli 0.1.0-alpha.55 → 0.1.0-alpha.550
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -19
- 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-bootstrap-drift.md +54 -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 +3555 -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 +304 -0
- package/dist/heart/config.js +114 -118
- package/dist/heart/core.js +925 -246
- package/dist/heart/cross-chat-delivery.js +3 -18
- package/dist/heart/daemon/agent-config-check.js +512 -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 +554 -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 +665 -0
- package/dist/heart/daemon/cli-exec.js +7565 -0
- package/dist/heart/daemon/cli-help.js +498 -0
- package/dist/heart/daemon/cli-parse.js +1590 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +775 -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 -1672
- package/dist/heart/daemon/daemon-entry.js +417 -2
- package/dist/heart/daemon/daemon-health.js +183 -0
- package/dist/heart/daemon/daemon-rollup.js +58 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +87 -13
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +758 -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 +844 -0
- package/dist/heart/daemon/drift-detection.js +146 -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 +102 -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 +353 -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 +52 -117
- 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 +200 -51
- 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 +255 -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-state.js +216 -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 +11 -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 +381 -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-BPr5vNuM.css +1 -0
- package/dist/mailbox-ui/assets/index-Cm51CY9W.js +61 -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 +30 -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 +995 -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 +139 -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 +816 -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 +111 -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 +561 -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 +569 -182
- 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/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/ouro-path-installer.js +0 -178
- package/dist/heart/daemon/subagent-installer.js +0 -166
- package/dist/heart/session-recall.js +0 -116
- package/dist/mind/associative-recall.js +0 -209
- package/dist/senses/bluebubbles-entry.js +0 -13
- package/dist/senses/bluebubbles.js +0 -1177
- package/dist/senses/debug-activity.js +0 -148
- package/subagents/README.md +0 -86
- package/subagents/work-doer.md +0 -237
- package/subagents/work-merger.md +0 -618
- package/subagents/work-planner.md +0 -390
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
|
@@ -0,0 +1,216 @@
|
|
|
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.validateProviderState = validateProviderState;
|
|
37
|
+
exports.getProviderStatePath = getProviderStatePath;
|
|
38
|
+
exports.readProviderState = readProviderState;
|
|
39
|
+
exports.writeProviderState = writeProviderState;
|
|
40
|
+
exports.bootstrapProviderStateFromAgentConfig = bootstrapProviderStateFromAgentConfig;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const runtime_1 = require("../nerves/runtime");
|
|
44
|
+
const identity_1 = require("./identity");
|
|
45
|
+
const LANES = ["outward", "inner"];
|
|
46
|
+
const VALID_SOURCES = new Set(["bootstrap", "local"]);
|
|
47
|
+
const VALID_READINESS = new Set(["ready", "failed", "stale", "unknown"]);
|
|
48
|
+
function isProvider(value) {
|
|
49
|
+
return typeof value === "string" && Object.prototype.hasOwnProperty.call(identity_1.PROVIDER_CREDENTIALS, value);
|
|
50
|
+
}
|
|
51
|
+
function isNonEmptyString(value) {
|
|
52
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
53
|
+
}
|
|
54
|
+
function validateBinding(value, label) {
|
|
55
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
56
|
+
throw new Error(`${label} must be an object`);
|
|
57
|
+
}
|
|
58
|
+
const record = value;
|
|
59
|
+
if (!isProvider(record.provider))
|
|
60
|
+
throw new Error(`${label}.provider must be a valid provider`);
|
|
61
|
+
if (!isNonEmptyString(record.model))
|
|
62
|
+
throw new Error(`${label}.model must be a non-empty string`);
|
|
63
|
+
if (!VALID_SOURCES.has(record.source)) {
|
|
64
|
+
throw new Error(`${label}.source must be bootstrap or local`);
|
|
65
|
+
}
|
|
66
|
+
if (!isNonEmptyString(record.updatedAt))
|
|
67
|
+
throw new Error(`${label}.updatedAt must be a non-empty string`);
|
|
68
|
+
return {
|
|
69
|
+
provider: record.provider,
|
|
70
|
+
model: record.model,
|
|
71
|
+
source: record.source,
|
|
72
|
+
updatedAt: record.updatedAt,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function validateReadiness(value, label) {
|
|
76
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
77
|
+
throw new Error(`${label} must be an object`);
|
|
78
|
+
}
|
|
79
|
+
const record = value;
|
|
80
|
+
if (!VALID_READINESS.has(record.status)) {
|
|
81
|
+
throw new Error(`${label}.status must be ready, failed, stale, or unknown`);
|
|
82
|
+
}
|
|
83
|
+
if (!isProvider(record.provider))
|
|
84
|
+
throw new Error(`${label}.provider must be a valid provider`);
|
|
85
|
+
if (!isNonEmptyString(record.model))
|
|
86
|
+
throw new Error(`${label}.model must be a non-empty string`);
|
|
87
|
+
if (record.checkedAt !== undefined && typeof record.checkedAt !== "string") {
|
|
88
|
+
throw new Error(`${label}.checkedAt must be a string when present`);
|
|
89
|
+
}
|
|
90
|
+
if (record.credentialRevision !== undefined && typeof record.credentialRevision !== "string") {
|
|
91
|
+
throw new Error(`${label}.credentialRevision must be a string when present`);
|
|
92
|
+
}
|
|
93
|
+
if (record.error !== undefined && typeof record.error !== "string") {
|
|
94
|
+
throw new Error(`${label}.error must be a string when present`);
|
|
95
|
+
}
|
|
96
|
+
if (record.attempts !== undefined && typeof record.attempts !== "number") {
|
|
97
|
+
throw new Error(`${label}.attempts must be a number when present`);
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
status: record.status,
|
|
101
|
+
provider: record.provider,
|
|
102
|
+
model: record.model,
|
|
103
|
+
...(record.checkedAt !== undefined ? { checkedAt: record.checkedAt } : {}),
|
|
104
|
+
...(record.credentialRevision !== undefined ? { credentialRevision: record.credentialRevision } : {}),
|
|
105
|
+
...(record.error !== undefined ? { error: record.error } : {}),
|
|
106
|
+
...(record.attempts !== undefined ? { attempts: record.attempts } : {}),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function validateProviderState(value) {
|
|
110
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
111
|
+
throw new Error("provider state must be an object");
|
|
112
|
+
}
|
|
113
|
+
const record = value;
|
|
114
|
+
if (record.schemaVersion !== 1)
|
|
115
|
+
throw new Error("schemaVersion must be 1");
|
|
116
|
+
if (!isNonEmptyString(record.machineId))
|
|
117
|
+
throw new Error("machineId must be a non-empty string");
|
|
118
|
+
if (!isNonEmptyString(record.updatedAt))
|
|
119
|
+
throw new Error("updatedAt must be a non-empty string");
|
|
120
|
+
if (!record.lanes || typeof record.lanes !== "object" || Array.isArray(record.lanes)) {
|
|
121
|
+
throw new Error("lanes must be an object");
|
|
122
|
+
}
|
|
123
|
+
const rawLanes = record.lanes;
|
|
124
|
+
const lanes = {
|
|
125
|
+
outward: validateBinding(rawLanes.outward, "outward"),
|
|
126
|
+
inner: validateBinding(rawLanes.inner, "inner"),
|
|
127
|
+
};
|
|
128
|
+
if (!record.readiness || typeof record.readiness !== "object" || Array.isArray(record.readiness)) {
|
|
129
|
+
throw new Error("readiness must be an object");
|
|
130
|
+
}
|
|
131
|
+
const rawReadiness = record.readiness;
|
|
132
|
+
const readiness = {};
|
|
133
|
+
for (const lane of LANES) {
|
|
134
|
+
if (rawReadiness[lane] !== undefined) {
|
|
135
|
+
readiness[lane] = validateReadiness(rawReadiness[lane], `${lane}.readiness`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
schemaVersion: 1,
|
|
140
|
+
machineId: record.machineId,
|
|
141
|
+
updatedAt: record.updatedAt,
|
|
142
|
+
lanes,
|
|
143
|
+
readiness,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function getProviderStatePath(agentRoot) {
|
|
147
|
+
return path.join(agentRoot, "state", "providers.json");
|
|
148
|
+
}
|
|
149
|
+
function readProviderState(agentRoot) {
|
|
150
|
+
const statePath = getProviderStatePath(agentRoot);
|
|
151
|
+
let raw;
|
|
152
|
+
try {
|
|
153
|
+
if (!fs.existsSync(statePath)) {
|
|
154
|
+
return { ok: false, reason: "missing", statePath, error: "provider state not found" };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
return { ok: false, reason: "invalid", statePath, error: String(error) };
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
raw = fs.readFileSync(statePath, "utf-8");
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
const code = error.code;
|
|
165
|
+
if (code === "ENOENT") {
|
|
166
|
+
return { ok: false, reason: "missing", statePath, error: "provider state not found" };
|
|
167
|
+
}
|
|
168
|
+
return { ok: false, reason: "invalid", statePath, error: String(error) };
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const state = validateProviderState(JSON.parse(raw));
|
|
172
|
+
(0, runtime_1.emitNervesEvent)({
|
|
173
|
+
component: "config/identity",
|
|
174
|
+
event: "config.provider_state_read",
|
|
175
|
+
message: "read provider state",
|
|
176
|
+
meta: { statePath, machineId: state.machineId },
|
|
177
|
+
});
|
|
178
|
+
return { ok: true, statePath, state };
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
return { ok: false, reason: "invalid", statePath, error: String(error) };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function writeProviderState(agentRoot, state) {
|
|
185
|
+
const statePath = getProviderStatePath(agentRoot);
|
|
186
|
+
const validated = validateProviderState(state);
|
|
187
|
+
fs.mkdirSync(path.dirname(statePath), { recursive: true });
|
|
188
|
+
fs.writeFileSync(statePath, `${JSON.stringify(validated, null, 2)}\n`, "utf-8");
|
|
189
|
+
(0, runtime_1.emitNervesEvent)({
|
|
190
|
+
component: "config/identity",
|
|
191
|
+
event: "config.provider_state_written",
|
|
192
|
+
message: "wrote provider state",
|
|
193
|
+
meta: { statePath, machineId: validated.machineId },
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
function binding(provider, model, updatedAt) {
|
|
197
|
+
return {
|
|
198
|
+
provider,
|
|
199
|
+
model,
|
|
200
|
+
source: "bootstrap",
|
|
201
|
+
updatedAt,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function bootstrapProviderStateFromAgentConfig(input) {
|
|
205
|
+
const updatedAt = input.now.toISOString();
|
|
206
|
+
return {
|
|
207
|
+
schemaVersion: 1,
|
|
208
|
+
machineId: input.machineId,
|
|
209
|
+
updatedAt,
|
|
210
|
+
lanes: {
|
|
211
|
+
outward: binding(input.agentConfig.humanFacing.provider, input.agentConfig.humanFacing.model, updatedAt),
|
|
212
|
+
inner: binding(input.agentConfig.agentFacing.provider, input.agentConfig.agentFacing.model, updatedAt),
|
|
213
|
+
},
|
|
214
|
+
readiness: {},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildAgentProviderVisibility = buildAgentProviderVisibility;
|
|
4
|
+
exports.formatProviderVisibilityLine = formatProviderVisibilityLine;
|
|
5
|
+
exports.formatAgentProviderVisibilityForPrompt = formatAgentProviderVisibilityForPrompt;
|
|
6
|
+
exports.formatAgentProviderVisibilityForStartOfTurn = formatAgentProviderVisibilityForStartOfTurn;
|
|
7
|
+
exports.formatAgentProviderVisibilityForPulse = formatAgentProviderVisibilityForPulse;
|
|
8
|
+
exports.providerVisibilityStatusRows = providerVisibilityStatusRows;
|
|
9
|
+
exports.isAgentProviderVisibility = isAgentProviderVisibility;
|
|
10
|
+
const runtime_1 = require("../nerves/runtime");
|
|
11
|
+
const provider_binding_resolver_1 = require("./provider-binding-resolver");
|
|
12
|
+
const LANES = ["outward", "inner"];
|
|
13
|
+
function credentialVisibility(binding) {
|
|
14
|
+
const credential = binding.credential;
|
|
15
|
+
if (credential.status === "present") {
|
|
16
|
+
return {
|
|
17
|
+
status: "present",
|
|
18
|
+
source: credential.source,
|
|
19
|
+
revision: credential.revision,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
status: credential.status,
|
|
24
|
+
...("repair" in credential ? { repairCommand: credential.repair.command } : {}),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function readinessVisibility(binding) {
|
|
28
|
+
return {
|
|
29
|
+
status: binding.readiness.status,
|
|
30
|
+
...(binding.readiness.checkedAt ? { checkedAt: binding.readiness.checkedAt } : {}),
|
|
31
|
+
...(binding.readiness.error ? { error: binding.readiness.error } : {}),
|
|
32
|
+
...(binding.readiness.reason ? { reason: binding.readiness.reason } : {}),
|
|
33
|
+
...(binding.readiness.attempts !== undefined ? { attempts: binding.readiness.attempts } : {}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function visibilityForLane(input, lane) {
|
|
37
|
+
const resolved = (0, provider_binding_resolver_1.resolveEffectiveProviderBinding)({ ...input, lane });
|
|
38
|
+
if (!resolved.ok) {
|
|
39
|
+
return {
|
|
40
|
+
lane,
|
|
41
|
+
status: "unconfigured",
|
|
42
|
+
provider: "unconfigured",
|
|
43
|
+
model: "-",
|
|
44
|
+
source: "missing",
|
|
45
|
+
readiness: {
|
|
46
|
+
status: "unknown",
|
|
47
|
+
reason: resolved.reason,
|
|
48
|
+
},
|
|
49
|
+
credential: {
|
|
50
|
+
status: "missing",
|
|
51
|
+
repairCommand: resolved.repair.command,
|
|
52
|
+
},
|
|
53
|
+
repairCommand: resolved.repair.command,
|
|
54
|
+
reason: resolved.reason,
|
|
55
|
+
warnings: resolved.warnings.map((warning) => warning.message),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
lane,
|
|
60
|
+
status: "configured",
|
|
61
|
+
provider: resolved.binding.provider,
|
|
62
|
+
model: resolved.binding.model,
|
|
63
|
+
source: resolved.binding.source,
|
|
64
|
+
readiness: readinessVisibility(resolved.binding),
|
|
65
|
+
credential: credentialVisibility(resolved.binding),
|
|
66
|
+
warnings: resolved.binding.warnings.map((warning) => warning.message),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function buildAgentProviderVisibility(input) {
|
|
70
|
+
const visibility = {
|
|
71
|
+
agentName: input.agentName,
|
|
72
|
+
lanes: LANES.map((lane) => visibilityForLane(input, lane)),
|
|
73
|
+
};
|
|
74
|
+
(0, runtime_1.emitNervesEvent)({
|
|
75
|
+
component: "config/identity",
|
|
76
|
+
event: "config.provider_visibility_built",
|
|
77
|
+
message: "built provider visibility summary",
|
|
78
|
+
meta: {
|
|
79
|
+
agentName: input.agentName,
|
|
80
|
+
laneStatuses: visibility.lanes.map((lane) => `${lane.lane}:${lane.status}`).join(","),
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
return visibility;
|
|
84
|
+
}
|
|
85
|
+
function credentialLabel(credential) {
|
|
86
|
+
if (credential.status === "present")
|
|
87
|
+
return credential.source ?? "vault";
|
|
88
|
+
if (credential.status === "invalid-pool")
|
|
89
|
+
return "vault unavailable";
|
|
90
|
+
if (credential.status === "not-loaded")
|
|
91
|
+
return "checked previously";
|
|
92
|
+
return "missing";
|
|
93
|
+
}
|
|
94
|
+
function readinessLabel(readiness) {
|
|
95
|
+
if (readiness.status === "failed") {
|
|
96
|
+
return readiness.error ? `failed: ${readiness.error}` : "failed";
|
|
97
|
+
}
|
|
98
|
+
if (readiness.status === "stale") {
|
|
99
|
+
return readiness.reason ? `stale: ${readiness.reason}` : "stale";
|
|
100
|
+
}
|
|
101
|
+
if (readiness.status === "unknown") {
|
|
102
|
+
return readiness.reason ? `unknown: ${readiness.reason}` : "unknown";
|
|
103
|
+
}
|
|
104
|
+
return readiness.status;
|
|
105
|
+
}
|
|
106
|
+
function providerStatusDetail(lane) {
|
|
107
|
+
if (lane.credential.status === "missing" || lane.credential.status === "invalid-pool")
|
|
108
|
+
return undefined;
|
|
109
|
+
return lane.readiness.error;
|
|
110
|
+
}
|
|
111
|
+
function formatProviderVisibilityLine(lane) {
|
|
112
|
+
if (lane.status === "unconfigured") {
|
|
113
|
+
return `${lane.lane}: unconfigured (${lane.reason}); repair: ${lane.repairCommand}`;
|
|
114
|
+
}
|
|
115
|
+
const parts = [
|
|
116
|
+
readinessLabel(lane.readiness),
|
|
117
|
+
`source: ${lane.source}`,
|
|
118
|
+
`credentials: ${credentialLabel(lane.credential)}`,
|
|
119
|
+
];
|
|
120
|
+
if (lane.credential.revision)
|
|
121
|
+
parts.push(`revision: ${lane.credential.revision}`);
|
|
122
|
+
if (lane.credential.repairCommand)
|
|
123
|
+
parts.push(`repair: ${lane.credential.repairCommand}`);
|
|
124
|
+
if (lane.warnings.length > 0)
|
|
125
|
+
parts.push(`warnings: ${lane.warnings.join("; ")}`);
|
|
126
|
+
return `${lane.lane}: ${lane.provider} / ${lane.model} [${parts.join("; ")}]`;
|
|
127
|
+
}
|
|
128
|
+
function formatAgentProviderVisibilityForPrompt(visibility) {
|
|
129
|
+
if (visibility.lanes.every((lane) => lane.status === "unconfigured")) {
|
|
130
|
+
return [
|
|
131
|
+
"provider bindings are not configured on this machine.",
|
|
132
|
+
...visibility.lanes.map((lane) => `- ${formatProviderVisibilityLine(lane)}`),
|
|
133
|
+
].join("\n");
|
|
134
|
+
}
|
|
135
|
+
return [
|
|
136
|
+
"runtime uses local provider bindings for this machine:",
|
|
137
|
+
...visibility.lanes.map((lane) => `- ${formatProviderVisibilityLine(lane)}`),
|
|
138
|
+
].join("\n");
|
|
139
|
+
}
|
|
140
|
+
function formatAgentProviderVisibilityForStartOfTurn(visibility) {
|
|
141
|
+
return visibility.lanes.map((lane) => `- ${formatProviderVisibilityLine(lane)}`).join("\n");
|
|
142
|
+
}
|
|
143
|
+
function formatAgentProviderVisibilityForPulse(visibility) {
|
|
144
|
+
return visibility.lanes.map((lane) => formatProviderVisibilityLine(lane)).join("; ");
|
|
145
|
+
}
|
|
146
|
+
function providerVisibilityStatusRows(visibility) {
|
|
147
|
+
return visibility.lanes.map((lane) => {
|
|
148
|
+
if (lane.status === "unconfigured") {
|
|
149
|
+
return {
|
|
150
|
+
agent: visibility.agentName,
|
|
151
|
+
lane: lane.lane,
|
|
152
|
+
provider: "unconfigured",
|
|
153
|
+
model: "-",
|
|
154
|
+
source: "missing",
|
|
155
|
+
readiness: "unknown",
|
|
156
|
+
detail: lane.repairCommand,
|
|
157
|
+
credential: "missing",
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
const detail = providerStatusDetail(lane);
|
|
161
|
+
return {
|
|
162
|
+
agent: visibility.agentName,
|
|
163
|
+
lane: lane.lane,
|
|
164
|
+
provider: lane.provider,
|
|
165
|
+
model: lane.model,
|
|
166
|
+
source: lane.source,
|
|
167
|
+
readiness: lane.readiness.status,
|
|
168
|
+
...(detail ? { detail } : {}),
|
|
169
|
+
credential: credentialLabel(lane.credential),
|
|
170
|
+
};
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
function isAgentProviderVisibility(value) {
|
|
174
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
175
|
+
return false;
|
|
176
|
+
const record = value;
|
|
177
|
+
if (typeof record.agentName !== "string")
|
|
178
|
+
return false;
|
|
179
|
+
if (!Array.isArray(record.lanes))
|
|
180
|
+
return false;
|
|
181
|
+
return record.lanes.every((lane) => {
|
|
182
|
+
if (!lane || typeof lane !== "object" || Array.isArray(lane))
|
|
183
|
+
return false;
|
|
184
|
+
const laneRecord = lane;
|
|
185
|
+
return (laneRecord.lane === "outward" || laneRecord.lane === "inner")
|
|
186
|
+
&& (laneRecord.status === "configured" || laneRecord.status === "unconfigured");
|
|
187
|
+
});
|
|
188
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.needsRefresh = needsRefresh;
|
|
4
|
+
exports.refreshAnthropicToken = refreshAnthropicToken;
|
|
5
|
+
exports.persistTokenState = persistTokenState;
|
|
6
|
+
exports.ensureFreshToken = ensureFreshToken;
|
|
7
|
+
/* v8 ignore start -- OAuth token lifecycle: requires live API calls, tested via integration @preserve */
|
|
8
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
9
|
+
const provider_credentials_1 = require("../provider-credentials");
|
|
10
|
+
const OAUTH_TOKEN_ENDPOINT = "https://console.anthropic.com/v1/oauth/token";
|
|
11
|
+
const OAUTH_CLIENT_ID = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
|
|
12
|
+
const REFRESH_MARGIN_MS = 5 * 60 * 1000; // refresh 5 minutes before expiry
|
|
13
|
+
/**
|
|
14
|
+
* Check if the Anthropic OAuth token needs refreshing.
|
|
15
|
+
* Returns true if no expiresAt is set (legacy token) or if within 5 min of expiry.
|
|
16
|
+
*/
|
|
17
|
+
function needsRefresh(expiresAt) {
|
|
18
|
+
if (!expiresAt)
|
|
19
|
+
return true; // legacy token with no expiry — always try refresh
|
|
20
|
+
return Date.now() > expiresAt - REFRESH_MARGIN_MS;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Refresh an Anthropic OAuth access token using the refresh token.
|
|
24
|
+
* Returns the new token state or null if refresh fails.
|
|
25
|
+
*/
|
|
26
|
+
async function refreshAnthropicToken(refreshToken, fetchImpl = fetch) {
|
|
27
|
+
try {
|
|
28
|
+
const response = await fetchImpl(OAUTH_TOKEN_ENDPOINT, {
|
|
29
|
+
method: "POST",
|
|
30
|
+
headers: { "Content-Type": "application/json" },
|
|
31
|
+
body: JSON.stringify({
|
|
32
|
+
grant_type: "refresh_token",
|
|
33
|
+
refresh_token: refreshToken,
|
|
34
|
+
client_id: OAUTH_CLIENT_ID,
|
|
35
|
+
}),
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
(0, runtime_1.emitNervesEvent)({
|
|
39
|
+
level: "warn",
|
|
40
|
+
component: "engine",
|
|
41
|
+
event: "engine.anthropic_token_refresh_failed",
|
|
42
|
+
message: `token refresh failed: ${response.status}`,
|
|
43
|
+
meta: { status: response.status },
|
|
44
|
+
});
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const json = await response.json();
|
|
48
|
+
if (!json.access_token) {
|
|
49
|
+
(0, runtime_1.emitNervesEvent)({
|
|
50
|
+
level: "warn",
|
|
51
|
+
component: "engine",
|
|
52
|
+
event: "engine.anthropic_token_refresh_failed",
|
|
53
|
+
message: "token refresh returned no access_token",
|
|
54
|
+
meta: {},
|
|
55
|
+
});
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
const state = {
|
|
59
|
+
accessToken: json.access_token,
|
|
60
|
+
refreshToken: json.refresh_token ?? refreshToken, // keep old if not returned
|
|
61
|
+
expiresAt: Date.now() + (json.expires_in ?? 28800) * 1000, // default 8h
|
|
62
|
+
};
|
|
63
|
+
(0, runtime_1.emitNervesEvent)({
|
|
64
|
+
component: "engine",
|
|
65
|
+
event: "engine.anthropic_token_refreshed",
|
|
66
|
+
message: "anthropic OAuth token refreshed",
|
|
67
|
+
meta: { expiresAt: new Date(state.expiresAt).toISOString() },
|
|
68
|
+
});
|
|
69
|
+
return state;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
(0, runtime_1.emitNervesEvent)({
|
|
73
|
+
level: "warn",
|
|
74
|
+
component: "engine",
|
|
75
|
+
event: "engine.anthropic_token_refresh_error",
|
|
76
|
+
message: "token refresh threw",
|
|
77
|
+
meta: { error: error instanceof Error ? error.message : String(error) },
|
|
78
|
+
});
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Persist refreshed token state back to the agent vault.
|
|
84
|
+
*/
|
|
85
|
+
async function persistTokenState(agentName, state) {
|
|
86
|
+
try {
|
|
87
|
+
await (0, provider_credentials_1.upsertProviderCredential)({
|
|
88
|
+
agentName,
|
|
89
|
+
provider: "anthropic",
|
|
90
|
+
credentials: {
|
|
91
|
+
setupToken: state.accessToken,
|
|
92
|
+
refreshToken: state.refreshToken,
|
|
93
|
+
expiresAt: state.expiresAt,
|
|
94
|
+
},
|
|
95
|
+
config: {},
|
|
96
|
+
provenance: { source: "auth-flow" },
|
|
97
|
+
});
|
|
98
|
+
/* v8 ignore start -- defensive: persistence failure must not crash the provider @preserve */
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
(0, runtime_1.emitNervesEvent)({
|
|
102
|
+
level: "warn",
|
|
103
|
+
component: "engine",
|
|
104
|
+
event: "engine.anthropic_token_persist_error",
|
|
105
|
+
message: "failed to persist refreshed token",
|
|
106
|
+
meta: { error: error instanceof Error ? error.message : String(error) },
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/* v8 ignore stop */
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Ensure the Anthropic token is fresh. If expired, refresh and persist.
|
|
113
|
+
* Returns the current valid access token, or null if refresh failed and
|
|
114
|
+
* the existing token is expired.
|
|
115
|
+
*/
|
|
116
|
+
async function ensureFreshToken(currentToken, refreshToken, expiresAt, agentName, fetchImpl) {
|
|
117
|
+
if (!needsRefresh(expiresAt)) {
|
|
118
|
+
return currentToken; // still fresh
|
|
119
|
+
}
|
|
120
|
+
if (!refreshToken) {
|
|
121
|
+
// No refresh token — use the current token as-is (may be expired)
|
|
122
|
+
return currentToken;
|
|
123
|
+
}
|
|
124
|
+
const newState = await refreshAnthropicToken(refreshToken, fetchImpl);
|
|
125
|
+
if (!newState) {
|
|
126
|
+
return currentToken; // refresh failed — try the old token
|
|
127
|
+
}
|
|
128
|
+
await persistTokenState(agentName, newState);
|
|
129
|
+
return newState.accessToken;
|
|
130
|
+
}
|
|
131
|
+
/* v8 ignore stop */
|