@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.
Files changed (65) hide show
  1. package/dist/cli/exit-codes.js +12 -16
  2. package/dist/cli/exit-codes.js.map +1 -1
  3. package/dist/cli/help.js +4 -8
  4. package/dist/cli/help.js.map +1 -1
  5. package/dist/cli/session-commands.js +1 -4
  6. package/dist/cli/session-commands.js.map +1 -1
  7. package/dist/cli/summary.js +2 -6
  8. package/dist/cli/summary.js.map +1 -1
  9. package/dist/cli/workspace-commands.js +1 -4
  10. package/dist/cli/workspace-commands.js.map +1 -1
  11. package/dist/index.js +373 -121
  12. package/dist/index.js.map +1 -1
  13. package/dist/sigint-handler.d.ts +62 -0
  14. package/dist/sigint-handler.d.ts.map +1 -0
  15. package/dist/sigint-handler.js +62 -0
  16. package/dist/sigint-handler.js.map +1 -0
  17. package/dist/tui/app.d.ts +57 -0
  18. package/dist/tui/app.d.ts.map +1 -0
  19. package/dist/tui/app.js +268 -0
  20. package/dist/tui/app.js.map +1 -0
  21. package/dist/tui/header.d.ts +24 -0
  22. package/dist/tui/header.d.ts.map +1 -0
  23. package/dist/tui/header.js +26 -0
  24. package/dist/tui/header.js.map +1 -0
  25. package/dist/tui/permission-card.d.ts +27 -0
  26. package/dist/tui/permission-card.d.ts.map +1 -0
  27. package/dist/tui/permission-card.js +75 -0
  28. package/dist/tui/permission-card.js.map +1 -0
  29. package/dist/tui/plan-panel.d.ts +31 -0
  30. package/dist/tui/plan-panel.d.ts.map +1 -0
  31. package/dist/tui/plan-panel.js +30 -0
  32. package/dist/tui/plan-panel.js.map +1 -0
  33. package/dist/tui/response-panel.d.ts +49 -0
  34. package/dist/tui/response-panel.d.ts.map +1 -0
  35. package/dist/tui/response-panel.js +14 -0
  36. package/dist/tui/response-panel.js.map +1 -0
  37. package/dist/tui/run-ink.d.ts +22 -0
  38. package/dist/tui/run-ink.d.ts.map +1 -0
  39. package/dist/tui/run-ink.js +21 -0
  40. package/dist/tui/run-ink.js.map +1 -0
  41. package/dist/tui/should-use-tui.d.ts +25 -0
  42. package/dist/tui/should-use-tui.d.ts.map +1 -0
  43. package/dist/tui/should-use-tui.js +29 -0
  44. package/dist/tui/should-use-tui.js.map +1 -0
  45. package/dist/tui/text-input.d.ts +61 -0
  46. package/dist/tui/text-input.d.ts.map +1 -0
  47. package/dist/tui/text-input.js +318 -0
  48. package/dist/tui/text-input.js.map +1 -0
  49. package/dist/tui/thinking-panel.d.ts +32 -0
  50. package/dist/tui/thinking-panel.d.ts.map +1 -0
  51. package/dist/tui/thinking-panel.js +14 -0
  52. package/dist/tui/thinking-panel.js.map +1 -0
  53. package/dist/tui/tool-cards.d.ts +30 -0
  54. package/dist/tui/tool-cards.d.ts.map +1 -0
  55. package/dist/tui/tool-cards.js +37 -0
  56. package/dist/tui/tool-cards.js.map +1 -0
  57. package/dist/tui/use-input-history.d.ts +40 -0
  58. package/dist/tui/use-input-history.d.ts.map +1 -0
  59. package/dist/tui/use-input-history.js +123 -0
  60. package/dist/tui/use-input-history.js.map +1 -0
  61. package/dist/tui/use-plan-state.d.ts +4 -0
  62. package/dist/tui/use-plan-state.d.ts.map +1 -0
  63. package/dist/tui/use-plan-state.js +77 -0
  64. package/dist/tui/use-plan-state.js.map +1 -0
  65. 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"}