@loompad/cli 1.2.0 → 1.2.2

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 (116) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +13 -7
  3. package/dist/adapters/antigravity-cli.js +7 -3
  4. package/dist/adapters/antigravity-cli.js.map +1 -1
  5. package/dist/adapters/opencode.d.ts +6 -0
  6. package/dist/adapters/opencode.js +27 -2
  7. package/dist/adapters/opencode.js.map +1 -1
  8. package/dist/cli/doctor.d.ts +9 -1
  9. package/dist/cli/doctor.js +48 -5
  10. package/dist/cli/doctor.js.map +1 -1
  11. package/dist/cli/index.js +144 -20
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/cli/ui.js +3 -2
  14. package/dist/cli/ui.js.map +1 -1
  15. package/dist/core/brain-index.d.ts +0 -18
  16. package/dist/core/brain-index.js +10 -2
  17. package/dist/core/brain-index.js.map +1 -1
  18. package/dist/core/council.d.ts +3 -3
  19. package/dist/core/council.js +6 -4
  20. package/dist/core/council.js.map +1 -1
  21. package/dist/core/crew-protocol.js +4 -1
  22. package/dist/core/crew-protocol.js.map +1 -1
  23. package/dist/core/crew.d.ts +23 -1
  24. package/dist/core/crew.js +80 -9
  25. package/dist/core/crew.js.map +1 -1
  26. package/dist/core/digest.d.ts +2 -0
  27. package/dist/core/digest.js +9 -0
  28. package/dist/core/digest.js.map +1 -1
  29. package/dist/core/loops.js +22 -2
  30. package/dist/core/loops.js.map +1 -1
  31. package/dist/core/orchestra.d.ts +16 -0
  32. package/dist/core/orchestra.js +45 -2
  33. package/dist/core/orchestra.js.map +1 -1
  34. package/dist/core/prices.d.ts +27 -0
  35. package/dist/core/prices.js +38 -0
  36. package/dist/core/prices.js.map +1 -1
  37. package/dist/core/proof.d.ts +11 -1
  38. package/dist/core/proof.js +56 -7
  39. package/dist/core/proof.js.map +1 -1
  40. package/dist/core/registry.d.ts +7 -0
  41. package/dist/core/registry.js.map +1 -1
  42. package/dist/core/replay.js +3 -1
  43. package/dist/core/replay.js.map +1 -1
  44. package/dist/core/routes.js +14 -0
  45. package/dist/core/routes.js.map +1 -1
  46. package/dist/core/setup.d.ts +14 -0
  47. package/dist/core/setup.js +22 -6
  48. package/dist/core/setup.js.map +1 -1
  49. package/dist/core/shield.js +7 -3
  50. package/dist/core/shield.js.map +1 -1
  51. package/dist/core/shift.d.ts +2 -0
  52. package/dist/core/shift.js +14 -2
  53. package/dist/core/shift.js.map +1 -1
  54. package/dist/daemon/auth.d.ts +7 -1
  55. package/dist/daemon/auth.js +19 -3
  56. package/dist/daemon/auth.js.map +1 -1
  57. package/dist/daemon/client.d.ts +29 -1
  58. package/dist/daemon/client.js +37 -1
  59. package/dist/daemon/client.js.map +1 -1
  60. package/dist/daemon/council.d.ts +8 -0
  61. package/dist/daemon/council.js +121 -36
  62. package/dist/daemon/council.js.map +1 -1
  63. package/dist/daemon/proof.js +11 -7
  64. package/dist/daemon/proof.js.map +1 -1
  65. package/dist/daemon/review.d.ts +10 -0
  66. package/dist/daemon/review.js +41 -3
  67. package/dist/daemon/review.js.map +1 -1
  68. package/dist/daemon/routes/brain.js +4 -0
  69. package/dist/daemon/routes/brain.js.map +1 -1
  70. package/dist/daemon/routes/council.js +9 -0
  71. package/dist/daemon/routes/council.js.map +1 -1
  72. package/dist/daemon/routes/crews.js +4 -0
  73. package/dist/daemon/routes/crews.js.map +1 -1
  74. package/dist/daemon/routes/messages.js +8 -2
  75. package/dist/daemon/routes/messages.js.map +1 -1
  76. package/dist/daemon/routes/pairing.js +6 -1
  77. package/dist/daemon/routes/pairing.js.map +1 -1
  78. package/dist/daemon/routes/setup.js +9 -1
  79. package/dist/daemon/routes/setup.js.map +1 -1
  80. package/dist/daemon/routes/team.js +2 -0
  81. package/dist/daemon/routes/team.js.map +1 -1
  82. package/dist/daemon/runtime/accounting.js +7 -3
  83. package/dist/daemon/runtime/accounting.js.map +1 -1
  84. package/dist/daemon/runtime/queue.d.ts +9 -0
  85. package/dist/daemon/runtime/queue.js +27 -1
  86. package/dist/daemon/runtime/queue.js.map +1 -1
  87. package/dist/daemon/runtime/relay.d.ts +2 -0
  88. package/dist/daemon/runtime/relay.js +7 -0
  89. package/dist/daemon/runtime/relay.js.map +1 -1
  90. package/dist/daemon/runtime/turns.d.ts +4 -0
  91. package/dist/daemon/runtime/turns.js +29 -0
  92. package/dist/daemon/runtime/turns.js.map +1 -1
  93. package/dist/daemon/runtime-support.d.ts +5 -1
  94. package/dist/daemon/runtime-support.js +9 -3
  95. package/dist/daemon/runtime-support.js.map +1 -1
  96. package/dist/daemon/runtime.d.ts +46 -2
  97. package/dist/daemon/runtime.js +158 -6
  98. package/dist/daemon/runtime.js.map +1 -1
  99. package/dist/daemon/server.js +4 -0
  100. package/dist/daemon/server.js.map +1 -1
  101. package/dist/daemon/shift.d.ts +6 -0
  102. package/dist/daemon/shift.js +11 -2
  103. package/dist/daemon/shift.js.map +1 -1
  104. package/dist/daemon/team.d.ts +6 -0
  105. package/dist/daemon/team.js +15 -0
  106. package/dist/daemon/team.js.map +1 -1
  107. package/dist/providers/agent.js +3 -0
  108. package/dist/providers/agent.js.map +1 -1
  109. package/dist/types.d.ts +12 -0
  110. package/dist/types.js.map +1 -1
  111. package/dist/web/app.css +72 -0
  112. package/dist/web/app.js +9834 -9635
  113. package/dist/web/app.js.map +4 -4
  114. package/docs/release-notes/v1.2.1.md +40 -0
  115. package/docs/release-notes/v1.2.2.md +39 -0
  116. package/package.json +1 -1
