@desplega.ai/agent-swarm 2.6.0 → 2.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/{acp-adapter-dgfakfpw.js → acp-adapter-8dn5tq56.js} +6 -6
- package/dist/{actions-fbqma8aa.js → actions-3r6gw7dy.js} +18 -18
- package/dist/{amp-adapter-en0jy6hs.js → amp-adapter-wjtq413p.js} +3 -3
- package/dist/{anthropic-messages-txs190dd.js → anthropic-messages-n4cby1rz.js} +4 -4
- package/dist/{app-k8a5cgpp.js → app-d53yhykk.js} +3 -3
- package/dist/{assistant-a16433gr.js → assistant-ksrawj3k.js} +20 -20
- package/dist/{boot-reembed-6c1sjfnr.js → boot-reembed-fxfw17m2.js} +11 -3
- package/dist/{boot-reembed-f4nn561n.js → boot-reembed-k5y5xbj0.js} +15 -8
- package/dist/{boot-scrub-sweep-d4w9gajf.js → boot-scrub-sweep-se41j9fd.js} +3 -3
- package/dist/{boot-seeds-9bmkspyw.js → boot-seeds-r3kwwv8b.js} +4 -4
- package/dist/{claude-adapter-nys1kjxa.js → claude-adapter-ahmyf231.js} +8 -8
- package/dist/{claude-managed-adapter-55207973.js → claude-managed-adapter-5knamegc.js} +3 -3
- package/dist/{claude-managed-setup-3cm35gey.js → claude-managed-setup-mdc7dy6b.js} +3 -3
- package/dist/{claude-sdk-session-nw5yd8cp.js → claude-sdk-session-n5wen9zk.js} +8729 -8600
- package/dist/{cli-683y0b3a.js → cli-0dqtv2jg.js} +2 -2
- package/dist/{cli-a34pr3w1.js → cli-0tww7dnz.js} +2 -2
- package/dist/{cli-w2656ka1.js → cli-0w4e4v58.js} +7 -7
- package/dist/{cli-5sckpqcx.js → cli-2sjm3t4r.js} +1 -1
- package/dist/{cli-gf2850q7.js → cli-3cywb44q.js} +18 -1
- package/dist/{cli-8wkb09q5.js → cli-3k9jej0c.js} +2 -2
- package/dist/{cli-3aqd4jaa.js → cli-3v2cyqb8.js} +3 -3
- package/dist/{cli-emhjcj2y.js → cli-5qt9vzmq.js} +89 -20
- package/dist/{cli-abkm71vr.js → cli-5rp1w4cr.js} +1 -1
- package/dist/{cli-gf95q3bm.js → cli-6vwjsetx.js} +4 -4
- package/dist/{cli-k21gx5ht.js → cli-6w2yrrc0.js} +10 -10
- package/dist/{cli-m70bajzr.js → cli-75tdydgv.js} +1 -1
- package/dist/{cli-5rj83bam.js → cli-8feswf2v.js} +47 -36
- package/dist/{cli-sxgtf5fw.js → cli-8wd3mbyj.js} +1 -1
- package/dist/{cli-ca6banwz.js → cli-9csfthbw.js} +10 -8
- package/dist/{cli-dqygeeh5.js → cli-b41p764a.js} +31 -3
- package/dist/{cli-m5a9m0ak.js → cli-c1t533hh.js} +3 -3
- package/dist/{cli-2sjhpsns.js → cli-c28jxpcv.js} +1 -1
- package/dist/{cli-bqztfyve.js → cli-cb50g9cd.js} +1 -1
- package/dist/{cli-ag2yrnt5.js → cli-d8gaphtr.js} +2 -2
- package/dist/{cli-9abdgn5t.js → cli-dgtfysne.js} +3 -3
- package/dist/{cli-nq677csy.js → cli-dscnhn18.js} +1 -1
- package/dist/{cli-3fwqy71j.js → cli-dv11pgpv.js} +39 -32
- package/dist/{cli-v49fkghp.js → cli-ekptgk2m.js} +6 -6
- package/dist/{cli-c2habvsf.js → cli-f3mzy662.js} +17 -17
- package/dist/{cli-zqne1qcj.js → cli-fk7k8s9x.js} +2 -2
- package/dist/{cli-1tem6ns9.js → cli-gt4h8cxw.js} +3 -2
- package/dist/{cli-vbhgkw9h.js → cli-h3e7bhvn.js} +3 -3
- package/dist/{cli-ffvsj2qw.js → cli-hkxqdmnb.js} +3 -3
- package/dist/{cli-a2rr0fmg.js → cli-hpkvgdad.js} +7 -4
- package/dist/{cli-art7c1zh.js → cli-hq2v4rr5.js} +37 -9
- package/dist/{cli-sqma6vw1.js → cli-k1zb7raw.js} +5 -5
- package/dist/{cli-4rvr7zfx.js → cli-k4awgvzm.js} +5 -0
- package/dist/{cli-3ndmpxxv.js → cli-k7d3hvya.js} +2 -2
- package/dist/{cli-3gfvmzht.js → cli-kbtdftbw.js} +74 -26
- package/dist/{cli-hfeb68z4.js → cli-kj69b9tw.js} +34 -6
- package/dist/{cli-az25fn5f.js → cli-kk9jy4nm.js} +2 -2
- package/dist/{cli-39aet655.js → cli-m52t4cta.js} +1 -1
- package/dist/{cli-cz37jqss.js → cli-mdadewqp.js} +5 -5
- package/dist/{cli-esakngh8.js → cli-nf6k60sn.js} +1 -1
- package/dist/{cli-j6rktc91.js → cli-nzdf09js.js} +1 -1
- package/dist/{cli-rr7zx19j.js → cli-prcyzecg.js} +12 -12
- package/dist/{cli-4hxrf0p4.js → cli-pzafyqtk.js} +393 -62
- package/dist/{cli-g8ka5j4j.js → cli-qvaa1gjp.js} +173 -52
- package/dist/{cli-d2dpf95n.js → cli-rg4b2g6j.js} +1 -1
- package/dist/{cli-kf4jree9.js → cli-rm66vqdz.js} +1 -1
- package/dist/{cli-4rf0f5vg.js → cli-s504c3w7.js} +5 -3
- package/dist/{cli-nn6vx2mq.js → cli-swkx9jm2.js} +7 -5
- package/dist/{cli-g20jjwt4.js → cli-thsaq4pd.js} +16 -16
- package/dist/{cli-aj8djyqt.js → cli-twjnyvs8.js} +2 -2
- package/dist/{cli-03gg9pd1.js → cli-typdpe8g.js} +4 -4
- package/dist/{cli-mtnj4fwa.js → cli-vg8pwmsd.js} +6 -6
- package/dist/{cli-gnsb1zxa.js → cli-vhpckzvp.js} +1 -1
- package/dist/{cli-7enjwya9.js → cli-vz78s5wm.js} +1 -1
- package/dist/{cli-dv97kdzv.js → cli-wdxgsdz5.js} +2 -2
- package/dist/{cli-7a6p4e65.js → cli-wtjg6je3.js} +1 -1
- package/dist/{cli-6y51ryva.js → cli-x3cngb1h.js} +44 -12
- package/dist/{cli-n7asmce6.js → cli-xbz6mcg4.js} +3 -3
- package/dist/{cli-24j1jeeb.js → cli-y4tdxsqb.js} +3 -3
- package/dist/{cli-mvjz5an3.js → cli-yqrsp3ny.js} +7 -7
- package/dist/cli.js +31 -21
- package/dist/{codex-adapter-d95q4qsn.js → codex-adapter-7wepzq15.js} +6 -6
- package/dist/{codex-hook-brpnycn5.js → codex-hook-pbdh4xhx.js} +2 -2
- package/dist/{codex-session-runner-gdwd8h0c.js → codex-session-runner-02sb49e4.js} +6 -6
- package/dist/{commands-jqmgk54b.js → commands-3rcspxct.js} +2 -2
- package/dist/{controller-z3jq589f.js → controller-8ar4avd6.js} +3 -3
- package/dist/{controllers-connect-r2za39ef.js → controllers-connect-ajvh9h0v.js} +19 -19
- package/dist/{cursor-adapter-4mr4jgkw.js → cursor-adapter-gd0sa7bh.js} +1 -1
- package/dist/{db-w36wwb5g.js → db-dv9j7ts5.js} +2 -2
- package/dist/{db-ppv2tze7.js → db-z26vgdvj.js} +3 -3
- package/dist/{dispatcher-pv5h77vf.js → dispatcher-8m0htjq8.js} +17 -17
- package/dist/{dsh-adapter-d4pdpb3r.js → dsh-adapter-y8gyk130.js} +1 -1
- package/dist/{e2b-fn3zacvt.js → e2b-74vg9b7e.js} +1 -1
- package/dist/{e2b-222hsajc.js → e2b-jyay8wzn.js} +1 -1
- package/dist/{easter-egg-3d-4sp4dvmc.js → easter-egg-3d-28f880xx.js} +1 -1
- package/dist/{execute-jev839y1.js → execute-9seb79vh.js} +1 -1
- package/dist/{external-channel-y6nkzhnn.js → external-channel-smz7jyth.js} +2 -2
- package/dist/{getMachineId-bsd-brn0xym3.js → getMachineId-bsd-whfre6gr.js} +3 -3
- package/dist/{getMachineId-darwin-t339sfxm.js → getMachineId-darwin-5zjynb19.js} +3 -3
- package/dist/{getMachineId-linux-5eq95d8b.js → getMachineId-linux-8mksrrsq.js} +3 -3
- package/dist/{getMachineId-unsupported-qavrtc7j.js → getMachineId-unsupported-fxtqsdt2.js} +3 -3
- package/dist/{getMachineId-win-q7fe1wx7.js → getMachineId-win-nzfmz857.js} +3 -3
- package/dist/{grok-adapter-t08b9ntm.js → grok-adapter-z0nnvtbn.js} +7 -7
- package/dist/handlers-pspryh6g.js +41 -0
- package/dist/{heartbeat-vn31xwdk.js → heartbeat-f928aqyp.js} +20 -20
- package/dist/{hook-cpjs8q51.js → hook-d7c605r4.js} +7 -7
- package/dist/{hook-6d0zbvvt.js → hook-q9hv5xf9.js} +5 -5
- package/dist/{http-9c6medda.js → http-q6j4k989.js} +1000 -251
- package/dist/{index-k0yt1tvq.js → index-5nb266jr.js} +17 -17
- package/dist/{index-ysd45kgc.js → index-8fxt5eah.js} +10 -10
- package/dist/{index-zgvqzjsw.js → index-cekzwhez.js} +5 -5
- package/dist/{index-38t35h0n.js → index-ch0c1xff.js} +17 -17
- package/dist/{index-pkma1yf8.js → index-ebnjhxh1.js} +1 -1
- package/dist/{index-yqgbfgaj.js → index-ed8dy8rn.js} +20 -20
- package/dist/{index-qhjf2htm.js → index-ejqdkkqx.js} +262 -96
- package/dist/{index-dr94zbnh.js → index-farm1zsn.js} +32661 -29443
- package/dist/{index-g6k9tctj.js → index-yn1yxg85.js} +1 -1
- package/dist/{keepalive-em0117bp.js → keepalive-zzc3hks1.js} +3 -3
- package/dist/lead-c0pjcaw4.js +79 -0
- package/dist/{maintenance-kbme3qy9.js → maintenance-kqsxzpzx.js} +1 -1
- package/dist/{oauth-refresh-sweep-xysj4yse.js → oauth-refresh-sweep-7qt0g55z.js} +8 -3
- package/dist/{onboard-p6q0vz97.js → onboard-k7x13fqg.js} +121 -8
- package/dist/{opencode-adapter-esv3k9yn.js → opencode-adapter-tqvrtter.js} +5 -5
- package/dist/{otel-impl-54qhqh1z.js → otel-impl-sqkf6k3b.js} +97 -97
- package/dist/{pi-mono-adapter-mymbwhj0.js → pi-mono-adapter-m2qnafxm.js} +89 -14
- package/dist/{pricing-refresh-yb75wv33.js → pricing-refresh-wkpwhgvs.js} +3 -3
- package/dist/{rbac-roles-dexhc9x8.js → rbac-roles-dpn0c0wj.js} +7 -4
- package/dist/{rbac-roles-1vp2mw4p.js → rbac-roles-wk7xd6a6.js} +2 -2
- package/dist/{render-v2-tjay5hhf.js → render-v2-ex2m4g2k.js} +3 -3
- package/dist/{resume-8ayf37g5.js → resume-725g9b0b.js} +7 -7
- package/dist/{runtime-hqe5cqcd.js → runtime-kajas15g.js} +1 -1
- package/dist/{session-access-fdhp987s.js → session-access-0j2ezjje.js} +8 -4
- package/dist/{session-source-backfill-qgtc86z1.js → session-source-backfill-62202awe.js} +2 -2
- package/dist/{setup-4rrmqcq3.js → setup-9sj11ax6.js} +1 -1
- package/dist/{virtual-modules-52km00d6.js → virtual-modules-c6fcq6zr.js} +2 -2
- package/dist/{work-objects-p28fgd70.js → work-objects-0y07495y.js} +20 -20
- package/dist/worker-d4q9sqbc.js +79 -0
- package/openapi.json +1536 -407
- package/package.json +7 -5
- package/src/be/automation-preflight.ts +2 -0
- package/src/be/connector-codes.ts +65 -22
- package/src/be/db/api-keys.ts +9 -0
- package/src/be/db/workflow-runs.ts +36 -5
- package/src/be/db.ts +80 -22
- package/src/be/memory/boot-reembed.ts +4 -1
- package/src/be/memory/constants.ts +6 -0
- package/src/be/memory/embedding-recovery.ts +48 -0
- package/src/be/memory/index-content.ts +5 -2
- package/src/be/memory/providers/openai-embedding.ts +65 -14
- package/src/be/memory/task-learning.ts +257 -0
- package/src/be/memory/types.ts +13 -2
- package/src/be/migrations/245_script_executor.sql +3 -0
- package/src/be/migrations/246_connector_code_kind.sql +11 -0
- package/src/be/oauth-refresh-sweep.ts +2 -1
- package/src/be/onboarding.ts +125 -15
- package/src/be/rbac-roles.ts +4 -1
- package/src/be/scripts/boot-reembed.ts +2 -0
- package/src/be/scripts/db.ts +14 -4
- package/src/be/scripts/embeddings.ts +4 -2
- package/src/be/scripts/run-saved.ts +1 -0
- package/src/be/scripts/typecheck.ts +9 -3
- package/src/be/seed/agent-fs-provision.ts +75 -14
- package/src/be/seed-skills/index.ts +7 -0
- package/src/be/swarm-config-guard.ts +3 -0
- package/src/cli.tsx +9 -0
- package/src/comb/config.ts +6 -1
- package/src/commands/onboard/agent-fs-version.ts +5 -0
- package/src/commands/onboard/compose-generator.ts +117 -4
- package/src/commands/onboard/env-generator.ts +9 -0
- package/src/commands/onboard/tei-image.ts +12 -0
- package/src/commands/onboard/types.ts +7 -0
- package/src/commands/onboard.tsx +11 -1
- package/src/commands/provider-credentials.ts +2 -1
- package/src/commands/runner.ts +14 -1
- package/src/heartbeat/heartbeat.ts +14 -1
- package/src/heartbeat/script-runner-probe.ts +47 -0
- package/src/http/agentfs-proxy.ts +369 -0
- package/src/http/all-routes.ts +1 -0
- package/src/http/api-keys.ts +24 -9
- package/src/http/codex-oauth-device.ts +8 -1
- package/src/http/fs.ts +64 -10
- package/src/http/idempotency-key.ts +1 -1
- package/src/http/inbox-state.ts +27 -1
- package/src/http/index.ts +7 -4
- package/src/http/memory.ts +7 -4
- package/src/http/onboarding.ts +139 -11
- package/src/http/pages-public.ts +38 -5
- package/src/http/scripts.ts +27 -0
- package/src/http/session-access.ts +24 -0
- package/src/http/sessions.ts +10 -6
- package/src/http/tasks.ts +85 -11
- package/src/http/telemetry-ui.ts +1 -1
- package/src/http/user-roles.ts +4 -1
- package/src/http/users.ts +272 -3
- package/src/http/utils.ts +22 -3
- package/src/http/workflows.ts +10 -0
- package/src/http/x.ts +5 -0
- package/src/prompts/base-prompt.ts +45 -10
- package/src/prompts/session-templates.ts +43 -5
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/codex-adapter.ts +6 -1
- package/src/providers/cursor-adapter.ts +1 -1
- package/src/providers/dsh-adapter.ts +1 -1
- package/src/providers/pi-mono-adapter.ts +99 -14
- package/src/rbac/legacy-policy.ts +1 -0
- package/src/rbac/permissions.ts +4 -0
- package/src/scheduler/scheduler.ts +2 -1
- package/src/scripts-runtime/eval-harness.ts +8 -1
- package/src/scripts-runtime/executors/native.ts +22 -16
- package/src/scripts-runtime/executors/quickjs-prelude.ts +103 -1
- package/src/scripts-runtime/executors/quickjs-runner.ts +2 -1
- package/src/scripts-runtime/executors/quickjs.ts +7 -0
- package/src/scripts-runtime/executors/registry.ts +32 -0
- package/src/scripts-runtime/executors/types.ts +7 -0
- package/src/scripts-runtime/host-validated-args.ts +133 -0
- package/src/scripts-runtime/loader.ts +30 -3
- package/src/scripts-runtime/swarm-sdk.ts +9 -2
- package/src/scripts-runtime/types/stdlib.d.ts +9 -1
- package/src/scripts-runtime/types/swarm-sdk.d.ts +9 -1
- package/src/tests/agent-fs-provision-seeder.test.ts +261 -92
- package/src/tests/agentfs-proxy.test.ts +1106 -0
- package/src/tests/api-key-status-by-suffix.test.ts +242 -0
- package/src/tests/base-prompt.test.ts +139 -4
- package/src/tests/codex-adapter.test.ts +46 -8
- package/src/tests/codex-oauth-device.test.ts +12 -1
- package/src/tests/comb-config-guard.test.ts +20 -0
- package/src/tests/comb-links.test.ts +79 -1
- package/src/tests/comb-status.test.ts +44 -0
- package/src/tests/community-linear-delivery-loop.test.ts +2099 -0
- package/src/tests/credential-check.test.ts +4 -2
- package/src/tests/docs-index-footprint.test.js +3 -3
- package/src/tests/docs-index.test.ts +135 -0
- package/src/tests/dsh-adapter.test.ts +1 -1
- package/src/tests/fetch-resolved-env.test.ts +16 -2
- package/src/tests/fixtures/onboard/baseline-states.ts +68 -0
- package/src/tests/fixtures/onboard/content.compose.yml.txt +190 -0
- package/src/tests/fixtures/onboard/content.env.txt +29 -0
- package/src/tests/fixtures/onboard/dev.compose.yml.txt +155 -0
- package/src/tests/fixtures/onboard/dev.env.txt +28 -0
- package/src/tests/fixtures/onboard/full-all.compose.yml.txt +582 -0
- package/src/tests/fixtures/onboard/full-all.env.txt +59 -0
- package/src/tests/fixtures/onboard/full.compose.yml.txt +435 -0
- package/src/tests/fixtures/onboard/full.env.txt +36 -0
- package/src/tests/fixtures/onboard/research.compose.yml.txt +155 -0
- package/src/tests/fixtures/onboard/research.env.txt +28 -0
- package/src/tests/fixtures/onboard/solo.compose.yml.txt +85 -0
- package/src/tests/fixtures/onboard/solo.env.txt +26 -0
- package/src/tests/heartbeat-checklist.test.ts +89 -0
- package/src/tests/heartbeat-script-runner-probe.test.ts +83 -0
- package/src/tests/http-log-scrubbing.test.ts +34 -1
- package/src/tests/http-task-write-ownership.test.ts +5 -1
- package/src/tests/invites-http.test.ts +464 -0
- package/src/tests/memory-embedding-input-cap.test.ts +122 -1
- package/src/tests/memory-embedding-recovery.test.ts +137 -0
- package/src/tests/oauth-refresh-sweep.test.ts +34 -1
- package/src/tests/onboard-compose.test.ts +162 -0
- package/src/tests/onboard-env.test.ts +24 -0
- package/src/tests/onboard-non-interactive.test.ts +29 -0
- package/src/tests/onboard-tei-image.test.ts +36 -0
- package/src/tests/onboarding.test.ts +451 -4
- package/src/tests/openai-embedding-provider.test.ts +105 -2
- package/src/tests/opencode-adapter.test.ts +2 -1
- package/src/tests/pages-frame-ancestors.test.ts +162 -0
- package/src/tests/pi-codemode.test.ts +2 -1
- package/src/tests/pi-mono-adapter.test.ts +54 -0
- package/src/tests/pi-mono-session-cost-on-abort.test.ts +270 -0
- package/src/tests/pi-native-mcp.test.ts +13 -1
- package/src/tests/pi-tool-exposure.test.ts +8 -8
- package/src/tests/preload-env.test.ts +4 -0
- package/src/tests/preload.ts +4 -0
- package/src/tests/probe-tool-schema-tokens.test.ts +144 -0
- package/src/tests/prompt-template-session.test.ts +20 -3
- package/src/tests/rbac-admission-e2e.test.ts +22 -6
- package/src/tests/rbac-admission.test.ts +342 -4
- package/src/tests/rbac-engine.test.ts +1 -0
- package/src/tests/rbac-roles.test.ts +9 -1
- package/src/tests/request-composition-derive.test.ts +329 -0
- package/src/tests/script-connections.test.ts +2 -0
- package/src/tests/script-executor-conformance.test.ts +36 -1
- package/src/tests/script-executor-quickjs-pool.test.ts +50 -0
- package/src/tests/script-executor-quickjs.test.ts +140 -0
- package/src/tests/script-host-validated-args-native.test.ts +196 -0
- package/src/tests/script-per-script-executor.test.ts +415 -0
- package/src/tests/scripts-external-api.test.ts +45 -0
- package/src/tests/sdk-allowlist.test.ts +3 -2
- package/src/tests/self-improvement.test.ts +4 -4
- package/src/tests/send-task-requester-gate.test.ts +64 -3
- package/src/tests/sessions-move.test.ts +39 -1
- package/src/tests/store-progress-learning.test.ts +381 -0
- package/src/tests/ui-logs-parser.test.ts +180 -0
- package/src/tests/whoami-route.test.ts +41 -0
- package/src/tests/workflow-engine-v2.test.ts +116 -1
- package/src/tests/workflow-mcp-trigger-schema.test.ts +209 -0
- package/src/tests/workflow-run-finished-event.test.ts +263 -0
- package/src/tests/workflow-swarm-script.test.ts +34 -0
- package/src/tools/inject-learning.ts +1 -1
- package/src/tools/memory-edit.ts +1 -1
- package/src/tools/memory-search.ts +1 -1
- package/src/tools/script-common.ts +1 -0
- package/src/tools/script-run.ts +7 -0
- package/src/tools/script-upsert.ts +7 -0
- package/src/tools/store-progress.ts +71 -1
- package/src/tools/utils.ts +12 -1
- package/src/tools/workflows/trigger-workflow.ts +104 -10
- package/src/types.ts +12 -1
- package/src/utils/constants.ts +39 -0
- package/src/utils/credentials.ts +5 -2
- package/src/utils/task-attachment-links.ts +15 -3
- package/src/workflows/engine.ts +18 -16
- package/src/workflows/executors/swarm-script.ts +5 -0
- package/src/workflows/foreach-driver.ts +5 -11
- package/src/workflows/node-timeout.ts +30 -0
- package/templates/community/linear-delivery-loop/PLAYBOOK.md +323 -0
- package/templates/community/linear-delivery-loop/README.md +38 -0
- package/templates/community/linear-delivery-loop/config.example.json +31 -0
- package/templates/community/linear-delivery-loop/lead-prompt.md +34 -0
- package/templates/community/linear-delivery-loop/schedule.json +10 -0
- package/templates/community/linear-delivery-loop/scripts/linear-delivery-setup.ts +148 -0
- package/templates/community/linear-delivery-loop/scripts/linear-delivery-tick.ts +1781 -0
- package/templates/skills/swarm-docs/config.json +14 -0
- package/templates/skills/swarm-docs/content.md +144 -0
- package/dist/handlers-eqsnmv95.js +0 -41
- package/dist/lead-23e7z59t.js +0 -79
- package/dist/worker-e3w7vye1.js +0 -79
- package/dist/{azure-openai-responses-9kfwhmn7.js → azure-openai-responses-43asa23s.js} +0 -0
- package/dist/{node-vxx896fa.js → node-t28cc56b.js} +0 -0
- package/dist/{openai-codex-responses-79s8xnbh.js → openai-codex-responses-jhr3sjtm.js} +3 -3
- package/dist/{openai-completions-tdbyts0x.js → openai-completions-gs6yn37k.js} +3 -3
- /package/dist/{openai-responses-dm3t5vqp.js → openai-responses-jqm9vwwk.js} +0 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Docker Compose for Agent Swarm
|
|
2
|
+
# Generated by `agent-swarm onboard`
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# docker compose --env-file .env up -d
|
|
6
|
+
#
|
|
7
|
+
# Image version: set AGENT_SWARM_VERSION in .env to a published release.
|
|
8
|
+
# Blank falls back to `latest`, which moves on every commit to main and is
|
|
9
|
+
# not a release. Releases: https://github.com/desplega-ai/agent-swarm/releases
|
|
10
|
+
# Upgrade/rollback (migrations are forward-only, so back up first):
|
|
11
|
+
# https://github.com/desplega-ai/agent-swarm/blob/main/skills/agent-swarm/references/upgrade.md
|
|
12
|
+
|
|
13
|
+
services:
|
|
14
|
+
swarm-api:
|
|
15
|
+
image: "ghcr.io/desplega-ai/agent-swarm:${AGENT_SWARM_VERSION:-latest}"
|
|
16
|
+
container_name: swarm-api
|
|
17
|
+
pull_policy: always
|
|
18
|
+
stop_grace_period: 60s
|
|
19
|
+
|
|
20
|
+
environment:
|
|
21
|
+
- API_KEY=${API_KEY}
|
|
22
|
+
- INSTALL_METHOD=${INSTALL_METHOD}
|
|
23
|
+
- INSTALL_PRESET=${INSTALL_PRESET:-}
|
|
24
|
+
- MEMORY_HYBRID_SEARCH=${MEMORY_HYBRID_SEARCH-1}
|
|
25
|
+
- MEMORY_GRAPH_EXPANSION=${MEMORY_GRAPH_EXPANSION-1}
|
|
26
|
+
- MEMORY_RATERS=${MEMORY_RATERS-implicit-citation,explicit-self}
|
|
27
|
+
- MEMORY_DEMOTION_FLOOR=${MEMORY_DEMOTION_FLOOR-1.0}
|
|
28
|
+
- CLAUDE_CODE_OAUTH_TOKEN=${CLAUDE_CODE_OAUTH_TOKEN}
|
|
29
|
+
- MCP_BASE_URL=http://localhost:3013
|
|
30
|
+
- APP_URL=https://app.agent-swarm.dev
|
|
31
|
+
|
|
32
|
+
ports:
|
|
33
|
+
- "3013:3013"
|
|
34
|
+
|
|
35
|
+
volumes:
|
|
36
|
+
- swarm_data:/app/data
|
|
37
|
+
|
|
38
|
+
healthcheck:
|
|
39
|
+
test: ["CMD-SHELL", "curl -f http://localhost:3013/health || exit 1"]
|
|
40
|
+
interval: 10s
|
|
41
|
+
timeout: 5s
|
|
42
|
+
retries: 3
|
|
43
|
+
start_period: 15s
|
|
44
|
+
|
|
45
|
+
restart: unless-stopped
|
|
46
|
+
|
|
47
|
+
worker-coder:
|
|
48
|
+
image: "ghcr.io/desplega-ai/agent-swarm-worker:${AGENT_SWARM_VERSION:-latest}"
|
|
49
|
+
container_name: swarm-worker-coder
|
|
50
|
+
pull_policy: always
|
|
51
|
+
stop_grace_period: 60s
|
|
52
|
+
|
|
53
|
+
depends_on:
|
|
54
|
+
swarm-api:
|
|
55
|
+
condition: service_healthy
|
|
56
|
+
|
|
57
|
+
environment:
|
|
58
|
+
- HARNESS_PROVIDER=${HARNESS_PROVIDER}
|
|
59
|
+
- CLAUDE_CODE_OAUTH_TOKEN=${CLAUDE_CODE_OAUTH_TOKEN}
|
|
60
|
+
- API_KEY=${API_KEY}
|
|
61
|
+
- MEMORY_RATERS=${MEMORY_RATERS-implicit-citation,explicit-self}
|
|
62
|
+
- AGENT_ID=00000000-0000-4000-8000-000000000001
|
|
63
|
+
- AGENT_NAME=Coder
|
|
64
|
+
- AGENT_ROLE=worker
|
|
65
|
+
- TEMPLATE_ID=official/coder
|
|
66
|
+
- MCP_BASE_URL=http://swarm-api:3013
|
|
67
|
+
- YOLO=true
|
|
68
|
+
- SWARM_URL=http://swarm-api:3013
|
|
69
|
+
- MAX_CONCURRENT_TASKS=1
|
|
70
|
+
|
|
71
|
+
ports:
|
|
72
|
+
- "3201:3000"
|
|
73
|
+
|
|
74
|
+
volumes:
|
|
75
|
+
- swarm_logs:/logs
|
|
76
|
+
- swarm_shared:/workspace/shared
|
|
77
|
+
- swarm_worker_coder:/workspace/personal
|
|
78
|
+
|
|
79
|
+
restart: unless-stopped
|
|
80
|
+
|
|
81
|
+
volumes:
|
|
82
|
+
swarm_data:
|
|
83
|
+
swarm_logs:
|
|
84
|
+
swarm_shared:
|
|
85
|
+
swarm_worker_coder:
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# === Core ===
|
|
2
|
+
API_KEY=example-test-api-key
|
|
3
|
+
MCP_BASE_URL=http://localhost:3013
|
|
4
|
+
APP_URL=https://app.agent-swarm.dev
|
|
5
|
+
# Pin a release, e.g. AGENT_SWARM_VERSION=1.150.0. Blank tracks `latest`.
|
|
6
|
+
AGENT_SWARM_VERSION=
|
|
7
|
+
INSTALL_METHOD=onboard_noninteractive
|
|
8
|
+
INSTALL_PRESET=solo
|
|
9
|
+
|
|
10
|
+
# New-deployment memory preset: retrieval, citation ratings, self-rating hints.
|
|
11
|
+
# Set MEMORY_RATERS= to disable all raters; leave SKIP_SESSION_SUMMARY unset.
|
|
12
|
+
MEMORY_HYBRID_SEARCH=1
|
|
13
|
+
MEMORY_GRAPH_EXPANSION=1
|
|
14
|
+
MEMORY_RATERS=implicit-citation,explicit-self
|
|
15
|
+
MEMORY_DEMOTION_FLOOR=1.0
|
|
16
|
+
|
|
17
|
+
# === Authentication ===
|
|
18
|
+
HARNESS_PROVIDER=claude
|
|
19
|
+
CLAUDE_CODE_OAUTH_TOKEN=example-test-oauth
|
|
20
|
+
|
|
21
|
+
# === Integrations ===
|
|
22
|
+
GITHUB_DISABLE=true
|
|
23
|
+
SLACK_DISABLE=true
|
|
24
|
+
|
|
25
|
+
# === Agent IDs (for reference) ===
|
|
26
|
+
# worker-coder = 00000000-0000-4000-8000-000000000001
|
|
@@ -24,6 +24,7 @@ import {
|
|
|
24
24
|
upsertSwarmConfig,
|
|
25
25
|
} from "../be/db";
|
|
26
26
|
import { getScript, upsertScriptByName } from "../be/scripts/db";
|
|
27
|
+
import * as savedScriptRunner from "../be/scripts/run-saved";
|
|
27
28
|
import { runSavedScriptAsAgent } from "../be/scripts/run-saved";
|
|
28
29
|
import {
|
|
29
30
|
checkHeartbeatChecklist,
|
|
@@ -624,6 +625,66 @@ describe("Heartbeat Checklist", () => {
|
|
|
624
625
|
});
|
|
625
626
|
});
|
|
626
627
|
|
|
628
|
+
for (const quiet of [true, false]) {
|
|
629
|
+
test(`healthy probe preserves the saved gate quiet=${quiet} verdict`, async () => {
|
|
630
|
+
process.env.HEARTBEAT_CHECKLIST_GATE_MODE = "enforce";
|
|
631
|
+
await saveGlobalGateScript("quiet-gate", "export default () => ({ quiet: true });");
|
|
632
|
+
const saved = spyOn(savedScriptRunner, "runSavedScriptAsAgent").mockResolvedValue({
|
|
633
|
+
exitCode: 0,
|
|
634
|
+
result: { quiet, reason: "existing verdict" },
|
|
635
|
+
stdout: "",
|
|
636
|
+
stderr: "",
|
|
637
|
+
durationMs: 1,
|
|
638
|
+
truncated: { stdout: false, stderr: false },
|
|
639
|
+
});
|
|
640
|
+
try {
|
|
641
|
+
setChecklistGateRunnerForTests((name, agentId, signal) =>
|
|
642
|
+
defaultChecklistGateRunner(name, agentId, signal, { probe: async () => null }),
|
|
643
|
+
);
|
|
644
|
+
await seedLead();
|
|
645
|
+
await checkHeartbeatChecklist();
|
|
646
|
+
expect(saved).toHaveBeenCalledTimes(1);
|
|
647
|
+
const tasks = await checklistTasks();
|
|
648
|
+
expect(tasks).toHaveLength(quiet ? 0 : 1);
|
|
649
|
+
if (!quiet) expect(tasks[0]!.tags).toContain("heartbeat-gate:wake");
|
|
650
|
+
} finally {
|
|
651
|
+
saved.mockRestore();
|
|
652
|
+
}
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
for (const mode of ["shadow", "enforce"] as const) {
|
|
657
|
+
test(`${mode}: an unhealthy probe produces a wake checklist`, async () => {
|
|
658
|
+
process.env.HEARTBEAT_CHECKLIST_GATE_MODE = mode;
|
|
659
|
+
setChecklistGateRunnerForTests((name, agentId, signal) =>
|
|
660
|
+
defaultChecklistGateRunner(name, agentId, signal, {
|
|
661
|
+
probe: async () => ({ quiet: false, reason: "script-runner-unhealthy: timeout" }),
|
|
662
|
+
}),
|
|
663
|
+
);
|
|
664
|
+
await seedLead();
|
|
665
|
+
await checkHeartbeatChecklist();
|
|
666
|
+
const tasks = await checklistTasks();
|
|
667
|
+
expect(tasks).toHaveLength(1);
|
|
668
|
+
expect(tasks[0]!.tags).toContain("heartbeat-gate:wake");
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
test("a bug in the probe produces wake rather than error", async () => {
|
|
673
|
+
process.env.HEARTBEAT_CHECKLIST_GATE_MODE = "enforce";
|
|
674
|
+
setChecklistGateRunnerForTests((name, agentId, signal) =>
|
|
675
|
+
defaultChecklistGateRunner(name, agentId, signal, {
|
|
676
|
+
probe: async () => {
|
|
677
|
+
throw new Error("probe bug");
|
|
678
|
+
},
|
|
679
|
+
}),
|
|
680
|
+
);
|
|
681
|
+
await seedLead();
|
|
682
|
+
await checkHeartbeatChecklist();
|
|
683
|
+
const tasks = await checklistTasks();
|
|
684
|
+
expect(tasks).toHaveLength(1);
|
|
685
|
+
expect(tasks[0]!.tags).toContain("heartbeat-gate:wake");
|
|
686
|
+
});
|
|
687
|
+
|
|
627
688
|
test("shadow mode (default): a quiet verdict still creates the task, tagged quiet", async () => {
|
|
628
689
|
useGate({ quiet: true, reason: "no change", summary: "nothing moved" });
|
|
629
690
|
const lead = await seedLead();
|
|
@@ -703,6 +764,9 @@ describe("Heartbeat Checklist", () => {
|
|
|
703
764
|
test("enforce mode: a missing global script fails open through the real runner", async () => {
|
|
704
765
|
process.env.HEARTBEAT_CHECKLIST_GATE_MODE = "enforce";
|
|
705
766
|
process.env.HEARTBEAT_CHECKLIST_GATE_SCRIPT = "no-such-gate-script";
|
|
767
|
+
setChecklistGateRunnerForTests((name, agentId, signal) =>
|
|
768
|
+
defaultChecklistGateRunner(name, agentId, signal, { probe: async () => null }),
|
|
769
|
+
);
|
|
706
770
|
await seedLead();
|
|
707
771
|
|
|
708
772
|
await checkHeartbeatChecklist();
|
|
@@ -739,6 +803,7 @@ describe("Heartbeat Checklist", () => {
|
|
|
739
803
|
let run: Promise<unknown> | undefined;
|
|
740
804
|
setChecklistGateRunnerForTests((scriptName, leadAgentId, signal) => {
|
|
741
805
|
run = defaultChecklistGateRunner(scriptName, leadAgentId, signal, {
|
|
806
|
+
probe: async () => null,
|
|
742
807
|
buildCredentials: () => {
|
|
743
808
|
setupStarted.resolve();
|
|
744
809
|
return new Promise((resolve) => {
|
|
@@ -798,6 +863,9 @@ describe("Heartbeat Checklist", () => {
|
|
|
798
863
|
"export default async function run() { await new Promise((r) => setTimeout(r, 30_000)); return { quiet: true }; }",
|
|
799
864
|
);
|
|
800
865
|
setChecklistGateTimeoutMsForTests(1_500);
|
|
866
|
+
setChecklistGateRunnerForTests((name, agentId, signal) =>
|
|
867
|
+
defaultChecklistGateRunner(name, agentId, signal, { probe: async () => null }),
|
|
868
|
+
);
|
|
801
869
|
await seedLead();
|
|
802
870
|
|
|
803
871
|
const started = Date.now();
|
|
@@ -808,6 +876,27 @@ describe("Heartbeat Checklist", () => {
|
|
|
808
876
|
expect(tasks).toHaveLength(1);
|
|
809
877
|
expect(tasks[0]!.tags).toContain("heartbeat-gate:error");
|
|
810
878
|
});
|
|
879
|
+
|
|
880
|
+
test("enforce mode: the real probe passes with no swarm API key, using the Lead's run token", async () => {
|
|
881
|
+
process.env.HEARTBEAT_CHECKLIST_GATE_MODE = "enforce";
|
|
882
|
+
await saveGlobalGateScript("quiet-gate", "export default () => ({ quiet: true });");
|
|
883
|
+
const savedKeys = { swarm: process.env.AGENT_SWARM_API_KEY, legacy: process.env.API_KEY };
|
|
884
|
+
process.env.AGENT_SWARM_API_KEY = "";
|
|
885
|
+
process.env.API_KEY = "";
|
|
886
|
+
try {
|
|
887
|
+
await seedLead();
|
|
888
|
+
await checkHeartbeatChecklist();
|
|
889
|
+
expect(await checklistTasks()).toHaveLength(0);
|
|
890
|
+
} finally {
|
|
891
|
+
for (const [name, value] of [
|
|
892
|
+
["AGENT_SWARM_API_KEY", savedKeys.swarm],
|
|
893
|
+
["API_KEY", savedKeys.legacy],
|
|
894
|
+
] as const) {
|
|
895
|
+
if (value === undefined) delete process.env[name];
|
|
896
|
+
else process.env[name] = value;
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
});
|
|
811
900
|
});
|
|
812
901
|
|
|
813
902
|
// ==========================================================================
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { afterEach, describe, expect, mock, spyOn, test } from "bun:test";
|
|
2
|
+
import { probeScriptRunner } from "../heartbeat/script-runner-probe";
|
|
3
|
+
import type { RunScriptOutput } from "../scripts-runtime/loader";
|
|
4
|
+
|
|
5
|
+
const ok: RunScriptOutput = {
|
|
6
|
+
result: true,
|
|
7
|
+
stdout: "",
|
|
8
|
+
stderr: "",
|
|
9
|
+
truncated: { stdout: false, stderr: false },
|
|
10
|
+
durationMs: 1,
|
|
11
|
+
exitCode: 0,
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
afterEach(() => mock.restore());
|
|
15
|
+
|
|
16
|
+
describe("heartbeat script runner probe", () => {
|
|
17
|
+
test("success leaves the gate verdict unchanged and clears its deadline", async () => {
|
|
18
|
+
const clear = spyOn(globalThis, "clearTimeout");
|
|
19
|
+
const runner = mock(async () => ok);
|
|
20
|
+
expect(await probeScriptRunner("lead", runner)).toBeNull();
|
|
21
|
+
expect(runner).toHaveBeenCalledWith({
|
|
22
|
+
source: "export default async function () { return true; }",
|
|
23
|
+
agentId: "lead",
|
|
24
|
+
fsMode: "none",
|
|
25
|
+
timeoutMs: 10_000,
|
|
26
|
+
signal: expect.any(AbortSignal),
|
|
27
|
+
});
|
|
28
|
+
expect(clear).toHaveBeenCalledTimes(1);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("timeout wakes without waiting for a stalled runner and aborts it", async () => {
|
|
32
|
+
let expire: (() => void) | undefined;
|
|
33
|
+
spyOn(globalThis, "setTimeout").mockImplementation(((callback: () => void, ms: number) => {
|
|
34
|
+
expect(ms).toBe(10_000);
|
|
35
|
+
expire = callback;
|
|
36
|
+
return 1;
|
|
37
|
+
}) as typeof setTimeout);
|
|
38
|
+
const clear = spyOn(globalThis, "clearTimeout").mockImplementation(() => {});
|
|
39
|
+
let signal: AbortSignal | undefined;
|
|
40
|
+
let rejectRun: ((error: Error) => void) | undefined;
|
|
41
|
+
const result = probeScriptRunner("lead", async (input) => {
|
|
42
|
+
signal = input.signal;
|
|
43
|
+
return new Promise<RunScriptOutput>((_, reject) => {
|
|
44
|
+
rejectRun = reject;
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
expire!();
|
|
48
|
+
expect(await result).toEqual({
|
|
49
|
+
quiet: false,
|
|
50
|
+
reason: "script-runner-unhealthy: timeout after 10000ms",
|
|
51
|
+
});
|
|
52
|
+
expect(signal?.aborted).toBe(true);
|
|
53
|
+
expect(clear).toHaveBeenCalledTimes(1);
|
|
54
|
+
// A runner that rejects after the deadline remains handled by Promise.race.
|
|
55
|
+
rejectRun!(new Error("late rejection"));
|
|
56
|
+
await Promise.resolve();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("a thrown runner error wakes", async () => {
|
|
60
|
+
expect(
|
|
61
|
+
await probeScriptRunner("lead", async () => {
|
|
62
|
+
throw new Error("ECONNRESET");
|
|
63
|
+
}),
|
|
64
|
+
).toEqual({
|
|
65
|
+
quiet: false,
|
|
66
|
+
reason: "script-runner-unhealthy: ECONNRESET",
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
for (const [label, failure, reason] of [
|
|
71
|
+
["nonzero exit", { exitCode: 1 }, "script exited with code 1"],
|
|
72
|
+
["runner error", { error: "killed" }, "killed"],
|
|
73
|
+
["runtime error", { runtimeError: { message: "runtime failed" } }, "runtime failed"],
|
|
74
|
+
] as const) {
|
|
75
|
+
test(`${label} wakes`, async () => {
|
|
76
|
+
const result = await probeScriptRunner(
|
|
77
|
+
"lead",
|
|
78
|
+
async () => ({ ...ok, ...failure }) as RunScriptOutput,
|
|
79
|
+
);
|
|
80
|
+
expect(result).toEqual({ quiet: false, reason: `script-runner-unhealthy: ${reason}` });
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
});
|
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { safeRequestUrlForLog } from "../http/utils";
|
|
2
|
+
import { redactShareTokenInPath, safeRequestUrlForLog } from "../http/utils";
|
|
3
3
|
|
|
4
4
|
describe("safeRequestUrlForLog", () => {
|
|
5
|
+
test("redacts invite codes in request logs and the OTel path attribute", () => {
|
|
6
|
+
for (const suffix of ["", "/", "/extra"]) {
|
|
7
|
+
expect(safeRequestUrlForLog(`/invite/example_invite_code${suffix}?code=secret`)).toBe(
|
|
8
|
+
`/invite/[REDACTED]${suffix}?code=[REDACTED]`,
|
|
9
|
+
);
|
|
10
|
+
expect(redactShareTokenInPath(`/invite/example_invite_code${suffix}`)).toBe(
|
|
11
|
+
`/invite/[REDACTED]${suffix}`,
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
expect(safeRequestUrlForLog("/invite")).toBe("/invite");
|
|
15
|
+
expect(safeRequestUrlForLog("/api/invites")).toBe("/api/invites");
|
|
16
|
+
});
|
|
5
17
|
test("redacts OAuth callback query values", () => {
|
|
6
18
|
expect(
|
|
7
19
|
safeRequestUrlForLog(
|
|
@@ -21,4 +33,25 @@ describe("safeRequestUrlForLog", () => {
|
|
|
21
33
|
"/mcp?session=[REDACTED]&session=[REDACTED]&token=[REDACTED]",
|
|
22
34
|
);
|
|
23
35
|
});
|
|
36
|
+
|
|
37
|
+
test("redacts the agent-fs share token after /share/ and /site/", () => {
|
|
38
|
+
expect(safeRequestUrlForLog("/share/tok_secret123/raw")).toBe("/share/[REDACTED]/raw");
|
|
39
|
+
expect(safeRequestUrlForLog("/site/tok_secret123/")).toBe("/site/[REDACTED]/");
|
|
40
|
+
expect(safeRequestUrlForLog("/site/tok_secret123/a/index.html?v=1")).toBe(
|
|
41
|
+
"/site/[REDACTED]/a/index.html?v=[REDACTED]",
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("redacts the share token behind the /agentfs proxy prefix", () => {
|
|
46
|
+
expect(safeRequestUrlForLog("/agentfs/share/tok_secret123")).toBe("/agentfs/share/[REDACTED]");
|
|
47
|
+
expect(safeRequestUrlForLog("/agentfs/site/tok_secret123/x.css")).toBe(
|
|
48
|
+
"/agentfs/site/[REDACTED]/x.css",
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("leaves other share-like paths alone", () => {
|
|
53
|
+
expect(safeRequestUrlForLog("/share")).toBe("/share");
|
|
54
|
+
expect(safeRequestUrlForLog("/api/share/abc")).toBe("/api/share/abc");
|
|
55
|
+
expect(safeRequestUrlForLog("/agentfs/orgs/o/share")).toBe("/agentfs/orgs/o/share");
|
|
56
|
+
});
|
|
24
57
|
});
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
completeTask,
|
|
11
11
|
createAgent,
|
|
12
12
|
createTaskExtended,
|
|
13
|
+
createUser,
|
|
13
14
|
getTaskById,
|
|
14
15
|
initDb,
|
|
15
16
|
startTask,
|
|
@@ -27,7 +28,9 @@ const ownerId = "aaaa0000-0000-4000-8000-000000000b01";
|
|
|
27
28
|
const otherId = "bbbb0000-0000-4000-8000-000000000b02";
|
|
28
29
|
const creatorId = "cccc0000-0000-4000-8000-000000000b03";
|
|
29
30
|
const leadId = "dddd0000-0000-4000-8000-000000000b04";
|
|
30
|
-
|
|
31
|
+
// A real user row: a new user gets the built-in admin role, so with RBAC on
|
|
32
|
+
// it may cancel any task, ownerless ones included.
|
|
33
|
+
let userId: string;
|
|
31
34
|
|
|
32
35
|
type Caller =
|
|
33
36
|
| { as: "operator"; agentId?: string }
|
|
@@ -85,6 +88,7 @@ beforeAll(async () => {
|
|
|
85
88
|
await createAgent({ id: otherId, name: "Other", isLead: false, status: "idle" });
|
|
86
89
|
await createAgent({ id: creatorId, name: "Creator", isLead: false, status: "idle" });
|
|
87
90
|
await createAgent({ id: leadId, name: "Lead", isLead: true, status: "idle" });
|
|
91
|
+
userId = (await createUser({ name: "Dashboard User" })).id;
|
|
88
92
|
|
|
89
93
|
server = createHttpServer(async (req: IncomingMessage, res: ServerResponse) => {
|
|
90
94
|
const caller = JSON.parse(String(req.headers["x-test-caller"])) as Caller;
|