@ra3orblade/swarm 0.13.2 → 0.14.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.
package/dist/swarm.js CHANGED
@@ -1,32 +1,21 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
-
4
- // packages/cli/src/bin.ts
5
- import {
6
- copyFileSync,
7
- existsSync as existsSync5,
8
- mkdirSync as mkdirSync3,
9
- readdirSync,
10
- unlinkSync,
11
- writeFileSync as writeFileSync3
12
- } from "fs";
13
- import { join as join5, resolve as resolve3 } from "path";
14
-
15
- // packages/client/src/daemon.ts
16
- import { existsSync as existsSync2, mkdirSync, readFileSync, rmSync, writeFileSync } from "fs";
17
- import { homedir } from "os";
18
- import { join } from "path";
3
+ var __esm = (fn, res, err) => () => {
4
+ if (fn)
5
+ try {
6
+ res = fn(fn = 0);
7
+ } catch (e) {
8
+ err = [e];
9
+ }
10
+ if (err)
11
+ throw err[0];
12
+ return res;
13
+ };
19
14
 
20
15
  // packages/client/src/bins.ts
21
16
  import { existsSync } from "fs";
22
17
  import { dirname, resolve } from "path";
23
18
  import { fileURLToPath } from "url";
24
- var SRC = {
25
- swarm: "cli",
26
- swarmd: "daemon",
27
- "swarm-hook": "hook",
28
- "swarm-mcp": "mcp"
29
- };
30
19
  function resolveBin(name, from = import.meta.url) {
31
20
  const here = dirname(fileURLToPath(from));
32
21
  const candidates = [
@@ -41,13 +30,24 @@ function resolveBin(name, from = import.meta.url) {
41
30
  function binCommand(name, from) {
42
31
  return resolveBin(name, from).map((p) => /[\s"']/.test(p) ? JSON.stringify(p) : p).join(" ");
43
32
  }
33
+ var SRC;
34
+ var init_bins = __esm(() => {
35
+ SRC = {
36
+ swarm: "cli",
37
+ swarmd: "daemon",
38
+ "swarm-hook": "hook",
39
+ "swarm-mcp": "mcp",
40
+ "swarm-teamd": "team"
41
+ };
42
+ });
44
43
 
45
44
  // packages/client/src/daemon.ts
45
+ import { existsSync as existsSync2, mkdirSync, readFileSync, rmSync, writeFileSync } from "fs";
46
+ import { homedir } from "os";
47
+ import { join } from "path";
46
48
  function swarmHome() {
47
49
  return process.env.SWARM_HOME ?? join(homedir(), ".swarm");
48
50
  }
49
- var DEFAULT_PORT = Number(process.env.SWARM_PORT ?? 7777);
50
- var infoFile = () => join(swarmHome(), "daemon.json");
51
51
  function readDaemonInfo() {
52
52
  const file = infoFile();
53
53
  if (!existsSync2(file))
@@ -58,7 +58,6 @@ function readDaemonInfo() {
58
58
  return null;
59
59
  }
60
60
  }
61
- var tokenFile = (home = swarmHome()) => join(home, "token");
62
61
  function readToken(home = swarmHome()) {
63
62
  try {
64
63
  const t = readFileSync(tokenFile(home), "utf8").trim();
@@ -67,13 +66,6 @@ function readToken(home = swarmHome()) {
67
66
  return null;
68
67
  }
69
68
  }
70
- var authedFetch = (input, init) => {
71
- const h = new Headers(init?.headers);
72
- const t = readToken();
73
- if (t && !h.has("authorization"))
74
- h.set("authorization", `Bearer ${t}`);
75
- return fetch(input, { ...init, headers: h });
76
- };
77
69
  function alive(pid) {
78
70
  try {
79
71
  process.kill(pid, 0);
@@ -125,6 +117,17 @@ async function ensureDaemon(opts = {}) {
125
117
  }
126
118
  throw new Error("swarmd did not become healthy within 5s");
127
119
  }
120
+ var DEFAULT_PORT, infoFile = () => join(swarmHome(), "daemon.json"), tokenFile = (home = swarmHome()) => join(home, "token"), authedFetch = (input, init) => {
121
+ const h = new Headers(init?.headers);
122
+ const t = readToken();
123
+ if (t && !h.has("authorization"))
124
+ h.set("authorization", `Bearer ${t}`);
125
+ return fetch(input, { ...init, headers: h });
126
+ };
127
+ var init_daemon = __esm(() => {
128
+ init_bins();
129
+ DEFAULT_PORT = Number(process.env.SWARM_PORT ?? 7777);
130
+ });
128
131
 
129
132
  // packages/client/src/index.ts
130
133
  class SwarmClient {
@@ -150,164 +153,218 @@ class SwarmClient {
150
153
  throw new Error(`swarmd: ${r.status}`);
151
154
  }
152
155
  }
156
+ var init_src = __esm(() => {
157
+ init_daemon();
158
+ init_bins();
159
+ init_daemon();
160
+ });
153
161
  // packages/core/src/actor.ts
154
- var HUMAN_ALIASES = new Set(["cli", "dashboard", "me", "desktop", "human"]);
155
- var DAEMON_ALIASES = new Set(["daemon", "system", "swarm"]);
162
+ var HUMAN_ALIASES, DAEMON_ALIASES;
163
+ var init_actor = __esm(() => {
164
+ HUMAN_ALIASES = new Set(["cli", "dashboard", "me", "desktop", "human"]);
165
+ DAEMON_ALIASES = new Set(["daemon", "system", "swarm"]);
166
+ });
167
+
168
+ // packages/core/src/adapters/aider/history.ts
169
+ var init_history = () => {};
170
+ // packages/core/src/adapters/claude-code/adapter.ts
171
+ var init_adapter = () => {};
172
+
173
+ // packages/core/src/adapters/codex/rollout.ts
174
+ var init_rollout = () => {};
175
+
176
+ // packages/core/src/adapters/gemini/chats.ts
177
+ var init_chats = () => {};
178
+
179
+ // packages/core/src/adapters/grok/updates.ts
180
+ var init_updates = () => {};
181
+
182
+ // packages/core/src/adapters/opencode/db.ts
183
+ var init_db = () => {};
184
+ // packages/core/src/adapters/index.ts
185
+ var init_adapters = __esm(() => {
186
+ init_history();
187
+ init_adapter();
188
+ init_rollout();
189
+ init_chats();
190
+ init_updates();
191
+ init_db();
192
+ init_history();
193
+ init_adapter();
194
+ init_rollout();
195
+ init_chats();
196
+ init_updates();
197
+ init_db();
198
+ });
199
+
156
200
  // packages/core/src/adapters/claude-code/hooks.ts
157
- var HOOK_EVENTS = [
158
- "SessionStart",
159
- "UserPromptSubmit",
160
- "PreToolUse",
161
- "PostToolUse",
162
- "SubagentStart",
163
- "SubagentStop",
164
- "Stop",
165
- "SessionEnd",
166
- "Notification",
167
- "PreCompact"
168
- ];
201
+ var HOOK_EVENTS;
202
+ var init_hooks = __esm(() => {
203
+ HOOK_EVENTS = [
204
+ "SessionStart",
205
+ "UserPromptSubmit",
206
+ "PreToolUse",
207
+ "PostToolUse",
208
+ "SubagentStart",
209
+ "SubagentStop",
210
+ "Stop",
211
+ "SessionEnd",
212
+ "Notification",
213
+ "PreCompact",
214
+ "PermissionRequest"
215
+ ];
216
+ });
217
+
169
218
  // packages/core/src/art.ts
170
- var ROBOT = [
171
- " MM MM ",
172
- " LL LL ",
173
- " LL LL ",
174
- " LM MM ",
175
- " MD MS ",
176
- " LE LE ",
177
- " ME ME ",
178
- " MS MS ",
179
- " KK KK ",
180
- " SSDDDSDDDDDDDDDDDDDDDDDDDDDDDDDDDDS ",
181
- " SSDSDDDDDDDDDDDDDDDDDDDDDDDDDDDDDSS ",
182
- " SSDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOKSS ",
183
- " SSOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMOSS ",
184
- " DDKMMLLLMLLMMMMMMMMMMMMMMMMMMMMMODD ",
185
- " DDOMMLMMMMMMMMMMMMMMMMMMMMMMMMMMODD ",
186
- " SSSSODDOMMLMMMMMMMMMMMMMMMMMMMMMMMMMMODDOSSSS ",
187
- " SSSSODDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODDOSSSS ",
188
- " SMMMMODDOMMLMMMMMMMMMMMMMMMMMMMMMMMMMMODDOSMMMS ",
189
- " DMSSSODDOMMMMOOOOOOMMMMMMMMMOOOOOOMMMMODDOSSSED ",
190
- " DSSSSODDOMMMMODDDDDMMMMMMMMMODDDDDMMMMODDOSSSSK ",
191
- " DSMMSODDOMMMMDDDDDDMMMMMMMMMKDDDDDMMMMODDOSMMSK ",
192
- " DSSSSODDOMMMMDDDDDDMMMMMMMMMDDDDDDMMMMODDOSSSSK ",
193
- " DSSSSODDOMMMMDDDDDDMMMMMMMMMDDDDDDMMMMODDODSSSK ",
194
- " DSSSSODDOMMMMDDDDDDMMMMMMMMMDDDDDDMMMMODDODSSSK ",
195
- " DSSSKODDOMMMMDDDDDDMMMMMMMMMDDDDDDMMMMODDODSSSD ",
196
- " OKKKKODDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODDOKKKKO ",
197
- " KKKKODDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODDOOKKK ",
198
- " KKKOODDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODDOOKKK ",
199
- " DDOMMMMDDDDDDDDDDDDDDDDDDDDDMMMMODD ",
200
- " DDOMMMMDDDDDDDDDDDDDDDDDDDDDMMMMODD ",
201
- " DDOMMMMDDDDDDDDDDDDDDDDDDDDDMMMMODD ",
202
- " DDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODD ",
203
- " DDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODD ",
204
- " DDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODD ",
205
- " DDDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOKDD ",
206
- " DDDDDDDDDDDDDDDDDDDDDDDDDDDDDKDDDDD ",
207
- " DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD ",
208
- " OOOOOOOOOOO ",
209
- " OODDDDDKKOO ",
210
- " DSMMMMMMSDD ",
211
- " OOOOOOOOOOO ",
212
- " KDSMMMMMESSKK ",
213
- " MMMMMMSSKOOKDSMMMMMSSSDKOODSEMMMMMM ",
214
- " SSSSDO MMMMMMSSKKOOOOOOOOOOOOOOOOOKSSSMMMMMM ODSSSS ",
215
- " EEESSSSOOLLLLMMMMMESSSSSSSSSSSSSSSSSSSSMMMMMLLLLOOSSSSMME ",
216
- " SMMSSSSKOEELLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLEEOOSSSSEMS ",
217
- " DSSSSSSSOOSEEKSMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMSOEEDOOSSSSSSSK ",
218
- " DSSSSSSDOOSEOSKEMMMMMMMMMMMMMMMMMMMMMMMMMMMMMEOSDEDOODSSSSSSK ",
219
- " KSSSSSSKOODSSOSEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEESOEEDOOKSSSSSSK ",
220
- " DKSSSSKKOODSMEEMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMSEMSDOOKKSSSSDK ",
221
- " OKDDKDKKOOKSMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMSKOOKKKKKKKO ",
222
- " OOOOOKKKOOKSMMMMESSSSSSSSSSSSSMMMMEEEEEESSSSEMMMMSKOOKKKOOOOO ",
223
- " OOOOOOKKOOKSMMMSSKKKKKKKKKKKKKKMMMDKOOOOOOOODDMMMSKOOKKOOOOOO ",
224
- " OKSSKOOOOOKSMMMKKMLLLLLLLLLLLMKMMMDDSSSSSSSSDDMMMSKOOOOODSSKO ",
225
- " SDOKKK KSMMMKDLLLLLLLLLLLLLKMMMKDKKKDDKKKDKMMMSK KKKKDS ",
226
- " DMLLMKO KSMMMKDLLLLLLLLLLLLLKMMMDDDDDDDDDSKDMMMSK ODMLLMD ",
227
- " DELLMSD KSMMMKKMLLLLLLLLLLLLKMMMDKKKKKKKKKDDMMMSK DSMLLEO ",
228
- " KSKKKKDO KSMMMEDDDDKKDDDKKKDKSMMMDDDDDDDDDSDDMMMSK ODDKKKSK ",
229
- " EMLLMDO KSMMMMLLLLLLLLLLLLLLLMMMDOOOOOOOOODDMMMSK ODMLLME ",
230
- " KMLLMSD KSMMMMMMMMMMMMMMMMMMMMMMDDSSDDSSSSDDMMMSK SSMLLEK ",
231
- " KSKKKKSO KSMMMMMOOMMOOMKOEMOOMMMMDOOOOOOOOODDMMMSK OSKKKKSO ",
232
- " SMLLMDO KSMMMMMKKMMKKMDKEMKKMMMMKDDDDSSSSDDDMMMSK ODMLLMS ",
233
- " SMMMMSD KSMMMMMEEMMEEMEEMMEEMMMMDSOOOOOOOODDMMSSK DSMMMMD ",
234
- " OOOOOOO KSSMMMMMMMMMMMMMMMMMMMMMDDDDDDDDDDDDMSSSK OOOOOOO ",
235
- " KSMLLLMMSKO KSSSSMMMMMMMMMMMMMMMMMMMSOOOOOOOOOOSSSSSK OKSMLLLLMSO ",
236
- " DSMMMEEESKK KSSKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSOSSK KDSMMMMMESD ",
237
- " DSMMMMMESKK KSOOKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSOOKSK KKSMMMMMMSD ",
238
- " DSMMMMMESKK OKSKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSDSKO KDSMMMMMMSD ",
239
- " KDDDDDDDDKK KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK KKDDDDDDDDO ",
240
- " OOOOOOOOOOO OOOOOOOOO OOOOOOOOO OOOOOOOOOOO ",
241
- "DSDO OSSO ODKKKKKKK OKKKKKKKO KEDO ODEK",
242
- "SMDO OSMD KDSSSSSSK KDSSSSSKO SMDO ODMS",
243
- "DEKO OOED OOKKKOOO OOOKKOOO SSOO OKMS",
244
- "DEKO OOED SEMMMMSK OSMMMMED SSKO OKES",
245
- "DSSO OESK SEMMMMSK OSMMMMED KSSO OSSK",
246
- "KSMS EEDO OOKKKKKO OOKKKKKO OSEE EMSO",
247
- " DSS SSK OSEEESDO ODSEEESO KSS SSD ",
248
- " OOO OO SEMMMMSK OSMMMMED OO OOO ",
249
- " KSSSSSDO OKSSESSK ",
250
- " DKKDDDDDDKKDK KDKDDDDDDDKDK ",
251
- " SSMLLMMMMMMLMSK DSSMMMMMMMLLMSS ",
252
- " SMLMMMMMMMMLLED SEMMMMMMMMMMLMS ",
253
- " DMMMMMMMMMMMMMMD SMMMMMMMMMMMMMSK ",
254
- " ODSSSSSSSSSSSSSSDO ODSSSSSSSSSSSSSSKO ",
255
- " OOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOO ",
256
- " OKSSSSSSSSSSSSSSK KSSSSSSSSSSSSSSKO ",
257
- " OKDDDDDDDDDDDDDDK KDDDDDDDDDDDDDDOO "
258
- ];
259
- var HEAD = ROBOT.slice(0, 37);
219
+ var ROBOT, HEAD;
220
+ var init_art = __esm(() => {
221
+ ROBOT = [
222
+ " MM MM ",
223
+ " LL LL ",
224
+ " LL LL ",
225
+ " LM MM ",
226
+ " MD MS ",
227
+ " LE LE ",
228
+ " ME ME ",
229
+ " MS MS ",
230
+ " KK KK ",
231
+ " SSDDDSDDDDDDDDDDDDDDDDDDDDDDDDDDDDS ",
232
+ " SSDSDDDDDDDDDDDDDDDDDDDDDDDDDDDDDSS ",
233
+ " SSDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOKSS ",
234
+ " SSOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMOSS ",
235
+ " DDKMMLLLMLLMMMMMMMMMMMMMMMMMMMMMODD ",
236
+ " DDOMMLMMMMMMMMMMMMMMMMMMMMMMMMMMODD ",
237
+ " SSSSODDOMMLMMMMMMMMMMMMMMMMMMMMMMMMMMODDOSSSS ",
238
+ " SSSSODDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODDOSSSS ",
239
+ " SMMMMODDOMMLMMMMMMMMMMMMMMMMMMMMMMMMMMODDOSMMMS ",
240
+ " DMSSSODDOMMMMOOOOOOMMMMMMMMMOOOOOOMMMMODDOSSSED ",
241
+ " DSSSSODDOMMMMODDDDDMMMMMMMMMODDDDDMMMMODDOSSSSK ",
242
+ " DSMMSODDOMMMMDDDDDDMMMMMMMMMKDDDDDMMMMODDOSMMSK ",
243
+ " DSSSSODDOMMMMDDDDDDMMMMMMMMMDDDDDDMMMMODDOSSSSK ",
244
+ " DSSSSODDOMMMMDDDDDDMMMMMMMMMDDDDDDMMMMODDODSSSK ",
245
+ " DSSSSODDOMMMMDDDDDDMMMMMMMMMDDDDDDMMMMODDODSSSK ",
246
+ " DSSSKODDOMMMMDDDDDDMMMMMMMMMDDDDDDMMMMODDODSSSD ",
247
+ " OKKKKODDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODDOKKKKO ",
248
+ " KKKKODDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODDOOKKK ",
249
+ " KKKOODDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODDOOKKK ",
250
+ " DDOMMMMDDDDDDDDDDDDDDDDDDDDDMMMMODD ",
251
+ " DDOMMMMDDDDDDDDDDDDDDDDDDDDDMMMMODD ",
252
+ " DDOMMMMDDDDDDDDDDDDDDDDDDDDDMMMMODD ",
253
+ " DDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODD ",
254
+ " DDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODD ",
255
+ " DDOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMODD ",
256
+ " DDDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOKDD ",
257
+ " DDDDDDDDDDDDDDDDDDDDDDDDDDDDDKDDDDD ",
258
+ " DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD ",
259
+ " OOOOOOOOOOO ",
260
+ " OODDDDDKKOO ",
261
+ " DSMMMMMMSDD ",
262
+ " OOOOOOOOOOO ",
263
+ " KDSMMMMMESSKK ",
264
+ " MMMMMMSSKOOKDSMMMMMSSSDKOODSEMMMMMM ",
265
+ " SSSSDO MMMMMMSSKKOOOOOOOOOOOOOOOOOKSSSMMMMMM ODSSSS ",
266
+ " EEESSSSOOLLLLMMMMMESSSSSSSSSSSSSSSSSSSSMMMMMLLLLOOSSSSMME ",
267
+ " SMMSSSSKOEELLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLEEOOSSSSEMS ",
268
+ " DSSSSSSSOOSEEKSMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMSOEEDOOSSSSSSSK ",
269
+ " DSSSSSSDOOSEOSKEMMMMMMMMMMMMMMMMMMMMMMMMMMMMMEOSDEDOODSSSSSSK ",
270
+ " KSSSSSSKOODSSOSEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEESOEEDOOKSSSSSSK ",
271
+ " DKSSSSKKOODSMEEMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMSEMSDOOKKSSSSDK ",
272
+ " OKDDKDKKOOKSMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMSKOOKKKKKKKO ",
273
+ " OOOOOKKKOOKSMMMMESSSSSSSSSSSSSMMMMEEEEEESSSSEMMMMSKOOKKKOOOOO ",
274
+ " OOOOOOKKOOKSMMMSSKKKKKKKKKKKKKKMMMDKOOOOOOOODDMMMSKOOKKOOOOOO ",
275
+ " OKSSKOOOOOKSMMMKKMLLLLLLLLLLLMKMMMDDSSSSSSSSDDMMMSKOOOOODSSKO ",
276
+ " SDOKKK KSMMMKDLLLLLLLLLLLLLKMMMKDKKKDDKKKDKMMMSK KKKKDS ",
277
+ " DMLLMKO KSMMMKDLLLLLLLLLLLLLKMMMDDDDDDDDDSKDMMMSK ODMLLMD ",
278
+ " DELLMSD KSMMMKKMLLLLLLLLLLLLKMMMDKKKKKKKKKDDMMMSK DSMLLEO ",
279
+ " KSKKKKDO KSMMMEDDDDKKDDDKKKDKSMMMDDDDDDDDDSDDMMMSK ODDKKKSK ",
280
+ " EMLLMDO KSMMMMLLLLLLLLLLLLLLLMMMDOOOOOOOOODDMMMSK ODMLLME ",
281
+ " KMLLMSD KSMMMMMMMMMMMMMMMMMMMMMMDDSSDDSSSSDDMMMSK SSMLLEK ",
282
+ " KSKKKKSO KSMMMMMOOMMOOMKOEMOOMMMMDOOOOOOOOODDMMMSK OSKKKKSO ",
283
+ " SMLLMDO KSMMMMMKKMMKKMDKEMKKMMMMKDDDDSSSSDDDMMMSK ODMLLMS ",
284
+ " SMMMMSD KSMMMMMEEMMEEMEEMMEEMMMMDSOOOOOOOODDMMSSK DSMMMMD ",
285
+ " OOOOOOO KSSMMMMMMMMMMMMMMMMMMMMMDDDDDDDDDDDDMSSSK OOOOOOO ",
286
+ " KSMLLLMMSKO KSSSSMMMMMMMMMMMMMMMMMMMSOOOOOOOOOOSSSSSK OKSMLLLLMSO ",
287
+ " DSMMMEEESKK KSSKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSOSSK KDSMMMMMESD ",
288
+ " DSMMMMMESKK KSOOKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSOOKSK KKSMMMMMMSD ",
289
+ " DSMMMMMESKK OKSKSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSDSKO KDSMMMMMMSD ",
290
+ " KDDDDDDDDKK KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK KKDDDDDDDDO ",
291
+ " OOOOOOOOOOO OOOOOOOOO OOOOOOOOO OOOOOOOOOOO ",
292
+ "DSDO OSSO ODKKKKKKK OKKKKKKKO KEDO ODEK",
293
+ "SMDO OSMD KDSSSSSSK KDSSSSSKO SMDO ODMS",
294
+ "DEKO OOED OOKKKOOO OOOKKOOO SSOO OKMS",
295
+ "DEKO OOED SEMMMMSK OSMMMMED SSKO OKES",
296
+ "DSSO OESK SEMMMMSK OSMMMMED KSSO OSSK",
297
+ "KSMS EEDO OOKKKKKO OOKKKKKO OSEE EMSO",
298
+ " DSS SSK OSEEESDO ODSEEESO KSS SSD ",
299
+ " OOO OO SEMMMMSK OSMMMMED OO OOO ",
300
+ " KSSSSSDO OKSSESSK ",
301
+ " DKKDDDDDDKKDK KDKDDDDDDDKDK ",
302
+ " SSMLLMMMMMMLMSK DSSMMMMMMMLLMSS ",
303
+ " SMLMMMMMMMMLLED SEMMMMMMMMMMLMS ",
304
+ " DMMMMMMMMMMMMMMD SMMMMMMMMMMMMMSK ",
305
+ " ODSSSSSSSSSSSSSSDO ODSSSSSSSSSSSSSSKO ",
306
+ " OOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOO ",
307
+ " OKSSSSSSSSSSSSSSK KSSSSSSSSSSSSSSKO ",
308
+ " OKDDDDDDDDDDDDDDK KDDDDDDDDDDDDDDOO "
309
+ ];
310
+ HEAD = ROBOT.slice(0, 37);
311
+ });
312
+
260
313
  // packages/core/src/audit.ts
261
- var AUDIT_TYPES = new Set([
262
- "session.started",
263
- "session.ended",
264
- "tool.denied",
265
- "claim.acquired",
266
- "claim.renewed",
267
- "claim.released",
268
- "claim.expired",
269
- "claim.orphaned",
270
- "claim.denied",
271
- "rules.changed",
272
- "worktree.reclaimed",
273
- "worktree.created",
274
- "worktree.removed",
275
- "worktree.bootstrapped",
276
- "pr.opened",
277
- "question.asked",
278
- "question.answered",
279
- "dispatch.queued",
280
- "dispatch.started",
281
- "dispatch.finished",
282
- "resource.acquired",
283
- "resource.released",
284
- "resource.reaped",
285
- "process.started",
286
- "process.exited",
287
- "gate.recorded",
288
- "handoff.recorded",
289
- "permission.requested",
290
- "permission.resolved",
291
- "incident.opened",
292
- "incident.acked",
293
- "run.result",
294
- "workflow.started",
295
- "workflow.finished"
296
- ]);
297
- var AUDIT_TYPES_SQL = [...AUDIT_TYPES].map((t) => `'${t}'`).join(", ");
298
- var DEFAULT_PRIVACY = {
299
- store_prompts: true,
300
- store_reasoning: true,
301
- redact: []
302
- };
303
- // packages/core/src/budget.ts
304
- var BUDGET_ASK_TOOLS = new Set(["Bash", "Edit", "Write", "MultiEdit", "NotebookEdit"]);
305
- // packages/core/src/config.ts
306
- import { existsSync as existsSync3, readFileSync as readFileSync2 } from "fs";
307
- import { join as join2 } from "path";
314
+ var AUDIT_TYPES, AUDIT_TYPES_SQL, DEFAULT_PRIVACY;
315
+ var init_audit = __esm(() => {
316
+ AUDIT_TYPES = new Set([
317
+ "session.started",
318
+ "session.ended",
319
+ "tool.denied",
320
+ "claim.acquired",
321
+ "claim.renewed",
322
+ "claim.released",
323
+ "claim.expired",
324
+ "claim.orphaned",
325
+ "claim.denied",
326
+ "rules.changed",
327
+ "worktree.reclaimed",
328
+ "worktree.created",
329
+ "worktree.removed",
330
+ "worktree.bootstrapped",
331
+ "pr.opened",
332
+ "question.asked",
333
+ "question.answered",
334
+ "dispatch.queued",
335
+ "dispatch.started",
336
+ "dispatch.finished",
337
+ "resource.acquired",
338
+ "resource.released",
339
+ "resource.reaped",
340
+ "process.started",
341
+ "process.exited",
342
+ "gate.recorded",
343
+ "gate.blocked",
344
+ "codify.applied",
345
+ "handoff.recorded",
346
+ "permission.requested",
347
+ "permission.resolved",
348
+ "incident.opened",
349
+ "incident.acked",
350
+ "run.result",
351
+ "workflow.started",
352
+ "workflow.finished"
353
+ ]);
354
+ AUDIT_TYPES_SQL = [...AUDIT_TYPES].map((t) => `'${t}'`).join(", ");
355
+ DEFAULT_PRIVACY = {
356
+ store_prompts: true,
357
+ store_reasoning: true,
358
+ redact: []
359
+ };
360
+ });
308
361
 
362
+ // packages/core/src/budget.ts
363
+ var BUDGET_ASK_TOOLS;
364
+ var init_budget = __esm(() => {
365
+ BUDGET_ASK_TOOLS = new Set(["Bash", "Edit", "Write", "MultiEdit", "NotebookEdit"]);
366
+ });
309
367
  // packages/core/src/workflows.ts
310
- var NAME_RE = /^[a-z0-9][a-z0-9_.-]{0,39}$/i;
311
368
  function isRecord(v) {
312
369
  return typeof v === "object" && v !== null && !Array.isArray(v);
313
370
  }
@@ -354,10 +411,14 @@ function parseWorkflows(raw) {
354
411
  }
355
412
  return out;
356
413
  }
414
+ var NAME_RE;
415
+ var init_workflows = __esm(() => {
416
+ NAME_RE = /^[a-z0-9][a-z0-9_.-]{0,39}$/i;
417
+ });
357
418
 
358
419
  // packages/core/src/config.ts
359
- var DEFAULT_GATE_TIMEOUT_S = 900;
360
- var AUTO_MODES = ["session-end", "stop", "off"];
420
+ import { existsSync as existsSync3, readFileSync as readFileSync2 } from "fs";
421
+ import { join as join2 } from "path";
361
422
  function parseGateDefs(gates) {
362
423
  const out = {};
363
424
  if (!isRecord2(gates))
@@ -382,38 +443,35 @@ function parseGateDefs(gates) {
382
443
  }
383
444
  return out;
384
445
  }
385
- var DEFAULT_CONFIG = {
386
- daemon: { port: 7777, auth: "loopback-optional" },
387
- tasks: { source: null, labels: [], team: null },
388
- gates: { required: [], auto: "session-end", defs: {} },
389
- workflows: {},
390
- budget: { daily: null, weekly: null, warn_at: 0.8, on_exceed: "warn" },
391
- models: { allow: [] },
392
- notify: { webhook: null },
393
- team: { url: null, forward: ["ledger", "cost"], interval: 5 },
394
- events: { retain_days: 30 },
395
- audit: { retain_days: 0 },
396
- privacy: DEFAULT_PRIVACY,
397
- dispatch: {
398
- max_parallel: 2,
399
- permission_mode: null,
400
- model: null,
401
- max_turns: null,
402
- require_pr: true,
403
- profile: null
404
- },
405
- worktree: { setup: null, copy: [], open: null },
406
- rules: {
407
- shared_tree: "ask",
408
- destructive_git: "ask",
409
- pattern_kill: "ask",
410
- protected_ports: "ask",
411
- no_foreign_worktree: "ask",
412
- claim_required_to_write: "off",
413
- protected: { ports: [] }
446
+ function parseCustomRules(raw) {
447
+ if (!Array.isArray(raw))
448
+ return [];
449
+ const out = [];
450
+ const seen = new Set;
451
+ for (const v of raw) {
452
+ if (!isRecord2(v))
453
+ continue;
454
+ const name = typeof v.name === "string" ? v.name.trim() : "";
455
+ const match = typeof v.match === "string" ? v.match : "";
456
+ if (!/^[a-z0-9][a-z0-9_.-]{0,39}$/i.test(name) || !match || seen.has(name))
457
+ continue;
458
+ try {
459
+ new RegExp(match);
460
+ } catch {
461
+ continue;
462
+ }
463
+ const action = REWRITE_MODES.includes(v.action) ? v.action : "ask";
464
+ seen.add(name);
465
+ out.push({
466
+ name,
467
+ match,
468
+ action,
469
+ ...typeof v.replace === "string" ? { replace: v.replace } : {},
470
+ ...typeof v.reason === "string" && v.reason.trim() ? { reason: v.reason.trim() } : {}
471
+ });
414
472
  }
415
- };
416
- var MODES = ["ask", "deny", "off"];
473
+ return out;
474
+ }
417
475
  function isRecord2(v) {
418
476
  return typeof v === "object" && v !== null && !Array.isArray(v);
419
477
  }
@@ -441,12 +499,9 @@ function isRepoRelative(f) {
441
499
  return false;
442
500
  return !t.split(/[/\\]/).some((seg) => seg === "..");
443
501
  }
444
- var days = (v, fallback) => {
445
- const n = Number(v);
446
- return Number.isInteger(n) && n >= 0 ? Math.min(n, 3650) : fallback;
447
- };
448
502
  function validate(c) {
449
503
  const mode = (v, fallback) => MODES.includes(v) ? v : fallback;
504
+ const rewriteMode = (v, fallback) => REWRITE_MODES.includes(v) ? v : fallback;
450
505
  const port = Number(c.daemon?.port);
451
506
  const source = c.tasks?.source;
452
507
  const setup = c.worktree?.setup;
@@ -477,13 +532,28 @@ function validate(c) {
477
532
  gates: {
478
533
  required: Array.isArray(rawGates?.required) ? rawGates.required.filter((g) => typeof g === "string" && g.trim() !== "") : [],
479
534
  auto: AUTO_MODES.includes(auto) ? auto : "session-end",
535
+ on_stop: rawGates?.on_stop === "block" ? "block" : "record",
536
+ max_blocks: (() => {
537
+ const n = Number(rawGates?.max_blocks);
538
+ return Number.isInteger(n) && n >= 0 && n <= 20 ? n : 3;
539
+ })(),
540
+ stop_timeout: (() => {
541
+ const n = Number(rawGates?.stop_timeout);
542
+ return Number.isFinite(n) && n >= 5 && n <= 1800 ? n : 300;
543
+ })(),
480
544
  defs: parseGateDefs(rawGates)
481
545
  },
482
546
  budget: {
483
547
  daily: usd(b.daily),
484
548
  weekly: usd(b.weekly),
485
549
  warn_at: Number.isFinite(warnAt) && warnAt > 0 && warnAt < 1 ? warnAt : 0.8,
486
- on_exceed: b.on_exceed === "ask" || b.on_exceed === "stop" ? b.on_exceed : "warn"
550
+ on_exceed: b.on_exceed === "ask" || b.on_exceed === "stop" ? b.on_exceed : "warn",
551
+ window_warn_at: (() => {
552
+ if (b.window_warn_at === false || b.window_warn_at === null || b.window_warn_at === 0)
553
+ return null;
554
+ const w = Number(b.window_warn_at);
555
+ return Number.isFinite(w) && w > 0 && w < 1 ? w : 0.8;
556
+ })()
487
557
  },
488
558
  workflows: parseWorkflows(c.workflows),
489
559
  notify: {
@@ -492,6 +562,23 @@ function validate(c) {
492
562
  return typeof w === "string" && /^https?:\/\//.test(w.trim()) ? w.trim() : null;
493
563
  })()
494
564
  },
565
+ messages: {
566
+ wake: c.messages?.wake !== false
567
+ },
568
+ codify: {
569
+ target: (() => {
570
+ const t = c.codify?.target;
571
+ return t === "claude-md" || t === "swarm-toml" ? t : "both";
572
+ })()
573
+ },
574
+ broker: {
575
+ interactive_wait: (() => {
576
+ const w = Number(c.broker?.interactive_wait);
577
+ if (!Number.isFinite(w) || w < 0)
578
+ return 30;
579
+ return Math.min(Math.round(w), 120);
580
+ })()
581
+ },
495
582
  models: {
496
583
  allow: Array.isArray(c.models?.allow) ? c.models.allow.filter((m) => typeof m === "string" && m.trim() !== "") : []
497
584
  },
@@ -538,6 +625,14 @@ function validate(c) {
538
625
  protected_ports: mode(c.rules?.protected_ports, "ask"),
539
626
  no_foreign_worktree: mode(c.rules?.no_foreign_worktree, "ask"),
540
627
  claim_required_to_write: mode(c.rules?.claim_required_to_write, "off"),
628
+ no_verify: rewriteMode(c.rules?.no_verify, "off"),
629
+ dry_run_first: rewriteMode(c.rules?.dry_run_first, "off"),
630
+ custom: parseCustomRules(c.rules?.custom),
631
+ collision_context: c.rules?.collision_context !== false,
632
+ collision_window: (() => {
633
+ const n = Number(c.rules?.collision_window);
634
+ return Number.isFinite(n) && n >= 1 && n <= 240 ? Math.round(n) : 15;
635
+ })(),
541
636
  protected: {
542
637
  ports: Array.isArray(c.rules?.protected?.ports) ? c.rules.protected.ports.filter((p) => Number.isInteger(p) && p > 0 && p < 65536) : []
543
638
  }
@@ -571,7 +666,6 @@ function setPath(obj, path, value) {
571
666
  }
572
667
  cur[segs[segs.length - 1]] = value;
573
668
  }
574
- var isLockedBy = (path, lock) => path === lock || path.startsWith(`${lock}.`);
575
669
  function readLayer(path) {
576
670
  return existsSync3(path) ? parseToml(readFileSync2(path, "utf8"), path) : null;
577
671
  }
@@ -620,24 +714,140 @@ function loadConfigDetailed(opts = {}) {
620
714
  policy: { path: policyRaw ? policyPath : null, locked }
621
715
  };
622
716
  }
717
+ var DEFAULT_GATE_TIMEOUT_S = 900, AUTO_MODES, DEFAULT_CONFIG, MODES, REWRITE_MODES, days = (v, fallback) => {
718
+ const n = Number(v);
719
+ return Number.isInteger(n) && n >= 0 ? Math.min(n, 3650) : fallback;
720
+ }, isLockedBy = (path, lock) => path === lock || path.startsWith(`${lock}.`);
721
+ var init_config = __esm(() => {
722
+ init_audit();
723
+ init_workflows();
724
+ AUTO_MODES = ["session-end", "stop", "off"];
725
+ DEFAULT_CONFIG = {
726
+ daemon: { port: 7777, auth: "loopback-optional" },
727
+ tasks: { source: null, labels: [], team: null },
728
+ gates: {
729
+ required: [],
730
+ auto: "session-end",
731
+ on_stop: "record",
732
+ max_blocks: 3,
733
+ stop_timeout: 300,
734
+ defs: {}
735
+ },
736
+ workflows: {},
737
+ budget: { daily: null, weekly: null, warn_at: 0.8, on_exceed: "warn", window_warn_at: 0.8 },
738
+ models: { allow: [] },
739
+ notify: { webhook: null },
740
+ messages: { wake: true },
741
+ codify: { target: "both" },
742
+ broker: { interactive_wait: 30 },
743
+ team: { url: null, forward: ["ledger", "cost"], interval: 5 },
744
+ events: { retain_days: 30 },
745
+ audit: { retain_days: 0 },
746
+ privacy: DEFAULT_PRIVACY,
747
+ dispatch: {
748
+ max_parallel: 2,
749
+ permission_mode: null,
750
+ model: null,
751
+ max_turns: null,
752
+ require_pr: true,
753
+ profile: null
754
+ },
755
+ worktree: { setup: null, copy: [], open: null },
756
+ rules: {
757
+ shared_tree: "ask",
758
+ destructive_git: "ask",
759
+ pattern_kill: "ask",
760
+ protected_ports: "ask",
761
+ no_foreign_worktree: "ask",
762
+ claim_required_to_write: "off",
763
+ no_verify: "off",
764
+ dry_run_first: "off",
765
+ custom: [],
766
+ collision_context: true,
767
+ collision_window: 15,
768
+ protected: { ports: [] }
769
+ }
770
+ };
771
+ MODES = ["ask", "deny", "off"];
772
+ REWRITE_MODES = ["rewrite", "ask", "deny", "off"];
773
+ });
774
+
775
+ // packages/core/src/context.ts
776
+ var init_context = () => {};
777
+
778
+ // packages/core/src/dag.ts
779
+ var init_dag = () => {};
623
780
  // packages/core/src/rules.ts
624
- var LIVE_WINDOW_MS = 10 * 60000;
625
- var WRITE_TOOLS = new Set(["Write", "Edit", "MultiEdit", "NotebookEdit"]);
781
+ var LIVE_WINDOW_MS, customRe, WRITE_TOOLS;
782
+ var init_rules = __esm(() => {
783
+ LIVE_WINDOW_MS = 10 * 60000;
784
+ customRe = new WeakMap;
785
+ WRITE_TOOLS = new Set(["Write", "Edit", "MultiEdit", "NotebookEdit"]);
786
+ });
787
+
788
+ // packages/core/src/dryrun.ts
789
+ var init_dryrun = __esm(() => {
790
+ init_rules();
791
+ });
792
+ // packages/core/src/gatehealth.ts
793
+ var init_gatehealth = () => {};
794
+
795
+ // packages/core/src/gates.ts
796
+ var init_gates = () => {};
797
+
798
+ // packages/core/src/graphs.ts
799
+ var init_graphs = __esm(() => {
800
+ init_rules();
801
+ });
802
+
803
+ // packages/core/src/heat.ts
804
+ var init_heat = __esm(() => {
805
+ init_rules();
806
+ });
807
+
808
+ // packages/core/src/worktree.ts
809
+ var init_worktree = __esm(() => {
810
+ init_config();
811
+ });
812
+
626
813
  // packages/core/src/hygiene.ts
627
- var HYGIENE_DEFAULTS = {
628
- staleDays: 2,
629
- abandonedDays: 30,
630
- hungryRssKb: 1024 * 1024,
631
- heavyKb: 2 * 1024 * 1024
632
- };
814
+ var HYGIENE_DEFAULTS;
815
+ var init_hygiene = __esm(() => {
816
+ init_worktree();
817
+ HYGIENE_DEFAULTS = {
818
+ staleDays: 2,
819
+ abandonedDays: 30,
820
+ hungryRssKb: 1024 * 1024,
821
+ heavyKb: 2 * 1024 * 1024
822
+ };
823
+ });
824
+
633
825
  // packages/core/src/ledger.ts
634
- var EDIT_TOOLS = new Set(["Edit", "Write", "MultiEdit", "NotebookEdit"]);
826
+ var EDIT_TOOLS;
827
+ var init_ledger = __esm(() => {
828
+ EDIT_TOOLS = new Set(["Edit", "Write", "MultiEdit", "NotebookEdit"]);
829
+ });
830
+ // packages/core/src/lessons-apply.ts
831
+ var init_lessons_apply = () => {};
832
+
833
+ // packages/core/src/lineage.ts
834
+ var init_lineage = __esm(() => {
835
+ init_dag();
836
+ });
837
+
838
+ // packages/core/src/mcphealth.ts
839
+ var init_mcphealth = __esm(() => {
840
+ init_gatehealth();
841
+ });
842
+
843
+ // packages/core/src/memory.ts
844
+ var init_memory = () => {};
635
845
  // packages/core/src/outcomes.ts
636
- var DEFAULT_BRANCHES = new Set(["main", "master", "develop", "trunk"]);
846
+ var DEFAULT_BRANCHES;
847
+ var init_outcomes = __esm(() => {
848
+ DEFAULT_BRANCHES = new Set(["main", "master", "develop", "trunk"]);
849
+ });
637
850
  // packages/core/src/policy.ts
638
- var HOOK_MARK = "swarm-hook";
639
- var hookIsOurs = (h) => typeof h.command === "string" && (h.command.includes(HOOK_MARK) || h.command.includes("/packages/hook/src/bin.ts"));
640
- var MIN_HOOK_TIMEOUT_S = 5;
641
851
  function hookCoverage(settings) {
642
852
  const hooks = settings && typeof settings === "object" && !Array.isArray(settings) ? settings.hooks : undefined;
643
853
  const missing = [];
@@ -655,7 +865,226 @@ function hookCoverage(settings) {
655
865
  }
656
866
  return { missing, short, complete: !missing.length && !short.length };
657
867
  }
868
+ var HOOK_MARK = "swarm-hook", hookIsOurs = (h) => typeof h.command === "string" && (h.command.includes(HOOK_MARK) || h.command.includes("/packages/hook/src/bin.ts")), MIN_HOOK_TIMEOUT_S = 5;
869
+ var init_policy = __esm(() => {
870
+ init_hooks();
871
+ init_rules();
872
+ });
873
+
874
+ // packages/core/src/pricing.ts
875
+ var init_pricing = () => {};
876
+ // packages/core/src/provenance.ts
877
+ var init_provenance = () => {};
878
+ // packages/core/src/quota.ts
879
+ var BURN_MIN_SPAN_MS;
880
+ var init_quota = __esm(() => {
881
+ BURN_MIN_SPAN_MS = 10 * 60000;
882
+ });
883
+ // packages/core/src/security.ts
884
+ var init_security = () => {};
885
+
886
+ // packages/core/src/stall.ts
887
+ var init_stall = () => {};
888
+
889
+ // packages/core/src/statusline.ts
890
+ function parseStatuslinePayload(text) {
891
+ try {
892
+ const v = JSON.parse(text);
893
+ return v && typeof v === "object" && !Array.isArray(v) ? v : null;
894
+ } catch {
895
+ return null;
896
+ }
897
+ }
898
+ function pct(color, label, value) {
899
+ const s = `${label} ${Math.round(value)}%`;
900
+ if (value >= 90)
901
+ return red(color, s);
902
+ if (value >= 70)
903
+ return yellow(color, s);
904
+ return s;
905
+ }
906
+ function money(usd) {
907
+ return usd >= 10 ? `$${usd.toFixed(0)}` : `$${usd.toFixed(2)}`;
908
+ }
909
+ function renderStatusline(payload, state, opts = {}) {
910
+ const color = opts.color ?? false;
911
+ const local = [];
912
+ const model = payload.model?.display_name ?? payload.model?.id;
913
+ if (model)
914
+ local.push(bold(color, model));
915
+ const ctx = payload.context_window?.used_percentage;
916
+ if (typeof ctx === "number")
917
+ local.push(pct(color, "ctx", ctx));
918
+ const cost = payload.cost?.total_cost_usd;
919
+ if (typeof cost === "number")
920
+ local.push(money(cost));
921
+ const five = payload.rate_limits?.five_hour?.used_percentage;
922
+ if (typeof five === "number")
923
+ local.push(pct(color, "5h", five));
924
+ const week = payload.rate_limits?.seven_day?.used_percentage;
925
+ if (typeof week === "number")
926
+ local.push(pct(color, "7d", week));
927
+ const swarm = [];
928
+ if (state) {
929
+ if (state.task)
930
+ swarm.push(`${state.task.id} ${dim(color, `${state.task.leftMin}m`)}`);
931
+ if (state.budget && state.budget.level !== "ok")
932
+ swarm.push((state.budget.level === "exceeded" ? red : yellow)(color, `budget ${state.budget.level} ${Math.round(state.budget.pct * 100)}%`));
933
+ if (state.incidents > 0)
934
+ swarm.push(yellow(color, `${state.incidents} incident${state.incidents === 1 ? "" : "s"}`));
935
+ if (state.waitingOn > 0)
936
+ swarm.push(red(color, `waiting on you${state.waitingOn > 1 ? ` \xD7${state.waitingOn}` : ""}`));
937
+ if (state.inbox > 0)
938
+ swarm.push(`inbox ${state.inbox}`);
939
+ if (state.quota) {
940
+ const short = { five_hour: "5h", seven_day: "7d", spend_limit: "spend" }[state.quota.window];
941
+ const h = state.quota.hoursToLimit;
942
+ if (h == null)
943
+ swarm.push(red(color, `${short} limit reached`));
944
+ else {
945
+ const s = `${short} limit in ${h < 1 ? `${Math.max(1, Math.round(h * 60))}m` : `${Math.round(h)}h`}`;
946
+ swarm.push(h < 1 ? red(color, s) : h < 3 ? yellow(color, s) : s);
947
+ }
948
+ }
949
+ }
950
+ const sep = dim(color, " \xB7 ");
951
+ const bar = dim(color, " \u2502 ");
952
+ const left = local.join(sep);
953
+ if (!swarm.length)
954
+ return left;
955
+ const right = swarm.join(sep);
956
+ return left ? `${left}${bar}${right}` : right;
957
+ }
958
+ function statuslineIsOurs(setting) {
959
+ if (!setting || typeof setting !== "object")
960
+ return false;
961
+ const cmd = setting.command;
962
+ return typeof cmd === "string" && (cmd.includes("swarm-hook") || cmd.includes("/packages/hook/src/bin.ts")) && /\bstatusline\b/.test(cmd);
963
+ }
964
+ var ESC = "\x1B[", paint = (color, code, s) => color ? `${ESC}${code}m${s}${ESC}0m` : s, dim = (c, s) => paint(c, "2", s), yellow = (c, s) => paint(c, "33", s), red = (c, s) => paint(c, "31", s), bold = (c, s) => paint(c, "1", s);
965
+
966
+ // packages/core/src/tasks.ts
967
+ var init_tasks = () => {};
968
+
969
+ // packages/core/src/team.ts
970
+ var init_team = () => {};
971
+
972
+ // packages/core/src/teamsetup.ts
973
+ var init_teamsetup = () => {};
974
+
975
+ // packages/core/src/transitions.ts
976
+ var init_transitions = () => {};
977
+
978
+ // packages/core/src/types.ts
979
+ var init_types = () => {};
980
+
981
+ // packages/core/src/waiting.ts
982
+ var init_waiting = () => {};
983
+
984
+ // packages/core/src/index.ts
985
+ var init_src2 = __esm(() => {
986
+ init_actor();
987
+ init_adapters();
988
+ init_hooks();
989
+ init_art();
990
+ init_audit();
991
+ init_budget();
992
+ init_config();
993
+ init_context();
994
+ init_dag();
995
+ init_dryrun();
996
+ init_gatehealth();
997
+ init_gates();
998
+ init_graphs();
999
+ init_heat();
1000
+ init_hygiene();
1001
+ init_ledger();
1002
+ init_lessons_apply();
1003
+ init_lineage();
1004
+ init_mcphealth();
1005
+ init_memory();
1006
+ init_outcomes();
1007
+ init_policy();
1008
+ init_pricing();
1009
+ init_provenance();
1010
+ init_quota();
1011
+ init_rules();
1012
+ init_security();
1013
+ init_stall();
1014
+ init_tasks();
1015
+ init_team();
1016
+ init_teamsetup();
1017
+ init_transitions();
1018
+ init_types();
1019
+ init_waiting();
1020
+ init_workflows();
1021
+ init_worktree();
1022
+ });
1023
+
1024
+ // packages/hook/src/statusline.ts
1025
+ async function fetchStatuslineState(payload, opts = {}) {
1026
+ const timeout = opts.timeoutMs ?? Number(process.env.SWARM_HOOK_TIMEOUT_MS ?? 400);
1027
+ const post = async (base) => {
1028
+ const r = await authedFetch(`${base}/v1/statusline`, {
1029
+ method: "POST",
1030
+ headers: { "content-type": "application/json" },
1031
+ body: JSON.stringify(payload),
1032
+ signal: AbortSignal.timeout(timeout)
1033
+ });
1034
+ return r.ok ? await r.json() : null;
1035
+ };
1036
+ const base = opts.baseUrl ?? resolveBaseUrl();
1037
+ const fallback = `http://127.0.0.1:${DEFAULT_PORT}`;
1038
+ try {
1039
+ const s = await post(base);
1040
+ if (s)
1041
+ return s;
1042
+ } catch {}
1043
+ if (base !== fallback && !opts.baseUrl) {
1044
+ try {
1045
+ return await post(fallback);
1046
+ } catch {}
1047
+ }
1048
+ return null;
1049
+ }
1050
+ async function runStatusline(input, opts = {}) {
1051
+ const payload = parseStatuslinePayload(input) ?? {};
1052
+ const state = await fetchStatuslineState(payload, opts);
1053
+ const color = opts.color ?? !process.env.NO_COLOR;
1054
+ return renderStatusline(payload, state, { color });
1055
+ }
1056
+ var init_statusline = __esm(() => {
1057
+ init_src();
1058
+ init_src2();
1059
+ });
1060
+
1061
+ // packages/hook/src/wait.ts
1062
+ var init_wait = __esm(() => {
1063
+ init_src();
1064
+ });
1065
+
1066
+ // packages/hook/src/index.ts
1067
+ var init_src3 = __esm(() => {
1068
+ init_statusline();
1069
+ init_wait();
1070
+ });
1071
+
1072
+ // packages/cli/src/bin.ts
1073
+ init_src();
1074
+ init_src2();
1075
+ import {
1076
+ copyFileSync,
1077
+ existsSync as existsSync5,
1078
+ mkdirSync as mkdirSync3,
1079
+ readdirSync,
1080
+ unlinkSync,
1081
+ writeFileSync as writeFileSync3
1082
+ } from "fs";
1083
+ import { join as join5, resolve as resolve3 } from "path";
1084
+
658
1085
  // packages/cli/src/install.ts
1086
+ init_src();
1087
+ init_src2();
659
1088
  import { existsSync as existsSync4, readFileSync as readFileSync3, writeFileSync as writeFileSync2 } from "fs";
660
1089
  import { homedir as homedir2 } from "os";
661
1090
  import { join as join3 } from "path";
@@ -795,6 +1224,7 @@ function mcpServerConfig() {
795
1224
  const [command, ...args] = resolveBin("swarm-mcp");
796
1225
  return { command, args };
797
1226
  }
1227
+ var WAKE_EVENTS = new Set(["Stop"]);
798
1228
  function load() {
799
1229
  const p = settingsPath();
800
1230
  return existsSync4(p) ? JSON.parse(readFileSync3(p, "utf8")) : {};
@@ -811,7 +1241,14 @@ function install() {
811
1241
  const list = hooks[ev] ?? [];
812
1242
  const clean = list.map((g) => ({ ...g, hooks: g.hooks.filter((h) => !isOurs(h)) })).filter((g) => g.hooks.length);
813
1243
  clean.push({
814
- hooks: [{ type: "command", command: hookCommand(ev), timeout: 5 }]
1244
+ hooks: [
1245
+ {
1246
+ type: "command",
1247
+ command: hookCommand(ev),
1248
+ timeout: ev === "Stop" ? 330 : ev === "PermissionRequest" ? 150 : 5
1249
+ },
1250
+ ...WAKE_EVENTS.has(ev) ? [{ type: "command", command: hookCommand("wait"), timeout: 3600, asyncRewake: true }] : []
1251
+ ]
815
1252
  });
816
1253
  hooks[ev] = clean;
817
1254
  added.push(ev);
@@ -830,6 +1267,20 @@ function install() {
830
1267
  registerOtherAgents();
831
1268
  return added;
832
1269
  }
1270
+ function installStatusline() {
1271
+ const s = load();
1272
+ const cur = s.statusLine;
1273
+ if (cur && !statuslineIsOurs(cur))
1274
+ return "kept";
1275
+ s.statusLine = { type: "command", command: `${binCommand("swarm-hook")} statusline` };
1276
+ save(s);
1277
+ return cur ? "refreshed" : "installed";
1278
+ }
1279
+ function statuslineStatus(s) {
1280
+ if (!s.statusLine)
1281
+ return "none";
1282
+ return statuslineIsOurs(s.statusLine) ? "ours" : "other";
1283
+ }
833
1284
  function uninstall() {
834
1285
  const s = load();
835
1286
  const hooks = s.hooks ?? {};
@@ -862,6 +1313,10 @@ function uninstall() {
862
1313
  s.mcpServers = mcp;
863
1314
  else
864
1315
  delete s.mcpServers;
1316
+ if (statuslineIsOurs(s.statusLine)) {
1317
+ delete s.statusLine;
1318
+ removed++;
1319
+ }
865
1320
  save(s);
866
1321
  if (unregisterMcp())
867
1322
  removed++;
@@ -887,7 +1342,8 @@ function status() {
887
1342
  mcp: mcpRegistered(),
888
1343
  path: settingsPath(),
889
1344
  shim: shimPath(),
890
- otherAgents
1345
+ otherAgents,
1346
+ statusline: statuslineStatus(s)
891
1347
  };
892
1348
  }
893
1349
  function setTeamUrl(home, url) {
@@ -912,6 +1368,7 @@ url = "${url}"
912
1368
  }
913
1369
 
914
1370
  // packages/cli/src/procs.ts
1371
+ init_src();
915
1372
  import { mkdirSync as mkdirSync2, openSync } from "fs";
916
1373
  import { join as join4, resolve as resolve2 } from "path";
917
1374
  async function call(path, init) {
@@ -1067,7 +1524,8 @@ var help = `swarm \u2014 control plane for AI-agent development
1067
1524
  login [url] [--token t] log in to the team daemon ([team].url) and register this machine (M8.3c)
1068
1525
  backup [dest] | restore <src> snapshot ~/.swarm (VACUUM INTO, zero downtime) / restore it (daemon stopped)
1069
1526
 
1070
- install [--config-url <team url>] | uninstall add/remove Swarm hooks in ~/.claude/settings.json (--config-url also points this machine at a team daemon)
1527
+ install [--statusline] [--config-url <team url>] | uninstall add/remove Swarm hooks in ~/.claude/settings.json (--statusline also sets Claude Code's status line; --config-url points this machine at a team daemon)
1528
+ statusline Claude Code's statusLine command: its JSON on stdin \u2192 one line (model, context, cost, plan windows \u2502 task, lease, budget, incidents, waiting). Installed by: install --statusline
1071
1529
 
1072
1530
  Env: SWARM_URL, SWARM_PORT (default 7777), SWARM_HOME (~/.swarm)`;
1073
1531
  async function api(path, init) {
@@ -1129,6 +1587,10 @@ Open the dashboard: ${base}`);
1129
1587
  case "install": {
1130
1588
  const evs = install();
1131
1589
  console.log(`installed hooks for ${evs.length} events in ${status().path}`);
1590
+ if (rest.includes("--statusline")) {
1591
+ const r = installStatusline();
1592
+ console.log(r === "kept" ? "statusLine left alone \u2014 another status line is set; remove it first, then rerun with --statusline" : `statusLine ${r}: swarm statusline (restart claude to see it)`);
1593
+ }
1132
1594
  const cuIdx = rest.indexOf("--config-url");
1133
1595
  const configUrl = cuIdx >= 0 ? rest[cuIdx + 1] : null;
1134
1596
  if (configUrl) {
@@ -1144,6 +1606,12 @@ Open the dashboard: ${base}`);
1144
1606
  case "uninstall":
1145
1607
  console.log(`removed ${uninstall()} hook entries`);
1146
1608
  break;
1609
+ case "statusline": {
1610
+ await Promise.resolve().then(() => init_src3());
1611
+ process.stdout.write(`${await runStatusline(await Bun.stdin.text())}
1612
+ `);
1613
+ break;
1614
+ }
1147
1615
  case "doctor": {
1148
1616
  if (rest.includes("--migrate"))
1149
1617
  await ensureDaemon({ quiet: true });
@@ -1175,6 +1643,10 @@ Open the dashboard: ${base}`);
1175
1643
  line(false, `${o.layer} config overrides locked ${o.key}`, `remove it \u2014 policy value stays in effect`);
1176
1644
  }
1177
1645
  line(st.mcp, "MCP server registered", "run: swarm install");
1646
+ if (st.statusline === "ours")
1647
+ console.log("\u2713 statusLine: swarm statusline");
1648
+ else
1649
+ console.log(st.statusline === "other" ? "\xB7 statusLine: another status line is set (swarm install --statusline would leave it alone)" : "\xB7 statusLine not set \u2014 swarm install --statusline puts task, lease, budget and plan windows in Claude Code's footer");
1178
1650
  if (st.otherAgents.length)
1179
1651
  console.log(`\u2713 MCP server also registered for ${st.otherAgents.join(", ")} (swarm_* tools in those CLIs too)`);
1180
1652
  const forge = (bin, auth) => {