@desplega.ai/agent-swarm 1.149.1 → 1.151.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 (538) hide show
  1. package/README.md +18 -3
  2. package/dist/{acp-adapter-vhkzfpjg.js → acp-adapter-ex8hzjfc.js} +5 -5
  3. package/dist/{actions-9d2694yk.js → actions-2bgpyhww.js} +39 -11
  4. package/dist/{app-fq2ggynt.js → app-1706zhr1.js} +7 -7
  5. package/dist/{artifact-gj9arwrr.js → artifact-td4q4dch.js} +1 -1
  6. package/dist/{assistant-edb6n9nn.js → assistant-bavke5p7.js} +44 -20
  7. package/dist/{azure-openai-responses-cqar64rc.js → azure-openai-responses-f38x2avq.js} +13 -13
  8. package/dist/{boot-reembed-msweabbp.js → boot-reembed-3cmrrmpa.js} +9 -9
  9. package/dist/{boot-reembed-q5wd3tha.js → boot-reembed-nafcmmmc.js} +14 -16
  10. package/dist/{boot-scrub-logs-3g1az933.js → boot-scrub-logs-cd6a2sq0.js} +5 -5
  11. package/dist/{claude-adapter-v3rnzsdc.js → claude-adapter-wfp2gzvz.js} +15 -16
  12. package/dist/{claude-managed-adapter-qvsmh6mv.js → claude-managed-adapter-dsmkcrjy.js} +3 -3
  13. package/dist/{claude-sdk-session-qxrpsna1.js → claude-sdk-session-bht9jjak.js} +15 -16
  14. package/dist/{cli-5m0qmvdp.js → cli-0qb1z6s2.js} +1 -1
  15. package/dist/{cli-9d8ntetj.js → cli-2658f6at.js} +1 -1
  16. package/dist/{cli-7evafqvy.js → cli-2tbvf1z1.js} +85 -69
  17. package/dist/{cli-k351hv5k.js → cli-3v9xhjcn.js} +24 -12
  18. package/dist/{cli-1ebpar1q.js → cli-4wppfkcm.js} +350 -20
  19. package/dist/{cli-4260r1tg.js → cli-5jd2z7av.js} +97 -84
  20. package/dist/{cli-cv7s5zdq.js → cli-5tpgq60f.js} +9865 -715
  21. package/dist/{cli-6skz3rk8.js → cli-7tgcstn2.js} +9 -4
  22. package/dist/{cli-01g3x1ca.js → cli-9004vfdf.js} +108 -56
  23. package/dist/{cli-1c94wvcw.js → cli-a1z3h107.js} +124 -99
  24. package/dist/{cli-9br8ypfv.js → cli-czjtgfys.js} +2 -2
  25. package/dist/{cli-5my3bjsd.js → cli-d3p82erb.js} +7 -7
  26. package/dist/{cli-e29gmdmw.js → cli-dv6cdjs2.js} +2 -1
  27. package/dist/{cli-wby1xnnb.js → cli-f1wky6zp.js} +1 -1
  28. package/dist/{cli-zvz62chv.js → cli-fm4ytsdk.js} +4 -4
  29. package/dist/{cli-tg8qj8ee.js → cli-frcta2w4.js} +6 -6
  30. package/dist/{cli-7xx10h0a.js → cli-g69fdc9g.js} +2 -2
  31. package/dist/{cli-cmp8g3sw.js → cli-gbfwcd3k.js} +44 -9
  32. package/dist/{handlers-nsg0bcye.js → cli-gjyvhmmh.js} +97 -45
  33. package/dist/{cli-08b07b4r.js → cli-ht5rs63n.js} +1 -1
  34. package/dist/{cli-jecc01cb.js → cli-j4nv2wqy.js} +2 -4
  35. package/dist/{cli-cd60fv6j.js → cli-j9xczhaq.js} +1 -1
  36. package/dist/cli-pf9q3696.js +172 -0
  37. package/dist/{cli-xm87hzbw.js → cli-pgj4a5fb.js} +1 -1
  38. package/dist/{cli-jezx9b9c.js → cli-ppm4975n.js} +9 -3
  39. package/dist/{cli-3z634pqe.js → cli-q88st9aj.js} +2 -2
  40. package/dist/{cli-3sysyjve.js → cli-r2q6pevn.js} +142 -49
  41. package/dist/{cli-07jd68a1.js → cli-re8z5p8p.js} +1 -1
  42. package/dist/{cli-qgd4sqz5.js → cli-s14agm5s.js} +121 -14
  43. package/dist/{cli-svbrpf5q.js → cli-sjaae6ff.js} +9872 -424
  44. package/dist/{cli-73gq0zxn.js → cli-vwm416m6.js} +13 -13
  45. package/dist/{cli-4wtq5jjv.js → cli-wbyk465z.js} +1 -1
  46. package/dist/{cli-3apbzgyk.js → cli-z61ykvam.js} +19 -14
  47. package/dist/{cli-e06a8a7y.js → cli-zkxymas5.js} +4 -3
  48. package/dist/cli.js +26 -25
  49. package/dist/{codex-adapter-jyw7a91z.js → codex-adapter-jjjk8w4m.js} +8 -9
  50. package/dist/{codex-hook-hfrt9shr.js → codex-hook-8jexc34x.js} +3 -3
  51. package/dist/{codex-session-runner-bmngj0s5.js → codex-session-runner-nd6ayxkx.js} +8 -9
  52. package/dist/{commands-n755g391.js → commands-9v4psyq1.js} +5 -5
  53. package/dist/{db-s1cgh5gv.js → db-wnt58tpe.js} +5 -5
  54. package/dist/dispatcher-05jh1aqk.js +74 -0
  55. package/dist/{e2b-p04vmtx0.js → e2b-413b8t4v.js} +1 -1
  56. package/dist/{google-generative-ai-tsskx7te.js → google-generative-ai-ndjmj5fa.js} +7 -7
  57. package/dist/{google-vertex-ppw8ydpa.js → google-vertex-fr665tqs.js} +10 -10
  58. package/dist/handlers-tw90pkh5.js +65 -0
  59. package/dist/{hook-jf0xe8zh.js → hook-123e2scb.js} +11 -12
  60. package/dist/{hook-h9cqrm8q.js → hook-sxe3r349.js} +11 -12
  61. package/dist/{http-nc6pydw5.js → http-ecsar8ez.js} +1442 -581
  62. package/dist/{index-ezxkds2n.js → index-16js521z.js} +335 -107
  63. package/dist/{index-769nc012.js → index-hw26vj40.js} +25 -19
  64. package/dist/{index-0wdy6gwc.js → index-nnrbpcjp.js} +25 -17
  65. package/dist/index-ymn7em0p.js +25 -0
  66. package/dist/{index-x1zcj09z.js → index-zj518gf9.js} +26 -20
  67. package/dist/{keepalive-nesm3xb6.js → keepalive-asqtcm4y.js} +7 -7
  68. package/dist/{lead-bwy6t2za.js → lead-xbfr7fvt.js} +40 -48
  69. package/dist/{maintenance-8w393zf0.js → maintenance-qma55qvw.js} +9 -9
  70. package/dist/{oauth-refresh-sweep-sh8xjy08.js → oauth-refresh-sweep-3s04c6qw.js} +6 -6
  71. package/dist/{onboard-25ps29h1.js → onboard-drskd386.js} +13 -4
  72. package/dist/{openai-codex-responses-g7w48y30.js → openai-codex-responses-wy6a43wd.js} +13 -13
  73. package/dist/{openai-responses-nmeyptke.js → openai-responses-6xwf7bzg.js} +19 -19
  74. package/dist/{opencode-adapter-dce4wskd.js → opencode-adapter-28axqa09.js} +4 -4
  75. package/dist/{otel-impl-b93gxnz5.js → otel-impl-943c96er.js} +1 -1
  76. package/dist/{pi-mono-adapter-zvshk5cj.js → pi-mono-adapter-jcqt71cg.js} +17 -19
  77. package/dist/{pricing-refresh-5v56x7gb.js → pricing-refresh-mx51az05.js} +7 -7
  78. package/dist/{rbac-roles-x55cnezn.js → rbac-roles-78baecqd.js} +13 -9
  79. package/dist/{rbac-roles-0p0s6pbj.js → rbac-roles-wcmrg6sv.js} +7 -7
  80. package/dist/{render-v2-hyd45w8b.js → render-v2-8zjntgf5.js} +7 -7
  81. package/dist/{seed-pricing-49gbgn96.js → seed-pricing-jqjs6cws.js} +6 -6
  82. package/dist/{setup-qvq64vzq.js → setup-4pks0vfk.js} +2 -2
  83. package/dist/work-objects-wangt792.js +165 -0
  84. package/dist/{worker-scj60cxg.js → worker-p2mr422x.js} +40 -48
  85. package/openapi.json +1365 -268
  86. package/package.json +4 -3
  87. package/src/agentmail/handlers.ts +95 -66
  88. package/src/be/budget-refusal-notify.ts +1 -0
  89. package/src/be/db/tasks/read.ts +3 -0
  90. package/src/be/db/tasks/write.ts +13 -1
  91. package/src/be/db-client.ts +5 -0
  92. package/src/be/db.ts +15 -5
  93. package/src/be/extensions/db.ts +461 -0
  94. package/src/be/extensions/validate.ts +107 -0
  95. package/src/be/memory/boot-reembed.ts +17 -12
  96. package/src/be/memory/index.ts +12 -0
  97. package/src/be/memory/providers/openai-embedding.ts +4 -0
  98. package/src/be/memory/types.ts +2 -0
  99. package/src/be/migrations/153_deferred_task_wait_members.sql +25 -0
  100. package/src/be/migrations/154_routing_source.sql +3 -0
  101. package/src/be/migrations/155_extensions.sql +66 -0
  102. package/src/be/migrations/156_inbox_item_state_read_at.sql +7 -0
  103. package/src/be/rbac-roles.ts +3 -2
  104. package/src/be/scripts/typecheck.ts +59 -41
  105. package/src/be/seed/schedules-seeder.ts +25 -2
  106. package/src/be/seed/workflows-seeder.ts +17 -0
  107. package/src/be/seed-scripts/catalog/delegate.ts +3 -1
  108. package/src/be/seed-skills/bundled-files.generated.json +1 -1
  109. package/src/be/seed-skills/index.ts +7 -0
  110. package/src/be/steering.ts +1 -0
  111. package/src/be/swarm-config-guard.ts +3 -1
  112. package/src/commands/credential-refresh.ts +70 -0
  113. package/src/commands/onboard/compose-generator.ts +14 -2
  114. package/src/commands/onboard/env-generator.ts +7 -0
  115. package/src/commands/provider-credentials.ts +2 -25
  116. package/src/commands/runner.ts +24 -57
  117. package/src/extensions/apply-task-create.ts +135 -0
  118. package/src/extensions/bundle-path.ts +10 -0
  119. package/src/extensions/contract-runtime.ts +7 -0
  120. package/src/extensions/contract-types.generated.ts +4 -0
  121. package/src/extensions/contract.ts +270 -0
  122. package/src/extensions/ctx.ts +186 -0
  123. package/src/extensions/dispatcher.ts +479 -0
  124. package/src/extensions/identity.ts +44 -0
  125. package/src/extensions/lifecycle.ts +281 -0
  126. package/src/extensions/loader.ts +207 -0
  127. package/src/extensions/post-bridge.ts +161 -0
  128. package/src/github/handlers.ts +185 -140
  129. package/src/gitlab/handlers.ts +97 -77
  130. package/src/heartbeat/heartbeat.ts +155 -83
  131. package/src/http/agents.ts +1 -1
  132. package/src/http/all-routes.ts +1 -0
  133. package/src/http/approval-requests.ts +1 -0
  134. package/src/http/apps.ts +14 -9
  135. package/src/http/config.ts +4 -1
  136. package/src/http/core.ts +38 -2
  137. package/src/http/extensions.ts +547 -0
  138. package/src/http/inbox-state.ts +2 -0
  139. package/src/http/index.ts +41 -3
  140. package/src/http/mcp-bridge.ts +96 -62
  141. package/src/http/mcp.ts +1 -1
  142. package/src/http/script-runs.ts +5 -0
  143. package/src/http/status.ts +6 -4
  144. package/src/http/tasks.ts +51 -30
  145. package/src/integrations/kapso/inbound.ts +15 -10
  146. package/src/jira/sync.ts +26 -16
  147. package/src/linear/sync.ts +26 -16
  148. package/src/prompts/session-templates.ts +18 -13
  149. package/src/providers/claude-adapter.ts +21 -8
  150. package/src/rbac/admission.ts +1 -1
  151. package/src/rbac/elevated-agents.ts +24 -0
  152. package/src/rbac/legacy-policy.ts +35 -6
  153. package/src/rbac/permissions.ts +8 -0
  154. package/src/scheduler/deferred-task-waits.ts +138 -27
  155. package/src/scheduler/schedule-task.ts +54 -24
  156. package/src/scheduler/scheduler.ts +108 -125
  157. package/src/scripts-runtime/executors/native.ts +5 -1
  158. package/src/scripts-runtime/executors/types.ts +5 -0
  159. package/src/scripts-runtime/import-allowlist.ts +79 -19
  160. package/src/scripts-runtime/sdk-allowlist.ts +4 -0
  161. package/src/scripts-runtime/swarm-config.ts +8 -0
  162. package/src/scripts-runtime/swarm-sdk.ts +3 -0
  163. package/src/scripts-runtime/types/stdlib.d.ts +16 -3
  164. package/src/scripts-runtime/types/swarm-extension.d.ts +562 -0
  165. package/src/scripts-runtime/types/swarm-sdk.d.ts +16 -3
  166. package/src/server.ts +6 -0
  167. package/src/slack/HEURISTICS.md +3 -1
  168. package/src/slack/actions.ts +21 -16
  169. package/src/slack/app.ts +2 -0
  170. package/src/slack/assistant.ts +4 -12
  171. package/src/slack/blocks.ts +1 -1
  172. package/src/slack/handlers.ts +107 -19
  173. package/src/slack/inbound-files.ts +9 -5
  174. package/src/slack/render-v2.ts +188 -38
  175. package/src/slack/router.ts +13 -3
  176. package/src/slack/steering.ts +3 -3
  177. package/src/slack/thread-buffer.ts +66 -23
  178. package/src/slack/work-objects.test.ts +252 -0
  179. package/src/slack/work-objects.ts +118 -0
  180. package/src/tasks/errors.ts +9 -0
  181. package/src/tasks/sibling-awareness.ts +35 -1
  182. package/src/tasks/worker-follow-up.ts +67 -11
  183. package/src/tests/acp-adapter.test.ts +10 -10
  184. package/src/tests/agent-fs-live-url.test.ts +40 -0
  185. package/src/tests/agent-fs-provision-seeder.test.ts +12 -12
  186. package/src/tests/api-key-tracking.test.ts +18 -18
  187. package/src/tests/api-key.test.ts +4 -2
  188. package/src/tests/apps-rbac.test.ts +1 -1
  189. package/src/tests/apps-spike5.test.ts +1 -1
  190. package/src/tests/apps-sync-engine.test.ts +8 -8
  191. package/src/tests/apps-user-config.test.ts +1 -1
  192. package/src/tests/artifact-sdk.test.ts +8 -8
  193. package/src/tests/asset-key-mcp.test.ts +2 -0
  194. package/src/tests/automation-preflight-alert.test.ts +1 -1
  195. package/src/tests/base-prompt.test.ts +7 -6
  196. package/src/tests/budget-user-scope.test.ts +1 -1
  197. package/src/tests/budgets-routes.test.ts +1 -1
  198. package/src/tests/claude-adapter-binary.test.ts +22 -40
  199. package/src/tests/claude-adapter-otel.test.ts +13 -7
  200. package/src/tests/claude-adapter.test.ts +8 -6
  201. package/src/tests/claude-hook-credentials.test.ts +3 -3
  202. package/src/tests/claude-managed-adapter.test.ts +4 -4
  203. package/src/tests/claude-managed-setup.test.ts +3 -3
  204. package/src/tests/claude-sdk-lifecycle.test.ts +1 -1
  205. package/src/tests/claude-sdk-transport.test.ts +6 -6
  206. package/src/tests/claude-stop-hook.test.ts +8 -8
  207. package/src/tests/claude-worker-parity.test.ts +3 -3
  208. package/src/tests/codex-adapter-pool-auth-revalidate.test.ts +5 -5
  209. package/src/tests/codex-adapter.test.ts +7 -5
  210. package/src/tests/codex-app-server.test.ts +2 -2
  211. package/src/tests/codex-login.test.ts +15 -15
  212. package/src/tests/codex-oauth-credential-info.test.ts +4 -4
  213. package/src/tests/codex-oauth-keep-warm.test.ts +4 -4
  214. package/src/tests/codex-oauth-refresh-lock.test.ts +1 -1
  215. package/src/tests/codex-oauth-storage.test.ts +7 -7
  216. package/src/tests/codex-pool.test.ts +1 -1
  217. package/src/tests/codex-steering-hook.test.ts +1 -1
  218. package/src/tests/codex-swarm-events.test.ts +1 -1
  219. package/src/tests/config-api-only-keys.test.ts +1 -1
  220. package/src/tests/config-session-auth.test.ts +2 -2
  221. package/src/tests/connection-embedded-auth.test.ts +20 -18
  222. package/src/tests/core-auth.test.ts +1 -1
  223. package/src/tests/create-page-tool.test.ts +3 -3
  224. package/src/tests/credential-refresh.test.ts +115 -0
  225. package/src/tests/credential-wait.test.ts +2 -2
  226. package/src/tests/credentials.test.ts +6 -4
  227. package/src/tests/db-queries-oauth.test.ts +40 -40
  228. package/src/tests/defer-task.test.ts +73 -8
  229. package/src/tests/deferred-task-wait-migration.test.ts +64 -0
  230. package/src/tests/deferred-task-wake.test.ts +349 -8
  231. package/src/tests/devin-adapter.test.ts +1 -1
  232. package/src/tests/devin-api.test.ts +1 -1
  233. package/src/tests/docs-index-footprint.test.js +3 -3
  234. package/src/tests/e2b-dispatch.test.ts +21 -19
  235. package/src/tests/e2e-claude-transport.test.ts +3 -3
  236. package/src/tests/e2e-redact.test.ts +6 -6
  237. package/src/tests/ensure-token.test.ts +68 -68
  238. package/src/tests/entrypoint-api-readiness.test.ts +1 -1
  239. package/src/tests/entrypoint-codex-oauth-seed.test.ts +13 -13
  240. package/src/tests/env-flag.test.ts +1 -0
  241. package/src/tests/events-http.test.ts +1 -1
  242. package/src/tests/extensions-db.test.ts +216 -0
  243. package/src/tests/extensions-dispatcher.test.ts +275 -0
  244. package/src/tests/extensions-example-heartbeat-remediate.test.ts +69 -0
  245. package/src/tests/extensions-example-mcp-install.test.ts +63 -0
  246. package/src/tests/extensions-example-no-exclamation-marks.test.ts +72 -0
  247. package/src/tests/extensions-example-rewrite-and-suppress.test.ts +70 -0
  248. package/src/tests/extensions-example-route-slack-channel.test.ts +217 -0
  249. package/src/tests/extensions-heartbeat.test.ts +291 -0
  250. package/src/tests/extensions-http.test.ts +431 -0
  251. package/src/tests/extensions-lead-equivalence.test.ts +49 -0
  252. package/src/tests/extensions-lifecycle.test.ts +209 -0
  253. package/src/tests/extensions-loader.test.ts +95 -0
  254. package/src/tests/extensions-mcp-tools.test.ts +245 -0
  255. package/src/tests/extensions-pre-task.test.ts +487 -0
  256. package/src/tests/extensions-run-context.test.ts +41 -0
  257. package/src/tests/extensions-tool-call.test.ts +288 -0
  258. package/src/tests/extensions-validate.test.ts +196 -0
  259. package/src/tests/fixtures/extensions/bad-import/hooks.ts +8 -0
  260. package/src/tests/fixtures/extensions/bad-import/manifest.json +9 -0
  261. package/src/tests/fixtures/extensions/bad-return-shape/hooks.ts +10 -0
  262. package/src/tests/fixtures/extensions/bad-return-shape/manifest.json +9 -0
  263. package/src/tests/fixtures/extensions/block-tasks-from-source/hooks.ts +22 -0
  264. package/src/tests/fixtures/extensions/block-tasks-from-source/manifest.json +9 -0
  265. package/src/tests/fixtures/extensions/ignore-channel/hooks.ts +22 -0
  266. package/src/tests/fixtures/extensions/ignore-channel/manifest.json +9 -0
  267. package/src/tests/fixtures/extensions/load.ts +10 -0
  268. package/src/tests/fixtures/extensions/minimal/hooks.ts +7 -0
  269. package/src/tests/fixtures/extensions/minimal/manifest.json +9 -0
  270. package/src/tests/fixtures/extensions/never-fail-long-tasks/hooks.ts +11 -0
  271. package/src/tests/fixtures/extensions/never-fail-long-tasks/manifest.json +9 -0
  272. package/src/tests/fixtures/extensions/no-exclamation-marks/hooks.ts +23 -0
  273. package/src/tests/fixtures/extensions/no-exclamation-marks/manifest.json +9 -0
  274. package/src/tests/fixtures/extensions/post-logger/hooks.ts +9 -0
  275. package/src/tests/fixtures/extensions/post-logger/manifest.json +9 -0
  276. package/src/tests/fixtures/extensions/priority-a/hooks.ts +7 -0
  277. package/src/tests/fixtures/extensions/priority-a/manifest.json +9 -0
  278. package/src/tests/fixtures/extensions/priority-b/hooks.ts +7 -0
  279. package/src/tests/fixtures/extensions/priority-b/manifest.json +9 -0
  280. package/src/tests/fixtures/extensions/record-only-on-tag/hooks.ts +16 -0
  281. package/src/tests/fixtures/extensions/record-only-on-tag/manifest.json +9 -0
  282. package/src/tests/fixtures/extensions/reserved-assets/hooks.ts +5 -0
  283. package/src/tests/fixtures/extensions/reserved-assets/manifest.json +10 -0
  284. package/src/tests/fixtures/extensions/rewrite-progress-prefix/hooks.ts +22 -0
  285. package/src/tests/fixtures/extensions/rewrite-progress-prefix/manifest.json +9 -0
  286. package/src/tests/fixtures/extensions/rewrite-task-priority/hooks.ts +7 -0
  287. package/src/tests/fixtures/extensions/rewrite-task-priority/manifest.json +9 -0
  288. package/src/tests/fixtures/extensions/route-channel-to-agent/hooks.ts +26 -0
  289. package/src/tests/fixtures/extensions/route-channel-to-agent/manifest.json +9 -0
  290. package/src/tests/fixtures/extensions/slow/hooks.ts +10 -0
  291. package/src/tests/fixtures/extensions/slow/manifest.json +9 -0
  292. package/src/tests/fixtures/extensions/suppress-lead-follow-up/hooks.ts +12 -0
  293. package/src/tests/fixtures/extensions/suppress-lead-follow-up/manifest.json +9 -0
  294. package/src/tests/fixtures/extensions/throws/hooks.ts +12 -0
  295. package/src/tests/fixtures/extensions/throws/manifest.json +9 -0
  296. package/src/tests/fixtures/extensions/worker-runtime/hooks.ts +5 -0
  297. package/src/tests/fixtures/extensions/worker-runtime/manifest.json +9 -0
  298. package/src/tests/fs-routes.test.ts +1 -1
  299. package/src/tests/gitlab-auth.test.ts +10 -10
  300. package/src/tests/harness-provider-resolution.test.ts +8 -5
  301. package/src/tests/heartbeat-reroute-decision.test.ts +1 -0
  302. package/src/tests/helper-credentials.test.ts +137 -0
  303. package/src/tests/http/context-routes.test.ts +2 -2
  304. package/src/tests/http-api-integration.test.ts +5 -2
  305. package/src/tests/http-users.test.ts +1 -1
  306. package/src/tests/identity-refresh.test.ts +2 -2
  307. package/src/tests/internal-ai/complete-structured.test.ts +2 -2
  308. package/src/tests/internal-ai/credentials.test.ts +19 -17
  309. package/src/tests/jira-metadata.test.ts +1 -1
  310. package/src/tests/jira-oauth.test.ts +5 -5
  311. package/src/tests/jira-sync.test.ts +1 -1
  312. package/src/tests/jira-webhook-lifecycle.test.ts +3 -3
  313. package/src/tests/jira-webhook.test.ts +2 -2
  314. package/src/tests/kapso-inbound.test.ts +2 -2
  315. package/src/tests/kv-http.test.ts +1 -1
  316. package/src/tests/kv-namespace-resolution.test.ts +1 -1
  317. package/src/tests/kv-page-proxy.test.ts +2 -2
  318. package/src/tests/launch-password-rejection.test.ts +2 -2
  319. package/src/tests/linear-webhook.test.ts +1 -1
  320. package/src/tests/mcp-oauth-dcr-reuse.test.ts +6 -6
  321. package/src/tests/mcp-oauth-ensure-token.test.ts +28 -22
  322. package/src/tests/mcp-oauth-manual-client.test.ts +16 -12
  323. package/src/tests/mcp-oauth-queries.test.ts +35 -32
  324. package/src/tests/mcp-oauth-resolve-secrets.test.ts +8 -8
  325. package/src/tests/mcp-oauth-wrapper.test.ts +20 -20
  326. package/src/tests/mcp-user-route.test.ts +1 -1
  327. package/src/tests/memory-edges.test.ts +1 -1
  328. package/src/tests/memory-edit-authorization.test.ts +32 -0
  329. package/src/tests/memory-rate-endpoint.test.ts +1 -1
  330. package/src/tests/memory-rate-tool.test.ts +2 -2
  331. package/src/tests/memory-rater-e2e.test.ts +1 -1
  332. package/src/tests/memory-rater-llm-summarizer.test.ts +3 -3
  333. package/src/tests/memory-rater-llm.test.ts +1 -1
  334. package/src/tests/model-control.test.ts +3 -0
  335. package/src/tests/multi-runtime-enabled-stats.test.ts +2 -2
  336. package/src/tests/multi-runtime-registration.test.ts +111 -17
  337. package/src/tests/oauth-access-token-tool.test.ts +18 -18
  338. package/src/tests/oauth-callback-flow.test.ts +8 -8
  339. package/src/tests/oauth-credential-bindings.test.ts +29 -27
  340. package/src/tests/oauth-keepalive.test.ts +10 -10
  341. package/src/tests/oauth-presets.test.ts +13 -5
  342. package/src/tests/oauth-refresh-failure.test.ts +9 -9
  343. package/src/tests/oauth-refresh-sweep.test.ts +20 -13
  344. package/src/tests/oauth-wrapper.test.ts +1 -1
  345. package/src/tests/onboard-compose.test.ts +47 -3
  346. package/src/tests/onboard-env.test.ts +26 -26
  347. package/src/tests/onboard-non-interactive.test.ts +4 -4
  348. package/src/tests/opencode-adapter.test.ts +1 -1
  349. package/src/tests/opencode-plugin.test.ts +2 -2
  350. package/src/tests/otel-session-cost-metrics.test.ts +1 -1
  351. package/src/tests/page-proxy-authed.test.ts +2 -2
  352. package/src/tests/page-proxy.test.ts +2 -2
  353. package/src/tests/page-session.test.ts +7 -7
  354. package/src/tests/page-viewer-auth.test.ts +2 -2
  355. package/src/tests/pages-authed-mode.test.ts +1 -1
  356. package/src/tests/pages-http.test.ts +1 -1
  357. package/src/tests/pages-password-mode.test.ts +1 -1
  358. package/src/tests/pages-public-authed-401.test.ts +1 -1
  359. package/src/tests/pages-public-html.test.ts +2 -2
  360. package/src/tests/pages-view-count.test.ts +1 -1
  361. package/src/tests/pi-mono-adapter.test.ts +10 -10
  362. package/src/tests/pi-mono-extension.test.ts +2 -2
  363. package/src/tests/preload.ts +5 -0
  364. package/src/tests/pricing-routes.test.ts +1 -1
  365. package/src/tests/profile-sync-warning.test.ts +8 -8
  366. package/src/tests/profile-sync.test.ts +8 -8
  367. package/src/tests/prompt-template-session.test.ts +36 -5
  368. package/src/tests/provider-process-group.test.ts +95 -4
  369. package/src/tests/providers/pi-cost.test.ts +1 -1
  370. package/src/tests/queue-stall-alarm.test.ts +1 -1
  371. package/src/tests/rbac-admission.test.ts +19 -4
  372. package/src/tests/rbac-charact-http.test.ts +1 -1
  373. package/src/tests/rbac-e2e-helpers.ts +1 -1
  374. package/src/tests/rbac-engine.test.ts +39 -0
  375. package/src/tests/realtime-room-auth.test.ts +1 -1
  376. package/src/tests/realtime-room-surfaces.test.ts +1 -1
  377. package/src/tests/reload-config.test.ts +45 -1
  378. package/src/tests/routing-affinity-inventory.test.ts +1 -1
  379. package/src/tests/routing-reason-contract.test.ts +76 -3
  380. package/src/tests/routing-reason-inventory.test.ts +11 -6
  381. package/src/tests/routing-source.test.ts +53 -0
  382. package/src/tests/runner-agent-fs-provision-retry.test.ts +1 -1
  383. package/src/tests/runner-context-preamble.test.ts +1 -1
  384. package/src/tests/runner-deployment-resume.test.ts +1 -1
  385. package/src/tests/runner-fallback-output.test.ts +1 -1
  386. package/src/tests/runner-identity-refresh.test.ts +1 -1
  387. package/src/tests/runner-skills-refresh.test.ts +1 -1
  388. package/src/tests/schedule-target-type.test.ts +3 -3
  389. package/src/tests/scheduled-tasks.test.ts +14 -5
  390. package/src/tests/scheduler-occurrence.test.ts +347 -0
  391. package/src/tests/script-apis-mcp.test.ts +1 -1
  392. package/src/tests/script-connections-http.test.ts +61 -58
  393. package/src/tests/script-connections-mcp.test.ts +1 -1
  394. package/src/tests/script-connections.test.ts +3 -1
  395. package/src/tests/script-runs-http.test.ts +15 -7
  396. package/src/tests/script-workflows-runtime-e2e.test.ts +1 -1
  397. package/src/tests/scripts-boot-reembed.test.ts +4 -0
  398. package/src/tests/scripts-embeddings.test.ts +4 -0
  399. package/src/tests/scripts-external-api.test.ts +1 -1
  400. package/src/tests/scripts-http.test.ts +1 -1
  401. package/src/tests/scripts-import-allowlist.test.ts +44 -1
  402. package/src/tests/scripts-mcp-e2e.test.ts +81 -1
  403. package/src/tests/scripts-only-gating.test.ts +4 -2
  404. package/src/tests/scripts-retention.test.ts +1 -1
  405. package/src/tests/scripts-runtime-identity.test.ts +2 -2
  406. package/src/tests/scripts-runtime-secret-egress.test.ts +1 -1
  407. package/src/tests/scripts-runtime.test.ts +6 -4
  408. package/src/tests/scripts-typecheck.test.ts +21 -0
  409. package/src/tests/sdk-allowlist.test.ts +1 -1
  410. package/src/tests/secret-scrubber.test.ts +38 -31
  411. package/src/tests/seed-registry.test.ts +46 -8
  412. package/src/tests/seed-schedules.test.ts +44 -9
  413. package/src/tests/seed-workflows.test.ts +21 -9
  414. package/src/tests/send-task-output-schema.test.ts +9 -1
  415. package/src/tests/send-task-requested-by.test.ts +1 -0
  416. package/src/tests/send-task-slack-routing-guard.test.ts +2 -0
  417. package/src/tests/session-costs-codex-recompute.test.ts +1 -1
  418. package/src/tests/session-costs-golden.test.ts +2 -2
  419. package/src/tests/session-costs-model-key-normalize.test.ts +2 -2
  420. package/src/tests/session-costs-recompute-all-providers.test.ts +1 -1
  421. package/src/tests/session-tokens.test.ts +1 -1
  422. package/src/tests/shutdown-error-scrubbing.test.ts +1 -1
  423. package/src/tests/slack-blocks.test.ts +12 -1
  424. package/src/tests/slack-file-tools-attachments.test.ts +1 -1
  425. package/src/tests/slack-inbound-files.test.ts +222 -86
  426. package/src/tests/slack-reaction-config.test.ts +5 -4
  427. package/src/tests/slack-read-boundaries.test.ts +1 -1
  428. package/src/tests/slack-render-v2.test.ts +196 -4
  429. package/src/tests/slack-router.test.ts +17 -2
  430. package/src/tests/slack-steering.test.ts +19 -0
  431. package/src/tests/status.test.ts +19 -7
  432. package/src/tests/steering-core.test.ts +1 -1
  433. package/src/tests/steering-enabled.test.ts +6 -8
  434. package/src/tests/steering-transport.test.ts +4 -4
  435. package/src/tests/store-progress-output-guidance.test.ts +34 -0
  436. package/src/tests/swarm-tool-result-gate.test.ts +11 -11
  437. package/src/tests/swarm-x-tool.test.ts +7 -5
  438. package/src/tests/sync-ai-toolbox-skills.test.ts +19 -0
  439. package/src/tests/task-supersede-resume.test.ts +1 -1
  440. package/src/tests/task-tool-preload-mcp.test.ts +4 -1
  441. package/src/tests/task-tools-ctx.test.ts +2 -0
  442. package/src/tests/tasks-requested-by-filter.test.ts +2 -2
  443. package/src/tests/telemetry-init.test.ts +11 -3
  444. package/src/tests/tool-annotations.test.ts +1 -1
  445. package/src/tests/tool-output-agent-id.test.ts +1 -0
  446. package/src/tests/tool-registrar-no-input.test.ts +42 -1
  447. package/src/tests/tracker-fold.test.ts +7 -7
  448. package/src/tests/tracker-tools.test.ts +3 -3
  449. package/src/tests/ui-followup-lead-delegation.test.ts +1 -0
  450. package/src/tests/unified-oauth-migration.test.ts +5 -5
  451. package/src/tests/user-token-rest-auth.test.ts +1 -1
  452. package/src/tests/user-token-routes.test.ts +1 -1
  453. package/src/tests/whoami-route.test.ts +1 -1
  454. package/src/tests/workflow-agent-task.test.ts +15 -13
  455. package/src/tests/workflow-ctx.test.ts +1 -1
  456. package/src/tests/workflow-e2e.test.ts +1 -1
  457. package/src/tests/workflow-engine-v2.test.ts +3 -1
  458. package/src/tests/workflow-executors.test.ts +2 -2
  459. package/src/tests/workflow-http-v2.test.ts +8 -6
  460. package/src/tests/workflow-input-redaction.test.ts +7 -5
  461. package/src/tests/workflow-integration-io.test.ts +2 -2
  462. package/src/tests/workflow-llm.test.ts +5 -5
  463. package/src/tests/workflow-registry.test.ts +1 -1
  464. package/src/tests/workflow-swarm-script.test.ts +1 -1
  465. package/src/tests/workflow-triggers-v2.test.ts +23 -21
  466. package/src/tests/x-composio.test.ts +9 -7
  467. package/src/tests/x402-client.test.ts +1 -1
  468. package/src/tests/x402-config.test.ts +28 -41
  469. package/src/tools/defer-task.ts +156 -24
  470. package/src/tools/extension-common.ts +84 -0
  471. package/src/tools/extension-install.ts +65 -0
  472. package/src/tools/extension-list.ts +66 -0
  473. package/src/tools/script-common.ts +43 -18
  474. package/src/tools/send-task.ts +87 -105
  475. package/src/tools/skills/skill-publish.ts +1 -0
  476. package/src/tools/store-progress.ts +1 -1
  477. package/src/tools/task-action.ts +43 -22
  478. package/src/tools/task-tool-ctx.ts +2 -0
  479. package/src/tools/templates.ts +2 -1
  480. package/src/tools/tool-config.ts +3 -1
  481. package/src/tools/utils.ts +140 -16
  482. package/src/types.ts +144 -0
  483. package/src/utils/constants.ts +7 -1
  484. package/src/utils/credentials.test.ts +16 -16
  485. package/src/utils/multi-runtime.ts +2 -2
  486. package/src/utils/steering-enabled.ts +4 -4
  487. package/src/workflows/executors/agent-task.ts +18 -3
  488. package/templates/ai-toolbox.manifest.json +7 -1
  489. package/templates/extensions/README.md +17 -0
  490. package/templates/extensions/notify-on-complete/README.md +11 -0
  491. package/templates/extensions/notify-on-complete/hooks.ts +61 -0
  492. package/templates/extensions/notify-on-complete/manifest.json +7 -0
  493. package/templates/extensions/require-ticket-ref/README.md +11 -0
  494. package/templates/extensions/require-ticket-ref/hooks.ts +30 -0
  495. package/templates/extensions/require-ticket-ref/manifest.json +7 -0
  496. package/templates/extensions/require-verification-note/README.md +11 -0
  497. package/templates/extensions/require-verification-note/hooks.ts +32 -0
  498. package/templates/extensions/require-verification-note/manifest.json +7 -0
  499. package/templates/schedules/daily-hn-briefing/config.json +1 -1
  500. package/templates/schedules/gtm-weekly-review/config.json +1 -1
  501. package/templates/schedules/weekly-code-health-reports/config.json +1 -1
  502. package/templates/schedules/weekly-dependabot-triage/config.json +1 -1
  503. package/templates/schedules/weekly-dora-metrics/config.json +1 -1
  504. package/templates/schedules/weekly-harness-upgrade-check/config.json +1 -1
  505. package/templates/skills/delegate-work/files/scripts/codex-exec.sh +1 -1
  506. package/templates/skills/scheduling/content.md +2 -0
  507. package/templates/skills/serply-search/SKILL.md +95 -0
  508. package/templates/skills/serply-search/config.json +13 -0
  509. package/templates/skills/serply-search/content.md +90 -0
  510. package/templates/skills/swarm-extensions/config.json +14 -0
  511. package/templates/skills/swarm-extensions/content.md +120 -0
  512. package/templates/skills/swarm-scripts/SKILL.md +2 -2
  513. package/templates/skills/swarm-scripts/content.md +2 -2
  514. package/templates/workflows/claude-code-changelog-watch/config.json +1 -1
  515. package/templates/workflows/gsc-topic-miner/config.json +1 -1
  516. package/templates/workflows/linear-drain-loop/config.json +1 -1
  517. package/templates/workflows/llm-safe-release-context/config.json +1 -1
  518. package/templates/workflows/ralph-loop/config.json +1 -1
  519. package/dist/cli-7fehefdf.js +0 -562
  520. package/dist/cli-ayvy5kde.js +0 -164
  521. package/dist/cli-ddfw1mc4.js +0 -4322
  522. package/dist/cli-hzqmgcm2.js +0 -3066
  523. package/dist/cli-j4d4f6hv.js +0 -338
  524. package/dist/cli-qgm2pfpq.js +0 -6377
  525. package/dist/cli-sdzq01t9.js +0 -823
  526. package/dist/cli-xvkmedgn.js +0 -332
  527. package/dist/cli-y3pq4v9g.js +0 -664
  528. package/dist/{anthropic-messages-vs2rabzp.js → anthropic-messages-2y8nktar.js} +19 -19
  529. package/dist/{claude-managed-setup-f5pmsyrp.js → claude-managed-setup-48dwg9bv.js} +3 -3
  530. package/dist/{cli-81r683bv.js → cli-ch38q5z4.js} +0 -0
  531. package/dist/{cli-6664w7y4.js → cli-kj76p1ez.js} +8 -8
  532. package/dist/{cli-c71mg51n.js → cli-r2fpe7cx.js} +5 -5
  533. package/dist/{cli-4xz3pmrq.js → cli-y6x0gqtg.js} +16 -16
  534. package/dist/{index-aa3sa6s8.js → index-2wsdsnmm.js} +1 -1
  535. package/dist/{mistral-conversations-4ryk7h83.js → mistral-conversations-qhr84ph3.js} +9 -9
  536. package/dist/{openai-completions-0bqmsajw.js → openai-completions-32rdwmze.js} +19 -19
  537. package/dist/{openrouter-images-qx18fyp8.js → openrouter-images-9f9ek4rw.js} +3 -3
  538. package/dist/{pi-messages-79jvzz1d.js → pi-messages-b1mbr6gp.js} +4 -4
