@wrongstack/cli 0.306.0 → 0.306.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.
@@ -25,8 +25,9 @@ import {
25
25
  persistConfigSetting,
26
26
  persistTelegramConfig,
27
27
  removeSuggestions,
28
+ runGit,
28
29
  setSuggestions
29
- } from "./chunk-V3XH6XBJ.js";
30
+ } from "./chunk-T6YAVFXA.js";
30
31
  import {
31
32
  startCliHqConnection
32
33
  } from "./chunk-FKWHSFX4.js";
@@ -80,15 +81,15 @@ import {
80
81
  runClaudeOAuthLogin,
81
82
  runCopilotOAuthLogin,
82
83
  validateFamily
83
- } from "./chunk-WC3DK6BI.js";
84
+ } from "./chunk-HITHEXE3.js";
84
85
  import {
85
86
  LOCAL_LLM_PRESETS,
86
87
  parseSpawnFlags
87
- } from "./chunk-5JW3XCRA.js";
88
+ } from "./chunk-KXN5HZDL.js";
88
89
  import {
89
90
  buildPickableProviders,
90
91
  visibleModelIds
91
- } from "./chunk-3IC4IEZC.js";
92
+ } from "./chunk-VUVOMXWP.js";
92
93
  import {
93
94
  runCodexOAuthLogin
94
95
  } from "./chunk-SSSJQVUY.js";
@@ -16503,35 +16504,8 @@ function handleFleetHelp(opts) {
16503
16504
  }
16504
16505
 
16505
16506
  // src/slash-commands/git.ts
16506
- import { spawn as spawn5 } from "node:child_process";
16507
16507
  import { assessCommitSafety } from "@wrongstack/core/coordination";
16508
- import { color as color27, toErrorMessage as toErrorMessage14 } from "@wrongstack/core/utils";
16509
- async function runGit(args, cwd) {
16510
- try {
16511
- return await new Promise((resolve8, reject) => {
16512
- const child = spawn5("git", args, {
16513
- cwd,
16514
- stdio: ["ignore", "pipe", "pipe"],
16515
- signal: AbortSignal.timeout(3e4),
16516
- windowsHide: true
16517
- });
16518
- let stdout = "";
16519
- let stderr = "";
16520
- child.stdout?.on("data", (d) => {
16521
- stdout += d;
16522
- });
16523
- child.stderr?.on("data", (d) => {
16524
- stderr += d;
16525
- });
16526
- child.on("error", (err) => {
16527
- reject(new Error(`Failed to run git: ${err.message}`));
16528
- });
16529
- child.on("close", (code) => resolve8({ stdout, stderr, code: code ?? 0 }));
16530
- });
16531
- } catch (err) {
16532
- throw new Error(toErrorMessage14(err));
16533
- }
16534
- }
16508
+ import { color as color27 } from "@wrongstack/core/utils";
16535
16509
  async function isGitRepo2(cwd) {
16536
16510
  const result = await runGit(["rev-parse", "--git-dir"], cwd);
16537
16511
  return result.code === 0;
@@ -16836,7 +16810,7 @@ import {
16836
16810
  color as color28,
16837
16811
  configureChildEnvGitIdentity as configureChildEnvGitIdentity2,
16838
16812
  getChildEnvGitIdentity,
16839
- toErrorMessage as toErrorMessage15
16813
+ toErrorMessage as toErrorMessage14
16840
16814
  } from "@wrongstack/core/utils";
16841
16815
  function looksLikeEmail(s) {
16842
16816
  return /^[^\s@]+@[^\s@]+$/.test(s);
@@ -16971,7 +16945,7 @@ function buildGitIdCommand(opts) {
16971
16945
  message: `${color28.red("Unknown subcommand")} "${sub}". Try ${color28.dim("/gitid")}, ${color28.dim("/gitid set <name...> <email>")}, or ${color28.dim("/gitid help")}.`
16972
16946
  };
16973
16947
  } catch (err) {
16974
- return { message: `${color28.red("gitid error")}: ${toErrorMessage15(err)}` };
16948
+ return { message: `${color28.red("gitid error")}: ${toErrorMessage14(err)}` };
16975
16949
  }
16976
16950
  }
16977
16951
  };
@@ -19408,7 +19382,7 @@ function buildMailboxDemoCommand(opts) {
19408
19382
  }
19409
19383
 
19410
19384
  // src/slash-commands/mailbox-serve.ts
19411
- import { spawn as spawn6 } from "node:child_process";
19385
+ import { spawn as spawn5 } from "node:child_process";
19412
19386
  import * as fs12 from "node:fs/promises";
19413
19387
  import * as os2 from "node:os";
19414
19388
  import * as path23 from "node:path";
@@ -19471,7 +19445,7 @@ function buildMailboxServeCommand(opts) {
19471
19445
  spawnArgs = ["mailbox", "serve", ...flags];
19472
19446
  if (isWin) shim = buildWin32CmdShimInvocation(wstackCmd, spawnArgs);
19473
19447
  }
