@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
package/openapi.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "Agent Swarm API",
5
- "version": "1.152.2",
5
+ "version": "1.154.0",
6
6
  "description": "Multi-agent orchestration API for Claude Code, Codex, and Gemini CLI. Enables task distribution, agent communication, and service discovery.\n\nMCP tools are documented separately in [MCP.md](./MCP.md)."
7
7
  },
8
8
  "servers": [
@@ -391,6 +391,10 @@
391
391
  "type": "boolean",
392
392
  "default": false
393
393
  },
394
+ "deferredAt": {
395
+ "type": "string",
396
+ "format": "date-time"
397
+ },
394
398
  "compactionCount": {
395
399
  "type": "integer",
396
400
  "minimum": 0
@@ -429,7 +433,8 @@
429
433
  "devin",
430
434
  "claude-managed",
431
435
  "opencode",
432
- "acp"
436
+ "acp",
437
+ "dsh"
433
438
  ]
434
439
  },
435
440
  "providerMeta": {
@@ -499,7 +504,8 @@
499
504
  "devin",
500
505
  "claude-managed",
501
506
  "opencode",
502
- "acp"
507
+ "acp",
508
+ "dsh"
503
509
  ]
504
510
  },
505
511
  "capabilities": {
@@ -646,6 +652,7 @@
646
652
  "claude-managed",
647
653
  "opencode",
648
654
  "acp",
655
+ "dsh",
649
656
  null
650
657
  ],
651
658
  "default": null
@@ -976,7 +983,8 @@
976
983
  "devin",
977
984
  "claude-managed",
978
985
  "opencode",
979
- "acp"
986
+ "acp",
987
+ "dsh"
980
988
  ]
981
989
  },
982
990
  "harnessProvider": {
@@ -992,6 +1000,7 @@
992
1000
  "claude-managed",
993
1001
  "opencode",
994
1002
  "acp",
1003
+ "dsh",
995
1004
  null
996
1005
  ]
997
1006
  },
@@ -4202,6 +4211,9 @@
4202
4211
  "api"
4203
4212
  ]
4204
4213
  },
4214
+ "senderLabel": {
4215
+ "type": "string"
4216
+ },
4205
4217
  "createdByKind": {
4206
4218
  "type": "string",
4207
4219
  "enum": [
@@ -9400,7 +9412,8 @@
9400
9412
  "devin",
9401
9413
  "claude-managed",
9402
9414
  "opencode",
9403
- "acp"
9415
+ "acp",
9416
+ "dsh"
9404
9417
  ]
9405
9418
  },
9406
9419
  "harness_provider": {
@@ -9412,7 +9425,8 @@
9412
9425
  "devin",
9413
9426
  "claude-managed",
9414
9427
  "opencode",
9415
- "acp"
9428
+ "acp",
9429
+ "dsh"
9416
9430
  ]
9417
9431
  },
9418
9432
  "runtimeInstanceId": {
@@ -9546,7 +9560,7 @@
9546
9560
  },
9547
9561
  "get": {
9548
9562
  "summary": "List all agents",
9549
- "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}`.",
9563
+ "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.",
9550
9564
  "tags": [
9551
9565
  "Agents"
9552
9566
  ],
@@ -9687,7 +9701,8 @@
9687
9701
  "devin",
9688
9702
  "claude-managed",
9689
9703
  "opencode",
9690
- "acp"
9704
+ "acp",
9705
+ "dsh"
9691
9706
  ]
9692
9707
  }
9693
9708
  },
@@ -9902,7 +9917,8 @@
9902
9917
  "codex",
9903
9918
  "pi",
9904
9919
  "opencode",
9905
- "acp"
9920
+ "acp",
9921
+ "dsh"
9906
9922
  ]
9907
9923
  },
9908
9924
  "model": {
@@ -10921,6 +10937,7 @@
10921
10937
  "claude-managed",
10922
10938
  "opencode",
10923
10939
  "acp",
10940
+ "dsh",
10924
10941
  null
10925
10942
  ]
10926
10943
  },
@@ -10937,6 +10954,7 @@
10937
10954
  "claude-managed",
10938
10955
  "opencode",
10939
10956
  "acp",
10957
+ "dsh",
10940
10958
  null
10941
10959
  ]
10942
10960
  },
@@ -11055,6 +11073,7 @@
11055
11073
  "claude-managed",
11056
11074
  "opencode",
11057
11075
  "acp",
11076
+ "dsh",
11058
11077
  null
11059
11078
  ]
11060
11079
  },
@@ -11071,6 +11090,7 @@
11071
11090
  "claude-managed",
