@wukonglabs/wukong 0.0.9 → 0.0.11
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/exit-codes.js +12 -16
- package/dist/cli/exit-codes.js.map +1 -1
- package/dist/cli/help.js +4 -8
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/session-commands.js +1 -4
- package/dist/cli/session-commands.js.map +1 -1
- package/dist/cli/summary.js +2 -6
- package/dist/cli/summary.js.map +1 -1
- package/dist/cli/workspace-commands.js +1 -4
- package/dist/cli/workspace-commands.js.map +1 -1
- package/dist/index.js +373 -121
- package/dist/index.js.map +1 -1
- package/dist/sigint-handler.d.ts +62 -0
- package/dist/sigint-handler.d.ts.map +1 -0
- package/dist/sigint-handler.js +62 -0
- package/dist/sigint-handler.js.map +1 -0
- package/dist/tui/app.d.ts +57 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +268 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/header.d.ts +24 -0
- package/dist/tui/header.d.ts.map +1 -0
- package/dist/tui/header.js +26 -0
- package/dist/tui/header.js.map +1 -0
- package/dist/tui/permission-card.d.ts +27 -0
- package/dist/tui/permission-card.d.ts.map +1 -0
- package/dist/tui/permission-card.js +75 -0
- package/dist/tui/permission-card.js.map +1 -0
- package/dist/tui/plan-panel.d.ts +31 -0
- package/dist/tui/plan-panel.d.ts.map +1 -0
- package/dist/tui/plan-panel.js +30 -0
- package/dist/tui/plan-panel.js.map +1 -0
- package/dist/tui/response-panel.d.ts +49 -0
- package/dist/tui/response-panel.d.ts.map +1 -0
- package/dist/tui/response-panel.js +14 -0
- package/dist/tui/response-panel.js.map +1 -0
- package/dist/tui/run-ink.d.ts +22 -0
- package/dist/tui/run-ink.d.ts.map +1 -0
- package/dist/tui/run-ink.js +21 -0
- package/dist/tui/run-ink.js.map +1 -0
- package/dist/tui/should-use-tui.d.ts +25 -0
- package/dist/tui/should-use-tui.d.ts.map +1 -0
- package/dist/tui/should-use-tui.js +29 -0
- package/dist/tui/should-use-tui.js.map +1 -0
- package/dist/tui/text-input.d.ts +61 -0
- package/dist/tui/text-input.d.ts.map +1 -0
- package/dist/tui/text-input.js +318 -0
- package/dist/tui/text-input.js.map +1 -0
- package/dist/tui/thinking-panel.d.ts +32 -0
- package/dist/tui/thinking-panel.d.ts.map +1 -0
- package/dist/tui/thinking-panel.js +14 -0
- package/dist/tui/thinking-panel.js.map +1 -0
- package/dist/tui/tool-cards.d.ts +30 -0
- package/dist/tui/tool-cards.d.ts.map +1 -0
- package/dist/tui/tool-cards.js +37 -0
- package/dist/tui/tool-cards.js.map +1 -0
- package/dist/tui/use-input-history.d.ts +40 -0
- package/dist/tui/use-input-history.d.ts.map +1 -0
- package/dist/tui/use-input-history.js +123 -0
- package/dist/tui/use-input-history.js.map +1 -0
- package/dist/tui/use-plan-state.d.ts +4 -0
- package/dist/tui/use-plan-state.d.ts.map +1 -0
- package/dist/tui/use-plan-state.js +77 -0
- package/dist/tui/use-plan-state.js.map +1 -0
- package/package.json +9 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Header 组件 —— 顶部状态栏(model / session / step counter / cache / duration)。
|
|
3
|
+
*
|
|
4
|
+
* Phase B M2:增加 step counter + cache 命中率(由 App 订阅 step_start/cache_stat
|
|
5
|
+
* 事件后传入)。
|
|
6
|
+
*/
|
|
7
|
+
import React from 'react';
|
|
8
|
+
export interface HeaderProps {
|
|
9
|
+
model: string;
|
|
10
|
+
sessionUuidShort: string;
|
|
11
|
+
workspaceRoot: string;
|
|
12
|
+
/** 当前是否在等待 agent 响应 */
|
|
13
|
+
busy: boolean;
|
|
14
|
+
/** 最近一次 run 的耗时(ms);undefined 表示尚未完成任何 run */
|
|
15
|
+
lastDurationMs?: number;
|
|
16
|
+
/** 当前 step(从 1 开始);0 表示尚未开始或已结束 */
|
|
17
|
+
currentStep?: number;
|
|
18
|
+
/** 最大 step 数;用于显示 "3/100" */
|
|
19
|
+
maxSteps?: number;
|
|
20
|
+
/** 累计 cache 命中率(0-1);undefined 表示无 cache 数据 */
|
|
21
|
+
cacheHitRate?: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function Header({ model, sessionUuidShort, workspaceRoot, busy, lastDurationMs, currentStep, maxSteps, cacheHitRate, }: HeaderProps): React.ReactElement;
|
|
24
|
+
//# sourceMappingURL=header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../src/tui/header.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,gBAAgB,EAChB,aAAa,EACb,IAAI,EACJ,cAAc,EACd,WAAe,EACf,QAAQ,EACR,YAAY,GACb,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAkClC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Text, Box } from 'ink';
|
|
3
|
+
export function Header({ model, sessionUuidShort, workspaceRoot, busy, lastDurationMs, currentStep = 0, maxSteps, cacheHitRate, }) {
|
|
4
|
+
const shortRoot = shortenPath(workspaceRoot, 40);
|
|
5
|
+
const durationStr = lastDurationMs !== undefined ? `${(lastDurationMs / 1000).toFixed(1)}s` : '—';
|
|
6
|
+
const stepStr = currentStep > 0
|
|
7
|
+
? maxSteps ? `🎯 ${currentStep}/${maxSteps}` : `🎯 ${currentStep}`
|
|
8
|
+
: '🎯 —';
|
|
9
|
+
const cacheStr = cacheHitRate !== undefined
|
|
10
|
+
? `💾 ${(cacheHitRate * 100).toFixed(0)}%`
|
|
11
|
+
: null;
|
|
12
|
+
return (_jsxs(Box, { paddingX: 0, children: [_jsx(Text, { color: "cyan", bold: true, children: "\uD83D\uDC12 Wukong" }), _jsx(Text, { dimColor: true, children: " \u2502 " }), _jsxs(Text, { color: "blue", children: ["\uD83D\uDCE1 ", model] }), _jsx(Text, { dimColor: true, children: " \u2502 " }), _jsxs(Text, { color: "magenta", children: ["\uD83D\uDCC2 ", sessionUuidShort] }), _jsx(Text, { dimColor: true, children: " @ " }), _jsx(Text, { color: "gray", children: shortRoot }), _jsx(Text, { dimColor: true, children: " \u2502 " }), _jsx(Text, { color: "cyan", children: stepStr }), cacheStr && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: " \u2502 " }), _jsx(Text, { color: "green", children: cacheStr })] })), _jsx(Text, { dimColor: true, children: " \u2502 " }), _jsx(Text, { color: busy ? 'yellow' : 'green', children: busy ? '⏳ 思考中…' : '✓ 就绪' }), _jsx(Text, { dimColor: true, children: " \u2502 " }), _jsxs(Text, { dimColor: true, children: ["\u23F1 ", durationStr] })] }));
|
|
13
|
+
}
|
|
14
|
+
/** 把长路径缩短,保留首段 + 末尾两段 */
|
|
15
|
+
function shortenPath(p, maxLen) {
|
|
16
|
+
if (p.length <= maxLen)
|
|
17
|
+
return p;
|
|
18
|
+
const parts = p.split('/');
|
|
19
|
+
if (parts.length <= 3)
|
|
20
|
+
return p;
|
|
21
|
+
const tail = parts.slice(-2).join('/');
|
|
22
|
+
const head = parts[0] || '/';
|
|
23
|
+
const shortened = `${head}/…/${tail}`;
|
|
24
|
+
return shortened.length <= maxLen ? shortened : `…/${tail}`;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../src/tui/header.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAkBhC,MAAM,UAAU,MAAM,CAAC,EACrB,KAAK,EACL,gBAAgB,EAChB,aAAa,EACb,IAAI,EACJ,cAAc,EACd,WAAW,GAAG,CAAC,EACf,QAAQ,EACR,YAAY,GACA;IACZ,MAAM,SAAS,GAAG,WAAW,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACjD,MAAM,WAAW,GACf,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAChF,MAAM,OAAO,GAAG,WAAW,GAAG,CAAC;QAC7B,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,WAAW,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,WAAW,EAAE;QAClE,CAAC,CAAC,MAAM,CAAC;IACX,MAAM,QAAQ,GAAG,YAAY,KAAK,SAAS;QACzC,CAAC,CAAC,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC1C,CAAC,CAAC,IAAI,CAAC;IAET,OAAO,CACL,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,aACd,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,0CAAiB,EACxC,KAAC,IAAI,IAAC,QAAQ,+BAAW,EACzB,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,8BAAK,KAAK,IAAQ,EACpC,KAAC,IAAI,IAAC,QAAQ,+BAAW,EACzB,MAAC,IAAI,IAAC,KAAK,EAAC,SAAS,8BAAK,gBAAgB,IAAQ,EAClD,KAAC,IAAI,IAAC,QAAQ,0BAAW,EACzB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,SAAS,GAAQ,EACrC,KAAC,IAAI,IAAC,QAAQ,+BAAW,EACzB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,OAAO,GAAQ,EAClC,QAAQ,IAAI,CACX,8BACE,KAAC,IAAI,IAAC,QAAQ,+BAAW,EACzB,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,QAAQ,GAAQ,IACpC,CACJ,EACD,KAAC,IAAI,IAAC,QAAQ,+BAAW,EACzB,KAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,YAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,GAAQ,EACzE,KAAC,IAAI,IAAC,QAAQ,+BAAW,EACzB,MAAC,IAAI,IAAC,QAAQ,8BAAI,WAAW,IAAQ,IACjC,CACP,CAAC;AACJ,CAAC;AAED,yBAAyB;AACzB,SAAS,WAAW,CAAC,CAAS,EAAE,MAAc;IAC5C,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IAC7B,MAAM,SAAS,GAAG,GAAG,IAAI,MAAM,IAAI,EAAE,CAAC;IACtC,OAAO,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 授权卡片组件(§3.6 M2)。
|
|
3
|
+
*
|
|
4
|
+
* 当 agent 调用"有副作用"工具时,阻塞主输入,展示工具参数摘要,
|
|
5
|
+
* 让用户选择四挡决策:
|
|
6
|
+
* - y / Enter:once(仅本次)
|
|
7
|
+
* - s:session(本次 session 内)
|
|
8
|
+
* - l:always-local(本项目永久)
|
|
9
|
+
* - g:always-global(所有项目永久)
|
|
10
|
+
* - n:no(拒绝本次)
|
|
11
|
+
* - N:no-always(永久拒绝)
|
|
12
|
+
*
|
|
13
|
+
* ## 设计
|
|
14
|
+
*
|
|
15
|
+
* 纯展示组件,接收 request + onSubmit 回调。
|
|
16
|
+
* App 层负责把 ToolAuthorizer 的 requestAuthorization 桥接到本组件。
|
|
17
|
+
*/
|
|
18
|
+
import React from 'react';
|
|
19
|
+
import type { AuthorizationRequest, AuthorizationResult } from '@wukonglabs/wukong-agent-sdk';
|
|
20
|
+
export interface PermissionCardProps {
|
|
21
|
+
/** 授权请求 */
|
|
22
|
+
request: AuthorizationRequest;
|
|
23
|
+
/** 用户决策回调 */
|
|
24
|
+
onSubmit: (result: AuthorizationResult) => void;
|
|
25
|
+
}
|
|
26
|
+
export declare function PermissionCard({ request, onSubmit }: PermissionCardProps): React.ReactElement;
|
|
27
|
+
//# sourceMappingURL=permission-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-card.d.ts","sourceRoot":"","sources":["../../src/tui/permission-card.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAyB,MAAM,8BAA8B,CAAC;AAErH,MAAM,WAAW,mBAAmB;IAClC,WAAW;IACX,OAAO,EAAE,oBAAoB,CAAC;IAC9B,aAAa;IACb,QAAQ,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACjD;AAED,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,mBAAmB,GAAG,KAAK,CAAC,YAAY,CA+E7F"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* 授权卡片组件(§3.6 M2)。
|
|
4
|
+
*
|
|
5
|
+
* 当 agent 调用"有副作用"工具时,阻塞主输入,展示工具参数摘要,
|
|
6
|
+
* 让用户选择四挡决策:
|
|
7
|
+
* - y / Enter:once(仅本次)
|
|
8
|
+
* - s:session(本次 session 内)
|
|
9
|
+
* - l:always-local(本项目永久)
|
|
10
|
+
* - g:always-global(所有项目永久)
|
|
11
|
+
* - n:no(拒绝本次)
|
|
12
|
+
* - N:no-always(永久拒绝)
|
|
13
|
+
*
|
|
14
|
+
* ## 设计
|
|
15
|
+
*
|
|
16
|
+
* 纯展示组件,接收 request + onSubmit 回调。
|
|
17
|
+
* App 层负责把 ToolAuthorizer 的 requestAuthorization 桥接到本组件。
|
|
18
|
+
*/
|
|
19
|
+
import { useState } from 'react';
|
|
20
|
+
import { Box, Text, useInput } from 'ink';
|
|
21
|
+
export function PermissionCard({ request, onSubmit }) {
|
|
22
|
+
const [showFullArgs, setShowFullArgs] = useState(false);
|
|
23
|
+
useInput((input, key) => {
|
|
24
|
+
const c = input.toLowerCase();
|
|
25
|
+
let result = null;
|
|
26
|
+
switch (c) {
|
|
27
|
+
case 'y':
|
|
28
|
+
case '': // Enter(ink useInput 的 return 会被当成空字符串)
|
|
29
|
+
result = { approved: true, decision: 'once' };
|
|
30
|
+
break;
|
|
31
|
+
case 's':
|
|
32
|
+
result = { approved: true, decision: 'session' };
|
|
33
|
+
break;
|
|
34
|
+
case 'l':
|
|
35
|
+
result = { approved: true, decision: 'always-local' };
|
|
36
|
+
break;
|
|
37
|
+
case 'g':
|
|
38
|
+
result = { approved: true, decision: 'always-global' };
|
|
39
|
+
break;
|
|
40
|
+
case 'n':
|
|
41
|
+
result = { approved: false, decision: 'no' };
|
|
42
|
+
break;
|
|
43
|
+
case 'x': // 大写 N 不好按,用 x 代表 no-always
|
|
44
|
+
result = { approved: false, decision: 'no-always' };
|
|
45
|
+
break;
|
|
46
|
+
case 'v':
|
|
47
|
+
setShowFullArgs((v) => !v);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (key.return) {
|
|
51
|
+
result = { approved: true, decision: 'once' };
|
|
52
|
+
}
|
|
53
|
+
if (result) {
|
|
54
|
+
onSubmit(result);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
const argsPreview = formatArgsPreview(request.argumentsJson, showFullArgs ? undefined : 200);
|
|
58
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "yellow", bold: true, children: "\uD83D\uDD12 \u6388\u6743\u8BF7\u6C42" }), _jsxs(Text, { dimColor: true, children: [" (step ", request.step, ")"] })] }), _jsxs(Box, { children: [_jsx(Text, { bold: true, children: "\u5DE5\u5177: " }), _jsx(Text, { color: "cyan", children: request.toolName })] }), _jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "\u53C2\u6570:" }), _jsx(Text, { dimColor: true, children: argsPreview }), !showFullArgs && request.argumentsJson.length > 200 && (_jsx(Text, { dimColor: true, color: "gray", children: "(\u6309 v \u67E5\u770B\u5B8C\u6574\u53C2\u6570)" }))] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, children: "\u9009\u62E9: " }) }), _jsxs(Box, { children: [_jsx(Text, { color: "green", children: "[y]" }), _jsx(Text, { children: " \u4EC5\u672C\u6B21 " }), _jsx(Text, { color: "green", children: "[s]" }), _jsx(Text, { children: " \u672C\u6B21session " }), _jsx(Text, { color: "green", children: "[l]" }), _jsx(Text, { children: " \u672C\u9879\u76EE\u6C38\u4E45 " }), _jsx(Text, { color: "green", children: "[g]" }), _jsx(Text, { children: " \u5168\u5C40\u6C38\u4E45" })] }), _jsxs(Box, { children: [_jsx(Text, { color: "red", children: "[n]" }), _jsx(Text, { children: " \u62D2\u7EDD " }), _jsx(Text, { color: "red", children: "[x]" }), _jsx(Text, { children: " \u6C38\u4E45\u62D2\u7EDD " }), _jsx(Text, { dimColor: true, children: "[v] \u67E5\u770B\u53C2\u6570" })] })] }));
|
|
59
|
+
}
|
|
60
|
+
/** 格式化参数预览(截断到 maxLen) */
|
|
61
|
+
function formatArgsPreview(argsJson, maxLen) {
|
|
62
|
+
let formatted;
|
|
63
|
+
try {
|
|
64
|
+
const parsed = JSON.parse(argsJson);
|
|
65
|
+
formatted = JSON.stringify(parsed, null, 2);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
formatted = argsJson;
|
|
69
|
+
}
|
|
70
|
+
if (maxLen !== undefined && formatted.length > maxLen) {
|
|
71
|
+
return formatted.slice(0, maxLen) + '\n…(截断)';
|
|
72
|
+
}
|
|
73
|
+
return formatted;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=permission-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-card.js","sourceRoot":"","sources":["../../src/tui/permission-card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan panel —— 展示 todo 进度。
|
|
3
|
+
*
|
|
4
|
+
* ## 设计
|
|
5
|
+
*
|
|
6
|
+
* 本组件是**纯展示**组件,接收 todos 列表作为 props。
|
|
7
|
+
* 事件订阅(PlanUpdateEvent → todos 增删改)由 App 层负责,通过 `usePlanState` hook。
|
|
8
|
+
* 这样 PlanPanel 可独立测试,不依赖 EventBus 时序。
|
|
9
|
+
*
|
|
10
|
+
* ## 渲染
|
|
11
|
+
*
|
|
12
|
+
* ```
|
|
13
|
+
* ▶ Plan (3/5)
|
|
14
|
+
* ✓ 1. 分析项目结构
|
|
15
|
+
* ⏳ 2. 找出重复代码 ← 当前
|
|
16
|
+
* ○ 3. 重构工具函数
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
import React from 'react';
|
|
20
|
+
export interface TodoItem {
|
|
21
|
+
id: string;
|
|
22
|
+
content: string;
|
|
23
|
+
status: 'pending' | 'in_progress' | 'completed' | 'cancelled';
|
|
24
|
+
}
|
|
25
|
+
export interface PlanPanelProps {
|
|
26
|
+
todos: TodoItem[];
|
|
27
|
+
/** 最大可见行数(超出折叠);默认 10 */
|
|
28
|
+
maxVisible?: number;
|
|
29
|
+
}
|
|
30
|
+
export declare function PlanPanel({ todos, maxVisible }: PlanPanelProps): React.ReactElement | null;
|
|
31
|
+
//# sourceMappingURL=plan-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-panel.d.ts","sourceRoot":"","sources":["../../src/tui/plan-panel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;CAC/D;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,UAAe,EAAE,EAAE,cAAc,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAwB/F"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
export function PlanPanel({ todos, maxVisible = 10 }) {
|
|
4
|
+
if (todos.length === 0)
|
|
5
|
+
return null;
|
|
6
|
+
const completed = todos.filter((t) => t.status === 'completed').length;
|
|
7
|
+
const total = todos.length;
|
|
8
|
+
// 按顺序保留最近 N 个(避免长任务累积上百条 todo 撑爆 viewport)
|
|
9
|
+
// 策略:已完成的折叠到头部和尾部,进行中的可见(用户最关心的状态)
|
|
10
|
+
const visible = todos.slice(0, maxVisible);
|
|
11
|
+
const hidden = total - visible.length;
|
|
12
|
+
return (_jsxs(Box, { flexDirection: "column", marginY: 0, children: [_jsxs(Text, { color: "cyan", bold: true, children: ["\u25B6 Plan (", completed, "/", total, ")"] }), visible.map((t, i) => (_jsx(TodoRow, { index: i + 1, todo: t }, t.id))), hidden > 0 && (_jsxs(Text, { dimColor: true, children: [" \u2026 \u8FD8\u6709 ", hidden, " \u4E2A todo(\u5DF2\u6298\u53E0)"] }))] }));
|
|
13
|
+
}
|
|
14
|
+
function TodoRow({ index, todo }) {
|
|
15
|
+
const { icon, color } = statusIcon(todo.status);
|
|
16
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: color, children: icon }), _jsxs(Text, { dimColor: true, children: [" ", index, ". "] }), _jsxs(Text, { color: color === 'gray' ? undefined : color, children: [todo.content, todo.status === 'in_progress' ? ' ← 当前' : ''] })] }));
|
|
17
|
+
}
|
|
18
|
+
function statusIcon(status) {
|
|
19
|
+
switch (status) {
|
|
20
|
+
case 'completed':
|
|
21
|
+
return { icon: '✓', color: 'green' };
|
|
22
|
+
case 'in_progress':
|
|
23
|
+
return { icon: '⏳', color: 'yellow' };
|
|
24
|
+
case 'cancelled':
|
|
25
|
+
return { icon: '✗', color: 'red' };
|
|
26
|
+
default:
|
|
27
|
+
return { icon: '○', color: 'gray' };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=plan-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-panel.js","sourceRoot":"","sources":["../../src/tui/plan-panel.tsx"],"names":[],"mappings":";AAmBA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAchC,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,EAAE,EAAkB;IAClE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAE3B,2CAA2C;IAC3C,mCAAmC;IACnC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAEtC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,oCACZ,SAAS,OAAG,KAAK,SACrB,EACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACrB,KAAC,OAAO,IAAY,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,IAA3B,CAAC,CAAC,EAAE,CAA2B,CAC9C,CAAC,EACD,MAAM,GAAG,CAAC,IAAI,CACb,MAAC,IAAI,IAAC,QAAQ,6CAAS,MAAM,wCAAoB,CAClD,IACG,CACP,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAqC;IACjE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,IAAI,GAAQ,EACjC,MAAC,IAAI,IAAC,QAAQ,wBAAG,KAAK,UAAU,EAChC,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,aAC9C,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IACxC,IACH,CACP,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,MAA0B;IAC5C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACvC,KAAK,aAAa;YAChB,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACxC,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACrC;YACE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response panel —— 流式渲染 agent 响应。
|
|
3
|
+
*
|
|
4
|
+
* ## 数据源
|
|
5
|
+
*
|
|
6
|
+
* App 层订阅 EventBus 的 `tool_call_start/end` / `step_start/end` / `cache_stat`
|
|
7
|
+
* 等事件,以及 LLM 流式的 `content_delta`(通过 onStream 回调,因为 content_delta
|
|
8
|
+
* 还没进 EventBus —— 它属于 LLM 流式层,与 EventBus 的语义层级不同)。
|
|
9
|
+
*
|
|
10
|
+
* 为了 M1 范围可控,本组件只渲染:
|
|
11
|
+
* - 当前正在生成的响应文本(流式)
|
|
12
|
+
* - 最近一次完成的响应(带步骤/Token 统计)
|
|
13
|
+
* - 进行中的 tool call 摘要(状态 + 耗时)
|
|
14
|
+
*
|
|
15
|
+
* 完整的 Tool cards / Plan panel 留到 M3-M5。
|
|
16
|
+
*/
|
|
17
|
+
import React from 'react';
|
|
18
|
+
export interface ToolCallState {
|
|
19
|
+
toolCallId: string;
|
|
20
|
+
name: string;
|
|
21
|
+
step: number;
|
|
22
|
+
startedAt: number;
|
|
23
|
+
endedAt?: number;
|
|
24
|
+
success?: boolean;
|
|
25
|
+
resultPreview?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface CompletedRun {
|
|
28
|
+
response: string;
|
|
29
|
+
steps: number;
|
|
30
|
+
totalTokens: {
|
|
31
|
+
prompt: number;
|
|
32
|
+
completion: number;
|
|
33
|
+
};
|
|
34
|
+
durationMs: number;
|
|
35
|
+
}
|
|
36
|
+
export interface ResponsePanelProps {
|
|
37
|
+
/** 正在流式输出的文本(content_delta 累积) */
|
|
38
|
+
streamingText: string;
|
|
39
|
+
/** 流式是否正在进行 */
|
|
40
|
+
streaming: boolean;
|
|
41
|
+
/** 当前活跃的 tool call(tool_call_start 后、tool_call_end 前) */
|
|
42
|
+
activeTools: ToolCallState[];
|
|
43
|
+
/** 最近一次完成的 run(用于展示历史响应) */
|
|
44
|
+
lastCompleted?: CompletedRun;
|
|
45
|
+
/** 错误信息(若有) */
|
|
46
|
+
error?: string;
|
|
47
|
+
}
|
|
48
|
+
export declare function ResponsePanel({ streamingText, streaming, activeTools, lastCompleted, error, }: ResponsePanelProps): React.ReactElement;
|
|
49
|
+
//# sourceMappingURL=response-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-panel.d.ts","sourceRoot":"","sources":["../../src/tui/response-panel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,4BAA4B;IAC5B,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,eAAe;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,aAAa,CAAC,EAC5B,aAAa,EACb,SAAS,EACT,WAAW,EACX,aAAa,EACb,KAAK,GACN,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CA+CzC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Text, Box } from 'ink';
|
|
3
|
+
export function ResponsePanel({ streamingText, streaming, activeTools, lastCompleted, error, }) {
|
|
4
|
+
const chars = streamingText.length;
|
|
5
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [error && (_jsx(Box, { marginBottom: error ? 1 : 0, children: _jsxs(Text, { color: "red", bold: true, children: ["\u274C ", error] }) })), streaming && (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: "\u231B \u6B63\u5728\u751F\u6210\u54CD\u5E94\u2026 " }), _jsxs(Text, { dimColor: true, children: ["(", chars, " \u5B57\u7B26,\u5B8C\u6210\u540E\u5C55\u793A\u5B8C\u6574\u5185\u5BB9)"] })] })), activeTools.length > 0 && (_jsx(Box, { flexDirection: "column", marginY: streaming ? 1 : 0, children: activeTools.map((t) => (_jsx(ToolCallRow, { tool: t }, t.toolCallId))) })), !streaming && lastCompleted && (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: "\u2713 " }), _jsxs(Text, { dimColor: true, children: ["\u672C\u8F6E\u54CD\u5E94\u5DF2\u5B8C\u6210(\u6B63\u6587\u89C1\u4E0A\u65B9,\u5171 ", lastCompleted.response.length, " \u5B57\u7B26, \u6B65\u9AA4 ", lastCompleted.steps, ", \u8017\u65F6 ", (lastCompleted.durationMs / 1000).toFixed(1), "s)"] })] }))] }));
|
|
6
|
+
}
|
|
7
|
+
function ToolCallRow({ tool }) {
|
|
8
|
+
const now = Date.now();
|
|
9
|
+
const elapsed = ((tool.endedAt ?? now) - tool.startedAt) / 1000;
|
|
10
|
+
const icon = tool.success === undefined ? '⏳' : tool.success ? '✓' : '✗';
|
|
11
|
+
const color = tool.success === undefined ? 'yellow' : tool.success ? 'green' : 'red';
|
|
12
|
+
return (_jsxs(Text, { children: [_jsx(Text, { color: color, children: icon }), _jsxs(Text, { dimColor: true, children: [" \u26A1 ", tool.name] }), _jsxs(Text, { dimColor: true, children: [" [", elapsed.toFixed(2), "s]"] }), tool.resultPreview && (_jsxs(Text, { dimColor: true, children: [" ", tool.resultPreview.slice(0, 80)] }))] }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=response-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-panel.js","sourceRoot":"","sources":["../../src/tui/response-panel.tsx"],"names":[],"mappings":";AAiBA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAgChC,MAAM,UAAU,aAAa,CAAC,EAC5B,aAAa,EACb,SAAS,EACT,WAAW,EACX,aAAa,EACb,KAAK,GACc;IACnB,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC;IACnC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,aAEpC,KAAK,IAAI,CACR,KAAC,GAAG,IAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAC9B,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,8BAAI,KAAK,IAAQ,GACnC,CACP,EAOA,SAAS,IAAI,CACZ,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,mEAAkB,EACpC,MAAC,IAAI,IAAC,QAAQ,wBAAG,KAAK,6EAAsB,IACxC,CACP,EAGA,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CACzB,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YACnD,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACtB,KAAC,WAAW,IAAoB,IAAI,EAAE,CAAC,IAArB,CAAC,CAAC,UAAU,CAAa,CAC5C,CAAC,GACE,CACP,EAOA,CAAC,SAAS,IAAI,aAAa,IAAI,CAC9B,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,wBAAU,EAC7B,MAAC,IAAI,IAAC,QAAQ,wGACK,aAAa,CAAC,QAAQ,CAAC,MAAM,kCAAU,aAAa,CAAC,KAAK,qBAAO,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UACzH,IACH,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,IAAI,EAA2B;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACrF,OAAO,CACL,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,IAAI,GAAQ,EACjC,MAAC,IAAI,IAAC,QAAQ,+BAAK,IAAI,CAAC,IAAI,IAAQ,EACpC,MAAC,IAAI,IAAC,QAAQ,yBAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAC7C,IAAI,CAAC,aAAa,IAAI,CACrB,MAAC,IAAI,IAAC,QAAQ,wBAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAQ,CACzD,IACI,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AppHandlers, SinkRef } from './app.js';
|
|
2
|
+
export interface InkRunOptions {
|
|
3
|
+
model: string;
|
|
4
|
+
sessionUuidShort: string;
|
|
5
|
+
workspaceRoot: string;
|
|
6
|
+
handlers: AppHandlers;
|
|
7
|
+
initialHistory?: string[];
|
|
8
|
+
/**
|
|
9
|
+
* 外部提供的 stream sink ref:调用方(runInteractiveTui)先创建,
|
|
10
|
+
* 用于把 agent 的 onStream 事件转发给 Ink。runInk 只负责把 ref 挂到 App 上。
|
|
11
|
+
*/
|
|
12
|
+
streamSinkRef: SinkRef;
|
|
13
|
+
}
|
|
14
|
+
export interface InkRunHandle {
|
|
15
|
+
/** 卸载 Ink 实例(退出时调用) */
|
|
16
|
+
unmount: () => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 启动 Ink TUI。onStream 由调用方通过 streamSinkRef 桥接,不再由此处返回。
|
|
20
|
+
*/
|
|
21
|
+
export declare function runInk(opts: InkRunOptions): InkRunHandle;
|
|
22
|
+
//# sourceMappingURL=run-ink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-ink.d.ts","sourceRoot":"","sources":["../../src/tui/run-ink.tsx"],"names":[],"mappings":"AASA,OAAO,EAAO,WAAW,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,WAAW,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CAexD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* 启动 Ink TUI 的入口。
|
|
4
|
+
*
|
|
5
|
+
* 由 `runInteractiveTui` 调用。为了让 `initAgent` 能在 Ink 启动**之前**完成
|
|
6
|
+
* (避免 skills 加载日志把 Ink 记住的光标位置推乱),onStream 走一个外部
|
|
7
|
+
* `streamSinkRef`——初始化时是 null,Ink render 完成后由 App 把真正的
|
|
8
|
+
* sink 挂上去,之前的 stream 事件被静默丢弃(此时 agent 还没跑,不会有事件)。
|
|
9
|
+
*/
|
|
10
|
+
import { render } from 'ink';
|
|
11
|
+
import { App } from './app.js';
|
|
12
|
+
/**
|
|
13
|
+
* 启动 Ink TUI。onStream 由调用方通过 streamSinkRef 桥接,不再由此处返回。
|
|
14
|
+
*/
|
|
15
|
+
export function runInk(opts) {
|
|
16
|
+
const inkInstance = render(_jsx(App, { model: opts.model, sessionUuidShort: opts.sessionUuidShort, workspaceRoot: opts.workspaceRoot, handlers: opts.handlers, initialHistory: opts.initialHistory, streamSinkRef: opts.streamSinkRef }));
|
|
17
|
+
return {
|
|
18
|
+
unmount: () => inkInstance.unmount(),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=run-ink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-ink.js","sourceRoot":"","sources":["../../src/tui/run-ink.tsx"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAwB,MAAM,UAAU,CAAC;AAoBrD;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,IAAmB;IACxC,MAAM,WAAW,GAAG,MAAM,CACxB,KAAC,GAAG,IACF,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EACvC,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,cAAc,EAAE,IAAI,CAAC,cAAc,EACnC,aAAa,EAAE,IAAI,CAAC,aAAa,GACjC,CACH,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE;KACrC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI 降级矩阵判定(§3.1 M1 红线)。
|
|
3
|
+
*
|
|
4
|
+
* 判定规则(任一为真 → 降级到 readline):
|
|
5
|
+
* - `WUKONG_TUI=off` 显式关闭(feature flag 出口,灰度期必备)
|
|
6
|
+
* - `CI=true` 环境变量(CI 模式不该有 UI)
|
|
7
|
+
* - stdin 或 stdout 非 TTY(pipe/重定向)
|
|
8
|
+
* - `TERM=dumb`(SSH pipe / 朴素终端)
|
|
9
|
+
*
|
|
10
|
+
* `NO_COLOR=1` 不触发降级(Ink 自身会关颜色,但保留 UI 结构)。
|
|
11
|
+
*/
|
|
12
|
+
export interface TuiEnvironment {
|
|
13
|
+
env: NodeJS.ProcessEnv;
|
|
14
|
+
stdinIsTTY: boolean;
|
|
15
|
+
stdoutIsTTY: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 返回 true 表示应该启用 Ink TUI;false 表示降级到 readline。
|
|
19
|
+
*/
|
|
20
|
+
export declare function shouldUseTui(env: TuiEnvironment): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* 便于在测试中直接用 process 构造环境。
|
|
23
|
+
*/
|
|
24
|
+
export declare function shouldUseTuiFromProcess(): boolean;
|
|
25
|
+
//# sourceMappingURL=should-use-tui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"should-use-tui.d.ts","sourceRoot":"","sources":["../../src/tui/should-use-tui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAczD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAMjD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 返回 true 表示应该启用 Ink TUI;false 表示降级到 readline。
|
|
3
|
+
*/
|
|
4
|
+
export function shouldUseTui(env) {
|
|
5
|
+
// 1. 显式 feature flag 出口
|
|
6
|
+
if (env.env.WUKONG_TUI === 'off')
|
|
7
|
+
return false;
|
|
8
|
+
// 2. CI 模式
|
|
9
|
+
if (env.env.CI === 'true')
|
|
10
|
+
return false;
|
|
11
|
+
// 3. 非 TTY(pipe / 重定向 / 嵌入式调用)
|
|
12
|
+
if (!env.stdinIsTTY || !env.stdoutIsTTY)
|
|
13
|
+
return false;
|
|
14
|
+
// 4. TERM=dumb
|
|
15
|
+
if (env.env.TERM === 'dumb')
|
|
16
|
+
return false;
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 便于在测试中直接用 process 构造环境。
|
|
21
|
+
*/
|
|
22
|
+
export function shouldUseTuiFromProcess() {
|
|
23
|
+
return shouldUseTui({
|
|
24
|
+
env: process.env,
|
|
25
|
+
stdinIsTTY: process.stdin.isTTY === true,
|
|
26
|
+
stdoutIsTTY: process.stdout.isTTY === true,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=should-use-tui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"should-use-tui.js","sourceRoot":"","sources":["../../src/tui/should-use-tui.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAmB;IAC9C,wBAAwB;IACxB,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAE/C,WAAW;IACX,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAExC,+BAA+B;IAC/B,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAEtD,eAAe;IACf,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAE1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB;IACrC,OAAO,YAAY,CAAC;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI;QACxC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI;KAC3C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 多行文本输入组件(自研,Ink 自带 ink-text-input 不支持多行 + Ctrl+R)。
|
|
3
|
+
*
|
|
4
|
+
* ## 交互
|
|
5
|
+
*
|
|
6
|
+
* - **Enter**:提交(若 `multiline` 为 false,任何 Enter 都提交)
|
|
7
|
+
* - **Shift+Enter / Alt+Enter**:换行(仅 multiline=true 时)
|
|
8
|
+
* - **Ctrl+J**:换行(终端友好,Ctrl+J = LF)
|
|
9
|
+
* - **↑ / ↓**(单行时):浏览历史
|
|
10
|
+
* - **↑ / ↓**(多行时):移动光标到上/下一行
|
|
11
|
+
* - **Ctrl+R**:进入反查模式;再按跳下一条匹配;Enter 提交当前匹配;Esc 退出
|
|
12
|
+
* - **Ctrl+C**:清理后退出(由 App 层接管 graceful shutdown)
|
|
13
|
+
* - **Ctrl+L**:清屏(Ink 原生 clear)
|
|
14
|
+
*
|
|
15
|
+
* ## 粘贴检测
|
|
16
|
+
*
|
|
17
|
+
* Ink 没有原生 paste 事件。通过监听 `stdin` 的 data chunk,当一次 chunk 中
|
|
18
|
+
* 含多个字符(特别是含换行)时,判定为粘贴,直接整体插入(不走逐字符 input)。
|
|
19
|
+
* 这避免了粘贴中文/长文本时每个字符都触发一次 re-render 的性能问题。
|
|
20
|
+
*
|
|
21
|
+
* ## 可访问性
|
|
22
|
+
*
|
|
23
|
+
* `multiline` 模式下不依赖光标可视化(终端光标控制在不同终端差异大),
|
|
24
|
+
* 用 `▋` 字符标记光标位置;`NO_COLOR` 时仍可见。
|
|
25
|
+
*/
|
|
26
|
+
import React from 'react';
|
|
27
|
+
import { useInputHistory } from './use-input-history.js';
|
|
28
|
+
export interface TextInputProps {
|
|
29
|
+
/** 当前值(受控) */
|
|
30
|
+
value: string;
|
|
31
|
+
/** 值变更回调 */
|
|
32
|
+
onChange: (value: string) => void;
|
|
33
|
+
/** 提交回调(Enter) */
|
|
34
|
+
onSubmit: (value: string) => void;
|
|
35
|
+
/** 是否启用多行(默认 true) */
|
|
36
|
+
multiline?: boolean;
|
|
37
|
+
/** 输入历史 hook(可选) */
|
|
38
|
+
history?: ReturnType<typeof useInputHistory>;
|
|
39
|
+
/** 提示符前缀(默认 "> ") */
|
|
40
|
+
prompt?: string;
|
|
41
|
+
/** placeholder(空输入时显示) */
|
|
42
|
+
placeholder?: string;
|
|
43
|
+
/** 是否禁用(等待 agent 响应时) */
|
|
44
|
+
disabled?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Ctrl+C 回调(§3.3 M3):由 App 层实现两次 Ctrl+C 语义。
|
|
47
|
+
* Ink raw mode 拦截 Ctrl+C,不走 process SIGINT,故需显式回调。
|
|
48
|
+
*/
|
|
49
|
+
onAbort?: () => void;
|
|
50
|
+
}
|
|
51
|
+
export declare function TextInput({ value, onChange, onSubmit, multiline, history, prompt, placeholder, disabled, onAbort, }: TextInputProps): React.ReactElement;
|
|
52
|
+
/**
|
|
53
|
+
* 多字符输入是否为粘贴(纯函数,便于单测)。
|
|
54
|
+
*
|
|
55
|
+
* Ink useInput 把整段 stdin chunk 作为单次 input 传入。
|
|
56
|
+
* 视为粘贴的特征:含换行(多行粘贴)或长度 >= 5(普通打字不可能一次到 5 字符)。
|
|
57
|
+
* 短输入(2-4 字符无换行)可能是 IME 选词 / 快速连击,都按"整体插入"处理
|
|
58
|
+
* (不再逐字符,以避免 useCallback 闭包陷阱导致多字符只保留最后一个)。
|
|
59
|
+
*/
|
|
60
|
+
export declare function isPasteInput(input: string): boolean;
|
|
61
|
+
//# sourceMappingURL=text-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-input.d.ts","sourceRoot":"","sources":["../../src/tui/text-input.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EACL,eAAe,EAGhB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,cAAc;IAC7B,cAAc;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY;IACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kBAAkB;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sBAAsB;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oBAAoB;IACpB,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;IAC7C,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAeD,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,SAAgB,EAChB,OAAO,EACP,MAAa,EACb,WAAgB,EAChB,QAAgB,EAChB,OAAO,GACR,EAAE,cAAc,GAAG,KAAK,CAAC,YAAY,CAwQrC;AAiBD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGnD"}
|