19474
- const child = spawn6(shim?.command ?? wstackCmd, shim?.args ?? spawnArgs, {
19448
+ const child = spawn5(shim?.command ?? wstackCmd, shim?.args ?? spawnArgs, {
19475
19449
  cwd,
19476
19450
  // POSIX-only: own process group so the bridge outlives the REPL.
19477
19451
  // On win32 `detached` opens a visible console window (project
@@ -19751,11 +19725,11 @@ function errorMessage(err) {
19751
19725
  }
19752
19726
 
19753
19727
  // src/slash-commands/memory.ts
19754
- import { toErrorMessage as toErrorMessage18 } from "@wrongstack/core/utils";
19728
+ import { toErrorMessage as toErrorMessage17 } from "@wrongstack/core/utils";
19755
19729
  import { getSageSurface as getSageSurface2 } from "@wrongstack/sage";
19756
19730
 
19757
19731
  // src/slash-commands/memory-compact.ts
19758
- import { toErrorMessage as toErrorMessage16 } from "@wrongstack/core/utils";
19732
+ import { toErrorMessage as toErrorMessage15 } from "@wrongstack/core/utils";
19759
19733
  import { getSageSurface } from "@wrongstack/sage";
19760
19734
  var COMPACT_SYSTEM_PROMPT = `You are a memory curator. Your task is to review, deduplicate, and improve a set of long-term memory entries.
19761
19735
 
@@ -19868,7 +19842,7 @@ async function runCompact(opts) {
19868
19842
  responseText = response.content.filter((b) => b.type === "text").map((b) => b.text).join("").trim();
19869
19843
  } catch (err) {
19870
19844
  return {
19871
- message: `LLM call failed: ${toErrorMessage16(err)}`
19845
+ message: `LLM call failed: ${toErrorMessage15(err)}`
19872
19846
  };
19873
19847
  }
19874
19848
  if (!responseText) {
@@ -19884,7 +19858,7 @@ ${responseText.slice(0, 500)}` };
19884
19858
  parsed = JSON.parse(jsonMatch[0]);
19885
19859
  } catch (err) {
19886
19860
  return {
19887
- message: `Failed to parse LLM response: ${toErrorMessage16(err)}
19861
+ message: `Failed to parse LLM response: ${toErrorMessage15(err)}
19888
19862
 
19889
19863
  Raw response:
19890
19864
  ${responseText.slice(0, 500)}`
@@ -19957,7 +19931,7 @@ ${responseText.slice(0, 500)}`
19957
19931
  }
19958
19932
  }
19959
19933
  } catch (err) {
19960
- errors.push(`${op.action} failed for ${op.targets.join(", ")}: ${toErrorMessage16(err)}`);
19934
+ errors.push(`${op.action} failed for ${op.targets.join(", ")}: ${toErrorMessage15(err)}`);
19961
19935
  }
19962
19936
  }
19963
19937
  const lines = ["## Memory Compact \u2014 Complete"];
@@ -20363,7 +20337,7 @@ function formatSageShow(stats, memories) {
20363
20337
  }
20364
20338
 
20365
20339
  // src/slash-commands/memory-triage.ts
20366
- import { toErrorMessage as toErrorMessage17 } from "@wrongstack/core/utils";
20340
+ import { toErrorMessage as toErrorMessage16 } from "@wrongstack/core/utils";
20367
20341
  import {
20368
20342
  fileTriageProposals,
20369
20343
  formatTriageReport,
@@ -20475,7 +20449,7 @@ Usage: /memory triage [--dry-run|--apply] [--limit N] [--max-phase3 N] [--max-ph
20475
20449
  verbose: false
20476
20450
  });
20477
20451
  } catch (err) {
20478
- return { message: `Triage failed: ${toErrorMessage17(err)}` };
20452
+ return { message: `Triage failed: ${toErrorMessage16(err)}` };
20479
20453
  }
20480
20454
  if (!dryRun) {
20481
20455
  const applyReport = await applyDispatch(Sage, report);
@@ -20503,7 +20477,11 @@ async function loadActiveMemories(Sage, limit) {
20503
20477
  const page = await Sage.listSagePage({
20504
20478
  statuses: ["active", "stale"],
20505
20479
  limit: pageSize,
20506
- cursor
20480
+ cursor,
20481
+ // Admin surface: the user running this command owns every session in the
20482
+ // project, so it opts out of the session filter the agent-facing tools
20483
+ // rely on. Without this, session-scoped memories vanish from the listing.
20484
+ includeAllSessions: true
20507
20485
  });
20508
20486
  all.push(...page.memories);
20509
20487
  if (limit && all.length >= limit) break;
@@ -20532,7 +20510,7 @@ async function applyDispatch(Sage, report) {
20532
20510
  autoOk++;
20533
20511
  } catch (err) {
20534
20512
  autoFail++;
20535
- lines.push(` \u2717 Failed to update ${action.memoryId}: ${toErrorMessage17(err)}`);
20513
+ lines.push(` \u2717 Failed to update ${action.memoryId}: ${toErrorMessage16(err)}`);
20536
20514
  }
20537
20515
  }
20538
20516
  lines.push(`**Auto-apply:** ${autoOk} succeeded, ${autoFail} failed`);
@@ -20547,7 +20525,7 @@ async function applyDispatch(Sage, report) {
20547
20525
  } catch (err) {
20548
20526
  mergeFail++;
20549
20527
  lines.push(
20550
- ` \u2717 Failed to merge ${merge.supersededId} \u2192 ${merge.keeperId}: ${toErrorMessage17(err)}`
20528
+ ` \u2717 Failed to merge ${merge.supersededId} \u2192 ${merge.keeperId}: ${toErrorMessage16(err)}`
20551
20529
  );
20552
20530
  }
20553
20531
  }
