@desplega.ai/agent-swarm 1.150.0 → 1.152.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 (311) hide show
  1. package/README.md +11 -0
  2. package/dist/{acp-adapter-d5mzggyk.js → acp-adapter-d05sg0q4.js} +5 -5
  3. package/dist/{actions-wn6ew0p7.js → actions-4sc0v342.js} +38 -11
  4. package/dist/{anthropic-messages-ec35ktvx.js → anthropic-messages-2y8nktar.js} +16 -16
  5. package/dist/{app-dty7p9hg.js → app-2d0v6kt6.js} +7 -7
  6. package/dist/{assistant-q4vhgjtx.js → assistant-zs6wdnrf.js} +41 -16
  7. package/dist/{azure-openai-responses-g85jv7m8.js → azure-openai-responses-f38x2avq.js} +13 -13
  8. package/dist/{boot-reembed-n15q6s9x.js → boot-reembed-3dwdnnsr.js} +13 -15
  9. package/dist/{boot-reembed-92292pgf.js → boot-reembed-vhh33520.js} +8 -8
  10. package/dist/{boot-scrub-logs-44pc955m.js → boot-scrub-logs-e1fnabcg.js} +5 -5
  11. package/dist/{claude-adapter-cjegjbje.js → claude-adapter-h58xqzzd.js} +12 -13
  12. package/dist/{claude-managed-adapter-p3ts5m9m.js → claude-managed-adapter-dsmkcrjy.js} +3 -3
  13. package/dist/{claude-sdk-session-7ywbn12v.js → claude-sdk-session-pbaczbgt.js} +12 -13
  14. package/dist/{cli-9gqddmxs.js → cli-4fqn2vpg.js} +8 -8
  15. package/dist/{cli-mzb0n642.js → cli-4wppfkcm.js} +350 -20
  16. package/dist/{cli-h505yhex.js → cli-5bqt4gwa.js} +2 -2
  17. package/dist/{cli-hbagregr.js → cli-5p007m2q.js} +88 -13
  18. package/dist/{cli-3ckzxdt1.js → cli-6k2athpf.js} +94 -81
  19. package/dist/{cli-3mh119qv.js → cli-72vksk1n.js} +9855 -693
  20. package/dist/{cli-taym3dmg.js → cli-87hdfyde.js} +13 -13
  21. package/dist/{cli-zthatyrx.js → cli-8fy9dmpv.js} +5 -5
  22. package/dist/{cli-asvrh7kj.js → cli-9xvdm3bx.js} +1 -1
  23. package/dist/{cli-72xdszyx.js → cli-awb59f08.js} +2 -2
  24. package/dist/{cli-vr6qj104.js → cli-cs9z1hw3.js} +1 -1
  25. package/dist/{cli-kt7wevqh.js → cli-cwvey7n1.js} +164 -56
  26. package/dist/{cli-5my3bjsd.js → cli-d3p82erb.js} +7 -7
  27. package/dist/{cli-7kwmt3r5.js → cli-evgy5w3y.js} +9 -3
  28. package/dist/{cli-111ey3ra.js → cli-f1f9n77e.js} +5 -5
  29. package/dist/{cli-ttje5a4z.js → cli-fhdssm2v.js} +105 -56
  30. package/dist/{cli-a45d5v9b.js → cli-fm4ytsdk.js} +2 -2
  31. package/dist/{cli-qp69dd5d.js → cli-gacq5hg8.js} +116 -14
  32. package/dist/{cli-hmyynq9b.js → cli-ht5rs63n.js} +1 -1
  33. package/dist/{cli-dyx0237s.js → cli-j4nv2wqy.js} +2 -4
  34. package/dist/{cli-gm0fhz13.js → cli-jh9txj4n.js} +2 -1
  35. package/dist/{cli-8chp8xab.js → cli-nd5s3m4y.js} +2 -2
  36. package/dist/{cli-zd21jrrc.js → cli-p2hx1pxm.js} +9872 -424
  37. package/dist/cli-pf9q3696.js +172 -0
  38. package/dist/{cli-7fesa1ky.js → cli-pgj4a5fb.js} +1 -1
  39. package/dist/{cli-07jd68a1.js → cli-re8z5p8p.js} +1 -1
  40. package/dist/{cli-ryz8q8p1.js → cli-t1mykkng.js} +40 -40
  41. package/dist/{cli-ck1vqzdj.js → cli-t6axtdcg.js} +9 -4
  42. package/dist/{cli-1mx65de9.js → cli-wbyk465z.js} +1 -1
  43. package/dist/{cli-kyysm7m3.js → cli-wp7cejrg.js} +1 -1
  44. package/dist/{cli-n75jt793.js → cli-z61ykvam.js} +6 -5
  45. package/dist/{cli-ceb5y160.js → cli-zdcdh02m.js} +1 -1
  46. package/dist/{cli-cmp8g3sw.js → cli-zfzznn7c.js} +45 -9
  47. package/dist/cli.js +22 -21
  48. package/dist/{codex-adapter-rn3aq7jm.js → codex-adapter-v3cz462q.js} +8 -9
  49. package/dist/{codex-hook-gthcmm0g.js → codex-hook-8jexc34x.js} +2 -2
  50. package/dist/{codex-session-runner-bge0cbsw.js → codex-session-runner-de1a5g5z.js} +8 -9
  51. package/dist/{commands-26phw0pc.js → commands-wfqqpn95.js} +5 -5
  52. package/dist/{db-jxjx6s1b.js → db-9zzv5y05.js} +5 -5
  53. package/dist/dispatcher-hfm1jbgx.js +74 -0
  54. package/dist/{google-generative-ai-tsskx7te.js → google-generative-ai-ndjmj5fa.js} +7 -7
  55. package/dist/{google-vertex-pkhpkbq9.js → google-vertex-fr665tqs.js} +10 -10
  56. package/dist/handlers-wrrhsack.js +65 -0
  57. package/dist/{hook-jw0ztn96.js → hook-9skye8zd.js} +9 -10
  58. package/dist/{hook-t6fqsggw.js → hook-fgjv62k5.js} +9 -10
  59. package/dist/{http-hyc7s57s.js → http-7grttjfq.js} +1434 -579
  60. package/dist/{index-bcyx5djw.js → index-29gxx9ar.js} +25 -17
  61. package/dist/{index-wtwpthe1.js → index-30pz2h9w.js} +25 -19
  62. package/dist/{index-1d9r6a74.js → index-4ek1df87.js} +26 -20
  63. package/dist/{index-sfhaq59d.js → index-myfwqqyq.js} +120 -102
  64. package/dist/index-pfhzrh1d.js +25 -0
  65. package/dist/{keepalive-fbsak4ya.js → keepalive-j75m2m7k.js} +7 -7
  66. package/dist/{lead-rdzdm627.js → lead-a1hpjt0a.js} +41 -49
  67. package/dist/{maintenance-25z1c1vf.js → maintenance-tngjzqdq.js} +8 -8
  68. package/dist/{node-209sxmg3.js → node-x1g4v0pq.js} +9 -9
  69. package/dist/{oauth-refresh-sweep-j3d7gtse.js → oauth-refresh-sweep-em1fn044.js} +6 -6
  70. package/dist/{onboard-dkcwrc75.js → onboard-fv7ezvwx.js} +13 -4
  71. package/dist/{openai-codex-responses-pm5gnyfa.js → openai-codex-responses-wy6a43wd.js} +11 -11
  72. package/dist/{openai-responses-vwvk1taj.js → openai-responses-6xwf7bzg.js} +13 -13
  73. package/dist/{opencode-adapter-dce4wskd.js → opencode-adapter-28axqa09.js} +4 -4
  74. package/dist/{otel-impl-8rgyy3j8.js → otel-impl-6vbb568y.js} +1 -1
  75. package/dist/{pi-mono-adapter-4s2bbkgq.js → pi-mono-adapter-jcqt71cg.js} +14 -16
  76. package/dist/{pricing-refresh-9cek71nq.js → pricing-refresh-nmm949an.js} +7 -7
  77. package/dist/{rbac-roles-vk8mqp9v.js → rbac-roles-0fz5qryx.js} +7 -7
  78. package/dist/{rbac-roles-z98s2ypy.js → rbac-roles-xtp05syf.js} +13 -9
  79. package/dist/{render-v2-3j26g0qh.js → render-v2-fpb8whme.js} +7 -7
  80. package/dist/{seed-pricing-7rxhcnzm.js → seed-pricing-zwa8bs3t.js} +6 -6
  81. package/dist/{setup-e2t7vz0c.js → setup-3ybwbdpd.js} +2 -2
  82. package/dist/{work-objects-8d3nd3x2.js → work-objects-rmayxcx7.js} +41 -16
  83. package/dist/{worker-0x9fn7nq.js → worker-rng4jhnh.js} +41 -49
  84. package/openapi.json +1351 -265
  85. package/package.json +2 -1
  86. package/src/agentmail/handlers.ts +95 -71
  87. package/src/be/db-client.ts +5 -0
  88. package/src/be/db.ts +12 -4
  89. package/src/be/extensions/db.ts +461 -0
  90. package/src/be/extensions/validate.ts +107 -0
  91. package/src/be/memory/boot-reembed.ts +17 -12
  92. package/src/be/memory/index.ts +12 -0
  93. package/src/be/memory/providers/openai-embedding.ts +4 -0
  94. package/src/be/memory/types.ts +2 -0
  95. package/src/be/migrations/155_extensions.sql +66 -0
  96. package/src/be/migrations/156_inbox_item_state_read_at.sql +7 -0
  97. package/src/be/rbac-roles.ts +3 -2
  98. package/src/be/scripts/typecheck.ts +56 -38
  99. package/src/be/seed-skills/index.ts +7 -0
  100. package/src/be/swarm-config-guard.ts +10 -2
  101. package/src/commands/onboard/compose-generator.ts +14 -2
  102. package/src/commands/onboard/env-generator.ts +7 -0
  103. package/src/commands/runner.ts +1 -1
  104. package/src/extensions/apply-task-create.ts +135 -0
  105. package/src/extensions/bundle-path.ts +10 -0
  106. package/src/extensions/contract-runtime.ts +7 -0
  107. package/src/extensions/contract-types.generated.ts +4 -0
  108. package/src/extensions/contract.ts +270 -0
  109. package/src/extensions/ctx.ts +186 -0
  110. package/src/extensions/dispatcher.ts +479 -0
  111. package/src/extensions/identity.ts +44 -0
  112. package/src/extensions/lifecycle.ts +303 -0
  113. package/src/extensions/loader.ts +207 -0
  114. package/src/extensions/post-bridge.ts +161 -0
  115. package/src/github/handlers.ts +185 -149
  116. package/src/gitlab/handlers.ts +97 -81
  117. package/src/heartbeat/heartbeat.ts +152 -83
  118. package/src/http/agents.ts +1 -1
  119. package/src/http/all-routes.ts +1 -0
  120. package/src/http/apps.ts +14 -10
  121. package/src/http/core.ts +34 -0
  122. package/src/http/extensions.ts +552 -0
  123. package/src/http/inbox-state.ts +2 -0
  124. package/src/http/index.ts +25 -0
  125. package/src/http/mcp-bridge.ts +96 -62
  126. package/src/http/mcp.ts +1 -1
  127. package/src/http/status.ts +6 -4
  128. package/src/http/tasks.ts +51 -35
  129. package/src/integrations/kapso/inbound.ts +15 -11
  130. package/src/jira/sync.ts +26 -18
  131. package/src/linear/sync.ts +26 -18
  132. package/src/prompts/session-templates.ts +5 -4
  133. package/src/rbac/admission.ts +1 -1
  134. package/src/rbac/elevated-agents.ts +24 -0
  135. package/src/rbac/legacy-policy.ts +47 -6
  136. package/src/rbac/permissions.ts +8 -0
  137. package/src/scheduler/deferred-task-waits.ts +133 -51
  138. package/src/scheduler/schedule-task.ts +50 -24
  139. package/src/scheduler/scheduler.ts +4 -2
  140. package/src/scripts-runtime/executors/native.ts +5 -1
  141. package/src/scripts-runtime/executors/types.ts +5 -0
  142. package/src/scripts-runtime/import-allowlist.ts +79 -19
  143. package/src/scripts-runtime/sdk-allowlist.ts +8 -0
  144. package/src/scripts-runtime/swarm-config.ts +8 -0
  145. package/src/scripts-runtime/swarm-sdk.ts +3 -0
  146. package/src/scripts-runtime/types/stdlib.d.ts +13 -0
  147. package/src/scripts-runtime/types/swarm-extension.d.ts +562 -0
  148. package/src/scripts-runtime/types/swarm-sdk.d.ts +13 -0
  149. package/src/server.ts +18 -0
  150. package/src/slack/HEURISTICS.md +1 -1
  151. package/src/slack/actions.ts +21 -17
  152. package/src/slack/blocks.ts +1 -1
  153. package/src/slack/handlers.ts +98 -5
  154. package/src/slack/inbound-files.ts +6 -2
  155. package/src/slack/render-v2.ts +181 -39
  156. package/src/slack/responses.ts +7 -4
  157. package/src/slack/router.ts +13 -3
  158. package/src/slack/steering.ts +3 -3
  159. package/src/slack/task-output.ts +21 -0
  160. package/src/slack/watcher.ts +3 -2
  161. package/src/slack/work-objects.ts +2 -1
  162. package/src/tasks/errors.ts +9 -0
  163. package/src/tasks/sibling-awareness.ts +35 -1
  164. package/src/tasks/worker-follow-up.ts +64 -12
  165. package/src/tests/base-prompt.test.ts +1 -0
  166. package/src/tests/deferred-task-wake.test.ts +161 -9
  167. package/src/tests/docs-index-footprint.test.js +3 -3
  168. package/src/tests/env-flag.test.ts +1 -0
  169. package/src/tests/extensions-db.test.ts +216 -0
  170. package/src/tests/extensions-dispatcher.test.ts +275 -0
  171. package/src/tests/extensions-example-heartbeat-remediate.test.ts +69 -0
  172. package/src/tests/extensions-example-mcp-install.test.ts +63 -0
  173. package/src/tests/extensions-example-no-exclamation-marks.test.ts +72 -0
  174. package/src/tests/extensions-example-rewrite-and-suppress.test.ts +70 -0
  175. package/src/tests/extensions-example-route-slack-channel.test.ts +217 -0
  176. package/src/tests/extensions-heartbeat.test.ts +291 -0
  177. package/src/tests/extensions-http.test.ts +512 -0
  178. package/src/tests/extensions-lead-equivalence.test.ts +70 -0
  179. package/src/tests/extensions-lifecycle.test.ts +209 -0
  180. package/src/tests/extensions-loader.test.ts +95 -0
  181. package/src/tests/extensions-mcp-tools.test.ts +353 -0
  182. package/src/tests/extensions-pre-task.test.ts +487 -0
  183. package/src/tests/extensions-run-context.test.ts +41 -0
  184. package/src/tests/extensions-tool-call.test.ts +288 -0
  185. package/src/tests/extensions-validate.test.ts +196 -0
  186. package/src/tests/fixtures/extensions/bad-import/hooks.ts +8 -0
  187. package/src/tests/fixtures/extensions/bad-import/manifest.json +9 -0
  188. package/src/tests/fixtures/extensions/bad-return-shape/hooks.ts +10 -0
  189. package/src/tests/fixtures/extensions/bad-return-shape/manifest.json +9 -0
  190. package/src/tests/fixtures/extensions/block-tasks-from-source/hooks.ts +22 -0
  191. package/src/tests/fixtures/extensions/block-tasks-from-source/manifest.json +9 -0
  192. package/src/tests/fixtures/extensions/ignore-channel/hooks.ts +22 -0
  193. package/src/tests/fixtures/extensions/ignore-channel/manifest.json +9 -0
  194. package/src/tests/fixtures/extensions/load.ts +10 -0
  195. package/src/tests/fixtures/extensions/minimal/hooks.ts +7 -0
  196. package/src/tests/fixtures/extensions/minimal/manifest.json +9 -0
  197. package/src/tests/fixtures/extensions/never-fail-long-tasks/hooks.ts +11 -0
  198. package/src/tests/fixtures/extensions/never-fail-long-tasks/manifest.json +9 -0
  199. package/src/tests/fixtures/extensions/no-exclamation-marks/hooks.ts +23 -0
  200. package/src/tests/fixtures/extensions/no-exclamation-marks/manifest.json +9 -0
  201. package/src/tests/fixtures/extensions/post-logger/hooks.ts +9 -0
  202. package/src/tests/fixtures/extensions/post-logger/manifest.json +9 -0
  203. package/src/tests/fixtures/extensions/priority-a/hooks.ts +7 -0
  204. package/src/tests/fixtures/extensions/priority-a/manifest.json +9 -0
  205. package/src/tests/fixtures/extensions/priority-b/hooks.ts +7 -0
  206. package/src/tests/fixtures/extensions/priority-b/manifest.json +9 -0
  207. package/src/tests/fixtures/extensions/record-only-on-tag/hooks.ts +16 -0
  208. package/src/tests/fixtures/extensions/record-only-on-tag/manifest.json +9 -0
  209. package/src/tests/fixtures/extensions/reserved-assets/hooks.ts +5 -0
  210. package/src/tests/fixtures/extensions/reserved-assets/manifest.json +10 -0
  211. package/src/tests/fixtures/extensions/rewrite-progress-prefix/hooks.ts +22 -0
  212. package/src/tests/fixtures/extensions/rewrite-progress-prefix/manifest.json +9 -0
  213. package/src/tests/fixtures/extensions/rewrite-task-priority/hooks.ts +7 -0
  214. package/src/tests/fixtures/extensions/rewrite-task-priority/manifest.json +9 -0
  215. package/src/tests/fixtures/extensions/route-channel-to-agent/hooks.ts +26 -0
  216. package/src/tests/fixtures/extensions/route-channel-to-agent/manifest.json +9 -0
  217. package/src/tests/fixtures/extensions/slow/hooks.ts +10 -0
  218. package/src/tests/fixtures/extensions/slow/manifest.json +9 -0
  219. package/src/tests/fixtures/extensions/suppress-lead-follow-up/hooks.ts +12 -0
  220. package/src/tests/fixtures/extensions/suppress-lead-follow-up/manifest.json +9 -0
  221. package/src/tests/fixtures/extensions/throws/hooks.ts +12 -0
  222. package/src/tests/fixtures/extensions/throws/manifest.json +9 -0
  223. package/src/tests/fixtures/extensions/worker-runtime/hooks.ts +5 -0
  224. package/src/tests/fixtures/extensions/worker-runtime/manifest.json +9 -0
  225. package/src/tests/fixtures/store-progress-malformed-output.json +4 -0
  226. package/src/tests/memory-edit-authorization.test.ts +32 -0
  227. package/src/tests/multi-runtime-enabled-stats.test.ts +2 -2
  228. package/src/tests/multi-runtime-registration.test.ts +14 -14
  229. package/src/tests/onboard-compose.test.ts +44 -0
  230. package/src/tests/preload.ts +5 -0
  231. package/src/tests/rbac-admission-e2e.test.ts +35 -4
  232. package/src/tests/rbac-admission.test.ts +18 -3
  233. package/src/tests/rbac-e2e-helpers.ts +18 -0
  234. package/src/tests/rbac-engine.test.ts +39 -0
  235. package/src/tests/rbac-mcp-admission-e2e.test.ts +22 -4
  236. package/src/tests/realtime-room-auth.test.ts +1 -1
  237. package/src/tests/reload-config.test.ts +61 -0
  238. package/src/tests/routing-affinity-inventory.test.ts +1 -1
  239. package/src/tests/script-connections.test.ts +2 -0
  240. package/src/tests/scripts-boot-reembed.test.ts +4 -0
  241. package/src/tests/scripts-embeddings.test.ts +4 -0
  242. package/src/tests/scripts-import-allowlist.test.ts +44 -1
  243. package/src/tests/scripts-mcp-e2e.test.ts +80 -0
  244. package/src/tests/scripts-only-gating.test.ts +6 -0
  245. package/src/tests/scripts-runtime-identity.test.ts +1 -1
  246. package/src/tests/slack-blocks.test.ts +12 -1
  247. package/src/tests/slack-render-v2.test.ts +100 -5
  248. package/src/tests/slack-router.test.ts +17 -2
  249. package/src/tests/slack-steering.test.ts +19 -0
  250. package/src/tests/slack-task-output.test.ts +36 -0
  251. package/src/tests/status.test.ts +12 -0
  252. package/src/tests/steering-enabled.test.ts +6 -8
  253. package/src/tests/store-progress-attachments-handler.test.ts +100 -1
  254. package/src/tests/swarm-config-reserved-keys.test.ts +6 -1
  255. package/src/tests/task-tool-preload-mcp.test.ts +4 -1
  256. package/src/tests/tool-annotations.test.ts +1 -1
  257. package/src/tests/tool-registrar-no-input.test.ts +42 -1
  258. package/src/tools/defer-task.ts +1 -1
  259. package/src/tools/extension-activate-version.ts +38 -0
  260. package/src/tools/extension-common.ts +85 -0
  261. package/src/tools/extension-delete.ts +29 -0
  262. package/src/tools/extension-disable.ts +36 -0
  263. package/src/tools/extension-enable.ts +36 -0
  264. package/src/tools/extension-install.ts +65 -0
  265. package/src/tools/extension-list.ts +66 -0
  266. package/src/tools/script-common.ts +43 -18
  267. package/src/tools/send-task.ts +69 -107
  268. package/src/tools/store-progress.ts +30 -0
  269. package/src/tools/task-action.ts +43 -22
  270. package/src/tools/task-tool-ctx.ts +2 -0
  271. package/src/tools/tool-config.ts +7 -1
  272. package/src/tools/utils.ts +140 -16
  273. package/src/types.ts +133 -0
  274. package/src/utils/multi-runtime.ts +2 -2
  275. package/src/utils/steering-enabled.ts +4 -4
  276. package/src/workflows/executors/agent-task.ts +13 -3
  277. package/templates/extensions/README.md +17 -0
  278. package/templates/extensions/notify-on-complete/README.md +11 -0
  279. package/templates/extensions/notify-on-complete/hooks.ts +61 -0
  280. package/templates/extensions/notify-on-complete/manifest.json +7 -0
  281. package/templates/extensions/require-ticket-ref/README.md +11 -0
  282. package/templates/extensions/require-ticket-ref/hooks.ts +30 -0
  283. package/templates/extensions/require-ticket-ref/manifest.json +7 -0
  284. package/templates/extensions/require-verification-note/README.md +11 -0
  285. package/templates/extensions/require-verification-note/hooks.ts +32 -0
  286. package/templates/extensions/require-verification-note/manifest.json +7 -0
  287. package/templates/skills/agent-browser/SKILL.md +84 -0
  288. package/templates/skills/agent-browser/content.md +21 -0
  289. package/templates/skills/scheduling/content.md +2 -0
  290. package/templates/skills/swarm-extensions/config.json +14 -0
  291. package/templates/skills/swarm-extensions/content.md +120 -0
  292. package/dist/cli-b8x19vbh.js +0 -823
  293. package/dist/cli-n1yj5fd5.js +0 -164
  294. package/dist/cli-q04q68be.js +0 -3066
  295. package/dist/cli-qgm2pfpq.js +0 -6377
  296. package/dist/cli-rnsr8asm.js +0 -4323
  297. package/dist/cli-rwp3ksm7.js +0 -545
  298. package/dist/cli-xjb9wghj.js +0 -668
  299. package/dist/cli-xvkmedgn.js +0 -332
  300. package/dist/cli-ydk0wjj8.js +0 -338
  301. package/dist/handlers-vr1djg4n.js +0 -41
  302. package/dist/{claude-managed-setup-f5pmsyrp.js → claude-managed-setup-48dwg9bv.js} +3 -3
  303. package/dist/{cli-81r683bv.js → cli-ch38q5z4.js} +0 -0
  304. package/dist/{cli-wk0gjrn3.js → cli-kj76p1ez.js} +6 -6
  305. package/dist/{cli-c71mg51n.js → cli-r2fpe7cx.js} +5 -5
  306. package/dist/{cli-8qx7jnrk.js → cli-y6x0gqtg.js} +16 -16
  307. package/dist/{index-aa3sa6s8.js → index-2wsdsnmm.js} +1 -1
  308. package/dist/{mistral-conversations-4ryk7h83.js → mistral-conversations-qhr84ph3.js} +9 -9
  309. package/dist/{openai-completions-qdcmkfnr.js → openai-completions-32rdwmze.js} +17 -17
  310. package/dist/{openrouter-images-qx18fyp8.js → openrouter-images-9f9ek4rw.js} +3 -3
  311. package/dist/{pi-messages-79jvzz1d.js → pi-messages-b1mbr6gp.js} +4 -4
