wave-code 0.6.1 → 0.6.2
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/components/App.d.ts.map +1 -1
- package/dist/components/App.js +14 -12
- package/dist/components/ChatInterface.d.ts.map +1 -1
- package/dist/components/ChatInterface.js +2 -1
- package/dist/components/CommandOutputDisplay.d.ts.map +1 -1
- package/dist/components/CommandOutputDisplay.js +6 -17
- package/dist/components/CommandSelector.d.ts.map +1 -1
- package/dist/components/CommandSelector.js +6 -0
- package/dist/components/ConfirmationSelector.d.ts.map +1 -1
- package/dist/components/ConfirmationSelector.js +1 -1
- package/dist/components/DiffDisplay.d.ts.map +1 -1
- package/dist/components/DiffDisplay.js +4 -0
- package/dist/components/HelpView.d.ts +6 -0
- package/dist/components/HelpView.d.ts.map +1 -0
- package/dist/components/HelpView.js +24 -0
- package/dist/components/InputBox.d.ts +1 -1
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +10 -3
- package/dist/components/LoadingIndicator.js +1 -1
- package/dist/components/MessageItem.d.ts +1 -1
- package/dist/components/MessageItem.d.ts.map +1 -1
- package/dist/components/MessageItem.js +3 -4
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +24 -7
- package/dist/components/RewindCommand.js +1 -1
- package/dist/components/TaskList.d.ts.map +1 -1
- package/dist/components/TaskList.js +4 -13
- package/dist/components/ToolDisplay.d.ts +9 -0
- package/dist/components/ToolDisplay.d.ts.map +1 -0
- package/dist/components/ToolDisplay.js +44 -0
- package/dist/contexts/useChat.d.ts.map +1 -1
- package/dist/contexts/useChat.js +15 -1
- package/dist/hooks/useInputManager.d.ts +2 -2
- package/dist/hooks/useInputManager.d.ts.map +1 -1
- package/dist/hooks/useInputManager.js +12 -8
- package/dist/managers/InputManager.d.ts +4 -2
- package/dist/managers/InputManager.d.ts.map +1 -1
- package/dist/managers/InputManager.js +17 -17
- package/dist/print-cli.d.ts.map +1 -1
- package/dist/print-cli.js +11 -30
- package/package.json +2 -2
- package/src/components/App.tsx +16 -15
- package/src/components/ChatInterface.tsx +3 -2
- package/src/components/CommandOutputDisplay.tsx +16 -38
- package/src/components/CommandSelector.tsx +6 -0
- package/src/components/ConfirmationSelector.tsx +5 -9
- package/src/components/DiffDisplay.tsx +9 -0
- package/src/components/HelpView.tsx +59 -0
- package/src/components/InputBox.tsx +43 -33
- package/src/components/LoadingIndicator.tsx +1 -1
- package/src/components/MessageItem.tsx +12 -21
- package/src/components/MessageList.tsx +40 -17
- package/src/components/RewindCommand.tsx +1 -1
- package/src/components/TaskList.tsx +4 -16
- package/src/components/{ToolResultDisplay.tsx → ToolDisplay.tsx} +6 -16
- package/src/contexts/useChat.tsx +16 -1
- package/src/hooks/useInputManager.ts +12 -10
- package/src/managers/InputManager.ts +19 -21
- package/src/print-cli.ts +17 -35
- package/dist/components/SubagentBlock.d.ts +0 -8
- package/dist/components/SubagentBlock.d.ts.map +0 -1
- package/dist/components/SubagentBlock.js +0 -73
- package/dist/components/ToolResultDisplay.d.ts +0 -9
- package/dist/components/ToolResultDisplay.d.ts.map +0 -1
- package/dist/components/ToolResultDisplay.js +0 -54
- package/src/components/SubagentBlock.tsx +0 -152
|
@@ -25,6 +25,7 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
25
25
|
const [showBackgroundTaskManager, setShowBackgroundTaskManager] = useState(false);
|
|
26
26
|
const [showMcpManager, setShowMcpManager] = useState(false);
|
|
27
27
|
const [showRewindManager, setShowRewindManager] = useState(false);
|
|
28
|
+
const [showHelp, setShowHelp] = useState(false);
|
|
28
29
|
const [permissionMode, setPermissionModeState] = useState("default");
|
|
29
30
|
const [attachedImages, setAttachedImages] = useState([]);
|
|
30
31
|
// Create InputManager on mount and update callbacks when they change
|
|
@@ -53,6 +54,9 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
53
54
|
onRewindManagerStateChange: (show) => {
|
|
54
55
|
setShowRewindManager(show);
|
|
55
56
|
},
|
|
57
|
+
onHelpStateChange: (show) => {
|
|
58
|
+
setShowHelp(show);
|
|
59
|
+
},
|
|
56
60
|
onPermissionModeChange: (mode) => {
|
|
57
61
|
setPermissionModeState(mode);
|
|
58
62
|
callbacks.onPermissionModeChange?.(mode);
|
|
@@ -87,6 +91,9 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
87
91
|
onRewindManagerStateChange: (show) => {
|
|
88
92
|
setShowRewindManager(show);
|
|
89
93
|
},
|
|
94
|
+
onHelpStateChange: (show) => {
|
|
95
|
+
setShowHelp(show);
|
|
96
|
+
},
|
|
90
97
|
onPermissionModeChange: (mode) => {
|
|
91
98
|
setPermissionModeState(mode);
|
|
92
99
|
callbacks.onPermissionModeChange?.(mode);
|
|
@@ -120,12 +127,6 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
120
127
|
const moveCursorRight = useCallback(() => {
|
|
121
128
|
managerRef.current?.moveCursorRight();
|
|
122
129
|
}, []);
|
|
123
|
-
const moveCursorToStart = useCallback(() => {
|
|
124
|
-
managerRef.current?.moveCursorToStart();
|
|
125
|
-
}, []);
|
|
126
|
-
const moveCursorToEnd = useCallback(() => {
|
|
127
|
-
managerRef.current?.moveCursorToEnd();
|
|
128
|
-
}, []);
|
|
129
130
|
// File selector methods
|
|
130
131
|
const activateFileSelector = useCallback((position) => {
|
|
131
132
|
managerRef.current?.activateFileSelector(position);
|
|
@@ -205,6 +206,7 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
205
206
|
showBackgroundTaskManager,
|
|
206
207
|
showMcpManager,
|
|
207
208
|
showRewindManager,
|
|
209
|
+
showHelp,
|
|
208
210
|
permissionMode,
|
|
209
211
|
attachedImages,
|
|
210
212
|
isManagerReady,
|
|
@@ -214,8 +216,6 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
214
216
|
clearInput,
|
|
215
217
|
moveCursorLeft,
|
|
216
218
|
moveCursorRight,
|
|
217
|
-
moveCursorToStart,
|
|
218
|
-
moveCursorToEnd,
|
|
219
219
|
// File selector
|
|
220
220
|
activateFileSelector,
|
|
221
221
|
handleFileSelect,
|
|
@@ -245,6 +245,10 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
245
245
|
managerRef.current?.setShowRewindManager(show);
|
|
246
246
|
setShowRewindManager(show);
|
|
247
247
|
}, []),
|
|
248
|
+
setShowHelp: useCallback((show) => {
|
|
249
|
+
managerRef.current?.setShowHelp(show);
|
|
250
|
+
setShowHelp(show);
|
|
251
|
+
}, []),
|
|
248
252
|
setPermissionMode: useCallback((mode) => {
|
|
249
253
|
setPermissionModeState(mode);
|
|
250
254
|
managerRef.current?.setPermissionMode(mode);
|
|
@@ -15,6 +15,7 @@ export interface InputManagerCallbacks {
|
|
|
15
15
|
onBackgroundTaskManagerStateChange?: (show: boolean) => void;
|
|
16
16
|
onMcpManagerStateChange?: (show: boolean) => void;
|
|
17
17
|
onRewindManagerStateChange?: (show: boolean) => void;
|
|
18
|
+
onHelpStateChange?: (show: boolean) => void;
|
|
18
19
|
onImagesStateChange?: (images: AttachedImage[]) => void;
|
|
19
20
|
onSendMessage?: (content: string, images?: Array<{
|
|
20
21
|
path: string;
|
|
@@ -51,6 +52,7 @@ export declare class InputManager {
|
|
|
51
52
|
private showBackgroundTaskManager;
|
|
52
53
|
private showMcpManager;
|
|
53
54
|
private showRewindManager;
|
|
55
|
+
private showHelp;
|
|
54
56
|
private permissionMode;
|
|
55
57
|
private selectorJustUsed;
|
|
56
58
|
private callbacks;
|
|
@@ -66,8 +68,6 @@ export declare class InputManager {
|
|
|
66
68
|
clearInput(): void;
|
|
67
69
|
moveCursorLeft(): void;
|
|
68
70
|
moveCursorRight(): void;
|
|
69
|
-
moveCursorToStart(): void;
|
|
70
|
-
moveCursorToEnd(): void;
|
|
71
71
|
private searchFiles;
|
|
72
72
|
private debouncedSearchFiles;
|
|
73
73
|
activateFileSelector(position: number): void;
|
|
@@ -120,6 +120,8 @@ export declare class InputManager {
|
|
|
120
120
|
setShowMcpManager(show: boolean): void;
|
|
121
121
|
getShowRewindManager(): boolean;
|
|
122
122
|
setShowRewindManager(show: boolean): void;
|
|
123
|
+
getShowHelp(): boolean;
|
|
124
|
+
setShowHelp(show: boolean): void;
|
|
123
125
|
getPermissionMode(): PermissionMode;
|
|
124
126
|
setPermissionMode(mode: PermissionMode): void;
|
|
125
127
|
cyclePermissionMode(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputManager.d.ts","sourceRoot":"","sources":["../../src/managers/InputManager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"InputManager.d.ts","sourceRoot":"","sources":["../../src/managers/InputManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,7 @@ export class InputManager {
|
|
|
33
33
|
this.showBackgroundTaskManager = false;
|
|
34
34
|
this.showMcpManager = false;
|
|
35
35
|
this.showRewindManager = false;
|
|
36
|
+
this.showHelp = false;
|
|
36
37
|
// Permission mode state
|
|
37
38
|
this.permissionMode = "default";
|
|
38
39
|
// Flag to prevent handleInput conflicts when selector selection occurs
|
|
@@ -98,12 +99,6 @@ export class InputManager {
|
|
|
98
99
|
moveCursorRight() {
|
|
99
100
|
this.setCursorPosition(this.cursorPosition + 1);
|
|
100
101
|
}
|
|
101
|
-
moveCursorToStart() {
|
|
102
|
-
this.setCursorPosition(0);
|
|
103
|
-
}
|
|
104
|
-
moveCursorToEnd() {
|
|
105
|
-
this.setCursorPosition(this.inputText.length);
|
|
106
|
-
}
|
|
107
102
|
// File selector methods
|
|
108
103
|
async searchFiles(query) {
|
|
109
104
|
try {
|
|
@@ -225,6 +220,10 @@ export class InputManager {
|
|
|
225
220
|
this.setShowRewindManager(true);
|
|
226
221
|
commandExecuted = true;
|
|
227
222
|
}
|
|
223
|
+
else if (command === "help") {
|
|
224
|
+
this.setShowHelp(true);
|
|
225
|
+
commandExecuted = true;
|
|
226
|
+
}
|
|
228
227
|
}
|
|
229
228
|
})();
|
|
230
229
|
this.handleCancelCommandSelect();
|
|
@@ -467,6 +466,13 @@ export class InputManager {
|
|
|
467
466
|
this.showRewindManager = show;
|
|
468
467
|
this.callbacks.onRewindManagerStateChange?.(show);
|
|
469
468
|
}
|
|
469
|
+
getShowHelp() {
|
|
470
|
+
return this.showHelp;
|
|
471
|
+
}
|
|
472
|
+
setShowHelp(show) {
|
|
473
|
+
this.showHelp = show;
|
|
474
|
+
this.callbacks.onHelpStateChange?.(show);
|
|
475
|
+
}
|
|
470
476
|
// Permission mode methods
|
|
471
477
|
getPermissionMode() {
|
|
472
478
|
return this.permissionMode;
|
|
@@ -614,14 +620,6 @@ export class InputManager {
|
|
|
614
620
|
this.moveCursorRight();
|
|
615
621
|
return true;
|
|
616
622
|
}
|
|
617
|
-
if (("home" in key && key.home) || (key.ctrl && input === "a")) {
|
|
618
|
-
this.moveCursorToStart();
|
|
619
|
-
return true;
|
|
620
|
-
}
|
|
621
|
-
if (("end" in key && key.end) || (key.ctrl && input === "e")) {
|
|
622
|
-
this.moveCursorToEnd();
|
|
623
|
-
return true;
|
|
624
|
-
}
|
|
625
623
|
// Handle Ctrl+V for pasting images
|
|
626
624
|
if (key.ctrl && input === "v") {
|
|
627
625
|
this.handlePasteImage().catch((error) => {
|
|
@@ -685,11 +683,13 @@ export class InputManager {
|
|
|
685
683
|
this.showHistorySearch ||
|
|
686
684
|
this.showBackgroundTaskManager ||
|
|
687
685
|
this.showMcpManager ||
|
|
688
|
-
this.showRewindManager
|
|
686
|
+
this.showRewindManager ||
|
|
687
|
+
this.showHelp) {
|
|
689
688
|
if (this.showBackgroundTaskManager ||
|
|
690
689
|
this.showMcpManager ||
|
|
691
|
-
this.showRewindManager
|
|
692
|
-
|
|
690
|
+
this.showRewindManager ||
|
|
691
|
+
this.showHelp) {
|
|
692
|
+
// Task manager, MCP manager, Rewind and Help don't need to handle input, handled by component itself
|
|
693
693
|
// Return true to indicate we've "handled" it (by ignoring it) so it doesn't leak to normal input
|
|
694
694
|
return true;
|
|
695
695
|
}
|
package/dist/print-cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"print-cli.d.ts","sourceRoot":"","sources":["../src/print-cli.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAgBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"print-cli.d.ts","sourceRoot":"","sources":["../src/print-cli.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAgBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8J3E"}
|
package/dist/print-cli.js
CHANGED
|
@@ -48,38 +48,10 @@ export async function startPrintCli(options) {
|
|
|
48
48
|
// FR-001: Stream content updates for real-time display - output only the new chunk
|
|
49
49
|
process.stdout.write(chunk);
|
|
50
50
|
},
|
|
51
|
-
// Tool block callback - display tool name when tool starts
|
|
52
|
-
onToolBlockUpdated: (params) => {
|
|
53
|
-
// Print tool name only during 'running' stage (happens once per tool call)
|
|
54
|
-
if (params.stage === "running" && params.name) {
|
|
55
|
-
process.stdout.write(`\n🔧 ${params.name}`);
|
|
56
|
-
if (params.compactParams) {
|
|
57
|
-
process.stdout.write(` ${params.compactParams}`);
|
|
58
|
-
}
|
|
59
|
-
process.stdout.write(`\n`);
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
// Subagent block callbacks
|
|
63
|
-
onSubAgentBlockAdded: (subagentId, parameters) => {
|
|
64
|
-
// Display subagent creation with indentation
|
|
65
|
-
process.stdout.write(`\n🤖 Subagent [${parameters.subagent_type}]: ${parameters.description}\n`);
|
|
66
|
-
},
|
|
67
|
-
onSubAgentBlockUpdated: (subagentId, status) => {
|
|
68
|
-
// Display subagent status updates
|
|
69
|
-
const statusIconMap = {
|
|
70
|
-
active: "🔄",
|
|
71
|
-
completed: "✅",
|
|
72
|
-
error: "❌",
|
|
73
|
-
aborted: "⚠️",
|
|
74
|
-
};
|
|
75
|
-
const statusIcon = statusIconMap[status] ?? "🔄";
|
|
76
|
-
process.stdout.write(` ${statusIcon} Subagent status: ${status}\n`);
|
|
77
|
-
},
|
|
78
51
|
// Subagent message callbacks
|
|
79
52
|
onSubagentAssistantMessageAdded: (subagentId) => {
|
|
80
53
|
subagentReasoningStates.set(subagentId, false);
|
|
81
54
|
subagentContentStates.set(subagentId, false);
|
|
82
|
-
// Subagent assistant message started - add indentation
|
|
83
55
|
process.stdout.write("\n ");
|
|
84
56
|
},
|
|
85
57
|
onSubagentAssistantReasoningUpdated: (subagentId, chunk) => {
|
|
@@ -95,13 +67,22 @@ export async function startPrintCli(options) {
|
|
|
95
67
|
process.stdout.write("\n 📝 Response: ");
|
|
96
68
|
subagentContentStates.set(subagentId, true);
|
|
97
69
|
}
|
|
98
|
-
// Stream subagent content with indentation - output only the new chunk
|
|
99
70
|
process.stdout.write(chunk);
|
|
100
71
|
},
|
|
101
72
|
onSubagentUserMessageAdded: (_subagentId, params) => {
|
|
102
|
-
// Display subagent user messages with indentation
|
|
103
73
|
process.stdout.write(`\n 👤 User: ${params.content}\n`);
|
|
104
74
|
},
|
|
75
|
+
// Tool block callback - display tool name when tool starts
|
|
76
|
+
onToolBlockUpdated: (params) => {
|
|
77
|
+
// Print tool name only during 'running' stage (happens once per tool call)
|
|
78
|
+
if (params.stage === "running" && params.name) {
|
|
79
|
+
process.stdout.write(`\n🔧 ${params.name}`);
|
|
80
|
+
if (params.compactParams) {
|
|
81
|
+
process.stdout.write(` ${params.compactParams}`);
|
|
82
|
+
}
|
|
83
|
+
process.stdout.write(`\n`);
|
|
84
|
+
}
|
|
85
|
+
},
|
|
105
86
|
// Error block callback
|
|
106
87
|
onErrorBlockAdded: (error) => {
|
|
107
88
|
// Display error blocks with distinct formatting
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wave-code",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "CLI-based code assistant powered by AI, built with React and Ink",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"react": "^19.2.4",
|
|
38
38
|
"react-dom": "19.2.4",
|
|
39
39
|
"yargs": "^17.7.2",
|
|
40
|
-
"wave-agent-sdk": "0.6.
|
|
40
|
+
"wave-agent-sdk": "0.6.2"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/react": "^19.1.8",
|
package/src/components/App.tsx
CHANGED
|
@@ -33,24 +33,25 @@ const ChatInterfaceWithRemount: React.FC = () => {
|
|
|
33
33
|
const prevSessionId = useRef(sessionId);
|
|
34
34
|
|
|
35
35
|
useEffect(() => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
36
|
+
const newKey =
|
|
37
|
+
String(isExpanded) +
|
|
38
|
+
rewindId +
|
|
39
|
+
wasLastDetailsTooTall +
|
|
40
|
+
(prevSessionId.current && sessionId && prevSessionId.current !== sessionId
|
|
41
|
+
? sessionId
|
|
42
|
+
: "");
|
|
44
43
|
|
|
45
44
|
if (newKey !== remountKey) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
const timeout = setTimeout(() => {
|
|
46
|
+
stdout?.write("\u001b[2J\u001b[0;0H", (err?: Error | null) => {
|
|
47
|
+
if (err) {
|
|
48
|
+
console.error("Failed to clear terminal:", err);
|
|
49
|
+
}
|
|
51
50
|
setRemountKey(newKey);
|
|
52
|
-
}
|
|
53
|
-
});
|
|
51
|
+
});
|
|
52
|
+
}, 100);
|
|
53
|
+
|
|
54
|
+
return () => clearTimeout(timeout);
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
if (sessionId) {
|
|
@@ -84,7 +84,8 @@ export const ChatInterface: React.FC = () => {
|
|
|
84
84
|
/>
|
|
85
85
|
|
|
86
86
|
{(isLoading || isCommandRunning || isCompressing) &&
|
|
87
|
-
!isConfirmationVisible &&
|
|
87
|
+
!isConfirmationVisible &&
|
|
88
|
+
!isExpanded && (
|
|
88
89
|
<LoadingIndicator
|
|
89
90
|
isLoading={isLoading}
|
|
90
91
|
isCommandRunning={isCommandRunning}
|
|
@@ -92,7 +93,7 @@ export const ChatInterface: React.FC = () => {
|
|
|
92
93
|
latestTotalTokens={latestTotalTokens}
|
|
93
94
|
/>
|
|
94
95
|
)}
|
|
95
|
-
{!isConfirmationVisible && <TaskList />}
|
|
96
|
+
{!isConfirmationVisible && !isExpanded && <TaskList />}
|
|
96
97
|
|
|
97
98
|
{isConfirmationVisible && (
|
|
98
99
|
<>
|
|
@@ -13,7 +13,7 @@ export const CommandOutputDisplay: React.FC<CommandOutputDisplayProps> = ({
|
|
|
13
13
|
}) => {
|
|
14
14
|
const { command, output, isRunning, exitCode } = block;
|
|
15
15
|
const [isOverflowing, setIsOverflowing] = useState(false);
|
|
16
|
-
const MAX_LINES =
|
|
16
|
+
const MAX_LINES = 3; // Set maximum display lines
|
|
17
17
|
|
|
18
18
|
// Detect if content is overflowing
|
|
19
19
|
useEffect(() => {
|
|
@@ -30,50 +30,28 @@ export const CommandOutputDisplay: React.FC<CommandOutputDisplayProps> = ({
|
|
|
30
30
|
return "gray"; // Unknown state
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
-
const getStatusText = () => {
|
|
34
|
-
if (isRunning) return "🔄";
|
|
35
|
-
if (exitCode === 0) return "✅";
|
|
36
|
-
if (exitCode === 130) return "⚠️"; // SIGINT (Ctrl+C)
|
|
37
|
-
if (exitCode !== null && exitCode !== 0) return "❌";
|
|
38
|
-
return ""; // Don't display text for unknown state
|
|
39
|
-
};
|
|
40
|
-
|
|
41
33
|
return (
|
|
42
34
|
<Box flexDirection="column">
|
|
43
35
|
<Box>
|
|
44
|
-
<Text color=
|
|
36
|
+
<Text color={getStatusColor()}>$ </Text>
|
|
45
37
|
<Text color="white">{command}</Text>
|
|
46
|
-
<Text color={getStatusColor()}> {getStatusText()}</Text>
|
|
47
38
|
</Box>
|
|
48
39
|
|
|
49
40
|
{output && (
|
|
50
|
-
<Box
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
{isOverflowing
|
|
65
|
-
? output.split("\n").slice(-MAX_LINES).join("\n")
|
|
66
|
-
: output}
|
|
67
|
-
</Text>
|
|
68
|
-
</Box>
|
|
69
|
-
{isOverflowing && (
|
|
70
|
-
<Box paddingLeft={2} marginTop={1}>
|
|
71
|
-
<Text color="yellow" dimColor>
|
|
72
|
-
Content truncated ({output.split("\n").length} lines total,
|
|
73
|
-
showing last {MAX_LINES} lines)
|
|
74
|
-
</Text>
|
|
75
|
-
</Box>
|
|
76
|
-
)}
|
|
41
|
+
<Box
|
|
42
|
+
paddingLeft={2}
|
|
43
|
+
height={
|
|
44
|
+
isExpanded
|
|
45
|
+
? undefined
|
|
46
|
+
: Math.min(output.split("\n").length, MAX_LINES)
|
|
47
|
+
}
|
|
48
|
+
overflow="hidden"
|
|
49
|
+
>
|
|
50
|
+
<Text color="gray">
|
|
51
|
+
{isOverflowing
|
|
52
|
+
? output.split("\n").slice(-MAX_LINES).join("\n")
|
|
53
|
+
: output}
|
|
54
|
+
</Text>
|
|
77
55
|
</Box>
|
|
78
56
|
)}
|
|
79
57
|
</Box>
|
|
@@ -22,6 +22,12 @@ const AVAILABLE_COMMANDS: SlashCommand[] = [
|
|
|
22
22
|
"Revert conversation and file changes to a previous checkpoint",
|
|
23
23
|
handler: () => {}, // Handler here won't be used, actual processing is in the hook
|
|
24
24
|
},
|
|
25
|
+
{
|
|
26
|
+
id: "help",
|
|
27
|
+
name: "help",
|
|
28
|
+
description: "Show help and key bindings",
|
|
29
|
+
handler: () => {}, // Handler here won't be used, actual processing is in the hook
|
|
30
|
+
},
|
|
25
31
|
];
|
|
26
32
|
|
|
27
33
|
export interface CommandSelectorProps {
|
|
@@ -314,16 +314,12 @@ export const ConfirmationSelector: React.FC<ConfirmationSelectorProps> = ({
|
|
|
314
314
|
!isExpanded && (
|
|
315
315
|
<Box flexDirection="column" marginTop={1}>
|
|
316
316
|
<Box marginBottom={1}>
|
|
317
|
-
<
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
<Text color="black" bold>
|
|
323
|
-
{currentQuestion.header.slice(0, 12).toUpperCase()}
|
|
324
|
-
</Text>
|
|
317
|
+
<Text color={getHeaderColor(currentQuestion.header)} bold>
|
|
318
|
+
{currentQuestion.header.slice(0, 12).toUpperCase()}
|
|
319
|
+
</Text>
|
|
320
|
+
<Box marginLeft={1}>
|
|
321
|
+
<Text bold>{currentQuestion.question}</Text>
|
|
325
322
|
</Box>
|
|
326
|
-
<Text bold>{currentQuestion.question}</Text>
|
|
327
323
|
</Box>
|
|
328
324
|
<Box flexDirection="column">
|
|
329
325
|
{[...currentQuestion.options, { label: "Other" }].map(
|
|
@@ -109,6 +109,15 @@ export const DiffDisplay: React.FC<DiffDisplayProps> = ({
|
|
|
109
109
|
|
|
110
110
|
changes.forEach((change, changeIndex) => {
|
|
111
111
|
try {
|
|
112
|
+
// Add ellipsis between non-contiguous edits in MultiEdit
|
|
113
|
+
if (toolName === MULTI_EDIT_TOOL_NAME && changeIndex > 0) {
|
|
114
|
+
allElements.push(
|
|
115
|
+
<Box key={`multi-edit-separator-${changeIndex}`}>
|
|
116
|
+
<Text color="gray">...</Text>
|
|
117
|
+
</Box>,
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
112
121
|
// Get line-level diff to understand the structure
|
|
113
122
|
const lineDiffs = diffLines(
|
|
114
123
|
change.oldContent || "",
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text, useInput } from "ink";
|
|
3
|
+
|
|
4
|
+
export interface HelpViewProps {
|
|
5
|
+
onCancel: () => void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const HelpView: React.FC<HelpViewProps> = ({ onCancel }) => {
|
|
9
|
+
useInput((_, key) => {
|
|
10
|
+
if (key.escape || key.return) {
|
|
11
|
+
onCancel();
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const helpItems = [
|
|
16
|
+
{ key: "@", description: "Reference files" },
|
|
17
|
+
{ key: "/", description: "Commands" },
|
|
18
|
+
{ key: "Ctrl+R", description: "Search history" },
|
|
19
|
+
{ key: "Ctrl+O", description: "Expand/collapse messages" },
|
|
20
|
+
{ key: "Ctrl+T", description: "Toggle task list" },
|
|
21
|
+
{ key: "Ctrl+B", description: "Background current task" },
|
|
22
|
+
{ key: "Ctrl+V", description: "Paste image" },
|
|
23
|
+
{ key: "Shift+Tab", description: "Cycle permission mode" },
|
|
24
|
+
{
|
|
25
|
+
key: "Esc",
|
|
26
|
+
description: "Interrupt AI or command / Cancel selector / Close help",
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<Box
|
|
32
|
+
flexDirection="column"
|
|
33
|
+
borderStyle="single"
|
|
34
|
+
borderColor="cyan"
|
|
35
|
+
borderLeft={false}
|
|
36
|
+
borderRight={false}
|
|
37
|
+
paddingX={1}
|
|
38
|
+
>
|
|
39
|
+
<Box marginBottom={1}>
|
|
40
|
+
<Text color="cyan" bold underline>
|
|
41
|
+
Help & Key Bindings
|
|
42
|
+
</Text>
|
|
43
|
+
</Box>
|
|
44
|
+
|
|
45
|
+
{helpItems.map((item, index) => (
|
|
46
|
+
<Box key={index}>
|
|
47
|
+
<Box width={20}>
|
|
48
|
+
<Text color="yellow">{item.key}</Text>
|
|
49
|
+
</Box>
|
|
50
|
+
<Text color="white">{item.description}</Text>
|
|
51
|
+
</Box>
|
|
52
|
+
))}
|
|
53
|
+
|
|
54
|
+
<Box marginTop={1}>
|
|
55
|
+
<Text dimColor>Press Esc or Enter to close</Text>
|
|
56
|
+
</Box>
|
|
57
|
+
</Box>
|
|
58
|
+
);
|
|
59
|
+
};
|
|
@@ -7,13 +7,14 @@ import { HistorySearch } from "./HistorySearch.js";
|
|
|
7
7
|
import { BackgroundTaskManager } from "./BackgroundTaskManager.js";
|
|
8
8
|
import { McpManager } from "./McpManager.js";
|
|
9
9
|
import { RewindCommand } from "./RewindCommand.js";
|
|
10
|
+
import { HelpView } from "./HelpView.js";
|
|
10
11
|
import { useInputManager } from "../hooks/useInputManager.js";
|
|
11
12
|
import { useChat } from "../contexts/useChat.js";
|
|
12
13
|
|
|
13
14
|
import type { McpServerStatus, SlashCommand } from "wave-agent-sdk";
|
|
14
15
|
|
|
15
16
|
export const INPUT_PLACEHOLDER_TEXT =
|
|
16
|
-
"Type your message (use
|
|
17
|
+
"Type your message (use /help for more info)...";
|
|
17
18
|
|
|
18
19
|
export const INPUT_PLACEHOLDER_TEXT_PREFIX = INPUT_PLACEHOLDER_TEXT.substring(
|
|
19
20
|
0,
|
|
@@ -86,9 +87,11 @@ export const InputBox: React.FC<InputBoxProps> = ({
|
|
|
86
87
|
showBackgroundTaskManager,
|
|
87
88
|
showMcpManager,
|
|
88
89
|
showRewindManager,
|
|
90
|
+
showHelp,
|
|
89
91
|
setShowBackgroundTaskManager,
|
|
90
92
|
setShowMcpManager,
|
|
91
93
|
setShowRewindManager,
|
|
94
|
+
setShowHelp,
|
|
92
95
|
// Permission mode
|
|
93
96
|
permissionMode,
|
|
94
97
|
setPermissionMode,
|
|
@@ -165,6 +168,10 @@ export const InputBox: React.FC<InputBoxProps> = ({
|
|
|
165
168
|
);
|
|
166
169
|
}
|
|
167
170
|
|
|
171
|
+
if (showHelp) {
|
|
172
|
+
return <HelpView onCancel={() => setShowHelp(false)} />;
|
|
173
|
+
}
|
|
174
|
+
|
|
168
175
|
return (
|
|
169
176
|
<Box flexDirection="column">
|
|
170
177
|
{showFileSelector && (
|
|
@@ -209,39 +216,42 @@ export const InputBox: React.FC<InputBoxProps> = ({
|
|
|
209
216
|
/>
|
|
210
217
|
)}
|
|
211
218
|
|
|
212
|
-
{showBackgroundTaskManager ||
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
{
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
219
|
+
{showBackgroundTaskManager ||
|
|
220
|
+
showMcpManager ||
|
|
221
|
+
showRewindManager ||
|
|
222
|
+
showHelp || (
|
|
223
|
+
<Box flexDirection="column">
|
|
224
|
+
<Box
|
|
225
|
+
borderStyle="single"
|
|
226
|
+
borderColor="gray"
|
|
227
|
+
borderLeft={false}
|
|
228
|
+
borderRight={false}
|
|
229
|
+
>
|
|
230
|
+
<Text color={isPlaceholder ? "gray" : "white"}>
|
|
231
|
+
{shouldShowCursor ? (
|
|
232
|
+
<>
|
|
233
|
+
{beforeCursor}
|
|
234
|
+
<Text backgroundColor="white" color="black">
|
|
235
|
+
{atCursor}
|
|
236
|
+
</Text>
|
|
237
|
+
{afterCursor}
|
|
238
|
+
</>
|
|
239
|
+
) : (
|
|
240
|
+
displayText
|
|
241
|
+
)}
|
|
242
|
+
</Text>
|
|
243
|
+
</Box>
|
|
244
|
+
<Box paddingRight={1} justifyContent="space-between" width="100%">
|
|
245
|
+
<Text color="gray">
|
|
246
|
+
Mode:{" "}
|
|
247
|
+
<Text color={permissionMode === "plan" ? "yellow" : "cyan"}>
|
|
248
|
+
{permissionMode}
|
|
249
|
+
</Text>{" "}
|
|
250
|
+
(Shift+Tab to cycle)
|
|
251
|
+
</Text>
|
|
252
|
+
</Box>
|
|
233
253
|
</Box>
|
|
234
|
-
|
|
235
|
-
<Text color="gray">
|
|
236
|
-
Mode:{" "}
|
|
237
|
-
<Text color={permissionMode === "plan" ? "yellow" : "cyan"}>
|
|
238
|
-
{permissionMode}
|
|
239
|
-
</Text>{" "}
|
|
240
|
-
(Shift+Tab to cycle)
|
|
241
|
-
</Text>
|
|
242
|
-
</Box>
|
|
243
|
-
</Box>
|
|
244
|
-
)}
|
|
254
|
+
)}
|
|
245
255
|
</Box>
|
|
246
256
|
);
|
|
247
257
|
};
|