@@ -20633,7 +20611,7 @@ function buildMemoryCommand(opts) {
20633
20611
  message: `Remembered \`${memory.id}\` [${memory.kind}] ${memory.text}${tags}`
20634
20612
  };
20635
20613
  } catch (err) {
20636
- return { message: `Could not remember: ${toErrorMessage18(err)}` };
20614
+ return { message: `Could not remember: ${toErrorMessage17(err)}` };
20637
20615
  }
20638
20616
  }
20639
20617
  case "update":
@@ -20671,7 +20649,7 @@ function buildMemoryCommand(opts) {
20671
20649
  message: `Updated \`${memory.id}\` [${memory.kind}|${memory.status}] ${memory.text}`
20672
20650
  };
20673
20651
  } catch (err) {
20674
- return { message: `Could not update: ${toErrorMessage18(err)}` };
20652
+ return { message: `Could not update: ${toErrorMessage17(err)}` };
20675
20653
  }
20676
20654
  }
20677
20655
  case "delete":
@@ -20686,7 +20664,7 @@ function buildMemoryCommand(opts) {
20686
20664
  await Sage.deleteSage(id, reason, { force: true });
20687
20665
  return { message: `Deleted \`${id}\`.` };
20688
20666
  } catch (err) {
20689
- return { message: `Could not delete: ${toErrorMessage18(err)}` };
20667
+ return { message: `Could not delete: ${toErrorMessage17(err)}` };
20690
20668
  }
20691
20669
  }
20692
20670
  case "forget":
@@ -20870,7 +20848,11 @@ function buildMemoryCommand(opts) {
20870
20848
  statuses: resolvedStatus ? [resolvedStatus] : ["active"],
20871
20849
  kind: kindVal,
20872
20850
  query: query || void 0,
20873
- limit
20851
+ limit,
20852
+ // Admin surface: the user running this command owns every session in the
20853
+ // project, so it opts out of the session filter the agent-facing tools
20854
+ // rely on. Without this, session-scoped memories vanish from the listing.
20855
+ includeAllSessions: true
20874
20856
  });
20875
20857
  if (page.memories.length === 0) {
20876
20858
  return { message: "No memories matched the gather criteria." };
@@ -20934,7 +20916,7 @@ function buildMemoryCommand(opts) {
20934
20916
  }
20935
20917
  return { message: lines.join("\n") };
20936
20918
  } catch (err) {
20937
- return { message: `gather failed: ${toErrorMessage18(err)}` };
20919
+ return { message: `gather failed: ${toErrorMessage17(err)}` };
20938
20920
  }
20939
20921
  }
20940
20922
  case "verify": {
@@ -21029,7 +21011,7 @@ function buildMemoryCommand(opts) {
21029
21011
  File size reduced. Audit-logged as \`memory.log_compacted\`.`
21030
21012
  };
21031
21013
  } catch (err) {
21032
- return { message: `Compaction failed: ${toErrorMessage18(err)}` };
21014
+ return { message: `Compaction failed: ${toErrorMessage17(err)}` };
21033
21015
  }
21034
21016
  }
21035
21017
  case "stats": {
@@ -21257,7 +21239,7 @@ async function runAudienceMemory(store, rest) {
21257
21239
  message: `Remembered \`${memory.id}\` for ${formatAudienceSelector(memory.audience)}: ${memory.text}`
21258
21240
  };
21259
21241
  } catch (err) {
21260
- return { message: `Could not remember: ${toErrorMessage18(err)}` };
21242
+ return { message: `Could not remember: ${toErrorMessage17(err)}` };
21261
21243
  }
21262
21244
  }
21263
21245
  if (sub === "clear") {
@@ -21269,7 +21251,7 @@ async function runAudienceMemory(store, rest) {
21269
21251
  message: `Cleared audience scope from \`${id}\` \u2014 it is now general project memory.`
21270
21252
  };
21271
21253
  } catch (err) {
21272
- return { message: `Could not clear audience: ${toErrorMessage18(err)}` };
21254
+ return { message: `Could not clear audience: ${toErrorMessage17(err)}` };
21273
21255
  }
21274
21256
  }
21275
21257
  if (sub === "search" || sub === "find") {
@@ -21893,7 +21875,7 @@ import {
21893
21875
  ConfigError as ConfigError4,
21894
21876
  ToolValidationError as ToolValidationError4
21895
21877
  } from "@wrongstack/core/types";
21896
- import { atomicWrite as atomicWrite7, color as color37, toErrorMessage as toErrorMessage19 } from "@wrongstack/core/utils";
21878
+ import { atomicWrite as atomicWrite7, color as color37, toErrorMessage as toErrorMessage18 } from "@wrongstack/core/utils";
21897
21879
  async function patchProfileConfig(mutate, profileConfigPath) {
21898
21880
  const targetPath = profileConfigPath;
21899
21881
  let raw = "{}";
@@ -22125,7 +22107,7 @@ function buildModelsCommand(opts) {
22125
22107
  };
22126
22108
  } catch (err) {
22127
22109
  return {
22128
- message: `${color37.red("models error")}: ${toErrorMessage19(err)}`
22110
+ message: `${color37.red("models error")}: ${toErrorMessage18(err)}`
22129
22111
  };
22130
22112
  }
22131
22113
  }