@@ -0,0 +1,172 @@
1
+ // src/prompts/memories.ts
2
+ var SIMILARITY_THRESHOLD = 0.4;
3
+ var RATE_TOOL_HINT = `
4
+
5
+ When a memory above genuinely helps you solve this task — or actively
6
+ misleads you — call \`memory_rate\` with the memory id and useful=true/false.
7
+ This trains the swarm to surface better memories next time. Use sparingly:
8
+ 2-5 ratings per task is plenty.`;
9
+ function renderMemoriesPrompt(memories) {
10
+ const useful = memories.filter((m) => m.similarity > SIMILARITY_THRESHOLD);
11
+ if (useful.length === 0)
12
+ return null;
13
+ const memoryContext = useful.map((m) => `- **${m.name}** (id: ${m.id}): ${m.content.substring(0, 300)}`).join(`
14
+ `);
15
+ let prompt = `
16
+
17
+ ### Relevant Past Knowledge
18
+
19
+ These memories from your previous sessions may be useful. Use \`memory-get\` with the memory ID to retrieve full details.
20
+
21
+ ${memoryContext}
22
+ `;
23
+ if (isExplicitSelfRaterEnabled()) {
24
+ prompt += RATE_TOOL_HINT;
25
+ }
26
+ return prompt;
27
+ }
28
+ function isExplicitSelfRaterEnabled() {
29
+ const ratersEnabled = (process.env.MEMORY_RATERS ?? "").split(",").map((s) => s.trim()).filter(Boolean);
30
+ return ratersEnabled.includes("explicit-self");
31
+ }
32
+
33
+ // src/utils/skill-fs-writer.ts
34
+ import { existsSync, mkdirSync, readdirSync, rmSync, writeFileSync } from "node:fs";
35
+ import { dirname, join } from "node:path";
36
+ var SWARM_MARKER_FILE = ".swarm-managed";
37
+ function reconcileManagedSkillFiles(skillDir, currentRelativeFiles) {
38
+ if (!existsSync(join(skillDir, SWARM_MARKER_FILE)))
39
+ return 0;
40
+ let removed = 0;
41
+ const walk = (dir, relativeDir = "") => {
42
+ let entries;
43
+ try {
44
+ entries = readdirSync(dir, { withFileTypes: true });
45
+ } catch {
46
+ return false;
47
+ }
48
+ let hasEntries = false;
49
+ for (const entry of entries) {
50
+ const relativePath = relativeDir ? `${relativeDir}/${entry.name}` : entry.name;
51
+ const fullPath = join(dir, entry.name);
52
+ if (entry.isDirectory()) {
53
+ const childHasEntries = walk(fullPath, relativePath);
54
+ if (!childHasEntries) {
55
+ try {
56
+ rmSync(fullPath, { recursive: true, force: true });
57
+ } catch {
58
+ hasEntries = true;
59
+ }
60
+ } else {
61
+ hasEntries = true;
62
+ }
63
+ continue;
64
+ }
65
+ if (relativePath === "SKILL.md" || relativePath === SWARM_MARKER_FILE || currentRelativeFiles.has(relativePath)) {
66
+ hasEntries = true;
67
+ continue;
68
+ }
69
+ try {
70
+ rmSync(fullPath, { force: true });
71
+ removed++;
72
+ } catch {
73
+ hasEntries = true;
74
+ }
75
+ }
76
+ return hasEntries;
77
+ };
78
+ walk(skillDir);
79
+ return removed;
80
+ }
81
+ function writeSkillsToFilesystem(entries, harnessType = "all", home) {
82
+ const errors = [];
83
+ let synced = 0;
84
+ let removed = 0;
85
+ const skillDirs = [];
86
+ if (harnessType === "claude" || harnessType === "all") {
87
+ skillDirs.push(join(home, ".claude", "skills"));
88
+ }
89
+ if (harnessType === "pi" || harnessType === "all") {
90
+ skillDirs.push(join(home, ".pi", "agent", "skills"));
91
+ }
92
+ if (harnessType === "codex" || harnessType === "all") {
93
+ skillDirs.push(join(home, ".codex", "skills"));
94
+ }
95
+ if (harnessType === "opencode" || harnessType === "all") {
96
+ skillDirs.push(join(home, ".opencode", "skills"));
97
+ }
98
+ if (harnessType === "agents" || harnessType === "all") {
99
+ skillDirs.push(join(home, ".agents", "skills"));
100
+ }
101
+ for (const dir of skillDirs) {
102
+ mkdirSync(dir, { recursive: true });
103
+ }
104
+ const writtenNames = new Set;
105
+ for (const skill of entries) {
106
+ if (!skill.isActive || !skill.isEnabled)
107
+ continue;
108
+ if (skill.isComplex && skill.files.length === 0)
109
+ continue;
110
+ if (!skill.content)
111
+ continue;
112
+ const safeName = skill.name.replace(/[^a-zA-Z0-9_-]/g, "_");
113
+ if (!safeName)
114
+ continue;
115
+ writtenNames.add(safeName);
116
+ const currentBundledFilePaths = new Set(skill.files.filter((file) => !file.isBinary).map((file) => file.path));
117
+ for (const baseDir of skillDirs) {
118
+ const skillDir = join(baseDir, safeName);
119
+ const skillFile = join(skillDir, "SKILL.md");
120
+ const markerFile = join(skillDir, SWARM_MARKER_FILE);
121
+ try {
122
+ mkdirSync(skillDir, { recursive: true });
123
+ removed += reconcileManagedSkillFiles(skillDir, currentBundledFilePaths);
124
+ writeFileSync(skillFile, skill.content, "utf-8");
125
+ writeFileSync(markerFile, "", "utf-8");
126
+ synced++;
127
+ } catch (err) {
128
+ const msg = err instanceof Error ? err.message : "Unknown error";
129
+ errors.push(`${skill.name} -> ${skillDir}: ${msg}`);
130
+ console.error(`[skill-fs-writer] Failed to write SKILL.md for ${skill.name} to ${skillDir}: ${msg}`);
131
+ }
132
+ for (const file of skill.files) {
133
+ if (file.isBinary) {
134
+ console.log(`[skill-fs-writer] Skipping binary skill file ${skill.name}/${file.path}`);
135
+ continue;
136
+ }
137
+ const targetPath = join(skillDir, file.path);
138
+ try {
139
+ mkdirSync(dirname(targetPath), { recursive: true });
140
+ writeFileSync(targetPath, file.content, "utf-8");
141
+ } catch (err) {
142
+ const msg = err instanceof Error ? err.message : "Unknown error";
143
+ errors.push(`${skill.name}/${file.path} -> ${targetPath}: ${msg}`);
144
+ console.error(`[skill-fs-writer] Failed to write bundled file ${skill.name}/${file.path} to ${targetPath}: ${msg}`);
145
+ }
146
+ }
147
+ }
148
+ }
149
+ for (const baseDir of skillDirs) {
150
+ if (!existsSync(baseDir))
151
+ continue;
152
+ try {
153
+ const existing = readdirSync(baseDir, { withFileTypes: true });
154
+ for (const entry of existing) {
155
+ if (!entry.isDirectory())
156
+ continue;
157
+ if (writtenNames.has(entry.name))
158
+ continue;
159
+ const skillDir = join(baseDir, entry.name);
160
+ if (!existsSync(join(skillDir, SWARM_MARKER_FILE)))
161
+ continue;
162
+ try {
163
+ rmSync(skillDir, { recursive: true, force: true });
164
+ removed++;
165
+ } catch {}
166
+ }
167
+ } catch {}
168
+ }
169
+ return { synced, removed, errors };
170
+ }
171
+
172
+ export { SIMILARITY_THRESHOLD, renderMemoriesPrompt, writeSkillsToFilesystem };
@@ -2,7 +2,7 @@ import {
2
2
  init_resolver,
3
3
  init_session_templates,
4
4
  resolveTemplateAsync
5
- } from "./cli-3apbzgyk.js";
5
+ } from "./cli-z61ykvam.js";
6
6
 
