@ouro.bot/cli 0.1.0-alpha.49 → 0.1.0-alpha.490
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/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -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 +3118 -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 +989 -0
- 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 +426 -0
- package/dist/heart/background-operations.js +281 -0
- package/dist/heart/bridges/manager.js +37 -0
- package/dist/heart/bridges/state-machine.js +20 -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 +119 -129
- package/dist/heart/core.js +758 -227
- package/dist/heart/cross-chat-delivery.js +131 -0
- package/dist/heart/daemon/agent-config-check.js +490 -0
- package/dist/heart/daemon/agent-discovery.js +79 -3
- package/dist/heart/daemon/agent-service.js +360 -0
- package/dist/heart/daemon/agentic-repair.js +216 -0
- package/dist/heart/daemon/bluebubbles-health-diagnostics.js +122 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +640 -0
- package/dist/heart/daemon/cli-exec.js +7229 -0
- package/dist/heart/daemon/cli-help.js +493 -0
- package/dist/heart/daemon/cli-parse.js +1533 -0
- package/dist/heart/daemon/cli-render-doctor.js +57 -0
- package/dist/heart/daemon/cli-render.js +561 -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 -1616
- package/dist/heart/daemon/daemon-entry.js +345 -3
- package/dist/heart/daemon/daemon-health.js +141 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +190 -12
- package/dist/heart/daemon/daemon-tombstone.js +236 -0
- package/dist/heart/daemon/daemon.js +677 -58
- package/dist/heart/daemon/dns-workflow.js +394 -0
- package/dist/heart/daemon/doctor-types.js +8 -0
- package/dist/heart/daemon/doctor.js +486 -0
- package/dist/heart/daemon/health-monitor.js +92 -1
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
- package/dist/heart/daemon/http-health-probe.js +80 -0
- package/dist/heart/daemon/human-command-screens.js +234 -0
- package/dist/heart/daemon/human-readiness.js +114 -0
- package/dist/heart/daemon/inner-status.js +89 -0
- package/dist/heart/daemon/interactive-repair.js +394 -0
- package/dist/heart/daemon/launchd.js +25 -5
- package/dist/heart/daemon/log-tailer.js +82 -12
- package/dist/heart/daemon/logs-prune.js +110 -0
- package/dist/heart/daemon/message-router.js +2 -2
- package/dist/heart/daemon/os-cron-deps.js +134 -0
- 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 +214 -0
- 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 +73 -0
- package/dist/heart/daemon/runtime-mode.js +67 -0
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +178 -37
- 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 +109 -4
- package/dist/heart/daemon/stale-bundle-prune.js +96 -0
- package/dist/heart/daemon/startup-tui.js +264 -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 +62 -0
- 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 +3 -3
- 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 +201 -66
- 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/mcp/mcp-server.js +653 -0
- package/dist/heart/migrate-config.js +100 -0
- package/dist/heart/model-capabilities.js +59 -0
- package/dist/heart/outlook/outlook-http-hooks.js +66 -0
- package/dist/heart/outlook/outlook-http-response.js +7 -0
- package/dist/heart/outlook/outlook-http-routes.js +244 -0
- package/dist/heart/outlook/outlook-http-static.js +103 -0
- package/dist/heart/outlook/outlook-http-transport.js +116 -0
- package/dist/heart/outlook/outlook-http.js +99 -0
- package/dist/heart/outlook/outlook-read.js +31 -0
- package/dist/heart/outlook/outlook-types.js +27 -0
- package/dist/heart/outlook/outlook-view.js +195 -0
- package/dist/heart/outlook/readers/agent-machine.js +382 -0
- package/dist/heart/outlook/readers/continuity-readers.js +336 -0
- package/dist/heart/outlook/readers/mail.js +362 -0
- package/dist/heart/outlook/readers/runtime-readers.js +644 -0
- package/dist/heart/outlook/readers/sessions.js +232 -0
- package/dist/heart/outlook/readers/shared.js +111 -0
- package/dist/heart/platform.js +81 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-attempt.js +134 -0
- package/dist/heart/provider-binding-resolver.js +255 -0
- package/dist/heart/provider-credentials.js +424 -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 +193 -55
- package/dist/heart/providers/azure.js +104 -13
- package/dist/heart/providers/error-classification.js +63 -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.js +63 -39
- package/dist/heart/runtime-capability-check.js +170 -0
- package/dist/heart/runtime-credentials.js +260 -0
- package/dist/heart/sense-truth.js +11 -4
- package/dist/heart/session-activity.js +190 -0
- package/dist/heart/session-events.js +981 -0
- package/dist/heart/session-transcript.js +167 -0
- package/dist/heart/start-of-turn-packet.js +345 -0
- package/dist/heart/streaming.js +48 -28
- package/dist/heart/sync.js +332 -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/tool-activity-callbacks.js +36 -0
- package/dist/heart/tool-description.js +135 -0
- package/dist/heart/tool-friction.js +55 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +372 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-global-installer.js +1 -1
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/versioning/ouro-path-installer.js +425 -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 +5 -1
- package/dist/heart/{daemon → versioning}/update-hooks.js +63 -59
- package/dist/mailroom/attention.js +167 -0
- package/dist/mailroom/autonomy.js +209 -0
- package/dist/mailroom/blob-store.js +600 -0
- package/dist/mailroom/core.js +658 -0
- package/dist/mailroom/entry.js +160 -0
- package/dist/mailroom/file-store.js +426 -0
- package/dist/mailroom/mbox-import.js +382 -0
- package/dist/mailroom/outbound.js +380 -0
- package/dist/mailroom/policy.js +263 -0
- package/dist/mailroom/reader.js +219 -0
- package/dist/mailroom/search-cache.js +182 -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/travel-extract.js +89 -0
- package/dist/mind/bundle-manifest.js +7 -1
- package/dist/mind/context.js +164 -93
- package/dist/mind/diary-integrity.js +60 -0
- package/dist/mind/{memory.js → diary.js} +74 -93
- 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/group-context.js +144 -0
- package/dist/mind/friends/resolver.js +54 -2
- package/dist/mind/friends/store-file.js +39 -3
- package/dist/mind/friends/trust-explanation.js +74 -0
- 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 +56 -8
- package/dist/mind/prompt-refresh.js +3 -2
- package/dist/mind/prompt.js +973 -168
- 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 +93 -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/runtime.js +5 -1
- package/dist/outlook-ui/assets/index-BPr5vNuM.css +1 -0
- package/dist/outlook-ui/assets/index-Cm51CY9W.js +61 -0
- package/dist/outlook-ui/index.html +15 -0
- 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 +774 -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 +255 -0
- package/dist/repertoire/mcp-manager.js +305 -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 +46 -842
- package/dist/repertoire/tools-bluebubbles.js +1 -0
- package/dist/repertoire/tools-bridge.js +141 -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 +105 -0
- package/dist/repertoire/tools-github.js +1 -7
- package/dist/repertoire/tools-mail.js +1281 -0
- package/dist/repertoire/tools-notes.js +376 -0
- package/dist/repertoire/tools-session.js +749 -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 +280 -0
- package/dist/repertoire/tools-user-profile.js +144 -0
- package/dist/repertoire/tools-vault.js +40 -0
- package/dist/repertoire/tools.js +144 -115
- 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/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 +73 -0
- package/dist/senses/{bluebubbles-inbound-log.js → bluebubbles/inbound-log.js} +20 -3
- package/dist/senses/bluebubbles/index.js +1835 -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 +111 -0
- package/dist/senses/bluebubbles/replay.js +129 -0
- package/dist/senses/{bluebubbles-runtime-state.js → bluebubbles/runtime-state.js} +2 -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 +605 -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 +83 -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 +515 -211
- package/dist/senses/commands.js +66 -3
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +110 -20
- package/dist/senses/inner-dialog.js +408 -21
- package/dist/senses/mail-entry.js +66 -0
- package/dist/senses/mail.js +379 -0
- package/dist/senses/pipeline.js +588 -81
- package/dist/senses/proactive-content-guard.js +51 -0
- package/dist/senses/shared-turn.js +205 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams-entry.js +60 -8
- package/dist/senses/teams.js +412 -163
- 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 +37 -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 -1032
- package/dist/senses/debug-activity.js +0 -127
- package/subagents/README.md +0 -86
- package/subagents/work-doer.md +0 -237
- package/subagents/work-merger.md +0 -618
- package/subagents/work-planner.md +0 -390
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
- /package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +0 -0
|
@@ -1,20 +1,54 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.toAnthropicMessages = toAnthropicMessages;
|
|
40
|
+
exports.classifyAnthropicError = classifyAnthropicError;
|
|
6
41
|
exports.createAnthropicProviderRuntime = createAnthropicProviderRuntime;
|
|
7
42
|
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
8
43
|
const config_1 = require("../config");
|
|
9
44
|
const identity_1 = require("../identity");
|
|
10
45
|
const runtime_1 = require("../../nerves/runtime");
|
|
11
46
|
const streaming_1 = require("../streaming");
|
|
47
|
+
const model_capabilities_1 = require("../model-capabilities");
|
|
48
|
+
const error_classification_1 = require("./error-classification");
|
|
12
49
|
const ANTHROPIC_SETUP_TOKEN_PREFIX = "sk-ant-oat01-";
|
|
13
50
|
const ANTHROPIC_SETUP_TOKEN_MIN_LENGTH = 80;
|
|
14
51
|
const ANTHROPIC_OAUTH_BETA_HEADER = "claude-code-20250219,oauth-2025-04-20,fine-grained-tool-streaming-2025-05-14,interleaved-thinking-2025-05-14";
|
|
15
|
-
function getAnthropicSecretsPathForGuidance() {
|
|
16
|
-
return (0, identity_1.getAgentSecretsPath)();
|
|
17
|
-
}
|
|
18
52
|
function getAnthropicAgentNameForGuidance() {
|
|
19
53
|
return (0, identity_1.getAgentName)();
|
|
20
54
|
}
|
|
@@ -22,10 +56,8 @@ function getAnthropicSetupTokenInstructions() {
|
|
|
22
56
|
const agentName = getAnthropicAgentNameForGuidance();
|
|
23
57
|
return [
|
|
24
58
|
"Fix:",
|
|
25
|
-
` 1. Run \`
|
|
26
|
-
"
|
|
27
|
-
` 2. Open ${getAnthropicSecretsPathForGuidance()}`,
|
|
28
|
-
" 3. Confirm providers.anthropic.setupToken is set",
|
|
59
|
+
` 1. Run \`ouro auth --agent ${agentName} --provider anthropic\``,
|
|
60
|
+
" 2. After reauth, retry the failed ouro command or reconnect this session.",
|
|
29
61
|
].join("\n");
|
|
30
62
|
}
|
|
31
63
|
function getAnthropicReauthGuidance(reason) {
|
|
@@ -35,8 +67,7 @@ function getAnthropicReauthGuidance(reason) {
|
|
|
35
67
|
getAnthropicSetupTokenInstructions(),
|
|
36
68
|
].join("\n");
|
|
37
69
|
}
|
|
38
|
-
function resolveAnthropicSetupTokenCredential() {
|
|
39
|
-
const anthropicConfig = (0, config_1.getAnthropicConfig)();
|
|
70
|
+
function resolveAnthropicSetupTokenCredential(anthropicConfig) {
|
|
40
71
|
const token = anthropicConfig.setupToken?.trim();
|
|
41
72
|
if (!token) {
|
|
42
73
|
throw new Error(getAnthropicReauthGuidance("Anthropic provider is selected but no setup-token credential was found."));
|
|
@@ -93,6 +124,18 @@ function toAnthropicMessages(messages) {
|
|
|
93
124
|
if (msg.role === "assistant") {
|
|
94
125
|
const assistant = msg;
|
|
95
126
|
const blocks = [];
|
|
127
|
+
// Restore thinking blocks before text/tool_use blocks
|
|
128
|
+
const thinkingBlocks = assistant._thinking_blocks;
|
|
129
|
+
if (thinkingBlocks) {
|
|
130
|
+
for (const tb of thinkingBlocks) {
|
|
131
|
+
if (tb.type === "thinking") {
|
|
132
|
+
blocks.push({ type: "thinking", thinking: tb.thinking, signature: tb.signature });
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
blocks.push({ type: "redacted_thinking", data: tb.data });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
96
139
|
const text = toAnthropicTextContent(assistant.content);
|
|
97
140
|
if (text) {
|
|
98
141
|
blocks.push({ type: "text", text });
|
|
@@ -173,53 +216,80 @@ function mergeAnthropicToolArguments(current, partial) {
|
|
|
173
216
|
}
|
|
174
217
|
return current + partial;
|
|
175
218
|
}
|
|
219
|
+
function classifyAnthropicError(error) {
|
|
220
|
+
return (0, error_classification_1.classifyHttpError)(error, {
|
|
221
|
+
isAuthFailure: isAnthropicAuthFailure,
|
|
222
|
+
isServerError: (e) => e.status === 529,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
176
225
|
function isAnthropicAuthFailure(error) {
|
|
177
|
-
if (!(error instanceof Error))
|
|
178
|
-
return false;
|
|
179
|
-
const status = error.status;
|
|
180
|
-
if (status === 401 || status === 403)
|
|
181
|
-
return true;
|
|
182
226
|
const lower = error.message.toLowerCase();
|
|
183
227
|
return (lower.includes("oauth authentication") ||
|
|
184
228
|
lower.includes("authentication failed") ||
|
|
185
229
|
lower.includes("unauthorized") ||
|
|
186
230
|
lower.includes("invalid api key"));
|
|
187
231
|
}
|
|
188
|
-
function withAnthropicAuthGuidance(error) {
|
|
189
|
-
const base = error instanceof Error ? error.message : String(error);
|
|
190
|
-
if (isAnthropicAuthFailure(error)) {
|
|
191
|
-
return new Error(getAnthropicReauthGuidance(`Anthropic authentication failed (${base}).`));
|
|
192
|
-
}
|
|
193
|
-
return error instanceof Error ? error : new Error(String(error));
|
|
194
|
-
}
|
|
195
232
|
async function streamAnthropicMessages(client, model, request) {
|
|
196
233
|
const { system, messages } = toAnthropicMessages(request.messages);
|
|
197
234
|
const anthropicTools = toAnthropicTools(request.activeTools);
|
|
235
|
+
const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
|
|
236
|
+
const maxTokens = modelCaps.maxOutputTokens ?? 16384;
|
|
198
237
|
const params = {
|
|
199
238
|
model,
|
|
200
|
-
max_tokens:
|
|
239
|
+
max_tokens: maxTokens,
|
|
201
240
|
messages,
|
|
202
241
|
stream: true,
|
|
242
|
+
thinking: { type: "adaptive" },
|
|
243
|
+
output_config: { effort: request.reasoningEffort ?? "medium" },
|
|
203
244
|
};
|
|
204
|
-
|
|
205
|
-
|
|
245
|
+
// The Anthropic API requires a Claude Code identification block in the system
|
|
246
|
+
// prompt when using OAuth setup tokens (sk-ant-oat01). Without it, Opus/Sonnet
|
|
247
|
+
// 4.6 requests are rejected with 400. This is the API's validation that the
|
|
248
|
+
// token is being used by a Claude Code client.
|
|
249
|
+
const preambleText = "You are Claude Code, Anthropic's official CLI for Claude.";
|
|
250
|
+
if (request.systemPrompt) {
|
|
251
|
+
// Structured SystemPrompt: merge preamble + stable prefix into one cached block,
|
|
252
|
+
// volatile suffix as a separate uncached block.
|
|
253
|
+
const stableBlock = {
|
|
254
|
+
type: "text",
|
|
255
|
+
text: preambleText + "\n\n" + request.systemPrompt.stable,
|
|
256
|
+
cache_control: { type: "ephemeral" },
|
|
257
|
+
};
|
|
258
|
+
if (request.systemPrompt.volatile) {
|
|
259
|
+
params.system = [stableBlock, { type: "text", text: request.systemPrompt.volatile }];
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
params.system = [stableBlock];
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else if (system) {
|
|
266
|
+
// Fallback: no structured prompt, extract from messages (legacy path)
|
|
267
|
+
params.system = [{ type: "text", text: preambleText }, { type: "text", text: system }];
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
params.system = [{ type: "text", text: preambleText }];
|
|
271
|
+
}
|
|
206
272
|
if (anthropicTools.length > 0)
|
|
207
273
|
params.tools = anthropicTools;
|
|
208
274
|
if (request.toolChoiceRequired && anthropicTools.length > 0) {
|
|
209
|
-
|
|
275
|
+
// Thinking (adaptive or enabled) only supports tool_choice "auto" or "none".
|
|
276
|
+
// "any" forces tool use which is incompatible with extended thinking.
|
|
277
|
+
params.tool_choice = params.thinking ? { type: "auto" } : /* v8 ignore next -- no-thinking path: thinking always set for 4.6 models @preserve */ { type: "any" };
|
|
210
278
|
}
|
|
211
279
|
let response;
|
|
212
280
|
try {
|
|
213
281
|
response = await client.messages.create(params, request.signal ? { signal: request.signal } : {});
|
|
214
282
|
}
|
|
215
283
|
catch (error) {
|
|
216
|
-
throw
|
|
284
|
+
throw error instanceof Error ? error : new Error(String(error));
|
|
217
285
|
}
|
|
218
286
|
let content = "";
|
|
219
287
|
let streamStarted = false;
|
|
220
288
|
let usage;
|
|
221
289
|
const toolCalls = new Map();
|
|
222
|
-
const
|
|
290
|
+
const thinkingBlocks = new Map();
|
|
291
|
+
const redactedBlocks = new Map();
|
|
292
|
+
const answerStreamer = new streaming_1.SettleStreamer(request.callbacks, request.eagerSettleStreaming);
|
|
223
293
|
try {
|
|
224
294
|
for await (const event of response) {
|
|
225
295
|
if (request.signal?.aborted)
|
|
@@ -227,8 +297,14 @@ async function streamAnthropicMessages(client, model, request) {
|
|
|
227
297
|
const eventType = String(event.type ?? "");
|
|
228
298
|
if (eventType === "content_block_start") {
|
|
229
299
|
const block = event.content_block;
|
|
230
|
-
|
|
231
|
-
|
|
300
|
+
const index = Number(event.index);
|
|
301
|
+
if (block?.type === "thinking") {
|
|
302
|
+
thinkingBlocks.set(index, { type: "thinking", thinking: "", signature: "" });
|
|
303
|
+
}
|
|
304
|
+
else if (block?.type === "redacted_thinking") {
|
|
305
|
+
redactedBlocks.set(index, { type: "redacted_thinking", data: String(block.data ?? "") });
|
|
306
|
+
}
|
|
307
|
+
else if (block?.type === "tool_use") {
|
|
232
308
|
const rawInput = block.input;
|
|
233
309
|
const input = rawInput && typeof rawInput === "object"
|
|
234
310
|
? JSON.stringify(rawInput)
|
|
@@ -239,9 +315,9 @@ async function streamAnthropicMessages(client, model, request) {
|
|
|
239
315
|
name,
|
|
240
316
|
arguments: input,
|
|
241
317
|
});
|
|
242
|
-
// Activate eager streaming for sole
|
|
243
|
-
/* v8 ignore next --
|
|
244
|
-
if (name === "
|
|
318
|
+
// Activate eager streaming for sole settle tool call
|
|
319
|
+
/* v8 ignore next -- settle streaming activation, tested via SettleStreamer unit tests @preserve */
|
|
320
|
+
if (name === "settle" && toolCalls.size === 1) {
|
|
245
321
|
answerStreamer.activate();
|
|
246
322
|
}
|
|
247
323
|
}
|
|
@@ -265,7 +341,19 @@ async function streamAnthropicMessages(client, model, request) {
|
|
|
265
341
|
request.callbacks.onModelStreamStart();
|
|
266
342
|
streamStarted = true;
|
|
267
343
|
}
|
|
268
|
-
|
|
344
|
+
const thinkingText = String(delta?.thinking ?? "");
|
|
345
|
+
request.callbacks.onReasoningChunk(thinkingText);
|
|
346
|
+
const thinkingIndex = Number(event.index);
|
|
347
|
+
const thinkingBlock = thinkingBlocks.get(thinkingIndex);
|
|
348
|
+
if (thinkingBlock)
|
|
349
|
+
thinkingBlock.thinking += thinkingText;
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
if (deltaType === "signature_delta") {
|
|
353
|
+
const sigIndex = Number(event.index);
|
|
354
|
+
const sigBlock = thinkingBlocks.get(sigIndex);
|
|
355
|
+
if (sigBlock)
|
|
356
|
+
sigBlock.signature += String(delta?.signature ?? "");
|
|
269
357
|
continue;
|
|
270
358
|
}
|
|
271
359
|
if (deltaType === "input_json_delta") {
|
|
@@ -274,8 +362,8 @@ async function streamAnthropicMessages(client, model, request) {
|
|
|
274
362
|
if (existing) {
|
|
275
363
|
const partialJson = String(delta?.partial_json ?? "");
|
|
276
364
|
existing.arguments = mergeAnthropicToolArguments(existing.arguments, partialJson);
|
|
277
|
-
/* v8 ignore next --
|
|
278
|
-
if (existing.name === "
|
|
365
|
+
/* v8 ignore next -- settle delta streaming, tested via SettleStreamer unit tests @preserve */
|
|
366
|
+
if (existing.name === "settle" && toolCalls.size === 1) {
|
|
279
367
|
answerStreamer.processDelta(partialJson);
|
|
280
368
|
}
|
|
281
369
|
}
|
|
@@ -299,48 +387,98 @@ async function streamAnthropicMessages(client, model, request) {
|
|
|
299
387
|
}
|
|
300
388
|
}
|
|
301
389
|
catch (error) {
|
|
302
|
-
throw
|
|
390
|
+
throw error instanceof Error ? error : /* v8 ignore next -- defensive: stream errors are always Error @preserve */ new Error(String(error));
|
|
303
391
|
}
|
|
392
|
+
// Collect all thinking blocks (regular + redacted) sorted by index to preserve ordering
|
|
393
|
+
const allThinkingIndices = [...thinkingBlocks.keys(), ...redactedBlocks.keys()].sort((a, b) => a - b);
|
|
394
|
+
const outputItems = allThinkingIndices.map((idx) => {
|
|
395
|
+
const tb = thinkingBlocks.get(idx);
|
|
396
|
+
if (tb)
|
|
397
|
+
return tb;
|
|
398
|
+
return redactedBlocks.get(idx);
|
|
399
|
+
});
|
|
304
400
|
return {
|
|
305
401
|
content,
|
|
306
402
|
toolCalls: [...toolCalls.values()],
|
|
307
|
-
outputItems
|
|
403
|
+
outputItems,
|
|
308
404
|
usage,
|
|
309
|
-
|
|
405
|
+
settleStreamed: answerStreamer.streamed,
|
|
310
406
|
};
|
|
311
407
|
}
|
|
312
|
-
function createAnthropicProviderRuntime() {
|
|
408
|
+
function createAnthropicProviderRuntime(model, anthropicConfig = (0, config_1.getAnthropicConfig)()) {
|
|
313
409
|
(0, runtime_1.emitNervesEvent)({
|
|
314
410
|
component: "engine",
|
|
315
411
|
event: "engine.provider_init",
|
|
316
412
|
message: "anthropic provider init",
|
|
317
413
|
meta: { provider: "anthropic" },
|
|
318
414
|
});
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
throw new Error(getAnthropicReauthGuidance("provider 'anthropic' is selected in agent.json but providers.anthropic.model/setupToken is incomplete in secrets.json."));
|
|
415
|
+
if (!anthropicConfig.setupToken) {
|
|
416
|
+
throw new Error(getAnthropicReauthGuidance("provider 'anthropic' is selected but anthropic.setupToken is missing in the agent vault."));
|
|
322
417
|
}
|
|
323
|
-
const
|
|
324
|
-
const
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
418
|
+
const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
|
|
419
|
+
const capabilities = new Set();
|
|
420
|
+
if (modelCaps.reasoningEffort)
|
|
421
|
+
capabilities.add("reasoning-effort");
|
|
422
|
+
const credential = resolveAnthropicSetupTokenCredential(anthropicConfig);
|
|
423
|
+
const refreshToken = anthropicConfig.refreshToken;
|
|
424
|
+
const expiresAt = anthropicConfig.expiresAt;
|
|
425
|
+
function createClient(token) {
|
|
426
|
+
return new sdk_1.default({
|
|
427
|
+
authToken: token,
|
|
428
|
+
maxRetries: 0,
|
|
429
|
+
defaultHeaders: {
|
|
430
|
+
"anthropic-beta": ANTHROPIC_OAUTH_BETA_HEADER,
|
|
431
|
+
"anthropic-dangerous-direct-browser-access": "true",
|
|
432
|
+
"user-agent": "claude-cli/2.1.2 (external, cli)",
|
|
433
|
+
"x-app": "cli",
|
|
434
|
+
},
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
let currentToken = credential.token;
|
|
438
|
+
let client = createClient(currentToken);
|
|
439
|
+
/* v8 ignore start -- token refresh: dynamic import + ensureFreshToken, tested via integration @preserve */
|
|
440
|
+
async function ensureClient() {
|
|
441
|
+
try {
|
|
442
|
+
const { ensureFreshToken } = await Promise.resolve().then(() => __importStar(require("./anthropic-token")));
|
|
443
|
+
const { getAgentName } = await Promise.resolve().then(() => __importStar(require("../identity")));
|
|
444
|
+
const freshToken = await ensureFreshToken(currentToken, refreshToken, expiresAt, getAgentName());
|
|
445
|
+
if (freshToken !== currentToken) {
|
|
446
|
+
currentToken = freshToken;
|
|
447
|
+
client = createClient(freshToken);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
catch {
|
|
451
|
+
// refresh failed — use existing client
|
|
452
|
+
}
|
|
453
|
+
return client;
|
|
454
|
+
}
|
|
455
|
+
/* v8 ignore stop */
|
|
332
456
|
return {
|
|
333
457
|
id: "anthropic",
|
|
334
|
-
model
|
|
335
|
-
client
|
|
458
|
+
model,
|
|
459
|
+
/* v8 ignore next -- getter: returns mutable client ref @preserve */
|
|
460
|
+
get client() { return client; },
|
|
461
|
+
capabilities,
|
|
462
|
+
supportedReasoningEfforts: modelCaps.reasoningEffort,
|
|
336
463
|
resetTurnState(_messages) {
|
|
337
464
|
// Anthropic request payload is derived from canonical messages each turn.
|
|
338
465
|
},
|
|
339
466
|
appendToolOutput(_callId, _output) {
|
|
340
467
|
// Anthropic uses canonical messages for tool_result tracking.
|
|
341
468
|
},
|
|
342
|
-
streamTurn(request) {
|
|
343
|
-
|
|
469
|
+
async streamTurn(request) {
|
|
470
|
+
const freshClient = await ensureClient();
|
|
471
|
+
return streamAnthropicMessages(freshClient, model, request);
|
|
472
|
+
},
|
|
473
|
+
/* v8 ignore start -- ping: tested via provider-ping.test.ts @preserve */
|
|
474
|
+
async ping(signal) {
|
|
475
|
+
const freshClient = await ensureClient();
|
|
476
|
+
await freshClient.messages.create({ model: "claude-haiku-4-5-20251001", max_tokens: 1, messages: [{ role: "user", content: "ping" }] }, { signal, headers: { "anthropic-beta": "claude-code-20250219,oauth-2025-04-20" } });
|
|
477
|
+
},
|
|
478
|
+
/* v8 ignore stop */
|
|
479
|
+
/* v8 ignore next 3 -- delegation: classification logic tested via classifyAnthropicError @preserve */
|
|
480
|
+
classifyError(error) {
|
|
481
|
+
return classifyAnthropicError(error);
|
|
344
482
|
},
|
|
345
483
|
};
|
|
346
484
|
}
|
|
@@ -1,35 +1,117 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.classifyAzureError = classifyAzureError;
|
|
37
|
+
exports.createAzureTokenProvider = createAzureTokenProvider;
|
|
3
38
|
exports.createAzureProviderRuntime = createAzureProviderRuntime;
|
|
4
39
|
const openai_1 = require("openai");
|
|
5
40
|
const config_1 = require("../config");
|
|
6
41
|
const runtime_1 = require("../../nerves/runtime");
|
|
7
42
|
const streaming_1 = require("../streaming");
|
|
8
|
-
|
|
43
|
+
const model_capabilities_1 = require("../model-capabilities");
|
|
44
|
+
const error_classification_1 = require("./error-classification");
|
|
45
|
+
const COGNITIVE_SERVICES_SCOPE = "https://cognitiveservices.azure.com/.default";
|
|
46
|
+
function classifyAzureError(error) {
|
|
47
|
+
return (0, error_classification_1.classifyHttpError)(error);
|
|
48
|
+
}
|
|
49
|
+
// @azure/identity is imported dynamically (below) rather than at the top level
|
|
50
|
+
// because it's a heavy package (~30+ transitive deps) and we only need it when
|
|
51
|
+
// using the managed-identity auth path. API-key users and other providers
|
|
52
|
+
// shouldn't pay the cold-start cost.
|
|
53
|
+
function createAzureTokenProvider(managedIdentityClientId) {
|
|
54
|
+
let credential = null;
|
|
55
|
+
return async () => {
|
|
56
|
+
try {
|
|
57
|
+
if (!credential) {
|
|
58
|
+
const { DefaultAzureCredential } = await Promise.resolve().then(() => __importStar(require("@azure/identity")));
|
|
59
|
+
const credentialOptions = managedIdentityClientId
|
|
60
|
+
? { managedIdentityClientId }
|
|
61
|
+
: undefined;
|
|
62
|
+
credential = new DefaultAzureCredential(credentialOptions);
|
|
63
|
+
}
|
|
64
|
+
const tokenResponse = await credential.getToken(COGNITIVE_SERVICES_SCOPE);
|
|
65
|
+
return tokenResponse.token;
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
69
|
+
throw new Error(`Azure OpenAI authentication failed: ${detail}\n` +
|
|
70
|
+
"To fix this, either:\n" +
|
|
71
|
+
" 1. Run `ouro auth --agent <agent> --provider azure`, or\n" +
|
|
72
|
+
" 2. Run 'az login' to authenticate with your Azure account (for local dev), or\n" +
|
|
73
|
+
" 3. Attach a managed identity to your App Service and store azure.managedIdentityClientId in the agent vault.");
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function createAzureProviderRuntime(model, azureConfig = (0, config_1.getAzureConfig)()) {
|
|
78
|
+
const useApiKey = !!azureConfig.apiKey;
|
|
79
|
+
const authMethod = useApiKey ? "key" : "managed-identity";
|
|
9
80
|
(0, runtime_1.emitNervesEvent)({
|
|
10
81
|
component: "engine",
|
|
11
82
|
event: "engine.provider_init",
|
|
12
83
|
message: "azure provider init",
|
|
13
|
-
meta: { provider: "azure" },
|
|
84
|
+
meta: { provider: "azure", authMethod },
|
|
14
85
|
});
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
throw new Error("provider 'azure' is selected in agent.json but providers.azure is incomplete in secrets.json.");
|
|
86
|
+
if (!(azureConfig.endpoint && azureConfig.deployment)) {
|
|
87
|
+
throw new Error("provider 'azure' is selected but azure endpoint/deployment is incomplete in the agent vault. Run `ouro auth --agent <agent> --provider azure`.");
|
|
18
88
|
}
|
|
19
|
-
const
|
|
20
|
-
|
|
89
|
+
const modelCaps = (0, model_capabilities_1.getModelCapabilities)(model);
|
|
90
|
+
const capabilities = new Set();
|
|
91
|
+
if (modelCaps.reasoningEffort)
|
|
92
|
+
capabilities.add("reasoning-effort");
|
|
93
|
+
const clientOptions = {
|
|
21
94
|
endpoint: azureConfig.endpoint.replace(/\/openai.*$/, ""),
|
|
22
95
|
deployment: azureConfig.deployment,
|
|
23
96
|
apiVersion: azureConfig.apiVersion,
|
|
24
|
-
timeout: 30000,
|
|
25
97
|
maxRetries: 0,
|
|
26
|
-
}
|
|
98
|
+
};
|
|
99
|
+
if (useApiKey) {
|
|
100
|
+
clientOptions.apiKey = azureConfig.apiKey;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const managedIdentityClientId = azureConfig.managedIdentityClientId || undefined;
|
|
104
|
+
clientOptions.azureADTokenProvider = createAzureTokenProvider(managedIdentityClientId);
|
|
105
|
+
}
|
|
106
|
+
const client = new openai_1.AzureOpenAI(clientOptions);
|
|
27
107
|
let nativeInput = null;
|
|
28
108
|
let nativeInstructions = "";
|
|
29
109
|
return {
|
|
30
110
|
id: "azure",
|
|
31
|
-
model
|
|
111
|
+
model,
|
|
32
112
|
client,
|
|
113
|
+
capabilities,
|
|
114
|
+
supportedReasoningEfforts: modelCaps.reasoningEffort,
|
|
33
115
|
resetTurnState(messages) {
|
|
34
116
|
const { instructions, input } = (0, streaming_1.toResponsesInput)(messages);
|
|
35
117
|
nativeInput = input;
|
|
@@ -38,7 +120,7 @@ function createAzureProviderRuntime() {
|
|
|
38
120
|
appendToolOutput(callId, output) {
|
|
39
121
|
if (!nativeInput)
|
|
40
122
|
return;
|
|
41
|
-
nativeInput.push({ type: "function_call_output", call_id: callId, output });
|
|
123
|
+
nativeInput.push({ type: "function_call_output", call_id: callId, output: (0, streaming_1.truncateResponsesFunctionCallOutput)(output) });
|
|
42
124
|
},
|
|
43
125
|
async streamTurn(request) {
|
|
44
126
|
if (!nativeInput)
|
|
@@ -48,7 +130,7 @@ function createAzureProviderRuntime() {
|
|
|
48
130
|
input: nativeInput,
|
|
49
131
|
instructions: nativeInstructions,
|
|
50
132
|
tools: (0, streaming_1.toResponsesTools)(request.activeTools),
|
|
51
|
-
reasoning: { effort: "medium", summary: "detailed" },
|
|
133
|
+
reasoning: { effort: request.reasoningEffort ?? "medium", summary: "detailed" },
|
|
52
134
|
stream: true,
|
|
53
135
|
store: false,
|
|
54
136
|
include: ["reasoning.encrypted_content"],
|
|
@@ -57,10 +139,19 @@ function createAzureProviderRuntime() {
|
|
|
57
139
|
params.metadata = { trace_id: request.traceId };
|
|
58
140
|
if (request.toolChoiceRequired)
|
|
59
141
|
params.tool_choice = "required";
|
|
60
|
-
const result = await (0, streaming_1.streamResponsesApi)(this.client, params, request.callbacks, request.signal);
|
|
142
|
+
const result = await (0, streaming_1.streamResponsesApi)(this.client, params, request.callbacks, request.signal, request.eagerSettleStreaming);
|
|
61
143
|
for (const item of result.outputItems)
|
|
62
144
|
nativeInput.push(item);
|
|
63
145
|
return result;
|
|
64
146
|
},
|
|
147
|
+
/* v8 ignore start -- ping: tested via provider-ping.test.ts @preserve */
|
|
148
|
+
async ping(signal) {
|
|
149
|
+
await this.client.responses.create({ model: this.model, input: "ping", max_output_tokens: 16 }, { signal });
|
|
150
|
+
},
|
|
151
|
+
/* v8 ignore stop */
|
|
152
|
+
/* v8 ignore next 3 -- delegation: classification logic tested via classifyAzureError @preserve */
|
|
153
|
+
classifyError(error) {
|
|
154
|
+
return classifyAzureError(error);
|
|
155
|
+
},
|
|
65
156
|
};
|
|
66
157
|
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isNetworkError = isNetworkError;
|
|
4
|
+
exports.classifyHttpError = classifyHttpError;
|
|
5
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
6
|
+
// Node socket / DNS error codes that indicate a transient network failure.
|
|
7
|
+
const NETWORK_ERROR_CODES = new Set([
|
|
8
|
+
"ECONNRESET",
|
|
9
|
+
"ECONNREFUSED",
|
|
10
|
+
"ENOTFOUND",
|
|
11
|
+
"ETIMEDOUT",
|
|
12
|
+
"EPIPE",
|
|
13
|
+
"EAI_AGAIN",
|
|
14
|
+
"EHOSTUNREACH",
|
|
15
|
+
"ENETUNREACH",
|
|
16
|
+
"ECONNABORTED",
|
|
17
|
+
]);
|
|
18
|
+
// Substrings the OpenAI/Anthropic SDKs use when wrapping fetch/socket failures
|
|
19
|
+
// into Error.message instead of an err.code.
|
|
20
|
+
const NETWORK_ERROR_MESSAGE_PATTERNS = [
|
|
21
|
+
"fetch failed",
|
|
22
|
+
"socket hang up",
|
|
23
|
+
"getaddrinfo",
|
|
24
|
+
"request timed out", // OpenAI SDK timeout — see SDK source
|
|
25
|
+
"request timeout",
|
|
26
|
+
"connection error",
|
|
27
|
+
];
|
|
28
|
+
// True if the error looks like a transient network issue (no HTTP status, just
|
|
29
|
+
// a socket/DNS/timeout failure from the underlying transport).
|
|
30
|
+
function isNetworkError(error) {
|
|
31
|
+
const code = error.code || "";
|
|
32
|
+
if (NETWORK_ERROR_CODES.has(code))
|
|
33
|
+
return true;
|
|
34
|
+
const msg = (error.message || "").toLowerCase();
|
|
35
|
+
return NETWORK_ERROR_MESSAGE_PATTERNS.some((pat) => msg.includes(pat));
|
|
36
|
+
}
|
|
37
|
+
// Standard HTTP error → ProviderErrorClassification mapping. Providers wrap
|
|
38
|
+
// this with their own overrides.
|
|
39
|
+
function classifyHttpError(error, overrides) {
|
|
40
|
+
const status = error.status;
|
|
41
|
+
if (overrides?.isAuthFailure?.(error) || status === 401 || status === 403) {
|
|
42
|
+
return "auth-failure";
|
|
43
|
+
}
|
|
44
|
+
if (status === 429) {
|
|
45
|
+
if (overrides?.isUsageLimit?.(error))
|
|
46
|
+
return "usage-limit";
|
|
47
|
+
return "rate-limit";
|
|
48
|
+
}
|
|
49
|
+
if (overrides?.isServerError?.(error) || (status !== undefined && status >= 500)) {
|
|
50
|
+
return "server-error";
|
|
51
|
+
}
|
|
52
|
+
if (isNetworkError(error))
|
|
53
|
+
return "network-error";
|
|
54
|
+
return "unknown";
|
|
55
|
+
}
|
|
56
|
+
/* v8 ignore start — module-level observability event */
|
|
57
|
+
(0, runtime_1.emitNervesEvent)({
|
|
58
|
+
component: "engine",
|
|
59
|
+
event: "engine.error_classification_loaded",
|
|
60
|
+
message: "shared provider error classification loaded",
|
|
61
|
+
meta: {},
|
|
62
|
+
});
|
|
63
|
+
/* v8 ignore stop */
|