@@ -5,32 +5,36 @@ import {
5
5
  instantFlush,
6
6
  requestSlackThreadSteering,
7
7
  wasEventSeen
8
- } from "./cli-9gqddmxs.js";
8
+ } from "./cli-4fqn2vpg.js";
9
9
  import {
10
+ enrichSlackUserEmail,
11
+ resolveSlackUserId,
12
+ rewriteSlackMentions
13
+ } from "./cli-awb59f08.js";
14
+ import {
15
+ TaskCreationBlockedError,
16
+ broadcastMatches,
10
17
  buildEffectiveText,
11
18
  createSlackTaskWithFiles,
19
+ dispatchPre,
12
20
  extractSlackMessageText,
13
21
  extractTaskFromMessage,
14
22
  fetchSlackFiles,
15
23
  hasOtherUserMention,
16
24
  notifySlackFileFailures,
17
25
  routeMessage
18
- } from "./cli-b8x19vbh.js";
19
- import {
20
- enrichSlackUserEmail,
21
- resolveSlackUserId,
22
- rewriteSlackMentions
23
- } from "./cli-72xdszyx.js";
26
+ } from "./cli-72vksk1n.js";
24
27
  import {
25
28
  ackSlackMessage,
26
29
  buildTreeBlocks,
27
30
  ensureSlackThreadTree,
28
31
  isSlackRenderV2Enabled,
29
32
  registerTreeMessage
30
- } from "./cli-kt7wevqh.js";
33
+ } from "./cli-cwvey7n1.js";
31
34
  import {
32
35
  getAgentById,
33
36
  getAgentWorkingOnThread,
37
+ getAllAgents,
34
38
  getLeadAgent,
35
39
  getMostRecentTaskInThread,
36
40
  getTasksByAgentId,
@@ -38,15 +42,25 @@ import {
38
42
  init_db,
39
43
  reactionName,
40
44
  slackContextKey
41
- } from "./cli-qp69dd5d.js";
45
+ } from "./cli-gacq5hg8.js";
42
46
  import {
43
47
  init_resolver,
44
48
  resolveTemplate
45
- } from "./cli-n75jt793.js";
49
+ } from "./cli-z61ykvam.js";
46
50
  import {
47
51
  init_env_flag,
48
52
  isEnvFlagEnabled
49
53
  } from "./cli-ej6gbxfb.js";
