@desplega.ai/agent-swarm 2.5.3 → 2.6.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 +2 -2
- package/dist/{acp-adapter-gr2fcyyj.js → acp-adapter-dgfakfpw.js} +9 -9
- package/dist/{actions-wv766ghf.js → actions-fbqma8aa.js} +21 -21
- package/dist/{amp-adapter-speb906t.js → amp-adapter-en0jy6hs.js} +4 -4
- package/dist/{app-ag29n14f.js → app-k8a5cgpp.js} +3 -3
- package/dist/{assistant-3x8bz3eg.js → assistant-a16433gr.js} +30 -26
- package/dist/{boot-reembed-jsmfrpzf.js → boot-reembed-6c1sjfnr.js} +1 -1
- package/dist/{boot-reembed-5b3d2eea.js → boot-reembed-f4nn561n.js} +1 -1
- package/dist/{boot-scrub-sweep-s73gerxy.js → boot-scrub-sweep-d4w9gajf.js} +4 -4
- package/dist/{boot-seeds-5zmax2wr.js → boot-seeds-9bmkspyw.js} +4 -4
- package/dist/{claude-adapter-hswdnm3t.js → claude-adapter-nys1kjxa.js} +9 -9
- package/dist/{claude-managed-adapter-cvbzj1h6.js → claude-managed-adapter-55207973.js} +3 -3
- package/dist/{claude-managed-setup-3k8m3hhc.js → claude-managed-setup-3cm35gey.js} +11 -4
- package/dist/{claude-sdk-session-fkbyk66x.js → claude-sdk-session-nw5yd8cp.js} +9313 -9260
- package/dist/{cli-210xd1f4.js → cli-03gg9pd1.js} +4 -4
- package/dist/{cli-kxpfx2xr.js → cli-0z1xjzwa.js} +2 -2
- package/dist/cli-1tem6ns9.js +894 -0
- package/dist/{cli-25j01dpj.js → cli-24j1jeeb.js} +3 -3
- package/dist/{cli-ta8bd7th.js → cli-2sjhpsns.js} +2 -2
- package/dist/{cli-p859hcc8.js → cli-39aet655.js} +2 -2
- package/dist/{cli-g1cw7xtt.js → cli-39rrw8yp.js} +1 -1
- package/dist/{cli-e2ar4bp1.js → cli-3aqd4jaa.js} +121 -47
- package/dist/{cli-jjznk3f7.js → cli-3fwqy71j.js} +69 -35
- package/dist/{cli-p9rafdrb.js → cli-3gfvmzht.js} +7 -7
- package/dist/{cli-03vpq45j.js → cli-3ndmpxxv.js} +2 -2
- package/dist/{cli-aecdcr77.js → cli-4hxrf0p4.js} +228 -74
- package/dist/{cli-mz9afxxf.js → cli-4rf0f5vg.js} +15 -3
- package/dist/{cli-qzme5949.js → cli-5rj83bam.js} +284 -202
- package/dist/{cli-fsdprwrg.js → cli-5sckpqcx.js} +2 -2
- package/dist/{cli-cz5nmdxt.js → cli-683y0b3a.js} +2 -2
- package/dist/{cli-3ngdk5te.js → cli-6y51ryva.js} +2 -2
- package/dist/{cli-n4c8e3s5.js → cli-708wdy32.js} +1 -1
- package/dist/{cli-pasyvjmm.js → cli-737pyqxr.js} +1 -1
- package/dist/{cli-gx4rm0qx.js → cli-7enjwya9.js} +1 -1
- package/dist/{cli-6x9ma5w5.js → cli-803188pb.js} +1 -1
- package/dist/{cli-avdvgcay.js → cli-9abdgn5t.js} +28 -9
- package/dist/{cli-99xgw26r.js → cli-a2rr0fmg.js} +1 -1
- package/dist/{cli-e5bxnjps.js → cli-a34pr3w1.js} +7 -7
- package/dist/{cli-502eqv93.js → cli-abkm71vr.js} +1 -1
- package/dist/{cli-mmhj8vd7.js → cli-ag2yrnt5.js} +11 -2
- package/dist/{cli-n45mr7zh.js → cli-aj8djyqt.js} +5 -5
- package/dist/{cli-1fc85mvt.js → cli-art7c1zh.js} +5 -5
- package/dist/{cli-40jsnrjm.js → cli-az25fn5f.js} +10 -8
- package/dist/{cli-9s05422w.js → cli-bqztfyve.js} +1 -1
- package/dist/{cli-bn0rewsy.js → cli-c081bj3b.js} +2 -2
- package/dist/{cli-svrj71pg.js → cli-c2habvsf.js} +12 -12
- package/dist/{cli-s49hpn37.js → cli-ca6banwz.js} +85 -19
- package/dist/{cli-hhxjnjzs.js → cli-cz37jqss.js} +12 -10
- package/dist/{cli-6n8axjv1.js → cli-d2dpf95n.js} +2 -2
- package/dist/{cli-tx00c0h6.js → cli-dqygeeh5.js} +17 -1
- package/dist/{cli-z21whrrg.js → cli-emhjcj2y.js} +17 -17
- package/dist/{cli-e8jyq7d8.js → cli-esakngh8.js} +7 -3
- package/dist/{cli-ha9rmwgq.js → cli-fb8m699c.js} +2 -2
- package/dist/{cli-35gtk1p6.js → cli-ffvsj2qw.js} +44 -13
- package/dist/{cli-ce0ak9ms.js → cli-g20jjwt4.js} +26 -26
- package/dist/{cli-kxawjrxg.js → cli-g8ka5j4j.js} +772 -194
- package/dist/{cli-vwn81jbs.js → cli-gf95q3bm.js} +5 -5
- package/dist/{cli-s53vp709.js → cli-gnsb1zxa.js} +2 -2
- package/dist/{cli-nwyw3zhg.js → cli-gxee0bqa.js} +1 -1
- package/dist/{cli-gpv60278.js → cli-hfeb68z4.js} +7 -7
- package/dist/{cli-0ebey9hg.js → cli-j6rktc91.js} +1 -1
- package/dist/{cli-ewm3pwbq.js → cli-k21gx5ht.js} +46 -23
- package/dist/{cli-egjggehm.js → cli-kf4jree9.js} +2 -2
- package/dist/{cli-dabehxhp.js → cli-kt907da6.js} +1 -1
- package/dist/{cli-p0rzjkya.js → cli-m5a9m0ak.js} +32 -13
- package/dist/{cli-fzcn3d87.js → cli-m70bajzr.js} +3 -3
- package/dist/{cli-w1zwctj2.js → cli-mtnj4fwa.js} +11 -5
- package/dist/{cli-gpsz7g88.js → cli-mvjz5an3.js} +16 -12
- package/dist/{cli-hcpj2xqz.js → cli-n7asmce6.js} +225 -3
- package/dist/{cli-y561h5a9.js → cli-nn6vx2mq.js} +5 -5
- package/dist/cli-nq677csy.js +140 -0
- package/dist/{cli-a5ebc95n.js → cli-pfk92eqz.js} +18 -15
- package/dist/{cli-p6zs9h4y.js → cli-rr7zx19j.js} +767 -249
- package/dist/{cli-qgf8emrn.js → cli-sqma6vw1.js} +10 -7
- package/dist/{cli-0xk505e8.js → cli-sxgtf5fw.js} +1 -1
- package/dist/{cli-nzfnt2gs.js → cli-tf1n0r0b.js} +1 -1
- package/dist/{cli-qqzmjxkf.js → cli-v49fkghp.js} +11 -6
- package/dist/{cli-x77gen2p.js → cli-w2656ka1.js} +7 -7
- package/dist/{cli-5kqnemen.js → cli-yvy48785.js} +1 -1
- package/dist/{cli-8s5wx3nz.js → cli-zqne1qcj.js} +44 -17
- package/dist/cli.js +22 -22
- package/dist/{codex-adapter-n8ka66vf.js → codex-adapter-d95q4qsn.js} +7 -7
- package/dist/{codex-hook-e2he7aca.js → codex-hook-brpnycn5.js} +1 -1
- package/dist/{codex-login-rn7c5gxt.js → codex-login-8cg0vhf2.js} +1 -1
- package/dist/{codex-session-runner-fsebts37.js → codex-session-runner-gdwd8h0c.js} +8 -8
- package/dist/{commands-t04rt2pc.js → commands-jqmgk54b.js} +2 -2
- package/dist/{controller-rgna04r2.js → controller-z3jq589f.js} +30 -4
- package/dist/{controllers-connect-bqm1rtft.js → controllers-connect-r2za39ef.js} +23 -23
- package/dist/{cursor-adapter-swr2k95y.js → cursor-adapter-4mr4jgkw.js} +2 -3
- package/dist/{db-a4m7haw0.js → db-ppv2tze7.js} +3 -3
- package/dist/{db-24ck09xy.js → db-w36wwb5g.js} +4 -2
- package/dist/{devin-adapter-4ycy4vrf.js → devin-adapter-byen2cxt.js} +1 -1
- package/dist/{dispatcher-nwf9ss0q.js → dispatcher-pv5h77vf.js} +20 -20
- package/dist/{docker-nfy2gc8t.js → docker-fdzyewpz.js} +4 -4
- package/dist/{dsh-adapter-kpdnhjst.js → dsh-adapter-d4pdpb3r.js} +2 -3
- 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-4sp4dvmc.js} +1 -1
- package/dist/{event-bus-3z78ep5n.js → event-bus-pghg8hqy.js} +1 -1
- package/dist/{execute-0xpz8950.js → execute-jev839y1.js} +1 -1
- package/dist/{external-channel-j1e2p34p.js → external-channel-y6nkzhnn.js} +2 -2
- package/dist/{grok-adapter-qtjz0whk.js → grok-adapter-t08b9ntm.js} +10 -10
- package/dist/handlers-eqsnmv95.js +41 -0
- package/dist/{heartbeat-vtesda5d.js → heartbeat-vn31xwdk.js} +23 -23
- package/dist/{hook-b2hhj6rd.js → hook-6d0zbvvt.js} +6 -5
- package/dist/{hook-8wqaszda.js → hook-cpjs8q51.js} +13 -7
- package/dist/{http-mxcqhhcs.js → http-9c6medda.js} +1085 -136
- package/dist/{index-spwxjgay.js → index-38t35h0n.js} +20 -20
- package/dist/{index-1r8wfpzs.js → index-g6k9tctj.js} +1 -1
- package/dist/{index-srg522m6.js → index-k0yt1tvq.js} +20 -20
- package/dist/{index-31ceyf42.js → index-pkma1yf8.js} +1 -1
- package/dist/{index-n1vbvta9.js → index-qhjf2htm.js} +29 -24
- package/dist/index-yqgbfgaj.js +43 -0
- package/dist/{keepalive-dsd8rtgx.js → keepalive-em0117bp.js} +4 -4
- package/dist/lead-23e7z59t.js +79 -0
- package/dist/{maintenance-jqmqwnet.js → maintenance-kbme3qy9.js} +1 -1
- package/dist/{oauth-refresh-sweep-q2c3bnvm.js → oauth-refresh-sweep-xysj4yse.js} +3 -3
- package/dist/{onboard-w4yd7s8t.js → onboard-p6q0vz97.js} +3 -3
- package/dist/{opencode-adapter-9tppvxar.js → opencode-adapter-esv3k9yn.js} +7 -7
- package/dist/{otel-impl-f36byzbd.js → otel-impl-54qhqh1z.js} +2 -2
- package/dist/{pi-mono-adapter-tqsge1ay.js → pi-mono-adapter-mymbwhj0.js} +41 -14
- package/dist/{pricing-refresh-xvak5p4v.js → pricing-refresh-yb75wv33.js} +3 -3
- package/dist/{rbac-roles-gfn30fb8.js → rbac-roles-1vp2mw4p.js} +2 -2
- package/dist/{rbac-roles-682k2mt5.js → rbac-roles-dexhc9x8.js} +1 -1
- package/dist/render-v2-tjay5hhf.js +16 -0
- package/dist/{resume-2dvq348g.js → resume-8ayf37g5.js} +11 -9
- package/dist/{runtime-bt5pkpm1.js → runtime-hqe5cqcd.js} +1 -1
- package/dist/{session-access-7f21ekq9.js → session-access-fdhp987s.js} +4 -4
- package/dist/session-source-backfill-qgtc86z1.js +110 -0
- package/dist/{setup-epffxtbk.js → setup-4rrmqcq3.js} +1 -1
- package/dist/{virtual-modules-mnfbh5mr.js → virtual-modules-52km00d6.js} +2 -2
- package/dist/{work-objects-xz1a5rqk.js → work-objects-p28fgd70.js} +23 -23
- package/dist/worker-e3w7vye1.js +79 -0
- package/dist/{x-pbpezr0s.js → x-wxrzvzx8.js} +2 -2
- package/openapi.json +1323 -16
- package/package.json +5 -5
- package/plugin/commands/create-pr.md +2 -2
- package/plugin/pi-skills/create-pr/SKILL.md +2 -2
- package/src/assets/source-key.ts +95 -0
- package/src/be/db/api-keys.ts +80 -0
- package/src/be/db/approvals.ts +48 -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 +21 -6
- package/src/be/db/workflow-idempotency.ts +183 -0
- package/src/be/db/workflow-runs.ts +500 -7
- package/src/be/db-retention.ts +61 -6
- package/src/be/db.ts +126 -131
- package/src/be/memory/providers/openai-embedding.ts +5 -1
- package/src/be/migrations/242_workflow_idempotency_keys.sql +40 -0
- package/src/be/migrations/244_api_key_validation.sql +4 -0
- package/src/be/onboarding.ts +4 -0
- package/src/be/scripts/typecheck.ts +1 -1
- package/src/be/sealed-json.ts +1 -0
- package/src/be/seed-scripts/catalog/compound-insights.inline.ts +2 -2
- package/src/be/seed-scripts/catalog/compound-insights.ts +2 -2
- package/src/be/seed-skills/bundled-files.generated.json +1 -1
- package/src/be/session-source-backfill.ts +163 -0
- package/src/be/sql-connections.ts +7 -1
- package/src/be/swarm-config-guard.ts +3 -0
- package/src/be/users.ts +9 -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/controller.ts +33 -0
- package/src/commands/credential-refresh.ts +76 -1
- package/src/commands/credential-wait.ts +2 -2
- package/src/commands/provider-credentials.ts +210 -170
- package/src/commands/runner.ts +31 -6
- package/src/extensions/apply-task-create.ts +64 -11
- package/src/extensions/contract-types.generated.ts +1 -1
- package/src/extensions/contract.ts +30 -0
- package/src/extensions/dispatcher.ts +4 -0
- package/src/extensions/post-bridge.ts +8 -0
- package/src/hooks/context-bound-note.ts +196 -0
- package/src/hooks/hook.ts +12 -0
- package/src/http/all-routes.ts +2 -0
- package/src/http/api-keys.ts +53 -0
- 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 +49 -17
- package/src/http/core.ts +6 -0
- package/src/http/fleet-benchmark.ts +5 -2
- package/src/http/idempotency-key.ts +117 -0
- package/src/http/index.ts +11 -0
- package/src/http/integrations.ts +5 -1
- package/src/http/kv.ts +8 -3
- package/src/http/onboarding.ts +6 -1
- package/src/http/pool-keys.ts +354 -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 +207 -33
- package/src/integrations/chat-sdk/inbound.ts +27 -0
- package/src/kv-reserved-namespaces.ts +19 -0
- package/src/prompts/context-bound-note.ts +48 -0
- package/src/prompts/session-templates.ts +25 -1
- package/src/providers/acp-targets.ts +1 -1
- package/src/providers/amp-adapter.ts +30 -8
- package/src/providers/claude-adapter.ts +34 -5
- package/src/providers/claude-managed-adapter.ts +42 -9
- package/src/providers/claude-sdk-session.ts +10 -0
- package/src/providers/claude-session-events.ts +13 -0
- package/src/providers/codex-adapter.ts +83 -11
- package/src/providers/opencode-adapter.ts +18 -0
- package/src/providers/pi-mono-adapter.ts +35 -0
- package/src/runtime-providers/docker.ts +6 -2
- package/src/scheduler/scheduler.ts +3 -2
- package/src/scripts-runtime/swarm-sdk.ts +7 -1
- package/src/scripts-runtime/types/stdlib.d.ts +1 -1
- package/src/scripts-runtime/types/swarm-extension.d.ts +52 -8
- package/src/scripts-runtime/types/swarm-sdk.d.ts +1 -1
- 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/amp-adapter.test.ts +97 -0
- package/src/tests/api-keys-validation.test.ts +170 -0
- package/src/tests/approval-requests.test.ts +10 -7
- package/src/tests/approval-sweeps.test.ts +12 -6
- package/src/tests/base-prompt.test.ts +1 -1
- package/src/tests/claude-hook-output.test.ts +79 -1
- package/src/tests/claude-managed-adapter.test.ts +321 -0
- package/src/tests/claude-routes-e2e.test.ts +7 -2
- package/src/tests/codex-adapter.test.ts +163 -0
- 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/config-pool-keys.test.ts +533 -0
- package/src/tests/context-bound-note.test.ts +269 -0
- package/src/tests/credential-check.test.ts +290 -2
- 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/extensions-pre-task.test.ts +325 -0
- package/src/tests/fetch-resolved-env.test.ts +17 -0
- package/src/tests/fixtures/extensions/record-blocks/hooks.ts +10 -0
- package/src/tests/fixtures/extensions/record-blocks/manifest.json +7 -0
- 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/fixtures/fake-amp.ts +22 -8
- package/src/tests/fixtures/held-template-render.ts +42 -0
- package/src/tests/fixtures/workflow-idempotency-trigger.child.ts +73 -0
- package/src/tests/fleet-benchmark.test.ts +8 -0
- package/src/tests/get-workflow-run-tool.test.ts +98 -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/onboarding.test.ts +108 -1
- package/src/tests/openai-embedding-credentials.test.ts +35 -0
- package/src/tests/openapi-route-headers.test.ts +2 -0
- package/src/tests/opencode-adapter.test.ts +134 -0
- package/src/tests/openrouter-attribution-call-sites.test.ts +2 -2
- package/src/tests/org-website.test.ts +36 -0
- package/src/tests/pi-mono-adapter.test.ts +105 -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/runner-push-delivery.test.ts +25 -0
- package/src/tests/runtime-controller-liveness.test.ts +133 -0
- package/src/tests/runtime-providers-docker.test.ts +2 -0
- package/src/tests/script-connections.test.ts +5 -0
- package/src/tests/script-run-config-scope.test.ts +91 -3
- package/src/tests/script-runs-retention.test.ts +212 -0
- package/src/tests/sdk-allowlist.test.ts +39 -0
- package/src/tests/session-logs.test.ts +70 -0
- 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 +336 -2
- package/src/tests/slack-inbound-files.test.ts +103 -23
- package/src/tests/status.test.ts +101 -18
- 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/used-by-route.test.ts +11 -0
- package/src/tests/workflow-cascade-cancel.test.ts +1341 -0
- package/src/tests/workflow-foreach-supersede-retry.test.ts +488 -0
- package/src/tests/workflow-http-v2.test.ts +131 -0
- package/src/tests/workflow-idempotency.test.ts +915 -0
- package/src/tests/workflow-step-order.test.ts +92 -0
- package/src/tests/workflow-sub-workflow.test.ts +30 -0
- package/src/tools/get-tasks.ts +8 -0
- package/src/tools/kv/kv-read-auth.ts +4 -2
- package/src/tools/task-action.ts +1 -1
- package/src/tools/workflows/cancel-workflow-run.ts +1 -1
- package/src/tools/workflows/get-workflow-run.ts +14 -4
- package/src/types.ts +24 -0
- package/src/utils/company-profile.ts +51 -1
- package/src/utils/context-window.ts +8 -6
- package/src/utils/credentials.ts +5 -2
- 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/approval-cancel.ts +15 -13
- package/src/workflows/approval-notifications.ts +5 -1
- package/src/workflows/checkpoint.ts +6 -3
- package/src/workflows/engine.ts +30 -8
- package/src/workflows/executors/foreach.ts +2 -2
- package/src/workflows/executors/sub-workflow.ts +8 -1
- package/src/workflows/foreach-driver.ts +10 -3
- package/src/workflows/foreach-join.ts +29 -6
- package/src/workflows/recovery.ts +6 -1
- package/src/workflows/resume.ts +168 -56
- package/src/workflows/retry-poller.ts +49 -3
- package/src/workflows/task-step-routing.ts +29 -7
- package/templates/ai-toolbox.manifest.json +8 -8
- package/templates/community/open-prompt-showreel/PLAYBOOK.md +5 -6
- package/templates/community/open-prompt-showreel/lead-prompt.md +1 -1
- package/templates/community/open-prompt-showreel/skills/open-prompt-showreel/SKILL.md +4 -4
- package/templates/skills/agent-browser/SKILL.md +4 -4
- package/templates/skills/agent-browser/content.md +4 -4
- package/templates/skills/code-quality/config.json +1 -1
- package/templates/skills/code-quality/content.md +2 -2
- package/templates/skills/delegate-work/content.md +29 -25
- package/templates/skills/delegate-work/files/scripts/codex-exec.sh +5 -5
- package/templates/skills/qa/content.md +2 -2
- package/templates/skills/researching/content.md +4 -0
- package/templates/skills/swarm-scripts/SKILL.md +1 -0
- package/templates/skills/swarm-scripts/content.md +1 -0
- package/templates/skills/work-on-task/SKILL.md +1 -1
- package/templates/skills/work-on-task/content.md +1 -1
- package/dist/cli-7421jzsw.js +0 -84
- package/dist/cli-e45e4m6b.js +0 -413
- package/dist/cli-zw88zjba.js +0 -307
- package/dist/handlers-19xr6dnz.js +0 -41
- package/dist/index-kw2mmat7.js +0 -43
- package/dist/lead-zyerk1x2.js +0 -79
- package/dist/render-v2-hgytz8nn.js +0 -12
- package/dist/worker-42t8emjt.js +0 -79
package/src/be/db/tasks/write.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import pkg from "../../../../package.json";
|
|
2
2
|
import { defaultAssetKey } from "../../../assets/key";
|
|
3
|
+
import { sessionSourceKey } from "../../../assets/source-key";
|
|
3
4
|
import type { TaskTelemetryEvent, TaskTelemetryInput } from "../../../telemetry-trigger";
|
|
4
5
|
import type {
|
|
5
6
|
Agent,
|
|
@@ -89,7 +90,11 @@ export async function createTask(
|
|
|
89
90
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, strftime('%Y-%m-%dT%H:%M:%fZ', 'now'), strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) RETURNING *`,
|
|
90
91
|
[
|
|
91
92
|
id,
|
|
92
|
-
|
|
93
|
+
sessionSourceKey({
|
|
94
|
+
id,
|
|
95
|
+
slackChannelId: options?.slackChannelId,
|
|
96
|
+
slackThreadTs: options?.slackThreadTs,
|
|
97
|
+
}) ?? defaultAssetKey("task", id),
|
|
93
98
|
agentId,
|
|
94
99
|
scrubSecrets(task),
|
|
95
100
|
"pending",
|
|
@@ -657,7 +662,15 @@ export async function overwriteTerminalTaskResultText(
|
|
|
657
662
|
return row ? rowToAgentTask(row) : task;
|
|
658
663
|
}
|
|
659
664
|
|
|
660
|
-
|
|
665
|
+
/**
|
|
666
|
+
* `cascadeDependents: false` skips the dependents sweep for a caller that
|
|
667
|
+
* already knows no task depends on this one (a bulk cancel looks once).
|
|
668
|
+
*/
|
|
669
|
+
export async function cancelTask(
|
|
670
|
+
id: string,
|
|
671
|
+
reason?: string,
|
|
672
|
+
options: { cascadeDependents?: boolean } = {},
|
|
673
|
+
): Promise<AgentTask | null> {
|
|
661
674
|
const oldTask = await getTaskById(id);
|
|
662
675
|
if (!oldTask) return null;
|
|
663
676
|
|
|
@@ -736,10 +749,12 @@ export async function cancelTask(id: string, reason?: string): Promise<AgentTask
|
|
|
736
749
|
);
|
|
737
750
|
}
|
|
738
751
|
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
752
|
+
if (options.cascadeDependents !== false) {
|
|
753
|
+
try {
|
|
754
|
+
await dependencies.cascadeFailDependents(id, "cancelled");
|
|
755
|
+
} catch (err) {
|
|
756
|
+
console.error("[cancelTask] cascade-fail dependents error:", err);
|
|
757
|
+
}
|
|
743
758
|
}
|
|
744
759
|
}
|
|
745
760
|
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { getCurrentRequestUserId } from "../../utils/request-auth-context";
|
|
2
|
+
import { openSealedJson, sealJson } from "../sealed-json";
|
|
3
|
+
import { getDbClient } from "./runtime";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Server-side `Idempotency-Key` records for workflow create and trigger.
|
|
7
|
+
*
|
|
8
|
+
* A record is written in the transaction that accepts the operation (the
|
|
9
|
+
* workflow insert, or the run insert with its initial state), so it exists if
|
|
10
|
+
* and only if the operation committed. Readers look it up before re-running
|
|
11
|
+
* any check that can change between attempts (enabled, cooldown, readiness,
|
|
12
|
+
* trigger schema) and replay the stored response instead.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export type WorkflowIdempotencyOperation = "workflow.create" | "workflow.trigger";
|
|
16
|
+
|
|
17
|
+
/** Who may replay a record: one caller, one operation, one target, one key. */
|
|
18
|
+
export interface WorkflowIdempotencyScope {
|
|
19
|
+
/** Stable caller identity, e.g. `user:<id>`; never a credential value. */
|
|
20
|
+
principal: string;
|
|
21
|
+
operation: WorkflowIdempotencyOperation;
|
|
22
|
+
/** The triggered workflow id; empty for create. */
|
|
23
|
+
targetId: string;
|
|
24
|
+
/** The client's `Idempotency-Key` value. Stored only as a hash. */
|
|
25
|
+
key: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** A claim for one request: its scope plus the fingerprint of what it asked for. */
|
|
29
|
+
export interface WorkflowIdempotencyClaim extends WorkflowIdempotencyScope {
|
|
30
|
+
fingerprint: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface AcceptedWorkflowOperation {
|
|
34
|
+
fingerprint: string;
|
|
35
|
+
status: number;
|
|
36
|
+
/** The original response body; null once the workflow it names was deleted. */
|
|
37
|
+
body: unknown;
|
|
38
|
+
resourceDeletedAt: string | null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The key was accepted for another request while this one was getting ready.
|
|
43
|
+
* Thrown inside the accepting transaction, so this request commits nothing;
|
|
44
|
+
* the caller looks the record up again and answers from it.
|
|
45
|
+
*/
|
|
46
|
+
export class IdempotencyKeyTakenError extends Error {
|
|
47
|
+
constructor() {
|
|
48
|
+
super("Idempotency-Key was accepted by a concurrent request");
|
|
49
|
+
this.name = "IdempotencyKeyTakenError";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
type AcceptedRow = {
|
|
54
|
+
requestFingerprint: string;
|
|
55
|
+
responseStatus: number;
|
|
56
|
+
responseBody: string | null;
|
|
57
|
+
resourceDeletedAt: string | null;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
function sha256(text: string): string {
|
|
61
|
+
const hasher = new Bun.CryptoHasher("sha256");
|
|
62
|
+
hasher.update(text);
|
|
63
|
+
return hasher.digest("hex");
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function sortKeys(value: unknown): unknown {
|
|
67
|
+
if (Array.isArray(value)) return value.map(sortKeys);
|
|
68
|
+
if (!value || typeof value !== "object") return value;
|
|
69
|
+
// Code-unit order, not localeCompare: the fingerprint must not depend on the
|
|
70
|
+
// server's locale.
|
|
71
|
+
return Object.fromEntries(
|
|
72
|
+
Object.entries(value as Record<string, unknown>)
|
|
73
|
+
.filter(([, nested]) => nested !== undefined)
|
|
74
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
75
|
+
.map(([key, nested]) => [key, sortKeys(nested)]),
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Fingerprint of an accepted request body. Object key order does not matter,
|
|
81
|
+
* array order does, and every value counts as sent (nothing is redacted first,
|
|
82
|
+
* so two requests that differ only in a secret never match). Only the hash is
|
|
83
|
+
* stored.
|
|
84
|
+
*/
|
|
85
|
+
export function workflowRequestFingerprint(
|
|
86
|
+
operation: WorkflowIdempotencyOperation,
|
|
87
|
+
body: unknown,
|
|
88
|
+
): string {
|
|
89
|
+
return sha256(`${operation}\n${JSON.stringify(sortKeys(body ?? null))}`);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const SCOPE_WHERE = "principal = ? AND operation = ? AND targetId = ? AND keyHash = ?";
|
|
93
|
+
|
|
94
|
+
function scopeParams(scope: WorkflowIdempotencyScope): string[] {
|
|
95
|
+
return [scope.principal, scope.operation, scope.targetId, sha256(scope.key)];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export async function findAcceptedWorkflowOperation(
|
|
99
|
+
scope: WorkflowIdempotencyScope,
|
|
100
|
+
): Promise<AcceptedWorkflowOperation | null> {
|
|
101
|
+
const row = await getDbClient().get<AcceptedRow>(
|
|
102
|
+
`SELECT requestFingerprint, responseStatus, responseBody, resourceDeletedAt
|
|
103
|
+
FROM workflow_idempotency_keys WHERE ${SCOPE_WHERE}`,
|
|
104
|
+
scopeParams(scope),
|
|
105
|
+
);
|
|
106
|
+
if (!row) return null;
|
|
107
|
+
return {
|
|
108
|
+
fingerprint: row.requestFingerprint,
|
|
109
|
+
status: row.responseStatus,
|
|
110
|
+
body: row.responseBody === null ? null : openSealedJson(row.responseBody),
|
|
111
|
+
resourceDeletedAt: row.resourceDeletedAt,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Throw `IdempotencyKeyTakenError` when the scope already has a record. Inside
|
|
117
|
+
* the accepting transaction, call it before writing a resource whose insert
|
|
118
|
+
* could collide with the concurrent winner's (a unique workflow name), so the
|
|
119
|
+
* loser replays instead of failing on that constraint.
|
|
120
|
+
*/
|
|
121
|
+
export async function assertWorkflowIdempotencyKeyUnused(
|
|
122
|
+
scope: WorkflowIdempotencyScope,
|
|
123
|
+
): Promise<void> {
|
|
124
|
+
const taken = await getDbClient().get(
|
|
125
|
+
`SELECT 1 FROM workflow_idempotency_keys WHERE ${SCOPE_WHERE}`,
|
|
126
|
+
scopeParams(scope),
|
|
127
|
+
);
|
|
128
|
+
if (taken) throw new IdempotencyKeyTakenError();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Record the accepted operation. Call it inside the transaction that creates
|
|
133
|
+
* the resource: a rollback drops both. Throws `IdempotencyKeyTakenError` when
|
|
134
|
+
* the scope already has a record (a concurrent request committed first); the
|
|
135
|
+
* unique index backs this across processes.
|
|
136
|
+
*/
|
|
137
|
+
export async function recordAcceptedWorkflowOperation(
|
|
138
|
+
claim: WorkflowIdempotencyClaim,
|
|
139
|
+
accepted: { workflowId: string; runId?: string; status: number; body: unknown },
|
|
140
|
+
): Promise<void> {
|
|
141
|
+
await assertWorkflowIdempotencyKeyUnused(claim);
|
|
142
|
+
const actor = getCurrentRequestUserId() ?? null;
|
|
143
|
+
try {
|
|
144
|
+
await getDbClient().run(
|
|
145
|
+
`INSERT INTO workflow_idempotency_keys
|
|
146
|
+
(id, principal, operation, targetId, keyHash, requestFingerprint, workflowId, runId,
|
|
147
|
+
responseStatus, responseBody, createdAt, created_by, updated_by)
|
|
148
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
149
|
+
[
|
|
150
|
+
crypto.randomUUID(),
|
|
151
|
+
...scopeParams(claim),
|
|
152
|
+
claim.fingerprint,
|
|
153
|
+
accepted.workflowId,
|
|
154
|
+
accepted.runId ?? null,
|
|
155
|
+
accepted.status,
|
|
156
|
+
sealJson(accepted.body),
|
|
157
|
+
new Date().toISOString(),
|
|
158
|
+
actor,
|
|
159
|
+
actor,
|
|
160
|
+
],
|
|
161
|
+
);
|
|
162
|
+
} catch (err) {
|
|
163
|
+
if (err instanceof Error && err.message.includes("UNIQUE constraint failed")) {
|
|
164
|
+
throw new IdempotencyKeyTakenError();
|
|
165
|
+
}
|
|
166
|
+
throw err;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Turn every record naming `workflowId` into a tombstone: the stored response
|
|
172
|
+
* (which may carry the deleted workflow's definition) is cleared and the key
|
|
173
|
+
* stays taken, so a retry is told the resource is gone instead of creating or
|
|
174
|
+
* triggering anything again. Runs in the delete's transaction.
|
|
175
|
+
*/
|
|
176
|
+
export async function tombstoneWorkflowIdempotencyKeys(workflowId: string): Promise<void> {
|
|
177
|
+
await getDbClient().run(
|
|
178
|
+
`UPDATE workflow_idempotency_keys
|
|
179
|
+
SET responseBody = NULL, resourceDeletedAt = ?, updated_by = ?
|
|
180
|
+
WHERE workflowId = ? AND resourceDeletedAt IS NULL`,
|
|
181
|
+
[new Date().toISOString(), getCurrentRequestUserId() ?? null, workflowId],
|
|
182
|
+
);
|
|
183
|
+
}
|