wave-code 0.8.0 → 0.8.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/ChatInterface.js +1 -1
- package/dist/components/CommandSelector.d.ts.map +1 -1
- package/dist/components/CommandSelector.js +1 -38
- package/dist/components/ConfirmationSelector.d.ts.map +1 -1
- package/dist/components/ConfirmationSelector.js +11 -3
- package/dist/components/HelpView.d.ts +2 -0
- package/dist/components/HelpView.d.ts.map +1 -1
- package/dist/components/HelpView.js +49 -5
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +1 -1
- package/dist/components/MessageList.d.ts +2 -2
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +5 -6
- package/dist/constants/commands.d.ts +3 -0
- package/dist/constants/commands.d.ts.map +1 -0
- package/dist/constants/commands.js +38 -0
- package/dist/contexts/useChat.d.ts.map +1 -1
- package/dist/contexts/useChat.js +2 -17
- package/dist/hooks/useInputManager.d.ts +7 -8
- package/dist/hooks/useInputManager.d.ts.map +1 -1
- package/dist/hooks/useInputManager.js +224 -232
- package/dist/managers/inputHandlers.d.ts +28 -0
- package/dist/managers/inputHandlers.d.ts.map +1 -0
- package/dist/managers/inputHandlers.js +378 -0
- package/dist/managers/inputReducer.d.ts +157 -0
- package/dist/managers/inputReducer.d.ts.map +1 -0
- package/dist/managers/inputReducer.js +242 -0
- package/dist/utils/highlightUtils.d.ts.map +1 -1
- package/dist/utils/highlightUtils.js +66 -42
- package/package.json +2 -2
- package/src/components/ChatInterface.tsx +1 -1
- package/src/components/CommandSelector.tsx +1 -40
- package/src/components/ConfirmationSelector.tsx +13 -3
- package/src/components/HelpView.tsx +129 -16
- package/src/components/InputBox.tsx +3 -1
- package/src/components/MessageList.tsx +5 -6
- package/src/constants/commands.ts +41 -0
- package/src/contexts/useChat.tsx +2 -17
- package/src/hooks/useInputManager.ts +352 -299
- package/src/managers/inputHandlers.ts +560 -0
- package/src/managers/inputReducer.ts +367 -0
- package/src/utils/highlightUtils.ts +66 -42
- package/dist/managers/InputManager.d.ts +0 -156
- package/dist/managers/InputManager.d.ts.map +0 -1
- package/dist/managers/InputManager.js +0 -749
- package/src/managers/InputManager.ts +0 -1024
|
@@ -1,223 +1,249 @@
|
|
|
1
|
-
import { useEffect,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { useEffect, useReducer, useCallback, useRef } from "react";
|
|
2
|
+
import { inputReducer, initialState, } from "../managers/inputReducer.js";
|
|
3
|
+
import { searchFiles as searchFilesUtil } from "wave-agent-sdk";
|
|
4
|
+
import * as handlers from "../managers/inputHandlers.js";
|
|
4
5
|
export const useInputManager = (callbacks = {}) => {
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const [cursorPosition, setCursorPosition] = useState(0);
|
|
10
|
-
const [fileSelectorState, setFileSelectorState] = useState({
|
|
11
|
-
show: false,
|
|
12
|
-
files: [],
|
|
13
|
-
query: "",
|
|
14
|
-
position: -1,
|
|
15
|
-
});
|
|
16
|
-
const [commandSelectorState, setCommandSelectorState] = useState({
|
|
17
|
-
show: false,
|
|
18
|
-
query: "",
|
|
19
|
-
position: -1,
|
|
20
|
-
});
|
|
21
|
-
const [historySearchState, setHistorySearchState] = useState({
|
|
22
|
-
show: false,
|
|
23
|
-
query: "",
|
|
24
|
-
});
|
|
25
|
-
const [showBackgroundTaskManager, setShowBackgroundTaskManager] = useState(false);
|
|
26
|
-
const [showMcpManager, setShowMcpManager] = useState(false);
|
|
27
|
-
const [showRewindManager, setShowRewindManager] = useState(false);
|
|
28
|
-
const [showHelp, setShowHelp] = useState(false);
|
|
29
|
-
const [showStatusCommand, setShowStatusCommand] = useState(false);
|
|
30
|
-
const [permissionMode, setPermissionModeState] = useState("default");
|
|
31
|
-
const [attachedImages, setAttachedImages] = useState([]);
|
|
32
|
-
// Create InputManager on mount and update callbacks when they change
|
|
6
|
+
const [state, dispatch] = useReducer(inputReducer, initialState);
|
|
7
|
+
const callbacksRef = useRef(callbacks);
|
|
8
|
+
const stateRef = useRef(state);
|
|
9
|
+
// Update refs when they change
|
|
33
10
|
useEffect(() => {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
onHistorySearchStateChange: (show, query) => {
|
|
47
|
-
setHistorySearchState({ show, query });
|
|
48
|
-
},
|
|
49
|
-
onBackgroundTaskManagerStateChange: (show) => {
|
|
50
|
-
setShowBackgroundTaskManager(show);
|
|
51
|
-
},
|
|
52
|
-
onMcpManagerStateChange: (show) => {
|
|
53
|
-
setShowMcpManager(show);
|
|
54
|
-
},
|
|
55
|
-
onRewindManagerStateChange: (show) => {
|
|
56
|
-
setShowRewindManager(show);
|
|
57
|
-
},
|
|
58
|
-
onHelpStateChange: (show) => {
|
|
59
|
-
setShowHelp(show);
|
|
60
|
-
},
|
|
61
|
-
onStatusCommandStateChange: (show) => {
|
|
62
|
-
setShowStatusCommand(show);
|
|
63
|
-
},
|
|
64
|
-
onPermissionModeChange: (mode) => {
|
|
65
|
-
setPermissionModeState(mode);
|
|
66
|
-
callbacks.onPermissionModeChange?.(mode);
|
|
67
|
-
},
|
|
68
|
-
onImagesStateChange: setAttachedImages,
|
|
69
|
-
...callbacks,
|
|
70
|
-
});
|
|
71
|
-
managerRef.current = manager;
|
|
72
|
-
setIsManagerReady(true);
|
|
11
|
+
callbacksRef.current = callbacks;
|
|
12
|
+
}, [callbacks]);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
stateRef.current = state;
|
|
15
|
+
}, [state]);
|
|
16
|
+
// Handle selectorJustUsed reset
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
if (state.selectorJustUsed) {
|
|
19
|
+
const timer = setTimeout(() => {
|
|
20
|
+
dispatch({ type: "SET_SELECTOR_JUST_USED", payload: false });
|
|
21
|
+
}, 0);
|
|
22
|
+
return () => clearTimeout(timer);
|
|
73
23
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
setShowBackgroundTaskManager(show);
|
|
91
|
-
},
|
|
92
|
-
onMcpManagerStateChange: (show) => {
|
|
93
|
-
setShowMcpManager(show);
|
|
94
|
-
},
|
|
95
|
-
onRewindManagerStateChange: (show) => {
|
|
96
|
-
setShowRewindManager(show);
|
|
97
|
-
},
|
|
98
|
-
onHelpStateChange: (show) => {
|
|
99
|
-
setShowHelp(show);
|
|
100
|
-
},
|
|
101
|
-
onStatusCommandStateChange: (show) => {
|
|
102
|
-
setShowStatusCommand(show);
|
|
103
|
-
},
|
|
104
|
-
onPermissionModeChange: (mode) => {
|
|
105
|
-
setPermissionModeState(mode);
|
|
106
|
-
callbacks.onPermissionModeChange?.(mode);
|
|
107
|
-
},
|
|
108
|
-
onImagesStateChange: setAttachedImages,
|
|
109
|
-
...callbacks,
|
|
110
|
-
});
|
|
24
|
+
}, [state.selectorJustUsed]);
|
|
25
|
+
// Handle debounced file search
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (state.showFileSelector) {
|
|
28
|
+
const debounceDelay = parseInt(process.env.FILE_SELECTOR_DEBOUNCE_MS || "300", 10);
|
|
29
|
+
const timer = setTimeout(async () => {
|
|
30
|
+
try {
|
|
31
|
+
const fileItems = await searchFilesUtil(state.fileSearchQuery);
|
|
32
|
+
dispatch({ type: "SET_FILTERED_FILES", payload: fileItems });
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
console.error("File search error:", error);
|
|
36
|
+
dispatch({ type: "SET_FILTERED_FILES", payload: [] });
|
|
37
|
+
}
|
|
38
|
+
}, debounceDelay);
|
|
39
|
+
return () => clearTimeout(timer);
|
|
111
40
|
}
|
|
112
|
-
}, [
|
|
113
|
-
//
|
|
41
|
+
}, [state.showFileSelector, state.fileSearchQuery]);
|
|
42
|
+
// Handle paste debouncing
|
|
114
43
|
useEffect(() => {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
44
|
+
if (state.isPasting) {
|
|
45
|
+
const pasteDebounceDelay = parseInt(process.env.PASTE_DEBOUNCE_MS || "30", 10);
|
|
46
|
+
const timer = setTimeout(() => {
|
|
47
|
+
const processedInput = stateRef.current.pasteBuffer.replace(/\r/g, "\n");
|
|
48
|
+
dispatch({ type: "COMPRESS_AND_INSERT_TEXT", payload: processedInput });
|
|
49
|
+
dispatch({ type: "END_PASTE" });
|
|
50
|
+
callbacksRef.current.onResetHistoryNavigation?.();
|
|
51
|
+
}, pasteDebounceDelay);
|
|
52
|
+
return () => clearTimeout(timer);
|
|
53
|
+
}
|
|
54
|
+
}, [state.isPasting, state.pasteBuffer]);
|
|
55
|
+
// Sync state changes with callbacks
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
callbacksRef.current.onInputTextChange?.(state.inputText);
|
|
58
|
+
}, [state.inputText]);
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
callbacksRef.current.onCursorPositionChange?.(state.cursorPosition);
|
|
61
|
+
}, [state.cursorPosition]);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
callbacksRef.current.onFileSelectorStateChange?.(state.showFileSelector, state.filteredFiles, state.fileSearchQuery, state.atPosition);
|
|
64
|
+
}, [
|
|
65
|
+
state.showFileSelector,
|
|
66
|
+
state.filteredFiles,
|
|
67
|
+
state.fileSearchQuery,
|
|
68
|
+
state.atPosition,
|
|
69
|
+
]);
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
callbacksRef.current.onCommandSelectorStateChange?.(state.showCommandSelector, state.commandSearchQuery, state.slashPosition);
|
|
72
|
+
}, [
|
|
73
|
+
state.showCommandSelector,
|
|
74
|
+
state.commandSearchQuery,
|
|
75
|
+
state.slashPosition,
|
|
76
|
+
]);
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
callbacksRef.current.onHistorySearchStateChange?.(state.showHistorySearch, state.historySearchQuery);
|
|
79
|
+
}, [state.showHistorySearch, state.historySearchQuery]);
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
callbacksRef.current.onBackgroundTaskManagerStateChange?.(state.showBackgroundTaskManager);
|
|
82
|
+
}, [state.showBackgroundTaskManager]);
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
callbacksRef.current.onMcpManagerStateChange?.(state.showMcpManager);
|
|
85
|
+
}, [state.showMcpManager]);
|
|
86
|
+
useEffect(() => {
|
|
87
|
+
callbacksRef.current.onRewindManagerStateChange?.(state.showRewindManager);
|
|
88
|
+
}, [state.showRewindManager]);
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
callbacksRef.current.onHelpStateChange?.(state.showHelp);
|
|
91
|
+
}, [state.showHelp]);
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
callbacksRef.current.onStatusCommandStateChange?.(state.showStatusCommand);
|
|
94
|
+
}, [state.showStatusCommand]);
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
callbacksRef.current.onImagesStateChange?.(state.attachedImages);
|
|
97
|
+
}, [state.attachedImages]);
|
|
98
|
+
// Methods
|
|
99
|
+
const insertTextAtCursor = useCallback((text) => {
|
|
100
|
+
dispatch({ type: "INSERT_TEXT", payload: text });
|
|
124
101
|
}, []);
|
|
125
|
-
const deleteCharAtCursor = useCallback((
|
|
126
|
-
|
|
102
|
+
const deleteCharAtCursor = useCallback(() => {
|
|
103
|
+
dispatch({ type: "DELETE_CHAR" });
|
|
127
104
|
}, []);
|
|
128
105
|
const clearInput = useCallback(() => {
|
|
129
|
-
|
|
106
|
+
dispatch({ type: "CLEAR_INPUT" });
|
|
130
107
|
}, []);
|
|
131
108
|
const moveCursorLeft = useCallback(() => {
|
|
132
|
-
|
|
109
|
+
dispatch({ type: "MOVE_CURSOR", payload: -1 });
|
|
133
110
|
}, []);
|
|
134
111
|
const moveCursorRight = useCallback(() => {
|
|
135
|
-
|
|
112
|
+
dispatch({ type: "MOVE_CURSOR", payload: 1 });
|
|
136
113
|
}, []);
|
|
137
|
-
// File selector methods
|
|
138
114
|
const activateFileSelector = useCallback((position) => {
|
|
139
|
-
|
|
115
|
+
dispatch({ type: "ACTIVATE_FILE_SELECTOR", payload: position });
|
|
140
116
|
}, []);
|
|
141
117
|
const handleFileSelect = useCallback((filePath) => {
|
|
142
|
-
return (
|
|
143
|
-
|
|
144
|
-
newCursorPosition: cursorPosition,
|
|
145
|
-
});
|
|
146
|
-
}, [inputText, cursorPosition]);
|
|
118
|
+
return handlers.handleFileSelect(stateRef.current, dispatch, callbacksRef.current, filePath);
|
|
119
|
+
}, []);
|
|
147
120
|
const handleCancelFileSelect = useCallback(() => {
|
|
148
|
-
|
|
121
|
+
dispatch({ type: "CANCEL_FILE_SELECTOR" });
|
|
149
122
|
}, []);
|
|
150
123
|
const updateFileSearchQuery = useCallback((query) => {
|
|
151
|
-
|
|
124
|
+
dispatch({ type: "SET_FILE_SEARCH_QUERY", payload: query });
|
|
152
125
|
}, []);
|
|
153
126
|
const checkForAtDeletion = useCallback((cursorPos) => {
|
|
154
|
-
return
|
|
127
|
+
return handlers.checkForAtDeletion(stateRef.current, dispatch, cursorPos);
|
|
155
128
|
}, []);
|
|
156
|
-
// Command selector methods
|
|
157
129
|
const activateCommandSelector = useCallback((position) => {
|
|
158
|
-
|
|
130
|
+
dispatch({ type: "ACTIVATE_COMMAND_SELECTOR", payload: position });
|
|
159
131
|
}, []);
|
|
160
132
|
const handleCommandSelect = useCallback((command) => {
|
|
161
|
-
return (
|
|
162
|
-
|
|
163
|
-
newCursorPosition: cursorPosition,
|
|
164
|
-
});
|
|
165
|
-
}, [inputText, cursorPosition]);
|
|
133
|
+
return handlers.handleCommandSelect(stateRef.current, dispatch, callbacksRef.current, command);
|
|
134
|
+
}, []);
|
|
166
135
|
const handleCommandInsert = useCallback((command) => {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
136
|
+
const currentState = stateRef.current;
|
|
137
|
+
if (currentState.slashPosition >= 0) {
|
|
138
|
+
const beforeSlash = currentState.inputText.substring(0, currentState.slashPosition);
|
|
139
|
+
const afterQuery = currentState.inputText.substring(currentState.cursorPosition);
|
|
140
|
+
const newInput = beforeSlash + `/${command} ` + afterQuery;
|
|
141
|
+
const newCursorPosition = beforeSlash.length + command.length + 2;
|
|
142
|
+
dispatch({ type: "SET_INPUT_TEXT", payload: newInput });
|
|
143
|
+
dispatch({ type: "SET_CURSOR_POSITION", payload: newCursorPosition });
|
|
144
|
+
dispatch({ type: "CANCEL_COMMAND_SELECTOR" });
|
|
145
|
+
callbacksRef.current.onInputTextChange?.(newInput);
|
|
146
|
+
callbacksRef.current.onCursorPositionChange?.(newCursorPosition);
|
|
147
|
+
return { newInput, newCursorPosition };
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
newInput: currentState.inputText,
|
|
151
|
+
newCursorPosition: currentState.cursorPosition,
|
|
152
|
+
};
|
|
153
|
+
}, []);
|
|
172
154
|
const handleCancelCommandSelect = useCallback(() => {
|
|
173
|
-
|
|
155
|
+
dispatch({ type: "CANCEL_COMMAND_SELECTOR" });
|
|
174
156
|
}, []);
|
|
175
157
|
const updateCommandSearchQuery = useCallback((query) => {
|
|
176
|
-
|
|
158
|
+
dispatch({ type: "SET_COMMAND_SEARCH_QUERY", payload: query });
|
|
177
159
|
}, []);
|
|
178
160
|
const checkForSlashDeletion = useCallback((cursorPos) => {
|
|
179
|
-
return
|
|
161
|
+
return handlers.checkForSlashDeletion(stateRef.current, dispatch, cursorPos);
|
|
180
162
|
}, []);
|
|
181
|
-
// History search methods
|
|
182
163
|
const handleHistorySearchSelect = useCallback((prompt) => {
|
|
183
|
-
|
|
164
|
+
dispatch({ type: "SET_INPUT_TEXT", payload: prompt });
|
|
165
|
+
dispatch({ type: "SET_CURSOR_POSITION", payload: prompt.length });
|
|
166
|
+
dispatch({ type: "CANCEL_HISTORY_SEARCH" });
|
|
184
167
|
}, []);
|
|
185
168
|
const handleCancelHistorySearch = useCallback(() => {
|
|
186
|
-
|
|
169
|
+
dispatch({ type: "CANCEL_HISTORY_SEARCH" });
|
|
187
170
|
}, []);
|
|
188
|
-
// Special character handling
|
|
189
171
|
const handleSpecialCharInput = useCallback((char) => {
|
|
190
|
-
|
|
172
|
+
handlers.handleSpecialCharInput(stateRef.current, dispatch, char, stateRef.current.cursorPosition, stateRef.current.inputText);
|
|
173
|
+
}, []);
|
|
174
|
+
const setInputText = useCallback((text) => {
|
|
175
|
+
dispatch({ type: "SET_INPUT_TEXT", payload: text });
|
|
176
|
+
}, []);
|
|
177
|
+
const setCursorPosition = useCallback((position) => {
|
|
178
|
+
dispatch({ type: "SET_CURSOR_POSITION", payload: position });
|
|
179
|
+
}, []);
|
|
180
|
+
const setShowBackgroundTaskManager = useCallback((show) => {
|
|
181
|
+
dispatch({ type: "SET_SHOW_BACKGROUND_TASK_MANAGER", payload: show });
|
|
182
|
+
}, []);
|
|
183
|
+
const setShowMcpManager = useCallback((show) => {
|
|
184
|
+
dispatch({ type: "SET_SHOW_MCP_MANAGER", payload: show });
|
|
185
|
+
}, []);
|
|
186
|
+
const setShowRewindManager = useCallback((show) => {
|
|
187
|
+
dispatch({ type: "SET_SHOW_REWIND_MANAGER", payload: show });
|
|
188
|
+
}, []);
|
|
189
|
+
const setShowHelp = useCallback((show) => {
|
|
190
|
+
dispatch({ type: "SET_SHOW_HELP", payload: show });
|
|
191
|
+
}, []);
|
|
192
|
+
const setShowStatusCommand = useCallback((show) => {
|
|
193
|
+
dispatch({ type: "SET_SHOW_STATUS_COMMAND", payload: show });
|
|
194
|
+
}, []);
|
|
195
|
+
const setPermissionMode = useCallback((mode) => {
|
|
196
|
+
dispatch({ type: "SET_PERMISSION_MODE", payload: mode });
|
|
197
|
+
callbacksRef.current.onPermissionModeChange?.(mode);
|
|
198
|
+
}, []);
|
|
199
|
+
const addImage = useCallback((imagePath, mimeType) => {
|
|
200
|
+
dispatch({ type: "ADD_IMAGE", payload: { path: imagePath, mimeType } });
|
|
201
|
+
}, []);
|
|
202
|
+
const removeImage = useCallback((imageId) => {
|
|
203
|
+
dispatch({ type: "REMOVE_IMAGE", payload: imageId });
|
|
204
|
+
}, []);
|
|
205
|
+
const clearImages = useCallback(() => {
|
|
206
|
+
dispatch({ type: "CLEAR_IMAGES" });
|
|
207
|
+
}, []);
|
|
208
|
+
const handlePasteImage = useCallback(async () => {
|
|
209
|
+
return await handlers.handlePasteImage(dispatch);
|
|
210
|
+
}, []);
|
|
211
|
+
const handlePasteInput = useCallback((input) => {
|
|
212
|
+
handlers.handlePasteInput(stateRef.current, dispatch, callbacksRef.current, input);
|
|
213
|
+
}, []);
|
|
214
|
+
const handleSubmit = useCallback(async (attachedImages, isLoading = false, isCommandRunning = false) => {
|
|
215
|
+
await handlers.handleSubmit(stateRef.current, dispatch, callbacksRef.current, isLoading, isCommandRunning, attachedImages);
|
|
216
|
+
}, []);
|
|
217
|
+
const expandLongTextPlaceholders = useCallback((text) => {
|
|
218
|
+
return handlers.expandLongTextPlaceholders(text, stateRef.current.longTextMap);
|
|
191
219
|
}, []);
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
managerRef.current?.setInputText(text);
|
|
220
|
+
const clearLongTextMap = useCallback(() => {
|
|
221
|
+
dispatch({ type: "CLEAR_LONG_TEXT_MAP" });
|
|
195
222
|
}, []);
|
|
196
|
-
const
|
|
197
|
-
|
|
223
|
+
const handleInput = useCallback(async (input, key, attachedImages, isLoading = false, isCommandRunning = false, clearImages) => {
|
|
224
|
+
return await handlers.handleInput(stateRef.current, dispatch, callbacksRef.current, input, key, isLoading, isCommandRunning, clearImages);
|
|
198
225
|
}, []);
|
|
199
|
-
// Complex handlers that combine multiple operations
|
|
200
226
|
return {
|
|
201
227
|
// State
|
|
202
|
-
inputText,
|
|
203
|
-
cursorPosition,
|
|
204
|
-
showFileSelector:
|
|
205
|
-
filteredFiles:
|
|
206
|
-
fileSearchQuery:
|
|
207
|
-
atPosition:
|
|
208
|
-
showCommandSelector:
|
|
209
|
-
commandSearchQuery:
|
|
210
|
-
slashPosition:
|
|
211
|
-
showHistorySearch:
|
|
212
|
-
historySearchQuery:
|
|
213
|
-
showBackgroundTaskManager,
|
|
214
|
-
showMcpManager,
|
|
215
|
-
showRewindManager,
|
|
216
|
-
showHelp,
|
|
217
|
-
showStatusCommand,
|
|
218
|
-
permissionMode,
|
|
219
|
-
attachedImages,
|
|
220
|
-
isManagerReady,
|
|
228
|
+
inputText: state.inputText,
|
|
229
|
+
cursorPosition: state.cursorPosition,
|
|
230
|
+
showFileSelector: state.showFileSelector,
|
|
231
|
+
filteredFiles: state.filteredFiles,
|
|
232
|
+
fileSearchQuery: state.fileSearchQuery,
|
|
233
|
+
atPosition: state.atPosition,
|
|
234
|
+
showCommandSelector: state.showCommandSelector,
|
|
235
|
+
commandSearchQuery: state.commandSearchQuery,
|
|
236
|
+
slashPosition: state.slashPosition,
|
|
237
|
+
showHistorySearch: state.showHistorySearch,
|
|
238
|
+
historySearchQuery: state.historySearchQuery,
|
|
239
|
+
showBackgroundTaskManager: state.showBackgroundTaskManager,
|
|
240
|
+
showMcpManager: state.showMcpManager,
|
|
241
|
+
showRewindManager: state.showRewindManager,
|
|
242
|
+
showHelp: state.showHelp,
|
|
243
|
+
showStatusCommand: state.showStatusCommand,
|
|
244
|
+
permissionMode: state.permissionMode,
|
|
245
|
+
attachedImages: state.attachedImages,
|
|
246
|
+
isManagerReady: true,
|
|
221
247
|
// Methods
|
|
222
248
|
insertTextAtCursor,
|
|
223
249
|
deleteCharAtCursor,
|
|
@@ -243,62 +269,28 @@ export const useInputManager = (callbacks = {}) => {
|
|
|
243
269
|
// Special handling
|
|
244
270
|
handleSpecialCharInput,
|
|
245
271
|
// Bash/MCP Manager
|
|
246
|
-
setShowBackgroundTaskManager
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
setShowRewindManager: useCallback((show) => {
|
|
253
|
-
managerRef.current?.setShowRewindManager(show);
|
|
254
|
-
setShowRewindManager(show);
|
|
255
|
-
}, []),
|
|
256
|
-
setShowHelp: useCallback((show) => {
|
|
257
|
-
managerRef.current?.setShowHelp(show);
|
|
258
|
-
setShowHelp(show);
|
|
259
|
-
}, []),
|
|
260
|
-
setShowStatusCommand: useCallback((show) => {
|
|
261
|
-
managerRef.current?.setShowStatusCommand(show);
|
|
262
|
-
setShowStatusCommand(show);
|
|
263
|
-
}, []),
|
|
264
|
-
setPermissionMode: useCallback((mode) => {
|
|
265
|
-
setPermissionModeState(mode);
|
|
266
|
-
managerRef.current?.setPermissionMode(mode);
|
|
267
|
-
}, []),
|
|
272
|
+
setShowBackgroundTaskManager,
|
|
273
|
+
setShowMcpManager,
|
|
274
|
+
setShowRewindManager,
|
|
275
|
+
setShowHelp,
|
|
276
|
+
setShowStatusCommand,
|
|
277
|
+
setPermissionMode,
|
|
268
278
|
// Image management
|
|
269
|
-
addImage
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
managerRef.current?.removeImage(imageId);
|
|
274
|
-
}, []),
|
|
275
|
-
clearImages: useCallback(() => {
|
|
276
|
-
managerRef.current?.clearImages();
|
|
277
|
-
}, []),
|
|
278
|
-
handlePasteImage: useCallback(async () => {
|
|
279
|
-
return (await managerRef.current?.handlePasteImage()) || false;
|
|
280
|
-
}, []),
|
|
279
|
+
addImage,
|
|
280
|
+
removeImage,
|
|
281
|
+
clearImages,
|
|
282
|
+
handlePasteImage,
|
|
281
283
|
// Paste and text handling
|
|
282
|
-
handlePasteInput
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
await managerRef.current?.handleSubmit(attachedImages, isLoading, isCommandRunning);
|
|
287
|
-
}, []),
|
|
288
|
-
expandLongTextPlaceholders: useCallback((text) => {
|
|
289
|
-
return managerRef.current?.expandLongTextPlaceholders(text) || text;
|
|
290
|
-
}, []),
|
|
291
|
-
clearLongTextMap: useCallback(() => {
|
|
292
|
-
managerRef.current?.clearLongTextMap();
|
|
293
|
-
}, []),
|
|
284
|
+
handlePasteInput,
|
|
285
|
+
handleSubmit,
|
|
286
|
+
expandLongTextPlaceholders,
|
|
287
|
+
clearLongTextMap,
|
|
294
288
|
// Main input handler
|
|
295
|
-
handleInput
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
// Manager reference for advanced usage
|
|
302
|
-
manager: managerRef.current,
|
|
289
|
+
handleInput,
|
|
290
|
+
// Direct state setters
|
|
291
|
+
setInputText,
|
|
292
|
+
setCursorPosition,
|
|
293
|
+
// Manager reference (for compatibility, though it's null now)
|
|
294
|
+
manager: null,
|
|
303
295
|
};
|
|
304
296
|
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Key } from "ink";
|
|
2
|
+
import { PermissionMode } from "wave-agent-sdk";
|
|
3
|
+
import { InputState, InputAction, InputManagerCallbacks } from "./inputReducer.js";
|
|
4
|
+
export declare const expandLongTextPlaceholders: (text: string, longTextMap: Record<string, string>) => string;
|
|
5
|
+
export declare const handleSubmit: (state: InputState, dispatch: React.Dispatch<InputAction>, callbacks: Partial<InputManagerCallbacks>, isLoading?: boolean, isCommandRunning?: boolean, attachedImagesOverride?: Array<{
|
|
6
|
+
id: number;
|
|
7
|
+
path: string;
|
|
8
|
+
mimeType: string;
|
|
9
|
+
}>) => Promise<void>;
|
|
10
|
+
export declare const handlePasteImage: (dispatch: React.Dispatch<InputAction>) => Promise<boolean>;
|
|
11
|
+
export declare const cyclePermissionMode: (currentMode: PermissionMode, dispatch: React.Dispatch<InputAction>, callbacks: Partial<InputManagerCallbacks>) => void;
|
|
12
|
+
export declare const updateSearchQueriesForActiveSelectors: (state: InputState, dispatch: React.Dispatch<InputAction>, inputText: string, cursorPosition: number) => void;
|
|
13
|
+
export declare const handleSpecialCharInput: (state: InputState, dispatch: React.Dispatch<InputAction>, char: string, cursorPosition: number, inputText: string) => void;
|
|
14
|
+
export declare const handlePasteInput: (state: InputState, dispatch: React.Dispatch<InputAction>, callbacks: Partial<InputManagerCallbacks>, input: string) => void;
|
|
15
|
+
export declare const handleCommandSelect: (state: InputState, dispatch: React.Dispatch<InputAction>, callbacks: Partial<InputManagerCallbacks>, command: string) => {
|
|
16
|
+
newInput: string;
|
|
17
|
+
newCursorPosition: number;
|
|
18
|
+
};
|
|
19
|
+
export declare const handleFileSelect: (state: InputState, dispatch: React.Dispatch<InputAction>, callbacks: Partial<InputManagerCallbacks>, filePath: string) => {
|
|
20
|
+
newInput: string;
|
|
21
|
+
newCursorPosition: number;
|
|
22
|
+
};
|
|
23
|
+
export declare const checkForAtDeletion: (state: InputState, dispatch: React.Dispatch<InputAction>, cursorPosition: number) => boolean;
|
|
24
|
+
export declare const checkForSlashDeletion: (state: InputState, dispatch: React.Dispatch<InputAction>, cursorPosition: number) => boolean;
|
|
25
|
+
export declare const handleSelectorInput: (state: InputState, dispatch: React.Dispatch<InputAction>, callbacks: Partial<InputManagerCallbacks>, input: string, key: Key) => boolean;
|
|
26
|
+
export declare const handleNormalInput: (state: InputState, dispatch: React.Dispatch<InputAction>, callbacks: Partial<InputManagerCallbacks>, input: string, key: Key, isLoading?: boolean, isCommandRunning?: boolean, clearImages?: () => void) => Promise<boolean>;
|
|
27
|
+
export declare const handleInput: (state: InputState, dispatch: React.Dispatch<InputAction>, callbacks: Partial<InputManagerCallbacks>, input: string, key: Key, isLoading?: boolean, isCommandRunning?: boolean, clearImages?: () => void) => Promise<boolean>;
|
|
28
|
+
//# sourceMappingURL=inputHandlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputHandlers.d.ts","sourceRoot":"","sources":["../../src/managers/inputHandlers.ts"],"names":[],"mappings":"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"}
|