@pentoshi/clai 2.0.28 → 2.0.30
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/agent/confirm-port.d.ts +30 -0
- package/dist/agent/confirm-port.js +89 -0
- package/dist/agent/confirm-port.js.map +1 -0
- package/dist/agent/plan-tool.d.ts +26 -0
- package/dist/agent/plan-tool.js +188 -0
- package/dist/agent/plan-tool.js.map +1 -0
- package/dist/agent/runner.d.ts +6 -174
- package/dist/agent/runner.js +25 -1606
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/session-policy.d.ts +19 -0
- package/dist/agent/session-policy.js +40 -0
- package/dist/agent/session-policy.js.map +1 -0
- package/dist/agent/stop-summary.d.ts +8 -0
- package/dist/agent/stop-summary.js +53 -0
- package/dist/agent/stop-summary.js.map +1 -0
- package/dist/agent/tool-call-parser.d.ts +155 -0
- package/dist/agent/tool-call-parser.js +1107 -0
- package/dist/agent/tool-call-parser.js.map +1 -0
- package/dist/agent/tool-output-formatting.d.ts +7 -0
- package/dist/agent/tool-output-formatting.js +127 -0
- package/dist/agent/tool-output-formatting.js.map +1 -0
- package/dist/commands/update.js +1 -1
- package/dist/prompts/index.d.ts +2 -2
- package/dist/prompts/index.js +103 -59
- package/dist/prompts/index.js.map +1 -1
- package/dist/repl/prompt-line.d.ts +19 -0
- package/dist/repl/prompt-line.js +555 -0
- package/dist/repl/prompt-line.js.map +1 -0
- package/dist/repl/slash-commands.d.ts +24 -0
- package/dist/repl/slash-commands.js +317 -0
- package/dist/repl/slash-commands.js.map +1 -0
- package/dist/repl.d.ts +2 -25
- package/dist/repl.js +41 -898
- package/dist/repl.js.map +1 -1
- package/dist/safety/classifier.js +1 -1
- package/dist/safety/classifier.js.map +1 -1
- package/dist/store/keys.js +0 -4
- package/dist/store/keys.js.map +1 -1
- package/dist/store/plan.js +1 -1
- package/dist/store/plan.js.map +1 -1
- package/dist/tools/nmap-runner.d.ts +19 -0
- package/dist/tools/nmap-runner.js +177 -0
- package/dist/tools/nmap-runner.js.map +1 -0
- package/dist/tools/package-binary.d.ts +1 -0
- package/dist/tools/package-binary.js +30 -0
- package/dist/tools/package-binary.js.map +1 -0
- package/dist/tools/pdf.js +2 -2
- package/dist/tools/pdf.js.map +1 -1
- package/dist/tools/registry.d.ts +2 -11
- package/dist/tools/registry.js +3 -203
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/tool-types.d.ts +12 -0
- package/dist/tools/tool-types.js +2 -0
- package/dist/tools/tool-types.js.map +1 -0
- package/dist/tools/web/audit.d.ts +7 -29
- package/dist/tools/web/audit.js +7 -29
- package/dist/tools/web/audit.js.map +1 -1
- package/dist/tools/web/budget.d.ts +5 -28
- package/dist/tools/web/budget.js +5 -28
- package/dist/tools/web/budget.js.map +1 -1
- package/dist/tools/web/capture.d.ts +8 -35
- package/dist/tools/web/capture.js +8 -35
- package/dist/tools/web/capture.js.map +1 -1
- package/dist/tools/web/fetch-core.d.ts +6 -26
- package/dist/tools/web/fetch-core.js +6 -26
- package/dist/tools/web/fetch-core.js.map +1 -1
- package/dist/tools/web/readable.d.ts +7 -13
- package/dist/tools/web/readable.js +7 -13
- package/dist/tools/web/readable.js.map +1 -1
- package/dist/tools/web/search.d.ts +15 -19
- package/dist/tools/web/search.js +103 -44
- package/dist/tools/web/search.js.map +1 -1
- package/dist/tools/web/ssrf-guard.d.ts +8 -27
- package/dist/tools/web/ssrf-guard.js +8 -27
- package/dist/tools/web/ssrf-guard.js.map +1 -1
- package/dist/tui/App.js +19 -88
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/key-intent.d.ts +36 -0
- package/dist/tui/key-intent.js +54 -0
- package/dist/tui/key-intent.js.map +1 -0
- package/dist/tui/render-lines.js +125 -37
- package/dist/tui/render-lines.js.map +1 -1
- package/dist/tui/state.js +2 -2
- package/dist/tui/state.js.map +1 -1
- package/dist/tui/text-format.d.ts +11 -0
- package/dist/tui/text-format.js +85 -0
- package/dist/tui/text-format.js.map +1 -0
- package/dist/ui/ansi-box.d.ts +7 -0
- package/dist/ui/ansi-box.js +18 -0
- package/dist/ui/ansi-box.js.map +1 -0
- package/dist/ui/banner.d.ts +0 -9
- package/dist/ui/banner.js +1 -43
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/intro-card.d.ts +10 -0
- package/dist/ui/intro-card.js +39 -0
- package/dist/ui/intro-card.js.map +1 -0
- package/dist/ui/markdown.js +1 -1
- package/dist/ui/markdown.js.map +1 -1
- package/dist/ui/output-pane.js.map +1 -1
- package/dist/ui/spinner.js +6 -17
- package/dist/ui/spinner.js.map +1 -1
- package/dist/ui/wordmark.d.ts +7 -0
- package/dist/ui/wordmark.js +42 -0
- package/dist/ui/wordmark.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
import { cursorTo, moveCursor } from "node:readline";
|
|
2
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { PROMPT } from "../ui/banner.js";
|
|
5
|
+
import { stripAnsi } from "../ui/ansi-box.js";
|
|
6
|
+
import { isPagerActive } from "../ui/output-pane.js";
|
|
7
|
+
import { isCtrlC, isCtrlO, isCtrlP, isCtrlT, isEscape } from "../ui/keys.js";
|
|
8
|
+
import { getMentionQuery, findFileSuggestions, } from "../ui/mentions.js";
|
|
9
|
+
import { getSlashCommandSuggestions, slashCommandFilter, slashCommandLabel, } from "./slash-commands.js";
|
|
10
|
+
export { stripAnsi };
|
|
11
|
+
function fitPlain(text, maxWidth) {
|
|
12
|
+
if (maxWidth <= 0)
|
|
13
|
+
return "";
|
|
14
|
+
if (text.length <= maxWidth)
|
|
15
|
+
return text;
|
|
16
|
+
if (maxWidth === 1)
|
|
17
|
+
return "…";
|
|
18
|
+
return `${text.slice(0, maxWidth - 1)}…`;
|
|
19
|
+
}
|
|
20
|
+
export function renderSlashCommandMenu(line, suggestions, selectedIndex) {
|
|
21
|
+
const cols = terminalColumns();
|
|
22
|
+
// Stay one column short to avoid terminal autowrap when the cursor lands in
|
|
23
|
+
// the final column. refresh() depends on each menu item occupying one row.
|
|
24
|
+
const maxWidth = Math.max(1, cols - 1);
|
|
25
|
+
if (suggestions.length === 0) {
|
|
26
|
+
return [chalk.dim(fitPlain(` no commands matching ${line}`, maxWidth))];
|
|
27
|
+
}
|
|
28
|
+
// Cap visible items to leave room in the terminal
|
|
29
|
+
const termRows = process.stdout.rows || 24;
|
|
30
|
+
const maxVisible = Math.max(5, termRows - 4);
|
|
31
|
+
const visible = suggestions.slice(0, maxVisible);
|
|
32
|
+
const maxCommandLength = Math.max(...visible.map((command) => slashCommandLabel(command).length));
|
|
33
|
+
const items = visible.map((command, index) => {
|
|
34
|
+
const markerPlain = index === selectedIndex ? "›" : " ";
|
|
35
|
+
const marker = index === selectedIndex ? chalk.magenta("›") : " ";
|
|
36
|
+
const prefix = ` ${markerPlain} `;
|
|
37
|
+
const labelBudget = Math.max(1, maxWidth - prefix.length);
|
|
38
|
+
const labelWidth = Math.min(maxCommandLength + 2, labelBudget);
|
|
39
|
+
const label = fitPlain(slashCommandLabel(command), labelWidth).padEnd(labelWidth);
|
|
40
|
+
const descWidth = Math.max(0, maxWidth - prefix.length - label.length);
|
|
41
|
+
const desc = fitPlain(command.description, descWidth);
|
|
42
|
+
return ` ${marker} ${chalk.cyan(label)}${chalk.dim(desc)}`;
|
|
43
|
+
});
|
|
44
|
+
if (suggestions.length > maxVisible) {
|
|
45
|
+
items.push(chalk.dim(fitPlain(` … ${suggestions.length - maxVisible} more`, maxWidth)));
|
|
46
|
+
}
|
|
47
|
+
return items;
|
|
48
|
+
}
|
|
49
|
+
export function renderFileMentionMenu(query, suggestions, selectedIndex) {
|
|
50
|
+
const cols = terminalColumns();
|
|
51
|
+
const maxWidth = Math.max(1, cols - 1);
|
|
52
|
+
if (suggestions.length === 0) {
|
|
53
|
+
return [chalk.dim(fitPlain(` no files matching @${query}`, maxWidth))];
|
|
54
|
+
}
|
|
55
|
+
const termRows = process.stdout.rows || 24;
|
|
56
|
+
const maxVisible = Math.max(5, termRows - 4);
|
|
57
|
+
const visible = suggestions.slice(0, maxVisible);
|
|
58
|
+
const items = visible.map((suggestion, index) => {
|
|
59
|
+
const markerPlain = index === selectedIndex ? "›" : " ";
|
|
60
|
+
const marker = index === selectedIndex ? chalk.magenta("›") : " ";
|
|
61
|
+
const prefix = ` ${markerPlain} `;
|
|
62
|
+
const labelBudget = Math.max(1, maxWidth - prefix.length);
|
|
63
|
+
const label = fitPlain(suggestion.label, labelBudget);
|
|
64
|
+
const colored = suggestion.isDir ? chalk.cyan(label) : chalk.white(label);
|
|
65
|
+
return ` ${marker} ${colored}`;
|
|
66
|
+
});
|
|
67
|
+
if (suggestions.length > maxVisible) {
|
|
68
|
+
items.push(chalk.dim(fitPlain(` … ${suggestions.length - maxVisible} more`, maxWidth)));
|
|
69
|
+
}
|
|
70
|
+
return items;
|
|
71
|
+
}
|
|
72
|
+
export function isPrintableSequence(sequence) {
|
|
73
|
+
return sequence !== undefined && /^[^\x00-\x1f\x7f]+$/u.test(sequence);
|
|
74
|
+
}
|
|
75
|
+
function terminalColumns() {
|
|
76
|
+
return Math.max(1, process.stdout.columns || 80);
|
|
77
|
+
}
|
|
78
|
+
function promptCursorPosition(line, cursor, columns) {
|
|
79
|
+
const cols = Math.max(1, columns);
|
|
80
|
+
const promptCols = promptColumnsForRender();
|
|
81
|
+
// Walk the buffer up to the cursor, advancing visual row/col. Newlines
|
|
82
|
+
// (from a multi-line paste) move to the next row at column 0; otherwise we
|
|
83
|
+
// wrap when a row fills. The prompt only offsets the very first row.
|
|
84
|
+
let row = 0;
|
|
85
|
+
let col = promptCols < cols ? promptCols : 0;
|
|
86
|
+
const end = Math.max(0, Math.min(cursor, line.length));
|
|
87
|
+
for (let i = 0; i < end; i += 1) {
|
|
88
|
+
if (line[i] === "\n") {
|
|
89
|
+
row += 1;
|
|
90
|
+
col = 0;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
col += 1;
|
|
94
|
+
if (col >= cols) {
|
|
95
|
+
row += 1;
|
|
96
|
+
col = 0;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return { row, col };
|
|
100
|
+
}
|
|
101
|
+
function promptColumnsForRender() {
|
|
102
|
+
return stripAnsi(PROMPT).length;
|
|
103
|
+
}
|
|
104
|
+
function buildPromptRows(line, columns, includeCursorRow) {
|
|
105
|
+
const cols = Math.max(1, columns);
|
|
106
|
+
const promptCols = promptColumnsForRender();
|
|
107
|
+
const rows = [];
|
|
108
|
+
// Split on explicit newlines first (multi-line paste), then wrap each
|
|
109
|
+
// logical line by the terminal width. Only the first logical line carries
|
|
110
|
+
// the prompt prefix; continuation lines start at column 0.
|
|
111
|
+
const logicalLines = line.split("\n");
|
|
112
|
+
logicalLines.forEach((logical, li) => {
|
|
113
|
+
const prefix = li === 0 ? PROMPT : "";
|
|
114
|
+
const prefixCols = li === 0 ? promptCols : 0;
|
|
115
|
+
if (prefixCols >= cols) {
|
|
116
|
+
rows.push(prefix);
|
|
117
|
+
for (let i = 0; i < logical.length; i += cols) {
|
|
118
|
+
rows.push(logical.slice(i, i + cols));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const firstRowCapacity = cols - prefixCols;
|
|
123
|
+
rows.push(prefix + logical.slice(0, firstRowCapacity));
|
|
124
|
+
for (let i = firstRowCapacity; i < logical.length; i += cols) {
|
|
125
|
+
rows.push(logical.slice(i, i + cols));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
if (includeCursorRow) {
|
|
130
|
+
// Pad so the row the cursor will sit on exists even at exact width
|
|
131
|
+
// boundaries or after a trailing newline.
|
|
132
|
+
const cursorRows = promptCursorPosition(line, line.length, cols).row + 1;
|
|
133
|
+
while (rows.length < cursorRows)
|
|
134
|
+
rows.push("");
|
|
135
|
+
}
|
|
136
|
+
return rows;
|
|
137
|
+
}
|
|
138
|
+
export async function readPromptLine(options) {
|
|
139
|
+
return new Promise((resolve) => {
|
|
140
|
+
let line = "";
|
|
141
|
+
let cursor = 0;
|
|
142
|
+
let selectedIndex = 0;
|
|
143
|
+
let menuNavigated = false;
|
|
144
|
+
let dismissedSlashLine = null;
|
|
145
|
+
let mentionDismissed = false;
|
|
146
|
+
let historyIndex = null;
|
|
147
|
+
let historyDraft = "";
|
|
148
|
+
let lastCtrlCAt = 0;
|
|
149
|
+
// Bracketed-paste state. When the terminal wraps a paste in
|
|
150
|
+
// paste-start/paste-end markers, we buffer the whole paste (including
|
|
151
|
+
// its embedded newlines) and insert it as literal text — so a multi-line
|
|
152
|
+
// prompt is captured in full instead of the first newline submitting and
|
|
153
|
+
// dropping the rest.
|
|
154
|
+
let pasting = false;
|
|
155
|
+
let pasteBuffer = "";
|
|
156
|
+
// Track which row (relative to prompt start) the cursor is on.
|
|
157
|
+
// Needed to move back up to prompt start when text wraps across rows.
|
|
158
|
+
let promptCursorRow = 0;
|
|
159
|
+
const getMenuState = () => {
|
|
160
|
+
const filter = slashCommandFilter(line);
|
|
161
|
+
if (filter === null || dismissedSlashLine === line) {
|
|
162
|
+
return { visible: false, suggestions: [] };
|
|
163
|
+
}
|
|
164
|
+
const suggestions = getSlashCommandSuggestions(line);
|
|
165
|
+
if (selectedIndex >= suggestions.length)
|
|
166
|
+
selectedIndex = 0;
|
|
167
|
+
return { visible: true, suggestions };
|
|
168
|
+
};
|
|
169
|
+
// File @-mention autocomplete: active when the cursor sits inside an
|
|
170
|
+
// `@partial/path` token. Mutually exclusive with the slash menu (slash
|
|
171
|
+
// requires the line to start with "/" and contain no whitespace).
|
|
172
|
+
const getMentionState = () => {
|
|
173
|
+
if (mentionDismissed || line.startsWith("/")) {
|
|
174
|
+
return { visible: false, query: "", start: 0, suggestions: [] };
|
|
175
|
+
}
|
|
176
|
+
const q = getMentionQuery(line, cursor);
|
|
177
|
+
if (!q)
|
|
178
|
+
return { visible: false, query: "", start: 0, suggestions: [] };
|
|
179
|
+
const suggestions = findFileSuggestions(q.query);
|
|
180
|
+
if (suggestions.length === 0) {
|
|
181
|
+
return { visible: false, query: q.query, start: q.start, suggestions };
|
|
182
|
+
}
|
|
183
|
+
if (selectedIndex >= suggestions.length)
|
|
184
|
+
selectedIndex = 0;
|
|
185
|
+
return { visible: true, query: q.query, start: q.start, suggestions };
|
|
186
|
+
};
|
|
187
|
+
const applyMention = (suggestion, start) => {
|
|
188
|
+
const before = line.slice(0, start);
|
|
189
|
+
const after = line.slice(cursor);
|
|
190
|
+
let insert = `@${suggestion.value}`;
|
|
191
|
+
let newCursor = before.length + insert.length;
|
|
192
|
+
if (!suggestion.isDir) {
|
|
193
|
+
// Completed a file — add a trailing space and close the menu so the
|
|
194
|
+
// user can keep typing their request.
|
|
195
|
+
insert += " ";
|
|
196
|
+
newCursor = before.length + insert.length;
|
|
197
|
+
mentionDismissed = true;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
// Completed a directory — keep the menu open so the user drills in.
|
|
201
|
+
mentionDismissed = false;
|
|
202
|
+
}
|
|
203
|
+
line = before + insert + after;
|
|
204
|
+
cursor = newCursor;
|
|
205
|
+
selectedIndex = 0;
|
|
206
|
+
menuNavigated = false;
|
|
207
|
+
refresh();
|
|
208
|
+
};
|
|
209
|
+
const refresh = () => {
|
|
210
|
+
const cols = terminalColumns();
|
|
211
|
+
const menu = getMenuState();
|
|
212
|
+
const mention = menu.visible
|
|
213
|
+
? {
|
|
214
|
+
visible: false,
|
|
215
|
+
query: "",
|
|
216
|
+
start: 0,
|
|
217
|
+
suggestions: [],
|
|
218
|
+
}
|
|
219
|
+
: getMentionState();
|
|
220
|
+
const menuLines = menu.visible
|
|
221
|
+
? renderSlashCommandMenu(line, menu.suggestions, selectedIndex)
|
|
222
|
+
: mention.visible
|
|
223
|
+
? renderFileMentionMenu(mention.query, mention.suggestions, selectedIndex)
|
|
224
|
+
: [];
|
|
225
|
+
const promptRows = buildPromptRows(line, cols, true);
|
|
226
|
+
const target = promptCursorPosition(line, cursor, cols);
|
|
227
|
+
const blockRows = [...promptRows, ...menuLines];
|
|
228
|
+
// Always redraw the whole prompt block from its anchor. Partial row
|
|
229
|
+
// clearing is fragile once terminal autowrap, slash menus, and cursor
|
|
230
|
+
// movement mix; clearing to the end of screen leaves no stale wrapped
|
|
231
|
+
// prompt/menu rows behind and keeps the cursor anchor stable.
|
|
232
|
+
if (promptCursorRow > 0) {
|
|
233
|
+
moveCursor(output, 0, -promptCursorRow);
|
|
234
|
+
}
|
|
235
|
+
cursorTo(output, 0);
|
|
236
|
+
output.write("\x1b[J");
|
|
237
|
+
output.write(blockRows.join("\n"));
|
|
238
|
+
const currentRow = Math.max(0, blockRows.length - 1);
|
|
239
|
+
const rowDelta = target.row - currentRow;
|
|
240
|
+
if (rowDelta !== 0) {
|
|
241
|
+
moveCursor(output, 0, rowDelta);
|
|
242
|
+
}
|
|
243
|
+
cursorTo(output, target.col);
|
|
244
|
+
promptCursorRow = target.row;
|
|
245
|
+
};
|
|
246
|
+
const editLine = (nextLine, nextCursor) => {
|
|
247
|
+
line = nextLine;
|
|
248
|
+
cursor = Math.max(0, Math.min(nextCursor, line.length));
|
|
249
|
+
selectedIndex = 0;
|
|
250
|
+
menuNavigated = false;
|
|
251
|
+
dismissedSlashLine = null;
|
|
252
|
+
mentionDismissed = false;
|
|
253
|
+
historyIndex = null;
|
|
254
|
+
refresh();
|
|
255
|
+
};
|
|
256
|
+
// Insert literal text (e.g. a multi-line paste) at the cursor, preserving
|
|
257
|
+
// newlines so the full pasted prompt is kept and later submitted intact.
|
|
258
|
+
const insertText = (text) => {
|
|
259
|
+
const normalized = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
260
|
+
if (!normalized)
|
|
261
|
+
return;
|
|
262
|
+
line = line.slice(0, cursor) + normalized + line.slice(cursor);
|
|
263
|
+
cursor += normalized.length;
|
|
264
|
+
selectedIndex = 0;
|
|
265
|
+
menuNavigated = false;
|
|
266
|
+
dismissedSlashLine = null;
|
|
267
|
+
mentionDismissed = false;
|
|
268
|
+
historyIndex = null;
|
|
269
|
+
refresh();
|
|
270
|
+
};
|
|
271
|
+
const cleanup = (restoreInput = false) => {
|
|
272
|
+
input.off("keypress", handleKeypress);
|
|
273
|
+
// Leave bracketed-paste mode so the terminal isn't left in a special
|
|
274
|
+
// state during tool execution or after exit.
|
|
275
|
+
if (input.isTTY)
|
|
276
|
+
output.write("\x1b[?2004l");
|
|
277
|
+
if (restoreInput) {
|
|
278
|
+
input.pause();
|
|
279
|
+
if (input.isTTY)
|
|
280
|
+
input.setRawMode(false);
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
const clearPromptDisplay = () => {
|
|
284
|
+
// Move back to prompt start
|
|
285
|
+
if (promptCursorRow > 0) {
|
|
286
|
+
moveCursor(output, 0, -promptCursorRow);
|
|
287
|
+
}
|
|
288
|
+
cursorTo(output, 0);
|
|
289
|
+
output.write("\x1b[J");
|
|
290
|
+
promptCursorRow = 0;
|
|
291
|
+
};
|
|
292
|
+
const submit = (submittedLine) => {
|
|
293
|
+
line = submittedLine;
|
|
294
|
+
cursor = line.length;
|
|
295
|
+
// Move back to prompt start
|
|
296
|
+
if (promptCursorRow > 0) {
|
|
297
|
+
moveCursor(output, 0, -promptCursorRow);
|
|
298
|
+
}
|
|
299
|
+
cursorTo(output, 0);
|
|
300
|
+
output.write("\x1b[J");
|
|
301
|
+
// Write final prompt using the same wrapping rules as refresh(), then
|
|
302
|
+
// move to the next line. Do not include the extra cursor-only row used
|
|
303
|
+
// for interactive editing at exact terminal-width boundaries.
|
|
304
|
+
output.write(buildPromptRows(line, terminalColumns(), false).join("\n"));
|
|
305
|
+
output.write("\n");
|
|
306
|
+
promptCursorRow = 0;
|
|
307
|
+
cleanup();
|
|
308
|
+
resolve(submittedLine);
|
|
309
|
+
};
|
|
310
|
+
function handleKeypress(sequence, key) {
|
|
311
|
+
// The alt-screen pager owns the terminal while open; ignore everything
|
|
312
|
+
// here so the user's navigation keys don't bleed into the input line.
|
|
313
|
+
if (isPagerActive())
|
|
314
|
+
return;
|
|
315
|
+
// Bracketed paste
|
|
316
|
+
// The terminal brackets a paste with paste-start / paste-end markers.
|
|
317
|
+
// Buffer everything in between (including embedded newlines) and insert
|
|
318
|
+
// it literally, so a long multi-line prompt is captured in full and the
|
|
319
|
+
// first newline does not submit early.
|
|
320
|
+
if (key?.name === "paste-start") {
|
|
321
|
+
pasting = true;
|
|
322
|
+
pasteBuffer = "";
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
if (key?.name === "paste-end") {
|
|
326
|
+
pasting = false;
|
|
327
|
+
const pasted = pasteBuffer;
|
|
328
|
+
pasteBuffer = "";
|
|
329
|
+
if (pasted)
|
|
330
|
+
insertText(pasted);
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
if (pasting) {
|
|
334
|
+
if (key?.name === "return" || key?.name === "enter") {
|
|
335
|
+
pasteBuffer += "\n";
|
|
336
|
+
}
|
|
337
|
+
else if (key?.name === "tab") {
|
|
338
|
+
pasteBuffer += "\t";
|
|
339
|
+
}
|
|
340
|
+
else if (isPrintableSequence(sequence)) {
|
|
341
|
+
pasteBuffer += sequence;
|
|
342
|
+
}
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
const menu = getMenuState();
|
|
346
|
+
const mention = menu.visible
|
|
347
|
+
? {
|
|
348
|
+
visible: false,
|
|
349
|
+
query: "",
|
|
350
|
+
start: 0,
|
|
351
|
+
suggestions: [],
|
|
352
|
+
}
|
|
353
|
+
: getMentionState();
|
|
354
|
+
// Cmd+C on macOS terminals is handled by the OS (it never reaches us),
|
|
355
|
+
// but some Linux terminals forward Meta+C. Treat that as a no-op so
|
|
356
|
+
// selecting + copying never breaks the REPL.
|
|
357
|
+
if (key.meta && !key.ctrl && key.name === "c")
|
|
358
|
+
return;
|
|
359
|
+
if (isCtrlC(key)) {
|
|
360
|
+
// First press: clear the current line. Second press within 1s: exit.
|
|
361
|
+
// This mirrors bash / Claude Code and avoids killing the REPL by
|
|
362
|
+
// accident when users habitually press Ctrl+C to copy in some
|
|
363
|
+
// terminals.
|
|
364
|
+
const now = Date.now();
|
|
365
|
+
if (line.length > 0) {
|
|
366
|
+
editLine("", 0);
|
|
367
|
+
lastCtrlCAt = now;
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
if (now - lastCtrlCAt < 1_000) {
|
|
371
|
+
cleanup(true);
|
|
372
|
+
output.write("\n");
|
|
373
|
+
process.exit(0);
|
|
374
|
+
}
|
|
375
|
+
lastCtrlCAt = now;
|
|
376
|
+
output.write("\n");
|
|
377
|
+
output.write(chalk.dim(" (press Ctrl+C again to exit)\n"));
|
|
378
|
+
output.write(PROMPT);
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
if (isCtrlT(key)) {
|
|
382
|
+
options.onThinkingShortcut();
|
|
383
|
+
refresh();
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
if (isCtrlO(key)) {
|
|
387
|
+
clearPromptDisplay();
|
|
388
|
+
output.write("\n");
|
|
389
|
+
void options.onOutputShortcut().finally(refresh);
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
if (isCtrlP(key)) {
|
|
393
|
+
clearPromptDisplay();
|
|
394
|
+
output.write("\n");
|
|
395
|
+
void options.onPlanShortcut().finally(refresh);
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
if (key.name === "return" || key.name === "enter") {
|
|
399
|
+
if (mention.visible && mention.suggestions.length > 0) {
|
|
400
|
+
applyMention(mention.suggestions[selectedIndex] ?? mention.suggestions[0], mention.start);
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
const useSelection = menu.visible && (line !== "/" || menuNavigated);
|
|
404
|
+
const selectedCommand = useSelection
|
|
405
|
+
? menu.suggestions[selectedIndex]
|
|
406
|
+
: undefined;
|
|
407
|
+
submit(selectedCommand?.command ?? line);
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
if (key.name === "tab") {
|
|
411
|
+
if (mention.visible && mention.suggestions.length > 0) {
|
|
412
|
+
applyMention(mention.suggestions[selectedIndex] ?? mention.suggestions[0], mention.start);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
if (menu.visible && menu.suggestions.length > 0) {
|
|
416
|
+
const target = menu.suggestions[selectedIndex] ?? menu.suggestions[0];
|
|
417
|
+
editLine(target.command, target.command.length);
|
|
418
|
+
}
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
if (isEscape(key)) {
|
|
422
|
+
if (mention.visible) {
|
|
423
|
+
mentionDismissed = true;
|
|
424
|
+
refresh();
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
if (menu.visible) {
|
|
428
|
+
dismissedSlashLine = line;
|
|
429
|
+
refresh();
|
|
430
|
+
}
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
if (key.name === "up") {
|
|
434
|
+
if (mention.visible && mention.suggestions.length > 0) {
|
|
435
|
+
selectedIndex =
|
|
436
|
+
(selectedIndex - 1 + mention.suggestions.length) %
|
|
437
|
+
mention.suggestions.length;
|
|
438
|
+
menuNavigated = true;
|
|
439
|
+
refresh();
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
if (menu.visible && menu.suggestions.length > 0) {
|
|
443
|
+
selectedIndex =
|
|
444
|
+
(selectedIndex - 1 + menu.suggestions.length) %
|
|
445
|
+
menu.suggestions.length;
|
|
446
|
+
menuNavigated = true;
|
|
447
|
+
refresh();
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
if (options.history.length > 0) {
|
|
451
|
+
if (historyIndex === null) {
|
|
452
|
+
historyDraft = line;
|
|
453
|
+
historyIndex = options.history.length - 1;
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
historyIndex = Math.max(0, historyIndex - 1);
|
|
457
|
+
}
|
|
458
|
+
line = options.history[historyIndex] ?? "";
|
|
459
|
+
cursor = line.length;
|
|
460
|
+
selectedIndex = 0;
|
|
461
|
+
dismissedSlashLine = null;
|
|
462
|
+
refresh();
|
|
463
|
+
}
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
if (key.name === "down") {
|
|
467
|
+
if (mention.visible && mention.suggestions.length > 0) {
|
|
468
|
+
selectedIndex = (selectedIndex + 1) % mention.suggestions.length;
|
|
469
|
+
menuNavigated = true;
|
|
470
|
+
refresh();
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
if (menu.visible && menu.suggestions.length > 0) {
|
|
474
|
+
selectedIndex = (selectedIndex + 1) % menu.suggestions.length;
|
|
475
|
+
menuNavigated = true;
|
|
476
|
+
refresh();
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
if (historyIndex !== null) {
|
|
480
|
+
if (historyIndex < options.history.length - 1) {
|
|
481
|
+
historyIndex += 1;
|
|
482
|
+
line = options.history[historyIndex] ?? "";
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
historyIndex = null;
|
|
486
|
+
line = historyDraft;
|
|
487
|
+
}
|
|
488
|
+
cursor = line.length;
|
|
489
|
+
selectedIndex = 0;
|
|
490
|
+
dismissedSlashLine = null;
|
|
491
|
+
refresh();
|
|
492
|
+
}
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
if (key.name === "left") {
|
|
496
|
+
if (cursor > 0) {
|
|
497
|
+
cursor -= 1;
|
|
498
|
+
refresh();
|
|
499
|
+
}
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
if (key.name === "right") {
|
|
503
|
+
if (cursor < line.length) {
|
|
504
|
+
cursor += 1;
|
|
505
|
+
refresh();
|
|
506
|
+
}
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
if (key.name === "home" || (key.ctrl && key.name === "a")) {
|
|
510
|
+
cursor = 0;
|
|
511
|
+
refresh();
|
|
512
|
+
return;
|
|
513
|
+
}
|
|
514
|
+
if (key.name === "end" || (key.ctrl && key.name === "e")) {
|
|
515
|
+
cursor = line.length;
|
|
516
|
+
refresh();
|
|
517
|
+
return;
|
|
518
|
+
}
|
|
519
|
+
if (key.name === "backspace") {
|
|
520
|
+
if (cursor > 0) {
|
|
521
|
+
editLine(line.slice(0, cursor - 1) + line.slice(cursor), cursor - 1);
|
|
522
|
+
}
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
if (key.name === "delete") {
|
|
526
|
+
if (cursor < line.length) {
|
|
527
|
+
editLine(line.slice(0, cursor) + line.slice(cursor + 1), cursor);
|
|
528
|
+
}
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
if (key.ctrl && key.name === "u") {
|
|
532
|
+
editLine(line.slice(cursor), 0);
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
if (key.ctrl && key.name === "k") {
|
|
536
|
+
editLine(line.slice(0, cursor), cursor);
|
|
537
|
+
return;
|
|
538
|
+
}
|
|
539
|
+
if (isPrintableSequence(sequence) && !key.ctrl && !key.meta) {
|
|
540
|
+
editLine(line.slice(0, cursor) + sequence + line.slice(cursor), cursor + sequence.length);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
output.write(PROMPT);
|
|
544
|
+
if (input.isTTY) {
|
|
545
|
+
input.setRawMode(true);
|
|
546
|
+
// Enable bracketed paste so multi-line pastes arrive as one chunk
|
|
547
|
+
// (wrapped in paste-start/paste-end) instead of submitting at the
|
|
548
|
+
// first embedded newline.
|
|
549
|
+
output.write("\x1b[?2004h");
|
|
550
|
+
}
|
|
551
|
+
input.resume();
|
|
552
|
+
input.on("keypress", handleKeypress);
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
//# sourceMappingURL=prompt-line.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-line.js","sourceRoot":"","sources":["../../src/repl/prompt-line.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface SlashCommand {
|
|
2
|
+
command: string;
|
|
3
|
+
usage?: string;
|
|
4
|
+
description: string;
|
|
5
|
+
}
|
|
6
|
+
/** Shared command catalogue used by both the classic REPL and the Ink TUI. */
|
|
7
|
+
export declare const slashCommands: SlashCommand[];
|
|
8
|
+
/** Curated model choices used by both frontends. */
|
|
9
|
+
export declare const knownModels: Record<string, string[]>;
|
|
10
|
+
export declare function getKnownModels(provider: string): string[];
|
|
11
|
+
/**
|
|
12
|
+
* Decide whether a line that starts with "/" is actually a slash command
|
|
13
|
+
* versus an absolute filesystem path the user typed or drag-dropped (e.g.
|
|
14
|
+
* `/Users/me/Desktop/Screenshot.png`). A real command is "/" + a single
|
|
15
|
+
* known command word (optionally followed by arguments). An absolute path
|
|
16
|
+
* has extra "/" segments in its first token and won't match a known command,
|
|
17
|
+
* so we route it to the normal prompt path where expandMentions() turns it
|
|
18
|
+
* into a file attachment.
|
|
19
|
+
*/
|
|
20
|
+
export declare function looksLikeSlashCommand(line: string): boolean;
|
|
21
|
+
export declare function slashCommandLabel(command: SlashCommand): string;
|
|
22
|
+
export declare function slashCommandFilter(line: string): string | null;
|
|
23
|
+
export declare function getSlashCommandSuggestions(line: string): SlashCommand[];
|
|
24
|
+
export declare function isKnownSlashCommand(command: string): boolean;
|