wave-code 0.5.0 → 0.6.1
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 +38 -2
- package/dist/components/BackgroundTaskManager.d.ts +6 -0
- package/dist/components/BackgroundTaskManager.d.ts.map +1 -0
- package/dist/components/{TaskManager.js → BackgroundTaskManager.js} +1 -1
- package/dist/components/ChatInterface.d.ts.map +1 -1
- package/dist/components/ChatInterface.js +39 -5
- package/dist/components/CommandSelector.d.ts.map +1 -1
- package/dist/components/CommandSelector.js +10 -2
- package/dist/components/CompressDisplay.d.ts.map +1 -1
- package/dist/components/CompressDisplay.js +6 -10
- package/dist/components/ConfirmationDetails.d.ts +9 -0
- package/dist/components/ConfirmationDetails.d.ts.map +1 -0
- package/dist/components/ConfirmationDetails.js +53 -0
- package/dist/components/{Confirmation.d.ts → ConfirmationSelector.d.ts} +3 -3
- package/dist/components/ConfirmationSelector.d.ts.map +1 -0
- package/dist/components/{Confirmation.js → ConfirmationSelector.js} +34 -96
- package/dist/components/DiffDisplay.d.ts.map +1 -1
- package/dist/components/DiffDisplay.js +44 -1
- package/dist/components/FileSelector.d.ts.map +1 -1
- package/dist/components/FileSelector.js +2 -2
- package/dist/components/HistorySearch.d.ts.map +1 -1
- package/dist/components/HistorySearch.js +12 -4
- package/dist/components/InputBox.d.ts +1 -3
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +7 -17
- package/dist/components/LoadingIndicator.d.ts +11 -0
- package/dist/components/LoadingIndicator.d.ts.map +1 -0
- package/dist/components/LoadingIndicator.js +6 -0
- package/dist/components/Markdown.d.ts.map +1 -1
- package/dist/components/Markdown.js +114 -121
- package/dist/components/MessageItem.d.ts.map +1 -1
- package/dist/components/MessageItem.js +1 -2
- package/dist/components/MessageList.d.ts +2 -3
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +7 -7
- package/dist/components/PlanDisplay.d.ts.map +1 -1
- package/dist/components/PlanDisplay.js +4 -12
- package/dist/components/RewindCommand.d.ts +4 -0
- package/dist/components/RewindCommand.d.ts.map +1 -1
- package/dist/components/RewindCommand.js +19 -2
- package/dist/components/SubagentBlock.d.ts.map +1 -1
- package/dist/components/SubagentBlock.js +9 -6
- package/dist/components/TaskList.d.ts +3 -0
- package/dist/components/TaskList.d.ts.map +1 -0
- package/dist/components/TaskList.js +49 -0
- package/dist/components/ToolResultDisplay.js +1 -1
- package/dist/contexts/useChat.d.ts +11 -3
- package/dist/contexts/useChat.d.ts.map +1 -1
- package/dist/contexts/useChat.js +36 -31
- package/dist/hooks/useInputManager.d.ts +2 -13
- package/dist/hooks/useInputManager.d.ts.map +1 -1
- package/dist/hooks/useInputManager.js +8 -57
- package/dist/hooks/useTasks.d.ts +2 -0
- package/dist/hooks/useTasks.d.ts.map +1 -0
- package/dist/hooks/useTasks.js +5 -0
- package/dist/managers/InputManager.d.ts +4 -28
- package/dist/managers/InputManager.d.ts.map +1 -1
- package/dist/managers/InputManager.js +22 -128
- package/package.json +5 -6
- package/src/components/App.tsx +50 -3
- package/src/components/{TaskManager.tsx → BackgroundTaskManager.tsx} +4 -2
- package/src/components/ChatInterface.tsx +79 -23
- package/src/components/CommandSelector.tsx +35 -17
- package/src/components/CompressDisplay.tsx +5 -22
- package/src/components/ConfirmationDetails.tsx +108 -0
- package/src/components/{Confirmation.tsx → ConfirmationSelector.tsx} +69 -184
- package/src/components/DiffDisplay.tsx +62 -1
- package/src/components/FileSelector.tsx +0 -2
- package/src/components/HistorySearch.tsx +45 -21
- package/src/components/InputBox.tsx +11 -33
- package/src/components/LoadingIndicator.tsx +56 -0
- package/src/components/Markdown.tsx +126 -323
- package/src/components/MessageItem.tsx +1 -3
- package/src/components/MessageList.tsx +10 -67
- package/src/components/PlanDisplay.tsx +4 -27
- package/src/components/RewindCommand.tsx +38 -1
- package/src/components/SubagentBlock.tsx +25 -16
- package/src/components/TaskList.tsx +70 -0
- package/src/components/ToolResultDisplay.tsx +2 -2
- package/src/contexts/useChat.tsx +57 -40
- package/src/hooks/useInputManager.ts +9 -73
- package/src/hooks/useTasks.ts +6 -0
- package/src/managers/InputManager.ts +25 -159
- package/dist/components/Confirmation.d.ts.map +0 -1
- package/dist/components/MemoryDisplay.d.ts +0 -8
- package/dist/components/MemoryDisplay.d.ts.map +0 -1
- package/dist/components/MemoryDisplay.js +0 -25
- package/dist/components/MemoryTypeSelector.d.ts +0 -8
- package/dist/components/MemoryTypeSelector.d.ts.map +0 -1
- package/dist/components/MemoryTypeSelector.js +0 -38
- package/dist/components/TaskManager.d.ts +0 -6
- package/dist/components/TaskManager.d.ts.map +0 -1
- package/src/components/MemoryDisplay.tsx +0 -62
- package/src/components/MemoryTypeSelector.tsx +0 -98
|
@@ -22,11 +22,7 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
22
22
|
show: false,
|
|
23
23
|
query: "",
|
|
24
24
|
});
|
|
25
|
-
const [
|
|
26
|
-
show: false,
|
|
27
|
-
message: "",
|
|
28
|
-
});
|
|
29
|
-
const [showTaskManager, setShowTaskManager] = useState(false);
|
|
25
|
+
const [showBackgroundTaskManager, setShowBackgroundTaskManager] = useState(false);
|
|
30
26
|
const [showMcpManager, setShowMcpManager] = useState(false);
|
|
31
27
|
const [showRewindManager, setShowRewindManager] = useState(false);
|
|
32
28
|
const [permissionMode, setPermissionModeState] = useState("default");
|
|
@@ -48,11 +44,8 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
48
44
|
onHistorySearchStateChange: (show, query) => {
|
|
49
45
|
setHistorySearchState({ show, query });
|
|
50
46
|
},
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
},
|
|
54
|
-
onTaskManagerStateChange: (show) => {
|
|
55
|
-
setShowTaskManager(show);
|
|
47
|
+
onBackgroundTaskManagerStateChange: (show) => {
|
|
48
|
+
setShowBackgroundTaskManager(show);
|
|
56
49
|
},
|
|
57
50
|
onMcpManagerStateChange: (show) => {
|
|
58
51
|
setShowMcpManager(show);
|
|
@@ -65,9 +58,6 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
65
58
|
callbacks.onPermissionModeChange?.(mode);
|
|
66
59
|
},
|
|
67
60
|
onImagesStateChange: setAttachedImages,
|
|
68
|
-
onShowTaskManager: () => setShowTaskManager(true),
|
|
69
|
-
onShowMcpManager: () => setShowMcpManager(true),
|
|
70
|
-
onShowRewindManager: () => setShowRewindManager(true),
|
|
71
61
|
...callbacks,
|
|
72
62
|
});
|
|
73
63
|
managerRef.current = manager;
|
|
@@ -88,11 +78,8 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
88
78
|
onHistorySearchStateChange: (show, query) => {
|
|
89
79
|
setHistorySearchState({ show, query });
|
|
90
80
|
},
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
},
|
|
94
|
-
onTaskManagerStateChange: (show) => {
|
|
95
|
-
setShowTaskManager(show);
|
|
81
|
+
onBackgroundTaskManagerStateChange: (show) => {
|
|
82
|
+
setShowBackgroundTaskManager(show);
|
|
96
83
|
},
|
|
97
84
|
onMcpManagerStateChange: (show) => {
|
|
98
85
|
setShowMcpManager(show);
|
|
@@ -105,9 +92,6 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
105
92
|
callbacks.onPermissionModeChange?.(mode);
|
|
106
93
|
},
|
|
107
94
|
onImagesStateChange: setAttachedImages,
|
|
108
|
-
onShowTaskManager: () => setShowTaskManager(true),
|
|
109
|
-
onShowMcpManager: () => setShowMcpManager(true),
|
|
110
|
-
onShowRewindManager: () => setShowRewindManager(true),
|
|
111
95
|
...callbacks,
|
|
112
96
|
});
|
|
113
97
|
}
|
|
@@ -193,29 +177,6 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
193
177
|
const handleCancelHistorySearch = useCallback(() => {
|
|
194
178
|
managerRef.current?.handleCancelHistorySearch();
|
|
195
179
|
}, []);
|
|
196
|
-
// Memory type selector methods
|
|
197
|
-
const activateMemoryTypeSelector = useCallback((message) => {
|
|
198
|
-
managerRef.current?.activateMemoryTypeSelector(message);
|
|
199
|
-
}, []);
|
|
200
|
-
const handleMemoryTypeSelect = useCallback(async (type) => {
|
|
201
|
-
await managerRef.current?.handleMemoryTypeSelect(type);
|
|
202
|
-
}, []);
|
|
203
|
-
const handleCancelMemoryTypeSelect = useCallback(() => {
|
|
204
|
-
managerRef.current?.handleCancelMemoryTypeSelect();
|
|
205
|
-
}, []);
|
|
206
|
-
// Input history methods
|
|
207
|
-
const setUserInputHistory = useCallback((history) => {
|
|
208
|
-
managerRef.current?.setUserInputHistory(history);
|
|
209
|
-
}, []);
|
|
210
|
-
const navigateHistory = useCallback((direction, currentInput) => {
|
|
211
|
-
return (managerRef.current?.navigateHistory(direction, currentInput) || {
|
|
212
|
-
newInput: currentInput,
|
|
213
|
-
newCursorPosition: currentInput.length,
|
|
214
|
-
});
|
|
215
|
-
}, []);
|
|
216
|
-
const resetHistoryNavigation = useCallback(() => {
|
|
217
|
-
managerRef.current?.resetHistoryNavigation();
|
|
218
|
-
}, []);
|
|
219
180
|
// Special character handling
|
|
220
181
|
const handleSpecialCharInput = useCallback((char) => {
|
|
221
182
|
managerRef.current?.handleSpecialCharInput(char);
|
|
@@ -241,9 +202,7 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
241
202
|
slashPosition: commandSelectorState.position,
|
|
242
203
|
showHistorySearch: historySearchState.show,
|
|
243
204
|
historySearchQuery: historySearchState.query,
|
|
244
|
-
|
|
245
|
-
memoryMessage: memoryTypeSelectorState.message,
|
|
246
|
-
showTaskManager,
|
|
205
|
+
showBackgroundTaskManager,
|
|
247
206
|
showMcpManager,
|
|
248
207
|
showRewindManager,
|
|
249
208
|
permissionMode,
|
|
@@ -273,19 +232,11 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
273
232
|
// History search
|
|
274
233
|
handleHistorySearchSelect,
|
|
275
234
|
handleCancelHistorySearch,
|
|
276
|
-
// Memory type selector
|
|
277
|
-
activateMemoryTypeSelector,
|
|
278
|
-
handleMemoryTypeSelect,
|
|
279
|
-
handleCancelMemoryTypeSelect,
|
|
280
|
-
// Input history
|
|
281
|
-
setUserInputHistory,
|
|
282
|
-
navigateHistory,
|
|
283
|
-
resetHistoryNavigation,
|
|
284
235
|
// Special handling
|
|
285
236
|
handleSpecialCharInput,
|
|
286
237
|
// Bash/MCP Manager
|
|
287
|
-
|
|
288
|
-
managerRef.current?.
|
|
238
|
+
setShowBackgroundTaskManager: useCallback((show) => {
|
|
239
|
+
managerRef.current?.setShowBackgroundTaskManager(show);
|
|
289
240
|
}, []),
|
|
290
241
|
setShowMcpManager: useCallback((show) => {
|
|
291
242
|
managerRef.current?.setShowMcpManager(show);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTasks.d.ts","sourceRoot":"","sources":["../../src/hooks/useTasks.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,uCAGpB,CAAC"}
|
|
@@ -12,12 +12,8 @@ export interface InputManagerCallbacks {
|
|
|
12
12
|
onFileSelectorStateChange?: (show: boolean, files: FileItem[], query: string, position: number) => void;
|
|
13
13
|
onCommandSelectorStateChange?: (show: boolean, query: string, position: number) => void;
|
|
14
14
|
onHistorySearchStateChange?: (show: boolean, query: string) => void;
|
|
15
|
-
|
|
16
|
-
onShowTaskManager?: () => void;
|
|
17
|
-
onTaskManagerStateChange?: (show: boolean) => void;
|
|
18
|
-
onShowMcpManager?: () => void;
|
|
15
|
+
onBackgroundTaskManagerStateChange?: (show: boolean) => void;
|
|
19
16
|
onMcpManagerStateChange?: (show: boolean) => void;
|
|
20
|
-
onShowRewindManager?: () => void;
|
|
21
17
|
onRewindManagerStateChange?: (show: boolean) => void;
|
|
22
18
|
onImagesStateChange?: (images: AttachedImage[]) => void;
|
|
23
19
|
onSendMessage?: (content: string, images?: Array<{
|
|
@@ -25,7 +21,6 @@ export interface InputManagerCallbacks {
|
|
|
25
21
|
mimeType: string;
|
|
26
22
|
}>) => void | Promise<void>;
|
|
27
23
|
onHasSlashCommand?: (commandId: string) => boolean;
|
|
28
|
-
onSaveMemory?: (message: string, type: "project" | "user") => Promise<void>;
|
|
29
24
|
onAbortMessage?: () => void;
|
|
30
25
|
onBackgroundCurrentTask?: () => void;
|
|
31
26
|
onResetHistoryNavigation?: () => void;
|
|
@@ -45,11 +40,6 @@ export declare class InputManager {
|
|
|
45
40
|
private commandSearchQuery;
|
|
46
41
|
private showHistorySearch;
|
|
47
42
|
private historySearchQuery;
|
|
48
|
-
private showMemoryTypeSelector;
|
|
49
|
-
private memoryMessage;
|
|
50
|
-
private userInputHistory;
|
|
51
|
-
private historyIndex;
|
|
52
|
-
private historyBuffer;
|
|
53
43
|
private pasteDebounceTimer;
|
|
54
44
|
private pasteBuffer;
|
|
55
45
|
private initialPasteCursorPosition;
|
|
@@ -58,7 +48,7 @@ export declare class InputManager {
|
|
|
58
48
|
private longTextMap;
|
|
59
49
|
private attachedImages;
|
|
60
50
|
private imageIdCounter;
|
|
61
|
-
private
|
|
51
|
+
private showBackgroundTaskManager;
|
|
62
52
|
private showMcpManager;
|
|
63
53
|
private showRewindManager;
|
|
64
54
|
private permissionMode;
|
|
@@ -100,18 +90,8 @@ export declare class InputManager {
|
|
|
100
90
|
};
|
|
101
91
|
handleCancelCommandSelect(): void;
|
|
102
92
|
checkForSlashDeletion(cursorPosition: number): boolean;
|
|
103
|
-
activateMemoryTypeSelector(message: string): void;
|
|
104
|
-
handleMemoryTypeSelect(type: "project" | "user"): Promise<void>;
|
|
105
|
-
handleCancelMemoryTypeSelect(): void;
|
|
106
|
-
setUserInputHistory(history: string[]): void;
|
|
107
|
-
navigateHistory(direction: "up" | "down", currentInput: string): {
|
|
108
|
-
newInput: string;
|
|
109
|
-
newCursorPosition: number;
|
|
110
|
-
};
|
|
111
|
-
resetHistoryNavigation(): void;
|
|
112
93
|
isFileSelectorActive(): boolean;
|
|
113
94
|
isCommandSelectorActive(): boolean;
|
|
114
|
-
isMemoryTypeSelectorActive(): boolean;
|
|
115
95
|
getFileSelectorState(): {
|
|
116
96
|
show: boolean;
|
|
117
97
|
files: FileItem[];
|
|
@@ -123,10 +103,6 @@ export declare class InputManager {
|
|
|
123
103
|
query: string;
|
|
124
104
|
position: number;
|
|
125
105
|
};
|
|
126
|
-
getMemoryTypeSelectorState(): {
|
|
127
|
-
show: boolean;
|
|
128
|
-
message: string;
|
|
129
|
-
};
|
|
130
106
|
private updateSearchQueriesForActiveSelectors;
|
|
131
107
|
handleSpecialCharInput(char: string): void;
|
|
132
108
|
generateCompressedText(originalText: string): string;
|
|
@@ -138,8 +114,8 @@ export declare class InputManager {
|
|
|
138
114
|
clearImages(): void;
|
|
139
115
|
getAttachedImages(): AttachedImage[];
|
|
140
116
|
handlePasteImage(): Promise<boolean>;
|
|
141
|
-
|
|
142
|
-
|
|
117
|
+
getShowBackgroundTaskManager(): boolean;
|
|
118
|
+
setShowBackgroundTaskManager(show: boolean): void;
|
|
143
119
|
getShowMcpManager(): boolean;
|
|
144
120
|
setShowMcpManager(show: boolean): void;
|
|
145
121
|
getShowRewindManager(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputManager.d.ts","sourceRoot":"","sources":["../../src/managers/InputManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAEL,cAAc,EACd,MAAM,EAEP,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,sBAAsB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,yBAAyB,CAAC,EAAE,CAC1B,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;IACV,4BAA4B,CAAC,EAAE,CAC7B,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,KACb,IAAI,CAAC;IACV,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE
|
|
1
|
+
{"version":3,"file":"InputManager.d.ts","sourceRoot":"","sources":["../../src/managers/InputManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,13 +18,6 @@ export class InputManager {
|
|
|
18
18
|
// History search state
|
|
19
19
|
this.showHistorySearch = false;
|
|
20
20
|
this.historySearchQuery = "";
|
|
21
|
-
// Memory type selector state
|
|
22
|
-
this.showMemoryTypeSelector = false;
|
|
23
|
-
this.memoryMessage = "";
|
|
24
|
-
// Input history state
|
|
25
|
-
this.userInputHistory = [];
|
|
26
|
-
this.historyIndex = -1;
|
|
27
|
-
this.historyBuffer = "";
|
|
28
21
|
// Paste debounce state
|
|
29
22
|
this.pasteDebounceTimer = null;
|
|
30
23
|
this.pasteBuffer = "";
|
|
@@ -37,7 +30,7 @@ export class InputManager {
|
|
|
37
30
|
this.attachedImages = [];
|
|
38
31
|
this.imageIdCounter = 1;
|
|
39
32
|
// Additional UI state
|
|
40
|
-
this.
|
|
33
|
+
this.showBackgroundTaskManager = false;
|
|
41
34
|
this.showMcpManager = false;
|
|
42
35
|
this.showRewindManager = false;
|
|
43
36
|
// Permission mode state
|
|
@@ -220,17 +213,16 @@ export class InputManager {
|
|
|
220
213
|
}
|
|
221
214
|
// If not an agent command or execution failed, check local commands
|
|
222
215
|
if (!commandExecuted) {
|
|
223
|
-
if (command === "tasks"
|
|
224
|
-
this.
|
|
216
|
+
if (command === "tasks") {
|
|
217
|
+
this.setShowBackgroundTaskManager(true);
|
|
225
218
|
commandExecuted = true;
|
|
226
219
|
}
|
|
227
|
-
else if (command === "mcp"
|
|
228
|
-
this.
|
|
220
|
+
else if (command === "mcp") {
|
|
221
|
+
this.setShowMcpManager(true);
|
|
229
222
|
commandExecuted = true;
|
|
230
223
|
}
|
|
231
|
-
else if (command === "rewind"
|
|
232
|
-
this.
|
|
233
|
-
this.callbacks.onShowRewindManager();
|
|
224
|
+
else if (command === "rewind") {
|
|
225
|
+
this.setShowRewindManager(true);
|
|
234
226
|
commandExecuted = true;
|
|
235
227
|
}
|
|
236
228
|
}
|
|
@@ -280,79 +272,6 @@ export class InputManager {
|
|
|
280
272
|
}
|
|
281
273
|
return false;
|
|
282
274
|
}
|
|
283
|
-
// Memory type selector methods
|
|
284
|
-
activateMemoryTypeSelector(message) {
|
|
285
|
-
this.showMemoryTypeSelector = true;
|
|
286
|
-
this.memoryMessage = message;
|
|
287
|
-
this.callbacks.onMemoryTypeSelectorStateChange?.(true, message);
|
|
288
|
-
}
|
|
289
|
-
async handleMemoryTypeSelect(type) {
|
|
290
|
-
const currentMessage = this.inputText.trim();
|
|
291
|
-
if (currentMessage.startsWith("#")) {
|
|
292
|
-
await this.callbacks.onSaveMemory?.(currentMessage, type);
|
|
293
|
-
}
|
|
294
|
-
// Close the selector
|
|
295
|
-
this.showMemoryTypeSelector = false;
|
|
296
|
-
this.memoryMessage = "";
|
|
297
|
-
this.callbacks.onMemoryTypeSelectorStateChange?.(false, "");
|
|
298
|
-
// Clear input box
|
|
299
|
-
this.clearInput();
|
|
300
|
-
}
|
|
301
|
-
handleCancelMemoryTypeSelect() {
|
|
302
|
-
this.showMemoryTypeSelector = false;
|
|
303
|
-
this.memoryMessage = "";
|
|
304
|
-
this.callbacks.onMemoryTypeSelectorStateChange?.(false, "");
|
|
305
|
-
}
|
|
306
|
-
// Input history methods
|
|
307
|
-
setUserInputHistory(history) {
|
|
308
|
-
this.userInputHistory = history;
|
|
309
|
-
}
|
|
310
|
-
navigateHistory(direction, currentInput) {
|
|
311
|
-
if (this.historyIndex === -1) {
|
|
312
|
-
this.historyBuffer = currentInput;
|
|
313
|
-
}
|
|
314
|
-
if (direction === "up") {
|
|
315
|
-
if (this.historyIndex < this.userInputHistory.length - 1) {
|
|
316
|
-
this.historyIndex++;
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
// Down direction
|
|
321
|
-
if (this.historyIndex > 0) {
|
|
322
|
-
this.historyIndex--;
|
|
323
|
-
}
|
|
324
|
-
else if (this.historyIndex === 0) {
|
|
325
|
-
// Go from first history item to draft
|
|
326
|
-
this.historyIndex = -1;
|
|
327
|
-
}
|
|
328
|
-
else if (this.historyIndex === -1) {
|
|
329
|
-
// Go from draft to empty (beyond history bottom)
|
|
330
|
-
this.historyIndex = -2;
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
let newInput;
|
|
334
|
-
if (this.historyIndex === -1) {
|
|
335
|
-
newInput = this.historyBuffer;
|
|
336
|
-
}
|
|
337
|
-
else if (this.historyIndex === -2) {
|
|
338
|
-
// Beyond history bottom, clear input
|
|
339
|
-
newInput = "";
|
|
340
|
-
}
|
|
341
|
-
else {
|
|
342
|
-
const historyItem = this.userInputHistory[this.userInputHistory.length - 1 - this.historyIndex];
|
|
343
|
-
newInput = historyItem || "";
|
|
344
|
-
}
|
|
345
|
-
const newCursorPosition = newInput.length;
|
|
346
|
-
this.inputText = newInput;
|
|
347
|
-
this.cursorPosition = newCursorPosition;
|
|
348
|
-
this.callbacks.onInputTextChange?.(newInput);
|
|
349
|
-
this.callbacks.onCursorPositionChange?.(newCursorPosition);
|
|
350
|
-
return { newInput, newCursorPosition };
|
|
351
|
-
}
|
|
352
|
-
resetHistoryNavigation() {
|
|
353
|
-
this.historyIndex = -1;
|
|
354
|
-
this.historyBuffer = "";
|
|
355
|
-
}
|
|
356
275
|
// Getter methods for state
|
|
357
276
|
isFileSelectorActive() {
|
|
358
277
|
return this.showFileSelector;
|
|
@@ -360,9 +279,6 @@ export class InputManager {
|
|
|
360
279
|
isCommandSelectorActive() {
|
|
361
280
|
return this.showCommandSelector;
|
|
362
281
|
}
|
|
363
|
-
isMemoryTypeSelectorActive() {
|
|
364
|
-
return this.showMemoryTypeSelector;
|
|
365
|
-
}
|
|
366
282
|
getFileSelectorState() {
|
|
367
283
|
return {
|
|
368
284
|
show: this.showFileSelector,
|
|
@@ -378,12 +294,6 @@ export class InputManager {
|
|
|
378
294
|
position: this.slashPosition,
|
|
379
295
|
};
|
|
380
296
|
}
|
|
381
|
-
getMemoryTypeSelectorState() {
|
|
382
|
-
return {
|
|
383
|
-
show: this.showMemoryTypeSelector,
|
|
384
|
-
message: this.memoryMessage,
|
|
385
|
-
};
|
|
386
|
-
}
|
|
387
297
|
// Update search queries for active selectors
|
|
388
298
|
updateSearchQueriesForActiveSelectors(inputText, cursorPosition) {
|
|
389
299
|
if (this.showFileSelector && this.atPosition >= 0) {
|
|
@@ -411,9 +321,6 @@ export class InputManager {
|
|
|
411
321
|
// Only activate command selector if '/' is at the start of input
|
|
412
322
|
this.activateCommandSelector(this.cursorPosition - 1);
|
|
413
323
|
}
|
|
414
|
-
else if (char === "#" && this.cursorPosition === 1) {
|
|
415
|
-
// Memory message detection will be handled in submit
|
|
416
|
-
}
|
|
417
324
|
else {
|
|
418
325
|
// Update search queries for active selectors
|
|
419
326
|
this.updateSearchQueriesForActiveSelectors(this.inputText, this.cursorPosition);
|
|
@@ -539,12 +446,12 @@ export class InputManager {
|
|
|
539
446
|
}
|
|
540
447
|
}
|
|
541
448
|
// Task manager state methods
|
|
542
|
-
|
|
543
|
-
return this.
|
|
449
|
+
getShowBackgroundTaskManager() {
|
|
450
|
+
return this.showBackgroundTaskManager;
|
|
544
451
|
}
|
|
545
|
-
|
|
546
|
-
this.
|
|
547
|
-
this.callbacks.
|
|
452
|
+
setShowBackgroundTaskManager(show) {
|
|
453
|
+
this.showBackgroundTaskManager = show;
|
|
454
|
+
this.callbacks.onBackgroundTaskManagerStateChange?.(show);
|
|
548
455
|
}
|
|
549
456
|
getShowMcpManager() {
|
|
550
457
|
return this.showMcpManager;
|
|
@@ -586,13 +493,6 @@ export class InputManager {
|
|
|
586
493
|
return;
|
|
587
494
|
}
|
|
588
495
|
if (this.inputText.trim()) {
|
|
589
|
-
const trimmedInput = this.inputText.trim();
|
|
590
|
-
// Check if it's a memory message (starts with # and only one line)
|
|
591
|
-
if (trimmedInput.startsWith("#") && !trimmedInput.includes("\n")) {
|
|
592
|
-
// Activate memory type selector
|
|
593
|
-
this.activateMemoryTypeSelector(trimmedInput);
|
|
594
|
-
return;
|
|
595
|
-
}
|
|
596
496
|
// Extract image information
|
|
597
497
|
const imageRegex = /\[Image #(\d+)\]/g;
|
|
598
498
|
const matches = [...this.inputText.matchAll(imageRegex)];
|
|
@@ -739,15 +639,6 @@ export class InputManager {
|
|
|
739
639
|
this.callbacks.onBackgroundCurrentTask?.();
|
|
740
640
|
return true;
|
|
741
641
|
}
|
|
742
|
-
// Handle up/down keys for history navigation (only when no selector is active)
|
|
743
|
-
if (key.upArrow && !this.showFileSelector && !this.showCommandSelector) {
|
|
744
|
-
this.navigateHistory("up", this.inputText);
|
|
745
|
-
return true;
|
|
746
|
-
}
|
|
747
|
-
if (key.downArrow && !this.showFileSelector && !this.showCommandSelector) {
|
|
748
|
-
this.navigateHistory("down", this.inputText);
|
|
749
|
-
return true;
|
|
750
|
-
}
|
|
751
642
|
// Handle typing input
|
|
752
643
|
if (input &&
|
|
753
644
|
!key.ctrl &&
|
|
@@ -773,7 +664,11 @@ export class InputManager {
|
|
|
773
664
|
return true;
|
|
774
665
|
}
|
|
775
666
|
// Handle interrupt request - use Esc key to interrupt AI request or command
|
|
776
|
-
if (key.escape &&
|
|
667
|
+
if (key.escape &&
|
|
668
|
+
(isLoading || isCommandRunning) &&
|
|
669
|
+
!this.showBackgroundTaskManager &&
|
|
670
|
+
!this.showMcpManager &&
|
|
671
|
+
!this.showRewindManager) {
|
|
777
672
|
// Unified interrupt for AI message generation and command execution
|
|
778
673
|
this.callbacks.onAbortMessage?.();
|
|
779
674
|
return true;
|
|
@@ -788,16 +683,15 @@ export class InputManager {
|
|
|
788
683
|
if (this.showFileSelector ||
|
|
789
684
|
this.showCommandSelector ||
|
|
790
685
|
this.showHistorySearch ||
|
|
791
|
-
this.
|
|
792
|
-
this.showTaskManager ||
|
|
686
|
+
this.showBackgroundTaskManager ||
|
|
793
687
|
this.showMcpManager ||
|
|
794
688
|
this.showRewindManager) {
|
|
795
|
-
if (this.
|
|
796
|
-
this.showTaskManager ||
|
|
689
|
+
if (this.showBackgroundTaskManager ||
|
|
797
690
|
this.showMcpManager ||
|
|
798
691
|
this.showRewindManager) {
|
|
799
|
-
//
|
|
800
|
-
|
|
692
|
+
// Task manager, MCP manager and Rewind don't need to handle input, handled by component itself
|
|
693
|
+
// Return true to indicate we've "handled" it (by ignoring it) so it doesn't leak to normal input
|
|
694
|
+
return true;
|
|
801
695
|
}
|
|
802
696
|
if (this.showHistorySearch) {
|
|
803
697
|
if (key.escape) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wave-code",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "CLI-based code assistant powered by AI, built with React and Ink",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -30,15 +30,14 @@
|
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"chalk": "^5.6.2",
|
|
33
|
-
"cli-highlight": "^2.1.11",
|
|
34
33
|
"diff": "^8.0.2",
|
|
35
34
|
"glob": "^13.0.0",
|
|
36
|
-
"ink": "^6.
|
|
37
|
-
"marked": "^
|
|
35
|
+
"ink": "^6.7.0",
|
|
36
|
+
"marked": "^17.0.2",
|
|
38
37
|
"react": "^19.2.4",
|
|
39
38
|
"react-dom": "19.2.4",
|
|
40
39
|
"yargs": "^17.7.2",
|
|
41
|
-
"wave-agent-sdk": "0.
|
|
40
|
+
"wave-agent-sdk": "0.6.1"
|
|
42
41
|
},
|
|
43
42
|
"devDependencies": {
|
|
44
43
|
"@types/react": "^19.1.8",
|
|
@@ -60,7 +59,7 @@
|
|
|
60
59
|
},
|
|
61
60
|
"license": "MIT",
|
|
62
61
|
"scripts": {
|
|
63
|
-
"wave": "tsx src/index.ts",
|
|
62
|
+
"wave": "tsx --tsconfig tsconfig.dev.json src/index.ts",
|
|
64
63
|
"build": "rimraf dist && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
|
|
65
64
|
"type-check": "tsc --noEmit --incremental",
|
|
66
65
|
"watch": "tsc -p tsconfig.build.json --watch & tsc-alias -p tsconfig.build.json --watch",
|
package/src/components/App.tsx
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import React from "react";
|
|
1
|
+
import React, { useState, useEffect, useRef } from "react";
|
|
2
|
+
import { useStdout } from "ink";
|
|
2
3
|
import { ChatInterface } from "./ChatInterface.js";
|
|
3
|
-
import { ChatProvider } from "../contexts/useChat.js";
|
|
4
|
+
import { ChatProvider, useChat } from "../contexts/useChat.js";
|
|
4
5
|
import { AppProvider } from "../contexts/useAppConfig.js";
|
|
5
6
|
|
|
6
7
|
interface AppProps {
|
|
@@ -16,11 +17,57 @@ const AppWithProviders: React.FC<{
|
|
|
16
17
|
}> = ({ bypassPermissions, pluginDirs }) => {
|
|
17
18
|
return (
|
|
18
19
|
<ChatProvider bypassPermissions={bypassPermissions} pluginDirs={pluginDirs}>
|
|
19
|
-
<
|
|
20
|
+
<ChatInterfaceWithRemount />
|
|
20
21
|
</ChatProvider>
|
|
21
22
|
);
|
|
22
23
|
};
|
|
23
24
|
|
|
25
|
+
const ChatInterfaceWithRemount: React.FC = () => {
|
|
26
|
+
const { stdout } = useStdout();
|
|
27
|
+
const { isExpanded, rewindId, wasLastDetailsTooTall, sessionId } = useChat();
|
|
28
|
+
|
|
29
|
+
const [remountKey, setRemountKey] = useState(
|
|
30
|
+
String(isExpanded) + rewindId + wasLastDetailsTooTall,
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
const prevSessionId = useRef(sessionId);
|
|
34
|
+
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
let newKey = String(isExpanded) + rewindId + wasLastDetailsTooTall;
|
|
37
|
+
|
|
38
|
+
const isSessionChanged =
|
|
39
|
+
prevSessionId.current && sessionId && prevSessionId.current !== sessionId;
|
|
40
|
+
|
|
41
|
+
if (isSessionChanged) {
|
|
42
|
+
newKey += sessionId;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (newKey !== remountKey) {
|
|
46
|
+
stdout?.write("\u001b[2J\u001b[0;0H", (err?: Error | null) => {
|
|
47
|
+
if (err) {
|
|
48
|
+
console.error("Failed to clear terminal:", err);
|
|
49
|
+
}
|
|
50
|
+
setTimeout(() => {
|
|
51
|
+
setRemountKey(newKey);
|
|
52
|
+
}, 100);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (sessionId) {
|
|
57
|
+
prevSessionId.current = sessionId;
|
|
58
|
+
}
|
|
59
|
+
}, [
|
|
60
|
+
isExpanded,
|
|
61
|
+
rewindId,
|
|
62
|
+
wasLastDetailsTooTall,
|
|
63
|
+
sessionId,
|
|
64
|
+
remountKey,
|
|
65
|
+
stdout,
|
|
66
|
+
]);
|
|
67
|
+
|
|
68
|
+
return <ChatInterface key={remountKey} />;
|
|
69
|
+
};
|
|
70
|
+
|
|
24
71
|
export const App: React.FC<AppProps> = ({
|
|
25
72
|
restoreSessionId,
|
|
26
73
|
continueLastSession,
|
|
@@ -12,11 +12,13 @@ interface Task {
|
|
|
12
12
|
runtime?: number;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export interface
|
|
15
|
+
export interface BackgroundTaskManagerProps {
|
|
16
16
|
onCancel: () => void;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export const
|
|
19
|
+
export const BackgroundTaskManager: React.FC<BackgroundTaskManagerProps> = ({
|
|
20
|
+
onCancel,
|
|
21
|
+
}) => {
|
|
20
22
|
const { backgroundTasks, getBackgroundTaskOutput, stopBackgroundTask } =
|
|
21
23
|
useChat();
|
|
22
24
|
const [tasks, setTasks] = useState<Task[]>([]);
|