54
+ import {
55
+ init_zod
56
+ } from "./cli-sd0mxa3c.js";
57
+ import {
58
+ exports_external
59
+ } from "./cli-w5e1d1vv.js";
60
+ import {
61
+ init_secret_scrubber,
62
+ scrubSecrets
63
+ } from "./cli-r2ap2czm.js";
50
64
  import {
51
65
  init_event_bus,
52
66
  workflowEventBus
@@ -57,11 +71,20 @@ import {
57
71
  } from "./cli-bc05qbss.js";
58
72
 
59
73
  // src/slack/handlers.ts
74
+ init_zod();
60
75
  init_db();
61
76
  init_resolver();
62
77
  init_context_key();
78
+ init_secret_scrubber();
63
79
  init_event_bus();
64
80
  init_env_flag();
81
+ var SlackRouteModifySchema = exports_external.object({
82
+ target: exports_external.discriminatedUnion("kind", [
83
+ exports_external.object({ kind: exports_external.literal("agent"), agentId: exports_external.string().min(1) }).strict(),
84
+ exports_external.object({ kind: exports_external.literal("lead") }).strict(),
85
+ exports_external.object({ kind: exports_external.literal("broadcast") }).strict()
86
+ ])
87
+ }).strict();
65
88
  var allowedEmailDomains = (process.env.SLACK_ALLOWED_EMAIL_DOMAINS || "").split(",").map((d) => d.trim().toLowerCase()).filter(Boolean);
66
89
  var allowedUserIds = (process.env.SLACK_ALLOWED_USER_IDS || "").split(",").map((id) => id.trim()).filter(Boolean);
67
90
  var filteringEnabled = allowedEmailDomains.length > 0 || allowedUserIds.length > 0;
@@ -274,8 +297,10 @@ function registerMessageHandler(app) {
274
297
  });
