@desplega.ai/agent-swarm 2.7.2 → 2.7.3

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 (220) hide show
  1. package/README.md +6 -0
  2. package/dist/{acp-adapter-624yge7a.js → acp-adapter-pdzw76ja.js} +1 -1
  3. package/dist/{actions-rd9xn281.js → actions-a90cfpca.js} +21 -21
  4. package/dist/{amp-adapter-k27hc00p.js → amp-adapter-4vtywcjk.js} +2 -2
  5. package/dist/{app-sjm3xc7g.js → app-8k68gygk.js} +3 -3
  6. package/dist/{assistant-6jbzs8wa.js → assistant-ck01q2yg.js} +32 -21
  7. package/dist/{boot-reembed-e2348eqc.js → boot-reembed-33spavpd.js} +1 -1
  8. package/dist/{boot-reembed-w53pd5xt.js → boot-reembed-xzge83a2.js} +1 -1
  9. package/dist/{boot-scrub-sweep-cpy4yg97.js → boot-scrub-sweep-mxvb8dr3.js} +3 -3
  10. package/dist/{boot-seeds-f6j4t6k6.js → boot-seeds-rpm8bb5r.js} +4 -4
  11. package/dist/{claude-adapter-v3ac8esd.js → claude-adapter-q12bcfj9.js} +3 -3
  12. package/dist/{claude-managed-setup-yyrkqvtm.js → claude-managed-setup-11vb6q89.js} +1 -1
  13. package/dist/{claude-sdk-session-85j69v6d.js → claude-sdk-session-gkv1107j.js} +10325 -10243
  14. package/dist/{cli-rs59z1qx.js → cli-07pcqwaj.js} +1 -1
  15. package/dist/{cli-6vq3ymqm.js → cli-0tkm519n.js} +1 -1
  16. package/dist/{cli-s7cm1927.js → cli-0xzbk52h.js} +4 -4
  17. package/dist/{cli-g0zc1b40.js → cli-0zae6bs6.js} +2 -2
  18. package/dist/{cli-p8yrsmfn.js → cli-10kjx0dm.js} +1 -1
  19. package/dist/{cli-7xsq63pe.js → cli-157ykn37.js} +10 -9
  20. package/dist/{cli-vjcj9k2p.js → cli-2h0rfmqk.js} +1 -1
  21. package/dist/{cli-9wasax9f.js → cli-35nzvqaf.js} +1 -1
  22. package/dist/{cli-e1p7dqe1.js → cli-4aydmmdy.js} +24 -3
  23. package/dist/{cli-942pp3bc.js → cli-54ax65rn.js} +3 -3
  24. package/dist/{cli-10cp92df.js → cli-5ke7gxwr.js} +6 -6
  25. package/dist/{cli-femw4q81.js → cli-6151a7dr.js} +2 -2
  26. package/dist/{cli-3cywb44q.js → cli-77eq8txs.js} +85 -3
  27. package/dist/{cli-atpfk4yd.js → cli-7cwrwb5x.js} +5 -5
  28. package/dist/{cli-bfbpvccx.js → cli-8a1k6mat.js} +61 -49
  29. package/dist/{cli-c18941tx.js → cli-8ch3b2r7.js} +3 -3
  30. package/dist/{cli-rs2s1t05.js → cli-9fk56y8c.js} +4 -4
  31. package/dist/{cli-0wx63vvw.js → cli-9km88w11.js} +1 -1
  32. package/dist/{cli-qy0z3mfj.js → cli-9vttw9nz.js} +56 -46
  33. package/dist/{cli-mzgppb7q.js → cli-a0w50zw9.js} +4 -4
  34. package/dist/{cli-z8a4mfz1.js → cli-aqp59jmv.js} +4 -4
  35. package/dist/{cli-5d8wd50e.js → cli-bs0fwb23.js} +1 -1
  36. package/dist/{cli-fa4kxxx3.js → cli-ct5920jb.js} +2 -2
  37. package/dist/{cli-0awbtmv2.js → cli-dek8hqjc.js} +10 -10
  38. package/dist/{cli-qp6adcmw.js → cli-e24w2mvk.js} +1 -1
  39. package/dist/{cli-t3npd8hm.js → cli-ghfhn1qc.js} +1 -1
  40. package/dist/{cli-jmcf8cnz.js → cli-ja369zab.js} +1 -1
  41. package/dist/{cli-wtjg6je3.js → cli-jhh7tbx6.js} +1 -1
  42. package/dist/{cli-e19bgatr.js → cli-jmk31131.js} +2 -2
  43. package/dist/{cli-2cj8fqv1.js → cli-kjcdzea8.js} +1 -1
  44. package/dist/{cli-1xpr5992.js → cli-kjha1q9k.js} +3 -3
  45. package/dist/{cli-9jfty8px.js → cli-ktcdczth.js} +538 -30
  46. package/dist/{cli-exd52qn4.js → cli-mcmpbpcc.js} +2 -2
  47. package/dist/{cli-2m2p3snc.js → cli-mmf43vcp.js} +6 -6
  48. package/dist/{cli-b2rhbaty.js → cli-pnm99spe.js} +10 -10
  49. package/dist/{cli-9jn9cj0q.js → cli-v9jk2k63.js} +1 -1
  50. package/dist/{cli-mt7bxjfd.js → cli-vhgcwppn.js} +1 -1
  51. package/dist/{cli-qa4hgda3.js → cli-vvz64zc5.js} +14 -13
  52. package/dist/{cli-txr0z97c.js → cli-wmhajw68.js} +171 -32
  53. package/dist/{cli-hzrmv8pg.js → cli-x38rmhap.js} +3 -3
  54. package/dist/{cli-hq9hd4hp.js → cli-xz6qjdqj.js} +1 -1
  55. package/dist/{cli-g9ypd5en.js → cli-z52gq55b.js} +4 -0
  56. package/dist/{cli-2qbmjfta.js → cli-z6219sd3.js} +4 -4
  57. package/dist/cli.js +19 -19
  58. package/dist/{codex-adapter-zm1bkdde.js → codex-adapter-46kbvvkx.js} +1 -1
  59. package/dist/{codex-hook-tkag7fxq.js → codex-hook-tm9ecrd5.js} +1 -1
  60. package/dist/{codex-session-runner-8k02mqw2.js → codex-session-runner-qy93hdrv.js} +1 -1
  61. package/dist/{commands-nw1dn4av.js → commands-hwdhacfx.js} +2 -2
  62. package/dist/{controller-3kkkmps0.js → controller-hjza5p1f.js} +3 -3
  63. package/dist/{controllers-connect-n2c4167r.js → controllers-connect-7m25cay2.js} +20 -20
  64. package/dist/{cursor-adapter-h5028emw.js → cursor-adapter-1qh7ps8w.js} +1 -1
  65. package/dist/{db-76y2msnf.js → db-w23k9301.js} +2 -2
  66. package/dist/{db-8rk0p8j1.js → db-wm8by383.js} +3 -3
  67. package/dist/{dispatcher-xp4wsx30.js → dispatcher-en25ebgc.js} +18 -18
  68. package/dist/{dsh-adapter-vyrr31bn.js → dsh-adapter-zkme32vd.js} +1 -1
  69. package/dist/{e2b-eesfj689.js → e2b-9z9mvt2p.js} +1 -1
  70. package/dist/{e2b-03nha1wz.js → e2b-yhvn70es.js} +1 -1
  71. package/dist/{embedding-space-ejefyep1.js → embedding-space-rgf4aypt.js} +6 -6
  72. package/dist/{embeddings-w297xaw0.js → embeddings-z9cmxhx1.js} +1 -1
  73. package/dist/{external-channel-mf9vp1fe.js → external-channel-g6vv85zv.js} +2 -2
  74. package/dist/{grok-adapter-mpzyyprz.js → grok-adapter-f6n1tpq3.js} +2 -2
  75. package/dist/handlers-ss5948rq.js +42 -0
  76. package/dist/{heartbeat-qnaycjzs.js → heartbeat-5xcdzz45.js} +21 -21
  77. package/dist/{hook-h6sqfzxr.js → hook-6423rme3.js} +2 -2
  78. package/dist/{hook-4zqdgea4.js → hook-8dk1csdd.js} +4 -4
  79. package/dist/{http-65ts210h.js → http-6mfh2ww9.js} +255 -60
  80. package/dist/{index-sqe7f6mj.js → index-0js6bgff.js} +1 -1
  81. package/dist/{index-farm1zsn.js → index-0ng1dd1t.js} +10937 -9527
  82. package/dist/{index-k3ewf1jg.js → index-5eyn1wc5.js} +18 -18
  83. package/dist/{index-vp4wa3qn.js → index-71gnebsn.js} +18 -18
  84. package/dist/{index-hdfad00b.js → index-q5gzpjdd.js} +12 -10
  85. package/dist/index-z3b1vfjx.js +44 -0
  86. package/dist/{keepalive-52k6skha.js → keepalive-cymckeg6.js} +3 -3
  87. package/dist/{lead-y9rj0gr1.js → lead-baknj2dh.js} +29 -29
  88. package/dist/{maintenance-f86wqfq6.js → maintenance-dfrnsx3n.js} +1 -1
  89. package/dist/{oauth-refresh-sweep-vddv9ky7.js → oauth-refresh-sweep-5dztk8x6.js} +2 -2
  90. package/dist/{onboard-8z2qk6gq.js → onboard-h36vja6y.js} +11 -6
  91. package/dist/{otel-impl-epet9j18.js → otel-impl-jerq8vz8.js} +1 -1
  92. package/dist/{pricing-refresh-6wm42a51.js → pricing-refresh-t3nx5krn.js} +3 -3
  93. package/dist/{rbac-roles-2kfcs1sc.js → rbac-roles-dw1awawd.js} +2 -2
  94. package/dist/{rbac-roles-13a0vj6d.js → rbac-roles-km0fc3e8.js} +1 -1
  95. package/dist/{registry-ajhexe44.js → registry-hzfh268v.js} +1 -1
  96. package/dist/{render-v2-cy8zsfsf.js → render-v2-65x4ayj8.js} +3 -3
  97. package/dist/{resume-c783qe6b.js → resume-61znk3hj.js} +6 -6
  98. package/dist/{session-access-s4tv0az8.js → session-access-4yc9htrg.js} +4 -4
  99. package/dist/{session-source-backfill-qzapz0ne.js → session-source-backfill-kr5bdjtp.js} +2 -2
  100. package/dist/{setup-st7htx1k.js → setup-9h61yr2p.js} +1 -1
  101. package/dist/{work-objects-ftj4zw70.js → work-objects-x7rb53qn.js} +27 -22
  102. package/dist/{worker-859fk25k.js → worker-7f3khgn0.js} +29 -29
  103. package/openapi.json +134 -3
  104. package/package.json +5 -5
  105. package/src/be/db/agents.ts +16 -1
  106. package/src/be/db/runtime.ts +25 -15
  107. package/src/be/db/session-summaries.ts +120 -0
  108. package/src/be/db/tasks/read.ts +7 -4
  109. package/src/be/db/tasks/search-index.ts +159 -0
  110. package/src/be/db/tasks/write.ts +3 -0
  111. package/src/be/db-queries/slack-inbound.ts +77 -0
  112. package/src/be/db.ts +27 -8
  113. package/src/be/mcp-overflow-sweep.ts +39 -0
  114. package/src/be/migrations/253_session_summaries.sql +300 -0
  115. package/src/be/migrations/254_query_audit_indexes.sql +25 -0
  116. package/src/be/migrations/256_agent_slack_icon.sql +2 -0
  117. package/src/be/migrations/257_agent_tasks_fts.sql +55 -0
  118. package/src/comb/config.ts +6 -2
  119. package/src/comb/requester.ts +69 -0
  120. package/src/comb/review-batch.ts +24 -2
  121. package/src/commands/onboard/agent-fs-version.ts +1 -1
  122. package/src/commands/onboard/compose-generator.ts +7 -2
  123. package/src/commands/onboard/env-generator.ts +8 -3
  124. package/src/commands/runner.ts +41 -24
  125. package/src/fs/agent-fs-provider.ts +9 -0
  126. package/src/heartbeat/heartbeat.ts +13 -6
  127. package/src/http/agents.ts +10 -2
  128. package/src/http/index.ts +15 -0
  129. package/src/http/integrations.ts +20 -0
  130. package/src/http/list-total-cache.ts +62 -0
  131. package/src/http/sessions.ts +9 -2
  132. package/src/http/slack-inbound.ts +1 -0
  133. package/src/http/status.ts +4 -1
  134. package/src/http/tasks.ts +12 -2
  135. package/src/providers/amp-adapter.ts +1 -1
  136. package/src/providers/cursor-adapter.ts +1 -1
  137. package/src/providers/dsh-adapter.ts +1 -1
  138. package/src/queue-stall-alarm.ts +4 -1
  139. package/src/slack/actions.ts +2 -2
  140. package/src/slack/app-icon.ts +50 -0
  141. package/src/slack/app.ts +13 -1
  142. package/src/slack/assistant.ts +22 -1
  143. package/src/slack/event-dedup.test.ts +11 -0
  144. package/src/slack/event-dedup.ts +8 -4
  145. package/src/slack/inbound-dispatch.ts +58 -0
  146. package/src/slack/render-v2.ts +7 -8
  147. package/src/slack/responses.ts +21 -8
  148. package/src/slack/socket-ack.ts +237 -0
  149. package/src/slack/thread-buffer.ts +3 -5
  150. package/src/slack/watcher.ts +2 -2
  151. package/src/slack/work-objects.ts +5 -1
  152. package/src/tests/agent-fs-release-notes.test.ts +40 -0
  153. package/src/tests/agent-slack-icon.test.ts +85 -0
  154. package/src/tests/approval-cancellation-migration.test.ts +2 -0
  155. package/src/tests/asset-key-migration.test.ts +26 -0
  156. package/src/tests/comb-default.test.ts +159 -0
  157. package/src/tests/comb-review-batch.test.ts +192 -4
  158. package/src/tests/comb-status.test.ts +65 -2
  159. package/src/tests/db-agents.test.ts +13 -0
  160. package/src/tests/db-tasks-read.test.ts +10 -15
  161. package/src/tests/deploy-one-box.test.ts +161 -0
  162. package/src/tests/deploy-stubs.ts +68 -0
  163. package/src/tests/docs-index-footprint.test.js +3 -3
  164. package/src/tests/dsh-adapter.test.ts +1 -1
  165. package/src/tests/e2e-codex-auth-chain.test.ts +18 -1
  166. package/src/tests/fixtures/deploy-stubs/bun +3 -0
  167. package/src/tests/fixtures/deploy-stubs/bunx +27 -0
  168. package/src/tests/fixtures/deploy-stubs/curl +26 -0
  169. package/src/tests/fixtures/deploy-stubs/docker +122 -0
  170. package/src/tests/fixtures/onboard/content.compose.yml.txt +5 -5
  171. package/src/tests/fixtures/onboard/dev.compose.yml.txt +4 -4
  172. package/src/tests/fixtures/onboard/full-all.compose.yml.txt +12 -12
  173. package/src/tests/fixtures/onboard/full.compose.yml.txt +12 -12
  174. package/src/tests/fixtures/onboard/research.compose.yml.txt +4 -4
  175. package/src/tests/fixtures/onboard/solo.compose.yml.txt +2 -2
  176. package/src/tests/heartbeat-expiry.test.ts +151 -25
  177. package/src/tests/http-api-integration.test.ts +31 -0
  178. package/src/tests/human-free-reclassify.test.ts +6 -0
  179. package/src/tests/install-sh-bind.test.ts +242 -0
  180. package/src/tests/install-sh-tunnel.test.ts +89 -0
  181. package/src/tests/kv-storage.test.ts +28 -0
  182. package/src/tests/list-endpoint-slimming.test.ts +3 -0
  183. package/src/tests/list-total-cache.test.ts +63 -0
  184. package/src/tests/mcp-overflow-sweep.test.ts +84 -0
  185. package/src/tests/onboard-compose.test.ts +17 -3
  186. package/src/tests/onboard-env.test.ts +13 -0
  187. package/src/tests/onboarding.test.ts +1 -1
  188. package/src/tests/preload.ts +1 -0
  189. package/src/tests/query-audit-plans.test.ts +314 -0
  190. package/src/tests/script-connections.test.ts +6 -0
  191. package/src/tests/session-summaries.test.ts +384 -0
  192. package/src/tests/sessions-tree.test.ts +5 -1
  193. package/src/tests/slack-app-icon.test.ts +90 -0
  194. package/src/tests/slack-external-channel-egress.test.ts +1 -1
  195. package/src/tests/slack-inbound-receipts.test.ts +34 -0
  196. package/src/tests/slack-inline-output.test.ts +29 -2
  197. package/src/tests/slack-render-v2-query-plans.test.ts +3 -2
  198. package/src/tests/slack-render-v2.test.ts +35 -0
  199. package/src/tests/slack-socket-ack.test.ts +553 -0
  200. package/src/tests/task-lineage.test.ts +3 -0
  201. package/src/tests/task-search-filter.test.ts +4 -4
  202. package/src/tests/task-search-fts.test.ts +320 -0
  203. package/src/tests/update-profile-auth.test.ts +28 -0
  204. package/src/tools/get-swarm.ts +1 -0
  205. package/src/tools/get-tasks.ts +6 -1
  206. package/src/tools/join-swarm.ts +1 -0
  207. package/src/tools/my-agent-info.ts +1 -0
  208. package/src/tools/slack-post.ts +2 -2
  209. package/src/tools/slack-reply.ts +2 -2
  210. package/src/tools/slack-start-thread.ts +2 -2
  211. package/src/tools/slack-update.ts +1 -1
  212. package/src/tools/update-profile.ts +20 -4
  213. package/src/tools/utils.ts +3 -4
  214. package/src/types.ts +47 -0
  215. package/src/utils/constants.ts +127 -5
  216. package/templates/official/lead/HEARTBEAT.md +4 -2
  217. package/templates/official/lead/config.json +2 -2
  218. package/templates/skills/swarm-docs/content.md +2 -0
  219. package/dist/handlers-7x8sywgr.js +0 -42
  220. package/dist/index-mc30r1hs.js +0 -44
