@desplega.ai/agent-swarm 1.161.0 → 1.162.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 (224) hide show
  1. package/README.md +3 -2
  2. package/dist/{acp-adapter-xx489vvb.js → acp-adapter-74m73ae9.js} +1 -1
  3. package/dist/{actions-ykjkn0m9.js → actions-4sr14gnt.js} +34 -31
  4. package/dist/{anthropic-messages-5qx80j9k.js → anthropic-messages-8xxrzky9.js} +22 -26
  5. package/dist/{app-0hdqa4k1.js → app-pt68fbwp.js} +13 -11
  6. package/dist/{artifact-3v5t9jtg.js → artifact-fey7dvj9.js} +3 -2
  7. package/dist/{assistant-am2g5g8a.js → assistant-cv3jytks.js} +37 -34
  8. package/dist/{azure-openai-responses-fszbkp0e.js → azure-openai-responses-f5cqsyj8.js} +15 -10
  9. package/dist/{boot-reembed-xy9t7avg.js → boot-reembed-4ht4gqth.js} +13 -11
  10. package/dist/{boot-reembed-gt5gjkt4.js → boot-reembed-nxpcvpj9.js} +12 -10
  11. package/dist/{boot-scrub-logs-9x0985y5.js → boot-scrub-logs-k93kyw8k.js} +9 -7
  12. package/dist/{boot-seeds-trv0d4vg.js → boot-seeds-1skcrs0e.js} +13 -10
  13. package/dist/{claude-adapter-jb6e1e54.js → claude-adapter-r5g0tzge.js} +23 -20
  14. package/dist/{claude-managed-setup-d1q9hv2b.js → claude-managed-setup-pkyrgshb.js} +3 -2
  15. package/dist/{claude-sdk-session-zga700s2.js → claude-sdk-session-jxyxnrwd.js} +5565 -5512
  16. package/dist/{cli-we0q7t0e.js → cli-2zy95vhm.js} +137 -64
  17. package/dist/{cli-35pj2yva.js → cli-4cwxn7gp.js} +38 -11
  18. package/dist/{cli-ad4qxm6j.js → cli-4dcpaefp.js} +2 -2
  19. package/dist/{cli-82c1pacn.js → cli-4x0csdjq.js} +71 -37
  20. package/dist/{cli-sqm3r5ps.js → cli-5bcd7sfy.js} +14 -18
  21. package/dist/{cli-d56tgd45.js → cli-5k6k8ta3.js} +2 -2
  22. package/dist/{cli-1er0rhz8.js → cli-5xhpb3kv.js} +15 -15
  23. package/dist/{cli-yrg7c73k.js → cli-7af8yhav.js} +10 -183
  24. package/dist/{cli-r6fsxc76.js → cli-7tre70zp.js} +513 -961
  25. package/dist/{cli-bh7jed3k.js → cli-8ev9xqnx.js} +34 -18
  26. package/dist/cli-bsky8g7w.js +449 -0
  27. package/dist/{cli-hn04t9db.js → cli-cebmgwsc.js} +14 -10
  28. package/dist/{cli-cfkrztza.js → cli-cvatsam7.js} +2 -2
  29. package/dist/{cli-2658f6at.js → cli-cvk6yzw5.js} +6 -8
  30. package/dist/{cli-ptr8h7kp.js → cli-eg0b3p0k.js} +5 -218
  31. package/dist/{cli-zb6xbk61.js → cli-g739zqzt.js} +4 -4
  32. package/dist/{cli-dv6cdjs2.js → cli-gd4favx9.js} +28 -7
  33. package/dist/{cli-5p3x4zna.js → cli-gpqpmns7.js} +2 -2
  34. package/dist/{cli-5nbmpy8w.js → cli-hb5c2x5y.js} +1 -1
  35. package/dist/{cli-jpf7e1zq.js → cli-hmsw1gpy.js} +3 -3
  36. package/dist/{cli-1cz0c18q.js → cli-jf7wmv1r.js} +2521 -733
  37. package/dist/{cli-qwsnmjdd.js → cli-jxs2ygaw.js} +168 -61
  38. package/dist/cli-kdkwd3yr.js +615 -0
  39. package/dist/{cli-hgmnf38m.js → cli-kh04eqwe.js} +1 -1
  40. package/dist/{cli-0383bp7f.js → cli-kp42yek0.js} +425 -90
  41. package/dist/{cli-ybgv4kw2.js → cli-mbssg1xv.js} +9 -2
  42. package/dist/{cli-jsp14b6c.js → cli-mzfth0bp.js} +38 -1
  43. package/dist/{cli-8g6mc14k.js → cli-nq7yqw7b.js} +16 -5
  44. package/dist/{cli-ee8bc46j.js → cli-nt8hecg9.js} +33 -32
  45. package/dist/{cli-9s68w752.js → cli-p0r8sxj5.js} +1 -1
  46. package/dist/{cli-58e8yr0d.js → cli-pkd6s2wy.js} +4 -2
  47. package/dist/{cli-17xpf7cm.js → cli-q24re23n.js} +6 -4
  48. package/dist/cli-qjjvzwzd.js +222 -0
  49. package/dist/cli-qrgt5bqf.js +189 -0
  50. package/dist/{cli-et8m9xsv.js → cli-rfjw9jw2.js} +22 -10
  51. package/dist/{cli-798vkbks.js → cli-rj0gqwwp.js} +2 -2
  52. package/dist/{cli-121ph74b.js → cli-rnyzn44p.js} +1 -1
  53. package/dist/{cli-vnnz5ncg.js → cli-s3hwpt9v.js} +95 -16
  54. package/dist/{cli-7119ja3w.js → cli-sptrj5f5.js} +2 -2
  55. package/dist/{cli-a8c82p2t.js → cli-sqvfa090.js} +13 -6
  56. package/dist/{cli-phfg8vy8.js → cli-swfmp1fx.js} +26 -26
  57. package/dist/{cli-nsdxtcbg.js → cli-tcen9p5w.js} +8 -5
  58. package/dist/{cli-9m03pzga.js → cli-vc9bp061.js} +5 -5
  59. package/dist/{cli-rtx9dygp.js → cli-vxe6qa4h.js} +1 -1
  60. package/dist/{cli-ecfxwnyb.js → cli-vy3ed88x.js} +1 -1
  61. package/dist/{cli-0c7ata9h.js → cli-vyqs9ya8.js} +6 -6
  62. package/dist/cli-wbvnn6tk.js +861 -0
  63. package/dist/{cli-kgd3p0bm.js → cli-wjgs5wxe.js} +6 -6
  64. package/dist/cli-wxkkd0e0.js +33 -0
  65. package/dist/{cli-akfj32vj.js → cli-xqpk3rp7.js} +5 -4
  66. package/dist/cli-zp38xvtm.js +9487 -0
  67. package/dist/{cli-3zc55ctx.js → cli-zvhd3f64.js} +2 -2
  68. package/dist/{cli-ze1d3wzv.js → cli-zxqx25nz.js} +5 -5
  69. package/dist/cli.js +32 -25
  70. package/dist/{cloudflare-workers-ai-system-one-k6fbxw9d.js → cloudflare-workers-ai-system-one-k8ddqjkq.js} +8 -6
  71. package/dist/{codex-adapter-04v97vep.js → codex-adapter-esvmnhn7.js} +13 -13
  72. package/dist/{codex-hook-20me6byw.js → codex-hook-m73jmqgx.js} +19 -3
  73. package/dist/{codex-session-runner-ax69mqq3.js → codex-session-runner-ban9excr.js} +13 -13
  74. package/dist/{commands-18gy08n1.js → commands-75413p2n.js} +9 -7
  75. package/dist/{db-d2pvjpyt.js → db-7f5pecwg.js} +11 -7
  76. package/dist/{dispatcher-8wbwyzjg.js → dispatcher-fh9at8nz.js} +33 -30
  77. package/dist/{dsh-adapter-ysqk9snv.js → dsh-adapter-wpze65d4.js} +3 -3
  78. package/dist/{e2b-esmt1r16.js → e2b-gjgdjp91.js} +10 -9
  79. package/dist/{pi-logo-animation-e9a0t68z.js → easter-egg-3d-3w5c2n4c.js} +122 -68
  80. package/dist/{execute-cmagrbrz.js → execute-f50wg9nh.js} +29 -6
  81. package/dist/{google-generative-ai-k6n5nbpp.js → google-generative-ai-jxxpnegy.js} +2 -2
  82. package/dist/{google-vertex-44xxtcvp.js → google-vertex-x7q1angm.js} +5 -5
  83. package/dist/{handlers-6b69m5kp.js → handlers-w13787bb.js} +36 -33
  84. package/dist/{hook-srnkt0hb.js → hook-46g1jrvx.js} +28 -15
  85. package/dist/{hook-k3mydf2n.js → hook-4tpts2ry.js} +20 -17
  86. package/dist/{http-hrf80ca1.js → http-19pzbfrt.js} +964 -176
  87. package/dist/{index-9rxdvj6w.js → index-8fd4dm4h.js} +34 -31
  88. package/dist/{index-1asbaj62.js → index-dqmp15bq.js} +35 -32
  89. package/dist/{index-45evq4ee.js → index-qb4q1y3e.js} +33 -30
  90. package/dist/{index-k4nj18qs.js → index-s75wc4wd.js} +12 -10
  91. package/dist/{index-xmevk2b9.js → index-scptvdxg.js} +27 -25
  92. package/dist/{keepalive-sfdz6ksp.js → keepalive-xa5ts9cd.js} +11 -9
  93. package/dist/{lead-ej91e9hw.js → lead-qp4xkvjq.js} +45 -41
  94. package/dist/{maintenance-80dnd7ke.js → maintenance-rm5885hm.js} +13 -11
  95. package/dist/{mistral-conversations-pc3ntnxt.js → mistral-conversations-rw7fbt22.js} +4 -4
  96. package/dist/{node-a5e00qhp.js → node-8zkdq42h.js} +834 -833
  97. package/dist/{oauth-refresh-sweep-m1etk2mx.js → oauth-refresh-sweep-1csdfebf.js} +10 -8
  98. package/dist/{onboard-0q8sdfqc.js → onboard-r6b78cs4.js} +10 -10
  99. package/dist/{openai-codex-responses-n7n683p2.js → openai-codex-responses-efvrgrq3.js} +4 -4
  100. package/dist/{openai-completions-jpaj5g2b.js → openai-completions-bbbrrz4z.js} +12 -8
  101. package/dist/{openai-responses-9a3nme9j.js → openai-responses-9jjyrcm1.js} +15 -10
  102. package/dist/{opencode-adapter-4wcgmvgf.js → opencode-adapter-kb3g6pkf.js} +2 -2
  103. package/dist/{otel-impl-hnqm9mxq.js → otel-impl-0y9knpky.js} +5 -5
  104. package/dist/{pi-mono-adapter-d6sqm9wr.js → pi-mono-adapter-z6s1bme2.js} +100 -19
  105. package/dist/{pricing-refresh-y60z64pm.js → pricing-refresh-mth26tgp.js} +11 -9
  106. package/dist/{rbac-roles-8pa0754b.js → rbac-roles-kwntb23q.js} +13 -9
  107. package/dist/rbac-roles-vpk4ebm8.js +45 -0
  108. package/dist/{registry-v5wytg0s.js → registry-km6t1jd2.js} +1 -1
  109. package/dist/{render-v2-418s1vj7.js → render-v2-hcm7h00y.js} +13 -11
  110. package/dist/{runtime-3pknc168.js → runtime-vfjsfsc5.js} +4 -4
  111. package/dist/{setup-yghdkj4x.js → setup-hbyzd65h.js} +2 -2
  112. package/dist/{virtual-modules-jcceevt5.js → virtual-modules-9bv7ry91.js} +9 -8
  113. package/dist/{work-objects-j1sz20v9.js → work-objects-m09sxnhe.js} +36 -33
  114. package/dist/{worker-d4gcvkjt.js → worker-0h35rvk4.js} +45 -41
  115. package/openapi.json +491 -12
  116. package/package.json +13 -6
  117. package/src/be/api-drain.ts +184 -0
  118. package/src/be/db/tasks/read.ts +31 -6
  119. package/src/be/db/tasks/write.ts +5 -4
  120. package/src/be/db.ts +42 -18
  121. package/src/be/memory/link-resolver.ts +29 -3
  122. package/src/be/migrations/192_favorites_agent_fs_path.sql +36 -0
  123. package/src/be/onboarding.ts +7 -1
  124. package/src/be/seed-prompt-templates.ts +1 -0
  125. package/src/be/swarm-config-guard.ts +35 -16
  126. package/src/be/task-citations.ts +11 -5
  127. package/src/be/users.ts +3 -0
  128. package/src/cli.tsx +3 -2
  129. package/src/comb/agent-fs.ts +39 -0
  130. package/src/comb/config.ts +37 -0
  131. package/src/comb/markers.ts +37 -0
  132. package/src/comb/review-batch.ts +486 -0
  133. package/src/comb/templates.ts +88 -0
  134. package/src/commands/context-preamble.ts +4 -1
  135. package/src/commands/hook.ts +2 -1
  136. package/src/commands/runner.ts +262 -68
  137. package/src/commands/templates.ts +10 -0
  138. package/src/extensions/contract-types.generated.ts +1 -1
  139. package/src/fs/agent-fs-provider.ts +106 -2
  140. package/src/heartbeat/heartbeat.ts +4 -0
  141. package/src/hooks/codex-hook.ts +25 -1
  142. package/src/hooks/hook.ts +13 -0
  143. package/src/hooks/pr-body-guard.ts +983 -0
  144. package/src/http/all-routes.ts +1 -0
  145. package/src/http/assets.ts +5 -17
  146. package/src/http/comb.ts +131 -0
  147. package/src/http/core.ts +2 -1
  148. package/src/http/fs.ts +9 -17
  149. package/src/http/index.ts +23 -9
  150. package/src/http/onboarding.ts +21 -2
  151. package/src/http/poll.ts +30 -3
  152. package/src/http/realtime.ts +62 -0
  153. package/src/http/request-principal.ts +22 -0
  154. package/src/http/status.ts +34 -2
  155. package/src/kv-reserved-namespaces.ts +10 -5
  156. package/src/providers/dsh-adapter.ts +1 -1
  157. package/src/providers/pi-mono-adapter.ts +123 -0
  158. package/src/rbac/legacy-policy.ts +1 -0
  159. package/src/rbac/permissions.ts +4 -0
  160. package/src/realtime/auth.ts +63 -1
  161. package/src/realtime/tickets.ts +52 -0
  162. package/src/realtime/transport.ts +51 -22
  163. package/src/scripts-runtime/types/swarm-extension.d.ts +3 -1
  164. package/src/telemetry-context.ts +175 -0
  165. package/src/telemetry-contract/EVENTS.md +81 -0
  166. package/src/telemetry-contract/SOURCE.json +9 -0
  167. package/src/telemetry-contract/catalog.json +1335 -0
  168. package/src/telemetry-contract/index.ts +60 -0
  169. package/src/telemetry-contract/types.gen.ts +1971 -0
  170. package/src/telemetry-identity.ts +129 -0
  171. package/src/telemetry-snapshot.ts +211 -0
  172. package/src/telemetry-trigger.ts +125 -0
  173. package/src/telemetry-types.typetest.ts +40 -0
  174. package/src/telemetry.ts +271 -67
  175. package/src/tests/api-drain-e2e.test.ts +249 -0
  176. package/src/tests/api-drain-worker-e2e.test.ts +216 -0
  177. package/src/tests/api-drain.test.ts +351 -0
  178. package/src/tests/comb-config-guard.test.ts +38 -0
  179. package/src/tests/comb-links.test.ts +162 -0
  180. package/src/tests/comb-markers.test.ts +68 -0
  181. package/src/tests/comb-review-batch.test.ts +770 -0
  182. package/src/tests/comb-status.test.ts +152 -0
  183. package/src/tests/db-task-read-contract.test.ts +2 -0
  184. package/src/tests/db-task-write-contract.test.ts +1 -0
  185. package/src/tests/docs-index-footprint.test.js +3 -3
  186. package/src/tests/dsh-adapter.test.ts +1 -1
  187. package/src/tests/favorites-agent-fs-path.test.ts +226 -0
  188. package/src/tests/memory-link-resolver.test.ts +34 -0
  189. package/src/tests/onboarding.test.ts +108 -0
  190. package/src/tests/pi-mono-adapter.test.ts +265 -2
  191. package/src/tests/pr-body-leaks.test.ts +789 -0
  192. package/src/tests/preload.ts +8 -0
  193. package/src/tests/rbac-engine.test.ts +19 -0
  194. package/src/tests/realtime-room-auth.test.ts +104 -1
  195. package/src/tests/realtime-tickets.test.ts +74 -0
  196. package/src/tests/realtime-transport.test.ts +131 -4
  197. package/src/tests/runner-api-drain.test.ts +301 -0
  198. package/src/tests/runner-fallback-output.test.ts +61 -0
  199. package/src/tests/runner-fenced-json-output.test.ts +178 -0
  200. package/src/tests/script-connections.test.ts +2 -0
  201. package/src/tests/send-task-requested-by.test.ts +133 -15
  202. package/src/tests/task-lifecycle-telemetry.test.ts +8 -3
  203. package/src/tests/telemetry-context.test.ts +314 -0
  204. package/src/tests/telemetry-init.test.ts +51 -19
  205. package/src/tests/telemetry-snapshot.test.ts +229 -0
  206. package/src/tests/telemetry-trigger.test.ts +200 -0
  207. package/src/tests/template-registry-helpers.ts +1 -0
  208. package/src/tests/workflow-agent-task-retry.test.ts +363 -0
  209. package/src/tests/workflow-definition-telemetry.test.ts +4 -4
  210. package/src/tools/poll-task.ts +20 -1
  211. package/src/tools/send-task.ts +9 -1
  212. package/src/tools/task-action.ts +11 -0
  213. package/src/types.ts +2 -1
  214. package/src/utils/api-drain.ts +24 -0
  215. package/src/utils/constants.ts +57 -16
  216. package/src/utils/pr-body-leaks.ts +172 -0
  217. package/src/utils/task-attachment-links.ts +14 -8
  218. package/src/workflows/recovery.ts +26 -1
  219. package/src/workflows/resume.ts +31 -4
  220. package/src/workflows/task-step-routing.ts +75 -2
  221. package/tsconfig.json +3 -0
  222. package/dist/cli-tjf4cn8z.js +0 -9119
  223. package/dist/cli-tsk3nz8a.js +0 -582
  224. package/dist/{cli-t6v2ah3r.js → cli-twrh04ap.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.161.0",
5
+ "version": "1.162.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": [
@@ -171,7 +171,8 @@
171
171
  "schedule",
172
172
  "workflow",
173
173
  "linear",
174
- "jira"
174
+ "jira",
175
+ "comb"
175
176
  ],
176
177
  "default": "mcp"
177
178
  },