@@ -22997,7 +22979,7 @@ function buildPruneCommand(opts) {
22997
22979
 
22998
22980
  // src/slash-commands/refiner.ts
22999
22981
  import { noOpVault as noOpVault5 } from "@wrongstack/core/security";
23000
- import { color as color42, toErrorMessage as toErrorMessage20 } from "@wrongstack/core/utils";
22982
+ import { color as color42, toErrorMessage as toErrorMessage19 } from "@wrongstack/core/utils";
23001
22983
  function buildRefinerCommand(opts) {
23002
22984
  const help = [
23003
22985
  "Usage:",
@@ -23097,7 +23079,7 @@ function buildRefinerCommand(opts) {
23097
23079
  };
23098
23080
  } catch (err) {
23099
23081
  return {
23100
- message: `${color42.red("refiner error")}: ${toErrorMessage20(err)}`
23082
+ message: `${color42.red("refiner error")}: ${toErrorMessage19(err)}`
23101
23083
  };
23102
23084
  }
23103
23085
  }
@@ -23119,7 +23101,7 @@ function buildRefinerCommand(opts) {
23119
23101
  };
23120
23102
  } catch (err) {
23121
23103
  return {
23122
- message: `${color42.red("refiner error")}: ${toErrorMessage20(err)}`
23104
+ message: `${color42.red("refiner error")}: ${toErrorMessage19(err)}`
23123
23105
  };
23124
23106
  }
23125
23107
  }
