@wrongstack/cli 0.300.0 → 0.301.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/{acp-IDNS2YVE.js → acp-DATHHPNT.js} +34 -15
  2. package/dist/acp-server-agent.d.ts +1 -1
  3. package/dist/{audit-2ZSFGNIF.js → audit-QRCLEHHW.js} +5 -1
  4. package/dist/{auth-6T6ZOT2R.js → auth-JASC4K3F.js} +150 -37
  5. package/dist/boot/launch-menu.d.ts +2 -4
  6. package/dist/boot/tool-registry.d.ts +3 -0
  7. package/dist/chimera-reviewer-policy.d.ts +10 -3
  8. package/dist/chimera-work-registry.d.ts +19 -0
  9. package/dist/{chronicle-QQEQFSSE.js → chronicle-63MFCZN6.js} +26 -5
  10. package/dist/{chunk-YWUPHRGB.js → chunk-263G3FMB.js} +33 -10
  11. package/dist/{chunk-GYDQABMA.js → chunk-2KDOFTTM.js} +44 -32
  12. package/dist/chunk-CSAPOCBP.js +24 -0
  13. package/dist/{chunk-N7ULWBO5.js → chunk-ETOEGL3V.js} +3 -7
  14. package/dist/{chunk-3MWUZMOL.js → chunk-GUHQQG63.js} +14 -3
  15. package/dist/chunk-KE7E7DPX.js +38 -0
  16. package/dist/{chunk-PEMN4T5O.js → chunk-MHF2IJDE.js} +21 -4
  17. package/dist/{chunk-V76R7DC5.js → chunk-O7XNGCRT.js} +311 -309
  18. package/dist/{chunk-DPJZQCVP.js → chunk-YMXXOOFN.js} +1 -1
  19. package/dist/{chunk-4WJKVQJY.js → chunk-ZECLGUTF.js} +15 -3
  20. package/dist/{cli-main-7B3G2YSG.js → cli-main-XWC57MGE.js} +333 -98
  21. package/dist/{execution-SHGM7BVC.js → execution-LHMSMDHB.js} +126 -52
  22. package/dist/execution-chimera-cascade.d.ts +3 -4
  23. package/dist/execution-chimera-review.d.ts +2 -3
  24. package/dist/execution-cleanup.d.ts +3 -2
  25. package/dist/execution.d.ts +1 -1
  26. package/dist/{export-TPORYVRZ.js → export-DOBGPY23.js} +12 -1
  27. package/dist/fleet/host-context.d.ts +1 -1
  28. package/dist/fleet/host-helpers.d.ts +14 -0
  29. package/dist/fleet/status-broadcast.d.ts +1 -1
  30. package/dist/{hq-DVDD4XPV.js → hq-LN5CJHCM.js} +2 -2
  31. package/dist/hq-server/routes.d.ts +10 -1
  32. package/dist/hq-server/ws.d.ts +17 -6
  33. package/dist/{hq-server-DQHLNHDL.js → hq-server-S7HZG3PA.js} +3 -2
  34. package/dist/index.js +63 -98
  35. package/dist/live-settings-input.d.ts +5 -0
  36. package/dist/{mcp-CYLPUEHC.js → mcp-OHPJH73U.js} +6 -2
  37. package/dist/{modeldiag-YOQZHBQV.js → modeldiag-3DOK4BWW.js} +2 -2
  38. package/dist/{plugin-usage-EOG4ET4S.js → plugin-usage-YEVLOR33.js} +7 -3
  39. package/dist/{plugins-56CMWMPR.js → plugins-K3BAUP4D.js} +3 -3
  40. package/dist/profile-config-path.d.ts +0 -2
  41. package/dist/provider-helpers.d.ts +0 -5
  42. package/dist/{providers-models-K6RT7ABI.js → providers-models-WEZ4EGLL.js} +6 -5
  43. package/dist/{replay-KCTXNMZQ.js → replay-FCBNHW3K.js} +5 -1
  44. package/dist/{rewind-EJMVFVLS.js → rewind-AOD3JIYX.js} +5 -1
  45. package/dist/{sessions-config-NLCMK3BY.js → sessions-config-XXN7267N.js} +8 -3
  46. package/dist/subcommands/flags.d.ts +23 -0
  47. package/dist/terminal-format.d.ts +15 -0
  48. package/dist/{webui-server-G3EKFXLL.js → webui-server-DD35QFNO.js} +5 -13
  49. package/dist/wiring/brain-and-orchestration.d.ts +1 -1
  50. package/dist/wiring/mailbox-bridge-bootstrap.d.ts +3 -1
  51. package/dist/wiring/management-tools.d.ts +9 -1
  52. package/dist/wiring/pipeline.d.ts +5 -5
  53. package/dist/wiring/plugins.d.ts +2 -3
  54. package/dist/wiring/provider-utility-tools.d.ts +1 -0
  55. package/dist/wiring/tools.d.ts +4 -5
  56. package/package.json +23 -23
