@desplega.ai/agent-swarm 2.5.3 → 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-gr2fcyyj.js → acp-adapter-dgfakfpw.js} +9 -9
- package/dist/{actions-wv766ghf.js → actions-fbqma8aa.js} +21 -21
- package/dist/{amp-adapter-speb906t.js → amp-adapter-en0jy6hs.js} +4 -4
- package/dist/{app-ag29n14f.js → app-k8a5cgpp.js} +3 -3
- package/dist/{assistant-3x8bz3eg.js → assistant-a16433gr.js} +30 -26
- package/dist/{boot-reembed-jsmfrpzf.js → boot-reembed-6c1sjfnr.js} +1 -1
- package/dist/{boot-reembed-5b3d2eea.js → boot-reembed-f4nn561n.js} +1 -1
- package/dist/{boot-scrub-sweep-s73gerxy.js → boot-scrub-sweep-d4w9gajf.js} +4 -4
- package/dist/{boot-seeds-5zmax2wr.js → boot-seeds-9bmkspyw.js} +4 -4
- package/dist/{claude-adapter-hswdnm3t.js → claude-adapter-nys1kjxa.js} +9 -9
- package/dist/{claude-managed-adapter-cvbzj1h6.js → claude-managed-adapter-55207973.js} +3 -3
- package/dist/{claude-managed-setup-3k8m3hhc.js → claude-managed-setup-3cm35gey.js} +11 -4
- package/dist/{claude-sdk-session-fkbyk66x.js → claude-sdk-session-nw5yd8cp.js} +9313 -9260
- package/dist/{cli-210xd1f4.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-25j01dpj.js → cli-24j1jeeb.js} +3 -3
- package/dist/{cli-ta8bd7th.js → cli-2sjhpsns.js} +2 -2
- package/dist/{cli-p859hcc8.js → cli-39aet655.js} +2 -2
- package/dist/{cli-g1cw7xtt.js → cli-39rrw8yp.js} +1 -1
- package/dist/{cli-e2ar4bp1.js → cli-3aqd4jaa.js} +121 -47
- package/dist/{cli-jjznk3f7.js → cli-3fwqy71j.js} +69 -35
- package/dist/{cli-p9rafdrb.js → cli-3gfvmzht.js} +7 -7
- package/dist/{cli-03vpq45j.js → cli-3ndmpxxv.js} +2 -2
- package/dist/{cli-aecdcr77.js → cli-4hxrf0p4.js} +228 -74
- package/dist/{cli-mz9afxxf.js → cli-4rf0f5vg.js} +15 -3
- package/dist/{cli-qzme5949.js → cli-5rj83bam.js} +284 -202
- package/dist/{cli-fsdprwrg.js → cli-5sckpqcx.js} +2 -2
- package/dist/{cli-cz5nmdxt.js → cli-683y0b3a.js} +2 -2
- package/dist/{cli-3ngdk5te.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-avdvgcay.js → cli-9abdgn5t.js} +28 -9
- package/dist/{cli-99xgw26r.js → cli-a2rr0fmg.js} +1 -1
- package/dist/{cli-e5bxnjps.js → cli-a34pr3w1.js} +7 -7
- package/dist/{cli-502eqv93.js → cli-abkm71vr.js} +1 -1
- package/dist/{cli-mmhj8vd7.js → cli-ag2yrnt5.js} +11 -2
- package/dist/{cli-n45mr7zh.js → cli-aj8djyqt.js} +5 -5
- package/dist/{cli-1fc85mvt.js → cli-art7c1zh.js} +5 -5
- package/dist/{cli-40jsnrjm.js → cli-az25fn5f.js} +10 -8
- package/dist/{cli-9s05422w.js → cli-bqztfyve.js} +1 -1
- package/dist/{cli-bn0rewsy.js → cli-c081bj3b.js} +2 -2
- package/dist/{cli-svrj71pg.js → cli-c2habvsf.js} +12 -12
- package/dist/{cli-s49hpn37.js → cli-ca6banwz.js} +85 -19
- package/dist/{cli-hhxjnjzs.js → cli-cz37jqss.js} +12 -10
- package/dist/{cli-6n8axjv1.js → cli-d2dpf95n.js} +2 -2
- package/dist/{cli-tx00c0h6.js → cli-dqygeeh5.js} +17 -1
- package/dist/{cli-z21whrrg.js → cli-emhjcj2y.js} +17 -17
- package/dist/{cli-e8jyq7d8.js → cli-esakngh8.js} +7 -3
- package/dist/{cli-ha9rmwgq.js → cli-fb8m699c.js} +2 -2
- package/dist/{cli-35gtk1p6.js → cli-ffvsj2qw.js} +44 -13
- package/dist/{cli-ce0ak9ms.js → cli-g20jjwt4.js} +26 -26
- package/dist/{cli-kxawjrxg.js → cli-g8ka5j4j.js} +772 -194
- package/dist/{cli-vwn81jbs.js → cli-gf95q3bm.js} +5 -5
- package/dist/{cli-s53vp709.js → cli-gnsb1zxa.js} +2 -2
- package/dist/{cli-nwyw3zhg.js → cli-gxee0bqa.js} +1 -1
- package/dist/{cli-gpv60278.js → cli-hfeb68z4.js} +7 -7
- package/dist/{cli-0ebey9hg.js → cli-j6rktc91.js} +1 -1
- package/dist/{cli-ewm3pwbq.js → cli-k21gx5ht.js} +46 -23
- package/dist/{cli-egjggehm.js → cli-kf4jree9.js} +2 -2
- package/dist/{cli-dabehxhp.js → cli-kt907da6.js} +1 -1
- package/dist/{cli-p0rzjkya.js → cli-m5a9m0ak.js} +32 -13
- package/dist/{cli-fzcn3d87.js → cli-m70bajzr.js} +3 -3
- package/dist/{cli-w1zwctj2.js → cli-mtnj4fwa.js} +11 -5
- package/dist/{cli-gpsz7g88.js → cli-mvjz5an3.js} +16 -12
- package/dist/{cli-hcpj2xqz.js → cli-n7asmce6.js} +225 -3
- package/dist/{cli-y561h5a9.js → cli-nn6vx2mq.js} +5 -5
- package/dist/cli-nq677csy.js +140 -0
- package/dist/{cli-a5ebc95n.js → cli-pfk92eqz.js} +18 -15
- package/dist/{cli-p6zs9h4y.js → cli-rr7zx19j.js} +767 -249
- package/dist/{cli-qgf8emrn.js → cli-sqma6vw1.js} +10 -7
- package/dist/{cli-0xk505e8.js → cli-sxgtf5fw.js} +1 -1
- 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-8s5wx3nz.js → cli-zqne1qcj.js} +44 -17
- package/dist/cli.js +22 -22
- package/dist/{codex-adapter-n8ka66vf.js → codex-adapter-d95q4qsn.js} +7 -7
- package/dist/{codex-hook-e2he7aca.js → codex-hook-brpnycn5.js} +1 -1
- package/dist/{codex-login-rn7c5gxt.js → codex-login-8cg0vhf2.js} +1 -1
- package/dist/{codex-session-runner-fsebts37.js → codex-session-runner-gdwd8h0c.js} +8 -8
- package/dist/{commands-t04rt2pc.js → commands-jqmgk54b.js} +2 -2
- package/dist/{controller-rgna04r2.js → controller-z3jq589f.js} +30 -4
- package/dist/{controllers-connect-bqm1rtft.js → controllers-connect-r2za39ef.js} +23 -23
- package/dist/{cursor-adapter-swr2k95y.js → cursor-adapter-4mr4jgkw.js} +2 -3
- package/dist/{db-a4m7haw0.js → db-ppv2tze7.js} +3 -3
- package/dist/{db-24ck09xy.js → db-w36wwb5g.js} +4 -2
- package/dist/{devin-adapter-4ycy4vrf.js → devin-adapter-byen2cxt.js} +1 -1
- package/dist/{dispatcher-nwf9ss0q.js → dispatcher-pv5h77vf.js} +20 -20
- package/dist/{docker-nfy2gc8t.js → docker-fdzyewpz.js} +4 -4
- package/dist/{dsh-adapter-kpdnhjst.js → dsh-adapter-d4pdpb3r.js} +2 -3
- 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-j1e2p34p.js → external-channel-y6nkzhnn.js} +2 -2
- package/dist/{grok-adapter-qtjz0whk.js → grok-adapter-t08b9ntm.js} +10 -10
- package/dist/handlers-eqsnmv95.js +41 -0
- package/dist/{heartbeat-vtesda5d.js → heartbeat-vn31xwdk.js} +23 -23
- package/dist/{hook-b2hhj6rd.js → hook-6d0zbvvt.js} +6 -5
- package/dist/{hook-8wqaszda.js → hook-cpjs8q51.js} +13 -7
- package/dist/{http-mxcqhhcs.js → http-9c6medda.js} +1085 -136
- package/dist/{index-spwxjgay.js → index-38t35h0n.js} +20 -20
- package/dist/{index-1r8wfpzs.js → index-g6k9tctj.js} +1 -1
- package/dist/{index-srg522m6.js → index-k0yt1tvq.js} +20 -20
- package/dist/{index-31ceyf42.js → index-pkma1yf8.js} +1 -1
- package/dist/{index-n1vbvta9.js → index-qhjf2htm.js} +29 -24
- package/dist/index-yqgbfgaj.js +43 -0
- package/dist/{keepalive-dsd8rtgx.js → keepalive-em0117bp.js} +4 -4
- package/dist/lead-23e7z59t.js +79 -0
- package/dist/{maintenance-jqmqwnet.js → maintenance-kbme3qy9.js} +1 -1
- package/dist/{oauth-refresh-sweep-q2c3bnvm.js → oauth-refresh-sweep-xysj4yse.js} +3 -3
- package/dist/{onboard-w4yd7s8t.js → onboard-p6q0vz97.js} +3 -3
- package/dist/{opencode-adapter-9tppvxar.js → opencode-adapter-esv3k9yn.js} +7 -7
- package/dist/{otel-impl-f36byzbd.js → otel-impl-54qhqh1z.js} +2 -2
- package/dist/{pi-mono-adapter-tqsge1ay.js → pi-mono-adapter-mymbwhj0.js} +41 -14
- package/dist/{pricing-refresh-xvak5p4v.js → pricing-refresh-yb75wv33.js} +3 -3
- package/dist/{rbac-roles-gfn30fb8.js → rbac-roles-1vp2mw4p.js} +2 -2
- package/dist/{rbac-roles-682k2mt5.js → rbac-roles-dexhc9x8.js} +1 -1
- package/dist/render-v2-tjay5hhf.js +16 -0
- package/dist/{resume-2dvq348g.js → resume-8ayf37g5.js} +11 -9
- package/dist/{runtime-bt5pkpm1.js → runtime-hqe5cqcd.js} +1 -1
- package/dist/{session-access-7f21ekq9.js → session-access-fdhp987s.js} +4 -4
- package/dist/session-source-backfill-qgtc86z1.js +110 -0
- package/dist/{setup-epffxtbk.js → setup-4rrmqcq3.js} +1 -1
- package/dist/{virtual-modules-mnfbh5mr.js → virtual-modules-52km00d6.js} +2 -2
- package/dist/{work-objects-xz1a5rqk.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 +1323 -16
- package/package.json +5 -5
- package/plugin/commands/create-pr.md +2 -2
- package/plugin/pi-skills/create-pr/SKILL.md +2 -2
- package/src/assets/source-key.ts +95 -0
- package/src/be/db/api-keys.ts +80 -0
- package/src/be/db/approvals.ts +48 -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 +21 -6
- package/src/be/db/workflow-idempotency.ts +183 -0
- package/src/be/db/workflow-runs.ts +500 -7
- package/src/be/db-retention.ts +61 -6
- package/src/be/db.ts +126 -131
- package/src/be/memory/providers/openai-embedding.ts +5 -1
- package/src/be/migrations/242_workflow_idempotency_keys.sql +40 -0
- 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/sealed-json.ts +1 -0
- package/src/be/seed-scripts/catalog/compound-insights.inline.ts +2 -2
- package/src/be/seed-scripts/catalog/compound-insights.ts +2 -2
- package/src/be/seed-skills/bundled-files.generated.json +1 -1
- package/src/be/session-source-backfill.ts +163 -0
- package/src/be/sql-connections.ts +7 -1
- package/src/be/swarm-config-guard.ts +3 -0
- package/src/be/users.ts +9 -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/controller.ts +33 -0
- 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 +31 -6
- package/src/extensions/apply-task-create.ts +64 -11
- package/src/extensions/contract-types.generated.ts +1 -1
- package/src/extensions/contract.ts +30 -0
- package/src/extensions/dispatcher.ts +4 -0
- package/src/extensions/post-bridge.ts +8 -0
- package/src/hooks/context-bound-note.ts +196 -0
- package/src/hooks/hook.ts +12 -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 +49 -17
- package/src/http/core.ts +6 -0
- package/src/http/fleet-benchmark.ts +5 -2
- package/src/http/idempotency-key.ts +117 -0
- 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 +207 -33
- package/src/integrations/chat-sdk/inbound.ts +27 -0
- package/src/kv-reserved-namespaces.ts +19 -0
- package/src/prompts/context-bound-note.ts +48 -0
- package/src/prompts/session-templates.ts +25 -1
- package/src/providers/acp-targets.ts +1 -1
- package/src/providers/amp-adapter.ts +30 -8
- package/src/providers/claude-adapter.ts +34 -5
- package/src/providers/claude-managed-adapter.ts +42 -9
- package/src/providers/claude-sdk-session.ts +10 -0
- package/src/providers/claude-session-events.ts +13 -0
- package/src/providers/codex-adapter.ts +83 -11
- package/src/providers/opencode-adapter.ts +18 -0
- package/src/providers/pi-mono-adapter.ts +35 -0
- package/src/runtime-providers/docker.ts +6 -2
- 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 +52 -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/amp-adapter.test.ts +97 -0
- package/src/tests/api-keys-validation.test.ts +170 -0
- package/src/tests/approval-requests.test.ts +10 -7
- package/src/tests/approval-sweeps.test.ts +12 -6
- package/src/tests/base-prompt.test.ts +1 -1
- package/src/tests/claude-hook-output.test.ts +79 -1
- package/src/tests/claude-managed-adapter.test.ts +321 -0
- package/src/tests/claude-routes-e2e.test.ts +7 -2
- package/src/tests/codex-adapter.test.ts +163 -0
- 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/context-bound-note.test.ts +269 -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 +325 -0
- package/src/tests/fetch-resolved-env.test.ts +17 -0
- package/src/tests/fixtures/extensions/record-blocks/hooks.ts +10 -0
- package/src/tests/fixtures/extensions/record-blocks/manifest.json +7 -0
- 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/fixtures/fake-amp.ts +22 -8
- package/src/tests/fixtures/held-template-render.ts +42 -0
- package/src/tests/fixtures/workflow-idempotency-trigger.child.ts +73 -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/openapi-route-headers.test.ts +2 -0
- package/src/tests/opencode-adapter.test.ts +134 -0
- package/src/tests/openrouter-attribution-call-sites.test.ts +2 -2
- package/src/tests/org-website.test.ts +36 -0
- package/src/tests/pi-mono-adapter.test.ts +105 -0
- package/src/tests/prompt-template-session.test.ts +4 -3
- 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/runner-push-delivery.test.ts +25 -0
- package/src/tests/runtime-controller-liveness.test.ts +133 -0
- package/src/tests/runtime-providers-docker.test.ts +2 -0
- package/src/tests/script-connections.test.ts +5 -0
- package/src/tests/script-run-config-scope.test.ts +91 -3
- package/src/tests/script-runs-retention.test.ts +212 -0
- package/src/tests/sdk-allowlist.test.ts +39 -0
- package/src/tests/session-logs.test.ts +70 -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 +336 -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 +1341 -0
- package/src/tests/workflow-foreach-supersede-retry.test.ts +488 -0
- package/src/tests/workflow-http-v2.test.ts +131 -0
- package/src/tests/workflow-idempotency.test.ts +915 -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/cancel-workflow-run.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/context-window.ts +8 -6
- 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/approval-cancel.ts +15 -13
- package/src/workflows/approval-notifications.ts +5 -1
- package/src/workflows/checkpoint.ts +6 -3
- package/src/workflows/engine.ts +30 -8
- package/src/workflows/executors/foreach.ts +2 -2
- package/src/workflows/executors/sub-workflow.ts +8 -1
- package/src/workflows/foreach-driver.ts +10 -3
- package/src/workflows/foreach-join.ts +29 -6
- package/src/workflows/recovery.ts +6 -1
- package/src/workflows/resume.ts +168 -56
- package/src/workflows/retry-poller.ts +49 -3
- package/src/workflows/task-step-routing.ts +29 -7
- package/templates/ai-toolbox.manifest.json +8 -8
- package/templates/community/open-prompt-showreel/PLAYBOOK.md +5 -6
- package/templates/community/open-prompt-showreel/lead-prompt.md +1 -1
- package/templates/community/open-prompt-showreel/skills/open-prompt-showreel/SKILL.md +4 -4
- package/templates/skills/agent-browser/SKILL.md +4 -4
- package/templates/skills/agent-browser/content.md +4 -4
- package/templates/skills/code-quality/config.json +1 -1
- package/templates/skills/code-quality/content.md +2 -2
- package/templates/skills/delegate-work/content.md +29 -25
- package/templates/skills/delegate-work/files/scripts/codex-exec.sh +5 -5
- package/templates/skills/qa/content.md +2 -2
- package/templates/skills/researching/content.md +4 -0
- package/templates/skills/swarm-scripts/SKILL.md +1 -0
- package/templates/skills/swarm-scripts/content.md +1 -0
- package/templates/skills/work-on-task/SKILL.md +1 -1
- package/templates/skills/work-on-task/content.md +1 -1
- package/dist/cli-7421jzsw.js +0 -84
- package/dist/cli-e45e4m6b.js +0 -413
- package/dist/cli-zw88zjba.js +0 -307
- package/dist/handlers-19xr6dnz.js +0 -41
- package/dist/index-kw2mmat7.js +0 -43
- package/dist/lead-zyerk1x2.js +0 -79
- package/dist/render-v2-hgytz8nn.js +0 -12
- package/dist/worker-42t8emjt.js +0 -79
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
renderSteeringDelivery
|
|
3
|
-
} from "./cli-
|
|
3
|
+
} from "./cli-sxgtf5fw.js";
|
|
4
4
|
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,10 +37,7 @@ import {
|
|
|
30
37
|
injectTraceContext2,
|
|
31
38
|
initialize,
|
|
32
39
|
ensure
|
|
33
|
-
} from "./cli-
|
|
34
|
-
import {
|
|
35
|
-
getContextWindowSize
|
|
36
|
-
} from "./cli-a5ebc95n.js";
|
|
40
|
+
} from "./cli-g20jjwt4.js";
|
|
37
41
|
import {
|
|
38
42
|
MAX_RATE_LIMIT_RESET_MS,
|
|
39
43
|
isRateLimitMessage,
|
|
@@ -41,7 +45,7 @@ import {
|
|
|
41
45
|
CODEX_CREDITS_EXHAUSTED_COOLDOWN_MS,
|
|
42
46
|
resolveCodexCreditsExhaustedCooldownMs,
|
|
43
47
|
parseRateLimitResetTime
|
|
44
|
-
} from "./cli-
|
|
48
|
+
} from "./cli-7enjwya9.js";
|
|
45
49
|
import {
|
|
46
50
|
terminateRegisteredProcessGroups
|
|
47
51
|
} from "./cli-3ggwdtb0.js";
|
|
@@ -51,40 +55,44 @@ import {
|
|
|
51
55
|
canonicalAzureDevOpsRepoUrl,
|
|
52
56
|
parseAzureDevOpsRepoUrl,
|
|
53
57
|
resolveScriptsOnlyMode
|
|
54
|
-
} from "./cli-
|
|
58
|
+
} from "./cli-4hxrf0p4.js";
|
|
55
59
|
import {
|
|
56
60
|
ACP_TARGET_IDS,
|
|
57
61
|
isAcpTarget
|
|
58
|
-
} from "./cli-
|
|
62
|
+
} from "./cli-yvy48785.js";
|
|
59
63
|
import {
|
|
60
64
|
checkAmpCredentials2,
|
|
61
65
|
liveTestAmpCredentials2
|
|
62
|
-
} from "./cli-
|
|
66
|
+
} from "./cli-m5a9m0ak.js";
|
|
63
67
|
import {
|
|
64
68
|
checkClaudeCredentials2
|
|
65
|
-
} from "./cli-
|
|
69
|
+
} from "./cli-k21gx5ht.js";
|
|
66
70
|
import {
|
|
67
71
|
checkClaudeManagedCredentials2
|
|
68
|
-
} from "./cli-
|
|
72
|
+
} from "./cli-ffvsj2qw.js";
|
|
69
73
|
import {
|
|
70
74
|
codexUserHome,
|
|
71
75
|
checkCodexCredentials2
|
|
72
|
-
} from "./cli-
|
|
76
|
+
} from "./cli-ca6banwz.js";
|
|
73
77
|
import {
|
|
74
78
|
checkCursorCredentials2
|
|
75
|
-
} from "./cli-
|
|
79
|
+
} from "./cli-cz37jqss.js";
|
|
76
80
|
import {
|
|
77
81
|
checkDevinCredentials2
|
|
78
|
-
} from "./cli-
|
|
82
|
+
} from "./cli-39rrw8yp.js";
|
|
79
83
|
import {
|
|
80
84
|
checkDshCredentials2
|
|
81
|
-
} from "./cli-
|
|
85
|
+
} from "./cli-az25fn5f.js";
|
|
82
86
|
import {
|
|
83
87
|
checkOpencodeCredentials2
|
|
84
|
-
} from "./cli-
|
|
88
|
+
} from "./cli-9abdgn5t.js";
|
|
85
89
|
import {
|
|
86
90
|
checkGrokCredentials2
|
|
87
|
-
} from "./cli-
|
|
91
|
+
} from "./cli-m70bajzr.js";
|
|
92
|
+
import {
|
|
93
|
+
getContextWindowSize,
|
|
94
|
+
init_context_window
|
|
95
|
+
} from "./cli-pfk92eqz.js";
|
|
88
96
|
import {
|
|
89
97
|
CODEX_OAUTH_POOL_SLOTS_ENV,
|
|
90
98
|
isCodexOAuthConfigKey,
|
|
@@ -93,7 +101,7 @@ import {
|
|
|
93
101
|
} from "./cli-j4bwnpkm.js";
|
|
94
102
|
import {
|
|
95
103
|
validateJsonSchema
|
|
96
|
-
} from "./cli-
|
|
104
|
+
} from "./cli-3fwqy71j.js";
|
|
97
105
|
import {
|
|
98
106
|
mapTriggerSurface,
|
|
99
107
|
init_telemetry_context,
|
|
@@ -111,7 +119,7 @@ import {
|
|
|
111
119
|
init_vcs_repo_match,
|
|
112
120
|
isApiDrainingResponse,
|
|
113
121
|
init_api_drain
|
|
114
|
-
} from "./cli-
|
|
122
|
+
} from "./cli-g8ka5j4j.js";
|
|
115
123
|
import {
|
|
116
124
|
parseWorkerModelTierOverrides,
|
|
117
125
|
resolveTaskModelSelection,
|
|
@@ -119,7 +127,7 @@ import {
|
|
|
119
127
|
ProviderNameSchema,
|
|
120
128
|
WorkerNudgeSchema,
|
|
121
129
|
init_types
|
|
122
|
-
} from "./cli-
|
|
130
|
+
} from "./cli-4rf0f5vg.js";
|
|
123
131
|
import {
|
|
124
132
|
generateDefaultClaudeMd2,
|
|
125
133
|
generateDefaultSoulMd2,
|
|
@@ -143,50 +151,43 @@ import {
|
|
|
143
151
|
resolveClaudeMdPath,
|
|
144
152
|
syncProfileFilesToServer,
|
|
145
153
|
init_profile_sync
|
|
146
|
-
} from "./cli-
|
|
154
|
+
} from "./cli-hfeb68z4.js";
|
|
147
155
|
import {
|
|
148
156
|
isSteeringEnabled2,
|
|
149
157
|
init_steering_enabled
|
|
150
158
|
} from "./cli-4sydckyj.js";
|
|
151
159
|
import {
|
|
160
|
+
init_templates3
|
|
161
|
+
} from "./cli-j6rktc91.js";
|
|
162
|
+
import {
|
|
163
|
+
validateRoute,
|
|
164
|
+
deriveDefaultRoute,
|
|
165
|
+
init_src,
|
|
166
|
+
modelFamilyOf,
|
|
167
|
+
windowForModelFamily,
|
|
168
|
+
parseModelLimitMessage,
|
|
169
|
+
parseCreditsRequiredMessage,
|
|
170
|
+
init_model_rate_limit_windows,
|
|
171
|
+
CREDENTIAL_POOL_VARS,
|
|
152
172
|
normalizeProviderKeyAliases,
|
|
153
173
|
ModelWindowExhaustedError,
|
|
174
|
+
splitCredentialPool,
|
|
154
175
|
CLAUDE_CREDENTIALS_HINT,
|
|
155
176
|
resolveCredentialPools,
|
|
156
177
|
init_credentials
|
|
157
|
-
} from "./cli-
|
|
158
|
-
import {
|
|
159
|
-
init_templates3
|
|
160
|
-
} from "./cli-0ebey9hg.js";
|
|
178
|
+
} from "./cli-1tem6ns9.js";
|
|
161
179
|
import {
|
|
162
180
|
interpolate,
|
|
163
181
|
init_template,
|
|
164
182
|
configureHttpResolver,
|
|
165
183
|
resolveTemplateAsync,
|
|
166
184
|
init_resolver
|
|
167
|
-
} from "./cli-
|
|
168
|
-
import {
|
|
169
|
-
modelFamilyOf,
|
|
170
|
-
windowForModelFamily,
|
|
171
|
-
parseModelLimitMessage,
|
|
172
|
-
parseCreditsRequiredMessage,
|
|
173
|
-
init_model_rate_limit_windows
|
|
174
|
-
} from "./cli-7421jzsw.js";
|
|
175
|
-
import {
|
|
176
|
-
validateRoute,
|
|
177
|
-
deriveDefaultRoute,
|
|
178
|
-
init_src
|
|
179
|
-
} from "./cli-e45e4m6b.js";
|
|
180
|
-
import {
|
|
181
|
-
getOpenRouterBaseUrl,
|
|
182
|
-
getOpenRouterAttributionHeaders,
|
|
183
|
-
init_openrouter_base_url
|
|
184
|
-
} from "./cli-dfyv0jdy.js";
|
|
185
|
+
} from "./cli-dqygeeh5.js";
|
|
185
186
|
import {
|
|
186
187
|
runtimeHarnessSections,
|
|
187
188
|
refreshRuntimeModelCatalog,
|
|
188
189
|
init_runtime_model_catalog
|
|
189
|
-
} from "./cli-
|
|
190
|
+
} from "./cli-803188pb.js";
|
|
190
191
|
import {
|
|
191
192
|
getMcpBaseUrl,
|
|
192
193
|
init_constants2
|
|
@@ -204,7 +205,7 @@ import {
|
|
|
204
205
|
registerEnvSecrets,
|
|
205
206
|
registerSensitiveKeyName,
|
|
206
207
|
init_secret_scrubber
|
|
207
|
-
} from "./cli-
|
|
208
|
+
} from "./cli-708wdy32.js";
|
|
208
209
|
import {
|
|
209
210
|
harnessModelMismatch,
|
|
210
211
|
openAICompatibleProviders,
|
|
@@ -212,9 +213,10 @@ import {
|
|
|
212
213
|
providerBaseUrl,
|
|
213
214
|
providerKeyFromEnv,
|
|
214
215
|
init_src2
|
|
215
|
-
} from "./cli-
|
|
216
|
+
} from "./cli-gxee0bqa.js";
|
|
216
217
|
|
|
217
218
|
// src/commands/runner.ts
|
|
219
|
+
init_src();
|
|
218
220
|
import { existsSync, statSync } from "node:fs";
|
|
219
221
|
import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
|
|
220
222
|
init_base_prompt();
|
|
@@ -246,47 +248,47 @@ async function materializeCodexAuthJson(_slot, creds, deps = {}) {
|
|
|
246
248
|
async function createProviderAdapter(provider) {
|
|
247
249
|
switch (provider) {
|
|
248
250
|
case "claude": {
|
|
249
|
-
const { ClaudeAdapter } = await import("./claude-adapter-
|
|
251
|
+
const { ClaudeAdapter } = await import("./claude-adapter-nys1kjxa.js");
|
|
250
252
|
return new ClaudeAdapter;
|
|
251
253
|
}
|
|
252
254
|
case "pi": {
|
|
253
|
-
const { PiMonoAdapter } = await import("./pi-mono-adapter-
|
|
255
|
+
const { PiMonoAdapter } = await import("./pi-mono-adapter-mymbwhj0.js");
|
|
254
256
|
return new PiMonoAdapter;
|
|
255
257
|
}
|
|
256
258
|
case "codex": {
|
|
257
|
-
const { CodexAdapter } = await import("./codex-adapter-
|
|
259
|
+
const { CodexAdapter } = await import("./codex-adapter-d95q4qsn.js");
|
|
258
260
|
return new CodexAdapter;
|
|
259
261
|
}
|
|
260
262
|
case "claude-managed": {
|
|
261
|
-
const { ClaudeManagedAdapter } = await import("./claude-managed-adapter-
|
|
263
|
+
const { ClaudeManagedAdapter } = await import("./claude-managed-adapter-55207973.js");
|
|
262
264
|
return new ClaudeManagedAdapter;
|
|
263
265
|
}
|
|
264
266
|
case "devin": {
|
|
265
|
-
const { DevinAdapter } = await import("./devin-adapter-
|
|
267
|
+
const { DevinAdapter } = await import("./devin-adapter-byen2cxt.js");
|
|
266
268
|
return new DevinAdapter;
|
|
267
269
|
}
|
|
268
270
|
case "opencode": {
|
|
269
|
-
const { OpencodeAdapter } = await import("./opencode-adapter-
|
|
271
|
+
const { OpencodeAdapter } = await import("./opencode-adapter-esv3k9yn.js");
|
|
270
272
|
return new OpencodeAdapter;
|
|
271
273
|
}
|
|
272
274
|
case "dsh": {
|
|
273
|
-
const { DshAdapter } = await import("./dsh-adapter-
|
|
275
|
+
const { DshAdapter } = await import("./dsh-adapter-d4pdpb3r.js");
|
|
274
276
|
return new DshAdapter;
|
|
275
277
|
}
|
|
276
278
|
case "amp": {
|
|
277
|
-
const { AmpAdapter } = await import("./amp-adapter-
|
|
279
|
+
const { AmpAdapter } = await import("./amp-adapter-en0jy6hs.js");
|
|
278
280
|
return new AmpAdapter;
|
|
279
281
|
}
|
|
280
282
|
case "cursor": {
|
|
281
|
-
const { CursorAdapter } = await import("./cursor-adapter-
|
|
283
|
+
const { CursorAdapter } = await import("./cursor-adapter-4mr4jgkw.js");
|
|
282
284
|
return new CursorAdapter;
|
|
283
285
|
}
|
|
284
286
|
case "grok": {
|
|
285
|
-
const { GrokAdapter } = await import("./grok-adapter-
|
|
287
|
+
const { GrokAdapter } = await import("./grok-adapter-t08b9ntm.js");
|
|
286
288
|
return new GrokAdapter;
|
|
287
289
|
}
|
|
288
290
|
case "acp": {
|
|
289
|
-
const { ACPAdapter } = await import("./acp-adapter-
|
|
291
|
+
const { ACPAdapter } = await import("./acp-adapter-dgfakfpw.js");
|
|
290
292
|
return new ACPAdapter;
|
|
291
293
|
}
|
|
292
294
|
default:
|
|
@@ -503,6 +505,7 @@ init_codex_auth_failure();
|
|
|
503
505
|
init_config_env_export();
|
|
504
506
|
init_config_secrets();
|
|
505
507
|
init_constants2();
|
|
508
|
+
init_context_window();
|
|
506
509
|
init_credentials();
|
|
507
510
|
|
|
508
511
|
// src/utils/harness-cli-version.ts
|
|
@@ -1220,11 +1223,14 @@ async function reportCredentialOutcomeThenFinish(input, finish) {
|
|
|
1220
1223
|
await finish();
|
|
1221
1224
|
}
|
|
1222
1225
|
|
|
1226
|
+
// src/commands/credential-refresh.ts
|
|
1227
|
+
init_credentials();
|
|
1228
|
+
init_secret_scrubber();
|
|
1229
|
+
|
|
1223
1230
|
// src/commands/provider-credentials.ts
|
|
1224
1231
|
init_src2();
|
|
1225
1232
|
init_src();
|
|
1226
1233
|
init_credentials();
|
|
1227
|
-
init_openrouter_base_url();
|
|
1228
1234
|
init_secret_scrubber();
|
|
1229
1235
|
function isBedrockMode(env) {
|
|
1230
1236
|
const mode = env.BEDROCK_AUTH_MODE?.toLowerCase();
|
|
@@ -1267,7 +1273,7 @@ var CREDENTIAL_PROVIDER_CHECKERS = {
|
|
|
1267
1273
|
devin: (env) => checkDevinCredentials2(env),
|
|
1268
1274
|
opencode: (env, opts) => checkOpencodeCredentials2(env, opts),
|
|
1269
1275
|
pi: async (env, opts) => {
|
|
1270
|
-
const { checkPiMonoCredentials, listPiOpencodeGoModelIds } = await import("./pi-mono-adapter-
|
|
1276
|
+
const { checkPiMonoCredentials, listPiOpencodeGoModelIds } = await import("./pi-mono-adapter-mymbwhj0.js");
|
|
1271
1277
|
return {
|
|
1272
1278
|
...await checkPiMonoCredentials(env, opts),
|
|
1273
1279
|
opencodeGoModels: listPiOpencodeGoModelIds()
|
|
@@ -1300,27 +1306,6 @@ async function checkProviderCredentials(provider, env, opts) {
|
|
|
1300
1306
|
}
|
|
1301
1307
|
return checker(env, opts);
|
|
1302
1308
|
}
|
|
1303
|
-
var LIVE_TEST_TIMEOUT_MS = 5000;
|
|
1304
|
-
async function timedFetch(url, init) {
|
|
1305
|
-
const controller = new AbortController;
|
|
1306
|
-
const timer = setTimeout(() => controller.abort(), LIVE_TEST_TIMEOUT_MS);
|
|
1307
|
-
const start = Date.now();
|
|
1308
|
-
try {
|
|
1309
|
-
const res = await fetch(url, { ...init, signal: controller.signal });
|
|
1310
|
-
let bodyText = "";
|
|
1311
|
-
try {
|
|
1312
|
-
bodyText = await res.text();
|
|
1313
|
-
} catch {}
|
|
1314
|
-
return {
|
|
1315
|
-
ok: res.ok,
|
|
1316
|
-
status: res.status,
|
|
1317
|
-
bodyText,
|
|
1318
|
-
latency_ms: Date.now() - start
|
|
1319
|
-
};
|
|
1320
|
-
} finally {
|
|
1321
|
-
clearTimeout(timer);
|
|
1322
|
-
}
|
|
1323
|
-
}
|
|
1324
1309
|
function asLiveError(err, latency_ms) {
|
|
1325
1310
|
const raw = err instanceof Error ? err.message : String(err);
|
|
1326
1311
|
return {
|
|
@@ -1329,75 +1314,56 @@ function asLiveError(err, latency_ms) {
|
|
|
1329
1314
|
latency_ms
|
|
1330
1315
|
};
|
|
1331
1316
|
}
|
|
1332
|
-
async function
|
|
1333
|
-
const
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
};
|
|
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 };
|
|
1344
1363
|
}
|
|
1345
1364
|
function presenceCheckOk() {
|
|
1346
1365
|
return { ok: true, latency_ms: 0 };
|
|
1347
1366
|
}
|
|
1348
|
-
async function checkOpenAiApiKey(apiKey) {
|
|
1349
|
-
const r = await timedFetch("https://api.openai.com/v1/models", {
|
|
1350
|
-
method: "GET",
|
|
1351
|
-
headers: { Authorization: `Bearer ${apiKey}` }
|
|
1352
|
-
});
|
|
1353
|
-
if (r.ok)
|
|
1354
|
-
return { ok: true, latency_ms: r.latency_ms };
|
|
1355
|
-
return {
|
|
1356
|
-
ok: false,
|
|
1357
|
-
error: scrubSecrets(`HTTP ${r.status}: ${r.bodyText.slice(0, 200)}`),
|
|
1358
|
-
latency_ms: r.latency_ms
|
|
1359
|
-
};
|
|
1360
|
-
}
|
|
1361
|
-
async function checkXaiApiKey(apiKey) {
|
|
1362
|
-
const r = await timedFetch("https://api.x.ai/v1/models", {
|
|
1363
|
-
method: "GET",
|
|
1364
|
-
headers: { Authorization: `Bearer ${apiKey}` }
|
|
1365
|
-
});
|
|
1366
|
-
if (r.ok)
|
|
1367
|
-
return { ok: true, latency_ms: r.latency_ms };
|
|
1368
|
-
return {
|
|
1369
|
-
ok: false,
|
|
1370
|
-
error: scrubSecrets(`HTTP ${r.status}: ${r.bodyText.slice(0, 200)}`),
|
|
1371
|
-
latency_ms: r.latency_ms
|
|
1372
|
-
};
|
|
1373
|
-
}
|
|
1374
|
-
async function checkOpenRouter(apiKey) {
|
|
1375
|
-
const url = `${getOpenRouterBaseUrl()}/models`;
|
|
1376
|
-
const r = await timedFetch(url, {
|
|
1377
|
-
method: "GET",
|
|
1378
|
-
headers: { ...getOpenRouterAttributionHeaders(url), Authorization: `Bearer ${apiKey}` }
|
|
1379
|
-
});
|
|
1380
|
-
if (r.ok)
|
|
1381
|
-
return { ok: true, latency_ms: r.latency_ms };
|
|
1382
|
-
return {
|
|
1383
|
-
ok: false,
|
|
1384
|
-
error: scrubSecrets(`HTTP ${r.status}: ${r.bodyText.slice(0, 200)}`),
|
|
1385
|
-
latency_ms: r.latency_ms
|
|
1386
|
-
};
|
|
1387
|
-
}
|
|
1388
|
-
async function checkOpenAICompatibleProvider(provider, apiKey, baseUrl = provider.baseUrl) {
|
|
1389
|
-
const r = await timedFetch(`${baseUrl.replace(/\/+$/, "")}/models`, {
|
|
1390
|
-
method: "GET",
|
|
1391
|
-
headers: { Authorization: `Bearer ${apiKey}` }
|
|
1392
|
-
});
|
|
1393
|
-
if (r.ok)
|
|
1394
|
-
return { ok: true, latency_ms: r.latency_ms };
|
|
1395
|
-
return {
|
|
1396
|
-
ok: false,
|
|
1397
|
-
error: scrubSecrets(`HTTP ${r.status}: ${r.bodyText.slice(0, 200)}`),
|
|
1398
|
-
latency_ms: r.latency_ms
|
|
1399
|
-
};
|
|
1400
|
-
}
|
|
1401
1367
|
function codexAuthFileExists(env) {
|
|
1402
1368
|
return checkCodexCredentials2(env).satisfiedBy === "file";
|
|
1403
1369
|
}
|
|
@@ -1424,17 +1390,32 @@ async function validateProviderCredentials(provider, env = process.env, presence
|
|
|
1424
1390
|
latency_ms: Date.now() - startedAt
|
|
1425
1391
|
};
|
|
1426
1392
|
}
|
|
1427
|
-
const
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
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);
|
|
1434
1414
|
}
|
|
1435
1415
|
case "claude-managed": {
|
|
1436
|
-
if (env.ANTHROPIC_API_KEY)
|
|
1437
|
-
return
|
|
1416
|
+
if (env.ANTHROPIC_API_KEY) {
|
|
1417
|
+
return checkEachKey("ANTHROPIC_API_KEY", env.ANTHROPIC_API_KEY, checkAnthropicApiKey);
|
|
1418
|
+
}
|
|
1438
1419
|
return {
|
|
1439
1420
|
ok: false,
|
|
1440
1421
|
error: "ANTHROPIC_API_KEY is not set.",
|
|
@@ -1442,14 +1423,30 @@ async function validateProviderCredentials(provider, env = process.env, presence
|
|
|
1442
1423
|
};
|
|
1443
1424
|
}
|
|
1444
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
|
+
}
|
|
1445
1441
|
if (codexAuthFileExists(env))
|
|
1446
1442
|
return presenceCheckOk();
|
|
1447
1443
|
if (parseCodexOAuthAccess(env.CODEX_OAUTH))
|
|
1448
1444
|
return presenceCheckOk();
|
|
1449
1445
|
if (hasCodexOAuthPoolSlots(env))
|
|
1450
1446
|
return presenceCheckOk();
|
|
1451
|
-
if (env.OPENAI_API_KEY)
|
|
1452
|
-
return
|
|
1447
|
+
if (env.OPENAI_API_KEY) {
|
|
1448
|
+
return checkEachKey("OPENAI_API_KEY", env.OPENAI_API_KEY, checkOpenAiApiKey);
|
|
1449
|
+
}
|
|
1453
1450
|
return {
|
|
1454
1451
|
ok: false,
|
|
1455
1452
|
error: "No codex credential found (no ~/.codex/auth.json, CODEX_OAUTH, or OPENAI_API_KEY).",
|
|
@@ -1464,16 +1461,19 @@ async function validateProviderCredentials(provider, env = process.env, presence
|
|
|
1464
1461
|
const status = presence ?? await checkProviderCredentials(provider, env);
|
|
1465
1462
|
if (status.ready && status.satisfiedBy === "file")
|
|
1466
1463
|
return presenceCheckOk();
|
|
1467
|
-
if (env.OPENROUTER_API_KEY)
|
|
1468
|
-
return
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
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
|
+
}
|
|
1473
1473
|
for (const direct of openAICompatibleProviders()) {
|
|
1474
1474
|
const key = providerKeyFromEnv(direct, env);
|
|
1475
1475
|
if (key) {
|
|
1476
|
-
return
|
|
1476
|
+
return checkEachKey(direct.envVar, key, (member) => checkOpenAICompatibleProvider(direct, member, providerBaseUrl(direct, env)));
|
|
1477
1477
|
}
|
|
1478
1478
|
}
|
|
1479
1479
|
if (status.ready)
|
|
@@ -1494,27 +1494,37 @@ async function validateProviderCredentials(provider, env = process.env, presence
|
|
|
1494
1494
|
};
|
|
1495
1495
|
}
|
|
1496
1496
|
const baseUrl = env.DEVIN_API_BASE_URL ?? "https://api.devin.ai";
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
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
|
+
};
|
|
1503
1513
|
});
|
|
1504
|
-
if (r.ok)
|
|
1505
|
-
return { ok: true, latency_ms: r.latency_ms };
|
|
1506
|
-
return {
|
|
1507
|
-
ok: false,
|
|
1508
|
-
error: scrubSecrets(`HTTP ${r.status}: ${r.bodyText.slice(0, 200)}`),
|
|
1509
|
-
latency_ms: r.latency_ms
|
|
1510
|
-
};
|
|
1511
1514
|
}
|
|
1512
|
-
case "dsh":
|
|
1513
|
-
|
|
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 {
|
|
1514
1523
|
ok: false,
|
|
1515
1524
|
error: "Set DEEPSEEK_API_KEY or OPENROUTER_API_KEY for dsh.",
|
|
1516
1525
|
latency_ms: Date.now() - startedAt
|
|
1517
1526
|
};
|
|
1527
|
+
}
|
|
1518
1528
|
case "amp": {
|
|
1519
1529
|
if (!checkAmpCredentials2(env).ready) {
|
|
1520
1530
|
return {
|
|
@@ -1523,12 +1533,15 @@ async function validateProviderCredentials(provider, env = process.env, presence
|
|
|
1523
1533
|
latency_ms: Date.now() - startedAt
|
|
1524
1534
|
};
|
|
1525
1535
|
}
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
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
|
+
});
|
|
1532
1545
|
}
|
|
1533
1546
|
case "cursor": {
|
|
1534
1547
|
const apiKey = env.CURSOR_API_KEY?.trim();
|
|
@@ -1539,17 +1552,21 @@ async function validateProviderCredentials(provider, env = process.env, presence
|
|
|
1539
1552
|
latency_ms: Date.now() - startedAt
|
|
1540
1553
|
};
|
|
1541
1554
|
}
|
|
1542
|
-
const { liveTestCursorKey } = await import("./cursor-adapter-
|
|
1543
|
-
|
|
1544
|
-
|
|
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
|
+
});
|
|
1545
1561
|
}
|
|
1546
1562
|
case "grok": {
|
|
1547
1563
|
const apiKey = env.XAI_API_KEY?.trim();
|
|
1548
1564
|
if (apiKey)
|
|
1549
|
-
return
|
|
1565
|
+
return checkEachKey("XAI_API_KEY", apiKey, checkXaiApiKey);
|
|
1550
1566
|
const openRouterKey = env.OPENROUTER_API_KEY?.trim();
|
|
1551
|
-
if (openRouterKey)
|
|
1552
|
-
return
|
|
1567
|
+
if (openRouterKey) {
|
|
1568
|
+
return checkEachKey("OPENROUTER_API_KEY", openRouterKey, checkOpenRouter);
|
|
1569
|
+
}
|
|
1553
1570
|
return {
|
|
1554
1571
|
ok: false,
|
|
1555
1572
|
error: "Set XAI_API_KEY or OPENROUTER_API_KEY for grok.",
|
|
@@ -1581,7 +1598,9 @@ async function buildCredStatusReport(provider, env, opts = {}, kind) {
|
|
|
1581
1598
|
ok: live.ok,
|
|
1582
1599
|
error: live.error ?? null,
|
|
1583
1600
|
latency_ms: live.latency_ms,
|
|
1584
|
-
testedAt: Date.now()
|
|
1601
|
+
testedAt: Date.now(),
|
|
1602
|
+
...live.warning !== undefined ? { warning: live.warning } : {},
|
|
1603
|
+
...live.keys !== undefined ? { keys: live.keys } : {}
|
|
1585
1604
|
};
|
|
1586
1605
|
}
|
|
1587
1606
|
const bedrock = presence.bedrockRegion !== undefined ? {
|
|
@@ -1676,13 +1695,56 @@ function buildLatestModelReport(opts) {
|
|
|
1676
1695
|
|
|
1677
1696
|
// src/commands/credential-refresh.ts
|
|
1678
1697
|
var CREDENTIAL_RETRY_INTERVAL_MS = 30000;
|
|
1698
|
+
var KEY_RECHECK_INTERVAL_MS = 10 * 60000;
|
|
1679
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
|
+
}
|
|
1680
1739
|
async function refreshCredentialStatus(api, state, harnessProvider, env, now = Date.now()) {
|
|
1681
1740
|
if (isCredCheckDisabled(env) || state.inFlight)
|
|
1682
1741
|
return;
|
|
1683
1742
|
const providerChanged = state.harnessProvider !== harnessProvider;
|
|
1743
|
+
const fingerprint = credentialFingerprint(env);
|
|
1744
|
+
const fingerprintChanged = state.fingerprint !== fingerprint;
|
|
1684
1745
|
const retryDue = state.ready !== true && now - state.lastRefreshAt >= CREDENTIAL_RETRY_INTERVAL_MS;
|
|
1685
|
-
|
|
1746
|
+
const keyRecheckDue = state.rejectedKeys > 0 && now - state.lastRefreshAt >= KEY_RECHECK_INTERVAL_MS;
|
|
1747
|
+
if (!providerChanged && !fingerprintChanged && !retryDue && !keyRecheckDue && !shouldRefreshBedrockStatus({
|
|
1686
1748
|
harnessProvider,
|
|
1687
1749
|
env,
|
|
1688
1750
|
lastRefreshAt: state.lastRefreshAt,
|
|
@@ -1704,8 +1766,14 @@ async function refreshCredentialStatus(api, state, harnessProvider, env, now = D
|
|
|
1704
1766
|
missing: snapshot.missing,
|
|
1705
1767
|
credStatus: snapshot
|
|
1706
1768
|
});
|
|
1707
|
-
if (state.harnessProvider === harnessProvider)
|
|
1769
|
+
if (state.harnessProvider === harnessProvider) {
|
|
1708
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
|
+
}
|
|
1709
1777
|
} finally {
|
|
1710
1778
|
state.inFlight = false;
|
|
1711
1779
|
}
|
|
@@ -1733,7 +1801,7 @@ function resolveBackoff(override, env) {
|
|
|
1733
1801
|
};
|
|
1734
1802
|
return {
|
|
1735
1803
|
initialMs: override?.initialMs ?? parsePositive(env.BOOT_INITIAL_BACKOFF_MS, 2000),
|
|
1736
|
-
maxMs: override?.maxMs ?? parsePositive(env.BOOT_MAX_BACKOFF_MS,
|
|
1804
|
+
maxMs: override?.maxMs ?? parsePositive(env.BOOT_MAX_BACKOFF_MS, 1e4),
|
|
1737
1805
|
maxWaitSeconds: override?.maxWaitSeconds ?? parsePositive(env.BOOT_MAX_WAIT_SECONDS, 0)
|
|
1738
1806
|
};
|
|
1739
1807
|
}
|
|
@@ -2497,6 +2565,7 @@ async function fetchResolvedEnv(apiUrl, apiKey, agentId, baseEnv = process.env,
|
|
|
2497
2565
|
env
|
|
2498
2566
|
});
|
|
2499
2567
|
const effectiveModel = modelSelection.model || env.MODEL_OVERRIDE || "";
|
|
2568
|
+
const credentialEnv = { ...env };
|
|
2500
2569
|
const credentialSelections = await resolveCredentialPools(env, {
|
|
2501
2570
|
apiUrl,
|
|
2502
2571
|
apiKey,
|
|
@@ -2505,7 +2574,7 @@ async function fetchResolvedEnv(apiUrl, apiKey, agentId, baseEnv = process.env,
|
|
|
2505
2574
|
localBlocks: sessionContext?.localBlocks,
|
|
2506
2575
|
enforceModelCapacity: sessionContext?.enforceModelCapacity
|
|
2507
2576
|
});
|
|
2508
|
-
return { env, credentialSelections, resolvedProvider, scriptsOnlyConfigValue };
|
|
2577
|
+
return { env, credentialEnv, credentialSelections, resolvedProvider, scriptsOnlyConfigValue };
|
|
2509
2578
|
}
|
|
2510
2579
|
async function ensureAgentFsCredentials(apiUrl, apiKey, agentId) {
|
|
2511
2580
|
if (!apiUrl || !apiKey || !agentId || agentId === "unknown")
|
|
@@ -3910,6 +3979,8 @@ async function pollForTriggerOnce(opts) {
|
|
|
3910
3979
|
headers["X-Model-Tier-Overrides"] = encodeURIComponent(JSON.stringify(workerModelTierOverrides(opts.harnessProvider)));
|
|
3911
3980
|
}
|
|
3912
3981
|
while (Date.now() - startTime < opts.pollTimeout) {
|
|
3982
|
+
if (opts.shouldStop?.())
|
|
3983
|
+
return null;
|
|
3913
3984
|
try {
|
|
3914
3985
|
let url = `${opts.apiUrl}/api/poll`;
|
|
3915
3986
|
if (opts.since) {
|
|
@@ -4320,7 +4391,7 @@ async function spawnProviderProcess(adapter, opts, logDir, isYolo) {
|
|
|
4320
4391
|
const sessionEffort = effectiveReasoningEffort(adapter.name, model, reasoningEffortOverride);
|
|
4321
4392
|
let oauthSelection;
|
|
4322
4393
|
let oauthIsPoolBacked = false;
|
|
4323
|
-
if (adapter.name === "codex") {
|
|
4394
|
+
if (adapter.name === "codex" && !deriveDefaultRoute("codex", freshEnv)) {
|
|
4324
4395
|
const oauthInfo = await resolveCodexOAuthCredentialInfo(opts.apiUrl, opts.apiKey);
|
|
4325
4396
|
oauthSelection = oauthInfo?.selection;
|
|
4326
4397
|
oauthIsPoolBacked = oauthInfo?.isPoolBacked ?? false;
|
|
@@ -5430,8 +5501,11 @@ ${additionalSystemPrompt}` : basePrompt;
|
|
|
5430
5501
|
harnessProvider: null,
|
|
5431
5502
|
ready: null,
|
|
5432
5503
|
lastRefreshAt: 0,
|
|
5433
|
-
inFlight: false
|
|
5504
|
+
inFlight: false,
|
|
5505
|
+
fingerprint: null,
|
|
5506
|
+
rejectedKeys: 0
|
|
5434
5507
|
};
|
|
5508
|
+
let latestCredentialEnv;
|
|
5435
5509
|
let lastHarnessReconcileAt = 0;
|
|
5436
5510
|
const HARNESS_RECONCILE_INTERVAL_MS = 1e4;
|
|
5437
5511
|
let lastServerCapsRefreshAt = 0;
|
|
@@ -5646,6 +5720,11 @@ ${additionalSystemPrompt}` : basePrompt;
|
|
|
5646
5720
|
credentialRefreshState.harnessProvider = state.harnessProvider;
|
|
5647
5721
|
credentialRefreshState.ready = bootCredSnapshot?.ready ?? true;
|
|
5648
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);
|
|
5649
5728
|
} catch (error) {
|
|
5650
5729
|
console.error(`[${role}] Failed to report credential readiness after recovery: ${error}`);
|
|
5651
5730
|
process.exit(1);
|
|
@@ -6070,9 +6149,11 @@ ${additionalSystemPrompt}` : basePrompt;
|
|
|
6070
6149
|
try {
|
|
6071
6150
|
const {
|
|
6072
6151
|
env: freshEnv,
|
|
6152
|
+
credentialEnv,
|
|
6073
6153
|
resolvedProvider,
|
|
6074
6154
|
scriptsOnlyConfigValue
|
|
6075
6155
|
} = await fetchResolvedEnv(apiUrl, apiKey, agentId);
|
|
6156
|
+
latestCredentialEnv = credentialEnv;
|
|
6076
6157
|
const nextScriptsOnly = resolveScriptsOnlyMode({
|
|
6077
6158
|
env: process.env.SCRIPTS_ONLY_MCP,
|
|
6078
6159
|
configValue: scriptsOnlyConfigValue
|
|
@@ -6085,7 +6166,7 @@ ${additionalSystemPrompt}` : basePrompt;
|
|
|
6085
6166
|
console.warn(`[${role}] [harness] Reconcile fetch failed (non-fatal): ${err}`);
|
|
6086
6167
|
}
|
|
6087
6168
|
}
|
|
6088
|
-
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}`));
|
|
6089
6170
|
const now = Date.now();
|
|
6090
6171
|
for (const [taskId, task] of state.activeTasks) {
|
|
6091
6172
|
if (vcsDetectedTasks.has(taskId))
|
|
@@ -6120,7 +6201,7 @@ ${additionalSystemPrompt}` : basePrompt;
|
|
|
6120
6201
|
push: deliveryChecks.push,
|
|
6121
6202
|
activeCount: state.activeTasks.size,
|
|
6122
6203
|
maxConcurrent: exitAfterTasks === null ? state.maxConcurrent : Math.min(state.maxConcurrent, Math.max(0, exitAfterTasks - state.tasksProcessed)),
|
|
6123
|
-
draining: state.apiDraining,
|
|
6204
|
+
draining: state.apiDraining || shuttingDown,
|
|
6124
6205
|
lastPushPingAt,
|
|
6125
6206
|
pollInterval: PollIntervalMs
|
|
6126
6207
|
});
|
|
@@ -6147,6 +6228,7 @@ ${additionalSystemPrompt}` : basePrompt;
|
|
|
6147
6228
|
runtimeInstanceId,
|
|
6148
6229
|
pollTimeout: effectiveTimeout,
|
|
6149
6230
|
singlePoll: schedule.singlePoll,
|
|
6231
|
+
shouldStop: () => shuttingDown,
|
|
6150
6232
|
onPollFailure,
|
|
6151
6233
|
harnessProvider: state.harnessProvider,
|
|
6152
6234
|
onApiDrainSignal: (draining) => applyApiDrainSignal(state, role, draining)
|