@desplega.ai/agent-swarm 1.152.2 → 1.154.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/README.md +2 -2
  2. package/dist/{acp-adapter-pfeje2v5.js → acp-adapter-eb2aj8xy.js} +4 -4
  3. package/dist/{actions-0sttc7f5.js → actions-kpnwp1kz.js} +31 -27
  4. package/dist/{anthropic-messages-2y8nktar.js → anthropic-messages-9vqsbznt.js} +112 -84
  5. package/dist/{app-p8teva95.js → app-zk1apkf6.js} +10 -7
  6. package/dist/{assistant-r45jnsrt.js → assistant-kwq4y50q.js} +32 -28
  7. package/dist/{azure-openai-responses-f38x2avq.js → azure-openai-responses-04qwdwfq.js} +27 -13
  8. package/dist/{boot-reembed-je26h5y7.js → boot-reembed-22hd3jjn.js} +9 -7
  9. package/dist/{boot-reembed-1qmybsd4.js → boot-reembed-qe168424.js} +10 -8
  10. package/dist/{boot-scrub-logs-gte3h1mm.js → boot-scrub-logs-pkdpsrjd.js} +7 -5
  11. package/dist/{claude-adapter-csc1mzka.js → claude-adapter-3fx90nww.js} +18 -16
  12. package/dist/{claude-managed-adapter-dsmkcrjy.js → claude-managed-adapter-ea2aga6w.js} +3 -3
  13. package/dist/{claude-sdk-session-fcd6f078.js → claude-sdk-session-z7fahf1k.js} +18 -16
  14. package/dist/{cli-r2fpe7cx.js → cli-00w2c66p.js} +61 -55
  15. package/dist/{cli-wbyk465z.js → cli-09y3tjxz.js} +1 -1
  16. package/dist/{cli-ht5rs63n.js → cli-0e31nm4n.js} +16 -7
  17. package/dist/cli-0x5qzvkg.js +4279 -0
  18. package/dist/{cli-d3p82erb.js → cli-18amys3y.js} +9 -9
  19. package/dist/{cli-4ahpr4sw.js → cli-1jpjafw4.js} +5 -5
  20. package/dist/{cli-jbmc0r7r.js → cli-243tzws8.js} +1 -1
  21. package/dist/{cli-ch38q5z4.js → cli-24k806sc.js} +6789 -2542
  22. package/dist/cli-3bkz2p7j.js +2828 -0
  23. package/dist/cli-3er6gcsn.js +1849 -0
  24. package/dist/cli-4k7jazkq.js +3339 -0
  25. package/dist/{cli-c4eeb5q2.js → cli-5b6b62tz.js} +1 -1
  26. package/dist/{cli-qd65dvr6.js → cli-5vs0nh43.js} +65 -44
  27. package/dist/{cli-z3wkng35.js → cli-6r3cgpk2.js} +224 -156
  28. package/dist/{cli-pgj4a5fb.js → cli-71cj99hx.js} +4 -3
  29. package/dist/cli-8sea27q4.js +14075 -0
  30. package/dist/{cli-jvy9qgjs.js → cli-913yakhv.js} +22 -7
  31. package/dist/{cli-pf9q3696.js → cli-927erqqt.js} +5 -2
  32. package/dist/cli-95jnpnqg.js +230 -0
  33. package/dist/{cli-wpv5rgg2.js → cli-abp3g4ax.js} +15 -2
  34. package/dist/{cli-ckz5t2hb.js → cli-acy6bfhr.js} +10 -7
  35. package/dist/{cli-4yc5d8fk.js → cli-avkd6mqv.js} +50 -0
  36. package/dist/{cli-8wrympd7.js → cli-bzr0ftht.js} +26 -7
  37. package/dist/{cli-qn042eh7.js → cli-c1v10xb2.js} +194 -1913
  38. package/dist/cli-cgj4hc12.js +18902 -0
  39. package/dist/{cli-2nnd56zt.js → cli-e0pg4zeh.js} +3 -2
  40. package/dist/{cli-r84ctdxn.js → cli-e31ehqwy.js} +2 -2
  41. package/dist/{cli-gphgnvpf.js → cli-e3229na9.js} +3 -3
  42. package/dist/{cli-gpqcs935.js → cli-e3cyf59d.js} +2 -2
  43. package/dist/{cli-s25avqg9.js → cli-e781c6f9.js} +1 -0
  44. package/dist/{cli-s2qjdd6z.js → cli-eetrvv91.js} +1 -1
  45. package/dist/{cli-j4nv2wqy.js → cli-fdzg6jhf.js} +10 -4
  46. package/dist/{cli-fm4ytsdk.js → cli-g2h29qar.js} +2 -2
  47. package/dist/{cli-zvgj5zg8.js → cli-ge67p080.js} +302 -3497
  48. package/dist/cli-h38x0qhg.js +6912 -0
  49. package/dist/{cli-9xvdm3bx.js → cli-h60qfasa.js} +742 -278
  50. package/dist/{cli-jew3jda5.js → cli-hws0vn86.js} +2 -2
  51. package/dist/{cli-j8dggbcr.js → cli-k0g1sjzm.js} +23 -31
  52. package/dist/{cli-xw7vak96.js → cli-kp3qs53m.js} +5 -5
  53. package/dist/{cli-rgvp6r2x.js → cli-mcnhgnn1.js} +193 -4
  54. package/dist/{cli-zvkq5csn.js → cli-myaxtgh8.js} +7 -6
  55. package/dist/{cli-56h18ng2.js → cli-n62atwh9.js} +1 -1
  56. package/dist/cli-n7h1kqpf.js +29 -0
  57. package/dist/{cli-fmy65jdn.js → cli-pf1v8xhb.js} +7 -5
  58. package/dist/{cli-xy1cchaf.js → cli-q85qhckh.js} +238 -11
  59. package/dist/{cli-3bpzj8me.js → cli-r1d3dzt6.js} +2 -2
  60. package/dist/{pi-mono-adapter-jcqt71cg.js → cli-rxkqvngf.js} +67343 -101083
  61. package/dist/{cli-kj76p1ez.js → cli-scwq51gn.js} +13 -7
  62. package/dist/{cli-b9dd0h3k.js → cli-stwsmd6k.js} +3 -2
  63. package/dist/{cli-c2mk1kgf.js → cli-v4en75c5.js} +8 -1
  64. package/dist/{cli-z61ykvam.js → cli-wg04s9kr.js} +4 -3
  65. package/dist/cli-yn0a417a.js +4069 -0
  66. package/dist/{cli-zfzznn7c.js → cli-ytxs7mn1.js} +26 -2
  67. package/dist/{cli-4j8k1m4w.js → cli-zt1227k1.js} +1162 -192
  68. package/dist/cli.js +28 -35
  69. package/dist/{codex-adapter-fxmpsabw.js → codex-adapter-ttdm995v.js} +12 -11
  70. package/dist/{codex-hook-8jexc34x.js → codex-hook-8gx7bcz0.js} +3 -3
  71. package/dist/{codex-session-runner-rr1e47ea.js → codex-session-runner-3v8nh4c8.js} +12 -11
  72. package/dist/{commands-0f5rxz51.js → commands-1cxwbhhq.js} +7 -5
  73. package/dist/{db-r3jxf3wy.js → db-y9zwsr79.js} +25 -5
  74. package/dist/{dispatcher-06vph6q4.js → dispatcher-9m9zss36.js} +30 -26
  75. package/dist/dsh-adapter-gsb2qqf9.js +19 -0
  76. package/dist/{e2b-413b8t4v.js → e2b-93x1k0j5.js} +6 -7
  77. package/dist/{google-generative-ai-ndjmj5fa.js → google-generative-ai-gwwrnzqn.js} +33 -73
  78. package/dist/{google-vertex-fr665tqs.js → google-vertex-5wfawpwz.js} +38 -68
  79. package/dist/{handlers-0hgtc910.js → handlers-36fm1bwn.js} +33 -29
  80. package/dist/{hook-9kvrv1er.js → hook-pntw4r8h.js} +12 -10
  81. package/dist/{hook-fbfhkat3.js → hook-vwq8y26p.js} +13 -11
  82. package/dist/{http-xbyx8k5j.js → http-20jesakk.js} +357 -261
  83. package/dist/{index-jsw3aynb.js → index-6artrehg.js} +30 -26
  84. package/dist/{cli-pdz9qde4.js → index-9ch1n761.js} +10 -11
  85. package/dist/{index-rnyahfn5.js → index-9n5z2492.js} +30 -26
  86. package/dist/{index-66xz5e9j.js → index-h5gs261z.js} +521 -9
  87. package/dist/{index-tfsdxyv6.js → index-j5wrf1yw.js} +40 -25
  88. package/dist/{index-2sp0384z.js → index-kkeftv5h.js} +738 -21
  89. package/dist/{index-sgk50mbg.js → index-m2xqpz5r.js} +31 -27
  90. package/dist/{index-gpfn1741.js → index-m9ks8a7t.js} +9 -7
  91. package/dist/index-w097eg0x.js +5 -0
  92. package/dist/jiti-loader-b4837mtm.js +34 -0
  93. package/dist/jiti-static-loader-q2g5ds0y.js +31267 -0
  94. package/dist/{keepalive-s3xpr7sw.js → keepalive-pwxvxd2c.js} +9 -7
  95. package/dist/{lead-rq4n5r16.js → lead-m789wqa3.js} +46 -41
  96. package/dist/{maintenance-f0atj1ab.js → maintenance-bvg6w7e2.js} +10 -8
  97. package/dist/{mistral-conversations-qhr84ph3.js → mistral-conversations-zx0kn554.js} +24 -18
  98. package/dist/{node-x1g4v0pq.js → node-5qtycf6a.js} +16 -11
  99. package/dist/{oauth-refresh-sweep-q0t3bxre.js → oauth-refresh-sweep-6v4bd737.js} +8 -6
  100. package/dist/{onboard-br5j1kch.js → onboard-snckpcj1.js} +115 -35
  101. package/dist/{openai-codex-responses-wy6a43wd.js → openai-codex-responses-4vjqzvjp.js} +33 -27
  102. package/dist/{openai-completions-32rdwmze.js → openai-completions-pxsmym7g.js} +52 -64
  103. package/dist/{openai-responses-6xwf7bzg.js → openai-responses-tmn0rqp0.js} +23 -24
  104. package/dist/{opencode-adapter-28axqa09.js → opencode-adapter-qbmv4tpy.js} +6 -6
  105. package/dist/{otel-impl-vdqge2nt.js → otel-impl-e0ytens5.js} +4 -4
  106. package/dist/{pi-messages-b1mbr6gp.js → pi-messages-txpjj39q.js} +3 -3
  107. package/dist/pi-mono-adapter-c4ggemhz.js +1316 -0
  108. package/dist/{pricing-refresh-hb3691fd.js → pricing-refresh-52g2ywrw.js} +9 -7
  109. package/dist/{rbac-roles-t78xt39b.js → rbac-roles-5455kfdn.js} +8 -6
  110. package/dist/{rbac-roles-jh280k9g.js → rbac-roles-hbf0xa52.js} +9 -7
  111. package/dist/{render-v2-7p8r2ymg.js → render-v2-npm8xdzh.js} +16 -9
  112. package/dist/{seed-pricing-hf889enh.js → seed-pricing-650wbr1n.js} +8 -6
  113. package/dist/{setup-w6mb03jv.js → setup-k1mew5rf.js} +4 -5
  114. package/dist/virtual-modules-2q5b2pk4.js +54 -0
  115. package/dist/{work-objects-nt8gy1kj.js → work-objects-2ea3kvwg.js} +33 -29
  116. package/dist/{worker-dwy617t0.js → worker-ec6hvc4m.js} +46 -41
  117. package/openapi.json +109 -16
  118. package/package.json +7 -6
  119. package/plugin/opencode-plugins/lib/memory-raters.ts +7 -0
  120. package/src/be/automation-preflight.ts +6 -4
  121. package/src/be/db/agents.ts +75 -2
  122. package/src/be/db/tasks/read.ts +2 -0
  123. package/src/be/db/tasks/write.ts +7 -1
  124. package/src/be/db.ts +140 -18
  125. package/src/be/extensions/db.ts +35 -4
  126. package/src/be/memory/raters/llm.ts +2 -6
  127. package/src/be/memory/raters/noop.ts +2 -3
  128. package/src/be/memory/raters/registry.ts +4 -10
  129. package/src/be/migrations/157_defer_provenance_and_marker.sql +27 -0
  130. package/src/be/models-catalog.ts +2 -0
  131. package/src/be/modelsdev-cache.json +213 -0
  132. package/src/be/rbac-audit.ts +2 -0
  133. package/src/be/seed/agent-fs-provision.ts +23 -0
  134. package/src/be/seed-pricing.ts +3 -1
  135. package/src/be/swarm-config-guard.ts +1 -0
  136. package/src/commands/onboard/compose-generator.ts +16 -1
  137. package/src/commands/onboard/env-generator.ts +14 -1
  138. package/src/commands/onboard/manifest.ts +1 -0
  139. package/src/commands/onboard/steps/integration-slack.tsx +56 -16
  140. package/src/commands/onboard/steps/review.tsx +5 -0
  141. package/src/commands/onboard/types.ts +6 -0
  142. package/src/commands/onboard.tsx +5 -1
  143. package/src/commands/provider-credentials.ts +14 -2
  144. package/src/commands/runner.ts +18 -2
  145. package/src/extensions/identity.ts +15 -7
  146. package/src/extensions/lifecycle.ts +15 -21
  147. package/src/hooks/codex-hook.ts +7 -1
  148. package/src/http/agents.ts +12 -4
  149. package/src/http/config.ts +1 -1
  150. package/src/http/core.ts +5 -3
  151. package/src/http/extensions.ts +108 -34
  152. package/src/http/poll.ts +7 -0
  153. package/src/http/schedules.ts +10 -0
  154. package/src/http/script-runs.ts +35 -26
  155. package/src/http/status.ts +24 -11
  156. package/src/http/tasks.ts +6 -1
  157. package/src/prompts/base-prompt.ts +15 -7
  158. package/src/prompts/memories.ts +5 -7
  159. package/src/prompts/session-templates.ts +3 -2
  160. package/src/prompts/steering-delivery.ts +2 -0
  161. package/src/providers/claude-managed-models.ts +8 -0
  162. package/src/providers/codex-adapter.ts +3 -6
  163. package/src/providers/codex-models.ts +15 -1
  164. package/src/providers/dsh-adapter.ts +248 -0
  165. package/src/providers/index.ts +5 -1
  166. package/src/providers/modelsdev-reasoning.json +50 -0
  167. package/src/providers/pi-mono-extension.ts +2 -5
  168. package/src/rbac/legacy-policy.ts +15 -1
  169. package/src/rbac/types.ts +2 -0
  170. package/src/server.ts +7 -1
  171. package/src/slack/ack.ts +43 -8
  172. package/src/slack/app.ts +32 -10
  173. package/src/slack/config.ts +29 -0
  174. package/src/slack/handlers.ts +7 -1
  175. package/src/slack/render-v2.ts +186 -17
  176. package/src/slack/responses.ts +1 -3
  177. package/src/slack/task-output.ts +66 -8
  178. package/src/slack/thread-buffer.ts +27 -3
  179. package/src/telemetry.ts +2 -3
  180. package/src/tests/agent-fs-provision-seeder.test.ts +56 -2
  181. package/src/tests/agents-harness-provider.test.ts +19 -0
  182. package/src/tests/agents-list-model-display.test.ts +60 -1
  183. package/src/tests/base-prompt.test.ts +25 -0
  184. package/src/tests/claude-managed-adapter.test.ts +6 -0
  185. package/src/tests/codex-gpt6-release.test.ts +97 -0
  186. package/src/tests/codex-steering-hook.test.ts +2 -2
  187. package/src/tests/config-api-only-keys.test.ts +9 -0
  188. package/src/tests/context-window.test.ts +1 -0
  189. package/src/tests/db-task-read-contract.test.ts +9 -0
  190. package/src/tests/db-task-write-contract.test.ts +9 -0
  191. package/src/tests/defer-task.test.ts +115 -16
  192. package/src/tests/dsh-adapter.test.ts +276 -0
  193. package/src/tests/e2e-nightly-report.test.ts +3 -3
  194. package/src/tests/e2e-redact.test.ts +2 -0
  195. package/src/tests/env-flag.test.ts +6 -0
  196. package/src/tests/extension-agent-visibility.test.ts +474 -0
  197. package/src/tests/extensions-db.test.ts +41 -0
  198. package/src/tests/extensions-http.test.ts +148 -4
  199. package/src/tests/extensions-lifecycle.test.ts +21 -1
  200. package/src/tests/extensions-mcp-tools.test.ts +9 -5
  201. package/src/tests/fetch-resolved-env.test.ts +43 -0
  202. package/src/tests/internal-ai/complete-structured.test.ts +32 -9
  203. package/src/tests/internal-ai/credentials.test.ts +4 -4
  204. package/src/tests/internal-ai/models.test.ts +20 -0
  205. package/src/tests/memory-rate-tool.test.ts +7 -10
  206. package/src/tests/memory-rater-defaults.test.ts +23 -0
  207. package/src/tests/memory-rater-e2e.test.ts +2 -3
  208. package/src/tests/migration-046-budgets.test.ts +2 -0
  209. package/src/tests/model-control.test.ts +2 -2
  210. package/src/tests/onboard-compose.test.ts +14 -0
  211. package/src/tests/onboard-env.test.ts +17 -0
  212. package/src/tests/onboard-manifest.test.ts +12 -0
  213. package/src/tests/opus-5-5-registry.test.ts +48 -0
  214. package/src/tests/pricing-refresh.test.ts +1 -1
  215. package/src/tests/pricing-routes.test.ts +15 -3
  216. package/src/tests/provider-registration.test.ts +5 -2
  217. package/src/tests/rbac-admission-e2e.test.ts +54 -0
  218. package/src/tests/rbac-e2e-helpers.ts +2 -0
  219. package/src/tests/rbac-engine.test.ts +32 -0
  220. package/src/tests/rbac-wire-e2e.test.ts +33 -0
  221. package/src/tests/reasoning-effort.test.ts +8 -0
  222. package/src/tests/reload-config.test.ts +33 -0
  223. package/src/tests/script-connections.test.ts +3 -0
  224. package/src/tests/session-costs-model-key-normalize.test.ts +1 -0
  225. package/src/tests/slack-config.test.ts +136 -0
  226. package/src/tests/slack-mode-lifecycle.test.ts +69 -0
  227. package/src/tests/slack-render-v2.test.ts +446 -16
  228. package/src/tests/slack-steering.test.ts +69 -1
  229. package/src/tests/slack-task-output.test.ts +33 -12
  230. package/src/tests/status.test.ts +22 -2
  231. package/src/tests/steering-core.test.ts +35 -0
  232. package/src/tests/steering-delivery.test.ts +39 -0
  233. package/src/tests/steering-transport.test.ts +2 -2
  234. package/src/tests/task-tool-preload-mcp.test.ts +3 -1
  235. package/src/tests/telemetry-init.test.ts +18 -0
  236. package/src/tests/workflow-live-recovery.test.ts +126 -0
  237. package/src/tests/workflow-llm.test.ts +3 -3
  238. package/src/tools/defer-task.ts +64 -26
  239. package/src/tools/extension-common.ts +4 -0
  240. package/src/tools/extension-install.ts +1 -1
  241. package/src/tools/extension-list.ts +4 -3
  242. package/src/tools/join-swarm.ts +1 -1
  243. package/src/tools/schedules/create-schedule.ts +11 -1
  244. package/src/tools/schedules/patch-schedule.ts +5 -0
  245. package/src/tools/schedules/update-schedule.ts +5 -0
  246. package/src/tools/send-task.ts +6 -0
  247. package/src/tools/utils.ts +1 -1
  248. package/src/types.ts +30 -8
  249. package/src/utils/context-window.ts +1 -0
  250. package/src/utils/credentials.ts +8 -0
  251. package/src/utils/internal-ai/complete-structured.ts +8 -0
  252. package/src/utils/internal-ai/models.ts +5 -5
  253. package/src/utils/memory-raters.ts +3 -0
  254. package/src/workflows/engine.ts +28 -0
  255. package/src/workflows/recovery.ts +7 -4
  256. package/templates/schedules/daily-status-report/content.md +25 -12
  257. package/templates/schedules/daily-workflow-health-audit/content.md +1 -1
  258. package/templates/skills/swarm-extensions/content.md +9 -5
  259. package/dist/cli-4wppfkcm.js +0 -16384
  260. package/dist/cli-55qrx3q8.js +0 -6041
  261. package/dist/cli-cg4vnyh4.js +0 -305
  262. package/dist/cli-jyetr64j.js +0 -52
  263. package/dist/cli-pp9ax9pa.js +0 -520
  264. package/dist/cli-qa66qaf0.js +0 -6076
  265. package/dist/cli-qghpvca2.js +0 -590
  266. package/dist/cli-rembwgt8.js +0 -861
  267. package/dist/cli-tcvj7j2r.js +0 -1971
  268. package/dist/cli-vfcth11k.js +0 -36
  269. package/dist/cli-w1d1bgkk.js +0 -1422
  270. package/dist/cli-y6x0gqtg.js +0 -5977
  271. package/dist/es5-tj3tn4jj.js +0 -844
  272. package/dist/index-1kq5hw2p.js +0 -467
  273. package/dist/index-1p8wdstt.js +0 -7
  274. package/dist/index-8fdjzb2f.js +0 -100
  275. package/dist/index-bxmwzbgw.js +0 -365
  276. package/dist/index-nzerxd5z.js +0 -7
  277. package/dist/index-pyymnzat.js +0 -1168
  278. package/dist/index-qv6atbab.js +0 -619
  279. package/dist/index-rja32qa7.js +0 -801
  280. package/dist/index-tzg5srfp.js +0 -211
  281. package/dist/index-vhncw983.js +0 -90
  282. package/dist/index-xk036zsk.js +0 -859
  283. package/dist/index-zyazbzcb.js +0 -6
  284. package/dist/{claude-managed-setup-48dwg9bv.js → claude-managed-setup-f5pmsyrp.js} +3 -3