11072
11091
  "opencode",
11073
11092
  "acp",
11093
+ "dsh",
11074
11094
  null
11075
11095
  ]
11076
11096
  },
@@ -15976,6 +15996,7 @@
15976
15996
  "post": {
15977
15997
  "operationId": "extensions_install",
15978
15998
  "summary": "Validate and install an extension bundle",
15999
+ "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.",
15979
16000
  "tags": [
15980
16001
  "Extensions"
15981
16002
  ],
@@ -16167,6 +16188,7 @@
16167
16188
  "patch": {
16168
16189
  "operationId": "extensions_update",
16169
16190
  "summary": "Update extension priority, config, or description",
16191
+ "description": "Workers may edit their own disabled extensions. Leads, operators, and dashboard users retain access to all extensions.",
16170
16192
  "tags": [
16171
16193
  "Extensions"
16172
16194
  ],
@@ -16262,6 +16284,7 @@
16262
16284
  "delete": {
16263
16285
  "operationId": "extensions_delete",
16264
16286
  "summary": "Uninstall a disabled extension",
16287
+ "description": "Workers may uninstall their own disabled extensions. Leads, operators, and dashboard users retain access to all extensions.",
16265
16288
  "tags": [
16266
16289
  "Extensions"
16267
16290
  ],
@@ -26676,6 +26699,14 @@
26676
26699
  "parentTaskId": {
26677
26700
  "type": "string"
26678
26701
  },
26702
+ "requestedDelayMs": {
26703
+ "type": "integer",
26704
+ "exclusiveMinimum": 0
26705
+ },
26706
+ "requestedRunAt": {
26707
+ "type": "string",
26708
+ "format": "date-time"
26709
+ },
26679
26710
  "timezone": {
26680
26711
  "type": "string",
26681
26712
  "default": "UTC"
@@ -27033,6 +27064,14 @@
27033
27064
  "parentTaskId": {
27034
27065
  "type": "string"
27035
27066
  },
27067
+ "requestedDelayMs": {
27068
+ "type": "integer",
27069
+ "exclusiveMinimum": 0
27070
+ },
27071
+ "requestedRunAt": {
27072
+ "type": "string",
27073
+ "format": "date-time"
27074
+ },
27036
27075
  "timezone": {
27037
27076
  "type": "string",
27038
27077
  "default": "UTC"
@@ -27217,6 +27256,14 @@
27217
27256
  "parentTaskId": {
27218
27257
  "type": "string"
27219
27258
  },
27259
+ "requestedDelayMs": {
27260
+ "type": "integer",
27261
+ "exclusiveMinimum": 0
27262
+ },
27263
+ "requestedRunAt": {
27264
+ "type": "string",
27265
+ "format": "date-time"
27266
+ },
27220
27267
  "timezone": {
27221
27268
  "type": "string",
27222
27269
  "default": "UTC"
@@ -27444,6 +27491,14 @@
27444
27491
  "parentTaskId": {
27445
27492
  "type": "string"
27446
27493
  },
27494
+ "requestedDelayMs": {
27495
+ "type": "integer",
27496
+ "exclusiveMinimum": 0
27497
+ },
27498
+ "requestedRunAt": {
27499
+ "type": "string",
27500
+ "format": "date-time"
27501
+ },
27447
27502
  "timezone": {
27448
27503
  "type": "string",
27449
27504
  "default": "UTC"
@@ -27686,6 +27741,14 @@
27686
27741
  "parentTaskId": {
27687
27742
  "type": "string"
27688
27743
  },
27744
+ "requestedDelayMs": {
27745
+ "type": "integer",
27746
+ "exclusiveMinimum": 0
27747
+ },
27748
+ "requestedRunAt": {
27749
+ "type": "string",
27750
+ "format": "date-time"
27751
+ },
27689
27752
  "timezone": {
27690
27753
  "type": "string",
27691
27754
  "default": "UTC"
@@ -28048,6 +28111,14 @@
28048
28111
  "parentTaskId": {
28049
28112
  "type": "string"
28050
28113
  },
28114
+ "requestedDelayMs": {
28115
+ "type": "integer",
28116
+ "exclusiveMinimum": 0
28117
+ },
28118
+ "requestedRunAt": {
28119
+ "type": "string",
28120
+ "format": "date-time"
28121
+ },
28051
28122
  "timezone": {
28052
28123
  "type": "string",
28053
28124
  "default": "UTC"
@@ -28431,6 +28502,14 @@
28431
28502
  "parentTaskId": {
28432
28503
  "type": "string"
28433
28504
  },
28505
+ "requestedDelayMs": {
28506
+ "type": "integer",
28507
+ "exclusiveMinimum": 0
28508
+ },
28509
+ "requestedRunAt": {
28510
+ "type": "string",
28511
+ "format": "date-time"
28512
+ },
28434
28513
  "timezone": {
28435
28514
  "type": "string",
28436
28515
  "default": "UTC"
@@ -35819,7 +35898,8 @@
35819
35898
  "devin",
35820
35899
  "claude-managed",
35821
35900
  "opencode",
35822
- "acp"
35901
+ "acp",
35902
+ "dsh"
35823
35903
  ]
35824
35904
  },
35825
35905
  "requestedByUserId": {
@@ -40126,6 +40206,14 @@
40126
40206
  "parentTaskId": {
40127
40207
  "type": "string"
40128
40208
  },
40209
+ "requestedDelayMs": {
40210
+ "type": "integer",
40211
+ "exclusiveMinimum": 0
40212
+ },
40213
+ "requestedRunAt": {
40214
+ "type": "string",
40215
+ "format": "date-time"
40216
+ },
40129
40217
  "timezone": {
40130
40218
  "type": "string",
40131
40219
  "default": "UTC"
@@ -40525,7 +40613,8 @@
40525
40613
  "devin",
40526
40614
  "claude-managed",
40527
40615
  "opencode",
40528
- "acp"
40616
+ "acp",
40617
+ "dsh"
40529
40618
  ]
40530
40619
  },
40531
40620
  "providers": {
@@ -40542,7 +40631,8 @@
40542
40631
  "devin",
40543
40632
  "claude-managed",
40544
40633
  "opencode",
40545
- "acp"
40634
+ "acp",
40635
+ "dsh"
40546
40636
  ]
40547
40637
  },
40548
40638
  "state": {
@@ -40813,7 +40903,8 @@
40813
40903
  "devin",
40814
40904
  "claude-managed",
40815
40905
  "opencode",
40816
- "acp"
40906
+ "acp",
40907
+ "dsh"
40817
40908
  ]
40818
40909
  }
40819
40910
  },
@@ -41188,7 +41279,8 @@
41188
41279
  "devin",
41189
41280
  "claude-managed",
41190
41281
  "opencode",
41191
- "acp"
41282
+ "acp",
41283
+ "dsh"
41192
41284
  ]
41193
41285
  },
41194
41286
  "requestedByUserId": {
@@ -41401,7 +41493,7 @@
41401
41493
  }
41402
41494
  },
41403
41495
  "400": {
41404
- "description": "Validation error",
41496
+ "description": "Validation error, or agentId/offeredTo targets an extension identity",
41405
41497
  "content": {
41406
41498
  "application/json": {
41407
41499
  "schema": {
@@ -41584,7 +41676,8 @@
41584
41676
  "pi",
41585
41677
  "claude-managed",
41586
41678
  "opencode",
41587
- "acp"
41679
+ "acp",
41680
+ "dsh"
41588
41681
  ]
41589
41682
  },
41590
41683
  "model": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@desplega.ai/agent-swarm",
3
- "version": "1.152.2",
3
+ "version": "1.154.0",
4
4
  "description": "agent-swarm.dev — an open-source operating system for AI work: a lead agent breaks goals into tasks, routes them to specialized workers such as Claude Code or Codex, runs each worker in an isolated container, and preserves shared memory, tools, schedules, and review gates so delegated work compounds across sessions.",
5
5
  "keywords": [
6
6
  "agent-swarm.dev",
@@ -41,6 +41,7 @@
41
41
  "plugin/commands/",
42
42
  "plugin/agents/",
43
43
  "plugin/pi-skills/",
44
+ "plugin/opencode-plugins/lib/memory-raters.ts",
44
45
  "templates/",
45
46
  "vendored-openapi/",
46
47
  "openapi.json"
@@ -188,14 +189,14 @@
188
189
  "@aws-sdk/client-bedrock": "3.1048.0",
189
190
  "@desplega.ai/business-use": "^0.4.2",
190
191
  "@desplega.ai/localtunnel": "^2.2.0",
191
- "@earendil-works/pi-agent-core": "^0.85.1",
192
- "@earendil-works/pi-ai": "^0.85.1",
193
- "@earendil-works/pi-coding-agent": "^0.85.1",
192
+ "@earendil-works/pi-agent-core": "^0.87.1",
193
+ "@earendil-works/pi-ai": "^0.87.1",
194
+ "@earendil-works/pi-coding-agent": "^0.87.1",
194
195
  "@inkjs/ui": "^2.0.0",
195
196
  "@linear/sdk": "^77.0.0",
196
197
  "@modelcontextprotocol/sdk": "1.29.0",
197
- "@openai/codex": "0.154.0",
198
- "@opencode-ai/sdk": "^1.18.31",
198
+ "@openai/codex": "0.156.1",
199
+ "@opencode-ai/sdk": "^1.18.32",
199
200
  "@openfort/openfort-node": "^0.9.1",
200
201
  "@opentelemetry/api": "^1.9.1",
201
202
  "@opentelemetry/exporter-metrics-otlp-http": "^0.218.0",
@@ -0,0 +1,7 @@
1
+ /** Unset enables citation ratings and self-rating hints; an explicitly empty value disables all raters. */
2
+ export function getMemoryRaterNames(): string[] {
3
+ return (process.env.MEMORY_RATERS ?? "implicit-citation,explicit-self")
4
+ .split(",")
5
+ .map((name) => name.trim())
6
+ .filter(Boolean);
7
+ }
@@ -1,4 +1,5 @@
1
1
  import type { AutomationIntegrationId, ScheduledTask, Workflow } from "@/types";
2
+ import { getSlackConfiguration, isSlackConfigured } from "../slack/config";
2
3
  import { getDbClient } from "./db";
3
4
  import { getOAuthApp, getOAuthTokens } from "./db-queries/oauth";
4
5
 
@@ -281,11 +282,12 @@ export async function getAutomationSetupStates(): Promise<AutomationSetupStates>
281
282
  present(process.env.GSC_SERVICE_ACCOUNT_JSON);
282
283
 
283
284
  return {
285
+ // Credential presence is configuration evidence, not proof that inbound
286
+ // Slack traffic has been observed successfully.
287
+ // HTTP credentials alone cannot run Slack automations before its receiver lands.
284
288
  slack:
285
- enabled(process.env.SLACK_DISABLE) &&
286
- present(process.env.SLACK_BOT_TOKEN) &&
287
- present(process.env.SLACK_APP_TOKEN)
288
- ? "verified"
289
+ getSlackConfiguration().mode === "socket" && isSlackConfigured()
290
+ ? "configured"
289
291
  : "unverified",
290
292
  github:
291
293
  present(process.env.GITHUB_WEBHOOK_SECRET) &&
@@ -206,8 +206,79 @@ export async function getAgentById(id: string): Promise<Agent | null> {
206
206
  return row ? rowToAgent(row) : null;
207
207
  }
208
208
 
209
- export async function getAllAgents(opts?: { slim?: boolean }): Promise<Agent[]> {
210
- const rows = await getDbClient().query<AgentRow>("SELECT * FROM agents ORDER BY name");
209
+ /**
210
+ * Role stamped on the `ext:<name>` agent row an extension authenticates as
211
+ * (`src/extensions/identity.ts`). These rows are API identities, not workers:
212
+ * they are hidden from agent listings and can never be assigned, offered, or
213
+ * claim tasks. The rows themselves are kept so the extension can keep calling
214
+ * the API and re-enabling it finds the same identity.
215
+ */
216
+ export const EXTENSION_AGENT_ROLE = "extension";
217
+
218
+ /** SQL predicate that drops extension-identity rows from an `agents` scan. */
219
+ export const NOT_EXTENSION_AGENT_SQL = `COALESCE(role, '') != '${EXTENSION_AGENT_ROLE}'`;
220
+
221
+ export function isExtensionAgent(agent: Pick<Agent, "role"> | null | undefined): boolean {
222
+ return agent?.role === EXTENSION_AGENT_ROLE;
223
+ }
224
+
225
+ export function extensionAgentAssignmentError(agent: Pick<Agent, "id" | "name">): string {
226
+ return `Agent "${agent.name}" (${agent.id}) is an extension identity and cannot be assigned, offered, or scheduled tasks. Target a worker or lead agent instead.`;
227
+ }
228
+
229
+ /**
230
+ * Thrown when an ordinary registration or profile update tries to grant the
231
+ * reserved extension role, or to strip it from an extension identity. Only
232
+ * `ensureExtensionAgent` may set it.
233
+ */
234
+ export class ReservedAgentRoleError extends Error {
235
+ constructor(message: string) {
236
+ super(message);
237
+ this.name = "ReservedAgentRoleError";
238
+ }
239
+ }
240
+
241
+ /**
242
+ * Returns the reason a role change is refused, or null when it is allowed.
243
+ * `allowExtensionRole` is passed only by the extension identity lifecycle.
244
+ */
245
+ export function reservedRoleViolation(
246
+ currentRole: string | null | undefined,
247
+ nextRole: string | undefined,
248
+ opts?: { allowExtensionRole?: boolean },
249
+ ): string | null {
250
+ if (nextRole === undefined || nextRole === currentRole) return null;
251
+ if (currentRole === EXTENSION_AGENT_ROLE) {
252
+ return `Extension identities keep the "${EXTENSION_AGENT_ROLE}" role; it cannot be changed.`;
253
+ }
254
+ if (nextRole === EXTENSION_AGENT_ROLE && !opts?.allowExtensionRole) {
255
+ return `Role "${EXTENSION_AGENT_ROLE}" is reserved for extension identities.`;
256
+ }
257
+ return null;
258
+ }
259
+
260
+ /** Thrown by task creation when the assignee or offer target is an extension identity. */
261
+ export class ExtensionAgentAssignmentError extends Error {
262
+ constructor(agent: Pick<Agent, "id" | "name">) {
263
+ super(extensionAgentAssignmentError(agent));
264
+ this.name = "ExtensionAgentAssignmentError";
265
+ }
266
+ }
267
+
268
+ /**
269
+ * Lists agents ordered by name. Extension identities are excluded unless
270
+ * `includeExtensions` is set; only the extension identity lifecycle and
271
+ * name-collision checks need them.
272
+ */
273
+ export async function getAllAgents(opts?: {
274
+ slim?: boolean;
275
+ includeExtensions?: boolean;
276
+ }): Promise<Agent[]> {
277
+ const rows = await getDbClient().query<AgentRow>(
278
+ opts?.includeExtensions
279
+ ? "SELECT * FROM agents ORDER BY name"
280
+ : `SELECT * FROM agents WHERE ${NOT_EXTENSION_AGENT_SQL} ORDER BY name`,
281
+ );
211
282
  return rows.map((row) => rowToAgent(row, opts?.slim ?? false));
212
283
  }
213
284
 
@@ -529,6 +600,8 @@ export function isAgentEligibleForTask(
529
600
  agent: Pick<Agent, "id" | "isLead" | "role" | "capabilities">,
530
601
  task: Pick<AgentTask, "routingAffinity" | "routingAffinityInvalid">,
531
602
  ): boolean {
603
+ // Extension identities are API principals, never task executors.
604
+ if (isExtensionAgent(agent)) return false;
532
605
  const affinity = task.routingAffinity;
533
606
  // A malformed persisted blob is a security boundary failure, not an
534
607
  // untagged task. Quarantine it from every assignment/claim path.
@@ -103,6 +103,7 @@ export type AgentTaskRow = {
103
103
  peakContextTokens: number | null;
104
104
  contextWindowSize: number | null;
105
105
  was_paused: number;
106
+ deferredAt: string | null;
106
107
  credentialKeySuffix: string | null;
107
108
  credentialKeyType: string | null;
108
109
  requestedByUserId: string | null;
@@ -228,6 +229,7 @@ export function rowToAgentTask(row: AgentTaskRow): AgentTask {
228
229
  output: row.output ?? undefined,
229
230
  progress: row.progress ?? undefined,
230
231
  wasPaused: !!row.was_paused,
232
+ deferredAt: row.deferredAt ?? undefined,
231
233
  credentialKeySuffix: row.credentialKeySuffix ?? undefined,
232
234
  credentialKeyType: row.credentialKeyType ?? undefined,
233
235
  requestedByUserId: row.requestedByUserId ?? undefined,
@@ -326,7 +326,7 @@ export async function updateTaskTitle(
326
326
  export async function completeTask(
327
327
  id: string,
328
328
  output?: string,
329
- options?: { addTags?: string[] },
329
+ options?: { addTags?: string[]; deferredAt?: string },
330
330
  ): Promise<AgentTask | null> {
331
331
  const oldTask = await getTaskById(id);
332
332
  if (!oldTask) return null;
@@ -364,6 +364,12 @@ export async function completeTask(
364
364
  [JSON.stringify(nextTags), id],
365
365
  );
366
366
  }
367
+ if (completed && options?.deferredAt) {
368
+ completed = await getDbClient().get<AgentTaskRow>(
369
+ "UPDATE agent_tasks SET deferredAt = ?, lastUpdatedAt = strftime('%Y-%m-%dT%H:%M:%fZ', 'now') WHERE id = ? RETURNING *",
370
+ [options.deferredAt, id],
371
+ );
372
+ }
367
373
  if (completed) {
368
374
  await dependencies.reconcileTaskPullRequestAttachments(id, completed.agentId, [
369
375
  completed.output,