@desplega.ai/agent-swarm 1.149.1 → 1.151.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 +18 -3
- package/dist/{acp-adapter-vhkzfpjg.js → acp-adapter-ex8hzjfc.js} +5 -5
- package/dist/{actions-9d2694yk.js → actions-2bgpyhww.js} +39 -11
- package/dist/{app-fq2ggynt.js → app-1706zhr1.js} +7 -7
- package/dist/{artifact-gj9arwrr.js → artifact-td4q4dch.js} +1 -1
- package/dist/{assistant-edb6n9nn.js → assistant-bavke5p7.js} +44 -20
- package/dist/{azure-openai-responses-cqar64rc.js → azure-openai-responses-f38x2avq.js} +13 -13
- package/dist/{boot-reembed-msweabbp.js → boot-reembed-3cmrrmpa.js} +9 -9
- package/dist/{boot-reembed-q5wd3tha.js → boot-reembed-nafcmmmc.js} +14 -16
- package/dist/{boot-scrub-logs-3g1az933.js → boot-scrub-logs-cd6a2sq0.js} +5 -5
- package/dist/{claude-adapter-v3rnzsdc.js → claude-adapter-wfp2gzvz.js} +15 -16
- package/dist/{claude-managed-adapter-qvsmh6mv.js → claude-managed-adapter-dsmkcrjy.js} +3 -3
- package/dist/{claude-sdk-session-qxrpsna1.js → claude-sdk-session-bht9jjak.js} +15 -16
- package/dist/{cli-5m0qmvdp.js → cli-0qb1z6s2.js} +1 -1
- package/dist/{cli-9d8ntetj.js → cli-2658f6at.js} +1 -1
- package/dist/{cli-7evafqvy.js → cli-2tbvf1z1.js} +85 -69
- package/dist/{cli-k351hv5k.js → cli-3v9xhjcn.js} +24 -12
- package/dist/{cli-1ebpar1q.js → cli-4wppfkcm.js} +350 -20
- package/dist/{cli-4260r1tg.js → cli-5jd2z7av.js} +97 -84
- package/dist/{cli-cv7s5zdq.js → cli-5tpgq60f.js} +9865 -715
- package/dist/{cli-6skz3rk8.js → cli-7tgcstn2.js} +9 -4
- package/dist/{cli-01g3x1ca.js → cli-9004vfdf.js} +108 -56
- package/dist/{cli-1c94wvcw.js → cli-a1z3h107.js} +124 -99
- package/dist/{cli-9br8ypfv.js → cli-czjtgfys.js} +2 -2
- package/dist/{cli-5my3bjsd.js → cli-d3p82erb.js} +7 -7
- package/dist/{cli-e29gmdmw.js → cli-dv6cdjs2.js} +2 -1
- package/dist/{cli-wby1xnnb.js → cli-f1wky6zp.js} +1 -1
- package/dist/{cli-zvz62chv.js → cli-fm4ytsdk.js} +4 -4
- package/dist/{cli-tg8qj8ee.js → cli-frcta2w4.js} +6 -6
- package/dist/{cli-7xx10h0a.js → cli-g69fdc9g.js} +2 -2
- package/dist/{cli-cmp8g3sw.js → cli-gbfwcd3k.js} +44 -9
- package/dist/{handlers-nsg0bcye.js → cli-gjyvhmmh.js} +97 -45
- package/dist/{cli-08b07b4r.js → cli-ht5rs63n.js} +1 -1
- package/dist/{cli-jecc01cb.js → cli-j4nv2wqy.js} +2 -4
- package/dist/{cli-cd60fv6j.js → cli-j9xczhaq.js} +1 -1
- package/dist/cli-pf9q3696.js +172 -0
- package/dist/{cli-xm87hzbw.js → cli-pgj4a5fb.js} +1 -1
- package/dist/{cli-jezx9b9c.js → cli-ppm4975n.js} +9 -3
- package/dist/{cli-3z634pqe.js → cli-q88st9aj.js} +2 -2
- package/dist/{cli-3sysyjve.js → cli-r2q6pevn.js} +142 -49
- package/dist/{cli-07jd68a1.js → cli-re8z5p8p.js} +1 -1
- package/dist/{cli-qgd4sqz5.js → cli-s14agm5s.js} +121 -14
- package/dist/{cli-svbrpf5q.js → cli-sjaae6ff.js} +9872 -424
- package/dist/{cli-73gq0zxn.js → cli-vwm416m6.js} +13 -13
- package/dist/{cli-4wtq5jjv.js → cli-wbyk465z.js} +1 -1
- package/dist/{cli-3apbzgyk.js → cli-z61ykvam.js} +19 -14
- package/dist/{cli-e06a8a7y.js → cli-zkxymas5.js} +4 -3
- package/dist/cli.js +26 -25
- package/dist/{codex-adapter-jyw7a91z.js → codex-adapter-jjjk8w4m.js} +8 -9
- package/dist/{codex-hook-hfrt9shr.js → codex-hook-8jexc34x.js} +3 -3
- package/dist/{codex-session-runner-bmngj0s5.js → codex-session-runner-nd6ayxkx.js} +8 -9
- package/dist/{commands-n755g391.js → commands-9v4psyq1.js} +5 -5
- package/dist/{db-s1cgh5gv.js → db-wnt58tpe.js} +5 -5
- package/dist/dispatcher-05jh1aqk.js +74 -0
- package/dist/{e2b-p04vmtx0.js → e2b-413b8t4v.js} +1 -1
- package/dist/{google-generative-ai-tsskx7te.js → google-generative-ai-ndjmj5fa.js} +7 -7
- package/dist/{google-vertex-ppw8ydpa.js → google-vertex-fr665tqs.js} +10 -10
- package/dist/handlers-tw90pkh5.js +65 -0
- package/dist/{hook-jf0xe8zh.js → hook-123e2scb.js} +11 -12
- package/dist/{hook-h9cqrm8q.js → hook-sxe3r349.js} +11 -12
- package/dist/{http-nc6pydw5.js → http-ecsar8ez.js} +1442 -581
- package/dist/{index-ezxkds2n.js → index-16js521z.js} +335 -107
- package/dist/{index-769nc012.js → index-hw26vj40.js} +25 -19
- package/dist/{index-0wdy6gwc.js → index-nnrbpcjp.js} +25 -17
- package/dist/index-ymn7em0p.js +25 -0
- package/dist/{index-x1zcj09z.js → index-zj518gf9.js} +26 -20
- package/dist/{keepalive-nesm3xb6.js → keepalive-asqtcm4y.js} +7 -7
- package/dist/{lead-bwy6t2za.js → lead-xbfr7fvt.js} +40 -48
- package/dist/{maintenance-8w393zf0.js → maintenance-qma55qvw.js} +9 -9
- package/dist/{oauth-refresh-sweep-sh8xjy08.js → oauth-refresh-sweep-3s04c6qw.js} +6 -6
- package/dist/{onboard-25ps29h1.js → onboard-drskd386.js} +13 -4
- package/dist/{openai-codex-responses-g7w48y30.js → openai-codex-responses-wy6a43wd.js} +13 -13
- package/dist/{openai-responses-nmeyptke.js → openai-responses-6xwf7bzg.js} +19 -19
- package/dist/{opencode-adapter-dce4wskd.js → opencode-adapter-28axqa09.js} +4 -4
- package/dist/{otel-impl-b93gxnz5.js → otel-impl-943c96er.js} +1 -1
- package/dist/{pi-mono-adapter-zvshk5cj.js → pi-mono-adapter-jcqt71cg.js} +17 -19
- package/dist/{pricing-refresh-5v56x7gb.js → pricing-refresh-mx51az05.js} +7 -7
- package/dist/{rbac-roles-x55cnezn.js → rbac-roles-78baecqd.js} +13 -9
- package/dist/{rbac-roles-0p0s6pbj.js → rbac-roles-wcmrg6sv.js} +7 -7
- package/dist/{render-v2-hyd45w8b.js → render-v2-8zjntgf5.js} +7 -7
- package/dist/{seed-pricing-49gbgn96.js → seed-pricing-jqjs6cws.js} +6 -6
- package/dist/{setup-qvq64vzq.js → setup-4pks0vfk.js} +2 -2
- package/dist/work-objects-wangt792.js +165 -0
- package/dist/{worker-scj60cxg.js → worker-p2mr422x.js} +40 -48
- package/openapi.json +1365 -268
- package/package.json +4 -3
- package/src/agentmail/handlers.ts +95 -66
- package/src/be/budget-refusal-notify.ts +1 -0
- package/src/be/db/tasks/read.ts +3 -0
- package/src/be/db/tasks/write.ts +13 -1
- package/src/be/db-client.ts +5 -0
- package/src/be/db.ts +15 -5
- package/src/be/extensions/db.ts +461 -0
- package/src/be/extensions/validate.ts +107 -0
- package/src/be/memory/boot-reembed.ts +17 -12
- package/src/be/memory/index.ts +12 -0
- package/src/be/memory/providers/openai-embedding.ts +4 -0
- package/src/be/memory/types.ts +2 -0
- package/src/be/migrations/153_deferred_task_wait_members.sql +25 -0
- package/src/be/migrations/154_routing_source.sql +3 -0
- package/src/be/migrations/155_extensions.sql +66 -0
- package/src/be/migrations/156_inbox_item_state_read_at.sql +7 -0
- package/src/be/rbac-roles.ts +3 -2
- package/src/be/scripts/typecheck.ts +59 -41
- package/src/be/seed/schedules-seeder.ts +25 -2
- package/src/be/seed/workflows-seeder.ts +17 -0
- package/src/be/seed-scripts/catalog/delegate.ts +3 -1
- package/src/be/seed-skills/bundled-files.generated.json +1 -1
- package/src/be/seed-skills/index.ts +7 -0
- package/src/be/steering.ts +1 -0
- package/src/be/swarm-config-guard.ts +3 -1
- package/src/commands/credential-refresh.ts +70 -0
- package/src/commands/onboard/compose-generator.ts +14 -2
- package/src/commands/onboard/env-generator.ts +7 -0
- package/src/commands/provider-credentials.ts +2 -25
- package/src/commands/runner.ts +24 -57
- package/src/extensions/apply-task-create.ts +135 -0
- package/src/extensions/bundle-path.ts +10 -0
- package/src/extensions/contract-runtime.ts +7 -0
- package/src/extensions/contract-types.generated.ts +4 -0
- package/src/extensions/contract.ts +270 -0
- package/src/extensions/ctx.ts +186 -0
- package/src/extensions/dispatcher.ts +479 -0
- package/src/extensions/identity.ts +44 -0
- package/src/extensions/lifecycle.ts +281 -0
- package/src/extensions/loader.ts +207 -0
- package/src/extensions/post-bridge.ts +161 -0
- package/src/github/handlers.ts +185 -140
- package/src/gitlab/handlers.ts +97 -77
- package/src/heartbeat/heartbeat.ts +155 -83
- package/src/http/agents.ts +1 -1
- package/src/http/all-routes.ts +1 -0
- package/src/http/approval-requests.ts +1 -0
- package/src/http/apps.ts +14 -9
- package/src/http/config.ts +4 -1
- package/src/http/core.ts +38 -2
- package/src/http/extensions.ts +547 -0
- package/src/http/inbox-state.ts +2 -0
- package/src/http/index.ts +41 -3
- package/src/http/mcp-bridge.ts +96 -62
- package/src/http/mcp.ts +1 -1
- package/src/http/script-runs.ts +5 -0
- package/src/http/status.ts +6 -4
- package/src/http/tasks.ts +51 -30
- package/src/integrations/kapso/inbound.ts +15 -10
- package/src/jira/sync.ts +26 -16
- package/src/linear/sync.ts +26 -16
- package/src/prompts/session-templates.ts +18 -13
- package/src/providers/claude-adapter.ts +21 -8
- package/src/rbac/admission.ts +1 -1
- package/src/rbac/elevated-agents.ts +24 -0
- package/src/rbac/legacy-policy.ts +35 -6
- package/src/rbac/permissions.ts +8 -0
- package/src/scheduler/deferred-task-waits.ts +138 -27
- package/src/scheduler/schedule-task.ts +54 -24
- package/src/scheduler/scheduler.ts +108 -125
- package/src/scripts-runtime/executors/native.ts +5 -1
- package/src/scripts-runtime/executors/types.ts +5 -0
- package/src/scripts-runtime/import-allowlist.ts +79 -19
- package/src/scripts-runtime/sdk-allowlist.ts +4 -0
- package/src/scripts-runtime/swarm-config.ts +8 -0
- package/src/scripts-runtime/swarm-sdk.ts +3 -0
- package/src/scripts-runtime/types/stdlib.d.ts +16 -3
- package/src/scripts-runtime/types/swarm-extension.d.ts +562 -0
- package/src/scripts-runtime/types/swarm-sdk.d.ts +16 -3
- package/src/server.ts +6 -0
- package/src/slack/HEURISTICS.md +3 -1
- package/src/slack/actions.ts +21 -16
- package/src/slack/app.ts +2 -0
- package/src/slack/assistant.ts +4 -12
- package/src/slack/blocks.ts +1 -1
- package/src/slack/handlers.ts +107 -19
- package/src/slack/inbound-files.ts +9 -5
- package/src/slack/render-v2.ts +188 -38
- package/src/slack/router.ts +13 -3
- package/src/slack/steering.ts +3 -3
- package/src/slack/thread-buffer.ts +66 -23
- package/src/slack/work-objects.test.ts +252 -0
- package/src/slack/work-objects.ts +118 -0
- package/src/tasks/errors.ts +9 -0
- package/src/tasks/sibling-awareness.ts +35 -1
- package/src/tasks/worker-follow-up.ts +67 -11
- package/src/tests/acp-adapter.test.ts +10 -10
- package/src/tests/agent-fs-live-url.test.ts +40 -0
- package/src/tests/agent-fs-provision-seeder.test.ts +12 -12
- package/src/tests/api-key-tracking.test.ts +18 -18
- package/src/tests/api-key.test.ts +4 -2
- package/src/tests/apps-rbac.test.ts +1 -1
- package/src/tests/apps-spike5.test.ts +1 -1
- package/src/tests/apps-sync-engine.test.ts +8 -8
- package/src/tests/apps-user-config.test.ts +1 -1
- package/src/tests/artifact-sdk.test.ts +8 -8
- package/src/tests/asset-key-mcp.test.ts +2 -0
- package/src/tests/automation-preflight-alert.test.ts +1 -1
- package/src/tests/base-prompt.test.ts +7 -6
- package/src/tests/budget-user-scope.test.ts +1 -1
- package/src/tests/budgets-routes.test.ts +1 -1
- package/src/tests/claude-adapter-binary.test.ts +22 -40
- package/src/tests/claude-adapter-otel.test.ts +13 -7
- package/src/tests/claude-adapter.test.ts +8 -6
- package/src/tests/claude-hook-credentials.test.ts +3 -3
- package/src/tests/claude-managed-adapter.test.ts +4 -4
- package/src/tests/claude-managed-setup.test.ts +3 -3
- package/src/tests/claude-sdk-lifecycle.test.ts +1 -1
- package/src/tests/claude-sdk-transport.test.ts +6 -6
- package/src/tests/claude-stop-hook.test.ts +8 -8
- package/src/tests/claude-worker-parity.test.ts +3 -3
- package/src/tests/codex-adapter-pool-auth-revalidate.test.ts +5 -5
- package/src/tests/codex-adapter.test.ts +7 -5
- package/src/tests/codex-app-server.test.ts +2 -2
- package/src/tests/codex-login.test.ts +15 -15
- package/src/tests/codex-oauth-credential-info.test.ts +4 -4
- package/src/tests/codex-oauth-keep-warm.test.ts +4 -4
- package/src/tests/codex-oauth-refresh-lock.test.ts +1 -1
- package/src/tests/codex-oauth-storage.test.ts +7 -7
- package/src/tests/codex-pool.test.ts +1 -1
- package/src/tests/codex-steering-hook.test.ts +1 -1
- package/src/tests/codex-swarm-events.test.ts +1 -1
- package/src/tests/config-api-only-keys.test.ts +1 -1
- package/src/tests/config-session-auth.test.ts +2 -2
- package/src/tests/connection-embedded-auth.test.ts +20 -18
- package/src/tests/core-auth.test.ts +1 -1
- package/src/tests/create-page-tool.test.ts +3 -3
- package/src/tests/credential-refresh.test.ts +115 -0
- package/src/tests/credential-wait.test.ts +2 -2
- package/src/tests/credentials.test.ts +6 -4
- package/src/tests/db-queries-oauth.test.ts +40 -40
- package/src/tests/defer-task.test.ts +73 -8
- package/src/tests/deferred-task-wait-migration.test.ts +64 -0
- package/src/tests/deferred-task-wake.test.ts +349 -8
- package/src/tests/devin-adapter.test.ts +1 -1
- package/src/tests/devin-api.test.ts +1 -1
- package/src/tests/docs-index-footprint.test.js +3 -3
- package/src/tests/e2b-dispatch.test.ts +21 -19
- package/src/tests/e2e-claude-transport.test.ts +3 -3
- package/src/tests/e2e-redact.test.ts +6 -6
- package/src/tests/ensure-token.test.ts +68 -68
- package/src/tests/entrypoint-api-readiness.test.ts +1 -1
- package/src/tests/entrypoint-codex-oauth-seed.test.ts +13 -13
- package/src/tests/env-flag.test.ts +1 -0
- package/src/tests/events-http.test.ts +1 -1
- package/src/tests/extensions-db.test.ts +216 -0
- package/src/tests/extensions-dispatcher.test.ts +275 -0
- package/src/tests/extensions-example-heartbeat-remediate.test.ts +69 -0
- package/src/tests/extensions-example-mcp-install.test.ts +63 -0
- package/src/tests/extensions-example-no-exclamation-marks.test.ts +72 -0
- package/src/tests/extensions-example-rewrite-and-suppress.test.ts +70 -0
- package/src/tests/extensions-example-route-slack-channel.test.ts +217 -0
- package/src/tests/extensions-heartbeat.test.ts +291 -0
- package/src/tests/extensions-http.test.ts +431 -0
- package/src/tests/extensions-lead-equivalence.test.ts +49 -0
- package/src/tests/extensions-lifecycle.test.ts +209 -0
- package/src/tests/extensions-loader.test.ts +95 -0
- package/src/tests/extensions-mcp-tools.test.ts +245 -0
- package/src/tests/extensions-pre-task.test.ts +487 -0
- package/src/tests/extensions-run-context.test.ts +41 -0
- package/src/tests/extensions-tool-call.test.ts +288 -0
- package/src/tests/extensions-validate.test.ts +196 -0
- package/src/tests/fixtures/extensions/bad-import/hooks.ts +8 -0
- package/src/tests/fixtures/extensions/bad-import/manifest.json +9 -0
- package/src/tests/fixtures/extensions/bad-return-shape/hooks.ts +10 -0
- package/src/tests/fixtures/extensions/bad-return-shape/manifest.json +9 -0
- package/src/tests/fixtures/extensions/block-tasks-from-source/hooks.ts +22 -0
- package/src/tests/fixtures/extensions/block-tasks-from-source/manifest.json +9 -0
- package/src/tests/fixtures/extensions/ignore-channel/hooks.ts +22 -0
- package/src/tests/fixtures/extensions/ignore-channel/manifest.json +9 -0
- package/src/tests/fixtures/extensions/load.ts +10 -0
- package/src/tests/fixtures/extensions/minimal/hooks.ts +7 -0
- package/src/tests/fixtures/extensions/minimal/manifest.json +9 -0
- package/src/tests/fixtures/extensions/never-fail-long-tasks/hooks.ts +11 -0
- package/src/tests/fixtures/extensions/never-fail-long-tasks/manifest.json +9 -0
- package/src/tests/fixtures/extensions/no-exclamation-marks/hooks.ts +23 -0
- package/src/tests/fixtures/extensions/no-exclamation-marks/manifest.json +9 -0
- package/src/tests/fixtures/extensions/post-logger/hooks.ts +9 -0
- package/src/tests/fixtures/extensions/post-logger/manifest.json +9 -0
- package/src/tests/fixtures/extensions/priority-a/hooks.ts +7 -0
- package/src/tests/fixtures/extensions/priority-a/manifest.json +9 -0
- package/src/tests/fixtures/extensions/priority-b/hooks.ts +7 -0
- package/src/tests/fixtures/extensions/priority-b/manifest.json +9 -0
- package/src/tests/fixtures/extensions/record-only-on-tag/hooks.ts +16 -0
- package/src/tests/fixtures/extensions/record-only-on-tag/manifest.json +9 -0
- package/src/tests/fixtures/extensions/reserved-assets/hooks.ts +5 -0
- package/src/tests/fixtures/extensions/reserved-assets/manifest.json +10 -0
- package/src/tests/fixtures/extensions/rewrite-progress-prefix/hooks.ts +22 -0
- package/src/tests/fixtures/extensions/rewrite-progress-prefix/manifest.json +9 -0
- package/src/tests/fixtures/extensions/rewrite-task-priority/hooks.ts +7 -0
- package/src/tests/fixtures/extensions/rewrite-task-priority/manifest.json +9 -0
- package/src/tests/fixtures/extensions/route-channel-to-agent/hooks.ts +26 -0
- package/src/tests/fixtures/extensions/route-channel-to-agent/manifest.json +9 -0
- package/src/tests/fixtures/extensions/slow/hooks.ts +10 -0
- package/src/tests/fixtures/extensions/slow/manifest.json +9 -0
- package/src/tests/fixtures/extensions/suppress-lead-follow-up/hooks.ts +12 -0
- package/src/tests/fixtures/extensions/suppress-lead-follow-up/manifest.json +9 -0
- package/src/tests/fixtures/extensions/throws/hooks.ts +12 -0
- package/src/tests/fixtures/extensions/throws/manifest.json +9 -0
- package/src/tests/fixtures/extensions/worker-runtime/hooks.ts +5 -0
- package/src/tests/fixtures/extensions/worker-runtime/manifest.json +9 -0
- package/src/tests/fs-routes.test.ts +1 -1
- package/src/tests/gitlab-auth.test.ts +10 -10
- package/src/tests/harness-provider-resolution.test.ts +8 -5
- package/src/tests/heartbeat-reroute-decision.test.ts +1 -0
- package/src/tests/helper-credentials.test.ts +137 -0
- package/src/tests/http/context-routes.test.ts +2 -2
- package/src/tests/http-api-integration.test.ts +5 -2
- package/src/tests/http-users.test.ts +1 -1
- package/src/tests/identity-refresh.test.ts +2 -2
- package/src/tests/internal-ai/complete-structured.test.ts +2 -2
- package/src/tests/internal-ai/credentials.test.ts +19 -17
- package/src/tests/jira-metadata.test.ts +1 -1
- package/src/tests/jira-oauth.test.ts +5 -5
- package/src/tests/jira-sync.test.ts +1 -1
- package/src/tests/jira-webhook-lifecycle.test.ts +3 -3
- package/src/tests/jira-webhook.test.ts +2 -2
- package/src/tests/kapso-inbound.test.ts +2 -2
- package/src/tests/kv-http.test.ts +1 -1
- package/src/tests/kv-namespace-resolution.test.ts +1 -1
- package/src/tests/kv-page-proxy.test.ts +2 -2
- package/src/tests/launch-password-rejection.test.ts +2 -2
- package/src/tests/linear-webhook.test.ts +1 -1
- package/src/tests/mcp-oauth-dcr-reuse.test.ts +6 -6
- package/src/tests/mcp-oauth-ensure-token.test.ts +28 -22
- package/src/tests/mcp-oauth-manual-client.test.ts +16 -12
- package/src/tests/mcp-oauth-queries.test.ts +35 -32
- package/src/tests/mcp-oauth-resolve-secrets.test.ts +8 -8
- package/src/tests/mcp-oauth-wrapper.test.ts +20 -20
- package/src/tests/mcp-user-route.test.ts +1 -1
- package/src/tests/memory-edges.test.ts +1 -1
- package/src/tests/memory-edit-authorization.test.ts +32 -0
- package/src/tests/memory-rate-endpoint.test.ts +1 -1
- package/src/tests/memory-rate-tool.test.ts +2 -2
- package/src/tests/memory-rater-e2e.test.ts +1 -1
- package/src/tests/memory-rater-llm-summarizer.test.ts +3 -3
- package/src/tests/memory-rater-llm.test.ts +1 -1
- package/src/tests/model-control.test.ts +3 -0
- package/src/tests/multi-runtime-enabled-stats.test.ts +2 -2
- package/src/tests/multi-runtime-registration.test.ts +111 -17
- package/src/tests/oauth-access-token-tool.test.ts +18 -18
- package/src/tests/oauth-callback-flow.test.ts +8 -8
- package/src/tests/oauth-credential-bindings.test.ts +29 -27
- package/src/tests/oauth-keepalive.test.ts +10 -10
- package/src/tests/oauth-presets.test.ts +13 -5
- package/src/tests/oauth-refresh-failure.test.ts +9 -9
- package/src/tests/oauth-refresh-sweep.test.ts +20 -13
- package/src/tests/oauth-wrapper.test.ts +1 -1
- package/src/tests/onboard-compose.test.ts +47 -3
- package/src/tests/onboard-env.test.ts +26 -26
- package/src/tests/onboard-non-interactive.test.ts +4 -4
- package/src/tests/opencode-adapter.test.ts +1 -1
- package/src/tests/opencode-plugin.test.ts +2 -2
- package/src/tests/otel-session-cost-metrics.test.ts +1 -1
- package/src/tests/page-proxy-authed.test.ts +2 -2
- package/src/tests/page-proxy.test.ts +2 -2
- package/src/tests/page-session.test.ts +7 -7
- package/src/tests/page-viewer-auth.test.ts +2 -2
- package/src/tests/pages-authed-mode.test.ts +1 -1
- package/src/tests/pages-http.test.ts +1 -1
- package/src/tests/pages-password-mode.test.ts +1 -1
- package/src/tests/pages-public-authed-401.test.ts +1 -1
- package/src/tests/pages-public-html.test.ts +2 -2
- package/src/tests/pages-view-count.test.ts +1 -1
- package/src/tests/pi-mono-adapter.test.ts +10 -10
- package/src/tests/pi-mono-extension.test.ts +2 -2
- package/src/tests/preload.ts +5 -0
- package/src/tests/pricing-routes.test.ts +1 -1
- package/src/tests/profile-sync-warning.test.ts +8 -8
- package/src/tests/profile-sync.test.ts +8 -8
- package/src/tests/prompt-template-session.test.ts +36 -5
- package/src/tests/provider-process-group.test.ts +95 -4
- package/src/tests/providers/pi-cost.test.ts +1 -1
- package/src/tests/queue-stall-alarm.test.ts +1 -1
- package/src/tests/rbac-admission.test.ts +19 -4
- package/src/tests/rbac-charact-http.test.ts +1 -1
- package/src/tests/rbac-e2e-helpers.ts +1 -1
- package/src/tests/rbac-engine.test.ts +39 -0
- package/src/tests/realtime-room-auth.test.ts +1 -1
- package/src/tests/realtime-room-surfaces.test.ts +1 -1
- package/src/tests/reload-config.test.ts +45 -1
- package/src/tests/routing-affinity-inventory.test.ts +1 -1
- package/src/tests/routing-reason-contract.test.ts +76 -3
- package/src/tests/routing-reason-inventory.test.ts +11 -6
- package/src/tests/routing-source.test.ts +53 -0
- package/src/tests/runner-agent-fs-provision-retry.test.ts +1 -1
- package/src/tests/runner-context-preamble.test.ts +1 -1
- package/src/tests/runner-deployment-resume.test.ts +1 -1
- package/src/tests/runner-fallback-output.test.ts +1 -1
- package/src/tests/runner-identity-refresh.test.ts +1 -1
- package/src/tests/runner-skills-refresh.test.ts +1 -1
- package/src/tests/schedule-target-type.test.ts +3 -3
- package/src/tests/scheduled-tasks.test.ts +14 -5
- package/src/tests/scheduler-occurrence.test.ts +347 -0
- package/src/tests/script-apis-mcp.test.ts +1 -1
- package/src/tests/script-connections-http.test.ts +61 -58
- package/src/tests/script-connections-mcp.test.ts +1 -1
- package/src/tests/script-connections.test.ts +3 -1
- package/src/tests/script-runs-http.test.ts +15 -7
- package/src/tests/script-workflows-runtime-e2e.test.ts +1 -1
- package/src/tests/scripts-boot-reembed.test.ts +4 -0
- package/src/tests/scripts-embeddings.test.ts +4 -0
- package/src/tests/scripts-external-api.test.ts +1 -1
- package/src/tests/scripts-http.test.ts +1 -1
- package/src/tests/scripts-import-allowlist.test.ts +44 -1
- package/src/tests/scripts-mcp-e2e.test.ts +81 -1
- package/src/tests/scripts-only-gating.test.ts +4 -2
- package/src/tests/scripts-retention.test.ts +1 -1
- package/src/tests/scripts-runtime-identity.test.ts +2 -2
- package/src/tests/scripts-runtime-secret-egress.test.ts +1 -1
- package/src/tests/scripts-runtime.test.ts +6 -4
- package/src/tests/scripts-typecheck.test.ts +21 -0
- package/src/tests/sdk-allowlist.test.ts +1 -1
- package/src/tests/secret-scrubber.test.ts +38 -31
- package/src/tests/seed-registry.test.ts +46 -8
- package/src/tests/seed-schedules.test.ts +44 -9
- package/src/tests/seed-workflows.test.ts +21 -9
- package/src/tests/send-task-output-schema.test.ts +9 -1
- package/src/tests/send-task-requested-by.test.ts +1 -0
- package/src/tests/send-task-slack-routing-guard.test.ts +2 -0
- package/src/tests/session-costs-codex-recompute.test.ts +1 -1
- package/src/tests/session-costs-golden.test.ts +2 -2
- package/src/tests/session-costs-model-key-normalize.test.ts +2 -2
- package/src/tests/session-costs-recompute-all-providers.test.ts +1 -1
- package/src/tests/session-tokens.test.ts +1 -1
- package/src/tests/shutdown-error-scrubbing.test.ts +1 -1
- package/src/tests/slack-blocks.test.ts +12 -1
- package/src/tests/slack-file-tools-attachments.test.ts +1 -1
- package/src/tests/slack-inbound-files.test.ts +222 -86
- package/src/tests/slack-reaction-config.test.ts +5 -4
- package/src/tests/slack-read-boundaries.test.ts +1 -1
- package/src/tests/slack-render-v2.test.ts +196 -4
- package/src/tests/slack-router.test.ts +17 -2
- package/src/tests/slack-steering.test.ts +19 -0
- package/src/tests/status.test.ts +19 -7
- package/src/tests/steering-core.test.ts +1 -1
- package/src/tests/steering-enabled.test.ts +6 -8
- package/src/tests/steering-transport.test.ts +4 -4
- package/src/tests/store-progress-output-guidance.test.ts +34 -0
- package/src/tests/swarm-tool-result-gate.test.ts +11 -11
- package/src/tests/swarm-x-tool.test.ts +7 -5
- package/src/tests/sync-ai-toolbox-skills.test.ts +19 -0
- package/src/tests/task-supersede-resume.test.ts +1 -1
- package/src/tests/task-tool-preload-mcp.test.ts +4 -1
- package/src/tests/task-tools-ctx.test.ts +2 -0
- package/src/tests/tasks-requested-by-filter.test.ts +2 -2
- package/src/tests/telemetry-init.test.ts +11 -3
- package/src/tests/tool-annotations.test.ts +1 -1
- package/src/tests/tool-output-agent-id.test.ts +1 -0
- package/src/tests/tool-registrar-no-input.test.ts +42 -1
- package/src/tests/tracker-fold.test.ts +7 -7
- package/src/tests/tracker-tools.test.ts +3 -3
- package/src/tests/ui-followup-lead-delegation.test.ts +1 -0
- package/src/tests/unified-oauth-migration.test.ts +5 -5
- package/src/tests/user-token-rest-auth.test.ts +1 -1
- package/src/tests/user-token-routes.test.ts +1 -1
- package/src/tests/whoami-route.test.ts +1 -1
- package/src/tests/workflow-agent-task.test.ts +15 -13
- package/src/tests/workflow-ctx.test.ts +1 -1
- package/src/tests/workflow-e2e.test.ts +1 -1
- package/src/tests/workflow-engine-v2.test.ts +3 -1
- package/src/tests/workflow-executors.test.ts +2 -2
- package/src/tests/workflow-http-v2.test.ts +8 -6
- package/src/tests/workflow-input-redaction.test.ts +7 -5
- package/src/tests/workflow-integration-io.test.ts +2 -2
- package/src/tests/workflow-llm.test.ts +5 -5
- package/src/tests/workflow-registry.test.ts +1 -1
- package/src/tests/workflow-swarm-script.test.ts +1 -1
- package/src/tests/workflow-triggers-v2.test.ts +23 -21
- package/src/tests/x-composio.test.ts +9 -7
- package/src/tests/x402-client.test.ts +1 -1
- package/src/tests/x402-config.test.ts +28 -41
- package/src/tools/defer-task.ts +156 -24
- package/src/tools/extension-common.ts +84 -0
- package/src/tools/extension-install.ts +65 -0
- package/src/tools/extension-list.ts +66 -0
- package/src/tools/script-common.ts +43 -18
- package/src/tools/send-task.ts +87 -105
- package/src/tools/skills/skill-publish.ts +1 -0
- package/src/tools/store-progress.ts +1 -1
- package/src/tools/task-action.ts +43 -22
- package/src/tools/task-tool-ctx.ts +2 -0
- package/src/tools/templates.ts +2 -1
- package/src/tools/tool-config.ts +3 -1
- package/src/tools/utils.ts +140 -16
- package/src/types.ts +144 -0
- package/src/utils/constants.ts +7 -1
- package/src/utils/credentials.test.ts +16 -16
- package/src/utils/multi-runtime.ts +2 -2
- package/src/utils/steering-enabled.ts +4 -4
- package/src/workflows/executors/agent-task.ts +18 -3
- package/templates/ai-toolbox.manifest.json +7 -1
- package/templates/extensions/README.md +17 -0
- package/templates/extensions/notify-on-complete/README.md +11 -0
- package/templates/extensions/notify-on-complete/hooks.ts +61 -0
- package/templates/extensions/notify-on-complete/manifest.json +7 -0
- package/templates/extensions/require-ticket-ref/README.md +11 -0
- package/templates/extensions/require-ticket-ref/hooks.ts +30 -0
- package/templates/extensions/require-ticket-ref/manifest.json +7 -0
- package/templates/extensions/require-verification-note/README.md +11 -0
- package/templates/extensions/require-verification-note/hooks.ts +32 -0
- package/templates/extensions/require-verification-note/manifest.json +7 -0
- package/templates/schedules/daily-hn-briefing/config.json +1 -1
- package/templates/schedules/gtm-weekly-review/config.json +1 -1
- package/templates/schedules/weekly-code-health-reports/config.json +1 -1
- package/templates/schedules/weekly-dependabot-triage/config.json +1 -1
- package/templates/schedules/weekly-dora-metrics/config.json +1 -1
- package/templates/schedules/weekly-harness-upgrade-check/config.json +1 -1
- package/templates/skills/delegate-work/files/scripts/codex-exec.sh +1 -1
- package/templates/skills/scheduling/content.md +2 -0
- package/templates/skills/serply-search/SKILL.md +95 -0
- package/templates/skills/serply-search/config.json +13 -0
- package/templates/skills/serply-search/content.md +90 -0
- package/templates/skills/swarm-extensions/config.json +14 -0
- package/templates/skills/swarm-extensions/content.md +120 -0
- package/templates/skills/swarm-scripts/SKILL.md +2 -2
- package/templates/skills/swarm-scripts/content.md +2 -2
- package/templates/workflows/claude-code-changelog-watch/config.json +1 -1
- package/templates/workflows/gsc-topic-miner/config.json +1 -1
- package/templates/workflows/linear-drain-loop/config.json +1 -1
- package/templates/workflows/llm-safe-release-context/config.json +1 -1
- package/templates/workflows/ralph-loop/config.json +1 -1
- package/dist/cli-7fehefdf.js +0 -562
- package/dist/cli-ayvy5kde.js +0 -164
- package/dist/cli-ddfw1mc4.js +0 -4322
- package/dist/cli-hzqmgcm2.js +0 -3066
- package/dist/cli-j4d4f6hv.js +0 -338
- package/dist/cli-qgm2pfpq.js +0 -6377
- package/dist/cli-sdzq01t9.js +0 -823
- package/dist/cli-xvkmedgn.js +0 -332
- package/dist/cli-y3pq4v9g.js +0 -664
- package/dist/{anthropic-messages-vs2rabzp.js → anthropic-messages-2y8nktar.js} +19 -19
- package/dist/{claude-managed-setup-f5pmsyrp.js → claude-managed-setup-48dwg9bv.js} +3 -3
- package/dist/{cli-81r683bv.js → cli-ch38q5z4.js} +0 -0
- package/dist/{cli-6664w7y4.js → cli-kj76p1ez.js} +8 -8
- package/dist/{cli-c71mg51n.js → cli-r2fpe7cx.js} +5 -5
- package/dist/{cli-4xz3pmrq.js → cli-y6x0gqtg.js} +16 -16
- package/dist/{index-aa3sa6s8.js → index-2wsdsnmm.js} +1 -1
- package/dist/{mistral-conversations-4ryk7h83.js → mistral-conversations-qhr84ph3.js} +9 -9
- package/dist/{openai-completions-0bqmsajw.js → openai-completions-32rdwmze.js} +19 -19
- package/dist/{openrouter-images-qx18fyp8.js → openrouter-images-9f9ek4rw.js} +3 -3
- package/dist/{pi-messages-79jvzz1d.js → pi-messages-b1mbr6gp.js} +4 -4
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
* `projects[cwd].hasTrustDialogAccepted: true` to `$HOME/.claude.json`
|
|
18
18
|
* before spawning. Idempotent. No-op for "claude".
|
|
19
19
|
*
|
|
20
|
-
* `Bun.spawn`
|
|
21
|
-
*
|
|
20
|
+
* `Bun.spawn` is stubbed so the tests don't actually exec anything; we read
|
|
21
|
+
* the session argv off the call args and ignore the binary-version probe.
|
|
22
22
|
* `Bun.which` is stubbed for the tmux gate so the tests don't depend on the
|
|
23
23
|
* host having tmux installed. `$HOME` is redirected to a tmp dir so the
|
|
24
24
|
* trust-preseed never touches the real `~/.claude.json`.
|
|
@@ -76,17 +76,6 @@ function makeFakeProc(): ReturnType<typeof Bun.spawn> {
|
|
|
76
76
|
} as unknown as ReturnType<typeof Bun.spawn>;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
/**
|
|
80
|
-
* The adapter probes `<binary> --version` synchronously before it spawns the
|
|
81
|
-
* session. Keep integration tests hermetic: a `bunx <package>` probe can do
|
|
82
|
-
* package resolution and outlive Bun's per-test timeout under CI load.
|
|
83
|
-
*/
|
|
84
|
-
function mockClaudeVersionProbe(): ReturnType<typeof spyOn> {
|
|
85
|
-
return spyOn(Bun, "spawnSync").mockImplementation((() => ({
|
|
86
|
-
success: false,
|
|
87
|
-
})) as typeof Bun.spawnSync);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
79
|
async function createCompletedSession(adapter: ClaudeAdapter, config: ProviderSessionConfig) {
|
|
91
80
|
const session = await adapter.createSession(config);
|
|
92
81
|
await session.waitForCompletion();
|
|
@@ -238,7 +227,7 @@ describe("SWARM_USE_CLAUDE_BRIDGE boolean parsing", () => {
|
|
|
238
227
|
describe("resolveClaudeBinaryArgv — claude-bridge requires an OAuth token", () => {
|
|
239
228
|
test("bridge requested + OAuth token present → routes to claude-bridge", () => {
|
|
240
229
|
const r = resolveClaudeBinaryArgv(
|
|
241
|
-
{ SWARM_USE_CLAUDE_BRIDGE: "true", CLAUDE_CODE_OAUTH_TOKEN: "sk-ant-oat01-x" },
|
|
230
|
+
{ SWARM_USE_CLAUDE_BRIDGE: "true", CLAUDE_CODE_OAUTH_TOKEN: "example-sk-ant-oat01-x" },
|
|
242
231
|
{},
|
|
243
232
|
);
|
|
244
233
|
expect(r.useClaudeBridge).toBe(true);
|
|
@@ -248,7 +237,7 @@ describe("resolveClaudeBinaryArgv — claude-bridge requires an OAuth token", ()
|
|
|
248
237
|
|
|
249
238
|
test("bridge requested + no OAuth (only API key) → falls back to stock claude", () => {
|
|
250
239
|
const r = resolveClaudeBinaryArgv(
|
|
251
|
-
{ SWARM_USE_CLAUDE_BRIDGE: "true", ANTHROPIC_API_KEY: "sk-ant-api" },
|
|
240
|
+
{ SWARM_USE_CLAUDE_BRIDGE: "true", ANTHROPIC_API_KEY: "example-sk-ant-api" },
|
|
252
241
|
{},
|
|
253
242
|
);
|
|
254
243
|
expect(r.useClaudeBridge).toBe(false);
|
|
@@ -265,7 +254,7 @@ describe("resolveClaudeBinaryArgv — claude-bridge requires an OAuth token", ()
|
|
|
265
254
|
test("OAuth token from fallbackEnv (container env) also enables the bridge", () => {
|
|
266
255
|
const r = resolveClaudeBinaryArgv(
|
|
267
256
|
{ SWARM_USE_CLAUDE_BRIDGE: "true" },
|
|
268
|
-
{ CLAUDE_CODE_OAUTH_TOKEN: "sk-ant-oat01-fallback" },
|
|
257
|
+
{ CLAUDE_CODE_OAUTH_TOKEN: "example-sk-ant-oat01-fallback" },
|
|
269
258
|
);
|
|
270
259
|
expect(r.useClaudeBridge).toBe(true);
|
|
271
260
|
expect(r.bridgeRequestedWithoutOAuth).toBe(false);
|
|
@@ -281,7 +270,7 @@ describe("resolveClaudeBinaryArgv — claude-bridge requires an OAuth token", ()
|
|
|
281
270
|
});
|
|
282
271
|
|
|
283
272
|
test("bridge not requested → never flagged, stock claude", () => {
|
|
284
|
-
const r = resolveClaudeBinaryArgv({ CLAUDE_CODE_OAUTH_TOKEN: "sk-ant-oat01-x" }, {});
|
|
273
|
+
const r = resolveClaudeBinaryArgv({ CLAUDE_CODE_OAUTH_TOKEN: "example-sk-ant-oat01-x" }, {});
|
|
285
274
|
expect(r.useClaudeBridge).toBe(false);
|
|
286
275
|
expect(r.bridgeRequestedWithoutOAuth).toBe(false);
|
|
287
276
|
expect(r.argv).toEqual(["claude"]);
|
|
@@ -384,7 +373,6 @@ describe("CLAUDE_BINARY env override", () => {
|
|
|
384
373
|
let originalHome: string | undefined;
|
|
385
374
|
let homeDir: string;
|
|
386
375
|
let spawnSpy: ReturnType<typeof spyOn>;
|
|
387
|
-
let spawnSyncSpy: ReturnType<typeof spyOn>;
|
|
388
376
|
let whichSpy: ReturnType<typeof spyOn>;
|
|
389
377
|
let spawnedArgs: Array<readonly string[]>;
|
|
390
378
|
let spawnedEnvs: Array<Record<string, string> | undefined>;
|
|
@@ -400,16 +388,17 @@ describe("CLAUDE_BINARY env override", () => {
|
|
|
400
388
|
delete process.env.SWARM_USE_CLAUDE_BRIDGE;
|
|
401
389
|
delete process.env.CLAUDE_QUEUE_STEERING;
|
|
402
390
|
// Credential check runs before binary resolution; satisfy it.
|
|
403
|
-
process.env.CLAUDE_CODE_OAUTH_TOKEN = "test-token";
|
|
391
|
+
process.env.CLAUDE_CODE_OAUTH_TOKEN = "example-test-token";
|
|
404
392
|
|
|
405
393
|
spawnedArgs = [];
|
|
406
394
|
spawnedEnvs = [];
|
|
407
395
|
spawnSpy = spyOn(Bun, "spawn").mockImplementation(((cmd: readonly string[], opts?: unknown) => {
|
|
408
|
-
|
|
409
|
-
|
|
396
|
+
if (cmd.at(-1) !== "--version") {
|
|
397
|
+
spawnedArgs.push(cmd);
|
|
398
|
+
spawnedEnvs.push((opts as { env?: Record<string, string> } | undefined)?.env);
|
|
399
|
+
}
|
|
410
400
|
return makeFakeProc();
|
|
411
401
|
}) as typeof Bun.spawn);
|
|
412
|
-
spawnSyncSpy = mockClaudeVersionProbe();
|
|
413
402
|
|
|
414
403
|
// Default: pretend tmux IS on PATH so non-tmux-gate tests don't trip.
|
|
415
404
|
whichSpy = spyOn(Bun, "which").mockImplementation((name: string) => {
|
|
@@ -420,7 +409,6 @@ describe("CLAUDE_BINARY env override", () => {
|
|
|
420
409
|
|
|
421
410
|
afterEach(async () => {
|
|
422
411
|
spawnSpy.mockRestore();
|
|
423
|
-
spawnSyncSpy.mockRestore();
|
|
424
412
|
whichSpy.mockRestore();
|
|
425
413
|
await rm(homeDir, { recursive: true, force: true });
|
|
426
414
|
if (originalHome === undefined) {
|
|
@@ -542,7 +530,7 @@ describe("CLAUDE_BINARY env override", () => {
|
|
|
542
530
|
makeConfig({
|
|
543
531
|
env: {
|
|
544
532
|
CLAUDE_BINARY: LEGACY_BRIDGE_COMPAT_BINARY,
|
|
545
|
-
CLAUDE_CODE_OAUTH_TOKEN: "test-token",
|
|
533
|
+
CLAUDE_CODE_OAUTH_TOKEN: "example-test-token",
|
|
546
534
|
} as Record<string, string>,
|
|
547
535
|
}),
|
|
548
536
|
);
|
|
@@ -559,7 +547,7 @@ describe("CLAUDE_BINARY env override", () => {
|
|
|
559
547
|
makeConfig({
|
|
560
548
|
env: {
|
|
561
549
|
CLAUDE_BINARY: LEGACY_BRIDGE_COMPAT_COMMAND,
|
|
562
|
-
CLAUDE_CODE_OAUTH_TOKEN: "test-token",
|
|
550
|
+
CLAUDE_CODE_OAUTH_TOKEN: "example-test-token",
|
|
563
551
|
} as Record<string, string>,
|
|
564
552
|
}),
|
|
565
553
|
);
|
|
@@ -576,7 +564,7 @@ describe("CLAUDE_BINARY env override", () => {
|
|
|
576
564
|
adapter,
|
|
577
565
|
makeConfig({
|
|
578
566
|
// env has CLAUDE_CODE_OAUTH_TOKEN but no CLAUDE_BINARY → process.env wins.
|
|
579
|
-
env: { CLAUDE_CODE_OAUTH_TOKEN: "test-token" } as Record<string, string>,
|
|
567
|
+
env: { CLAUDE_CODE_OAUTH_TOKEN: "example-test-token" } as Record<string, string>,
|
|
580
568
|
}),
|
|
581
569
|
);
|
|
582
570
|
|
|
@@ -602,7 +590,7 @@ describe("CLAUDE_BINARY env override", () => {
|
|
|
602
590
|
await createCompletedSession(adapter, makeConfig());
|
|
603
591
|
|
|
604
592
|
expect(spawnedArgs[0][0]).toBe("claude-bridge");
|
|
605
|
-
expect(spawnedEnvs[0]?.CLAUDE_CODE_OAUTH_TOKEN).toBe("test-token");
|
|
593
|
+
expect(spawnedEnvs[0]?.CLAUDE_CODE_OAUTH_TOKEN).toBe("example-test-token");
|
|
606
594
|
});
|
|
607
595
|
|
|
608
596
|
test("SWARM_USE_CLAUDE_BRIDGE=true forwards Anthropic local auth through bridge flag", async () => {
|
|
@@ -612,14 +600,14 @@ describe("CLAUDE_BINARY env override", () => {
|
|
|
612
600
|
makeConfig({
|
|
613
601
|
env: {
|
|
614
602
|
SWARM_USE_CLAUDE_BRIDGE: "true",
|
|
615
|
-
ANTHROPIC_API_KEY: "sk-ant-test",
|
|
603
|
+
ANTHROPIC_API_KEY: "example-sk-ant-test",
|
|
616
604
|
} as Record<string, string>,
|
|
617
605
|
}),
|
|
618
606
|
);
|
|
619
607
|
|
|
620
608
|
expect(spawnedArgs[0][0]).toBe("claude-bridge");
|
|
621
609
|
expect(spawnedArgs[0]).toContain("--desplega-local-auth");
|
|
622
|
-
expect(spawnedEnvs[0]?.ANTHROPIC_API_KEY).toBe("sk-ant-test");
|
|
610
|
+
expect(spawnedEnvs[0]?.ANTHROPIC_API_KEY).toBe("example-sk-ant-test");
|
|
623
611
|
expect(spawnedEnvs[0]?.CLAUDE_CODE_OAUTH_TOKEN).toBeUndefined();
|
|
624
612
|
});
|
|
625
613
|
|
|
@@ -642,7 +630,7 @@ describe("CLAUDE_BINARY env override", () => {
|
|
|
642
630
|
makeConfig({
|
|
643
631
|
env: {
|
|
644
632
|
SWARM_USE_CLAUDE_BRIDGE: "true",
|
|
645
|
-
CLAUDE_CODE_OAUTH_TOKEN: "test-token",
|
|
633
|
+
CLAUDE_CODE_OAUTH_TOKEN: "example-test-token",
|
|
646
634
|
} as Record<string, string>,
|
|
647
635
|
}),
|
|
648
636
|
);
|
|
@@ -659,7 +647,7 @@ describe("CLAUDE_BINARY env override", () => {
|
|
|
659
647
|
makeConfig({
|
|
660
648
|
env: {
|
|
661
649
|
SWARM_USE_CLAUDE_BRIDGE: "false",
|
|
662
|
-
CLAUDE_CODE_OAUTH_TOKEN: "test-token",
|
|
650
|
+
CLAUDE_CODE_OAUTH_TOKEN: "example-test-token",
|
|
663
651
|
} as Record<string, string>,
|
|
664
652
|
}),
|
|
665
653
|
);
|
|
@@ -670,7 +658,7 @@ describe("CLAUDE_BINARY env override", () => {
|
|
|
670
658
|
test("SWARM_USE_CLAUDE_BRIDGE=true without OAuth token falls back to stock claude", async () => {
|
|
671
659
|
const origApiKey = process.env.ANTHROPIC_API_KEY;
|
|
672
660
|
delete process.env.CLAUDE_CODE_OAUTH_TOKEN;
|
|
673
|
-
process.env.ANTHROPIC_API_KEY = "sk-ant-test";
|
|
661
|
+
process.env.ANTHROPIC_API_KEY = "example-sk-ant-test";
|
|
674
662
|
process.env.SWARM_USE_CLAUDE_BRIDGE = "true";
|
|
675
663
|
try {
|
|
676
664
|
const adapter = new ClaudeAdapter();
|
|
@@ -695,7 +683,6 @@ describe("Claude Bridge tmux fail-fast gate", () => {
|
|
|
695
683
|
let originalHome: string | undefined;
|
|
696
684
|
let homeDir: string;
|
|
697
685
|
let spawnSpy: ReturnType<typeof spyOn>;
|
|
698
|
-
let spawnSyncSpy: ReturnType<typeof spyOn>;
|
|
699
686
|
let whichSpy: ReturnType<typeof spyOn>;
|
|
700
687
|
|
|
701
688
|
beforeEach(async () => {
|
|
@@ -707,15 +694,13 @@ describe("Claude Bridge tmux fail-fast gate", () => {
|
|
|
707
694
|
process.env.HOME = homeDir;
|
|
708
695
|
delete process.env.CLAUDE_BINARY;
|
|
709
696
|
delete process.env.SWARM_USE_CLAUDE_BRIDGE;
|
|
710
|
-
process.env.CLAUDE_CODE_OAUTH_TOKEN = "test-token";
|
|
697
|
+
process.env.CLAUDE_CODE_OAUTH_TOKEN = "example-test-token";
|
|
711
698
|
spawnSpy = spyOn(Bun, "spawn").mockImplementation((() => makeFakeProc()) as typeof Bun.spawn);
|
|
712
|
-
spawnSyncSpy = mockClaudeVersionProbe();
|
|
713
699
|
whichSpy = spyOn(Bun, "which");
|
|
714
700
|
});
|
|
715
701
|
|
|
716
702
|
afterEach(async () => {
|
|
717
703
|
spawnSpy.mockRestore();
|
|
718
|
-
spawnSyncSpy.mockRestore();
|
|
719
704
|
whichSpy.mockRestore();
|
|
720
705
|
await rm(homeDir, { recursive: true, force: true });
|
|
721
706
|
if (originalHome === undefined) {
|
|
@@ -815,7 +800,6 @@ describe("Trust pre-seed via ClaudeAdapter.createSession", () => {
|
|
|
815
800
|
let originalHome: string | undefined;
|
|
816
801
|
let homeDir: string;
|
|
817
802
|
let spawnSpy: ReturnType<typeof spyOn>;
|
|
818
|
-
let spawnSyncSpy: ReturnType<typeof spyOn>;
|
|
819
803
|
let whichSpy: ReturnType<typeof spyOn>;
|
|
820
804
|
|
|
821
805
|
beforeEach(async () => {
|
|
@@ -827,9 +811,8 @@ describe("Trust pre-seed via ClaudeAdapter.createSession", () => {
|
|
|
827
811
|
process.env.HOME = homeDir;
|
|
828
812
|
delete process.env.CLAUDE_BINARY;
|
|
829
813
|
delete process.env.SWARM_USE_CLAUDE_BRIDGE;
|
|
830
|
-
process.env.CLAUDE_CODE_OAUTH_TOKEN = "test-token";
|
|
814
|
+
process.env.CLAUDE_CODE_OAUTH_TOKEN = "example-test-token";
|
|
831
815
|
spawnSpy = spyOn(Bun, "spawn").mockImplementation((() => makeFakeProc()) as typeof Bun.spawn);
|
|
832
|
-
spawnSyncSpy = mockClaudeVersionProbe();
|
|
833
816
|
whichSpy = spyOn(Bun, "which").mockImplementation((name: string) => {
|
|
834
817
|
if (name === "tmux") return "/usr/bin/tmux";
|
|
835
818
|
return null;
|
|
@@ -838,7 +821,6 @@ describe("Trust pre-seed via ClaudeAdapter.createSession", () => {
|
|
|
838
821
|
|
|
839
822
|
afterEach(async () => {
|
|
840
823
|
spawnSpy.mockRestore();
|
|
841
|
-
spawnSyncSpy.mockRestore();
|
|
842
824
|
whichSpy.mockRestore();
|
|
843
825
|
await rm(homeDir, { recursive: true, force: true });
|
|
844
826
|
if (originalHome === undefined) {
|
|
@@ -228,10 +228,12 @@ describe("ClaudeSession spawn env — SWARM_ENABLE_CLAUDE_CODE_OTEL", () => {
|
|
|
228
228
|
beforeEach(() => {
|
|
229
229
|
spawnedEnvs = [];
|
|
230
230
|
spawnSpy = spyOn(Bun, "spawn").mockImplementation(((
|
|
231
|
-
|
|
231
|
+
cmd: readonly string[],
|
|
232
232
|
opts?: { env?: Record<string, string> },
|
|
233
233
|
) => {
|
|
234
|
-
|
|
234
|
+
if (cmd.at(-1) !== "--version") {
|
|
235
|
+
spawnedEnvs.push(opts?.env);
|
|
236
|
+
}
|
|
235
237
|
return makeFakeProc();
|
|
236
238
|
}) as typeof Bun.spawn);
|
|
237
239
|
getActiveSpanSpy = spyOn(trace, "getActiveSpan").mockReturnValue(makeSpan());
|
|
@@ -246,7 +248,7 @@ describe("ClaudeSession spawn env — SWARM_ENABLE_CLAUDE_CODE_OTEL", () => {
|
|
|
246
248
|
const adapter = new ClaudeAdapter();
|
|
247
249
|
await adapter.createSession(
|
|
248
250
|
makeConfig({
|
|
249
|
-
env: { SWARM_ENABLE_CLAUDE_CODE_OTEL: "1", CLAUDE_CODE_OAUTH_TOKEN: "test-token" },
|
|
251
|
+
env: { SWARM_ENABLE_CLAUDE_CODE_OTEL: "1", CLAUDE_CODE_OAUTH_TOKEN: "example-test-token" },
|
|
250
252
|
}),
|
|
251
253
|
);
|
|
252
254
|
|
|
@@ -261,7 +263,9 @@ describe("ClaudeSession spawn env — SWARM_ENABLE_CLAUDE_CODE_OTEL", () => {
|
|
|
261
263
|
|
|
262
264
|
test("gate unset → spawn env carries NO TRACEPARENT (behavior unchanged)", async () => {
|
|
263
265
|
const adapter = new ClaudeAdapter();
|
|
264
|
-
await adapter.createSession(
|
|
266
|
+
await adapter.createSession(
|
|
267
|
+
makeConfig({ env: { CLAUDE_CODE_OAUTH_TOKEN: "example-test-token" } }),
|
|
268
|
+
);
|
|
265
269
|
|
|
266
270
|
expect(spawnedEnvs).toHaveLength(1);
|
|
267
271
|
const env = spawnedEnvs[0];
|
|
@@ -269,12 +273,14 @@ describe("ClaudeSession spawn env — SWARM_ENABLE_CLAUDE_CODE_OTEL", () => {
|
|
|
269
273
|
expect(env?.OTEL_LOG_USER_PROMPTS).toBeUndefined();
|
|
270
274
|
// Existing env wiring is untouched.
|
|
271
275
|
expect(env?.ENABLE_PROMPT_CACHING_1H).toBe("1");
|
|
272
|
-
expect(env?.CLAUDE_CODE_OAUTH_TOKEN).toBe("test-token");
|
|
276
|
+
expect(env?.CLAUDE_CODE_OAUTH_TOKEN).toBe("example-test-token");
|
|
273
277
|
});
|
|
274
278
|
|
|
275
279
|
test("spawn env carries Claude Code runtime guardrails", async () => {
|
|
276
280
|
const adapter = new ClaudeAdapter();
|
|
277
|
-
await adapter.createSession(
|
|
281
|
+
await adapter.createSession(
|
|
282
|
+
makeConfig({ env: { CLAUDE_CODE_OAUTH_TOKEN: "example-test-token" } }),
|
|
283
|
+
);
|
|
278
284
|
|
|
279
285
|
expect(spawnedEnvs).toHaveLength(1);
|
|
280
286
|
const env = spawnedEnvs[0];
|
|
@@ -294,7 +300,7 @@ describe("ClaudeSession spawn env — SWARM_ENABLE_CLAUDE_CODE_OTEL", () => {
|
|
|
294
300
|
await adapter.createSession(
|
|
295
301
|
makeConfig({
|
|
296
302
|
env: {
|
|
297
|
-
CLAUDE_CODE_OAUTH_TOKEN: "test-token",
|
|
303
|
+
CLAUDE_CODE_OAUTH_TOKEN: "example-test-token",
|
|
298
304
|
CLAUDE_CODE_ENABLE_TELEMETRY: "1",
|
|
299
305
|
OTEL_EXPORTER_OTLP_ENDPOINT: "https://otel.example.test",
|
|
300
306
|
},
|
|
@@ -16,7 +16,7 @@ function makeConfig(overrides: Partial<ProviderSessionConfig> = {}): ProviderSes
|
|
|
16
16
|
agentId: "test-agent-id",
|
|
17
17
|
taskId: "test-task-id",
|
|
18
18
|
apiUrl: "http://localhost:3013",
|
|
19
|
-
apiKey: "test-key",
|
|
19
|
+
apiKey: "example-test-key",
|
|
20
20
|
cwd: "/tmp",
|
|
21
21
|
logFile: "/tmp/test-claude-adapter.jsonl",
|
|
22
22
|
...overrides,
|
|
@@ -95,15 +95,17 @@ describe("ClaudeSession spawn env — reasoning_effort", () => {
|
|
|
95
95
|
// MAX_THINKING_TOKENS) would leak through and pollute the `toBeUndefined()`
|
|
96
96
|
// assertions. Passing an explicit, minimal `env` sidesteps both — deterministic
|
|
97
97
|
// regardless of the ambient process env the test happens to run in.
|
|
98
|
-
const CLEAN_ENV: Record<string, string> = { CLAUDE_CODE_OAUTH_TOKEN: "test-oauth-token" };
|
|
98
|
+
const CLEAN_ENV: Record<string, string> = { CLAUDE_CODE_OAUTH_TOKEN: "example-test-oauth-token" };
|
|
99
99
|
|
|
100
100
|
beforeEach(() => {
|
|
101
101
|
spawnedEnvs = [];
|
|
102
102
|
spawnSpy = spyOn(Bun, "spawn").mockImplementation(((
|
|
103
|
-
|
|
103
|
+
cmd: readonly string[],
|
|
104
104
|
opts?: { env?: Record<string, string> },
|
|
105
105
|
) => {
|
|
106
|
-
|
|
106
|
+
if (cmd.at(-1) !== "--version") {
|
|
107
|
+
spawnedEnvs.push(opts?.env);
|
|
108
|
+
}
|
|
107
109
|
return makeFakeProc();
|
|
108
110
|
}) as typeof Bun.spawn);
|
|
109
111
|
});
|
|
@@ -195,7 +197,7 @@ describe("Claude stream-json event parsing", () => {
|
|
|
195
197
|
// regression here is caught instead of silently shipping the wrong text.
|
|
196
198
|
describe("ClaudeSession processStreams — ProviderResult.output capture", () => {
|
|
197
199
|
let spawnSpy: ReturnType<typeof spyOn>;
|
|
198
|
-
const CLEAN_ENV: Record<string, string> = { CLAUDE_CODE_OAUTH_TOKEN: "test-oauth-token" };
|
|
200
|
+
const CLEAN_ENV: Record<string, string> = { CLAUDE_CODE_OAUTH_TOKEN: "example-test-oauth-token" };
|
|
199
201
|
|
|
200
202
|
/** Fake Bun.Subprocess whose stdout streams the given NDJSON lines, then closes. */
|
|
201
203
|
function makeStreamingFakeProc(lines: string[]): ReturnType<typeof Bun.spawn> {
|
|
@@ -285,7 +287,7 @@ describe("ClaudeSession processStreams — ProviderResult.output capture", () =>
|
|
|
285
287
|
expect(summaryOpts!.transcript).toContain('Tool[Read] started: {"file_path":"/tmp/source.ts"}');
|
|
286
288
|
expect(summaryOpts!.transcript).toContain("Tool result: export const value = 1");
|
|
287
289
|
expect(summaryOpts!.transcriptPath).toBeUndefined();
|
|
288
|
-
expect(summaryOpts!.env?.CLAUDE_CODE_OAUTH_TOKEN).toBe("test-oauth-token");
|
|
290
|
+
expect(summaryOpts!.env?.CLAUDE_CODE_OAUTH_TOKEN).toBe("example-test-oauth-token");
|
|
289
291
|
expect(summaryOpts!.env?.AGENT_SWARM_TASK_ID).toBe("test-task-id");
|
|
290
292
|
});
|
|
291
293
|
|
|
@@ -60,9 +60,9 @@ for (const transport of ["cli", "sdk"] as const) {
|
|
|
60
60
|
CLAUDECODE: "",
|
|
61
61
|
CONTEXT_MODE_DISABLED: "true",
|
|
62
62
|
// Synthetic values ensure this probe cannot authenticate or incur model charges.
|
|
63
|
-
CLAUDE_CODE_OAUTH_TOKEN: "synthetic-not-an-oauth-token",
|
|
64
|
-
ANTHROPIC_API_KEY: "synthetic-not-an-api-key",
|
|
65
|
-
AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "synthetic-legacy-mirror",
|
|
63
|
+
CLAUDE_CODE_OAUTH_TOKEN: "example-synthetic-not-an-oauth-token",
|
|
64
|
+
ANTHROPIC_API_KEY: "example-synthetic-not-an-api-key",
|
|
65
|
+
AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "example-synthetic-legacy-mirror",
|
|
66
66
|
},
|
|
67
67
|
});
|
|
68
68
|
abortTimer = setTimeout(() => void session?.abort("hook probe timeout"), 20_000);
|
|
@@ -733,7 +733,7 @@ describe("ClaudeManagedAdapter (Phase 4) — repo provisioning + cost data", ()
|
|
|
733
733
|
});
|
|
734
734
|
|
|
735
735
|
test("createSession includes resources[github_repository] when config.vcsRepo is set", async () => {
|
|
736
|
-
process.env.MANAGED_GITHUB_TOKEN = "ghp_test_pat";
|
|
736
|
+
process.env.MANAGED_GITHUB_TOKEN = "example-ghp_test_pat";
|
|
737
737
|
const events: Array<Record<string, unknown>> = [
|
|
738
738
|
{
|
|
739
739
|
type: "session.status_idle",
|
|
@@ -764,7 +764,7 @@ describe("ClaudeManagedAdapter (Phase 4) — repo provisioning + cost data", ()
|
|
|
764
764
|
const repo = resources![0]!;
|
|
765
765
|
expect(repo.type).toBe("github_repository");
|
|
766
766
|
expect(repo.url).toBe("https://github.com/desplega-ai/agent-swarm");
|
|
767
|
-
expect(repo.authorization_token).toBe("ghp_test_pat");
|
|
767
|
+
expect(repo.authorization_token).toBe("example-ghp_test_pat");
|
|
768
768
|
const checkout = repo.checkout as Record<string, unknown> | undefined;
|
|
769
769
|
expect(checkout?.type).toBe("branch");
|
|
770
770
|
expect(checkout?.name).toBe("main");
|
|
@@ -1126,7 +1126,7 @@ describe("ClaudeManagedAdapter (Phase 5) — cancellation + tool-loop detection"
|
|
|
1126
1126
|
logFile: join(tmpLogDir, "cancel-poll.log"),
|
|
1127
1127
|
// Provide the API context so the swarm-event handler attaches.
|
|
1128
1128
|
apiUrl: "http://test-api",
|
|
1129
|
-
apiKey: "test-key",
|
|
1129
|
+
apiKey: "example-test-key",
|
|
1130
1130
|
taskId,
|
|
1131
1131
|
}),
|
|
1132
1132
|
);
|
|
@@ -1224,7 +1224,7 @@ describe("ClaudeManagedAdapter (Phase 5) — cancellation + tool-loop detection"
|
|
|
1224
1224
|
tConfig({
|
|
1225
1225
|
logFile: join(tmpLogDir, "tool-loop.log"),
|
|
1226
1226
|
apiUrl: "http://test-api",
|
|
1227
|
-
apiKey: "test-key",
|
|
1227
|
+
apiKey: "example-test-key",
|
|
1228
1228
|
taskId,
|
|
1229
1229
|
}),
|
|
1230
1230
|
);
|
|
@@ -295,7 +295,7 @@ describe("resolveClaudeManagedSetupConfig", () => {
|
|
|
295
295
|
test("rejects http:// MCP_BASE_URL fail-fast", async () => {
|
|
296
296
|
await expect(
|
|
297
297
|
resolveClaudeManagedSetupConfig([], {
|
|
298
|
-
env: { ANTHROPIC_API_KEY: "sk-ant-x", MCP_BASE_URL: "http://insecure.local" },
|
|
298
|
+
env: { ANTHROPIC_API_KEY: "example-sk-ant-x", MCP_BASE_URL: "http://insecure.local" },
|
|
299
299
|
isInteractive: false,
|
|
300
300
|
}),
|
|
301
301
|
).rejects.toThrow(/must start with https/);
|
|
@@ -304,7 +304,7 @@ describe("resolveClaudeManagedSetupConfig", () => {
|
|
|
304
304
|
test("rejects missing MCP_BASE_URL", async () => {
|
|
305
305
|
await expect(
|
|
306
306
|
resolveClaudeManagedSetupConfig([], {
|
|
307
|
-
env: { ANTHROPIC_API_KEY: "sk-ant-x" },
|
|
307
|
+
env: { ANTHROPIC_API_KEY: "example-sk-ant-x" },
|
|
308
308
|
isInteractive: false,
|
|
309
309
|
}),
|
|
310
310
|
).rejects.toThrow(/MCP_BASE_URL is not set/);
|
|
@@ -313,7 +313,7 @@ describe("resolveClaudeManagedSetupConfig", () => {
|
|
|
313
313
|
test("--force flag is parsed", async () => {
|
|
314
314
|
const result = await resolveClaudeManagedSetupConfig(["--force"], {
|
|
315
315
|
env: {
|
|
316
|
-
ANTHROPIC_API_KEY: "sk-ant-x",
|
|
316
|
+
ANTHROPIC_API_KEY: "example-sk-ant-x",
|
|
317
317
|
MCP_BASE_URL: "https://example.com",
|
|
318
318
|
},
|
|
319
319
|
isInteractive: false,
|
|
@@ -33,7 +33,7 @@ function config(
|
|
|
33
33
|
logFile: join(directory, `${mode}.jsonl`),
|
|
34
34
|
env: {
|
|
35
35
|
PATH: process.env.PATH ?? "/usr/bin:/bin",
|
|
36
|
-
CLAUDE_CODE_OAUTH_TOKEN: "fixture-oauth-token",
|
|
36
|
+
CLAUDE_CODE_OAUTH_TOKEN: "example-fixture-oauth-token",
|
|
37
37
|
CLAUDE_TRANSPORT: "sdk",
|
|
38
38
|
CLAUDE_QUEUE_STEERING: "1",
|
|
39
39
|
CLAUDE_BINARY: `${process.execPath} ${fixturePath}`,
|
|
@@ -24,16 +24,16 @@ describe("Claude hook credential boundary", () => {
|
|
|
24
24
|
for (const transport of ["cli", "sdk"]) {
|
|
25
25
|
const sourceEnv = {
|
|
26
26
|
CLAUDE_TRANSPORT: transport,
|
|
27
|
-
CLAUDE_CODE_OAUTH_TOKEN: "fixture-selected-oauth",
|
|
28
|
-
ANTHROPIC_API_KEY: "fixture-selected-api",
|
|
29
|
-
AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "fixture-stale-mirror",
|
|
27
|
+
CLAUDE_CODE_OAUTH_TOKEN: "example-fixture-selected-oauth",
|
|
28
|
+
ANTHROPIC_API_KEY: "example-fixture-selected-api",
|
|
29
|
+
AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "example-fixture-stale-mirror",
|
|
30
30
|
};
|
|
31
31
|
const config = {
|
|
32
32
|
taskId: crypto.randomUUID(),
|
|
33
33
|
agentId: crypto.randomUUID(),
|
|
34
34
|
env: sourceEnv,
|
|
35
35
|
apiUrl: "http://fixture.invalid",
|
|
36
|
-
apiKey: "fixture-swarm-key",
|
|
36
|
+
apiKey: "example-fixture-swarm-key",
|
|
37
37
|
} as ProviderSessionConfig;
|
|
38
38
|
const { env } = buildClaudeSessionEnvironment(
|
|
39
39
|
config,
|
|
@@ -43,7 +43,7 @@ describe("Claude hook credential boundary", () => {
|
|
|
43
43
|
expect(env.AGENT_SWARM_CLAUDE_OAUTH_TOKEN).toBeUndefined();
|
|
44
44
|
expect(env.CLAUDE_CODE_OAUTH_TOKEN).toBe(sourceEnv.CLAUDE_CODE_OAUTH_TOKEN);
|
|
45
45
|
expect(env.ANTHROPIC_API_KEY).toBe(sourceEnv.ANTHROPIC_API_KEY);
|
|
46
|
-
expect(sourceEnv.AGENT_SWARM_CLAUDE_OAUTH_TOKEN).toBe("fixture-stale-mirror");
|
|
46
|
+
expect(sourceEnv.AGENT_SWARM_CLAUDE_OAUTH_TOKEN).toBe("example-fixture-stale-mirror");
|
|
47
47
|
let summaryEnv: NodeJS.ProcessEnv | undefined;
|
|
48
48
|
await runClaudeSessionSummary(
|
|
49
49
|
config,
|
|
@@ -91,7 +91,7 @@ describe("Claude transport resolution", () => {
|
|
|
91
91
|
expect(
|
|
92
92
|
isClaudeBridgeEffective(
|
|
93
93
|
{ SWARM_USE_CLAUDE_BRIDGE: "true", CLAUDE_CODE_OAUTH_TOKEN: "" },
|
|
94
|
-
{ CLAUDE_CODE_OAUTH_TOKEN: "fallback" },
|
|
94
|
+
{ CLAUDE_CODE_OAUTH_TOKEN: "example-fallback" },
|
|
95
95
|
),
|
|
96
96
|
).toBeFalse();
|
|
97
97
|
});
|
|
@@ -104,7 +104,7 @@ function makeEnv(extra: NodeJS.ProcessEnv = {}): NodeJS.ProcessEnv {
|
|
|
104
104
|
// selectively via `extra`.
|
|
105
105
|
return {
|
|
106
106
|
MCP_BASE_URL: "http://localhost:3013",
|
|
107
|
-
API_KEY: "test-key",
|
|
107
|
+
API_KEY: "example-test-key",
|
|
108
108
|
AGENT_SWARM_TASK_ID: "task-stop-1",
|
|
109
109
|
...extra,
|
|
110
110
|
};
|
|
@@ -129,8 +129,8 @@ describe("runStopHookSessionSummary", () => {
|
|
|
129
129
|
} as unknown as ReturnType<typeof Bun.spawn>;
|
|
130
130
|
}) as typeof Bun.spawn;
|
|
131
131
|
const env = makeEnv({
|
|
132
|
-
CLAUDE_CODE_OAUTH_TOKEN: "test-oauth-token",
|
|
133
|
-
AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "test-oauth-token",
|
|
132
|
+
CLAUDE_CODE_OAUTH_TOKEN: "example-test-oauth-token",
|
|
133
|
+
AGENT_SWARM_CLAUDE_OAUTH_TOKEN: "example-test-oauth-token",
|
|
134
134
|
});
|
|
135
135
|
|
|
136
136
|
await runStopHookSessionSummarySubprocess(
|
|
@@ -152,10 +152,10 @@ describe("runStopHookSessionSummary", () => {
|
|
|
152
152
|
"session-summary-stdin",
|
|
153
153
|
]);
|
|
154
154
|
expect((spawnOptions as { env?: NodeJS.ProcessEnv }).env?.CLAUDE_CODE_OAUTH_TOKEN).toBe(
|
|
155
|
-
"test-oauth-token",
|
|
155
|
+
"example-test-oauth-token",
|
|
156
156
|
);
|
|
157
157
|
expect((spawnOptions as { env?: NodeJS.ProcessEnv }).env?.AGENT_SWARM_CLAUDE_OAUTH_TOKEN).toBe(
|
|
158
|
-
"test-oauth-token",
|
|
158
|
+
"example-test-oauth-token",
|
|
159
159
|
);
|
|
160
160
|
expect(JSON.parse(stdinPayload)).toEqual({
|
|
161
161
|
agentId: "agent-claude-memory",
|
|
@@ -232,7 +232,7 @@ describe("runStopHookSessionSummary", () => {
|
|
|
232
232
|
expect(lastRunSummarizeArgs!.taskContext.sourceTaskId).toBe("task-stop-1");
|
|
233
233
|
expect(lastRunSummarizeArgs!.taskContext.agentId).toBe("agent-claude-1");
|
|
234
234
|
expect(lastRunSummarizeArgs!.apiUrl).toBe("http://localhost:3013");
|
|
235
|
-
expect(lastRunSummarizeArgs!.apiKey).toBe("test-key");
|
|
235
|
+
expect(lastRunSummarizeArgs!.apiKey).toBe("example-test-key");
|
|
236
236
|
|
|
237
237
|
const indexCalls = fetchCalls.filter((c) => c.url.endsWith("/api/memory/index"));
|
|
238
238
|
expect(indexCalls.length).toBe(1);
|
|
@@ -248,7 +248,7 @@ describe("runStopHookSessionSummary", () => {
|
|
|
248
248
|
// Headers match the old runMemoryRater POST: Bearer + X-Agent-ID.
|
|
249
249
|
const headers = indexCalls[0]!.init?.headers as Record<string, string>;
|
|
250
250
|
expect(headers["Content-Type"]).toBe("application/json");
|
|
251
|
-
expect(headers.Authorization).toBe("Bearer test-key");
|
|
251
|
+
expect(headers.Authorization).toBe("Bearer example-test-key");
|
|
252
252
|
expect(headers["X-Agent-ID"]).toBe("agent-claude-1");
|
|
253
253
|
|
|
254
254
|
expect(consoleErrors.length).toBe(0);
|
|
@@ -320,7 +320,7 @@ describe("runStopHookSessionSummary", () => {
|
|
|
320
320
|
transcriptPath,
|
|
321
321
|
env: makeEnv({
|
|
322
322
|
// Mirror the process env into the SUT-scoped env for SKIP / MCP_BASE_URL plumbing.
|
|
323
|
-
CLAUDE_CODE_OAUTH_TOKEN: "sk-test-oauth-stop-hook",
|
|
323
|
+
CLAUDE_CODE_OAUTH_TOKEN: "example-sk-test-oauth-stop-hook",
|
|
324
324
|
}),
|
|
325
325
|
},
|
|
326
326
|
deps,
|
|
@@ -19,7 +19,7 @@ const ROTATION_AGENT_ID = "1a444444-4444-4444-8444-444444444444";
|
|
|
19
19
|
const FIXTURE_SUMMARY =
|
|
20
20
|
"The worker fixture completed a transport parity task with durable evidence.";
|
|
21
21
|
const FIXTURE_OAUTH = "synthetic-fixture-oauth-token";
|
|
22
|
-
const FIXTURE_API_KEY = "synthetic-fixture-anthropic-api-key";
|
|
22
|
+
const FIXTURE_API_KEY = "example-synthetic-fixture-anthropic-api-key";
|
|
23
23
|
const ROTATION_OAUTH_POOL = ["synthetic-rotation-oauth-oa001", "synthetic-rotation-oauth-oa002"];
|
|
24
24
|
const ROTATION_API_POOL = ["synthetic-rotation-api-ap001", "synthetic-rotation-api-ap002"];
|
|
25
25
|
|
|
@@ -260,7 +260,7 @@ async function runTransport(transport: "cli" | "sdk", agentId: string): Promise<
|
|
|
260
260
|
CLAUDE_BINARY: fixturePath,
|
|
261
261
|
CLAUDE_CODE_OAUTH_TOKEN: FIXTURE_OAUTH,
|
|
262
262
|
ANTHROPIC_API_KEY: FIXTURE_API_KEY,
|
|
263
|
-
OPENROUTER_API_KEY: "synthetic-fixture-openrouter-key",
|
|
263
|
+
OPENROUTER_API_KEY: "example-synthetic-fixture-openrouter-key",
|
|
264
264
|
OPENROUTER_BASE_URL: `http://127.0.0.1:${openRouterMock.port}`,
|
|
265
265
|
CRED_CHECK_DISABLE: "1",
|
|
266
266
|
CLAUDE_QUEUE_STEERING: "0",
|
|
@@ -401,7 +401,7 @@ async function runCredentialRotation(): Promise<void> {
|
|
|
401
401
|
CLAUDE_FIXTURE_OBSERVATION_FILE: observationFile,
|
|
402
402
|
CLAUDE_CODE_OAUTH_TOKEN: ROTATION_OAUTH_POOL.join(","),
|
|
403
403
|
ANTHROPIC_API_KEY: ROTATION_API_POOL.join(","),
|
|
404
|
-
OPENROUTER_API_KEY: "synthetic-fixture-openrouter-key",
|
|
404
|
+
OPENROUTER_API_KEY: "example-synthetic-fixture-openrouter-key",
|
|
405
405
|
OPENROUTER_BASE_URL: `http://127.0.0.1:${openRouterMock.port}`,
|
|
406
406
|
CRED_CHECK_DISABLE: "1",
|
|
407
407
|
CLAUDE_QUEUE_STEERING: "0",
|
|
@@ -43,7 +43,7 @@ import type { ProviderEvent, ProviderSessionConfig } from "../providers/types.js
|
|
|
43
43
|
|
|
44
44
|
const TEST_DB_PATH = "./test-codex-adapter-pool-auth-revalidate.sqlite";
|
|
45
45
|
const MOCK_API_URL = "http://localhost:3013";
|
|
46
|
-
const MOCK_API_KEY = "test-api-key";
|
|
46
|
+
const MOCK_API_KEY = "example-test-api-key";
|
|
47
47
|
const FAKE_HOME = "/home/fake-pool-worker";
|
|
48
48
|
|
|
49
49
|
process.env.SECRETS_ENCRYPTION_KEY = Buffer.alloc(32, 4).toString("base64");
|
|
@@ -385,9 +385,9 @@ describe("resolveCodexAuthMode — pool path revalidates through the lock", () =
|
|
|
385
385
|
auth_mode: "chatgpt",
|
|
386
386
|
OPENAI_API_KEY: null,
|
|
387
387
|
tokens: {
|
|
388
|
-
id_token: "at_local",
|
|
389
|
-
access_token: "at_local",
|
|
390
|
-
refresh_token: "rt_local",
|
|
388
|
+
id_token: "example-at_local",
|
|
389
|
+
access_token: "example-at_local",
|
|
390
|
+
refresh_token: "example-rt_local",
|
|
391
391
|
account_id: "acc-local",
|
|
392
392
|
},
|
|
393
393
|
last_refresh: new Date().toISOString(),
|
|
@@ -487,7 +487,7 @@ describe("resolveCodexAuthMode — pool path revalidates through the lock", () =
|
|
|
487
487
|
|
|
488
488
|
const existingAuthJson = JSON.stringify({
|
|
489
489
|
auth_mode: "api-key",
|
|
490
|
-
OPENAI_API_KEY: "sk-local",
|
|
490
|
+
OPENAI_API_KEY: "example-sk-local",
|
|
491
491
|
});
|
|
492
492
|
const { fs, homedir, readCurrent } = fakeAuthJsonFs(existingAuthJson);
|
|
493
493
|
const events: ProviderEvent[] = [];
|
|
@@ -448,7 +448,7 @@ describe("Codex app-server session", () => {
|
|
|
448
448
|
item: {
|
|
449
449
|
type: "agentMessage",
|
|
450
450
|
id: "secret-message",
|
|
451
|
-
text: "Authorization: Bearer sk-proj-abcdefghijklmnopqrstuvwxyz012345",
|
|
451
|
+
text: "Authorization: Bearer example-sk-proj-abcdefghijklmnopqrstuvwxyz012345",
|
|
452
452
|
},
|
|
453
453
|
});
|
|
454
454
|
});
|
|
@@ -478,7 +478,9 @@ describe("Codex app-server session", () => {
|
|
|
478
478
|
|
|
479
479
|
expect(requests).toContain("turn/interrupt");
|
|
480
480
|
expect(result).toMatchObject({ exitCode: 130, failureReason: "operator cancelled" });
|
|
481
|
-
expect(JSON.stringify(emitted)).not.toContain(
|
|
481
|
+
expect(JSON.stringify(emitted)).not.toContain(
|
|
482
|
+
"example-sk-proj-abcdefghijklmnopqrstuvwxyz012345",
|
|
483
|
+
);
|
|
482
484
|
});
|
|
483
485
|
|
|
484
486
|
test("closes queue delivery before the final result event", async () => {
|
|
@@ -1434,7 +1436,7 @@ describe("buildCodexConfig", () => {
|
|
|
1434
1436
|
agentId: "agent-mcp-test",
|
|
1435
1437
|
taskId: "task-mcp-test",
|
|
1436
1438
|
apiUrl: "http://test.invalid",
|
|
1437
|
-
apiKey: "test-key",
|
|
1439
|
+
apiKey: "example-test-key",
|
|
1438
1440
|
cwd: "",
|
|
1439
1441
|
logFile: `/tmp/codex-mcp-test-${Date.now()}-${Math.random().toString(36).slice(2)}.log`,
|
|
1440
1442
|
...overrides,
|
|
@@ -1463,7 +1465,7 @@ describe("buildCodexConfig", () => {
|
|
|
1463
1465
|
expect(Object.keys(mcp)).toEqual(["agent-swarm"]);
|
|
1464
1466
|
expect(mcp["agent-swarm"]?.url).toBe("http://test.invalid/mcp");
|
|
1465
1467
|
const headers = mcp["agent-swarm"]?.http_headers as Record<string, string>;
|
|
1466
|
-
expect(headers.Authorization).toBe("Bearer test-key");
|
|
1468
|
+
expect(headers.Authorization).toBe("Bearer example-test-key");
|
|
1467
1469
|
expect(headers["X-Agent-ID"]).toBe("agent-mcp-test");
|
|
1468
1470
|
expect(headers["X-Source-Task-Id"]).toBe("task-mcp-test");
|
|
1469
1471
|
expect(mcp["agent-swarm"]?.enabled).toBe(true);
|
|
@@ -1748,7 +1750,7 @@ describe("buildCodexConfig — context-mode + features", () => {
|
|
|
1748
1750
|
agentId: "agent-mcp-test",
|
|
1749
1751
|
taskId: "task-mcp-test",
|
|
1750
1752
|
apiUrl: "http://test.invalid",
|
|
1751
|
-
apiKey: "test-key",
|
|
1753
|
+
apiKey: "example-test-key",
|
|
1752
1754
|
cwd: "",
|
|
1753
1755
|
logFile: `/tmp/codex-ctx-test-${Date.now()}-${Math.random().toString(36).slice(2)}.log`,
|
|
1754
1756
|
...overrides,
|
|
@@ -152,7 +152,7 @@ describe("CodexAppServer", () => {
|
|
|
152
152
|
test(
|
|
153
153
|
"scrubs stderr before callbacks and process-exit errors",
|
|
154
154
|
async () => {
|
|
155
|
-
const secret = "sk-abcdefghijklmnopqrstuvwx";
|
|
155
|
+
const secret = "example-sk-abcdefghijklmnopqrstuvwx";
|
|
156
156
|
const stderr: string[] = [];
|
|
157
157
|
const server = new CodexAppServer({
|
|
158
158
|
codexPath: FIXTURE,
|
|
@@ -163,7 +163,7 @@ describe("CodexAppServer", () => {
|
|
|
163
163
|
const error = await server.request("exit").catch((caught) => caught as Error);
|
|
164
164
|
expect(error.message).toContain("exited with code 7");
|
|
165
165
|
expect(error.message).not.toContain(secret);
|
|
166
|
-
expect(stderr).toEqual(["[REDACTED:sk_key]"]);
|
|
166
|
+
expect(stderr).toEqual(["example-[REDACTED:sk_key]"]);
|
|
167
167
|
await server.close();
|
|
168
168
|
},
|
|
169
169
|
CHILD_PROCESS_TEST_BUDGET_MS,
|