@desplega.ai/agent-swarm 2.4.4 → 2.5.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-thq04adh.js → acp-adapter-11gp67nr.js} +8 -6
- package/dist/{actions-j6ywh6x5.js → actions-8p2kze8j.js} +24 -22
- package/dist/{amp-adapter-k8b5xmj8.js → amp-adapter-z4qvhacj.js} +2 -2
- package/dist/{anthropic-messages-g6pqmqk4.js → anthropic-messages-txs190dd.js} +17 -20
- package/dist/{app-rb7vc02s.js → app-0qp0a2gk.js} +3 -3
- package/dist/{assistant-ftta1zjf.js → assistant-jedd3ktm.js} +27 -25
- package/dist/{azure-openai-responses-9dbmj346.js → azure-openai-responses-9kfwhmn7.js} +18 -13
- package/dist/{boot-reembed-xns7h5h9.js → boot-reembed-4xwq5tg0.js} +1 -1
- package/dist/{boot-reembed-srp6v6af.js → boot-reembed-n4wq5dd2.js} +1 -1
- package/dist/{boot-scrub-sweep-3qqrh2mz.js → boot-scrub-sweep-69h90xcq.js} +4 -4
- package/dist/{boot-seeds-9ks8hce7.js → boot-seeds-3vn0m9sg.js} +4 -4
- package/dist/{claude-adapter-k5ksyres.js → claude-adapter-221mvad5.js} +8 -6
- package/dist/{claude-managed-adapter-h2y889ge.js → claude-managed-adapter-gt6pa35d.js} +2 -2
- package/dist/{claude-managed-setup-n5a5eqks.js → claude-managed-setup-c3hp36ph.js} +4 -4
- package/dist/{claude-sdk-session-2j3j4kwn.js → claude-sdk-session-8thjsk5e.js} +9729 -9628
- package/dist/{cli-b9fcxxev.js → cli-007cnhm1.js} +50 -4
- package/dist/{cli-j4rqdf2n.js → cli-03vpq45j.js} +2 -2
- package/dist/{cli-amyhm3gj.js → cli-0y6f0ckq.js} +1 -1
- package/dist/{cli-4dg55wsk.js → cli-0z3vjrpm.js} +1 -1
- package/dist/{cli-pccfmtb5.js → cli-179xcyky.js} +11 -11
- package/dist/{cli-3r8samv3.js → cli-1f0gp9vz.js} +3 -2
- package/dist/{cli-hj3debgw.js → cli-1pr672hz.js} +3 -3
- package/dist/{cli-0bqteszy.js → cli-2nf3b08t.js} +328 -25
- package/dist/{cli-t7cyef5g.js → cli-36j4jnk3.js} +4 -4
- package/dist/{cli-er83cjbn.js → cli-3qv8naq8.js} +527 -231
- package/dist/cli-3zwye9sn.js +1193 -0
- package/dist/{cli-60cgh1rv.js → cli-459fk97x.js} +7 -7
- package/dist/{cli-xj0re5tm.js → cli-4w24f7z3.js} +1 -1
- package/dist/{cli-v3yr2gbg.js → cli-5kzk3472.js} +2198 -968
- package/dist/{cli-h7gc0b4r.js → cli-5m84zd2k.js} +55 -18
- package/dist/{cli-w6nadkh4.js → cli-5rvg1ddk.js} +5 -5
- package/dist/{cli-dvkmp9bt.js → cli-6ctwrf1z.js} +20 -10
- package/dist/{cli-9qtjfd60.js → cli-6rg2jn2y.js} +3 -2
- package/dist/{cli-2v045xyf.js → cli-7bwtc6yx.js} +3 -3
- package/dist/{cli-3cgngyd8.js → cli-7g40g8hq.js} +35 -17
- package/dist/{cli-q6r7t299.js → cli-92mqenkc.js} +2379 -154
- package/dist/{cli-cynvc9fj.js → cli-9ce2xw98.js} +8 -8
- package/dist/{cli-gqvh8d8a.js → cli-bgdtv62r.js} +36 -22
- package/dist/{cli-wxbn3yfx.js → cli-cz5nmdxt.js} +2 -2
- package/dist/{cli-wt645v7q.js → cli-dabehxhp.js} +1 -1
- package/dist/{cli-vfha21c9.js → cli-e5bxnjps.js} +2 -2
- package/dist/{cli-p20r8w42.js → cli-fcc5qe3f.js} +763 -268
- package/dist/{cli-1ephgwnq.js → cli-fes51ya2.js} +3 -3
- package/dist/{cli-1d70crsy.js → cli-ftmq4nvk.js} +2 -2
- package/dist/{cli-qkhc5aqy.js → cli-fy1jyyym.js} +13 -13
- package/dist/{cli-s95dknxh.js → cli-g1cw7xtt.js} +1 -1
- package/dist/{cli-qje9k2nh.js → cli-g9ypd5en.js} +12 -2
- package/dist/{cli-74c1wpm0.js → cli-gpv60278.js} +1 -1
- package/dist/{cli-pemywhfq.js → cli-ha9rmwgq.js} +2 -1
- package/dist/{cli-bnz0r3kc.js → cli-j1eghqfm.js} +5 -5
- package/dist/{cli-2zqpkvtt.js → cli-jpxsrxcb.js} +1 -1
- package/dist/{cli-ejs3m1sx.js → cli-kxpfx2xr.js} +1 -1
- package/dist/{cli-37yb7307.js → cli-mbfj11fq.js} +1 -1
- package/dist/{cli-pnp2j5zg.js → cli-mmhj8vd7.js} +2 -2
- package/dist/{cli-xf234ws8.js → cli-n4c8e3s5.js} +2 -0
- package/dist/{cli-a0kcty51.js → cli-n6kmqngw.js} +2 -2
- package/dist/{cli-te6b5wvg.js → cli-nnvjb17s.js} +3 -3
- package/dist/{cli-1dmcq2eh.js → cli-nzfnt2gs.js} +1 -1
- package/dist/{cli-625tb7aq.js → cli-p859hcc8.js} +2 -2
- package/dist/{cli-smvcw9z5.js → cli-pasyvjmm.js} +1 -1
- package/dist/cli-pkaqk57w.js +128 -0
- package/dist/{cli-8nyhf7za.js → cli-qqzmjxkf.js} +129 -105
- package/dist/{cli-zrwpctp4.js → cli-r25qpaxt.js} +161 -63
- package/dist/{cli-nc35pxb7.js → cli-rh5smt8t.js} +19 -4
- package/dist/{cli-qwkcwjdn.js → cli-rycdaj0a.js} +1 -1
- package/dist/{cli-esxerzg7.js → cli-s4sntwt4.js} +2 -2
- package/dist/{cli-b8k7epj1.js → cli-segs7hx9.js} +8 -8
- package/dist/{cli-36ckw0wx.js → cli-stxdrqs2.js} +2 -2
- package/dist/{cli-vdm20wej.js → cli-sy8f9705.js} +4 -4
- package/dist/{cli-1m17dc9d.js → cli-ta8bd7th.js} +2 -2
- package/dist/{cli-2y91wnbh.js → cli-we0ra057.js} +222 -10
- package/dist/{cli-55qmbp6z.js → cli-x21dqn18.js} +5 -5
- package/dist/{cli-dqb4n629.js → cli-x6vf4sad.js} +11 -11
- package/dist/{cli-d2mb5s8a.js → cli-x77gen2p.js} +680 -440
- package/dist/{cli-vq97g1jq.js → cli-xawhpgc9.js} +95 -195
- package/dist/{cli-82d3nkc3.js → cli-xd4eqtr2.js} +2 -2
- package/dist/{cli-9fhkkpj5.js → cli-xt768r5m.js} +2 -2
- package/dist/{cli-zrk6jxv8.js → cli-y4x8ww6s.js} +2 -2
- package/dist/{cli-xc27fwzg.js → cli-y9jvxfhk.js} +3 -3
- package/dist/{cli-44159k28.js → cli-z63a269p.js} +2 -2
- package/dist/{cli-sm8rses9.js → cli-zfdp01hn.js} +8 -5
- package/dist/cli.js +31 -29
- package/dist/{cloudflare-workers-ai-system-one-ch2wxfcp.js → cloudflare-workers-ai-system-one-43v9qkjk.js} +7 -2
- package/dist/{codex-adapter-968xwfy7.js → codex-adapter-tcg1q3jk.js} +6 -4
- package/dist/{codex-login-m819c41r.js → codex-login-rn7c5gxt.js} +1 -1
- package/dist/{codex-session-runner-ht4z99fa.js → codex-session-runner-xfx4wd9x.js} +7 -5
- package/dist/{commands-pcymaeg9.js → commands-ew83nj70.js} +2 -2
- package/dist/{controller-fpjyk46r.js → controller-gnq1k1mf.js} +4 -4
- package/dist/{controllers-connect-mwzx1fh6.js → controllers-connect-tw1dan9r.js} +26 -24
- package/dist/{cursor-adapter-cp4s2e2f.js → cursor-adapter-yq5xgfcg.js} +1 -1
- package/dist/{db-xsjg9jqq.js → db-7gbc53fd.js} +14 -2
- package/dist/{db-sgd12bt9.js → db-t86xrnes.js} +3 -3
- package/dist/{devin-adapter-zgqadvnm.js → devin-adapter-4ycy4vrf.js} +1 -1
- package/dist/{dispatcher-x0jfw2c9.js → dispatcher-64bdyhps.js} +23 -21
- package/dist/{docker-fkgtr75t.js → docker-nfy2gc8t.js} +2 -2
- package/dist/{dsh-adapter-jrq7ma7h.js → dsh-adapter-tvhc4k2d.js} +1 -1
- package/dist/{e2b-16d6ch39.js → e2b-9gkdhm3c.js} +2 -2
- package/dist/{e2b-zn0b4w5w.js → e2b-cjtf8k1z.js} +2 -2
- package/dist/{easter-egg-3d-5cgynaja.js → easter-egg-3d-e4qv8dxj.js} +1 -1
- package/dist/{event-bus-9vpk8gmq.js → event-bus-3z78ep5n.js} +1 -1
- package/dist/{execute-t4e6m3rw.js → execute-0xpz8950.js} +85 -23
- package/dist/{external-channel-8njj4h3b.js → external-channel-e9nw24zv.js} +2 -2
- package/dist/{google-generative-ai-bmq8gkf3.js → google-generative-ai-mk9vcpe1.js} +15 -15
- package/dist/{google-vertex-b1rvp52s.js → google-vertex-q580kz8k.js} +20 -20
- package/dist/{grok-adapter-kkr97v2f.js → grok-adapter-v82srhrx.js} +9 -7
- package/dist/handlers-c9ajzhbn.js +41 -0
- package/dist/{heartbeat-wd03zhn0.js → heartbeat-2vqs1319.js} +26 -24
- package/dist/{hook-xzj2ts2p.js → hook-01nk13wx.js} +7 -5
- package/dist/{hook-f0vghj42.js → hook-jzpheegg.js} +9 -7
- package/dist/{http-4hwxv62p.js → http-fc1k6ec8.js} +859 -252
- package/dist/index-07ef7nkm.js +42 -0
- package/dist/{index-g6tbb6ve.js → index-31ceyf42.js} +1 -1
- package/dist/index-7yts8n9s.js +43 -0
- package/dist/{index-c4ykd0f1.js → index-dr94zbnh.js} +13348 -11611
- package/dist/index-q3t40ryv.js +46 -0
- package/dist/{index-ww2vznkp.js → index-sepja052.js} +1 -1
- package/dist/{index-97q4xn03.js → index-zdycv3ja.js} +135 -79
- package/dist/{index-g216q6jr.js → index-zsyx51ap.js} +1 -4
- package/dist/{keepalive-hrh7xnr9.js → keepalive-5nh2rhmr.js} +4 -4
- package/dist/lead-aayq64jn.js +79 -0
- package/dist/{llama-cpp-classify-vv43gswy.js → llama-cpp-classify-ee7vmd7q.js} +4 -1
- package/dist/{maintenance-e8wnwnqx.js → maintenance-hjhzdt3k.js} +1 -1
- package/dist/{mistral-conversations-1medfwv7.js → mistral-conversations-sd0xf1tn.js} +13 -13
- package/dist/{node-3v3f08f7.js → node-jzjj7r9x.js} +10 -9
- package/dist/{oauth-refresh-sweep-zm0yj4sj.js → oauth-refresh-sweep-y3n1knmd.js} +3 -3
- package/dist/{onboard-dtwcq603.js → onboard-1zq3m7db.js} +2 -2
- package/dist/{openai-codex-responses-de9pvs4d.js → openai-codex-responses-79s8xnbh.js} +29 -23
- package/dist/{openai-completions-mtqge3nf.js → openai-completions-tdbyts0x.js} +21 -20
- package/dist/{openai-decisions-ygk4kkxd.js → openai-decisions-bqhnjyfz.js} +2 -1
- package/dist/{openai-responses-dkyng71g.js → openai-responses-dm3t5vqp.js} +26 -17
- package/dist/{opencode-adapter-x4tqzhkh.js → opencode-adapter-e56086m1.js} +7 -5
- package/dist/{openrouter-images-wvv7camj.js → openrouter-images-ssttr1y4.js} +6 -3
- package/dist/{otel-impl-w3fbhpn0.js → otel-impl-h9yyza47.js} +2 -2
- package/dist/{pi-messages-nhh1pkz2.js → pi-messages-3nf8bq1a.js} +6 -4
- package/dist/{pi-mono-adapter-mcfkn9vf.js → pi-mono-adapter-tzps8f38.js} +9 -37
- package/dist/{pricing-refresh-j38dehfs.js → pricing-refresh-nevhat8h.js} +3 -3
- package/dist/{rbac-roles-ae8yttq4.js → rbac-roles-4y6ngvzq.js} +1 -1
- package/dist/{rbac-roles-ejxx9b35.js → rbac-roles-exbg8xb6.js} +2 -2
- package/dist/{registry-rxw10xzg.js → registry-ajhexe44.js} +1 -1
- package/dist/{render-v2-n16n0phe.js → render-v2-cfsh13z3.js} +3 -3
- package/dist/{resume-z0fgjc38.js → resume-5s2t0dbs.js} +10 -8
- package/dist/{runtime-xe3aqy4x.js → runtime-bt5pkpm1.js} +1 -1
- package/dist/{session-access-cv3mq6mc.js → session-access-dnbyp3cn.js} +6 -4
- package/dist/{setup-mafhj3yt.js → setup-1wj1y77j.js} +1 -1
- package/dist/{typesafe-system-one-2hgpayzy.js → typesafe-system-one-bre38hvs.js} +4 -2
- package/dist/{virtual-modules-4r3zkc20.js → virtual-modules-mnfbh5mr.js} +8 -2
- package/dist/{work-objects-8b86mgjp.js → work-objects-7mg6216g.js} +26 -24
- package/dist/worker-nwb789mg.js +79 -0
- package/dist/{x-y45mthwn.js → x-pbpezr0s.js} +2 -2
- package/openapi.json +793 -6
- package/package.json +11 -11
- package/src/apps/catalog.generated.json +206 -4
- package/src/apps/page-validator.ts +13 -1
- package/src/assets/key.ts +17 -0
- package/src/azure-devops/handlers.ts +1 -1
- package/src/be/chunking.ts +42 -9
- package/src/be/db/approvals.ts +18 -0
- package/src/be/db/session-moves.ts +164 -0
- package/src/be/db/session-tree.ts +384 -0
- package/src/be/db/tasks/draft-text.ts +15 -0
- package/src/be/db/tasks/read.ts +54 -5
- package/src/be/db/workflow-runs.ts +96 -0
- package/src/be/db.ts +85 -237
- package/src/be/memory/index-content.ts +36 -17
- package/src/be/memory/providers/openai-embedding.ts +115 -61
- package/src/be/memory/providers/sqlite-store.ts +69 -23
- package/src/be/memory/reranker.ts +31 -1
- package/src/be/memory/search-candidates.ts +47 -0
- package/src/be/memory/types.ts +14 -0
- package/src/be/onboarding.ts +3 -0
- package/src/be/scripts/typecheck.ts +2 -0
- package/src/be/seed-scripts/catalog/heartbeat-jev-gate.ts +106 -54
- package/src/be/seed-scripts/index.ts +2 -2
- package/src/be/skill-sync.ts +43 -2
- package/src/be/swarm-config-guard.ts +25 -1
- package/src/be/task-attachment-store.ts +30 -0
- package/src/bitbucket/api.ts +81 -0
- package/src/bitbucket/auth.ts +64 -0
- package/src/bitbucket/handlers.ts +434 -0
- package/src/bitbucket/index.ts +28 -0
- package/src/bitbucket/templates.ts +134 -0
- package/src/bitbucket/types.ts +65 -0
- package/src/commands/runner.ts +55 -3
- package/src/e2b/env.ts +1 -0
- package/src/extensions/catalog.generated.json +4 -4
- package/src/extensions/contract-types.generated.ts +1 -1
- package/src/extensions/contract.ts +9 -2
- package/src/extensions/post-bridge.ts +1 -0
- package/src/fs/provider.ts +13 -1
- package/src/github/handlers.ts +6 -6
- package/src/gitlab/handlers.ts +5 -5
- package/src/heartbeat/heartbeat.ts +31 -11
- package/src/http/assets.ts +14 -2
- package/src/http/core.ts +12 -0
- package/src/http/fs.ts +54 -34
- package/src/http/index.ts +4 -0
- package/src/http/mcp-body.ts +37 -0
- package/src/http/mcp-user.ts +3 -5
- package/src/http/mcp.ts +6 -7
- package/src/http/memory.ts +26 -15
- package/src/http/onboarding.ts +1 -0
- package/src/http/page-proxy.ts +61 -5
- package/src/http/pages-public.ts +27 -44
- package/src/http/pages.ts +4 -4
- package/src/http/script-runs.ts +2 -0
- package/src/http/sessions.ts +366 -12
- package/src/http/skills.ts +48 -1
- package/src/http/tasks.ts +1 -1
- package/src/http/users.ts +13 -1
- package/src/http/webhooks.ts +141 -0
- package/src/integrations/chat-sdk/adapters.ts +24 -4
- package/src/integrations/chat-sdk/attachments.ts +90 -12
- package/src/integrations/chat-sdk/facts.ts +138 -0
- package/src/integrations/chat-sdk/inbound.ts +156 -8
- package/src/integrations/chat-sdk/limits.ts +24 -0
- package/src/integrations/chat-sdk/outbound-files.ts +186 -0
- package/src/integrations/chat-sdk/outbound.ts +272 -5
- package/src/integrations/chat-sdk/relay.ts +4 -1
- package/src/integrations/chat-sdk/router.ts +28 -2
- package/src/integrations/chat-sdk/steering.ts +9 -0
- package/src/integrations/chat-sdk/templates.ts +14 -0
- package/src/integrations/chat-sdk/thread-buffer.ts +4 -0
- package/src/mcp-limits.ts +20 -0
- package/src/pages/browser-sdk.ts +8 -3
- package/src/pages/feedback-overlay.ts +1 -1
- package/src/providers/acp-targets.ts +1 -1
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/codex-adapter.ts +106 -119
- package/src/providers/codex-agents-md.ts +35 -229
- package/src/providers/cursor-adapter.ts +1 -1
- package/src/providers/pi-mono-adapter.ts +5 -53
- package/src/realtime/transport.ts +1 -2
- package/src/script-workflows/workflow-ctx.ts +1 -0
- package/src/scripts-runtime/types/stdlib.d.ts +2 -0
- package/src/scripts-runtime/types/swarm-extension.d.ts +14 -4
- package/src/scripts-runtime/types/swarm-sdk.d.ts +2 -0
- package/src/server-user.ts +2 -0
- package/src/server.ts +2 -0
- package/src/slack/assistant.ts +2 -2
- package/src/slack/files.ts +2 -0
- package/src/slack/handlers.test.ts +158 -0
- package/src/slack/handlers.ts +23 -32
- package/src/slack/inbound-files.ts +39 -6
- package/src/slack/thread-buffer.ts +2 -1
- package/src/tasks/context-key.ts +61 -1
- package/src/tasks/task-terminal-effects.ts +21 -17
- package/src/tests/apps-card-grid.test.ts +197 -0
- package/src/tests/apps-catalog-additions.test.ts +120 -0
- package/src/tests/apps-tree.test.ts +129 -0
- package/src/tests/bitbucket-auth.test.ts +156 -0
- package/src/tests/bitbucket-handlers.test.ts +425 -0
- package/src/tests/bitbucket-webhook.test.ts +220 -0
- package/src/tests/chat-sdk-attachments-reply.test.ts +52 -0
- package/src/tests/chat-sdk-config.test.ts +11 -0
- package/src/tests/chat-sdk-facts.test.ts +23 -0
- package/src/tests/chat-sdk-inbound.test.ts +597 -4
- package/src/tests/chat-sdk-outbound-files.test.ts +652 -0
- package/src/tests/chat-sdk-telegram-markdown.test.ts +92 -0
- package/src/tests/codex-adapter.test.ts +167 -242
- package/src/tests/config-api-only-keys.test.ts +9 -0
- package/src/tests/context-key.test.ts +50 -0
- package/src/tests/core-auth.test.ts +5 -0
- package/src/tests/cors-allowlist.test.ts +1 -1
- package/src/tests/db-task-read-contract.test.ts +7 -0
- package/src/tests/db-task-write-contract.test.ts +6 -0
- package/src/tests/docs-index-footprint.test.js +3 -3
- package/src/tests/extensions-example-slack-reply-gate.test.ts +262 -91
- package/src/tests/fixtures/bitbucket/pullrequest-comment-created-inline.json +174 -0
- package/src/tests/fixtures/bitbucket/pullrequest-comment-created.json +170 -0
- package/src/tests/fixtures/bitbucket/pullrequest-created-mention.json +132 -0
- package/src/tests/fixtures/bitbucket/pullrequest-created-reviewer.json +140 -0
- package/src/tests/fixtures/bitbucket/pullrequest-fulfilled.json +134 -0
- package/src/tests/fixtures/bitbucket/pullrequest-rejected.json +133 -0
- package/src/tests/generate-mcp-docs.test.ts +101 -0
- package/src/tests/gitlab-handlers.test.ts +3 -3
- package/src/tests/gitlab-vcs-db.test.ts +4 -4
- package/src/tests/heartbeat-checklist.test.ts +33 -0
- package/src/tests/heartbeat-jev-gate-credentials.test.ts +44 -0
- package/src/tests/heartbeat-jev-gate.test.ts +242 -1
- package/src/tests/integration-disable-flags.test.ts +36 -0
- package/src/tests/kv-page-proxy.test.ts +91 -5
- package/src/tests/launch-password-rejection.test.ts +2 -2
- package/src/tests/mcp-input-caps.test.ts +294 -0
- package/src/tests/mcp-tools.test.ts +1 -1
- package/src/tests/memory-chunked-search-starvation.test.ts +200 -0
- package/src/tests/memory-embedding-input-cap.test.ts +114 -0
- package/src/tests/memory.test.ts +14 -0
- package/src/tests/onboarding.test.ts +12 -0
- package/src/tests/page-guest-session.test.ts +19 -8
- package/src/tests/page-proxy-authed.test.ts +1 -1
- package/src/tests/page-proxy.test.ts +17 -10
- package/src/tests/page-session.test.ts +102 -1
- package/src/tests/pages-authed-mode.test.ts +82 -12
- package/src/tests/pages-password-mode.test.ts +5 -5
- package/src/tests/pi-codemode.test.ts +8 -2
- package/src/tests/preload-env.test.ts +57 -0
- package/src/tests/preload.ts +21 -0
- package/src/tests/prompt-template-remaining.test.ts +38 -0
- package/src/tests/realtime-transport.test.ts +13 -7
- package/src/tests/run-root-coverage.test.ts +39 -0
- package/src/tests/runner-bitbucket-vcs.test.ts +191 -0
- package/src/tests/runner-skills-refresh.test.ts +58 -0
- package/src/tests/script-runs-http.test.ts +84 -0
- package/src/tests/scripts-http.test.ts +10 -1
- package/src/tests/secret-scrubber.test.ts +15 -0
- package/src/tests/sessions-move.test.ts +576 -0
- package/src/tests/sessions-tree.test.ts +493 -0
- package/src/tests/skill-files-http.test.ts +50 -0
- package/src/tests/skills-bundle.test.ts +99 -0
- package/src/tests/swarm-config-export-to-env.test.ts +23 -3
- package/src/tests/task-audio-transcription.test.ts +299 -0
- package/src/tests/task-completion-memory-chunking.test.ts +434 -0
- package/src/tests/task-terminal-secret-scrub.test.ts +6 -1
- package/src/tests/transcription.test.ts +299 -0
- package/src/tests/vcs-bitbucket.test.ts +91 -0
- package/src/tests/vcs-provider-isolation.test.ts +123 -0
- package/src/tests/vcs-provider.test.ts +16 -1
- package/src/tests/vcs-tracking.test.ts +3 -3
- package/src/tests/workflow-foreach-bodies.test.ts +637 -0
- package/src/tests/workflow-foreach-concurrency.test.ts +342 -0
- package/src/tests/workflow-foreach-retry.test.ts +537 -0
- package/src/tests/workflow-foreach.test.ts +44 -23
- package/src/tests/workflow-step-claims.test.ts +6 -6
- package/src/tests/workflow-system-one-decision-providers.test.ts +98 -1
- package/src/tests/workflow-system-one-decision.test.ts +2 -1
- package/src/tests/workflow-tla-races.test.ts +2 -2
- package/src/tools/chat-access.ts +10 -0
- package/src/tools/chat-post.ts +31 -11
- package/src/tools/chat-reply.ts +32 -10
- package/src/tools/memory-search.ts +3 -1
- package/src/tools/script-delete.ts +1 -1
- package/src/tools/system-one-decide.ts +17 -4
- package/src/tools/workflows/create-workflow.ts +5 -3
- package/src/types.ts +9 -2
- package/src/utils/config-env-export.ts +4 -1
- package/src/utils/page-session.ts +133 -20
- package/src/utils/secret-scrubber.ts +4 -0
- package/src/utils/skills-refresh.ts +83 -43
- package/src/utils/transcription.ts +246 -0
- package/src/vcs/bitbucket.ts +58 -0
- package/src/vcs/index.ts +2 -0
- package/src/vcs/types.ts +2 -2
- package/src/workflows/approval-resolution.ts +4 -1
- package/src/workflows/checkpoint.ts +9 -1
- package/src/workflows/constants.ts +3 -0
- package/src/workflows/definition.ts +48 -17
- package/src/workflows/engine.ts +25 -15
- package/src/workflows/executors/foreach.ts +45 -99
- package/src/workflows/executors/system-one-decision.ts +28 -7
- package/src/workflows/executors/system-one-providers.ts +39 -4
- package/src/workflows/foreach-body.ts +146 -0
- package/src/workflows/foreach-driver.ts +552 -0
- package/src/workflows/foreach-join.ts +206 -7
- package/src/workflows/node-timeout.ts +21 -0
- package/src/workflows/recovery.ts +68 -3
- package/src/workflows/resume.ts +221 -43
- package/src/workflows/retry-poller.ts +39 -24
- package/src/workflows/step-input.ts +59 -0
- package/src/workflows/task-step-routing.ts +114 -56
- package/templates/extensions/slack-reply-gate/README.md +24 -22
- package/templates/extensions/slack-reply-gate/hooks.ts +146 -95
- package/templates/extensions/slack-reply-gate/manifest.json +2 -2
- package/templates/skills/apps/SKILL.md +28 -6
- package/templates/skills/apps/content.md +28 -6
- package/templates/skills/chat-sdk/content.md +6 -2
- package/templates/skills/code-quality/content.md +2 -1
- package/templates/skills/heartbeat-runbook/content.md +5 -5
- package/templates/skills/pages/content.md +6 -4
- package/templates/skills/slack-interaction/content.md +5 -0
- package/templates/skills/swarm-scripts/SKILL.md +2 -2
- package/templates/skills/swarm-scripts/content.md +2 -2
- package/templates/skills/work-on-task/SKILL.md +1 -1
- package/templates/skills/work-on-task/content.md +1 -1
- package/dist/cli-51y09c6p.js +0 -2657
- package/dist/cli-yw91rnmw.js +0 -13
- package/dist/handlers-0pvee9nw.js +0 -39
- package/dist/index-gdh8jrdm.js +0 -43
- package/dist/index-hg0x2cdv.js +0 -40
- package/dist/index-thm0y6a8.js +0 -41
- package/dist/lead-ee8vazz2.js +0 -77
- package/dist/worker-16s75hm5.js +0 -77
package/src/http/pages-public.ts
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* 302-redirect to the SPA `/pages/:id` route (the JSON renderer lives
|
|
14
14
|
* in the SPA, not the API — step-6/7).
|
|
15
15
|
* - `auth_mode === 'authed'`: returns 401. step-4 narrows this to also
|
|
16
|
-
* accept a valid `
|
|
16
|
+
* accept a valid `page_session_<id>` cookie.
|
|
17
17
|
* - `auth_mode === 'password'`: returns 401. step-5 narrows this to also
|
|
18
18
|
* accept `?key=` query param + HTTP Basic.
|
|
19
19
|
*
|
|
@@ -33,7 +33,7 @@ import {
|
|
|
33
33
|
import { type Page, PageSchema } from "../types";
|
|
34
34
|
import { getAppUrl, getConfiguredAppUrls } from "../utils/constants";
|
|
35
35
|
import { getNodeEnv } from "../utils/node-env";
|
|
36
|
-
import { extractAndVerifyCookie,
|
|
36
|
+
import { extractAndVerifyCookie, pageSessionSetCookies } from "../utils/page-session";
|
|
37
37
|
import { scrubSecrets } from "../utils/secret-scrubber";
|
|
38
38
|
import { route } from "./route-def";
|
|
39
39
|
|
|
@@ -357,16 +357,15 @@ function buildCsp(): string {
|
|
|
357
357
|
/**
|
|
358
358
|
* Decide whether a page is reachable based on cookie alone. Public pages are
|
|
359
359
|
* always reachable; authed AND password pages can ALSO pass via a valid
|
|
360
|
-
* `
|
|
361
|
-
*
|
|
362
|
-
*
|
|
363
|
-
*
|
|
360
|
+
* `page_session_<id>` cookie (or the legacy `page_session`) whose signed
|
|
361
|
+
* payload names this page (the cookie is the proof once the user has
|
|
362
|
+
* successfully unlocked once). For password pages, when the cookie is
|
|
363
|
+
* absent/invalid the caller falls through to the `?key=` + Basic-auth
|
|
364
|
+
* resolution path; for authed pages the caller surfaces 401.
|
|
364
365
|
*
|
|
365
366
|
* The caller passes the cookie payload (already verified by
|
|
366
|
-
* `extractAndVerifyCookie
|
|
367
|
-
*
|
|
368
|
-
* surfaces as a distinct `403` so misconfigurations are debuggable, NOT a
|
|
369
|
-
* generic 401.
|
|
367
|
+
* `extractAndVerifyCookie`, which ignores sessions for other pages) — `null`
|
|
368
|
+
* when no session for this page was sent or it failed verification.
|
|
370
369
|
*
|
|
371
370
|
* For password pages with no/bad cookie, returns `{ ok: false, status: 401,
|
|
372
371
|
* needsPassword: true }` so the handler knows to try the password flow before
|
|
@@ -374,7 +373,7 @@ function buildCsp(): string {
|
|
|
374
373
|
*/
|
|
375
374
|
type AccessResult =
|
|
376
375
|
| { ok: true }
|
|
377
|
-
| { ok: false; status: 401
|
|
376
|
+
| { ok: false; status: 401; reason: string; needsPassword?: boolean };
|
|
378
377
|
|
|
379
378
|
function isAccessible(
|
|
380
379
|
page: Page,
|
|
@@ -382,27 +381,9 @@ function isAccessible(
|
|
|
382
381
|
): AccessResult {
|
|
383
382
|
if (page.authMode === "public") return { ok: true };
|
|
384
383
|
|
|
385
|
-
// Cookie-first path.
|
|
386
|
-
//
|
|
387
|
-
|
|
388
|
-
// clearing. For authed mode we surface 403 (the SPA's launch-retry path
|
|
389
|
-
// handles recovery; direct browser access to authed pages is rare).
|
|
390
|
-
if (cookiePayload) {
|
|
391
|
-
if (cookiePayload.pageId === page.id) return { ok: true };
|
|
392
|
-
if (page.authMode === "password") {
|
|
393
|
-
return {
|
|
394
|
-
ok: false,
|
|
395
|
-
status: 401,
|
|
396
|
-
reason: "password required",
|
|
397
|
-
needsPassword: true,
|
|
398
|
-
};
|
|
399
|
-
}
|
|
400
|
-
return {
|
|
401
|
-
ok: false,
|
|
402
|
-
status: 403,
|
|
403
|
-
reason: "page-session cookie scoped to a different page id",
|
|
404
|
-
};
|
|
405
|
-
}
|
|
384
|
+
// Cookie-first path. Sessions for other pages never reach here, so an open
|
|
385
|
+
// tab of page A no longer fails once page B is launched in the same browser.
|
|
386
|
+
if (cookiePayload?.pageId === page.id) return { ok: true };
|
|
406
387
|
|
|
407
388
|
if (page.authMode === "authed") {
|
|
408
389
|
return {
|
|
@@ -523,7 +504,7 @@ export async function handlePagesPublic(
|
|
|
523
504
|
// Pull + verify the page-session cookie ONCE — `null` covers "no cookie",
|
|
524
505
|
// "tampered signature", "expired", "malformed". The access decision below
|
|
525
506
|
// discriminates per-authMode.
|
|
526
|
-
const cookiePayload = await extractAndVerifyCookie(req);
|
|
507
|
+
const cookiePayload = await extractAndVerifyCookie(req, page.id);
|
|
527
508
|
|
|
528
509
|
const access = isAccessible(page, cookiePayload);
|
|
529
510
|
|
|
@@ -531,7 +512,7 @@ export async function handlePagesPublic(
|
|
|
531
512
|
// password flow mints a fresh cookie inline. Empty string = no cookie to
|
|
532
513
|
// attach. We thread this through the handler so the existing 200-response
|
|
533
514
|
// paths below can opt-in without duplicating their branch logic.
|
|
534
|
-
let inlineSetCookie =
|
|
515
|
+
let inlineSetCookie: string[] = [];
|
|
535
516
|
|
|
536
517
|
if (!access.ok) {
|
|
537
518
|
// Password flow: cookie missing/invalid, try `?key=` then Basic.
|
|
@@ -547,7 +528,7 @@ export async function handlePagesPublic(
|
|
|
547
528
|
matched = false;
|
|
548
529
|
}
|
|
549
530
|
if (matched) {
|
|
550
|
-
inlineSetCookie = await
|
|
531
|
+
inlineSetCookie = await pageSessionSetCookies(req, page.id, {
|
|
551
532
|
dev: isLocalhostRequest(req),
|
|
552
533
|
});
|
|
553
534
|
// fall through to the regular 200 path below.
|
|
@@ -586,7 +567,7 @@ export async function handlePagesPublic(
|
|
|
586
567
|
// that `respond()` writes via `res.writeHead()` — Node gives the latter
|
|
587
568
|
// precedence, which is the value we want here anyway.
|
|
588
569
|
res.setHeader("Cache-Control", "no-store");
|
|
589
|
-
if (inlineSetCookie) res.setHeader("Set-Cookie", inlineSetCookie);
|
|
570
|
+
if (inlineSetCookie.length > 0) res.setHeader("Set-Cookie", inlineSetCookie);
|
|
590
571
|
publicPageJsonRoute.respond(res, 200, {
|
|
591
572
|
id: page.id,
|
|
592
573
|
version: 1, // edit-counter is API-internal; SPA reads via /api/pages/:id/versions
|
|
@@ -602,13 +583,13 @@ export async function handlePagesPublic(
|
|
|
602
583
|
|
|
603
584
|
// SVG stays byte-for-byte intact, including when ?print=1 is supplied.
|
|
604
585
|
if (page.contentType === "image/svg+xml") {
|
|
605
|
-
const headers: Record<string, string> = {
|
|
586
|
+
const headers: Record<string, string | string[]> = {
|
|
606
587
|
"Content-Type": "image/svg+xml",
|
|
607
588
|
"Cache-Control": page.authMode === "public" ? "public, max-age=1800" : "private, no-store",
|
|
608
589
|
"X-Content-Type-Options": "nosniff",
|
|
609
590
|
"Content-Security-Policy": "default-src 'none'; style-src 'unsafe-inline'; sandbox",
|
|
610
591
|
};
|
|
611
|
-
if (inlineSetCookie) headers["Set-Cookie"] = inlineSetCookie;
|
|
592
|
+
if (inlineSetCookie.length > 0) headers["Set-Cookie"] = inlineSetCookie;
|
|
612
593
|
res.writeHead(200, headers);
|
|
613
594
|
res.end(page.body);
|
|
614
595
|
await bumpViewCount(page.id);
|
|
@@ -625,20 +606,22 @@ export async function handlePagesPublic(
|
|
|
625
606
|
// `/p/:id` — render either HTML directly or 302→SPA for JSON.
|
|
626
607
|
if (page.contentType === "application/json") {
|
|
627
608
|
if (wantsPrint) {
|
|
628
|
-
const headers: Record<string, string> = {
|
|
609
|
+
const headers: Record<string, string | string[]> = {
|
|
629
610
|
"Content-Type": "text/html; charset=utf-8",
|
|
630
611
|
"Cache-Control": "no-store",
|
|
631
612
|
"Content-Security-Policy": buildCsp(),
|
|
632
613
|
"X-Content-Type-Options": "nosniff",
|
|
633
614
|
};
|
|
634
|
-
if (inlineSetCookie) headers["Set-Cookie"] = inlineSetCookie;
|
|
615
|
+
if (inlineSetCookie.length > 0) headers["Set-Cookie"] = inlineSetCookie;
|
|
635
616
|
res.writeHead(200, headers);
|
|
636
617
|
res.end(printableJsonPageHtml(page));
|
|
637
618
|
await bumpViewCount(page.id);
|
|
638
619
|
return true;
|
|
639
620
|
}
|
|
640
|
-
const headers: Record<string, string> = {
|
|
641
|
-
|
|
621
|
+
const headers: Record<string, string | string[]> = {
|
|
622
|
+
Location: `${getAppBaseUrl()}/pages/${page.id}`,
|
|
623
|
+
};
|
|
624
|
+
if (inlineSetCookie.length > 0) headers["Set-Cookie"] = inlineSetCookie;
|
|
642
625
|
res.writeHead(302, headers);
|
|
643
626
|
res.end();
|
|
644
627
|
// 302 redirects are intentionally NOT counted — they're a stop-over for
|
|
@@ -656,14 +639,14 @@ export async function handlePagesPublic(
|
|
|
656
639
|
injectBrowserSdk(page.body, feedback ? feedbackKeyGuardScript() : "") +
|
|
657
640
|
(wantsPrint ? PRINT_AUTOTRIGGER_SCRIPT : "") +
|
|
658
641
|
(feedback ? feedbackOverlayScripts(page.id) : "");
|
|
659
|
-
const headers: Record<string, string> = {
|
|
642
|
+
const headers: Record<string, string | string[]> = {
|
|
660
643
|
"Content-Type": "text/html; charset=utf-8",
|
|
661
644
|
"Cache-Control": "no-store",
|
|
662
645
|
"Content-Security-Policy": buildCsp(),
|
|
663
646
|
// Defence-in-depth: prevent MIME sniffing and clickjacking outside the SPA.
|
|
664
647
|
"X-Content-Type-Options": "nosniff",
|
|
665
648
|
};
|
|
666
|
-
if (inlineSetCookie) headers["Set-Cookie"] = inlineSetCookie;
|
|
649
|
+
if (inlineSetCookie.length > 0) headers["Set-Cookie"] = inlineSetCookie;
|
|
667
650
|
res.writeHead(200, headers);
|
|
668
651
|
res.end(html);
|
|
669
652
|
await bumpViewCount(page.id);
|
package/src/http/pages.ts
CHANGED
|
@@ -36,7 +36,7 @@ import {
|
|
|
36
36
|
} from "../types";
|
|
37
37
|
import { getAppUrl, getPublicMcpBaseUrl } from "../utils/constants";
|
|
38
38
|
import { getNodeEnv } from "../utils/node-env";
|
|
39
|
-
import {
|
|
39
|
+
import { pageSessionSetCookies } from "../utils/page-session";
|
|
40
40
|
import { getRequestAuth } from "../utils/request-auth-context";
|
|
41
41
|
import { resolveHttpFavoriteOwner } from "./favorite-owner";
|
|
42
42
|
import { route } from "./route-def";
|
|
@@ -175,7 +175,7 @@ const resolvePageRoute = route({
|
|
|
175
175
|
* `?key=` query / HTTP Basic on `/p/:id` directly (step-5). Bearer-side
|
|
176
176
|
* issuance would bypass the password check entirely.
|
|
177
177
|
*
|
|
178
|
-
* Response: 204 No Content + `Set-Cookie:
|
|
178
|
+
* Response: 204 No Content + `Set-Cookie: page_session_<id>=<signed>; HttpOnly; ...`.
|
|
179
179
|
*/
|
|
180
180
|
const launchPageRoute = route({
|
|
181
181
|
method: "post",
|
|
@@ -981,13 +981,13 @@ export async function handlePages(
|
|
|
981
981
|
: auth?.kind === "operator"
|
|
982
982
|
? { name: `guest-${randomUUID().slice(0, 8)}`, op: true as const }
|
|
983
983
|
: undefined;
|
|
984
|
-
const
|
|
984
|
+
const cookies = await pageSessionSetCookies(req, page.id, {
|
|
985
985
|
dev: isDevRequest(req),
|
|
986
986
|
...identity,
|
|
987
987
|
});
|
|
988
988
|
|
|
989
989
|
applyLaunchCors(req, res);
|
|
990
|
-
res.setHeader("Set-Cookie",
|
|
990
|
+
res.setHeader("Set-Cookie", cookies);
|
|
991
991
|
res.writeHead(204);
|
|
992
992
|
res.end();
|
|
993
993
|
return true;
|
package/src/http/script-runs.ts
CHANGED
|
@@ -101,6 +101,7 @@ const agentTaskBodySchema = z.object({
|
|
|
101
101
|
routingNote: z.string().max(200).optional(),
|
|
102
102
|
tags: z.array(z.string()).optional(),
|
|
103
103
|
priority: z.number().int().min(0).max(100).optional(),
|
|
104
|
+
dependsOn: z.array(z.uuid()).optional(),
|
|
104
105
|
offerMode: z.boolean().optional(),
|
|
105
106
|
dir: z.string().min(1).optional(),
|
|
106
107
|
vcsRepo: z.string().min(1).optional(),
|
|
@@ -655,6 +656,7 @@ export async function handleScriptRuns(
|
|
|
655
656
|
: undefined,
|
|
656
657
|
tags: parsed.body.tags,
|
|
657
658
|
priority: parsed.body.priority,
|
|
659
|
+
dependsOn: parsed.body.dependsOn,
|
|
658
660
|
offeredTo: parsed.body.offerMode ? parsed.body.agentId : undefined,
|
|
659
661
|
taskType: "script-run-step",
|
|
660
662
|
source: "mcp",
|