@@ -24302,7 +24284,7 @@ ${sddHelp()}`
24302
24284
 
24303
24285
  // src/slash-commands/session.ts
24304
24286
  import { SessionRecovery } from "@wrongstack/core/storage";
24305
- import { color as color43, isPidAlive, toErrorMessage as toErrorMessage21 } from "@wrongstack/core/utils";
24287
+ import { color as color43, isPidAlive, toErrorMessage as toErrorMessage20 } from "@wrongstack/core/utils";
24306
24288
  function statusIcon2(status) {
24307
24289
  switch (status) {
24308
24290
  case "active":
@@ -24424,7 +24406,7 @@ function buildLoadCommand(opts) {
24424
24406
  message: name ? color43.green(`Renamed ${targetId} \u2192 "${name}"`) : color43.green(`Cleared name on ${targetId} (title: "${summary.title}")`)
24425
24407
  };
24426
24408
  } catch (err) {
24427
- return { message: color43.red(`Rename failed: ${toErrorMessage21(err)}`) };
24409
+ return { message: color43.red(`Rename failed: ${toErrorMessage20(err)}`) };
24428
24410
  }
24429
24411
  }
24430
24412
  if (first === "delete") {
@@ -24455,7 +24437,7 @@ function buildLoadCommand(opts) {
24455
24437
  await opts.sessionStore.delete(targetId);
24456
24438
  return { message: color43.green(`Deleted session ${targetId}`) };
24457
24439
  } catch (err) {
24458
- return { message: color43.red(`Delete failed: ${toErrorMessage21(err)}`) };
24440
+ return { message: color43.red(`Delete failed: ${toErrorMessage20(err)}`) };
24459
24441
  }
24460
24442
  }
24461
24443
  const showIncomplete = parts.includes("--incomplete") || parts.includes("-i");
@@ -24789,7 +24771,7 @@ async function killSession(sessionId, confirm) {
24789
24771
  };
24790
24772
  } catch (err) {
24791
24773
  return {
24792
- message: color43.red(`Failed to kill session: ${toErrorMessage21(err)}`)
24774
+ message: color43.red(`Failed to kill session: ${toErrorMessage20(err)}`)
24793
24775
  };
24794
24776
  }
24795
24777
  }
@@ -24809,7 +24791,7 @@ import { decryptConfigSecrets as decryptConfigSecrets4, encryptConfigSecrets as
24809
24791
  import {
24810
24792
  ConfigError as ConfigError5
24811
24793
  } from "@wrongstack/core/types";
24812
- import { atomicWrite as atomicWrite9, color as color44, expectDefined as expectDefined8, toErrorMessage as toErrorMessage22 } from "@wrongstack/core/utils";
24794
+ import { atomicWrite as atomicWrite9, color as color44, expectDefined as expectDefined8, toErrorMessage as toErrorMessage21 } from "@wrongstack/core/utils";
24813
24795
  import { catalogProviderIdFor } from "@wrongstack/providers";
24814
24796
  async function resolveCatalogModelIds(registry, config, providerIds) {
24815
24797
  const out = /* @__PURE__ */ new Map();
@@ -25383,7 +25365,7 @@ function buildSetModelCommand(opts) {
25383
25365
  };
25384
25366
  } catch (err) {
25385
25367
  return {
25386
- message: `${color44.red("setmodel error")}: ${toErrorMessage22(err)}`
25368
+ message: `${color44.red("setmodel error")}: ${toErrorMessage21(err)}`
25387
25369
  };
25388
25370
  }
25389
25371
  }
@@ -25394,7 +25376,7 @@ function buildSetModelCommand(opts) {
25394
25376
  import { execFile as execFile3 } from "node:child_process";
25395
25377
  import { access as access4 } from "node:fs/promises";
25396
25378
  import * as path25 from "node:path";
25397
- import { color as color45, toErrorMessage as toErrorMessage23 } from "@wrongstack/core/utils";
25379
+ import { color as color45, toErrorMessage as toErrorMessage22 } from "@wrongstack/core/utils";
25398
25380
  import { parseNextSteps } from "@wrongstack/tools/next-steps";
25399
25381
  function readGitStatus(projectRoot, includeBranch) {
25400
25382
  const args = ["status", "--short"];
@@ -25519,7 +25501,7 @@ function buildSuggestCommand(opts) {
25519
25501
  suggestCache = { suggestions, at: Date.now() };
25520
25502
  return { message: formatSuggestions(suggestions) };
25521
25503
  } catch (err) {
25522
- const msg = `Suggestion generation failed: ${toErrorMessage23(err)}`;
25504
+ const msg = `Suggestion generation failed: ${toErrorMessage22(err)}`;
25523
25505
  opts.renderer.writeWarning(msg);
25524
25506
  return { message: msg };
25525
25507
  }
@@ -25742,22 +25724,58 @@ function presetHelpLines(perLine = 4) {
25742
25724
  }
25743
25725
  return lines;
25744
25726
  }
25727
+ function computeWindow(total, selected, rows) {
25728
+ const chromeRows = 5;
25729
+ const markerRows = 2;
25730
+ const minVisible = 3;
25731
+ if (total <= 0) return { start: 0, end: 0, hasAbove: false, hasBelow: false };
25732
+ const available = Math.max(1, rows - chromeRows - markerRows);
25733
+ const visible = Math.max(minVisible, Math.min(total, Math.floor(available)));
25734
+ const safeSelected = selected >= 0 && selected < total ? selected : 0;
25735
+ let start;
25736
+ if (safeSelected < visible) {
25737
+ start = 0;
25738
+ } else {
25739
+ const halfWindow = Math.floor(visible / 2);
25740
+ start = safeSelected - halfWindow;
25741
+ start = Math.max(0, Math.min(total - visible, start));
25742
+ }
25743
+ const end = Math.min(total, start + visible);
25744
+ return { start, end, hasAbove: start > 0, hasBelow: end < total };
25745
+ }
25746
+ function truncateDesc(desc, columns, active2) {
25747
+ const markWidth = active2 ? 9 : 0;
25748
+ const budget = Math.max(0, columns - 26 - markWidth);
25749
+ if (desc.length <= budget) return desc;
25750
+ if (budget <= 1) return "\u2026";
25751
+ return `${desc.slice(0, budget - 1)}\u2026`;
25752
+ }
25745
25753
  async function runThemePicker(reader, activeId) {
25746
25754
  let cursor = THEME_OPTIONS.findIndex((p) => p.id === activeId);
25747
25755
  if (cursor < 0) cursor = 0;
25748
25756
  const render = (currentCursor) => {
25757
+ const rows = process.stdout.rows ?? 24;
25758
+ const columns = process.stdout.columns ?? 80;
25759
+ const { start, end, hasAbove, hasBelow } = computeWindow(
25760
+ THEME_OPTIONS.length,
25761
+ currentCursor,
25762
+ rows
25763
+ );
25749
25764
  const lines = [];
25750
- lines.push(`
25751
- ${color46.bold(color46.amber("WrongStack") + color46.dim(" \u2014 TUI Theme Selection"))}
25752
- `);
25753
- lines.push(color46.dim(" \u2191\u2193 navigate Enter select q quit\n"));
25754
25765
  lines.push("");
25755
- for (const [i, p] of THEME_OPTIONS.entries()) {
25766
+ lines.push(`${color46.bold(color46.amber("WrongStack") + color46.dim(" \u2014 TUI Theme Selection"))}`);
25767
+ lines.push(color46.dim(" \u2191\u2193 navigate Enter select q quit"));
25768
+ lines.push("");
25769
+ if (hasAbove) lines.push(color46.dim(` \u2026 ${start} more above`));
25770
+ for (let i = start; i < end; i++) {
25771
+ const p = THEME_OPTIONS[i];
25756
25772
  const mark = p.id === activeId ? color46.green(" [active]") : "";
25757
25773
  const prefix = i === currentCursor ? color46.bold("\u276F ") : " ";
25758
25774
  const name = i === currentCursor ? color46.bold(p.name) : p.name;
25759
- lines.push(` ${prefix}${name.padEnd(21)} ${color46.dim(p.desc)}${mark}`);
25775
+ const desc = truncateDesc(p.desc, columns, p.id === activeId);
25776
+ lines.push(` ${prefix}${name.padEnd(21)} ${color46.dim(desc)}${mark}`);
25760
25777
  }
25778
+ if (hasBelow) lines.push(color46.dim(` \u2026 ${THEME_OPTIONS.length - end} more below`));
25761
25779
  lines.push("");
25762
25780
  return lines.join("\n");
25763
25781
  };
@@ -26294,11 +26312,18 @@ function buildMouseCommand(_opts) {
26294
26312
  " /mouse Show current mouse-mode status",
26295
26313
  " /mouse on Enable full mouse mode",
26296
26314
  " /mouse off Disable scrollbar drag and clickable UI",
26297
- " /mouse toggle Flip the current state",
26315
+ " /mouse native Hand the mouse back to the terminal (select + copy)",
26316
+ " /mouse toggle Flip between on and off",
26317
+ "",
26318
+ "In both on and off the wheel scrolls virtualized chat history in-app. Full",
26319
+ "mouse mode also makes the scrollbar drag-able and status-bar chips /",
26320
+ "confirm buttons clickable.",
26321
+ "",
26322
+ "Native mode releases mouse tracking entirely, so the terminal does its own",
26323
+ "click-drag text selection and copy again. The cost is the wheel: it scrolls",
26324
+ "the terminal, not the transcript. PgUp/PgDn and Ctrl+U/D still page through",
26325
+ "history. Use /mouse on or /mouse off to take the mouse back.",
26298
26326
  "",
26299
- "The wheel always scrolls virtualized chat history in-app. Full mouse mode",
26300
- "also makes the scrollbar drag-able and status-bar chips / confirm buttons",
26301
- "clickable. Shift+wheel, PgUp/PgDn, and Ctrl+U/D page through history.",
26302
26327
  "The setting persists."
26303
26328
  ].join("\n"),
26304
26329
  async run(args) {
@@ -26307,10 +26332,11 @@ function buildMouseCommand(_opts) {
26307
26332
  if (!arg || arg === "status") intent = "query";
26308
26333
  else if (arg === "on" || arg === "enable" || arg === "true" || arg === "1") intent = "on";
26309
26334
  else if (arg === "off" || arg === "disable" || arg === "false" || arg === "0") intent = "off";
26335
+ else if (arg === "native" || arg === "none" || arg === "terminal") intent = "native";
26310
26336
  else if (arg === "toggle") intent = "toggle";
26311
26337
  else {
26312
26338
  return {
26313
- message: `Unknown argument: ${arg}. Use /mouse on, /mouse off, or /mouse toggle.`
26339
+ message: `Unknown argument: ${arg}. Use /mouse on, /mouse off, /mouse native, or /mouse toggle.`
26314
26340
  };
26315
26341
  }
26316
26342
  return { metadata: { mouseToggle: intent } };
@@ -26319,7 +26345,7 @@ function buildMouseCommand(_opts) {
26319
26345
  }
26320
26346
 
26321
26347
  // src/slash-commands/project.ts
26322
- import { spawn as spawn7 } from "node:child_process";
26348
+ import { spawn as spawn6 } from "node:child_process";
26323
26349
  import * as fs16 from "node:fs/promises";
26324
26350
  import { createRequire } from "node:module";
26325
26351
  import * as path26 from "node:path";
@@ -26644,7 +26670,7 @@ async function switchProjectCommand(opts, ctx, target, displayName) {
26644
26670
  const canSwitch = await confirmProjectSwitch(opts, targetName);
26645
26671
  if (!canSwitch) return { message: "" };
26646
26672
  const nodeExe = process.execPath;
26647
- const child = spawn7(nodeExe, [cliPath, "--no-interactive"], {
26673
+ const child = spawn6(nodeExe, [cliPath, "--no-interactive"], {
26648
26674
  cwd: resolved,
26649
26675
  stdio: "inherit",
26650
26676
  detached: false
@@ -26786,7 +26812,7 @@ async function spawnInProject(opts, _ctx, root, projectName) {
26786
26812
  }
26787
26813
  await saveManifest(manifest, opts.paths?.globalConfig);
26788
26814
  const nodeExe = process.execPath;
26789
- const child = spawn7(nodeExe, [cliPath, "--no-interactive"], {
26815
+ const child = spawn6(nodeExe, [cliPath, "--no-interactive"], {
26790
26816
  cwd: root,
26791
26817
  stdio: "inherit",
26792
26818
  detached: false
@@ -26828,7 +26854,7 @@ async function handleNewSession(_opts, _ctx) {
26828
26854
  }
26829
26855
  }
26830
26856
  const nodeExe = process.execPath;
26831
- const child = spawn7(nodeExe, [cliPath, "--no-interactive"], {
26857
+ const child = spawn6(nodeExe, [cliPath, "--no-interactive"], {
26832
26858
  cwd: process.cwd(),
26833
26859
  stdio: "inherit",
26834
26860
  detached: false
@@ -26881,13 +26907,13 @@ async function handlePrevSessions(opts, _ctx) {
26881
26907
  }
26882
26908
 
26883
26909
  // src/slash-commands/review.ts
26884
- import { spawn as spawn8 } from "node:child_process";
26910
+ import { spawn as spawn7 } from "node:child_process";
26885
26911
  import * as fsp3 from "node:fs/promises";
26886
26912
  import * as path27 from "node:path";
26887
26913
  import { emitReviewIfChanged } from "@wrongstack/core/plugin";
26888
26914
  async function runGit2(args, cwd) {
26889
26915
  return new Promise((resolve8) => {
26890
- const child = spawn8("git", args, {
26916
+ const child = spawn7("git", args, {
26891
26917
  cwd,
26892
26918
  stdio: ["ignore", "pipe", "pipe"],
26893
26919
  signal: AbortSignal.timeout(1e4),
@@ -27086,7 +27112,7 @@ function buildSecurityCommand(opts) {
27086
27112
  // src/slash-commands/settings.ts
27087
27113
  import { noOpVault as noOpVault9 } from "@wrongstack/core/security";
27088
27114
  import { resolveFleetChatVerbosity as resolveFleetChatVerbosity2 } from "@wrongstack/core/types";
27089
- import { color as color49, toErrorMessage as toErrorMessage24 } from "@wrongstack/core/utils";
27115
+ import { color as color49, toErrorMessage as toErrorMessage23 } from "@wrongstack/core/utils";
27090
27116
  import { getProcessRegistry } from "@wrongstack/tools";
27091
27117
 
27092
27118
  // src/utils/delay-format.ts
@@ -28019,7 +28045,7 @@ function buildSettingsCommand(opts) {
28019
28045
  };
28020
28046
  } catch (err) {
28021
28047
  return {
28022
- message: `${color49.red("Settings error")}: ${toErrorMessage24(err)}`
28048
+ message: `${color49.red("Settings error")}: ${toErrorMessage23(err)}`
28023
28049
  };
28024
28050
  }
28025
28051
  }
@@ -28320,7 +28346,7 @@ function parseFlags2(args) {
28320
28346
  }
28321
28347
 
28322
28348
  // src/slash-commands/spawn-agents.ts
28323
- import { toErrorMessage as toErrorMessage25 } from "@wrongstack/core/utils";
28349
+ import { toErrorMessage as toErrorMessage24 } from "@wrongstack/core/utils";
28324
28350
  function buildSpawnCommand(opts) {
28325
28351
  return {
28326
28352
  name: "spawn",
@@ -28357,7 +28383,7 @@ function buildSpawnCommand(opts) {
28357
28383
  const summary = Object.keys(parsed).length > 0 ? await opts.onSpawn(description, parsed) : await opts.onSpawn(description);
28358
28384
  return { message: summary };
28359
28385
  } catch (err) {
28360
- return { message: `Spawn failed: ${toErrorMessage25(err)}` };
28386
+ return { message: `Spawn failed: ${toErrorMessage24(err)}` };
28361
28387
  }
28362
28388
  }
28363
28389
  };
@@ -29028,7 +29054,7 @@ ${formatTaskProgress(file.tasks)}`;
29028
29054
  // src/slash-commands/techstack.ts
