@gird/ccli 2.11.0 → 2.13.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/README.md +6 -1
- package/dist/agent/ai.js +24 -9
- package/dist/agent/ai.js.map +1 -1
- package/dist/cli/confirm-select.js +123 -0
- package/dist/cli/confirm-select.js.map +1 -1
- package/dist/cli/repl/index.js +43 -6
- package/dist/cli/repl/index.js.map +1 -1
- package/dist/cli/run/fold.js +51 -0
- package/dist/cli/run/fold.js.map +1 -0
- package/dist/cli/run/format.js +278 -0
- package/dist/cli/run/format.js.map +1 -0
- package/dist/cli/run/index.js +77 -17
- package/dist/cli/run/index.js.map +1 -1
- package/dist/cli/run/pager.js +138 -0
- package/dist/cli/run/pager.js.map +1 -0
- package/dist/cli/run/permissions.js +98 -0
- package/dist/cli/run/permissions.js.map +1 -0
- package/dist/cli/run/stream-write.js +246 -0
- package/dist/cli/run/stream-write.js.map +1 -0
- package/dist/cli/run/task.js +212 -0
- package/dist/cli/run/task.js.map +1 -0
- package/dist/cli/slash/system/agent.js +1 -1
- package/dist/cli/slash/system/agent.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/tools/index.js +24 -5
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/shared.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 工具调用与结果的一行摘要(供 REPL 默认展示)。
|
|
3
|
+
*
|
|
4
|
+
* 之前 REPL 在工具调用前直接打印 `⚙ name(<原始 JSON 参数>)`,长 content 会整段刷屏,
|
|
5
|
+
* 工具结果又不展示,看起来「猛地一坨、没有格式」。这里把调用和结果都提炼成清爽的一行,
|
|
6
|
+
* 每个工具即时打印两行(调用 → 结果),逐步出现、不刷屏。
|
|
7
|
+
*/
|
|
8
|
+
import { style } from '../style.js';
|
|
9
|
+
function safeParse(argsJson) {
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(argsJson || '{}');
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** 压成单行(去掉换行 / 多余空白)。 */
|
|
18
|
+
function oneLine(s) {
|
|
19
|
+
return s.replace(/\s+/g, ' ').trim();
|
|
20
|
+
}
|
|
21
|
+
function trunc(s, n) {
|
|
22
|
+
const o = oneLine(s);
|
|
23
|
+
return o.length > n ? o.slice(0, n) + '…' : o;
|
|
24
|
+
}
|
|
25
|
+
function lineCount(s) {
|
|
26
|
+
if (s === '')
|
|
27
|
+
return 0;
|
|
28
|
+
return s.split('\n').length;
|
|
29
|
+
}
|
|
30
|
+
function firstLine(s) {
|
|
31
|
+
return s.split('\n')[0] ?? '';
|
|
32
|
+
}
|
|
33
|
+
/** 工具调用的一行摘要(不含前缀符号,由调用方加 ⚙)。 */
|
|
34
|
+
export function formatToolCall(tc) {
|
|
35
|
+
const args = safeParse(tc.arguments);
|
|
36
|
+
switch (tc.name) {
|
|
37
|
+
case 'read_file':
|
|
38
|
+
case 'list_dir':
|
|
39
|
+
return `${tc.name} ${args.path ?? ''}`;
|
|
40
|
+
case 'grep':
|
|
41
|
+
return `grep "${trunc(String(args.pattern ?? ''), 40)}" ${args.path ?? ''}`;
|
|
42
|
+
case 'write_file': {
|
|
43
|
+
const lines = lineCount(String(args.content ?? ''));
|
|
44
|
+
return `write_file ${args.path ?? ''} (${lines} 行)`;
|
|
45
|
+
}
|
|
46
|
+
case 'edit_file':
|
|
47
|
+
return `edit_file ${args.path ?? ''}`;
|
|
48
|
+
case 'bash':
|
|
49
|
+
return `bash ${trunc(String(args.command ?? ''), 60)}`;
|
|
50
|
+
case 'bash_output':
|
|
51
|
+
case 'kill_bash':
|
|
52
|
+
return `${tc.name} ${args.id ?? ''}`;
|
|
53
|
+
default: {
|
|
54
|
+
if (tc.name.startsWith('mcp__')) {
|
|
55
|
+
const [, server, tool] = tc.name.split('__');
|
|
56
|
+
return `mcp ${server}.${tool}`;
|
|
57
|
+
}
|
|
58
|
+
return `${tc.name}(${trunc(tc.arguments, 60)})`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** 工具结果的一行摘要。bash 额外提取退出码;错误结果以 ✗ 开头。 */
|
|
63
|
+
export function formatToolResult(tc, result) {
|
|
64
|
+
const text = result ?? '';
|
|
65
|
+
if (!text || text === '(无输出)')
|
|
66
|
+
return '(无输出)';
|
|
67
|
+
if (tc.name === 'bash') {
|
|
68
|
+
const m = text.match(/\[退出码 (\d+)\]/);
|
|
69
|
+
const code = m ? m[1] : '0';
|
|
70
|
+
const body = text.replace(/\n?\[退出码 \d+\]/, '').trim();
|
|
71
|
+
const summary = body
|
|
72
|
+
? `${trunc(firstLine(body), 60)}${lineCount(body) > 1 ? ` (共 ${lineCount(body)} 行)` : ''}`
|
|
73
|
+
: '(无输出)';
|
|
74
|
+
return `退出码 ${code} · ${summary}`;
|
|
75
|
+
}
|
|
76
|
+
const isError = text.startsWith('错误');
|
|
77
|
+
const summary = `${trunc(firstLine(text), 80)}${lineCount(text) > 1 ? ` (共 ${lineCount(text)} 行)` : ''}`;
|
|
78
|
+
return isError ? `✗ ${summary}` : summary;
|
|
79
|
+
}
|
|
80
|
+
/* ------------------------------------------------------------------ *
|
|
81
|
+
* 工具调用「内容」展示(带行号 / diff)。
|
|
82
|
+
*
|
|
83
|
+
* write_file 与 edit_file 的内容来自 LLM 在工具参数里一次性给全的文本,
|
|
84
|
+
* 所以「落盘前」就已经有完整内容:先渲染给用户看,再由工具真正写盘。
|
|
85
|
+
* 这里只做渲染(纯函数、可测),不读写文件。
|
|
86
|
+
* ------------------------------------------------------------------ */
|
|
87
|
+
/** 单行展示的最大字符数,超过则截断(应对压缩过的一行代码)。 */
|
|
88
|
+
const MAX_LINE_CHARS = 1000;
|
|
89
|
+
/** write_file 默认最多展示多少行内容。 */
|
|
90
|
+
const WRITE_MAX_LINES = 40;
|
|
91
|
+
/** edit_file diff 默认最多展示多少行。 */
|
|
92
|
+
const DIFF_MAX_LINES = 60;
|
|
93
|
+
/** 把文本拆成行;去掉「末尾换行」多出来的空行,保证行数语义正确。 */
|
|
94
|
+
function splitLines(s) {
|
|
95
|
+
if (s === '')
|
|
96
|
+
return [];
|
|
97
|
+
const lines = s.split('\n');
|
|
98
|
+
if (lines[lines.length - 1] === '')
|
|
99
|
+
lines.pop();
|
|
100
|
+
return lines;
|
|
101
|
+
}
|
|
102
|
+
function clampLine(line) {
|
|
103
|
+
return line.length > MAX_LINE_CHARS
|
|
104
|
+
? line.slice(0, MAX_LINE_CHARS) + ' …(行过长已截断)'
|
|
105
|
+
: line;
|
|
106
|
+
}
|
|
107
|
+
/** 右对齐行号到固定宽度,返回 muted 着色后的 gutter 文本。 */
|
|
108
|
+
function gutter(num, width) {
|
|
109
|
+
return style.muted(String(num).padStart(width, ' '));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 渲染 write_file 的待写入内容:每行带行号,超出 maxLines 截断并提示。
|
|
113
|
+
*/
|
|
114
|
+
export function formatWriteContent(content, opts) {
|
|
115
|
+
const max = opts?.maxLines ?? WRITE_MAX_LINES;
|
|
116
|
+
const lines = splitLines(content);
|
|
117
|
+
const width = String(Math.max(lines.length, 1)).length;
|
|
118
|
+
const shown = lines.slice(0, max);
|
|
119
|
+
const out = shown.map((line, i) => ` ${gutter(i + 1, width)} ${clampLine(line)}`);
|
|
120
|
+
if (lines.length > max) {
|
|
121
|
+
out.push(style.muted(` …(共 ${lines.length} 行,仅展示前 ${max} 行)`));
|
|
122
|
+
}
|
|
123
|
+
return out.join('\n') + (out.length ? '\n' : '');
|
|
124
|
+
}
|
|
125
|
+
/** LCS 逐行 diff;输入过大时退化为「整块删 / 整块增」避免卡顿。 */
|
|
126
|
+
function diffLines(a, b) {
|
|
127
|
+
const n = a.length;
|
|
128
|
+
const m = b.length;
|
|
129
|
+
if (n * m > 250_000) {
|
|
130
|
+
const ops = [];
|
|
131
|
+
for (const x of a)
|
|
132
|
+
ops.push({ type: 'del', line: x });
|
|
133
|
+
for (const y of b)
|
|
134
|
+
ops.push({ type: 'add', line: y });
|
|
135
|
+
return ops;
|
|
136
|
+
}
|
|
137
|
+
const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
|
|
138
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
139
|
+
for (let j = m - 1; j >= 0; j--) {
|
|
140
|
+
dp[i][j] =
|
|
141
|
+
a[i] === b[j]
|
|
142
|
+
? dp[i + 1][j + 1] + 1
|
|
143
|
+
: Math.max(dp[i + 1][j], dp[i][j + 1]);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const ops = [];
|
|
147
|
+
let i = 0;
|
|
148
|
+
let j = 0;
|
|
149
|
+
while (i < n && j < m) {
|
|
150
|
+
if (a[i] === b[j]) {
|
|
151
|
+
ops.push({ type: 'eq', line: a[i] });
|
|
152
|
+
i++;
|
|
153
|
+
j++;
|
|
154
|
+
}
|
|
155
|
+
else if (dp[i + 1][j] >= dp[i][j + 1]) {
|
|
156
|
+
ops.push({ type: 'del', line: a[i] });
|
|
157
|
+
i++;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
ops.push({ type: 'add', line: b[j] });
|
|
161
|
+
j++;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
while (i < n) {
|
|
165
|
+
ops.push({ type: 'del', line: a[i] });
|
|
166
|
+
i++;
|
|
167
|
+
}
|
|
168
|
+
while (j < m) {
|
|
169
|
+
ops.push({ type: 'add', line: b[j] });
|
|
170
|
+
j++;
|
|
171
|
+
}
|
|
172
|
+
return ops;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 渲染 edit_file 的改动 diff:删除行 `-`(红)、新增行 `+`(绿)、
|
|
176
|
+
* 上下文行(muted 行号)。带旧/新两侧行号,超出 maxLines 截断。
|
|
177
|
+
*/
|
|
178
|
+
export function formatEditDiff(oldText, newText, opts) {
|
|
179
|
+
const max = opts?.maxLines ?? DIFF_MAX_LINES;
|
|
180
|
+
const oldLines = splitLines(oldText);
|
|
181
|
+
const newLines = splitLines(newText);
|
|
182
|
+
const width = String(Math.max(oldLines.length, newLines.length, 1)).length;
|
|
183
|
+
const ops = diffLines(oldLines, newLines);
|
|
184
|
+
const out = [];
|
|
185
|
+
let oldNo = 1;
|
|
186
|
+
let newNo = 1;
|
|
187
|
+
let truncated = false;
|
|
188
|
+
for (const op of ops) {
|
|
189
|
+
if (out.length >= max) {
|
|
190
|
+
truncated = true;
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
if (op.type === 'eq') {
|
|
194
|
+
out.push(` ${gutter(newNo, width)} ${clampLine(op.line)}`);
|
|
195
|
+
oldNo++;
|
|
196
|
+
newNo++;
|
|
197
|
+
}
|
|
198
|
+
else if (op.type === 'del') {
|
|
199
|
+
out.push(` ${style.error('-')} ${gutter(oldNo, width)} ${clampLine(op.line)}`);
|
|
200
|
+
oldNo++;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
out.push(` ${style.success('+')} ${gutter(newNo, width)} ${clampLine(op.line)}`);
|
|
204
|
+
newNo++;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (truncated) {
|
|
208
|
+
out.push(style.muted(` …(diff 过长,仅展示前 ${max} 行)`));
|
|
209
|
+
}
|
|
210
|
+
return out.join('\n') + (out.length ? '\n' : '');
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* 工具调用前的「内容块」展示。仅 write_file / edit_file 有多行内容,
|
|
214
|
+
* 其余工具返回 null(调用方维持一行摘要即可)。
|
|
215
|
+
*/
|
|
216
|
+
export function formatToolCallBody(tc) {
|
|
217
|
+
const args = safeParse(tc.arguments);
|
|
218
|
+
if (tc.name === 'write_file') {
|
|
219
|
+
return formatWriteContent(String(args.content ?? ''));
|
|
220
|
+
}
|
|
221
|
+
if (tc.name === 'edit_file') {
|
|
222
|
+
return formatEditDiff(String(args.old_text ?? ''), String(args.new_text ?? ''));
|
|
223
|
+
}
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
/* ------------------------------------------------------------------ *
|
|
227
|
+
* 长内容折叠用的「全量行」渲染(不截断)。
|
|
228
|
+
*
|
|
229
|
+
* 与 formatWriteContent / formatEditDiff 渲染同一套行格式,但不做截断、不加
|
|
230
|
+
* 「仅展示前 N 行」提示——把完整行数组交给上层(run/fold)决定是否折叠。
|
|
231
|
+
* ------------------------------------------------------------------ */
|
|
232
|
+
/** write_file 内容的全量带行号行(不截断),供折叠展示使用。 */
|
|
233
|
+
export function writeContentLines(content) {
|
|
234
|
+
const lines = splitLines(content);
|
|
235
|
+
const width = String(Math.max(lines.length, 1)).length;
|
|
236
|
+
return lines.map((line, i) => ` ${gutter(i + 1, width)} ${clampLine(line)}`);
|
|
237
|
+
}
|
|
238
|
+
/** edit_file 的全量 diff 行(不截断),供折叠展示使用。 */
|
|
239
|
+
export function editDiffLines(oldText, newText) {
|
|
240
|
+
const oldLines = splitLines(oldText);
|
|
241
|
+
const newLines = splitLines(newText);
|
|
242
|
+
const width = String(Math.max(oldLines.length, newLines.length, 1)).length;
|
|
243
|
+
const ops = diffLines(oldLines, newLines);
|
|
244
|
+
const out = [];
|
|
245
|
+
let oldNo = 1;
|
|
246
|
+
let newNo = 1;
|
|
247
|
+
for (const op of ops) {
|
|
248
|
+
if (op.type === 'eq') {
|
|
249
|
+
out.push(` ${gutter(newNo, width)} ${clampLine(op.line)}`);
|
|
250
|
+
oldNo++;
|
|
251
|
+
newNo++;
|
|
252
|
+
}
|
|
253
|
+
else if (op.type === 'del') {
|
|
254
|
+
out.push(` ${style.error('-')} ${gutter(oldNo, width)} ${clampLine(op.line)}`);
|
|
255
|
+
oldNo++;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
out.push(` ${style.success('+')} ${gutter(newNo, width)} ${clampLine(op.line)}`);
|
|
259
|
+
newNo++;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return out;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* 工具调用的全量内容行(不截断)。仅 write_file / edit_file 有内容,
|
|
266
|
+
* 其它工具返回 null。供 run 配合 renderWithFold 做折叠展示。
|
|
267
|
+
*/
|
|
268
|
+
export function toolCallLines(tc) {
|
|
269
|
+
const args = safeParse(tc.arguments);
|
|
270
|
+
if (tc.name === 'write_file') {
|
|
271
|
+
return writeContentLines(String(args.content ?? ''));
|
|
272
|
+
}
|
|
273
|
+
if (tc.name === 'edit_file') {
|
|
274
|
+
return editDiffLines(String(args.old_text ?? ''), String(args.new_text ?? ''));
|
|
275
|
+
}
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/cli/run/format.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/run/index.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { style } from '../style.js';
|
|
2
|
-
import { executeTool, getTool, registerMcpTools } from '../../tools/index.js';
|
|
2
|
+
import { executeTool, getTool, registerMcpTools, registerTool, } from '../../tools/index.js';
|
|
3
|
+
import { createTaskTool } from './task.js';
|
|
4
|
+
import { ruleKeyFor } from './permissions.js';
|
|
5
|
+
import { formatToolCall, formatToolResult, toolCallLines, } from './format.js';
|
|
6
|
+
import { renderWithFold } from './fold.js';
|
|
7
|
+
import { WriteFileStreamPrinter } from './stream-write.js';
|
|
3
8
|
import { estimatePromptTokens, estimateTokens, } from '../stats/index.js';
|
|
4
9
|
/** 单个用户回合内,最多允许模型连续调用工具的轮数,防止失控循环。 */
|
|
5
10
|
const MAX_TOOL_ROUNDS = 10;
|
|
@@ -19,10 +24,42 @@ function safeParse(argsJson) {
|
|
|
19
24
|
* 直到模型不再调用工具(给出最终回答)或达到轮数上限。
|
|
20
25
|
*/
|
|
21
26
|
export async function runAgentTurn(options) {
|
|
22
|
-
const { ai, history, confirm, stats, print = process.stdout.write.bind(process.stdout), maxRounds, requireToolsFirstRound, onToolCall, onToolResult, } = options;
|
|
27
|
+
const { ai, history, confirm, stats, print = process.stdout.write.bind(process.stdout), maxRounds, requireToolsFirstRound, onToolCall, onToolResult, permission, } = options;
|
|
23
28
|
const rounds = maxRounds ?? MAX_TOOL_ROUNDS;
|
|
29
|
+
/** 工具执行上下文(供 task 等需要反向调用 AI / 复用会话的工具)。 */
|
|
30
|
+
const toolCtx = {
|
|
31
|
+
ai,
|
|
32
|
+
confirm,
|
|
33
|
+
permission,
|
|
34
|
+
stats,
|
|
35
|
+
print,
|
|
36
|
+
cwd: process.cwd(),
|
|
37
|
+
};
|
|
38
|
+
// 注册 task 子代理工具(每回合注册一次,registerTool 同名替换幂等)。
|
|
39
|
+
registerTool(createTaskTool(toolCtx));
|
|
24
40
|
for (let round = 0; round < rounds; round++) {
|
|
25
|
-
|
|
41
|
+
let reasoningStarted = false;
|
|
42
|
+
let reasoningEnded = false;
|
|
43
|
+
const onReasoningDelta = (text) => {
|
|
44
|
+
if (!reasoningStarted) {
|
|
45
|
+
print(style.muted('思考中…\n'));
|
|
46
|
+
reasoningStarted = true;
|
|
47
|
+
}
|
|
48
|
+
print(style.muted(text));
|
|
49
|
+
};
|
|
50
|
+
const onDelta = (text) => {
|
|
51
|
+
// 首个正文 delta 到达时,与前面的思考块之间补一行分隔
|
|
52
|
+
if (reasoningStarted && !reasoningEnded) {
|
|
53
|
+
print('\n');
|
|
54
|
+
reasoningEnded = true;
|
|
55
|
+
}
|
|
56
|
+
print(text);
|
|
57
|
+
};
|
|
58
|
+
// write_file 内容的流式渲染:边收参数边带行号打印,营造「正在写」观感。
|
|
59
|
+
// 与子代理共用 WriteFileStreamPrinter,行为一致。
|
|
60
|
+
const writePrinter = new WriteFileStreamPrinter();
|
|
61
|
+
const onToolArgumentDelta = (index, name, argsSoFar) => writePrinter.handleDelta(index, name, argsSoFar, print);
|
|
62
|
+
const turn = await ai.chat(history, onDelta, round === 0 && requireToolsFirstRound ? { requireTools: true } : undefined, onReasoningDelta, onToolArgumentDelta);
|
|
26
63
|
// 优先使用后端返回的真实 usage;不支持时降级为字符估算
|
|
27
64
|
if (turn.usage) {
|
|
28
65
|
stats.promptTokens += turn.usage.promptTokens;
|
|
@@ -57,30 +94,53 @@ export async function runAgentTurn(options) {
|
|
|
57
94
|
const tool = getTool(tc.name);
|
|
58
95
|
// 破坏性工具:执行前展示预览并请用户确认
|
|
59
96
|
if (tool?.needsConfirm) {
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
97
|
+
const args = safeParse(tc.arguments);
|
|
98
|
+
const preview = tc.name === 'write_file' && writePrinter.anyStreamed
|
|
99
|
+
? `写入文件:${args.path ?? ''}(内容已在上方流式展示)`
|
|
100
|
+
: tool.preview
|
|
101
|
+
? tool.preview(args)
|
|
102
|
+
: `${tc.name}(${tc.arguments})`;
|
|
103
|
+
const ruleKey = permission ? ruleKeyFor(tc.name, args) : null;
|
|
104
|
+
// 已放行的同类:跳过确认直接执行(打印一行保持透明)
|
|
105
|
+
if (ruleKey && permission.isAllowed(ruleKey)) {
|
|
106
|
+
print(style.tool(`\n✓ 已自动允许(${ruleKey})\n`));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
const choice = await confirm(preview, ruleKey ? { ruleKey } : undefined);
|
|
110
|
+
if (choice === 'no') {
|
|
111
|
+
print('\n已取消。\n');
|
|
112
|
+
history.push({
|
|
113
|
+
role: 'tool',
|
|
114
|
+
tool_call_id: tc.id,
|
|
115
|
+
content: '用户拒绝执行此操作。请勿重试,可询问用户希望如何继续。',
|
|
116
|
+
});
|
|
117
|
+
continue; // 不执行,继续下一个工具调用
|
|
118
|
+
}
|
|
119
|
+
if (choice === 'always' && ruleKey) {
|
|
120
|
+
permission.allow(ruleKey);
|
|
121
|
+
}
|
|
72
122
|
}
|
|
73
123
|
}
|
|
74
124
|
if (onToolCall) {
|
|
75
125
|
onToolCall(tc);
|
|
76
126
|
}
|
|
77
127
|
else {
|
|
78
|
-
|
|
128
|
+
// write_file 内容已在流式中逐行打印过,不再重复输出摘要+完整块
|
|
129
|
+
const alreadyStreamed = tc.name === 'write_file' && writePrinter.anyStreamed;
|
|
130
|
+
if (!alreadyStreamed) {
|
|
131
|
+
print(style.tool(`\n⚙ ${formatToolCall(tc)}\n`));
|
|
132
|
+
const lines = toolCallLines(tc);
|
|
133
|
+
if (lines)
|
|
134
|
+
print(renderWithFold(lines));
|
|
135
|
+
}
|
|
79
136
|
}
|
|
80
|
-
const result = await executeTool(tc.name, tc.arguments);
|
|
137
|
+
const result = await executeTool(tc.name, tc.arguments, toolCtx);
|
|
81
138
|
if (onToolResult) {
|
|
82
139
|
onToolResult(tc, result);
|
|
83
140
|
}
|
|
141
|
+
else {
|
|
142
|
+
print(style.muted(` → ${formatToolResult(tc, result)}\n`));
|
|
143
|
+
}
|
|
84
144
|
history.push({
|
|
85
145
|
role: 'tool',
|
|
86
146
|
tool_call_id: tc.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/run/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/run/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EACH,WAAW,EACX,OAAO,EACP,gBAAgB,EAChB,YAAY,GAEf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAc,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EACH,cAAc,EACd,gBAAgB,EAChB,aAAa,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EACH,oBAAoB,EACpB,cAAc,GAEjB,MAAM,mBAAmB,CAAC;AAE3B,sCAAsC;AACtC,MAAM,eAAe,GAAG,EAAE,CAAC;AAW3B;;GAEG;AACH,SAAS,SAAS,CAAC,QAAgB;IAC/B,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAoBD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,OAA4B;IAE5B,MAAM,EACF,EAAE,EACF,OAAO,EACP,OAAO,EACP,KAAK,EACL,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EACjD,SAAS,EACT,sBAAsB,EACtB,UAAU,EACV,YAAY,EACZ,UAAU,GACb,GAAG,OAAO,CAAC;IACZ,MAAM,MAAM,GAAG,SAAS,IAAI,eAAe,CAAC;IAE5C,4CAA4C;IAC5C,MAAM,OAAO,GAAgB;QACzB,EAAE;QACF,OAAO;QACP,UAAU;QACV,KAAK;QACL,KAAK;QACL,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;KACrB,CAAC;IAEF,8CAA8C;IAC9C,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1C,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE;YACtC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACpB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC7B,gBAAgB,GAAG,IAAI,CAAC;YAC5B,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;YAC7B,gCAAgC;YAChC,IAAI,gBAAgB,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACZ,cAAc,GAAG,IAAI,CAAC;YAC1B,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC;QAEF,2CAA2C;QAC3C,sCAAsC;QACtC,MAAM,YAAY,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAClD,MAAM,mBAAmB,GAAG,CACxB,KAAa,EACb,IAAY,EACZ,SAAiB,EACnB,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAE7D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CACtB,OAAO,EACP,OAAO,EACP,KAAK,KAAK,CAAC,IAAI,sBAAsB,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAC1E,gBAAgB,EAChB,mBAAmB,CACtB,CAAC;QAEF,gCAAgC;QAChC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;YAC9C,KAAK,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;YACtD,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QAChD,CAAC;aAAM,CAAC;YACJ,MAAM,YAAY,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtD,KAAK,CAAC,YAAY,IAAI,YAAY,CAAC;YACnC,KAAK,CAAC,gBAAgB,IAAI,gBAAgB,CAAC;YAC3C,KAAK,CAAC,WAAW,IAAI,YAAY,GAAG,gBAAgB,CAAC;QACzD,CAAC;QAED,uBAAuB;QACvB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO;QACX,CAAC;QAED,yCAAyC;QACzC,OAAO,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;YAC7B,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACpC,EAAE,EAAE,EAAE,CAAC,EAAE;gBACT,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE;aACvD,CAAC,CAAC;SACN,CAAC,CAAC;QAEH,8BAA8B;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YAE9B,sBAAsB;YACtB,IAAI,IAAI,EAAE,YAAY,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;gBACrC,MAAM,OAAO,GACT,EAAE,CAAC,IAAI,KAAK,YAAY,IAAI,YAAY,CAAC,WAAW;oBAChD,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,EAAE,cAAc;oBACvC,CAAC,CAAC,IAAI,CAAC,OAAO;wBACZ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;wBACpB,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,SAAS,GAAG,CAAC;gBAC1C,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAE9D,4BAA4B;gBAC5B,IAAI,OAAO,IAAI,UAAW,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC5C,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,KAAK,CAAC,CAAC,CAAC;gBACjD,CAAC;qBAAM,CAAC;oBACJ,MAAM,MAAM,GAAG,MAAM,OAAO,CACxB,OAAO,EACP,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CACpC,CAAC;oBACF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;wBAClB,KAAK,CAAC,UAAU,CAAC,CAAC;wBAClB,OAAO,CAAC,IAAI,CAAC;4BACT,IAAI,EAAE,MAAM;4BACZ,YAAY,EAAE,EAAE,CAAC,EAAE;4BACnB,OAAO,EAAE,6BAA6B;yBACzC,CAAC,CAAC;wBACH,SAAS,CAAC,gBAAgB;oBAC9B,CAAC;oBACD,IAAI,MAAM,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC;wBACjC,UAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC/B,CAAC;gBACL,CAAC;YACL,CAAC;YAED,IAAI,UAAU,EAAE,CAAC;gBACb,UAAU,CAAC,EAAE,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACJ,uCAAuC;gBACvC,MAAM,eAAe,GACjB,EAAE,CAAC,IAAI,KAAK,YAAY,IAAI,YAAY,CAAC,WAAW,CAAC;gBACzD,IAAI,CAAC,eAAe,EAAE,CAAC;oBACnB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;oBACjD,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;oBAChC,IAAI,KAAK;wBAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5C,CAAC;YACL,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACjE,IAAI,YAAY,EAAE,CAAC;gBACf,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACJ,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,MAAM;gBACZ,YAAY,EAAE,EAAE,CAAC,EAAE;gBACnB,OAAO,EAAE,MAAM;aAClB,CAAC,CAAC;QACP,CAAC;QACD,sBAAsB;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAC3C,CAAC;AAWD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAuB;IACjD,MAAM,EACF,EAAE,EACF,MAAM,EACN,OAAO,EACP,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EACjD,YAAY,GAAG,uCAAuC,EACtD,UAAU,GACb,GAAG,OAAO,CAAC;IAEZ,IAAI,UAAU,EAAE,CAAC;QACb,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,OAAO,GAAkB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAEhD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,YAAY,GAAU,CAAC,KAAK,EAAE,EAAE;QAClC,MAAM,IAAI,KAAK,CAAC;QAChB,KAAK,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,YAAY,CAAC;QACf,EAAE;QACF,OAAO;QACP,OAAO;QACP,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;QAC/D,KAAK,EAAE,YAAY;KACtB,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 折叠内容的全屏可滚动查看器(alternate screen,类 less)。
|
|
3
|
+
*
|
|
4
|
+
* 第 57 / 63 步的折叠只铺前 N 行,按 ctrl+o 原本是「在提示符处追加补打剩余行」
|
|
5
|
+
* (传统流式终端,行一旦打印就滚上去、无法原地重绘)。这里把 ctrl+o 升级为:
|
|
6
|
+
* 进入 alternate screen,整屏展示被折叠的完整内容,↑/↓/PgUp/PgDn/Home/End 滚动,
|
|
7
|
+
* q / Enter / Esc 退出后回到原 REPL(提示符与未提交输入原样恢复)。
|
|
8
|
+
*
|
|
9
|
+
* 这是「原地展开 / 可滚动」在终端里的标准做法(less / man 同款):隔离在 ctrl+o
|
|
10
|
+
* 触发、退出即还原,不替换 readline、不改动正常输出路径,零回归。
|
|
11
|
+
*/
|
|
12
|
+
import { emitKeypressEvents } from 'node:readline';
|
|
13
|
+
import { style } from '../style.js';
|
|
14
|
+
const ALT_ON = '\x1b[?1049h';
|
|
15
|
+
const ALT_OFF = '\x1b[?1049l';
|
|
16
|
+
const CURSOR_HIDE = '\x1b[?25l';
|
|
17
|
+
const CURSOR_SHOW = '\x1b[?25h';
|
|
18
|
+
const CLEAR = '\x1b[H\x1b[2J';
|
|
19
|
+
/** 可滚动行数 = 终端行数 - 1(留一行给状态栏)。 */
|
|
20
|
+
function viewRowsOf(total) {
|
|
21
|
+
return Math.max(1, (total ?? 24) - 1);
|
|
22
|
+
}
|
|
23
|
+
/** 给定内容总行数与可视行数,计算最大合法 offset( clamp 用)。 */
|
|
24
|
+
function maxOffset(total, viewRows) {
|
|
25
|
+
return Math.max(0, total - viewRows);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 纯逻辑:按按键计算新的 offset / 是否退出。
|
|
29
|
+
* 箭头 / vim 键(kjgG)/ PgUp/PgDn / Home/End 滚动;q / Enter / Esc 退出。
|
|
30
|
+
* 不直接处理 Ctrl-C(由 openFoldPager 统一处理为退出进程)。
|
|
31
|
+
*/
|
|
32
|
+
export function handlePagerKey(key, str, offset, total, viewRows) {
|
|
33
|
+
const max = maxOffset(total, viewRows);
|
|
34
|
+
const name = key.name ?? '';
|
|
35
|
+
const ch = str ?? ''; // 原始(区分大小写,用于 g / G)
|
|
36
|
+
const lower = ch.toLowerCase(); // 用于 q / k / j
|
|
37
|
+
if (name === 'q' || lower === 'q' || name === 'escape' || name === 'return') {
|
|
38
|
+
return { offset, quit: true };
|
|
39
|
+
}
|
|
40
|
+
if (name === 'up' || lower === 'k') {
|
|
41
|
+
return { offset: Math.max(0, offset - 1), quit: false };
|
|
42
|
+
}
|
|
43
|
+
if (name === 'down' || lower === 'j') {
|
|
44
|
+
return { offset: Math.min(max, offset + 1), quit: false };
|
|
45
|
+
}
|
|
46
|
+
if (name === 'pageup') {
|
|
47
|
+
return { offset: Math.max(0, offset - viewRows), quit: false };
|
|
48
|
+
}
|
|
49
|
+
if (name === 'pagedown') {
|
|
50
|
+
return { offset: Math.min(max, offset + viewRows), quit: false };
|
|
51
|
+
}
|
|
52
|
+
if (name === 'home' || ch === 'g') {
|
|
53
|
+
return { offset: 0, quit: false };
|
|
54
|
+
}
|
|
55
|
+
if (name === 'end' || ch === 'G') {
|
|
56
|
+
return { offset: max, quit: false };
|
|
57
|
+
}
|
|
58
|
+
return { offset, quit: false };
|
|
59
|
+
}
|
|
60
|
+
/** 纯逻辑:渲染一帧(清屏 + 可视窗口 + 状态栏)。供测试断言。 */
|
|
61
|
+
export function renderPager(options) {
|
|
62
|
+
const { lines, gutter = '', offset, viewRows } = options;
|
|
63
|
+
const total = lines.length;
|
|
64
|
+
const end = Math.min(total, offset + viewRows);
|
|
65
|
+
const window = lines.slice(offset, end).map((l) => gutter + l);
|
|
66
|
+
const from = total === 0 ? 0 : offset + 1;
|
|
67
|
+
const status = style.muted(` — 折叠内容 ${from}-${end}/${total} ↑/↓ 滚动 PgUp/PgDn Home/End q/Enter 退出 —`);
|
|
68
|
+
return CLEAR + window.join('\n') + (window.length ? '\n' : '') + status;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 打开全屏查看器,退出后 resolve。非 TTY 降级为直接打印全部内容。
|
|
72
|
+
* 接管 keypress(移除并恢复既有监听,含 readline / ctrl+o),与 confirm-select 同款。
|
|
73
|
+
*/
|
|
74
|
+
export async function openFoldPager(options) {
|
|
75
|
+
const { lines, gutter = '', input = process.stdin, output = process.stdout, } = options;
|
|
76
|
+
const stdin = input;
|
|
77
|
+
const stdout = output;
|
|
78
|
+
// 非 TTY:无法进入 alternate screen,退化为一次性打印全部内容
|
|
79
|
+
if (!stdin.isTTY || !stdout.isTTY) {
|
|
80
|
+
stdout.write(lines.map((l) => gutter + l).join('\n') + '\n');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
return new Promise((resolve) => {
|
|
84
|
+
let offset = 0;
|
|
85
|
+
const originalRawMode = stdin.isRaw;
|
|
86
|
+
const wasPaused = typeof stdin.isPaused === 'function'
|
|
87
|
+
? stdin.isPaused()
|
|
88
|
+
: false;
|
|
89
|
+
const existingKeypressListeners = stdin.listeners('keypress');
|
|
90
|
+
for (const listener of existingKeypressListeners) {
|
|
91
|
+
stdin.removeListener('keypress', listener);
|
|
92
|
+
}
|
|
93
|
+
stdin.setRawMode(true);
|
|
94
|
+
emitKeypressEvents(stdin);
|
|
95
|
+
if (wasPaused)
|
|
96
|
+
stdin.resume();
|
|
97
|
+
const viewRows = () => viewRowsOf(stdout.rows);
|
|
98
|
+
function render() {
|
|
99
|
+
stdout.write(renderPager({ lines, gutter, offset, viewRows: viewRows() }));
|
|
100
|
+
}
|
|
101
|
+
function cleanup() {
|
|
102
|
+
stdin.setRawMode(originalRawMode ?? false);
|
|
103
|
+
stdin.removeListener('keypress', onKeypress);
|
|
104
|
+
for (const listener of existingKeypressListeners) {
|
|
105
|
+
stdin.on('keypress', listener);
|
|
106
|
+
}
|
|
107
|
+
if (wasPaused)
|
|
108
|
+
stdin.pause();
|
|
109
|
+
}
|
|
110
|
+
function quit() {
|
|
111
|
+
cleanup();
|
|
112
|
+
// 还原光标并离开 alternate screen,回到原 REPL 画面
|
|
113
|
+
stdout.write(CURSOR_SHOW + ALT_OFF);
|
|
114
|
+
resolve();
|
|
115
|
+
}
|
|
116
|
+
function onKeypress(str, key) {
|
|
117
|
+
if (key?.ctrl && key.name === 'c') {
|
|
118
|
+
cleanup();
|
|
119
|
+
stdout.write(CURSOR_SHOW + ALT_OFF + '\n');
|
|
120
|
+
process.exit(0);
|
|
121
|
+
}
|
|
122
|
+
const r = handlePagerKey(key ?? {}, str ?? '', offset, lines.length, viewRows());
|
|
123
|
+
if (r.quit) {
|
|
124
|
+
quit();
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (r.offset !== offset) {
|
|
128
|
+
offset = r.offset;
|
|
129
|
+
render();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// 进入 alternate screen 并首帧渲染
|
|
133
|
+
stdout.write(ALT_ON + CURSOR_HIDE);
|
|
134
|
+
render();
|
|
135
|
+
stdin.on('keypress', onKeypress);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=pager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pager.js","sourceRoot":"","sources":["../../../src/cli/run/pager.ts"],"names":[],"mappings":"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"}
|