@@ -8,17 +8,22 @@ import {
8
8
  import {
9
9
  SIMILARITY_THRESHOLD,
10
10
  writeSkillsToFilesystem
11
- } from "./cli-pf9q3696.js";
11
+ } from "./cli-927erqqt.js";
12
12
  import {
13
13
  Anthropic
14
14
  } from "./cli-j490egb5.js";
15
+ import {
16
+ checkHeartbeatChecklist,
17
+ runHeartbeatSweep,
18
+ stopHeartbeat
19
+ } from "./cli-e3229na9.js";
15
20
  import {
16
21
  isClaudeBridgeEffective,
17
22
  resolveClaudeTransport
18
23
  } from "./cli-eree7rnv.js";
19
24
  import {
20
25
  reasoningCapability
21
- } from "./cli-4yc5d8fk.js";
26
+ } from "./cli-avkd6mqv.js";
22
27
  import {
23
28
  SCRIPT_SDK_TYPES,
24
29
  SCRIPT_STDLIB_MODULE_TYPES,
@@ -31,12 +36,7 @@ import {
31
36
  scriptStdlibTypesWithGeneratedApis,
32
37
  typecheckScript,
33
38
  typecheckWithAmbient
34
- } from "./cli-wpv5rgg2.js";
35
- import {
36
- checkHeartbeatChecklist,
37
- runHeartbeatSweep,
38
- stopHeartbeat
39
- } from "./cli-gphgnvpf.js";
39
+ } from "./cli-abp3g4ax.js";
40
40
  import {
41
41
  AGENT_MAX_TASKS_CONFIG_KEY,
42
42
  ALL_CAPABILITIES,
@@ -46,6 +46,7 @@ import {
46
46
  ExplicitSelfDuplicateError,
47
47
  ExtensionConfigError,
48
48
  ExtensionLifecycleError,
49
+ ExtensionOwnershipError,
49
50
  JSONRPCMessageSchema,
50
51
  MAX_TASK_ATTACHMENT_BYTES,
51
52
  McpServer,
@@ -285,12 +286,12 @@ import {
285
286
  verifyWebhookSignature,
286
287
  warnIfCorsAllowsAnyOrigin,
287
288
  wireHttpSpanLifecycle
288
- } from "./cli-z3wkng35.js";
289
+ } from "./cli-6r3cgpk2.js";
289
290
  import"./cli-0z2v4nhw.js";
290
291
  import {
291
292
  REFERENCES_SOURCE_MAX_LENGTH,
292
293
  sanitizeReferencesSource
293
- } from "./cli-4wppfkcm.js";
294
+ } from "./cli-3bkz2p7j.js";
294
295
  import {
295
296
  deriveCodexKeySuffix,
296
297
  getValidCodexOAuth,
@@ -300,19 +301,24 @@ import {
300
301
  isMultiRuntimeEnabled
301
302
  } from "./cli-re8z5p8p.js";
302
303
  import"./cli-3dpj7atn.js";
304
+ import"./cli-8sea27q4.js";
303
305
  import {
304
306
  getModelsCatalog
305
- } from "./cli-b9dd0h3k.js";
307
+ } from "./cli-stwsmd6k.js";
308
+ import {
309
+ normalizeModelKey
310
+ } from "./cli-e0pg4zeh.js";
306
311
  import {
307
312
  getUserGrant
308
- } from "./cli-r84ctdxn.js";
313
+ } from "./cli-e31ehqwy.js";
309
314
  import {
315
+ LEGACY_RULES,
310
316
  can,
311
317
  clearAuditSink,
312
318
  decideToolAdmission,
313
319
  isRbacEnabled,
314
320
  setAuditSink
315
- } from "./cli-zfzznn7c.js";
321
+ } from "./cli-ytxs7mn1.js";
316
322
  import {
317
323
  ConnectionAuthInputSchema,
318
324
  MAX_SCRIPT_WALL_CLOCK_MS,
@@ -395,7 +401,7 @@ import {
395
401
  upsertScriptByName,
396
402
  upsertScriptConnection,
397
403
  validateDefinition
398
- } from "./cli-fmy65jdn.js";
404
+ } from "./cli-pf1v8xhb.js";
399
405
  import"./cli-epan13p1.js";