7
7
  // src/prompts/steering-delivery.ts
8
8
  init_session_templates();
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  contentSha256,
3
3
  init_profile_sync
4
- } from "./cli-zvz62chv.js";
4
+ } from "./cli-fm4ytsdk.js";
5
5
  import {
6
6
  OpenAI,
7
7
  init_openai
@@ -11,7 +11,7 @@ import {
11
11
  getDbClient,
12
12
  init_db,
13
13
  isSqliteVecAvailable
14
- } from "./cli-qgd4sqz5.js";
14
+ } from "./cli-s14agm5s.js";
15
15
  import {
16
16
  __esm,
17
17
  __export,
@@ -93,6 +93,9 @@ class OpenAIEmbeddingProvider {
93
93
  this.dimensions = config?.dimensions ?? EMBEDDING_DIMENSIONS;
94
94
  this.name = config?.model ? `openai/${config.model}` : process.env.EMBEDDING_MODEL ?? DEFAULT_EMBEDDING_MODEL;
95
95
  }
96
+ isConfigured() {
97
+ return !!this.apiKey;
98
+ }
96
99
  getClient() {
97
100
  if (!this.apiKey)
98
101
  return null;
@@ -1082,6 +1085,9 @@ function getEmbeddingProvider() {
1082
1085
  }
1083
1086
  return embeddingProvider;
1084
1087
  }
1088
+ function resetEmbeddingProvider() {
1089
+ embeddingProvider = null;
1090
+ }
1085
1091
  function getMemoryStore() {
1086
1092
  if (!memoryStore) {
1087
1093
  const { SqliteMemoryStore: SqliteMemoryStore2 } = (init_sqlite_store(), __toCommonJS(exports_sqlite_store));
@@ -1090,4 +1096,4 @@ function getMemoryStore() {
1090
1096
  return memoryStore;
1091
1097
  }
1092
1098
 
1093
- export { cosineSimilarity, serializeEmbedding, deserializeEmbedding, init_embedding, CANDIDATE_SET_MULTIPLIER, isGraphExpansionEnabled, EMBEDDING_DIMENSIONS, init_constants, computeScore, rerank, init_reranker, rowToCandidate, init_sqlite_store, getEmbeddingProvider, getMemoryStore };
1099
+ export { CANDIDATE_SET_MULTIPLIER, isGraphExpansionEnabled, EMBEDDING_DIMENSIONS, init_constants, cosineSimilarity, serializeEmbedding, deserializeEmbedding, init_embedding, computeScore, rerank, init_reranker, rowToCandidate, init_sqlite_store, getEmbeddingProvider, resetEmbeddingProvider, getMemoryStore };
@@ -4,11 +4,11 @@ import {
4
4
  getEmbeddingProvider,
5
5
  init_embedding,
6
6
  serializeEmbedding
7
- } from "./cli-jezx9b9c.js";
7
+ } from "./cli-ppm4975n.js";
8
8
  import {
9
9
  getDbClient,
10
10
  init_db
11
- } from "./cli-qgd4sqz5.js";
11
+ } from "./cli-s14agm5s.js";
12
12
  import {
13
13
  init_secret_scrubber,
14
14
  scrubSecrets
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  require_follow_redirects
3
3
  } from "./cli-q51yprfq.js";
4
- import {
5
- init_task_attachment_links,
6
- taskAttachmentDisplayUrl
7
- } from "./cli-9d8ntetj.js";
8
4
  import {
9
5
  require_jws,
10
6
  require_p_retry
11
7
  } from "./cli-yatxqynm.js";
8
+ import {
9
+ init_task_attachment_links,
10
+ taskAttachmentDisplayUrl
11
+ } from "./cli-2658f6at.js";
12
12
  import {
13
13
  SLACK_REACTION_CONFIG_KEYS,
14
14
  SLACK_REACTION_DEFAULTS,
@@ -49,11 +49,11 @@ import {
49
49
  setSlackMessageTracking,
50
50
  slackContextKey,
51
51
  updateSlackMessageRecord
52
- } from "./cli-qgd4sqz5.js";
52
+ } from "./cli-s14agm5s.js";
53
53
  import {
54
54
  getAppUrl,
55
55
  init_constants
56
- } from "./cli-e29gmdmw.js";
56
+ } from "./cli-dv6cdjs2.js";
57
57
  import {
58
58
  init_env_flag,
59
59
  isEnvFlagEnabled
@@ -54475,7 +54475,7 @@ async function initOtel(serviceRole = process.env.AGENT_ROLE || "api") {
54475
54475
  return;
54476
54476
  initialized = true;
54477
54477
  try {
54478
- const impl = await import("./otel-impl-b93gxnz5.js");
54478
+ const impl = await import("./otel-impl-943c96er.js");
54479
54479
  await impl.boot(serviceRole);
54480
54480
  realWithSpan = impl.withSpan;
54481
54481
  realStartSpan = impl.startSpan;
@@ -54845,9 +54845,9 @@ function collectAttachmentNodes(roots) {
54845
54845
  function buildTreeBlocks(roots) {
54846
54846
  console.log(`[Slack] Building tree blocks for ${roots.length} root(s): ${roots.map((r) => r.taskId.slice(0, 8)).join(", ")}`);
54847
54847
  const treeTexts = roots.map(renderTree);
54848
- const blocks = [sectionBlock(treeTexts.join(`
54848
+ const blocks = treeTexts.length > 0 ? [sectionBlock(treeTexts.join(`
54849
54849
 
54850
- `))];
54850
+ `))] : [];
54851
54851
  const attachmentNodes = collectAttachmentNodes(roots);
54852
54852
  const visibleAttachmentNodes = attachmentNodes.slice(0, SLACK_TREE_ATTACHMENT_BLOCKS_MAX);
54853
54853
  for (const node of visibleAttachmentNodes) {
@@ -55793,13 +55793,15 @@ async function initSlackApp() {
55793
55793
  logLevel: import_bolt.LogLevel.DEBUG,
55794
55794
  ...slackApiUrl ? { clientOptions: { slackApiUrl } } : {}
55795
55795
  });
55796
- const { registerMessageHandler } = await import("./handlers-nsg0bcye.js");
55797
- const { registerCommandHandler } = await import("./commands-n755g391.js");
55798
- const { registerActionHandlers } = await import("./actions-9d2694yk.js");
55796
+ const { registerMessageHandler } = await import("./handlers-tw90pkh5.js");
55797
+ const { registerCommandHandler } = await import("./commands-9v4psyq1.js");
55798
+ const { registerActionHandlers } = await import("./actions-2bgpyhww.js");
55799
+ const { registerWorkObjectHandlers } = await import("./work-objects-wangt792.js");
55799
55800
  registerMessageHandler(app);
55800
55801
  registerCommandHandler(app);
55801
55802
  registerActionHandlers(app);
55802
- const { createAssistant } = await import("./assistant-edb6n9nn.js");
55803
+ registerWorkObjectHandlers(app);
55804
+ const { createAssistant } = await import("./assistant-bavke5p7.js");
55803
55805
  app.assistant(createAssistant());
55804
55806
  return app;
55805
55807
  }
@@ -55808,7 +55810,7 @@ async function startSlackApp() {
55808
55810
  await initSlackApp();
55809
55811
  }
55810
55812
  if (app) {
55811
- const { isSlackRenderV2Enabled: isSlackRenderV2Enabled2 } = await import("./render-v2-hyd45w8b.js");
55813
+ const { isSlackRenderV2Enabled: isSlackRenderV2Enabled2 } = await import("./render-v2-8zjntgf5.js");
55812
55814
  if (isSlackRenderV2Enabled2())
55813
55815
  await ensureSlackRenderV2Activation();
55814
55816
  await app.start();
@@ -55982,7 +55984,7 @@ var lastTreeText = new Map;
55982
55984
  var lastTreeUpdateAt = new Map;
55983
55985
  var cachedTeamId;
55984
55986
  function isSlackRenderV2Enabled() {
55985
- return isEnvFlagEnabled("SLACK_RENDER_V2", false);
55987
+ return isEnvFlagEnabled("SLACK_RENDER_V2", true);
55986
55988
  }
55987
55989
  function isSlackDelegationEnabled() {
55988
55990
  return isEnvFlagEnabled("SLACK_RENDER_V2_DELEGATION", false);
@@ -56011,6 +56013,61 @@ async function callSlackWithRetry(client, method, payload) {
56011
56013
  }
56012
56014
  }
56013
56015
  }
56016
+ var OUTCOME_DELIVERY_MAX_ATTEMPTS = 5;
56017
+ var OUTCOME_DELIVERY_BASE_DELAY_MS = 30000;
56018
+ var OUTCOME_DELIVERY_MAX_DELAY_MS = 30 * 60000;
56019
+ var outcomeDeliveryFailures = new Map;
56020
+ function outcomeDeliveryGate(taskId) {
56021
+ const state = outcomeDeliveryFailures.get(taskId);
56022
+ if (!state)
56023
+ return true;
56024
+ if (state.count >= OUTCOME_DELIVERY_MAX_ATTEMPTS)
56025
+ return false;
56026
+ return Date.now() >= state.nextAttemptAt;
56027
+ }
56028
+ function noteOutcomeDeliverySuccess(taskId) {
56029
+ outcomeDeliveryFailures.delete(taskId);
56030
+ }
56031
+ async function noteOutcomeDeliveryFailure(task, error) {
56032
+ const state = outcomeDeliveryFailures.get(task.id) ?? { count: 0, nextAttemptAt: 0 };
56033
+ state.count += 1;
56034
+ const delay = Math.min(OUTCOME_DELIVERY_BASE_DELAY_MS * 2 ** (state.count - 1), OUTCOME_DELIVERY_MAX_DELAY_MS);
56035
+ state.nextAttemptAt = Date.now() + delay;
56036
+ outcomeDeliveryFailures.set(task.id, state);
56037
+ console.error(`[Slack] Outcome delivery failed for task ${task.id} (attempt ${state.count}/${OUTCOME_DELIVERY_MAX_ATTEMPTS}):`, error);
56038
+ if (state.count >= OUTCOME_DELIVERY_MAX_ATTEMPTS) {
56039
+ console.error(`[Slack] Giving up on outcome delivery for task ${task.id} after ${state.count} attempts; surfacing failure and clearing the working indicator`);
56040
+ await surfaceOutcomeDeliveryGiveUp(task, error);
56041
+ }
56042
+ }
56043
+ async function surfaceOutcomeDeliveryGiveUp(task, error) {
56044
+ const app2 = getSlackApp();
56045
+ if (!app2 || !task.slackChannelId || !task.slackThreadTs)
56046
+ return;
56047
+ try {
56048
+ await app2.client.apiCall("chat.postMessage", {
56049
+ channel: task.slackChannelId,
56050
+ thread_ts: task.slackThreadTs,
56051
+ text: `⚠️ Couldn't deliver this task's reply after ${OUTCOME_DELIVERY_MAX_ATTEMPTS} attempts (${error instanceof Error ? error.message : String(error)}). See task ${getTaskLink(task.id)} for the result.`
56052
+ });
56053
+ } catch (postError) {
56054
+ console.error(`[Slack] Give-up notice failed to post for task ${task.id}:`, postError);
56055
+ }
56056
+ await clearAssistantStatus(app2.client, task.slackChannelId, task.slackThreadTs);
56057
+ }
56058
+ async function clearAssistantStatus(client, channelId, threadTs) {
56059
+ if (!channelId.startsWith("D"))
56060
+ return;
56061
+ try {
56062
+ await client.apiCall("assistant.threads.setStatus", {
56063
+ channel_id: channelId,
56064
+ thread_ts: threadTs,
56065
+ status: ""
56066
+ });
56067
+ } catch (error) {
56068
+ console.warn(`[Slack] Failed to clear assistant status for ${channelId}/${threadTs}:`, error);
56069
+ }
56070
+ }
56014
56071
  function slackTreeStallMinutes() {
56015
56072
  return Number(process.env.SLACK_TREE_STALL_MIN) || 15;
56016
56073
  }
@@ -56449,7 +56506,8 @@ ${outcomeText(task.failureReason, "Task failed.")}`;
56449
56506
 
56450
56507
  ${outcomeText(task.failureReason, "Task was cancelled.")}`;
56451
56508
  }
56452
- if (slackReplySent && task.status === "completed") {
56509
+ const isDeferred = task.tags?.includes("deferred");
56510
+ if (slackReplySent && task.status === "completed" && !isDeferred) {
56453
56511
  const agentName = task.agentId ? (await getAgentById(task.agentId))?.name ?? "Agent" : "Agent";
56454
56512
  return `✅ ${agentName} completed`;
56455
56513
  }
@@ -56467,18 +56525,21 @@ async function childOutcomeContent(task, slackReplySent) {
56467
56525
 
56468
56526
  ${outcomeText(task.failureReason, "Task failed.")}`;
56469
56527
  }
56470
- if (slackReplySent) {
56528
+ if (slackReplySent && !task.tags?.includes("deferred")) {
56471
56529
  return `↳ ✅ ${agentName} completed`;
56472
56530
  }
56473
56531
  return `↳ ✅ ${agentName} — result
56474
56532
 
56475
56533
  ${outcomeText(task.output, "Task completed.")}`;
56476
56534
  }
56535
+ function isSlackContinuation(task) {
56536
+ return task.source === "schedule" && task.taskType === "deferred" && !!task.slackChannelId && !!task.slackThreadTs;
56537
+ }
56477
56538
  function isChildCardCandidate(task, delegationActivatedAt) {
56478
- return task.source !== "slack" && !!task.slackChannelId && !!task.slackThreadTs && (task.status === "completed" || task.status === "failed") && task.taskType !== "follow-up" && task.taskType !== "reroute-decision" && task.createdAt >= delegationActivatedAt;
56539
+ return task.source !== "slack" && !isSlackContinuation(task) && !!task.slackChannelId && !!task.slackThreadTs && (task.status === "completed" || task.status === "failed") && task.taskType !== "follow-up" && task.taskType !== "reroute-decision" && task.createdAt >= delegationActivatedAt;
56479
56540
  }
56480
- function taskNeedsAskOutcome(task, activatedAt) {
56481
- return task.source === "slack" && isAskOutcomeStatus(task.status) && task.createdAt >= activatedAt;
56541
+ function taskNeedsDirectOutcome(task, activatedAt) {
56542
+ return (task.source === "slack" && isAskOutcomeStatus(task.status) || isSlackContinuation(task) && isOutcomeStatus(task.status)) && task.createdAt >= activatedAt;
56482
56543
  }
56483
56544
  async function conclusionResultsLines(closure) {
56484
56545
  const lines = [];
@@ -56564,7 +56625,11 @@ function attachmentLine(attachments) {
56564
56625
  if (!attachment)
56565
56626
  return;
56566
56627
  const url = taskAttachmentDisplayUrl(attachment);
56567
- return /^https?:\/\//.test(url) ? `\uD83D\uDCCE [${attachment.name}](${url})` : undefined;
56628
+ if (!/^https?:\/\//.test(url))
56629
+ return;
56630
+ const label = attachment.name.replace(/\s+/g, " ").trim().replace(/[\\[\]()]/g, "\\$&");
56631
+ const destination = url.replace(/[\s\\<>]/g, encodeURIComponent).replace(/\(/g, "%28").replace(/\)/g, "%29");
56632
+ return `\uD83D\uDCCE [${label}](${destination})`;
56568
56633
  }
56569
56634
  function fenceAt(line) {
56570
56635
  const match = line.match(/^[ \t]{0,3}(`{3,}|~{3,})/);
@@ -56700,10 +56765,26 @@ async function streamOutcomeCard(task, tree, options) {
56700
56765
  reservationWasCreated = reserved.created;
56701
56766
  }
56702
56767
  let streamedFreshContent = false;
56768
+ let deliveredViaFallback = false;
56703
56769
  if (isPendingSlackMessage(outcome)) {
56704
56770
  const reconciled = reservationWasCreated ? undefined : await findReservedSlackMessage(app2.client, outcome, presentation);
56705
56771
  streamedFreshContent = !reconciled;
56706
- const started = reconciled ?? await callSlackWithRetry(app2.client, "chat.startStream", startPayload);
56772
+ let started = reconciled;
56773
+ if (!started) {
56774
+ try {
56775
+ started = await callSlackWithRetry(app2.client, "chat.startStream", startPayload);
56776
+ } catch (error) {
56777
+ console.error(`[Slack] chat.startStream failed for task ${task.id}; falling back to chat.postMessage:`, error);
56778
+ started = await callSlackWithRetry(app2.client, "chat.postMessage", {
56779
+ channel: task.slackChannelId,
56780
+ thread_ts: task.slackThreadTs,
56781
+ text: presentation,
56782
+ ...startPayload.username ? { username: startPayload.username } : {},
56783
+ ...startPayload.icon_emoji ? { icon_emoji: startPayload.icon_emoji } : {}
56784
+ });
56785
+ deliveredViaFallback = true;
56786
+ }
56787
+ }
56707
56788
  if (typeof started.ts !== "string" || !started.ts) {
56708
56789
  throw new Error("Slack did not return a timestamp for the outcome stream");
56709
56790
  }
@@ -56714,23 +56795,26 @@ async function streamOutcomeCard(task, tree, options) {
56714
56795
  throw new Error("Failed to persist the outcome stream timestamp");
56715
56796
  outcome = persisted;
56716
56797
  }
56717
- if (!streamedFreshContent) {
56718
- await callSlackWithRetry(app2.client, "chat.update", {
56719
- channel: task.slackChannelId,
56720
- ts: outcome.ts,
56721
- text: presentation
56722
- });
56723
- }
56724
- try {
56725
- await callSlackWithRetry(app2.client, "chat.stopStream", {
56726
- channel: task.slackChannelId,
56727
- ts: outcome.ts,
56728
- blocks: await outcomeFooter(task, tasks, duration)
56729
- });
56730
- } catch (error) {
56731
- if (!isStreamAlreadyStopped(error))
56732
- throw error;
56798
+ if (!deliveredViaFallback) {
56799
+ if (!streamedFreshContent) {
56800
+ await callSlackWithRetry(app2.client, "chat.update", {
56801
+ channel: task.slackChannelId,
56802
+ ts: outcome.ts,
56803
+ text: presentation
56804
+ });
56805
+ }
56806
+ try {
56807
+ await callSlackWithRetry(app2.client, "chat.stopStream", {
56808
+ channel: task.slackChannelId,
56809
+ ts: outcome.ts,
56810
+ blocks: await outcomeFooter(task, tasks, duration)
56811
+ });
56812
+ } catch (error) {
56813
+ if (!isStreamAlreadyStopped(error))
56814
+ throw error;
56815
+ }
56733
56816
  }
56817
+ await clearAssistantStatus(app2.client, task.slackChannelId, task.slackThreadTs);
56734
56818
  const permalink = await resolvePermalink(app2.client, task.slackChannelId, outcome.ts);
56735
56819
  return await updateSlackMessageRecord(outcome.id, {
56736
56820
  permalink,
@@ -56793,9 +56877,9 @@ async function processSlackRenderV2() {
56793
56877
  for (const task of tasks) {
56794
56878
  if ((await getSlackOutcomeMessage(task.id))?.finalizedAt)
56795
56879
  continue;
56796
- const isAskCandidate = taskNeedsAskOutcome(task, activatedAt) && isOutcomeStatus(task.status);
56880
+ const isDirectCandidate = taskNeedsDirectOutcome(task, activatedAt) && isOutcomeStatus(task.status);
56797
56881
  const isChildCandidate = delegationEnabled && delegationActivatedAt !== null && isChildCardCandidate(task, delegationActivatedAt) && !task.slackReplySent;
56798
- if (isAskCandidate || isChildCandidate) {
56882
+ if (isDirectCandidate || isChildCandidate) {
56799
56883
  needsOutcome = true;
56800
56884
  break;
56801
56885
  }
@@ -56869,9 +56953,12 @@ async function processSlackRenderV2() {
56869
56953
  continue;
56870
56954
  if (askId && await childCardCountFor(askId) >= CHILD_CARDS_PER_ASK)
56871
56955
  continue;
56956
+ if (!outcomeDeliveryGate(task.id))
56957
+ continue;
56872
56958
  try {
56873
56959
  const outcome = await streamOutcomeCard(task, tree, { buildContent: childOutcomeContent });
56874
56960
  if (outcome) {
56961
+ noteOutcomeDeliverySuccess(task.id);
56875
56962
  childCardsThisTick++;
56876
56963
  if (askId)
56877
56964
  childCardCounts.set(askId, (childCardCounts.get(askId) ?? 0) + 1);
@@ -56879,27 +56966,29 @@ async function processSlackRenderV2() {
56879
56966
  }
56880
56967
  outcomeCreated ||= !!outcome;
56881
56968
  } catch (error) {
56882
- console.error(`[Slack] Failed to stream child outcome for task ${task.id}:`, error);
56969
+ await noteOutcomeDeliveryFailure(task, error);
56883
56970
  }
56884
56971
  }
56885
56972
  for (const task of tasks) {
56886
56973
  if (!isSlackRenderV2Enabled())
56887
56974
  return;
56888
- if (task.source !== "slack")
56975
+ if (!taskNeedsDirectOutcome(task, activatedAt))
56889
56976
  continue;
56890
56977
  if ((await getSlackOutcomeMessage(task.id))?.finalizedAt)
56891
56978
  continue;
56892
- if (!isAskOutcomeStatus(task.status) || task.createdAt < activatedAt)
56893
- continue;
56894
- const deferByClosure = delegationEnabled && delegationActivatedAt !== null && task.createdAt >= delegationActivatedAt;
56979
+ const deferByClosure = task.source === "slack" && delegationEnabled && delegationActivatedAt !== null && task.createdAt >= delegationActivatedAt;
56895
56980
  if (!deferByClosure) {
56981
+ if (!outcomeDeliveryGate(task.id))
56982
+ continue;
56896
56983
  try {
56897
56984
  const outcome = await streamOutcomeCard(task, tree);
56898
- if (outcome)
56985
+ if (outcome) {
56986
+ noteOutcomeDeliverySuccess(task.id);
56899
56987
  await finalizeTerminalSlackReactions([task]);
56988
+ }
56900
56989
  outcomeCreated ||= !!outcome;
56901
56990
  } catch (error) {
56902
- console.error(`[Slack] Failed to stream outcome for task ${task.id}:`, error);
56991
+ await noteOutcomeDeliveryFailure(task, error);
56903
56992
  }
56904
56993
  continue;
56905
56994
  }
@@ -56921,12 +57010,15 @@ async function processSlackRenderV2() {
56921
57010
  const state = closureState(task, closure, new Date, settleSec, timeoutMin);
56922
57011
  if (state === "open")
56923
57012
  continue;
57013
+ if (!outcomeDeliveryGate(task.id))
57014
+ continue;
56924
57015
  try {
56925
57016
  const outcome = await streamOutcomeCard(task, tree, {
56926
57017
  buildContent: (_t, slackReplySent) => askConclusionContent(task, closure, state, slackReplySent),
56927
57018
  conclusionKind: state === "timedOut" ? "timeout" : "complete"
56928
57019
  });
56929
57020
  if (outcome) {
57021
+ noteOutcomeDeliverySuccess(task.id);
56930
57022
  const app3 = getSlackApp();
56931
57023
  if (app3 && task.slackChannelId && task.slackTriggerMessageTs) {
56932
57024
  const reaction = conclusionReactionChoice(state, task, closure);
@@ -56937,7 +57029,7 @@ async function processSlackRenderV2() {
56937
57029
  }
56938
57030
  outcomeCreated ||= !!outcome;
56939
57031
  } catch (error) {
56940
- console.error(`[Slack] Failed to stream ask conclusion for task ${task.id}:`, error);
57032
+ await noteOutcomeDeliveryFailure(task, error);
56941
57033
  }
56942
57034
  }
56943
57035
  try {
@@ -56956,6 +57048,7 @@ function _resetSlackRenderV2ForTests() {
56956
57048
  lastTreeUpdateAt.clear();
56957
57049
  treeUpdateTails.clear();
56958
57050
  cachedTeamId = undefined;
57051
+ outcomeDeliveryFailures.clear();
56959
57052
  }
56960
57053
 
56961
- export { initialize, ensure, require_dist7 as require_dist, isPollTracingEnabled, initOtel, withSpan, startSpan, withSpanContext, withRemoteContext, injectTraceContext, recordSessionCost, recordDbRetentionSweep, recordDbRetentionStatement, ackSlackMessage, getTaskLink, markdownToSlack, buildCancelledBlocks, buildBufferFlushBlocks, buildTreeBlocks, getAgentDisplayName, getAgentEmoji, isSlackRenderV2Enabled, isSlackDelegationEnabled, callSlackWithRetry, formatV2Duration, renderThreadTree, ensureSlackThreadTree, childOutcomeContent, streamOutcomeCard, processSlackRenderV2, _resetSlackRenderV2ForTests, registerTreeMessage, getSlackApp, initSlackApp, startSlackApp, stopSlackApp };
57054
+ export { initialize, ensure, isPollTracingEnabled, initOtel, withSpan, startSpan, withSpanContext, withRemoteContext, injectTraceContext, recordSessionCost, recordDbRetentionSweep, recordDbRetentionStatement, require_dist7 as require_dist, ackSlackMessage, getTaskLink, getTaskUrl, markdownToSlack, buildCancelledBlocks, buildBufferFlushBlocks, buildTreeBlocks, getAgentDisplayName, getAgentEmoji, isSlackRenderV2Enabled, isSlackDelegationEnabled, callSlackWithRetry, formatV2Duration, renderThreadTree, ensureSlackThreadTree, childOutcomeContent, streamOutcomeCard, processSlackRenderV2, _resetSlackRenderV2ForTests, registerTreeMessage, getSlackApp, initSlackApp, startSlackApp, stopSlackApp };
@@ -6,7 +6,7 @@ import {
6
6
  // src/utils/multi-runtime.ts
7
7
  init_env_flag();
8
8
  function isMultiRuntimeEnabled(env = process.env) {
9
- return parseEnvFlag(env.MULTI_RUNTIME_ENABLED, false);
9
+ return parseEnvFlag(env.MULTI_RUNTIME_ENABLED, true);
10
10
  }
11
11
  function swarmRuntimeInstanceId(env = process.env) {
12
12
  return env.SWARM_RUNTIME_INSTANCE_ID || undefined;