@desplega.ai/agent-swarm 2.5.4 → 2.6.0
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 +2 -2
- package/dist/{acp-adapter-ek38cwsv.js → acp-adapter-dgfakfpw.js} +9 -9
- package/dist/{actions-92mepq03.js → actions-fbqma8aa.js} +21 -21
- package/dist/{amp-adapter-9gaxg015.js → amp-adapter-en0jy6hs.js} +4 -4
- package/dist/{app-ctn8gsgx.js → app-k8a5cgpp.js} +3 -3
- package/dist/{assistant-zyr5kz47.js → assistant-a16433gr.js} +29 -25
- package/dist/{boot-reembed-dwzfttdr.js → boot-reembed-6c1sjfnr.js} +1 -1
- package/dist/{boot-reembed-w75maga2.js → boot-reembed-f4nn561n.js} +1 -1
- package/dist/{boot-scrub-sweep-e9kq43kf.js → boot-scrub-sweep-d4w9gajf.js} +4 -4
- package/dist/{boot-seeds-x28v3fhb.js → boot-seeds-9bmkspyw.js} +4 -4
- package/dist/{claude-adapter-f0afqnne.js → claude-adapter-nys1kjxa.js} +9 -9
- package/dist/{claude-managed-adapter-x81a7r65.js → claude-managed-adapter-55207973.js} +2 -2
- package/dist/{claude-managed-setup-bqzwjd9x.js → claude-managed-setup-3cm35gey.js} +10 -3
- package/dist/{claude-sdk-session-7b7whkaq.js → claude-sdk-session-nw5yd8cp.js} +11 -11
- package/dist/{cli-c61mbdds.js → cli-03gg9pd1.js} +4 -4
- package/dist/{cli-kxpfx2xr.js → cli-0z1xjzwa.js} +2 -2
- package/dist/cli-1tem6ns9.js +894 -0
- package/dist/{cli-jbnn4vxb.js → cli-24j1jeeb.js} +3 -3
- package/dist/{cli-pzatvw94.js → cli-2sjhpsns.js} +2 -2
- package/dist/{cli-dew6x255.js → cli-39aet655.js} +2 -2
- package/dist/{cli-g1cw7xtt.js → cli-39rrw8yp.js} +1 -1
- package/dist/{cli-x0f2v69c.js → cli-3aqd4jaa.js} +12 -7
- package/dist/{cli-gbfxp48k.js → cli-3fwqy71j.js} +15 -15
- package/dist/{cli-7p4jxgtt.js → cli-3gfvmzht.js} +6 -6
- package/dist/{cli-03vpq45j.js → cli-3ndmpxxv.js} +2 -2
- package/dist/{cli-asq5ydm4.js → cli-4hxrf0p4.js} +131 -50
- package/dist/{cli-mz9afxxf.js → cli-4rf0f5vg.js} +15 -3
- package/dist/{cli-k4tjsdx9.js → cli-5rj83bam.js} +272 -195
- package/dist/{cli-sbwsxvtd.js → cli-5sckpqcx.js} +2 -2
- package/dist/{cli-cz5nmdxt.js → cli-683y0b3a.js} +2 -2
- package/dist/{cli-ethgy7ha.js → cli-6y51ryva.js} +2 -2
- package/dist/{cli-n4c8e3s5.js → cli-708wdy32.js} +1 -1
- package/dist/{cli-pasyvjmm.js → cli-737pyqxr.js} +1 -1
- package/dist/{cli-gx4rm0qx.js → cli-7enjwya9.js} +1 -1
- package/dist/{cli-6x9ma5w5.js → cli-803188pb.js} +1 -1
- package/dist/{cli-hh5we352.js → cli-9abdgn5t.js} +7 -7
- package/dist/{cli-ff1tm9n9.js → cli-a2rr0fmg.js} +1 -1
- package/dist/{cli-c952c7ac.js → cli-a34pr3w1.js} +2 -2
- package/dist/{cli-s682zgqz.js → cli-abkm71vr.js} +1 -1
- package/dist/{cli-mmhj8vd7.js → cli-ag2yrnt5.js} +11 -2
- package/dist/{cli-bvpgr9ny.js → cli-aj8djyqt.js} +5 -5
- package/dist/{cli-gwhjmh8g.js → cli-art7c1zh.js} +5 -5
- package/dist/{cli-5bnsc0e1.js → cli-az25fn5f.js} +4 -4
- package/dist/{cli-9s05422w.js → cli-bqztfyve.js} +1 -1
- package/dist/{cli-bn0rewsy.js → cli-c081bj3b.js} +2 -2
- package/dist/{cli-1r5ad7j5.js → cli-c2habvsf.js} +12 -12
- package/dist/{cli-64mh9mf3.js → cli-ca6banwz.js} +69 -17
- package/dist/{cli-25n3mv5d.js → cli-cz37jqss.js} +5 -5
- package/dist/{cli-6n8axjv1.js → cli-d2dpf95n.js} +2 -2
- package/dist/{cli-gn5af0x5.js → cli-emhjcj2y.js} +11 -11
- package/dist/{cli-6a1xg1p7.js → cli-esakngh8.js} +2 -2
- package/dist/{cli-ha9rmwgq.js → cli-fb8m699c.js} +2 -2
- package/dist/{cli-4b2z6n0m.js → cli-ffvsj2qw.js} +17 -8
- package/dist/{cli-abs8ndtr.js → cli-g20jjwt4.js} +26 -26
- package/dist/{cli-jb30dzvk.js → cli-g8ka5j4j.js} +446 -164
- package/dist/{cli-19202kew.js → cli-gf95q3bm.js} +5 -5
- package/dist/{cli-eftzyh9y.js → cli-gnsb1zxa.js} +2 -2
- package/dist/{cli-nwyw3zhg.js → cli-gxee0bqa.js} +1 -1
- package/dist/{cli-e42vss7b.js → cli-hfeb68z4.js} +5 -5
- package/dist/{cli-g9vd9ece.js → cli-k21gx5ht.js} +14 -16
- package/dist/{cli-tsma7p8v.js → cli-kf4jree9.js} +2 -2
- package/dist/{cli-dabehxhp.js → cli-kt907da6.js} +1 -1
- package/dist/{cli-wx2nj19m.js → cli-m5a9m0ak.js} +6 -6
- package/dist/{cli-621ce7kw.js → cli-m70bajzr.js} +3 -3
- package/dist/{cli-9j129brq.js → cli-mtnj4fwa.js} +6 -6
- package/dist/{cli-xzfq4at3.js → cli-mvjz5an3.js} +15 -11
- package/dist/{cli-277c31dw.js → cli-n7asmce6.js} +225 -3
- package/dist/{cli-xtrz6bzs.js → cli-nn6vx2mq.js} +1 -1
- package/dist/{cli-2655k16q.js → cli-nq677csy.js} +1 -1
- package/dist/{cli-0shx9j93.js → cli-pfk92eqz.js} +2 -2
- package/dist/{cli-wghjkr0e.js → cli-sqma6vw1.js} +10 -7
- package/dist/{cli-nzfnt2gs.js → cli-tf1n0r0b.js} +1 -1
- package/dist/{cli-qqzmjxkf.js → cli-v49fkghp.js} +11 -6
- package/dist/{cli-x77gen2p.js → cli-w2656ka1.js} +7 -7
- package/dist/{cli-5kqnemen.js → cli-yvy48785.js} +1 -1
- package/dist/{cli-m4ecdxvz.js → cli-zqne1qcj.js} +7 -7
- package/dist/cli.js +17 -17
- package/dist/{codex-adapter-wch12q99.js → codex-adapter-d95q4qsn.js} +7 -7
- package/dist/{codex-login-rn7c5gxt.js → codex-login-8cg0vhf2.js} +1 -1
- package/dist/{codex-session-runner-41pfcr95.js → codex-session-runner-gdwd8h0c.js} +8 -8
- package/dist/{commands-9849dkj6.js → commands-jqmgk54b.js} +2 -2
- package/dist/{controller-ja0sd95p.js → controller-z3jq589f.js} +4 -4
- package/dist/{controllers-connect-xp05dj6x.js → controllers-connect-r2za39ef.js} +23 -23
- package/dist/{cursor-adapter-623qxqew.js → cursor-adapter-4mr4jgkw.js} +2 -2
- package/dist/{db-47vj40dy.js → db-ppv2tze7.js} +3 -3
- package/dist/{db-w759qmx0.js → db-w36wwb5g.js} +4 -2
- package/dist/{devin-adapter-4ycy4vrf.js → devin-adapter-byen2cxt.js} +1 -1
- package/dist/{dispatcher-7b8e4z2j.js → dispatcher-pv5h77vf.js} +20 -20
- package/dist/{docker-s84hjs91.js → docker-fdzyewpz.js} +2 -2
- package/dist/{dsh-adapter-2ezw3xea.js → dsh-adapter-d4pdpb3r.js} +2 -2
- package/dist/{e2b-9gkdhm3c.js → e2b-222hsajc.js} +2 -2
- package/dist/{e2b-cjtf8k1z.js → e2b-fn3zacvt.js} +2 -2
- package/dist/{easter-egg-3d-e4qv8dxj.js → easter-egg-3d-4sp4dvmc.js} +1 -1
- package/dist/{event-bus-3z78ep5n.js → event-bus-pghg8hqy.js} +1 -1
- package/dist/{execute-0xpz8950.js → execute-jev839y1.js} +1 -1
- package/dist/{external-channel-e2s028da.js → external-channel-y6nkzhnn.js} +2 -2
- package/dist/{grok-adapter-ys7gaqee.js → grok-adapter-t08b9ntm.js} +10 -10
- package/dist/handlers-eqsnmv95.js +41 -0
- package/dist/{heartbeat-w3mntghj.js → heartbeat-vn31xwdk.js} +23 -23
- package/dist/{hook-g7kvv6x9.js → hook-6d0zbvvt.js} +6 -6
- package/dist/{hook-3jjywnpb.js → hook-cpjs8q51.js} +8 -8
- package/dist/{http-tkp7d4kb.js → http-9c6medda.js} +856 -99
- package/dist/{index-xdaahthb.js → index-38t35h0n.js} +20 -20
- package/dist/{index-3n8m9ea2.js → index-g6k9tctj.js} +1 -1
- package/dist/{index-1ef1myq2.js → index-k0yt1tvq.js} +20 -20
- package/dist/{index-31ceyf42.js → index-pkma1yf8.js} +1 -1
- package/dist/{index-q7m26kvs.js → index-qhjf2htm.js} +13 -10
- package/dist/index-yqgbfgaj.js +43 -0
- package/dist/{keepalive-v4ta8wgg.js → keepalive-em0117bp.js} +4 -4
- package/dist/lead-23e7z59t.js +79 -0
- package/dist/{maintenance-84n1ex21.js → maintenance-kbme3qy9.js} +1 -1
- package/dist/{oauth-refresh-sweep-vjnnandw.js → oauth-refresh-sweep-xysj4yse.js} +3 -3
- package/dist/{onboard-sfmpe4np.js → onboard-p6q0vz97.js} +3 -3
- package/dist/{opencode-adapter-jmpst4q4.js → opencode-adapter-esv3k9yn.js} +7 -7
- package/dist/{otel-impl-v6cc0zve.js → otel-impl-54qhqh1z.js} +2 -2
- package/dist/{pi-mono-adapter-fk8fkcf6.js → pi-mono-adapter-mymbwhj0.js} +10 -10
- package/dist/{pricing-refresh-fsk1e1zc.js → pricing-refresh-yb75wv33.js} +3 -3
- package/dist/{rbac-roles-prmkdnkw.js → rbac-roles-1vp2mw4p.js} +2 -2
- package/dist/{rbac-roles-zxmxqa39.js → rbac-roles-dexhc9x8.js} +1 -1
- package/dist/render-v2-tjay5hhf.js +16 -0
- package/dist/{resume-frdtgfa0.js → resume-8ayf37g5.js} +9 -9
- package/dist/{runtime-bt5pkpm1.js → runtime-hqe5cqcd.js} +1 -1
- package/dist/{session-access-fpez4y5q.js → session-access-fdhp987s.js} +4 -4
- package/dist/session-source-backfill-qgtc86z1.js +110 -0
- package/dist/{setup-mq6m3m8q.js → setup-4rrmqcq3.js} +1 -1
- package/dist/{virtual-modules-mnfbh5mr.js → virtual-modules-52km00d6.js} +2 -2
- package/dist/{work-objects-kfahhjsq.js → work-objects-p28fgd70.js} +23 -23
- package/dist/worker-e3w7vye1.js +79 -0
- package/dist/{x-pbpezr0s.js → x-wxrzvzx8.js} +2 -2
- package/openapi.json +1274 -32
- package/package.json +1 -1
- package/src/assets/source-key.ts +95 -0
- package/src/be/db/api-keys.ts +80 -0
- package/src/be/db/session-labels.ts +28 -0
- package/src/be/db/session-moves.ts +5 -6
- package/src/be/db/session-tree.ts +153 -14
- package/src/be/db/tasks/read.ts +11 -0
- package/src/be/db/tasks/write.ts +6 -1
- package/src/be/db/workflow-runs.ts +183 -1
- package/src/be/db-retention.ts +61 -6
- package/src/be/db.ts +59 -114
- package/src/be/memory/providers/openai-embedding.ts +5 -1
- package/src/be/migrations/244_api_key_validation.sql +4 -0
- package/src/be/onboarding.ts +4 -0
- package/src/be/scripts/typecheck.ts +1 -1
- package/src/be/session-source-backfill.ts +163 -0
- package/src/be/swarm-config-guard.ts +1 -0
- package/src/comb/review-batch.ts +28 -1
- package/src/comb/templates.ts +7 -2
- package/src/commands/claude-managed-setup.ts +7 -1
- package/src/commands/credential-refresh.ts +76 -1
- package/src/commands/credential-wait.ts +2 -2
- package/src/commands/provider-credentials.ts +210 -170
- package/src/commands/runner.ts +25 -4
- package/src/extensions/apply-task-create.ts +8 -1
- package/src/extensions/contract-types.generated.ts +1 -1
- package/src/extensions/contract.ts +5 -0
- package/src/http/all-routes.ts +2 -0
- package/src/http/api-keys.ts +53 -0
- package/src/http/assets.ts +15 -0
- package/src/http/codex-oauth-accounts.ts +191 -0
- package/src/http/comb.ts +15 -2
- package/src/http/config.ts +1 -1
- package/src/http/core.ts +6 -0
- package/src/http/fleet-benchmark.ts +5 -2
- package/src/http/index.ts +11 -0
- package/src/http/integrations.ts +5 -1
- package/src/http/kv.ts +8 -3
- package/src/http/onboarding.ts +6 -1
- package/src/http/pool-keys.ts +354 -0
- package/src/http/sessions.ts +37 -12
- package/src/http/stats.ts +1 -0
- package/src/http/status.ts +26 -12
- package/src/http/tasks.ts +3 -0
- package/src/http/used-by.ts +7 -2
- package/src/http/workflows.ts +78 -9
- package/src/integrations/chat-sdk/inbound.ts +27 -0
- package/src/kv-reserved-namespaces.ts +19 -0
- package/src/providers/acp-targets.ts +1 -1
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/claude-adapter.ts +5 -1
- package/src/providers/claude-managed-adapter.ts +16 -9
- package/src/providers/codex-adapter.ts +71 -11
- package/src/scheduler/scheduler.ts +3 -2
- package/src/scripts-runtime/swarm-sdk.ts +7 -1
- package/src/scripts-runtime/types/stdlib.d.ts +1 -1
- package/src/scripts-runtime/types/swarm-extension.d.ts +17 -8
- package/src/scripts-runtime/types/swarm-sdk.d.ts +1 -1
- package/src/slack/assistant.ts +7 -0
- package/src/slack/channel-labels.ts +74 -0
- package/src/slack/handlers.ts +8 -0
- package/src/slack/inbound-files.ts +5 -2
- package/src/slack/thread-buffer.ts +4 -0
- package/src/tasks/sibling-awareness.ts +12 -3
- package/src/telemetry-context.ts +5 -6
- package/src/telemetry-identity.ts +3 -3
- package/src/tests/api-keys-validation.test.ts +170 -0
- package/src/tests/claude-managed-adapter.test.ts +46 -0
- package/src/tests/claude-routes-e2e.test.ts +7 -2
- package/src/tests/codex-credential-pools.test.ts +120 -0
- package/src/tests/codex-gateway-route.test.ts +165 -0
- package/src/tests/codex-oauth-accounts.test.ts +357 -0
- package/src/tests/comb-review-batch.test.ts +63 -2
- package/src/tests/config-pool-keys.test.ts +533 -0
- package/src/tests/credential-check.test.ts +290 -2
- package/src/tests/credential-refresh.test.ts +172 -1
- package/src/tests/db-retention.test.ts +9 -3
- package/src/tests/db-task-read-contract.test.ts +1 -0
- package/src/tests/db-task-write-contract.test.ts +1 -3
- package/src/tests/docs-index-footprint.test.js +3 -3
- package/src/tests/extensions-pre-task.test.ts +53 -1
- package/src/tests/fixtures/extensions/record-task-create/hooks.ts +9 -0
- package/src/tests/fixtures/extensions/record-task-create/manifest.json +7 -0
- package/src/tests/fleet-benchmark.test.ts +8 -0
- package/src/tests/get-workflow-run-tool.test.ts +98 -0
- package/src/tests/integrations-http.test.ts +32 -2
- package/src/tests/internal-ai/complete-structured.test.ts +37 -1
- package/src/tests/internal-ai/credentials.test.ts +23 -0
- package/src/tests/kv-http.test.ts +32 -0
- package/src/tests/kv-tool.test.ts +25 -0
- package/src/tests/multi-runtime-registration.test.ts +12 -12
- package/src/tests/onboarding.test.ts +108 -1
- package/src/tests/openai-embedding-credentials.test.ts +35 -0
- package/src/tests/openrouter-attribution-call-sites.test.ts +2 -2
- package/src/tests/org-website.test.ts +36 -0
- package/src/tests/provider-key-probes.test.ts +181 -0
- package/src/tests/rbac-e2e-helpers.test.ts +88 -1
- package/src/tests/rbac-e2e-helpers.ts +36 -11
- package/src/tests/script-connections.test.ts +2 -0
- package/src/tests/script-runs-retention.test.ts +212 -0
- package/src/tests/sdk-allowlist.test.ts +39 -0
- package/src/tests/session-source-backfill.test.ts +429 -0
- package/src/tests/session-source-keys.test.ts +236 -0
- package/src/tests/session-source-labels.test.ts +419 -0
- package/src/tests/sessions-detail-batch.test.ts +2 -0
- package/src/tests/sessions-move.test.ts +131 -0
- package/src/tests/sessions-tree.test.ts +299 -2
- package/src/tests/slack-inbound-files.test.ts +103 -23
- package/src/tests/status.test.ts +101 -18
- package/src/tests/tasks-workflow-run-filter.test.ts +146 -0
- package/src/tests/test-net.ts +31 -0
- package/src/tests/transcription.test.ts +8 -0
- package/src/tests/used-by-route.test.ts +11 -0
- package/src/tests/workflow-cascade-cancel.test.ts +172 -0
- package/src/tests/workflow-http-v2.test.ts +131 -0
- package/src/tests/workflow-step-order.test.ts +92 -0
- package/src/tests/workflow-sub-workflow.test.ts +30 -0
- package/src/tools/get-tasks.ts +8 -0
- package/src/tools/kv/kv-read-auth.ts +4 -2
- package/src/tools/task-action.ts +1 -1
- package/src/tools/workflows/get-workflow-run.ts +14 -4
- package/src/types.ts +24 -0
- package/src/utils/company-profile.ts +51 -1
- package/src/utils/credentials.ts +5 -2
- package/src/utils/internal-ai/complete-structured.ts +5 -0
- package/src/utils/internal-ai/credentials.ts +4 -3
- package/src/utils/provider-key-probes.ts +328 -0
- package/src/utils/transcription.ts +4 -1
- package/src/workflows/executors/sub-workflow.ts +8 -1
- package/templates/ai-toolbox.manifest.json +2 -2
- package/templates/skills/researching/content.md +2 -0
- package/templates/skills/swarm-scripts/SKILL.md +1 -0
- package/templates/skills/swarm-scripts/content.md +1 -0
- package/dist/cli-7421jzsw.js +0 -84
- package/dist/cli-e45e4m6b.js +0 -413
- package/dist/cli-zw88zjba.js +0 -307
- package/dist/handlers-wy1dr6ja.js +0 -41
- package/dist/index-nmm79qgr.js +0 -43
- package/dist/lead-sawnyqxk.js +0 -79
- package/dist/render-v2-pjwxvnkw.js +0 -12
- package/dist/worker-v5e5rxj3.js +0 -79
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
authJsonToCredentialSelection,
|
|
6
6
|
credentialsToAuthJson,
|
|
7
7
|
loadAllCodexOAuthSlots
|
|
8
|
-
} from "./cli-
|
|
8
|
+
} from "./cli-0z1xjzwa.js";
|
|
9
9
|
import {
|
|
10
10
|
effectiveReasoningEffort
|
|
11
|
-
} from "./cli-
|
|
11
|
+
} from "./cli-c081bj3b.js";
|
|
12
12
|
import {
|
|
13
13
|
isSkillLoaderCall,
|
|
14
14
|
skillFromToolArgs,
|
|
@@ -19,8 +19,15 @@ import {
|
|
|
19
19
|
orgIdentityStatus,
|
|
20
20
|
renderMemoriesPrompt,
|
|
21
21
|
isUnknownModelError,
|
|
22
|
+
timedFetch,
|
|
23
|
+
checkAnthropicApiKey,
|
|
24
|
+
checkOpenAiApiKey,
|
|
25
|
+
checkXaiApiKey,
|
|
26
|
+
checkOpenRouter,
|
|
27
|
+
checkDeepSeekApiKey,
|
|
28
|
+
checkOpenAICompatibleProvider,
|
|
22
29
|
writeSkillsToFilesystem
|
|
23
|
-
} from "./cli-
|
|
30
|
+
} from "./cli-n7asmce6.js";
|
|
24
31
|
import {
|
|
25
32
|
isPollTracingEnabled,
|
|
26
33
|
initOtel,
|
|
@@ -30,7 +37,7 @@ import {
|
|
|
30
37
|
injectTraceContext2,
|
|
31
38
|
initialize,
|
|
32
39
|
ensure
|
|
33
|
-
} from "./cli-
|
|
40
|
+
} from "./cli-g20jjwt4.js";
|
|
34
41
|
import {
|
|
35
42
|
MAX_RATE_LIMIT_RESET_MS,
|
|
36
43
|
isRateLimitMessage,
|
|
@@ -38,7 +45,7 @@ import {
|
|
|
38
45
|
CODEX_CREDITS_EXHAUSTED_COOLDOWN_MS,
|
|
39
46
|
resolveCodexCreditsExhaustedCooldownMs,
|
|
40
47
|
parseRateLimitResetTime
|
|
41
|
-
} from "./cli-
|
|
48
|
+
} from "./cli-7enjwya9.js";
|
|
42
49
|
import {
|
|
43
50
|
terminateRegisteredProcessGroups
|
|
44
51
|
} from "./cli-3ggwdtb0.js";
|
|
@@ -48,44 +55,44 @@ import {
|
|
|
48
55
|
canonicalAzureDevOpsRepoUrl,
|
|
49
56
|
parseAzureDevOpsRepoUrl,
|
|
50
57
|
resolveScriptsOnlyMode
|
|
51
|
-
} from "./cli-
|
|
58
|
+
} from "./cli-4hxrf0p4.js";
|
|
52
59
|
import {
|
|
53
60
|
ACP_TARGET_IDS,
|
|
54
61
|
isAcpTarget
|
|
55
|
-
} from "./cli-
|
|
62
|
+
} from "./cli-yvy48785.js";
|
|
56
63
|
import {
|
|
57
64
|
checkAmpCredentials2,
|
|
58
65
|
liveTestAmpCredentials2
|
|
59
|
-
} from "./cli-
|
|
66
|
+
} from "./cli-m5a9m0ak.js";
|
|
60
67
|
import {
|
|
61
68
|
checkClaudeCredentials2
|
|
62
|
-
} from "./cli-
|
|
69
|
+
} from "./cli-k21gx5ht.js";
|
|
63
70
|
import {
|
|
64
71
|
checkClaudeManagedCredentials2
|
|
65
|
-
} from "./cli-
|
|
72
|
+
} from "./cli-ffvsj2qw.js";
|
|
66
73
|
import {
|
|
67
74
|
codexUserHome,
|
|
68
75
|
checkCodexCredentials2
|
|
69
|
-
} from "./cli-
|
|
76
|
+
} from "./cli-ca6banwz.js";
|
|
70
77
|
import {
|
|
71
78
|
checkCursorCredentials2
|
|
72
|
-
} from "./cli-
|
|
79
|
+
} from "./cli-cz37jqss.js";
|
|
73
80
|
import {
|
|
74
81
|
checkDevinCredentials2
|
|
75
|
-
} from "./cli-
|
|
82
|
+
} from "./cli-39rrw8yp.js";
|
|
76
83
|
import {
|
|
77
84
|
checkDshCredentials2
|
|
78
|
-
} from "./cli-
|
|
85
|
+
} from "./cli-az25fn5f.js";
|
|
79
86
|
import {
|
|
80
87
|
checkOpencodeCredentials2
|
|
81
|
-
} from "./cli-
|
|
88
|
+
} from "./cli-9abdgn5t.js";
|
|
82
89
|
import {
|
|
83
90
|
checkGrokCredentials2
|
|
84
|
-
} from "./cli-
|
|
91
|
+
} from "./cli-m70bajzr.js";
|
|
85
92
|
import {
|
|
86
93
|
getContextWindowSize,
|
|
87
94
|
init_context_window
|
|
88
|
-
} from "./cli-
|
|
95
|
+
} from "./cli-pfk92eqz.js";
|
|
89
96
|
import {
|
|
90
97
|
CODEX_OAUTH_POOL_SLOTS_ENV,
|
|
91
98
|
isCodexOAuthConfigKey,
|
|
@@ -94,7 +101,7 @@ import {
|
|
|
94
101
|
} from "./cli-j4bwnpkm.js";
|
|
95
102
|
import {
|
|
96
103
|
validateJsonSchema
|
|
97
|
-
} from "./cli-
|
|
104
|
+
} from "./cli-3fwqy71j.js";
|
|
98
105
|
import {
|
|
99
106
|
mapTriggerSurface,
|
|
100
107
|
init_telemetry_context,
|
|
@@ -112,7 +119,7 @@ import {
|
|
|
112
119
|
init_vcs_repo_match,
|
|
113
120
|
isApiDrainingResponse,
|
|
114
121
|
init_api_drain
|
|
115
|
-
} from "./cli-
|
|
122
|
+
} from "./cli-g8ka5j4j.js";
|
|
116
123
|
import {
|
|
117
124
|
parseWorkerModelTierOverrides,
|
|
118
125
|
resolveTaskModelSelection,
|
|
@@ -120,7 +127,7 @@ import {
|
|
|
120
127
|
ProviderNameSchema,
|
|
121
128
|
WorkerNudgeSchema,
|
|
122
129
|
init_types
|
|
123
|
-
} from "./cli-
|
|
130
|
+
} from "./cli-4rf0f5vg.js";
|
|
124
131
|
import {
|
|
125
132
|
generateDefaultClaudeMd2,
|
|
126
133
|
generateDefaultSoulMd2,
|
|
@@ -144,38 +151,31 @@ import {
|
|
|
144
151
|
resolveClaudeMdPath,
|
|
145
152
|
syncProfileFilesToServer,
|
|
146
153
|
init_profile_sync
|
|
147
|
-
} from "./cli-
|
|
154
|
+
} from "./cli-hfeb68z4.js";
|
|
148
155
|
import {
|
|
149
156
|
isSteeringEnabled2,
|
|
150
157
|
init_steering_enabled
|
|
151
158
|
} from "./cli-4sydckyj.js";
|
|
152
|
-
import {
|
|
153
|
-
normalizeProviderKeyAliases,
|
|
154
|
-
ModelWindowExhaustedError,
|
|
155
|
-
CLAUDE_CREDENTIALS_HINT,
|
|
156
|
-
resolveCredentialPools,
|
|
157
|
-
init_credentials
|
|
158
|
-
} from "./cli-zw88zjba.js";
|
|
159
159
|
import {
|
|
160
160
|
init_templates3
|
|
161
161
|
} from "./cli-j6rktc91.js";
|
|
162
162
|
import {
|
|
163
|
+
validateRoute,
|
|
164
|
+
deriveDefaultRoute,
|
|
165
|
+
init_src,
|
|
163
166
|
modelFamilyOf,
|
|
164
167
|
windowForModelFamily,
|
|
165
168
|
parseModelLimitMessage,
|
|
166
169
|
parseCreditsRequiredMessage,
|
|
167
|
-
init_model_rate_limit_windows
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
getOpenRouterAttributionHeaders,
|
|
177
|
-
init_openrouter_base_url
|
|
178
|
-
} from "./cli-dfyv0jdy.js";
|
|
170
|
+
init_model_rate_limit_windows,
|
|
171
|
+
CREDENTIAL_POOL_VARS,
|
|
172
|
+
normalizeProviderKeyAliases,
|
|
173
|
+
ModelWindowExhaustedError,
|
|
174
|
+
splitCredentialPool,
|
|
175
|
+
CLAUDE_CREDENTIALS_HINT,
|
|
176
|
+
resolveCredentialPools,
|
|
177
|
+
init_credentials
|
|
178
|
+
} from "./cli-1tem6ns9.js";
|
|
179
179
|
import {
|
|
180
180
|
interpolate,
|
|
181
181
|
init_template,
|
|
@@ -187,7 +187,7 @@ import {
|
|
|
187
187
|
runtimeHarnessSections,
|
|
188
188
|
refreshRuntimeModelCatalog,
|
|
189
189
|
init_runtime_model_catalog
|
|
190
|
-
} from "./cli-
|
|
190
|
+
} from "./cli-803188pb.js";
|
|
191
191
|
import {
|
|
192
192
|
getMcpBaseUrl,
|
|
193
193
|
init_constants2
|
|
@@ -205,7 +205,7 @@ import {
|
|
|
205
205
|
registerEnvSecrets,
|
|
206
206
|
registerSensitiveKeyName,
|
|
207
207
|
init_secret_scrubber
|
|
208
|
-
} from "./cli-
|
|
208
|
+
} from "./cli-708wdy32.js";
|
|
209
209
|
import {
|
|
210
210
|
harnessModelMismatch,
|
|
211
211
|
openAICompatibleProviders,
|
|
@@ -213,9 +213,10 @@ import {
|
|
|
213
213
|
providerBaseUrl,
|
|
214
214
|
providerKeyFromEnv,
|
|
215
215
|
init_src2
|
|
216
|
-
} from "./cli-
|
|
216
|
+
} from "./cli-gxee0bqa.js";
|
|
217
217
|
|
|
218
218
|
// src/commands/runner.ts
|
|
219
|
+
init_src();
|
|
219
220
|
import { existsSync, statSync } from "node:fs";
|
|
220
221
|
import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
221
222
|
init_base_prompt();
|
|
@@ -247,47 +248,47 @@ async function materializeCodexAuthJson(_slot, creds, deps = {}) {
|
|
|
247
248
|
async function createProviderAdapter(provider) {
|
|
248
249
|
switch (provider) {
|
|
249
250
|
case "claude": {
|
|
250
|
-
const { ClaudeAdapter } = await import("./claude-adapter-
|
|
251
|
+
const { ClaudeAdapter } = await import("./claude-adapter-nys1kjxa.js");
|
|
251
252
|
return new ClaudeAdapter;
|
|
252
253
|
}
|
|
253
254
|
case "pi": {
|
|
254
|
-
const { PiMonoAdapter } = await import("./pi-mono-adapter-
|
|
255
|
+
const { PiMonoAdapter } = await import("./pi-mono-adapter-mymbwhj0.js");
|
|
255
256
|
return new PiMonoAdapter;
|
|
256
257
|
}
|
|
257
258
|
case "codex": {
|
|
258
|
-
const { CodexAdapter } = await import("./codex-adapter-
|
|
259
|
+
const { CodexAdapter } = await import("./codex-adapter-d95q4qsn.js");
|
|
259
260
|
return new CodexAdapter;
|
|
260
261
|
}
|
|
261
262
|
case "claude-managed": {
|
|
262
|
-
const { ClaudeManagedAdapter } = await import("./claude-managed-adapter-
|
|
263
|
+
const { ClaudeManagedAdapter } = await import("./claude-managed-adapter-55207973.js");
|
|
263
264
|
return new ClaudeManagedAdapter;
|
|
264
265
|
}
|
|
265
266
|
case "devin": {
|
|
266
|
-
const { DevinAdapter } = await import("./devin-adapter-
|
|
267
|
+
const { DevinAdapter } = await import("./devin-adapter-byen2cxt.js");
|
|
267
268
|
return new DevinAdapter;
|
|
268
269
|
}
|
|
269
270
|
case "opencode": {
|
|
270
|
-
const { OpencodeAdapter } = await import("./opencode-adapter-
|
|
271
|
+
const { OpencodeAdapter } = await import("./opencode-adapter-esv3k9yn.js");
|
|
271
272
|
return new OpencodeAdapter;
|
|
272
273
|
}
|
|
273
274
|
case "dsh": {
|
|
274
|
-
const { DshAdapter } = await import("./dsh-adapter-
|
|
275
|
+
const { DshAdapter } = await import("./dsh-adapter-d4pdpb3r.js");
|
|
275
276
|
return new DshAdapter;
|
|
276
277
|
}
|
|
277
278
|
case "amp": {
|
|
278
|
-
const { AmpAdapter } = await import("./amp-adapter-
|
|
279
|
+
const { AmpAdapter } = await import("./amp-adapter-en0jy6hs.js");
|
|
279
280
|
return new AmpAdapter;
|
|
280
281
|
}
|
|
281
282
|
case "cursor": {
|
|
282
|
-
const { CursorAdapter } = await import("./cursor-adapter-
|
|
283
|
+
const { CursorAdapter } = await import("./cursor-adapter-4mr4jgkw.js");
|
|
283
284
|
return new CursorAdapter;
|
|
284
285
|
}
|
|
285
286
|
case "grok": {
|
|
286
|
-
const { GrokAdapter } = await import("./grok-adapter-
|
|
287
|
+
const { GrokAdapter } = await import("./grok-adapter-t08b9ntm.js");
|
|
287
288
|
return new GrokAdapter;
|
|
288
289
|
}
|
|
289
290
|
case "acp": {
|
|
290
|
-
const { ACPAdapter } = await import("./acp-adapter-
|
|
291
|
+
const { ACPAdapter } = await import("./acp-adapter-dgfakfpw.js");
|
|
291
292
|
return new ACPAdapter;
|
|
292
293
|
}
|
|
293
294
|
default:
|
|
@@ -1222,11 +1223,14 @@ async function reportCredentialOutcomeThenFinish(input, finish) {
|
|
|
1222
1223
|
await finish();
|
|
1223
1224
|
}
|
|
1224
1225
|
|
|
1226
|
+
// src/commands/credential-refresh.ts
|
|
1227
|
+
init_credentials();
|
|
1228
|
+
init_secret_scrubber();
|
|
1229
|
+
|
|
1225
1230
|
// src/commands/provider-credentials.ts
|
|
1226
1231
|
init_src2();
|
|
1227
1232
|
init_src();
|
|
1228
1233
|
init_credentials();
|
|
1229
|
-
init_openrouter_base_url();
|
|
1230
1234
|
init_secret_scrubber();
|
|
1231
1235
|
function isBedrockMode(env) {
|
|
1232
1236
|
const mode = env.BEDROCK_AUTH_MODE?.toLowerCase();
|
|
@@ -1269,7 +1273,7 @@ var CREDENTIAL_PROVIDER_CHECKERS = {
|
|
|
1269
1273
|
devin: (env) => checkDevinCredentials2(env),
|
|
1270
1274
|
opencode: (env, opts) => checkOpencodeCredentials2(env, opts),
|
|
1271
1275
|
pi: async (env, opts) => {
|
|
1272
|
-
const { checkPiMonoCredentials, listPiOpencodeGoModelIds } = await import("./pi-mono-adapter-
|
|
1276
|
+
const { checkPiMonoCredentials, listPiOpencodeGoModelIds } = await import("./pi-mono-adapter-mymbwhj0.js");
|
|
1273
1277
|
return {
|
|
1274
1278
|
...await checkPiMonoCredentials(env, opts),
|
|
1275
1279
|
opencodeGoModels: listPiOpencodeGoModelIds()
|
|
@@ -1302,27 +1306,6 @@ async function checkProviderCredentials(provider, env, opts) {
|
|
|
1302
1306
|
}
|
|
1303
1307
|
return checker(env, opts);
|
|
1304
1308
|
}
|
|
1305
|
-
var LIVE_TEST_TIMEOUT_MS = 5000;
|
|
1306
|
-
async function timedFetch(url, init) {
|
|
1307
|
-
const controller = new AbortController;
|
|
1308
|
-
const timer = setTimeout(() => controller.abort(), LIVE_TEST_TIMEOUT_MS);
|
|
1309
|
-
const start = Date.now();
|
|
1310
|
-
try {
|
|
1311
|
-
const res = await fetch(url, { ...init, signal: controller.signal });
|
|
1312
|
-
let bodyText = "";
|
|
1313
|
-
try {
|
|
1314
|
-
bodyText = await res.text();
|
|
1315
|
-
} catch {}
|
|
1316
|
-
return {
|
|
1317
|
-
ok: res.ok,
|
|
1318
|
-
status: res.status,
|
|
1319
|
-
bodyText,
|
|
1320
|
-
latency_ms: Date.now() - start
|
|
1321
|
-
};
|
|
1322
|
-
} finally {
|
|
1323
|
-
clearTimeout(timer);
|
|
1324
|
-
}
|
|
1325
|
-
}
|
|
1326
1309
|
function asLiveError(err, latency_ms) {
|
|
1327
1310
|
const raw = err instanceof Error ? err.message : String(err);
|
|
1328
1311
|
return {
|
|
@@ -1331,75 +1314,56 @@ function asLiveError(err, latency_ms) {
|
|
|
1331
1314
|
latency_ms
|
|
1332
1315
|
};
|
|
1333
1316
|
}
|
|
1334
|
-
async function
|
|
1335
|
-
const
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
};
|
|
1317
|
+
async function checkEachKey(keyType, value, check) {
|
|
1318
|
+
const members = splitCredentialPool(value);
|
|
1319
|
+
if (members.length === 0)
|
|
1320
|
+
members.push(value.trim());
|
|
1321
|
+
const results = await Promise.all(members.map(async (member) => {
|
|
1322
|
+
const startedAt = Date.now();
|
|
1323
|
+
try {
|
|
1324
|
+
return await check(member);
|
|
1325
|
+
} catch (err) {
|
|
1326
|
+
return asLiveError(err, Date.now() - startedAt);
|
|
1327
|
+
}
|
|
1328
|
+
}));
|
|
1329
|
+
const latency_ms = Math.max(...results.map((result) => result.latency_ms));
|
|
1330
|
+
if (results.every((result) => result.skipped))
|
|
1331
|
+
return { ok: true, skipped: true, latency_ms };
|
|
1332
|
+
const keys = results.map((result, index) => ({
|
|
1333
|
+
keyType,
|
|
1334
|
+
index,
|
|
1335
|
+
suffix: members[index].slice(-5),
|
|
1336
|
+
ok: result.ok,
|
|
1337
|
+
...result.error !== undefined ? { error: result.error } : {},
|
|
1338
|
+
...result.httpStatus !== undefined ? { httpStatus: result.httpStatus } : {},
|
|
1339
|
+
latency_ms: result.latency_ms
|
|
1340
|
+
}));
|
|
1341
|
+
const failed = keys.filter((key) => !key.ok);
|
|
1342
|
+
if (failed.length === 0)
|
|
1343
|
+
return { ok: true, latency_ms, keys };
|
|
1344
|
+
const failures = failed.map((key) => `key ending ${key.suffix} (${key.httpStatus !== undefined ? `HTTP ${key.httpStatus}` : key.error ?? "Unknown error"})`).join(", ");
|
|
1345
|
+
if (failed.length < keys.length) {
|
|
1346
|
+
return {
|
|
1347
|
+
ok: true,
|
|
1348
|
+
latency_ms,
|
|
1349
|
+
keys,
|
|
1350
|
+
warning: `${failed.length} of ${keys.length} keys failed: ${failures}.`
|
|
1351
|
+
};
|
|
1352
|
+
}
|
|
1353
|
+
if (keys.length === 1) {
|
|
1354
|
+
return {
|
|
1355
|
+
ok: false,
|
|
1356
|
+
error: failed[0].error,
|
|
1357
|
+
httpStatus: failed[0].httpStatus,
|
|
1358
|
+
latency_ms,
|
|
1359
|
+
keys
|
|
1360
|
+
};
|
|
1361
|
+
}
|
|
1362
|
+
return { ok: false, error: `All ${keys.length} keys failed: ${failures}.`, latency_ms, keys };
|
|
1346
1363
|
}
|
|
1347
1364
|
function presenceCheckOk() {
|
|
1348
1365
|
return { ok: true, latency_ms: 0 };
|
|
1349
1366
|
}
|
|
1350
|
-
async function checkOpenAiApiKey(apiKey) {
|
|
1351
|
-
const r = await timedFetch("https://api.openai.com/v1/models", {
|
|
1352
|
-
method: "GET",
|
|
1353
|
-
headers: { Authorization: `Bearer ${apiKey}` }
|
|
1354
|
-
});
|
|
1355
|
-
if (r.ok)
|
|
1356
|
-
return { ok: true, latency_ms: r.latency_ms };
|
|
1357
|
-
return {
|
|
1358
|
-
ok: false,
|
|
1359
|
-
error: scrubSecrets(`HTTP ${r.status}: ${r.bodyText.slice(0, 200)}`),
|
|
1360
|
-
latency_ms: r.latency_ms
|
|
1361
|
-
};
|
|
1362
|
-
}
|
|
1363
|
-
async function checkXaiApiKey(apiKey) {
|
|
1364
|
-
const r = await timedFetch("https://api.x.ai/v1/models", {
|
|
1365
|
-
method: "GET",
|
|
1366
|
-
headers: { Authorization: `Bearer ${apiKey}` }
|
|
1367
|
-
});
|
|
1368
|
-
if (r.ok)
|
|
1369
|
-
return { ok: true, latency_ms: r.latency_ms };
|
|
1370
|
-
return {
|
|
1371
|
-
ok: false,
|
|
1372
|
-
error: scrubSecrets(`HTTP ${r.status}: ${r.bodyText.slice(0, 200)}`),
|
|
1373
|
-
latency_ms: r.latency_ms
|
|
1374
|
-
};
|
|
1375
|
-
}
|
|
1376
|
-
async function checkOpenRouter(apiKey) {
|
|
1377
|
-
const url = `${getOpenRouterBaseUrl()}/models`;
|
|
1378
|
-
const r = await timedFetch(url, {
|
|
1379
|
-
method: "GET",
|
|
1380
|
-
headers: { ...getOpenRouterAttributionHeaders(url), Authorization: `Bearer ${apiKey}` }
|
|
1381
|
-
});
|
|
1382
|
-
if (r.ok)
|
|
1383
|
-
return { ok: true, latency_ms: r.latency_ms };
|
|
1384
|
-
return {
|
|
1385
|
-
ok: false,
|
|
1386
|
-
error: scrubSecrets(`HTTP ${r.status}: ${r.bodyText.slice(0, 200)}`),
|
|
1387
|
-
latency_ms: r.latency_ms
|
|
1388
|
-
};
|
|
1389
|
-
}
|
|
1390
|
-
async function checkOpenAICompatibleProvider(provider, apiKey, baseUrl = provider.baseUrl) {
|
|
1391
|
-
const r = await timedFetch(`${baseUrl.replace(/\/+$/, "")}/models`, {
|
|
1392
|
-
method: "GET",
|
|
1393
|
-
headers: { Authorization: `Bearer ${apiKey}` }
|
|
1394
|
-
});
|
|
1395
|
-
if (r.ok)
|
|
1396
|
-
return { ok: true, latency_ms: r.latency_ms };
|
|
1397
|
-
return {
|
|
1398
|
-
ok: false,
|
|
1399
|
-
error: scrubSecrets(`HTTP ${r.status}: ${r.bodyText.slice(0, 200)}`),
|
|
1400
|
-
latency_ms: r.latency_ms
|
|
1401
|
-
};
|
|
1402
|
-
}
|
|
1403
1367
|
function codexAuthFileExists(env) {
|
|
1404
1368
|
return checkCodexCredentials2(env).satisfiedBy === "file";
|
|
1405
1369
|
}
|
|
@@ -1426,17 +1390,32 @@ async function validateProviderCredentials(provider, env = process.env, presence
|
|
|
1426
1390
|
latency_ms: Date.now() - startedAt
|
|
1427
1391
|
};
|
|
1428
1392
|
}
|
|
1429
|
-
const
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1393
|
+
const checkRoute = async (routeEnv) => {
|
|
1394
|
+
const start = Date.now();
|
|
1395
|
+
const result = await validateRoute(route, routeEnv);
|
|
1396
|
+
const latency_ms = Date.now() - start;
|
|
1397
|
+
if (result.status === "verified")
|
|
1398
|
+
return { ok: true, latency_ms };
|
|
1399
|
+
if (result.status === "configured")
|
|
1400
|
+
return { ok: true, skipped: true, latency_ms };
|
|
1401
|
+
return {
|
|
1402
|
+
ok: false,
|
|
1403
|
+
error: scrubSecrets(result.reason),
|
|
1404
|
+
httpStatus: result.httpStatus,
|
|
1405
|
+
latency_ms
|
|
1406
|
+
};
|
|
1407
|
+
};
|
|
1408
|
+
const keyVar = route.auth.kind === "subscription" ? "CLAUDE_CODE_OAUTH_TOKEN" : ("secretKey" in route.auth) ? route.auth.secretKey : undefined;
|
|
1409
|
+
const value = keyVar ? env[keyVar] : undefined;
|
|
1410
|
+
if (keyVar && value && CREDENTIAL_POOL_VARS.includes(keyVar)) {
|
|
1411
|
+
return checkEachKey(keyVar, value, (member) => checkRoute({ ...env, [keyVar]: member }));
|
|
1412
|
+
}
|
|
1413
|
+
return checkRoute(env);
|
|
1436
1414
|
}
|
|
1437
1415
|
case "claude-managed": {
|
|
1438
|
-
if (env.ANTHROPIC_API_KEY)
|
|
1439
|
-
return
|
|
1416
|
+
if (env.ANTHROPIC_API_KEY) {
|
|
1417
|
+
return checkEachKey("ANTHROPIC_API_KEY", env.ANTHROPIC_API_KEY, checkAnthropicApiKey);
|
|
1418
|
+
}
|
|
1440
1419
|
return {
|
|
1441
1420
|
ok: false,
|
|
1442
1421
|
error: "ANTHROPIC_API_KEY is not set.",
|
|
@@ -1444,14 +1423,30 @@ async function validateProviderCredentials(provider, env = process.env, presence
|
|
|
1444
1423
|
};
|
|
1445
1424
|
}
|
|
1446
1425
|
case "codex": {
|
|
1426
|
+
const gateway = deriveDefaultRoute("codex", env);
|
|
1427
|
+
if (gateway) {
|
|
1428
|
+
const result = await validateRoute(gateway, env);
|
|
1429
|
+
const latency_ms = Date.now() - startedAt;
|
|
1430
|
+
if (result.status === "verified")
|
|
1431
|
+
return { ok: true, latency_ms };
|
|
1432
|
+
if (result.status === "configured")
|
|
1433
|
+
return { ok: true, skipped: true, latency_ms };
|
|
1434
|
+
return {
|
|
1435
|
+
ok: false,
|
|
1436
|
+
error: scrubSecrets(result.reason),
|
|
1437
|
+
httpStatus: result.httpStatus,
|
|
1438
|
+
latency_ms
|
|
1439
|
+
};
|
|
1440
|
+
}
|
|
1447
1441
|
if (codexAuthFileExists(env))
|
|
1448
1442
|
return presenceCheckOk();
|
|
1449
1443
|
if (parseCodexOAuthAccess(env.CODEX_OAUTH))
|
|
1450
1444
|
return presenceCheckOk();
|
|
1451
1445
|
if (hasCodexOAuthPoolSlots(env))
|
|
1452
1446
|
return presenceCheckOk();
|
|
1453
|
-
if (env.OPENAI_API_KEY)
|
|
1454
|
-
return
|
|
1447
|
+
if (env.OPENAI_API_KEY) {
|
|
1448
|
+
return checkEachKey("OPENAI_API_KEY", env.OPENAI_API_KEY, checkOpenAiApiKey);
|
|
1449
|
+
}
|
|
1455
1450
|
return {
|
|
1456
1451
|
ok: false,
|
|
1457
1452
|
error: "No codex credential found (no ~/.codex/auth.json, CODEX_OAUTH, or OPENAI_API_KEY).",
|
|
@@ -1466,16 +1461,19 @@ async function validateProviderCredentials(provider, env = process.env, presence
|
|
|
1466
1461
|
const status = presence ?? await checkProviderCredentials(provider, env);
|
|
1467
1462
|
if (status.ready && status.satisfiedBy === "file")
|
|
1468
1463
|
return presenceCheckOk();
|
|
1469
|
-
if (env.OPENROUTER_API_KEY)
|
|
1470
|
-
return
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1464
|
+
if (env.OPENROUTER_API_KEY) {
|
|
1465
|
+
return checkEachKey("OPENROUTER_API_KEY", env.OPENROUTER_API_KEY, checkOpenRouter);
|
|
1466
|
+
}
|
|
1467
|
+
if (env.ANTHROPIC_API_KEY) {
|
|
1468
|
+
return checkEachKey("ANTHROPIC_API_KEY", env.ANTHROPIC_API_KEY, checkAnthropicApiKey);
|
|
1469
|
+
}
|
|
1470
|
+
if (env.OPENAI_API_KEY) {
|
|
1471
|
+
return checkEachKey("OPENAI_API_KEY", env.OPENAI_API_KEY, checkOpenAiApiKey);
|
|
1472
|
+
}
|
|
1475
1473
|
for (const direct of openAICompatibleProviders()) {
|
|
1476
1474
|
const key = providerKeyFromEnv(direct, env);
|
|
1477
1475
|
if (key) {
|
|
1478
|
-
return
|
|
1476
|
+
return checkEachKey(direct.envVar, key, (member) => checkOpenAICompatibleProvider(direct, member, providerBaseUrl(direct, env)));
|
|
1479
1477
|
}
|
|
1480
1478
|
}
|
|
1481
1479
|
if (status.ready)
|
|
@@ -1496,27 +1494,37 @@ async function validateProviderCredentials(provider, env = process.env, presence
|
|
|
1496
1494
|
};
|
|
1497
1495
|
}
|
|
1498
1496
|
const baseUrl = env.DEVIN_API_BASE_URL ?? "https://api.devin.ai";
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1497
|
+
return checkEachKey("DEVIN_API_KEY", apiKey, async (member) => {
|
|
1498
|
+
const r = await timedFetch(`${baseUrl.replace(/\/+$/, "")}/v3/self`, {
|
|
1499
|
+
method: "GET",
|
|
1500
|
+
headers: {
|
|
1501
|
+
Authorization: `Bearer ${member}`,
|
|
1502
|
+
"Content-Type": "application/json"
|
|
1503
|
+
}
|
|
1504
|
+
});
|
|
1505
|
+
if (r.ok)
|
|
1506
|
+
return { ok: true, latency_ms: r.latency_ms };
|
|
1507
|
+
return {
|
|
1508
|
+
ok: false,
|
|
1509
|
+
error: scrubSecrets(`HTTP ${r.status}: ${r.bodyText.slice(0, 200)}`),
|
|
1510
|
+
httpStatus: r.status,
|
|
1511
|
+
latency_ms: r.latency_ms
|
|
1512
|
+
};
|
|
1505
1513
|
});
|
|
1506
|
-
if (r.ok)
|
|
1507
|
-
return { ok: true, latency_ms: r.latency_ms };
|
|
1508
|
-
return {
|
|
1509
|
-
ok: false,
|
|
1510
|
-
error: scrubSecrets(`HTTP ${r.status}: ${r.bodyText.slice(0, 200)}`),
|
|
1511
|
-
latency_ms: r.latency_ms
|
|
1512
|
-
};
|
|
1513
1514
|
}
|
|
1514
|
-
case "dsh":
|
|
1515
|
-
|
|
1515
|
+
case "dsh": {
|
|
1516
|
+
const deepseekKey = env.DEEPSEEK_API_KEY?.trim();
|
|
1517
|
+
if (deepseekKey)
|
|
1518
|
+
return checkEachKey("DEEPSEEK_API_KEY", deepseekKey, checkDeepSeekApiKey);
|
|
1519
|
+
const openRouterKey = env.OPENROUTER_API_KEY?.trim();
|
|
1520
|
+
if (openRouterKey)
|
|
1521
|
+
return checkEachKey("OPENROUTER_API_KEY", openRouterKey, checkOpenRouter);
|
|
1522
|
+
return {
|
|
1516
1523
|
ok: false,
|
|
1517
1524
|
error: "Set DEEPSEEK_API_KEY or OPENROUTER_API_KEY for dsh.",
|
|
1518
1525
|
latency_ms: Date.now() - startedAt
|
|
1519
1526
|
};
|
|
1527
|
+
}
|
|
1520
1528
|
case "amp": {
|
|
1521
1529
|
if (!checkAmpCredentials2(env).ready) {
|
|
1522
1530
|
return {
|
|
@@ -1525,12 +1533,15 @@ async function validateProviderCredentials(provider, env = process.env, presence
|
|
|
1525
1533
|
latency_ms: Date.now() - startedAt
|
|
1526
1534
|
};
|
|
1527
1535
|
}
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1536
|
+
return checkEachKey("AMP_API_KEY", env.AMP_API_KEY, async (member) => {
|
|
1537
|
+
const start = Date.now();
|
|
1538
|
+
const live = await liveTestAmpCredentials2({ ...env, AMP_API_KEY: member });
|
|
1539
|
+
return live.ok ? { ok: true, latency_ms: Date.now() - start } : {
|
|
1540
|
+
ok: false,
|
|
1541
|
+
error: live.error ?? "amp usage failed",
|
|
1542
|
+
latency_ms: Date.now() - start
|
|
1543
|
+
};
|
|
1544
|
+
});
|
|
1534
1545
|
}
|
|
1535
1546
|
case "cursor": {
|
|
1536
1547
|
const apiKey = env.CURSOR_API_KEY?.trim();
|
|
@@ -1541,17 +1552,21 @@ async function validateProviderCredentials(provider, env = process.env, presence
|
|
|
1541
1552
|
latency_ms: Date.now() - startedAt
|
|
1542
1553
|
};
|
|
1543
1554
|
}
|
|
1544
|
-
const { liveTestCursorKey } = await import("./cursor-adapter-
|
|
1545
|
-
|
|
1546
|
-
|
|
1555
|
+
const { liveTestCursorKey } = await import("./cursor-adapter-4mr4jgkw.js");
|
|
1556
|
+
return checkEachKey("CURSOR_API_KEY", apiKey, async (member) => {
|
|
1557
|
+
const start = Date.now();
|
|
1558
|
+
const result = await liveTestCursorKey(member);
|
|
1559
|
+
return result.ok ? { ok: true, latency_ms: Date.now() - start } : { ok: false, error: result.error, latency_ms: Date.now() - start };
|
|
1560
|
+
});
|
|
1547
1561
|
}
|
|
1548
1562
|
case "grok": {
|
|
1549
1563
|
const apiKey = env.XAI_API_KEY?.trim();
|
|
1550
1564
|
if (apiKey)
|
|
1551
|
-
return
|
|
1565
|
+
return checkEachKey("XAI_API_KEY", apiKey, checkXaiApiKey);
|
|
1552
1566
|
const openRouterKey = env.OPENROUTER_API_KEY?.trim();
|
|
1553
|
-
if (openRouterKey)
|
|
1554
|
-
return
|
|
1567
|
+
if (openRouterKey) {
|
|
1568
|
+
return checkEachKey("OPENROUTER_API_KEY", openRouterKey, checkOpenRouter);
|
|
1569
|
+
}
|
|
1555
1570
|
return {
|
|
1556
1571
|
ok: false,
|
|
1557
1572
|
error: "Set XAI_API_KEY or OPENROUTER_API_KEY for grok.",
|
|
@@ -1583,7 +1598,9 @@ async function buildCredStatusReport(provider, env, opts = {}, kind) {
|
|
|
1583
1598
|
ok: live.ok,
|
|
1584
1599
|
error: live.error ?? null,
|
|
1585
1600
|
latency_ms: live.latency_ms,
|
|
1586
|
-
testedAt: Date.now()
|
|
1601
|
+
testedAt: Date.now(),
|
|
1602
|
+
...live.warning !== undefined ? { warning: live.warning } : {},
|
|
1603
|
+
...live.keys !== undefined ? { keys: live.keys } : {}
|
|
1587
1604
|
};
|
|
1588
1605
|
}
|
|
1589
1606
|
const bedrock = presence.bedrockRegion !== undefined ? {
|
|
@@ -1678,13 +1695,56 @@ function buildLatestModelReport(opts) {
|
|
|
1678
1695
|
|
|
1679
1696
|
// src/commands/credential-refresh.ts
|
|
1680
1697
|
var CREDENTIAL_RETRY_INTERVAL_MS = 30000;
|
|
1698
|
+
var KEY_RECHECK_INTERVAL_MS = 10 * 60000;
|
|
1681
1699
|
var BEDROCK_REFRESH_INTERVAL_MS = 5 * 60 * 1000;
|
|
1700
|
+
function credentialFingerprint(env) {
|
|
1701
|
+
return Bun.hash(JSON.stringify([...CREDENTIAL_POOL_VARS, "ANTHROPIC_AUTH_TOKEN", "ANTHROPIC_BASE_URL"].map((key) => env[key] ?? null))).toString();
|
|
1702
|
+
}
|
|
1703
|
+
function recheckableFailures(liveTest) {
|
|
1704
|
+
const keys = liveTest?.keys;
|
|
1705
|
+
if (keys?.length) {
|
|
1706
|
+
return keys.filter((key) => !key.ok && key.keyType !== "CLAUDE_CODE_OAUTH_TOKEN").length;
|
|
1707
|
+
}
|
|
1708
|
+
return liveTest?.ok === false ? 1 : 0;
|
|
1709
|
+
}
|
|
1710
|
+
async function reportKeyValidation(api, keys) {
|
|
1711
|
+
for (const keyType of new Set(keys.map((key) => key.keyType))) {
|
|
1712
|
+
try {
|
|
1713
|
+
const response = await fetch(`${api.apiUrl}/api/keys/report-validation`, {
|
|
1714
|
+
method: "POST",
|
|
1715
|
+
headers: {
|
|
1716
|
+
"Content-Type": "application/json",
|
|
1717
|
+
Authorization: `Bearer ${api.apiKey}`,
|
|
1718
|
+
"X-Agent-ID": api.agentId
|
|
1719
|
+
},
|
|
1720
|
+
body: JSON.stringify({
|
|
1721
|
+
keyType,
|
|
1722
|
+
keys: keys.filter((key) => key.keyType === keyType).map((key) => ({
|
|
1723
|
+
keyIndex: key.index,
|
|
1724
|
+
keySuffix: key.suffix,
|
|
1725
|
+
ok: key.ok,
|
|
1726
|
+
httpStatus: key.httpStatus
|
|
1727
|
+
}))
|
|
1728
|
+
}),
|
|
1729
|
+
signal: AbortSignal.timeout(5000)
|
|
1730
|
+
});
|
|
1731
|
+
if (!response.ok)
|
|
1732
|
+
throw new Error(`HTTP ${response.status}`);
|
|
1733
|
+
} catch (err) {
|
|
1734
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
1735
|
+
console.warn(scrubSecrets(`[credentials] Failed to report key validation: ${message}`));
|
|
1736
|
+
}
|
|
1737
|
+
}
|
|
1738
|
+
}
|
|
1682
1739
|
async function refreshCredentialStatus(api, state, harnessProvider, env, now = Date.now()) {
|
|
1683
1740
|
if (isCredCheckDisabled(env) || state.inFlight)
|
|
1684
1741
|
return;
|
|
1685
1742
|
const providerChanged = state.harnessProvider !== harnessProvider;
|
|
1743
|
+
const fingerprint = credentialFingerprint(env);
|
|
1744
|
+
const fingerprintChanged = state.fingerprint !== fingerprint;
|
|
1686
1745
|
const retryDue = state.ready !== true && now - state.lastRefreshAt >= CREDENTIAL_RETRY_INTERVAL_MS;
|
|
1687
|
-
|
|
1746
|
+
const keyRecheckDue = state.rejectedKeys > 0 && now - state.lastRefreshAt >= KEY_RECHECK_INTERVAL_MS;
|
|
1747
|
+
if (!providerChanged && !fingerprintChanged && !retryDue && !keyRecheckDue && !shouldRefreshBedrockStatus({
|
|
1688
1748
|
harnessProvider,
|
|
1689
1749
|
env,
|
|
1690
1750
|
lastRefreshAt: state.lastRefreshAt,
|
|
@@ -1706,8 +1766,14 @@ async function refreshCredentialStatus(api, state, harnessProvider, env, now = D
|
|
|
1706
1766
|
missing: snapshot.missing,
|
|
1707
1767
|
credStatus: snapshot
|
|
1708
1768
|
});
|
|
1709
|
-
if (state.harnessProvider === harnessProvider)
|
|
1769
|
+
if (state.harnessProvider === harnessProvider) {
|
|
1710
1770
|
state.ready = snapshot.ready;
|
|
1771
|
+
state.fingerprint = fingerprint;
|
|
1772
|
+
state.rejectedKeys = recheckableFailures(snapshot.liveTest);
|
|
1773
|
+
const keys = snapshot.liveTest?.keys;
|
|
1774
|
+
if (keys?.length)
|
|
1775
|
+
await reportKeyValidation(api, keys);
|
|
1776
|
+
}
|
|
1711
1777
|
} finally {
|
|
1712
1778
|
state.inFlight = false;
|
|
1713
1779
|
}
|
|
@@ -1735,7 +1801,7 @@ function resolveBackoff(override, env) {
|
|
|
1735
1801
|
};
|
|
1736
1802
|
return {
|
|
1737
1803
|
initialMs: override?.initialMs ?? parsePositive(env.BOOT_INITIAL_BACKOFF_MS, 2000),
|
|
1738
|
-
maxMs: override?.maxMs ?? parsePositive(env.BOOT_MAX_BACKOFF_MS,
|
|
1804
|
+
maxMs: override?.maxMs ?? parsePositive(env.BOOT_MAX_BACKOFF_MS, 1e4),
|
|
1739
1805
|
maxWaitSeconds: override?.maxWaitSeconds ?? parsePositive(env.BOOT_MAX_WAIT_SECONDS, 0)
|
|
1740
1806
|
};
|
|
1741
1807
|
}
|
|
@@ -2499,6 +2565,7 @@ async function fetchResolvedEnv(apiUrl, apiKey, agentId, baseEnv = process.env,
|
|
|
2499
2565
|
env
|
|
2500
2566
|
});
|
|
2501
2567
|
const effectiveModel = modelSelection.model || env.MODEL_OVERRIDE || "";
|
|
2568
|
+
const credentialEnv = { ...env };
|
|
2502
2569
|
const credentialSelections = await resolveCredentialPools(env, {
|
|
2503
2570
|
apiUrl,
|
|
2504
2571
|
apiKey,
|
|
@@ -2507,7 +2574,7 @@ async function fetchResolvedEnv(apiUrl, apiKey, agentId, baseEnv = process.env,
|
|
|
2507
2574
|
localBlocks: sessionContext?.localBlocks,
|
|
2508
2575
|
enforceModelCapacity: sessionContext?.enforceModelCapacity
|
|
2509
2576
|
});
|
|
2510
|
-
return { env, credentialSelections, resolvedProvider, scriptsOnlyConfigValue };
|
|
2577
|
+
return { env, credentialEnv, credentialSelections, resolvedProvider, scriptsOnlyConfigValue };
|
|
2511
2578
|
}
|
|
2512
2579
|
async function ensureAgentFsCredentials(apiUrl, apiKey, agentId) {
|
|
2513
2580
|
if (!apiUrl || !apiKey || !agentId || agentId === "unknown")
|
|
@@ -4324,7 +4391,7 @@ async function spawnProviderProcess(adapter, opts, logDir, isYolo) {
|
|
|
4324
4391
|
const sessionEffort = effectiveReasoningEffort(adapter.name, model, reasoningEffortOverride);
|
|
4325
4392
|
let oauthSelection;
|
|
4326
4393
|
let oauthIsPoolBacked = false;
|
|
4327
|
-
if (adapter.name === "codex") {
|
|
4394
|
+
if (adapter.name === "codex" && !deriveDefaultRoute("codex", freshEnv)) {
|
|
4328
4395
|
const oauthInfo = await resolveCodexOAuthCredentialInfo(opts.apiUrl, opts.apiKey);
|
|
4329
4396
|
oauthSelection = oauthInfo?.selection;
|
|
4330
4397
|
oauthIsPoolBacked = oauthInfo?.isPoolBacked ?? false;
|
|
@@ -5434,8 +5501,11 @@ ${additionalSystemPrompt}` : basePrompt;
|
|
|
5434
5501
|
harnessProvider: null,
|
|
5435
5502
|
ready: null,
|
|
5436
5503
|
lastRefreshAt: 0,
|
|
5437
|
-
inFlight: false
|
|
5504
|
+
inFlight: false,
|
|
5505
|
+
fingerprint: null,
|
|
5506
|
+
rejectedKeys: 0
|
|
5438
5507
|
};
|
|
5508
|
+
let latestCredentialEnv;
|
|
5439
5509
|
let lastHarnessReconcileAt = 0;
|
|
5440
5510
|
const HARNESS_RECONCILE_INTERVAL_MS = 1e4;
|
|
5441
5511
|
let lastServerCapsRefreshAt = 0;
|
|
@@ -5650,6 +5720,11 @@ ${additionalSystemPrompt}` : basePrompt;
|
|
|
5650
5720
|
credentialRefreshState.harnessProvider = state.harnessProvider;
|
|
5651
5721
|
credentialRefreshState.ready = bootCredSnapshot?.ready ?? true;
|
|
5652
5722
|
credentialRefreshState.lastRefreshAt = Date.now();
|
|
5723
|
+
credentialRefreshState.fingerprint = credentialFingerprint(process.env);
|
|
5724
|
+
credentialRefreshState.rejectedKeys = recheckableFailures(bootCredSnapshot?.liveTest);
|
|
5725
|
+
const keys = bootCredSnapshot?.liveTest?.keys;
|
|
5726
|
+
if (keys?.length)
|
|
5727
|
+
await reportKeyValidation(apiConfig, keys);
|
|
5653
5728
|
} catch (error) {
|
|
5654
5729
|
console.error(`[${role}] Failed to report credential readiness after recovery: ${error}`);
|
|
5655
5730
|
process.exit(1);
|
|
@@ -6074,9 +6149,11 @@ ${additionalSystemPrompt}` : basePrompt;
|
|
|
6074
6149
|
try {
|
|
6075
6150
|
const {
|
|
6076
6151
|
env: freshEnv,
|
|
6152
|
+
credentialEnv,
|
|
6077
6153
|
resolvedProvider,
|
|
6078
6154
|
scriptsOnlyConfigValue
|
|
6079
6155
|
} = await fetchResolvedEnv(apiUrl, apiKey, agentId);
|
|
6156
|
+
latestCredentialEnv = credentialEnv;
|
|
6080
6157
|
const nextScriptsOnly = resolveScriptsOnlyMode({
|
|
6081
6158
|
env: process.env.SCRIPTS_ONLY_MCP,
|
|
6082
6159
|
configValue: scriptsOnlyConfigValue
|
|
@@ -6089,7 +6166,7 @@ ${additionalSystemPrompt}` : basePrompt;
|
|
|
6089
6166
|
console.warn(`[${role}] [harness] Reconcile fetch failed (non-fatal): ${err}`);
|
|
6090
6167
|
}
|
|
6091
6168
|
}
|
|
6092
|
-
refreshCredentialStatus(apiConfig, credentialRefreshState, state.harnessProvider, process.env).catch((err) => console.warn(`[${role}] cred_status post_task refresh failed (non-fatal): ${err}`));
|
|
6169
|
+
refreshCredentialStatus(apiConfig, credentialRefreshState, state.harnessProvider, latestCredentialEnv ?? process.env).catch((err) => console.warn(`[${role}] cred_status post_task refresh failed (non-fatal): ${err}`));
|
|
6093
6170
|
const now = Date.now();
|
|
6094
6171
|
for (const [taskId, task] of state.activeTasks) {
|
|
6095
6172
|
if (vcsDetectedTasks.has(taskId))
|