@desplega.ai/agent-swarm 1.152.2 → 1.154.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 (284) hide show
  1. package/README.md +2 -2
  2. package/dist/{acp-adapter-pfeje2v5.js → acp-adapter-eb2aj8xy.js} +4 -4
  3. package/dist/{actions-0sttc7f5.js → actions-kpnwp1kz.js} +31 -27
  4. package/dist/{anthropic-messages-2y8nktar.js → anthropic-messages-9vqsbznt.js} +112 -84
  5. package/dist/{app-p8teva95.js → app-zk1apkf6.js} +10 -7
  6. package/dist/{assistant-r45jnsrt.js → assistant-kwq4y50q.js} +32 -28
  7. package/dist/{azure-openai-responses-f38x2avq.js → azure-openai-responses-04qwdwfq.js} +27 -13
  8. package/dist/{boot-reembed-je26h5y7.js → boot-reembed-22hd3jjn.js} +9 -7
  9. package/dist/{boot-reembed-1qmybsd4.js → boot-reembed-qe168424.js} +10 -8
  10. package/dist/{boot-scrub-logs-gte3h1mm.js → boot-scrub-logs-pkdpsrjd.js} +7 -5
  11. package/dist/{claude-adapter-csc1mzka.js → claude-adapter-3fx90nww.js} +18 -16
  12. package/dist/{claude-managed-adapter-dsmkcrjy.js → claude-managed-adapter-ea2aga6w.js} +3 -3
  13. package/dist/{claude-sdk-session-fcd6f078.js → claude-sdk-session-z7fahf1k.js} +18 -16
  14. package/dist/{cli-r2fpe7cx.js → cli-00w2c66p.js} +61 -55
  15. package/dist/{cli-wbyk465z.js → cli-09y3tjxz.js} +1 -1
  16. package/dist/{cli-ht5rs63n.js → cli-0e31nm4n.js} +16 -7
  17. package/dist/cli-0x5qzvkg.js +4279 -0
  18. package/dist/{cli-d3p82erb.js → cli-18amys3y.js} +9 -9
  19. package/dist/{cli-4ahpr4sw.js → cli-1jpjafw4.js} +5 -5
  20. package/dist/{cli-jbmc0r7r.js → cli-243tzws8.js} +1 -1
  21. package/dist/{cli-ch38q5z4.js → cli-24k806sc.js} +6789 -2542
  22. package/dist/cli-3bkz2p7j.js +2828 -0
  23. package/dist/cli-3er6gcsn.js +1849 -0
  24. package/dist/cli-4k7jazkq.js +3339 -0
  25. package/dist/{cli-c4eeb5q2.js → cli-5b6b62tz.js} +1 -1
  26. package/dist/{cli-qd65dvr6.js → cli-5vs0nh43.js} +65 -44
  27. package/dist/{cli-z3wkng35.js → cli-6r3cgpk2.js} +224 -156
  28. package/dist/{cli-pgj4a5fb.js → cli-71cj99hx.js} +4 -3
  29. package/dist/cli-8sea27q4.js +14075 -0
  30. package/dist/{cli-jvy9qgjs.js → cli-913yakhv.js} +22 -7
  31. package/dist/{cli-pf9q3696.js → cli-927erqqt.js} +5 -2
  32. package/dist/cli-95jnpnqg.js +230 -0
  33. package/dist/{cli-wpv5rgg2.js → cli-abp3g4ax.js} +15 -2
  34. package/dist/{cli-ckz5t2hb.js → cli-acy6bfhr.js} +10 -7
  35. package/dist/{cli-4yc5d8fk.js → cli-avkd6mqv.js} +50 -0
  36. package/dist/{cli-8wrympd7.js → cli-bzr0ftht.js} +26 -7
  37. package/dist/{cli-qn042eh7.js → cli-c1v10xb2.js} +194 -1913
  38. package/dist/cli-cgj4hc12.js +18902 -0
  39. package/dist/{cli-2nnd56zt.js → cli-e0pg4zeh.js} +3 -2
  40. package/dist/{cli-r84ctdxn.js → cli-e31ehqwy.js} +2 -2
  41. package/dist/{cli-gphgnvpf.js → cli-e3229na9.js} +3 -3
  42. package/dist/{cli-gpqcs935.js → cli-e3cyf59d.js} +2 -2
  43. package/dist/{cli-s25avqg9.js → cli-e781c6f9.js} +1 -0
  44. package/dist/{cli-s2qjdd6z.js → cli-eetrvv91.js} +1 -1
  45. package/dist/{cli-j4nv2wqy.js → cli-fdzg6jhf.js} +10 -4
  46. package/dist/{cli-fm4ytsdk.js → cli-g2h29qar.js} +2 -2
  47. package/dist/{cli-zvgj5zg8.js → cli-ge67p080.js} +302 -3497
  48. package/dist/cli-h38x0qhg.js +6912 -0
  49. package/dist/{cli-9xvdm3bx.js → cli-h60qfasa.js} +742 -278
  50. package/dist/{cli-jew3jda5.js → cli-hws0vn86.js} +2 -2
  51. package/dist/{cli-j8dggbcr.js → cli-k0g1sjzm.js} +23 -31
  52. package/dist/{cli-xw7vak96.js → cli-kp3qs53m.js} +5 -5
  53. package/dist/{cli-rgvp6r2x.js → cli-mcnhgnn1.js} +193 -4
  54. package/dist/{cli-zvkq5csn.js → cli-myaxtgh8.js} +7 -6
  55. package/dist/{cli-56h18ng2.js → cli-n62atwh9.js} +1 -1
  56. package/dist/cli-n7h1kqpf.js +29 -0
  57. package/dist/{cli-fmy65jdn.js → cli-pf1v8xhb.js} +7 -5
  58. package/dist/{cli-xy1cchaf.js → cli-q85qhckh.js} +238 -11
  59. package/dist/{cli-3bpzj8me.js → cli-r1d3dzt6.js} +2 -2
  60. package/dist/{pi-mono-adapter-jcqt71cg.js → cli-rxkqvngf.js} +67343 -101083
  61. package/dist/{cli-kj76p1ez.js → cli-scwq51gn.js} +13 -7
  62. package/dist/{cli-b9dd0h3k.js → cli-stwsmd6k.js} +3 -2
  63. package/dist/{cli-c2mk1kgf.js → cli-v4en75c5.js} +8 -1
  64. package/dist/{cli-z61ykvam.js → cli-wg04s9kr.js} +4 -3
  65. package/dist/cli-yn0a417a.js +4069 -0
  66. package/dist/{cli-zfzznn7c.js → cli-ytxs7mn1.js} +26 -2
  67. package/dist/{cli-4j8k1m4w.js → cli-zt1227k1.js} +1162 -192
  68. package/dist/cli.js +28 -35
  69. package/dist/{codex-adapter-fxmpsabw.js → codex-adapter-ttdm995v.js} +12 -11
  70. package/dist/{codex-hook-8jexc34x.js → codex-hook-8gx7bcz0.js} +3 -3
  71. package/dist/{codex-session-runner-rr1e47ea.js → codex-session-runner-3v8nh4c8.js} +12 -11
  72. package/dist/{commands-0f5rxz51.js → commands-1cxwbhhq.js} +7 -5
  73. package/dist/{db-r3jxf3wy.js → db-y9zwsr79.js} +25 -5
  74. package/dist/{dispatcher-06vph6q4.js → dispatcher-9m9zss36.js} +30 -26
  75. package/dist/dsh-adapter-gsb2qqf9.js +19 -0
  76. package/dist/{e2b-413b8t4v.js → e2b-93x1k0j5.js} +6 -7
  77. package/dist/{google-generative-ai-ndjmj5fa.js → google-generative-ai-gwwrnzqn.js} +33 -73
  78. package/dist/{google-vertex-fr665tqs.js → google-vertex-5wfawpwz.js} +38 -68
  79. package/dist/{handlers-0hgtc910.js → handlers-36fm1bwn.js} +33 -29
  80. package/dist/{hook-9kvrv1er.js → hook-pntw4r8h.js} +12 -10
  81. package/dist/{hook-fbfhkat3.js → hook-vwq8y26p.js} +13 -11
  82. package/dist/{http-xbyx8k5j.js → http-20jesakk.js} +357 -261
  83. package/dist/{index-jsw3aynb.js → index-6artrehg.js} +30 -26
  84. package/dist/{cli-pdz9qde4.js → index-9ch1n761.js} +10 -11
  85. package/dist/{index-rnyahfn5.js → index-9n5z2492.js} +30 -26
  86. package/dist/{index-66xz5e9j.js → index-h5gs261z.js} +521 -9
  87. package/dist/{index-tfsdxyv6.js → index-j5wrf1yw.js} +40 -25
  88. package/dist/{index-2sp0384z.js → index-kkeftv5h.js} +738 -21
  89. package/dist/{index-sgk50mbg.js → index-m2xqpz5r.js} +31 -27
  90. package/dist/{index-gpfn1741.js → index-m9ks8a7t.js} +9 -7
  91. package/dist/index-w097eg0x.js +5 -0
  92. package/dist/jiti-loader-b4837mtm.js +34 -0
  93. package/dist/jiti-static-loader-q2g5ds0y.js +31267 -0
  94. package/dist/{keepalive-s3xpr7sw.js → keepalive-pwxvxd2c.js} +9 -7
  95. package/dist/{lead-rq4n5r16.js → lead-m789wqa3.js} +46 -41
  96. package/dist/{maintenance-f0atj1ab.js → maintenance-bvg6w7e2.js} +10 -8
  97. package/dist/{mistral-conversations-qhr84ph3.js → mistral-conversations-zx0kn554.js} +24 -18
  98. package/dist/{node-x1g4v0pq.js → node-5qtycf6a.js} +16 -11
  99. package/dist/{oauth-refresh-sweep-q0t3bxre.js → oauth-refresh-sweep-6v4bd737.js} +8 -6
  100. package/dist/{onboard-br5j1kch.js → onboard-snckpcj1.js} +115 -35
  101. package/dist/{openai-codex-responses-wy6a43wd.js → openai-codex-responses-4vjqzvjp.js} +33 -27
  102. package/dist/{openai-completions-32rdwmze.js → openai-completions-pxsmym7g.js} +52 -64
  103. package/dist/{openai-responses-6xwf7bzg.js → openai-responses-tmn0rqp0.js} +23 -24
  104. package/dist/{opencode-adapter-28axqa09.js → opencode-adapter-qbmv4tpy.js} +6 -6
  105. package/dist/{otel-impl-vdqge2nt.js → otel-impl-e0ytens5.js} +4 -4
  106. package/dist/{pi-messages-b1mbr6gp.js → pi-messages-txpjj39q.js} +3 -3
  107. package/dist/pi-mono-adapter-c4ggemhz.js +1316 -0
  108. package/dist/{pricing-refresh-hb3691fd.js → pricing-refresh-52g2ywrw.js} +9 -7
  109. package/dist/{rbac-roles-t78xt39b.js → rbac-roles-5455kfdn.js} +8 -6
  110. package/dist/{rbac-roles-jh280k9g.js → rbac-roles-hbf0xa52.js} +9 -7
  111. package/dist/{render-v2-7p8r2ymg.js → render-v2-npm8xdzh.js} +16 -9
  112. package/dist/{seed-pricing-hf889enh.js → seed-pricing-650wbr1n.js} +8 -6
  113. package/dist/{setup-w6mb03jv.js → setup-k1mew5rf.js} +4 -5
  114. package/dist/virtual-modules-2q5b2pk4.js +54 -0
  115. package/dist/{work-objects-nt8gy1kj.js → work-objects-2ea3kvwg.js} +33 -29
  116. package/dist/{worker-dwy617t0.js → worker-ec6hvc4m.js} +46 -41
  117. package/openapi.json +109 -16
  118. package/package.json +7 -6
  119. package/plugin/opencode-plugins/lib/memory-raters.ts +7 -0
  120. package/src/be/automation-preflight.ts +6 -4
  121. package/src/be/db/agents.ts +75 -2
  122. package/src/be/db/tasks/read.ts +2 -0
  123. package/src/be/db/tasks/write.ts +7 -1
  124. package/src/be/db.ts +140 -18
  125. package/src/be/extensions/db.ts +35 -4
  126. package/src/be/memory/raters/llm.ts +2 -6
  127. package/src/be/memory/raters/noop.ts +2 -3
  128. package/src/be/memory/raters/registry.ts +4 -10
  129. package/src/be/migrations/157_defer_provenance_and_marker.sql +27 -0
  130. package/src/be/models-catalog.ts +2 -0
  131. package/src/be/modelsdev-cache.json +213 -0
  132. package/src/be/rbac-audit.ts +2 -0
  133. package/src/be/seed/agent-fs-provision.ts +23 -0
  134. package/src/be/seed-pricing.ts +3 -1
  135. package/src/be/swarm-config-guard.ts +1 -0
  136. package/src/commands/onboard/compose-generator.ts +16 -1
  137. package/src/commands/onboard/env-generator.ts +14 -1
  138. package/src/commands/onboard/manifest.ts +1 -0
  139. package/src/commands/onboard/steps/integration-slack.tsx +56 -16
  140. package/src/commands/onboard/steps/review.tsx +5 -0
  141. package/src/commands/onboard/types.ts +6 -0
  142. package/src/commands/onboard.tsx +5 -1
  143. package/src/commands/provider-credentials.ts +14 -2
  144. package/src/commands/runner.ts +18 -2
  145. package/src/extensions/identity.ts +15 -7
  146. package/src/extensions/lifecycle.ts +15 -21
  147. package/src/hooks/codex-hook.ts +7 -1
  148. package/src/http/agents.ts +12 -4
  149. package/src/http/config.ts +1 -1
  150. package/src/http/core.ts +5 -3
  151. package/src/http/extensions.ts +108 -34
  152. package/src/http/poll.ts +7 -0
  153. package/src/http/schedules.ts +10 -0
  154. package/src/http/script-runs.ts +35 -26
  155. package/src/http/status.ts +24 -11
  156. package/src/http/tasks.ts +6 -1
  157. package/src/prompts/base-prompt.ts +15 -7
  158. package/src/prompts/memories.ts +5 -7
  159. package/src/prompts/session-templates.ts +3 -2
  160. package/src/prompts/steering-delivery.ts +2 -0
  161. package/src/providers/claude-managed-models.ts +8 -0
  162. package/src/providers/codex-adapter.ts +3 -6
  163. package/src/providers/codex-models.ts +15 -1
  164. package/src/providers/dsh-adapter.ts +248 -0
  165. package/src/providers/index.ts +5 -1
  166. package/src/providers/modelsdev-reasoning.json +50 -0
  167. package/src/providers/pi-mono-extension.ts +2 -5
  168. package/src/rbac/legacy-policy.ts +15 -1
  169. package/src/rbac/types.ts +2 -0
  170. package/src/server.ts +7 -1
  171. package/src/slack/ack.ts +43 -8
  172. package/src/slack/app.ts +32 -10
  173. package/src/slack/config.ts +29 -0
  174. package/src/slack/handlers.ts +7 -1
  175. package/src/slack/render-v2.ts +186 -17
  176. package/src/slack/responses.ts +1 -3
  177. package/src/slack/task-output.ts +66 -8
  178. package/src/slack/thread-buffer.ts +27 -3
  179. package/src/telemetry.ts +2 -3
  180. package/src/tests/agent-fs-provision-seeder.test.ts +56 -2
  181. package/src/tests/agents-harness-provider.test.ts +19 -0
  182. package/src/tests/agents-list-model-display.test.ts +60 -1
  183. package/src/tests/base-prompt.test.ts +25 -0
  184. package/src/tests/claude-managed-adapter.test.ts +6 -0
  185. package/src/tests/codex-gpt6-release.test.ts +97 -0
  186. package/src/tests/codex-steering-hook.test.ts +2 -2
  187. package/src/tests/config-api-only-keys.test.ts +9 -0
  188. package/src/tests/context-window.test.ts +1 -0
  189. package/src/tests/db-task-read-contract.test.ts +9 -0
  190. package/src/tests/db-task-write-contract.test.ts +9 -0
  191. package/src/tests/defer-task.test.ts +115 -16
  192. package/src/tests/dsh-adapter.test.ts +276 -0
  193. package/src/tests/e2e-nightly-report.test.ts +3 -3
  194. package/src/tests/e2e-redact.test.ts +2 -0
  195. package/src/tests/env-flag.test.ts +6 -0
  196. package/src/tests/extension-agent-visibility.test.ts +474 -0
  197. package/src/tests/extensions-db.test.ts +41 -0
  198. package/src/tests/extensions-http.test.ts +148 -4
  199. package/src/tests/extensions-lifecycle.test.ts +21 -1
  200. package/src/tests/extensions-mcp-tools.test.ts +9 -5
  201. package/src/tests/fetch-resolved-env.test.ts +43 -0
  202. package/src/tests/internal-ai/complete-structured.test.ts +32 -9
  203. package/src/tests/internal-ai/credentials.test.ts +4 -4
  204. package/src/tests/internal-ai/models.test.ts +20 -0
  205. package/src/tests/memory-rate-tool.test.ts +7 -10
  206. package/src/tests/memory-rater-defaults.test.ts +23 -0
  207. package/src/tests/memory-rater-e2e.test.ts +2 -3
  208. package/src/tests/migration-046-budgets.test.ts +2 -0
  209. package/src/tests/model-control.test.ts +2 -2
  210. package/src/tests/onboard-compose.test.ts +14 -0
  211. package/src/tests/onboard-env.test.ts +17 -0
  212. package/src/tests/onboard-manifest.test.ts +12 -0
  213. package/src/tests/opus-5-5-registry.test.ts +48 -0
  214. package/src/tests/pricing-refresh.test.ts +1 -1
  215. package/src/tests/pricing-routes.test.ts +15 -3
  216. package/src/tests/provider-registration.test.ts +5 -2
  217. package/src/tests/rbac-admission-e2e.test.ts +54 -0
  218. package/src/tests/rbac-e2e-helpers.ts +2 -0
  219. package/src/tests/rbac-engine.test.ts +32 -0
  220. package/src/tests/rbac-wire-e2e.test.ts +33 -0
  221. package/src/tests/reasoning-effort.test.ts +8 -0
  222. package/src/tests/reload-config.test.ts +33 -0
  223. package/src/tests/script-connections.test.ts +3 -0
  224. package/src/tests/session-costs-model-key-normalize.test.ts +1 -0
  225. package/src/tests/slack-config.test.ts +136 -0
  226. package/src/tests/slack-mode-lifecycle.test.ts +69 -0
  227. package/src/tests/slack-render-v2.test.ts +446 -16
  228. package/src/tests/slack-steering.test.ts +69 -1
  229. package/src/tests/slack-task-output.test.ts +33 -12
  230. package/src/tests/status.test.ts +22 -2
  231. package/src/tests/steering-core.test.ts +35 -0
  232. package/src/tests/steering-delivery.test.ts +39 -0
  233. package/src/tests/steering-transport.test.ts +2 -2
  234. package/src/tests/task-tool-preload-mcp.test.ts +3 -1
  235. package/src/tests/telemetry-init.test.ts +18 -0
  236. package/src/tests/workflow-live-recovery.test.ts +126 -0
  237. package/src/tests/workflow-llm.test.ts +3 -3
  238. package/src/tools/defer-task.ts +64 -26
  239. package/src/tools/extension-common.ts +4 -0
  240. package/src/tools/extension-install.ts +1 -1
  241. package/src/tools/extension-list.ts +4 -3
  242. package/src/tools/join-swarm.ts +1 -1
  243. package/src/tools/schedules/create-schedule.ts +11 -1
  244. package/src/tools/schedules/patch-schedule.ts +5 -0
  245. package/src/tools/schedules/update-schedule.ts +5 -0
  246. package/src/tools/send-task.ts +6 -0
  247. package/src/tools/utils.ts +1 -1
  248. package/src/types.ts +30 -8
  249. package/src/utils/context-window.ts +1 -0
  250. package/src/utils/credentials.ts +8 -0
  251. package/src/utils/internal-ai/complete-structured.ts +8 -0
  252. package/src/utils/internal-ai/models.ts +5 -5
  253. package/src/utils/memory-raters.ts +3 -0
  254. package/src/workflows/engine.ts +28 -0
  255. package/src/workflows/recovery.ts +7 -4
  256. package/templates/schedules/daily-status-report/content.md +25 -12
  257. package/templates/schedules/daily-workflow-health-audit/content.md +1 -1
  258. package/templates/skills/swarm-extensions/content.md +9 -5
  259. package/dist/cli-4wppfkcm.js +0 -16384
  260. package/dist/cli-55qrx3q8.js +0 -6041
  261. package/dist/cli-cg4vnyh4.js +0 -305
  262. package/dist/cli-jyetr64j.js +0 -52
  263. package/dist/cli-pp9ax9pa.js +0 -520
  264. package/dist/cli-qa66qaf0.js +0 -6076
  265. package/dist/cli-qghpvca2.js +0 -590
  266. package/dist/cli-rembwgt8.js +0 -861
  267. package/dist/cli-tcvj7j2r.js +0 -1971
  268. package/dist/cli-vfcth11k.js +0 -36
  269. package/dist/cli-w1d1bgkk.js +0 -1422
  270. package/dist/cli-y6x0gqtg.js +0 -5977
  271. package/dist/es5-tj3tn4jj.js +0 -844
  272. package/dist/index-1kq5hw2p.js +0 -467
  273. package/dist/index-1p8wdstt.js +0 -7
  274. package/dist/index-8fdjzb2f.js +0 -100
  275. package/dist/index-bxmwzbgw.js +0 -365
  276. package/dist/index-nzerxd5z.js +0 -7
  277. package/dist/index-pyymnzat.js +0 -1168
  278. package/dist/index-qv6atbab.js +0 -619
  279. package/dist/index-rja32qa7.js +0 -801
  280. package/dist/index-tzg5srfp.js +0 -211
  281. package/dist/index-vhncw983.js +0 -90
  282. package/dist/index-xk036zsk.js +0 -859
  283. package/dist/index-zyazbzcb.js +0 -6
  284. package/dist/{claude-managed-setup-48dwg9bv.js → claude-managed-setup-f5pmsyrp.js} +3 -3