@@ -21,7 +21,7 @@ export interface DoctorReport {
21
21
  };
22
22
  }
23
23
  export declare function doctorReport(checks: Check[]): DoctorReport;
24
- export declare function projectChecks(dir: string): Check[];
24
+ export declare function projectChecks(dir: string, signedOutKinds?: string[]): Check[];
25
25
  /**
26
26
  * Repair what has exactly one safe repair; report what doesn't.
27
27
  *
@@ -71,3 +71,11 @@ export declare function providerChecks(opts?: {
71
71
  * capacity) — is better off on the free pool, which rotates. Pure over the log.
72
72
  */
73
73
  export declare function freeModelTrouble(events: readonly LoomEvent[], agents: readonly AgentConfig[], now?: number): Check[];
74
+ export declare const fmtBytes: (n: number) => string;
75
+ /** Orchestra folders under ~/.loom whose project isn't registered any more: nothing will ever clean them up. */
76
+ export declare function orchestraOrphans(): Promise<Array<{
77
+ id: string;
78
+ dir: string;
79
+ bytes: number;
80
+ }>>;
81
+ export declare function diskChecks(): Promise<Check[]>;
@@ -6,13 +6,13 @@
6
6
  * whether the daemon sees what this shell sees (PATH, keys, sign-ins), whether
7
7
  * each provider answers, and whether a free model keeps getting refused.
8
8
  */
9
- import { execFile } from "../core/process.js";
9
+ import { execFile, execFileSync } from "../core/process.js";
10
10
  import { codexBin, codexVersion } from "../providers/codex/adapter.js";
11
11
  import fs from "node:fs";
12
12
  import path from "node:path";
13
13
  import { createAgent, knownAgentKinds } from "../adapters/index.js";
14
14
  import { setupReport } from "../core/setup.js";
15
- import { readDaemonConfig, readProjectConfig, readProjectState, writeProjectConfig, writeProjectState, } from "../core/registry.js";
15
+ import { listProjects, loomHome, readDaemonConfig, readProjectConfig, readProjectState, writeProjectConfig, writeProjectState, } from "../core/registry.js";
16
16
  import { resolveSteps, stepName } from "../core/routes.js";
17
17
  import { isAdapter } from "../types.js";
18
18
  import { ADES } from "../core/ades.js";