@@ -2,7 +2,7 @@
2
2
  * Shared constants used across worker- and server-side code.
3
3
  */
4
4
 
5
- import { isEnvFlagEnabled } from "./env-flag";
5
+ import { isEnvFlagEnabled, parseEnvFlag } from "./env-flag";
6
6
 
7
7
  /** Maximum profile-file length in JavaScript characters (not UTF-8 bytes). */
8
8
  export const MAX_PROFILE_FILE_LENGTH = 256 * 1024;
@@ -187,13 +187,135 @@ export function buildAgentFsLiveUrl(opts: AgentFsFileRef): string | null {
187
187
  return route ? `${getAgentFsLiveUrl()}/file/~/${route}` : null;
188
188
  }
189
189
 
190
+ /** RFC 1918 private and 169.254/16 link-local IPv4 space, by its first two octets. */
191
+ function isPrivateIpv4(a: number, b: number): boolean {
192
+ return (
193
+ a === 10 ||
194
+ (a === 172 && b >= 16 && b <= 31) ||
195
+ (a === 192 && b === 168) ||
196
+ (a === 169 && b === 254)
197
+ );
198
+ }
199
+
190
200
  /**
191
- * Comb (the agent-fs review space in the dashboard) is on: `COMB_ENABLED` plus
192
- * an agent-fs API URL. `getCombConfig()` (`src/comb/config.ts`) reports it.
201
+ * The eight 16-bit groups of an IPv6 literal (no brackets), or null when it is
202
+ * malformed. `new URL` already normalizes a host to compressed hex, so a
203
+ * dotted IPv4 tail never reaches here; one is rejected rather than parsed.
193
204
  */