29029
29055
  import * as fs17 from "node:fs/promises";
29030
29056
  import * as path28 from "node:path";
29031
- import { color as color52, toErrorMessage as toErrorMessage26 } from "@wrongstack/core/utils";
29057
+ import { color as color52, toErrorMessage as toErrorMessage25 } from "@wrongstack/core/utils";
29032
29058
  async function discoverPackageFiles(projectRoot) {
29033
29059
  const files = [];
29034
29060
  const rootPkg = path28.join(projectRoot, "package.json");
@@ -29236,7 +29262,7 @@ function buildTechStackCommand(opts) {
29236
29262
  message: `TechStack remediation finished: ${applied} applied, ${failed} failed, ${skipped} skipped.`
29237
29263
  };
29238
29264
  } catch (err) {
29239
- const msg = `TechStack remediation failed: ${toErrorMessage26(err)}`;
29265
+ const msg = `TechStack remediation failed: ${toErrorMessage25(err)}`;
29240
29266
  opts.renderer.writeWarning(msg);
29241
29267
  return { message: msg };
29242
29268
  } finally {
@@ -29255,7 +29281,7 @@ function buildTechStackCommand(opts) {
29255
29281
  message: `TechStack inventory complete: ${snapshot.workspaces.length} workspaces, ${snapshot.dependencies.length} dependencies (fingerprint: ${snapshot.fingerprint})`
29256
29282
  };
29257
29283
  } catch (err) {
29258
- const msg = `TechStack inventory failed: ${toErrorMessage26(err)}`;
29284
+ const msg = `TechStack inventory failed: ${toErrorMessage25(err)}`;
29259
29285
  opts.renderer.writeWarning(msg);
29260
29286
  return { message: msg };
29261
29287
  }
