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.
- package/dist/cli.js +147 -126
- 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 {
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
|
|
53540
|
-
|
|
53541
|
-
|
|
53542
|
-
|
|
53543
|
-
|
|
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
|
-
|
|
53560
|
-
|
|
53561
|
-
|
|
53562
|
-
|
|
53563
|
-
|
|
53564
|
-
|
|
53565
|
-
|
|
53566
|
-
|
|
53567
|
-
|
|
53568
|
-
|
|
53569
|
-
|
|
53570
|
-
|
|
53571
|
-
|
|
53572
|
-
|
|
53573
|
-
|
|
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
|
|
54303
|
-
const filePath = args
|
|
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
|
|
54311
|
-
text: args
|
|
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
|
-
|
|
54651
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
56169
|
-
const chars = result
|
|
56170
|
-
const truncated = result
|
|
56171
|
-
const type = result
|
|
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
|
|
56192
|
+
let host = args?.url ?? "";
|
|
56174
56193
|
try {
|
|
56175
|
-
|
|
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
|
|
56316
|
-
const count = result
|
|
56317
|
-
const site = args
|
|
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
|
|
56540
|
+
if (args?.path) {
|
|
56521
56541
|
return `name="${args.name}" path="${args.path}"`;
|
|
56522
56542
|
}
|
|
56523
|
-
return `name="${args
|
|
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
|
|
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
|
-
|
|
56568
|
-
|
|
56569
|
-
|
|
56587
|
+
try {
|
|
56588
|
+
const sum = toolDef.summarize(args, result);
|
|
56589
|
+
if (typeof sum === "string") {
|
|
56590
|
+
const [headline, ...rest] = sum.split(`
|
|
56570
56591
|
`);
|
|
56571
|
-
|
|
56572
|
-
|
|
56573
|
-
|
|
56592
|
+
return {
|
|
56593
|
+
headline: headline ?? "",
|
|
56594
|
+
detail: rest.length > 0 ? { kind: "text", text: rest.join(`
|
|
56574
56595
|
`) } : undefined
|
|
56575
|
-
|
|
56576
|
-
|
|
56577
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
62384
|
-
|
|
62385
|
-
|
|
62386
|
-
|
|
62387
|
-
|
|
62388
|
-
|
|
62389
|
-
|
|
62390
|
-
|
|
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
|
-
|
|
62399
|
-
|
|
62400
|
-
|
|
62401
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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}${
|
|
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.
|
|
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}${
|
|
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.
|
|
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}${
|
|
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.
|
|
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}${
|
|
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.
|
|
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.
|
|
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));
|