194
- export function isCombEnabled(): boolean {
205
+ function parseIpv6(addr: string): number[] | null {
206
+ if (addr.includes(".")) return null;
207
+ const halves = addr.split("::");
208
+ if (halves.length > 2) return null;
209
+ const toGroups = (part: string): number[] | null => {
210
+ if (!part) return [];
211
+ const groups = part
212
+ .split(":")
213
+ .map((g) => (/^[0-9a-f]{1,4}$/.test(g) ? Number.parseInt(g, 16) : Number.NaN));
214
+ return groups.some(Number.isNaN) ? null : groups;
215
+ };
216
+ const head = toGroups(halves[0] ?? "");
217
+ const tail = toGroups(halves[1] ?? "");
218
+ if (!head || !tail) return null;
219
+ if (halves.length === 1) return head.length === 8 ? head : null;
220
+ const missing = 8 - head.length - tail.length;
221
+ return missing < 1 ? null : [...head, ...new Array<number>(missing).fill(0), ...tail];
222
+ }
223
+
224
+ /**
225
+ * Whether a browser can plausibly open this URL. False for the addresses only
226
+ * the swarm's own network resolves: a single-label host (a docker or compose
227
+ * service such as `agent-fs`), `*.internal` (Railway, Fly, GCP),
228
+ * `*.svc` / `*.cluster.local` (Kubernetes), and private, link-local or
229
+ * unique-local IPs, including IPv4-mapped IPv6 (`::ffff:10.0.0.5`), `::` and
230
+ * multicast `ff00::/8`. Loopback counts as reachable: a localhost URL means the
231
+ * API and agent-fs share a host, which only works for a browser on that same
232
+ * machine (the local dev setup), and a remote operator can set `COMB_ENABLED`.
233
+ * An unparseable value is not reachable.
234
+ */
235
+ export function isBrowserReachableUrl(value: string): boolean {
236
+ let host: string;
237
+ try {
238
+ host = new URL(value).hostname.toLowerCase().replace(/\.$/, "");
239
+ } catch {
240
+ return false;
241
+ }
242
+ if (!host) return false;
243
+ if (host === "localhost" || host.endsWith(".localhost")) return true;
244
+ if (host.startsWith("[")) {
245
+ const parsed = parseIpv6(host.slice(1, -1));
246
+ if (!parsed) return false;
247
+ const g = (i: number) => parsed[i] ?? 0;
248
+ // Loopback is reachable (the local dev setup).
249
+ if (parsed.slice(0, 7).every((x) => x === 0) && g(7) === 1) return true;
250
+ // `::` and multicast `ff00::/8` are not addresses a browser can open.
251
+ if (parsed.every((x) => x === 0) || (g(0) & 0xff00) === 0xff00) return false;
252
+ // Unique-local `fc00::/7` and link-local `fe80::/10`.
253
+ if ((g(0) & 0xfe00) === 0xfc00 || (g(0) & 0xffc0) === 0xfe80) return false;
254
+ // IPv4-mapped `::ffff:a.b.c.d`: judge the embedded IPv4 address.
255
+ if (parsed.slice(0, 5).every((x) => x === 0) && g(5) === 0xffff) {
256
+ const a = g(6) >> 8;
257
+ return a === 127 || !isPrivateIpv4(a, g(6) & 0xff);
258
+ }
259
+ return true;
260
+ }
261
+ const octets = host.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
262
+ if (octets) {
263
+ const [a, b] = [Number(octets[1]), Number(octets[2])];
264
+ return a === 127 || !isPrivateIpv4(a, b);
265
+ }
266
+ if (!host.includes(".")) return false;
267
+ return !(host.endsWith(".internal") || host.endsWith(".svc") || host.endsWith(".cluster.local"));
268
+ }
269
+
270
+ export interface CombState {
271
+ enabled: boolean;
272
+ /** An explicit `COMB_ENABLED` decided it; otherwise the unset default did. */
273
+ explicit: boolean;
274
+ /** What is missing, for `/status` `agent_fs.comb.reason`. Null when Comb is on. */
275
+ reason: string | null;
276
+ }
277
+
278
+ /**
279
+ * Comb (the agent-fs review space in the dashboard). An explicit
280
+ * `COMB_ENABLED` wins both ways, but still needs `AGENT_FS_API_URL`. Unset, it
281
+ * is on only when a browser can reach agent-fs: `AGENT_FS_PUBLIC_URL` is set,
282
+ * `AGENT_FS_PROXY` is on and the public API URL is {@link isBrowserReachableUrl}
283
+ * (the browser goes through the API), or, with no proxy, `AGENT_FS_API_URL` is
284
+ * itself reachable. Otherwise the browser would land on a private host.
285
+ * Reads `process.env` per call, so a config reload applies without a restart.
286
+ */
287
+ export function getCombState(): CombState {
195
288
  const apiUrl = process.env.AGENT_FS_API_URL?.trim().replace(/\/+$/, "");
196
- return isEnvFlagEnabled("COMB_ENABLED", false) && Boolean(apiUrl);
289
+ const raw = process.env.COMB_ENABLED;
290
+ // The two parses agree only when the value is a recognized flag literal.
291
+ const explicit = parseEnvFlag(raw, true) === parseEnvFlag(raw, false);
292
+ if (explicit && !isEnvFlagEnabled("COMB_ENABLED", false)) {
293
+ return { enabled: false, explicit, reason: "COMB_ENABLED is false." };
294
+ }
295
+ if (!apiUrl) return { enabled: false, explicit, reason: "AGENT_FS_API_URL is not set." };
296
+ if (explicit) return { enabled: true, explicit, reason: null };
297
+ if (process.env.AGENT_FS_PUBLIC_URL?.trim()) return { enabled: true, explicit, reason: null };
298
+ // With the proxy on, the browser goes to `<public API URL>/agentfs`, so that
299
+ // is the address to check, not `AGENT_FS_API_URL`.
300
+ const proxy = isAgentFsProxyEnabled();
301
+ const browserUrl = proxy ? getPublicMcpBaseUrl() : apiUrl;
302
+ return isBrowserReachableUrl(browserUrl)
303
+ ? { enabled: true, explicit, reason: null }
304
+ : {
305
+ enabled: false,
306
+ explicit,
307
+ reason: proxy
308
+ ? `AGENT_FS_PROXY is on, but the API address ${browserUrl} is not reachable from a browser. Set PUBLIC_MCP_BASE_URL to the public API URL, or set COMB_ENABLED=true to force Files on.`
309
+ : `AGENT_FS_API_URL (${apiUrl}) is not reachable from a browser. Set AGENT_FS_PUBLIC_URL or AGENT_FS_PROXY=true, or set COMB_ENABLED=true to force Files on.`,
310
+ };
311
+ }
312
+
313
+ /**
314
+ * Comb is on: see {@link getCombState}. `getCombConfig()` (`src/comb/config.ts`)
315
+ * reports it.
316
+ */
317
+ export function isCombEnabled(): boolean {
318
+ return getCombState().enabled;
197
319
  }
198
320
 
199
321
  /**
@@ -8,8 +8,10 @@
8
8
  - Check for failed tasks — especially "worker session not found" failures which indicate interrupted work that may need re-creation
9
9
  - Review reboot-retry tasks — verify they are progressing, cancel if work is no longer needed
10
10
 
11
- ## Tracked Items
11
+ ## Tracked Item Rules
12
12
 
13
13
  - Live items only: active blockers and watch items. Cap 10, 20 max during a surge; prune before you add.
14
- - Each item states its lift trigger and a calendar date as a bare `MM-DD` (e.g. `lift when X; check 08-22`) or `DELETE MM-DD`. A full `YYYY-MM-DD` stamp does not arm the gate.
14
+ - Each item states its lift trigger and an expiry as `DELETE MM-DD` (or `DELETE on MM-DD`). A bare date or a full `YYYY-MM-DD` stamp does not arm the gate.
15
15
  - An item closes: move its durable facts to memory, then delete the line. Never strike it through.
16
+
17
+ ## Tracked Items
@@ -2,12 +2,12 @@
2
2
  "name": "lead",
3
3
  "displayName": "Lead",
4
4
  "description": "Orchestrator agent that coordinates workers, decomposes tasks, and builds institutional knowledge across sessions",
5
- "version": "1.2.0",
5
+ "version": "1.2.1",
6
6
  "category": "official",
7
7
  "icon": "crown",
8
8
  "author": "Agent Swarm <contact@agent-swarm.dev>",
9
9
  "createdAt": "2026-03-09",
10
- "lastUpdatedAt": "2026-10-17",
10
+ "lastUpdatedAt": "2026-10-28",
11
11
  "agentDefaults": {
12
12
  "role": "lead",
13
13
  "capabilities": ["coordination", "planning", "communication"],
@@ -60,6 +60,7 @@ Fetch the page as markdown: `curl -fsSL https://docs.agent-swarm.dev/llms.mdx/do
60
60
  ## Guides
61
61
 
62
62
  - [Deployment Guide](https://docs.agent-swarm.dev/docs/guides/deployment). When: Someone wants to run Agent Swarm on their own server with Docker Compose.
63
+ - [One-click deploy](https://docs.agent-swarm.dev/docs/guides/one-click-deploy). When: Someone has no server yet and wants Agent Swarm running in the cloud with HTTPS.
63
64
  - [Kubernetes and Helm](https://docs.agent-swarm.dev/docs/guides/kubernetes). When: Someone wants to install Agent Swarm on Kubernetes.
64
65
  - [Rootless Podman](https://docs.agent-swarm.dev/docs/guides/podman-rootless). When: Someone wants to run Agent Swarm under rootless Podman.
65
66
  - [Published Artifacts](https://docs.agent-swarm.dev/docs/guides/published-artifacts). Reference.
@@ -88,6 +89,7 @@ Fetch the page as markdown: `curl -fsSL https://docs.agent-swarm.dev/llms.mdx/do
88
89
  - [Scripts as external APIs](https://docs.agent-swarm.dev/docs/guides/scripts-external-apis). When: Someone wants a swarm script exposed as a public HTTP endpoint or webhook receiver.
89
90
  - [Scripts credential broker](https://docs.agent-swarm.dev/docs/guides/scripts-credential-broker). Reference.
90
91
  - [One-off Script Workflow Runs](https://docs.agent-swarm.dev/docs/guides/script-workflow-runs). Reference.
92
+ - [Dreaming](https://docs.agent-swarm.dev/docs/guides/dreaming). When: Someone asks what the nightly dreaming run changed, how to configure or turn it off, or how to undo one of its changes.
91
93
  - [Claude Bridge](https://docs.agent-swarm.dev/docs/guides/claude-bridge-experimental). Reference.
92
94
  - [Worker Credential Recovery](https://docs.agent-swarm.dev/docs/guides/worker-credential-recovery). Reference.
93
95
  - [Model Gateways](https://docs.agent-swarm.dev/docs/guides/provider-auth/model-gateways). Reference.
@@ -1,42 +0,0 @@
1
- import {
2
- isUserAllowed2,
3
- registerMessageHandler2
4
- } from "./cli-2m2p3snc.js";
5
- import"./cli-7xsq63pe.js";
6
- import"./cli-942pp3bc.js";
7
- import"./cli-qy0z3mfj.js";
8
- import"./cli-vpq0n13a.js";
9
- import"./cli-qz93y3x5.js";
10
- import"./cli-qp6adcmw.js";
11
- import"./cli-3h26v7yj.js";
12
- import"./cli-mzgppb7q.js";
13
- import"./cli-e19bgatr.js";
14
- import"./cli-p8yrsmfn.js";
15
- import"./cli-10cp92df.js";
16
- import"./cli-3ggwdtb0.js";
17
- import"./cli-t3npd8hm.js";
18
- import"./cli-g9ypd5en.js";
19
- import"./cli-s7cm1927.js";
20
- import"./cli-1xpr5992.js";
21
- import"./cli-b2rhbaty.js";
22
- import"./cli-n0ysjjtv.js";
23
- import"./cli-jbgrwv4y.js";
24
- import"./cli-e8xyjvfc.js";
25
- import"./cli-13p25grh.js";
26
- import"./cli-0adyhvq2.js";
27
- import"./cli-9jfty8px.js";
28
- import"./cli-6vq3ymqm.js";
29
- import"./cli-2qbmjfta.js";
30
- import"./cli-9jn9cj0q.js";
31
- import"./cli-rycdaj0a.js";
32
- import"./cli-2nf3b08t.js";
33
- import"./cli-445c1vp7.js";
34
- import"./cli-kvzgak7c.js";
35
- import"./cli-jmcf8cnz.js";
36
- import"./cli-eny54typ.js";
37
- import"./cli-2cj8fqv1.js";
38
- import"./cli-txr0z97c.js";
39
- export {
40
- isUserAllowed2 as isUserAllowed,
41
- registerMessageHandler2 as registerMessageHandler
42
- };
@@ -1,44 +0,0 @@
1
- import"./cli-ns59dc6r.js";
2
- import {
3
- startHeartbeat2,
4
- stopHeartbeat2
5
- } from "./cli-qa4hgda3.js";
6
- import"./cli-0awbtmv2.js";
7
- import"./cli-5d8wd50e.js";
8
- import"./cli-qy0z3mfj.js";
9
- import"./cli-vpq0n13a.js";
10
- import"./cli-qz93y3x5.js";
11
- import"./cli-qp6adcmw.js";
12
- import"./cli-3h26v7yj.js";
13
- import"./cli-mzgppb7q.js";
14
- import"./cli-e19bgatr.js";
15
- import"./cli-p8yrsmfn.js";
16
- import"./cli-10cp92df.js";
17
- import"./cli-3ggwdtb0.js";
18
- import"./cli-t3npd8hm.js";
19
- import"./cli-g9ypd5en.js";
20
- import"./cli-s7cm1927.js";
21
- import"./cli-1xpr5992.js";
22
- import"./cli-b2rhbaty.js";
23
- import"./cli-n0ysjjtv.js";
24
- import"./cli-jbgrwv4y.js";
25
- import"./cli-e8xyjvfc.js";
26
- import"./cli-13p25grh.js";
27
- import"./cli-0adyhvq2.js";
28
- import"./cli-9jfty8px.js";
29
- import"./cli-6vq3ymqm.js";
30
- import"./cli-2qbmjfta.js";
31
- import"./cli-9jn9cj0q.js";
32
- import"./cli-rycdaj0a.js";
33
- import"./cli-2nf3b08t.js";
34
- import"./cli-445c1vp7.js";
35
- import"./cli-kvzgak7c.js";
36
- import"./cli-b2mz5mjc.js";
37
- import"./cli-jmcf8cnz.js";
38
- import"./cli-eny54typ.js";
39
- import"./cli-2cj8fqv1.js";
40
- import"./cli-txr0z97c.js";
41
- export {
42
- startHeartbeat2 as startHeartbeat,
43
- stopHeartbeat2 as stopHeartbeat
44
- };