@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
|
@@ -27,6 +27,8 @@ import {
|
|
|
27
27
|
|
|
28
28
|
const TEST_DB_PATH = "./test-workflow-triggers-v2.sqlite";
|
|
29
29
|
|
|
30
|
+
const secretRef = (name: string): string => `secret.${name}`;
|
|
31
|
+
|
|
30
32
|
// ─── Test Executor ──────────────────────────────────────────
|
|
31
33
|
|
|
32
34
|
class NoopExecutor extends BaseExecutor<typeof NoopExecutor.schema, typeof NoopExecutor.outSchema> {
|
|
@@ -86,7 +88,7 @@ async function makeWorkflow(
|
|
|
86
88
|
// ─── HMAC Verification ──────────────────────────────────────
|
|
87
89
|
|
|
88
90
|
describe("verifyHmacSignature", () => {
|
|
89
|
-
const secret = "test-secret-123";
|
|
91
|
+
const secret = "example-test-secret-123";
|
|
90
92
|
const body = '{"event":"test"}';
|
|
91
93
|
|
|
92
94
|
test("valid sha256=<hex> signature passes", () => {
|
|
@@ -123,7 +125,7 @@ describe("verifyHmacSignature", () => {
|
|
|
123
125
|
});
|
|
124
126
|
|
|
125
127
|
describe("verifyTimestampedHmacSignature", () => {
|
|
126
|
-
const secret = "timestamped-secret";
|
|
128
|
+
const secret = "example-timestamped-secret";
|
|
127
129
|
const body = '{"event":"finding.triage_completed"}';
|
|
128
130
|
const timestamp = 1_700_000_000;
|
|
129
131
|
const nowMs = timestamp * 1000;
|
|
@@ -213,7 +215,7 @@ describe("verifyTokenEquality", () => {
|
|
|
213
215
|
|
|
214
216
|
describe("handleWebhookTrigger", () => {
|
|
215
217
|
test("valid HMAC starts workflow", async () => {
|
|
216
|
-
const secret = "my-webhook-secret";
|
|
218
|
+
const secret = "example-my-webhook-secret";
|
|
217
219
|
const workflow = await makeWorkflow({
|
|
218
220
|
triggers: [{ type: "webhook", hmacSecret: secret }],
|
|
219
221
|
});
|
|
@@ -241,7 +243,7 @@ describe("handleWebhookTrigger", () => {
|
|
|
241
243
|
|
|
242
244
|
test("invalid HMAC rejects with 401", async () => {
|
|
243
245
|
const workflow = await makeWorkflow({
|
|
244
|
-
triggers: [{ type: "webhook", hmacSecret: "secret-123" }],
|
|
246
|
+
triggers: [{ type: "webhook", hmacSecret: "example-secret-123" }],
|
|
245
247
|
});
|
|
246
248
|
|
|
247
249
|
try {
|
|
@@ -260,7 +262,7 @@ describe("handleWebhookTrigger", () => {
|
|
|
260
262
|
|
|
261
263
|
test("missing signature rejects with 401 when hmacSecret is set", async () => {
|
|
262
264
|
const workflow = await makeWorkflow({
|
|
263
|
-
triggers: [{ type: "webhook", hmacSecret: "secret-xyz" }],
|
|
265
|
+
triggers: [{ type: "webhook", hmacSecret: "example-secret-xyz" }],
|
|
264
266
|
});
|
|
265
267
|
|
|
266
268
|
try {
|
|
@@ -374,7 +376,7 @@ describe("handleWebhookTrigger — custom hmacHeader", () => {
|
|
|
374
376
|
}
|
|
375
377
|
|
|
376
378
|
test("custom hmacHeader (X-Webhook-Signature) is picked up and verified", async () => {
|
|
377
|
-
const secret = "kapso-secret";
|
|
379
|
+
const secret = "example-kapso-secret";
|
|
378
380
|
const workflow = await makeWorkflow({
|
|
379
381
|
triggers: [{ type: "webhook", hmacSecret: secret, hmacHeader: "X-Webhook-Signature" }],
|
|
380
382
|
});
|
|
@@ -393,7 +395,7 @@ describe("handleWebhookTrigger — custom hmacHeader", () => {
|
|
|
393
395
|
});
|
|
394
396
|
|
|
395
397
|
test("custom hmacHeader lookup is case-insensitive", async () => {
|
|
396
|
-
const secret = "kapso-secret-ci";
|
|
398
|
+
const secret = "example-kapso-secret-ci";
|
|
397
399
|
const workflow = await makeWorkflow({
|
|
398
400
|
triggers: [{ type: "webhook", hmacSecret: secret, hmacHeader: "X-Webhook-Signature" }],
|
|
399
401
|
});
|
|
@@ -410,7 +412,7 @@ describe("handleWebhookTrigger — custom hmacHeader", () => {
|
|
|
410
412
|
});
|
|
411
413
|
|
|
412
414
|
test("signature on a non-configured header is rejected as missing", async () => {
|
|
413
|
-
const secret = "kapso-secret-2";
|
|
415
|
+
const secret = "example-kapso-secret-2";
|
|
414
416
|
const workflow = await makeWorkflow({
|
|
415
417
|
triggers: [{ type: "webhook", hmacSecret: secret, hmacHeader: "X-Webhook-Signature" }],
|
|
416
418
|
});
|
|
@@ -432,7 +434,7 @@ describe("handleWebhookTrigger — custom hmacHeader", () => {
|
|
|
432
434
|
});
|
|
433
435
|
|
|
434
436
|
test("fallback header (x-signature) still works without explicit hmacHeader", async () => {
|
|
435
|
-
const secret = "fallback-secret";
|
|
437
|
+
const secret = "example-fallback-secret";
|
|
436
438
|
const workflow = await makeWorkflow({
|
|
437
439
|
triggers: [{ type: "webhook", hmacSecret: secret }],
|
|
438
440
|
});
|
|
@@ -449,7 +451,7 @@ describe("handleWebhookTrigger — custom hmacHeader", () => {
|
|
|
449
451
|
});
|
|
450
452
|
|
|
451
453
|
test("default X-Hub-Signature-256 path still works (no regression)", async () => {
|
|
452
|
-
const secret = "default-header-secret";
|
|
454
|
+
const secret = "example-default-header-secret";
|
|
453
455
|
const workflow = await makeWorkflow({
|
|
454
456
|
triggers: [{ type: "webhook", hmacSecret: secret }],
|
|
455
457
|
});
|
|
@@ -467,7 +469,7 @@ describe("handleWebhookTrigger — custom hmacHeader", () => {
|
|
|
467
469
|
});
|
|
468
470
|
|
|
469
471
|
test("explicit hmac-sha256 verification does not use fallback headers", async () => {
|
|
470
|
-
const secret = "explicit-hmac-secret";
|
|
472
|
+
const secret = "example-explicit-hmac-secret";
|
|
471
473
|
const workflow = await makeWorkflow({
|
|
472
474
|
triggers: [
|
|
473
475
|
{
|
|
@@ -500,7 +502,7 @@ describe("handleWebhookTrigger — verification formats", () => {
|
|
|
500
502
|
}
|
|
501
503
|
|
|
502
504
|
test("timestamped-hmac-sha256 starts workflow for Superagent-shaped request", async () => {
|
|
503
|
-
const secret = "superagent-secret";
|
|
505
|
+
const secret = "example-superagent-secret";
|
|
504
506
|
const timestamp = Math.floor(Date.now() / 1000);
|
|
505
507
|
const workflow = await makeWorkflow({
|
|
506
508
|
triggers: [
|
|
@@ -536,7 +538,7 @@ describe("handleWebhookTrigger — verification formats", () => {
|
|
|
536
538
|
});
|
|
537
539
|
|
|
538
540
|
test("timestamped-hmac-sha256 rejects signatures on fallback headers", async () => {
|
|
539
|
-
const secret = "timestamped-no-fallback-secret";
|
|
541
|
+
const secret = "example-timestamped-no-fallback-secret";
|
|
540
542
|
const timestamp = Math.floor(Date.now() / 1000);
|
|
541
543
|
const workflow = await makeWorkflow({
|
|
542
544
|
triggers: [
|
|
@@ -571,7 +573,7 @@ describe("handleWebhookTrigger — verification formats", () => {
|
|
|
571
573
|
triggers: [
|
|
572
574
|
{
|
|
573
575
|
type: "webhook",
|
|
574
|
-
hmacSecret: "gitlab-token",
|
|
576
|
+
hmacSecret: "example-gitlab-token",
|
|
575
577
|
verification: { format: "token-equality", header: "X-Gitlab-Token" },
|
|
576
578
|
},
|
|
577
579
|
],
|
|
@@ -580,7 +582,7 @@ describe("handleWebhookTrigger — verification formats", () => {
|
|
|
580
582
|
const result = await handleWebhookTrigger(
|
|
581
583
|
workflow.id,
|
|
582
584
|
'{"event":"push"}',
|
|
583
|
-
{ "x-gitlab-token": "gitlab-token" },
|
|
585
|
+
{ "x-gitlab-token": "example-gitlab-token" },
|
|
584
586
|
registry,
|
|
585
587
|
);
|
|
586
588
|
|
|
@@ -592,7 +594,7 @@ describe("handleWebhookTrigger — verification formats", () => {
|
|
|
592
594
|
triggers: [
|
|
593
595
|
{
|
|
594
596
|
type: "webhook",
|
|
595
|
-
hmacSecret: "gitlab-token",
|
|
597
|
+
hmacSecret: "example-gitlab-token",
|
|
596
598
|
verification: { format: "token-equality", header: "X-Gitlab-Token" },
|
|
597
599
|
},
|
|
598
600
|
],
|
|
@@ -658,7 +660,7 @@ describe("handleWebhookTrigger — hmacSecret references", () => {
|
|
|
658
660
|
triggers: [
|
|
659
661
|
{
|
|
660
662
|
type: "webhook",
|
|
661
|
-
hmacSecret: "
|
|
663
|
+
hmacSecret: secretRef("TEST_KAPSO_WEBHOOK_HMAC_SECRET"),
|
|
662
664
|
hmacHeader: "X-Webhook-Signature",
|
|
663
665
|
},
|
|
664
666
|
],
|
|
@@ -678,7 +680,7 @@ describe("handleWebhookTrigger — hmacSecret references", () => {
|
|
|
678
680
|
|
|
679
681
|
test("unresolvable secret.NAME ref fails cleanly with a WebhookError", async () => {
|
|
680
682
|
const workflow = await makeWorkflow({
|
|
681
|
-
triggers: [{ type: "webhook", hmacSecret: "
|
|
683
|
+
triggers: [{ type: "webhook", hmacSecret: secretRef("NONEXISTENT_HMAC_SECRET_12345") }],
|
|
682
684
|
});
|
|
683
685
|
|
|
684
686
|
const body = '{"event":"missing-secret"}';
|
|
@@ -697,7 +699,7 @@ describe("handleWebhookTrigger — hmacSecret references", () => {
|
|
|
697
699
|
});
|
|
698
700
|
|
|
699
701
|
test("a literal hmacSecret is not treated as a reference", async () => {
|
|
700
|
-
const secret = "
|
|
702
|
+
const secret = `plain.${"literal-not-a-ref"}`;
|
|
701
703
|
const workflow = await makeWorkflow({
|
|
702
704
|
triggers: [{ type: "webhook", hmacSecret: secret }],
|
|
703
705
|
});
|
|
@@ -739,7 +741,7 @@ describe("handleWebhookTrigger — triggerData JSON parsing", () => {
|
|
|
739
741
|
});
|
|
740
742
|
|
|
741
743
|
test("signed JSON body: HMAC verified against raw bytes, triggerData parsed to object", async () => {
|
|
742
|
-
const secret = "kapso-deep-secret";
|
|
744
|
+
const secret = "example-kapso-deep-secret";
|
|
743
745
|
const workflow = await makeWorkflow({
|
|
744
746
|
triggers: [{ type: "webhook", hmacSecret: secret, hmacHeader: "X-Webhook-Signature" }],
|
|
745
747
|
});
|
|
@@ -858,7 +860,7 @@ describe("TriggerConfigSchema", () => {
|
|
|
858
860
|
test("accepts verification configured with hmacSecret", () => {
|
|
859
861
|
const result = TriggerConfigSchema.safeParse({
|
|
860
862
|
type: "webhook",
|
|
861
|
-
hmacSecret: "gitlab-token",
|
|
863
|
+
hmacSecret: "example-gitlab-token",
|
|
862
864
|
verification: { format: "token-equality", header: "X-Gitlab-Token" },
|
|
863
865
|
});
|
|
864
866
|
|
|
@@ -45,12 +45,12 @@ describe("runComposioCommand", () => {
|
|
|
45
45
|
const fetchMock = mock(async (url: string | URL | Request, init?: RequestInit) => {
|
|
46
46
|
expect(String(url)).toBe("https://backend.composio.dev/api/v3.1/tools?limit=10");
|
|
47
47
|
expect(init?.method).toBe("GET");
|
|
48
|
-
expect((init?.headers as Record<string, string>)["x-api-key"]).toBe("ck_test_secret");
|
|
49
|
-
return jsonResponse({ ok: true, token: "ck_test_secret" });
|
|
48
|
+
expect((init?.headers as Record<string, string>)["x-api-key"]).toBe("example-ck_test_secret");
|
|
49
|
+
return jsonResponse({ ok: true, token: "example-ck_test_secret" });
|
|
50
50
|
});
|
|
51
51
|
|
|
52
52
|
await runComposioCommand(["GET", "/tools", "--query", "limit=10"], {
|
|
53
|
-
env: { COMPOSIO_API_KEY: "ck_test_secret" },
|
|
53
|
+
env: { COMPOSIO_API_KEY: "example-ck_test_secret" },
|
|
54
54
|
fetch: fetchMock,
|
|
55
55
|
log: (message) => out.push(message),
|
|
56
56
|
error: (message) => out.push(message),
|
|
@@ -62,18 +62,20 @@ describe("runComposioCommand", () => {
|
|
|
62
62
|
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
63
63
|
expect(out.join("\n")).toContain('"ok": true');
|
|
64
64
|
expect(out.join("\n")).toContain("[REDACTED:COMPOSIO_API_KEY]");
|
|
65
|
-
expect(out.join("\n")).not.toContain("ck_test_secret");
|
|
65
|
+
expect(out.join("\n")).not.toContain("example-ck_test_secret");
|
|
66
66
|
});
|
|
67
67
|
|
|
68
68
|
test("uses org key header when --org is passed", async () => {
|
|
69
69
|
const fetchMock = mock(async (_url: string | URL | Request, init?: RequestInit) => {
|
|
70
|
-
expect((init?.headers as Record<string, string>)["x-org-api-key"]).toBe(
|
|
70
|
+
expect((init?.headers as Record<string, string>)["x-org-api-key"]).toBe(
|
|
71
|
+
"example-org_secret_value",
|
|
72
|
+
);
|
|
71
73
|
expect((init?.headers as Record<string, string>)["x-api-key"]).toBeUndefined();
|
|
72
74
|
return jsonResponse({ ok: true });
|
|
73
75
|
});
|
|
74
76
|
|
|
75
77
|
await runComposioCommand(["GET", "/org/projects", "--org"], {
|
|
76
|
-
env: { COMPOSIO_ORG_API_KEY: "org_secret_value" },
|
|
78
|
+
env: { COMPOSIO_ORG_API_KEY: "example-org_secret_value" },
|
|
77
79
|
fetch: fetchMock,
|
|
78
80
|
log: () => {},
|
|
79
81
|
error: () => {},
|
|
@@ -108,7 +110,7 @@ describe("runXCommand", () => {
|
|
|
108
110
|
test("dispatches to composio target", async () => {
|
|
109
111
|
const fetchMock = mock(async () => jsonResponse({ ok: true }));
|
|
110
112
|
await runXCommand(["composio", "GET", "/tools"], {
|
|
111
|
-
env: { COMPOSIO_API_KEY: "ck_test_secret" },
|
|
113
|
+
env: { COMPOSIO_API_KEY: "example-ck_test_secret" },
|
|
112
114
|
fetch: fetchMock,
|
|
113
115
|
log: () => {},
|
|
114
116
|
error: () => {},
|
|
@@ -2,7 +2,7 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
|
2
2
|
import { createX402Client } from "../x402/client.ts";
|
|
3
3
|
|
|
4
4
|
// A valid test private key (DO NOT use in production — this is a well-known throwaway key)
|
|
5
|
-
const TEST_PRIVATE_KEY = "
|
|
5
|
+
const TEST_PRIVATE_KEY = `0x${"11".repeat(32)}`;
|
|
6
6
|
|
|
7
7
|
describe("createX402Client", () => {
|
|
8
8
|
const originalEnv = { ...process.env };
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
2
2
|
import { loadX402Config } from "../x402/config.ts";
|
|
3
3
|
|
|
4
|
+
const TEST_PRIVATE_KEY = `0x${"11".repeat(32)}`;
|
|
5
|
+
const TEST_PRIVATE_KEY_WITHOUT_PREFIX = TEST_PRIVATE_KEY.slice(2);
|
|
6
|
+
|
|
4
7
|
describe("loadX402Config", () => {
|
|
5
8
|
const originalEnv = { ...process.env };
|
|
6
9
|
|
|
@@ -28,25 +31,20 @@ describe("loadX402Config", () => {
|
|
|
28
31
|
// --- Viem signer tests ---
|
|
29
32
|
|
|
30
33
|
test("auto-detects viem signer when EVM_PRIVATE_KEY is set", () => {
|
|
31
|
-
process.env.EVM_PRIVATE_KEY =
|
|
32
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
34
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
33
35
|
|
|
34
36
|
const config = loadX402Config();
|
|
35
37
|
expect(config.signerType).toBe("viem");
|
|
36
|
-
expect(config.evmPrivateKey).toBe(
|
|
37
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678",
|
|
38
|
-
);
|
|
38
|
+
expect(config.evmPrivateKey).toBe(TEST_PRIVATE_KEY);
|
|
39
39
|
});
|
|
40
40
|
|
|
41
41
|
test("throws when EVM_PRIVATE_KEY does not start with 0x", () => {
|
|
42
|
-
process.env.EVM_PRIVATE_KEY =
|
|
43
|
-
"deadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
42
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY_WITHOUT_PREFIX;
|
|
44
43
|
expect(() => loadX402Config()).toThrow("EVM_PRIVATE_KEY must start with '0x'");
|
|
45
44
|
});
|
|
46
45
|
|
|
47
46
|
test("returns config with defaults when only EVM_PRIVATE_KEY is set", () => {
|
|
48
|
-
process.env.EVM_PRIVATE_KEY =
|
|
49
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
47
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
50
48
|
|
|
51
49
|
const config = loadX402Config();
|
|
52
50
|
|
|
@@ -59,33 +57,32 @@ describe("loadX402Config", () => {
|
|
|
59
57
|
// --- Openfort signer tests ---
|
|
60
58
|
|
|
61
59
|
test("auto-detects openfort signer when OPENFORT_API_KEY is set", () => {
|
|
62
|
-
process.env.OPENFORT_API_KEY = "sk_test_abc123";
|
|
63
|
-
process.env.OPENFORT_WALLET_SECRET = "base64secret";
|
|
60
|
+
process.env.OPENFORT_API_KEY = "example-sk_test_abc123";
|
|
61
|
+
process.env.OPENFORT_WALLET_SECRET = "example-base64secret";
|
|
64
62
|
|
|
65
63
|
const config = loadX402Config();
|
|
66
64
|
expect(config.signerType).toBe("openfort");
|
|
67
|
-
expect(config.openfortApiKey).toBe("sk_test_abc123");
|
|
68
|
-
expect(config.openfortWalletSecret).toBe("base64secret");
|
|
65
|
+
expect(config.openfortApiKey).toBe("example-sk_test_abc123");
|
|
66
|
+
expect(config.openfortWalletSecret).toBe("example-base64secret");
|
|
69
67
|
});
|
|
70
68
|
|
|
71
69
|
test("openfort takes priority over viem when both are set", () => {
|
|
72
|
-
process.env.OPENFORT_API_KEY = "sk_test_abc123";
|
|
73
|
-
process.env.OPENFORT_WALLET_SECRET = "base64secret";
|
|
74
|
-
process.env.EVM_PRIVATE_KEY =
|
|
75
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
70
|
+
process.env.OPENFORT_API_KEY = "example-sk_test_abc123";
|
|
71
|
+
process.env.OPENFORT_WALLET_SECRET = "example-base64secret";
|
|
72
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
76
73
|
|
|
77
74
|
const config = loadX402Config();
|
|
78
75
|
expect(config.signerType).toBe("openfort");
|
|
79
76
|
});
|
|
80
77
|
|
|
81
78
|
test("throws when openfort signer is selected but OPENFORT_WALLET_SECRET is missing", () => {
|
|
82
|
-
process.env.OPENFORT_API_KEY = "sk_test_abc123";
|
|
79
|
+
process.env.OPENFORT_API_KEY = "example-sk_test_abc123";
|
|
83
80
|
expect(() => loadX402Config()).toThrow("OPENFORT_WALLET_SECRET is required");
|
|
84
81
|
});
|
|
85
82
|
|
|
86
83
|
test("includes OPENFORT_WALLET_ADDRESS when set", () => {
|
|
87
|
-
process.env.OPENFORT_API_KEY = "sk_test_abc123";
|
|
88
|
-
process.env.OPENFORT_WALLET_SECRET = "base64secret";
|
|
84
|
+
process.env.OPENFORT_API_KEY = "example-sk_test_abc123";
|
|
85
|
+
process.env.OPENFORT_WALLET_SECRET = "example-base64secret";
|
|
89
86
|
process.env.OPENFORT_WALLET_ADDRESS = "0x1234567890abcdef1234567890abcdef12345678";
|
|
90
87
|
|
|
91
88
|
const config = loadX402Config();
|
|
@@ -96,9 +93,8 @@ describe("loadX402Config", () => {
|
|
|
96
93
|
|
|
97
94
|
test("respects explicit X402_SIGNER_TYPE=viem", () => {
|
|
98
95
|
process.env.X402_SIGNER_TYPE = "viem";
|
|
99
|
-
process.env.EVM_PRIVATE_KEY =
|
|
100
|
-
|
|
101
|
-
process.env.OPENFORT_API_KEY = "sk_test_abc123";
|
|
96
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
97
|
+
process.env.OPENFORT_API_KEY = "example-sk_test_abc123";
|
|
102
98
|
|
|
103
99
|
const config = loadX402Config();
|
|
104
100
|
expect(config.signerType).toBe("viem");
|
|
@@ -106,16 +102,14 @@ describe("loadX402Config", () => {
|
|
|
106
102
|
|
|
107
103
|
test("throws on invalid X402_SIGNER_TYPE", () => {
|
|
108
104
|
process.env.X402_SIGNER_TYPE = "invalid";
|
|
109
|
-
process.env.EVM_PRIVATE_KEY =
|
|
110
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
105
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
111
106
|
expect(() => loadX402Config()).toThrow('X402_SIGNER_TYPE must be "openfort" or "viem"');
|
|
112
107
|
});
|
|
113
108
|
|
|
114
109
|
// --- Spending limit tests ---
|
|
115
110
|
|
|
116
111
|
test("parses custom X402_MAX_AUTO_APPROVE", () => {
|
|
117
|
-
process.env.EVM_PRIVATE_KEY =
|
|
118
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
112
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
119
113
|
process.env.X402_MAX_AUTO_APPROVE = "5.50";
|
|
120
114
|
|
|
121
115
|
const config = loadX402Config();
|
|
@@ -123,8 +117,7 @@ describe("loadX402Config", () => {
|
|
|
123
117
|
});
|
|
124
118
|
|
|
125
119
|
test("parses custom X402_DAILY_LIMIT", () => {
|
|
126
|
-
process.env.EVM_PRIVATE_KEY =
|
|
127
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
120
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
128
121
|
process.env.X402_DAILY_LIMIT = "25.00";
|
|
129
122
|
|
|
130
123
|
const config = loadX402Config();
|
|
@@ -132,8 +125,7 @@ describe("loadX402Config", () => {
|
|
|
132
125
|
});
|
|
133
126
|
|
|
134
127
|
test("uses custom X402_NETWORK", () => {
|
|
135
|
-
process.env.EVM_PRIVATE_KEY =
|
|
136
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
128
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
137
129
|
process.env.X402_NETWORK = "eip155:8453";
|
|
138
130
|
|
|
139
131
|
const config = loadX402Config();
|
|
@@ -141,40 +133,35 @@ describe("loadX402Config", () => {
|
|
|
141
133
|
});
|
|
142
134
|
|
|
143
135
|
test("throws when X402_MAX_AUTO_APPROVE is not a valid number", () => {
|
|
144
|
-
process.env.EVM_PRIVATE_KEY =
|
|
145
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
136
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
146
137
|
process.env.X402_MAX_AUTO_APPROVE = "abc";
|
|
147
138
|
|
|
148
139
|
expect(() => loadX402Config()).toThrow("X402_MAX_AUTO_APPROVE must be a positive number");
|
|
149
140
|
});
|
|
150
141
|
|
|
151
142
|
test("throws when X402_MAX_AUTO_APPROVE is zero", () => {
|
|
152
|
-
process.env.EVM_PRIVATE_KEY =
|
|
153
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
143
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
154
144
|
process.env.X402_MAX_AUTO_APPROVE = "0";
|
|
155
145
|
|
|
156
146
|
expect(() => loadX402Config()).toThrow("X402_MAX_AUTO_APPROVE must be a positive number");
|
|
157
147
|
});
|
|
158
148
|
|
|
159
149
|
test("throws when X402_MAX_AUTO_APPROVE is negative", () => {
|
|
160
|
-
process.env.EVM_PRIVATE_KEY =
|
|
161
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
150
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
162
151
|
process.env.X402_MAX_AUTO_APPROVE = "-1";
|
|
163
152
|
|
|
164
153
|
expect(() => loadX402Config()).toThrow("X402_MAX_AUTO_APPROVE must be a positive number");
|
|
165
154
|
});
|
|
166
155
|
|
|
167
156
|
test("throws when X402_DAILY_LIMIT is not a valid number", () => {
|
|
168
|
-
process.env.EVM_PRIVATE_KEY =
|
|
169
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
157
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
170
158
|
process.env.X402_DAILY_LIMIT = "not-a-number";
|
|
171
159
|
|
|
172
160
|
expect(() => loadX402Config()).toThrow("X402_DAILY_LIMIT must be a positive number");
|
|
173
161
|
});
|
|
174
162
|
|
|
175
163
|
test("throws when X402_DAILY_LIMIT is zero", () => {
|
|
176
|
-
process.env.EVM_PRIVATE_KEY =
|
|
177
|
-
"0xdeadbeef1234567890abcdef1234567890abcdef1234567890abcdef12345678";
|
|
164
|
+
process.env.EVM_PRIVATE_KEY = TEST_PRIVATE_KEY;
|
|
178
165
|
process.env.X402_DAILY_LIMIT = "0";
|
|
179
166
|
|
|
180
167
|
expect(() => loadX402Config()).toThrow("X402_DAILY_LIMIT must be a positive number");
|