275
298
  workflowEventBus.emit("slack.message", {
276
299
  channel: msg.channel,
300
+ channelId: msg.channel,
277
301
  text: msg.text,
278
302
  user: msg.user,
303
+ userId: msg.user,
279
304
  ts: msg.ts,
280
305
  threadTs: msg.thread_ts
281
306
  });
@@ -323,7 +348,45 @@ function registerMessageHandler(app) {
323
348
  }
324
349
  const routingText = msg.text || effectiveText;
325
350
  const routingThreadContext = msg.thread_ts ? { channelId: msg.channel, threadTs: msg.thread_ts } : undefined;
326
- const matches = await routeMessage(routingText, botUserId, botMentioned || isImplicitMention, routingThreadContext);
351
+ const routeResult = await dispatchPre("pre.slack.route", {
352
+ channelId: msg.channel,
353
+ userId: msg.user,
354
+ text: routingText,
355
+ ...msg.thread_ts ? { threadTs: msg.thread_ts } : {},
356
+ botMentioned: botMentioned || isImplicitMention,
357
+ ...routingThreadContext ? { threadContext: routingThreadContext } : {}
358
+ }, {
359
+ validateModify: (data) => {
360
+ const parsed = SlackRouteModifySchema.safeParse(data);
361
+ return parsed.success ? { success: true, data: parsed.data } : { success: false, error: new Error(parsed.error.message) };
362
+ }
363
+ });
364
+ if (routeResult.action === "block") {
365
+ console.info("[Slack] Extension blocked message routing:", scrubSecrets(routeResult.reason));
366
+ return;
367
+ }
368
+ let matches;
369
+ if (routeResult.action === "modify") {
370
+ const { target } = routeResult.data;
371
+ if (target.kind === "agent") {
372
+ const agent = await getAgentById(target.agentId);
373
+ if (agent) {
374
+ matches = [{ agent, matchedText: "extension" }];
375
+ } else {
376
+ console.warn("[Slack] Extension selected an unknown agent. Using the built-in router:", scrubSecrets(target.agentId));
377
+ }
378
+ } else if (target.kind === "lead") {
379
+ const leadAgent = await getLeadAgent();
380
+ if (leadAgent) {
381
+ matches = [{ agent: leadAgent, matchedText: "extension" }];
382
+ } else {
383
+ console.warn(scrubSecrets("[Slack] Extension selected the lead, but no lead exists. Using the built-in router."));
384
+ }
385
+ } else {
386
+ matches = broadcastMatches(await getAllAgents());
387
+ }
388
+ }
389
+ matches ??= await routeMessage(routingText, botUserId, botMentioned || isImplicitMention, routingThreadContext);
327
390
  if (matches.length === 0) {
328
391
  let __stack = [];
329
392
  try {
@@ -494,8 +557,11 @@ ${taskDescription}`;
494
557
  } else {
495
558
  results.assigned.push({ agentName: agent.name, taskId: task.id });
496
559
  }
497
- } catch {
498
- results.failed.push({ agentName: agent.name, reason: "error" });
560
+ } catch (error) {
561
+ results.failed.push({
562
+ agentName: agent.name,
563
+ reason: error instanceof TaskCreationBlockedError ? error.reason : "error"
564
+ });
499
565
  }
500
566
  }
501
567
  if (results.assigned.length + results.queued.length > 0) {
@@ -507,6 +573,15 @@ ${taskDescription}`;
507
573
  if (isSlackRenderV2Enabled()) {
508
574
  if (successfulTaskIds.length > 0)
509
575
  await ensureSlackThreadTree(successfulTaskIds);
576
+ if (results.failed.length > 0) {
577
+ const failedLines = results.failed.map((f) => `⚠️ Could not assign to: *${f.agentName}* — ${f.reason}`).join(`
578
+ `);
579
+ await say({
580
+ text: `Could not assign to: ${results.failed.map((f) => f.agentName).join(", ")}`,
581
+ blocks: [{ type: "context", elements: [{ type: "mrkdwn", text: failedLines }] }],
582
+ thread_ts: msg.thread_ts || msg.ts
583
+ });
584
+ }
510
585
  } else {
511
586
  const initialNodes = results.assigned.map(({ agentName, taskId }) => ({
512
587
  taskId,
@@ -1,12 +1,10 @@
1
1
  import {
2
2
  SYSTEM_COLUMN_KINDS,
3
- listAppRecords
4
- } from "./cli-q04q68be.js";
5
- import {
6
3
  getScriptApiTypes,
7
4
  getScriptMcpTypes,
5
+ listAppRecords,
8
6
  require_typescript
9
- } from "./cli-zd21jrrc.js";
7
+ } from "./cli-p2hx1pxm.js";
10
8
  import {
11
9
  deleteSwarmConfigByKey,
12
10
  getAgentById,
@@ -15,7 +13,7 @@ import {
15
13
  getSwarmConfigs,
16
14
  init_db,
17
15
  upsertSwarmConfig
18
- } from "./cli-qp69dd5d.js";
16
+ } from "./cli-gacq5hg8.js";
19
17
  import {
20
18
  init_secret_scrubber,
21
19
  scrubSecrets
@@ -577,52 +575,9 @@ async function getScriptAppTypes(_context = {}) {
577
575
  }
578
576
  }
579
577
 
580
- // src/be/scripts/extract-schema.ts
581
- import { fileURLToPath } from "node:url";
582
- var TIMEOUT_MS = 5000;
583
- function extractorPath() {
584
- return fileURLToPath(new URL("../../scripts-runtime/extract-args-schema.ts", import.meta.url));
585
- }
586
- async function extractArgsJsonSchema(source) {
587
- const tmpdir = `${process.env.TMPDIR ?? "/tmp"}/schema-extract-${crypto.randomUUID()}`;
588
- try {
589
- await Bun.$`mkdir -p ${tmpdir}`.quiet();
590
- const sourceFile = `${tmpdir}/source.ts`;
591
- const resultFile = `${tmpdir}/result.json`;
592
- await Bun.write(sourceFile, source);
593
- const proc = Bun.spawn(["bun", "run", extractorPath()], {
594
- env: {
595
- PATH: process.env.PATH ?? "/usr/bin:/bin",
596
- HOME: process.env.HOME ?? "/tmp",
597
- TMPDIR: tmpdir,
598
- SWARM_SCHEMA_SOURCE_FILE: sourceFile,
599
- SWARM_SCHEMA_RESULT_FILE: resultFile,
600
- SWARM_SCHEMA_TMPDIR: tmpdir
601
- },
602
- cwd: tmpdir,
603
- stdout: "ignore",
604
- stderr: "ignore"
605
- });
606
- const timeout = setTimeout(() => proc.kill(), TIMEOUT_MS);
607
- const exitCode = await proc.exited.catch(() => 1);
608
- clearTimeout(timeout);
609
- if (exitCode !== 0)
610
- return null;
611
- const result = await Bun.file(resultFile).text();
612
- const parsed = JSON.parse(result);
613
- if (parsed === null)
614
- return null;
615
- return JSON.stringify(parsed);
616
- } catch {
617
- return null;
618
- } finally {
619
- await Bun.$`rm -rf ${tmpdir}`.quiet().nothrow();
620
- }
621
- }
622
-
623
578
  // src/be/scripts/typecheck.ts
624
579
  var import_typescript = __toESM(require_typescript(), 1);
625
- import { fileURLToPath as fileURLToPath2 } from "node:url";
580
+ import { fileURLToPath } from "node:url";
626
581
  var SCRIPT_SDK_TYPES = `
627
582
  export type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue };
628
583
  export type ScriptScope = "agent" | "global";
@@ -909,6 +864,14 @@ export interface SwarmSdk {
909
864
  script_getRun(args: { id: string }): Promise<unknown>;
910
865
  script_listRuns(args?: { status?: "running" | "paused" | "completed" | "failed" | "cancelled" | "aborted_limit"; agentId?: string; limit?: number; offset?: number }): Promise<unknown>;
911
866
 
867
+ // --- write: extensions ---
868
+ extension_install(args: { manifest: Record<string, unknown>; files: Record<string, string>; priority?: number; config?: Record<string, unknown> }): Promise<unknown>;
869
+ extension_list(args?: { enabledOnly?: boolean }): Promise<unknown>;
870
+ extension_delete(args: { id: string }): Promise<unknown>;
871
+ extension_enable(args: { id: string }): Promise<unknown>;
872
+ extension_disable(args: { id: string }): Promise<unknown>;
873
+ extension_activate_version(args: { id: string; version: number }): Promise<unknown>;
874
+
912
875
  // --- write: repos ---
913
876
  repo_update(args: Record<string, unknown>): Promise<unknown>;
914
877
 
@@ -1057,7 +1020,7 @@ ${mcpTypes}
1057
1020
  ${resolvedAppTypes}
1058
1021
  `;
1059
1022
  }
1060
- var STDLIB_MODULE_TYPES = `
1023
+ var SCRIPT_STDLIB_MODULE_TYPES = `
1061
1024
  declare module "stdlib" {
1062
1025
  export interface Redacted<T> {
1063
1026
  readonly __redactedBrand?: T;
@@ -1077,7 +1040,7 @@ declare module "stdlib" {
1077
1040
  }
1078
1041
  `;
1079
1042
  function stdlibTypesFor(sdkModuleBody) {
1080
- return `${STDLIB_MODULE_TYPES}
1043
+ return `${SCRIPT_STDLIB_MODULE_TYPES}
1081
1044
  declare module "swarm-sdk" {
1082
1045
  ${sdkModuleBody.replace(/^/gm, " ")}
1083
1046
  }
@@ -1411,16 +1374,14 @@ interface Window {
1411
1374
  `;
1412
1375
  var USER_FILE = "/virtual/user-script.ts";
1413
1376
  var CHECK_FILE = "/virtual/check.ts";
1414
- var SDK_FILE = "/virtual/swarm-sdk.d.ts";
1415
- var STDLIB_FILE = "/virtual/stdlib.d.ts";
1416
1377
  var RUNTIME_GLOBALS_FILE = "/virtual/runtime-globals.d.ts";
1417
1378
  function scriptTypesBase() {
1418
1379
  const dir = process.env.SCRIPT_TYPES_DIR;
1419
1380
  if (dir)
1420
1381
  return `${dir}/index.ts`;
1421
- return fileURLToPath2(new URL("../../index.ts", import.meta.url));
1382
+ return fileURLToPath(new URL("../../index.ts", import.meta.url));
1422
1383
  }
1423
- function createCompilerHost(files, options) {
1384
+ function createCompilerHost(files, options, virtualModules = new Map) {
1424
1385
  const host = import_typescript.default.createCompilerHost(options, true);
1425
1386
  const originalGetSourceFile = host.getSourceFile.bind(host);
1426
1387
  host.getSourceFile = (fileName, languageVersion, onError, shouldCreateNewSourceFile) => {
@@ -1444,11 +1405,9 @@ function createCompilerHost(files, options) {
1444
1405
  if (moduleName === "./user-script") {
1445
1406
  return { resolvedFileName: USER_FILE, extension: import_typescript.default.Extension.Ts };
1446
1407
  }
1447
- if (moduleName === "swarm-sdk") {
1448
- return { resolvedFileName: SDK_FILE, extension: import_typescript.default.Extension.Dts };
1449
- }
1450
- if (moduleName === "stdlib") {
1451
- return { resolvedFileName: STDLIB_FILE, extension: import_typescript.default.Extension.Dts };
1408
+ const virtualModule = virtualModules.get(moduleName);
1409
+ if (virtualModule) {
1410
+ return { resolvedFileName: virtualModule, extension: import_typescript.default.Extension.Dts };
1452
1411
  }
1453
1412
  const base = containingFile.startsWith("/virtual/") ? projectBase : containingFile;
1454
1413
  return import_typescript.default.resolveModuleName(moduleName, base, options, host).resolvedModule;
@@ -1521,7 +1480,7 @@ function toStructured(diag) {
1521
1480
  suggestion: extractSuggestion(message)
1522
1481
  };
1523
1482
  }
1524
- async function typecheckScript(source, context = {}) {
1483
+ async function typecheckWithAmbient(args) {
1525
1484
  const options = {
1526
1485
  allowImportingTsExtensions: true,
1527
1486
  lib: ["lib.es2022.d.ts"],
@@ -1533,28 +1492,22 @@ async function typecheckScript(source, context = {}) {
1533
1492
  target: import_typescript.default.ScriptTarget.ES2022,
1534
1493
  types: []
1535
1494
  };
1536
- const apiTypes = getScriptApiTypes(context);
1537
- const mcpTypes = getScriptMcpTypes(context);
1538
- const appTypes = await getScriptAppTypes(context);
1539
- const sdkTypes = await scriptSdkTypesWithGeneratedApis(apiTypes, mcpTypes, appTypes);
1540
- const stdlibTypes = appTypes ? await scriptStdlibTypesWithGeneratedApis(apiTypes, mcpTypes, appTypes) : SCRIPT_STDLIB_TYPES;
1541
1495
  const files = new Map([
1542
- [USER_FILE, source],
1543
- [SDK_FILE, sdkTypes],
1544
- [STDLIB_FILE, stdlibTypes],
1496
+ [USER_FILE, args.source],
1545
1497
  [RUNTIME_GLOBALS_FILE, SCRIPT_RUNTIME_GLOBALS],
1546
- [
1547
- CHECK_FILE,
1548
- `/// <reference path="./runtime-globals.d.ts" />
1549
- import run from "./user-script";
1550
- import type { ScriptMain } from "swarm-sdk";
1551
- const _scriptMain: ScriptMain = run;
1552
- void _scriptMain;
1553
- `
1554
- ]
1498
+ [CHECK_FILE, args.checkFile]
1555
1499
  ]);
1556
- const host = createCompilerHost(files, options);
1557
- const program = import_typescript.default.createProgram([USER_FILE, CHECK_FILE, SDK_FILE, STDLIB_FILE, RUNTIME_GLOBALS_FILE], options, host);
1500
+ const virtualModules = new Map;
1501
+ for (const [moduleName, source] of Object.entries(args.modules)) {
1502
+ const fileName = `/virtual/${moduleName.replace(/[^A-Za-z0-9_.-]/g, "_")}.d.ts`;
1503
+ files.set(fileName, source);
1504
+ virtualModules.set(moduleName, fileName);
1505
+ }
1506
+ for (const [name, source] of Object.entries(args.ambient ?? {})) {
1507
+ files.set(`/virtual/ambient-${name.replace(/[^A-Za-z0-9_.-]/g, "_")}.d.ts`, source);
1508
+ }
1509
+ const host = createCompilerHost(files, options, virtualModules);
1510
+ const program = import_typescript.default.createProgram([...files.keys()], options, host);
1558
1511
  const diagnostics = [
1559
1512
  ...program.getSyntacticDiagnostics(),
1560
1513
  ...program.getSemanticDiagnostics()
@@ -1576,6 +1529,66 @@ void _scriptMain;
1576
1529
  structured: diagnostics.map(toStructured)
1577
1530
  };
1578
1531
  }
1532
+ async function typecheckScript(source, context = {}) {
1533
+ const apiTypes = getScriptApiTypes(context);
1534
+ const mcpTypes = getScriptMcpTypes(context);
1535
+ const appTypes = await getScriptAppTypes(context);
1536
+ const sdkTypes = await scriptSdkTypesWithGeneratedApis(apiTypes, mcpTypes, appTypes);
1537
+ const stdlibTypes = appTypes ? await scriptStdlibTypesWithGeneratedApis(apiTypes, mcpTypes, appTypes) : SCRIPT_STDLIB_TYPES;
1538
+ return typecheckWithAmbient({
1539
+ source,
1540
+ modules: { "swarm-sdk": sdkTypes, stdlib: stdlibTypes },
1541
+ checkFile: `/// <reference path="./runtime-globals.d.ts" />
1542
+ import run from "./user-script";
1543
+ import type { ScriptMain } from "swarm-sdk";
1544
+ const _scriptMain: ScriptMain = run;
1545
+ void _scriptMain;
1546
+ `
1547
+ });
1548
+ }
1549
+
1550
+ // src/be/scripts/extract-schema.ts
1551
+ import { fileURLToPath as fileURLToPath2 } from "node:url";
1552
+ var TIMEOUT_MS = 5000;
1553
+ function extractorPath() {
1554
+ return fileURLToPath2(new URL("../../scripts-runtime/extract-args-schema.ts", import.meta.url));
1555
+ }
1556
+ async function extractArgsJsonSchema(source) {
1557
+ const tmpdir = `${process.env.TMPDIR ?? "/tmp"}/schema-extract-${crypto.randomUUID()}`;
1558
+ try {
1559
+ await Bun.$`mkdir -p ${tmpdir}`.quiet();
1560
+ const sourceFile = `${tmpdir}/source.ts`;
1561
+ const resultFile = `${tmpdir}/result.json`;
1562
+ await Bun.write(sourceFile, source);
1563
+ const proc = Bun.spawn(["bun", "run", extractorPath()], {
1564
+ env: {
1565
+ PATH: process.env.PATH ?? "/usr/bin:/bin",
1566
+ HOME: process.env.HOME ?? "/tmp",
1567
+ TMPDIR: tmpdir,
1568
+ SWARM_SCHEMA_SOURCE_FILE: sourceFile,
1569
+ SWARM_SCHEMA_RESULT_FILE: resultFile,
1570
+ SWARM_SCHEMA_TMPDIR: tmpdir
1571
+ },
1572
+ cwd: tmpdir,
1573
+ stdout: "ignore",
1574
+ stderr: "ignore"
1575
+ });
1576
+ const timeout = setTimeout(() => proc.kill(), TIMEOUT_MS);
1577
+ const exitCode = await proc.exited.catch(() => 1);
1578
+ clearTimeout(timeout);
1579
+ if (exitCode !== 0)
1580
+ return null;
1581
+ const result = await Bun.file(resultFile).text();
1582
+ const parsed = JSON.parse(result);
1583
+ if (parsed === null)
1584
+ return null;
1585
+ return JSON.stringify(parsed);
1586
+ } catch {
1587
+ return null;
1588
+ } finally {
1589
+ await Bun.$`rm -rf ${tmpdir}`.quiet().nothrow();
1590
+ }
1591
+ }
1579
1592
 
1580
1593
  // src/scripts-runtime/extract-signature.ts
1581
1594
  var import_typescript2 = __toESM(require_typescript(), 1);
@@ -1634,4 +1647,4 @@ function extractScriptSignature(source) {
1634
1647
  return FALLBACK_SIGNATURE;
1635
1648
  }
1636
1649
 
1637
- export { agentFsProvisionSeeder, inviteEmailToSharedOrg, ensureAgentFsCredentialsForAgent, getScriptAppTypes, extractArgsJsonSchema, scriptSdkTypesWithGeneratedApis, scriptStdlibTypesWithGeneratedApis, typecheckScript, extractScriptSignature };
1650
+ export { getScriptAppTypes, SCRIPT_SDK_TYPES, scriptSdkTypesWithGeneratedApis, SCRIPT_STDLIB_MODULE_TYPES, scriptStdlibTypesWithGeneratedApis, typecheckWithAmbient, typecheckScript, agentFsProvisionSeeder, inviteEmailToSharedOrg, ensureAgentFsCredentialsForAgent, extractArgsJsonSchema, extractScriptSignature };