steward-cli 0.23.0 → 0.25.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 (2) hide show
  1. package/dist/cli.js +147 -126
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -44139,7 +44139,7 @@ async function loginGitHubCopilot(interaction) {
44139
44139
  signal
44140
44140
  });
44141
44141
  } catch (err) {
44142
- throw new AIError(`Failed to initiate GitHub device authorization: ${err.message}`, {
44142
+ throw new AIError(`Failed to initiate GitHub device authorization: ${err instanceof Error ? err.message : String(err)}`, {
44143
44143
  code: "oauth",
44144
44144
  provider: "github-copilot",
44145
44145
  cause: err
@@ -44180,18 +44180,21 @@ async function loginGitHubCopilot(interaction) {
44180
44180
  signal
44181
44181
  });
44182
44182
  const data = await res.json();
44183
- if (data?.access_token) {
44183
+ if (typeof data?.access_token === "string") {
44184
44184
  return { status: "complete", value: data.access_token };
44185
44185
  }
44186
44186
  if (data?.error === "authorization_pending") {
44187
44187
  return { status: "pending" };
44188
44188
  }
44189
44189
  if (data?.error === "slow_down") {
44190
- return { status: "slow_down", intervalSeconds: data.interval };
44190
+ return {
44191
+ status: "slow_down",
44192
+ intervalSeconds: typeof data.interval === "number" ? data.interval : undefined
44193
+ };
44191
44194
  }
44192
44195
  return {
44193
44196
  status: "failed",
44194
- message: data?.error_description || data?.error || "Authorization failed"
44197
+ message: typeof data?.error_description === "string" ? data.error_description : typeof data?.error === "string" ? data.error : "Authorization failed"
44195
44198
  };
44196
44199
  }
44197
44200
  });
@@ -44215,7 +44218,7 @@ async function refreshGitHubCopilotToken(githubAccessToken, signal) {
44215
44218
  signal
44216
44219
  });
44217
44220
  } catch (err) {
44218
- throw new AIError(`Failed to fetch Copilot token: ${err.message}`, {
44221
+ throw new AIError(`Failed to fetch Copilot token: ${err instanceof Error ? err.message : String(err)}`, {
44219
44222
  code: "oauth",
44220
44223
  provider: "github-copilot",
44221
44224
  cause: err
@@ -44902,6 +44905,12 @@ function parseSSEEvent(raw) {
44902
44905
 
44903
44906
  // src/packages/ai/src/json.ts
44904
44907
  function sanitizeSurrogates(text) {
44908
+ if (typeof text !== "string") {
44909
+ if (text === null || text === undefined) {
44910
+ return "";
44911
+ }
44912
+ return sanitizeSurrogates(typeof text === "object" ? JSON.stringify(text) : String(text));
44913
+ }
44905
44914
  return text.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g, "");
44906
44915
  }
44907
44916
  function parseStreamingJson(partial) {
@@ -45876,11 +45885,12 @@ ${sanitized}` : sanitized;
45876
45885
  if (msg.role === "tool") {
45877
45886
  const parts = [];
45878
45887
  for (const res of msg.content) {
45888
+ const outStr = typeof res.output === "string" ? res.output : JSON.stringify(res.output);
45879
45889
  parts.push({
45880
45890
  functionResponse: {
45881
45891
  name: res.toolName,
45882
45892
  response: {
45883
- result: sanitizeSurrogates(res.output)
45893
+ result: sanitizeSurrogates(outStr)
45884
45894
  }
45885
45895
  }
45886
45896
  });
@@ -53526,7 +53536,9 @@ function rehydrateSessionHistory(sessionData, projection) {
53526
53536
  textAccum += (textAccum ? `
53527
53537
  ` : "") + part.text;
53528
53538
  } else if (part.type === "tool-call") {
53529
- const rawInput = part.args ?? part.input;
53539
+ const callId = part.id ?? part.toolCallId;
53540
+ const toolName = part.name ?? part.toolName;
53541
+ const rawInput = part.arguments ?? part.args ?? part.input;
53530
53542
  let parsedInput = rawInput ?? {};
53531
53543
  if (typeof rawInput === "string") {
53532
53544
  const trimmed = rawInput.trim();
@@ -53536,12 +53548,14 @@ function rehydrateSessionHistory(sessionData, projection) {
53536
53548
  } catch {}
53537
53549
  }
53538
53550
  }
53539
- toolCallsMap.set(part.toolCallId, {
53540
- id: part.toolCallId,
53541
- name: part.toolName,
53542
- args: parsedInput,
53543
- isError: false
53544
- });
53551
+ if (callId) {
53552
+ toolCallsMap.set(callId, {
53553
+ id: callId,
53554
+ name: toolName,
53555
+ args: parsedInput,
53556
+ isError: false
53557
+ });
53558
+ }
53545
53559
  }
53546
53560
  }
53547
53561
  if (textAccum.trim()) {
@@ -53556,47 +53570,49 @@ function rehydrateSessionHistory(sessionData, projection) {
53556
53570
  } else if (msg.role === "tool") {
53557
53571
  if (Array.isArray(msg.content)) {
53558
53572
  for (const part of msg.content) {
53559
- if (part.type === "tool-result") {
53560
- const existing = toolCallsMap.get(part.toolCallId);
53561
- const isError = Boolean(part.isError);
53562
- const toolName = existing?.name ?? part.toolName ?? "tool";
53563
- const argsSummary = existing?.args ? JSON.stringify(existing.args) : "";
53564
- let outputVal = part.result ?? part.output;
53565
- if (outputVal && typeof outputVal === "object" && outputVal.type === "json" && "value" in outputVal) {
53566
- outputVal = outputVal.value;
53567
- }
53568
- if (typeof outputVal === "string") {
53569
- const trimmed = outputVal.trim();
53570
- if (trimmed.startsWith("{") && trimmed.endsWith("}")) {
53571
- try {
53572
- outputVal = JSON.parse(trimmed);
53573
- } catch {}
53574
- }
53573
+ const callId = part.toolCallId ?? part.id;
53574
+ if (!callId)
53575
+ continue;
53576
+ const existing = toolCallsMap.get(callId);
53577
+ const isError = Boolean(part.isError);
53578
+ const toolName = existing?.name ?? part.toolName ?? part.name ?? "tool";
53579
+ const args = existing?.args;
53580
+ const argsSummary = args ? JSON.stringify(args) : "";
53581
+ let outputVal = part.output ?? part.result;
53582
+ if (outputVal && typeof outputVal === "object" && outputVal.type === "json" && "value" in outputVal) {
53583
+ outputVal = outputVal.value;
53584
+ }
53585
+ if (typeof outputVal === "string") {
53586
+ const trimmed = outputVal.trim();
53587
+ if (trimmed.startsWith("{") && trimmed.endsWith("}")) {
53588
+ try {
53589
+ outputVal = JSON.parse(trimmed);
53590
+ } catch {}
53575
53591
  }
53576
- const canonicalOutputSummary = formatToolOutputSummary(outputVal, isError);
53577
- const toolLog = turnPresentation?.tools.get(part.toolCallId);
53578
- const status = toolLog ? toolLog.status === "failed" ? "failed" : "completed" : isError ? "failed" : "completed";
53579
- const error = toolLog?.errorMessage ? toolLog.errorMessage : isError ? typeof outputVal === "object" && outputVal !== null ? outputVal.message ?? JSON.stringify(outputVal) : String(outputVal) : undefined;
53580
- const toolOutput = toolLog?.outputSummary ?? canonicalOutputSummary;
53581
- restoredItems.push({
53582
- id: `tool-${part.toolCallId}`,
53583
- turnId: turn.id,
53584
- type: "tool",
53585
- content: "",
53586
- toolData: {
53587
- toolName,
53588
- displayName: toolLog?.displayName,
53589
- icon: toolLog?.icon,
53590
- argsSummary,
53591
- args: existing?.args,
53592
- result: outputVal,
53593
- status,
53594
- durationMs: toolLog?.durationMs,
53595
- error,
53596
- toolOutput
53597
- }
53598
- });
53599
53592
  }
53593
+ const canonicalOutputSummary = formatToolOutputSummary(outputVal, isError);
53594
+ const toolLog = turnPresentation?.tools.get(callId);
53595
+ const status = toolLog ? toolLog.status === "failed" ? "failed" : "completed" : isError ? "failed" : "completed";
53596
+ const error = toolLog?.errorMessage ? toolLog.errorMessage : isError ? typeof outputVal === "object" && outputVal !== null ? outputVal.message ?? JSON.stringify(outputVal) : String(outputVal) : undefined;
53597
+ const toolOutput = toolLog?.outputSummary ?? canonicalOutputSummary;
53598
+ restoredItems.push({
53599
+ id: `tool-${callId}`,
53600
+ turnId: turn.id,
53601
+ type: "tool",
53602
+ content: "",
53603
+ toolData: {
53604
+ toolName,
53605
+ displayName: toolLog?.displayName,
53606
+ icon: toolLog?.icon,
53607
+ argsSummary,
53608
+ args,
53609
+ result: outputVal,
53610
+ status,
53611
+ durationMs: toolLog?.durationMs,
53612
+ error,
53613
+ toolOutput
53614
+ }
53615
+ });
53600
53616
  }
53601
53617
  }
53602
53618
  }
@@ -54299,16 +54315,16 @@ var writeFileTool = {
54299
54315
  parameters: writeFileInputSchema,
54300
54316
  confirmationPolicy: "never",
54301
54317
  summarize: (args, result) => {
54302
- const lines = result?.linesWritten ?? (args.content ? args.content.split(/\r?\n/).length : 0);
54303
- const filePath = args.file_path;
54318
+ const lines = result?.linesWritten ?? (args?.content ? args.content.split(/\r?\n/).length : 0);
54319
+ const filePath = args?.file_path ?? "file";
54304
54320
  const isNew = result?.isNew ?? true;
54305
54321
  const headline = isNew ? `Created ${filePath} (${lines} line${lines === 1 ? "" : "s"})` : `Wrote ${lines} line${lines === 1 ? "" : "s"} to ${filePath}`;
54306
54322
  return {
54307
54323
  headline,
54308
54324
  detail: {
54309
54325
  kind: "code",
54310
- filePath: args.file_path,
54311
- text: args.content,
54326
+ filePath: args?.file_path ?? filePath,
54327
+ text: args?.content ?? "",
54312
54328
  totalLines: lines
54313
54329
  }
54314
54330
  };
@@ -54647,10 +54663,13 @@ var editFileTool = {
54647
54663
  parameters: editFileInputSchema,
54648
54664
  confirmationPolicy: "never",
54649
54665
  summarize: (args, result) => {
54650
- if (args.old_string === args.new_string) {
54651
- return { headline: `No changes made to ${args.file_path}` };
54666
+ const oldStr = args?.old_string ?? "";
54667
+ const newStr = args?.new_string ?? "";
54668
+ const filePath = args?.file_path ?? "file";
54669
+ if (oldStr === newStr) {
54670
+ return { headline: `No changes made to ${filePath}` };
54652
54671
  }
54653
- const diff = buildUnifiedDiff(args.old_string, args.new_string, 2);
54672
+ const diff = buildUnifiedDiff(oldStr, newStr, 2);
54654
54673
  let diffAdded = 0;
54655
54674
  let diffRemoved = 0;
54656
54675
  for (const hunk of diff.hunks) {
@@ -54668,7 +54687,7 @@ var editFileTool = {
54668
54687
  headline,
54669
54688
  detail: {
54670
54689
  kind: "diff",
54671
- filePath: args.file_path,
54690
+ filePath,
54672
54691
  hunks: diff.hunks
54673
54692
  }
54674
54693
  };
@@ -55879,7 +55898,7 @@ var taskReadTool = {
55879
55898
  parameters: taskReadInputSchema,
55880
55899
  confirmationPolicy: "never",
55881
55900
  summarize: (args, result) => {
55882
- return `Task ${args.task_id} · status: ${result?.status ?? "unknown"}`;
55901
+ return `Task ${args?.task_id ?? ""} · status: ${result?.status ?? "unknown"}`;
55883
55902
  },
55884
55903
  execute: async (args, context) => {
55885
55904
  if (!context.shellTasks) {
@@ -55914,7 +55933,7 @@ var taskSendInputTool = {
55914
55933
  parameters: taskSendInputSchema,
55915
55934
  confirmationPolicy: "never",
55916
55935
  summarize: (args) => {
55917
- return `Sent input to ${args.task_id} (${args.input.length} chars)`;
55936
+ return `Sent input to ${args?.task_id ?? ""} (${args?.input?.length ?? 0} chars)`;
55918
55937
  },
55919
55938
  execute: async (args, context) => {
55920
55939
  if (!context.shellTasks) {
@@ -55938,7 +55957,7 @@ var taskKillTool = {
55938
55957
  parameters: taskKillInputSchema,
55939
55958
  confirmationPolicy: "never",
55940
55959
  summarize: (args, result) => {
55941
- return `Stopped task ${args.task_id} · status: ${result?.status ?? "killed"}`;
55960
+ return `Stopped task ${args?.task_id ?? ""} · status: ${result?.status ?? "killed"}`;
55942
55961
  },
55943
55962
  execute: async (args, context) => {
55944
55963
  if (!context.shellTasks) {
@@ -55979,7 +55998,7 @@ import { isIP } from "node:net";
55979
55998
  // package.json
55980
55999
  var package_default = {
55981
56000
  name: "steward-cli",
55982
- version: "0.23.0",
56001
+ version: "0.25.0",
55983
56002
  description: "Interactive AI engineering assistant for the terminal.",
55984
56003
  author: "sapirrior",
55985
56004
  license: "MIT",
@@ -56165,14 +56184,15 @@ var webFetchTool = {
56165
56184
  confirmationPolicy: "never",
56166
56185
  summarize: (args, result) => {
56167
56186
  if (!result)
56168
- return `Fetching ${args.url}`;
56169
- const chars = result.content.length;
56170
- const truncated = result.isTruncated ? " (truncated)" : "";
56171
- const type = result.contentType.split(";")[0]?.trim() ?? "text";
56187
+ return `Fetching ${args?.url ?? ""}`;
56188
+ const chars = result?.content?.length ?? 0;
56189
+ const truncated = result?.isTruncated ? " (truncated)" : "";
56190
+ const type = result?.contentType?.split(";")[0]?.trim() ?? "text";
56172
56191
  const label = type.includes("html") ? "HTML" : type.includes("json") ? "JSON" : type.includes("markdown") || type.includes("text/plain") ? "text" : type.split("/").pop() ?? "content";
56173
- let host = args.url;
56192
+ let host = args?.url ?? "";
56174
56193
  try {
56175
- host = new URL(args.url).hostname;
56194
+ if (args?.url)
56195
+ host = new URL(args.url).hostname;
56176
56196
  } catch {}
56177
56197
  return `Fetched ${chars.toLocaleString()} chars of ${label} from ${host}${truncated}`;
56178
56198
  },
@@ -56312,9 +56332,9 @@ var webSearchTool = {
56312
56332
  confirmationPolicy: "never",
56313
56333
  summarize: (args, result) => {
56314
56334
  if (!result)
56315
- return `Searching "${args.query}"`;
56316
- const count = result.resultCount;
56317
- const site = args.site ? ` on ${args.site}` : "";
56335
+ return `Searching "${args?.query ?? ""}"`;
56336
+ const count = result?.resultCount ?? 0;
56337
+ const site = args?.site ? ` on ${args.site}` : "";
56318
56338
  return `Found ${count} result${count === 1 ? "" : "s"}${site} via DuckDuckGo`;
56319
56339
  },
56320
56340
  execute: async (args, context) => {
@@ -56517,17 +56537,17 @@ var skillReadTool = {
56517
56537
  description: "Loads and reads the instructions (SKILL.md) or a relative resource file of a specialized skill by name. Use this when a task requires specialized guidelines.",
56518
56538
  parameters: skillReadParamsSchema,
56519
56539
  summarizeArgs(args) {
56520
- if (args.path) {
56540
+ if (args?.path) {
56521
56541
  return `name="${args.name}" path="${args.path}"`;
56522
56542
  }
56523
- return `name="${args.name}"`;
56543
+ return `name="${args?.name ?? ""}"`;
56524
56544
  },
56525
56545
  async execute(args, context) {
56526
56546
  const cwd = context?.cwd ?? process.cwd();
56527
56547
  return readSkillResource(args.name, args.path, cwd);
56528
56548
  },
56529
56549
  summarize(args, result) {
56530
- const target = args.path ? `${args.name}/${args.path}` : args.name;
56550
+ const target = args?.path ? `${args.name}/${args.path}` : args?.name ?? "skill";
56531
56551
  const len = result?.content ? ` (${result.content.length} bytes)` : "";
56532
56552
  return `SkillRead: ${target}${len}`;
56533
56553
  }
@@ -56564,17 +56584,19 @@ function summarizeToolResult(toolDef, args, result, isError = false) {
56564
56584
  return;
56565
56585
  }
56566
56586
  if (toolDef.summarize) {
56567
- const sum = toolDef.summarize(args, result);
56568
- if (typeof sum === "string") {
56569
- const [headline, ...rest] = sum.split(`
56587
+ try {
56588
+ const sum = toolDef.summarize(args, result);
56589
+ if (typeof sum === "string") {
56590
+ const [headline, ...rest] = sum.split(`
56570
56591
  `);
56571
- return {
56572
- headline: headline ?? "",
56573
- detail: rest.length > 0 ? { kind: "text", text: rest.join(`
56592
+ return {
56593
+ headline: headline ?? "",
56594
+ detail: rest.length > 0 ? { kind: "text", text: rest.join(`
56574
56595
  `) } : undefined
56575
- };
56576
- }
56577
- return sum;
56596
+ };
56597
+ }
56598
+ return sum;
56599
+ } catch {}
56578
56600
  }
56579
56601
  if (typeof result === "string") {
56580
56602
  const firstLine = result.split(`
@@ -61902,22 +61924,14 @@ class CommandPaletteController {
61902
61924
  const matching = this.getMatchingCommands(value);
61903
61925
  if (matching.length === 0)
61904
61926
  return false;
61905
- if (this.paletteIdx === 0) {
61906
- this.dismiss();
61907
- return false;
61908
- }
61909
- this.paletteIdx = this.paletteIdx - 1;
61927
+ this.paletteIdx = this.paletteIdx > 0 ? this.paletteIdx - 1 : matching.length - 1;
61910
61928
  return true;
61911
61929
  }
61912
61930
  onDown(value) {
61913
61931
  const matching = this.getMatchingCommands(value);
61914
61932
  if (matching.length === 0)
61915
61933
  return false;
61916
- if (this.paletteIdx >= matching.length - 1) {
61917
- this.dismiss();
61918
- return false;
61919
- }
61920
- this.paletteIdx = this.paletteIdx + 1;
61934
+ this.paletteIdx = this.paletteIdx < matching.length - 1 ? this.paletteIdx + 1 : 0;
61921
61935
  return true;
61922
61936
  }
61923
61937
  onTab(value) {
@@ -62380,25 +62394,32 @@ ${after}`, this.state.cursorPos);
62380
62394
  const matchingCommands = this.commandPalette.getMatchingCommands(effectiveValue);
62381
62395
  const paletteIdx = this.state.paletteIdx ?? this.commandPalette.getSelectedIndex();
62382
62396
  if (this.commandPalette.isSlashMode(effectiveValue) && matchingCommands.length > 0 && effectiveValue !== `/${matchingCommands[0]?.name} `) {
62383
- for (let i = 0;i < matchingCommands.length; i++) {
62384
- const cmd = matchingCommands[i];
62385
- const isSelected = i === paletteIdx;
62386
- const namePadded = `/${cmd.name}`.padEnd(18);
62387
- if (isSelected) {
62388
- lines.push(truncateToWidth2(`${bold(c.text(namePadded))}${bold(c.text(cmd.description))}`, maxCols));
62389
- } else {
62390
- lines.push(truncateToWidth2(`${c.muted(namePadded)}${c.muted(cmd.description)}`, maxCols));
62391
- }
62397
+ const maxVisible = 5;
62398
+ const startIdx = Math.max(0, Math.min(paletteIdx - Math.floor(maxVisible / 2), matchingCommands.length - maxVisible));
62399
+ const visibleCmds = matchingCommands.slice(Math.max(0, startIdx), Math.max(0, startIdx) + maxVisible);
62400
+ for (let relIdx = 0;relIdx < visibleCmds.length; relIdx++) {
62401
+ const cmd = visibleCmds[relIdx];
62402
+ const actualIdx = Math.max(0, startIdx) + relIdx;
62403
+ const isSelected = actualIdx === paletteIdx;
62404
+ const p = isSelected ? c.info(`${figures.pointer} `) : " ";
62405
+ const namePadded = `/${cmd.name}`.padEnd(16);
62406
+ const nameText = isSelected ? c.info(namePadded) : c.text(namePadded);
62407
+ const descText = isSelected ? c.info(cmd.description) : c.muted(cmd.description);
62408
+ lines.push(truncateToWidth2(`${p}${nameText}${descText}`, maxCols));
62392
62409
  }
62393
62410
  }
62394
62411
  const fileMatches = this.state.fileMatches ?? this.autocomplete.getMatches();
62395
62412
  const fileSelectIdx = this.state.fileSelectIdx ?? this.autocomplete.getSelectedIndex();
62396
62413
  if (fileMatches.length > 0) {
62397
62414
  lines.push(c.muted("Matching files (@):"));
62398
- for (let i = 0;i < fileMatches.length; i++) {
62399
- const f = fileMatches[i];
62400
- const isSelected = i === fileSelectIdx;
62401
- const p = isSelected ? c.info(`${figures.pointerBold} `) : " ";
62415
+ const maxVisible = 5;
62416
+ const startIdx = Math.max(0, Math.min(fileSelectIdx - Math.floor(maxVisible / 2), fileMatches.length - maxVisible));
62417
+ const visibleFiles = fileMatches.slice(Math.max(0, startIdx), Math.max(0, startIdx) + maxVisible);
62418
+ for (let relIdx = 0;relIdx < visibleFiles.length; relIdx++) {
62419
+ const f = visibleFiles[relIdx];
62420
+ const actualIdx = Math.max(0, startIdx) + relIdx;
62421
+ const isSelected = actualIdx === fileSelectIdx;
62422
+ const p = isSelected ? c.info(`${figures.pointer} `) : " ";
62402
62423
  const fileText = isSelected ? c.info(f) : c.muted(f);
62403
62424
  lines.push(truncateToWidth2(`${p}${fileText}`, maxCols));
62404
62425
  }
@@ -62461,7 +62482,7 @@ class TrustGate extends Component_default {
62461
62482
  const { selectedIndex } = this.state;
62462
62483
  const isYesSelected = selectedIndex === 0;
62463
62484
  const isNoSelected = selectedIndex === 1;
62464
- const pointer = figures.pointerBold ?? "❯";
62485
+ const pointer = figures.pointer ?? ">";
62465
62486
  const yesOptionText = isYesSelected ? `${c.permission(pointer)} ${bold(c.permission("1. Yes, I trust this folder"))}` : ` ${c.text("1. Yes, I trust this folder")}`;
62466
62487
  const noOptionText = isNoSelected ? `${c.permission(pointer)} ${bold(c.permission("2. No, exit"))}` : ` ${c.text("2. No, exit")}`;
62467
62488
  const safetyCheckText = "You should only proceed if you trust this workspace. Accessing untrusted workspaces may allow malicious code in the repository to compromise security or mislead the assistant.";
@@ -63352,14 +63373,14 @@ class LoginDock extends Component_default {
63352
63373
  if (step === "select-provider") {
63353
63374
  const items = OAUTH_PROVIDERS.map((p, idx) => {
63354
63375
  const isSelected = idx === selectedIndex;
63355
- const pointer = isSelected ? c.selected(`${figures.pointer} `) : " ";
63376
+ const pointer = isSelected ? c.info(`${figures.pointer} `) : " ";
63377
+ const name = isSelected ? c.info(bold(p.name)) : c.text(bold(p.name));
63356
63378
  return /* @__PURE__ */ jsxs(Box, {
63357
63379
  direction: "column",
63358
63380
  width: maxCols,
63359
63381
  children: [
63360
63382
  /* @__PURE__ */ jsx(Text, {
63361
- color: isSelected ? "selected" : "text",
63362
- children: `${pointer}${bold(p.name)}`
63383
+ children: `${pointer}${name}`
63363
63384
  }),
63364
63385
  /* @__PURE__ */ jsx(Text, {
63365
63386
  color: "muted",
@@ -63475,8 +63496,9 @@ class ModelPicker extends SelectList {
63475
63496
  onCancel: props.onCancel,
63476
63497
  renderItem: (m, isSelected, maxCols) => {
63477
63498
  const isCurrent = m.provider === props.currentModel.provider && m.modelId === props.currentModel.modelId;
63478
- const pointer = isSelected ? c.selected(`${figures.pointer} `) : " ";
63499
+ const pointer = isSelected ? c.info(`${figures.pointer} `) : " ";
63479
63500
  const activeBadge = isCurrent ? bold(c.current(" (active)")) : "";
63501
+ const title = isSelected ? c.info(m.modelId) : isCurrent ? c.current(m.modelId) : c.text(m.modelId);
63480
63502
  const providerName = m.provider.toUpperCase();
63481
63503
  const caps = m.reasoning ? "reasoning" : "chat";
63482
63504
  const meta = `${providerName} • ${caps}`;
@@ -63485,11 +63507,10 @@ class ModelPicker extends SelectList {
63485
63507
  width: maxCols,
63486
63508
  children: [
63487
63509
  /* @__PURE__ */ jsx(Text, {
63488
- color: isSelected ? "selected" : isCurrent ? "current" : "text",
63489
63510
  wrap: false,
63490
63511
  clip: true,
63491
63512
  ellipsis: true,
63492
- children: `${pointer}${m.modelId}${activeBadge}`
63513
+ children: `${pointer}${title}${activeBadge}`
63493
63514
  }),
63494
63515
  /* @__PURE__ */ jsx(Text, {
63495
63516
  color: "muted",
@@ -63525,8 +63546,9 @@ class ThemePicker extends SelectList {
63525
63546
  onCancel: props.onCancel,
63526
63547
  renderItem: (t, isSelected, maxCols) => {
63527
63548
  const isCurrent = t.name === props.currentTheme;
63528
- const pointer = isSelected ? c.selected(`${figures.pointer} `) : " ";
63549
+ const pointer = isSelected ? c.info(`${figures.pointer} `) : " ";
63529
63550
  const activeBadge = isCurrent ? bold(c.current(" (active)")) : "";
63551
+ const title = isSelected ? c.info(t.label) : isCurrent ? c.current(t.label) : c.text(t.label);
63530
63552
  const tBrand = resolveThemeColor(t.theme.brand, false)(figures.blackCircle);
63531
63553
  const tSuccess = resolveThemeColor(t.theme.success, false)(figures.blackCircle);
63532
63554
  const tWarning = resolveThemeColor(t.theme.warning, false)(figures.blackCircle);
@@ -63539,11 +63561,10 @@ class ThemePicker extends SelectList {
63539
63561
  width: maxCols,
63540
63562
  children: [
63541
63563
  /* @__PURE__ */ jsx(Text, {
63542
- color: isSelected ? "selected" : isCurrent ? "current" : "text",
63543
63564
  wrap: false,
63544
63565
  clip: true,
63545
63566
  ellipsis: true,
63546
- children: `${pointer}${t.label}${activeBadge}`
63567
+ children: `${pointer}${title}${activeBadge}`
63547
63568
  }),
63548
63569
  /* @__PURE__ */ jsx(Text, {
63549
63570
  color: "muted",
@@ -63583,7 +63604,8 @@ class SessionMenu extends SelectList {
63583
63604
  renderItem: (s, isSelected, maxCols) => {
63584
63605
  const rawTitle = s.name || s.turns?.[0]?.userPrompt || "Untitled Session";
63585
63606
  const cleanTitle = rawTitle.replace(/\s+/g, " ").trim();
63586
- const pointer = isSelected ? c.selected(`${figures.pointer} `) : " ";
63607
+ const pointer = isSelected ? c.info(`${figures.pointer} `) : " ";
63608
+ const title = isSelected ? c.info(cleanTitle) : c.text(cleanTitle);
63587
63609
  const shortId = s.id.slice(0, 8);
63588
63610
  const dateStr = s.date ? s.date.split("T")[0] : "";
63589
63611
  const turnsCount = s.turns?.length ?? 0;
@@ -63598,11 +63620,10 @@ class SessionMenu extends SelectList {
63598
63620
  width: maxCols,
63599
63621
  children: [
63600
63622
  /* @__PURE__ */ jsx(Text, {
63601
- color: isSelected ? "selected" : "text",
63602
63623
  wrap: false,
63603
63624
  clip: true,
63604
63625
  ellipsis: true,
63605
- children: `${pointer}${cleanTitle}`
63626
+ children: `${pointer}${title}`
63606
63627
  }),
63607
63628
  /* @__PURE__ */ jsx(Text, {
63608
63629
  color: "muted",
@@ -63955,7 +63976,8 @@ class RewindMenu extends SelectList {
63955
63976
  onSelect: props.onSelect,
63956
63977
  onCancel: props.onCancel,
63957
63978
  renderItem: (item, isSelected, maxCols) => {
63958
- const pointer = isSelected ? c.selected(`${figures.pointer} `) : " ";
63979
+ const pointer = isSelected ? c.info(`${figures.pointer} `) : " ";
63980
+ const title = isSelected ? c.info(item.promptText) : c.text(item.promptText);
63959
63981
  let summaryText;
63960
63982
  if (item.hasCodeChanges) {
63961
63983
  const filePart = c.muted(`${item.changedFileCount} file${item.changedFileCount !== 1 ? "s" : ""} changed`);
@@ -63976,11 +63998,10 @@ class RewindMenu extends SelectList {
63976
63998
  width: maxCols,
63977
63999
  children: [
63978
64000
  /* @__PURE__ */ jsx(Text, {
63979
- color: isSelected ? "selected" : "text",
63980
64001
  wrap: false,
63981
64002
  clip: true,
63982
64003
  ellipsis: true,
63983
- children: `${pointer}${item.promptText}`
64004
+ children: `${pointer}${title}`
63984
64005
  }),
63985
64006
  /* @__PURE__ */ jsx(Text, {
63986
64007
  wrap: false,
@@ -64081,7 +64102,7 @@ class BashPermissionDock extends Component_default {
64081
64102
  const maxCols = Math.max(1, termWidth);
64082
64103
  const { mode, selectedIndex, scrollOffset } = this.state;
64083
64104
  const { command, explanation } = this.props;
64084
- const pointer = figures.pointerBold ?? "❯";
64105
+ const pointer = figures.pointer ?? ">";
64085
64106
  const isYesSelected = selectedIndex === 0;
64086
64107
  const isNoSelected = selectedIndex === 1;
64087
64108
  const divider = c.rule(figures.horizontalLine.repeat(maxCols));
@@ -64391,7 +64412,7 @@ class FilePermissionDock extends Component_default {
64391
64412
  const { mode, selectedIndex, scrollOffset } = this.state;
64392
64413
  const { request } = this.props;
64393
64414
  const { kind, filePath } = request;
64394
- const pointer = figures.pointerBold ?? "❯";
64415
+ const pointer = figures.pointer ?? ">";
64395
64416
  const isYesSelected = selectedIndex === 0;
64396
64417
  const isNoSelected = selectedIndex === 1;
64397
64418
  const divider = c.rule(figures.horizontalLine.repeat(maxCols));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "steward-cli",
3
- "version": "0.23.0",
3
+ "version": "0.25.0",
4
4
  "description": "Interactive AI engineering assistant for the terminal.",
5
5
  "author": "sapirrior",
6
6
  "license": "MIT",