400
406
  import {
401
407
  detachedProcessGroup,
@@ -407,7 +413,6 @@ import {
407
413
  import {
408
414
  getApiKey
409
415
  } from "./cli-f14fvzag.js";
410
- import"./cli-fad8m16k.js";
411
416
  import {
412
417
  acquireOAuthRefreshLock,
413
418
  buildAuthorizationUrl,
@@ -431,14 +436,27 @@ import {
431
436
  updateAuthorizationIdentity,
432
437
  updateOAuthAppById,
433
438
  upsertAuthorization
434
- } from "./cli-56h18ng2.js";
435
- import {
436
- normalizeModelKey
437
- } from "./cli-2nnd56zt.js";
439
+ } from "./cli-n62atwh9.js";
438
440
  import"./cli-bsakbbkm.js";
441
+ import"./cli-fad8m16k.js";
442
+ import {
443
+ FilesError,
444
+ getFileStorageProvider,
445
+ normalizeFilesError
446
+ } from "./cli-jsp14b6c.js";
439
447
  import {
440
448
  searchScripts
441
- } from "./cli-gpqcs935.js";
449
+ } from "./cli-e3cyf59d.js";
450
+ import {
451
+ CANDIDATE_SET_MULTIPLIER,
452
+ getEmbeddingProvider,
453
+ getMemoryStore,
454
+ init_constants as init_constants2,
455
+ init_reranker,
456
+ rerank
457
+ } from "./cli-hws0vn86.js";
458
+ import"./cli-g2h29qar.js";
459
+ import"./cli-aehm1rbq.js";
442
460
  import"./cli-51tf7ac3.js";
443
461
  import {
444
462
  ensure,
@@ -455,149 +473,22 @@ import {
455
473
  withRemoteContext,
456
474
  withSpan,
457
475
  withSpanContext
458
- } from "./cli-qn042eh7.js";
476
+ } from "./cli-c1v10xb2.js";
459
477
  import"./cli-q51yprfq.js";
478
+ import"./cli-3er6gcsn.js";
460
479
  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-jew3jda5.js";
469
- import"./cli-fm4ytsdk.js";
470
- import"./cli-aehm1rbq.js";
471
480
  import"./cli-2658f6at.js";
472
481
  import {
473
- FilesError,
474
- getFileStorageProvider,
475
- normalizeFilesError
476
- } from "./cli-jsp14b6c.js";
477
- import {
478
- ActiveSessionSchema,
479
- AgentAcpStatusSchema,
480
- AgentAvatarSchema,
481
- AgentCredStatusSchema,
482
- AgentLatestModelSchema,
483
- AgentLogSchema,
484
- AgentMcpServerSchema,
485
- AgentMemorySchema,
486
- AgentMemoryScopeSchema,
487
- AgentMemorySourceSchema,
488
- AgentSchema,
489
- AgentSkillSchema,
490
- AgentStatusSchema,
491
- AgentTaskSchema,
492
- AgentTaskSourceSchema,
493
- AgentTaskStatusSchema,
494
- AgentWithTasksSchema,
495
- AssetEntityTypeSchema,
496
- AssetKeyMappingSchema,
497
- AssetKeySchema,
498
- AssetSummarySchema,
499
- AutomationIntegrationIdSchema,
500
- BudgetRefusalNotificationSchema,
501
- BudgetRefusedTriggerSchema,
502
- BudgetSchema,
503
- BudgetScopeSchema,
504
- ContextFormulaSchema,
505
- ContextSnapshotEventTypeSchema,
506
- ContextSnapshotSchema,
507
- CooldownConfigSchema,
508
482
  CredentialBindingSchema,
509
483
  DB_RETENTION_TUNING_BOUNDS,
510
- EventCategorySchema,
511
- EventNameSchema,
512
- EventSourceSchema,
513
- EventStatusSchema,
514
- ExtensionInstallBodySchema,
515
- ExtensionManifestSchema,
516
- ExtensionRunSchema,
517
- ExtensionSchema,
518
- ExtensionVersionSchema,
519
- FavoriteItemTypeSchema,
484
+ EXTENSION_AGENT_ROLE,
485
+ ExtensionAgentAssignmentError,
520
486
  HeartbeatExpiryError,
521
- InboxItemStateSchema,
522
- InboxItemStatusSchema,
523
- InboxItemTypeSchema,
524
- InputValueSchema,
525
- KvEntrySchema,
526
- KvKeySchema,
527
- KvNamespaceSchema,
528
487
  KvTypeCollisionError,
529
- KvValueTypeSchema,
530
488
  MAX_DB_RETENTION_DAYS,
531
- McpAuthMethodSchema,
532
- McpServerSchema,
533
- McpServerWithInstallInfoSchema,
534
- MetricDefinitionSchema,
535
- MetricSchema,
536
- MetricVersionSchema,
537
- MetricWidgetSchema,
538
- ModelTierSchema,
539
- OnUnsupportedSchema,
540
- PageAuthModeSchema,
541
- PageContentTypeSchema,
542
- PageSchema,
543
- PageVersionSchema,
544
- PricingProviderSchema,
545
- PricingRowSchema,
546
- PricingTokenClassSchema,
547
- PromptTemplateHistorySchema,
548
- PromptTemplateSchema,
549
- ProviderNameSchema,
550
- ReasoningEffortSchema,
551
- RepoGuidelinesInputSchema,
552
- RepoHooksSchema,
553
- ResumeReasonSchema,
554
- RoutingReasonSchema,
555
- RuntimeInstanceSchema,
556
- ScheduledTaskSchema,
557
- ScheduledTaskTargetTypeSchema,
558
- ScriptApiAuthModeSchema,
559
- ScriptApiRecordSchema,
560
- ScriptFsModeSchema,
561
- ScriptRecordSchema,
562
- ScriptRunJournalEntrySchema,
563
- ScriptRunListItemSchema,
564
- ScriptRunSchema,
565
- ScriptRunStatusSchema,
566
- ScriptScopeSchema,
567
- ScriptVersionRecordSchema,
568
- ServiceSchema,
569
- SessionCostModelBreakdownSchema,
570
- SessionCostSchema,
571
- SessionLogSchema,
572
- SkillFileSchema,
573
- SkillSchema,
574
- SkillWithInstallInfoSchema,
575
- SteerModeSchema,
576
- SteerResultSchema,
577
- SteeringMessageSchema,
489
+ NOT_EXTENSION_AGENT_SQL,
490
+ ReservedAgentRoleError,
578
491
  SteeringRequestError,
579
- SteeringSourceSchema,
580
- SwarmConfigSchema,
581
- SwarmEventSchema,
582
- SwarmRepoSchema,
583
- TERMINAL_SCRIPT_RUN_STATUSES,
584
- TaskAttachmentSchema,
585
- TaskTemplateKindSchema,
586
- TaskTemplateSchema,
587
- TriggerConfigSchema,
588
- UserCommsPrefsSchema,
589
- UserFavoriteSchema,
590
- UserSchema,
591
- VersionableFieldSchema,
592
- WorkflowDefinitionSchema,
593
- WorkflowEdgeSchema,
594
- WorkflowNodePatchSchema,
595
- WorkflowPatchSchema,
596
- WorkflowRunSchema,
597
- WorkflowRunStatusSchema,
598
- WorkflowRunStepSchema,
599
- WorkflowSchema,
600
- WorkflowVersionSchema,
601
492
  _resolveIntegrationProvider,
602
493
  _resolveIntegrationType,
603
494
  agentContextKey,
@@ -662,6 +553,7 @@ import {
662
553
  emitBuiltInIntegrationConnectedOnce,
663
554
  emitIntegrationConnected,
664
555
  emitMcpServerConnectedTelemetry,
556
+ extensionAgentAssignmentError,
665
557
  failTask,
666
558
  getActivePricingRow,
667
559
  getActiveSessions,
@@ -768,7 +660,6 @@ import {
768
660
  incrementPageViewCount,
769
661
  initTelemetry,
770
662
  init_asset_key_audit,
771
- init_bundle_path,
772
663
  init_context_key,
773
664
  init_credential_broker,
774
665
  init_date_utils,
@@ -781,15 +672,13 @@ import {
781
672
  init_task_tool_manifest,
782
673
  init_telemetry,
783
674
  init_templates,
784
- init_types,
785
675
  insertActiveSession,
786
676
  insertPricingRow,
787
677
  installMcpServer,
788
678
  installSkill,
679
+ isExtensionAgent,
789
680
  isReservedConfigKey,
790
- isSafeBundlePath,
791
681
  isSteeringEnabled as isSteeringEnabled2,
792
- isTerminalTaskStatus,
793
682
  listAgentsWithCredStatusByProvider,
794
683
  listAllMetrics,
795
684
  listAllPages,
@@ -840,7 +729,6 @@ import {
840
729
  setApiKeyName,
841
730
  setFavorite,
842
731
  setRequestAuth,
843
- splitLegacyModelAlias,
844
732
  startTask,
845
733
  supersedeTask,
846
734
  sweepExpiredKv,
@@ -884,12 +772,136 @@ import {
884
772
  upsertSwarmConfig,
885
773
  validateConfigValue,
886
774
  withFavoriteFlags
887
- } from "./cli-zvgj5zg8.js";
775
+ } from "./cli-ge67p080.js";
776
+ import {
777
+ ActiveSessionSchema,
778
+ AgentAcpStatusSchema,
779
+ AgentAvatarSchema,
780
+ AgentCredStatusSchema,
781
+ AgentLatestModelSchema,
782
+ AgentLogSchema,
783
+ AgentMcpServerSchema,
784
+ AgentMemorySchema,
785
+ AgentMemoryScopeSchema,
786
+ AgentMemorySourceSchema,
787
+ AgentSchema,
788
+ AgentSkillSchema,
789
+ AgentStatusSchema,
790
+ AgentTaskSchema,
791
+ AgentTaskSourceSchema,
792
+ AgentTaskStatusSchema,
793
+ AgentWithTasksSchema,
794
+ AssetEntityTypeSchema,
795
+ AssetKeyMappingSchema,
796
+ AssetKeySchema,
797
+ AssetSummarySchema,
798
+ AutomationIntegrationIdSchema,
799
+ BudgetRefusalNotificationSchema,
800
+ BudgetRefusedTriggerSchema,
801
+ BudgetSchema,
802
+ BudgetScopeSchema,
803
+ ContextFormulaSchema,
804
+ ContextSnapshotEventTypeSchema,
805
+ ContextSnapshotSchema,
806
+ CooldownConfigSchema,
807
+ EventCategorySchema,
808
+ EventNameSchema,
809
+ EventSourceSchema,
810
+ EventStatusSchema,
811
+ ExtensionInstallBodySchema,
812
+ ExtensionManifestSchema,
813
+ ExtensionRunSchema,
814
+ ExtensionSchema,
815
+ ExtensionVersionSchema,
816
+ FavoriteItemTypeSchema,
817
+ InboxItemStateSchema,
818
+ InboxItemStatusSchema,
819
+ InboxItemTypeSchema,
820
+ InputValueSchema,
821
+ KvEntrySchema,
822
+ KvKeySchema,
823
+ KvNamespaceSchema,
824
+ KvValueTypeSchema,
825
+ McpAuthMethodSchema,
826
+ McpServerSchema,
827
+ McpServerWithInstallInfoSchema,
828
+ MetricDefinitionSchema,
829
+ MetricSchema,
830
+ MetricVersionSchema,
831
+ MetricWidgetSchema,
832
+ ModelTierSchema,
833
+ OnUnsupportedSchema,
834
+ PageAuthModeSchema,
835
+ PageContentTypeSchema,
836
+ PageSchema,
837
+ PageVersionSchema,
838
+ PricingProviderSchema,
839
+ PricingRowSchema,
840
+ PricingTokenClassSchema,
841
+ PromptTemplateHistorySchema,
842
+ PromptTemplateSchema,
843
+ ProviderNameSchema,
844
+ ReasoningEffortSchema,
845
+ RepoGuidelinesInputSchema,
846
+ RepoHooksSchema,
847
+ ResumeReasonSchema,
848
+ RoutingReasonSchema,
849
+ RuntimeInstanceSchema,
850
+ ScheduledTaskSchema,
851
+ ScheduledTaskTargetTypeSchema,
852
+ ScriptApiAuthModeSchema,
853
+ ScriptApiRecordSchema,
854
+ ScriptFsModeSchema,
855
+ ScriptRecordSchema,
856
+ ScriptRunJournalEntrySchema,
857
+ ScriptRunListItemSchema,
858
+ ScriptRunSchema,
859
+ ScriptRunStatusSchema,
860
+ ScriptScopeSchema,
861
+ ScriptVersionRecordSchema,
862
+ ServiceSchema,
863
+ SessionCostModelBreakdownSchema,
864
+ SessionCostSchema,
865
+ SessionLogSchema,
866
+ SkillFileSchema,
867
+ SkillSchema,
868
+ SkillWithInstallInfoSchema,
869
+ SteerModeSchema,
870
+ SteerResultSchema,
871
+ SteeringMessageSchema,
872
+ SteeringSourceSchema,
873
+ SwarmConfigSchema,
874
+ SwarmEventSchema,
875
+ SwarmRepoSchema,
876
+ TERMINAL_SCRIPT_RUN_STATUSES,
877
+ TaskAttachmentSchema,
878
+ TaskTemplateKindSchema,
879
+ TaskTemplateSchema,
880
+ TriggerConfigSchema,
881
+ UserCommsPrefsSchema,
882
+ UserFavoriteSchema,
883
+ UserSchema,
884
+ VersionableFieldSchema,
885
+ WorkflowDefinitionSchema,
886
+ WorkflowEdgeSchema,
887
+ WorkflowNodePatchSchema,
888
+ WorkflowPatchSchema,
889
+ WorkflowRunSchema,
890
+ WorkflowRunStatusSchema,
891
+ WorkflowRunStepSchema,
892
+ WorkflowSchema,
893
+ WorkflowVersionSchema,
894
+ init_bundle_path,
895
+ init_types,
896
+ isSafeBundlePath,
897
+ isTerminalTaskStatus,
898
+ splitLegacyModelAlias
899
+ } from "./cli-4k7jazkq.js";
888
900
  import {
889
901
  IDENTITY_FIELD_BUDGETS,
890
902
  IdentityFieldBudgetError,
891
903
  init_identity_field_budget
892
- } from "./cli-ht5rs63n.js";
904
+ } from "./cli-0e31nm4n.js";
893
905
  import {
894
906
  getAllTemplateDefinitions,
895
907
  getTemplateDefinition,
@@ -900,7 +912,8 @@ import {
900
912
  interpolate,
901
913
  isSteeringEnabled,
902
914
  resolveTemplate
903
- } from "./cli-z61ykvam.js";
915
+ } from "./cli-wg04s9kr.js";
916
+ import"./cli-v4en75c5.js";
904
917
  import {
905
918
  MAX_PROFILE_FILE_LENGTH,
906
919
  getAppUrl,
@@ -909,7 +922,10 @@ import {
909
922
  getPublicMcpBaseUrl,
910
923
  init_constants
911
924
  } from "./cli-dv6cdjs2.js";
912
- import"./cli-c2mk1kgf.js";
925
+ import {
926
+ getSlackConfiguration,
927
+ init_config
928
+ } from "./cli-n7h1kqpf.js";
913
929
  import {
914
930
  init_env_flag,
915
931
  isEnvFlagEnabled,
@@ -930,13 +946,31 @@ import {
930
946
  import {
931
947
  init_package,
932
948
  package_default
933
- } from "./cli-zvkq5csn.js";
949
+ } from "./cli-myaxtgh8.js";
934
950
  import {
935
951
  init_secret_scrubber,
936
952
  registerVolatileSecret,
937
953
  scrubObject,
938
954
  scrubSecrets
939
955
  } from "./cli-r2ap2czm.js";
956
+ import {
957
+ bedrockProviderModule
958
+ } from "./cli-h38x0qhg.js";
959
+ import"./cli-yn0a417a.js";
960
+ import"./cli-cgj4hc12.js";
961
+ import"./cli-txgcknmy.js";
962
+ import"./cli-6map995v.js";
963
+ import"./cli-k0g1sjzm.js";
964
+ import"./cli-y2apkfe2.js";
965
+ import"./cli-vapyk8sw.js";
966
+ import {
967
+ setBedrockProviderModule
968
+ } from "./cli-5b6b62tz.js";
969
+ import"./cli-btbzvq95.js";
970
+ import"./cli-1m2e086m.js";
971
+ import"./cli-mcnhgnn1.js";
972
+ import"./cli-bzr0ftht.js";
973
+ import"./cli-bd957dgb.js";
940
974
  import {
941
975
  import_websocket,
942
976
  import_websocket_server
@@ -950,31 +984,6 @@ import {
950
984
  init_bus,
951
985
  realtimeBus
952
986
  } from "./cli-zf8jjwex.js";
953
- import {
954
- bedrockProviderModule
955
- } from "./cli-y6x0gqtg.js";
956
- import"./cli-cg4vnyh4.js";
957
- import"./cli-txgcknmy.js";
958
- import"./cli-6map995v.js";
959
- import"./cli-j8dggbcr.js";
960
- import"./cli-y2apkfe2.js";
961
- import"./cli-vapyk8sw.js";
962
- import"./cli-pdz9qde4.js";
963
- import {
964
- setBedrockProviderModule
965
- } from "./cli-c4eeb5q2.js";
966
- import"./cli-rgvp6r2x.js";
967
- import"./cli-btbzvq95.js";
968
- import"./cli-1m2e086m.js";
969
- import"./cli-8wrympd7.js";
970
- import"./cli-bd957dgb.js";
971
- import"./cli-jyetr64j.js";
972
- import"./cli-w1d1bgkk.js";
973
- import"./cli-qghpvca2.js";
974
- import"./cli-55qrx3q8.js";
975
- import"./cli-rembwgt8.js";
976
- import"./cli-tcvj7j2r.js";
977
- import"./cli-qa66qaf0.js";
978
987
  import {
979
988
  __require,
980
989
  __toESM
@@ -3350,7 +3359,7 @@ var setAgentHarnessProviderRoute = route({
3350
3359
  404: { description: "Agent not found" }
3351
3360
  }
3352
3361
  });
3353
- var LocalHarnessProviderSchema = exports_external.enum(["claude", "codex", "pi", "opencode", "acp"]);
3362
+ var LocalHarnessProviderSchema = exports_external.enum(["claude", "codex", "pi", "opencode", "acp", "dsh"]);
3354
3363
  var AcpRuntimeConfigSchema = exports_external.object({
3355
3364
  target: exports_external.enum(ACP_TARGET_IDS),
3356
3365
  command: exports_external.string().trim().min(1).nullable().optional(),
@@ -3466,7 +3475,7 @@ var listAgents = route({
3466
3475
  path: "/api/agents",
3467
3476
  pattern: ["api", "agents"],
3468
3477
  summary: "List all agents",
3469
- description: "Returns agents WITHOUT the six identity-markdown blobs (`claudeMd`/`soulMd`/`identityMd`/`toolsMd`/`heartbeatMd`/`setupScript`) by default — they bloat the list by ~16 KB/agent and the overview never renders them. Pass `fields=full` to restore them, or fetch a single agent via `GET /api/agents/{id}`.",
3478
+ description: "Returns agents WITHOUT the six identity-markdown blobs (`claudeMd`/`soulMd`/`identityMd`/`toolsMd`/`heartbeatMd`/`setupScript`) by default — they bloat the list by ~16 KB/agent and the overview never renders them. Pass `fields=full` to restore them, or fetch a single agent via `GET /api/agents/{id}`. Extension identities (`ext:<name>`, role `extension`) are never listed; they are API principals, not workers.",
3470
3479
  tags: ["Agents"],
3471
3480
  query: exports_external.object({
3472
3481
  include: exports_external.enum(["tasks"]).optional(),
@@ -3661,6 +3670,10 @@ async function handleAgentRegister(req, res, pathSegments, myAgentId) {
3661
3670
  const parsed = await registerAgent.parse(req, res, pathSegments, new URLSearchParams);
3662
3671
  if (!parsed)
3663
3672
  return true;
3673
+ if (parsed.body.role === EXTENSION_AGENT_ROLE) {
3674
+ jsonError(res, `Role "${EXTENSION_AGENT_ROLE}" is reserved for extension identities.`, 400);
3675
+ return true;
3676
+ }
3664
3677
  const agentId = myAgentId || crypto.randomUUID();
3665
3678
  const multiRuntime = isMultiRuntimeEnabled();
3666
3679
  if (multiRuntime && parsed.body.runtimeInstanceId) {
@@ -3869,7 +3882,7 @@ async function handleAgentsRest(req, res, pathSegments, queryParams, _myAgentId)
3869
3882
  onConflict: (conflict) => conflicts.push(conflict)
3870
3883
  });
3871
3884
  } catch (error) {
3872
- if (error instanceof HeartbeatExpiryError) {
3885
+ if (error instanceof HeartbeatExpiryError || error instanceof ReservedAgentRoleError) {
3873
3886
  jsonError(res, error.message, 400);
3874
3887
  return true;
3875
3888
  }
@@ -4007,7 +4020,7 @@ async function handleAgentsRest(req, res, pathSegments, queryParams, _myAgentId)
4007
4020
  scopeId: parsed.params.id,
4008
4021
  key: "MODEL_OVERRIDE"
4009
4022
  }))[0]?.value ?? "";
4010
- const allowedLevels = harness_provider === "acp" ? [] : reasoningCapability(harness_provider, modelForValidation ?? "").levels;
4023
+ const allowedLevels = harness_provider === "acp" || harness_provider === "dsh" ? [] : reasoningCapability(harness_provider, modelForValidation ?? "").levels;
4011
4024
  if (!allowedLevels.includes(reasoning_effort)) {
4012
4025
  json(res, {
4013
4026
  error: "Unsupported reasoning_effort for this harness/model",
@@ -5533,7 +5546,7 @@ init_request_auth_context();
5533
5546
  init_secret_scrubber();
5534
5547
  var MAX_ENV_PRESENCE_KEYS = 200;
5535
5548
  var SECRETS_FORCE_MASK_NOTE = " (secret values masked: reading unmasked secrets requires the lead agent)";
5536
- var API_ONLY_CONFIG_KEYS = new Set(["API_AGENT_FS_API_KEY"]);
5549
+ var API_ONLY_CONFIG_KEYS = new Set(["API_AGENT_FS_API_KEY", "SLACK_SIGNING_SECRET"]);
5537
5550
  function stripApiOnlyKeys(configs) {
5538
5551
  return configs.filter((config) => !API_ONLY_CONFIG_KEYS.has(config.key));
5539
5552
  }
@@ -6888,6 +6901,7 @@ var installRoute = route({
6888
6901
  pattern: ["api", "extensions", "install"],
6889
6902
  operationId: "extensions_install",
6890
6903
  summary: "Validate and install an extension bundle",
6904
+ description: "Any authenticated agent can install a disabled draft owned by its agent ID. Workers can update only their own bundles; activation remains lead/operator-only.",
6891
6905
  tags: ["Extensions"],
6892
6906
  body: ExtensionInstallBodySchema,
6893
6907
  responses: {
@@ -6991,6 +7005,7 @@ var patchRoute = route({
6991
7005
  pattern: ["api", "extensions", null],
6992
7006
  operationId: "extensions_update",
6993
7007
  summary: "Update extension priority, config, or description",
7008
+ description: "Workers may edit their own disabled extensions. Leads, operators, and dashboard users retain access to all extensions.",
6994
7009
  tags: ["Extensions"],
6995
7010
  params: idParamsSchema,
6996
7011
  body: exports_external.object({
@@ -7012,6 +7027,7 @@ var deleteRoute = route({
7012
7027
  pattern: ["api", "extensions", null],
7013
7028
  operationId: "extensions_delete",
7014
7029
  summary: "Uninstall a disabled extension",
7030
+ description: "Workers may uninstall their own disabled extensions. Leads, operators, and dashboard users retain access to all extensions.",
7015
7031
  tags: ["Extensions"],
7016
7032
  params: idParamsSchema,
7017
7033
  responses: {
@@ -7121,16 +7137,19 @@ async function extensionPrincipal(req, callerAgentId) {
7121
7137
  return { kind: "user", userId: auth.userId };
7122
7138
  return { kind: "agent", agentId: "", isLead: false };
7123
7139
  }
7124
- async function requirePermission(req, res, callerAgentId, verb) {
7140
+ function ownerOnlyAgentId(principal) {
7141
+ return principal.kind === "agent" && !LEGACY_RULES["lead-or-operator-or-user"].evaluate(principal, undefined) ? principal.agentId : undefined;
7142
+ }
7143
+ async function requirePermission(req, res, callerAgentId, verb, resource = { kind: "none" }) {
7125
7144
  const principal = await extensionPrincipal(req, callerAgentId);
7126
- const decision = can({ principal, verb, resource: { kind: "none" }, source: "http" });
7145
+ const decision = can({ principal, verb, resource, source: "http" });
7127
7146
  if (decision.allow)
7128
7147
  return principal;
7129
7148
  jsonError(res, `Forbidden: ${decision.reason}`, 403);
7130
7149
  return null;
7131
7150
  }
7132
7151
  function respondLifecycleError(res, error) {
7133
- const status = error instanceof ExtensionConfigError ? 400 : error instanceof ExtensionLifecycleError ? error.status : 500;
7152
+ const status = error instanceof ExtensionOwnershipError ? 403 : error instanceof ExtensionConfigError ? 400 : error instanceof ExtensionLifecycleError ? error.status : 500;
7134
7153
  jsonError(res, scrubSecrets(error instanceof Error ? error.message : String(error)), status);
7135
7154
  }
7136
7155
  async function handleExtensions(req, res, pathSegments, queryParams, agentId) {
@@ -7138,7 +7157,12 @@ async function handleExtensions(req, res, pathSegments, queryParams, agentId) {
7138
7157
  const parsed = await installRoute.parse(req, res, pathSegments, queryParams);
7139
7158
  if (!parsed)
7140
7159
  return true;
7141
- const principal = await requirePermission(req, res, agentId, "extension.write");
7160
+ const existing = await getExtensionByName(parsed.body.manifest.name);
7161
+ const principal = await requirePermission(req, res, agentId, "extension.write", {
7162
+ kind: "extension",
7163
+ extensionId: existing?.id,
7164
+ createdByAgentId: existing?.createdByAgentId
7165
+ });
7142
7166
  if (!principal)
7143
7167
  return true;
7144
7168
  const validation = await validateBundle(parsed.body);
@@ -7146,19 +7170,28 @@ async function handleExtensions(req, res, pathSegments, queryParams, agentId) {
7146
7170
  json(res, { error: "extension_validation_failed", diagnostics: validation.diagnostics }, 400);
7147
7171
  return true;
7148
7172
  }
7149
- const existing = await getExtensionByName(validation.manifest.name);
7150
7173
  const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
7151
7174
  const updatedBy = await resolveHttpAuditUserId(req, writerAgentId);
7152
7175
  const shouldActivate = principal.kind !== "agent" && existing?.enabled === true;
7153
- const result = await installExtension({
7154
- manifest: validation.manifest,
7155
- files: parsed.body.files,
7156
- priority: parsed.body.priority,
7157
- config: parsed.body.config,
7158
- agentId: writerAgentId,
7159
- createdBy: updatedBy,
7160
- activate: shouldActivate
7161
- });
7176
+ const ownerOnly = ownerOnlyAgentId(principal);
7177
+ let result;
7178
+ try {
7179
+ result = await installExtension({
7180
+ manifest: validation.manifest,
7181
+ files: parsed.body.files,
7182
+ priority: parsed.body.priority,
7183
+ config: parsed.body.config,
7184
+ agentId: writerAgentId,
7185
+ createdBy: updatedBy,
7186
+ activate: shouldActivate,
7187
+ ownerOnly
7188
+ });
7189
+ } catch (error) {
7190
+ if (!(error instanceof ExtensionOwnershipError))
7191
+ throw error;
7192
+ jsonError(res, error.message, 403);
7193
+ return true;
7194
+ }
7162
7195
  let extension = result.extension;
7163
7196
  if (shouldActivate) {
7164
7197
  try {
@@ -7236,17 +7269,36 @@ async function handleExtensions(req, res, pathSegments, queryParams, agentId) {
7236
7269
  const parsed = await patchRoute.parse(req, res, pathSegments, queryParams);
7237
7270
  if (!parsed)
7238
7271
  return true;
7239
- const principal = await requirePermission(req, res, agentId, "extension.write");
7272
+ const stored = await getExtensionById(parsed.params.id);
7273
+ if (!stored) {
7274
+ jsonError(res, "Extension not found", 404);
7275
+ return true;
7276
+ }
7277
+ const principal = await requirePermission(req, res, agentId, "extension.write", {
7278
+ kind: "extension",
7279
+ extensionId: stored.id,
7280
+ createdByAgentId: stored.createdByAgentId
7281
+ });
7240
7282
  if (!principal)
7241
7283
  return true;
7242
7284
  const writerAgentId = principal.kind === "agent" ? principal.agentId : undefined;
7243
- const stored = parsed.body.config ? await getExtensionById(parsed.params.id) : null;
7244
- const config = parsed.body.config && stored ? preserveRedactedConfigValues(parsed.body.config, stored.configJson) : parsed.body.config;
7245
- let extension = await updateExtensionMeta(parsed.params.id, {
7246
- ...parsed.body,
7247
- ...config === undefined ? {} : { config },
7248
- updatedBy: await resolveHttpAuditUserId(req, writerAgentId)
7249
- });
7285
+ const ownerOnly = ownerOnlyAgentId(principal);
7286
+ if (stored.enabled && ownerOnly && !await requirePermission(req, res, agentId, "extension.activate")) {
7287
+ return true;
7288
+ }
7289
+ const config = parsed.body.config ? preserveRedactedConfigValues(parsed.body.config, stored.configJson) : parsed.body.config;
7290
+ let extension;
7291
+ try {
7292
+ extension = await updateExtensionMeta(parsed.params.id, {
7293
+ ...parsed.body,
7294
+ ...config === undefined ? {} : { config },
7295
+ updatedBy: await resolveHttpAuditUserId(req, writerAgentId),
7296
+ ownerOnly
7297
+ });
7298
+ } catch (error) {
7299
+ respondLifecycleError(res, error);
7300
+ return true;
7301
+ }
7250
7302
  if (!extension) {
7251
7303
  jsonError(res, "Extension not found", 404);
7252
7304
  return true;
@@ -7266,19 +7318,29 @@ async function handleExtensions(req, res, pathSegments, queryParams, agentId) {
7266
7318
  const parsed = await deleteRoute.parse(req, res, pathSegments, queryParams);
7267
7319
  if (!parsed)
7268
7320
  return true;
7269
- const principal = await requirePermission(req, res, agentId, "extension.write");
7270
- if (!principal)
7271
- return true;
7272
- const extension = await getExtensionById(parsed.params.id);
7273
- if (!extension) {
7321
+ const stored = await getExtensionById(parsed.params.id);
7322
+ if (!stored) {
7274
7323
  jsonError(res, "Extension not found", 404);
7275
7324
  return true;
7276
7325
  }
7326
+ const principal = await requirePermission(req, res, agentId, "extension.write", {
7327
+ kind: "extension",
7328
+ extensionId: stored.id,
7329
+ createdByAgentId: stored.createdByAgentId
7330
+ });
7331
+ if (!principal)
7332
+ return true;
7333
+ const extension = stored;
7277
7334
  if (extension.enabled) {
7278
7335
  jsonError(res, "Disable the extension before uninstalling it", 409);
7279
7336
  return true;
7280
7337
  }
7281
- await deleteExtension(extension.id);
7338
+ try {
7339
+ await deleteExtension(extension.id, ownerOnlyAgentId(principal));
7340
+ } catch (error) {
7341
+ respondLifecycleError(res, error);
7342
+ return true;
7343
+ }
7282
7344
  deleteRoute.respond(res, 200, { deleted: true });
7283
7345
  return true;
7284
7346
  }
@@ -15171,6 +15233,9 @@ async function handlePoll(req, res, pathSegments, queryParams, myAgentId) {
15171
15233
  if (!agent) {
15172
15234
  return { error: "Agent not found", status: 404 };
15173
15235
  }
15236
+ if (isExtensionAgent(agent)) {
15237
+ return { trigger: null };
15238
+ }
15174
15239
  if (isMultiRuntimeEnabled() && !(runtimeInstanceId && await touchRuntimeInstance(runtimeInstanceId, agent.id))) {
15175
15240
  return { trigger: null };
15176
15241
  }
@@ -16758,6 +16823,10 @@ async function handleSchedules(req, res, pathSegments, queryParams, myAgentId) {
16758
16823
  jsonError(res, "Target agent not found", 400);
16759
16824
  return true;
16760
16825
  }
16826
+ if (isExtensionAgent(agent)) {
16827
+ jsonError(res, extensionAgentAssignmentError(agent), 400);
16828
+ return true;
16829
+ }
16761
16830
  }
16762
16831
  const targetType = body.targetType ?? "agent-task";
16763
16832
  if (targetType === "agent-task" && !body.taskTemplate) {
@@ -16956,6 +17025,10 @@ async function handleSchedules(req, res, pathSegments, queryParams, myAgentId) {
16956
17025
  jsonError(res, "Target agent not found", 400);
16957
17026
  return true;
16958
17027
  }
17028
+ if (isExtensionAgent(agent)) {
17029
+ jsonError(res, extensionAgentAssignmentError(agent), 400);
17030
+ return true;
17031
+ }
16959
17032
  }
16960
17033
  const mergedTargetType = parsed.body.targetType ?? existing.targetType;
16961
17034
  const mergedTaskTemplate = parsed.body.taskTemplate !== undefined ? parsed.body.taskTemplate : existing.taskTemplate;
@@ -19607,24 +19680,32 @@ async function handleScriptRuns(req, res, pathSegments, queryParams, agentId) {
19607
19680
  const contextKey = `script-run:${run.id}:${parsed.body.stepKey}`;
19608
19681
  let task = await getLatestScriptRunStepTaskByContextKey(contextKey);
19609
19682
  if (!task) {
19610
- task = await createTaskExtended(parsed.body.template ?? parsed.body.task ?? parsed.body.stepKey, {
19611
- agentId: parsed.body.agentId,
19612
- routingReason: parsed.body.routingReason ?? (parsed.body.agentId ? "human_pinned" : undefined),
19613
- routingNote: parsed.body.routingNote,
19614
- routingSource: parsed.body.routingReason ? "declared" : parsed.body.agentId ? "engine_default" : undefined,
19615
- tags: parsed.body.tags,
19616
- priority: parsed.body.priority,
19617
- offeredTo: parsed.body.offerMode ? parsed.body.agentId : undefined,
19618
- taskType: "script-run-step",
19619
- source: "mcp",
19620
- dir: parsed.body.dir,
19621
- vcsRepo: parsed.body.vcsRepo,
19622
- model: parsed.body.model,
19623
- parentTaskId: parsed.body.parentTaskId,
19624
- requestedByUserId: parsed.body.requestedByUserId ?? run.requestedByUserId,
19625
- outputSchema: parsed.body.outputSchema,
19626
- contextKey
19627
- });
19683
+ try {
19684
+ task = await createTaskExtended(parsed.body.template ?? parsed.body.task ?? parsed.body.stepKey, {
19685
+ agentId: parsed.body.agentId,
19686
+ routingReason: parsed.body.routingReason ?? (parsed.body.agentId ? "human_pinned" : undefined),
19687
+ routingNote: parsed.body.routingNote,
19688
+ routingSource: parsed.body.routingReason ? "declared" : parsed.body.agentId ? "engine_default" : undefined,
19689
+ tags: parsed.body.tags,
19690
+ priority: parsed.body.priority,
19691
+ offeredTo: parsed.body.offerMode ? parsed.body.agentId : undefined,
19692
+ taskType: "script-run-step",
19693
+ source: "mcp",
19694
+ dir: parsed.body.dir,
19695
+ vcsRepo: parsed.body.vcsRepo,
19696
+ model: parsed.body.model,
19697
+ parentTaskId: parsed.body.parentTaskId,
19698
+ requestedByUserId: parsed.body.requestedByUserId ?? run.requestedByUserId,
19699
+ outputSchema: parsed.body.outputSchema,
19700
+ contextKey
19701
+ });
19702
+ } catch (error) {
19703
+ if (error instanceof ExtensionAgentAssignmentError) {
19704
+ jsonError(res, error.message, 400);
19705
+ return true;
19706
+ }
19707
+ throw error;
19708
+ }
19628
19709
  }
19629
19710
  const deadline = Date.now() + 30000;
19630
19711
  while (Date.now() < deadline) {
@@ -22226,6 +22307,7 @@ async function handleStats(req, res, pathSegments, queryParams, myAgentId) {
22226
22307
  // src/http/status.ts
22227
22308
  init_zod();
22228
22309
  init_db();
22310
+ init_config();
22229
22311
  init_types();
22230
22312
  var SetupMilestoneStateSchema = exports_external.enum(["unverified", "configured", "verified"]);
22231
22313
  var SetupMilestoneIdSchema = exports_external.enum([
@@ -22442,21 +22524,31 @@ function embeddingsMilestone() {
22442
22524
  };
22443
22525
  }
22444
22526
  function slackMilestone(state) {
22445
- const disable = process.env.SLACK_DISABLE;
22446
- const disabled = disable === "true" || disable === "1";
22527
+ const config = getSlackConfiguration();
22447
22528
  if (state === "unverified") {
22529
+ let hint;
22530
+ if (config.disabled) {
22531
+ hint = "Slack is explicitly disabled (SLACK_DISABLE=true).";
22532
+ } else if (!config.mode) {
22533
+ hint = "Invalid SLACK_MODE. Use socket or http.";
22534
+ } else if (config.mode === "http" && config.missingCredentials.length === 0) {
22535
+ hint = "HTTP credentials are configured, but HTTP ingress is unavailable until the receiver is installed.";
22536
+ } else {
22537
+ hint = `Set ${config.missingCredentials.join(" + ")} for Slack ${config.mode} mode.`;
22538
+ }
22448
22539
  return {
22449
22540
  id: "slack",
22450
- label: "Slack connected",
22541
+ label: "Slack configured",
22451
22542
  state: "unverified",
22452
- hint: disabled ? "Slack is explicitly disabled (SLACK_DISABLE=true)." : "Set SLACK_BOT_TOKEN + SLACK_APP_TOKEN to connect Slack.",
22543
+ hint,
22453
22544
  action_url: automationIntegrationFixUrl("slack")
22454
22545
  };
22455
22546
  }
22456
22547
  return {
22457
22548
  id: "slack",
22458
- label: "Slack connected",
22459
- state: "verified",
22549
+ label: "Slack configured",
22550
+ state: "configured",
22551
+ hint: config.mode === "http" ? "HTTP credentials are configured, but HTTP ingress is unavailable until the receiver is installed." : "Socket Mode credentials are configured; a live connection has not been verified.",
22460
22552
  action_url: automationIntegrationFixUrl("slack")
22461
22553
  };
22462
22554
  }
@@ -22541,7 +22633,7 @@ function agentfsMilestone(state) {
22541
22633
  };
22542
22634
  }
22543
22635
  async function workersMilestone() {
22544
- const totalRow = await getDbClient().get(`SELECT COUNT(*) AS count FROM agents`);
22636
+ const totalRow = await getDbClient().get(`SELECT COUNT(*) AS count FROM agents WHERE ${NOT_EXTENSION_AGENT_SQL}`);
22545
22637
  const totalAgents = totalRow?.count ?? 0;
22546
22638
  const { leads_alive, workers_alive } = await getLiveAgentCounts(5);
22547
22639
  if (leads_alive > 0 && workers_alive > 0) {
@@ -22909,7 +23001,7 @@ var createTask = route({
22909
23001
  }),
22910
23002
  responses: {
22911
23003
  201: { description: "Task created", schema: AgentTaskSchema },
22912
- 400: { description: "Validation error" },
23004
+ 400: { description: "Validation error, or agentId/offeredTo targets an extension identity" },
22913
23005
  422: {
22914
23006
  description: "Task creation blocked by an extension",
22915
23007
  schema: exports_external.object({
@@ -23442,6 +23534,10 @@ async function handleTasks(req, res, pathSegments, queryParams, myAgentId) {
23442
23534
  createTask.respond(res, 422, { error: error.reason, extension: error.extension });
23443
23535
  return true;
23444
23536
  }
23537
+ if (error instanceof ExtensionAgentAssignmentError) {
23538
+ jsonError(res, error.message, 400);
23539
+ return true;
23540
+ }
23445
23541
  console.error("[HTTP] Failed to create task:", error);
23446
23542
  jsonError(res, "Failed to create task", 500);
23447
23543
  }
@@ -27466,7 +27562,7 @@ async function shutdown() {
27466
27562
  sessionsProcessed: getServerSessionsProcessed()
27467
27563
  });
27468
27564
  if (hasCapability("scheduling")) {
27469
- const { stopScheduler } = await import("./index-rnyahfn5.js");
27565
+ const { stopScheduler } = await import("./index-9n5z2492.js");
27470
27566
  stopScheduler();
27471
27567
  }
27472
27568
  stopHeartbeat();
@@ -27474,7 +27570,7 @@ async function shutdown() {
27474
27570
  await stopScriptRunSupervisor();
27475
27571
  await stopSlackApp();
27476
27572
  if (process.env.OAUTH_KEEPALIVE_DISABLE !== "true") {
27477
- const { stopOAuthKeepalive } = await import("./keepalive-s3xpr7sw.js");
27573
+ const { stopOAuthKeepalive } = await import("./keepalive-pwxvxd2c.js");
27478
27574
  await stopOAuthKeepalive();
27479
27575
  }
27480
27576
  stopOAuthPendingGc();
@@ -27542,15 +27638,15 @@ try {
27542
27638
  console.warn("[startup] CAPABILITIES upgrade seed failed (non-fatal):", err);
27543
27639
  }
27544
27640
  try {
27545
- const { seedPricingFromModelsDev } = await import("./seed-pricing-hf889enh.js");
27641
+ const { seedPricingFromModelsDev } = await import("./seed-pricing-650wbr1n.js");
27546
27642
  seedPricingFromModelsDev();
27547
- const { startPricingRefreshLoop } = await import("./pricing-refresh-hb3691fd.js");
27643
+ const { startPricingRefreshLoop } = await import("./pricing-refresh-52g2ywrw.js");
27548
27644
  startPricingRefreshLoop();
27549
27645
  } catch (err) {
27550
27646
  console.error("[startup] Failed to seed pricing rows:", err);
27551
27647
  }
27552
27648
  try {
27553
- const { ensureRbacSeedsSynced } = await import("./rbac-roles-jh280k9g.js");
27649
+ const { ensureRbacSeedsSynced } = await import("./rbac-roles-hbf0xa52.js");
27554
27650
  ensureRbacSeedsSynced();
27555
27651
  } catch (err) {
27556
27652
  console.error("[startup] Failed to sync RBAC seed rows:", err);
@@ -27558,7 +27654,7 @@ try {
27558
27654
  throw err;
27559
27655
  }
27560
27656
  try {
27561
- const { runAllSeeders } = await import("./index-tfsdxyv6.js");
27657
+ const { runAllSeeders } = await import("./index-j5wrf1yw.js");
27562
27658
  await runAllSeeders({ scriptEmbeddingMode: "skip" });
27563
27659
  } catch (err) {
27564
27660
  console.error("[startup] Failed to seed built-in entities:", err);
@@ -27612,36 +27708,36 @@ httpServer.listen(port, async () => {
27612
27708
  await initWorkflows();
27613
27709
  await startScriptRunSupervisor(getMcpBaseUrl());
27614
27710
  if (hasCapability("scheduling")) {
27615
- const { startScheduler } = await import("./index-rnyahfn5.js");
27616
- const { getExecutorRegistry: getExecutorRegistry2 } = await import("./index-jsw3aynb.js");
27711
+ const { startScheduler } = await import("./index-9n5z2492.js");
27712
+ const { getExecutorRegistry: getExecutorRegistry2 } = await import("./index-6artrehg.js");
27617
27713
  const intervalMs = Number(process.env.SCHEDULER_INTERVAL_MS) || 1e4;
27618
27714
  startScheduler(getExecutorRegistry2(), intervalMs, {
27619
27715
  runId: globalState.__runId
27620
27716
  });
27621
27717
  }
27622
27718
  if (!isEnvFlagEnabled("HEARTBEAT_DISABLE", false)) {
27623
- const { startHeartbeat } = await import("./index-sgk50mbg.js");
27719
+ const { startHeartbeat } = await import("./index-m2xqpz5r.js");
27624
27720
  const heartbeatMs = Number(process.env.HEARTBEAT_INTERVAL_MS) || 90000;
27625
27721
  startHeartbeat(heartbeatMs);
27626
27722
  }
27627
27723
  if (process.env.OAUTH_KEEPALIVE_DISABLE !== "true") {
27628
- const { startOAuthKeepalive } = await import("./keepalive-s3xpr7sw.js");
27724
+ const { startOAuthKeepalive } = await import("./keepalive-pwxvxd2c.js");
27629
27725
  startOAuthKeepalive();
27630
27726
  }
27631
27727
  if (process.env.OAUTH_REFRESH_SWEEP_DISABLE !== "true") {
27632
- const { startOAuthRefreshSweep } = await import("./oauth-refresh-sweep-q0t3bxre.js");
27728
+ const { startOAuthRefreshSweep } = await import("./oauth-refresh-sweep-6v4bd737.js");
27633
27729
  startOAuthRefreshSweep();
27634
27730
  }
27635
27731
  startOAuthPendingGc();
27636
27732
  await startMemoryGc();
27637
27733
  await startDbRetention();
27638
- import("./boot-reembed-je26h5y7.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
27734
+ import("./boot-reembed-22hd3jjn.js").then(({ runBootReembed }) => runBootReembed()).catch((err) => {
27639
27735
  console.error("[boot-reembed] startup backfill failed (non-fatal):", err);
27640
27736
  });
27641
- import("./boot-reembed-1qmybsd4.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
27737
+ import("./boot-reembed-qe168424.js").then(({ runBootReembedScripts }) => runBootReembedScripts()).catch((err) => {
27642
27738
  console.error("[boot-reembed-scripts] startup backfill failed (non-fatal):", err);
27643
27739
  });
27644
- import("./boot-scrub-logs-gte3h1mm.js").then(({ runBootScrubLogs }) => runBootScrubLogs()).catch((err) => {
27740
+ import("./boot-scrub-logs-pkdpsrjd.js").then(({ runBootScrubLogs }) => runBootScrubLogs()).catch((err) => {
27645
27741
  console.error("[boot-scrub-logs] startup scrub failed (non-fatal):", err);
27646
27742
  });
27647
27743
  }).on("error", (err) => {