wave-code 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/components/ChatInterface.d.ts.map +1 -1
- package/dist/components/ChatInterface.js +4 -24
- package/dist/components/CommandSelector.js +4 -4
- package/dist/components/DiffViewer.d.ts +1 -1
- package/dist/components/DiffViewer.d.ts.map +1 -1
- package/dist/components/DiffViewer.js +15 -15
- package/dist/components/FileSelector.js +2 -2
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +46 -101
- package/dist/components/Markdown.d.ts +6 -0
- package/dist/components/Markdown.d.ts.map +1 -0
- package/dist/components/Markdown.js +22 -0
- package/dist/components/MessageItem.d.ts +9 -0
- package/dist/components/MessageItem.d.ts.map +1 -0
- package/dist/components/MessageItem.js +15 -0
- package/dist/components/MessageList.d.ts +1 -1
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +33 -32
- package/dist/components/SubagentBlock.d.ts +1 -2
- package/dist/components/SubagentBlock.d.ts.map +1 -1
- package/dist/components/SubagentBlock.js +29 -20
- package/dist/components/ToolResultDisplay.js +5 -5
- package/dist/contexts/useChat.d.ts +1 -0
- package/dist/contexts/useChat.d.ts.map +1 -1
- package/dist/contexts/useChat.js +29 -2
- package/dist/hooks/useInputManager.d.ts +93 -0
- package/dist/hooks/useInputManager.d.ts.map +1 -0
- package/dist/hooks/useInputManager.js +332 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -10
- package/dist/managers/InputManager.d.ts +171 -0
- package/dist/managers/InputManager.d.ts.map +1 -0
- package/dist/managers/InputManager.js +826 -0
- package/dist/print-cli.d.ts +8 -0
- package/dist/print-cli.d.ts.map +1 -0
- package/dist/print-cli.js +128 -0
- package/dist/utils/constants.d.ts +1 -1
- package/dist/utils/constants.js +1 -1
- package/dist/utils/fileSearch.d.ts +20 -0
- package/dist/utils/fileSearch.d.ts.map +1 -0
- package/dist/utils/fileSearch.js +102 -0
- package/dist/utils/logger.js +3 -3
- package/dist/utils/usageSummary.d.ts +33 -0
- package/dist/utils/usageSummary.d.ts.map +1 -0
- package/dist/utils/usageSummary.js +154 -0
- package/package.json +10 -6
- package/src/components/ChatInterface.tsx +13 -43
- package/src/components/CommandSelector.tsx +5 -5
- package/src/components/DiffViewer.tsx +18 -16
- package/src/components/FileSelector.tsx +2 -2
- package/src/components/InputBox.tsx +78 -169
- package/src/components/Markdown.tsx +29 -0
- package/src/components/MessageItem.tsx +104 -0
- package/src/components/MessageList.tsx +142 -198
- package/src/components/SubagentBlock.tsx +56 -73
- package/src/components/ToolResultDisplay.tsx +6 -6
- package/src/contexts/useChat.tsx +34 -2
- package/src/hooks/useInputManager.ts +461 -0
- package/src/index.ts +20 -10
- package/src/managers/InputManager.ts +1132 -0
- package/src/print-cli.ts +160 -0
- package/src/utils/constants.ts +1 -1
- package/src/utils/fileSearch.ts +133 -0
- package/src/utils/logger.ts +3 -3
- package/src/utils/usageSummary.ts +234 -0
- package/dist/hooks/useBashHistorySelector.d.ts +0 -15
- package/dist/hooks/useBashHistorySelector.d.ts.map +0 -1
- package/dist/hooks/useBashHistorySelector.js +0 -61
- package/dist/hooks/useCommandSelector.d.ts +0 -24
- package/dist/hooks/useCommandSelector.d.ts.map +0 -1
- package/dist/hooks/useCommandSelector.js +0 -98
- package/dist/hooks/useFileSelector.d.ts +0 -16
- package/dist/hooks/useFileSelector.d.ts.map +0 -1
- package/dist/hooks/useFileSelector.js +0 -174
- package/dist/hooks/useImageManager.d.ts +0 -13
- package/dist/hooks/useImageManager.d.ts.map +0 -1
- package/dist/hooks/useImageManager.js +0 -46
- package/dist/hooks/useInputHistory.d.ts +0 -11
- package/dist/hooks/useInputHistory.d.ts.map +0 -1
- package/dist/hooks/useInputHistory.js +0 -64
- package/dist/hooks/useInputKeyboardHandler.d.ts +0 -83
- package/dist/hooks/useInputKeyboardHandler.d.ts.map +0 -1
- package/dist/hooks/useInputKeyboardHandler.js +0 -507
- package/dist/hooks/useInputState.d.ts +0 -14
- package/dist/hooks/useInputState.d.ts.map +0 -1
- package/dist/hooks/useInputState.js +0 -57
- package/dist/hooks/useMemoryTypeSelector.d.ts +0 -9
- package/dist/hooks/useMemoryTypeSelector.d.ts.map +0 -1
- package/dist/hooks/useMemoryTypeSelector.js +0 -27
- package/dist/plain-cli.d.ts +0 -7
- package/dist/plain-cli.d.ts.map +0 -1
- package/dist/plain-cli.js +0 -44
- package/src/hooks/useBashHistorySelector.ts +0 -77
- package/src/hooks/useCommandSelector.ts +0 -131
- package/src/hooks/useFileSelector.ts +0 -227
- package/src/hooks/useImageManager.ts +0 -64
- package/src/hooks/useInputHistory.ts +0 -74
- package/src/hooks/useInputKeyboardHandler.ts +0 -778
- package/src/hooks/useInputState.ts +0 -66
- package/src/hooks/useMemoryTypeSelector.ts +0 -40
- package/src/plain-cli.ts +0 -60
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
import { useEffect, useRef, useState, useCallback } from "react";
|
|
2
|
+
import { Key } from "ink";
|
|
3
|
+
import {
|
|
4
|
+
InputManager,
|
|
5
|
+
InputManagerCallbacks,
|
|
6
|
+
AttachedImage,
|
|
7
|
+
} from "../managers/InputManager.js";
|
|
8
|
+
import { FileItem } from "../components/FileSelector.js";
|
|
9
|
+
|
|
10
|
+
export const useInputManager = (
|
|
11
|
+
callbacks: Partial<InputManagerCallbacks> = {},
|
|
12
|
+
) => {
|
|
13
|
+
const managerRef = useRef<InputManager | null>(null);
|
|
14
|
+
const [isManagerReady, setIsManagerReady] = useState(false);
|
|
15
|
+
|
|
16
|
+
// React state that mirrors InputManager state
|
|
17
|
+
const [inputText, setInputText] = useState("");
|
|
18
|
+
const [cursorPosition, setCursorPosition] = useState(0);
|
|
19
|
+
const [fileSelectorState, setFileSelectorState] = useState({
|
|
20
|
+
show: false,
|
|
21
|
+
files: [] as FileItem[],
|
|
22
|
+
query: "",
|
|
23
|
+
position: -1,
|
|
24
|
+
});
|
|
25
|
+
const [commandSelectorState, setCommandSelectorState] = useState({
|
|
26
|
+
show: false,
|
|
27
|
+
query: "",
|
|
28
|
+
position: -1,
|
|
29
|
+
});
|
|
30
|
+
const [bashHistorySelectorState, setBashHistorySelectorState] = useState({
|
|
31
|
+
show: false,
|
|
32
|
+
query: "",
|
|
33
|
+
position: -1,
|
|
34
|
+
});
|
|
35
|
+
const [memoryTypeSelectorState, setMemoryTypeSelectorState] = useState({
|
|
36
|
+
show: false,
|
|
37
|
+
message: "",
|
|
38
|
+
});
|
|
39
|
+
const [showBashManager, setShowBashManager] = useState(false);
|
|
40
|
+
const [showMcpManager, setShowMcpManager] = useState(false);
|
|
41
|
+
const [attachedImages, setAttachedImages] = useState<AttachedImage[]>([]);
|
|
42
|
+
|
|
43
|
+
// Create InputManager on mount and update callbacks when they change
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (!managerRef.current) {
|
|
46
|
+
// Create InputManager on first mount
|
|
47
|
+
const manager = new InputManager({
|
|
48
|
+
onInputTextChange: setInputText,
|
|
49
|
+
onCursorPositionChange: setCursorPosition,
|
|
50
|
+
onFileSelectorStateChange: (show, files, query, position) => {
|
|
51
|
+
setFileSelectorState({ show, files, query, position });
|
|
52
|
+
},
|
|
53
|
+
onCommandSelectorStateChange: (show, query, position) => {
|
|
54
|
+
setCommandSelectorState({ show, query, position });
|
|
55
|
+
},
|
|
56
|
+
onBashHistorySelectorStateChange: (show, query, position) => {
|
|
57
|
+
setBashHistorySelectorState({ show, query, position });
|
|
58
|
+
},
|
|
59
|
+
onMemoryTypeSelectorStateChange: (show, message) => {
|
|
60
|
+
setMemoryTypeSelectorState({ show, message });
|
|
61
|
+
},
|
|
62
|
+
onBashManagerStateChange: (show) => {
|
|
63
|
+
setShowBashManager(show);
|
|
64
|
+
},
|
|
65
|
+
onMcpManagerStateChange: (show) => {
|
|
66
|
+
setShowMcpManager(show);
|
|
67
|
+
},
|
|
68
|
+
onImagesStateChange: setAttachedImages,
|
|
69
|
+
onShowBashManager: () => setShowBashManager(true),
|
|
70
|
+
onShowMcpManager: () => setShowMcpManager(true),
|
|
71
|
+
...callbacks,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
managerRef.current = manager;
|
|
75
|
+
setIsManagerReady(true);
|
|
76
|
+
} else {
|
|
77
|
+
// Update callbacks on existing manager
|
|
78
|
+
managerRef.current.updateCallbacks({
|
|
79
|
+
onInputTextChange: setInputText,
|
|
80
|
+
onCursorPositionChange: setCursorPosition,
|
|
81
|
+
onFileSelectorStateChange: (show, files, query, position) => {
|
|
82
|
+
setFileSelectorState({ show, files, query, position });
|
|
83
|
+
},
|
|
84
|
+
onCommandSelectorStateChange: (show, query, position) => {
|
|
85
|
+
setCommandSelectorState({ show, query, position });
|
|
86
|
+
},
|
|
87
|
+
onBashHistorySelectorStateChange: (show, query, position) => {
|
|
88
|
+
setBashHistorySelectorState({ show, query, position });
|
|
89
|
+
},
|
|
90
|
+
onMemoryTypeSelectorStateChange: (show, message) => {
|
|
91
|
+
setMemoryTypeSelectorState({ show, message });
|
|
92
|
+
},
|
|
93
|
+
onBashManagerStateChange: (show) => {
|
|
94
|
+
setShowBashManager(show);
|
|
95
|
+
},
|
|
96
|
+
onMcpManagerStateChange: (show) => {
|
|
97
|
+
setShowMcpManager(show);
|
|
98
|
+
},
|
|
99
|
+
onImagesStateChange: setAttachedImages,
|
|
100
|
+
onShowBashManager: () => setShowBashManager(true),
|
|
101
|
+
onShowMcpManager: () => setShowMcpManager(true),
|
|
102
|
+
...callbacks,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}, [callbacks]);
|
|
106
|
+
|
|
107
|
+
// Cleanup on unmount
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
return () => {
|
|
110
|
+
if (managerRef.current) {
|
|
111
|
+
managerRef.current.destroy();
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}, []);
|
|
115
|
+
|
|
116
|
+
// Expose manager methods
|
|
117
|
+
const insertTextAtCursor = useCallback(
|
|
118
|
+
(
|
|
119
|
+
text: string,
|
|
120
|
+
callback?: (newText: string, newCursorPosition: number) => void,
|
|
121
|
+
) => {
|
|
122
|
+
managerRef.current?.insertTextAtCursor(text, callback);
|
|
123
|
+
},
|
|
124
|
+
[],
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
const deleteCharAtCursor = useCallback(
|
|
128
|
+
(callback?: (newText: string, newCursorPosition: number) => void) => {
|
|
129
|
+
managerRef.current?.deleteCharAtCursor(callback);
|
|
130
|
+
},
|
|
131
|
+
[],
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
const clearInput = useCallback(() => {
|
|
135
|
+
managerRef.current?.clearInput();
|
|
136
|
+
}, []);
|
|
137
|
+
|
|
138
|
+
const moveCursorLeft = useCallback(() => {
|
|
139
|
+
managerRef.current?.moveCursorLeft();
|
|
140
|
+
}, []);
|
|
141
|
+
|
|
142
|
+
const moveCursorRight = useCallback(() => {
|
|
143
|
+
managerRef.current?.moveCursorRight();
|
|
144
|
+
}, []);
|
|
145
|
+
|
|
146
|
+
const moveCursorToStart = useCallback(() => {
|
|
147
|
+
managerRef.current?.moveCursorToStart();
|
|
148
|
+
}, []);
|
|
149
|
+
|
|
150
|
+
const moveCursorToEnd = useCallback(() => {
|
|
151
|
+
managerRef.current?.moveCursorToEnd();
|
|
152
|
+
}, []);
|
|
153
|
+
|
|
154
|
+
// File selector methods
|
|
155
|
+
const activateFileSelector = useCallback((position: number) => {
|
|
156
|
+
managerRef.current?.activateFileSelector(position);
|
|
157
|
+
}, []);
|
|
158
|
+
|
|
159
|
+
const handleFileSelect = useCallback(
|
|
160
|
+
(filePath: string) => {
|
|
161
|
+
return (
|
|
162
|
+
managerRef.current?.handleFileSelect(filePath) || {
|
|
163
|
+
newInput: inputText,
|
|
164
|
+
newCursorPosition: cursorPosition,
|
|
165
|
+
}
|
|
166
|
+
);
|
|
167
|
+
},
|
|
168
|
+
[inputText, cursorPosition],
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
const handleCancelFileSelect = useCallback(() => {
|
|
172
|
+
managerRef.current?.handleCancelFileSelect();
|
|
173
|
+
}, []);
|
|
174
|
+
|
|
175
|
+
const updateFileSearchQuery = useCallback((query: string) => {
|
|
176
|
+
managerRef.current?.updateFileSearchQuery(query);
|
|
177
|
+
}, []);
|
|
178
|
+
|
|
179
|
+
const checkForAtDeletion = useCallback((cursorPos: number) => {
|
|
180
|
+
return managerRef.current?.checkForAtDeletion(cursorPos) || false;
|
|
181
|
+
}, []);
|
|
182
|
+
|
|
183
|
+
// Command selector methods
|
|
184
|
+
const activateCommandSelector = useCallback((position: number) => {
|
|
185
|
+
managerRef.current?.activateCommandSelector(position);
|
|
186
|
+
}, []);
|
|
187
|
+
|
|
188
|
+
const handleCommandSelect = useCallback(
|
|
189
|
+
(command: string) => {
|
|
190
|
+
return (
|
|
191
|
+
managerRef.current?.handleCommandSelect(command) || {
|
|
192
|
+
newInput: inputText,
|
|
193
|
+
newCursorPosition: cursorPosition,
|
|
194
|
+
}
|
|
195
|
+
);
|
|
196
|
+
},
|
|
197
|
+
[inputText, cursorPosition],
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
const handleCommandInsert = useCallback(
|
|
201
|
+
(command: string) => {
|
|
202
|
+
return (
|
|
203
|
+
managerRef.current?.handleCommandInsert(command) || {
|
|
204
|
+
newInput: inputText,
|
|
205
|
+
newCursorPosition: cursorPosition,
|
|
206
|
+
}
|
|
207
|
+
);
|
|
208
|
+
},
|
|
209
|
+
[inputText, cursorPosition],
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
const handleCancelCommandSelect = useCallback(() => {
|
|
213
|
+
managerRef.current?.handleCancelCommandSelect();
|
|
214
|
+
}, []);
|
|
215
|
+
|
|
216
|
+
const updateCommandSearchQuery = useCallback((query: string) => {
|
|
217
|
+
managerRef.current?.updateCommandSearchQuery(query);
|
|
218
|
+
}, []);
|
|
219
|
+
|
|
220
|
+
const checkForSlashDeletion = useCallback((cursorPos: number) => {
|
|
221
|
+
return managerRef.current?.checkForSlashDeletion(cursorPos) || false;
|
|
222
|
+
}, []);
|
|
223
|
+
|
|
224
|
+
// Bash history selector methods
|
|
225
|
+
const activateBashHistorySelector = useCallback((position: number) => {
|
|
226
|
+
managerRef.current?.activateBashHistorySelector(position);
|
|
227
|
+
}, []);
|
|
228
|
+
|
|
229
|
+
const handleBashHistorySelect = useCallback(
|
|
230
|
+
(command: string) => {
|
|
231
|
+
return (
|
|
232
|
+
managerRef.current?.handleBashHistorySelect(command) || {
|
|
233
|
+
newInput: inputText,
|
|
234
|
+
newCursorPosition: cursorPosition,
|
|
235
|
+
}
|
|
236
|
+
);
|
|
237
|
+
},
|
|
238
|
+
[inputText, cursorPosition],
|
|
239
|
+
);
|
|
240
|
+
|
|
241
|
+
const handleCancelBashHistorySelect = useCallback(() => {
|
|
242
|
+
managerRef.current?.handleCancelBashHistorySelect();
|
|
243
|
+
}, []);
|
|
244
|
+
|
|
245
|
+
const updateBashHistorySearchQuery = useCallback((query: string) => {
|
|
246
|
+
managerRef.current?.updateBashHistorySearchQuery(query);
|
|
247
|
+
}, []);
|
|
248
|
+
|
|
249
|
+
const handleBashHistoryExecute = useCallback((command: string) => {
|
|
250
|
+
return managerRef.current?.handleBashHistoryExecute(command) || command;
|
|
251
|
+
}, []);
|
|
252
|
+
|
|
253
|
+
const checkForExclamationDeletion = useCallback((cursorPos: number) => {
|
|
254
|
+
return managerRef.current?.checkForExclamationDeletion(cursorPos) || false;
|
|
255
|
+
}, []);
|
|
256
|
+
|
|
257
|
+
// Memory type selector methods
|
|
258
|
+
const activateMemoryTypeSelector = useCallback((message: string) => {
|
|
259
|
+
managerRef.current?.activateMemoryTypeSelector(message);
|
|
260
|
+
}, []);
|
|
261
|
+
|
|
262
|
+
const handleMemoryTypeSelect = useCallback(
|
|
263
|
+
async (type: "project" | "user") => {
|
|
264
|
+
await managerRef.current?.handleMemoryTypeSelect(type);
|
|
265
|
+
},
|
|
266
|
+
[],
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
const handleCancelMemoryTypeSelect = useCallback(() => {
|
|
270
|
+
managerRef.current?.handleCancelMemoryTypeSelect();
|
|
271
|
+
}, []);
|
|
272
|
+
|
|
273
|
+
// Input history methods
|
|
274
|
+
const setUserInputHistory = useCallback((history: string[]) => {
|
|
275
|
+
managerRef.current?.setUserInputHistory(history);
|
|
276
|
+
}, []);
|
|
277
|
+
|
|
278
|
+
const navigateHistory = useCallback(
|
|
279
|
+
(direction: "up" | "down", currentInput: string) => {
|
|
280
|
+
return (
|
|
281
|
+
managerRef.current?.navigateHistory(direction, currentInput) || {
|
|
282
|
+
newInput: currentInput,
|
|
283
|
+
newCursorPosition: currentInput.length,
|
|
284
|
+
}
|
|
285
|
+
);
|
|
286
|
+
},
|
|
287
|
+
[],
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
const resetHistoryNavigation = useCallback(() => {
|
|
291
|
+
managerRef.current?.resetHistoryNavigation();
|
|
292
|
+
}, []);
|
|
293
|
+
|
|
294
|
+
// Special character handling
|
|
295
|
+
const handleSpecialCharInput = useCallback((char: string) => {
|
|
296
|
+
managerRef.current?.handleSpecialCharInput(char);
|
|
297
|
+
}, []);
|
|
298
|
+
|
|
299
|
+
// Direct state access methods (for compatibility with existing code)
|
|
300
|
+
const setInputTextDirect = useCallback((text: string) => {
|
|
301
|
+
managerRef.current?.setInputText(text);
|
|
302
|
+
}, []);
|
|
303
|
+
|
|
304
|
+
const setCursorPositionDirect = useCallback((position: number) => {
|
|
305
|
+
managerRef.current?.setCursorPosition(position);
|
|
306
|
+
}, []);
|
|
307
|
+
|
|
308
|
+
// Complex handlers that combine multiple operations
|
|
309
|
+
const handleBashHistoryExecuteAndSend = useCallback((command: string) => {
|
|
310
|
+
managerRef.current?.handleBashHistoryExecuteAndSend(command);
|
|
311
|
+
}, []);
|
|
312
|
+
|
|
313
|
+
return {
|
|
314
|
+
// State
|
|
315
|
+
inputText,
|
|
316
|
+
cursorPosition,
|
|
317
|
+
showFileSelector: fileSelectorState.show,
|
|
318
|
+
filteredFiles: fileSelectorState.files,
|
|
319
|
+
fileSearchQuery: fileSelectorState.query,
|
|
320
|
+
atPosition: fileSelectorState.position,
|
|
321
|
+
showCommandSelector: commandSelectorState.show,
|
|
322
|
+
commandSearchQuery: commandSelectorState.query,
|
|
323
|
+
slashPosition: commandSelectorState.position,
|
|
324
|
+
showBashHistorySelector: bashHistorySelectorState.show,
|
|
325
|
+
bashHistorySearchQuery: bashHistorySelectorState.query,
|
|
326
|
+
exclamationPosition: bashHistorySelectorState.position,
|
|
327
|
+
showMemoryTypeSelector: memoryTypeSelectorState.show,
|
|
328
|
+
memoryMessage: memoryTypeSelectorState.message,
|
|
329
|
+
showBashManager,
|
|
330
|
+
showMcpManager,
|
|
331
|
+
attachedImages,
|
|
332
|
+
isManagerReady,
|
|
333
|
+
|
|
334
|
+
// Methods
|
|
335
|
+
insertTextAtCursor,
|
|
336
|
+
deleteCharAtCursor,
|
|
337
|
+
clearInput,
|
|
338
|
+
moveCursorLeft,
|
|
339
|
+
moveCursorRight,
|
|
340
|
+
moveCursorToStart,
|
|
341
|
+
moveCursorToEnd,
|
|
342
|
+
|
|
343
|
+
// File selector
|
|
344
|
+
activateFileSelector,
|
|
345
|
+
handleFileSelect,
|
|
346
|
+
handleCancelFileSelect,
|
|
347
|
+
updateFileSearchQuery,
|
|
348
|
+
checkForAtDeletion,
|
|
349
|
+
|
|
350
|
+
// Command selector
|
|
351
|
+
activateCommandSelector,
|
|
352
|
+
handleCommandSelect,
|
|
353
|
+
handleCommandInsert,
|
|
354
|
+
handleCancelCommandSelect,
|
|
355
|
+
updateCommandSearchQuery,
|
|
356
|
+
checkForSlashDeletion,
|
|
357
|
+
|
|
358
|
+
// Bash history selector
|
|
359
|
+
activateBashHistorySelector,
|
|
360
|
+
handleBashHistorySelect,
|
|
361
|
+
handleCancelBashHistorySelect,
|
|
362
|
+
updateBashHistorySearchQuery,
|
|
363
|
+
|
|
364
|
+
handleBashHistoryExecute,
|
|
365
|
+
checkForExclamationDeletion,
|
|
366
|
+
|
|
367
|
+
// Memory type selector
|
|
368
|
+
activateMemoryTypeSelector,
|
|
369
|
+
handleMemoryTypeSelect,
|
|
370
|
+
handleCancelMemoryTypeSelect,
|
|
371
|
+
|
|
372
|
+
// Input history
|
|
373
|
+
setUserInputHistory,
|
|
374
|
+
navigateHistory,
|
|
375
|
+
resetHistoryNavigation,
|
|
376
|
+
|
|
377
|
+
// Special handling
|
|
378
|
+
handleSpecialCharInput,
|
|
379
|
+
|
|
380
|
+
// Bash/MCP Manager
|
|
381
|
+
setShowBashManager: useCallback((show: boolean) => {
|
|
382
|
+
managerRef.current?.setShowBashManager(show);
|
|
383
|
+
}, []),
|
|
384
|
+
setShowMcpManager: useCallback((show: boolean) => {
|
|
385
|
+
managerRef.current?.setShowMcpManager(show);
|
|
386
|
+
}, []),
|
|
387
|
+
|
|
388
|
+
// Image management
|
|
389
|
+
addImage: useCallback((imagePath: string, mimeType: string) => {
|
|
390
|
+
return managerRef.current?.addImage(imagePath, mimeType);
|
|
391
|
+
}, []),
|
|
392
|
+
removeImage: useCallback((imageId: number) => {
|
|
393
|
+
managerRef.current?.removeImage(imageId);
|
|
394
|
+
}, []),
|
|
395
|
+
clearImages: useCallback(() => {
|
|
396
|
+
managerRef.current?.clearImages();
|
|
397
|
+
}, []),
|
|
398
|
+
handlePasteImage: useCallback(async () => {
|
|
399
|
+
return (await managerRef.current?.handlePasteImage()) || false;
|
|
400
|
+
}, []),
|
|
401
|
+
|
|
402
|
+
// Paste and text handling
|
|
403
|
+
handlePasteInput: useCallback((input: string) => {
|
|
404
|
+
managerRef.current?.handlePasteInput(input);
|
|
405
|
+
}, []),
|
|
406
|
+
handleSubmit: useCallback(
|
|
407
|
+
async (
|
|
408
|
+
attachedImages: Array<{ id: number; path: string; mimeType: string }>,
|
|
409
|
+
isLoading: boolean = false,
|
|
410
|
+
isCommandRunning: boolean = false,
|
|
411
|
+
) => {
|
|
412
|
+
await managerRef.current?.handleSubmit(
|
|
413
|
+
attachedImages,
|
|
414
|
+
isLoading,
|
|
415
|
+
isCommandRunning,
|
|
416
|
+
);
|
|
417
|
+
},
|
|
418
|
+
[],
|
|
419
|
+
),
|
|
420
|
+
expandLongTextPlaceholders: useCallback((text: string) => {
|
|
421
|
+
return managerRef.current?.expandLongTextPlaceholders(text) || text;
|
|
422
|
+
}, []),
|
|
423
|
+
clearLongTextMap: useCallback(() => {
|
|
424
|
+
managerRef.current?.clearLongTextMap();
|
|
425
|
+
}, []),
|
|
426
|
+
|
|
427
|
+
// Complex handlers combining multiple operations
|
|
428
|
+
handleBashHistoryExecuteAndSend,
|
|
429
|
+
|
|
430
|
+
// Main input handler
|
|
431
|
+
handleInput: useCallback(
|
|
432
|
+
async (
|
|
433
|
+
input: string,
|
|
434
|
+
key: Key,
|
|
435
|
+
attachedImages: Array<{ id: number; path: string; mimeType: string }>,
|
|
436
|
+
isLoading: boolean = false,
|
|
437
|
+
isCommandRunning: boolean = false,
|
|
438
|
+
clearImages?: () => void,
|
|
439
|
+
) => {
|
|
440
|
+
return (
|
|
441
|
+
(await managerRef.current?.handleInput(
|
|
442
|
+
input,
|
|
443
|
+
key,
|
|
444
|
+
attachedImages,
|
|
445
|
+
isLoading,
|
|
446
|
+
isCommandRunning,
|
|
447
|
+
clearImages,
|
|
448
|
+
)) || false
|
|
449
|
+
);
|
|
450
|
+
},
|
|
451
|
+
[],
|
|
452
|
+
),
|
|
453
|
+
|
|
454
|
+
// Direct state setters (for React compatibility)
|
|
455
|
+
setInputText: setInputTextDirect,
|
|
456
|
+
setCursorPosition: setCursorPositionDirect,
|
|
457
|
+
|
|
458
|
+
// Manager reference for advanced usage
|
|
459
|
+
manager: managerRef.current,
|
|
460
|
+
};
|
|
461
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import yargs from "yargs";
|
|
2
2
|
import { hideBin } from "yargs/helpers";
|
|
3
3
|
import { startCli } from "./cli.js";
|
|
4
|
-
import { listSessions } from "wave-agent-sdk";
|
|
4
|
+
import { listSessions, getSessionFilePath } from "wave-agent-sdk";
|
|
5
5
|
|
|
6
6
|
// Export main function for external use
|
|
7
7
|
export async function main() {
|
|
@@ -16,11 +16,15 @@ export async function main() {
|
|
|
16
16
|
description: "Continue from last session",
|
|
17
17
|
type: "boolean",
|
|
18
18
|
})
|
|
19
|
-
.option("
|
|
19
|
+
.option("print", {
|
|
20
20
|
alias: "p",
|
|
21
|
-
description: "
|
|
21
|
+
description: "Print response without interactive mode",
|
|
22
22
|
type: "string",
|
|
23
23
|
})
|
|
24
|
+
.option("show-stats", {
|
|
25
|
+
description: "Show timing and usage statistics in print mode",
|
|
26
|
+
type: "boolean",
|
|
27
|
+
})
|
|
24
28
|
.option("list-sessions", {
|
|
25
29
|
description: "List all available sessions",
|
|
26
30
|
type: "boolean",
|
|
@@ -30,8 +34,11 @@ export async function main() {
|
|
|
30
34
|
.example("$0", "Start CLI with default settings")
|
|
31
35
|
.example("$0 --restore session_123", "Restore specific session")
|
|
32
36
|
.example("$0 --continue", "Continue from last session")
|
|
33
|
-
.example("$0 --
|
|
34
|
-
.example(
|
|
37
|
+
.example("$0 --print 'Hello'", "Send message in print mode")
|
|
38
|
+
.example(
|
|
39
|
+
"$0 -p 'Hello' --show-stats",
|
|
40
|
+
"Send message in print mode with statistics",
|
|
41
|
+
)
|
|
35
42
|
.example("$0 --list-sessions", "List all available sessions")
|
|
36
43
|
.help("h")
|
|
37
44
|
.parseAsync();
|
|
@@ -53,9 +60,11 @@ export async function main() {
|
|
|
53
60
|
for (const session of sessions) {
|
|
54
61
|
const startedAt = new Date(session.startedAt).toLocaleString();
|
|
55
62
|
const lastActiveAt = new Date(session.lastActiveAt).toLocaleString();
|
|
63
|
+
const filePath = await getSessionFilePath(session.id, session.workdir);
|
|
56
64
|
|
|
57
65
|
console.log(`ID: ${session.id}`);
|
|
58
66
|
console.log(` Workdir: ${session.workdir}`);
|
|
67
|
+
console.log(` File Path: ${filePath}`);
|
|
59
68
|
console.log(` Started: ${startedAt}`);
|
|
60
69
|
console.log(` Last Active: ${lastActiveAt}`);
|
|
61
70
|
console.log(` Last Message Tokens: ${session.latestTotalTokens}`);
|
|
@@ -69,13 +78,14 @@ export async function main() {
|
|
|
69
78
|
}
|
|
70
79
|
}
|
|
71
80
|
|
|
72
|
-
// Handle
|
|
73
|
-
if (argv.
|
|
74
|
-
const {
|
|
75
|
-
return
|
|
81
|
+
// Handle print mode directly
|
|
82
|
+
if (argv.print !== undefined) {
|
|
83
|
+
const { startPrintCli } = await import("./print-cli.js");
|
|
84
|
+
return startPrintCli({
|
|
76
85
|
restoreSessionId: argv.restore,
|
|
77
86
|
continueLastSession: argv.continue,
|
|
78
|
-
message: argv.
|
|
87
|
+
message: argv.print,
|
|
88
|
+
showStats: argv.showStats,
|
|
79
89
|
});
|
|
80
90
|
}
|
|
81
91
|
|