@@ -80,20 +80,40 @@ async function safeDelete(filePath) {
80
80
  }
81
81
  }
82
82
  }
83
+ var REDACTED = "[REDACTED]";
84
+ function maskValue(v) {
85
+ if (Array.isArray(v)) return v.map(maskValue);
86
+ if (typeof v === "object" && v !== null) return maskConfigSecrets(v);
87
+ return v;
88
+ }
83
89
  function maskConfigSecrets(cfg) {
84
90
  if (typeof cfg !== "object" || cfg === null) return {};
85
91
  const out = {};
86
92
  for (const [k, v] of Object.entries(cfg)) {
87
93
  if (isSecretField(k)) {
88
- out[k] = "[REDACTED]";
89
- } else if (typeof v === "object" && v !== null && !Array.isArray(v)) {
90
- out[k] = maskConfigSecrets(v);
94
+ out[k] = REDACTED;
91
95
  } else {
92
- out[k] = v;
96
+ out[k] = maskValue(v);
93
97
  }
94
98
  }
95
99
  return out;
96
100
  }
101
+ function reviveSecrets(masked, current) {
102
+ if (masked === REDACTED) return current;
103
+ if (Array.isArray(masked)) {
104
+ const cur = Array.isArray(current) ? current : [];
105
+ return masked.map((item, i) => reviveSecrets(item, cur[i]));
106
+ }
107
+ if (typeof masked !== "object" || masked === null) return masked;
108
+ const curObj = typeof current === "object" && current !== null && !Array.isArray(current) ? current : {};
109
+ const out = {};
110
+ for (const [k, v] of Object.entries(masked)) {
111
+ const revived = reviveSecrets(v, curObj[k]);
112
+ if (revived === void 0) continue;
113
+ out[k] = revived;
114
+ }
115
+ return out;
116
+ }
97
117
  function diffSummary(oldCfg, newCfg) {
98
118
  const changes = [];
99
119
  const allKeys = /* @__PURE__ */ new Set([...Object.keys(oldCfg), ...Object.keys(newCfg)]);
@@ -199,7 +219,7 @@ async function backupCurrent(homeFn = defaultHomeDir, targetConfigPath) {
199
219
  }
200
220
  if (content !== void 0) {
201
221
  try {
202
- await atomicWrite(last, content);
222
+ await atomicWrite(last, content, { mode: 384 });
203
223
  } catch (err) {
204
224
  writeErr(
205
225
  `[config-history] .last backup failed: ${toErrorMessage(err)}`
@@ -209,7 +229,7 @@ async function backupCurrent(homeFn = defaultHomeDir, targetConfigPath) {
209
229
  if (content !== void 0) {
210
230
  try {
211
231
  const bakPath = `${cfg}.${ts}.bak`;
212
- await atomicWrite(bakPath, content);
232
+ await atomicWrite(bakPath, content, { mode: 384 });
213
233
  } catch (err) {
214
234
  writeErr(
215
235
  `[config-history] timestamped backup failed: ${toErrorMessage(err)}`
@@ -244,7 +264,7 @@ async function appendHistory(oldCfg, newCfg, description, homeFn = defaultHomeDi
244
264
  await fs.writeFile(
245
265
  path.join(historyDir(homeFn, targetConfigPath), `${id}.json`),
246
266
  JSON.stringify(entry, null, 2),
247
- "utf8"
267
+ { encoding: "utf8", mode: 384 }
248
268
  );
249
269
  } catch (err) {
250
270
  throw new FsError({
@@ -292,14 +312,17 @@ async function restoreFromHistory(id, homeFn = defaultHomeDir, targetConfigPath)
292
312
  oldCfg = JSON.parse(raw);
293
313
  } catch {
294
314
  }
315
+ const restored = reviveSecrets(entry.snapshotMasked, oldCfg);
295
316
  try {
296
- await atomicWrite(configPath(homeFn, targetConfigPath), JSON.stringify(entry.snapshotMasked, null, 2));
317
+ await atomicWrite(configPath(homeFn, targetConfigPath), JSON.stringify(restored, null, 2), {
318
+ mode: 384
319
+ });
297
320
  } catch (err) {
298
321
  return { ok: false, backupId: null, error: String(err) };
299
322
  }
300
323
  const backupId = await appendHistory(
301
324
  oldCfg,
302
- entry.snapshotMasked,
325
+ restored,
303
326
  `Restored from history ${id}`,
304
327
  homeFn,
305
328
  targetConfigPath
@@ -343,4 +366,4 @@ export {
343
366
  restoreFromHistory,
344
367
  restoreLast
345
368
  };
346
- //# sourceMappingURL=chunk-YWUPHRGB.js.map
369
+ //# sourceMappingURL=chunk-263G3FMB.js.map
@@ -1,3 +1,7 @@
1
+ import {
2
+ terminalLink,
3
+ terminalText
4
+ } from "./chunk-KE7E7DPX.js";
1
5
  import {
2
6
  resolveAuditActor
3
7
  } from "./chunk-Q5GTM25S.js";
@@ -2539,12 +2543,12 @@ function createHqRouter(deps) {
2539
2543
  } = deps;
2540
2544
  return async (req, res) => {
2541
2545
  try {
2542
- const url = new URL(req.url ?? "/", `http://${host}:${listeningPort}`);
2546
+ const url = new URL(req.url ?? "/", `http://${host}:${listeningPort()}`);
2543
2547
  setHqSecurityHeaders2(res);
2544
2548
  if (!hasTrustedBrowserOrigin2(
2545
2549
  req,
2546
2550
  host,
2547
- listeningPort,
2551
+ listeningPort(),
2548
2552
  trustedPublicOrigins,
2549
2553
  allowFileOrigin
2550
2554
  )) {
@@ -3163,17 +3167,11 @@ async function handleMailboxAction(_req, res, match, mutableAuth, sessions, data
3163
3167
  // src/hq-server/startup.ts
3164
3168
  import * as fs4 from "node:fs/promises";
3165
3169
  import * as path6 from "node:path";
3170
+ import { writeHqRuntimeFile } from "@wrongstack/core/hq";
3166
3171
  var hqRuntimeMarkerPath2 = hqRuntimeMarkerPath;
3167
3172
  async function writeHqRuntimeMarker(dataDir, url) {
3168
- const file = hqRuntimeMarkerPath2(dataDir);
3169
- const payload = JSON.stringify(
3170
- { url, pid: process.pid, updatedAt: (/* @__PURE__ */ new Date()).toISOString() },
3171
- null,
3172
- 2
3173
- );
3174
- await fs4.mkdir(path6.dirname(file), { recursive: true });
3175
- await fs4.writeFile(file, `${payload}
3176
- `, { encoding: "utf8", mode: 384 });
3173
+ await fs4.mkdir(dataDir, { recursive: true });
3174
+ await writeHqRuntimeFile(dataDir, { url, pid: process.pid });
3177
3175
  }
3178
3176
  async function clearHqRuntimeMarker(dataDir, url) {
3179
3177
  const file = hqRuntimeMarkerPath2(dataDir);
@@ -3188,19 +3186,23 @@ async function clearHqRuntimeMarker(dataDir, url) {
3188
3186
  }
3189
3187
  function writeHqStartupInfo(write, handle) {
3190
3188
  const startup = handle.firstRunSetup;
3191
- write(`WrongStack HQ listening on http://${handle.host}:${handle.port}
3192
- `);
3189
+ const browserUrl = buildHttpUrl(handle.host, handle.port);
3190
+ const clientUrl = buildClientWsUrl(handle.host, handle.port);
3191
+ write(
3192
+ `${terminalText("WrongStack HQ", "magenta")} ${terminalText("listening on", "green")} ${terminalLink(browserUrl)}
3193
+ `
3194
+ );
3193
3195
  if (!startup) {
3194
- write(`Browser endpoint: ${buildHttpUrl(handle.host, handle.port)}
3196
+ write(`${terminalText("Browser endpoint:", "blue")} ${terminalLink(browserUrl)}
3195
3197
  `);
3196
- write(`Client endpoint: ${buildClientWsUrl(handle.host, handle.port)}
3198
+ write(`${terminalText("Client endpoint:", "blue")} ${terminalLink(clientUrl)}
3197
3199
  `);
3198
3200
  writeHqLanEndpoints(write, handle, void 0);
3199
3201
  return;
3200
3202
  }
3201
- write(`Browser endpoint: ${startup.browserUrl}
3203
+ write(`${terminalText("Browser endpoint:", "blue")} ${terminalLink(startup.browserUrl)}
3202
3204
  `);
3203
- write(`Client endpoint: ${startup.clientUrl}
3205
+ write(`${terminalText("Client endpoint:", "blue")} ${terminalLink(startup.clientUrl)}
3204
3206
  `);
3205
3207
  if (startup.createdAuth) {
3206
3208
  write(`
@@ -3226,13 +3228,23 @@ function writeHqLanEndpoints(write, handle, browserToken) {
3226
3228
  if (handle.host !== "0.0.0.0" && handle.host !== "::") return;
3227
3229
  const ips = lanIPv4Addresses();
3228
3230
  if (ips.length === 0) return;
3229
- write("\nReachable from other machines on your network:\n");
3231
+ write(
3232
+ `
3233
+ ${terminalText("Reachable from other machines on your network:", "blue", { bold: true })}
3234
+ `
3235
+ );
3230
3236
  for (const ip of ips) {
3231
- write(` ${buildHttpUrl(ip, handle.port, browserToken)}
3237
+ const url = buildHttpUrl(ip, handle.port, browserToken);
3238
+ write(` ${terminalLink(url)}
3232
3239
  `);
3233
3240
  }
3234
- write(` On another machine, set WRONGSTACK_HQ_URL=http://${ips[0]}:${handle.port}
3235
- `);
3241
+ const firstIp = ips[0];
3242
+ if (firstIp === void 0) return;
3243
+ const clientUrl = buildHttpUrl(firstIp, handle.port);
3244
+ write(
3245
+ ` ${terminalText("On another machine, set", "muted")} WRONGSTACK_HQ_URL=${terminalLink(clientUrl)}
3246
+ `
3247
+ );
3236
3248
  }
3237
3249
 
3238
3250
  // src/hq-server/ws.ts
@@ -3363,7 +3375,7 @@ function nextPeerEventSeq(eventLog) {
3363
3375
  peerEventSeq += 1;
3364
3376
  return peerEventSeq;
3365
3377
  }
3366
- function fanoutKanbanDelta(message, clients, browsers, projectId) {
3378
+ function fanoutKanbanDelta(message, clients, _browsers, projectId) {
3367
3379
  let clientsNotified = 0;
3368
3380
  for (const peer of clients.values()) {
3369
3381
  if (peer.projectId === projectId) {
@@ -3371,12 +3383,7 @@ function fanoutKanbanDelta(message, clients, browsers, projectId) {
3371
3383
  clientsNotified++;
3372
3384
  }
3373
3385
  }
3374
- let browsersNotified = 0;
3375
- for (const browserWs of browsers) {
3376
- sendGuarded(browserWs, message);
3377
- browsersNotified++;
3378
- }
3379
- return { clientsNotified, browsersNotified };
3386
+ return { clientsNotified, browsersNotified: 0 };
3380
3387
  }
3381
3388
  function handleClientResume(ws, clients, eventLog, frame, snapshotBroadcaster) {
3382
3389
  const client = clients.get(ws);
@@ -4275,7 +4282,7 @@ async function startHqServerWithAuth(options, host, port, dataDir, firstRunAuth)
4275
4282
  const routerDeps = {
4276
4283
  trustBoundary,
4277
4284
  host,
4278
- listeningPort,
4285
+ listeningPort: () => listeningPort,
4279
4286
  trustedPublicOrigins,
4280
4287
  allowFileOrigin: options.allowFileOrigin,
4281
4288
  mutableAuth,
@@ -4545,8 +4552,13 @@ async function startHqServerWithAuth(options, host, port, dataDir, firstRunAuth)
4545
4552
  snapshotBroadcaster.close();
4546
4553
  bootstrapStore.clear();
4547
4554
  persistence.timeseries.flush();
4548
- for (const ws of browsers) ws.close(1001, "HQ shutting down");
4549
- for (const ws of clients.keys()) ws.close(1001, "HQ shutting down");
4555
+ for (const ws of [...browsers, ...clients.keys()]) {
4556
+ try {
4557
+ ws.close(1001, "HQ shutting down");
4558
+ ws.terminate();
4559
+ } catch {
4560
+ }
4561
+ }
4550
4562
  wss.close();
4551
4563
  for (const { router } of mailboxGateways.values()) router.close();
4552
4564
  httpServer.close(() => {
@@ -4594,4 +4606,4 @@ export {
4594
4606
  startHqServer,
4595
4607
  HqInsecureExposureError2 as HqInsecureExposureError
4596
4608
  };
4597
- //# sourceMappingURL=chunk-GYDQABMA.js.map
4609
+ //# sourceMappingURL=chunk-2KDOFTTM.js.map
@@ -0,0 +1,24 @@
1
+
2
+ // src/subcommands/flags.ts
3
+ function restoreFlags(args, deps, names) {
4
+ const flags = deps.flags;
5
+ if (!flags) return args;
6
+ const alreadyPresent = new Set(
7
+ args.filter((a) => a.startsWith("-")).map((a) => a.replace(/^-+/, "").split("=")[0]).filter((a) => a !== void 0 && a.length > 0)
8
+ );
9
+ const restored = [];
10
+ for (const name of names) {
11
+ if (alreadyPresent.has(name)) continue;
12
+ const value = flags[name];
13
+ if (value === void 0 || value === false) continue;
14
+ const token = name.length === 1 ? `-${name}` : `--${name}`;
15
+ if (value === true) restored.push(token);
16
+ else restored.push(token, value);
17
+ }
18
+ return restored.length > 0 ? [...args, ...restored] : args;
19
+ }
20
+
21
+ export {
22
+ restoreFlags
23
+ };
24
+ //# sourceMappingURL=chunk-CSAPOCBP.js.map
@@ -1,5 +1,6 @@
1
1
 
2
2
  // src/provider-helpers.ts
3
+ import { hasProviderCredential } from "@wrongstack/core/models";
3
4
  import { catalogProviderIdFor } from "@wrongstack/providers";
4
5
  function uniqueModelIds(primary, fallback) {
5
6
  const seen = /* @__PURE__ */ new Set();
@@ -34,12 +35,7 @@ function isKeylessLocalProvider(provider) {
34
35
  return isLoopbackUrl(provider.apiBase);
35
36
  }
36
37
  function hasApiKey(provider, config) {
37
- if (provider.envVars.some((v) => !!process.env[v])) return true;
38
- const entry = config?.providers?.[provider.id];
39
- if (!entry) return false;
40
- if (typeof entry.apiKey === "string" && entry.apiKey.length > 0) return true;
41
- if (Array.isArray(entry.apiKeys) && entry.apiKeys.some((k) => k?.apiKey)) return true;
42
- return false;
38
+ return hasProviderCredential(provider, config);
43
39
  }
44
40
  async function buildPickableProviders(modelsRegistry, config) {
45
41
  const overlay = config.providers ?? {};
@@ -88,4 +84,4 @@ export {
88
84
  hasApiKey,
89
85
  buildPickableProviders
90
86
  };
91
- //# sourceMappingURL=chunk-N7ULWBO5.js.map
87
+ //# sourceMappingURL=chunk-ETOEGL3V.js.map
@@ -394,7 +394,12 @@ function auditEntryFor(spec) {
394
394
  function officialPluginState(config, spec) {
395
395
  const match = (config.plugins ?? []).find((p) => pluginName(p) === spec);
396
396
  if (!match) return "not configured";
397
- return typeof match === "object" && match.enabled === false ? "disabled" : "enabled";
397
+ const { enabled } = resolvePluginEnablement({
398
+ name: spec,
399
+ config,
400
+ matches: (candidate) => pluginMatchesToggleSpec(candidate, spec)
401
+ });
402
+ return enabled ? "enabled" : "disabled";
398
403
  }
399
404
  async function togglePlugin(spec, deps) {
400
405
  const auditEntry = auditEntryFor(spec);
@@ -405,7 +410,13 @@ async function togglePlugin(spec, deps) {
405
410
  const plugins = Array.isArray(existing.plugins) ? existing.plugins : [];
406
411
  const idx = plugins.findIndex((p) => pluginMatchesToggleSpec(p, spec));
407
412
  const configured = idx >= 0 ? plugins[idx] : void 0;
408
- const enabled = configured ? !(typeof configured === "object" && configured.enabled === false) : auditEntry?.defaultState === "active";
413
+ const effectiveConfig = { ...deps.config, ...existing };
414
+ const { enabled } = resolvePluginEnablement({
415
+ name: spec,
416
+ defaultState: auditEntry?.defaultState,
417
+ config: effectiveConfig,
418
+ matches: (candidate) => pluginMatchesToggleSpec(candidate, spec)
419
+ });
409
420
  if (!configured && !auditEntry) {
410
421
  return errorResult(
411
422
  `Plugin "${spec}" is not configured. Use "wstack plugin add ${spec}" first.`
@@ -497,4 +508,4 @@ export {
497
508
  PLUGIN_AUDIT_ENTRIES,
498
509
  runPluginManagementCommand
499
510
  };
500
- //# sourceMappingURL=chunk-3MWUZMOL.js.map
511
+ //# sourceMappingURL=chunk-GUHQQG63.js.map
@@ -0,0 +1,38 @@
1
+
2
+ // src/terminal-format.ts
3
+ var ANSI = {
4
+ blue: "\x1B[34m",
5
+ cyan: "\x1B[36m",
6
+ green: "\x1B[32m",
7
+ magenta: "\x1B[35m",
8
+ muted: "\x1B[90m",
9
+ success: "\x1B[32m",
10
+ yellow: "\x1B[33m"
11
+ };
12
+ var BOLD = "\x1B[1m";
13
+ var RESET = "\x1B[0m";
14
+ function terminalFormattingEnabled(env = process.env, isTty = Boolean(process.stdout.isTTY)) {
15
+ if (env["NO_COLOR"] !== void 0) return false;
16
+ if (env["FORCE_COLOR"] !== void 0) return true;
17
+ return isTty;
18
+ }
19
+ function terminalText(text, tone, options = {}) {
20
+ const enabled = options.enabled ?? terminalFormattingEnabled();
21
+ if (!enabled) return text;
22
+ return `${options.bold ? BOLD : ""}${ANSI[tone]}${text}${RESET}`;
23
+ }
24
+ function terminalLink(url, options = {}) {
25
+ const enabled = options.enabled ?? terminalFormattingEnabled();
26
+ if (!enabled) return url;
27
+ const visible = terminalText(url, options.tone ?? "cyan", {
28
+ ...options.bold === void 0 ? {} : { bold: options.bold },
29
+ enabled: true
30
+ });
31
+ return `\x1B]8;;${url}\x1B\\${visible}\x1B]8;;\x1B\\`;
32
+ }
33
+
34
+ export {
35
+ terminalText,
36
+ terminalLink
37
+ };
38
+ //# sourceMappingURL=chunk-KE7E7DPX.js.map
@@ -2,11 +2,11 @@ import {
2
2
  hasApiKey,
3
3
  isKeylessLocalProvider,
4
4
  visibleModelIds
5
- } from "./chunk-N7ULWBO5.js";
5
+ } from "./chunk-ETOEGL3V.js";
6
6
  import {
7
7
  appendHistory,
8
8
  backupCurrent
9
- } from "./chunk-YWUPHRGB.js";
9
+ } from "./chunk-263G3FMB.js";
10
10
 
11
11
  // src/arg-parser.ts
12
12
  var BOOLEAN_FLAGS = /* @__PURE__ */ new Set([
@@ -79,7 +79,24 @@ var BOOLEAN_FLAGS = /* @__PURE__ */ new Set([
79
79
  // being consumed as the value of one of these switches.
80
80
  "all-models",
81
81
  "plan",
82
- "json"
82
+ "json",
83
+ // Destructive-preview switch (`wstack chronicle prune --dry-run`). It is
84
+ // boolean at every call site, and leaving it out let it consume the next
85
+ // positional — on a command whose whole purpose is to NOT delete.
86
+ "dry-run",
87
+ // Subcommand booleans. A boolean flag missing from this set makes `parseArgs`
88
+ // swallow the FOLLOWING positional as its value (`rewind --all sess123` lost
89
+ // the session id, `export --no-tools out.md` lost the output path), on top of
90
+ // the handler never seeing the flag at all.
91
+ "all",
92
+ "list",
93
+ "latest",
94
+ "disabled",
95
+ "enable",
96
+ "no-tools",
97
+ "no-diagnostics",
98
+ "unsupported",
99
+ "ws"
83
100
  ]);
84
101
  function parseArgs(argv) {
85
102
  const flags = {};
@@ -1020,4 +1037,4 @@ export {
1020
1037
  runLiveProviderPicker,
1021
1038
  runPicker
1022
1039
  };
1023
- //# sourceMappingURL=chunk-PEMN4T5O.js.map
1040
+ //# sourceMappingURL=chunk-MHF2IJDE.js.map