@@ -29270,7 +29296,7 @@ function buildTechStackCommand(opts) {
29270
29296
  );
29271
29297
  }
29272
29298
  } catch (err) {
29273
- discoveryNote = color52.red(`Could not scan for package files: ${toErrorMessage26(err)}`);
29299
+ discoveryNote = color52.red(`Could not scan for package files: ${toErrorMessage25(err)}`);
29274
29300
  }
29275
29301
  const task = buildTechStackTask({
29276
29302
  projectRoot: opts.projectRoot,
@@ -29310,7 +29336,7 @@ function buildTechStackCommand(opts) {
29310
29336
  });
29311
29337
  return { message: summary };
29312
29338
  } catch (err) {
29313
- const msg = `Tech stack scan failed: ${toErrorMessage26(err)}`;
29339
+ const msg = `Tech stack scan failed: ${toErrorMessage25(err)}`;
29314
29340
  opts.renderer.writeWarning(msg);
29315
29341
  return { message: msg };
29316
29342
  }
@@ -29319,7 +29345,7 @@ function buildTechStackCommand(opts) {
29319
29345
  }
29320
29346
 
29321
29347
  // src/slash-commands/telegram-settings.ts
29322
- import { color as color54, toErrorMessage as toErrorMessage27 } from "@wrongstack/core/utils";
29348
+ import { color as color54, toErrorMessage as toErrorMessage26 } from "@wrongstack/core/utils";
29323
29349
 
29324
29350
  // src/slash-commands/telegram-setup.ts
29325
29351
  import { color as color53 } from "@wrongstack/core/utils";
@@ -29817,7 +29843,7 @@ function buildTelegramSettingsCommand(opts) {
29817
29843
  };
29818
29844
  } catch (err) {
29819
29845
  return {
29820
- message: `${color54.red("Settings error")}: ${toErrorMessage27(err)}`
29846
+ message: `${color54.red("Settings error")}: ${toErrorMessage26(err)}`
29821
29847
  };
29822
29848
  }
29823
29849
  }
