@desplega.ai/agent-swarm 1.172.0 → 2.0.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 +1 -1
- package/dist/{acp-adapter-fpecx1g1.js → acp-adapter-sj2g0m84.js} +18 -17
- package/dist/{actions-pw87a1a8.js → actions-fegk44gr.js} +65 -35
- package/dist/{amp-adapter-8jem2bc0.js → amp-adapter-ad8ft89x.js} +8 -7
- package/dist/{anthropic-messages-8ee2f22q.js → anthropic-messages-r6czkjv1.js} +7 -7
- package/dist/{app-wmf0m843.js → app-kfvgbvzy.js} +19 -13
- package/dist/{assistant-emp1e108.js → assistant-z7zdy9ja.js} +65 -38
- package/dist/{boot-reembed-1de4f4aj.js → boot-reembed-5c2z0mbe.js} +11 -9
- package/dist/{boot-reembed-4ymn9atn.js → boot-reembed-j8xa181e.js} +11 -9
- package/dist/{boot-scrub-sweep-adhk1s8c.js → boot-scrub-sweep-hnkn3rgt.js} +12 -10
- package/dist/{boot-seeds-8q637aew.js → boot-seeds-kwjq4d2z.js} +15 -13
- package/dist/{claude-adapter-t26cv8a4.js → claude-adapter-9vmvpvgd.js} +20 -19
- package/dist/{claude-managed-adapter-xgxhqrt2.js → claude-managed-adapter-k9qae05j.js} +7 -5
- package/dist/{claude-managed-setup-bnmjarjc.js → claude-managed-setup-q54zx5q2.js} +6 -4
- package/dist/{claude-sdk-session-gsfsh662.js → claude-sdk-session-9jye6cxr.js} +12698 -11995
- package/dist/{cli-k46r9hmk.js → cli-03gedhng.js} +16 -14
- package/dist/{cli-kb4ehzx5.js → cli-1e4b6bzh.js} +7 -7
- package/dist/{cli-d603qf86.js → cli-29jc5q7w.js} +10 -8
- package/dist/cli-2m1ktfzz.js +17795 -0
- package/dist/{cli-8vs9trd4.js → cli-3dj8k4vy.js} +1 -1
- package/dist/{cli-zxm9p3x4.js → cli-3fbmmawm.js} +5 -5
- package/dist/{cli-gmdajfw5.js → cli-4jxm2qtz.js} +4987 -1708
- package/dist/{cli-tadfgd0t.js → cli-5hkm7whv.js} +33 -4
- package/dist/{cli-6jb2rf77.js → cli-5t4f29ez.js} +3 -3
- package/dist/{cli-7a0sde2x.js → cli-6cagzc96.js} +9 -0
- package/dist/cli-6cvfxs8r.js +47 -0
- package/dist/{cli-pj6x9qce.js → cli-6jyj59nb.js} +2 -2
- package/dist/{cli-388egyf6.js → cli-6razj6t4.js} +2 -2
- package/dist/{cli-qsztpfry.js → cli-74ahz61x.js} +2 -2
- package/dist/{cli-4nz8p1p5.js → cli-7x0g4sn1.js} +15474 -16082
- package/dist/{cli-yatxqynm.js → cli-9ha6hs2d.js} +1 -290
- package/dist/{cli-81r1wjyv.js → cli-9nfx44eh.js} +1 -1
- package/dist/cli-9traj3dn.js +638 -0
- package/dist/{cli-smcrrmhy.js → cli-agzebbd5.js} +9 -9
- package/dist/{cli-bf7485pm.js → cli-apx87jne.js} +2 -2
- package/dist/{cli-ztrv9y21.js → cli-bzszjf2p.js} +3689 -1081
- package/dist/{cli-c5km5znr.js → cli-c8r3kzzb.js} +1 -1
- package/dist/{cli-hsem16hb.js → cli-cgtksawx.js} +7 -4
- package/dist/{cli-db3m6zdt.js → cli-d2qr7aj4.js} +1 -1
- package/dist/{cli-1hgat6pa.js → cli-d5f9ed5c.js} +5 -5
- package/dist/cli-e3g5mbkz.js +776 -0
- package/dist/{cli-7jykv7ef.js → cli-e6mpjhed.js} +1 -1
- package/dist/{cli-j6kpj9az.js → cli-ee9gtz70.js} +1553 -68
- package/dist/{cli-e0a9sk00.js → cli-eejsgvm4.js} +4 -4
- package/dist/{cli-tgpfnm6r.js → cli-ef1hg1wv.js} +518 -59
- package/dist/cli-f527ce74.js +781 -0
- package/dist/{cli-ppy4nnnh.js → cli-f7kr7svz.js} +2 -2
- package/dist/cli-hjwmhcg1.js +10622 -0
- package/dist/{cli-2bw3w47j.js → cli-hnhtk6cj.js} +1 -1
- package/dist/{cli-ywm1azg9.js → cli-hnmhtzvh.js} +6 -4
- package/dist/{cli-4fnb6884.js → cli-hvqbtna4.js} +7 -1259
- package/dist/{cli-pstq9888.js → cli-j0pfptdp.js} +220 -103
- package/dist/cli-jta2eyzc.js +619 -0
- package/dist/{cli-esnpehf5.js → cli-k382tshb.js} +12 -13
- package/dist/cli-k3dp5tpf.js +263 -0
- package/dist/{cli-wd0hz6ah.js → cli-kbrt8gqa.js} +9 -91
- package/dist/cli-kceah1eh.js +92 -0
- package/dist/{cli-prrt9fa0.js → cli-ke896fcf.js} +10 -10
- package/dist/{cli-nv4zd0b9.js → cli-kt6zqg0e.js} +6 -6
- package/dist/{cli-g6t9texm.js → cli-m50t4309.js} +5 -18
- package/dist/cli-n2wq4j7m.js +6985 -0
- package/dist/{cli-c2pq2rjb.js → cli-n3hzg89b.js} +46 -15
- package/dist/{cli-tmhsxhb8.js → cli-n5vwg842.js} +23 -6
- package/dist/{cli-5rv1j9ga.js → cli-ne236afy.js} +53 -7
- package/dist/cli-p0sg24zp.js +16 -0
- package/dist/{cli-d161g69q.js → cli-p1x85d2t.js} +50 -2
- package/dist/{cli-7pz3b7x5.js → cli-przpmdgr.js} +25 -0
- package/dist/{cli-g4f5pj26.js → cli-q0ke1yww.js} +111 -25
- package/dist/{cli-e3pmyt39.js → cli-q50942rs.js} +1 -1
- package/dist/{cli-r44t9wqc.js → cli-r106725k.js} +2 -2
- package/dist/{cli-gj81e47t.js → cli-r2pnvj8g.js} +2 -2
- package/dist/{cli-r8smj8b8.js → cli-r62a35ea.js} +19 -3
- package/dist/{cli-cd0hv9nh.js → cli-ra0xzggj.js} +2 -2
- package/dist/cli-rhs9pz33.js +294 -0
- package/dist/{cli-nyhb1r6x.js → cli-s2sp957d.js} +52 -29
- package/dist/{cli-1x7da0de.js → cli-s4setq91.js} +8 -8
- package/dist/{cli-xczpdp9e.js → cli-se8w6wny.js} +6 -6
- package/dist/cli-skxvvpap.js +10140 -0
- package/dist/{cli-014vns2y.js → cli-stfs0k5s.js} +208 -525
- package/dist/{cli-0p3enk35.js → cli-tqaazemc.js} +9 -1
- package/dist/{cli-cf69s3ew.js → cli-tr4sxp68.js} +3 -3
- package/dist/{cli-8hzfb6xz.js → cli-tsde1hdr.js} +15 -15
- package/dist/{cli-cceskcvt.js → cli-txqb9s38.js} +8 -8
- package/dist/{cli-aspcaef3.js → cli-v1yb0rqb.js} +6 -6
- package/dist/{cli-j1pmc07z.js → cli-vatyhshy.js} +268 -40
- package/dist/{cli-04emfe2q.js → cli-vdach5a9.js} +5 -5
- package/dist/{cli-7avy4v8w.js → cli-w1q7h2r2.js} +5 -3
- package/dist/{cli-rcp5aqdw.js → cli-w7m81tb7.js} +1 -1
- package/dist/{cli-hwwvy36w.js → cli-wayw93nt.js} +3 -3
- package/dist/cli-wmgrkscj.js +23254 -0
- package/dist/{cli-gp1rtyvk.js → cli-z5jjpaxw.js} +29 -6
- package/dist/{cli-451ks6aw.js → cli-zkpks3r3.js} +1 -1
- package/dist/cli.js +32 -48
- package/dist/{codex-adapter-m4tgdysy.js → codex-adapter-y81sssk0.js} +16 -15
- package/dist/{codex-login-841kv5fk.js → codex-login-f2rcfpp9.js} +3 -2
- package/dist/{codex-session-runner-ymwzm6ea.js → codex-session-runner-8vx4j6a9.js} +16 -15
- package/dist/{commands-n0hshcvs.js → commands-kcpvpcrr.js} +21 -10
- package/dist/{controller-hq5ggpcp.js → controller-ywrmt6yd.js} +5 -4
- package/dist/{controllers-connect-y07cqcvy.js → controllers-connect-kwpvj3rf.js} +45 -38
- package/dist/{cursor-adapter-q8pgv5qa.js → cursor-adapter-cehv1qns.js} +7 -6
- package/dist/{db-hkqvrdcb.js → db-k8ankj20.js} +13 -11
- package/dist/{db-4w7tmt1g.js → db-ww5d7jq3.js} +29 -9
- package/dist/{devin-adapter-xgtj680j.js → devin-adapter-x1022qb1.js} +3 -2
- package/dist/{dispatcher-5sd69y14.js → dispatcher-e8gq5m68.js} +41 -34
- package/dist/{docker-f503k9p0.js → docker-ff6y1190.js} +3 -2
- package/dist/{dsh-adapter-2h8m4cab.js → dsh-adapter-3epjm3af.js} +7 -6
- package/dist/{e2b-66xra4az.js → e2b-8ygwhg0f.js} +4 -3
- package/dist/{e2b-xwhyj8cw.js → e2b-swhnpw3n.js} +4 -3
- package/dist/{event-bus-vjtv82gm.js → event-bus-6axnngdj.js} +3 -2
- package/dist/external-channel-h3359cwn.js +52 -0
- package/dist/{google-generative-ai-7pavrbv7.js → google-generative-ai-g8db7x0f.js} +5 -3
- package/dist/{google-vertex-3f1jk41f.js → google-vertex-r2692q0r.js} +5 -3
- package/dist/{grok-adapter-8m9yqzbq.js → grok-adapter-0d4x7gkx.js} +19 -18
- package/dist/{handlers-s20xr10r.js → handlers-an1gzv21.js} +44 -37
- package/dist/{heartbeat-3k31q4g2.js → heartbeat-6dakeb61.js} +46 -39
- package/dist/{hook-gdn6a2fn.js → hook-6v6cv6d5.js} +12 -24
- package/dist/{hook-ygwerrdh.js → hook-sa5xye4y.js} +13 -12
- package/dist/{http-jdteeg81.js → http-r7f3eky0.js} +1598 -279
- package/dist/index-52j1aja4.js +3465 -0
- package/dist/{index-e0snym4t.js → index-7ep4gzdk.js} +41 -34
- package/dist/index-9gw58n4k.js +193 -0
- package/dist/index-9j87mcm8.js +56305 -0
- package/dist/index-bsmcresk.js +79424 -0
- package/dist/index-mh85qhec.js +475 -0
- package/dist/{index-vm3bm9t7.js → index-rmpw9a8q.js} +41 -34
- package/dist/{index-6ksewd5y.js → index-s2wxgzr0.js} +1015 -732
- package/dist/{index-tsszt7g9.js → index-v1v6n7hg.js} +46 -39
- package/dist/index-we27kd31.js +12810 -0
- package/dist/{index-ffqzqgwb.js → index-zk96aq1k.js} +11 -9
- package/dist/{keepalive-jekc896t.js → keepalive-be9vwy5h.js} +13 -11
- package/dist/{lead-4k9s9szx.js → lead-0861cwrf.js} +64 -57
- package/dist/{maintenance-shazch4n.js → maintenance-mzzgc8bn.js} +11 -9
- package/dist/node-c9we95xf.js +1 -1
- package/dist/{node-fkajaq96.js → node-mn1zs7an.js} +2 -1
- package/dist/{oauth-refresh-sweep-5gb36kn8.js → oauth-refresh-sweep-cpdnfwdj.js} +12 -10
- package/dist/{onboard-ydrbnvww.js → onboard-fh8qs4r3.js} +11 -3
- package/dist/{opencode-adapter-5zh0he20.js → opencode-adapter-nm42wwj8.js} +19 -14
- package/dist/{otel-impl-6pf5cv86.js → otel-impl-x6c1c9g4.js} +248 -869
- package/dist/{pi-mono-adapter-ef9wwx9m.js → pi-mono-adapter-9n2ya240.js} +245 -107
- package/dist/{pricing-refresh-s52nsa5q.js → pricing-refresh-qb0rv0ap.js} +13 -11
- package/dist/{rbac-roles-aq3msh4e.js → rbac-roles-1gzdwbh1.js} +12 -10
- package/dist/{rbac-roles-q5gb5e8v.js → rbac-roles-3mraey52.js} +13 -11
- package/dist/{render-v2-pd1rg54q.js → render-v2-agpa45zz.js} +19 -13
- package/dist/{resume-gw4a2c6v.js → resume-x0ydy9s9.js} +27 -21
- package/dist/{runtime-qfry88v2.js → runtime-sa2vr16g.js} +2 -2
- package/dist/{setup-jda1ksdh.js → setup-as9ga0d6.js} +2 -2
- package/dist/{virtual-modules-b3ga2m65.js → virtual-modules-9gkxqrap.js} +7 -6
- package/dist/{work-objects-tb7ycye8.js → work-objects-y5g1y7ev.js} +49 -37
- package/dist/{worker-njjccz5d.js → worker-860c3e38.js} +64 -57
- package/dist/{x-qfmygqqv.js → x-m477fr0h.js} +3 -2
- package/openapi.json +951 -356
- package/package.json +12 -13
- package/src/apps/catalog.generated.json +1309 -53
- package/src/apps/page-validator.ts +93 -31
- package/src/azure-devops/api.ts +94 -18
- package/src/azure-devops/auth.ts +32 -0
- package/src/azure-devops/boards-sync.ts +708 -0
- package/src/azure-devops/handlers.ts +52 -8
- package/src/azure-devops/html.ts +26 -0
- package/src/azure-devops/index.ts +15 -0
- package/src/azure-devops/templates.ts +86 -0
- package/src/azure-devops/types.ts +65 -1
- package/src/be/config-refs.ts +60 -0
- package/src/be/db/page-versions.ts +15 -0
- package/src/be/db/runtime.ts +35 -8
- package/src/be/db/skill-name-resolution.ts +36 -0
- package/src/be/db/tasks/read.ts +230 -0
- package/src/be/db/tasks/write.ts +7 -0
- package/src/be/db.ts +74 -13
- package/src/be/migrations/213_script_connections_sql.sql +79 -0
- package/src/be/migrations/215_swarm_config_export_to_env.sql +34 -0
- package/src/be/migrations/216_task_resolved_effort.sql +5 -0
- package/src/be/migrations/217_chat_sdk_state.sql +104 -0
- package/src/be/model-catalog-store.ts +5 -1
- package/src/be/model-tier-resolution.ts +12 -1
- package/src/be/model-validation.ts +5 -2
- package/src/be/models-catalog.ts +26 -1
- package/src/be/modelsdev-cache.json +198 -63
- package/src/be/modelsdev-cache.ts +9 -1
- package/src/be/script-connections.ts +47 -8
- package/src/be/script-credential-broker.ts +39 -2
- package/src/be/scripts/run-saved.ts +1 -0
- package/src/be/scripts/typecheck.ts +10 -8
- package/src/be/seed/runner.ts +13 -1
- package/src/be/seed/state-db.ts +5 -0
- package/src/be/seed/types.ts +6 -0
- package/src/be/seed-pricing.ts +19 -2
- package/src/be/seed-scripts/catalog/ops-catalog-audit.inline.ts +1 -1
- package/src/be/seed-scripts/catalog/ops-catalog-audit.ts +1 -1
- package/src/be/seed-skills/bundled-files.generated.json +10 -18
- package/src/be/seed-skills/index.ts +107 -3
- package/src/be/sql-connections.ts +118 -0
- package/src/be/swarm-config-guard.ts +53 -0
- package/src/cli.tsx +0 -16
- package/src/commands/onboard/non-interactive.ts +4 -2
- package/src/commands/profile-sync.ts +5 -3
- package/src/commands/provider-credentials.ts +52 -6
- package/src/commands/runner.ts +196 -56
- package/src/e2b/env.ts +5 -0
- package/src/extensions/contract-types.generated.ts +1 -1
- package/src/extensions/contract.ts +45 -0
- package/src/extensions/dispatcher.ts +7 -0
- package/src/extensions/post-bridge.ts +40 -0
- package/src/github/handlers.ts +11 -4
- package/src/heartbeat/templates.ts +8 -5
- package/src/hooks/hook.ts +0 -26
- package/src/http/all-routes.ts +0 -1
- package/src/http/config.ts +36 -17
- package/src/http/core.ts +4 -0
- package/src/http/index.ts +14 -2
- package/src/http/integrations.ts +88 -1
- package/src/http/mcp-oauth.ts +6 -13
- package/src/http/mcp.ts +15 -5
- package/src/http/page-proxy.ts +2 -4
- package/src/http/pages-public.ts +6 -5
- package/src/http/pages.ts +5 -14
- package/src/http/poll.ts +28 -68
- package/src/http/requested-by.ts +54 -0
- package/src/http/route-def.ts +7 -6
- package/src/http/script-connection-proxy.ts +51 -4
- package/src/http/script-connections.ts +5 -2
- package/src/http/scripts.ts +1 -0
- package/src/http/session-cost-recompute.ts +12 -2
- package/src/http/session-data.ts +4 -0
- package/src/http/stats.ts +1 -30
- package/src/http/tasks.ts +61 -5
- package/src/http/utils.ts +14 -0
- package/src/http/webhooks.ts +183 -2
- package/src/http/x.ts +1 -0
- package/src/integrations/chat-sdk/adapters.ts +129 -0
- package/src/integrations/chat-sdk/attachments.ts +232 -0
- package/src/integrations/chat-sdk/background.ts +36 -0
- package/src/integrations/chat-sdk/commands.ts +194 -0
- package/src/integrations/chat-sdk/config.ts +198 -0
- package/src/integrations/chat-sdk/discord-api.ts +63 -0
- package/src/integrations/chat-sdk/discord-gateway.ts +185 -0
- package/src/integrations/chat-sdk/handlers.ts +28 -0
- package/src/integrations/chat-sdk/inbound.ts +426 -0
- package/src/integrations/chat-sdk/limits.ts +48 -0
- package/src/integrations/chat-sdk/logger.ts +81 -0
- package/src/integrations/chat-sdk/outbound.ts +123 -0
- package/src/integrations/chat-sdk/relay.ts +172 -0
- package/src/integrations/chat-sdk/router.ts +169 -0
- package/src/integrations/chat-sdk/runtime.ts +351 -0
- package/src/integrations/chat-sdk/schema.ts +245 -0
- package/src/integrations/chat-sdk/state.ts +243 -0
- package/src/integrations/chat-sdk/status.ts +244 -0
- package/src/integrations/chat-sdk/steering.ts +58 -0
- package/src/integrations/chat-sdk/teams-origin.ts +77 -0
- package/src/integrations/chat-sdk/telegram-api.ts +56 -0
- package/src/integrations/chat-sdk/templates.ts +16 -0
- package/src/integrations/chat-sdk/test-hooks.ts +37 -0
- package/src/integrations/chat-sdk/thread-buffer.ts +100 -0
- package/src/integrations/chat-sdk/typing.ts +65 -0
- package/src/jira/adf.ts +3 -1
- package/src/kv-reserved-namespaces.ts +2 -0
- package/src/oauth/mcp-wrapper.ts +10 -6
- package/src/otel-impl.ts +2 -1
- package/src/pages/version.ts +4 -5
- package/src/prompts/base-prompt.ts +111 -45
- package/src/providers/acp-target-catalog.ts +6 -0
- package/src/providers/acp-targets.ts +56 -3
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/claude-adapter.ts +27 -2
- package/src/providers/claude-flag-settings.ts +133 -0
- package/src/providers/claude-managed-adapter.ts +1 -1
- package/src/providers/claude-sdk-session.ts +7 -0
- package/src/providers/claude-session-events.ts +6 -1
- package/src/providers/dsh-adapter.ts +1 -1
- package/src/providers/opencode-adapter.ts +268 -37
- package/src/providers/opencode-billing.ts +86 -0
- package/src/providers/opencode-swarm-plugin.ts +51 -0
- package/src/providers/pi-mono-adapter.ts +398 -153
- package/src/providers/pricing-sources.md +37 -3
- package/src/providers/reasoning-effort.ts +27 -0
- package/src/providers/types.ts +11 -2
- package/src/rbac/legacy-policy.ts +8 -2
- package/src/rbac/permissions.ts +21 -0
- package/src/scheduler/scheduler.ts +4 -2
- package/src/scripts-runtime/api-client.ts +15 -1
- package/src/scripts-runtime/api-types.ts +9 -1
- package/src/scripts-runtime/ctx.ts +1 -1
- package/src/scripts-runtime/loader.ts +19 -7
- package/src/scripts-runtime/mcp-client.ts +30 -19
- package/src/scripts-runtime/sdk-allowlist.ts +8 -6
- package/src/scripts-runtime/swarm-sdk.ts +0 -11
- package/src/scripts-runtime/types/stdlib.d.ts +27 -15
- package/src/scripts-runtime/types/swarm-extension.d.ts +63 -1
- package/src/scripts-runtime/types/swarm-sdk.d.ts +27 -15
- package/src/server.ts +52 -18
- package/src/slack/actions.ts +29 -1
- package/src/slack/app.ts +14 -2
- package/src/slack/assistant.ts +36 -2
- package/src/slack/channel-join.ts +3 -16
- package/src/slack/commands.ts +9 -1
- package/src/slack/event-dedup.ts +1 -1
- package/src/slack/external-channel-egress.ts +113 -0
- package/src/slack/external-channel.ts +309 -0
- package/src/slack/handlers.ts +61 -0
- package/src/slack/render-v2.ts +40 -47
- package/src/slack/work-objects.ts +5 -0
- package/src/tasks/additive-buffer.ts +4 -2
- package/src/tasks/context-key.ts +94 -2
- package/src/tasks/model-pin.ts +67 -0
- package/src/tasks/worker-follow-up.ts +4 -31
- package/src/telemetry.ts +2 -1
- package/src/tests/acp-adapter.test.ts +42 -0
- package/src/tests/api-drain-worker-e2e.test.ts +1 -6
- package/src/tests/apps-catalog-feedback.test.ts +310 -0
- package/src/tests/apps-catalog-inputs.test.ts +70 -0
- package/src/tests/apps-catalog-table.test.ts +113 -0
- package/src/tests/azure-devops-boards-sync.test.ts +584 -0
- package/src/tests/azure-devops-html.test.ts +13 -0
- package/src/tests/azure-devops-webhook-malformed.test.ts +4 -0
- package/src/tests/base-prompt.test.ts +58 -54
- package/src/tests/chat-sdk-commands.test.ts +191 -0
- package/src/tests/chat-sdk-config.test.ts +334 -0
- package/src/tests/chat-sdk-discord-api.test.ts +68 -0
- package/src/tests/chat-sdk-discord-gateway.test.ts +252 -0
- package/src/tests/chat-sdk-discord-webhook.test.ts +126 -0
- package/src/tests/chat-sdk-fields-sync.test.ts +50 -0
- package/src/tests/chat-sdk-harness.ts +146 -0
- package/src/tests/chat-sdk-inbound.test.ts +363 -0
- package/src/tests/chat-sdk-relay.test.ts +470 -0
- package/src/tests/chat-sdk-reload.test.ts +128 -0
- package/src/tests/chat-sdk-shutdown.test.ts +220 -0
- package/src/tests/chat-sdk-slack.test.ts +268 -0
- package/src/tests/chat-sdk-state.test.ts +163 -0
- package/src/tests/chat-sdk-status-route.test.ts +382 -0
- package/src/tests/chat-sdk-teams.test.ts +277 -0
- package/src/tests/chat-sdk-tools.test.ts +520 -0
- package/src/tests/chat-sdk-typing.test.ts +120 -0
- package/src/tests/chat-sdk-webhook-telegram.test.ts +200 -0
- package/src/tests/claude-adapter-binary.test.ts +144 -0
- package/src/tests/claude-flag-settings.test.ts +114 -0
- package/src/tests/claude-managed-adapter.test.ts +1 -1
- package/src/tests/claude-sdk-lifecycle.test.ts +148 -1
- package/src/tests/claude-sdk-process.fixture.ts +7 -0
- package/src/tests/claude-thinking-tokens.test.ts +57 -0
- package/src/tests/claude-worker-parity.test.ts +2 -7
- package/src/tests/config-env-export-chat-sdk.test.ts +11 -0
- package/src/tests/config-refs.test.ts +66 -0
- package/src/tests/context-key.test.ts +51 -0
- package/src/tests/cors-allowlist.test.ts +25 -0
- package/src/tests/create-page-tool.test.ts +18 -0
- package/src/tests/credential-check.test.ts +139 -0
- package/src/tests/credentials.test.ts +21 -0
- package/src/tests/db-runtime.test.ts +61 -0
- package/src/tests/db-task-read-contract.test.ts +20 -0
- package/src/tests/db-task-write-contract.test.ts +10 -0
- package/src/tests/deferred-task-wake.test.ts +52 -4
- package/src/tests/docs-index-footprint.test.js +3 -3
- package/src/tests/dsh-adapter.test.ts +1 -1
- package/src/tests/enabled-capabilities.test.ts +20 -0
- package/src/tests/entrypoint-api-readiness.test.ts +14 -8
- package/src/tests/entrypoint-config-env-export.test.ts +5 -2
- package/src/tests/entrypoint-export-to-env.test.ts +78 -0
- package/src/tests/explicit-model-validation.test.ts +105 -1
- package/src/tests/extensions-example-route-chat-channel.test.ts +154 -0
- package/src/tests/extensions-post-bridge.test.ts +51 -0
- package/src/tests/fetch-resolved-env.test.ts +128 -0
- package/src/tests/fixtures/azure-boards/workitem.commented.json +89 -0
- package/src/tests/fixtures/azure-boards/workitem.created.json +81 -0
- package/src/tests/fixtures/azure-boards/workitem.deleted.json +70 -0
- package/src/tests/fixtures/azure-boards/workitem.restored.json +82 -0
- package/src/tests/fixtures/azure-boards/workitem.updated.json +130 -0
- package/src/tests/fixtures/catalog-feedback-definition.json.txt +860 -0
- package/src/tests/fixtures/catalog-inputs-definition.json.txt +910 -0
- package/src/tests/fixtures/catalog-table-definition.json.txt +468 -0
- package/src/tests/fixtures/chat-sdk/telegram-private-text.json +10 -0
- package/src/tests/fixtures/extensions/route-chat-channel-to-agent/hooks.ts +27 -0
- package/src/tests/fixtures/extensions/route-chat-channel-to-agent/manifest.json +9 -0
- package/src/tests/fixtures/openai-compatible-registry-extension.child.ts +146 -0
- package/src/tests/fixtures/runner-identity-refresh.ts +3 -0
- package/src/tests/fixtures/runner-legacy-resume-prompt.ts +122 -0
- package/src/tests/github-handlers.test.ts +35 -0
- package/src/tests/harness-provider-resolution.test.ts +12 -0
- package/src/tests/heartbeat-checklist.test.ts +3 -2
- package/src/tests/hook-runtime-close.test.ts +0 -2
- package/src/tests/http-api-integration.test.ts +0 -25
- package/src/tests/migration-046-budgets.test.ts +17 -16
- package/src/tests/migration-217-chat-sdk-state.test.ts +113 -0
- package/src/tests/model-tier-resolution.test.ts +93 -0
- package/src/tests/models-catalog.test.ts +42 -1
- package/src/tests/node-env-runtime.test.ts +98 -0
- package/src/tests/openai-compatible-providers.test.ts +134 -0
- package/src/tests/openai-compatible-registry-extension.test.ts +42 -0
- package/src/tests/opencode-adapter.test.ts +348 -3
- package/src/tests/opencode-billing.test.ts +28 -0
- package/src/tests/opencode-helmcode-sdk.test.ts +201 -0
- package/src/tests/opencode-shell-env.test.ts +145 -0
- package/src/tests/openrouter-base-url.test.ts +101 -151
- package/src/tests/page-proxy.test.ts +1 -1
- package/src/tests/pages-browser-sdk.test.ts +76 -0
- package/src/tests/pages-feedback.test.ts +1 -1
- package/src/tests/paused-tasks-requested-by.test.ts +102 -0
- package/src/tests/pi-custom-provider-fake-server.test.ts +442 -0
- package/src/tests/pi-mono-adapter.test.ts +385 -5
- package/src/tests/pi-shell-env.test.ts +170 -0
- package/src/tests/prompt-template-remaining.test.ts +35 -0
- package/src/tests/rbac-engine.test.ts +11 -3
- package/src/tests/runner-exit-after-tasks.test.ts +0 -4
- package/src/tests/runner-identity-refresh.test.ts +3 -0
- package/src/tests/runner-legacy-resume-prompt.test.ts +64 -0
- package/src/tests/script-connections-sql.test.ts +675 -0
- package/src/tests/script-connections.test.ts +7 -1
- package/src/tests/scripts-http.test.ts +201 -1
- package/src/tests/scripts-only-gating.test.ts +2 -3
- package/src/tests/scripts-runtime.test.ts +58 -40
- package/src/tests/secret-scrubber.test.ts +86 -0
- package/src/tests/seed-skills-bundled-files.test.ts +45 -53
- package/src/tests/seed-skills-retire.test.ts +182 -0
- package/src/tests/send-task-requester-gate.test.ts +58 -0
- package/src/tests/session-cost-recompute-unit.test.ts +94 -0
- package/src/tests/skill-get-name-resolution.test.ts +137 -0
- package/src/tests/slack-channel-join.test.ts +4 -1
- package/src/tests/slack-external-channel-config.test.ts +65 -0
- package/src/tests/slack-external-channel-egress.test.ts +237 -0
- package/src/tests/slack-external-channel-guard.test.ts +280 -0
- package/src/tests/slack-external-channel-tools.test.ts +173 -0
- package/src/tests/slack-external-channel.test.ts +370 -0
- package/src/tests/slack-render-v2.test.ts +86 -10
- package/src/tests/sonnet-5-5-registry.test.ts +9 -1
- package/src/tests/spec-base-url.test.ts +16 -1
- package/src/tests/swarm-config-export-to-env.test.ts +267 -0
- package/src/tests/swarm-config-reserved-keys.test.ts +16 -0
- package/src/tests/swarm-diff.test.ts +1 -1
- package/src/tests/task-model-effort-rerun.test.ts +164 -0
- package/src/tests/task-session-prompts.test.ts +132 -0
- package/src/tests/task-tool-manifest.test.ts +14 -0
- package/src/tests/task-tools-ctx.test.ts +2 -0
- package/src/tests/tool-annotations.test.ts +6 -6
- package/src/tests/ui-logs-parser.test.ts +43 -0
- package/src/tests/used-by-route.test.ts +6 -0
- package/src/tests/vendored-openapi.test.ts +16 -1
- package/src/tests/vercel-ai-gateway.test.ts +149 -0
- package/src/tests/workflow-swarm-script.test.ts +38 -0
- package/src/tests/workflow-wait-filter.test.ts +5 -3
- package/src/tools/chat-access.ts +41 -0
- package/src/tools/chat-open-dm.ts +59 -0
- package/src/tools/chat-post.ts +74 -0
- package/src/tools/chat-read-thread.ts +100 -0
- package/src/tools/chat-reply.ts +75 -0
- package/src/tools/create-page.ts +3 -13
- package/src/tools/defer-task.ts +17 -0
- package/src/tools/model-catalog/index.ts +2 -1
- package/src/tools/register-chat-channel.ts +139 -0
- package/src/tools/send-task.ts +24 -0
- package/src/tools/skills/skill-get.ts +17 -9
- package/src/tools/slack-post.ts +6 -0
- package/src/tools/slack-read.ts +8 -0
- package/src/tools/slack-reply.ts +6 -0
- package/src/tools/slack-start-thread.ts +6 -0
- package/src/tools/slack-update.ts +6 -0
- package/src/tools/slack-upload-file.ts +6 -0
- package/src/tools/swarm-config/get-config.ts +2 -1
- package/src/tools/swarm-config/list-config.ts +2 -1
- package/src/tools/swarm-config/set-config.ts +16 -3
- package/src/tools/tool-config.ts +8 -6
- package/src/types.ts +12 -2
- package/src/utils/config-env-export.ts +74 -0
- package/src/utils/credentials.test.ts +92 -0
- package/src/utils/credentials.ts +52 -4
- package/src/utils/harness-provider.ts +15 -6
- package/src/utils/node-env.ts +24 -0
- package/src/utils/runtime-model-catalog.ts +11 -1
- package/src/utils/secret-scrubber.ts +71 -2
- package/src/utils/task-tool-manifest.ts +19 -2
- package/src/workflows/executors/swarm-script.ts +1 -0
- package/templates/skills/agent-browser/SKILL.md +1 -1
- package/templates/skills/agent-browser/content.md +1 -1
- package/templates/skills/apps/SKILL.md +749 -0
- package/templates/skills/apps/content.md +60 -22
- package/templates/skills/chat-sdk/config.json +14 -0
- package/templates/skills/chat-sdk/content.md +84 -0
- package/templates/skills/composio-gmail/content.md +7 -0
- package/templates/skills/composio-google-docs/content.md +1 -1
- package/templates/skills/email-domain-health/config.json +14 -0
- package/templates/skills/email-domain-health/content.md +131 -0
- package/templates/skills/kv-storage/content.md +2 -2
- package/templates/skills/pages/content.md +8 -10
- package/templates/skills/qa-loom/config.json +14 -0
- package/templates/skills/qa-loom/content.md +187 -0
- package/templates/skills/qa-loom/files/build-loom.mjs +221 -0
- package/templates/skills/qa-loom/files/run-qa.sh +57 -0
- package/templates/skills/slack-interaction/content.md +4 -0
- package/templates/skills/swarm-extensions/content.md +2 -0
- package/templates/skills/swarm-scripts/SKILL.md +4 -2
- package/templates/skills/swarm-scripts/config.json +1 -1
- package/templates/skills/swarm-scripts/content.md +4 -2
- package/templates/skills/workflow-iterate/content.md +38 -0
- package/dist/artifact-eczsknc3.js +0 -3843
- package/dist/cli-9xsmdpdt.js +0 -56377
- package/dist/cli-bd957dgb.js +0 -153
- package/dist/cli-q51yprfq.js +0 -1104
- package/dist/cli-t1ze64h3.js +0 -811
- package/dist/index-9ch1n761.js +0 -1102
- package/src/artifact-sdk/index.ts +0 -2
- package/src/artifact-sdk/localtunnel.d.ts +0 -20
- package/src/artifact-sdk/port.ts +0 -12
- package/src/artifact-sdk/server.ts +0 -183
- package/src/artifact-sdk/tunnel.ts +0 -19
- package/src/commands/artifact.ts +0 -249
- package/src/http/ecosystem.ts +0 -77
- package/src/tests/artifact-commands.test.ts +0 -92
- package/src/tests/artifact-sdk.test.ts +0 -793
- package/src/tests/register-service-security.test.ts +0 -194
- package/src/tools/list-services.ts +0 -107
- package/src/tools/register-service.ts +0 -177
- package/src/tools/unregister-service.ts +0 -73
- package/src/tools/update-service-status.ts +0 -96
- package/templates/skills/artifacts/config.json +0 -14
- package/templates/skills/artifacts/content.md +0 -344
- package/templates/skills/artifacts/files/examples/approval-flow.ts +0 -34
- package/templates/skills/artifacts/files/examples/hono-dashboard.ts +0 -31
- package/templates/skills/artifacts/files/examples/multi-artifact.ts +0 -20
- package/templates/skills/artifacts/files/examples/static-report.sh +0 -17
- package/dist/{azure-openai-responses-ap1gwxgr.js → azure-openai-responses-ygfreq4t.js} +5 -5
- package/dist/{cli-5rqrj7q0.js → cli-pw7ebjdt.js} +0 -0
- package/dist/{openai-codex-responses-33qhkkdy.js → openai-codex-responses-3bk0grnr.js} +4 -4
- package/dist/{openai-completions-s88xm3ns.js → openai-completions-5d4jpakc.js} +9 -9
- package/dist/{openai-responses-7xd2f2e2.js → openai-responses-krb51f59.js} +5 -5
- package/dist/{pi-messages-xszk613n.js → pi-messages-x9gzynm1.js} +3 -3
- /package/src/{artifact-sdk → pages}/browser-sdk.ts +0 -0
- /package/src/{artifact-sdk → pages}/feedback-overlay.ts +0 -0
package/src/be/db/tasks/read.ts
CHANGED
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
RoutingAffinitySchema,
|
|
21
21
|
} from "../../../types";
|
|
22
22
|
import { parseProviderMeta } from "../../../utils/provider-metadata";
|
|
23
|
+
import { scrubSecrets } from "../../../utils/secret-scrubber";
|
|
23
24
|
import { getAgentById } from "../agents";
|
|
24
25
|
import { getDbClient } from "../runtime";
|
|
25
26
|
|
|
@@ -87,6 +88,7 @@ export type AgentTaskRow = {
|
|
|
87
88
|
model: string | null;
|
|
88
89
|
modelTier: string | null;
|
|
89
90
|
effort: string | null;
|
|
91
|
+
resolvedEffort?: string | null;
|
|
90
92
|
resolvedModel?: string | null;
|
|
91
93
|
modelSource?: string | null;
|
|
92
94
|
modelAlias?: string | null;
|
|
@@ -154,6 +156,7 @@ type AgentTaskSummaryRow = Pick<
|
|
|
154
156
|
| "modelSource"
|
|
155
157
|
| "modelAlias"
|
|
156
158
|
| "effort"
|
|
159
|
+
| "resolvedEffort"
|
|
157
160
|
| "provider"
|
|
158
161
|
| "requestedByUserId"
|
|
159
162
|
| "progress"
|
|
@@ -207,6 +210,7 @@ const LIST_COLUMNS = {
|
|
|
207
210
|
agent_tasks.offeredTo, agent_tasks.acceptedAt, agent_tasks.parentTaskId,
|
|
208
211
|
agent_tasks.scheduleId, agent_tasks.model, agent_tasks.modelTier,
|
|
209
212
|
agent_tasks.resolvedModel, agent_tasks.modelSource, agent_tasks.modelAlias, agent_tasks.effort,
|
|
213
|
+
agent_tasks.resolvedEffort,
|
|
210
214
|
agent_tasks.provider, agent_tasks.requestedByUserId, agent_tasks.progress,
|
|
211
215
|
agent_tasks.createdAt, agent_tasks.lastUpdatedAt, agent_tasks.finishedAt,
|
|
212
216
|
agent_tasks.peakContextPercent`,
|
|
@@ -315,6 +319,9 @@ export function rowToAgentTask(row: AgentTaskRow): AgentTask {
|
|
|
315
319
|
effort: ReasoningEffortSchema.safeParse(row.effort).success
|
|
316
320
|
? (row.effort as ReasoningEffort)
|
|
317
321
|
: undefined,
|
|
322
|
+
resolvedEffort: ReasoningEffortSchema.safeParse(row.resolvedEffort).success
|
|
323
|
+
? (row.resolvedEffort as ReasoningEffort)
|
|
324
|
+
: undefined,
|
|
318
325
|
scheduleId: row.scheduleId ?? undefined,
|
|
319
326
|
workflowRunId: row.workflowRunId ?? undefined,
|
|
320
327
|
workflowRunStepId: row.workflowRunStepId ?? undefined,
|
|
@@ -381,6 +388,9 @@ export function rowToAgentTaskSummary(row: AgentTaskSummaryRow): AgentTaskSummar
|
|
|
381
388
|
effort: ReasoningEffortSchema.safeParse(row.effort).success
|
|
382
389
|
? (row.effort as ReasoningEffort)
|
|
383
390
|
: undefined,
|
|
391
|
+
resolvedEffort: ReasoningEffortSchema.safeParse(row.resolvedEffort).success
|
|
392
|
+
? (row.resolvedEffort as ReasoningEffort)
|
|
393
|
+
: undefined,
|
|
384
394
|
provider: (row.provider as ProviderName | null) ?? undefined,
|
|
385
395
|
requestedByUserId: row.requestedByUserId ?? undefined,
|
|
386
396
|
progress: row.progress ?? undefined,
|
|
@@ -1035,6 +1045,163 @@ export async function markFinalizedSlackRelaysDelivered(): Promise<number> {
|
|
|
1035
1045
|
return result.changes;
|
|
1036
1046
|
}
|
|
1037
1047
|
|
|
1048
|
+
/** Pending Chat SDK relay row: the terminal task plus its obligation bookkeeping. */
|
|
1049
|
+
export interface PendingChatRelay {
|
|
1050
|
+
task: AgentTask;
|
|
1051
|
+
createdAt: string;
|
|
1052
|
+
lastError: string | null;
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
/**
|
|
1056
|
+
* Backoff gate for a chat relay obligation: eligible when never attempted, or
|
|
1057
|
+
* when `min(3 s * 2^attempt_count, 10 min)` passed since `last_attempt_at`.
|
|
1058
|
+
* `attempt_count >= 8` is already past the cap (3 s * 2^8 = 768 s). The one
|
|
1059
|
+
* parameter is the reference time as ISO text.
|
|
1060
|
+
*/
|
|
1061
|
+
const CHAT_RELAY_ELIGIBLE_SQL = `(obligation.last_attempt_at IS NULL
|
|
1062
|
+
OR (julianday(?) - julianday(obligation.last_attempt_at)) * 86400000.0 >=
|
|
1063
|
+
CASE WHEN obligation.attempt_count >= 8 THEN 600000
|
|
1064
|
+
ELSE 3000 * (1 << obligation.attempt_count) END)`;
|
|
1065
|
+
|
|
1066
|
+
/**
|
|
1067
|
+
* Terminal chat tasks whose relay obligation is pending, out of backoff at
|
|
1068
|
+
* `now`, and whose `task:chat-sdk:<adapter>:` contextKey names one of
|
|
1069
|
+
* `adapters` (the adapters that are running). Rows of other adapters are left
|
|
1070
|
+
* out of the query, so a stopped adapter cannot fill the window and starve the
|
|
1071
|
+
* healthy ones. Returns no rows when `adapters` is empty. Never-attempted rows
|
|
1072
|
+
* sort first, then the oldest attempts. A contextKey that does not parse as a
|
|
1073
|
+
* chat key is not selected here; `giveUpStaleChatRelays` retires such rows once
|
|
1074
|
+
* they age out.
|
|
1075
|
+
*/
|
|
1076
|
+
export async function getPendingChatRelayTasks(
|
|
1077
|
+
now: number = Date.now(),
|
|
1078
|
+
limit = 200,
|
|
1079
|
+
adapters: readonly string[] = [],
|
|
1080
|
+
): Promise<PendingChatRelay[]> {
|
|
1081
|
+
if (adapters.length === 0) return [];
|
|
1082
|
+
for (const adapter of adapters) {
|
|
1083
|
+
if (!/^[a-z]+$/.test(adapter)) throw new Error(`invalid chat adapter name: ${adapter}`);
|
|
1084
|
+
}
|
|
1085
|
+
const adapterFilter = adapters.map(() => "task.contextKey GLOB ?").join(" OR ");
|
|
1086
|
+
const rows = await getDbClient().query<
|
|
1087
|
+
AgentTaskRow & {
|
|
1088
|
+
relay_created_at: string;
|
|
1089
|
+
relay_last_error: string | null;
|
|
1090
|
+
}
|
|
1091
|
+
>(
|
|
1092
|
+
`SELECT task.*,
|
|
1093
|
+
obligation.created_at AS relay_created_at,
|
|
1094
|
+
obligation.last_error AS relay_last_error
|
|
1095
|
+
FROM chat_relay_obligations obligation
|
|
1096
|
+
JOIN agent_tasks task ON task.id = obligation.task_id
|
|
1097
|
+
WHERE obligation.delivered_at IS NULL
|
|
1098
|
+
AND obligation.given_up_at IS NULL
|
|
1099
|
+
AND task.status IN ('completed', 'failed', 'cancelled')
|
|
1100
|
+
AND (${adapterFilter})
|
|
1101
|
+
AND ${CHAT_RELAY_ELIGIBLE_SQL}
|
|
1102
|
+
ORDER BY obligation.last_attempt_at IS NOT NULL,
|
|
1103
|
+
obligation.last_attempt_at ASC,
|
|
1104
|
+
obligation.created_at ASC
|
|
1105
|
+
LIMIT ?`,
|
|
1106
|
+
[
|
|
1107
|
+
...adapters.map((adapter) => `task:chat-sdk:${adapter}:*`),
|
|
1108
|
+
new Date(now).toISOString(),
|
|
1109
|
+
limit,
|
|
1110
|
+
],
|
|
1111
|
+
);
|
|
1112
|
+
return rows.map((row) => ({
|
|
1113
|
+
task: rowToAgentTask(row),
|
|
1114
|
+
createdAt: row.relay_created_at,
|
|
1115
|
+
lastError: row.relay_last_error,
|
|
1116
|
+
}));
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
/**
|
|
1120
|
+
* Give up every pending chat relay obligation created more than `olderThanMs`
|
|
1121
|
+
* before `now`, whatever the adapter state. Returns how many rows were retired.
|
|
1122
|
+
*/
|
|
1123
|
+
export async function giveUpStaleChatRelays(now: number, olderThanMs: number): Promise<number> {
|
|
1124
|
+
const at = new Date(now).toISOString();
|
|
1125
|
+
const cutoff = new Date(now - olderThanMs).toISOString();
|
|
1126
|
+
const result = await getDbClient().run(
|
|
1127
|
+
`UPDATE chat_relay_obligations
|
|
1128
|
+
SET given_up_at = ?, last_error = 'gave up: older than 24h', updated_at = ?
|
|
1129
|
+
WHERE delivered_at IS NULL AND given_up_at IS NULL AND created_at < ?`,
|
|
1130
|
+
[at, at, cutoff],
|
|
1131
|
+
);
|
|
1132
|
+
return result.changes;
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
/**
|
|
1136
|
+
* Claim a chat relay row before the send: bump `attempt_count` and set
|
|
1137
|
+
* `last_attempt_at`. Conditional on the row still being pending and out of
|
|
1138
|
+
* backoff, so two concurrent ticks cannot both send. Returns true when claimed.
|
|
1139
|
+
*/
|
|
1140
|
+
export async function markChatRelayAttempted(
|
|
1141
|
+
taskId: string,
|
|
1142
|
+
now: number = Date.now(),
|
|
1143
|
+
): Promise<boolean> {
|
|
1144
|
+
const at = new Date(now).toISOString();
|
|
1145
|
+
const result = await getDbClient().run(
|
|
1146
|
+
`UPDATE chat_relay_obligations AS obligation
|
|
1147
|
+
SET attempt_count = attempt_count + 1,
|
|
1148
|
+
last_attempt_at = ?,
|
|
1149
|
+
updated_at = ?
|
|
1150
|
+
WHERE task_id = ?
|
|
1151
|
+
AND delivered_at IS NULL
|
|
1152
|
+
AND given_up_at IS NULL
|
|
1153
|
+
AND ${CHAT_RELAY_ELIGIBLE_SQL}`,
|
|
1154
|
+
[at, at, taskId, at],
|
|
1155
|
+
);
|
|
1156
|
+
return result.changes > 0;
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
/** Record why the last chat relay attempt failed. The text is scrubbed before it is stored. */
|
|
1160
|
+
export async function recordChatRelayError(
|
|
1161
|
+
taskId: string,
|
|
1162
|
+
error: string,
|
|
1163
|
+
now: number = Date.now(),
|
|
1164
|
+
): Promise<boolean> {
|
|
1165
|
+
const result = await getDbClient().run(
|
|
1166
|
+
`UPDATE chat_relay_obligations
|
|
1167
|
+
SET last_error = ?, updated_at = ?
|
|
1168
|
+
WHERE task_id = ? AND delivered_at IS NULL`,
|
|
1169
|
+
[scrubSecrets(error), new Date(now).toISOString(), taskId],
|
|
1170
|
+
);
|
|
1171
|
+
return result.changes > 0;
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
/** Mark a chat relay obligation delivered after the platform accepted every chunk. Idempotent. */
|
|
1175
|
+
export async function markChatRelayDelivered(
|
|
1176
|
+
taskId: string,
|
|
1177
|
+
now: number = Date.now(),
|
|
1178
|
+
): Promise<boolean> {
|
|
1179
|
+
const at = new Date(now).toISOString();
|
|
1180
|
+
const result = await getDbClient().run(
|
|
1181
|
+
`UPDATE chat_relay_obligations
|
|
1182
|
+
SET delivered_at = ?, updated_at = ?
|
|
1183
|
+
WHERE task_id = ? AND delivered_at IS NULL`,
|
|
1184
|
+
[at, at, taskId],
|
|
1185
|
+
);
|
|
1186
|
+
return result.changes > 0;
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
/** Stop retrying a chat relay obligation. The reason is scrubbed before it is stored. */
|
|
1190
|
+
export async function markChatRelayGivenUp(
|
|
1191
|
+
taskId: string,
|
|
1192
|
+
error: string,
|
|
1193
|
+
now: number = Date.now(),
|
|
1194
|
+
): Promise<boolean> {
|
|
1195
|
+
const at = new Date(now).toISOString();
|
|
1196
|
+
const result = await getDbClient().run(
|
|
1197
|
+
`UPDATE chat_relay_obligations
|
|
1198
|
+
SET given_up_at = ?, last_error = ?, updated_at = ?
|
|
1199
|
+
WHERE task_id = ? AND delivered_at IS NULL AND given_up_at IS NULL`,
|
|
1200
|
+
[at, scrubSecrets(error), at, taskId],
|
|
1201
|
+
);
|
|
1202
|
+
return result.changes > 0;
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1038
1205
|
/**
|
|
1039
1206
|
* Get tasks that were recently finished (completed/failed) by workers (non-lead agents).
|
|
1040
1207
|
* Used by leads to know when workers complete tasks.
|
|
@@ -1334,6 +1501,69 @@ export async function getLatestLeadTaskInThread(
|
|
|
1334
1501
|
return row ? rowToAgentTask(row) : null;
|
|
1335
1502
|
}
|
|
1336
1503
|
|
|
1504
|
+
/**
|
|
1505
|
+
* ContextKey twins of the Slack thread lookups above, for channels that key a
|
|
1506
|
+
* conversation by `contextKey` only (Chat SDK). `source` narrows to the
|
|
1507
|
+
* channel's ingress tasks, as the Slack twins do with `source = 'slack'`:
|
|
1508
|
+
* follow-ups and delegated worker tasks inherit the parent's contextKey.
|
|
1509
|
+
* All three use `idx_agent_tasks_context_key_status`.
|
|
1510
|
+
*/
|
|
1511
|
+
export async function getAgentWorkingOnContextKey(
|
|
1512
|
+
contextKey: string,
|
|
1513
|
+
source?: string,
|
|
1514
|
+
): Promise<Agent | null> {
|
|
1515
|
+
const taskRow = await getDbClient().get<AgentTaskRow>(
|
|
1516
|
+
`SELECT agentId FROM agent_tasks
|
|
1517
|
+
WHERE contextKey = ?
|
|
1518
|
+
AND (? IS NULL OR source = ?)
|
|
1519
|
+
ORDER BY createdAt DESC, rowid DESC
|
|
1520
|
+
LIMIT 1`,
|
|
1521
|
+
[contextKey, source ?? null, source ?? null],
|
|
1522
|
+
);
|
|
1523
|
+
|
|
1524
|
+
if (taskRow?.agentId) return getAgentById(taskRow.agentId);
|
|
1525
|
+
|
|
1526
|
+
return null;
|
|
1527
|
+
}
|
|
1528
|
+
|
|
1529
|
+
/** Latest `in_progress` or `pending` task on a contextKey (dependency chaining). */
|
|
1530
|
+
export async function getLatestActiveTaskByContextKey(
|
|
1531
|
+
contextKey: string,
|
|
1532
|
+
source?: string,
|
|
1533
|
+
): Promise<AgentTask | null> {
|
|
1534
|
+
const row = await getDbClient().get<AgentTaskRow>(
|
|
1535
|
+
`SELECT * FROM agent_tasks
|
|
1536
|
+
WHERE contextKey = ?
|
|
1537
|
+
AND (? IS NULL OR source = ?)
|
|
1538
|
+
AND status IN ('in_progress', 'pending')
|
|
1539
|
+
ORDER BY createdAt DESC, rowid DESC
|
|
1540
|
+
LIMIT 1`,
|
|
1541
|
+
[contextKey, source ?? null, source ?? null],
|
|
1542
|
+
);
|
|
1543
|
+
|
|
1544
|
+
return row ? rowToAgentTask(row) : null;
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
/** Latest task assigned to a lead agent on a contextKey (the steering target). */
|
|
1548
|
+
export async function getLatestLeadTaskByContextKey(
|
|
1549
|
+
contextKey: string,
|
|
1550
|
+
source?: string,
|
|
1551
|
+
): Promise<AgentTask | null> {
|
|
1552
|
+
const row = await getDbClient().get<AgentTaskRow>(
|
|
1553
|
+
`SELECT t.*
|
|
1554
|
+
FROM agent_tasks t
|
|
1555
|
+
JOIN agents a ON a.id = t.agentId
|
|
1556
|
+
WHERE t.contextKey = ?
|
|
1557
|
+
AND (? IS NULL OR t.source = ?)
|
|
1558
|
+
AND a.isLead = 1
|
|
1559
|
+
ORDER BY t.createdAt DESC, t.rowid DESC
|
|
1560
|
+
LIMIT 1`,
|
|
1561
|
+
[contextKey, source ?? null, source ?? null],
|
|
1562
|
+
);
|
|
1563
|
+
|
|
1564
|
+
return row ? rowToAgentTask(row) : null;
|
|
1565
|
+
}
|
|
1566
|
+
|
|
1337
1567
|
/**
|
|
1338
1568
|
* Find the most recent task in a Slack thread, regardless of source or status.
|
|
1339
1569
|
* Unlike getAgentWorkingOnThread (which filters source='slack'), this finds ALL tasks
|
package/src/be/db/tasks/write.ts
CHANGED
|
@@ -8,6 +8,7 @@ import type {
|
|
|
8
8
|
AgentTask,
|
|
9
9
|
AgentTaskSource,
|
|
10
10
|
ProviderName,
|
|
11
|
+
ReasoningEffort,
|
|
11
12
|
RuntimePool,
|
|
12
13
|
TaskAttachment,
|
|
13
14
|
} from "../../../types";
|
|
@@ -312,6 +313,8 @@ export async function updateTaskClaudeSessionId(
|
|
|
312
313
|
model?: string,
|
|
313
314
|
harnessVariant?: string,
|
|
314
315
|
harnessVariantMeta?: Record<string, unknown>,
|
|
316
|
+
/** Effort the session runs at; null records that the harness default applied. */
|
|
317
|
+
resolvedEffort?: ReasoningEffort | null,
|
|
315
318
|
): Promise<AgentTask | null> {
|
|
316
319
|
const setClauses = ["claudeSessionId = ?", "lastUpdatedAt = ?"];
|
|
317
320
|
const params: (string | null)[] = [claudeSessionId, new Date().toISOString()];
|
|
@@ -336,6 +339,10 @@ export async function updateTaskClaudeSessionId(
|
|
|
336
339
|
setClauses.push("harnessVariantMeta = ?");
|
|
337
340
|
params.push(JSON.stringify(harnessVariantMeta));
|
|
338
341
|
}
|
|
342
|
+
if (resolvedEffort !== undefined) {
|
|
343
|
+
setClauses.push("resolvedEffort = ?");
|
|
344
|
+
params.push(resolvedEffort);
|
|
345
|
+
}
|
|
339
346
|
|
|
340
347
|
params.push(taskId);
|
|
341
348
|
|
package/src/be/db.ts
CHANGED
|
@@ -136,6 +136,12 @@ import {
|
|
|
136
136
|
CODEX_AUTH_WATCH_NAMESPACE,
|
|
137
137
|
codexAuthBenchMarkerKey,
|
|
138
138
|
} from "../utils/codex-auth-failure";
|
|
139
|
+
import {
|
|
140
|
+
defaultExportToEnv,
|
|
141
|
+
effectiveExportToEnv,
|
|
142
|
+
envExportRestrictedError,
|
|
143
|
+
isEnvExportRestrictedKey,
|
|
144
|
+
} from "../utils/config-env-export";
|
|
139
145
|
import { MASKED_SECRET_VALUE } from "../utils/config-secrets";
|
|
140
146
|
import { deriveProviderFromKeyType } from "../utils/credentials";
|
|
141
147
|
import type { RateLimitWindowTelemetry } from "../utils/error-tracker";
|
|
@@ -205,7 +211,12 @@ import { scrubJsonValue } from "./scrub-json";
|
|
|
205
211
|
import { openSealedJson, sealedJsonForDisplay, sealJson } from "./sealed-json";
|
|
206
212
|
import { configSecretName, registerStoredSecret } from "./secret-registry";
|
|
207
213
|
import { promotePendingSteeringForTask } from "./steering";
|
|
208
|
-
import {
|
|
214
|
+
import {
|
|
215
|
+
isInternalConfigKey,
|
|
216
|
+
isReservedConfigKey,
|
|
217
|
+
reservedKeyError,
|
|
218
|
+
teamsSdkEnvKeysSql,
|
|
219
|
+
} from "./swarm-config-guard";
|
|
209
220
|
import { emitTaskStarted } from "./task-lifecycle-events";
|
|
210
221
|
import { publishWorkerConfigNudge, publishWorkerNudge } from "./worker-nudges";
|
|
211
222
|
import { defineWorkflowPayload, type WorkflowPayloadView } from "./workflow-replay";
|
|
@@ -292,17 +303,21 @@ export {
|
|
|
292
303
|
findTaskByGitHub,
|
|
293
304
|
findTaskByVcs,
|
|
294
305
|
getAgentCurrentTask,
|
|
306
|
+
getAgentWorkingOnContextKey,
|
|
295
307
|
getAgentWorkingOnThread,
|
|
296
308
|
getAllTasks,
|
|
297
309
|
getChildTasks,
|
|
298
310
|
getCompletedSlackTasks,
|
|
299
311
|
getInProgressSlackTasks,
|
|
300
312
|
getInProgressTasksByContextKey,
|
|
313
|
+
getLatestActiveTaskByContextKey,
|
|
301
314
|
getLatestActiveTaskInThread,
|
|
315
|
+
getLatestLeadTaskByContextKey,
|
|
302
316
|
getLatestLeadTaskInThread,
|
|
303
317
|
getLatestScriptRunStepTaskByContextKey,
|
|
304
318
|
getLatestTaskByContextKey,
|
|
305
319
|
getMostRecentTaskInThread,
|
|
320
|
+
getPendingChatRelayTasks,
|
|
306
321
|
getPendingSlackRelayTasks,
|
|
307
322
|
getRecentlyFinishedWorkerTasks,
|
|
308
323
|
getSlackTasksMissingTree,
|
|
@@ -313,13 +328,19 @@ export {
|
|
|
313
328
|
getTasksByAgentId,
|
|
314
329
|
getTasksByStatus,
|
|
315
330
|
getTasksCount,
|
|
331
|
+
giveUpStaleChatRelays,
|
|
316
332
|
hasNonTerminalRerouteDecisionChild,
|
|
317
333
|
hasNonTerminalResumeChild,
|
|
318
334
|
isLinearTrackerContextKey,
|
|
335
|
+
markChatRelayAttempted,
|
|
336
|
+
markChatRelayDelivered,
|
|
337
|
+
markChatRelayGivenUp,
|
|
319
338
|
markFinalizedSlackRelaysDelivered,
|
|
320
339
|
markSlackRelayAttempted,
|
|
321
340
|
markSlackRelayDelivered,
|
|
322
341
|
markTasksNotified,
|
|
342
|
+
type PendingChatRelay,
|
|
343
|
+
recordChatRelayError,
|
|
323
344
|
resetTasksNotified,
|
|
324
345
|
type TaskFilters,
|
|
325
346
|
} from "./db/tasks/read";
|
|
@@ -782,7 +803,8 @@ export async function getSlackOutcomeMessage(taskId: string): Promise<SlackMessa
|
|
|
782
803
|
*
|
|
783
804
|
* The join is `agent_tasks.parentTaskId` — `defer-task` sets it on the
|
|
784
805
|
* schedule and `createStandaloneScheduleTask` passes it through, so the
|
|
785
|
-
* wake-up task points back at the task whose card announced the wait.
|
|
806
|
+
* wake-up task points back at the task whose card announced the wait. Follow
|
|
807
|
+
* subsequent re-defers to the latest wake, keeping the original card open.
|
|
786
808
|
* `deferredAt` (not the `deferred` tag) identifies the deferring task,
|
|
787
809
|
* because the wake-up task inherits the tag.
|
|
788
810
|
*/
|
|
@@ -790,15 +812,30 @@ export async function getResolvableDeferralOutcomes(
|
|
|
790
812
|
limit = 50,
|
|
791
813
|
): Promise<{ card: SlackMessageRecord; deferredTaskId: string; wakeTaskId: string }[]> {
|
|
792
814
|
const rows = await getDbClient().query<SlackMessageRow & { wake_task_id: string }>(
|
|
793
|
-
`
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
815
|
+
`WITH RECURSIVE chain(card_id, task_id) AS (
|
|
816
|
+
SELECT card.id, deferred.id FROM slack_messages card
|
|
817
|
+
JOIN agent_tasks deferred ON deferred.id = card.task_id
|
|
818
|
+
WHERE card.kind = 'outcome' AND deferred.deferredAt IS NOT NULL
|
|
819
|
+
AND card.deferral_resolved_at IS NULL AND card.finalized_at IS NOT NULL
|
|
820
|
+
AND card.ts NOT LIKE 'pending:%'
|
|
821
|
+
UNION
|
|
822
|
+
SELECT chain.card_id, wake.id FROM chain
|
|
823
|
+
JOIN agent_tasks parent ON parent.id = chain.task_id AND parent.deferredAt IS NOT NULL
|
|
824
|
+
JOIN agent_tasks wake ON wake.parentTaskId = parent.id AND wake.taskType = 'deferred'
|
|
825
|
+
)
|
|
826
|
+
SELECT card.*, wake.id AS wake_task_id
|
|
827
|
+
FROM chain
|
|
828
|
+
JOIN slack_messages card ON card.id = chain.card_id
|
|
829
|
+
JOIN agent_tasks wake ON wake.id = chain.task_id AND wake.id != card.task_id
|
|
797
830
|
WHERE card.kind = 'outcome'
|
|
798
831
|
AND card.finalized_at IS NOT NULL
|
|
799
832
|
AND card.deferral_resolved_at IS NULL
|
|
800
833
|
AND card.ts NOT LIKE 'pending:%'
|
|
801
|
-
AND
|
|
834
|
+
AND NOT EXISTS (
|
|
835
|
+
SELECT 1 FROM agent_tasks child
|
|
836
|
+
WHERE child.parentTaskId = wake.id AND child.taskType = 'deferred'
|
|
837
|
+
)
|
|
838
|
+
AND (wake.deferredAt IS NULL OR wake.finishedAt > card.updated_at)
|
|
802
839
|
AND wake.status IN ('completed', 'failed', 'cancelled')
|
|
803
840
|
ORDER BY wake.finishedAt ASC
|
|
804
841
|
LIMIT ?`,
|
|
@@ -4359,7 +4396,8 @@ export async function releaseStaleMentionProcessing(timeoutMinutes: number = 30)
|
|
|
4359
4396
|
}
|
|
4360
4397
|
|
|
4361
4398
|
// ============================================================================
|
|
4362
|
-
// Service Operations (PM2
|
|
4399
|
+
// Service Operations (removed PM2 service registry; the table and these
|
|
4400
|
+
// accessors stay until a drop migration lands)
|
|
4363
4401
|
// ============================================================================
|
|
4364
4402
|
|
|
4365
4403
|
type ServiceRow = {
|
|
@@ -6326,6 +6364,7 @@ type SwarmConfigRow = {
|
|
|
6326
6364
|
createdAt: string;
|
|
6327
6365
|
lastUpdatedAt: string;
|
|
6328
6366
|
encrypted: number; // SQLite boolean: 0 = plaintext, 1 = AES-256-GCM ciphertext
|
|
6367
|
+
exportToEnv?: number; // SQLite boolean; absent only on pre-215 test schemas
|
|
6329
6368
|
};
|
|
6330
6369
|
|
|
6331
6370
|
type SwarmConfigLookupRow = {
|
|
@@ -6354,6 +6393,7 @@ function rowToSwarmConfig(row: SwarmConfigRow): SwarmConfig {
|
|
|
6354
6393
|
createdAt: row.createdAt,
|
|
6355
6394
|
lastUpdatedAt: row.lastUpdatedAt,
|
|
6356
6395
|
encrypted: isEncrypted,
|
|
6396
|
+
exportToEnv: effectiveExportToEnv(row.key, row.exportToEnv !== 0),
|
|
6357
6397
|
};
|
|
6358
6398
|
}
|
|
6359
6399
|
|
|
@@ -6380,6 +6420,7 @@ function rowToSwarmConfig(row: SwarmConfigRow): SwarmConfig {
|
|
|
6380
6420
|
createdAt: row.createdAt,
|
|
6381
6421
|
lastUpdatedAt: row.lastUpdatedAt,
|
|
6382
6422
|
encrypted: isEncrypted,
|
|
6423
|
+
exportToEnv: effectiveExportToEnv(row.key, row.exportToEnv !== 0),
|
|
6383
6424
|
};
|
|
6384
6425
|
}
|
|
6385
6426
|
|
|
@@ -6534,7 +6575,7 @@ export async function getInjectableGlobalConfigs(): Promise<SwarmConfig[]> {
|
|
|
6534
6575
|
const rows = await getDbClient().query<SwarmConfigRow>(
|
|
6535
6576
|
`SELECT * FROM swarm_config
|
|
6536
6577
|
WHERE scope = 'global'
|
|
6537
|
-
AND UPPER(key) NOT IN ('API_KEY', 'SECRETS_ENCRYPTION_KEY', 'CORS_ALLOW_ANY_ORIGIN', 'EXTENSION_ALLOW_LEAD_ACTIVATION')
|
|
6578
|
+
AND UPPER(key) NOT IN ('API_KEY', 'SECRETS_ENCRYPTION_KEY', 'CORS_ALLOW_ANY_ORIGIN', 'EXTENSION_ALLOW_LEAD_ACTIVATION', 'CHAT_SDK_API_URL_OVERRIDES', ${teamsSdkEnvKeysSql()})
|
|
6538
6579
|
ORDER BY key ASC`,
|
|
6539
6580
|
);
|
|
6540
6581
|
return rows.filter((row) => !isInternalConfigKey(row.key)).map(rowToSwarmConfig);
|
|
@@ -6588,10 +6629,16 @@ export async function upsertSwarmConfig(data: {
|
|
|
6588
6629
|
isSecret?: boolean;
|
|
6589
6630
|
envPath?: string | null;
|
|
6590
6631
|
description?: string | null;
|
|
6632
|
+
/** Omitted: an update keeps the stored flag; an insert uses `defaultExportToEnv`. */
|
|
6633
|
+
exportToEnv?: boolean;
|
|
6591
6634
|
}): Promise<SwarmConfig> {
|
|
6592
6635
|
if (isReservedConfigKey(data.key)) {
|
|
6593
6636
|
throw reservedKeyError(data.key);
|
|
6594
6637
|
}
|
|
6638
|
+
if (data.exportToEnv === true && isEnvExportRestrictedKey(data.key)) {
|
|
6639
|
+
throw new Error(envExportRestrictedError(data.key));
|
|
6640
|
+
}
|
|
6641
|
+
const restricted = isEnvExportRestrictedKey(data.key);
|
|
6595
6642
|
|
|
6596
6643
|
const now = new Date().toISOString();
|
|
6597
6644
|
const scopeId = data.scope === "global" ? null : (data.scopeId ?? null);
|
|
@@ -6625,17 +6672,30 @@ export async function upsertSwarmConfig(data: {
|
|
|
6625
6672
|
);
|
|
6626
6673
|
|
|
6627
6674
|
if (existing) {
|
|
6675
|
+
// COALESCE keeps the stored flag when the caller did not send one.
|
|
6628
6676
|
return await getDbClient().get<SwarmConfigRow>(
|
|
6629
|
-
`UPDATE swarm_config SET value = ?, isSecret = ?, envPath = ?, description = ?, encrypted = ?, lastUpdatedAt =
|
|
6677
|
+
`UPDATE swarm_config SET value = ?, isSecret = ?, envPath = ?, description = ?, encrypted = ?, lastUpdatedAt = ?,
|
|
6678
|
+
exportToEnv = CASE WHEN ? THEN 0 ELSE COALESCE(?, exportToEnv) END
|
|
6630
6679
|
WHERE id = ? RETURNING *`,
|
|
6631
|
-
[
|
|
6680
|
+
[
|
|
6681
|
+
storedValue,
|
|
6682
|
+
isSecret,
|
|
6683
|
+
envPath,
|
|
6684
|
+
description,
|
|
6685
|
+
encryptedFlag,
|
|
6686
|
+
now,
|
|
6687
|
+
restricted ? 1 : 0,
|
|
6688
|
+
data.exportToEnv === undefined ? null : data.exportToEnv ? 1 : 0,
|
|
6689
|
+
existing.id,
|
|
6690
|
+
],
|
|
6632
6691
|
);
|
|
6633
6692
|
}
|
|
6634
6693
|
|
|
6635
6694
|
const id = crypto.randomUUID();
|
|
6695
|
+
const exportToEnv = restricted ? 0 : (data.exportToEnv ?? defaultExportToEnv(data.key)) ? 1 : 0;
|
|
6636
6696
|
return await getDbClient().get<SwarmConfigRow>(
|
|
6637
|
-
`INSERT INTO swarm_config (id, scope, scopeId, key, value, isSecret, envPath, description, createdAt, lastUpdatedAt, encrypted)
|
|
6638
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING *`,
|
|
6697
|
+
`INSERT INTO swarm_config (id, scope, scopeId, key, value, isSecret, envPath, description, createdAt, lastUpdatedAt, encrypted, exportToEnv)
|
|
6698
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING *`,
|
|
6639
6699
|
[
|
|
6640
6700
|
id,
|
|
6641
6701
|
data.scope,
|
|
@@ -6648,6 +6708,7 @@ export async function upsertSwarmConfig(data: {
|
|
|
6648
6708
|
now,
|
|
6649
6709
|
now,
|
|
6650
6710
|
encryptedFlag,
|
|
6711
|
+
exportToEnv,
|
|
6651
6712
|
],
|
|
6652
6713
|
);
|
|
6653
6714
|
});
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
-- SQL script connections (kind = 'sql').
|
|
2
|
+
--
|
|
3
|
+
-- A sql connection stores no HTTP auth (auth_type stays 'none'); its
|
|
4
|
+
-- auth_config_key holds the swarm_config key of the encrypted Postgres DSN,
|
|
5
|
+
-- resolved only on the API server. SQLite cannot alter a CHECK constraint, so
|
|
6
|
+
-- the table is rebuilt with the full current column set (117 rebuild + the
|
|
7
|
+
-- embedded auth columns). No new columns.
|
|
8
|
+
--
|
|
9
|
+
-- The migration runner disables foreign-key enforcement for the pass, so the
|
|
10
|
+
-- DROP does not cascade into script_credential_bindings.managed_by_connection_id
|
|
11
|
+
-- and the RENAME keeps the stable name that FK points to (same as 117).
|
|
12
|
+
|
|
13
|
+
DROP TABLE IF EXISTS script_connections_new;
|
|
14
|
+
|
|
15
|
+
CREATE TABLE script_connections_new (
|
|
16
|
+
id TEXT PRIMARY KEY,
|
|
17
|
+
slug TEXT NOT NULL,
|
|
18
|
+
display_name TEXT,
|
|
19
|
+
kind TEXT NOT NULL CHECK(kind IN ('raw', 'openapi', 'mcp', 'graphql', 'sql')),
|
|
20
|
+
scope TEXT NOT NULL DEFAULT 'global' CHECK(scope IN ('global', 'agent', 'repo')),
|
|
21
|
+
scope_id TEXT,
|
|
22
|
+
base_url TEXT,
|
|
23
|
+
base_url_source TEXT NOT NULL DEFAULT 'user' CHECK(base_url_source IN ('user', 'spec')),
|
|
24
|
+
allowed_hosts_json TEXT NOT NULL DEFAULT '[]',
|
|
25
|
+
credential_binding_id TEXT REFERENCES script_credential_bindings(id) ON DELETE SET NULL,
|
|
26
|
+
openapi_spec_source_kind TEXT CHECK(openapi_spec_source_kind IN ('url', 'inline', 'agent_fs', 'vendored')),
|
|
27
|
+
openapi_spec_source TEXT,
|
|
28
|
+
openapi_spec_json TEXT,
|
|
29
|
+
openapi_spec_etag TEXT,
|
|
30
|
+
openapi_spec_fetched_at TEXT,
|
|
31
|
+
mcp_server_id TEXT REFERENCES mcp_servers(id) ON DELETE SET NULL,
|
|
32
|
+
generated_types TEXT,
|
|
33
|
+
generated_runtime_json TEXT,
|
|
34
|
+
generated_at TEXT,
|
|
35
|
+
generation_error TEXT,
|
|
36
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
37
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
38
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
39
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
40
|
+
created_by TEXT REFERENCES users(id),
|
|
41
|
+
updated_by TEXT REFERENCES users(id),
|
|
42
|
+
auth_type TEXT NOT NULL DEFAULT 'none'
|
|
43
|
+
CHECK(auth_type IN ('none', 'bearer', 'header', 'query', 'oauth')),
|
|
44
|
+
auth_config_key TEXT,
|
|
45
|
+
auth_authorization_id TEXT REFERENCES oauth_authorizations(id) ON DELETE SET NULL,
|
|
46
|
+
auth_param_name TEXT,
|
|
47
|
+
auth_template_override TEXT,
|
|
48
|
+
auth_hosts_override_json TEXT,
|
|
49
|
+
CHECK(scope = 'global' OR scope_id IS NOT NULL),
|
|
50
|
+
CHECK(kind != 'openapi' OR openapi_spec_json IS NOT NULL),
|
|
51
|
+
CHECK(kind != 'mcp' OR mcp_server_id IS NOT NULL),
|
|
52
|
+
CHECK(kind != 'sql' OR auth_config_key IS NOT NULL)
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
INSERT INTO script_connections_new (
|
|
56
|
+
id, slug, display_name, kind, scope, scope_id, base_url, base_url_source, allowed_hosts_json,
|
|
57
|
+
credential_binding_id, openapi_spec_source_kind, openapi_spec_source, openapi_spec_json,
|
|
58
|
+
openapi_spec_etag, openapi_spec_fetched_at, mcp_server_id, generated_types,
|
|
59
|
+
generated_runtime_json, generated_at, generation_error, enabled, version, created_at,
|
|
60
|
+
updated_at, created_by, updated_by, auth_type, auth_config_key, auth_authorization_id,
|
|
61
|
+
auth_param_name, auth_template_override, auth_hosts_override_json
|
|
62
|
+
)
|
|
63
|
+
SELECT
|
|
64
|
+
id, slug, display_name, kind, scope, scope_id, base_url, base_url_source, allowed_hosts_json,
|
|
65
|
+
credential_binding_id, openapi_spec_source_kind, openapi_spec_source, openapi_spec_json,
|
|
66
|
+
openapi_spec_etag, openapi_spec_fetched_at, mcp_server_id, generated_types,
|
|
67
|
+
generated_runtime_json, generated_at, generation_error, enabled, version, created_at,
|
|
68
|
+
updated_at, created_by, updated_by, auth_type, auth_config_key, auth_authorization_id,
|
|
69
|
+
auth_param_name, auth_template_override, auth_hosts_override_json
|
|
70
|
+
FROM script_connections;
|
|
71
|
+
|
|
72
|
+
DROP TABLE script_connections;
|
|
73
|
+
ALTER TABLE script_connections_new RENAME TO script_connections;
|
|
74
|
+
|
|
75
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_script_connections_slug_scope
|
|
76
|
+
ON script_connections(slug, scope, COALESCE(scope_id, ''));
|
|
77
|
+
|
|
78
|
+
CREATE INDEX IF NOT EXISTS idx_script_connections_kind_enabled
|
|
79
|
+
ON script_connections(kind, enabled);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
-- Per-row flag: does this swarm_config row reach an agent's process env?
|
|
2
|
+
-- Workers export a row into the harness env (and so into every agent shell)
|
|
3
|
+
-- only when exportToEnv = 1. Rows with 0 stay server-side and are used through
|
|
4
|
+
-- connections or script credential bindings.
|
|
5
|
+
--
|
|
6
|
+
-- Existing rows keep today's behaviour (exported), so nothing breaks at deploy.
|
|
7
|
+
ALTER TABLE swarm_config ADD COLUMN exportToEnv INTEGER NOT NULL DEFAULT 1;
|
|
8
|
+
|
|
9
|
+
-- Deny list: rows only the API server reads. The first block matches
|
|
10
|
+
-- ENV_EXPORT_RESTRICTED_KEYS in src/utils/config-env-export.ts (never
|
|
11
|
+
-- exportable); the second block (ENV_EXPORT_DEFAULT_OFF_KEYS, also the insert
|
|
12
|
+
-- default for new rows) is off by default but operators may turn it
|
|
13
|
+
-- back on per row.
|
|
14
|
+
UPDATE swarm_config SET exportToEnv = 0
|
|
15
|
+
WHERE upper(key) IN (
|
|
16
|
+
'SLACK_APP_TOKEN',
|
|
17
|
+
'SLACK_SIGNING_SECRET',
|
|
18
|
+
'GITHUB_APP_PRIVATE_KEY',
|
|
19
|
+
'GITHUB_WEBHOOK_SECRET',
|
|
20
|
+
'GITLAB_WEBHOOK_SECRET',
|
|
21
|
+
'LINEAR_CLIENT_SECRET',
|
|
22
|
+
'LINEAR_SIGNING_SECRET',
|
|
23
|
+
'JIRA_CLIENT_SECRET',
|
|
24
|
+
'JIRA_WEBHOOK_TOKEN',
|
|
25
|
+
'AZURE_DEVOPS_WEBHOOK_SECRET',
|
|
26
|
+
'AGENTMAIL_WEBHOOK_SECRET',
|
|
27
|
+
'API_AGENT_FS_API_KEY',
|
|
28
|
+
'KAPSO_WEBHOOK_HMAC_SECRET',
|
|
29
|
+
'SENTRY_TEST_APP_WEBHOOK_SECRET',
|
|
30
|
+
'TELEMETRY_CH_AUTH',
|
|
31
|
+
'HACK_AGENT_FS_ADMIN_KEY',
|
|
32
|
+
'X_CLIENT_SECRET'
|
|
33
|
+
)
|
|
34
|
+
OR key GLOB 'connection.*.secret';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
-- The reasoning effort a task's session actually ran at. `effort` stays the
|
|
2
|
+
-- requested value (a task-level pin); the effective one usually comes from the
|
|
3
|
+
-- agent's REASONING_EFFORT_OVERRIDE and was never recorded. NULL means the
|
|
4
|
+
-- harness default applied, or the row predates this column.
|
|
5
|
+
ALTER TABLE agent_tasks ADD COLUMN resolvedEffort TEXT;
|