@@ -36,7 +36,7 @@ function fail(name, detail) {
36
36
  // ---------------------------------------------------------------------------
37
37
  // Project checks (pure over a directory — unit tested)
38
38
  // ---------------------------------------------------------------------------
39
- export function projectChecks(dir) {
39
+ export function projectChecks(dir, signedOutKinds = []) {
40
40
  const checks = [];
41
41
  const config = readProjectConfig(dir);
42
42
  if (!config) {
@@ -77,7 +77,12 @@ export function projectChecks(dir) {
77
77
  const off = config.agents.filter((a) => a.enabled === false).map((a) => a.id);
78
78
  for (const id of off)
79
79
  adapterIds.delete(id);
80
- checks.push(ok("agents", `${config.agents.length} configured, ${adapterIds.size} can hold the baton${off.length ? ` (${off.join(", ")} switched off)` : ""}`));
80
+ // a signed-out agent can't take a turn either (#319)
81
+ const out = config.agents.filter((a) => adapterIds.has(a.id) && signedOutKinds.includes(a.kind)).map((a) => a.id);
82
+ for (const id of out)
83
+ adapterIds.delete(id);
84
+ const why = [off.length ? `${off.join(", ")} switched off` : "", out.length ? `${out.join(", ")} signed out` : ""].filter(Boolean).join("; ");
85
+ checks.push(ok("agents", `${config.agents.length} configured, ${adapterIds.size} can hold the baton${why ? ` (${why})` : ""}`));
81
86
  }
82
87
  if (!adapterIds.size) {
83
88
  checks.push(fail("agents", "no full-duplex adapters — nothing can take a turn"));
@@ -304,7 +309,7 @@ export function compareWithDaemon(shell, daemon, exists = fs.existsSync) {
304
309
  out.push(fail(`daemon:${mine.name}`, `installed here, but the daemon can't find it — it runs with a different PATH${dirs.length ? ` (missing ${dirs.join(", ")})` : ""}; ${restart}`));
305
310
  }
306
311
  else if (mine.status === "ok" && d.status === "fail") {
307
- out.push(fail(`daemon:${mine.name}`, `signed in here, signed out for the daemon — ${d.detail}`));
312
+ out.push(fail(`daemon:${mine.name}`, /^a turn by /.test(d.detail) ? `looks signed in, but ${d.detail}` : `signed in here, signed out for the daemon — ${d.detail}`));
308
313
  }
309
314
  }
310
315
  const keysHere = shell.facts.keys.filter((k) => !daemon.facts.keys.includes(k));
@@ -379,4 +384,42 @@ export function freeModelTrouble(events, agents, now = Date.now()) {
379
384
  }
380
385
  return out;
381
386
  }
387
+ // ---------------------------------------------------------------------------
388
+ // Disk: orchestra worktrees of projects no longer registered (#295)
389
+ // ---------------------------------------------------------------------------
390
+ /** How big a folder is, in bytes (`du`, so a 2 GB tree is quick); 0 when it can't say. */
391
+ async function sizeOf(dir) {
392
+ try {
393
+ const stdout = execFileSync("du", ["-sk", dir], { timeout: 20_000, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
394
+ return (Number(String(stdout).split(/\s+/)[0]) || 0) * 1024;
395
+ }
396
+ catch {
397
+ return 0;
398
+ }
399
+ }
400
+ export const fmtBytes = (n) => n >= 1e9 ? `${(n / 1e9).toFixed(1)} GB` : n >= 1e6 ? `${Math.round(n / 1e6)} MB` : `${Math.round(n / 1e3)} KB`;
401
+ /** Orchestra folders under ~/.loom whose project isn't registered any more: nothing will ever clean them up. */
402
+ export async function orchestraOrphans() {
403
+ const root = path.join(loomHome(), "orchestra");
404
+ if (!fs.existsSync(root))
405
+ return [];
406
+ const known = new Set(listProjects().map((p) => p.id));
407
+ const out = [];
408
+ for (const id of fs.readdirSync(root)) {
409
+ const dir = path.join(root, id);
410
+ if (known.has(id) || !fs.statSync(dir, { throwIfNoEntry: false })?.isDirectory())
411
+ continue;
412
+ out.push({ id, dir, bytes: await sizeOf(dir) });
413
+ }
414
+ return out;
415
+ }
416
+ export async function diskChecks() {
417
+ if (process.platform === "win32")
418
+ return [];
419
+ const orphans = await orchestraOrphans();
420
+ if (!orphans.length)
421
+ return [ok("orchestra", "no orphaned worktrees")];
422
+ const total = orphans.reduce((n, o) => n + o.bytes, 0);
423
+ return [warn("orchestra", `${orphans.length} orchestra folder${orphans.length === 1 ? "" : "s"} from projects no longer registered (${fmtBytes(total)}): ${orphans.map((o) => `${o.id} ${fmtBytes(o.bytes)}`).join(", ")} — loom orchestra:clean removes them`)];
424
+ }
382
425
  //# sourceMappingURL=doctor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -27,7 +27,7 @@ import qrcode from "qrcode-terminal";
27
27
  }
28
28
  }
29
29
  import { exitCodeFor, turnOutcome } from "../core/turn-wait.js";
30
- import { DaemonClient, DaemonError, daemonRunning, ensureDaemon, stopDaemon, } from "../daemon/client.js";
30
+ import { DaemonClient, DaemonError, daemonRunning, desktopOwnsDaemon, ensureDaemon, stopDaemon, } from "../daemon/client.js";
31
31
  import { installCrashGuards } from "../daemon/guards.js";
32
32
  import { LoomDaemon, DEFAULT_PORT } from "../daemon/server.js";
33
33
  import { ensureLoomHome, findProject, loomHome, readDaemonConfig } from "../core/registry.js";
@@ -200,8 +200,14 @@ program
200
200
  .description("start the loom daemon in the background")
201
201
  .option("--tailnet", "bind to this machine's Tailscale IP", false)
202
202
  .option("--restart", "restart even if a daemon is already running", false)
203
+ .option("--force", "with --restart: replace even Loom Desktop's daemon with this CLI's")
203
204
  .action(async (opts) => {
204
205
  const running = await daemonRunning();
206
+ if (running && !opts.force && (await desktopOwnsDaemon(running))) {
207
+ // replacing it swapped Desktop onto the CLI's build without a word (#306)
208
+ console.log(pc.yellow("Loom Desktop runs this daemon — quit and reopen Loom Desktop to restart it (or loom up --restart --force to replace it with this CLI's)"));
209
+ return;
210
+ }
205
211
  if (running) {
206
212
  const { BUILD_REV } = await import("../daemon/server.js");
207
213
  const health = (await fetch(`http://${running.host}:${running.port}/api/health`)
@@ -251,15 +257,21 @@ program
251
257
  program
252
258
  .command("status")
253
259
  .description("daemon health and project board")
254
- .action(async () => {
260
+ .option("--json", "print the projects as JSON")
261
+ .action(async (opts) => {
255
262
  const cfg = await daemonRunning();
256
263
  if (!cfg) {
264
+ if (opts.json)
265
+ return void console.log(JSON.stringify({ daemon: null, projects: [] }));
257
266
  console.log(pc.dim("daemon: not running (loom up)"));
258
267
  return;
259
268
  }
260
- console.log(pc.green(`daemon: http://${cfg.host}:${cfg.port}`));
269
+ if (!opts.json)
270
+ console.log(pc.green(`daemon: http://${cfg.host}:${cfg.port}`));
261
271
  const client = new DaemonClient(cfg);
262
272
  const { projects } = await client.listProjects();
273
+ if (opts.json)
274
+ return void console.log(JSON.stringify(projects)); // #315
263
275
  if (!projects.length)
264
276
  console.log(pc.dim("no projects yet — loom init"));
265
277
  for (const p of projects)
@@ -290,6 +302,7 @@ program
290
302
  .command("projects")
291
303
  .description("board of all projects")
292
304
  .option("--forget <idOrName>", "stop tracking a project (its .loom/ stays on disk)")
305
+ .option("--json", "print the projects as JSON")
293
306
  .action(async (opts) => {
294
307
  const client = await ensureDaemon();
295
308
  if (opts.forget) {
@@ -309,6 +322,8 @@ program
309
322
  return;
310
323
  }
311
324
  const { projects } = await client.listProjects();
325
+ if (opts.json)
326
+ return void console.log(JSON.stringify(projects)); // #315
312
327
  if (!projects.length)
313
328
  console.log(pc.dim("no projects yet — loom init"));
314
329
  for (const p of projects)
@@ -1114,7 +1129,8 @@ program
1114
1129
  return pc.dim(`${t} ${e.kind}`);
1115
1130
  }
1116
1131
  };
1117
- console.log(pc.dim(project
1132
+ // the banner is for people: stderr, so --json's stdout is events and nothing else (#314)
1133
+ console.error(pc.dim(project
1118
1134
  ? `watching ${project.name} — ^C to stop`
1119
1135
  : "watching every project — ^C to stop"));
1120
1136
  const close = client.subscribe((pid, e) => {
@@ -1197,8 +1213,15 @@ program
1197
1213
  ({ review } = await client.startReview(project.id, { agents, ...(opts.file ? { file: opts.file } : {}), ...(opts.text ? { text: opts.text } : {}), ...(opts.focus ? { focus: opts.focus } : {}) }));
1198
1214
  }
1199
1215
  catch (err) {
1216
+ if (opts.json) {
1217
+ process.exitCode = 1;
1218
+ return void console.log(JSON.stringify({ status: "error", error: err instanceof Error ? err.message : String(err) }));
1219
+ }
1200
1220
  return fail(err instanceof Error ? err.message : String(err));
1201
1221
  }
1222
+ const shaky = review.unreliable ?? [];
1223
+ if (!opts.json && shaky.length)
1224
+ console.error(pc.yellow(`⚠ ${shaky.join(", ")} hasn't finished a review in this project yet (left out each time) — it may wait out review.timeoutMin`));
1202
1225
  if (!opts.json)
1203
1226
  console.error(pc.cyan(`🔍 ${agents.join(", ")} reviewing ${review.target.kind === "file" ? review.target.file : review.target.kind === "diff" ? "the uncommitted changes" : `“${review.target.label ?? "your request"}”`} · read-only, nobody takes the baton`));
1204
1227
  if (!opts.wait)
@@ -1210,6 +1233,9 @@ program
1210
1233
  }
1211
1234
  if (review.status !== "done") {
1212
1235
  process.exitCode = 124;
1236
+ // valid JSON on every exit path: who has answered so far, and who hasn't (#291)
1237
+ if (opts.json)
1238
+ return void console.log(JSON.stringify({ ...review, status: "timeout", waitingOn: review.agents }));
1213
1239
  return void console.error(pc.yellow(`still reviewing after ${opts.timeout}s — loom reviews ${review.reviewId} later`));
1214
1240
  }
1215
1241
  if (opts.json)
@@ -1250,8 +1276,10 @@ program
1250
1276
  await new Promise((r) => setTimeout(r, 1500));
1251
1277
  }
1252
1278
  console.log((council.status === "done" ? pc.green : council.status === "stopped" ? pc.yellow : pc.red)(`\n${council.summary ?? council.status}`));
1253
- if (council.status === "failed")
1279
+ if (council.status === "failed") {
1254
1280
  process.exitCode = 1;
1281
+ console.log(pc.dim(`carry on from where it stopped: loom council:resume ${council.councilId}`));
1282
+ }
1255
1283
  });
1256
1284
  program
1257
1285
  .command("council:status [councilId]")
@@ -1268,6 +1296,21 @@ program
1268
1296
  if (council.summary)
1269
1297
  console.log(pc.dim(`\n${council.summary}`));
1270
1298
  });
1299
+ program
1300
+ .command("council:resume <councilId>")
1301
+ .description("carry on a council that a restart, a failed turn or Stop ended — from the first stage that didn't finish")
1302
+ .action(async (councilId) => {
1303
+ const client = await ensureDaemon();
1304
+ const project = await currentProject(client);
1305
+ try {
1306
+ const { council } = await client.resumeCouncil(project.id, councilId);
1307
+ const next = council.stages.find((st) => !["done", "skipped", "unverified"].includes(st.status) && !(st.key === "prove" && st.status === "failed"));
1308
+ console.log(pc.cyan(`🏛 resuming council ${council.councilId} from ${next?.name ?? "the end"} — loom council:status ${council.councilId}`));
1309
+ }
1310
+ catch (err) {
1311
+ fail(err instanceof Error ? err.message : String(err));
1312
+ }
1313
+ });
1271
1314
  program
1272
1315
  .command("council:stop")
1273
1316
  .description("stop the running council after its current stage")
@@ -1283,7 +1326,7 @@ program
1283
1326
  }
1284
1327
  });
1285
1328
  function councilMark(status) {
1286
- return status === "done" ? pc.green("✓") : status === "running" ? pc.cyan("◐") : status === "failed" ? pc.red("✗") : status === "skipped" ? pc.dim("–") : pc.dim("·");
1329
+ return status === "done" ? pc.green("✓") : status === "running" ? pc.cyan("◐") : status === "failed" ? pc.red("✗") : status === "unverified" ? pc.yellow("?") : status === "skipped" ? pc.dim("–") : pc.dim("·");
1287
1330
  }
1288
1331
  program
1289
1332
  .command("reviews [reviewId]")
@@ -1382,6 +1425,8 @@ program
1382
1425
  });
1383
1426
  // ── orchestra: one orchestrator, many parallel workers (core/orchestra.ts) ──
1384
1427
  const RUN_DONE = new Set(["completed", "failed", "aborted", "waiting_human"]);
1428
+ /** A run a restart cut off is "aborted" on disk but resumable: say so, and how (#305). */
1429
+ const runStatus = (r) => r.status === "aborted" && r.interrupted ? "interrupted (resumable)" : r.status;
1385
1430
  const TASK_COLOR = {
1386
1431
  done: pc.green,
1387
1432
  running: pc.cyan,
@@ -1394,8 +1439,8 @@ const TASK_COLOR = {
1394
1439
  function printRun(run) {
1395
1440
  const done = run.tasks.filter((t) => t.status === "done").length;
1396
1441
  console.log(run.race
1397
- ? `${pc.magenta("🏁")} ${pc.bold(run.id)} ${pc.dim(run.status)} race · ${done}/${run.tasks.length} finished · ${fmtUsd(run.costUsd)}`
1398
- : `${pc.magenta("🎼")} ${pc.bold(run.id)} ${pc.dim(run.status)} ${done}/${run.tasks.length} tasks · ` +
1442
+ ? `${pc.magenta("🏁")} ${pc.bold(run.id)} ${pc.dim(runStatus(run))} race · ${done}/${run.tasks.length} finished · ${fmtUsd(run.costUsd)}`
1443
+ : `${pc.magenta("🎼")} ${pc.bold(run.id)} ${pc.dim(runStatus(run))} ${done}/${run.tasks.length} tasks · ` +
1399
1444
  `round ${run.round}/${run.maxRounds} · ${fmtUsd(run.costUsd)} · ${pc.dim(run.branch)}`);
1400
1445
  console.log(` ${pc.dim("goal")} ${run.goal}`);
1401
1446
  if (run.race)
@@ -1508,7 +1553,7 @@ program
1508
1553
  return void console.log(pc.dim('no orchestra runs yet — loom orchestrate "<goal>"'));
1509
1554
  for (const r of runs.slice(0, 15)) {
1510
1555
  const done = r.tasks.filter((t) => t.status === "done").length;
1511
- console.log(`${pc.bold(r.id)} ${r.status.padEnd(13)} ${String(done).padStart(2)}/${String(r.tasks.length).padEnd(2)} ` +
1556
+ console.log(`${pc.bold(r.id)} ${runStatus(r).padEnd(13)} ${String(done).padStart(2)}/${String(r.tasks.length).padEnd(2)} ` +
1512
1557
  `${pc.dim(new Date(r.createdAt).toLocaleString())} ${r.goal.slice(0, 70)}`);
1513
1558
  }
1514
1559
  }
@@ -1796,14 +1841,18 @@ program
1796
1841
  });
1797
1842
  program
1798
1843
  .command("crew [action] [args...]")
1799
- .description("Agent Teams: status | create | goal | say | approve | pause | stop | resume | pick | refresh | budget | overlap | deliver | apply | diff | remove")
1844
+ .description("Agent Teams: status | create | goal | say | approve | pause | stop | resume | accept | pick | refresh | budget | overlap | deliver | apply | diff | remove")
1800
1845
  .option("--crew <id>", "which crew, when the project has several")
1801
1846
  .option("--to <teammate>", "say: to one teammate")
1802
1847
  .option("--no-approval", "create: the Lead's plan starts without your OK")
1803
1848
  .option("--play <play>", "ship, fanout or race")
1804
1849
  .option("--parallel <n>", "create: maximum concurrent builders (1–4)")
1850
+ .option("--lead <agent>", "create: who leads")
1851
+ .option("--builders <agents>", "create: comma-separated agents that build")
1852
+ .option("--reviewer <agent>", "create: who reviews")
1853
+ .option("--tester <agent>", "create: who tests")
1805
1854
  .option("--amount <usd>", "budget: new goal budget in USD")
1806
- .option("--card <id>", "overlap: held card id")
1855
+ .option("--card <id>", "overlap: held card id; accept: the failed card to take as it stands")
1807
1856
  .option("--decision <decision>", "overlap: narrow, wait:<goal>, or proceed:<reason>")
1808
1857
  .option("--touches <globs>", "overlap: comma-separated revised paths")
1809
1858
  .action(async (action, args, opts) => {
@@ -1817,7 +1866,10 @@ program
1817
1866
  const template = first && templates.includes(first.toLowerCase()) ? first.toLowerCase() : "ship";
1818
1867
  const name = (first && templates.includes(first.toLowerCase()) ? rest : args ?? []).join(" ");
1819
1868
  const { crew } = await client.createCrew(project.id, { template, ...(name ? { name } : {}), ...(opts.approval === false ? { planApproval: false } : {}),
1820
- ...(opts.play ? { play: opts.play } : {}), ...(opts.parallel ? { maxParallel: Number(opts.parallel) } : {}) });
1869
+ ...(opts.play ? { play: opts.play } : {}), ...(opts.parallel ? { maxParallel: Number(opts.parallel) } : {}),
1870
+ ...(opts.lead || opts.builders || opts.reviewer || opts.tester ? { seats: { ...(opts.lead ? { lead: opts.lead } : {}),
1871
+ ...(opts.builders ? { builders: opts.builders.split(",").map((x) => x.trim()).filter(Boolean) } : {}),
1872
+ ...(opts.reviewer ? { reviewer: opts.reviewer } : {}), ...(opts.tester ? { tester: opts.tester } : {}) } } : {}) });
1821
1873
  console.log(`${pc.green("✓")} ${pc.bold(crew.name)} (${crew.id}) — ${crew.teammates.map((t) => `${t.id}=${t.agent}`).join(", ")}`);
1822
1874
  console.log(pc.dim(` give it a goal: loom crew goal "…"${crews.length ? ` --crew ${crew.id}` : ""}`));
1823
1875
  return;
@@ -1853,6 +1905,8 @@ program
1853
1905
  console.log(`${pc.green("✓")} ${out.routed === "goal" ? "new goal" : out.routed === "answer" ? "answered" : out.routed === "replan" ? "the Lead replans with that" : `noted for ${out.to}`}`);
1854
1906
  else if (a === "apply")
1855
1907
  console.log(`${pc.green("✓")} merged ${pc.bold(out.merged)} into ${pc.bold(out.into)}`);
1908
+ else if (a === "budget" && !out.goal?.status?.match(/running|planning|awaiting|waiting|paused/))
1909
+ console.log(`${pc.green("✓")} the next goal starts with a $${Number(opts.amount).toFixed(2)} budget`);
1856
1910
  else
1857
1911
  printCrew(out.crew);
1858
1912
  });
@@ -2500,6 +2554,8 @@ program
2500
2554
  // ---------------------------------------------------------------------------
2501
2555
  // send / chat / handoff / interrupt / decision / log
2502
2556
  // ---------------------------------------------------------------------------
2557
+ /** A session this big, resumed cold, is worth a warning before a turn re-reads it (#280). */
2558
+ const HEAVY_SESSION = 100_000;
2503
2559
  /**
2504
2560
  * .loom/ is this machine's runtime state — the event log, attachments, a 0600 config — not something
2505
2561
  * to commit (a team's shared memory lives in AGENTS.md). In a git repo that doesn't ignore it yet,
@@ -2522,9 +2578,9 @@ async function offerGitignore(dir, choice) {
2522
2578
  fs.writeFileSync(file, `${before}${before && !before.endsWith("\n") ? "\n" : ""}# Loom's local state (event log, attachments, machine config)\n.loom/\n`);
2523
2579
  console.log(pc.green("✓ added .loom/ to .gitignore"));
2524
2580
  }
2525
- async function sendWithHandoffConfirm(client, projectId, text, agentId, interactive = true) {
2581
+ async function sendWithHandoffConfirm(client, projectId, text, agentId, interactive = true, fresh = false) {
2526
2582
  try {
2527
- return await client.send(projectId, text, agentId);
2583
+ return await client.send(projectId, text, agentId, { fresh });
2528
2584
  }
2529
2585
  catch (err) {
2530
2586
  if (err instanceof DaemonError && err.status === 409 && agentId) {
@@ -2535,7 +2591,7 @@ async function sendWithHandoffConfirm(client, projectId, text, agentId, interact
2535
2591
  if (!yes)
2536
2592
  return null;
2537
2593
  await client.handoff(projectId, agentId);
2538
- return await client.send(projectId, text, agentId);
2594
+ return await client.send(projectId, text, agentId, { fresh });
2539
2595
  }
2540
2596
  throw err;
2541
2597
  }
@@ -2547,12 +2603,29 @@ program
2547
2603
  .option("--wait", "wait for the turn to end; print the reply and cost; exit 0 done, 1 failed, 2 asked a question, 124 timed out")
2548
2604
  .option("--json", "with --wait: print the outcome as one JSON object")
2549
2605
  .option("--timeout <seconds>", "with --wait: give up after this long", "1800")
2606
+ .option("--fresh", "start the agent's session in this chat over — a short question needn't re-read a long one")
2550
2607
  .action(async (words, opts) => {
2551
2608
  const client = await ensureDaemon();
2552
2609
  const project = await currentProject(client);
2610
+ // a long session whose prompt cache has gone cold is re-read in full: say so before spending it (#280)
2611
+ const target = opts.agent ?? project.holder ?? undefined;
2612
+ if (!opts.fresh && target) {
2613
+ const weight = await client.sessionWeight(project.id, target).then((r) => r.session).catch(() => null);
2614
+ if (weight && weight.cold && weight.tokens >= HEAVY_SESSION) {
2615
+ const ago = weight.ageMs >= 3_600_000 ? `${Math.round(weight.ageMs / 3_600_000)}h` : `${Math.round(weight.ageMs / 60_000)}m`;
2616
+ console.error(pc.yellow(`⚠ ${target}'s session here is ${Math.round(weight.tokens / 1000)}k tokens, last used ${ago} ago — its cache has likely expired, so this turn re-reads all of it` +
2617
+ `${weight.estUsd !== undefined ? ` (~${fmtUsd(weight.estUsd)} est.)` : ""}. --fresh starts a new session instead.`));
2618
+ // a person at a terminal is asked, --wait or not; a script only gets the warning (#300)
2619
+ if (process.stdin.isTTY && process.stdout.isTTY) {
2620
+ const go = await confirm(pc.yellow("send it to the existing session anyway?"));
2621
+ if (!go)
2622
+ return void console.log(pc.dim(`not sent — loom send --fresh${opts.agent ? ` -a ${opts.agent}` : ""} "…"`));
2623
+ }
2624
+ }
2625
+ }
2553
2626
  // where the log is now, so the wait reads only what this send causes (#254)
2554
2627
  const since = opts.wait ? ((await client.events(project.id, undefined, 1)).events.at(-1)?.id ?? 0) : 0;
2555
- const result = await sendWithHandoffConfirm(client, project.id, words.join(" "), opts.agent, !opts.wait || process.stdin.isTTY);
2628
+ const result = await sendWithHandoffConfirm(client, project.id, words.join(" "), opts.agent, !opts.wait || process.stdin.isTTY, Boolean(opts.fresh));
2556
2629
  if (!result)
2557
2630
  return;
2558
2631
  if (!opts.wait)
@@ -2719,9 +2792,14 @@ program
2719
2792
  cost: pc.dim,
2720
2793
  turn: pc.dim,
2721
2794
  };
2795
+ // a stretch that crosses midnight says which day each moment was; the totals row has no moment (#297)
2796
+ const day = (t) => new Date(t).toDateString();
2797
+ const spans = d.lines.some((l) => l.kind !== "cost" && day(l.at) !== day(Date.now()));
2798
+ const stamp = (l) => l.kind === "cost" ? "in all"
2799
+ : `${spans ? `${new Date(l.at).toLocaleDateString([], { month: "short", day: "numeric" })} ` : ""}${new Date(l.at).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" })}`;
2800
+ const width = Math.max(...d.lines.map((l) => stamp(l).length));
2722
2801
  for (const line of d.lines) {
2723
- const when = new Date(line.at).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
2724
- console.log(`${pc.dim(when)} ${(paint[line.kind] ?? ((x) => x))(line.text)}`);
2802
+ console.log(`${pc.dim(stamp(line).padEnd(width))} ${(paint[line.kind] ?? ((x) => x))(line.text)}${line.count && line.count > 1 ? pc.dim(` ×${line.count}`) : ""}`);
2725
2803
  }
2726
2804
  if (d.waiting.length)
2727
2805
  console.log(pc.yellow(`\nwaiting on you: ${d.waiting.join(", ")}`));
@@ -3085,6 +3163,15 @@ program
3085
3163
  console.log(pc.dim(" no turns recorded yet"));
3086
3164
  console.log(pc.dim("\n(costs come from agents that report them — claude-code and opencode do)"));
3087
3165
  });
3166
+ program
3167
+ .command("memory:repair")
3168
+ .description("mend decisions recorded before 1.2.1 whose underscores and paths were stripped, from the planner's own words")
3169
+ .action(async () => {
3170
+ const client = await ensureDaemon();
3171
+ const project = await currentProject(client);
3172
+ const { repaired, checked } = await client.repairDecisions(project.id);
3173
+ console.log(repaired ? pc.green(`✓ mended ${repaired} of ${checked} review decisions`) : pc.dim(`nothing to mend among ${checked} review decisions`));
3174
+ });
3088
3175
  program
3089
3176
  .command("decision <text...>")
3090
3177
  .description("record a decision into shared memory (projected on every handoff)")
@@ -3232,8 +3319,10 @@ program
3232
3319
  // fall through to a fresh diagnosis, so the report reflects the repairs
3233
3320
  }
3234
3321
  const checks = await envChecks();
3322
+ checks.push(...(await (await import("./doctor.js")).diskChecks()));
3323
+ const signedOut = checks.filter((c) => c.status === "fail" && /signed out/.test(c.detail)).map((c) => c.name);
3235
3324
  if (dir)
3236
- checks.push(...projectChecks(dir));
3325
+ checks.push(...projectChecks(dir, signedOut));
3237
3326
  else
3238
3327
  checks.push({ name: "project", status: "warn", detail: "not inside a Loom project (loom init)" });
3239
3328
  // The daemon is often the desktop app's, started without this shell's PATH or keys:
@@ -3277,13 +3366,46 @@ program
3277
3366
  }
3278
3367
  console.log(pc.green("\nall clear"));
3279
3368
  });
3369
+ program
3370
+ .command("orchestra:clean")
3371
+ .description("remove orchestra worktrees left by projects that are no longer registered")
3372
+ .option("--dry-run", "only say what would go")
3373
+ .action(async (opts) => {
3374
+ const { orchestraOrphans, fmtBytes } = await import("./doctor.js");
3375
+ const orphans = await orchestraOrphans();
3376
+ if (!orphans.length)
3377
+ return void console.log(pc.dim("no orphaned orchestra worktrees"));
3378
+ for (const o of orphans) {
3379
+ if (!opts.dryRun)
3380
+ fs.rmSync(o.dir, { recursive: true, force: true });
3381
+ console.log(`${opts.dryRun ? pc.dim("would remove") : pc.green("✓ removed")} ${o.dir} ${pc.dim(fmtBytes(o.bytes))}`);
3382
+ }
3383
+ if (!opts.dryRun)
3384
+ console.log(pc.dim("their branches stay in each repo: git worktree prune there tidies git's own list"));
3385
+ });
3280
3386
  program
3281
3387
  .command("clients")
3282
3388
  .description("list paired devices, revoke one, or ping them with a test push")
3283
3389
  .option("--revoke <id>", "revoke a paired device's access")
3284
3390
  .option("--ping", "send a test push notification to all registered devices", false)
3391
+ .option("--prune", "revoke devices not seen for --days (never one registered for push, nor Loom Desktop)")
3392
+ .option("--days <n>", "with --prune: how long unseen counts as gone", "30")
3393
+ .option("--dry-run", "with --prune: only list what would go")
3285
3394
  .action(async (opts) => {
3286
3395
  const client = await ensureDaemon();
3396
+ if (opts.prune) {
3397
+ // every pairing made a device and nothing retired them: 86 piled up in a day of testing (#320)
3398
+ const { clients } = await client.pairedClients();
3399
+ const cutoff = Date.now() - Math.max(1, Number(opts.days) || 30) * 86_400_000;
3400
+ const gone = clients.filter((c) => !c.push && !c.owner && (c.lastSeen ?? c.createdAt) < cutoff);
3401
+ for (const c of gone) {
3402
+ if (!opts.dryRun)
3403
+ await client.revokeClient(c.id);
3404
+ console.log(`${opts.dryRun ? pc.dim("would revoke") : pc.green("✓ revoked")} ${c.name} ${pc.dim(`(${c.id}) last seen ${new Date(c.lastSeen ?? c.createdAt).toLocaleDateString()}`)}`);
3405
+ }
3406
+ console.log(pc.dim(gone.length ? `${gone.length} of ${clients.length} devices${opts.dryRun ? " would go" : " revoked"}` : `nothing unseen for ${opts.days} days among ${clients.length} devices`));
3407
+ return;
3408
+ }
3287
3409
  if (opts.revoke) {
3288
3410
  await client.revokeClient(opts.revoke);
3289
3411
  console.log(pc.green(`✓ revoked ${opts.revoke}`));
@@ -3301,9 +3423,11 @@ program
3301
3423
  return void console.log(pc.dim("no paired devices — loom pair"));
3302
3424
  for (const c of clients) {
3303
3425
  console.log(` ${pc.bold(c.name)} ${pc.dim(`(${c.id})`)} paired ${new Date(c.createdAt).toLocaleString()}` +
3426
+ pc.dim(` ·seen ${c.lastSeen ? new Date(c.lastSeen).toLocaleDateString() : "never"}`) +
3427
+ (c.owner ? pc.cyan(" ·owner") : "") +
3304
3428
  (c.push ? pc.green(" ·push✓") : pc.dim(" ·no push")));
3305
3429
  }
3306
- console.log(pc.dim("\nrevoke: loom clients --revoke <id> · test push: loom clients --ping"));
3430
+ console.log(pc.dim("\nrevoke: loom clients --revoke <id> · tidy up: loom clients --prune [--days 30] [--dry-run] · test push: loom clients --ping"));
3307
3431
  });
3308
3432
  program
3309
3433
  .command("pair")