@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
@@ -6,16 +6,60 @@ import {
6
6
  ACP_TARGET_IDS
7
7
  } from "./cli-dgnj0zcc.js";
8
8
  import {
9
+ SIMILARITY_THRESHOLD,
10
+ writeSkillsToFilesystem
11
+ } from "./cli-pf9q3696.js";
12
+ import {
13
+ Anthropic
14
+ } from "./cli-j490egb5.js";
15
+ import {
16
+ isClaudeBridgeEffective,
17
+ resolveClaudeTransport
18
+ } from "./cli-eree7rnv.js";
19
+ import {
20
+ reasoningCapability
21
+ } from "./cli-4yc5d8fk.js";
22
+ import {
23
+ SCRIPT_SDK_TYPES,
24
+ SCRIPT_STDLIB_MODULE_TYPES,
25
+ ensureAgentFsCredentialsForAgent,
26
+ extractArgsJsonSchema,
27
+ extractScriptSignature,
28
+ getScriptAppTypes,
29
+ inviteEmailToSharedOrg,
30
+ scriptSdkTypesWithGeneratedApis,
31
+ scriptStdlibTypesWithGeneratedApis,
32
+ typecheckScript,
33
+ typecheckWithAmbient
34
+ } from "./cli-5jd2z7av.js";
35
+ import {
36
+ checkHeartbeatChecklist,
37
+ runHeartbeatSweep,
38
+ stopHeartbeat
39
+ } from "./cli-9004vfdf.js";
40
+ import {
41
+ AGENT_MAX_TASKS_CONFIG_KEY,
9
42
  ALL_CAPABILITIES,
10
43
  AssetKeyAuthorizationError,
11
44
  BODY_TOO_LARGE,
12
45
  DEFAULT_NEGOTIATED_PROTOCOL_VERSION,
13
46
  ExplicitSelfDuplicateError,
47
+ ExtensionConfigError,
48
+ ExtensionLifecycleError,
14
49
  JSONRPCMessageSchema,
50
+ MAX_TASK_ATTACHMENT_BYTES,
15
51
  McpServer,
52
+ RawLlmConfigSchema,
53
+ RawLlmOutputSchema,
54
+ Redacted,
16
55
  RoomOperationSchema,
17
- SIMILARITY_THRESHOLD,
56
+ SCRIPT_SDK_RESPONSE_LIMIT_BYTES,
57
+ SDK_ALLOWLIST,
18
58
  SUPPORTED_PROTOCOL_VERSIONS,
59
+ TaskCreationBlockedError,
60
+ TriggerSchemaError,
61
+ WebhookError,
62
+ activateVersion,
19
63
  agentWithCapacity,
20
64
  applyRating,
21
65
  applyRoomUpdate,
@@ -24,43 +68,61 @@ import {
24
68
  assertSelectOnlyQuery,
25
69
  authorizeAssetKeyWrite,
26
70
  authorizeRoomNamespace,
71
+ automationIntegrationFixUrl,
72
+ calculateNextRun,
27
73
  canClaim,
28
74
  canReadMemory,
29
75
  cancelTaskHandler,
30
76
  cancelTaskInputSchema,
31
77
  cancelTaskOutputSchema,
78
+ cancelWorkflowRun,
32
79
  changeRoom,
33
80
  checkOutputSchemaShape,
34
81
  clearJiraMetadata,
35
82
  closeRooms,
36
83
  createEvent,
37
84
  createEventsBatch,
85
+ createResumeFollowUp,
38
86
  createServer,
87
+ createTaskWithSiblingAwareness,
39
88
  createToolRegistrar,
89
+ createWorkerTaskFollowUp,
40
90
  decodeRoomSnapshot,
41
91
  dedupeMemoryDocumentIds,
92
+ deleteExtension,
42
93
  deleteJiraWebhook,
43
94
  deriveApiBaseUrl,
44
95
  describeRequestRoute,
96
+ disableExtension,
97
+ dispatchScheduleTarget,
45
98
  emitBudgetRefusalSideEffects,
99
+ enableExtension,
46
100
  enforceContentLengthCap,
47
101
  enqueueAdmissionRow,
48
102
  enqueueAuditRow,
103
+ executeRawLlm,
49
104
  executeReadOnlyQuery,
50
105
  expandCandidatesWithGraph,
51
106
  extractAndVerifyCookie,
107
+ findUserById,
108
+ fingerprintApiKey,
52
109
  flushAuditBuffer,
110
+ getAutomationSetupStates,
53
111
  getEnabledCapabilities,
54
112
  getEventCountsFiltered,
55
113
  getEventsFiltered,
114
+ getExecutorRegistry,
115
+ getExtensionById,
116
+ getExtensionByName,
117
+ getExtensionFiles,
56
118
  getJiraMetadata,
57
119
  getKapsoConfig,
58
120
  getKapsoNumberMapping,
59
121
  getLinksForMemory,
60
122
  getOAuthPreset,
61
- getParseErrorMessage,
62
123
  getPathSegments,
63
124
  getRoom,
125
+ getRuntimeInstanceById,
64
126
  getTaskDetailsHandler,
65
127
  getTaskDetailsInputSchema,
66
128
  getTaskDetailsOutputSchema,
@@ -68,6 +130,7 @@ import {
68
130
  getTasksInputSchema,
69
131
  getTasksOutputSchema,
70
132
  getUserCommsPrefs,
133
+ getUserIdentities,
71
134
  guardTerminalTaskResultWrite,
72
135
  handleAgentSessionEvent,
73
136
  handleAgentSessionPrompted,
@@ -82,12 +145,14 @@ import {
82
145
  handleIssueDelete,
83
146
  handleIssueUpdate,
84
147
  handleJiraWebhook,
148
+ handleMcpBridge,
85
149
  handleMergeRequest,
86
150
  handleMessageReceived,
87
151
  handleNote,
88
152
  handlePipeline,
89
153
  handlePullRequest,
90
154
  handlePullRequestReview,
155
+ handleWebhookTrigger,
91
156
  handleWorkflowRun,
92
157
  hasCapability,
93
158
  httpServerSemconvAttributes,
@@ -98,6 +163,8 @@ import {
98
163
  initGitLab,
99
164
  initJira,
100
165
  initLinear,
166
+ initWorkflows,
167
+ installExtension,
101
168
  isAgentMailEnabled,
102
169
  isGitHubEnabled,
103
170
  isGitLabEnabled,
@@ -113,43 +180,68 @@ import {
113
180
  issuePageSessionCookie,
114
181
  json,
115
182
  jsonError,
183
+ linkIdentity,
184
+ listEnabledAutomationPreflightInputs,
185
+ listExtensionRuns,
186
+ listExtensionVersions,
187
+ listExtensions,
116
188
  listOAuthPresetIds,
117
189
  listOAuthPresets,
190
+ listRuntimeInstancesForAgent,
191
+ listUserEvents,
192
+ listUserTokens,
193
+ loadEnabledExtensions,
118
194
  loadGlobalConfigsIntoEnv,
119
195
  markKapsoMessageRead,
120
196
  markKapsoMessageSeen,
121
- markScriptSdkRequestOrigin,
122
197
  mcpOverflowAuthError,
198
+ mcpToolNameForSdkMethod,
123
199
  mergeScheduleTiming,
124
- normalizeObjectSchema,
200
+ mintSessionToken,
201
+ mintToken,
125
202
  parseBody,
126
203
  parseCookieHeader,
127
204
  parseQueryParams,
128
205
  parseSkillContent,
129
206
  patchWorkflowDefinition,
207
+ preflightAutomation,
208
+ readScriptSdkJsonResponse,
209
+ reconcileAgentMaxTasksPolicy,
210
+ reconcileAgentStatusFromRuntimes,
211
+ recordIdentityEvent,
130
212
  recordMemoryAccesses,
131
213
  recordRetrievals,
214
+ recordTaskAttachmentUpload,
215
+ recordUnmappedIdentity,
132
216
  refreshLinks,
133
217
  registerJiraWebhook,
218
+ reloadExtension,
134
219
  reloadGlobalConfigsAndIntegrations,
135
220
  removeAwarenessStates,
136
221
  removeNamespaceRooms,
222
+ renderIdentity,
137
223
  reservedNamespaceError,
138
224
  reservedRoomKeyError,
225
+ resetAgentMaxTasksMirror,
139
226
  resetRoom,
140
227
  resolveHttpAuditUserId,
141
228
  resolveHttpFavoriteOwner,
142
229
  resolveHttpRequestAuth,
230
+ resolveIdentity,
143
231
  resolveRoomNamespace,
144
232
  resolveScopedResourceId,
145
233
  resolveScriptsOnlyMode,
146
234
  resolveTaskAuditUserId,
235
+ resolveUserByToken,
236
+ retryFailedRun,
237
+ revokeSessionToken,
238
+ revokeToken,
147
239
  roomRequestInfo,
148
240
  roomTopic,
149
241
  roomView,
150
242
  route,
151
243
  runtimeInstanceHeader,
152
- safeParseAsync,
244
+ runtimeStaleThresholdMinutes,
153
245
  safeRequestUrlForLog,
154
246
  scheduleIntegrationsReload,
155
247
  scopedResourceScopeIdSchema,
@@ -157,135 +249,70 @@ import {
157
249
  sendTaskHandler,
158
250
  sendTaskOutputSchema,
159
251
  setCorsHeaders,
252
+ setExtensionLoopbackBaseUrl,
253
+ setRuntimeCredentialReady,
160
254
  shouldPersistAutomaticTaskMemory,
255
+ snapshotAndUpdateWorkflow,
161
256
  snapshotMetric,
162
257
  snapshotPage,
163
258
  startAuditGc,
164
259
  startAuditWriter,
260
+ startWorkflowExecution,
165
261
  steerTaskHandler,
166
262
  steerTaskOutputSchema,
167
263
  steerTaskUserInputSchema,
168
264
  stopAuditGc,
169
265
  stopAuditWriter,
266
+ stopExtensionRuntime,
170
267
  sweepRooms,
171
268
  taskActionHandler,
172
269
  taskActionInputSchema,
173
270
  taskActionOutputSchema,
174
271
  toolErr,
272
+ touchRuntimeInstance,
175
273
  triggerSchemaErrorResponse,
274
+ unlinkIdentity,
275
+ updateExtensionMeta,
176
276
  updateJiraMetadata,
277
+ upsertRuntimeInstance,
278
+ upsertSwarmConfigWithPolicyMirror,
177
279
  userCtx,
280
+ validateJsonSchema,
178
281
  validateRecurringTiming,
179
282
  verifyAgentMailWebhook,
180
283
  verifyGitLabWebhook,
284
+ verifyHmacSignature,
181
285
  verifyWebhookSignature,
182
286
  warnIfCorsAllowsAnyOrigin,
183
- wireHttpSpanLifecycle,
184
- writeSkillsToFilesystem
185
- } from "./cli-cv7s5zdq.js";
287
+ wireHttpSpanLifecycle
288
+ } from "./cli-5tpgq60f.js";
186
289
  import"./cli-0z2v4nhw.js";
187
- import {
188
- Anthropic
189
- } from "./cli-j490egb5.js";
190
- import {
191
- isClaudeBridgeEffective,
192
- resolveClaudeTransport
193
- } from "./cli-eree7rnv.js";
194
290
  import {
195
291
  REFERENCES_SOURCE_MAX_LENGTH,
196
292
  sanitizeReferencesSource
197
- } from "./cli-xvkmedgn.js";
293
+ } from "./cli-4wppfkcm.js";
198
294
  import {
199
- reasoningCapability
200
- } from "./cli-4yc5d8fk.js";
295
+ deriveCodexKeySuffix,
296
+ getValidCodexOAuth,
297
+ loadAllCodexOAuthSlots
298
+ } from "./cli-e7d20cty.js";
201
299
  import {
202
- calculateNextRun,
203
- dispatchScheduleTarget
204
- } from "./cli-7fehefdf.js";
300
+ isMultiRuntimeEnabled
301
+ } from "./cli-re8z5p8p.js";
302
+ import"./cli-3dpj7atn.js";
205
303
  import {
206
304
  getModelsCatalog
207
- } from "./cli-7xx10h0a.js";
208
- import {
209
- normalizeModelKey
210
- } from "./cli-5m0qmvdp.js";
305
+ } from "./cli-g69fdc9g.js";
211
306
  import {
212
307
  getUserGrant
213
- } from "./cli-6skz3rk8.js";
308
+ } from "./cli-7tgcstn2.js";
214
309
  import {
215
310
  can,
216
311
  clearAuditSink,
217
312
  decideToolAdmission,
218
313
  isRbacEnabled,
219
314
  setAuditSink
220
- } from "./cli-cmp8g3sw.js";
221
- import {
222
- ensureAgentFsCredentialsForAgent,
223
- extractArgsJsonSchema,
224
- extractScriptSignature,
225
- getScriptAppTypes,
226
- inviteEmailToSharedOrg,
227
- scriptSdkTypesWithGeneratedApis,
228
- scriptStdlibTypesWithGeneratedApis,
229
- typecheckScript
230
- } from "./cli-4260r1tg.js";
231
- import {
232
- collectScriptReferences,
233
- getApp,
234
- listAppRecords
235
- } from "./cli-hzqmgcm2.js";
236
- import {
237
- require_dist
238
- } from "./cli-qgm2pfpq.js";
239
- import {
240
- checkHeartbeatChecklist,
241
- runHeartbeatSweep,
242
- stopHeartbeat
243
- } from "./cli-01g3x1ca.js";
244
- import {
245
- AGENT_MAX_TASKS_CONFIG_KEY,
246
- createResumeFollowUp,
247
- createWorkerTaskFollowUp,
248
- getRuntimeInstanceById,
249
- listRuntimeInstancesForAgent,
250
- reconcileAgentMaxTasksPolicy,
251
- reconcileAgentStatusFromRuntimes,
252
- resetAgentMaxTasksMirror,
253
- runtimeStaleThresholdMinutes,
254
- setRuntimeCredentialReady,
255
- touchRuntimeInstance,
256
- upsertRuntimeInstance,
257
- upsertSwarmConfigWithPolicyMirror
258
- } from "./cli-y3pq4v9g.js";
259
- import {
260
- isMultiRuntimeEnabled
261
- } from "./cli-07jd68a1.js";
262
- import {
263
- RawLlmConfigSchema,
264
- RawLlmOutputSchema,
265
- TriggerSchemaError,
266
- WebhookError,
267
- automationIntegrationFixUrl,
268
- cancelWorkflowRun,
269
- executeRawLlm,
270
- getAutomationSetupStates,
271
- getExecutorRegistry,
272
- handleWebhookTrigger,
273
- initWorkflows,
274
- listEnabledAutomationPreflightInputs,
275
- preflightAutomation,
276
- retryFailedRun,
277
- snapshotAndUpdateWorkflow,
278
- startWorkflowExecution,
279
- validateJsonSchema,
280
- verifyHmacSignature
281
- } from "./cli-ddfw1mc4.js";
282
- import"./cli-1ebpar1q.js";
283
- import {
284
- deriveCodexKeySuffix,
285
- getValidCodexOAuth,
286
- loadAllCodexOAuthSlots
287
- } from "./cli-e7d20cty.js";
288
- import"./cli-3dpj7atn.js";
315
+ } from "./cli-gbfwcd3k.js";
289
316
  import {
290
317
  ConnectionAuthInputSchema,
291
318
  MAX_SCRIPT_WALL_CLOCK_MS,
@@ -298,6 +325,8 @@ import {
298
325
  buildSandboxedCommand,
299
326
  buildScriptCredentialBindingsWithFailures,
300
327
  callMcpServerTool,
328
+ checkImportAllowlist,
329
+ collectScriptReferences,
301
330
  computeExpiresAt,
302
331
  connectionAuthInputFromFlat,
303
332
  connectionAuthSummary,
@@ -315,6 +344,7 @@ import {
315
344
  findReusableMcpOAuthClient,
316
345
  gcMcpOAuthPending,
317
346
  generateEdges,
347
+ getApp,
318
348
  getCredentialBindingById,
319
349
  getMcpOAuthToken,
320
350
  getOAuthBindingTokenStatus,
@@ -330,6 +360,7 @@ import {
330
360
  insertMcpOAuthPending,
331
361
  invalidateMcpOAuthClient,
332
362
  isInvalidClientError,
363
+ listAppRecords,
333
364
  listRelationalCredentialBindings,
334
365
  listScriptApisForScript,
335
366
  listScriptConnections,
@@ -346,6 +377,7 @@ import {
346
377
  refreshMcpToken,
347
378
  refreshScriptConnection,
348
379
  registerClient,
380
+ require_dist,
349
381
  require_typescript,
350
382
  resolveAdvertisedTokenEndpointAuthMethod,
351
383
  restoreScratchScriptLastUsedIfUnchanged,
@@ -363,19 +395,8 @@ import {
363
395
  upsertScriptByName,
364
396
  upsertScriptConnection,
365
397
  validateDefinition
366
- } from "./cli-svbrpf5q.js";
398
+ } from "./cli-sjaae6ff.js";
367
399
  import"./cli-epan13p1.js";
368
- import {
369
- searchScripts
370
- } from "./cli-3z634pqe.js";
371
- import {
372
- CANDIDATE_SET_MULTIPLIER,
373
- getEmbeddingProvider,
374
- getMemoryStore,
375
- init_constants as init_constants2,
376
- init_reranker,
377
- rerank
378
- } from "./cli-jezx9b9c.js";
379
400
  import {
380
401
  detachedProcessGroup,
381
402
  forceTerminateProcessGroup,
@@ -386,7 +407,7 @@ import {
386
407
  import {
387
408
  getApiKey
388
409
  } from "./cli-f14fvzag.js";
389
- import"./cli-zvz62chv.js";
410
+ import"./cli-fad8m16k.js";
390
411
  import {
391
412
  acquireOAuthRefreshLock,
392
413
  buildAuthorizationUrl,
@@ -410,41 +431,15 @@ import {
410
431
  updateAuthorizationIdentity,
411
432
  updateOAuthAppById,
412
433
  upsertAuthorization
413
- } from "./cli-cd60fv6j.js";
414
- import"./cli-fad8m16k.js";
415
- import"./cli-aehm1rbq.js";
416
- import"./cli-bsakbbkm.js";
417
- import"./cli-51tf7ac3.js";
418
- import {
419
- MAX_TASK_ATTACHMENT_BYTES,
420
- recordTaskAttachmentUpload
421
- } from "./cli-sdzq01t9.js";
422
- import {
423
- FilesError,
424
- getFileStorageProvider,
425
- normalizeFilesError
426
- } from "./cli-jsp14b6c.js";
434
+ } from "./cli-j9xczhaq.js";
427
435
  import {
428
- findUserById,
429
- fingerprintApiKey,
430
- getUserIdentities,
431
- linkIdentity,
432
- listUserEvents,
433
- listUserTokens,
434
- mintSessionToken,
435
- mintToken,
436
- recordIdentityEvent,
437
- recordUnmappedIdentity,
438
- renderIdentity,
439
- resolveIdentity,
440
- resolveUserByToken,
441
- revokeSessionToken,
442
- revokeToken,
443
- unlinkIdentity
444
- } from "./cli-j4d4f6hv.js";
436
+ normalizeModelKey
437
+ } from "./cli-0qb1z6s2.js";
438
+ import"./cli-bsakbbkm.js";
445
439
  import {
446
- createTaskWithSiblingAwareness
447
- } from "./cli-ayvy5kde.js";
440
+ searchScripts
441
+ } from "./cli-q88st9aj.js";
442
+ import"./cli-51tf7ac3.js";
448
443
  import {
449
444
  ensure,
450
445
  getSlackApp,
@@ -460,10 +455,25 @@ import {
460
455
  withRemoteContext,
461
456
  withSpan,
462
457
  withSpanContext
463
- } from "./cli-3sysyjve.js";
458
+ } from "./cli-r2q6pevn.js";
464
459
  import"./cli-q51yprfq.js";
465
- import"./cli-9d8ntetj.js";
466
460
  import"./cli-yatxqynm.js";
461
+ import {
462
+ CANDIDATE_SET_MULTIPLIER,
463
+ getEmbeddingProvider,
464
+ getMemoryStore,
465
+ init_constants as init_constants2,
466
+ init_reranker,
467
+ rerank
468
+ } from "./cli-ppm4975n.js";
469
+ import"./cli-fm4ytsdk.js";
470
+ import"./cli-aehm1rbq.js";
471
+ import"./cli-2658f6at.js";
472
+ import {
473
+ FilesError,
474
+ getFileStorageProvider,
475
+ normalizeFilesError
476
+ } from "./cli-jsp14b6c.js";
467
477
  import {
468
478
  ActiveSessionSchema,
469
479
  AgentAcpStatusSchema,
@@ -501,6 +511,11 @@ import {
501
511
  EventNameSchema,
502
512
  EventSourceSchema,
503
513
  EventStatusSchema,
514
+ ExtensionInstallBodySchema,
515
+ ExtensionManifestSchema,
516
+ ExtensionRunSchema,
517
+ ExtensionSchema,
518
+ ExtensionVersionSchema,
504
519
  FavoriteItemTypeSchema,
505
520
  HeartbeatExpiryError,
506
521
  InboxItemStateSchema,
@@ -752,6 +767,7 @@ import {
752
767
  incrementPageViewCount,
753
768
  initTelemetry,
754
769
  init_asset_key_audit,
770
+ init_bundle_path,
755
771
  init_context_key,
756
772
  init_credential_broker,
757
773
  init_date_utils,
@@ -770,6 +786,7 @@ import {
770
786
  installMcpServer,
771
787
  installSkill,
772
788
  isReservedConfigKey,
789
+ isSafeBundlePath,
773
790
  isSteeringEnabled as isSteeringEnabled2,
774
791
  isTerminalTaskStatus,
775
792
  listAgentsWithCredStatusByProvider,
@@ -865,12 +882,12 @@ import {
865
882
  upsertSwarmConfig,
866
883
  validateConfigValue,
867
884
  withFavoriteFlags
868
- } from "./cli-qgd4sqz5.js";
885
+ } from "./cli-s14agm5s.js";
869
886
  import {
870
887
  IDENTITY_FIELD_BUDGETS,
871
888
  IdentityFieldBudgetError,
872
889
  init_identity_field_budget
873
- } from "./cli-08b07b4r.js";
890
+ } from "./cli-ht5rs63n.js";
874
891
  import {
875
892
  getAllTemplateDefinitions,
876
893
  getTemplateDefinition,
@@ -881,7 +898,7 @@ import {
881
898
  interpolate,
882
899
  isSteeringEnabled,
883
900
  resolveTemplate
884
- } from "./cli-3apbzgyk.js";
901
+ } from "./cli-z61ykvam.js";
885
902
  import {
886
903
  MAX_PROFILE_FILE_LENGTH,
887
904
  getAppUrl,
@@ -889,7 +906,7 @@ import {
889
906
  getMcpBaseUrl,
890
907
  getPublicMcpBaseUrl,
891
908
  init_constants
892
- } from "./cli-e29gmdmw.js";
909
+ } from "./cli-dv6cdjs2.js";
893
910
  import"./cli-c2mk1kgf.js";
894
911
  import {
895
912
  init_env_flag,
@@ -911,7 +928,7 @@ import {
911
928
  import {
912
929
  init_package,
913
930
  package_default
914
- } from "./cli-e06a8a7y.js";
931
+ } from "./cli-zkxymas5.js";
915
932
  import {
916
933
  init_secret_scrubber,
917
934
  registerVolatileSecret,
@@ -933,21 +950,21 @@ import {
933
950
  } from "./cli-zf8jjwex.js";
934
951
  import {
935
952
  bedrockProviderModule
936
- } from "./cli-4xz3pmrq.js";
953
+ } from "./cli-y6x0gqtg.js";
937
954
  import"./cli-cg4vnyh4.js";
955
+ import"./cli-txgcknmy.js";
956
+ import"./cli-6map995v.js";
957
+ import"./cli-j8dggbcr.js";
958
+ import"./cli-y2apkfe2.js";
959
+ import"./cli-vapyk8sw.js";
960
+ import"./cli-pdz9qde4.js";
938
961
  import {
939
962
  setBedrockProviderModule
940
963
  } from "./cli-c4eeb5q2.js";
941
- import"./cli-pdz9qde4.js";
942
- import"./cli-txgcknmy.js";
943
- import"./cli-6map995v.js";
964
+ import"./cli-rgvp6r2x.js";
944
965
  import"./cli-btbzvq95.js";
945
966
  import"./cli-1m2e086m.js";
946
- import"./cli-j8dggbcr.js";
947
- import"./cli-rgvp6r2x.js";
948
967
  import"./cli-8wrympd7.js";
949
- import"./cli-y2apkfe2.js";
950
- import"./cli-vapyk8sw.js";
951
968
  import"./cli-bd957dgb.js";
952
969
  import"./cli-jyetr64j.js";
953
970
  import"./cli-w1d1bgkk.js";
@@ -2108,39 +2125,6 @@ import { createServer as createServer2 } from "node:net";
2108
2125
  import { join, resolve } from "node:path";
2109
2126
  import { fileURLToPath } from "node:url";
2110
2127
 
2111
- // src/scripts-runtime/response-limit.ts
2112
- var SCRIPT_SDK_RESPONSE_LIMIT_BYTES = 64 * 1024 * 1024;
2113
- function responseTooLarge(operation, limitBytes, observedBytes) {
2114
- return new Error(`Script SDK response for ${operation} exceeded the ${limitBytes}-byte hard limit ` + `(${observedBytes} bytes observed); narrow the query or paginate the request.`);
2115
- }
2116
- async function readScriptSdkJsonResponse(response, operation, limitBytes = SCRIPT_SDK_RESPONSE_LIMIT_BYTES) {
2117
- const contentLength = Number(response.headers.get("content-length"));
2118
- if (Number.isFinite(contentLength) && contentLength > limitBytes) {
2119
- await response.body?.cancel().catch(() => {});
2120
- throw responseTooLarge(operation, limitBytes, contentLength);
2121
- }
2122
- if (!response.body)
2123
- return {};
2124
- const reader = response.body.getReader();
2125
- const decoder = new TextDecoder;
2126
- const parts = [];
2127
- let receivedBytes = 0;
2128
- while (true) {
2129
- const { done, value } = await reader.read();
2130
- if (done)
2131
- break;
2132
- receivedBytes += value.byteLength;
2133
- if (receivedBytes > limitBytes) {
2134
- await reader.cancel().catch(() => {});
2135
- throw responseTooLarge(operation, limitBytes, receivedBytes);
2136
- }
2137
- parts.push(decoder.decode(value, { stream: true }));
2138
- }
2139
- parts.push(decoder.decode());
2140
- const text = parts.join("");
2141
- return text ? JSON.parse(text) : {};
2142
- }
2143
-
2144
2128
  // src/script-workflows/capability-bridge.ts
2145
2129
  var MAX_PENDING_CAPABILITY_CALLS = 64;
2146
2130
  function protocolError(kind, detail) {
@@ -2253,145 +2237,6 @@ function scriptRunMaxAgentTasks() {
2253
2237
  return positiveIntEnv("SCRIPT_RUN_MAX_AGENT_TASKS", DEFAULT_MAX_AGENT_TASKS);
2254
2238
  }
2255
2239
 
2256
- // src/scripts-runtime/sdk-allowlist.ts
2257
- var SDK_TOOL_NAME_MAP = {
2258
- memory_search: "memory-search",
2259
- memory_get: "memory-get",
2260
- memory_edit: "memory-edit",
2261
- memory_store: "memory-store",
2262
- memory_rate: "memory_rate",
2263
- memory_delete: "memory-delete",
2264
- inject_learning: "inject-learning",
2265
- task_list: "get-tasks",
2266
- task_get: "get-task-details",
2267
- task_storeProgress: "store-progress",
2268
- task_defer: "defer-task",
2269
- task_poll: "poll-task",
2270
- task_send: "send-task",
2271
- task_cancel: "cancel-task",
2272
- task_steer: "steer-task",
2273
- task_action: "task-action",
2274
- kv_get: "kv-get",
2275
- kv_getOrNull: "kv-get",
2276
- kv_set: "kv-set",
2277
- kv_delete: "kv-delete",
2278
- kv_del: "kv-delete",
2279
- kv_incr: "kv-incr",
2280
- kv_list: "kv-list",
2281
- room_get: "room-get",
2282
- room_change: "room-change",
2283
- room_reset: "room-reset",
2284
- room_decode: "room-decode",
2285
- repo_list: "get-repos",
2286
- repo_update: "update-repo",
2287
- schedule_list: "list-schedules",
2288
- schedule_create: "create-schedule",
2289
- schedule_update: "update-schedule",
2290
- schedule_patch: "patch-schedule",
2291
- schedule_delete: "delete-schedule",
2292
- schedule_runNow: "run-schedule-now",
2293
- script_search: "script-search",
2294
- script_run: "script-run",
2295
- script_upsert: "script-upsert",
2296
- script_delete: "script-delete",
2297
- script_queryTypes: "script-query-types",
2298
- script_launchRun: "launch-script-run",
2299
- script_getRun: "get-script-run",
2300
- script_listRuns: "list-script-runs",
2301
- swarm_get: "get-swarm",
2302
- agent_info: "my-agent-info",
2303
- agent_join: "join-swarm",
2304
- metrics_get: "get-metrics",
2305
- user_resolve: "resolve-user",
2306
- user_manage: "manage-user",
2307
- db_query: "db-query",
2308
- config_get: "get-config",
2309
- config_list: "list-config",
2310
- config_set: "set-config",
2311
- config_delete: "delete-config",
2312
- slack_read: "slack-read",
2313
- slack_listChannels: "slack-list-channels",
2314
- slack_post: "slack-post",
2315
- slack_reply: "slack-reply",
2316
- slack_startThread: "slack-start-thread",
2317
- slack_createChannel: "slack-create-channel",
2318
- slack_inviteToChannel: "slack-invite-to-channel",
2319
- slack_archiveChannel: "slack-archive-channel",
2320
- slack_uploadFile: "slack-upload-file",
2321
- slack_downloadFile: "slack-download-file",
2322
- slack_delete: "slack-delete",
2323
- slack_update: "slack-update",
2324
- message_read: "read-messages",
2325
- message_post: "post-message",
2326
- profile_update: "update-profile",
2327
- context_history: "context-history",
2328
- context_diff: "context-diff",
2329
- service_list: "list-services",
2330
- service_register: "register-service",
2331
- service_unregister: "unregister-service",
2332
- service_updateStatus: "update-service-status",
2333
- workflow_list: "list-workflows",
2334
- workflow_get: "get-workflow",
2335
- workflow_create: "create-workflow",
2336
- workflow_update: "update-workflow",
2337
- workflow_patch: "patch-workflow",
2338
- workflow_patchNode: "patch-workflow-node",
2339
- workflow_delete: "delete-workflow",
2340
- workflow_trigger: "trigger-workflow",
2341
- workflow_listRuns: "list-workflow-runs",
2342
- workflow_getRun: "get-workflow-run",
2343
- workflow_retryRun: "retry-workflow-run",
2344
- workflow_cancelRun: "cancel-workflow-run",
2345
- prompt_list: "list-prompt-templates",
2346
- prompt_get: "get-prompt-template",
2347
- prompt_set: "set-prompt-template",
2348
- prompt_delete: "delete-prompt-template",
2349
- prompt_preview: "preview-prompt-template",
2350
- tracker_status: "tracker-status",
2351
- tracker_syncStatus: "tracker-sync-status",
2352
- tracker_linkTask: "tracker-link-task",
2353
- tracker_unlink: "tracker-unlink",
2354
- tracker_mapAgent: "tracker-map-agent",
2355
- skill_list: "skill-list",
2356
- skill_get: "skill-get",
2357
- skill_getFile: "skill-get-file",
2358
- skill_search: "skill-search",
2359
- skill_create: "skill-create",
2360
- skill_update: "skill-update",
2361
- skill_delete: "skill-delete",
2362
- skill_install: "skill-install",
2363
- skill_uninstall: "skill-uninstall",
2364
- skill_publish: "skill-publish",
2365
- mcpServer_list: "mcp-server-list",
2366
- mcpServer_get: "mcp-server-get",
2367
- mcpServer_create: "mcp-server-create",
2368
- mcpServer_update: "mcp-server-update",
2369
- mcpServer_delete: "mcp-server-delete",
2370
- mcpServer_install: "mcp-server-install",
2371
- mcpServer_uninstall: "mcp-server-uninstall",
2372
- app_get: "app-get",
2373
- app_history: "app-history",
2374
- app_diff: "app-diff",
2375
- app_list: "app-list",
2376
- app_patch: "app-patch",
2377
- app_query: "app-query",
2378
- app_rollback: "app-rollback",
2379
- app_sync: "app-sync",
2380
- app_upsert: "app-upsert",
2381
- page_create: "create_page",
2382
- page_delete: "delete-page",
2383
- metric_create: "create_metric",
2384
- request_humanInput: "request-human-input"
2385
- };
2386
- var SDK_ALLOWLIST = Object.keys(SDK_TOOL_NAME_MAP);
2387
- var MCP_TOOL_NAMES = new Set(Object.values(SDK_TOOL_NAME_MAP));
2388
- function isMcpToolAllowedForScripts(mcpToolName) {
2389
- return MCP_TOOL_NAMES.has(mcpToolName);
2390
- }
2391
- function mcpToolNameForSdkMethod(name) {
2392
- return SDK_TOOL_NAME_MAP[name] ?? name;
2393
- }
2394
-
2395
2240
  // src/script-workflows/swarm-capabilities.ts
2396
2241
  var WORKFLOW_SWARM_CAPABILITY_ALLOWLIST = [...SDK_ALLOWLIST];
2397
2242
  var WORKFLOW_SWARM_CAPABILITIES = new Set(WORKFLOW_SWARM_CAPABILITY_ALLOWLIST);
@@ -2399,42 +2244,6 @@ function isWorkflowSwarmCapabilityAllowed(method) {
2399
2244
  return WORKFLOW_SWARM_CAPABILITIES.has(method);
2400
2245
  }
2401
2246
 
2402
- // src/scripts-runtime/redacted.ts
2403
- var registry = new WeakMap;
2404
- var proto = {
2405
- toString() {
2406
- return "<redacted>";
2407
- },
2408
- toJSON() {
2409
- return "<redacted>";
2410
- },
2411
- [Symbol.for("nodejs.util.inspect.custom")]() {
2412
- return "<redacted>";
2413
- }
2414
- };
2415
- function getEntry(self) {
2416
- const entry = registry.get(self);
2417
- if (!entry)
2418
- throw new Error("Redacted value was not in registry");
2419
- return entry;
2420
- }
2421
- var Redacted = {
2422
- make(value, meta = { type: "user", isSecret: false }) {
2423
- const redacted = Object.create(proto);
2424
- registry.set(redacted, { value, meta });
2425
- return redacted;
2426
- },
2427
- value(self) {
2428
- return getEntry(self).value;
2429
- },
2430
- meta(self) {
2431
- return getEntry(self).meta;
2432
- },
2433
- isSecret(self) {
2434
- return Redacted.meta(self).isSecret;
2435
- }
2436
- };
2437
-
2438
2247
  // src/scripts-runtime/stdlib/fetch.ts
2439
2248
  async function runtimeFetch(input, options = {}) {
2440
2249
  const { retries = 3, timeoutMs = 30000, signal, ...init } = options;
@@ -3708,7 +3517,7 @@ var listAgentRuntimeInstances = route({
3708
3517
  path: "/api/agents/{id}/runtime-instances",
3709
3518
  pattern: ["api", "agents", null, "runtime-instances"],
3710
3519
  summary: "List runtime instances serving an agent",
3711
- description: "Read-only view of the worker processes currently registered for a logical agent. Rows exist only for multi-runtime registrations (MULTI_RUNTIME_ENABLED), so the list is empty in the default configuration. `isLive` combines `status` with `lastSeenAt` freshness against the server's staleness cutoff (`staleThresholdMinutes`); `reportedSlots` is each process's self-reported capacity, distinct from the agent's logical `maxTasks` policy.",
3520
+ description: "Read-only view of the worker processes currently registered for a logical agent. Rows exist only for multi-runtime registrations (MULTI_RUNTIME_ENABLED), so the list is empty when the flag is disabled. `isLive` combines `status` with `lastSeenAt` freshness against the server's staleness cutoff (`staleThresholdMinutes`); `reportedSlots` is each process's self-reported capacity, distinct from the agent's logical `maxTasks` policy.",
3712
3521
  tags: ["Agents"],
3713
3522
  params: exports_external.object({ id: exports_external.string() }),
3714
3523
  responses: {
@@ -5079,6 +4888,7 @@ async function handleApprovalRequests(req, res, pathSegments, queryParams) {
5079
4888
  await createTaskExtended(taskText, {
5080
4889
  agentId: sourceTask.agentId,
5081
4890
  routingReason: sourceTask.agentId ? "continuity" : undefined,
4891
+ routingSource: sourceTask.agentId ? "engine_default" : undefined,
5082
4892
  parentTaskId: updated.sourceTaskId,
5083
4893
  source: "system",
5084
4894
  taskType: "hitl-follow-up",
@@ -5940,7 +5750,8 @@ async function handleConfig(req, res, pathSegments, queryParams) {
5940
5750
  }
5941
5751
  const presence = {};
5942
5752
  for (const key of keys) {
5943
- presence[key] = process.env[key] !== undefined && process.env[key] !== "";
5753
+ const value = key === "SWARM_ORG_NAME" ? process.env[key]?.trim() : process.env[key];
5754
+ presence[key] = value !== undefined && value !== "";
5944
5755
  }
5945
5756
  envPresence.respond(res, 200, { presence });
5946
5757
  return true;
@@ -6317,94 +6128,1210 @@ var getEventsRoute = route({
6317
6128
  schema: exports_external.object({ events: exports_external.array(SwarmEventSchema) })
6318
6129
  }
6319
6130
  },
6320
- auth: { apiKey: true }
6131
+ auth: { apiKey: true }
6132
+ });
6133
+ var getEventCountsRoute = route({
6134
+ method: "get",
6135
+ path: "/api/events/counts",
6136
+ pattern: ["api", "events", "counts"],
6137
+ summary: "Get event counts grouped by event name",
6138
+ tags: ["Events"],
6139
+ query: exports_external.object({
6140
+ category: EventCategorySchema.optional(),
6141
+ source: EventSourceSchema.optional(),
6142
+ agentId: exports_external.string().optional(),
6143
+ taskId: exports_external.string().optional(),
6144
+ sessionId: exports_external.string().optional(),
6145
+ since: exports_external.string().optional(),
6146
+ until: exports_external.string().optional()
6147
+ }),
6148
+ responses: {
6149
+ 200: {
6150
+ description: "Event counts",
6151
+ schema: exports_external.object({
6152
+ counts: exports_external.array(exports_external.object({ event: exports_external.string(), count: exports_external.number().int() }))
6153
+ })
6154
+ }
6155
+ },
6156
+ auth: { apiKey: true }
6157
+ });
6158
+ async function handleEvents(req, res, pathSegments, queryParams, _myAgentId) {
6159
+ if (createEventsBatchRoute.match(req.method, pathSegments)) {
6160
+ const parsed = await createEventsBatchRoute.parse(req, res, pathSegments, queryParams);
6161
+ if (!parsed)
6162
+ return true;
6163
+ try {
6164
+ const count = await createEventsBatch(parsed.body.events);
6165
+ createEventsBatchRoute.respond(res, 201, { success: true, count });
6166
+ } catch (error) {
6167
+ console.error("[HTTP] Failed to create events batch:", error);
6168
+ jsonError(res, "Failed to store events batch", 500);
6169
+ }
6170
+ return true;
6171
+ }
6172
+ if (getEventCountsRoute.match(req.method, pathSegments)) {
6173
+ const parsed = await getEventCountsRoute.parse(req, res, pathSegments, queryParams);
6174
+ if (!parsed)
6175
+ return true;
6176
+ const counts = await getEventCountsFiltered({
6177
+ category: parsed.query.category || undefined,
6178
+ source: parsed.query.source || undefined,
6179
+ agentId: parsed.query.agentId || undefined,
6180
+ taskId: parsed.query.taskId || undefined,
6181
+ sessionId: parsed.query.sessionId || undefined,
6182
+ since: parsed.query.since || undefined,
6183
+ until: parsed.query.until || undefined
6184
+ });
6185
+ getEventCountsRoute.respond(res, 200, { counts });
6186
+ return true;
6187
+ }
6188
+ if (createEventRoute.match(req.method, pathSegments)) {
6189
+ const parsed = await createEventRoute.parse(req, res, pathSegments, queryParams);
6190
+ if (!parsed)
6191
+ return true;
6192
+ try {
6193
+ const event = await createEvent(parsed.body);
6194
+ createEventRoute.respond(res, 201, { success: true, event });
6195
+ } catch (error) {
6196
+ console.error("[HTTP] Failed to create event:", error);
6197
+ jsonError(res, "Failed to store event", 500);
6198
+ }
6199
+ return true;
6200
+ }
6201
+ if (getEventsRoute.match(req.method, pathSegments)) {
6202
+ const parsed = await getEventsRoute.parse(req, res, pathSegments, queryParams);
6203
+ if (!parsed)
6204
+ return true;
6205
+ const events = await getEventsFiltered({
6206
+ category: parsed.query.category || undefined,
6207
+ event: parsed.query.event || undefined,
6208
+ status: parsed.query.status || undefined,
6209
+ source: parsed.query.source || undefined,
6210
+ agentId: parsed.query.agentId || undefined,
6211
+ taskId: parsed.query.taskId || undefined,
6212
+ sessionId: parsed.query.sessionId || undefined,
6213
+ dataField: parsed.query.dataField || undefined,
6214
+ since: parsed.query.since || undefined,
6215
+ until: parsed.query.until || undefined,
6216
+ limit: parsed.query.limit ?? 100
6217
+ });
6218
+ getEventsRoute.respond(res, 200, { events });
6219
+ return true;
6220
+ }
6221
+ return false;
6222
+ }
6223
+
6224
+ // src/http/extensions.ts
6225
+ init_zod();
6226
+ init_db();
6227
+
6228
+ // src/be/extensions/validate.ts
6229
+ init_bundle_path();
6230
+
6231
+ // src/extensions/contract-types.generated.ts
6232
+ var EXTENSION_TYPE_DEFINITIONS = `// biome-ignore-all lint/suspicious/noConfusingVoidType: Extension handlers may explicitly return no result.
6233
+ declare module "swarm-extension" {
6234
+ export type CreateTaskOptions = {
6235
+ key?: string | undefined;
6236
+ agentId?: string | null | undefined;
6237
+ creatorAgentId?: string | undefined;
6238
+ source?:
6239
+ | "workflow"
6240
+ | "schedule"
6241
+ | "slack"
6242
+ | "agentmail"
6243
+ | "mcp"
6244
+ | "api"
6245
+ | "ui"
6246
+ | "github"
6247
+ | "gitlab"
6248
+ | "system"
6249
+ | "linear"
6250
+ | "jira"
6251
+ | undefined;
6252
+ routingReason?:
6253
+ | "skill"
6254
+ | "continuity"
6255
+ | "overflow"
6256
+ | "human_pinned"
6257
+ | "reroute_fault"
6258
+ | undefined;
6259
+ routingSource?: "declared" | "engine_default" | undefined;
6260
+ routingNote?: string | undefined;
6261
+ taskType?: string | undefined;
6262
+ tags?: string[] | undefined;
6263
+ priority?: number | undefined;
6264
+ dependsOn?: string[] | undefined;
6265
+ offeredTo?: string | undefined;
6266
+ status?: "draft" | "backlog" | "unassigned" | undefined;
6267
+ slackChannelId?: string | undefined;
6268
+ slackThreadTs?: string | undefined;
6269
+ slackTriggerMessageTs?: string | undefined;
6270
+ slackUserId?: string | undefined;
6271
+ overrideSlackContext?: boolean | undefined;
6272
+ vcsProvider?: "github" | "gitlab" | undefined;
6273
+ vcsRepo?: string | undefined;
6274
+ vcsEventType?: string | undefined;
6275
+ vcsNumber?: number | undefined;
6276
+ vcsCommentId?: number | undefined;
6277
+ vcsAuthor?: string | undefined;
6278
+ vcsUrl?: string | undefined;
6279
+ vcsInstallationId?: number | undefined;
6280
+ vcsNodeId?: string | undefined;
6281
+ agentmailInboxId?: string | undefined;
6282
+ agentmailMessageId?: string | undefined;
6283
+ agentmailThreadId?: string | undefined;
6284
+ mentionMessageId?: string | undefined;
6285
+ mentionChannelId?: string | undefined;
6286
+ dir?: string | undefined;
6287
+ parentTaskId?: string | undefined;
6288
+ model?: string | undefined;
6289
+ modelTier?: "smol" | "regular" | "smart" | "ultra" | undefined;
6290
+ effort?: "off" | "low" | "medium" | "high" | "xhigh" | "max" | undefined;
6291
+ scheduleId?: string | undefined;
6292
+ workflowRunId?: string | undefined;
6293
+ workflowRunStepId?: string | undefined;
6294
+ sourceTaskId?: string | undefined;
6295
+ outputSchema?: Record<string, unknown> | undefined;
6296
+ inheritParentOutputSchema?: boolean | undefined;
6297
+ inheritParentRoutingAffinity?: boolean | undefined;
6298
+ followUpConfig?:
6299
+ | {
6300
+ disabled?: boolean | undefined;
6301
+ onCompleted?: string | undefined;
6302
+ onFailed?: string | undefined;
6303
+ }
6304
+ | undefined;
6305
+ requestedByUserId?: string | undefined;
6306
+ contextKey?: string | undefined;
6307
+ bypassTrackerContextDedup?: boolean | undefined;
6308
+ routingAffinity?:
6309
+ | {
6310
+ capabilities: string[];
6311
+ sourceAgentId?: string | undefined;
6312
+ role?: string | undefined;
6313
+ harnessProvider?:
6314
+ | "claude"
6315
+ | "codex"
6316
+ | "pi"
6317
+ | "devin"
6318
+ | "claude-managed"
6319
+ | "opencode"
6320
+ | "acp"
6321
+ | undefined;
6322
+ leadOnly?: boolean | undefined;
6323
+ }
6324
+ | undefined;
6325
+ };
6326
+
6327
+ export type AgentTask = {
6328
+ id: string;
6329
+ key: string;
6330
+ agentId: string | null;
6331
+ task: string;
6332
+ status:
6333
+ | "draft"
6334
+ | "backlog"
6335
+ | "unassigned"
6336
+ | "offered"
6337
+ | "reviewing"
6338
+ | "pending"
6339
+ | "in_progress"
6340
+ | "paused"
6341
+ | "completed"
6342
+ | "failed"
6343
+ | "cancelled"
6344
+ | "superseded";
6345
+ source:
6346
+ | "workflow"
6347
+ | "schedule"
6348
+ | "slack"
6349
+ | "agentmail"
6350
+ | "mcp"
6351
+ | "api"
6352
+ | "ui"
6353
+ | "github"
6354
+ | "gitlab"
6355
+ | "system"
6356
+ | "linear"
6357
+ | "jira";
6358
+ tags: string[];
6359
+ priority: number;
6360
+ dependsOn: string[];
6361
+ createdAt: string;
6362
+ lastUpdatedAt: string;
6363
+ slackReplySent: boolean;
6364
+ wasPaused: boolean;
6365
+ creatorAgentId?: string | undefined;
6366
+ title?: string | undefined;
6367
+ routingReason?:
6368
+ | "skill"
6369
+ | "continuity"
6370
+ | "overflow"
6371
+ | "human_pinned"
6372
+ | "reroute_fault"
6373
+ | undefined;
6374
+ routingSource?: "declared" | "engine_default" | undefined;
6375
+ routingNote?: string | undefined;
6376
+ taskType?: string | undefined;
6377
+ offeredTo?: string | undefined;
6378
+ offeredAt?: string | undefined;
6379
+ acceptedAt?: string | undefined;
6380
+ rejectionReason?: string | undefined;
6381
+ finishedAt?: string | undefined;
6382
+ notifiedAt?: string | undefined;
6383
+ failureReason?: string | undefined;
6384
+ output?: string | undefined;
6385
+ progress?: string | undefined;
6386
+ slackChannelId?: string | undefined;
6387
+ slackThreadTs?: string | undefined;
6388
+ slackTriggerMessageTs?: string | undefined;
6389
+ slackUserId?: string | undefined;
6390
+ slackProgressMessageTs?: string | undefined;
6391
+ slackTreeRootMessageTs?: string | undefined;
6392
+ vcsProvider?: "github" | "gitlab" | undefined;
6393
+ vcsRepo?: string | undefined;
6394
+ vcsEventType?: string | undefined;
6395
+ vcsNumber?: number | undefined;
6396
+ vcsCommentId?: number | undefined;
6397
+ vcsAuthor?: string | undefined;
6398
+ vcsUrl?: string | undefined;
6399
+ vcsInstallationId?: number | undefined;
6400
+ vcsNodeId?: string | undefined;
6401
+ agentmailInboxId?: string | undefined;
6402
+ agentmailMessageId?: string | undefined;
6403
+ agentmailThreadId?: string | undefined;
6404
+ mentionMessageId?: string | undefined;
6405
+ mentionChannelId?: string | undefined;
6406
+ dir?: string | undefined;
6407
+ parentTaskId?: string | undefined;
6408
+ claudeSessionId?: string | undefined;
6409
+ model?: string | undefined;
6410
+ modelTier?: "smol" | "regular" | "smart" | "ultra" | undefined;
6411
+ effort?: "off" | "low" | "medium" | "high" | "xhigh" | "max" | undefined;
6412
+ scheduleId?: string | undefined;
6413
+ workflowRunId?: string | null | undefined;
6414
+ workflowRunStepId?: string | null | undefined;
6415
+ contextKey?: string | undefined;
6416
+ outputSchema?: Record<string, unknown> | undefined;
6417
+ followUpConfig?:
6418
+ | {
6419
+ disabled?: boolean | undefined;
6420
+ onCompleted?: string | undefined;
6421
+ onFailed?: string | undefined;
6422
+ }
6423
+ | undefined;
6424
+ compactionCount?: number | undefined;
6425
+ peakContextPercent?: number | undefined;
6426
+ peakContextTokens?: number | undefined;
6427
+ contextWindowSize?: number | undefined;
6428
+ credentialKeySuffix?: string | undefined;
6429
+ credentialKeyType?: string | undefined;
6430
+ requestedByUserId?: string | undefined;
6431
+ swarmVersion?: string | undefined;
6432
+ provider?:
6433
+ | "claude"
6434
+ | "codex"
6435
+ | "pi"
6436
+ | "devin"
6437
+ | "claude-managed"
6438
+ | "opencode"
6439
+ | "acp"
6440
+ | undefined;
6441
+ providerMeta?: Record<string, unknown> | undefined;
6442
+ harnessVariant?: string | undefined;
6443
+ harnessVariantMeta?: Record<string, unknown> | undefined;
6444
+ totalCostUsd?: number | undefined;
6445
+ routingAffinity?:
6446
+ | {
6447
+ capabilities: string[];
6448
+ sourceAgentId?: string | undefined;
6449
+ role?: string | undefined;
6450
+ harnessProvider?:
6451
+ | "claude"
6452
+ | "codex"
6453
+ | "pi"
6454
+ | "devin"
6455
+ | "claude-managed"
6456
+ | "opencode"
6457
+ | "acp"
6458
+ | undefined;
6459
+ leadOnly?: boolean | undefined;
6460
+ }
6461
+ | undefined;
6462
+ routingAffinityInvalid?: boolean | undefined;
6463
+ };
6464
+
6465
+ export type ActiveSession = {
6466
+ id: string;
6467
+ agentId: string;
6468
+ taskId: string | null;
6469
+ triggerType: string;
6470
+ inboxMessageId: string | null;
6471
+ taskDescription: string | null;
6472
+ runnerSessionId: string | null;
6473
+ providerSessionId: string | null;
6474
+ startedAt: string;
6475
+ lastHeartbeatAt: string;
6476
+ runtimeInstanceId?: string | null | undefined;
6477
+ };
6478
+
6479
+ export type RequestInfo = {
6480
+ sessionId: string | undefined;
6481
+ agentId: string | undefined;
6482
+ runtimeInstanceId: string | undefined;
6483
+ sourceTaskId: string | undefined;
6484
+ contextKey: string | undefined;
6485
+ callOrigin: "mcp" | "extension" | "script-sdk";
6486
+ };
6487
+
6488
+ import type { SwarmSdk } from "swarm-sdk";
6489
+ import type { z } from "zod";
6490
+ export type Runtime = "api" | "worker";
6491
+ export interface ExtensionManifest {
6492
+ name: string;
6493
+ description: string;
6494
+ version: string;
6495
+ runtime: Runtime;
6496
+ assets: {
6497
+ hooks: string;
6498
+ skills?: string[];
6499
+ workflows?: string[];
6500
+ schedules?: string[];
6501
+ };
6502
+ homepage?: string;
6503
+ author?: string;
6504
+ }
6505
+ export interface HooksModule {
6506
+ default: SwarmExtension;
6507
+ config?: z.ZodTypeAny;
6508
+ }
6509
+ export interface ExtensionState {
6510
+ get<T = unknown>(key: string): Promise<T | null>;
6511
+ set<T>(key: string, value: T): Promise<void>;
6512
+ incr(key: string, by?: number): Promise<number>;
6513
+ del(key: string): Promise<void>;
6514
+ }
6515
+ export interface ExtensionLogger {
6516
+ debug(message: string, data?: unknown): void;
6517
+ info(message: string, data?: unknown): void;
6518
+ warn(message: string, data?: unknown): void;
6519
+ error(message: string, data?: unknown): void;
6520
+ }
6521
+ type ConfigFor<M extends ExtensionManifest> = M extends {
6522
+ config: infer C extends z.ZodTypeAny;
6523
+ }
6524
+ ? z.infer<C>
6525
+ : Record<string, unknown>;
6526
+ export interface ApiCtx<Config = Record<string, unknown>> {
6527
+ swarm: SwarmSdk;
6528
+ state: ExtensionState;
6529
+ config: Config;
6530
+ log: ExtensionLogger;
6531
+ signal: AbortSignal;
6532
+ event: {
6533
+ name: keyof SwarmEventMap;
6534
+ at: string;
6535
+ extension: {
6536
+ id: string;
6537
+ version: number;
6538
+ };
6539
+ };
6540
+ }
6541
+ export interface WorkerCtx<Config = Record<string, unknown>>
6542
+ extends Omit<ApiCtx<Config>, "swarm"> {
6543
+ swarm: SwarmSdk;
6544
+ worker: {
6545
+ agentId: string;
6546
+ taskId: string;
6547
+ harness: string;
6548
+ };
6549
+ }
6550
+ export type CtxFor<M extends ExtensionManifest> = M["runtime"] extends "api"
6551
+ ? ApiCtx<ConfigFor<M>>
6552
+ : WorkerCtx<ConfigFor<M>>;
6553
+ export type PreResult<Modify> =
6554
+ | void
6555
+ | {
6556
+ action: "continue";
6557
+ }
6558
+ | {
6559
+ action: "modify";
6560
+ data: Modify;
6561
+ }
6562
+ | {
6563
+ action: "block";
6564
+ reason: string;
6565
+ };
6566
+ export type TaskCreateOrigin =
6567
+ | "rest"
6568
+ | "app"
6569
+ | "mcp"
6570
+ | "slack"
6571
+ | "schedule"
6572
+ | "workflow"
6573
+ | "webhook"
6574
+ | "followUp"
6575
+ | \`extension:\${string}\`;
6576
+ export interface TaskCreateEvent {
6577
+ options: CreateTaskOptions;
6578
+ description: string;
6579
+ origin: TaskCreateOrigin;
6580
+ requestInfo?: RequestInfo;
6581
+ }
6582
+ export type TaskCreateModify = Partial<
6583
+ Pick<
6584
+ CreateTaskOptions,
6585
+ | "agentId"
6586
+ | "creatorAgentId"
6587
+ | "source"
6588
+ | "taskType"
6589
+ | "tags"
6590
+ | "priority"
6591
+ | "dependsOn"
6592
+ | "offeredTo"
6593
+ | "vcsProvider"
6594
+ | "vcsRepo"
6595
+ | "vcsEventType"
6596
+ | "vcsNumber"
6597
+ | "vcsCommentId"
6598
+ | "vcsAuthor"
6599
+ | "vcsUrl"
6600
+ | "vcsInstallationId"
6601
+ | "vcsNodeId"
6602
+ | "agentmailInboxId"
6603
+ | "agentmailMessageId"
6604
+ | "agentmailThreadId"
6605
+ | "mentionMessageId"
6606
+ | "mentionChannelId"
6607
+ | "dir"
6608
+ | "model"
6609
+ | "modelTier"
6610
+ | "effort"
6611
+ | "outputSchema"
6612
+ | "followUpConfig"
6613
+ | "bypassTrackerContextDedup"
6614
+ >
6615
+ > & {
6616
+ description?: string;
6617
+ };
6618
+ export interface TaskFollowUpEvent {
6619
+ completedTask: AgentTask;
6620
+ status: "completed" | "failed";
6621
+ output?: string;
6622
+ failureReason?: string;
6623
+ workerAgentId: string;
6624
+ leadAgentId: string;
6625
+ summary: string;
6626
+ }
6627
+ export type TaskFollowUpModify = Partial<
6628
+ Pick<CreateTaskOptions, "agentId" | "priority" | "followUpConfig">
6629
+ > & {
6630
+ description?: string;
6631
+ };
6632
+ export interface SlackRouteEvent {
6633
+ channelId: string;
6634
+ userId: string;
6635
+ text: string;
6636
+ threadTs?: string;
6637
+ botMentioned: boolean;
6638
+ threadContext?: {
6639
+ channelId: string;
6640
+ threadTs: string;
6641
+ };
6642
+ }
6643
+ export interface SlackRouteModify {
6644
+ target:
6645
+ | {
6646
+ kind: "agent";
6647
+ agentId: string;
6648
+ }
6649
+ | {
6650
+ kind: "lead";
6651
+ }
6652
+ | {
6653
+ kind: "broadcast";
6654
+ };
6655
+ }
6656
+ export type HeartbeatClassification = "no-session" | "stale-session" | "fresh-stalled";
6657
+ export type HeartbeatAction = "supersede-resume" | "fail" | "record";
6658
+ export interface HeartbeatRemediateEvent {
6659
+ task: AgentTask;
6660
+ session?: ActiveSession;
6661
+ classification: HeartbeatClassification;
6662
+ proposedAction: HeartbeatAction;
6663
+ reason: string;
6664
+ taskAgeMs: number;
6665
+ sessionHeartbeatAgeMs?: number;
6666
+ }
6667
+ export interface HeartbeatRemediateModify {
6668
+ proposedAction: HeartbeatAction;
6669
+ }
6670
+ export interface ToolCallEvent {
6671
+ tool: string;
6672
+ args: unknown;
6673
+ requestInfo: RequestInfo;
6674
+ }
6675
+ export interface ToolCallModify {
6676
+ args: unknown;
6677
+ }
6678
+ export interface TaskEvent {
6679
+ task: AgentTask;
6680
+ }
6681
+ export interface TaskCompletedEvent extends TaskEvent {
6682
+ output: string;
6683
+ }
6684
+ export interface TaskFailedEvent extends TaskEvent {
6685
+ failureReason: string;
6686
+ }
6687
+ export interface TaskSupersededEvent extends TaskEvent {
6688
+ supersededBy: string;
6689
+ }
6690
+ export interface TaskProgressEvent extends TaskEvent {
6691
+ progress: string;
6692
+ }
6693
+ export interface SlackMessageEvent {
6694
+ channelId: string;
6695
+ userId: string;
6696
+ text: string;
6697
+ threadTs?: string;
6698
+ taskId?: string;
6699
+ }
6700
+ export interface ToolCallCompletedEvent extends ToolCallEvent {
6701
+ result: unknown;
6702
+ durationMs: number;
6703
+ }
6704
+ export interface SwarmEventMap {
6705
+ "pre.task.create": {
6706
+ event: TaskCreateEvent;
6707
+ modify: TaskCreateModify;
6708
+ result: PreResult<TaskCreateModify>;
6709
+ };
6710
+ "pre.task.followUp": {
6711
+ event: TaskFollowUpEvent;
6712
+ modify: TaskFollowUpModify;
6713
+ result: PreResult<TaskFollowUpModify>;
6714
+ };
6715
+ "pre.slack.route": {
6716
+ event: SlackRouteEvent;
6717
+ modify: SlackRouteModify;
6718
+ result: PreResult<SlackRouteModify>;
6719
+ };
6720
+ "pre.heartbeat.remediate": {
6721
+ event: HeartbeatRemediateEvent;
6722
+ modify: HeartbeatRemediateModify;
6723
+ result: PreResult<HeartbeatRemediateModify>;
6724
+ };
6725
+ "pre.tool.call": {
6726
+ event: ToolCallEvent;
6727
+ modify: ToolCallModify;
6728
+ result: PreResult<ToolCallModify>;
6729
+ };
6730
+ "post.task.created": {
6731
+ event: TaskEvent;
6732
+ modify: never;
6733
+ result: void;
6734
+ };
6735
+ "post.task.completed": {
6736
+ event: TaskCompletedEvent;
6737
+ modify: never;
6738
+ result: void;
6739
+ };
6740
+ "post.task.failed": {
6741
+ event: TaskFailedEvent;
6742
+ modify: never;
6743
+ result: void;
6744
+ };
6745
+ "post.task.cancelled": {
6746
+ event: TaskEvent;
6747
+ modify: never;
6748
+ result: void;
6749
+ };
6750
+ "post.task.superseded": {
6751
+ event: TaskSupersededEvent;
6752
+ modify: never;
6753
+ result: void;
6754
+ };
6755
+ "post.task.progress": {
6756
+ event: TaskProgressEvent;
6757
+ modify: never;
6758
+ result: void;
6759
+ };
6760
+ "post.slack.message": {
6761
+ event: SlackMessageEvent;
6762
+ modify: never;
6763
+ result: void;
6764
+ };
6765
+ "post.tool.call": {
6766
+ event: ToolCallCompletedEvent;
6767
+ modify: never;
6768
+ result: void;
6769
+ };
6770
+ }
6771
+ export interface ExtensionApi<
6772
+ M extends ExtensionManifest = ExtensionManifest & {
6773
+ runtime: "api";
6774
+ },
6775
+ > {
6776
+ on<E extends keyof SwarmEventMap>(
6777
+ event: E,
6778
+ handler: (
6779
+ event: SwarmEventMap[E]["event"],
6780
+ ctx: CtxFor<M>,
6781
+ ) => Promise<SwarmEventMap[E]["result"]> | SwarmEventMap[E]["result"],
6782
+ opts?: {
6783
+ priority?: number;
6784
+ },
6785
+ ): void;
6786
+ }
6787
+ export type SwarmExtension<
6788
+ M extends ExtensionManifest = ExtensionManifest & {
6789
+ runtime: "api";
6790
+ },
6791
+ > = (api: ExtensionApi<M>) => void;
6792
+ export { block, modify } from "./contract-runtime";
6793
+ }
6794
+ `;
6795
+
6796
+ // src/be/extensions/validate.ts
6797
+ init_types();
6798
+ async function validateBundle(input) {
6799
+ const parsedManifest = ExtensionManifestSchema.safeParse(input.manifest);
6800
+ const pathDiagnostics = Object.keys(input.files).filter((path) => !isSafeBundlePath(path)).map((path) => `Unsafe bundle file path: ${JSON.stringify(path)}`);
6801
+ if (!parsedManifest.success) {
6802
+ return {
6803
+ ok: false,
6804
+ diagnostics: [
6805
+ ...pathDiagnostics,
6806
+ ...parsedManifest.error.issues.map((issue) => `${issue.path.join(".") || "manifest"}: ${issue.message}`)
6807
+ ]
6808
+ };
6809
+ }
6810
+ if (pathDiagnostics.length > 0)
6811
+ return { ok: false, diagnostics: pathDiagnostics };
6812
+ const manifest = parsedManifest.data;
6813
+ if (manifest.runtime === "worker") {
6814
+ return { ok: false, diagnostics: ['runtime "worker" is not supported in v1'] };
6815
+ }
6816
+ for (const asset of ["skills", "workflows", "schedules"]) {
6817
+ if ((manifest.assets[asset]?.length ?? 0) > 0) {
6818
+ return { ok: false, diagnostics: [`assets.${asset} is not supported in v1`] };
6819
+ }
6820
+ }
6821
+ const hookPath = manifest.assets.hooks;
6822
+ if (!(hookPath in input.files)) {
6823
+ return {
6824
+ ok: false,
6825
+ diagnostics: [`assets.hooks "${hookPath}" does not name a file in files`]
6826
+ };
6827
+ }
6828
+ const extraPaths = Object.keys(input.files).filter((path) => path !== hookPath);
6829
+ if (extraPaths.length > 0) {
6830
+ return {
6831
+ ok: false,
6832
+ diagnostics: [
6833
+ `Only the hooks asset is supported in v1. Unexpected files: ${extraPaths.join(", ")}`
6834
+ ]
6835
+ };
6836
+ }
6837
+ const source = input.files[hookPath];
6838
+ const imports = checkImportAllowlist(source, {
6839
+ allowedBare: ["swarm-extension", "zod", "stdlib"],
6840
+ allowRelative: false,
6841
+ strictDynamic: true
6842
+ });
6843
+ if (!imports.ok)
6844
+ return { ok: false, diagnostics: [imports.diagnostic] };
6845
+ const typecheck = await typecheckWithAmbient({
6846
+ source,
6847
+ modules: {
6848
+ "swarm-extension": EXTENSION_TYPE_DEFINITIONS,
6849
+ "swarm-sdk": SCRIPT_SDK_TYPES,
6850
+ stdlib: SCRIPT_STDLIB_MODULE_TYPES
6851
+ },
6852
+ checkFile: `/// <reference path="./runtime-globals.d.ts" />
6853
+ import * as hooks from "./user-script";
6854
+ import type { SwarmExtension } from "swarm-extension";
6855
+ import type { ZodTypeAny } from "zod";
6856
+ const manifest = ${JSON.stringify(manifest)} as const;
6857
+ type Manifest = typeof hooks extends { config: infer Config extends ZodTypeAny }
6858
+ ? typeof manifest & { config: Config }
6859
+ : typeof manifest;
6860
+ const _extension: SwarmExtension<Manifest> = hooks.default;
6861
+ type ConfigIsValid = typeof hooks extends { config: infer Config }
6862
+ ? Config extends ZodTypeAny ? true : false
6863
+ : true;
6864
+ const _configIsValid: ConfigIsValid = true;
6865
+ void _extension;
6866
+ void _configIsValid;
6867
+ `
6868
+ });
6869
+ if (!typecheck.ok) {
6870
+ return {
6871
+ ok: false,
6872
+ diagnostics: typecheck.structured.map((diagnostic) => `${diagnostic.file}:${diagnostic.line}:${diagnostic.column} TS${diagnostic.code}: ${diagnostic.message}`)
6873
+ };
6874
+ }
6875
+ return { ok: true, manifest };
6876
+ }
6877
+
6878
+ // src/http/extensions.ts
6879
+ init_types();
6880
+ init_request_auth_context();
6881
+ init_secret_scrubber();
6882
+ var idParamsSchema = exports_external.object({ id: exports_external.string().min(1) });
6883
+ var installRoute = route({
6884
+ method: "post",
6885
+ path: "/api/extensions/install",
6886
+ pattern: ["api", "extensions", "install"],
6887
+ operationId: "extensions_install",
6888
+ summary: "Validate and install an extension bundle",
6889
+ tags: ["Extensions"],
6890
+ body: ExtensionInstallBodySchema,
6891
+ responses: {
6892
+ 200: {
6893
+ description: "Installed extension",
6894
+ schema: exports_external.object({
6895
+ extension: ExtensionSchema,
6896
+ manifest: ExtensionManifestSchema,
6897
+ contentDeduped: exports_external.boolean()
6898
+ })
6899
+ },
6900
+ 400: { description: "Bundle validation failed" },
6901
+ 403: { description: "Permission denied" }
6902
+ },
6903
+ rbac: { permission: "extension.write" }
6904
+ });
6905
+ var listRoute2 = route({
6906
+ method: "get",
6907
+ path: "/api/extensions",
6908
+ pattern: ["api", "extensions"],
6909
+ operationId: "extensions_list",
6910
+ summary: "List installed extensions",
6911
+ tags: ["Extensions"],
6912
+ responses: {
6913
+ 200: {
6914
+ description: "Installed extensions",
6915
+ schema: exports_external.object({ extensions: exports_external.array(ExtensionSchema) })
6916
+ }
6917
+ }
6918
+ });
6919
+ var typeDefsRoute = route({
6920
+ method: "get",
6921
+ path: "/api/extensions/type-defs",
6922
+ pattern: ["api", "extensions", "type-defs"],
6923
+ operationId: "extensions_type_defs",
6924
+ summary: "Get extension authoring type definitions",
6925
+ tags: ["Extensions"],
6926
+ responses: {
6927
+ 200: {
6928
+ description: "Generated swarm-extension.d.ts",
6929
+ unstructured: "Plain TypeScript declaration text"
6930
+ }
6931
+ }
6932
+ });
6933
+ var getRoute = route({
6934
+ method: "get",
6935
+ path: "/api/extensions/{id}",
6936
+ pattern: ["api", "extensions", null],
6937
+ operationId: "extensions_get",
6938
+ summary: "Get an extension bundle",
6939
+ tags: ["Extensions"],
6940
+ params: idParamsSchema,
6941
+ responses: {
6942
+ 200: {
6943
+ description: "Extension bundle",
6944
+ schema: exports_external.object({
6945
+ extension: ExtensionSchema,
6946
+ manifest: ExtensionManifestSchema,
6947
+ files: exports_external.record(exports_external.string(), exports_external.string())
6948
+ })
6949
+ },
6950
+ 404: { description: "Extension not found" }
6951
+ }
6952
+ });
6953
+ var versionsRoute = route({
6954
+ method: "get",
6955
+ path: "/api/extensions/{id}/versions",
6956
+ pattern: ["api", "extensions", null, "versions"],
6957
+ operationId: "extensions_versions",
6958
+ summary: "List extension versions",
6959
+ tags: ["Extensions"],
6960
+ params: idParamsSchema,
6961
+ responses: {
6962
+ 200: {
6963
+ description: "Extension versions",
6964
+ schema: exports_external.object({ versions: exports_external.array(ExtensionVersionSchema) })
6965
+ },
6966
+ 404: { description: "Extension not found" }
6967
+ }
6968
+ });
6969
+ var runsRoute = route({
6970
+ method: "get",
6971
+ path: "/api/extensions/{id}/runs",
6972
+ pattern: ["api", "extensions", null, "runs"],
6973
+ operationId: "extensions_runs",
6974
+ summary: "List extension run log entries",
6975
+ tags: ["Extensions"],
6976
+ params: idParamsSchema,
6977
+ query: exports_external.object({ limit: exports_external.coerce.number().int().min(1).max(500).optional() }),
6978
+ responses: {
6979
+ 200: {
6980
+ description: "Extension run log",
6981
+ schema: exports_external.object({ runs: exports_external.array(ExtensionRunSchema) })
6982
+ },
6983
+ 404: { description: "Extension not found" }
6984
+ }
6985
+ });
6986
+ var patchRoute = route({
6987
+ method: "patch",
6988
+ path: "/api/extensions/{id}",
6989
+ pattern: ["api", "extensions", null],
6990
+ operationId: "extensions_update",
6991
+ summary: "Update extension priority, config, or description",
6992
+ tags: ["Extensions"],
6993
+ params: idParamsSchema,
6994
+ body: exports_external.object({
6995
+ priority: exports_external.number().int().optional(),
6996
+ config: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
6997
+ description: exports_external.string().optional()
6998
+ }).strict(),
6999
+ responses: {
7000
+ 200: { description: "Updated extension", schema: exports_external.object({ extension: ExtensionSchema }) },
7001
+ 400: { description: "Extension config validation failed" },
7002
+ 403: { description: "Permission denied" },
7003
+ 404: { description: "Extension not found" }
7004
+ },
7005
+ rbac: { permission: "extension.write" }
7006
+ });
7007
+ var deleteRoute = route({
7008
+ method: "delete",
7009
+ path: "/api/extensions/{id}",
7010
+ pattern: ["api", "extensions", null],
7011
+ operationId: "extensions_delete",
7012
+ summary: "Uninstall a disabled extension",
7013
+ tags: ["Extensions"],
7014
+ params: idParamsSchema,
7015
+ responses: {
7016
+ 200: {
7017
+ description: "Extension uninstalled",
7018
+ schema: exports_external.object({ deleted: exports_external.literal(true) })
7019
+ },
7020
+ 403: { description: "Permission denied" },
7021
+ 404: { description: "Extension not found" },
7022
+ 409: { description: "Enabled extensions cannot be uninstalled" }
7023
+ },
7024
+ rbac: { permission: "extension.write" }
7025
+ });
7026
+ var enableRoute = route({
7027
+ method: "post",
7028
+ path: "/api/extensions/{id}/enable",
7029
+ pattern: ["api", "extensions", null, "enable"],
7030
+ operationId: "extensions_enable",
7031
+ summary: "Enable an extension",
7032
+ description: "Loads and enables an extension. This route is operator-only.",
7033
+ tags: ["Extensions"],
7034
+ params: idParamsSchema,
7035
+ responses: {
7036
+ 200: { description: "Enabled extension", schema: exports_external.object({ extension: ExtensionSchema }) },
7037
+ 400: { description: "Extension load or config validation failed" },
7038
+ 403: { description: "Permission denied" },
7039
+ 404: { description: "Extension not found" }
7040
+ },
7041
+ rbac: { permission: "extension.activate" }
7042
+ });
7043
+ var disableRoute = route({
7044
+ method: "post",
7045
+ path: "/api/extensions/{id}/disable",
7046
+ pattern: ["api", "extensions", null, "disable"],
7047
+ operationId: "extensions_disable",
7048
+ summary: "Disable an extension",
7049
+ description: "Unloads and disables an extension. This route is operator-only.",
7050
+ tags: ["Extensions"],
7051
+ params: idParamsSchema,
7052
+ responses: {
7053
+ 200: { description: "Disabled extension", schema: exports_external.object({ extension: ExtensionSchema }) },
7054
+ 403: { description: "Permission denied" },
7055
+ 404: { description: "Extension not found" }
7056
+ },
7057
+ rbac: { permission: "extension.activate" }
6321
7058
  });
6322
- var getEventCountsRoute = route({
6323
- method: "get",
6324
- path: "/api/events/counts",
6325
- pattern: ["api", "events", "counts"],
6326
- summary: "Get event counts grouped by event name",
6327
- tags: ["Events"],
6328
- query: exports_external.object({
6329
- category: EventCategorySchema.optional(),
6330
- source: EventSourceSchema.optional(),
6331
- agentId: exports_external.string().optional(),
6332
- taskId: exports_external.string().optional(),
6333
- sessionId: exports_external.string().optional(),
6334
- since: exports_external.string().optional(),
6335
- until: exports_external.string().optional()
6336
- }),
7059
+ var activateVersionRoute = route({
7060
+ method: "post",
7061
+ path: "/api/extensions/{id}/activate-version",
7062
+ pattern: ["api", "extensions", null, "activate-version"],
7063
+ operationId: "extensions_activate_version",
7064
+ summary: "Activate an extension version",
7065
+ description: "Activates a stored version. This route is operator-only.",
7066
+ tags: ["Extensions"],
7067
+ params: idParamsSchema,
7068
+ body: exports_external.object({ version: exports_external.number().int().min(1) }).strict(),
6337
7069
  responses: {
6338
- 200: {
6339
- description: "Event counts",
6340
- schema: exports_external.object({
6341
- counts: exports_external.array(exports_external.object({ event: exports_external.string(), count: exports_external.number().int() }))
6342
- })
6343
- }
7070
+ 200: { description: "Activated extension", schema: exports_external.object({ extension: ExtensionSchema }) },
7071
+ 400: { description: "Extension load or config validation failed" },
7072
+ 403: { description: "Permission denied" },
7073
+ 404: { description: "Extension or version not found" }
6344
7074
  },
6345
- auth: { apiKey: true }
7075
+ rbac: { permission: "extension.activate" }
6346
7076
  });
6347
- async function handleEvents(req, res, pathSegments, queryParams, _myAgentId) {
6348
- if (createEventsBatchRoute.match(req.method, pathSegments)) {
6349
- const parsed = await createEventsBatchRoute.parse(req, res, pathSegments, queryParams);
7077
+ function redactExtension(extension) {
7078
+ return { ...extension, configJson: scrubSecrets(extension.configJson) };
7079
+ }
7080
+ var REDACTED_CONFIG_VALUE = /^\[REDACTED:[A-Za-z0-9_.:-]+\]$/;
7081
+ function isPlainObject(value) {
7082
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7083
+ }
7084
+ function restoreRedacted(incoming, stored) {
7085
+ if (typeof incoming === "string") {
7086
+ return REDACTED_CONFIG_VALUE.test(incoming) && stored !== undefined ? stored : incoming;
7087
+ }
7088
+ if (Array.isArray(incoming)) {
7089
+ const storedArray = Array.isArray(stored) ? stored : [];
7090
+ return incoming.map((item, index) => restoreRedacted(item, storedArray[index]));
7091
+ }
7092
+ if (isPlainObject(incoming)) {
7093
+ const storedObject = isPlainObject(stored) ? stored : {};
7094
+ return Object.fromEntries(Object.entries(incoming).map(([key, value]) => [
7095
+ key,
7096
+ restoreRedacted(value, storedObject[key])
7097
+ ]));
7098
+ }
7099
+ return incoming;
7100
+ }
7101
+ function preserveRedactedConfigValues(incoming, storedJson) {
7102
+ let parsed;
7103
+ try {
7104
+ parsed = JSON.parse(storedJson);
7105
+ } catch {
7106
+ parsed = {};
7107
+ }
7108
+ return restoreRedacted(incoming, parsed);
7109
+ }
7110
+ async function extensionPrincipal(req, callerAgentId) {
7111
+ if (callerAgentId) {
7112
+ const agent = await getAgentById(callerAgentId);
7113
+ return { kind: "agent", agentId: callerAgentId, isLead: agent?.isLead ?? false };
7114
+ }
7115
+ const auth = getRequestAuth(req);
7116
+ if (auth?.kind === "operator")
7117
+ return { kind: "operator" };
7118
+ if (auth?.kind === "user")
7119
+ return { kind: "user", userId: auth.userId };
7120
+ return { kind: "agent", agentId: "", isLead: false };
7121
+ }
7122
+ async function requirePermission(req, res, callerAgentId, verb) {
7123
+ const principal = await extensionPrincipal(req, callerAgentId);
7124
+ const decision = can({ principal, verb, resource: { kind: "none" }, source: "http" });
7125
+ if (decision.allow)
7126
+ return principal;
7127
+ jsonError(res, `Forbidden: ${decision.reason}`, 403);
7128
+ return null;
7129
+ }
7130
+ function respondLifecycleError(res, error) {
7131
+ const status = error instanceof ExtensionConfigError ? 400 : error instanceof ExtensionLifecycleError ? error.status : 500;
7132
+ jsonError(res, scrubSecrets(error instanceof Error ? error.message : String(error)), status);
7133
+ }
7134
+ async function handleExtensions(req, res, pathSegments, queryParams, agentId) {
7135
+ if (installRoute.match(req.method, pathSegments)) {
7136
+ const parsed = await installRoute.parse(req, res, pathSegments, queryParams);
6350
7137
  if (!parsed)
6351
7138
  return true;
6352
- try {
6353
- const count = await createEventsBatch(parsed.body.events);
6354
- createEventsBatchRoute.respond(res, 201, { success: true, count });
6355
- } catch (error) {
6356
- console.error("[HTTP] Failed to create events batch:", error);
6357
- jsonError(res, "Failed to store events batch", 500);
7139
+ const principal = await requirePermission(req, res, agentId, "extension.write");
7140
+ if (!principal)
7141
+ return true;
7142
+ const validation = await validateBundle(parsed.body);
7143
+ if (!validation.ok) {
7144
+ json(res, { error: "extension_validation_failed", diagnostics: validation.diagnostics }, 400);
7145
+ return true;
7146
+ }
7147
+ const existing = await getExtensionByName(validation.manifest.name);
7148
+ const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
7149
+ const updatedBy = await resolveHttpAuditUserId(req, writerAgentId);
7150
+ const shouldActivate = principal.kind !== "agent" && existing?.enabled === true;
7151
+ const result = await installExtension({
7152
+ manifest: validation.manifest,
7153
+ files: parsed.body.files,
7154
+ priority: parsed.body.priority,
7155
+ config: parsed.body.config,
7156
+ agentId: writerAgentId,
7157
+ createdBy: updatedBy,
7158
+ activate: shouldActivate
7159
+ });
7160
+ let extension = result.extension;
7161
+ if (shouldActivate) {
7162
+ try {
7163
+ extension = await reloadExtension(extension.id, { by: updatedBy });
7164
+ } catch (error) {
7165
+ respondLifecycleError(res, error);
7166
+ return true;
7167
+ }
6358
7168
  }
7169
+ installRoute.respond(res, 200, {
7170
+ extension: redactExtension(extension),
7171
+ manifest: validation.manifest,
7172
+ contentDeduped: result.contentDeduped
7173
+ });
6359
7174
  return true;
6360
7175
  }
6361
- if (getEventCountsRoute.match(req.method, pathSegments)) {
6362
- const parsed = await getEventCountsRoute.parse(req, res, pathSegments, queryParams);
7176
+ if (listRoute2.match(req.method, pathSegments)) {
7177
+ const parsed = await listRoute2.parse(req, res, pathSegments, queryParams);
6363
7178
  if (!parsed)
6364
7179
  return true;
6365
- const counts = await getEventCountsFiltered({
6366
- category: parsed.query.category || undefined,
6367
- source: parsed.query.source || undefined,
6368
- agentId: parsed.query.agentId || undefined,
6369
- taskId: parsed.query.taskId || undefined,
6370
- sessionId: parsed.query.sessionId || undefined,
6371
- since: parsed.query.since || undefined,
6372
- until: parsed.query.until || undefined
7180
+ listRoute2.respond(res, 200, { extensions: (await listExtensions()).map(redactExtension) });
7181
+ return true;
7182
+ }
7183
+ if (typeDefsRoute.match(req.method, pathSegments)) {
7184
+ const parsed = await typeDefsRoute.parse(req, res, pathSegments, queryParams);
7185
+ if (!parsed)
7186
+ return true;
7187
+ res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
7188
+ res.end(EXTENSION_TYPE_DEFINITIONS);
7189
+ return true;
7190
+ }
7191
+ if (versionsRoute.match(req.method, pathSegments)) {
7192
+ const parsed = await versionsRoute.parse(req, res, pathSegments, queryParams);
7193
+ if (!parsed)
7194
+ return true;
7195
+ if (!await getExtensionById(parsed.params.id)) {
7196
+ jsonError(res, "Extension not found", 404);
7197
+ return true;
7198
+ }
7199
+ versionsRoute.respond(res, 200, {
7200
+ versions: await listExtensionVersions(parsed.params.id)
6373
7201
  });
6374
- getEventCountsRoute.respond(res, 200, { counts });
6375
7202
  return true;
6376
7203
  }
6377
- if (createEventRoute.match(req.method, pathSegments)) {
6378
- const parsed = await createEventRoute.parse(req, res, pathSegments, queryParams);
7204
+ if (runsRoute.match(req.method, pathSegments)) {
7205
+ const parsed = await runsRoute.parse(req, res, pathSegments, queryParams);
7206
+ if (!parsed)
7207
+ return true;
7208
+ if (!await getExtensionById(parsed.params.id)) {
7209
+ jsonError(res, "Extension not found", 404);
7210
+ return true;
7211
+ }
7212
+ runsRoute.respond(res, 200, {
7213
+ runs: await listExtensionRuns(parsed.params.id, parsed.query.limit)
7214
+ });
7215
+ return true;
7216
+ }
7217
+ if (getRoute.match(req.method, pathSegments)) {
7218
+ const parsed = await getRoute.parse(req, res, pathSegments, queryParams);
7219
+ if (!parsed)
7220
+ return true;
7221
+ const extension = await getExtensionById(parsed.params.id);
7222
+ if (!extension) {
7223
+ jsonError(res, "Extension not found", 404);
7224
+ return true;
7225
+ }
7226
+ getRoute.respond(res, 200, {
7227
+ extension: redactExtension(extension),
7228
+ manifest: ExtensionManifestSchema.parse(JSON.parse(extension.manifestJson)),
7229
+ files: await getExtensionFiles(extension.id)
7230
+ });
7231
+ return true;
7232
+ }
7233
+ if (patchRoute.match(req.method, pathSegments)) {
7234
+ const parsed = await patchRoute.parse(req, res, pathSegments, queryParams);
7235
+ if (!parsed)
7236
+ return true;
7237
+ const principal = await requirePermission(req, res, agentId, "extension.write");
7238
+ if (!principal)
7239
+ return true;
7240
+ const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
7241
+ const stored = parsed.body.config ? await getExtensionById(parsed.params.id) : null;
7242
+ const config = parsed.body.config && stored ? preserveRedactedConfigValues(parsed.body.config, stored.configJson) : parsed.body.config;
7243
+ let extension = await updateExtensionMeta(parsed.params.id, {
7244
+ ...parsed.body,
7245
+ ...config === undefined ? {} : { config },
7246
+ updatedBy: await resolveHttpAuditUserId(req, writerAgentId)
7247
+ });
7248
+ if (!extension) {
7249
+ jsonError(res, "Extension not found", 404);
7250
+ return true;
7251
+ }
7252
+ if (extension.enabled) {
7253
+ try {
7254
+ extension = await reloadExtension(extension.id);
7255
+ } catch (error) {
7256
+ respondLifecycleError(res, error);
7257
+ return true;
7258
+ }
7259
+ }
7260
+ patchRoute.respond(res, 200, { extension: redactExtension(extension) });
7261
+ return true;
7262
+ }
7263
+ if (deleteRoute.match(req.method, pathSegments)) {
7264
+ const parsed = await deleteRoute.parse(req, res, pathSegments, queryParams);
7265
+ if (!parsed)
7266
+ return true;
7267
+ const principal = await requirePermission(req, res, agentId, "extension.write");
7268
+ if (!principal)
7269
+ return true;
7270
+ const extension = await getExtensionById(parsed.params.id);
7271
+ if (!extension) {
7272
+ jsonError(res, "Extension not found", 404);
7273
+ return true;
7274
+ }
7275
+ if (extension.enabled) {
7276
+ jsonError(res, "Disable the extension before uninstalling it", 409);
7277
+ return true;
7278
+ }
7279
+ await deleteExtension(extension.id);
7280
+ deleteRoute.respond(res, 200, { deleted: true });
7281
+ return true;
7282
+ }
7283
+ if (enableRoute.match(req.method, pathSegments)) {
7284
+ const parsed = await enableRoute.parse(req, res, pathSegments, queryParams);
6379
7285
  if (!parsed)
6380
7286
  return true;
7287
+ const principal = await requirePermission(req, res, agentId, "extension.activate");
7288
+ if (!principal)
7289
+ return true;
7290
+ const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
6381
7291
  try {
6382
- const event = await createEvent(parsed.body);
6383
- createEventRoute.respond(res, 201, { success: true, event });
7292
+ const extension = await enableExtension(parsed.params.id, {
7293
+ by: await resolveHttpAuditUserId(req, writerAgentId)
7294
+ });
7295
+ enableRoute.respond(res, 200, { extension: redactExtension(extension) });
6384
7296
  } catch (error) {
6385
- console.error("[HTTP] Failed to create event:", error);
6386
- jsonError(res, "Failed to store event", 500);
7297
+ respondLifecycleError(res, error);
6387
7298
  }
6388
7299
  return true;
6389
7300
  }
6390
- if (getEventsRoute.match(req.method, pathSegments)) {
6391
- const parsed = await getEventsRoute.parse(req, res, pathSegments, queryParams);
7301
+ if (disableRoute.match(req.method, pathSegments)) {
7302
+ const parsed = await disableRoute.parse(req, res, pathSegments, queryParams);
6392
7303
  if (!parsed)
6393
7304
  return true;
6394
- const events = await getEventsFiltered({
6395
- category: parsed.query.category || undefined,
6396
- event: parsed.query.event || undefined,
6397
- status: parsed.query.status || undefined,
6398
- source: parsed.query.source || undefined,
6399
- agentId: parsed.query.agentId || undefined,
6400
- taskId: parsed.query.taskId || undefined,
6401
- sessionId: parsed.query.sessionId || undefined,
6402
- dataField: parsed.query.dataField || undefined,
6403
- since: parsed.query.since || undefined,
6404
- until: parsed.query.until || undefined,
6405
- limit: parsed.query.limit ?? 100
6406
- });
6407
- getEventsRoute.respond(res, 200, { events });
7305
+ const principal = await requirePermission(req, res, agentId, "extension.activate");
7306
+ if (!principal)
7307
+ return true;
7308
+ const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
7309
+ try {
7310
+ const extension = await disableExtension(parsed.params.id, {
7311
+ by: await resolveHttpAuditUserId(req, writerAgentId)
7312
+ });
7313
+ disableRoute.respond(res, 200, { extension: redactExtension(extension) });
7314
+ } catch (error) {
7315
+ respondLifecycleError(res, error);
7316
+ }
7317
+ return true;
7318
+ }
7319
+ if (activateVersionRoute.match(req.method, pathSegments)) {
7320
+ const parsed = await activateVersionRoute.parse(req, res, pathSegments, queryParams);
7321
+ if (!parsed)
7322
+ return true;
7323
+ const principal = await requirePermission(req, res, agentId, "extension.activate");
7324
+ if (!principal)
7325
+ return true;
7326
+ const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
7327
+ try {
7328
+ const extension = await activateVersion(parsed.params.id, parsed.body.version, {
7329
+ by: await resolveHttpAuditUserId(req, writerAgentId)
7330
+ });
7331
+ activateVersionRoute.respond(res, 200, { extension: redactExtension(extension) });
7332
+ } catch (error) {
7333
+ respondLifecycleError(res, error);
7334
+ }
6408
7335
  return true;
6409
7336
  }
6410
7337
  return false;
@@ -7099,7 +8026,8 @@ var upsertState = route({
7099
8026
  itemType: InboxItemTypeSchema,
7100
8027
  itemId: exports_external.string().min(1),
7101
8028
  status: InboxItemStatusSchema,
7102
- snoozeUntil: exports_external.string().datetime().optional()
8029
+ snoozeUntil: exports_external.string().datetime().optional(),
8030
+ readAt: exports_external.string().datetime().optional()
7103
8031
  }),
7104
8032
  responses: {
7105
8033
  200: {
@@ -7134,7 +8062,8 @@ async function handleInboxState(req, res, pathSegments, queryParams) {
7134
8062
  itemType: parsed.body.itemType,
7135
8063
  itemId: parsed.body.itemId,
7136
8064
  status: parsed.body.status,
7137
- snoozeUntil: parsed.body.snoozeUntil
8065
+ snoozeUntil: parsed.body.snoozeUntil,
8066
+ readAt: parsed.body.readAt
7138
8067
  });
7139
8068
  upsertState.respond(res, 200, { item });
7140
8069
  } catch (err) {
@@ -9132,7 +10061,7 @@ async function handleMcp(req, res, transports, sessionActivity = {}, sessionAgen
9132
10061
  };
9133
10062
  const configs = await getResolvedConfig(agentId);
9134
10063
  const configValue = configs.find((config) => config.key === "SCRIPTS_ONLY_MCP")?.value;
9135
- const preloadEnabled = parseEnvFlag(configs.find((config) => config.key === "TASK_TOOL_PRELOAD_ENABLED")?.value ?? process.env.TASK_TOOL_PRELOAD_ENABLED, false);
10064
+ const preloadEnabled = parseEnvFlag(configs.find((config) => config.key === "TASK_TOOL_PRELOAD_ENABLED")?.value ?? process.env.TASK_TOOL_PRELOAD_ENABLED, true);
9136
10065
  let preloadedTools = [];
9137
10066
  if (preloadEnabled) {
9138
10067
  const taskId = headerValue(req.headers["x-source-task-id"]);
@@ -9182,104 +10111,6 @@ async function handleMcp(req, res, transports, sessionActivity = {}, sessionAgen
9182
10111
  return true;
9183
10112
  }
9184
10113
 
9185
- // src/http/mcp-bridge.ts
9186
- init_zod();
9187
- var _bridgeServer = null;
9188
- async function getBridgeServer() {
9189
- if (!_bridgeServer) {
9190
- _bridgeServer = await createServer({ scriptsOnly: false, fullSurface: true });
9191
- }
9192
- return _bridgeServer;
9193
- }
9194
- var mcpBridgeRoute = route({
9195
- method: "post",
9196
- path: "/api/mcp-bridge",
9197
- pattern: ["api", "mcp-bridge"],
9198
- summary: "Generic MCP tool proxy for the scripts SDK bridge",
9199
- tags: ["Scripts"],
9200
- headers: runtimeInstanceHeader("acquire work through bridged tools"),
9201
- body: exports_external.object({
9202
- tool: exports_external.string().min(1).max(200),
9203
- args: exports_external.record(exports_external.string(), exports_external.unknown()).default({})
9204
- }),
9205
- responses: {
9206
- 200: {
9207
- description: "Tool result",
9208
- unstructured: "Generic MCP tool proxy — response shape is whatever the invoked tool's structuredContent/content returns, which varies per tool"
9209
- },
9210
- 400: { description: "Invalid tool name or args" },
9211
- 403: { description: "Tool not in SDK allowlist" },
9212
- 404: { description: "Tool not found" }
9213
- }
9214
- });
9215
- async function handleMcpBridge(req, res, pathSegments, _queryParams, myAgentId) {
9216
- if (!mcpBridgeRoute.match(req.method, pathSegments))
9217
- return false;
9218
- const parsed = await mcpBridgeRoute.parse(req, res, pathSegments, new URLSearchParams);
9219
- if (!parsed)
9220
- return true;
9221
- const { tool: toolName, args } = parsed.body;
9222
- if (!isMcpToolAllowedForScripts(toolName)) {
9223
- jsonError(res, `Tool '${toolName}' is not in the SDK allowlist`, 403);
9224
- return true;
9225
- }
9226
- const server = await getBridgeServer();
9227
- const tools = server._registeredTools;
9228
- const tool = tools[toolName];
9229
- if (!tool) {
9230
- jsonError(res, `Tool '${toolName}' not found in the MCP registry`, 404);
9231
- return true;
9232
- }
9233
- if (tool.enabled === false) {
9234
- jsonError(res, `Tool '${toolName}' is disabled`, 400);
9235
- return true;
9236
- }
9237
- const sourceTaskId = Array.isArray(req.headers["x-source-task-id"]) ? req.headers["x-source-task-id"][0] : req.headers["x-source-task-id"];
9238
- const runtimeInstanceId = Array.isArray(req.headers["x-runtime-instance-id"]) ? req.headers["x-runtime-instance-id"][0] : req.headers["x-runtime-instance-id"];
9239
- const extra = markScriptSdkRequestOrigin({
9240
- sessionId: "mcp-bridge",
9241
- requestInfo: {
9242
- headers: {
9243
- "x-agent-id": myAgentId ?? "",
9244
- ...sourceTaskId ? { "x-source-task-id": sourceTaskId } : {},
9245
- ...runtimeInstanceId ? { "x-runtime-instance-id": runtimeInstanceId } : {}
9246
- }
9247
- }
9248
- });
9249
- let handlerArgs = args;
9250
- if (tool.inputSchema) {
9251
- const inputObj = normalizeObjectSchema(tool.inputSchema);
9252
- const parseResult = await safeParseAsync(inputObj ?? tool.inputSchema, args);
9253
- if (!parseResult.success) {
9254
- const parseError = "error" in parseResult ? parseResult.error : "Unknown error";
9255
- jsonError(res, `Invalid arguments for tool '${toolName}': ${getParseErrorMessage(parseError)}`, 400);
9256
- return true;
9257
- }
9258
- handlerArgs = parseResult.data;
9259
- }
9260
- try {
9261
- const result = tool.inputSchema ? await Promise.resolve(tool.handler(handlerArgs, extra)) : await Promise.resolve(tool.handler(extra));
9262
- if (result && typeof result === "object" && "structuredContent" in result) {
9263
- json(res, result.structuredContent);
9264
- } else if (result && typeof result === "object" && "content" in result) {
9265
- const content = result.content;
9266
- const text = content.filter((c) => c.type === "text" && c.text).map((c) => c.text).join(`
9267
- `);
9268
- try {
9269
- json(res, JSON.parse(text));
9270
- } catch {
9271
- json(res, { result: text });
9272
- }
9273
- } else {
9274
- json(res, result ?? {});
9275
- }
9276
- } catch (err) {
9277
- const message = err instanceof Error ? err.message : String(err);
9278
- jsonError(res, message, 500);
9279
- }
9280
- return true;
9281
- }
9282
-
9283
10114
  // src/http/mcp-oauth.ts
9284
10115
  init_zod();
9285
10116
  init_db();
@@ -14946,7 +15777,7 @@ var deleteByIdRoute = route({
14946
15777
  },
14947
15778
  auth: { apiKey: true }
14948
15779
  });
14949
- var listRoute2 = route({
15780
+ var listRoute3 = route({
14950
15781
  method: "get",
14951
15782
  path: "/api/prompt-templates",
14952
15783
  pattern: ["api", "prompt-templates"],
@@ -15126,8 +15957,8 @@ ${templateBody}` : templateBody;
15126
15957
  }
15127
15958
  return true;
15128
15959
  }
15129
- if (listRoute2.match(req.method, pathSegments)) {
15130
- const parsed = await listRoute2.parse(req, res, pathSegments, queryParams);
15960
+ if (listRoute3.match(req.method, pathSegments)) {
15961
+ const parsed = await listRoute3.parse(req, res, pathSegments, queryParams);
15131
15962
  if (!parsed)
15132
15963
  return true;
15133
15964
  const templates = getPromptTemplates({
@@ -15136,7 +15967,7 @@ ${templateBody}` : templateBody;
15136
15967
  scopeId: parsed.query.scopeId || undefined,
15137
15968
  isDefault: parsed.query.isDefault ? parsed.query.isDefault === "true" : undefined
15138
15969
  });
15139
- listRoute2.respond(res, 200, { templates: templates.map(toPromptTemplateResponse) });
15970
+ listRoute3.respond(res, 200, { templates: templates.map(toPromptTemplateResponse) });
15140
15971
  return true;
15141
15972
  }
15142
15973
  if (upsertRoute.match(req.method, pathSegments)) {
@@ -16319,7 +17150,7 @@ init_secret_scrubber();
16319
17150
  var providerSchema = exports_external.string().min(1).max(255).regex(/^[A-Za-z0-9_-]+$/);
16320
17151
  var scopeSchema = exports_external.enum(["global", "agent", "repo"]);
16321
17152
  var connectionKindSchema = exports_external.enum(["openapi", "graphql", "mcp"]);
16322
- var idParamsSchema = exports_external.object({ id: exports_external.string().uuid() });
17153
+ var idParamsSchema2 = exports_external.object({ id: exports_external.string().uuid() });
16323
17154
  var providerParamsSchema = exports_external.object({ provider: providerSchema });
16324
17155
  var oauthResourceIdParamsSchema = exports_external.object({ id: exports_external.string().min(1).max(255) });
16325
17156
  var listConnectionsQuerySchema = exports_external.object({
@@ -16648,7 +17479,7 @@ var getConnectionRoute = route({
16648
17479
  operationId: "script_connections_get",
16649
17480
  summary: "Get script connection detail",
16650
17481
  tags: ["Script Connections"],
16651
- params: idParamsSchema,
17482
+ params: idParamsSchema2,
16652
17483
  responses: {
16653
17484
  200: {
16654
17485
  description: "Script connection detail",
@@ -16682,7 +17513,7 @@ var refreshConnectionRoute = route({
16682
17513
  operationId: "script_connections_refresh",
16683
17514
  summary: "Refresh a script connection",
16684
17515
  tags: ["Script Connections"],
16685
- params: idParamsSchema,
17516
+ params: idParamsSchema2,
16686
17517
  responses: {
16687
17518
  200: {
16688
17519
  description: "Refreshed script connection",
@@ -16701,7 +17532,7 @@ var setConnectionEnabledRoute = route({
16701
17532
  operationId: "script_connections_set_enabled",
16702
17533
  summary: "Enable or disable a script connection",
16703
17534
  tags: ["Script Connections"],
16704
- params: idParamsSchema,
17535
+ params: idParamsSchema2,
16705
17536
  body: disableConnectionBodySchema,
16706
17537
  responses: {
16707
17538
  200: {
@@ -18272,7 +19103,7 @@ init_types();
18272
19103
  init_constants();
18273
19104
  var DEFAULT_SCRIPT_RUN_CONCURRENCY_CAP = 10;
18274
19105
  var runIdParamsSchema = exports_external.object({ runId: exports_external.string().uuid() });
18275
- var idParamsSchema2 = exports_external.object({ id: exports_external.string().uuid() });
19106
+ var idParamsSchema3 = exports_external.object({ id: exports_external.string().uuid() });
18276
19107
  var stepParamsSchema = exports_external.object({
18277
19108
  runId: exports_external.string().uuid(),
18278
19109
  stepKey: exports_external.string().min(1)
@@ -18379,7 +19210,7 @@ var getScriptRunRoute = route({
18379
19210
  operationId: "script_runs_get",
18380
19211
  summary: "Get a script workflow run with journal",
18381
19212
  tags: ["Script Runs"],
18382
- params: idParamsSchema2,
19213
+ params: idParamsSchema3,
18383
19214
  responses: {
18384
19215
  200: {
18385
19216
  description: "Script run detail",
@@ -18395,7 +19226,7 @@ var deleteScriptRunRoute = route({
18395
19226
  operationId: "script_runs_cancel",
18396
19227
  summary: "Cancel a script workflow run",
18397
19228
  tags: ["Script Runs"],
18398
- params: idParamsSchema2,
19229
+ params: idParamsSchema3,
18399
19230
  responses: {
18400
19231
  204: { description: "Script run cancelled, or already terminal" },
18401
19232
  404: { description: "Script run not found" }
@@ -18775,6 +19606,7 @@ async function handleScriptRuns(req, res, pathSegments, queryParams, agentId) {
18775
19606
  agentId: parsed.body.agentId,
18776
19607
  routingReason: parsed.body.routingReason ?? (parsed.body.agentId ? "human_pinned" : undefined),
18777
19608
  routingNote: parsed.body.routingNote,
19609
+ routingSource: parsed.body.routingReason ? "declared" : parsed.body.agentId ? "engine_default" : undefined,
18778
19610
  tags: parsed.body.tags,
18779
19611
  priority: parsed.body.priority,
18780
19612
  offeredTo: parsed.body.offerMode ? parsed.body.agentId : undefined,
@@ -18841,7 +19673,7 @@ var searchBodySchema = exports_external.object({
18841
19673
  var nameParamsSchema = exports_external.object({ name: scriptNameSchema });
18842
19674
  var scopeQuerySchema = exports_external.object({ scope: ScriptScopeSchema.default("agent") });
18843
19675
  var optionalScopeQuerySchema = exports_external.object({ scope: ScriptScopeSchema.optional() });
18844
- var idParamsSchema3 = exports_external.object({ id: exports_external.string().uuid() });
19676
+ var idParamsSchema4 = exports_external.object({ id: exports_external.string().uuid() });
18845
19677
  var listScriptsQuerySchema = exports_external.object({
18846
19678
  scope: ScriptScopeSchema.optional(),
18847
19679
  includeScratch: exports_external.enum(["true", "false"]).optional()
@@ -18976,7 +19808,7 @@ var searchRoute = route({
18976
19808
  },
18977
19809
  rbac: { permission: "script.search" }
18978
19810
  });
18979
- var deleteRoute = route({
19811
+ var deleteRoute2 = route({
18980
19812
  method: "delete",
18981
19813
  path: "/api/scripts/{name}",
18982
19814
  pattern: ["api", "scripts", null],
@@ -19024,7 +19856,7 @@ var listScriptsRoute = route({
19024
19856
  400: { description: "Validation error" }
19025
19857
  }
19026
19858
  });
19027
- var typeDefsRoute = route({
19859
+ var typeDefsRoute2 = route({
19028
19860
  method: "get",
19029
19861
  path: "/api/scripts/type-defs",
19030
19862
  pattern: ["api", "scripts", "type-defs"],
@@ -19047,7 +19879,7 @@ var getScriptByIdRoute = route({
19047
19879
  summary: "Get a saved script by id",
19048
19880
  description: "Dashboard read: full record including source and parsed signature.",
19049
19881
  tags: ["Scripts"],
19050
- params: idParamsSchema3,
19882
+ params: idParamsSchema4,
19051
19883
  responses: {
19052
19884
  200: { description: "Script detail", schema: exports_external.object({ script: scriptDetailSchema }) },
19053
19885
  404: { description: "Script not found" }
@@ -19061,7 +19893,7 @@ var listVersionsRoute = route({
19061
19893
  summary: "List versions of a saved script",
19062
19894
  description: "Dashboard read: version history, newest first.",
19063
19895
  tags: ["Scripts"],
19064
- params: idParamsSchema3,
19896
+ params: idParamsSchema4,
19065
19897
  responses: {
19066
19898
  200: {
19067
19899
  description: "Script versions",
@@ -19093,7 +19925,7 @@ var createScriptApiRoute = route({
19093
19925
  summary: "Expose a script as an external HTTP API endpoint",
19094
19926
  description: "Returns the endpoint plus the plaintext bearer token (when authMode is 'bearer').",
19095
19927
  tags: ["Scripts"],
19096
- params: idParamsSchema3,
19928
+ params: idParamsSchema4,
19097
19929
  body: createScriptApiBodySchema,
19098
19930
  responses: {
19099
19931
  201: { description: "Endpoint created", schema: scriptApiWithSecretSchema },
@@ -19109,7 +19941,7 @@ var listScriptApisRoute = route({
19109
19941
  operationId: "scripts_api_list",
19110
19942
  summary: "List external API endpoints for a script",
19111
19943
  tags: ["Scripts"],
19112
- params: idParamsSchema3,
19944
+ params: idParamsSchema4,
19113
19945
  responses: {
19114
19946
  200: {
19115
19947
  description: "Endpoints (without secrets)",
@@ -19472,11 +20304,11 @@ async function handleScripts(req, res, pathSegments, queryParams, agentId) {
19472
20304
  listScriptsRoute.respond(res, 200, { scripts });
19473
20305
  return true;
19474
20306
  }
19475
- if (typeDefsRoute.match(req.method, pathSegments)) {
20307
+ if (typeDefsRoute2.match(req.method, pathSegments)) {
19476
20308
  const apiTypes = getScriptApiTypes();
19477
20309
  const mcpTypes = getScriptMcpTypes();
19478
20310
  const appTypes = await getScriptAppTypes();
19479
- typeDefsRoute.respond(res, 200, {
20311
+ typeDefsRoute2.respond(res, 200, {
19480
20312
  sdkTypes: await scriptSdkTypesWithGeneratedApis(apiTypes, mcpTypes, appTypes),
19481
20313
  stdlibTypes: await scriptStdlibTypesWithGeneratedApis(apiTypes, mcpTypes, appTypes)
19482
20314
  });
@@ -19530,8 +20362,8 @@ async function handleScripts(req, res, pathSegments, queryParams, agentId) {
19530
20362
  });
19531
20363
  return true;
19532
20364
  }
19533
- if (deleteRoute.match(req.method, pathSegments)) {
19534
- const parsed = await deleteRoute.parse(req, res, pathSegments, queryParams);
20365
+ if (deleteRoute2.match(req.method, pathSegments)) {
20366
+ const parsed = await deleteRoute2.parse(req, res, pathSegments, queryParams);
19535
20367
  if (!parsed)
19536
20368
  return true;
19537
20369
  const agent = await requireAgent2(res, agentId);
@@ -19570,7 +20402,7 @@ async function handleScripts(req, res, pathSegments, queryParams, agentId) {
19570
20402
  }, 409);
19571
20403
  return true;
19572
20404
  }
19573
- deleteRoute.respond(res, 200, { deleted: outcome.deleted });
20405
+ deleteRoute2.respond(res, 200, { deleted: outcome.deleted });
19574
20406
  return true;
19575
20407
  }
19576
20408
  if (createScriptApiRoute.match(req.method, pathSegments)) {
@@ -21590,8 +22422,7 @@ async function harnessMilestone() {
21590
22422
  };
21591
22423
  }
21592
22424
  function embeddingsMilestone() {
21593
- const embeddingKey = process.env.EMBEDDING_API_KEY ?? process.env.OPENAI_API_KEY;
21594
- if (embeddingKey) {
22425
+ if (getEmbeddingProvider().isConfigured()) {
21595
22426
  return {
21596
22427
  id: "embeddings",
21597
22428
  label: "Memory search",
@@ -22073,7 +22904,14 @@ var createTask = route({
22073
22904
  }),
22074
22905
  responses: {
22075
22906
  201: { description: "Task created", schema: AgentTaskSchema },
22076
- 400: { description: "Validation error" }
22907
+ 400: { description: "Validation error" },
22908
+ 422: {
22909
+ description: "Task creation blocked by an extension",
22910
+ schema: exports_external.object({
22911
+ error: exports_external.string(),
22912
+ extension: exports_external.object({ id: exports_external.string(), name: exports_external.string() })
22913
+ })
22914
+ }
22077
22915
  }
22078
22916
  });
22079
22917
  var promoteDraftTaskRoute = route({
@@ -22557,6 +23395,7 @@ async function handleTasks(req, res, pathSegments, queryParams, myAgentId) {
22557
23395
  key: assetKey,
22558
23396
  agentId: defaultAgentId,
22559
23397
  routingReason: parsed.body.routingReason ?? (defaultAgentId ? parentTask?.agentId === defaultAgentId ? "continuity" : "skill" : undefined),
23398
+ routingSource: parsed.body.routingReason ? "declared" : defaultAgentId ? "engine_default" : undefined,
22560
23399
  routingNote: parsed.body.routingNote,
22561
23400
  creatorAgentId: myAgentId || undefined,
22562
23401
  taskType: parsed.body.taskType || undefined,
@@ -22576,7 +23415,7 @@ async function handleTasks(req, res, pathSegments, queryParams, myAgentId) {
22576
23415
  modelTier: parsed.body.modelTier
22577
23416
  }),
22578
23417
  effort: parsed.body.effort
22579
- });
23418
+ }, { origin: "rest" });
22580
23419
  ensure({
22581
23420
  id: "created",
22582
23421
  flow: "task",
@@ -22594,6 +23433,10 @@ async function handleTasks(req, res, pathSegments, queryParams, myAgentId) {
22594
23433
  });
22595
23434
  createTask.respond(res, 201, task);
22596
23435
  } catch (error) {
23436
+ if (error instanceof TaskCreationBlockedError) {
23437
+ createTask.respond(res, 422, { error: error.reason, extension: error.extension });
23438
+ return true;
23439
+ }
22597
23440
  console.error("[HTTP] Failed to create task:", error);
22598
23441
  jsonError(res, "Failed to create task", 500);
22599
23442
  }
@@ -24831,13 +25674,14 @@ async function routeKapsoInbound(payload) {
24831
25674
  const task = await createTaskWithSiblingAwareness(await buildTaskDescription(payload), {
24832
25675
  agentId: mapping.agentId ?? null,
24833
25676
  routingReason: mapping.agentId ? "human_pinned" : undefined,
25677
+ routingSource: mapping.agentId ? "engine_default" : undefined,
24834
25678
  source: "system",
24835
25679
  taskType: "kapso-inbound",
24836
25680
  tags: ["kapso-whatsapp", "inbound"],
24837
25681
  priority: 70,
24838
25682
  requestedByUserId: await resolveKapsoRequestedByUserId(payload),
24839
25683
  contextKey: `kapso:conversation:${payload.conversation?.id ?? messageId}`
24840
- });
25684
+ }, { origin: "webhook" });
24841
25685
  return { kind: "task", taskId: task.id };
24842
25686
  }
24843
25687
 
@@ -25717,21 +26561,21 @@ var getWorkflowVersionRoute = route({
25717
26561
  });
25718
26562
  async function handleWorkflows(req, res, pathSegments, queryParams, myAgentId) {
25719
26563
  if (listExecutorTypesRoute.match(req.method, pathSegments)) {
25720
- const registry2 = getExecutorRegistry();
25721
- listExecutorTypesRoute.respond(res, 200, { executorTypes: registry2.describeAll() });
26564
+ const registry = getExecutorRegistry();
26565
+ listExecutorTypesRoute.respond(res, 200, { executorTypes: registry.describeAll() });
25722
26566
  return true;
25723
26567
  }
25724
26568
  if (getExecutorTypeRoute.match(req.method, pathSegments)) {
25725
26569
  const parsed = await getExecutorTypeRoute.parse(req, res, pathSegments, queryParams);
25726
26570
  if (!parsed)
25727
26571
  return true;
25728
- const registry2 = getExecutorRegistry();
25729
- if (!registry2.has(parsed.params.type)) {
26572
+ const registry = getExecutorRegistry();
26573
+ if (!registry.has(parsed.params.type)) {
25730
26574
  res.writeHead(404);
25731
26575
  res.end();
25732
26576
  return true;
25733
26577
  }
25734
- getExecutorTypeRoute.respond(res, 200, registry2.describe(parsed.params.type));
26578
+ getExecutorTypeRoute.respond(res, 200, registry.describe(parsed.params.type));
25735
26579
  return true;
25736
26580
  }
25737
26581
  if (webhookTriggerRoute.match(req.method, pathSegments)) {
@@ -26388,6 +27232,7 @@ function startApiGcInterval() {
26388
27232
  }
26389
27233
  if (globalState.__httpServer) {
26390
27234
  globalState.__closeRealtime?.();
27235
+ await globalState.__stopExtensions?.();
26391
27236
  console.log("[HTTP] Hot reload detected, closing previous server...");
26392
27237
  globalState.__httpServer.close();
26393
27238
  }
@@ -26492,6 +27337,7 @@ var httpServer = createHttpServer(async (req, res) => {
26492
27337
  () => handleApiKeys(req, res, pathSegments, queryParams),
26493
27338
  () => handleHeartbeat(req, res, pathSegments),
26494
27339
  () => handleEvents(req, res, pathSegments, queryParams, myAgentId),
27340
+ () => handleExtensions(req, res, pathSegments, queryParams, myAgentId),
26495
27341
  () => handleFavorites(req, res, pathSegments, queryParams, myAgentId),
26496
27342
  () => handleUsers(req, res, pathSegments, queryParams),
26497
27343
  () => handleSessions(req, res, pathSegments, queryParams),
@@ -26546,6 +27392,7 @@ globalState.__mcpSessionAgents = mcpSessionAgents;
26546
27392
  globalState.__sessionUsers = sessionUsers;
26547
27393
  globalState.__transportActivity = transportActivity;
26548
27394
  globalState.__transportActivityUser = transportActivityUser;
27395
+ globalState.__stopExtensions = stopExtensionRuntime;
26549
27396
  async function shutdown() {
26550
27397
  globalState.__closeRealtime?.();
26551
27398
  console.log("Shutting down HTTP server...");
@@ -26555,7 +27402,7 @@ async function shutdown() {
26555
27402
  sessionsProcessed: getServerSessionsProcessed()
26556
27403
  });
26557
27404
  if (hasCapability("scheduling")) {
26558
- const { stopScheduler } = await import("./index-769nc012.js");
27405
+ const { stopScheduler } = await import("./index-hw26vj40.js");
26559
27406
  stopScheduler();
26560
27407
  }
26561
27408
  stopHeartbeat();
@@ -26563,13 +27410,14 @@ async function shutdown() {
26563
27410
  await stopScriptRunSupervisor();
26564
27411
  await stopSlackApp();
26565
27412
  if (process.env.OAUTH_KEEPALIVE_DISABLE !== "true") {
26566
- const { stopOAuthKeepalive } = await import("./keepalive-nesm3xb6.js");
27413
+ const { stopOAuthKeepalive } = await import("./keepalive-asqtcm4y.js");
26567
27414
  await stopOAuthKeepalive();
26568
27415
  }
26569
27416
  stopOAuthPendingGc();
26570
27417
  stopMemoryGc();
26571
27418
  await stopDbRetention();
26572
27419
  stopScratchScriptGc();
27420
+ await stopExtensionRuntime();
26573
27421
  stopAuditGc();
26574
27422
  stopAuditWriter();
26575
27423
  await flushAuditBuffer();
@@ -26617,7 +27465,7 @@ if (!globalState.__runId) {
26617
27465
  startApiGcInterval();
26618
27466
  var startupConfigsInjected = [];
26619
27467
  try {
26620
- startupConfigsInjected = await loadGlobalConfigsIntoEnv(false);
27468
+ startupConfigsInjected = await loadGlobalConfigsIntoEnv(true);
26621
27469
  } catch (err) {
26622
27470
  console.error("[startup] Failed to load global swarm configs before listen:", err);
26623
27471
  process.exitCode = 1;
@@ -26630,15 +27478,15 @@ try {
26630
27478
  console.warn("[startup] CAPABILITIES upgrade seed failed (non-fatal):", err);
26631
27479
  }
26632
27480
  try {
26633
- const { seedPricingFromModelsDev } = await import("./seed-pricing-49gbgn96.js");
27481
+ const { seedPricingFromModelsDev } = await import("./seed-pricing-jqjs6cws.js");
26634
27482
  seedPricingFromModelsDev();
26635
- const { startPricingRefreshLoop } = await import("./pricing-refresh-5v56x7gb.js");
27483
+ const { startPricingRefreshLoop } = await import("./pricing-refresh-mx51az05.js");
26636
27484
  startPricingRefreshLoop();
26637
27485
  } catch (err) {
26638
27486
  console.error("[startup] Failed to seed pricing rows:", err);
26639
27487
  }
26640
27488
  try {
26641
- const { ensureRbacSeedsSynced } = await import("./rbac-roles-0p0s6pbj.js");
27489
+ const { ensureRbacSeedsSynced } = await import("./rbac-roles-wcmrg6sv.js");
26642
27490
  ensureRbacSeedsSynced();
26643
27491
  } catch (err) {
26644
27492
  console.error("[startup] Failed to sync RBAC seed rows:", err);
@@ -26646,11 +27494,16 @@ try {
26646
27494
  throw err;
26647
27495
  }
26648
27496
  try {
26649
- const { runAllSeeders } = await import("./index-ezxkds2n.js");
27497
+ const { runAllSeeders } = await import("./index-16js521z.js");
26650
27498
  await runAllSeeders({ scriptEmbeddingMode: "skip" });
26651
27499
  } catch (err) {
26652
27500
  console.error("[startup] Failed to seed built-in entities:", err);
26653
27501
  }
27502
+ try {
27503
+ await loadEnabledExtensions();
27504
+ } catch (err) {
27505
+ console.error("[startup] Failed to initialize extensions:", scrubSecrets(err instanceof Error ? err.message : String(err)));
27506
+ }
26654
27507
  setAuditSink(enqueueAuditRow);
26655
27508
  startAuditWriter();
26656
27509
  await startAuditGc();
@@ -26658,6 +27511,10 @@ startScratchScriptGc();
26658
27511
  initialize();
26659
27512
  await initOtel("api");
26660
27513
  httpServer.listen(port, async () => {
27514
+ const boundAddress = httpServer.address();
27515
+ if (boundAddress && typeof boundAddress === "object") {
27516
+ setExtensionLoopbackBaseUrl(`http://127.0.0.1:${boundAddress.port}`);
27517
+ }
26661
27518
  console.log(`MCP HTTP server running on http://localhost:${port}/mcp`);
26662
27519
  ensure({
26663
27520
  id: "listen",
@@ -26677,7 +27534,11 @@ httpServer.listen(port, async () => {
26677
27534
  if (process.env.GITHUB_TOKEN) {
26678
27535
  await emitBuiltInIntegrationConnectedOnce("github");
26679
27536
  }
26680
- await startSlackApp();
27537
+ try {
27538
+ await startSlackApp();
27539
+ } catch (err) {
27540
+ console.error("[Slack] Failed to start, continuing boot without Slack:", err);
27541
+ }
26681
27542
  startQueueStallAlarm();
26682
27543
  initGitHub();
26683
27544
  initGitLab();
@@ -26687,36 +27548,36 @@ httpServer.listen(port, async () => {
26687
27548
  await initWorkflows();
26688
27549
  await startScriptRunSupervisor(getMcpBaseUrl());
26689
27550
  if (hasCapability("scheduling")) {
26690
- const { startScheduler } = await import("./index-769nc012.js");
26691
- const { getExecutorRegistry: getExecutorRegistry2 } = await import("./index-0wdy6gwc.js");
27551
+ const { startScheduler } = await import("./index-hw26vj40.js");
27552
+ const { getExecutorRegistry: getExecutorRegistry2 } = await import("./index-nnrbpcjp.js");
26692
27553
  const intervalMs = Number(process.env.SCHEDULER_INTERVAL_MS) || 1e4;
26693
27554
  startScheduler(getExecutorRegistry2(), intervalMs, {
26694
27555
  runId: globalState.__runId
26695
27556
  });
26696
27557
  }
26697
27558
  if (!isEnvFlagEnabled("HEARTBEAT_DISABLE", false)) {
26698
- const { startHeartbeat } = await import("./index-x1zcj09z.js");
27559
+ const { startHeartbeat } = await import("./index-zj518gf9.js");
26699
27560
  const heartbeatMs = Number(process.env.HEARTBEAT_INTERVAL_MS) || 90000;
26700
27561
  startHeartbeat(heartbeatMs);
26701
27562
  }
26702
27563
  if (process.env.OAUTH_KEEPALIVE_DISABLE !== "true") {
26703
- const { startOAuthKeepalive } = await import("./keepalive-nesm3xb6.js");
27564
+ const { startOAuthKeepalive } = await import("./keepalive-asqtcm4y.js");
26704
27565
  startOAuthKeepalive();
26705
27566
  }
26706
27567
  if (process.env.OAUTH_REFRESH_SWEEP_DISABLE !== "true") {
26707
- const { startOAuthRefreshSweep } = await import("./oauth-refresh-sweep-sh8xjy08.js");
27568
+ const { startOAuthRefreshSweep } = await import("./oauth-refresh-sweep-3s04c6qw.js");
26708
27569
  startOAuthRefreshSweep();
26709
27570
  }
26710
27571
  startOAuthPendingGc();
26711
27572
  await startMemoryGc();
26712
27573
  await startDbRetention();
26713
- import("./boot-reembed-q5wd3tha.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
27574
+ import("./boot-reembed-nafcmmmc.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
26714
27575
  console.error("[boot-reembed] startup backfill failed (non-fatal):", err);
26715
27576
  });
26716
- import("./boot-reembed-msweabbp.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
27577
+ import("./boot-reembed-3cmrrmpa.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
26717
27578
  console.error("[boot-reembed-scripts] startup backfill failed (non-fatal):", err);
26718
27579
  });
26719
- import("./boot-scrub-logs-3g1az933.js").then(({ runBootScrubLogs }) => runBootScrubLogs()).catch((err) => {
27580
+ import("./boot-scrub-logs-cd6a2sq0.js").then(({ runBootScrubLogs }) => runBootScrubLogs()).catch((err) => {
26720
27581
  console.error("[boot-scrub-logs] startup scrub failed (non-fatal):", err);
26721
27582
  });
26722
27583
  }).on("error", (err) => {