@ouro.bot/cli 0.1.0-alpha.7 → 0.1.0-alpha.700
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 +235 -183
- 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/SerpentGuide.ouro/agent.json +83 -0
- package/SerpentGuide.ouro/psyche/SOUL.md +25 -0
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +2 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +1 -1
- package/assets/ouroboros.png +0 -0
- package/changelog.json +4827 -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 +144 -0
- package/dist/arc/episodes.js +118 -0
- package/dist/arc/evolution.js +490 -0
- package/dist/arc/flight-recorder.js +928 -0
- package/dist/arc/intentions.js +134 -0
- package/dist/arc/json-store.js +117 -0
- package/dist/arc/obligations.js +348 -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 +1002 -0
- package/dist/heart/agent-entry.js +190 -3
- package/dist/heart/attachments/image-normalize.js +194 -0
- package/dist/heart/attachments/materialize.js +97 -0
- package/dist/heart/attachments/originals.js +88 -0
- package/dist/heart/attachments/render.js +29 -0
- package/dist/heart/attachments/sources/bluebubbles.js +156 -0
- package/dist/heart/attachments/sources/cli-local-file.js +78 -0
- package/dist/heart/attachments/sources/index.js +16 -0
- package/dist/heart/attachments/store.js +103 -0
- package/dist/heart/attachments/types.js +93 -0
- package/dist/heart/auth/auth-flow.js +479 -0
- package/dist/heart/autonomy-budget.js +434 -0
- package/dist/heart/awaiting/await-alert.js +146 -0
- package/dist/heart/awaiting/await-expiry.js +108 -0
- package/dist/heart/awaiting/await-loader.js +91 -0
- package/dist/heart/awaiting/await-parser.js +141 -0
- package/dist/heart/awaiting/await-runtime-state.js +100 -0
- package/dist/heart/awaiting/await-scheduler.js +378 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +478 -0
- package/dist/heart/bridges/state-machine.js +135 -0
- package/dist/heart/bridges/store.js +135 -0
- package/dist/heart/bundle-state.js +168 -0
- package/dist/heart/commitments.js +135 -0
- package/dist/heart/config-registry.js +331 -0
- package/dist/heart/config.js +172 -135
- package/dist/heart/context-loss-gauntlet.js +354 -0
- package/dist/heart/context-loss-sentinel.js +1155 -0
- package/dist/heart/core.js +1480 -262
- package/dist/heart/cross-chat-delivery.js +132 -0
- package/dist/heart/daemon/agent-config-check.js +451 -0
- package/dist/heart/daemon/agent-discovery.js +263 -0
- package/dist/heart/daemon/agent-service.js +523 -0
- package/dist/heart/daemon/agentic-repair.js +547 -0
- package/dist/heart/daemon/await-private-wake.js +59 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/boot-sync-probe.js +197 -0
- package/dist/heart/daemon/cadence.js +180 -0
- package/dist/heart/daemon/cli-defaults.js +780 -0
- package/dist/heart/daemon/cli-desk.js +322 -0
- package/dist/heart/daemon/cli-exec.js +8142 -0
- package/dist/heart/daemon/cli-help.js +675 -0
- package/dist/heart/daemon/cli-parse.js +2461 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +770 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/connect-bay.js +323 -0
- package/dist/heart/daemon/daemon-cli.js +30 -784
- package/dist/heart/daemon/daemon-entry.js +874 -13
- package/dist/heart/daemon/daemon-health.js +176 -0
- package/dist/heart/daemon/daemon-rollup.js +57 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +287 -0
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +1412 -26
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +1126 -0
- package/dist/heart/daemon/habit-private-wake.js +56 -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 +226 -0
- 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 +188 -0
- 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 +60 -11
- 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 +525 -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 +511 -0
- package/dist/heart/daemon/readiness-repair.js +365 -0
- package/dist/heart/daemon/run-hooks.js +39 -0
- package/dist/heart/daemon/runtime-logging.js +86 -16
- package/dist/heart/daemon/runtime-metadata.js +191 -0
- package/dist/{repertoire/tasks/lifecycle.js → heart/daemon/runtime-mode.js} +26 -39
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +929 -0
- 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 +361 -0
- package/dist/heart/daemon/stale-bundle-prune.js +113 -0
- package/dist/heart/daemon/startup-tui.js +338 -0
- package/dist/heart/daemon/task-scheduler.js +117 -39
- package/dist/heart/daemon/terminal-ui.js +499 -0
- package/dist/heart/daemon/thoughts.js +591 -0
- package/dist/heart/daemon/up-progress.js +366 -0
- package/dist/heart/daemon/vault-items.js +56 -0
- package/dist/heart/delegation.js +59 -0
- package/dist/heart/external-events/router.js +121 -0
- package/dist/heart/habits/habit-migration.js +189 -0
- package/dist/heart/habits/habit-parser.js +214 -0
- package/dist/heart/habits/habit-runtime-state.js +114 -0
- package/dist/heart/habits/habit-scheduler.js +431 -0
- package/dist/heart/habits/habit-session-summary.js +318 -0
- package/dist/heart/habits/habit-session.js +617 -0
- package/dist/heart/{daemon → hatch}/hatch-animation.js +10 -3
- package/dist/heart/{daemon → hatch}/hatch-flow.js +53 -137
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +6 -8
- package/dist/heart/hatch/specialist-orchestrator.js +129 -0
- package/dist/heart/hatch/specialist-prompt.js +102 -0
- package/dist/heart/hatch/specialist-tools.js +318 -0
- package/dist/heart/identity.js +287 -67
- package/dist/heart/kept-notes.js +289 -0
- package/dist/heart/kicks.js +2 -20
- package/dist/heart/machine-identity.js +161 -0
- package/dist/heart/mail-import-discovery.js +353 -0
- package/dist/heart/mailbox/mailbox-http-hooks.js +96 -0
- package/dist/heart/mailbox/mailbox-http-response.js +7 -0
- package/dist/heart/mailbox/mailbox-http-routes.js +375 -0
- package/dist/heart/mailbox/mailbox-http-static.js +103 -0
- package/dist/heart/mailbox/mailbox-http-transport.js +116 -0
- package/dist/heart/mailbox/mailbox-http.js +99 -0
- package/dist/heart/mailbox/mailbox-read.js +37 -0
- package/dist/heart/mailbox/mailbox-types.js +27 -0
- package/dist/heart/mailbox/mailbox-view.js +197 -0
- package/dist/heart/mailbox/readers/agent-machine.js +428 -0
- package/dist/heart/mailbox/readers/continuity-readers.js +329 -0
- package/dist/heart/mailbox/readers/mail.js +375 -0
- package/dist/heart/mailbox/readers/runtime-readers.js +815 -0
- package/dist/heart/mailbox/readers/sessions.js +232 -0
- package/dist/heart/mailbox/readers/shared.js +111 -0
- package/dist/heart/mcp/mcp-server.js +696 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +59 -0
- package/dist/heart/orientation-frame.js +217 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/primitives.js +1 -1
- package/dist/heart/private-runtime/decision-renderer.js +156 -0
- package/dist/heart/private-runtime/index.js +18 -0
- package/dist/heart/private-runtime/ledger.js +218 -0
- package/dist/heart/private-runtime/policy.js +214 -0
- package/dist/heart/private-runtime/types.js +2 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +273 -0
- package/dist/heart/provider-credentials.js +441 -0
- package/dist/heart/provider-failover.js +311 -0
- package/dist/heart/provider-models.js +81 -0
- package/dist/heart/provider-ping.js +262 -0
- package/dist/heart/provider-readiness-cache.js +119 -0
- package/dist/heart/provider-visibility.js +188 -0
- package/dist/heart/providers/anthropic-token.js +131 -0
- package/dist/heart/providers/anthropic.js +202 -50
- package/dist/heart/providers/azure.js +104 -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 +29 -7
- package/dist/heart/providers/openai-codex-token.js +349 -0
- package/dist/heart/providers/openai-codex.js +63 -39
- package/dist/heart/run-ledger.js +247 -0
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +398 -0
- package/dist/heart/runtime-cwd.js +87 -0
- package/dist/heart/sense-truth.js +77 -0
- package/dist/heart/session-activity.js +235 -0
- package/dist/heart/session-events.js +1133 -0
- package/dist/heart/session-playback-cli-main.js +5 -0
- package/dist/heart/session-playback-cli.js +36 -0
- package/dist/heart/session-playback.js +231 -0
- package/dist/heart/session-stats-cli-main.js +5 -0
- package/dist/heart/session-stats.js +182 -0
- package/dist/heart/session-transcript.js +133 -0
- package/dist/heart/start-of-turn-packet.js +365 -0
- package/dist/heart/streaming.js +129 -34
- 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 +127 -0
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/timeouts.js +101 -0
- package/dist/heart/tool-activity-callbacks.js +59 -0
- package/dist/heart/tool-description.js +155 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +472 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/heart/versioning/ouro-bot-global-installer.js +129 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +426 -0
- package/dist/heart/{daemon → versioning}/ouro-uti.js +11 -2
- package/dist/heart/versioning/ouro-version-manager.js +409 -0
- package/dist/heart/versioning/staged-restart.js +146 -0
- package/dist/heart/versioning/update-checker.js +116 -0
- package/dist/heart/versioning/update-hooks.js +154 -0
- package/dist/heart/versioning/wrapper-publish-guard.js +86 -0
- package/dist/heart/work-card.js +380 -0
- package/dist/mailbox-ui/assets/index-Du_9G9WO.css +1 -0
- package/dist/mailbox-ui/assets/index-J8zDwHmE.js +1 -0
- package/dist/mailbox-ui/assets/vendor-CcN1XpQ9.js +61 -0
- package/dist/mailbox-ui/index.html +16 -0
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +715 -0
- package/dist/mailroom/body-cache.js +61 -0
- package/dist/mailroom/core.js +788 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +568 -0
- package/dist/mailroom/mbox-import.js +393 -0
- package/dist/mailroom/migration.js +164 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +233 -0
- package/dist/mailroom/search-cache.js +334 -0
- package/dist/mailroom/search-relevance.js +319 -0
- package/dist/mailroom/smtp-ingress.js +176 -0
- package/dist/mailroom/source-state.js +176 -0
- package/dist/mailroom/thread.js +109 -0
- package/dist/mailroom/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +93 -1
- package/dist/mind/context.js +259 -94
- package/dist/mind/desk-section.js +362 -0
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +90 -98
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/first-impressions.js +16 -2
- package/dist/mind/{associative-recall.js → note-search.js} +61 -60
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +77 -9
- package/dist/mind/phrases.js +1 -0
- package/dist/mind/prompt-budget.js +380 -0
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +1279 -139
- 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/token-estimate.js +8 -12
- package/dist/nerves/cli-logging.js +22 -3
- 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 +234 -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 +17 -56
- package/dist/repertoire/ado-semantic.js +16 -10
- package/dist/repertoire/api-client.js +97 -0
- package/dist/repertoire/bitwarden-store.js +1042 -0
- package/dist/repertoire/bundle-templates.js +71 -0
- package/dist/repertoire/bw-installer.js +180 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +331 -0
- package/dist/repertoire/coding/feedback.js +322 -0
- package/dist/repertoire/coding/index.js +18 -3
- package/dist/repertoire/coding/manager.js +228 -14
- package/dist/repertoire/coding/spawner.js +61 -14
- package/dist/repertoire/coding/tools.js +279 -12
- 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/data/ado-endpoints.json +188 -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 +408 -0
- package/dist/repertoire/mcp-client.js +295 -0
- package/dist/repertoire/mcp-manager.js +434 -0
- package/dist/repertoire/mcp-tools.js +83 -0
- package/dist/repertoire/plugin-mcp.js +175 -0
- package/dist/repertoire/plugins.js +253 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +45 -24
- package/dist/repertoire/stripe-client.js +131 -0
- package/dist/repertoire/tool-results.js +29 -0
- package/dist/repertoire/tools-a2a.js +699 -0
- package/dist/repertoire/tools-attachments.js +317 -0
- package/dist/repertoire/tools-awaiting.js +372 -0
- package/dist/repertoire/tools-base.js +68 -707
- package/dist/repertoire/tools-bluebubbles.js +95 -0
- package/dist/repertoire/tools-bridge.js +144 -0
- package/dist/repertoire/tools-bundle.js +993 -0
- package/dist/repertoire/tools-commerce.js +253 -0
- package/dist/repertoire/tools-config.js +186 -0
- package/dist/repertoire/tools-continuity.js +252 -0
- package/dist/repertoire/tools-credential.js +383 -0
- package/dist/repertoire/tools-evolution.js +527 -0
- package/dist/repertoire/tools-files.js +344 -0
- package/dist/repertoire/tools-flight.js +290 -0
- package/dist/repertoire/tools-flow.js +119 -0
- package/dist/repertoire/tools-github.js +3 -8
- package/dist/repertoire/tools-mail.js +1975 -0
- package/dist/repertoire/tools-notes.js +459 -0
- package/dist/repertoire/tools-obligations.js +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-session.js +881 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-stripe.js +224 -0
- package/dist/repertoire/tools-surface.js +355 -0
- package/dist/repertoire/tools-teams.js +67 -61
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-trip.js +982 -0
- package/dist/repertoire/tools-user-profile.js +146 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools-voice.js +145 -0
- package/dist/repertoire/tools.js +313 -102
- package/dist/repertoire/travel-api-client.js +360 -0
- package/dist/repertoire/user-profile.js +131 -0
- package/dist/repertoire/vault-setup.js +246 -0
- package/dist/repertoire/vault-unlock.js +594 -0
- package/dist/rsvp/aisleplanner-client.js +354 -0
- package/dist/rsvp/cli.js +704 -0
- package/dist/rsvp/config.js +327 -0
- package/dist/rsvp/cutover.js +431 -0
- package/dist/rsvp/diagnostics.js +222 -0
- package/dist/rsvp/diff-renderer.js +161 -0
- package/dist/rsvp/habit-policy.js +85 -0
- package/dist/rsvp/habit-stage.js +93 -0
- package/dist/rsvp/incident-bundle.js +97 -0
- package/dist/rsvp/migration.js +204 -0
- package/dist/rsvp/outbound-state.js +254 -0
- package/dist/rsvp/query.js +118 -0
- package/dist/rsvp/replay.js +233 -0
- package/dist/rsvp/snapshot.js +232 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/a2a-entry.js +115 -0
- package/dist/senses/attention-queue.js +186 -0
- package/dist/senses/await-turn-message.js +58 -0
- package/dist/senses/bluebubbles/active-turns.js +216 -0
- package/dist/senses/bluebubbles/attachment-cache.js +53 -0
- package/dist/senses/bluebubbles/attachment-download.js +137 -0
- package/dist/senses/bluebubbles/client.js +691 -0
- package/dist/senses/bluebubbles/entry.js +77 -0
- package/dist/senses/bluebubbles/inbound-log.js +126 -0
- package/dist/senses/bluebubbles/index.js +2937 -0
- package/dist/senses/bluebubbles/media.js +389 -0
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +45 -16
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
- package/dist/senses/bluebubbles/outbound-state.js +304 -0
- package/dist/senses/bluebubbles/processed-log.js +133 -0
- package/dist/senses/bluebubbles/replay.js +284 -0
- package/dist/senses/bluebubbles/runtime-state.js +137 -0
- package/dist/senses/bluebubbles/session-cleanup.js +72 -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 +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 +780 -269
- package/dist/senses/commands.js +66 -3
- package/dist/senses/context-packet-ledger.js +245 -0
- package/dist/senses/context-packets.js +154 -0
- package/dist/senses/continuity.js +94 -0
- package/dist/senses/habit-turn-message.js +160 -0
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +395 -0
- package/dist/senses/pipeline.js +1052 -0
- package/dist/senses/private-runtime-worker.js +723 -0
- package/dist/senses/private-runtime.js +1157 -0
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +416 -0
- package/dist/senses/surface-tool.js +109 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +928 -199
- package/dist/senses/trust-gate.js +207 -2
- 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 +5081 -0
- package/dist/senses/voice/types.js +2 -0
- package/dist/senses/voice/whisper.js +161 -0
- package/dist/senses/voice-entry.js +81 -0
- package/dist/senses/voice-realtime-eval-command.js +99 -0
- package/dist/senses/voice-realtime-eval-entry.js +21 -0
- package/dist/senses/voice-twilio-entry.js +87 -0
- package/dist/trips/core.js +138 -0
- package/dist/trips/store.js +265 -0
- package/dist/util/frontmatter.js +69 -0
- package/package.json +67 -11
- 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/AdoptionSpecialist.ouro/agent.json +0 -20
- package/AdoptionSpecialist.ouro/psyche/SOUL.md +0 -22
- package/dist/heart/daemon/specialist-orchestrator.js +0 -160
- package/dist/heart/daemon/specialist-prompt.js +0 -40
- package/dist/heart/daemon/specialist-session.js +0 -142
- package/dist/heart/daemon/specialist-tools.js +0 -128
- package/dist/heart/daemon/subagent-installer.js +0 -125
- package/dist/inner-worker-entry.js +0 -4
- package/dist/mind/friends/channel.js +0 -49
- package/dist/mind/friends/resolver.js +0 -84
- package/dist/mind/friends/store-file.js +0 -171
- package/dist/mind/friends/store.js +0 -4
- package/dist/mind/friends/tokens.js +0 -26
- package/dist/mind/friends/types.js +0 -21
- package/dist/repertoire/tasks/board.js +0 -122
- package/dist/repertoire/tasks/index.js +0 -210
- 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 -145
- package/dist/senses/bluebubbles-client.js +0 -279
- package/dist/senses/bluebubbles-entry.js +0 -11
- package/dist/senses/bluebubbles.js +0 -332
- package/dist/senses/inner-dialog-worker.js +0 -61
- package/dist/senses/inner-dialog.js +0 -231
- package/subagents/README.md +0 -73
- package/subagents/work-doer.md +0 -233
- package/subagents/work-merger.md +0 -624
- package/subagents/work-planner.md +0 -373
- /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/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
|
@@ -0,0 +1,349 @@
|
|
|
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.readOpenAICodexJwtExpiresAt = readOpenAICodexJwtExpiresAt;
|
|
37
|
+
exports.refreshOpenAICodexProviderCredentials = refreshOpenAICodexProviderCredentials;
|
|
38
|
+
const fs = __importStar(require("node:fs"));
|
|
39
|
+
const os = __importStar(require("node:os"));
|
|
40
|
+
const path = __importStar(require("node:path"));
|
|
41
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
42
|
+
const provider_credentials_1 = require("../provider-credentials");
|
|
43
|
+
const OPENAI_CODEX_TOKEN_ENDPOINT = "https://auth.openai.com/oauth/token";
|
|
44
|
+
const OPENAI_CODEX_CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
45
|
+
const OPENAI_CODEX_REFRESH_MARGIN_MS = 5 * 60_000;
|
|
46
|
+
function decodeJwtPayload(token) {
|
|
47
|
+
const parts = token.split(".");
|
|
48
|
+
if (parts.length < 2 || !parts[1])
|
|
49
|
+
return null;
|
|
50
|
+
try {
|
|
51
|
+
const base64 = parts[1]
|
|
52
|
+
.replace(/-/g, "+")
|
|
53
|
+
.replace(/_/g, "/")
|
|
54
|
+
.padEnd(Math.ceil(parts[1].length / 4) * 4, "=");
|
|
55
|
+
const parsed = JSON.parse(Buffer.from(base64, "base64").toString("utf8"));
|
|
56
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
57
|
+
return null;
|
|
58
|
+
return parsed;
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function readOpenAICodexJwtExpiresAt(token) {
|
|
65
|
+
const payload = decodeJwtPayload(token);
|
|
66
|
+
const exp = payload?.exp;
|
|
67
|
+
if (typeof exp !== "number" || !Number.isFinite(exp) || exp <= 0)
|
|
68
|
+
return undefined;
|
|
69
|
+
return Math.floor(exp * 1000);
|
|
70
|
+
}
|
|
71
|
+
function recordCredentialString(record, field) {
|
|
72
|
+
const value = record.credentials[field];
|
|
73
|
+
return typeof value === "string" ? value.trim() : "";
|
|
74
|
+
}
|
|
75
|
+
function recordCredentialNumber(record, field) {
|
|
76
|
+
const value = record.credentials[field];
|
|
77
|
+
if (typeof value === "number" && Number.isFinite(value) && value > 0)
|
|
78
|
+
return value;
|
|
79
|
+
if (typeof value === "string") {
|
|
80
|
+
const parsed = Number(value);
|
|
81
|
+
if (Number.isFinite(parsed) && parsed > 0)
|
|
82
|
+
return parsed;
|
|
83
|
+
}
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
function resolveExpiresAt(record) {
|
|
87
|
+
return recordCredentialNumber(record, "expiresAt")
|
|
88
|
+
?? readOpenAICodexJwtExpiresAt(recordCredentialString(record, "oauthAccessToken"));
|
|
89
|
+
}
|
|
90
|
+
function isRecordFresh(record, now) {
|
|
91
|
+
const expiresAt = resolveExpiresAt(record);
|
|
92
|
+
if (!expiresAt)
|
|
93
|
+
return true;
|
|
94
|
+
return expiresAt > now.getTime() + OPENAI_CODEX_REFRESH_MARGIN_MS;
|
|
95
|
+
}
|
|
96
|
+
function authCommand(agentName) {
|
|
97
|
+
return `ouro auth --agent ${agentName} --provider openai-codex`;
|
|
98
|
+
}
|
|
99
|
+
function readProviderRecordFailure(result, agentName) {
|
|
100
|
+
return {
|
|
101
|
+
ok: false,
|
|
102
|
+
actor: "human-required",
|
|
103
|
+
message: `openai-codex credentials could not be loaded for ${agentName}: ${result.error}. Run '${authCommand(agentName)}'.`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function parseRefreshFailure(body) {
|
|
107
|
+
try {
|
|
108
|
+
const parsed = JSON.parse(body);
|
|
109
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
110
|
+
return body.trim();
|
|
111
|
+
const record = parsed;
|
|
112
|
+
const error = record.error;
|
|
113
|
+
if (error && typeof error === "object" && !Array.isArray(error)) {
|
|
114
|
+
const code = error.code;
|
|
115
|
+
const message = error.message;
|
|
116
|
+
if (typeof message === "string" && message.trim())
|
|
117
|
+
return message.trim();
|
|
118
|
+
if (typeof code === "string" && code.trim())
|
|
119
|
+
return code.trim();
|
|
120
|
+
}
|
|
121
|
+
if (typeof error === "string" && error.trim())
|
|
122
|
+
return error.trim();
|
|
123
|
+
const code = record.code;
|
|
124
|
+
if (typeof code === "string" && code.trim())
|
|
125
|
+
return code.trim();
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Plain-text bodies are useful as-is.
|
|
129
|
+
}
|
|
130
|
+
return body.trim() || "refresh endpoint returned an empty error body";
|
|
131
|
+
}
|
|
132
|
+
function readLocalCodexAuthTokens(homeDir) {
|
|
133
|
+
const authPath = path.join(homeDir, ".codex", "auth.json");
|
|
134
|
+
let raw;
|
|
135
|
+
try {
|
|
136
|
+
raw = fs.readFileSync(authPath, "utf8");
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return { status: "missing" };
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
const parsed = JSON.parse(raw);
|
|
143
|
+
if (!parsed.tokens || typeof parsed.tokens !== "object")
|
|
144
|
+
return { status: "invalid" };
|
|
145
|
+
const accessToken = typeof parsed.tokens.access_token === "string" ? parsed.tokens.access_token.trim() : "";
|
|
146
|
+
const refreshToken = typeof parsed.tokens.refresh_token === "string" ? parsed.tokens.refresh_token.trim() : "";
|
|
147
|
+
if (!accessToken || !refreshToken)
|
|
148
|
+
return { status: "invalid" };
|
|
149
|
+
return { status: "ready", tokens: { accessToken, refreshToken } };
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return { status: "invalid" };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async function updateLocalCodexAuthIfUnchanged(input) {
|
|
156
|
+
const authPath = path.join(input.homeDir, ".codex", "auth.json");
|
|
157
|
+
let raw;
|
|
158
|
+
try {
|
|
159
|
+
raw = fs.readFileSync(authPath, "utf8");
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return "missing";
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
const parsed = JSON.parse(raw);
|
|
166
|
+
if (!parsed.tokens || typeof parsed.tokens !== "object")
|
|
167
|
+
return "skipped";
|
|
168
|
+
const currentAccess = typeof parsed.tokens.access_token === "string" ? parsed.tokens.access_token : "";
|
|
169
|
+
const currentRefresh = typeof parsed.tokens.refresh_token === "string" ? parsed.tokens.refresh_token : "";
|
|
170
|
+
if (currentAccess !== input.oldAccessToken && currentRefresh !== input.oldRefreshToken) {
|
|
171
|
+
return "skipped";
|
|
172
|
+
}
|
|
173
|
+
parsed.tokens.access_token = input.newAccessToken;
|
|
174
|
+
parsed.tokens.refresh_token = input.newRefreshToken;
|
|
175
|
+
parsed.last_refresh = input.now.toISOString();
|
|
176
|
+
fs.writeFileSync(authPath, `${JSON.stringify(parsed, null, 2)}\n`, "utf8");
|
|
177
|
+
return "updated";
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return "error";
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async function requestOpenAICodexTokenRefresh(input) {
|
|
184
|
+
let response;
|
|
185
|
+
try {
|
|
186
|
+
response = await input.fetchImpl(OPENAI_CODEX_TOKEN_ENDPOINT, {
|
|
187
|
+
method: "POST",
|
|
188
|
+
headers: { "Content-Type": "application/json" },
|
|
189
|
+
body: JSON.stringify({
|
|
190
|
+
client_id: OPENAI_CODEX_CLIENT_ID,
|
|
191
|
+
grant_type: "refresh_token",
|
|
192
|
+
refresh_token: input.refreshToken,
|
|
193
|
+
}),
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
return { ok: false, detail: error instanceof Error ? error.message : String(error) };
|
|
198
|
+
}
|
|
199
|
+
if (!response.ok) {
|
|
200
|
+
const body = await response.text().catch(() => "");
|
|
201
|
+
return { ok: false, status: response.status, detail: parseRefreshFailure(body) };
|
|
202
|
+
}
|
|
203
|
+
let body;
|
|
204
|
+
try {
|
|
205
|
+
body = await response.json();
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return { ok: false, detail: `refresh endpoint returned invalid JSON: ${error instanceof Error ? error.message : String(error)}` };
|
|
209
|
+
}
|
|
210
|
+
const accessToken = typeof body.access_token === "string" ? body.access_token.trim() : "";
|
|
211
|
+
const refreshToken = typeof body.refresh_token === "string" ? body.refresh_token.trim() : input.refreshToken;
|
|
212
|
+
if (!accessToken)
|
|
213
|
+
return { ok: false, detail: "refresh endpoint returned no access_token" };
|
|
214
|
+
return { ok: true, accessToken, refreshToken };
|
|
215
|
+
}
|
|
216
|
+
function refreshFailureRequiresHuman(refresh) {
|
|
217
|
+
const detail = refresh.detail.toLowerCase();
|
|
218
|
+
return refresh.status === 401
|
|
219
|
+
|| detail.includes("signing in again")
|
|
220
|
+
|| detail.includes("already been used")
|
|
221
|
+
|| detail.includes("invalid_grant")
|
|
222
|
+
|| detail.includes("refresh token expired");
|
|
223
|
+
}
|
|
224
|
+
async function refreshOpenAICodexProviderCredentials(agentName, options = {}) {
|
|
225
|
+
const now = options.now ?? new Date();
|
|
226
|
+
const readRecord = options.readRecord ?? provider_credentials_1.readProviderCredentialRecord;
|
|
227
|
+
const upsertCredential = options.upsertCredential ?? provider_credentials_1.upsertProviderCredential;
|
|
228
|
+
let record = options.record;
|
|
229
|
+
if (!record) {
|
|
230
|
+
const result = await readRecord(agentName, "openai-codex", { refreshIfMissing: true });
|
|
231
|
+
if (!result.ok)
|
|
232
|
+
return readProviderRecordFailure(result, agentName);
|
|
233
|
+
record = result.record;
|
|
234
|
+
}
|
|
235
|
+
if (!options.force && isRecordFresh(record, now)) {
|
|
236
|
+
(0, runtime_1.emitNervesEvent)({
|
|
237
|
+
component: "engine",
|
|
238
|
+
event: "engine.openai_codex_token_refresh_skipped",
|
|
239
|
+
message: "openai-codex token refresh skipped because the credential is still fresh",
|
|
240
|
+
meta: { agentName, reason: options.reason ?? "fresh" },
|
|
241
|
+
});
|
|
242
|
+
return { ok: true, refreshed: false, record };
|
|
243
|
+
}
|
|
244
|
+
const oldAccessToken = recordCredentialString(record, "oauthAccessToken");
|
|
245
|
+
const oldRefreshToken = recordCredentialString(record, "refreshToken");
|
|
246
|
+
const homeDir = options.homeDir ?? os.homedir();
|
|
247
|
+
const fallbackLocalAuth = oldRefreshToken ? undefined : readLocalCodexAuthTokens(homeDir);
|
|
248
|
+
let refreshSource = oldRefreshToken
|
|
249
|
+
? { source: "vault", accessToken: oldAccessToken, refreshToken: oldRefreshToken }
|
|
250
|
+
: fallbackLocalAuth?.status === "ready"
|
|
251
|
+
? { source: "local-codex-auth", accessToken: fallbackLocalAuth.tokens.accessToken, refreshToken: fallbackLocalAuth.tokens.refreshToken }
|
|
252
|
+
: undefined;
|
|
253
|
+
if (!refreshSource) {
|
|
254
|
+
return {
|
|
255
|
+
ok: false,
|
|
256
|
+
actor: "human-required",
|
|
257
|
+
message: `openai-codex has no saved refresh token for ${agentName} and no usable local Codex login to import. Run '${authCommand(agentName)}'.`,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
(0, runtime_1.emitNervesEvent)({
|
|
261
|
+
component: "engine",
|
|
262
|
+
event: "engine.openai_codex_token_refresh_start",
|
|
263
|
+
message: "refreshing openai-codex OAuth token",
|
|
264
|
+
meta: { agentName, reason: options.reason ?? "unspecified", source: refreshSource.source },
|
|
265
|
+
});
|
|
266
|
+
let refresh = await requestOpenAICodexTokenRefresh({
|
|
267
|
+
refreshToken: refreshSource.refreshToken,
|
|
268
|
+
fetchImpl: options.fetchImpl ?? fetch,
|
|
269
|
+
});
|
|
270
|
+
if (!refresh.ok && oldRefreshToken) {
|
|
271
|
+
const retryLocalAuth = readLocalCodexAuthTokens(homeDir);
|
|
272
|
+
if (retryLocalAuth.status === "ready" && retryLocalAuth.tokens.refreshToken !== oldRefreshToken) {
|
|
273
|
+
(0, runtime_1.emitNervesEvent)({
|
|
274
|
+
component: "engine",
|
|
275
|
+
event: "engine.openai_codex_token_refresh_local_rescue",
|
|
276
|
+
message: "retrying openai-codex OAuth refresh with local Codex auth tokens",
|
|
277
|
+
meta: { agentName, reason: options.reason ?? "unspecified", status: refresh.status ?? "none", detail: refresh.detail },
|
|
278
|
+
});
|
|
279
|
+
refreshSource = {
|
|
280
|
+
source: "local-codex-auth",
|
|
281
|
+
accessToken: retryLocalAuth.tokens.accessToken,
|
|
282
|
+
refreshToken: retryLocalAuth.tokens.refreshToken,
|
|
283
|
+
};
|
|
284
|
+
refresh = await requestOpenAICodexTokenRefresh({
|
|
285
|
+
refreshToken: refreshSource.refreshToken,
|
|
286
|
+
fetchImpl: options.fetchImpl ?? fetch,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (!refresh.ok) {
|
|
291
|
+
const actor = refreshFailureRequiresHuman(refresh) ? "human-required" : "agent-runnable";
|
|
292
|
+
(0, runtime_1.emitNervesEvent)({
|
|
293
|
+
level: actor === "human-required" ? "warn" : "error",
|
|
294
|
+
component: "engine",
|
|
295
|
+
event: "engine.openai_codex_token_refresh_error",
|
|
296
|
+
message: "openai-codex OAuth token refresh failed",
|
|
297
|
+
meta: {
|
|
298
|
+
agentName,
|
|
299
|
+
reason: options.reason ?? "unspecified",
|
|
300
|
+
actor,
|
|
301
|
+
source: refreshSource.source,
|
|
302
|
+
...(refresh.status ? { status: refresh.status } : {}),
|
|
303
|
+
detail: refresh.detail,
|
|
304
|
+
},
|
|
305
|
+
});
|
|
306
|
+
return {
|
|
307
|
+
ok: false,
|
|
308
|
+
actor,
|
|
309
|
+
message: actor === "human-required"
|
|
310
|
+
? `openai-codex refresh token is no longer usable (${refresh.detail}). Run '${authCommand(agentName)}'.`
|
|
311
|
+
: `openai-codex token refresh failed (${refresh.detail}); retry refresh before asking for browser login.`,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
const expiresAt = readOpenAICodexJwtExpiresAt(refresh.accessToken);
|
|
315
|
+
const credentials = {
|
|
316
|
+
oauthAccessToken: refresh.accessToken,
|
|
317
|
+
refreshToken: refresh.refreshToken,
|
|
318
|
+
...(expiresAt ? { expiresAt } : {}),
|
|
319
|
+
};
|
|
320
|
+
const updated = await upsertCredential({
|
|
321
|
+
agentName,
|
|
322
|
+
provider: "openai-codex",
|
|
323
|
+
credentials,
|
|
324
|
+
config: { ...record.config },
|
|
325
|
+
provenance: { source: record.provenance.source },
|
|
326
|
+
now,
|
|
327
|
+
});
|
|
328
|
+
const localAuthSync = await updateLocalCodexAuthIfUnchanged({
|
|
329
|
+
homeDir,
|
|
330
|
+
oldAccessToken: refreshSource.accessToken,
|
|
331
|
+
oldRefreshToken: refreshSource.refreshToken,
|
|
332
|
+
newAccessToken: refresh.accessToken,
|
|
333
|
+
newRefreshToken: refresh.refreshToken,
|
|
334
|
+
now,
|
|
335
|
+
});
|
|
336
|
+
(0, runtime_1.emitNervesEvent)({
|
|
337
|
+
component: "engine",
|
|
338
|
+
event: "engine.openai_codex_token_refresh_end",
|
|
339
|
+
message: "refreshed openai-codex OAuth token",
|
|
340
|
+
meta: {
|
|
341
|
+
agentName,
|
|
342
|
+
reason: options.reason ?? "unspecified",
|
|
343
|
+
credentialRevision: updated.revision,
|
|
344
|
+
source: refreshSource.source,
|
|
345
|
+
localCodexAuth: localAuthSync,
|
|
346
|
+
},
|
|
347
|
+
});
|
|
348
|
+
return { ok: true, refreshed: true, record: updated };
|
|
349
|
+
}
|
|
@@ -3,12 +3,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.classifyOpenAICodexError = classifyOpenAICodexError;
|
|
6
7
|
exports.createOpenAICodexProviderRuntime = createOpenAICodexProviderRuntime;
|
|
7
8
|
const openai_1 = __importDefault(require("openai"));
|
|
8
9
|
const config_1 = require("../config");
|
|
9
10
|
const identity_1 = require("../identity");
|
|
10
11
|
const runtime_1 = require("../../nerves/runtime");
|
|
11
12
|
const streaming_1 = require("../streaming");
|
|
13
|
+
const model_capabilities_1 = require("../model-capabilities");
|
|
14
|
+
const error_classification_1 = require("./error-classification");
|
|
12
15
|
const OPENAI_CODEX_AUTH_FAILURE_MARKERS = [
|
|
13
16
|
"authentication failed",
|
|
14
17
|
"unauthorized",
|
|
@@ -17,9 +20,16 @@ const OPENAI_CODEX_AUTH_FAILURE_MARKERS = [
|
|
|
17
20
|
"invalid bearer token",
|
|
18
21
|
];
|
|
19
22
|
const OPENAI_CODEX_BACKEND_BASE_URL = "https://chatgpt.com/backend-api/codex";
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
+
const OPENAI_CODEX_PING_INPUT = [{ role: "user", content: "ping" }];
|
|
24
|
+
const OPENAI_CODEX_PING_CALLBACKS = {
|
|
25
|
+
onModelStart() { },
|
|
26
|
+
onModelStreamStart() { },
|
|
27
|
+
onTextChunk() { },
|
|
28
|
+
onReasoningChunk() { },
|
|
29
|
+
onToolStart() { },
|
|
30
|
+
onToolEnd() { },
|
|
31
|
+
onError() { },
|
|
32
|
+
};
|
|
23
33
|
function getOpenAICodexAgentNameForGuidance() {
|
|
24
34
|
return (0, identity_1.getAgentName)();
|
|
25
35
|
}
|
|
@@ -27,11 +37,9 @@ function getOpenAICodexOAuthInstructions() {
|
|
|
27
37
|
const agentName = getOpenAICodexAgentNameForGuidance();
|
|
28
38
|
return [
|
|
29
39
|
"Fix:",
|
|
30
|
-
` 1. Run \`
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
" 3. Confirm providers.openai-codex.oauthAccessToken is set",
|
|
34
|
-
" 4. This provider uses chatgpt.com/backend-api/codex/responses (not api.openai.com/responses).",
|
|
40
|
+
` 1. Run \`ouro auth --agent ${agentName} --provider openai-codex\``,
|
|
41
|
+
" 2. This provider uses chatgpt.com/backend-api/codex/responses (not api.openai.com/responses).",
|
|
42
|
+
" 3. After reauth, retry the failed ouro command or reconnect this session.",
|
|
35
43
|
].join("\n");
|
|
36
44
|
}
|
|
37
45
|
function getOpenAICodexReauthGuidance(reason) {
|
|
@@ -41,22 +49,19 @@ function getOpenAICodexReauthGuidance(reason) {
|
|
|
41
49
|
getOpenAICodexOAuthInstructions(),
|
|
42
50
|
].join("\n");
|
|
43
51
|
}
|
|
52
|
+
function classifyOpenAICodexError(error) {
|
|
53
|
+
return (0, error_classification_1.classifyHttpError)(error, {
|
|
54
|
+
isAuthFailure: isOpenAICodexAuthFailure,
|
|
55
|
+
isUsageLimit: (e) => {
|
|
56
|
+
const lower = e.message.toLowerCase();
|
|
57
|
+
return lower.includes("usage") || lower.includes("quota") || lower.includes("exceeded your");
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
44
61
|
function isOpenAICodexAuthFailure(error) {
|
|
45
|
-
if (!(error instanceof Error))
|
|
46
|
-
return false;
|
|
47
|
-
const status = error.status;
|
|
48
|
-
if (status === 401 || status === 403)
|
|
49
|
-
return true;
|
|
50
62
|
const lower = error.message.toLowerCase();
|
|
51
63
|
return OPENAI_CODEX_AUTH_FAILURE_MARKERS.some((marker) => lower.includes(marker));
|
|
52
64
|
}
|
|
53
|
-
function withOpenAICodexAuthGuidance(error) {
|
|
54
|
-
const base = error instanceof Error ? error.message : String(error);
|
|
55
|
-
if (isOpenAICodexAuthFailure(error)) {
|
|
56
|
-
return new Error(getOpenAICodexReauthGuidance(`OpenAI Codex authentication failed (${base}).`));
|
|
57
|
-
}
|
|
58
|
-
return error instanceof Error ? error : new Error(String(error));
|
|
59
|
-
}
|
|
60
65
|
function decodeJwtPayload(token) {
|
|
61
66
|
const parts = token.split(".");
|
|
62
67
|
if (parts.length < 2)
|
|
@@ -87,16 +92,27 @@ function getChatGPTAccountIdFromToken(token) {
|
|
|
87
92
|
return "";
|
|
88
93
|
return accountId.trim();
|
|
89
94
|
}
|
|
90
|
-
function
|
|
95
|
+
function createOpenAICodexResponsesParams(input, instructions, model, reasoningEffort) {
|
|
96
|
+
return {
|
|
97
|
+
model,
|
|
98
|
+
input,
|
|
99
|
+
instructions,
|
|
100
|
+
tools: [],
|
|
101
|
+
reasoning: { effort: reasoningEffort, summary: "detailed" },
|
|
102
|
+
stream: true,
|
|
103
|
+
store: false,
|
|
104
|
+
include: ["reasoning.encrypted_content"],
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function createOpenAICodexProviderRuntime(model, codexConfig = (0, config_1.getOpenAICodexConfig)()) {
|
|
91
108
|
(0, runtime_1.emitNervesEvent)({
|
|
92
109
|
component: "engine",
|
|
93
110
|
event: "engine.provider_init",
|
|
94
111
|
message: "openai-codex provider init",
|
|
95
112
|
meta: { provider: "openai-codex" },
|
|
96
113
|
});
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
throw new Error(getOpenAICodexReauthGuidance("provider 'openai-codex' is selected in agent.json but providers.openai-codex.model/oauthAccessToken is incomplete in secrets.json."));
|
|
114
|
+
if (!codexConfig.oauthAccessToken) {
|
|
115
|
+
throw new Error(getOpenAICodexReauthGuidance("provider 'openai-codex' is selected but openai-codex.oauthAccessToken is missing in the agent vault."));
|
|
100
116
|
}
|
|
101
117
|
const token = codexConfig.oauthAccessToken.trim();
|
|
102
118
|
if (!token) {
|
|
@@ -106,6 +122,12 @@ function createOpenAICodexProviderRuntime() {
|
|
|
106
122
|
if (!chatgptAccountId) {
|
|
107
123
|
throw new Error(getOpenAICodexReauthGuidance("OpenAI Codex OAuth access token is missing a chatgpt_account_id claim required for chatgpt.com/backend-api/codex."));
|
|
108
124
|
}
|
|
125
|
+
const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
|
|
126
|
+
const capabilities = new Set();
|
|
127
|
+
if (modelCaps.reasoningEffort)
|
|
128
|
+
capabilities.add("reasoning-effort");
|
|
129
|
+
if (modelCaps.phase)
|
|
130
|
+
capabilities.add("phase-annotation");
|
|
109
131
|
const client = new openai_1.default({
|
|
110
132
|
apiKey: token,
|
|
111
133
|
baseURL: OPENAI_CODEX_BACKEND_BASE_URL,
|
|
@@ -114,15 +136,16 @@ function createOpenAICodexProviderRuntime() {
|
|
|
114
136
|
"OpenAI-Beta": "responses=experimental",
|
|
115
137
|
originator: "ouroboros",
|
|
116
138
|
},
|
|
117
|
-
timeout: 30000,
|
|
118
139
|
maxRetries: 0,
|
|
119
140
|
});
|
|
120
141
|
let nativeInput = null;
|
|
121
142
|
let nativeInstructions = "";
|
|
122
143
|
return {
|
|
123
144
|
id: "openai-codex",
|
|
124
|
-
model
|
|
145
|
+
model,
|
|
125
146
|
client,
|
|
147
|
+
capabilities,
|
|
148
|
+
supportedReasoningEfforts: modelCaps.reasoningEffort,
|
|
126
149
|
resetTurnState(messages) {
|
|
127
150
|
const { instructions, input } = (0, streaming_1.toResponsesInput)(messages);
|
|
128
151
|
nativeInput = input;
|
|
@@ -131,32 +154,33 @@ function createOpenAICodexProviderRuntime() {
|
|
|
131
154
|
appendToolOutput(callId, output) {
|
|
132
155
|
if (!nativeInput)
|
|
133
156
|
return;
|
|
134
|
-
nativeInput.push({ type: "function_call_output", call_id: callId, output });
|
|
157
|
+
nativeInput.push({ type: "function_call_output", call_id: callId, output: (0, streaming_1.truncateResponsesFunctionCallOutput)(output) });
|
|
135
158
|
},
|
|
136
159
|
async streamTurn(request) {
|
|
137
160
|
if (!nativeInput)
|
|
138
161
|
this.resetTurnState(request.messages);
|
|
139
|
-
const params =
|
|
140
|
-
|
|
141
|
-
input: nativeInput,
|
|
142
|
-
instructions: nativeInstructions,
|
|
143
|
-
tools: (0, streaming_1.toResponsesTools)(request.activeTools),
|
|
144
|
-
reasoning: { effort: "medium", summary: "detailed" },
|
|
145
|
-
stream: true,
|
|
146
|
-
store: false,
|
|
147
|
-
include: ["reasoning.encrypted_content"],
|
|
148
|
-
};
|
|
162
|
+
const params = createOpenAICodexResponsesParams(nativeInput, nativeInstructions, this.model, request.reasoningEffort ?? "medium");
|
|
163
|
+
params.tools = (0, streaming_1.toResponsesTools)(request.activeTools);
|
|
149
164
|
if (request.toolChoiceRequired)
|
|
150
165
|
params.tool_choice = "required";
|
|
151
166
|
try {
|
|
152
|
-
const result = await (0, streaming_1.streamResponsesApi)(this.client, params, request.callbacks, request.signal);
|
|
167
|
+
const result = await (0, streaming_1.streamResponsesApi)(this.client, params, request.callbacks, request.signal, request.eagerSettleStreaming);
|
|
153
168
|
for (const item of result.outputItems)
|
|
154
169
|
nativeInput.push(item);
|
|
155
170
|
return result;
|
|
156
171
|
}
|
|
157
172
|
catch (error) {
|
|
158
|
-
throw
|
|
173
|
+
throw error instanceof Error ? error : new Error(String(error));
|
|
159
174
|
}
|
|
160
175
|
},
|
|
176
|
+
/* v8 ignore start -- ping: tested via provider-ping.test.ts @preserve */
|
|
177
|
+
async ping(signal) {
|
|
178
|
+
await (0, streaming_1.streamResponsesApi)(this.client, createOpenAICodexResponsesParams(OPENAI_CODEX_PING_INPUT, "", this.model, "medium"), OPENAI_CODEX_PING_CALLBACKS, signal);
|
|
179
|
+
},
|
|
180
|
+
/* v8 ignore stop */
|
|
181
|
+
/* v8 ignore next 3 -- delegation: classification logic tested via classifyOpenAICodexError @preserve */
|
|
182
|
+
classifyError(error) {
|
|
183
|
+
return classifyOpenAICodexError(error);
|
|
184
|
+
},
|
|
161
185
|
};
|
|
162
186
|
}
|