@@ -6,21 +6,21 @@ import {
6
6
  extractArgsJsonSchema,
7
7
  extractScriptSignature,
8
8
  typecheckScript
9
- } from "./cli-wpv5rgg2.js";
9
+ } from "./cli-abp3g4ax.js";
10
10
  import {
11
11
  getScript,
12
12
  require_dist,
13
13
  upsertScriptByName,
14
14
  validateDefinition,
15
15
  validateScriptImports
16
- } from "./cli-fmy65jdn.js";
16
+ } from "./cli-pf1v8xhb.js";
17
17
  import"./cli-epan13p1.js";
18
18
  import"./cli-y89t4nca.js";
19
19
  import"./cli-f14fvzag.js";
20
- import"./cli-56h18ng2.js";
21
- import"./cli-gpqcs935.js";
22
- import"./cli-jew3jda5.js";
23
- import"./cli-fm4ytsdk.js";
20
+ import"./cli-n62atwh9.js";
21
+ import"./cli-e3cyf59d.js";
22
+ import"./cli-hws0vn86.js";
23
+ import"./cli-g2h29qar.js";
24
24
  import"./cli-aehm1rbq.js";
25
25
  import"./cli-2658f6at.js";
26
26
  import {
@@ -39,15 +39,17 @@ import {
39
39
  updateSkill,
40
40
  updateWorkflow,
41
41
  upsertSkillFiles
42
- } from "./cli-zvgj5zg8.js";
43
- import"./cli-ht5rs63n.js";
44
- import"./cli-z61ykvam.js";
42
+ } from "./cli-ge67p080.js";
43
+ import"./cli-4k7jazkq.js";
44
+ import"./cli-0e31nm4n.js";
45
+ import"./cli-wg04s9kr.js";
46
+ import"./cli-v4en75c5.js";
45
47
  import"./cli-dv6cdjs2.js";
