@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.
Files changed (525) hide show
  1. package/README.md +1 -1
  2. package/dist/{acp-adapter-fpecx1g1.js → acp-adapter-sj2g0m84.js} +18 -17
  3. package/dist/{actions-pw87a1a8.js → actions-fegk44gr.js} +65 -35
  4. package/dist/{amp-adapter-8jem2bc0.js → amp-adapter-ad8ft89x.js} +8 -7
  5. package/dist/{anthropic-messages-8ee2f22q.js → anthropic-messages-r6czkjv1.js} +7 -7
  6. package/dist/{app-wmf0m843.js → app-kfvgbvzy.js} +19 -13
  7. package/dist/{assistant-emp1e108.js → assistant-z7zdy9ja.js} +65 -38
  8. package/dist/{boot-reembed-1de4f4aj.js → boot-reembed-5c2z0mbe.js} +11 -9
  9. package/dist/{boot-reembed-4ymn9atn.js → boot-reembed-j8xa181e.js} +11 -9
  10. package/dist/{boot-scrub-sweep-adhk1s8c.js → boot-scrub-sweep-hnkn3rgt.js} +12 -10
  11. package/dist/{boot-seeds-8q637aew.js → boot-seeds-kwjq4d2z.js} +15 -13
  12. package/dist/{claude-adapter-t26cv8a4.js → claude-adapter-9vmvpvgd.js} +20 -19
  13. package/dist/{claude-managed-adapter-xgxhqrt2.js → claude-managed-adapter-k9qae05j.js} +7 -5
  14. package/dist/{claude-managed-setup-bnmjarjc.js → claude-managed-setup-q54zx5q2.js} +6 -4
  15. package/dist/{claude-sdk-session-gsfsh662.js → claude-sdk-session-9jye6cxr.js} +12698 -11995
  16. package/dist/{cli-k46r9hmk.js → cli-03gedhng.js} +16 -14
  17. package/dist/{cli-kb4ehzx5.js → cli-1e4b6bzh.js} +7 -7
  18. package/dist/{cli-d603qf86.js → cli-29jc5q7w.js} +10 -8
  19. package/dist/cli-2m1ktfzz.js +17795 -0
  20. package/dist/{cli-8vs9trd4.js → cli-3dj8k4vy.js} +1 -1
  21. package/dist/{cli-zxm9p3x4.js → cli-3fbmmawm.js} +5 -5
  22. package/dist/{cli-gmdajfw5.js → cli-4jxm2qtz.js} +4987 -1708
  23. package/dist/{cli-tadfgd0t.js → cli-5hkm7whv.js} +33 -4
  24. package/dist/{cli-6jb2rf77.js → cli-5t4f29ez.js} +3 -3
  25. package/dist/{cli-7a0sde2x.js → cli-6cagzc96.js} +9 -0
  26. package/dist/cli-6cvfxs8r.js +47 -0
  27. package/dist/{cli-pj6x9qce.js → cli-6jyj59nb.js} +2 -2
  28. package/dist/{cli-388egyf6.js → cli-6razj6t4.js} +2 -2
  29. package/dist/{cli-qsztpfry.js → cli-74ahz61x.js} +2 -2
  30. package/dist/{cli-4nz8p1p5.js → cli-7x0g4sn1.js} +15474 -16082
  31. package/dist/{cli-yatxqynm.js → cli-9ha6hs2d.js} +1 -290
  32. package/dist/{cli-81r1wjyv.js → cli-9nfx44eh.js} +1 -1
  33. package/dist/cli-9traj3dn.js +638 -0
  34. package/dist/{cli-smcrrmhy.js → cli-agzebbd5.js} +9 -9
  35. package/dist/{cli-bf7485pm.js → cli-apx87jne.js} +2 -2
  36. package/dist/{cli-ztrv9y21.js → cli-bzszjf2p.js} +3689 -1081
  37. package/dist/{cli-c5km5znr.js → cli-c8r3kzzb.js} +1 -1
  38. package/dist/{cli-hsem16hb.js → cli-cgtksawx.js} +7 -4
  39. package/dist/{cli-db3m6zdt.js → cli-d2qr7aj4.js} +1 -1
  40. package/dist/{cli-1hgat6pa.js → cli-d5f9ed5c.js} +5 -5
  41. package/dist/cli-e3g5mbkz.js +776 -0
  42. package/dist/{cli-7jykv7ef.js → cli-e6mpjhed.js} +1 -1
  43. package/dist/{cli-j6kpj9az.js → cli-ee9gtz70.js} +1553 -68
  44. package/dist/{cli-e0a9sk00.js → cli-eejsgvm4.js} +4 -4
  45. package/dist/{cli-tgpfnm6r.js → cli-ef1hg1wv.js} +518 -59
  46. package/dist/cli-f527ce74.js +781 -0
  47. package/dist/{cli-ppy4nnnh.js → cli-f7kr7svz.js} +2 -2
  48. package/dist/cli-hjwmhcg1.js +10622 -0
  49. package/dist/{cli-2bw3w47j.js → cli-hnhtk6cj.js} +1 -1
  50. package/dist/{cli-ywm1azg9.js → cli-hnmhtzvh.js} +6 -4
  51. package/dist/{cli-4fnb6884.js → cli-hvqbtna4.js} +7 -1259
  52. package/dist/{cli-pstq9888.js → cli-j0pfptdp.js} +220 -103
  53. package/dist/cli-jta2eyzc.js +619 -0
  54. package/dist/{cli-esnpehf5.js → cli-k382tshb.js} +12 -13
  55. package/dist/cli-k3dp5tpf.js +263 -0
  56. package/dist/{cli-wd0hz6ah.js → cli-kbrt8gqa.js} +9 -91
  57. package/dist/cli-kceah1eh.js +92 -0
  58. package/dist/{cli-prrt9fa0.js → cli-ke896fcf.js} +10 -10
  59. package/dist/{cli-nv4zd0b9.js → cli-kt6zqg0e.js} +6 -6
  60. package/dist/{cli-g6t9texm.js → cli-m50t4309.js} +5 -18
  61. package/dist/cli-n2wq4j7m.js +6985 -0
  62. package/dist/{cli-c2pq2rjb.js → cli-n3hzg89b.js} +46 -15
  63. package/dist/{cli-tmhsxhb8.js → cli-n5vwg842.js} +23 -6
  64. package/dist/{cli-5rv1j9ga.js → cli-ne236afy.js} +53 -7
  65. package/dist/cli-p0sg24zp.js +16 -0
  66. package/dist/{cli-d161g69q.js → cli-p1x85d2t.js} +50 -2
  67. package/dist/{cli-7pz3b7x5.js → cli-przpmdgr.js} +25 -0
  68. package/dist/{cli-g4f5pj26.js → cli-q0ke1yww.js} +111 -25
  69. package/dist/{cli-e3pmyt39.js → cli-q50942rs.js} +1 -1
  70. package/dist/{cli-r44t9wqc.js → cli-r106725k.js} +2 -2
  71. package/dist/{cli-gj81e47t.js → cli-r2pnvj8g.js} +2 -2
  72. package/dist/{cli-r8smj8b8.js → cli-r62a35ea.js} +19 -3
  73. package/dist/{cli-cd0hv9nh.js → cli-ra0xzggj.js} +2 -2
  74. package/dist/cli-rhs9pz33.js +294 -0
  75. package/dist/{cli-nyhb1r6x.js → cli-s2sp957d.js} +52 -29
  76. package/dist/{cli-1x7da0de.js → cli-s4setq91.js} +8 -8
  77. package/dist/{cli-xczpdp9e.js → cli-se8w6wny.js} +6 -6
  78. package/dist/cli-skxvvpap.js +10140 -0
  79. package/dist/{cli-014vns2y.js → cli-stfs0k5s.js} +208 -525
  80. package/dist/{cli-0p3enk35.js → cli-tqaazemc.js} +9 -1
  81. package/dist/{cli-cf69s3ew.js → cli-tr4sxp68.js} +3 -3
  82. package/dist/{cli-8hzfb6xz.js → cli-tsde1hdr.js} +15 -15
  83. package/dist/{cli-cceskcvt.js → cli-txqb9s38.js} +8 -8
  84. package/dist/{cli-aspcaef3.js → cli-v1yb0rqb.js} +6 -6
  85. package/dist/{cli-j1pmc07z.js → cli-vatyhshy.js} +268 -40
  86. package/dist/{cli-04emfe2q.js → cli-vdach5a9.js} +5 -5
  87. package/dist/{cli-7avy4v8w.js → cli-w1q7h2r2.js} +5 -3
  88. package/dist/{cli-rcp5aqdw.js → cli-w7m81tb7.js} +1 -1
  89. package/dist/{cli-hwwvy36w.js → cli-wayw93nt.js} +3 -3
  90. package/dist/cli-wmgrkscj.js +23254 -0
  91. package/dist/{cli-gp1rtyvk.js → cli-z5jjpaxw.js} +29 -6
  92. package/dist/{cli-451ks6aw.js → cli-zkpks3r3.js} +1 -1
  93. package/dist/cli.js +32 -48
  94. package/dist/{codex-adapter-m4tgdysy.js → codex-adapter-y81sssk0.js} +16 -15
  95. package/dist/{codex-login-841kv5fk.js → codex-login-f2rcfpp9.js} +3 -2
  96. package/dist/{codex-session-runner-ymwzm6ea.js → codex-session-runner-8vx4j6a9.js} +16 -15
  97. package/dist/{commands-n0hshcvs.js → commands-kcpvpcrr.js} +21 -10
  98. package/dist/{controller-hq5ggpcp.js → controller-ywrmt6yd.js} +5 -4
  99. package/dist/{controllers-connect-y07cqcvy.js → controllers-connect-kwpvj3rf.js} +45 -38
  100. package/dist/{cursor-adapter-q8pgv5qa.js → cursor-adapter-cehv1qns.js} +7 -6
  101. package/dist/{db-hkqvrdcb.js → db-k8ankj20.js} +13 -11
  102. package/dist/{db-4w7tmt1g.js → db-ww5d7jq3.js} +29 -9
  103. package/dist/{devin-adapter-xgtj680j.js → devin-adapter-x1022qb1.js} +3 -2
  104. package/dist/{dispatcher-5sd69y14.js → dispatcher-e8gq5m68.js} +41 -34
  105. package/dist/{docker-f503k9p0.js → docker-ff6y1190.js} +3 -2
  106. package/dist/{dsh-adapter-2h8m4cab.js → dsh-adapter-3epjm3af.js} +7 -6
  107. package/dist/{e2b-66xra4az.js → e2b-8ygwhg0f.js} +4 -3
  108. package/dist/{e2b-xwhyj8cw.js → e2b-swhnpw3n.js} +4 -3
  109. package/dist/{event-bus-vjtv82gm.js → event-bus-6axnngdj.js} +3 -2
  110. package/dist/external-channel-h3359cwn.js +52 -0
  111. package/dist/{google-generative-ai-7pavrbv7.js → google-generative-ai-g8db7x0f.js} +5 -3
  112. package/dist/{google-vertex-3f1jk41f.js → google-vertex-r2692q0r.js} +5 -3
  113. package/dist/{grok-adapter-8m9yqzbq.js → grok-adapter-0d4x7gkx.js} +19 -18
  114. package/dist/{handlers-s20xr10r.js → handlers-an1gzv21.js} +44 -37
  115. package/dist/{heartbeat-3k31q4g2.js → heartbeat-6dakeb61.js} +46 -39
  116. package/dist/{hook-gdn6a2fn.js → hook-6v6cv6d5.js} +12 -24
  117. package/dist/{hook-ygwerrdh.js → hook-sa5xye4y.js} +13 -12
  118. package/dist/{http-jdteeg81.js → http-r7f3eky0.js} +1598 -279
  119. package/dist/index-52j1aja4.js +3465 -0
  120. package/dist/{index-e0snym4t.js → index-7ep4gzdk.js} +41 -34
  121. package/dist/index-9gw58n4k.js +193 -0
  122. package/dist/index-9j87mcm8.js +56305 -0
  123. package/dist/index-bsmcresk.js +79424 -0
  124. package/dist/index-mh85qhec.js +475 -0
  125. package/dist/{index-vm3bm9t7.js → index-rmpw9a8q.js} +41 -34
  126. package/dist/{index-6ksewd5y.js → index-s2wxgzr0.js} +1015 -732
  127. package/dist/{index-tsszt7g9.js → index-v1v6n7hg.js} +46 -39
  128. package/dist/index-we27kd31.js +12810 -0
  129. package/dist/{index-ffqzqgwb.js → index-zk96aq1k.js} +11 -9
  130. package/dist/{keepalive-jekc896t.js → keepalive-be9vwy5h.js} +13 -11
  131. package/dist/{lead-4k9s9szx.js → lead-0861cwrf.js} +64 -57
  132. package/dist/{maintenance-shazch4n.js → maintenance-mzzgc8bn.js} +11 -9
  133. package/dist/node-c9we95xf.js +1 -1
  134. package/dist/{node-fkajaq96.js → node-mn1zs7an.js} +2 -1
  135. package/dist/{oauth-refresh-sweep-5gb36kn8.js → oauth-refresh-sweep-cpdnfwdj.js} +12 -10
  136. package/dist/{onboard-ydrbnvww.js → onboard-fh8qs4r3.js} +11 -3
  137. package/dist/{opencode-adapter-5zh0he20.js → opencode-adapter-nm42wwj8.js} +19 -14
  138. package/dist/{otel-impl-6pf5cv86.js → otel-impl-x6c1c9g4.js} +248 -869
  139. package/dist/{pi-mono-adapter-ef9wwx9m.js → pi-mono-adapter-9n2ya240.js} +245 -107
  140. package/dist/{pricing-refresh-s52nsa5q.js → pricing-refresh-qb0rv0ap.js} +13 -11
  141. package/dist/{rbac-roles-aq3msh4e.js → rbac-roles-1gzdwbh1.js} +12 -10
  142. package/dist/{rbac-roles-q5gb5e8v.js → rbac-roles-3mraey52.js} +13 -11
  143. package/dist/{render-v2-pd1rg54q.js → render-v2-agpa45zz.js} +19 -13
  144. package/dist/{resume-gw4a2c6v.js → resume-x0ydy9s9.js} +27 -21
  145. package/dist/{runtime-qfry88v2.js → runtime-sa2vr16g.js} +2 -2
  146. package/dist/{setup-jda1ksdh.js → setup-as9ga0d6.js} +2 -2
  147. package/dist/{virtual-modules-b3ga2m65.js → virtual-modules-9gkxqrap.js} +7 -6
  148. package/dist/{work-objects-tb7ycye8.js → work-objects-y5g1y7ev.js} +49 -37
  149. package/dist/{worker-njjccz5d.js → worker-860c3e38.js} +64 -57
  150. package/dist/{x-qfmygqqv.js → x-m477fr0h.js} +3 -2
  151. package/openapi.json +951 -356
  152. package/package.json +12 -13
  153. package/src/apps/catalog.generated.json +1309 -53
  154. package/src/apps/page-validator.ts +93 -31
  155. package/src/azure-devops/api.ts +94 -18
  156. package/src/azure-devops/auth.ts +32 -0
  157. package/src/azure-devops/boards-sync.ts +708 -0
  158. package/src/azure-devops/handlers.ts +52 -8
  159. package/src/azure-devops/html.ts +26 -0
  160. package/src/azure-devops/index.ts +15 -0
  161. package/src/azure-devops/templates.ts +86 -0
  162. package/src/azure-devops/types.ts +65 -1
  163. package/src/be/config-refs.ts +60 -0
  164. package/src/be/db/page-versions.ts +15 -0
  165. package/src/be/db/runtime.ts +35 -8
  166. package/src/be/db/skill-name-resolution.ts +36 -0
  167. package/src/be/db/tasks/read.ts +230 -0
  168. package/src/be/db/tasks/write.ts +7 -0
  169. package/src/be/db.ts +74 -13
  170. package/src/be/migrations/213_script_connections_sql.sql +79 -0
  171. package/src/be/migrations/215_swarm_config_export_to_env.sql +34 -0
  172. package/src/be/migrations/216_task_resolved_effort.sql +5 -0
  173. package/src/be/migrations/217_chat_sdk_state.sql +104 -0
  174. package/src/be/model-catalog-store.ts +5 -1
  175. package/src/be/model-tier-resolution.ts +12 -1
  176. package/src/be/model-validation.ts +5 -2
  177. package/src/be/models-catalog.ts +26 -1
  178. package/src/be/modelsdev-cache.json +198 -63
  179. package/src/be/modelsdev-cache.ts +9 -1
  180. package/src/be/script-connections.ts +47 -8
  181. package/src/be/script-credential-broker.ts +39 -2
  182. package/src/be/scripts/run-saved.ts +1 -0
  183. package/src/be/scripts/typecheck.ts +10 -8
  184. package/src/be/seed/runner.ts +13 -1
  185. package/src/be/seed/state-db.ts +5 -0
  186. package/src/be/seed/types.ts +6 -0
  187. package/src/be/seed-pricing.ts +19 -2
  188. package/src/be/seed-scripts/catalog/ops-catalog-audit.inline.ts +1 -1
  189. package/src/be/seed-scripts/catalog/ops-catalog-audit.ts +1 -1
  190. package/src/be/seed-skills/bundled-files.generated.json +10 -18
  191. package/src/be/seed-skills/index.ts +107 -3
  192. package/src/be/sql-connections.ts +118 -0
  193. package/src/be/swarm-config-guard.ts +53 -0
  194. package/src/cli.tsx +0 -16
  195. package/src/commands/onboard/non-interactive.ts +4 -2
  196. package/src/commands/profile-sync.ts +5 -3
  197. package/src/commands/provider-credentials.ts +52 -6
  198. package/src/commands/runner.ts +196 -56
  199. package/src/e2b/env.ts +5 -0
  200. package/src/extensions/contract-types.generated.ts +1 -1
  201. package/src/extensions/contract.ts +45 -0
  202. package/src/extensions/dispatcher.ts +7 -0
  203. package/src/extensions/post-bridge.ts +40 -0
  204. package/src/github/handlers.ts +11 -4
  205. package/src/heartbeat/templates.ts +8 -5
  206. package/src/hooks/hook.ts +0 -26
  207. package/src/http/all-routes.ts +0 -1
  208. package/src/http/config.ts +36 -17
  209. package/src/http/core.ts +4 -0
  210. package/src/http/index.ts +14 -2
  211. package/src/http/integrations.ts +88 -1
  212. package/src/http/mcp-oauth.ts +6 -13
  213. package/src/http/mcp.ts +15 -5
  214. package/src/http/page-proxy.ts +2 -4
  215. package/src/http/pages-public.ts +6 -5
  216. package/src/http/pages.ts +5 -14
  217. package/src/http/poll.ts +28 -68
  218. package/src/http/requested-by.ts +54 -0
  219. package/src/http/route-def.ts +7 -6
  220. package/src/http/script-connection-proxy.ts +51 -4
  221. package/src/http/script-connections.ts +5 -2
  222. package/src/http/scripts.ts +1 -0
  223. package/src/http/session-cost-recompute.ts +12 -2
  224. package/src/http/session-data.ts +4 -0
  225. package/src/http/stats.ts +1 -30
  226. package/src/http/tasks.ts +61 -5
  227. package/src/http/utils.ts +14 -0
  228. package/src/http/webhooks.ts +183 -2
  229. package/src/http/x.ts +1 -0
  230. package/src/integrations/chat-sdk/adapters.ts +129 -0
  231. package/src/integrations/chat-sdk/attachments.ts +232 -0
  232. package/src/integrations/chat-sdk/background.ts +36 -0
  233. package/src/integrations/chat-sdk/commands.ts +194 -0
  234. package/src/integrations/chat-sdk/config.ts +198 -0
  235. package/src/integrations/chat-sdk/discord-api.ts +63 -0
  236. package/src/integrations/chat-sdk/discord-gateway.ts +185 -0
  237. package/src/integrations/chat-sdk/handlers.ts +28 -0
  238. package/src/integrations/chat-sdk/inbound.ts +426 -0
  239. package/src/integrations/chat-sdk/limits.ts +48 -0
  240. package/src/integrations/chat-sdk/logger.ts +81 -0
  241. package/src/integrations/chat-sdk/outbound.ts +123 -0
  242. package/src/integrations/chat-sdk/relay.ts +172 -0
  243. package/src/integrations/chat-sdk/router.ts +169 -0
  244. package/src/integrations/chat-sdk/runtime.ts +351 -0
  245. package/src/integrations/chat-sdk/schema.ts +245 -0
  246. package/src/integrations/chat-sdk/state.ts +243 -0
  247. package/src/integrations/chat-sdk/status.ts +244 -0
  248. package/src/integrations/chat-sdk/steering.ts +58 -0
  249. package/src/integrations/chat-sdk/teams-origin.ts +77 -0
  250. package/src/integrations/chat-sdk/telegram-api.ts +56 -0
  251. package/src/integrations/chat-sdk/templates.ts +16 -0
  252. package/src/integrations/chat-sdk/test-hooks.ts +37 -0
  253. package/src/integrations/chat-sdk/thread-buffer.ts +100 -0
  254. package/src/integrations/chat-sdk/typing.ts +65 -0
  255. package/src/jira/adf.ts +3 -1
  256. package/src/kv-reserved-namespaces.ts +2 -0
  257. package/src/oauth/mcp-wrapper.ts +10 -6
  258. package/src/otel-impl.ts +2 -1
  259. package/src/pages/version.ts +4 -5
  260. package/src/prompts/base-prompt.ts +111 -45
  261. package/src/providers/acp-target-catalog.ts +6 -0
  262. package/src/providers/acp-targets.ts +56 -3
  263. package/src/providers/amp-adapter.ts +1 -1
  264. package/src/providers/claude-adapter.ts +27 -2
  265. package/src/providers/claude-flag-settings.ts +133 -0
  266. package/src/providers/claude-managed-adapter.ts +1 -1
  267. package/src/providers/claude-sdk-session.ts +7 -0
  268. package/src/providers/claude-session-events.ts +6 -1
  269. package/src/providers/dsh-adapter.ts +1 -1
  270. package/src/providers/opencode-adapter.ts +268 -37
  271. package/src/providers/opencode-billing.ts +86 -0
  272. package/src/providers/opencode-swarm-plugin.ts +51 -0
  273. package/src/providers/pi-mono-adapter.ts +398 -153
  274. package/src/providers/pricing-sources.md +37 -3
  275. package/src/providers/reasoning-effort.ts +27 -0
  276. package/src/providers/types.ts +11 -2
  277. package/src/rbac/legacy-policy.ts +8 -2
  278. package/src/rbac/permissions.ts +21 -0
  279. package/src/scheduler/scheduler.ts +4 -2
  280. package/src/scripts-runtime/api-client.ts +15 -1
  281. package/src/scripts-runtime/api-types.ts +9 -1
  282. package/src/scripts-runtime/ctx.ts +1 -1
  283. package/src/scripts-runtime/loader.ts +19 -7
  284. package/src/scripts-runtime/mcp-client.ts +30 -19
  285. package/src/scripts-runtime/sdk-allowlist.ts +8 -6
  286. package/src/scripts-runtime/swarm-sdk.ts +0 -11
  287. package/src/scripts-runtime/types/stdlib.d.ts +27 -15
  288. package/src/scripts-runtime/types/swarm-extension.d.ts +63 -1
  289. package/src/scripts-runtime/types/swarm-sdk.d.ts +27 -15
  290. package/src/server.ts +52 -18
  291. package/src/slack/actions.ts +29 -1
  292. package/src/slack/app.ts +14 -2
  293. package/src/slack/assistant.ts +36 -2
  294. package/src/slack/channel-join.ts +3 -16
  295. package/src/slack/commands.ts +9 -1
  296. package/src/slack/event-dedup.ts +1 -1
  297. package/src/slack/external-channel-egress.ts +113 -0
  298. package/src/slack/external-channel.ts +309 -0
  299. package/src/slack/handlers.ts +61 -0
  300. package/src/slack/render-v2.ts +40 -47
  301. package/src/slack/work-objects.ts +5 -0
  302. package/src/tasks/additive-buffer.ts +4 -2
  303. package/src/tasks/context-key.ts +94 -2
  304. package/src/tasks/model-pin.ts +67 -0
  305. package/src/tasks/worker-follow-up.ts +4 -31
  306. package/src/telemetry.ts +2 -1
  307. package/src/tests/acp-adapter.test.ts +42 -0
  308. package/src/tests/api-drain-worker-e2e.test.ts +1 -6
  309. package/src/tests/apps-catalog-feedback.test.ts +310 -0
  310. package/src/tests/apps-catalog-inputs.test.ts +70 -0
  311. package/src/tests/apps-catalog-table.test.ts +113 -0
  312. package/src/tests/azure-devops-boards-sync.test.ts +584 -0
  313. package/src/tests/azure-devops-html.test.ts +13 -0
  314. package/src/tests/azure-devops-webhook-malformed.test.ts +4 -0
  315. package/src/tests/base-prompt.test.ts +58 -54
  316. package/src/tests/chat-sdk-commands.test.ts +191 -0
  317. package/src/tests/chat-sdk-config.test.ts +334 -0
  318. package/src/tests/chat-sdk-discord-api.test.ts +68 -0
  319. package/src/tests/chat-sdk-discord-gateway.test.ts +252 -0
  320. package/src/tests/chat-sdk-discord-webhook.test.ts +126 -0
  321. package/src/tests/chat-sdk-fields-sync.test.ts +50 -0
  322. package/src/tests/chat-sdk-harness.ts +146 -0
  323. package/src/tests/chat-sdk-inbound.test.ts +363 -0
  324. package/src/tests/chat-sdk-relay.test.ts +470 -0
  325. package/src/tests/chat-sdk-reload.test.ts +128 -0
  326. package/src/tests/chat-sdk-shutdown.test.ts +220 -0
  327. package/src/tests/chat-sdk-slack.test.ts +268 -0
  328. package/src/tests/chat-sdk-state.test.ts +163 -0
  329. package/src/tests/chat-sdk-status-route.test.ts +382 -0
  330. package/src/tests/chat-sdk-teams.test.ts +277 -0
  331. package/src/tests/chat-sdk-tools.test.ts +520 -0
  332. package/src/tests/chat-sdk-typing.test.ts +120 -0
  333. package/src/tests/chat-sdk-webhook-telegram.test.ts +200 -0
  334. package/src/tests/claude-adapter-binary.test.ts +144 -0
  335. package/src/tests/claude-flag-settings.test.ts +114 -0
  336. package/src/tests/claude-managed-adapter.test.ts +1 -1
  337. package/src/tests/claude-sdk-lifecycle.test.ts +148 -1
  338. package/src/tests/claude-sdk-process.fixture.ts +7 -0
  339. package/src/tests/claude-thinking-tokens.test.ts +57 -0
  340. package/src/tests/claude-worker-parity.test.ts +2 -7
  341. package/src/tests/config-env-export-chat-sdk.test.ts +11 -0
  342. package/src/tests/config-refs.test.ts +66 -0
  343. package/src/tests/context-key.test.ts +51 -0
  344. package/src/tests/cors-allowlist.test.ts +25 -0
  345. package/src/tests/create-page-tool.test.ts +18 -0
  346. package/src/tests/credential-check.test.ts +139 -0
  347. package/src/tests/credentials.test.ts +21 -0
  348. package/src/tests/db-runtime.test.ts +61 -0
  349. package/src/tests/db-task-read-contract.test.ts +20 -0
  350. package/src/tests/db-task-write-contract.test.ts +10 -0
  351. package/src/tests/deferred-task-wake.test.ts +52 -4
  352. package/src/tests/docs-index-footprint.test.js +3 -3
  353. package/src/tests/dsh-adapter.test.ts +1 -1
  354. package/src/tests/enabled-capabilities.test.ts +20 -0
  355. package/src/tests/entrypoint-api-readiness.test.ts +14 -8
  356. package/src/tests/entrypoint-config-env-export.test.ts +5 -2
  357. package/src/tests/entrypoint-export-to-env.test.ts +78 -0
  358. package/src/tests/explicit-model-validation.test.ts +105 -1
  359. package/src/tests/extensions-example-route-chat-channel.test.ts +154 -0
  360. package/src/tests/extensions-post-bridge.test.ts +51 -0
  361. package/src/tests/fetch-resolved-env.test.ts +128 -0
  362. package/src/tests/fixtures/azure-boards/workitem.commented.json +89 -0
  363. package/src/tests/fixtures/azure-boards/workitem.created.json +81 -0
  364. package/src/tests/fixtures/azure-boards/workitem.deleted.json +70 -0
  365. package/src/tests/fixtures/azure-boards/workitem.restored.json +82 -0
  366. package/src/tests/fixtures/azure-boards/workitem.updated.json +130 -0
  367. package/src/tests/fixtures/catalog-feedback-definition.json.txt +860 -0
  368. package/src/tests/fixtures/catalog-inputs-definition.json.txt +910 -0
  369. package/src/tests/fixtures/catalog-table-definition.json.txt +468 -0
  370. package/src/tests/fixtures/chat-sdk/telegram-private-text.json +10 -0
  371. package/src/tests/fixtures/extensions/route-chat-channel-to-agent/hooks.ts +27 -0
  372. package/src/tests/fixtures/extensions/route-chat-channel-to-agent/manifest.json +9 -0
  373. package/src/tests/fixtures/openai-compatible-registry-extension.child.ts +146 -0
  374. package/src/tests/fixtures/runner-identity-refresh.ts +3 -0
  375. package/src/tests/fixtures/runner-legacy-resume-prompt.ts +122 -0
  376. package/src/tests/github-handlers.test.ts +35 -0
  377. package/src/tests/harness-provider-resolution.test.ts +12 -0
  378. package/src/tests/heartbeat-checklist.test.ts +3 -2
  379. package/src/tests/hook-runtime-close.test.ts +0 -2
  380. package/src/tests/http-api-integration.test.ts +0 -25
  381. package/src/tests/migration-046-budgets.test.ts +17 -16
  382. package/src/tests/migration-217-chat-sdk-state.test.ts +113 -0
  383. package/src/tests/model-tier-resolution.test.ts +93 -0
  384. package/src/tests/models-catalog.test.ts +42 -1
  385. package/src/tests/node-env-runtime.test.ts +98 -0
  386. package/src/tests/openai-compatible-providers.test.ts +134 -0
  387. package/src/tests/openai-compatible-registry-extension.test.ts +42 -0
  388. package/src/tests/opencode-adapter.test.ts +348 -3
  389. package/src/tests/opencode-billing.test.ts +28 -0
  390. package/src/tests/opencode-helmcode-sdk.test.ts +201 -0
  391. package/src/tests/opencode-shell-env.test.ts +145 -0
  392. package/src/tests/openrouter-base-url.test.ts +101 -151
  393. package/src/tests/page-proxy.test.ts +1 -1
  394. package/src/tests/pages-browser-sdk.test.ts +76 -0
  395. package/src/tests/pages-feedback.test.ts +1 -1
  396. package/src/tests/paused-tasks-requested-by.test.ts +102 -0
  397. package/src/tests/pi-custom-provider-fake-server.test.ts +442 -0
  398. package/src/tests/pi-mono-adapter.test.ts +385 -5
  399. package/src/tests/pi-shell-env.test.ts +170 -0
  400. package/src/tests/prompt-template-remaining.test.ts +35 -0
  401. package/src/tests/rbac-engine.test.ts +11 -3
  402. package/src/tests/runner-exit-after-tasks.test.ts +0 -4
  403. package/src/tests/runner-identity-refresh.test.ts +3 -0
  404. package/src/tests/runner-legacy-resume-prompt.test.ts +64 -0
  405. package/src/tests/script-connections-sql.test.ts +675 -0
  406. package/src/tests/script-connections.test.ts +7 -1
  407. package/src/tests/scripts-http.test.ts +201 -1
  408. package/src/tests/scripts-only-gating.test.ts +2 -3
  409. package/src/tests/scripts-runtime.test.ts +58 -40
  410. package/src/tests/secret-scrubber.test.ts +86 -0
  411. package/src/tests/seed-skills-bundled-files.test.ts +45 -53
  412. package/src/tests/seed-skills-retire.test.ts +182 -0
  413. package/src/tests/send-task-requester-gate.test.ts +58 -0
  414. package/src/tests/session-cost-recompute-unit.test.ts +94 -0
  415. package/src/tests/skill-get-name-resolution.test.ts +137 -0
  416. package/src/tests/slack-channel-join.test.ts +4 -1
  417. package/src/tests/slack-external-channel-config.test.ts +65 -0
  418. package/src/tests/slack-external-channel-egress.test.ts +237 -0
  419. package/src/tests/slack-external-channel-guard.test.ts +280 -0
  420. package/src/tests/slack-external-channel-tools.test.ts +173 -0
  421. package/src/tests/slack-external-channel.test.ts +370 -0
  422. package/src/tests/slack-render-v2.test.ts +86 -10
  423. package/src/tests/sonnet-5-5-registry.test.ts +9 -1
  424. package/src/tests/spec-base-url.test.ts +16 -1
  425. package/src/tests/swarm-config-export-to-env.test.ts +267 -0
  426. package/src/tests/swarm-config-reserved-keys.test.ts +16 -0
  427. package/src/tests/swarm-diff.test.ts +1 -1
  428. package/src/tests/task-model-effort-rerun.test.ts +164 -0
  429. package/src/tests/task-session-prompts.test.ts +132 -0
  430. package/src/tests/task-tool-manifest.test.ts +14 -0
  431. package/src/tests/task-tools-ctx.test.ts +2 -0
  432. package/src/tests/tool-annotations.test.ts +6 -6
  433. package/src/tests/ui-logs-parser.test.ts +43 -0
  434. package/src/tests/used-by-route.test.ts +6 -0
  435. package/src/tests/vendored-openapi.test.ts +16 -1
  436. package/src/tests/vercel-ai-gateway.test.ts +149 -0
  437. package/src/tests/workflow-swarm-script.test.ts +38 -0
  438. package/src/tests/workflow-wait-filter.test.ts +5 -3
  439. package/src/tools/chat-access.ts +41 -0
  440. package/src/tools/chat-open-dm.ts +59 -0
  441. package/src/tools/chat-post.ts +74 -0
  442. package/src/tools/chat-read-thread.ts +100 -0
  443. package/src/tools/chat-reply.ts +75 -0
  444. package/src/tools/create-page.ts +3 -13
  445. package/src/tools/defer-task.ts +17 -0
  446. package/src/tools/model-catalog/index.ts +2 -1
  447. package/src/tools/register-chat-channel.ts +139 -0
  448. package/src/tools/send-task.ts +24 -0
  449. package/src/tools/skills/skill-get.ts +17 -9
  450. package/src/tools/slack-post.ts +6 -0
  451. package/src/tools/slack-read.ts +8 -0
  452. package/src/tools/slack-reply.ts +6 -0
  453. package/src/tools/slack-start-thread.ts +6 -0
  454. package/src/tools/slack-update.ts +6 -0
  455. package/src/tools/slack-upload-file.ts +6 -0
  456. package/src/tools/swarm-config/get-config.ts +2 -1
  457. package/src/tools/swarm-config/list-config.ts +2 -1
  458. package/src/tools/swarm-config/set-config.ts +16 -3
  459. package/src/tools/tool-config.ts +8 -6
  460. package/src/types.ts +12 -2
  461. package/src/utils/config-env-export.ts +74 -0
  462. package/src/utils/credentials.test.ts +92 -0
  463. package/src/utils/credentials.ts +52 -4
  464. package/src/utils/harness-provider.ts +15 -6
  465. package/src/utils/node-env.ts +24 -0
  466. package/src/utils/runtime-model-catalog.ts +11 -1
  467. package/src/utils/secret-scrubber.ts +71 -2
  468. package/src/utils/task-tool-manifest.ts +19 -2
  469. package/src/workflows/executors/swarm-script.ts +1 -0
  470. package/templates/skills/agent-browser/SKILL.md +1 -1
  471. package/templates/skills/agent-browser/content.md +1 -1
  472. package/templates/skills/apps/SKILL.md +749 -0
  473. package/templates/skills/apps/content.md +60 -22
  474. package/templates/skills/chat-sdk/config.json +14 -0
  475. package/templates/skills/chat-sdk/content.md +84 -0
  476. package/templates/skills/composio-gmail/content.md +7 -0
  477. package/templates/skills/composio-google-docs/content.md +1 -1
  478. package/templates/skills/email-domain-health/config.json +14 -0
  479. package/templates/skills/email-domain-health/content.md +131 -0
  480. package/templates/skills/kv-storage/content.md +2 -2
  481. package/templates/skills/pages/content.md +8 -10
  482. package/templates/skills/qa-loom/config.json +14 -0
  483. package/templates/skills/qa-loom/content.md +187 -0
  484. package/templates/skills/qa-loom/files/build-loom.mjs +221 -0
  485. package/templates/skills/qa-loom/files/run-qa.sh +57 -0
  486. package/templates/skills/slack-interaction/content.md +4 -0
  487. package/templates/skills/swarm-extensions/content.md +2 -0
  488. package/templates/skills/swarm-scripts/SKILL.md +4 -2
  489. package/templates/skills/swarm-scripts/config.json +1 -1
  490. package/templates/skills/swarm-scripts/content.md +4 -2
  491. package/templates/skills/workflow-iterate/content.md +38 -0
  492. package/dist/artifact-eczsknc3.js +0 -3843
  493. package/dist/cli-9xsmdpdt.js +0 -56377
  494. package/dist/cli-bd957dgb.js +0 -153
  495. package/dist/cli-q51yprfq.js +0 -1104
  496. package/dist/cli-t1ze64h3.js +0 -811
  497. package/dist/index-9ch1n761.js +0 -1102
  498. package/src/artifact-sdk/index.ts +0 -2
  499. package/src/artifact-sdk/localtunnel.d.ts +0 -20
  500. package/src/artifact-sdk/port.ts +0 -12
  501. package/src/artifact-sdk/server.ts +0 -183
  502. package/src/artifact-sdk/tunnel.ts +0 -19
  503. package/src/commands/artifact.ts +0 -249
  504. package/src/http/ecosystem.ts +0 -77
  505. package/src/tests/artifact-commands.test.ts +0 -92
  506. package/src/tests/artifact-sdk.test.ts +0 -793
  507. package/src/tests/register-service-security.test.ts +0 -194
  508. package/src/tools/list-services.ts +0 -107
  509. package/src/tools/register-service.ts +0 -177
  510. package/src/tools/unregister-service.ts +0 -73
  511. package/src/tools/update-service-status.ts +0 -96
  512. package/templates/skills/artifacts/config.json +0 -14
  513. package/templates/skills/artifacts/content.md +0 -344
  514. package/templates/skills/artifacts/files/examples/approval-flow.ts +0 -34
  515. package/templates/skills/artifacts/files/examples/hono-dashboard.ts +0 -31
  516. package/templates/skills/artifacts/files/examples/multi-artifact.ts +0 -20
  517. package/templates/skills/artifacts/files/examples/static-report.sh +0 -17
  518. package/dist/{azure-openai-responses-ap1gwxgr.js → azure-openai-responses-ygfreq4t.js} +5 -5
  519. package/dist/{cli-5rqrj7q0.js → cli-pw7ebjdt.js} +0 -0
  520. package/dist/{openai-codex-responses-33qhkkdy.js → openai-codex-responses-3bk0grnr.js} +4 -4
  521. package/dist/{openai-completions-s88xm3ns.js → openai-completions-5d4jpakc.js} +9 -9
  522. package/dist/{openai-responses-7xd2f2e2.js → openai-responses-krb51f59.js} +5 -5
  523. package/dist/{pi-messages-xszk613n.js → pi-messages-x9gzynm1.js} +3 -3
  524. /package/src/{artifact-sdk → pages}/browser-sdk.ts +0 -0
  525. /package/src/{artifact-sdk → pages}/feedback-overlay.ts +0 -0
@@ -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
@@ -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 { isInternalConfigKey, isReservedConfigKey, reservedKeyError } from "./swarm-config-guard";
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
- `SELECT card.*, wake.id AS wake_task_id
794
- FROM slack_messages card
795
- JOIN agent_tasks deferred ON deferred.id = card.task_id
796
- JOIN agent_tasks wake ON wake.parentTaskId = deferred.id AND wake.taskType = 'deferred'
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 deferred.deferredAt IS NOT NULL
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/background services)
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
- [storedValue, isSecret, envPath, description, encryptedFlag, now, existing.id],
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;