@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
|
@@ -17,14 +17,40 @@ import {
|
|
|
17
17
|
} from "../types";
|
|
18
18
|
import { checkpointStep, checkpointStepFailure } from "./checkpoint";
|
|
19
19
|
import { getSuccessors } from "./definition";
|
|
20
|
-
import {
|
|
20
|
+
import type { ExecutorRegistry } from "./executors/registry";
|
|
21
|
+
import { type ForeachSettleResult, resolveForeachParent, settleForeachChild } from "./foreach-join";
|
|
21
22
|
|
|
22
|
-
export interface
|
|
23
|
-
/**
|
|
23
|
+
export interface TaskStepRoutingResult {
|
|
24
|
+
/**
|
|
25
|
+
* False when another handler already moved the step out of `waiting` — the
|
|
26
|
+
* caller must not route successors again. The same task terminal event can
|
|
27
|
+
* reach two resume paths (the DB-emitted bus event and a direct emit, or a
|
|
28
|
+
* recovery sweep racing a live event); only the first one may route.
|
|
29
|
+
*/
|
|
24
30
|
claimed: boolean;
|
|
31
|
+
foreachChild: boolean;
|
|
32
|
+
joined: boolean;
|
|
25
33
|
successors: WorkflowNode[];
|
|
34
|
+
/** True when this call failed the run: nothing may route or re-park it. */
|
|
35
|
+
runFailed: boolean;
|
|
26
36
|
}
|
|
27
37
|
|
|
38
|
+
const UNCLAIMED: TaskStepRoutingResult = {
|
|
39
|
+
claimed: false,
|
|
40
|
+
foreachChild: false,
|
|
41
|
+
joined: false,
|
|
42
|
+
successors: [],
|
|
43
|
+
runFailed: false,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Port-routed resume result. `claimed` is false when the step was already
|
|
48
|
+
* claimed or its run is terminal. A foreach child (`foreachChild`) routes
|
|
49
|
+
* nothing unless its settlement closed the join (`joined`), in which case
|
|
50
|
+
* `successors` are the parent's.
|
|
51
|
+
*/
|
|
52
|
+
export type PortStepRoutingResult = TaskStepRoutingResult;
|
|
53
|
+
|
|
28
54
|
/**
|
|
29
55
|
* True while `taskId` is still the task bound to `stepId`. A retry detaches
|
|
30
56
|
* the failed task and the poller binds a fresh one to the same step, so a
|
|
@@ -37,24 +63,41 @@ async function isTaskBoundToStep(taskId: string, stepId: string): Promise<boolea
|
|
|
37
63
|
}
|
|
38
64
|
|
|
39
65
|
/**
|
|
40
|
-
* Atomically fail a waiting step and its run. Returns false when
|
|
41
|
-
* handler already moved the step out of `waiting` — the same task
|
|
42
|
-
* event can reach both the live bus listener and a recovery sweep,
|
|
43
|
-
* blind write here would stomp a run another handler is already
|
|
44
|
-
* With `ownerTaskId`, also
|
|
45
|
-
* bound to the step (a stale snapshot of a step that was since
|
|
66
|
+
* Atomically fail a waiting step and its run. Returns `claimed: false` when
|
|
67
|
+
* another handler already moved the step out of `waiting` — the same task
|
|
68
|
+
* terminal event can reach both the live bus listener and a recovery sweep,
|
|
69
|
+
* and a blind write here would stomp a run another handler is already
|
|
70
|
+
* advancing. With `ownerTaskId`, also unclaimed when that task is no longer
|
|
71
|
+
* the one bound to the step (a stale snapshot of a step that was since
|
|
72
|
+
* redriven).
|
|
73
|
+
*
|
|
74
|
+
* A synthetic foreach child settles `failed` through `settleForeachChild`
|
|
75
|
+
* instead: under `onNodeFailure: "fail"` that fails the run as before; under
|
|
76
|
+
* `"continue"` the item counts as failed and the join may close, so the
|
|
77
|
+
* caller walks `successors` when `joined`.
|
|
46
78
|
*/
|
|
47
79
|
export async function failStepAndRunIfWaiting(
|
|
80
|
+
def: WorkflowDefinition,
|
|
48
81
|
stepId: string,
|
|
49
82
|
runId: string,
|
|
50
83
|
reason: string,
|
|
51
84
|
ownerTaskId?: string,
|
|
52
|
-
|
|
85
|
+
options: { ctx?: Record<string, unknown>; registry?: ExecutorRegistry } = {},
|
|
86
|
+
): Promise<TaskStepRoutingResult> {
|
|
53
87
|
const now = new Date().toISOString();
|
|
54
|
-
return await getDbClient().transaction(async () => {
|
|
88
|
+
return await getDbClient().transaction(async (): Promise<TaskStepRoutingResult> => {
|
|
55
89
|
const current = await getWorkflowRunStep(stepId);
|
|
56
|
-
if (!current || current.status !== "waiting") return
|
|
57
|
-
if (ownerTaskId && !(await isTaskBoundToStep(ownerTaskId, stepId))) return
|
|
90
|
+
if (!current || current.status !== "waiting") return UNCLAIMED;
|
|
91
|
+
if (ownerTaskId && !(await isTaskBoundToStep(ownerTaskId, stepId))) return UNCLAIMED;
|
|
92
|
+
if (resolveForeachParent(def, current.nodeId)) {
|
|
93
|
+
const ctx =
|
|
94
|
+
options.ctx ?? (((await getWorkflowRun(runId))?.context ?? {}) as Record<string, unknown>);
|
|
95
|
+
return toRoutingResult(
|
|
96
|
+
await settleForeachChild(def, runId, stepId, { status: "failed", error: reason }, ctx, {
|
|
97
|
+
registry: options.registry,
|
|
98
|
+
}),
|
|
99
|
+
);
|
|
100
|
+
}
|
|
58
101
|
await updateWorkflowRunStep(stepId, {
|
|
59
102
|
status: "failed",
|
|
60
103
|
error: reason,
|
|
@@ -65,10 +108,20 @@ export async function failStepAndRunIfWaiting(
|
|
|
65
108
|
error: reason,
|
|
66
109
|
finishedAt: now,
|
|
67
110
|
});
|
|
68
|
-
return true;
|
|
111
|
+
return { claimed: true, foreachChild: false, joined: false, successors: [], runFailed: true };
|
|
69
112
|
});
|
|
70
113
|
}
|
|
71
114
|
|
|
115
|
+
function toRoutingResult(settle: ForeachSettleResult): TaskStepRoutingResult {
|
|
116
|
+
return {
|
|
117
|
+
claimed: settle.claimed,
|
|
118
|
+
foreachChild: true,
|
|
119
|
+
joined: settle.joined,
|
|
120
|
+
successors: settle.successors,
|
|
121
|
+
runFailed: settle.runFailed,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
72
125
|
/**
|
|
73
126
|
* Checkpoint a waiting step with a port-based result and resolve its
|
|
74
127
|
* successors. Mirrors `completeTaskStepAndResolveSuccessors`: callers check
|
|
@@ -84,17 +137,41 @@ export async function checkpointPortStepAndResolveSuccessors(
|
|
|
84
137
|
output: unknown,
|
|
85
138
|
nextPort: string,
|
|
86
139
|
ctx: Record<string, unknown>,
|
|
140
|
+
registry?: ExecutorRegistry,
|
|
87
141
|
): Promise<PortStepRoutingResult> {
|
|
88
142
|
return await getDbClient().transaction(async (): Promise<PortStepRoutingResult> => {
|
|
89
143
|
const current = await getWorkflowRunStep(stepId);
|
|
90
|
-
if (!current || current.status !== "waiting") return
|
|
144
|
+
if (!current || current.status !== "waiting") return UNCLAIMED;
|
|
91
145
|
const run = await getWorkflowRun(runId);
|
|
92
146
|
if (!run || (run.status !== "waiting" && run.status !== "running")) {
|
|
93
|
-
return
|
|
147
|
+
return UNCLAIMED;
|
|
148
|
+
}
|
|
149
|
+
// A foreach child's port (approval rejected/timeout, wait event/timeout)
|
|
150
|
+
// is stored for display and still counts as a completed item: the body's
|
|
151
|
+
// ports do not route, the item's consumer reads the output.
|
|
152
|
+
if (resolveForeachParent(def, nodeId)) {
|
|
153
|
+
return toRoutingResult(
|
|
154
|
+
await settleForeachChild(
|
|
155
|
+
def,
|
|
156
|
+
runId,
|
|
157
|
+
stepId,
|
|
158
|
+
{ status: "completed", output, nextPort },
|
|
159
|
+
ctx,
|
|
160
|
+
{
|
|
161
|
+
registry,
|
|
162
|
+
},
|
|
163
|
+
),
|
|
164
|
+
);
|
|
94
165
|
}
|
|
95
166
|
await checkpointStep(runId, stepId, nodeId, { output, nextPort }, ctx);
|
|
96
167
|
await updateWorkflowRun(runId, { status: "running" });
|
|
97
|
-
return {
|
|
168
|
+
return {
|
|
169
|
+
claimed: true,
|
|
170
|
+
foreachChild: false,
|
|
171
|
+
joined: true,
|
|
172
|
+
successors: getSuccessors(def, nodeId, nextPort),
|
|
173
|
+
runFailed: false,
|
|
174
|
+
};
|
|
98
175
|
});
|
|
99
176
|
}
|
|
100
177
|
|
|
@@ -179,26 +256,6 @@ async function isSupersedeCut(taskId: string, reason: string): Promise<boolean>
|
|
|
179
256
|
return task?.failureReason === SUPERSEDED_WORKFLOW_TASK_REASON;
|
|
180
257
|
}
|
|
181
258
|
|
|
182
|
-
export interface TaskStepRoutingResult {
|
|
183
|
-
/**
|
|
184
|
-
* False when another handler already moved the step out of `waiting` — the
|
|
185
|
-
* caller must not route successors again. The same task terminal event can
|
|
186
|
-
* reach two resume paths (the DB-emitted bus event and a direct emit, or a
|
|
187
|
-
* recovery sweep racing a live event); only the first one may route.
|
|
188
|
-
*/
|
|
189
|
-
claimed: boolean;
|
|
190
|
-
foreachChild: boolean;
|
|
191
|
-
joined: boolean;
|
|
192
|
-
successors: WorkflowNode[];
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const UNCLAIMED: TaskStepRoutingResult = {
|
|
196
|
-
claimed: false,
|
|
197
|
-
foreachChild: false,
|
|
198
|
-
joined: false,
|
|
199
|
-
successors: [],
|
|
200
|
-
};
|
|
201
|
-
|
|
202
259
|
/**
|
|
203
260
|
* Persist an agent-task result and resolve its next nodes. Synthetic foreach
|
|
204
261
|
* children never checkpoint into workflow context; only their parent join does.
|
|
@@ -211,6 +268,7 @@ export async function completeTaskStepAndResolveSuccessors(
|
|
|
211
268
|
ctx: Record<string, unknown>,
|
|
212
269
|
failureReason?: string,
|
|
213
270
|
ownerTaskId?: string,
|
|
271
|
+
registry?: ExecutorRegistry,
|
|
214
272
|
): Promise<TaskStepRoutingResult> {
|
|
215
273
|
// The task step, optional foreach join checkpoint, workflow context, and
|
|
216
274
|
// running status must commit together. A crash after this transaction is
|
|
@@ -223,25 +281,24 @@ export async function completeTaskStepAndResolveSuccessors(
|
|
|
223
281
|
// A stale snapshot of a step since redriven to a fresh task must not route it.
|
|
224
282
|
if (ownerTaskId && !(await isTaskBoundToStep(ownerTaskId, step.id))) return UNCLAIMED;
|
|
225
283
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
};
|
|
284
|
+
if (resolveForeachParent(def, step.nodeId)) {
|
|
285
|
+
// onNodeFailure:"continue" completions persist the failure reason as
|
|
286
|
+
// explicit metadata — the join classifies children on THIS, not on
|
|
287
|
+
// whether user-controlled output text happens to start with "[FAILED:".
|
|
288
|
+
return toRoutingResult(
|
|
289
|
+
await settleForeachChild(
|
|
290
|
+
def,
|
|
291
|
+
runId,
|
|
292
|
+
step.id,
|
|
293
|
+
{
|
|
294
|
+
status: "completed",
|
|
295
|
+
output,
|
|
296
|
+
...(failureReason !== undefined ? { error: failureReason } : {}),
|
|
297
|
+
},
|
|
298
|
+
ctx,
|
|
299
|
+
{ registry },
|
|
300
|
+
),
|
|
301
|
+
);
|
|
245
302
|
}
|
|
246
303
|
|
|
247
304
|
await checkpointStep(runId, step.id, step.nodeId, { output }, ctx);
|
|
@@ -251,6 +308,7 @@ export async function completeTaskStepAndResolveSuccessors(
|
|
|
251
308
|
foreachChild: false,
|
|
252
309
|
joined: true,
|
|
253
310
|
successors: getSuccessors(def, step.nodeId),
|
|
311
|
+
runFailed: false,
|
|
254
312
|
};
|
|
255
313
|
});
|
|
256
314
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# slack-reply-gate
|
|
2
2
|
|
|
3
|
-
Lead is woken by every human message in a Slack thread the swarm takes part in, including "lol", an emoji, or two people chatting with each other. This extension asks
|
|
3
|
+
Lead is woken by every human message in a Slack thread the swarm takes part in, including "lol", an emoji, or two people chatting with each other. This extension asks a SystemOne decision model, Jev ([TypeSafe](https://typesafe.ai)) or Clef (Cloudflare Workers AI), whether Lead should answer a new thread message, and drops the wake-up when it should not.
|
|
4
4
|
|
|
5
5
|
Install config:
|
|
6
6
|
|
|
@@ -15,8 +15,8 @@ Start in `shadow`, read the decisions in KV for a few days, then switch to `enfo
|
|
|
15
15
|
| `mode` | Effect |
|
|
16
16
|
|---|---|
|
|
17
17
|
| `off` | Never evaluates. |
|
|
18
|
-
| `shadow` (default) | Asks
|
|
19
|
-
| `enforce` | Asks
|
|
18
|
+
| `shadow` (default) | Asks the model and records the verdict. Never blocks. |
|
|
19
|
+
| `enforce` | Asks the model, records the verdict, and blocks the Lead task when the answer is no. The message gets :mute: instead: no Lead task, no reply, no outcome card. |
|
|
20
20
|
|
|
21
21
|
## What it gates
|
|
22
22
|
|
|
@@ -26,28 +26,30 @@ The header counts only at the start of the description or right after the closin
|
|
|
26
26
|
|
|
27
27
|
## Decision
|
|
28
28
|
|
|
29
|
-
1. A follow-up with downloaded files (status `draft`) passes without a
|
|
30
|
-
2. **@mention pass-through.** A new message that @mentions Lead passes without a
|
|
31
|
-
3. Otherwise one
|
|
29
|
+
1. A follow-up with downloaded files (status `draft`) passes without a decision call.
|
|
30
|
+
2. **@mention pass-through.** A new message that @mentions Lead passes without a decision call. A mention is the bot mention the engine rewrites to `<@U…> (that's you)`, a resolved `<@U…|lead>`, or a literal `@lead` (any name in `leadAliases`). Only the new messages are scanned, never the thread context, so an old mention earlier in the thread does not pass later banter.
|
|
31
|
+
3. Otherwise one decision call (one `choice` question, see [Provider](#provider)) with the new message(s), the sender kind, and the last `contextMessages` thread messages. Labels: `direct_ask`, `followup_to_lead`, `instruction_to_lead`, `reaction_only`, `banter_between_others`, `not_addressed_to_lead`, `other`.
|
|
32
32
|
4. The answer is no only when the top label is `reaction_only`, `banter_between_others`, or `not_addressed_to_lead`, and the summed probability of those three labels is at least `minConfidence`. A split between two skip labels is still a skip. An unsure verdict replies.
|
|
33
33
|
|
|
34
34
|
Several buffered messages are judged together. One mention in any of them passes the batch.
|
|
35
35
|
|
|
36
|
-
##
|
|
36
|
+
## Provider
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
The decision is made on the API server by the `system-one-decide` tool (`ctx.swarm.systemOne_decide`), the same path a `system-one-decision` workflow node takes. The server reads the provider's credential, sends the request, and validates the answer, so every SystemOne host works and no key enters the hook.
|
|
39
39
|
|
|
40
|
-
| `provider` |
|
|
41
|
-
|
|
42
|
-
| `typesafe` |
|
|
43
|
-
| `openrouter` |
|
|
44
|
-
| `
|
|
40
|
+
| `provider` | Model | Credential |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| `typesafe` | Jev, `model` (default `jev-latest`) | `TYPESAFE_API_KEY` |
|
|
43
|
+
| `openrouter` | Jev, `openrouterModel` (default `typesafe/jev-1.13`) | `OPENROUTER_API_KEY` |
|
|
44
|
+
| `cloudflare` | Clef, `cloudflareModel` (default `clef`, or `clef-flash`) | `CLOUDFLARE_API_TOKEN` (or `CLOUDFLARE_API_KEY`) and `CLOUDFLARE_ACCOUNT_ID` |
|
|
45
|
+
| `laya`, `openai` | The host's default model | See the workflows guide |
|
|
46
|
+
| `auto` (default) | The first of typesafe, openrouter, cloudflare whose credential is set. A provider the server refuses for a deployment setting (openrouter when `OPENROUTER_BASE_URL` points at a gateway) is skipped for the next one | |
|
|
45
47
|
|
|
46
|
-
|
|
48
|
+
With no credential for `auto`, every message fails open and the KV row names the secrets. Each decision row records the `provider` that answered. `minConfidence` was tuned on Jev; check Clef's verdicts in `shadow` before you enforce on it.
|
|
47
49
|
|
|
48
50
|
## Fail open
|
|
49
51
|
|
|
50
|
-
Every error lets the task through: a missing key, a
|
|
52
|
+
Every error lets the task through: a missing key, a provider error relayed by the server, a network error, a timeout, a malformed answer, or an unknown label. The handler never throws, so an outage cannot auto-disable the extension. Each failure is recorded as `fail-open` in KV and logged as a warning.
|
|
51
53
|
|
|
52
54
|
## :mute: on drop (enforce)
|
|
53
55
|
|
|
@@ -63,23 +65,23 @@ The block returns first and the Slack calls run after it. A slow or failing Slac
|
|
|
63
65
|
| Key | Default | Notes |
|
|
64
66
|
|---|---|---|
|
|
65
67
|
| `mode` | `shadow` | `off`, `shadow`, or `enforce` |
|
|
66
|
-
| `timeoutMs` | `3000` |
|
|
67
|
-
| `provider` | `auto` | `auto`, `typesafe`, or `
|
|
68
|
+
| `timeoutMs` | `3000` | Decision call timeout, capped at 4000 (the dispatcher cancels a handler at 5 s) |
|
|
69
|
+
| `provider` | `auto` | `auto`, `typesafe`, `openrouter`, `cloudflare`, `laya`, or `openai`. See [Provider](#provider) |
|
|
68
70
|
| `model` | `jev-latest` | Jev model on TypeSafe |
|
|
69
71
|
| `openrouterModel` | `typesafe/jev-1.13` | Jev model on OpenRouter |
|
|
72
|
+
| `cloudflareModel` | `clef` | Clef model on Cloudflare Workers AI |
|
|
70
73
|
| `minConfidence` | `0.55` | Minimum summed skip probability to skip |
|
|
71
|
-
| `contextMessages` | `6` | Thread messages sent to
|
|
74
|
+
| `contextMessages` | `6` | Thread messages sent to the model, 0 to 20 |
|
|
72
75
|
| `leadAliases` | `["lead"]` | A literal `@alias` in a new message counts as a mention |
|
|
73
|
-
| `botSlackUserIds` | `[]` | Slack user ids labelled `bot` as the sender for
|
|
74
|
-
| `apiKey` | unset | Explicit TypeSafe key. Prefer the `TYPESAFE_API_KEY` secret below |
|
|
76
|
+
| `botSlackUserIds` | `[]` | Slack user ids labelled `bot` as the sender for the model |
|
|
75
77
|
| `muteReaction` | `mute` | Reaction for a dropped message; `""` only removes the acceptance reaction(s) |
|
|
76
78
|
| `slackTimeoutMs` | `5000` | Timeout per Slack call |
|
|
77
79
|
|
|
78
80
|
## Required secrets
|
|
79
81
|
|
|
80
|
-
|
|
82
|
+
Set them as global `swarm_config` values. The server reads the provider credential from the global row when it makes the decision. `auto` and the Slack token read the API process environment, which loads global rows at boot and on config reload.
|
|
81
83
|
|
|
82
|
-
-
|
|
84
|
+
- One provider credential from the [Provider](#provider) table is required for any evaluation. Without one, every message fails open. The `apiKey` config field of earlier versions is gone: the hook never holds a key, so store it as the global `TYPESAFE_API_KEY` secret.
|
|
83
85
|
- `SLACK_BOT_TOKEN`: the Slack app's bot token. A swarm with Slack connected already has it. Without it, `enforce` still drops the message but cannot touch its reactions, and logs a `mute-error`.
|
|
84
86
|
|
|
85
87
|
No key is written to config, KV, logs, or a description.
|