46
- import"./cli-c2mk1kgf.js";
48
+ import"./cli-n7h1kqpf.js";
47
49
  import"./cli-ej6gbxfb.js";
48
50
  import"./cli-sd0mxa3c.js";
49
51
  import"./cli-w5e1d1vv.js";
50
- import"./cli-zvkq5csn.js";
52
+ import"./cli-myaxtgh8.js";
51
53
  import"./cli-r2ap2czm.js";
52
54
  import"./cli-zf8jjwex.js";
53
55
  import {
@@ -10541,7 +10543,7 @@ var config_default41 = `{
10541
10543
  `;
10542
10544
 
10543
10545
  // templates/skills/swarm-extensions/content.md
10544
- var content_default41 = "# Swarm Extensions\n\nAn extension is a trusted TypeScript hook bundle that runs inside the swarm API server. Use one when a rule must apply to the whole swarm: block or rewrite new tasks, route Slack channels, suppress follow-ups, change stalled-task remediation, guard tool calls, or react after a task or tool call finishes.\n\nDo not use an extension for work that one task, one script, or one schedule can do.\n\n## Tools\n\n`extension-install` and `extension-list`. They are deferred. Load them with your harness tool search before the first call.\n\n`extension-install` validates the bundle (manifest, imports, typecheck against the hook contract) and stores it. Only a lead agent, an operator, or a dashboard user may install. A worker gets `Forbidden` from the tool. When you are a worker, write and validate the bundle, then hand it to your lead with `send-task` (include the manifest, the hooks file, and the config) and report that in your output. Do not call the REST install route with the shared API key to get around the role check. The stored extension stays disabled. An operator enables it from the dashboard (Settings, Extensions) or with `POST /api/extensions/{id}/enable`. Say this in your task report and give the extension name.\n\nInstalling a bundle with the same name and changed files stores a new version. The active version does not change until an operator activates it.\n\n## Get the contract before you write hooks\n\nFetch the generated type definitions and read them. Do not guess event names or field names.\n\n```bash\ncurl -s \"$MCP_BASE_URL/api/extensions/type-defs\" \\\n -H \"X-Agent-ID: $AGENT_ID\" -H \"Authorization: Bearer ${AGENT_SWARM_API_KEY:-$API_KEY}\"\n```\n\n`$MCP_BASE_URL`, `$AGENT_ID`, and `$AGENT_SWARM_API_KEY` (or `$API_KEY`) are in every worker environment. The response is the `swarm-extension` module declaration: every event, its payload, and what a `modify` result may change.\n\n## Events\n\n| Event | When | Result |\n|---|---|---|\n| `pre.task.create` | before any task is stored (REST, MCP, Slack, schedule, workflow, webhook, follow-up) | `block(reason)`, `modify({ priority, agentId, tags, description, ... })`, or nothing |\n| `pre.task.followUp` | before the lead follow-up task for a finished worker task | `block`, `modify({ description, priority, agentId })`, or nothing |\n| `pre.slack.route` | before a Slack message becomes a task | `modify({ target: { kind: \"agent\", agentId } })`, `{ kind: \"lead\" }`, `{ kind: \"broadcast\" }` |\n| `pre.heartbeat.remediate` | after the heartbeat sweep finds a stalled task | `modify({ proposedAction: \"record\" | \"fail\" | \"supersede-resume\" })` |\n| `pre.tool.call` | before an agent MCP tool call runs | `block(reason)` or `modify({ args })` |\n| `post.task.created`, `post.task.completed`, `post.task.failed`, `post.task.cancelled`, `post.task.superseded`, `post.task.progress` | after the change is committed | none |\n| `post.slack.message`, `post.tool.call` | after the message or tool call finished | none |\n\n`event.origin` on `pre.task.create` tells where the task comes from: `rest`, `app`, `mcp`, `slack`, `schedule`, `workflow`, `webhook`, `followUp`, or `extension:<name>`.\n\n## Bundle shape\n\nThe bundle is a manifest plus a files map. Version 1 accepts one file, the `assets.hooks` TypeScript file, and only `runtime: \"api\"`.\n\n```json\n{\n \"manifest\": {\n \"name\": \"require-ticket-ref\",\n \"description\": \"Blocks REST and MCP tasks that do not name a ticket\",\n \"version\": \"1.0.0\",\n \"runtime\": \"api\",\n \"assets\": { \"hooks\": \"hooks.ts\" }\n },\n \"files\": { \"hooks.ts\": \"<file content>\" },\n \"config\": { \"pattern\": \"DES-\\\\d+\" }\n}\n```\n\nRules for `hooks.ts`:\n\n- Import only from `swarm-extension`, `zod`, and `stdlib`. Relative imports, other packages, and dynamic imports are rejected.\n- Export the extension as `default`. Export `config` (a Zod schema) when the extension takes configuration. The install validates `config` against it.\n- Return `block(reason)` or `modify(data)` from pre hooks. Return nothing to continue.\n- Keep handlers fast. A handler is cancelled after 5 seconds. Five consecutive failures auto-disable the extension.\n- Handlers run outside database transactions and must not assume ordering with other extensions. Use `priority` in `api.on(event, handler, { priority })` when order matters (lower runs first).\n\n## Minimal hooks file\n\n```ts\nimport { block, modify, type SwarmExtension } from \"swarm-extension\";\nimport { z } from \"zod\";\n\nexport const config = z.object({ pattern: z.string().default(\"DES-\\\\d+\") });\n\nconst manifest = {\n name: \"require-ticket-ref\",\n description: \"Blocks REST and MCP tasks that do not name a ticket\",\n version: \"1.0.0\",\n runtime: \"api\",\n assets: { hooks: \"hooks.ts\" },\n config,\n} as const;\n\nconst extension: SwarmExtension<typeof manifest> = (api) => {\n api.on(\"pre.task.create\", (event, ctx) => {\n if (event.origin !== \"rest\" && event.origin !== \"mcp\") return;\n if (new RegExp(ctx.config.pattern).test(event.description)) return;\n return block(`Task must reference a ticket matching ${ctx.config.pattern}`);\n });\n\n api.on(\"post.task.completed\", async (event, ctx) => {\n await ctx.state.incr(\"completed\");\n ctx.log.info(\"task completed\", { id: event.task.id });\n });\n};\n\nexport default extension;\n```\n\n## Context (`ctx`)\n\n- `ctx.config`: the validated configuration.\n- `ctx.state`: per-extension key-value store (`get`, `set`, `incr`, `del`).\n- `ctx.swarm`: the swarm SDK. Call any script-exposed tool by name with underscores, for example `await ctx.swarm.slack_post({ channelId, message })` or `await ctx.swarm.task_send({ ... })`. Calls made from a hook carry the `ext:<name>` identity, which has lead privileges while the extension is enabled. Calls resolve with `{ success, status, data }` and do not throw on a tool error. Check `success` and throw when the hook must fail. The type definitions import `SwarmSdk` from `swarm-sdk`. Call the `script-query-types` tool (or `GET /api/scripts/type-defs`) to get `swarm-sdk.d.ts` with every method name and argument type before you use `ctx.swarm`.\n- `ctx.log`: structured logger. Entries appear in the extension run log on the dashboard.\n- `ctx.signal`: abort signal for the 5-second cap.\n\n## Verify\n\n1. Call `extension-list` and confirm the name, version, and `enabled: false`.\n2. Report the enable step. After an operator enables it, the dashboard run log shows every dispatch with its result (`continue`, `modify`, `block`, or `error`).\n3. Trigger the event once and confirm the effect (for example, a blocked REST task returns HTTP 422 with your reason).\n\n## Common mistakes\n\n- Guessing event names. Fetch the type definitions.\n- Using `import` from a package other than `swarm-extension`, `zod`, or `stdlib`.\n- Returning a plain object instead of `block(...)` or `modify(...)`.\n- Modifying fields the event does not allow. Read the `*Modify` type for that event.\n- Expecting the extension to run after install. It runs only after an operator enables it.\n- Blocking tasks from every origin. Check `event.origin` so schedules, workflows, and follow-ups keep working unless you mean to block them.\n";
10546
+ var content_default41 = "# Swarm Extensions\n\nAn extension is a trusted TypeScript hook bundle that runs inside the swarm API server. Use one when a rule must apply to the whole swarm: block or rewrite new tasks, route Slack channels, suppress follow-ups, change stalled-task remediation, guard tool calls, or react after a task or tool call finishes.\n\nDo not use an extension for work that one task, one script, or one schedule can do.\n\n## Tools\n\n`extension-install` and `extension-list`. They are deferred. Load them with your harness tool search before the first call.\n\n`extension-install` validates the bundle (manifest, imports, typecheck against the hook contract) and stores it. Any authenticated agent, including a worker, can install a new bundle. Your agent is recorded as its owner in `createdByAgentId`; `extension-list` exposes that field. Always send your `X-Agent-ID` when using REST so ownership is attributed to you.\n\nWorkers may install subsequent versions only for their own extensions, and PATCH or DELETE their own disabled drafts. Ownership stays with the original creator; each version records its writer as `changedByAgentId`. Leads, operators, and dashboard users retain access to all bundles.\n\nA new install is disabled and inert. A lead, operator, or dashboard user must enable it with `extension-enable` or `POST /api/extensions/{id}/enable`. Workers cannot enable, disable, or activate versions. Report the extension name and the required activation step.\n\nInstalling changed files under your existing name stages a new version without activating it. Workers may stage code-only updates while an extension is enabled, but cannot PATCH or change its live config/priority. Ask a lead or operator to make those changes. `EXTENSION_ALLOW_LEAD_ACTIVATION=false` restricts activation to operators/dashboard users.\n\n## Get the contract before you write hooks\n\nFetch the generated type definitions and read them. Do not guess event names or field names.\n\n```bash\ncurl -s \"$MCP_BASE_URL/api/extensions/type-defs\" \\\n -H \"X-Agent-ID: $AGENT_ID\" -H \"Authorization: Bearer ${AGENT_SWARM_API_KEY:-$API_KEY}\"\n```\n\n`$MCP_BASE_URL`, `$AGENT_ID`, and `$AGENT_SWARM_API_KEY` (or `$API_KEY`) are in every worker environment. The response is the `swarm-extension` module declaration: every event, its payload, and what a `modify` result may change.\n\n## Events\n\n| Event | When | Result |\n|---|---|---|\n| `pre.task.create` | before any task is stored (REST, MCP, Slack, schedule, workflow, webhook, follow-up) | `block(reason)`, `modify({ priority, agentId, tags, description, ... })`, or nothing |\n| `pre.task.followUp` | before the lead follow-up task for a finished worker task | `block`, `modify({ description, priority, agentId })`, or nothing |\n| `pre.slack.route` | before a Slack message becomes a task | `modify({ target: { kind: \"agent\", agentId } })`, `{ kind: \"lead\" }`, `{ kind: \"broadcast\" }` |\n| `pre.heartbeat.remediate` | after the heartbeat sweep finds a stalled task | `modify({ proposedAction: \"record\" | \"fail\" | \"supersede-resume\" })` |\n| `pre.tool.call` | before an agent MCP tool call runs | `block(reason)` or `modify({ args })` |\n| `post.task.created`, `post.task.completed`, `post.task.failed`, `post.task.cancelled`, `post.task.superseded`, `post.task.progress` | after the change is committed | none |\n| `post.slack.message`, `post.tool.call` | after the message or tool call finished | none |\n\n`event.origin` on `pre.task.create` tells where the task comes from: `rest`, `app`, `mcp`, `slack`, `schedule`, `workflow`, `webhook`, `followUp`, or `extension:<name>`.\n\n## Bundle shape\n\nThe bundle is a manifest plus a files map. Version 1 accepts one file, the `assets.hooks` TypeScript file, and only `runtime: \"api\"`.\n\n```json\n{\n \"manifest\": {\n \"name\": \"require-ticket-ref\",\n \"description\": \"Blocks REST and MCP tasks that do not name a ticket\",\n \"version\": \"1.0.0\",\n \"runtime\": \"api\",\n \"assets\": { \"hooks\": \"hooks.ts\" }\n },\n \"files\": { \"hooks.ts\": \"<file content>\" },\n \"config\": { \"pattern\": \"DES-\\\\d+\" }\n}\n```\n\nRules for `hooks.ts`:\n\n- Import only from `swarm-extension`, `zod`, and `stdlib`. Relative imports, other packages, and dynamic imports are rejected.\n- Export the extension as `default`. Export `config` (a Zod schema) when the extension takes configuration. Activation validates `config` against it.\n- Return `block(reason)` or `modify(data)` from pre hooks. Return nothing to continue.\n- Keep handlers fast. A handler is cancelled after 5 seconds. Five consecutive failures auto-disable the extension.\n- Handlers run outside database transactions and must not assume ordering with other extensions. Use `priority` in `api.on(event, handler, { priority })` when order matters (lower runs first).\n\n## Minimal hooks file\n\n```ts\nimport { block, modify, type SwarmExtension } from \"swarm-extension\";\nimport { z } from \"zod\";\n\nexport const config = z.object({ pattern: z.string().default(\"DES-\\\\d+\") });\n\nconst manifest = {\n name: \"require-ticket-ref\",\n description: \"Blocks REST and MCP tasks that do not name a ticket\",\n version: \"1.0.0\",\n runtime: \"api\",\n assets: { hooks: \"hooks.ts\" },\n config,\n} as const;\n\nconst extension: SwarmExtension<typeof manifest> = (api) => {\n api.on(\"pre.task.create\", (event, ctx) => {\n if (event.origin !== \"rest\" && event.origin !== \"mcp\") return;\n if (new RegExp(ctx.config.pattern).test(event.description)) return;\n return block(`Task must reference a ticket matching ${ctx.config.pattern}`);\n });\n\n api.on(\"post.task.completed\", async (event, ctx) => {\n await ctx.state.incr(\"completed\");\n ctx.log.info(\"task completed\", { id: event.task.id });\n });\n};\n\nexport default extension;\n```\n\n## Context (`ctx`)\n\n- `ctx.config`: the validated configuration.\n- `ctx.state`: per-extension key-value store (`get`, `set`, `incr`, `del`).\n- `ctx.swarm`: the swarm SDK. Call any script-exposed tool by name with underscores, for example `await ctx.swarm.slack_post({ channelId, message })` or `await ctx.swarm.task_send({ ... })`. Calls made from a hook carry the `ext:<name>` identity, which has lead privileges while the extension is enabled. Calls resolve with `{ success, status, data }` and do not throw on a tool error. Check `success` and throw when the hook must fail. The type definitions import `SwarmSdk` from `swarm-sdk`. Call the `script-query-types` tool (or `GET /api/scripts/type-defs`) to get `swarm-sdk.d.ts` with every method name and argument type before you use `ctx.swarm`.\n- `ctx.log`: structured logger. Entries appear in the extension run log on the dashboard.\n- `ctx.signal`: abort signal for the 5-second cap.\n\n## Verify\n\n1. Call `extension-list` and confirm the name, version, and `enabled: false`.\n2. Report the enable step. After a lead or operator enables it, the dashboard run log shows every dispatch with its result (`continue`, `modify`, `block`, or `error`).\n3. Trigger the event once and confirm the effect (for example, a blocked REST task returns HTTP 422 with your reason).\n\n## Common mistakes\n\n- Guessing event names. Fetch the type definitions.\n- Using `import` from a package other than `swarm-extension`, `zod`, or `stdlib`.\n- Returning a plain object instead of `block(...)` or `modify(...)`.\n- Modifying fields the event does not allow. Read the `*Modify` type for that event.\n- Expecting the extension to run after install. It runs only after a lead or operator enables it.\n- Blocking tasks from every origin. Check `event.origin` so schedules, workflows, and follow-ups keep working unless you mean to block them.\n";
10545
10547
 
10546
10548
  // templates/skills/swarm-scripts/config.json
10547
10549
  var config_default42 = `{
@@ -15451,29 +15453,42 @@ Use the setup milestone data already retrieved from \`/status\`. Report only int
15451
15453
 
15452
15454
  ---
15453
15455
 
15454
- ## Phase 2: Post one digest
15456
+ ## Phase 2: Post one digest — EXCEPTION-ONLY, HARD CEILING 600 CHARACTERS
15455
15457
 
15456
- Post to your configured admin channel (or the in-app fallback if none is configured). Keep it to one message; omit any section with nothing to report.
15458
+ Operator feedback, 2026-09-23, verbatim: "too verbose every day". Brevity is a requirement of this job, not a preference. Count the characters before posting; over 600 ⇒ cut until it fits. A long report is a failed run, not a thorough one.
15457
15459
 
15458
- \`\`\`
15459
- 📊 Daily Status Report — [date]
15460
+ Post ONE message to your configured admin channel (in-app fallback if none configured).
15460
15461
 
15461
- Waiting on you: [N] needs_setup automations — [name: missing parameters/integrations → fix URL].
15462
+ **Everything healthy ⇒ exactly this one line, nothing else:**
15462
15463
 
15463
- Workflows: [X] enabled / [Y] total. [N] hard failures, [M] halted >24h in the last 24h.
15464
- Schedules: [X] enabled / [Y] total. [N] hard failures, [M] didn't fire on time, [K] with ≥3 consecutive errors.
15465
- Agents: [X] online / [Y] total. [names of any agent at/over capacity]. [N] agent-attributed failures in 7d.
15466
- Task failures (7d): [N] needs_setup · [N] gate-refusal · [N] infra · [N] real-defect · [N] unclassified (no reason set).
15467
- Integration setup: [missing credentials from /status], or all verified.
15468
15464
  \`\`\`
15465
+ 📊 <MM-DD> — all clear. Workflows <X>/<Y> · schedules <X>/<Y> · agents <X>/<Y> · <N> failures 7d, <N> real defects. Nothing for you.
15466
+ \`\`\`
15467
+
15468
+ **Add a line ONLY for something both TRUE and ACTIONABLE. Max 3 lines, one sentence each, no sub-bullets:**
15469
+ - an automation in \`needs_setup\` or an unverified integration — name + \`fixUrl\`
15470
+ - a workflow run halted >24h (Phase 1B)
15471
+ - a real defect, or a failure cluster on one agent / schedule / provider
15472
+ - a decision only the operator can make — state the options, end on the question
15473
+
15474
+ More than 3 qualify ⇒ post the 3 that matter and put the rest in the task output.
15475
+
15476
+ **NEVER in the Slack post** — all of this belongs in \`store-progress\` output, where the audit trail lives:
15477
+ - row counts and "read-only report" notes
15478
+ - methodology, query names, script names, phase narration
15479
+ - any zero ("0 halted", "all verified", "no data-quality gap") — silence means zero
15480
+ - week-over-week trend, unless a class crossed a threshold you name in the same line
15481
+ - a finding yesterday's report already carried unchanged
15482
+ - numbered explainers or paragraphs of reasoning
15469
15483
 
15470
15484
  ## Phase 3: Complete
15471
- \`store-progress\` with \`status: "completed"\` and an output paragraph naming the counts above and the Slack message ts (if posted).
15485
+ \`store-progress\` with \`status: "completed"\`. **This is where the detail goes** — every count from Phase 1, the per-class failure breakdown, and the Slack message ts. The Slack post is the headline; the task output is the record. Cutting the post does not mean cutting the work.
15472
15486
 
15473
15487
  ## Anti-patterns
15474
15488
  - ❌ Modifying anything — this schedule reports, it doesn't fix (that's \`daily-workflow-health-audit\` for plumbing and \`daily-compounding-reflection\` for agent/skill/memory evolution).
15475
15489
  - ❌ Folding the unclassified-failure bucket into "real defect" to make the number look more actionable than it is.
15476
- - ❌ Omitting the Waiting on you section — say explicitly when no automation is in \`needs_setup\` and all integrations are verified.
15490
+ - ❌ Narrating a zero. The all-clear line already covers \`needs_setup\` and integrations; only a non-verified integration or a real \`needs_setup\` automation earns its own line.
15491
+ - ❌ Exceeding 600 characters, or posting more than one message.
15477
15492
  `;
15478
15493
 
15479
15494
  // templates/schedules/daily-swarm-update-check/config.json
@@ -15745,7 +15760,7 @@ Otherwise:
15745
15760
  • schedule:<name> — consecutiveErrors=<n>, last error: <lastErrSnippet>
15746
15761
  \`\`\`
15747
15762
 
15748
- Omit any section whose count is 0. Cap message at 4000 chars (Slack limit) — if longer, keep top 5 per section and add \`…and <K> more\` lines.
15763
+ Omit any section whose count is 0. **HARD CEILING 700 characters — not the 4000-char Slack limit.** (Operator feedback, 2026-09-23: "too verbose every day".) Keep at most the top 3 items across ALL sections combined, one line each; everything else goes in the \`store-progress\` output, not the post. Over 700 chars ⇒ cut until it fits. A long digest is a failed run, not a thorough one.
15749
15764
 
15750
15765
  ---
15751
15766