@@ -2067,7 +2068,8 @@
2067
2068
  "enum": [
2068
2069
  "page",
2069
2070
  "workflow",
2070
- "schedule"
2071
+ "schedule",
2072
+ "agent-fs-path"
2071
2073
  ]
2072
2074
  },
2073
2075
  "itemId": {
@@ -6164,7 +6166,7 @@
6164
6166
  "/ping": {
6165
6167
  "post": {
6166
6168
  "summary": "Report agent liveness",
6167
- "description": "Refreshes the calling agent's status. Workers may send `X-Runtime-Instance-ID`, the per-boot identifier of the calling process. It is ignored unless MULTI_RUNTIME_ENABLED is set. With multi-runtime mode on, the header must identify a live runtime of this agent; an absent, unknown, offline, or foreign identifier makes the call a no-op instead of an error, so workers predating the flag keep running.",
6169
+ "description": "Refreshes the calling agent's status. Workers may send `X-Runtime-Instance-ID`, the per-boot identifier of the calling process. It is ignored unless MULTI_RUNTIME_ENABLED is set. With multi-runtime mode on, the header must identify a live runtime of this agent; an absent, unknown, offline, or foreign identifier makes the call a no-op instead of an error, so workers predating the flag keep running. While the API is draining after SIGTERM, every response (this one included) carries `X-Swarm-Draining: 1`: workers hand off in-flight tasks and take no new work.",
6168
6170
  "tags": [
6169
6171
  "Core"
6170
6172
  ],
@@ -15138,6 +15140,353 @@
15138
15140
  }
15139
15141
  }
15140
15142
  },