@@ -29971,7 +29997,7 @@ import {
29971
29997
  normalizeToolDescriptionMode,
29972
29998
  normalizeToolResultRenderMode,
29973
29999
  setToolResultRenderMode,
29974
- toErrorMessage as toErrorMessage28
30000
+ toErrorMessage as toErrorMessage27
29975
30001
  } from "@wrongstack/core/utils";
29976
30002
  function fit(text, width) {
29977
30003
  if (text.length <= width) return text.padEnd(width);
@@ -30206,7 +30232,7 @@ function buildToolCommand(opts) {
30206
30232
  try {
30207
30233
  return { message: await cmdEnableAll() };
30208
30234
  } catch (err) {
30209
- return { message: `${color55.red("Error")}: ${toErrorMessage28(err)}` };
30235
+ return { message: `${color55.red("Error")}: ${toErrorMessage27(err)}` };
30210
30236
  }
30211
30237
  }
30212
30238
  const name = parts[0] ?? "";
@@ -30220,7 +30246,7 @@ function buildToolCommand(opts) {
30220
30246
  for (const t of targets) results.push(await cmdDisable(t));
30221
30247
  return { message: results.join("\n") };
30222
30248
  } catch (err) {
30223
- return { message: `${color55.red("Error")}: ${toErrorMessage28(err)}` };
30249
+ return { message: `${color55.red("Error")}: ${toErrorMessage27(err)}` };
30224
30250
  }
30225
30251
  }
30226
30252
  if (sub === "enable") {
@@ -30232,7 +30258,7 @@ function buildToolCommand(opts) {
30232
30258
  for (const t of targets) results.push(await cmdEnable(t));
30233
30259
  return { message: results.join("\n") };
30234
30260
  } catch (err) {
30235
- return { message: `${color55.red("Error")}: ${toErrorMessage28(err)}` };
30261
+ return { message: `${color55.red("Error")}: ${toErrorMessage27(err)}` };
30236
30262
  }
30237
30263
  }
30238
30264
  const action = parts[1]?.toLowerCase();
@@ -30245,7 +30271,7 @@ function buildToolCommand(opts) {
30245
30271
  try {
30246
30272
  return { message: action === "disable" ? await cmdDisable(name) : await cmdEnable(name) };
30247
30273
  } catch (err) {
30248
- return { message: `${color55.red("Error")}: ${toErrorMessage28(err)}` };
30274
+ return { message: `${color55.red("Error")}: ${toErrorMessage27(err)}` };
30249
30275
  }
30250
30276
  }
30251
30277
  if (!opts.toolRegistry.get(name) && !opts.toolRegistry.isDisabled(name)) {
@@ -30285,7 +30311,7 @@ function buildToolCommand(opts) {
30285
30311
  };
30286
30312
  } catch (err) {
30287
30313
  return {
30288
- message: `${color55.red("Could not save tool setting")}: ${toErrorMessage28(err)}`
30314
+ message: `${color55.red("Could not save tool setting")}: ${toErrorMessage27(err)}`
30289
30315
  };
30290
30316
  }
30291
30317
  }
@@ -30305,7 +30331,7 @@ function buildToolCommand(opts) {
30305
30331
  };
30306
30332
  } catch (err) {
30307
30333
  return {
30308
- message: `${color55.red("Could not save tool setting")}: ${toErrorMessage28(err)}`
30334
+ message: `${color55.red("Could not save tool setting")}: ${toErrorMessage27(err)}`
30309
30335
  };
30310
30336
  }
30311
30337
  }
@@ -31201,7 +31227,7 @@ function summaryLine(findings, fixable, handoffs, power) {
31201
31227
  // src/slash-commands/working-dir.ts
31202
31228
  import * as fs19 from "node:fs/promises";
31203
31229
  import * as path30 from "node:path";
31204
- import { color as color58, toErrorMessage as toErrorMessage29 } from "@wrongstack/core/utils";
31230
+ import { color as color58, toErrorMessage as toErrorMessage28 } from "@wrongstack/core/utils";
31205
31231
  function buildWorkingDirCommand(_opts) {
31206
31232
  return {
31207
31233
  name: "working_dir",
@@ -31258,7 +31284,7 @@ function buildWorkingDirCommand(_opts) {
31258
31284
  ctx.setWorkingDir(resolved);
31259
31285
  } catch (err) {
31260
31286
  return {
31261
- message: color58.red(toErrorMessage29(err))
31287
+ message: color58.red(toErrorMessage28(err))
31262
31288
  };
31263
31289
  }
31264
31290
  const prevRel = path30.relative(ctx.projectRoot, previous) || ".";
@@ -32242,7 +32268,7 @@ async function runInteractive(cliCtx) {
32242
32268
  onEvent: evOn
32243
32269
  });
32244
32270
  const savedProviderCfg = config.providers?.[config.provider];
32245
- const { execute } = await import("./execution-TTE7R5UY.js");
32271
+ const { execute } = await import("./execution-4IG5XKOL.js");
32246
32272
  const stopHeapWatchdog = startSharedHeapWatchdog({
32247
32273
  collectStats: () => {
32248
32274
  const hqQueue = hqPublisherRef.current?.getQueueStats();
@@ -32480,4 +32506,4 @@ export {
32480
32506
  CLI_VERSION,
32481
32507
  runInteractive
32482
32508
  };
32483
- //# sourceMappingURL=cli-main-DHNFGP3Z.js.map
32509
+ //# sourceMappingURL=cli-main-3PUWFKSL.js.map