@desplega.ai/agent-swarm 2.5.4 → 2.7.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 +4 -2
- package/dist/{acp-adapter-ek38cwsv.js → acp-adapter-ma1js5n7.js} +9 -9
- package/dist/{actions-92mepq03.js → actions-1vhmtvg9.js} +21 -21
- package/dist/{amp-adapter-9gaxg015.js → amp-adapter-sxqqvmdk.js} +4 -4
- package/dist/{app-ctn8gsgx.js → app-mwx1d5a9.js} +3 -3
- package/dist/{assistant-zyr5kz47.js → assistant-yx1p6g82.js} +30 -26
- package/dist/{boot-reembed-w75maga2.js → boot-reembed-5h37a2c2.js} +1 -1
- package/dist/{boot-reembed-dwzfttdr.js → boot-reembed-7h78vmvv.js} +2 -1
- package/dist/{boot-scrub-sweep-e9kq43kf.js → boot-scrub-sweep-8mawd4gw.js} +4 -4
- package/dist/{boot-seeds-x28v3fhb.js → boot-seeds-ca84dhnn.js} +4 -4
- package/dist/{claude-adapter-f0afqnne.js → claude-adapter-wqt4hfkq.js} +9 -9
- package/dist/{claude-managed-adapter-x81a7r65.js → claude-managed-adapter-6fjqtr2z.js} +2 -2
- package/dist/{claude-managed-setup-bqzwjd9x.js → claude-managed-setup-rqv98sea.js} +10 -3
- package/dist/{claude-sdk-session-7b7whkaq.js → claude-sdk-session-f29f3b2x.js} +11 -11
- package/dist/{cli-sxgtf5fw.js → cli-07q03xm2.js} +1 -1
- package/dist/{cli-kxpfx2xr.js → cli-0z1xjzwa.js} +2 -2
- package/dist/{cli-g9vd9ece.js → cli-1hhbzkbb.js} +14 -16
- package/dist/{cli-qqzmjxkf.js → cli-1m9x8dr5.js} +11 -6
- package/dist/{cli-jbnn4vxb.js → cli-2pvzmas1.js} +3 -3
- package/dist/{cli-x77gen2p.js → cli-2y7v133v.js} +7 -7
- package/dist/{cli-dew6x255.js → cli-39aet655.js} +2 -2
- package/dist/{cli-g1cw7xtt.js → cli-39rrw8yp.js} +1 -1
- package/dist/{cli-jb30dzvk.js → cli-48gxjmcz.js} +530 -190
- package/dist/{cli-pzatvw94.js → cli-54sj64fc.js} +2 -2
- package/dist/{cli-bvpgr9ny.js → cli-60sty27p.js} +5 -5
- package/dist/{cli-asq5ydm4.js → cli-6a9qfa8b.js} +411 -69
- package/dist/{cli-277c31dw.js → cli-6mgdba42.js} +225 -3
- package/dist/{cli-19202kew.js → cli-6srv653c.js} +5 -5
- package/dist/{cli-n4c8e3s5.js → cli-708wdy32.js} +1 -1
- package/dist/{cli-pasyvjmm.js → cli-737pyqxr.js} +1 -1
- package/dist/{cli-6x9ma5w5.js → cli-803188pb.js} +1 -1
- package/dist/{cli-hh5we352.js → cli-86ehn4s5.js} +7 -7
- package/dist/{cli-9s05422w.js → cli-8mbc9za9.js} +1 -1
- package/dist/{cli-ff1tm9n9.js → cli-8wmj18cz.js} +1 -1
- package/dist/{cli-1r5ad7j5.js → cli-9gsm2rzp.js} +12 -12
- package/dist/{cli-mz9afxxf.js → cli-9pshx6rd.js} +17 -3
- package/dist/{cli-s682zgqz.js → cli-a6ds2epe.js} +1 -1
- package/dist/{cli-6a1xg1p7.js → cli-a89zdqz9.js} +2 -2
- package/dist/{cli-03vpq45j.js → cli-ay40dnj3.js} +2 -2
- package/dist/{cli-tsma7p8v.js → cli-aypd09nf.js} +2 -2
- package/dist/{cli-ethgy7ha.js → cli-b3yzyc57.js} +2 -2
- package/dist/{cli-bn0rewsy.js → cli-c081bj3b.js} +2 -2
- package/dist/{cli-mmhj8vd7.js → cli-c668vvcf.js} +11 -2
- package/dist/{cli-sbwsxvtd.js → cli-d20qvpr2.js} +2 -2
- package/dist/{cli-c952c7ac.js → cli-e1595bgx.js} +3 -3
- package/dist/{cli-621ce7kw.js → cli-f12mr20z.js} +3 -3
- package/dist/{cli-dqygeeh5.js → cli-f1e0ptjj.js} +10 -1
- package/dist/{cli-xzfq4at3.js → cli-f4dbh7a5.js} +16 -12
- package/dist/{cli-ha9rmwgq.js → cli-fb8m699c.js} +2 -2
- package/dist/{cli-5bnsc0e1.js → cli-gsfk58nw.js} +5 -5
- package/dist/cli-gt4h8cxw.js +895 -0
- package/dist/{cli-nwyw3zhg.js → cli-gxee0bqa.js} +1 -1
- package/dist/{cli-25n3mv5d.js → cli-h5jeg46p.js} +6 -6
- package/dist/{cli-gn5af0x5.js → cli-he9gbdx0.js} +62 -12
- package/dist/{cli-gbfxp48k.js → cli-j0ppywdr.js} +42 -35
- package/dist/{cli-k4tjsdx9.js → cli-j3y0x2n4.js} +277 -199
- package/dist/{cli-7p4jxgtt.js → cli-j9bpmykh.js} +75 -27
- package/dist/{cli-dabehxhp.js → cli-kt907da6.js} +1 -1
- package/dist/{cli-wx2nj19m.js → cli-kv7sbc2c.js} +6 -6
- package/dist/{cli-abs8ndtr.js → cli-m30k9777.js} +26 -26
- package/dist/{cli-cz5nmdxt.js → cli-m5e802r7.js} +2 -2
- package/dist/{cli-0shx9j93.js → cli-pfk92eqz.js} +2 -2
- package/dist/{cli-xtrz6bzs.js → cli-ptfq202x.js} +5 -3
- package/dist/{cli-6n8axjv1.js → cli-qj442fws.js} +2 -2
- package/dist/{cli-c61mbdds.js → cli-rd5m70gj.js} +4 -4
- package/dist/{cli-eftzyh9y.js → cli-s09j9vp5.js} +2 -2
- package/dist/{cli-m4ecdxvz.js → cli-s0mgx214.js} +7 -7
- package/dist/{cli-wghjkr0e.js → cli-sgqm2582.js} +10 -7
- package/dist/{cli-2655k16q.js → cli-sjctjr48.js} +2 -2
- package/dist/{cli-nzfnt2gs.js → cli-tf1n0r0b.js} +1 -1
- package/dist/{cli-x0f2v69c.js → cli-twctnkng.js} +12 -7
- package/dist/{cli-j6rktc91.js → cli-v6shg7na.js} +1 -1
- package/dist/{cli-gx4rm0qx.js → cli-vz78s5wm.js} +1 -1
- package/dist/{cli-gwhjmh8g.js → cli-wqr7cea4.js} +5 -5
- package/dist/{cli-e42vss7b.js → cli-x37r7qwf.js} +16 -8
- package/dist/{cli-4b2z6n0m.js → cli-yd2nreqw.js} +17 -8
- package/dist/{cli-64mh9mf3.js → cli-ymjpkxgn.js} +69 -17
- package/dist/{cli-5kqnemen.js → cli-yvy48785.js} +1 -1
- package/dist/{cli-9j129brq.js → cli-yxbsmx56.js} +6 -6
- package/dist/cli.js +22 -20
- package/dist/{codex-adapter-wch12q99.js → codex-adapter-zk59x2zh.js} +7 -7
- package/dist/{codex-hook-brpnycn5.js → codex-hook-xyjhvxwd.js} +1 -1
- package/dist/{codex-login-rn7c5gxt.js → codex-login-8cg0vhf2.js} +1 -1
- package/dist/{codex-session-runner-41pfcr95.js → codex-session-runner-kh6s4j3n.js} +8 -8
- package/dist/{commands-9849dkj6.js → commands-68et1qv2.js} +2 -2
- package/dist/{controller-ja0sd95p.js → controller-fyrbnzg4.js} +4 -4
- package/dist/{controllers-connect-xp05dj6x.js → controllers-connect-nep9h2xv.js} +23 -23
- package/dist/{cursor-adapter-623qxqew.js → cursor-adapter-yss3pg7t.js} +2 -2
- package/dist/{db-w759qmx0.js → db-28gjyvxj.js} +4 -2
- package/dist/{db-47vj40dy.js → db-8ftwvzba.js} +3 -3
- package/dist/{devin-adapter-4ycy4vrf.js → devin-adapter-byen2cxt.js} +1 -1
- package/dist/{dispatcher-7b8e4z2j.js → dispatcher-hayexmkr.js} +20 -20
- package/dist/{docker-s84hjs91.js → docker-fdzyewpz.js} +2 -2
- package/dist/{dsh-adapter-2ezw3xea.js → dsh-adapter-46wawff9.js} +2 -2
- package/dist/{e2b-9gkdhm3c.js → e2b-222hsajc.js} +2 -2
- package/dist/{e2b-cjtf8k1z.js → e2b-fn3zacvt.js} +2 -2
- package/dist/{easter-egg-3d-e4qv8dxj.js → easter-egg-3d-8d1e0h4m.js} +1 -1
- package/dist/{event-bus-3z78ep5n.js → event-bus-pghg8hqy.js} +1 -1
- package/dist/{execute-0xpz8950.js → execute-cjrfxfnm.js} +1 -1
- package/dist/{external-channel-e2s028da.js → external-channel-xbmxcg09.js} +2 -2
- package/dist/{grok-adapter-ys7gaqee.js → grok-adapter-ag4wks2a.js} +10 -10
- package/dist/handlers-tzmevqb5.js +41 -0
- package/dist/{heartbeat-w3mntghj.js → heartbeat-psfvcgwp.js} +23 -23
- package/dist/{hook-g7kvv6x9.js → hook-8pz04697.js} +6 -6
- package/dist/{hook-3jjywnpb.js → hook-cyq4mryn.js} +8 -8
- package/dist/{http-tkp7d4kb.js → http-haj1nd6k.js} +921 -169
- package/dist/{index-q7m26kvs.js → index-jwt2bj6f.js} +265 -97
- package/dist/{index-3n8m9ea2.js → index-q52f47pe.js} +1 -1
- package/dist/{index-31ceyf42.js → index-syvhnvtw.js} +1 -1
- package/dist/index-y1ajx04a.js +43 -0
- package/dist/{index-1ef1myq2.js → index-z5h22pes.js} +20 -20
- package/dist/{index-xdaahthb.js → index-zyq8ct52.js} +20 -20
- package/dist/{keepalive-v4ta8wgg.js → keepalive-xdvsamvj.js} +4 -4
- package/dist/lead-hqg57kdp.js +79 -0
- package/dist/{maintenance-84n1ex21.js → maintenance-4y2xzh3a.js} +1 -1
- package/dist/{oauth-refresh-sweep-vjnnandw.js → oauth-refresh-sweep-jd4r7zbs.js} +9 -4
- package/dist/{onboard-sfmpe4np.js → onboard-18447q9q.js} +6 -6
- package/dist/{opencode-adapter-jmpst4q4.js → opencode-adapter-26b2frdf.js} +7 -7
- package/dist/{otel-impl-v6cc0zve.js → otel-impl-f9tgr8yw.js} +2 -2
- package/dist/{pi-mono-adapter-fk8fkcf6.js → pi-mono-adapter-qn6qbga1.js} +38 -17
- package/dist/{pricing-refresh-fsk1e1zc.js → pricing-refresh-dw2tgb53.js} +3 -3
- package/dist/{rbac-roles-prmkdnkw.js → rbac-roles-aygm2760.js} +2 -2
- package/dist/{rbac-roles-zxmxqa39.js → rbac-roles-s4nwj2m3.js} +1 -1
- package/dist/render-v2-yfvdfr0x.js +16 -0
- package/dist/{resume-frdtgfa0.js → resume-1bmvjbf3.js} +9 -9
- package/dist/{runtime-bt5pkpm1.js → runtime-f7tpzedy.js} +1 -1
- package/dist/{session-access-fpez4y5q.js → session-access-r5garej6.js} +4 -4
- package/dist/session-source-backfill-424wzv0r.js +110 -0
- package/dist/{setup-mq6m3m8q.js → setup-8tygvxkq.js} +1 -1
- package/dist/{virtual-modules-mnfbh5mr.js → virtual-modules-xsw323b3.js} +2 -2
- package/dist/{work-objects-kfahhjsq.js → work-objects-ggnghpgf.js} +23 -23
- package/dist/worker-sqjd1nqf.js +79 -0
- package/dist/{x-pbpezr0s.js → x-wxrzvzx8.js} +2 -2
- package/openapi.json +1324 -14
- package/package.json +5 -3
- package/src/assets/source-key.ts +95 -0
- package/src/be/automation-preflight.ts +2 -0
- package/src/be/db/api-keys.ts +89 -0
- package/src/be/db/session-labels.ts +28 -0
- package/src/be/db/session-moves.ts +5 -6
- package/src/be/db/session-tree.ts +153 -14
- package/src/be/db/tasks/read.ts +11 -0
- package/src/be/db/tasks/write.ts +6 -1
- package/src/be/db/workflow-runs.ts +219 -6
- package/src/be/db-retention.ts +61 -6
- package/src/be/db.ts +135 -132
- package/src/be/memory/providers/openai-embedding.ts +5 -1
- package/src/be/memory/task-learning.ts +155 -0
- package/src/be/migrations/244_api_key_validation.sql +4 -0
- package/src/be/migrations/245_script_executor.sql +3 -0
- package/src/be/oauth-refresh-sweep.ts +2 -1
- package/src/be/onboarding.ts +4 -0
- package/src/be/scripts/boot-reembed.ts +2 -0
- package/src/be/scripts/db.ts +14 -4
- package/src/be/scripts/embeddings.ts +2 -0
- package/src/be/scripts/run-saved.ts +1 -0
- package/src/be/scripts/typecheck.ts +10 -4
- package/src/be/seed-skills/index.ts +7 -0
- package/src/be/session-source-backfill.ts +163 -0
- package/src/be/swarm-config-guard.ts +1 -0
- package/src/comb/review-batch.ts +28 -1
- package/src/comb/templates.ts +7 -2
- package/src/commands/claude-managed-setup.ts +7 -1
- package/src/commands/credential-refresh.ts +76 -1
- package/src/commands/credential-wait.ts +2 -2
- package/src/commands/onboard/compose-generator.ts +5 -3
- package/src/commands/provider-credentials.ts +212 -171
- package/src/commands/runner.ts +25 -4
- package/src/extensions/apply-task-create.ts +8 -1
- package/src/extensions/contract-types.generated.ts +1 -1
- package/src/extensions/contract.ts +5 -0
- package/src/heartbeat/heartbeat.ts +14 -1
- package/src/heartbeat/script-runner-probe.ts +47 -0
- package/src/http/all-routes.ts +2 -0
- package/src/http/api-keys.ts +77 -9
- package/src/http/assets.ts +15 -0
- package/src/http/codex-oauth-accounts.ts +191 -0
- package/src/http/comb.ts +15 -2
- package/src/http/config.ts +1 -1
- package/src/http/core.ts +6 -0
- package/src/http/fleet-benchmark.ts +5 -2
- package/src/http/idempotency-key.ts +1 -1
- package/src/http/index.ts +14 -3
- package/src/http/integrations.ts +5 -1
- package/src/http/kv.ts +8 -3
- package/src/http/onboarding.ts +6 -1
- package/src/http/pages-public.ts +38 -5
- package/src/http/pool-keys.ts +354 -0
- package/src/http/scripts.ts +27 -0
- package/src/http/sessions.ts +37 -12
- package/src/http/stats.ts +1 -0
- package/src/http/status.ts +26 -12
- package/src/http/tasks.ts +3 -0
- package/src/http/used-by.ts +7 -2
- package/src/http/workflows.ts +88 -9
- package/src/http/x.ts +5 -0
- package/src/integrations/chat-sdk/inbound.ts +27 -0
- package/src/kv-reserved-namespaces.ts +19 -0
- package/src/prompts/base-prompt.ts +21 -1
- package/src/prompts/session-templates.ts +17 -3
- package/src/providers/acp-targets.ts +1 -1
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/claude-adapter.ts +5 -1
- package/src/providers/claude-managed-adapter.ts +16 -9
- package/src/providers/codex-adapter.ts +71 -11
- package/src/providers/dsh-adapter.ts +1 -1
- package/src/providers/pi-mono-adapter.ts +41 -11
- package/src/scheduler/scheduler.ts +5 -3
- 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 +16 -3
- package/src/scripts-runtime/types/stdlib.d.ts +10 -2
- package/src/scripts-runtime/types/swarm-extension.d.ts +17 -8
- package/src/scripts-runtime/types/swarm-sdk.d.ts +10 -2
- package/src/slack/assistant.ts +7 -0
- package/src/slack/channel-labels.ts +74 -0
- package/src/slack/handlers.ts +8 -0
- package/src/slack/inbound-files.ts +5 -2
- package/src/slack/thread-buffer.ts +4 -0
- package/src/tasks/sibling-awareness.ts +12 -3
- package/src/telemetry-context.ts +5 -6
- package/src/telemetry-identity.ts +3 -3
- package/src/tests/api-key-status-by-suffix.test.ts +242 -0
- package/src/tests/api-keys-validation.test.ts +170 -0
- package/src/tests/base-prompt.test.ts +70 -2
- package/src/tests/claude-managed-adapter.test.ts +46 -0
- package/src/tests/claude-routes-e2e.test.ts +7 -2
- package/src/tests/codex-credential-pools.test.ts +120 -0
- package/src/tests/codex-gateway-route.test.ts +165 -0
- package/src/tests/codex-oauth-accounts.test.ts +357 -0
- package/src/tests/comb-review-batch.test.ts +63 -2
- package/src/tests/community-linear-delivery-loop.test.ts +2099 -0
- package/src/tests/config-pool-keys.test.ts +533 -0
- package/src/tests/credential-check.test.ts +294 -4
- package/src/tests/credential-refresh.test.ts +172 -1
- package/src/tests/db-retention.test.ts +9 -3
- package/src/tests/db-task-read-contract.test.ts +1 -0
- package/src/tests/db-task-write-contract.test.ts +1 -3
- package/src/tests/docs-index-footprint.test.js +3 -3
- package/src/tests/docs-index.test.ts +135 -0
- package/src/tests/dsh-adapter.test.ts +1 -1
- package/src/tests/extensions-pre-task.test.ts +53 -1
- package/src/tests/fetch-resolved-env.test.ts +16 -2
- package/src/tests/fixtures/extensions/record-task-create/hooks.ts +9 -0
- package/src/tests/fixtures/extensions/record-task-create/manifest.json +7 -0
- package/src/tests/fleet-benchmark.test.ts +8 -0
- package/src/tests/get-workflow-run-tool.test.ts +98 -0
- package/src/tests/heartbeat-checklist.test.ts +89 -0
- package/src/tests/heartbeat-script-runner-probe.test.ts +83 -0
- package/src/tests/integrations-http.test.ts +32 -2
- package/src/tests/internal-ai/complete-structured.test.ts +37 -1
- package/src/tests/internal-ai/credentials.test.ts +23 -0
- package/src/tests/kv-http.test.ts +32 -0
- package/src/tests/kv-tool.test.ts +25 -0
- package/src/tests/multi-runtime-registration.test.ts +12 -12
- package/src/tests/oauth-refresh-sweep.test.ts +34 -1
- package/src/tests/onboard-compose.test.ts +20 -0
- package/src/tests/onboarding.test.ts +108 -1
- package/src/tests/openai-embedding-credentials.test.ts +35 -0
- package/src/tests/opencode-adapter.test.ts +2 -1
- package/src/tests/openrouter-attribution-call-sites.test.ts +2 -2
- package/src/tests/org-website.test.ts +36 -0
- 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-native-mcp.test.ts +13 -1
- package/src/tests/pi-tool-exposure.test.ts +8 -8
- package/src/tests/probe-tool-schema-tokens.test.ts +144 -0
- package/src/tests/prompt-template-session.test.ts +4 -3
- package/src/tests/provider-key-probes.test.ts +181 -0
- package/src/tests/rbac-e2e-helpers.test.ts +88 -1
- package/src/tests/rbac-e2e-helpers.ts +36 -11
- package/src/tests/request-composition-derive.test.ts +329 -0
- package/src/tests/script-connections.test.ts +4 -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/script-runs-retention.test.ts +212 -0
- package/src/tests/scripts-external-api.test.ts +45 -0
- package/src/tests/sdk-allowlist.test.ts +42 -2
- package/src/tests/self-improvement.test.ts +4 -4
- package/src/tests/session-source-backfill.test.ts +429 -0
- package/src/tests/session-source-keys.test.ts +236 -0
- package/src/tests/session-source-labels.test.ts +419 -0
- package/src/tests/sessions-detail-batch.test.ts +2 -0
- package/src/tests/sessions-move.test.ts +131 -0
- package/src/tests/sessions-tree.test.ts +299 -2
- package/src/tests/slack-inbound-files.test.ts +103 -23
- package/src/tests/status.test.ts +101 -18
- package/src/tests/store-progress-learning.test.ts +288 -0
- package/src/tests/tasks-workflow-run-filter.test.ts +146 -0
- package/src/tests/test-net.ts +31 -0
- package/src/tests/transcription.test.ts +8 -0
- package/src/tests/ui-logs-parser.test.ts +180 -0
- package/src/tests/used-by-route.test.ts +11 -0
- package/src/tests/workflow-cascade-cancel.test.ts +172 -0
- package/src/tests/workflow-engine-v2.test.ts +116 -1
- package/src/tests/workflow-http-v2.test.ts +131 -0
- 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-step-order.test.ts +92 -0
- package/src/tests/workflow-sub-workflow.test.ts +30 -0
- package/src/tests/workflow-swarm-script.test.ts +34 -0
- package/src/tools/get-tasks.ts +8 -0
- package/src/tools/kv/kv-read-auth.ts +4 -2
- 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 +67 -1
- package/src/tools/task-action.ts +1 -1
- package/src/tools/workflows/get-workflow-run.ts +14 -4
- package/src/tools/workflows/trigger-workflow.ts +104 -10
- package/src/types.ts +36 -1
- package/src/utils/company-profile.ts +51 -1
- package/src/utils/credentials.ts +10 -4
- package/src/utils/internal-ai/complete-structured.ts +5 -0
- package/src/utils/internal-ai/credentials.ts +4 -3
- package/src/utils/provider-key-probes.ts +328 -0
- package/src/utils/transcription.ts +4 -1
- package/src/workflows/engine.ts +18 -16
- package/src/workflows/executors/sub-workflow.ts +8 -1
- 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/ai-toolbox.manifest.json +2 -2
- 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/researching/content.md +2 -0
- package/templates/skills/swarm-docs/config.json +14 -0
- package/templates/skills/swarm-docs/content.md +144 -0
- package/templates/skills/swarm-scripts/SKILL.md +1 -0
- package/templates/skills/swarm-scripts/content.md +1 -0
- package/dist/cli-7421jzsw.js +0 -84
- package/dist/cli-e45e4m6b.js +0 -413
- package/dist/cli-zw88zjba.js +0 -307
- package/dist/handlers-wy1dr6ja.js +0 -41
- package/dist/index-nmm79qgr.js +0 -43
- package/dist/lead-sawnyqxk.js +0 -79
- package/dist/render-v2-pjwxvnkw.js +0 -12
- package/dist/worker-v5e5rxj3.js +0 -79
|
@@ -640,3 +640,143 @@ describe("quickjs egress policy", () => {
|
|
|
640
640
|
expect(JSON.stringify(output)).not.toContain("quickjs-test-secret");
|
|
641
641
|
});
|
|
642
642
|
});
|
|
643
|
+
|
|
644
|
+
describe("quickjs hostValidatedArgs (#2011)", () => {
|
|
645
|
+
const countedStructuralScript = `
|
|
646
|
+
import { z } from "zod";
|
|
647
|
+
export const argsSchema = z.object({
|
|
648
|
+
value: z.number(),
|
|
649
|
+
label: z.string().optional(),
|
|
650
|
+
});
|
|
651
|
+
let parseCalls = 0;
|
|
652
|
+
const origParse = argsSchema.parse.bind(argsSchema);
|
|
653
|
+
argsSchema.parse = ((v: unknown) => {
|
|
654
|
+
parseCalls++;
|
|
655
|
+
return origParse(v);
|
|
656
|
+
}) as typeof argsSchema.parse;
|
|
657
|
+
|
|
658
|
+
export default async function (args: z.infer<typeof argsSchema>) {
|
|
659
|
+
return { doubled: args.value * 2, label: args.label ?? null, parseCalls };
|
|
660
|
+
}
|
|
661
|
+
`;
|
|
662
|
+
|
|
663
|
+
test("skips duplicate argsSchema.parse when hostValidatedArgs is true and schema is structural", async () => {
|
|
664
|
+
const out = await executor.run(
|
|
665
|
+
input(countedStructuralScript, {
|
|
666
|
+
args: { value: 21, label: "ok" },
|
|
667
|
+
hostValidatedArgs: true,
|
|
668
|
+
}),
|
|
669
|
+
);
|
|
670
|
+
expect(out.exitCode).toBe(0);
|
|
671
|
+
expect(out.error).toBeUndefined();
|
|
672
|
+
expect(out.result).toEqual({ doubled: 42, label: "ok", parseCalls: 0 });
|
|
673
|
+
});
|
|
674
|
+
|
|
675
|
+
test("still runs argsSchema.parse when hostValidatedArgs is omitted or false", async () => {
|
|
676
|
+
const out = await executor.run(input(countedStructuralScript, { args: { value: 21 } }));
|
|
677
|
+
expect(out.exitCode).toBe(0);
|
|
678
|
+
expect(out.result).toEqual({ doubled: 42, label: null, parseCalls: 1 });
|
|
679
|
+
});
|
|
680
|
+
|
|
681
|
+
test("still runs argsSchema.parse when args contain extra keys that Zod strips", async () => {
|
|
682
|
+
const out = await executor.run(
|
|
683
|
+
input(countedStructuralScript, {
|
|
684
|
+
args: { value: 21, extra: "stripped-by-zod" },
|
|
685
|
+
hostValidatedArgs: true,
|
|
686
|
+
}),
|
|
687
|
+
);
|
|
688
|
+
expect(out.exitCode).toBe(0);
|
|
689
|
+
expect(out.result).toEqual({ doubled: 42, label: null, parseCalls: 1 });
|
|
690
|
+
});
|
|
691
|
+
|
|
692
|
+
test("still runs argsSchema.parse when schema uses defaults, transforms, or refinements", async () => {
|
|
693
|
+
const scriptWithDefaultsAndTransforms = `
|
|
694
|
+
import { z } from "zod";
|
|
695
|
+
export const argsSchema = z.object({
|
|
696
|
+
value: z.number().default(10),
|
|
697
|
+
tag: z.string().transform((s) => s.toUpperCase()),
|
|
698
|
+
});
|
|
699
|
+
let parseCalls = 0;
|
|
700
|
+
const origParse = argsSchema.parse.bind(argsSchema);
|
|
701
|
+
argsSchema.parse = ((v: unknown) => {
|
|
702
|
+
parseCalls++;
|
|
703
|
+
return origParse(v);
|
|
704
|
+
}) as typeof argsSchema.parse;
|
|
705
|
+
|
|
706
|
+
export default async function (args: z.infer<typeof argsSchema>) {
|
|
707
|
+
return { value: args.value, tag: args.tag, parseCalls };
|
|
708
|
+
}
|
|
709
|
+
`;
|
|
710
|
+
const out = await executor.run(
|
|
711
|
+
input(scriptWithDefaultsAndTransforms, {
|
|
712
|
+
args: { tag: "hello" },
|
|
713
|
+
hostValidatedArgs: true,
|
|
714
|
+
}),
|
|
715
|
+
);
|
|
716
|
+
expect(out.exitCode).toBe(0);
|
|
717
|
+
expect(out.result).toEqual({ value: 10, tag: "HELLO", parseCalls: 1 });
|
|
718
|
+
});
|
|
719
|
+
|
|
720
|
+
test("caller-supplied args payload cannot spoof the trusted host validation marker", async () => {
|
|
721
|
+
const out = await executor.run(
|
|
722
|
+
input(countedStructuralScript, {
|
|
723
|
+
args: {
|
|
724
|
+
value: 7,
|
|
725
|
+
hostValidatedArgs: true,
|
|
726
|
+
__swarm_host_validated_args: true,
|
|
727
|
+
},
|
|
728
|
+
}),
|
|
729
|
+
);
|
|
730
|
+
expect(out.exitCode).toBe(0);
|
|
731
|
+
expect(out.result).toEqual({ doubled: 14, label: null, parseCalls: 1 });
|
|
732
|
+
});
|
|
733
|
+
|
|
734
|
+
test("retains Zod property semantics on inherited Object.prototype keys (constructor, toString) and reverse numeric enum keys", async () => {
|
|
735
|
+
for (const propName of ["constructor", "toString"] as const) {
|
|
736
|
+
const protoScript = `
|
|
737
|
+
import { z } from "zod";
|
|
738
|
+
export const argsSchema = z.object({
|
|
739
|
+
${propName}: z.string().nullable().optional(),
|
|
740
|
+
});
|
|
741
|
+
export default async function (args: z.infer<typeof argsSchema>) {
|
|
742
|
+
return { val: args.${propName} ?? null };
|
|
743
|
+
}
|
|
744
|
+
`;
|
|
745
|
+
const out = await executor.run(
|
|
746
|
+
input(protoScript, {
|
|
747
|
+
args: {},
|
|
748
|
+
hostValidatedArgs: true,
|
|
749
|
+
}),
|
|
750
|
+
);
|
|
751
|
+
expect(out.exitCode).toBe(1);
|
|
752
|
+
expect(out.stderr).toContain("argsSchema validation failed");
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
const numericEnumScript = `
|
|
756
|
+
import { z } from "zod";
|
|
757
|
+
export const argsSchema = z.object({
|
|
758
|
+
mode: z.enum({ 0: "Read", Read: 0 }).nullable(),
|
|
759
|
+
});
|
|
760
|
+
export default async function (args: z.infer<typeof argsSchema>) {
|
|
761
|
+
return { mode: args.mode };
|
|
762
|
+
}
|
|
763
|
+
`;
|
|
764
|
+
const rejected = await executor.run(
|
|
765
|
+
input(numericEnumScript, {
|
|
766
|
+
args: { mode: "Read" },
|
|
767
|
+
hostValidatedArgs: true,
|
|
768
|
+
}),
|
|
769
|
+
);
|
|
770
|
+
expect(rejected.exitCode).toBe(1);
|
|
771
|
+
expect(rejected.stderr).toContain("argsSchema validation failed");
|
|
772
|
+
|
|
773
|
+
const accepted = await executor.run(
|
|
774
|
+
input(numericEnumScript, {
|
|
775
|
+
args: { mode: 0 },
|
|
776
|
+
hostValidatedArgs: true,
|
|
777
|
+
}),
|
|
778
|
+
);
|
|
779
|
+
expect(accepted.exitCode).toBe(0);
|
|
780
|
+
expect(accepted.result).toEqual({ mode: 0 });
|
|
781
|
+
});
|
|
782
|
+
});
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import * as zm from "zod/mini";
|
|
5
|
+
import { NativeScriptExecutor } from "../scripts-runtime/executors/native";
|
|
6
|
+
import { DEFAULT_SCRIPT_RESOURCES, type ExecutorInput } from "../scripts-runtime/executors/types";
|
|
7
|
+
import {
|
|
8
|
+
HOST_VALIDATED_ARGS,
|
|
9
|
+
isHostValidationEquivalent,
|
|
10
|
+
} from "../scripts-runtime/host-validated-args";
|
|
11
|
+
|
|
12
|
+
process.env.TMPDIR ??= os.tmpdir().replaceAll("\\", "/");
|
|
13
|
+
|
|
14
|
+
function makeInput(
|
|
15
|
+
source: string,
|
|
16
|
+
args: unknown,
|
|
17
|
+
opts: { hostValidatedArgs?: boolean } = {},
|
|
18
|
+
): ExecutorInput {
|
|
19
|
+
return {
|
|
20
|
+
source,
|
|
21
|
+
args,
|
|
22
|
+
...(opts.hostValidatedArgs !== undefined ? { hostValidatedArgs: opts.hostValidatedArgs } : {}),
|
|
23
|
+
fsMode: "none",
|
|
24
|
+
network: "open",
|
|
25
|
+
resources: DEFAULT_SCRIPT_RESOURCES,
|
|
26
|
+
configPayload: {
|
|
27
|
+
system: {
|
|
28
|
+
apiKey: { value: "test-key", isSecret: true },
|
|
29
|
+
agentId: { value: "00000000-0000-0000-0000-000000000001", isSecret: false },
|
|
30
|
+
mcpBaseUrl: { value: "http://127.0.0.1:19999", isSecret: false },
|
|
31
|
+
},
|
|
32
|
+
user: {},
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
describe("isHostValidationEquivalent", () => {
|
|
38
|
+
test("accepts pure structural zod and zod/mini schemas with matching values", () => {
|
|
39
|
+
const schema = z.object({
|
|
40
|
+
name: z.string(),
|
|
41
|
+
count: z.number(),
|
|
42
|
+
active: z.boolean(),
|
|
43
|
+
tags: z.array(z.string()),
|
|
44
|
+
mode: z.enum(["fast", "slow"]),
|
|
45
|
+
version: z.literal(1),
|
|
46
|
+
note: z.string().optional(),
|
|
47
|
+
parent: z.string().nullable(),
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
expect(
|
|
51
|
+
isHostValidationEquivalent(schema, {
|
|
52
|
+
name: "demo",
|
|
53
|
+
count: 3,
|
|
54
|
+
active: true,
|
|
55
|
+
tags: ["a", "b"],
|
|
56
|
+
mode: "fast",
|
|
57
|
+
version: 1,
|
|
58
|
+
parent: null,
|
|
59
|
+
}),
|
|
60
|
+
).toBe(true);
|
|
61
|
+
|
|
62
|
+
const miniSchema = zm.object({
|
|
63
|
+
id: zm.string(),
|
|
64
|
+
limit: zm.optional(zm.number()),
|
|
65
|
+
});
|
|
66
|
+
expect(isHostValidationEquivalent(miniSchema, { id: "abc" })).toBe(true);
|
|
67
|
+
expect(isHostValidationEquivalent(miniSchema, { id: "abc", limit: 10 })).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test("rejects schemas with defaults, transforms, refinements, coercions, checks, or unknown keys", () => {
|
|
71
|
+
expect(isHostValidationEquivalent(z.object({ x: z.string().default("hi") }), {})).toBe(false);
|
|
72
|
+
expect(
|
|
73
|
+
isHostValidationEquivalent(z.object({ x: z.string().default("hi").optional() }), {}),
|
|
74
|
+
).toBe(false);
|
|
75
|
+
expect(
|
|
76
|
+
isHostValidationEquivalent(z.object({ x: z.string().transform((s) => s.trim()) }), {
|
|
77
|
+
x: " hi ",
|
|
78
|
+
}),
|
|
79
|
+
).toBe(false);
|
|
80
|
+
expect(
|
|
81
|
+
isHostValidationEquivalent(z.object({ x: z.string().refine((s) => s.length > 0) }), {
|
|
82
|
+
x: "hi",
|
|
83
|
+
}),
|
|
84
|
+
).toBe(false);
|
|
85
|
+
expect(isHostValidationEquivalent(z.object({ x: z.coerce.number() }), { x: 42 })).toBe(false);
|
|
86
|
+
expect(isHostValidationEquivalent(z.object({ x: z.string().min(1) }), { x: "hi" })).toBe(false);
|
|
87
|
+
expect(isHostValidationEquivalent(z.object({ x: z.string().email() }), { x: "a@b.co" })).toBe(
|
|
88
|
+
false,
|
|
89
|
+
);
|
|
90
|
+
expect(isHostValidationEquivalent(z.object({ x: z.number().int() }), { x: 5 })).toBe(false);
|
|
91
|
+
// Extra unknown keys require .parse() so z.object strips them (or z.strictObject rejects them)
|
|
92
|
+
expect(isHostValidationEquivalent(z.object({ x: z.string() }), { x: "hi", extra: 1 })).toBe(
|
|
93
|
+
false,
|
|
94
|
+
);
|
|
95
|
+
// Reverse numeric enum keys (e.g. { 0: "Read", Read: 0 }) must not pass as valid values
|
|
96
|
+
const numericEnumSchema = z.enum({ 0: "Read", Read: 0 }).nullable();
|
|
97
|
+
expect(isHostValidationEquivalent(numericEnumSchema, 0)).toBe(true);
|
|
98
|
+
expect(isHostValidationEquivalent(numericEnumSchema, null)).toBe(true);
|
|
99
|
+
expect(isHostValidationEquivalent(numericEnumSchema, "Read")).toBe(false);
|
|
100
|
+
// Inherited Object.prototype properties (constructor, toString) on `{}` must fall back to .parse()
|
|
101
|
+
expect(
|
|
102
|
+
isHostValidationEquivalent(z.object({ constructor: z.string().nullable().optional() }), {}),
|
|
103
|
+
).toBe(false);
|
|
104
|
+
expect(
|
|
105
|
+
isHostValidationEquivalent(z.object({ toString: z.string().nullable().optional() }), {}),
|
|
106
|
+
).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe("NativeScriptExecutor hostValidatedArgs (#2010)", () => {
|
|
111
|
+
const executor = new NativeScriptExecutor();
|
|
112
|
+
|
|
113
|
+
const countedStructuralScript = `
|
|
114
|
+
import { z } from "zod";
|
|
115
|
+
export const argsSchema = z.object({
|
|
116
|
+
value: z.number(),
|
|
117
|
+
label: z.string().optional(),
|
|
118
|
+
});
|
|
119
|
+
let parseCalls = 0;
|
|
120
|
+
const origParse = argsSchema.parse.bind(argsSchema);
|
|
121
|
+
argsSchema.parse = ((v: unknown) => {
|
|
122
|
+
parseCalls++;
|
|
123
|
+
return origParse(v);
|
|
124
|
+
}) as typeof argsSchema.parse;
|
|
125
|
+
|
|
126
|
+
export default async function (args: z.infer<typeof argsSchema>) {
|
|
127
|
+
return { doubled: args.value * 2, label: args.label ?? null, parseCalls };
|
|
128
|
+
}
|
|
129
|
+
`;
|
|
130
|
+
|
|
131
|
+
test("skips duplicate argsSchema.parse when hostValidatedArgs is true and schema is structural", async () => {
|
|
132
|
+
const out = await executor.run(
|
|
133
|
+
makeInput(countedStructuralScript, { value: 21, label: "ok" }, { hostValidatedArgs: true }),
|
|
134
|
+
);
|
|
135
|
+
expect(out.exitCode).toBe(0);
|
|
136
|
+
expect(out.error).toBeUndefined();
|
|
137
|
+
expect(out.result).toEqual({ doubled: 42, label: "ok", parseCalls: 0 });
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test("still runs argsSchema.parse when hostValidatedArgs is omitted or false", async () => {
|
|
141
|
+
const out = await executor.run(makeInput(countedStructuralScript, { value: 21 }));
|
|
142
|
+
expect(out.exitCode).toBe(0);
|
|
143
|
+
expect(out.result).toEqual({ doubled: 42, label: null, parseCalls: 1 });
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test("still runs argsSchema.parse when args contain extra keys that Zod strips", async () => {
|
|
147
|
+
const out = await executor.run(
|
|
148
|
+
makeInput(
|
|
149
|
+
countedStructuralScript,
|
|
150
|
+
{ value: 21, extra: "stripped-by-zod" },
|
|
151
|
+
{ hostValidatedArgs: true },
|
|
152
|
+
),
|
|
153
|
+
);
|
|
154
|
+
expect(out.exitCode).toBe(0);
|
|
155
|
+
expect(out.result).toEqual({ doubled: 42, label: null, parseCalls: 1 });
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test("still runs argsSchema.parse when schema uses defaults, transforms, or refinements", async () => {
|
|
159
|
+
const scriptWithDefaultsAndTransforms = `
|
|
160
|
+
import { z } from "zod";
|
|
161
|
+
export const argsSchema = z.object({
|
|
162
|
+
value: z.number().default(10),
|
|
163
|
+
tag: z.string().transform((s) => s.toUpperCase()),
|
|
164
|
+
});
|
|
165
|
+
let parseCalls = 0;
|
|
166
|
+
const origParse = argsSchema.parse.bind(argsSchema);
|
|
167
|
+
argsSchema.parse = ((v: unknown) => {
|
|
168
|
+
parseCalls++;
|
|
169
|
+
return origParse(v);
|
|
170
|
+
}) as typeof argsSchema.parse;
|
|
171
|
+
|
|
172
|
+
export default async function (args: z.infer<typeof argsSchema>) {
|
|
173
|
+
return { value: args.value, tag: args.tag, parseCalls };
|
|
174
|
+
}
|
|
175
|
+
`;
|
|
176
|
+
const out = await executor.run(
|
|
177
|
+
makeInput(scriptWithDefaultsAndTransforms, { tag: "hello" }, { hostValidatedArgs: true }),
|
|
178
|
+
);
|
|
179
|
+
expect(out.exitCode).toBe(0);
|
|
180
|
+
expect(out.result).toEqual({ value: 10, tag: "HELLO", parseCalls: 1 });
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("caller-supplied args payload cannot spoof the trusted host validation marker", async () => {
|
|
184
|
+
expect(Symbol.keyFor(HOST_VALIDATED_ARGS)).toBeUndefined();
|
|
185
|
+
expect(Symbol.for("swarm.hostValidatedArgs")).not.toBe(HOST_VALIDATED_ARGS);
|
|
186
|
+
const out = await executor.run(
|
|
187
|
+
makeInput(countedStructuralScript, {
|
|
188
|
+
value: 7,
|
|
189
|
+
hostValidatedArgs: true,
|
|
190
|
+
SWARM_SCRIPT_HOST_VALIDATED_ARGS: "1",
|
|
191
|
+
}),
|
|
192
|
+
);
|
|
193
|
+
expect(out.exitCode).toBe(0);
|
|
194
|
+
expect(out.result).toEqual({ doubled: 14, label: null, parseCalls: 1 });
|
|
195
|
+
});
|
|
196
|
+
});
|