15143
+ "/api/comb/review-batches": {
15144
+ "post": {
15145
+ "summary": "Send agent-fs comments to the swarm as one lead task",
15146
+ "description": "Comb's 'Send to swarm'. The server reads each comment again from agent-fs with its bootstrap key, skips replies, resolved comments, and comments already sent, and creates ONE task for the lead. Each sent comment gets a `[comb:sent task=<id>]` reply from the swarm service account. A comment is sent at most once. When an earlier send lost its reply, the batch posts that reply again (`repaired`). Answers 404 while COMB_ENABLED is off.",
15147
+ "tags": [
15148
+ "Comb"
15149
+ ],
15150
+ "security": [
15151
+ {
15152
+ "bearerAuth": []
15153
+ }
15154
+ ],
15155
+ "requestBody": {
15156
+ "content": {
15157
+ "application/json": {
15158
+ "schema": {
15159
+ "type": "object",
15160
+ "properties": {
15161
+ "orgId": {
15162
+ "type": "string",
15163
+ "minLength": 1
15164
+ },
15165
+ "driveId": {
15166
+ "type": "string",
15167
+ "minLength": 1
15168
+ },
15169
+ "commentIds": {
15170
+ "type": "array",
15171
+ "items": {
15172
+ "type": "string",
15173
+ "format": "uuid"
15174
+ },
15175
+ "minItems": 1,
15176
+ "maxItems": 50
15177
+ },
15178
+ "scopePath": {
15179
+ "type": "string",
15180
+ "minLength": 1,
15181
+ "maxLength": 1024
15182
+ }
15183
+ },
15184
+ "required": [
15185
+ "orgId",
15186
+ "driveId",
15187
+ "commentIds",
15188
+ "scopePath"
15189
+ ]
15190
+ }
15191
+ }
15192
+ }
15193
+ },
15194
+ "responses": {
15195
+ "200": {
15196
+ "description": "No new task: the batch only posted missing 'sent' replies again",
15197
+ "content": {
15198
+ "application/json": {
15199
+ "schema": {
15200
+ "type": "object",
15201
+ "properties": {
15202
+ "taskId": {
15203
+ "type": [
15204
+ "string",
15205
+ "null"
15206
+ ]
15207
+ },
15208
+ "sent": {
15209
+ "type": "array",
15210
+ "items": {
15211
+ "type": "string"
15212
+ }
15213
+ },
15214
+ "skipped": {
15215
+ "type": "array",
15216
+ "items": {
15217
+ "type": "object",
15218
+ "properties": {
15219
+ "id": {
15220
+ "type": "string"
15221
+ },
15222
+ "reason": {
15223
+ "type": "string",
15224
+ "enum": [
15225
+ "not-found",
15226
+ "reply",
15227
+ "resolved",
15228
+ "already-sent"
15229
+ ]
15230
+ },
15231
+ "taskId": {
15232
+ "type": "string"
15233
+ }
15234
+ },
15235
+ "required": [
15236
+ "id",
15237
+ "reason"
15238
+ ]
15239
+ }
15240
+ },
15241
+ "repaired": {
15242
+ "type": "array",
15243
+ "items": {
15244
+ "type": "object",
15245
+ "properties": {
15246
+ "id": {
15247
+ "type": "string"
15248
+ },
15249
+ "taskId": {
15250
+ "type": "string"
15251
+ }
15252
+ },
15253
+ "required": [
15254
+ "id",
15255
+ "taskId"
15256
+ ]
15257
+ }
15258
+ }
15259
+ },
15260
+ "required": [
15261
+ "taskId",
15262
+ "sent",
15263
+ "skipped",
15264
+ "repaired"
15265
+ ]
15266
+ }
15267
+ }
15268
+ }
15269
+ },
15270
+ "201": {
15271
+ "description": "Task created",
15272
+ "content": {
15273
+ "application/json": {
15274
+ "schema": {
15275
+ "type": "object",
15276
+ "properties": {
15277
+ "taskId": {
15278
+ "type": [
15279
+ "string",
15280
+ "null"
15281
+ ]
15282
+ },
15283
+ "sent": {
15284
+ "type": "array",
15285
+ "items": {
15286
+ "type": "string"
15287
+ }
15288
+ },
15289
+ "skipped": {
15290
+ "type": "array",
15291
+ "items": {
15292
+ "type": "object",
15293
+ "properties": {
15294
+ "id": {
15295
+ "type": "string"
15296
+ },
15297
+ "reason": {
15298
+ "type": "string",
15299
+ "enum": [
15300
+ "not-found",
15301
+ "reply",
15302
+ "resolved",
15303
+ "already-sent"
15304
+ ]
15305
+ },
15306
+ "taskId": {
15307
+ "type": "string"
15308
+ }
15309
+ },
15310
+ "required": [
15311
+ "id",
15312
+ "reason"
15313
+ ]
15314
+ }
15315
+ },
15316
+ "repaired": {
15317
+ "type": "array",
15318
+ "items": {
15319
+ "type": "object",
15320
+ "properties": {
15321
+ "id": {
15322
+ "type": "string"
15323
+ },
15324
+ "taskId": {
15325
+ "type": "string"
15326
+ }
15327
+ },
15328
+ "required": [
15329
+ "id",
15330
+ "taskId"
15331
+ ]
15332
+ }
15333
+ }
15334
+ },
15335
+ "required": [
15336
+ "taskId",
15337
+ "sent",
15338
+ "skipped",
15339
+ "repaired"
15340
+ ]
15341
+ }
15342
+ }
15343
+ }
15344
+ },
15345
+ "400": {
15346
+ "description": "Invalid body, or not the swarm drive",
15347
+ "content": {
15348
+ "application/json": {
15349
+ "schema": {
15350
+ "$ref": "#/components/schemas/ErrorResponse"
15351
+ }
15352
+ }
15353
+ }
15354
+ },
15355
+ "403": {
15356
+ "description": "Caller cannot create tasks",
15357
+ "content": {
15358
+ "application/json": {
15359
+ "schema": {
15360
+ "$ref": "#/components/schemas/ErrorResponse"
15361
+ }
15362
+ }
15363
+ }
15364
+ },
15365
+ "404": {
15366
+ "description": "Comb is not enabled",
15367
+ "content": {
15368
+ "application/json": {
15369
+ "schema": {
15370
+ "$ref": "#/components/schemas/ErrorResponse"
15371
+ }
15372
+ }
15373
+ }
15374
+ },
15375
+ "409": {
15376
+ "description": "Nothing to send (every comment was skipped)",
15377
+ "content": {
15378
+ "application/json": {
15379
+ "schema": {
15380
+ "type": "object",
15381
+ "properties": {
15382
+ "error": {
15383
+ "type": "string"
15384
+ },
15385
+ "skipped": {
15386
+ "type": "array",
15387
+ "items": {
15388
+ "type": "object",
15389
+ "properties": {
15390
+ "id": {
15391
+ "type": "string"
15392
+ },
15393
+ "reason": {
15394
+ "type": "string",
15395
+ "enum": [
15396
+ "not-found",
15397
+ "reply",
15398
+ "resolved",
15399
+ "already-sent"
15400
+ ]
15401
+ },
15402
+ "taskId": {
15403
+ "type": "string"
15404
+ }
15405
+ },
15406
+ "required": [
15407
+ "id",
15408
+ "reason"
15409
+ ]
15410
+ }
15411
+ }
15412
+ },
15413
+ "required": [
15414
+ "error",
15415
+ "skipped"
15416
+ ]
15417
+ }
15418
+ }
15419
+ }
15420
+ },
15421
+ "422": {
15422
+ "description": "Task creation blocked by an extension",
15423
+ "content": {
15424
+ "application/json": {
15425
+ "schema": {
15426
+ "$ref": "#/components/schemas/ErrorResponse"
15427
+ }
15428
+ }
15429
+ }
15430
+ },
15431
+ "502": {
15432
+ "description": "agent-fs could not read a comment",
15433
+ "content": {
15434
+ "application/json": {
15435
+ "schema": {
15436
+ "$ref": "#/components/schemas/ErrorResponse"
15437
+ }
15438
+ }
15439
+ }
15440
+ },
15441
+ "503": {
15442
+ "description": "agent-fs or the swarm drive is not set up, or an operator disabled a Comb review template",
15443
+ "content": {
15444
+ "application/json": {
15445
+ "schema": {
15446
+ "type": "object",
15447
+ "properties": {
15448
+ "error": {
15449
+ "type": "string"
15450
+ },
15451
+ "skipped": {
15452
+ "type": "array",
15453
+ "items": {
15454
+ "type": "object",
15455
+ "properties": {
15456
+ "id": {
15457
+ "type": "string"
15458
+ },
15459
+ "reason": {
15460
+ "type": "string",
15461
+ "enum": [
15462
+ "not-found",
15463
+ "reply",
15464
+ "resolved",
15465
+ "already-sent"
15466
+ ]
15467
+ },
15468
+ "taskId": {
15469
+ "type": "string"
15470
+ }
15471
+ },
15472
+ "required": [
15473
+ "id",
15474
+ "reason"
15475
+ ]
15476
+ }
15477
+ }
15478
+ },
15479
+ "required": [
15480
+ "error",
15481
+ "skipped"
15482
+ ]
15483
+ }
15484
+ }
15485
+ }
15486
+ }
15487
+ }
15488
+ }
15489
+ },
15141
15490
  "/api/tasks/{id}/context": {
15142
15491
  "post": {
15143
15492
  "summary": "Record a context usage snapshot for a task",
@@ -18552,7 +18901,8 @@
18552
18901
  "enum": [
18553
18902
  "page",
18554
18903
  "workflow",
18555
- "schedule"
18904
+ "schedule",
18905
+ "agent-fs-path"
18556
18906
  ]
18557
18907
  },
18558
18908
  "required": false,
@@ -18630,7 +18980,8 @@
18630
18980
  "enum": [
18631
18981
  "page",
18632
18982
  "workflow",
18633
- "schedule"
18983
+ "schedule",
18984
+ "agent-fs-path"
18634
18985
  ]
18635
18986
  },
