@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
|
@@ -99,13 +99,13 @@ function createFetchStub(
|
|
|
99
99
|
body.email !== "admin@example.test"
|
|
100
100
|
) {
|
|
101
101
|
return Response.json({
|
|
102
|
-
apiKey: "afs-agent-key",
|
|
102
|
+
apiKey: "example-afs-agent-key",
|
|
103
103
|
userId: "agent-user",
|
|
104
104
|
orgId: "agent-personal-org",
|
|
105
105
|
});
|
|
106
106
|
}
|
|
107
107
|
return Response.json({
|
|
108
|
-
apiKey: "afs-admin-key",
|
|
108
|
+
apiKey: "example-afs-admin-key",
|
|
109
109
|
userId: "admin-user",
|
|
110
110
|
orgId: "personal-org",
|
|
111
111
|
});
|
|
@@ -208,7 +208,7 @@ describe("agent-fs provisioning seeder", () => {
|
|
|
208
208
|
|
|
209
209
|
expect(result.failed).toEqual([]);
|
|
210
210
|
expect(result.created).toBe(1);
|
|
211
|
-
expect(await configValue("API_AGENT_FS_API_KEY")).toBe("afs-admin-key");
|
|
211
|
+
expect(await configValue("API_AGENT_FS_API_KEY")).toBe("example-afs-admin-key");
|
|
212
212
|
expect(
|
|
213
213
|
(await getSwarmConfigs({ scope: "global", key: "API_AGENT_FS_API_KEY" }))[0]?.encrypted,
|
|
214
214
|
).toBe(true);
|
|
@@ -216,7 +216,7 @@ describe("agent-fs provisioning seeder", () => {
|
|
|
216
216
|
expect(await configValue("AGENT_FS_DEFAULT_ORG_ID")).toBe("shared-org");
|
|
217
217
|
expect(await configValue("AGENT_FS_SHARED_ORG_ID")).toBe("shared-org");
|
|
218
218
|
expect(await configValue("AGENT_FS_DEFAULT_DRIVE_ID")).toBe("shared-drive");
|
|
219
|
-
expect(process.env.API_AGENT_FS_API_KEY).toBe("afs-admin-key");
|
|
219
|
+
expect(process.env.API_AGENT_FS_API_KEY).toBe("example-afs-admin-key");
|
|
220
220
|
|
|
221
221
|
const register = records.find((r) => r.path === "/auth/register");
|
|
222
222
|
expect(register?.body).toEqual({ email: "admin@example.test" });
|
|
@@ -255,7 +255,7 @@ describe("agent-fs provisioning seeder", () => {
|
|
|
255
255
|
await upsertSwarmConfig({
|
|
256
256
|
scope: "global",
|
|
257
257
|
key: "API_AGENT_FS_API_KEY",
|
|
258
|
-
value: "afs-admin-key",
|
|
258
|
+
value: "example-afs-admin-key",
|
|
259
259
|
isSecret: true,
|
|
260
260
|
});
|
|
261
261
|
await upsertSwarmConfig({
|
|
@@ -324,7 +324,7 @@ describe("agent-fs provisioning seeder", () => {
|
|
|
324
324
|
await upsertSwarmConfig({
|
|
325
325
|
scope: "global",
|
|
326
326
|
key: "API_AGENT_FS_API_KEY",
|
|
327
|
-
value: "afs-admin-key",
|
|
327
|
+
value: "example-afs-admin-key",
|
|
328
328
|
isSecret: true,
|
|
329
329
|
});
|
|
330
330
|
await upsertSwarmConfig({
|
|
@@ -388,7 +388,7 @@ describe("agent-fs provisioning seeder", () => {
|
|
|
388
388
|
await upsertSwarmConfig({
|
|
389
389
|
scope: "global",
|
|
390
390
|
key: "API_AGENT_FS_API_KEY",
|
|
391
|
-
value: "afs-admin-key",
|
|
391
|
+
value: "example-afs-admin-key",
|
|
392
392
|
isSecret: true,
|
|
393
393
|
});
|
|
394
394
|
await upsertSwarmConfig({
|
|
@@ -438,7 +438,7 @@ describe("agent-fs provisioning seeder", () => {
|
|
|
438
438
|
await upsertSwarmConfig({
|
|
439
439
|
scope: "global",
|
|
440
440
|
key: "API_AGENT_FS_API_KEY",
|
|
441
|
-
value: "afs-admin-key",
|
|
441
|
+
value: "example-afs-admin-key",
|
|
442
442
|
isSecret: true,
|
|
443
443
|
});
|
|
444
444
|
await upsertSwarmConfig({
|
|
@@ -492,7 +492,7 @@ describe("agent-fs provisioning seeder", () => {
|
|
|
492
492
|
key: "AGENT_FS_API_KEY",
|
|
493
493
|
})
|
|
494
494
|
)[0];
|
|
495
|
-
expect(agentKey?.value).toBe("afs-agent-key");
|
|
495
|
+
expect(agentKey?.value).toBe("example-afs-agent-key");
|
|
496
496
|
expect(agentKey?.encrypted).toBe(true);
|
|
497
497
|
expect(records.find((r) => r.path === "/auth/register")?.body).toEqual({
|
|
498
498
|
email: `custom-worker-${suffix}@example.test`,
|
|
@@ -516,7 +516,7 @@ describe("agent-fs provisioning seeder", () => {
|
|
|
516
516
|
await upsertSwarmConfig({
|
|
517
517
|
scope: "global",
|
|
518
518
|
key: "API_AGENT_FS_API_KEY",
|
|
519
|
-
value: "afs-admin-key",
|
|
519
|
+
value: "example-afs-admin-key",
|
|
520
520
|
isSecret: true,
|
|
521
521
|
});
|
|
522
522
|
await upsertSwarmConfig({
|
|
@@ -570,7 +570,7 @@ describe("agent-fs provisioning seeder", () => {
|
|
|
570
570
|
key: "AGENT_FS_API_KEY",
|
|
571
571
|
})
|
|
572
572
|
)[0]?.value,
|
|
573
|
-
).toBe("afs-agent-key");
|
|
573
|
+
).toBe("example-afs-agent-key");
|
|
574
574
|
|
|
575
575
|
const registrations = records
|
|
576
576
|
.filter((record) => record.path === "/auth/register")
|
|
@@ -595,7 +595,7 @@ describe("agent-fs provisioning seeder", () => {
|
|
|
595
595
|
const invite = records.find((r) => r.path === "/orgs/shared-org/members/invite");
|
|
596
596
|
expect(invite?.method).toBe("POST");
|
|
597
597
|
expect(invite?.body).toEqual({ email: "Customer@Example.test", role: "admin" });
|
|
598
|
-
expect(invite?.authorization).toBe("Bearer afs-admin-key");
|
|
598
|
+
expect(invite?.authorization).toBe("Bearer example-afs-admin-key");
|
|
599
599
|
});
|
|
600
600
|
|
|
601
601
|
test("does not re-invite an external email whose current role already covers the request", async () => {
|
|
@@ -29,7 +29,7 @@ describe("selectCredential", () => {
|
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
test("comma-separated picks one randomly", () => {
|
|
32
|
-
const value = "key-aaa11,key-bbb22,key-ccc33";
|
|
32
|
+
const value = "example-key-aaa11,example-key-bbb22,example-key-ccc33";
|
|
33
33
|
const results = new Set<string>();
|
|
34
34
|
for (let i = 0; i < 100; i++) {
|
|
35
35
|
const result = selectCredential(value);
|
|
@@ -44,47 +44,47 @@ describe("selectCredential", () => {
|
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
test("respects availableIndices for rate-limit-aware selection", () => {
|
|
47
|
-
const value = "key-aaa11,key-bbb22,key-ccc33";
|
|
47
|
+
const value = "example-key-aaa11,example-key-bbb22,example-key-ccc33";
|
|
48
48
|
for (let i = 0; i < 50; i++) {
|
|
49
49
|
const result = selectCredential(value, [1]); // Only index 1 is available
|
|
50
|
-
expect(result.selected).toBe("key-bbb22");
|
|
50
|
+
expect(result.selected).toBe("example-key-bbb22");
|
|
51
51
|
expect(result.index).toBe(1);
|
|
52
52
|
}
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
test("falls back to random when all keys are rate-limited (empty availableIndices)", () => {
|
|
56
|
-
const value = "key-aaa11,key-bbb22";
|
|
56
|
+
const value = "example-key-aaa11,example-key-bbb22";
|
|
57
57
|
const result = selectCredential(value, []);
|
|
58
|
-
expect(["key-aaa11", "key-bbb22"]).toContain(result.selected);
|
|
58
|
+
expect(["example-key-aaa11", "example-key-bbb22"]).toContain(result.selected);
|
|
59
59
|
expect(result.isRateLimitFallback).toBe(true);
|
|
60
60
|
});
|
|
61
61
|
|
|
62
62
|
test("filters out-of-range availableIndices", () => {
|
|
63
|
-
const value = "key-aaa11,key-bbb22";
|
|
63
|
+
const value = "example-key-aaa11,example-key-bbb22";
|
|
64
64
|
const result = selectCredential(value, [99]); // Out of range
|
|
65
65
|
// Falls back to random
|
|
66
|
-
expect(["key-aaa11", "key-bbb22"]).toContain(result.selected);
|
|
66
|
+
expect(["example-key-aaa11", "example-key-bbb22"]).toContain(result.selected);
|
|
67
67
|
expect(result.isRateLimitFallback).toBe(true);
|
|
68
68
|
});
|
|
69
69
|
|
|
70
70
|
test("isRateLimitFallback is false when indices are available", () => {
|
|
71
|
-
const result = selectCredential("key-aaa11,key-bbb22", [0, 1]);
|
|
71
|
+
const result = selectCredential("example-key-aaa11,example-key-bbb22", [0, 1]);
|
|
72
72
|
expect(result.isRateLimitFallback).toBe(false);
|
|
73
73
|
});
|
|
74
74
|
|
|
75
75
|
test("isRateLimitFallback is false when no availability info", () => {
|
|
76
|
-
const result = selectCredential("key-aaa11,key-bbb22");
|
|
76
|
+
const result = selectCredential("example-key-aaa11,example-key-bbb22");
|
|
77
77
|
expect(result.isRateLimitFallback).toBe(false);
|
|
78
78
|
});
|
|
79
79
|
|
|
80
80
|
test("single key with empty availableIndices sets isRateLimitFallback", () => {
|
|
81
|
-
const result = selectCredential("single-key", []);
|
|
81
|
+
const result = selectCredential("example-single-key", []);
|
|
82
82
|
expect(result.isRateLimitFallback).toBe(true);
|
|
83
|
-
expect(result.selected).toBe("single-key");
|
|
83
|
+
expect(result.selected).toBe("example-single-key");
|
|
84
84
|
});
|
|
85
85
|
|
|
86
86
|
test("keySuffix is last 5 chars of selected key", () => {
|
|
87
|
-
const result = selectCredential("sk-ant-api03-abcde12345");
|
|
87
|
+
const result = selectCredential("example-sk-ant-api03-abcde12345");
|
|
88
88
|
expect(result.keySuffix).toBe("12345");
|
|
89
89
|
});
|
|
90
90
|
|
|
@@ -102,31 +102,31 @@ describe("selectCredential", () => {
|
|
|
102
102
|
describe("resolveCredentialPools", () => {
|
|
103
103
|
test("returns selections for pool vars", async () => {
|
|
104
104
|
const env: Record<string, string | undefined> = {
|
|
105
|
-
ANTHROPIC_API_KEY: "key-aaa11,key-bbb22",
|
|
105
|
+
ANTHROPIC_API_KEY: "example-key-aaa11,example-key-bbb22",
|
|
106
106
|
};
|
|
107
107
|
const selections = await resolveCredentialPools(env);
|
|
108
108
|
expect(selections.length).toBe(1);
|
|
109
109
|
expect(selections[0]!.total).toBe(2);
|
|
110
110
|
expect(selections[0]!.keyType).toBe("ANTHROPIC_API_KEY");
|
|
111
111
|
// Env should be mutated to the selected key
|
|
112
|
-
expect(["key-aaa11", "key-bbb22"]).toContain(env.ANTHROPIC_API_KEY);
|
|
112
|
+
expect(["example-key-aaa11", "example-key-bbb22"]).toContain(env.ANTHROPIC_API_KEY);
|
|
113
113
|
});
|
|
114
114
|
|
|
115
115
|
test("passes availableIndicesMap through", async () => {
|
|
116
116
|
const env: Record<string, string | undefined> = {
|
|
117
|
-
ANTHROPIC_API_KEY: "key-aaa11,key-bbb22,key-ccc33",
|
|
117
|
+
ANTHROPIC_API_KEY: "example-key-aaa11,example-key-bbb22,example-key-ccc33",
|
|
118
118
|
};
|
|
119
119
|
const selections = await resolveCredentialPools(env, {
|
|
120
120
|
availableIndicesMap: { ANTHROPIC_API_KEY: [2] },
|
|
121
121
|
});
|
|
122
122
|
expect(selections.length).toBe(1);
|
|
123
123
|
expect(selections[0]!.index).toBe(2);
|
|
124
|
-
expect(env.ANTHROPIC_API_KEY).toBe("key-ccc33");
|
|
124
|
+
expect(env.ANTHROPIC_API_KEY).toBe("example-key-ccc33");
|
|
125
125
|
});
|
|
126
126
|
|
|
127
127
|
test("single keys are tracked with index 0", async () => {
|
|
128
128
|
const env: Record<string, string | undefined> = {
|
|
129
|
-
ANTHROPIC_API_KEY: "single-key",
|
|
129
|
+
ANTHROPIC_API_KEY: "example-single-key",
|
|
130
130
|
};
|
|
131
131
|
const selections = await resolveCredentialPools(env);
|
|
132
132
|
expect(selections.length).toBe(1);
|
|
@@ -134,7 +134,7 @@ describe("resolveCredentialPools", () => {
|
|
|
134
134
|
expect(selections[0]!.total).toBe(1);
|
|
135
135
|
expect(selections[0]!.keySuffix).toBe("e-key");
|
|
136
136
|
expect(selections[0]!.keyType).toBe("ANTHROPIC_API_KEY");
|
|
137
|
-
expect(env.ANTHROPIC_API_KEY).toBe("single-key");
|
|
137
|
+
expect(env.ANTHROPIC_API_KEY).toBe("example-single-key");
|
|
138
138
|
});
|
|
139
139
|
});
|
|
140
140
|
|
|
@@ -11,11 +11,13 @@ describe("getApiKey", () => {
|
|
|
11
11
|
});
|
|
12
12
|
|
|
13
13
|
test("returns AGENT_SWARM_API_KEY when only preferred var is set", () => {
|
|
14
|
-
expect(getApiKey({ AGENT_SWARM_API_KEY: "preferred" })).toBe("preferred");
|
|
14
|
+
expect(getApiKey({ AGENT_SWARM_API_KEY: "example-preferred" })).toBe("example-preferred");
|
|
15
15
|
});
|
|
16
16
|
|
|
17
17
|
test("prefers AGENT_SWARM_API_KEY over API_KEY when both set", () => {
|
|
18
|
-
expect(getApiKey({ AGENT_SWARM_API_KEY: "preferred", API_KEY: "legacy" })).toBe(
|
|
18
|
+
expect(getApiKey({ AGENT_SWARM_API_KEY: "example-preferred", API_KEY: "legacy" })).toBe(
|
|
19
|
+
"example-preferred",
|
|
20
|
+
);
|
|
19
21
|
});
|
|
20
22
|
|
|
21
23
|
test("falls back to API_KEY if AGENT_SWARM_API_KEY is undefined", () => {
|
|
@@ -22,7 +22,7 @@ import { registerAppPatchTool } from "../tools/app-patch";
|
|
|
22
22
|
import { setRequestAuth } from "../utils/request-auth-context";
|
|
23
23
|
|
|
24
24
|
const TEST_DB_PATH = `/private/tmp/test-apps-rbac-${process.pid}.sqlite`;
|
|
25
|
-
const API_KEY = "apps-rbac-test-key";
|
|
25
|
+
const API_KEY = "example-apps-rbac-test-key";
|
|
26
26
|
const AGENT_ID = crypto.randomUUID();
|
|
27
27
|
const LEAD_ID = crypto.randomUUID();
|
|
28
28
|
const OPERATOR_ACTOR: IdentityActor = { kind: "operator", id: "apps-rbac-test" };
|
|
@@ -1806,7 +1806,7 @@ describe("apps spike 5 lifecycle", () => {
|
|
|
1806
1806
|
const appId = await createApp(migrationDefinition);
|
|
1807
1807
|
const row = await createRow(appId, { title: "MCP failure", status: "open" });
|
|
1808
1808
|
const namespace = appsNamespace(appId);
|
|
1809
|
-
const secret = "phase2-migration-secret-value";
|
|
1809
|
+
const secret = "example-phase2-migration-secret-value";
|
|
1810
1810
|
process.env.SPIKE5_MIGRATION_SECRET = secret;
|
|
1811
1811
|
refreshSecretScrubberCache();
|
|
1812
1812
|
await getDbClient().run(`
|
|
@@ -61,7 +61,7 @@ const spawnDescribe = describe.skipIf(SKIP_SANDBOX_SPAWN_TESTS);
|
|
|
61
61
|
const skip = test.skipIf(SKIP_SANDBOX_SPAWN_TESTS);
|
|
62
62
|
|
|
63
63
|
const TEST_DB_PATH = `/private/tmp/test-apps-sync-engine-${process.pid}.sqlite`;
|
|
64
|
-
const API_KEY = "apps-sync-engine-test-key-0123456789";
|
|
64
|
+
const API_KEY = "example-apps-sync-engine-test-key-0123456789";
|
|
65
65
|
const OWNER_AGENT_ID = crypto.randomUUID();
|
|
66
66
|
const LEAD_AGENT_ID = crypto.randomUUID();
|
|
67
67
|
const savedEnv = { ...process.env };
|
|
@@ -933,7 +933,7 @@ describe("swarm-tasks source", () => {
|
|
|
933
933
|
});
|
|
934
934
|
|
|
935
935
|
test("engine-generated warnings carrying a known secret come back redacted", async () => {
|
|
936
|
-
const secret = "fixture-secret-value-0123456789";
|
|
936
|
+
const secret = "example-fixture-secret-value-0123456789";
|
|
937
937
|
process.env.APPS_SYNC_FIXTURE_TOKEN = secret;
|
|
938
938
|
refreshSecretScrubberCache();
|
|
939
939
|
try {
|
|
@@ -968,7 +968,7 @@ describe("swarm-tasks source", () => {
|
|
|
968
968
|
});
|
|
969
969
|
|
|
970
970
|
test("an engine-generated pass error carrying a known secret is redacted in the status KV", async () => {
|
|
971
|
-
const secret = "fixture-secret-value-0123456789";
|
|
971
|
+
const secret = "example-fixture-secret-value-0123456789";
|
|
972
972
|
process.env.APPS_SYNC_FIXTURE_TOKEN = secret;
|
|
973
973
|
refreshSecretScrubberCache();
|
|
974
974
|
try {
|
|
@@ -1429,7 +1429,7 @@ spawnDescribe("pass snapshot consistency", () => {
|
|
|
1429
1429
|
|
|
1430
1430
|
spawnDescribe("secret hygiene and sync status", () => {
|
|
1431
1431
|
test("a pass error carrying a known secret comes back redacted", async () => {
|
|
1432
|
-
const secret = "fixture-secret-value-0123456789";
|
|
1432
|
+
const secret = "example-fixture-secret-value-0123456789";
|
|
1433
1433
|
process.env.APPS_SYNC_FIXTURE_TOKEN = secret;
|
|
1434
1434
|
refreshSecretScrubberCache();
|
|
1435
1435
|
try {
|
|
@@ -1588,7 +1588,7 @@ spawnDescribe("secret hygiene and sync status", () => {
|
|
|
1588
1588
|
});
|
|
1589
1589
|
|
|
1590
1590
|
test("a pulled field carrying a known secret is redacted before it lands in a row", async () => {
|
|
1591
|
-
const secret = "fixture-secret-value-0123456789";
|
|
1591
|
+
const secret = "example-fixture-secret-value-0123456789";
|
|
1592
1592
|
process.env.APPS_SYNC_FIXTURE_TOKEN = secret;
|
|
1593
1593
|
refreshSecretScrubberCache();
|
|
1594
1594
|
try {
|
|
@@ -1610,7 +1610,7 @@ spawnDescribe("secret hygiene and sync status", () => {
|
|
|
1610
1610
|
});
|
|
1611
1611
|
|
|
1612
1612
|
test("a secret straddling the prompt cap is scrubbed before truncation", async () => {
|
|
1613
|
-
const secret = "fixture-secret-value-0123456789";
|
|
1613
|
+
const secret = "example-fixture-secret-value-0123456789";
|
|
1614
1614
|
process.env.APPS_SYNC_FIXTURE_TOKEN = secret;
|
|
1615
1615
|
refreshSecretScrubberCache();
|
|
1616
1616
|
try {
|
|
@@ -1643,7 +1643,7 @@ spawnDescribe("secret hygiene and sync status", () => {
|
|
|
1643
1643
|
});
|
|
1644
1644
|
|
|
1645
1645
|
test("a secret straddling the stderr cap is scrubbed before truncation", async () => {
|
|
1646
|
-
const secret = "fixture-secret-value-0123456789";
|
|
1646
|
+
const secret = "example-fixture-secret-value-0123456789";
|
|
1647
1647
|
process.env.APPS_SYNC_FIXTURE_TOKEN = secret;
|
|
1648
1648
|
refreshSecretScrubberCache();
|
|
1649
1649
|
try {
|
|
@@ -2376,7 +2376,7 @@ spawnDescribe("a sync source against a dummy GitHub through the real sandbox", (
|
|
|
2376
2376
|
// that is the point of these tests: GITHUB_TOKEN's binding is allowlisted to
|
|
2377
2377
|
// api.github.com, so an active binding exists while the fixture host does not
|
|
2378
2378
|
// match it — the placeholder must therefore leave the sandbox unsubstituted.
|
|
2379
|
-
const FIXTURE_TOKEN = "ghp_fixture_secret_value_9876543210";
|
|
2379
|
+
const FIXTURE_TOKEN = "example-ghp_fixture_secret_value_9876543210";
|
|
2380
2380
|
|
|
2381
2381
|
let fixture: ReturnType<typeof Bun.serve>;
|
|
2382
2382
|
let origin = "";
|
|
@@ -25,7 +25,7 @@ import type { RbacCheck } from "../rbac/types";
|
|
|
25
25
|
import { setRequestAuth } from "../utils/request-auth-context";
|
|
26
26
|
|
|
27
27
|
const TEST_DB_PATH = `/private/tmp/test-apps-user-config-${process.pid}.sqlite`;
|
|
28
|
-
const API_KEY = "apps-user-config-test-key";
|
|
28
|
+
const API_KEY = "example-apps-user-config-test-key";
|
|
29
29
|
const AGENT_ID = crypto.randomUUID();
|
|
30
30
|
const OPERATOR_ACTOR: IdentityActor = { kind: "operator", id: "apps-user-config-test" };
|
|
31
31
|
const mutableLegacyPolicy = LEGACY_POLICY as unknown as Record<"app.use", LegacyRule>;
|
|
@@ -142,7 +142,7 @@ describe("createArtifactServer", () => {
|
|
|
142
142
|
|
|
143
143
|
beforeAll(() => {
|
|
144
144
|
process.env.AGENT_ID = "test-agent-id";
|
|
145
|
-
process.env.API_KEY = "test-api-key";
|
|
145
|
+
process.env.API_KEY = "example-test-api-key";
|
|
146
146
|
process.env.MCP_BASE_URL = "http://localhost:19999"; // Intentionally unreachable
|
|
147
147
|
});
|
|
148
148
|
|
|
@@ -342,7 +342,7 @@ describe("createArtifactServer", () => {
|
|
|
342
342
|
const path = c.req.path.replace("/@swarm/api", "/api");
|
|
343
343
|
const targetUrl = `http://localhost:${mockMcpPort}${path}`;
|
|
344
344
|
const headers: Record<string, string> = {
|
|
345
|
-
Authorization: "Bearer test-api-key",
|
|
345
|
+
Authorization: "Bearer example-test-api-key",
|
|
346
346
|
"X-Agent-ID": "test-agent-id",
|
|
347
347
|
};
|
|
348
348
|
if (c.req.method !== "GET") {
|
|
@@ -368,7 +368,7 @@ describe("createArtifactServer", () => {
|
|
|
368
368
|
try {
|
|
369
369
|
// Test GET request headers
|
|
370
370
|
await fetch(`http://localhost:${proxyPort}/@swarm/api/agents`);
|
|
371
|
-
expect(capturedHeaders.authorization).toBe("Bearer test-api-key");
|
|
371
|
+
expect(capturedHeaders.authorization).toBe("Bearer example-test-api-key");
|
|
372
372
|
expect(capturedHeaders["x-agent-id"]).toBe("test-agent-id");
|
|
373
373
|
|
|
374
374
|
// GET should NOT have Content-Type
|
|
@@ -379,7 +379,7 @@ describe("createArtifactServer", () => {
|
|
|
379
379
|
method: "POST",
|
|
380
380
|
body: JSON.stringify({ task: "test" }),
|
|
381
381
|
});
|
|
382
|
-
expect(capturedHeaders.authorization).toBe("Bearer test-api-key");
|
|
382
|
+
expect(capturedHeaders.authorization).toBe("Bearer example-test-api-key");
|
|
383
383
|
expect(capturedHeaders["x-agent-id"]).toBe("test-agent-id");
|
|
384
384
|
expect(capturedHeaders["content-type"]).toBe("application/json");
|
|
385
385
|
} finally {
|
|
@@ -594,7 +594,7 @@ describe("artifact CLI command", () => {
|
|
|
594
594
|
|
|
595
595
|
const origEnv = { ...process.env };
|
|
596
596
|
process.env.MCP_BASE_URL = `http://localhost:${mockPort}`;
|
|
597
|
-
process.env.API_KEY = "test-key";
|
|
597
|
+
process.env.API_KEY = "example-test-key";
|
|
598
598
|
process.env.AGENT_ID = "test-agent";
|
|
599
599
|
|
|
600
600
|
const consoleSpy = mock(() => {});
|
|
@@ -627,7 +627,7 @@ describe("artifact CLI command", () => {
|
|
|
627
627
|
|
|
628
628
|
const origEnv = { ...process.env };
|
|
629
629
|
process.env.MCP_BASE_URL = `http://localhost:${mockPort}`;
|
|
630
|
-
process.env.API_KEY = "test-key";
|
|
630
|
+
process.env.API_KEY = "example-test-key";
|
|
631
631
|
process.env.AGENT_ID = "test-agent";
|
|
632
632
|
|
|
633
633
|
const consoleSpy = mock(() => {});
|
|
@@ -678,7 +678,7 @@ describe("artifact CLI command", () => {
|
|
|
678
678
|
|
|
679
679
|
const origEnv = { ...process.env };
|
|
680
680
|
process.env.MCP_BASE_URL = `http://localhost:${mockPort}`;
|
|
681
|
-
process.env.API_KEY = "test-key";
|
|
681
|
+
process.env.API_KEY = "example-test-key";
|
|
682
682
|
process.env.AGENT_ID = "test-agent";
|
|
683
683
|
|
|
684
684
|
const consoleSpy = mock(() => {});
|
|
@@ -734,7 +734,7 @@ describe("artifact CLI command", () => {
|
|
|
734
734
|
|
|
735
735
|
const origEnv = { ...process.env };
|
|
736
736
|
process.env.MCP_BASE_URL = `http://localhost:${mockPort}`;
|
|
737
|
-
process.env.API_KEY = "test-key";
|
|
737
|
+
process.env.API_KEY = "example-test-key";
|
|
738
738
|
process.env.AGENT_ID = "test-agent";
|
|
739
739
|
|
|
740
740
|
const consoleSpy = mock(() => {});
|
|
@@ -77,6 +77,7 @@ describe("asset namespace MCP exposure", () => {
|
|
|
77
77
|
{
|
|
78
78
|
agentId: targetAgentId,
|
|
79
79
|
routingReason: "human_pinned",
|
|
80
|
+
routingNote: "This test explicitly selects the target worker",
|
|
80
81
|
task: `inherited namespace ${Date.now()}`,
|
|
81
82
|
allowDuplicate: true,
|
|
82
83
|
},
|
|
@@ -92,6 +93,7 @@ describe("asset namespace MCP exposure", () => {
|
|
|
92
93
|
{
|
|
93
94
|
agentId: targetAgentId,
|
|
94
95
|
routingReason: "human_pinned",
|
|
96
|
+
routingNote: "This test explicitly selects the target worker",
|
|
95
97
|
task: `wrong namespace ${Date.now()}`,
|
|
96
98
|
key: `personal/${otherUserId}/drafts/`,
|
|
97
99
|
allowDuplicate: true,
|
|
@@ -73,7 +73,7 @@ describe("Automation preflight alerts", () => {
|
|
|
73
73
|
});
|
|
74
74
|
|
|
75
75
|
test("scrubs alert text and logs Slack failures without throwing", async () => {
|
|
76
|
-
const secret = "preflight-alert-sensitive-fixture";
|
|
76
|
+
const secret = "example-preflight-alert-sensitive-fixture";
|
|
77
77
|
registerVolatileSecret(secret, "PREFLIGHT_TEST_SECRET");
|
|
78
78
|
postMessage.mockRejectedValueOnce(new Error(`Slack failed: ${secret}`));
|
|
79
79
|
const error = spyOn(console, "error").mockImplementation(() => {});
|
|
@@ -636,6 +636,7 @@ describe("getBasePrompt: steering section", () => {
|
|
|
636
636
|
});
|
|
637
637
|
|
|
638
638
|
test("excluded when steering is not enabled", async () => {
|
|
639
|
+
process.env.STEERING_ENABLED = "false";
|
|
639
640
|
const result = await getBasePrompt({ ...minimalArgs, traits: steerableTraits });
|
|
640
641
|
expect(result).not.toContain(STEERING_HEADER);
|
|
641
642
|
});
|
|
@@ -960,21 +961,21 @@ describe("truncateRepoClaudeMd", () => {
|
|
|
960
961
|
// ---------------------------------------------------------------------------
|
|
961
962
|
|
|
962
963
|
describe("getBasePrompt: size budget", () => {
|
|
963
|
-
//
|
|
964
|
-
//
|
|
965
|
-
test("a fresh claude worker stays under 5,
|
|
964
|
+
// Include the explicit task-output budget and exceptions in the static prompt.
|
|
965
|
+
// Keep tight role-specific ceilings to catch unrelated prompt growth.
|
|
966
|
+
test("a fresh claude worker stays under 5,400 characters", async () => {
|
|
966
967
|
const result = await getBasePrompt({ ...minimalArgs, name: "Ada", traits: localTraits });
|
|
967
|
-
expect(result.length).toBeLessThan(
|
|
968
|
+
expect(result.length).toBeLessThan(5_400);
|
|
968
969
|
});
|
|
969
970
|
|
|
970
|
-
test("a fresh claude lead stays under 5,
|
|
971
|
+
test("a fresh claude lead stays under 5,500 characters", async () => {
|
|
971
972
|
const result = await getBasePrompt({
|
|
972
973
|
...minimalArgs,
|
|
973
974
|
role: "lead",
|
|
974
975
|
name: "Cora",
|
|
975
976
|
traits: localTraits,
|
|
976
977
|
});
|
|
977
|
-
expect(result.length).toBeLessThan(
|
|
978
|
+
expect(result.length).toBeLessThan(5_500);
|
|
978
979
|
});
|
|
979
980
|
|
|
980
981
|
test("Picateclas spawn-OOM hardening: the kitchen sink stays below MAX_ARG_STRLEN", async () => {
|
|
@@ -29,7 +29,7 @@ import { listenOnFreePort } from "./test-net";
|
|
|
29
29
|
const TEST_DB_PATH = "./test-budget-user-scope.sqlite";
|
|
30
30
|
const NOW = new Date("2026-04-28T15:30:00.000Z");
|
|
31
31
|
const TODAY = "2026-04-28";
|
|
32
|
-
const API_KEY = "test-budget-user-scope-key";
|
|
32
|
+
const API_KEY = "example-test-budget-user-scope-key";
|
|
33
33
|
const ACTOR: IdentityActor = { kind: "operator", id: "phase6-test" };
|
|
34
34
|
|
|
35
35
|
async function removeDbFiles(path: string): Promise<void> {
|
|
@@ -25,7 +25,7 @@ import { getPathSegments, parseQueryParams } from "../http/utils";
|
|
|
25
25
|
import { listenOnFreePort } from "./test-net";
|
|
26
26
|
|
|
27
27
|
const TEST_DB_PATH = "./test-budgets-routes.sqlite";
|
|
28
|
-
const API_KEY = "test-budget-secret-key";
|
|
28
|
+
const API_KEY = "example-test-budget-secret-key";
|
|
29
29
|
|
|
30
30
|
async function removeDbFiles(path: string): Promise<void> {
|
|
31
31
|
for (const suffix of ["", "-wal", "-shm"]) {
|