18636
18987
  "itemId": {
@@ -18666,7 +19017,8 @@
18666
19017
  "enum": [
18667
19018
  "page",
18668
19019
  "workflow",
18669
- "schedule"
19020
+ "schedule",
19021
+ "agent-fs-path"
18670
19022
  ]
18671
19023
  },
18672
19024
  "itemId": {
@@ -25137,7 +25489,7 @@
25137
25489
  "/status": {
25138
25490
  "get": {
25139
25491
  "summary": "Identity + setup readiness + live activity for the swarm dashboard",
25140
- "description": "Single source of truth consumed by the UI home page. Identity comes from SWARM_* envs; setup milestones each emit `unverified | configured | verified`; automations report `running | needs_setup` from the same runtime preflight used at dispatch; activity counts agents alive in the last 5 min and tasks created in the last 24h; agent_fs reports whether AGENT_FS_API_URL is set; telemetry reports the effective ANONYMIZED_TELEMETRY opt-out state.",
25492
+ "description": "Single source of truth consumed by the UI home page. Identity comes from SWARM_* envs; setup milestones each emit `unverified | configured | verified`; automations report `running | needs_setup` from the same runtime preflight used at dispatch; activity counts agents alive in the last 5 min and tasks created in the last 24h; agent_fs reports whether AGENT_FS_API_URL is set, plus the Comb settings (COMB_ENABLED, the browser-facing agent-fs URL, the shared org and drive ids, and the agent-fs user id of the swarm service account); telemetry reports the effective ANONYMIZED_TELEMETRY opt-out state.",
25141
25493
  "tags": [
25142
25494
  "Status"
25143
25495
  ],
@@ -25338,13 +25690,57 @@
25338
25690
  "capabilities": {
25339
25691
  "type": "object",
25340
25692
  "additionalProperties": {}
25693
+ },
25694
+ "comb": {
25695
+ "type": "object",
25696
+ "properties": {
25697
+ "enabled": {
25698
+ "type": "boolean"
25699
+ },
25700
+ "api_url": {
25701
+ "type": [
25702
+ "string",
25703
+ "null"
25704
+ ]
25705
+ },
25706
+ "live_url": {
25707
+ "type": "string"
25708
+ },
25709
+ "org_id": {
25710
+ "type": [
25711
+ "string",
25712
+ "null"
25713
+ ]
25714
+ },
25715
+ "drive_id": {
25716
+ "type": [
25717
+ "string",
25718
+ "null"
25719
+ ]
25720
+ },
25721
+ "service_user_id": {
25722
+ "type": [
25723
+ "string",
25724
+ "null"
25725
+ ]
25726
+ }
25727
+ },
25728
+ "required": [
25729
+ "enabled",
25730
+ "api_url",
25731
+ "live_url",
25732
+ "org_id",
25733
+ "drive_id",
25734
+ "service_user_id"
25735
+ ]
25341
25736
  }
25342
25737
  },
25343
25738
  "required": [
25344
25739
  "configured",
25345
25740
  "base_url",
25346
25741
  "provider_id",
25347
- "capabilities"
25742
+ "capabilities",
25743
+ "comb"
25348
25744
  ]
25349
25745
  },
25350
25746
  "automations": {
@@ -25728,6 +26124,7 @@
25728
26124
  "timeout",
25729
26125
  "dimension",
25730
26126
  "model",
26127
+ "endpoint",
25731
26128
  "not_enabled",
25732
26129
  "expired",
25733
26130
  "unknown",
@@ -25783,6 +26180,7 @@
25783
26180
  "timeout",
25784
26181
  "dimension",
25785
26182
  "model",
26183
+ "endpoint",
25786
26184
  "not_enabled",
25787
26185
  "expired",
25788
26186
  "unknown",
@@ -25844,6 +26242,7 @@
25844
26242
  "timeout",
25845
26243
  "dimension",
25846
26244
  "model",
26245
+ "endpoint",
25847
26246
  "not_enabled",
25848
26247
  "expired",
25849
26248
  "unknown",
@@ -25901,6 +26300,7 @@
25901
26300
  "timeout",
25902
26301
  "dimension",
25903
26302
  "model",
26303
+ "endpoint",
25904
26304
  "not_enabled",
25905
26305
  "expired",
25906
26306
  "unknown",
@@ -25943,6 +26343,7 @@
25943
26343
  "openai",
25944
26344
  "openrouter",
25945
26345
  "vercel",
26346
+ "azure",
25946
26347
  "custom",
25947
26348
  "existing",
25948
26349
  null
@@ -25959,6 +26360,7 @@
25959
26360
  "timeout",
25960
26361
  "dimension",
25961
26362
  "model",
26363
+ "endpoint",
25962
26364
  "not_enabled",
25963
26365
  "expired",
25964
26366
  "unknown",
@@ -26017,6 +26419,7 @@
26017
26419
  "timeout",
26018
26420
  "dimension",
26019
26421
  "model",
26422
+ "endpoint",
26020
26423
  "not_enabled",
26021
26424
  "expired",
26022
26425
  "unknown",
@@ -26072,6 +26475,7 @@
26072
26475
  "timeout",
26073
26476
  "dimension",
26074
26477
  "model",
26478
+ "endpoint",
26075
26479
  "not_enabled",
26076
26480
  "expired",
26077
26481
  "unknown",
@@ -26513,6 +26917,7 @@
26513
26917
  "timeout",
26514
26918
  "dimension",
26515
26919
  "model",
26920
+ "endpoint",
26516
26921
  "not_enabled",
26517
26922
  "expired",
26518
26923
  "unknown"
@@ -26710,6 +27115,7 @@
26710
27115
  "timeout",
26711
27116
  "dimension",
26712
27117
  "model",
27118
+ "endpoint",
26713
27119
  "not_enabled",
26714
27120
  "expired",
26715
27121
  "unknown",
@@ -26765,6 +27171,7 @@
26765
27171
  "timeout",
26766
27172
  "dimension",
26767
27173
  "model",
27174
+ "endpoint",
26768
27175
  "not_enabled",
26769
27176
  "expired",
26770
27177
  "unknown",
@@ -26826,6 +27233,7 @@
26826
27233
  "timeout",
26827
27234
  "dimension",
26828
27235
  "model",
27236
+ "endpoint",
26829
27237
  "not_enabled",
26830
27238
  "expired",
26831
27239
  "unknown",
@@ -26883,6 +27291,7 @@
26883
27291
  "timeout",
26884
27292
  "dimension",
26885
27293
  "model",
27294
+ "endpoint",
26886
27295
  "not_enabled",
26887
27296
  "expired",
26888
27297
  "unknown",
@@ -26925,6 +27334,7 @@
26925
27334
  "openai",
26926
27335
  "openrouter",
26927
27336
  "vercel",
27337
+ "azure",
26928
27338
  "custom",
26929
27339
  "existing",
26930
27340
  null
@@ -26941,6 +27351,7 @@
26941
27351
  "timeout",
26942
27352
  "dimension",
26943
27353
  "model",
27354
+ "endpoint",
26944
27355
  "not_enabled",
26945
27356
  "expired",
26946
27357
  "unknown",
@@ -26999,6 +27410,7 @@
26999
27410
  "timeout",
27000
27411
  "dimension",
27001
27412
  "model",
27413
+ "endpoint",
27002
27414
  "not_enabled",
27003
27415
  "expired",
27004
27416
  "unknown",
@@ -27054,6 +27466,7 @@
27054
27466
  "timeout",
27055
27467
  "dimension",
27056
27468
  "model",
27469
+ "endpoint",
27057
27470
  "not_enabled",
27058
27471
  "expired",
27059
27472
  "unknown",
@@ -27280,6 +27693,7 @@
27280
27693
  "openai",
27281
27694
  "openrouter",
27282
27695
  "vercel",
27696
+ "azure",
27283
27697
  "custom",
27284
27698
  "existing"
27285
27699
  ]
@@ -27342,6 +27756,7 @@
27342
27756
  "timeout",
27343
27757
  "dimension",
27344
27758
  "model",
27759
+ "endpoint",
27345
27760
  "not_enabled",
27346
27761
  "expired",
27347
27762
  "unknown"
@@ -29362,6 +29777,7 @@
29362
29777
  "/api/poll": {
29363
29778
  "get": {
29364
29779
  "summary": "Poll for triggers (tasks, mentions)",
29780
+ "description": "While the API is draining after SIGTERM it dispatches nothing: the answer is `{ trigger: null }` and carries `X-Swarm-Draining: 1`, the signal for a worker to hand off in-flight tasks.",
29365
29781
  "tags": [
29366
29782
  "Poll"
29367
29783
  ],
@@ -29463,6 +29879,9 @@
29463
29879
  "taskId": {
29464
29880
  "type": "string"
29465
29881
  },
29882
+ "triggerSurface": {
29883
+ "type": "string"
29884
+ },
29466
29885
  "task": {
29467
29886
  "allOf": [
29468
29887
  {
@@ -30531,6 +30950,63 @@
30531
30950
  }
30532
30951
  }
30533
30952
  },
30953
+ "/api/realtime/ticket": {
30954
+ "post": {
30955
+ "summary": "Issue a one-shot dashboard realtime ticket",
30956
+ "tags": [
30957
+ "Rooms"
30958
+ ],
30959
+ "security": [
30960
+ {
30961
+ "bearerAuth": []
30962
+ }
30963
+ ],
30964
+ "responses": {
30965
+ "200": {
30966
+ "description": "One-shot realtime ticket",
30967
+ "content": {
30968
+ "application/json": {
30969
+ "schema": {
30970
+ "type": "object",
30971
+ "properties": {
30972
+ "ticket": {
30973
+ "type": "string"
30974
+ },
30975
+ "expiresAt": {
30976
+ "type": "integer"
30977
+ }
30978
+ },
30979
+ "required": [
30980
+ "ticket",
30981
+ "expiresAt"
30982
+ ]
30983
+ }
30984
+ }
30985
+ }
30986
+ },
30987
+ "403": {
30988
+ "description": "Comb presence is not allowed",
30989
+ "content": {
30990
+ "application/json": {
30991
+ "schema": {
30992
+ "$ref": "#/components/schemas/ErrorResponse"
30993
+ }
30994
+ }
30995
+ }
30996
+ },
30997
+ "404": {
30998
+ "description": "Comb is not enabled",
30999
+ "content": {
31000
+ "application/json": {
31001
+ "schema": {
31002
+ "$ref": "#/components/schemas/ErrorResponse"
31003
+ }
31004
+ }
31005
+ }
31006
+ }
31007
+ }
31008
+ }
31009
+ },
30534
31010
  "/@swarm/realtime.js": {
30535
31011
  "get": {
30536
31012
  "summary": "Browser SDK for realtime rooms and channels",
@@ -40787,7 +41263,8 @@
40787
41263
  "schedule",
40788
41264
  "workflow",
40789
41265
  "linear",
40790
- "jira"
41266
+ "jira",
41267
+ "comb"
40791
41268
  ],
40792
41269
  "default": "mcp"
40793
41270
  },
@@ -46123,7 +46600,8 @@
46123
46600
  "schedule",
46124
46601
  "workflow",
46125
46602
  "linear",
46126
- "jira"
46603
+ "jira",
46604
+ "comb"
46127
46605
  ],
46128
46606
  "default": "mcp"
46129
46607
  },
@@ -46433,7 +46911,8 @@
46433
46911
  "schedule",
46434
46912
  "workflow",
46435
46913
  "linear",
46436
- "jira"
46914
+ "jira",
46915
+ "comb"
46437
46916
  ]
46438
46917
  },
46439
46918
  "outputSchema": {