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.
Files changed (46) hide show
  1. package/dist/components/ChatInterface.js +1 -1
  2. package/dist/components/CommandSelector.d.ts.map +1 -1
  3. package/dist/components/CommandSelector.js +1 -38
  4. package/dist/components/ConfirmationSelector.d.ts.map +1 -1
  5. package/dist/components/ConfirmationSelector.js +11 -3
  6. package/dist/components/HelpView.d.ts +2 -0
  7. package/dist/components/HelpView.d.ts.map +1 -1
  8. package/dist/components/HelpView.js +49 -5
  9. package/dist/components/InputBox.d.ts.map +1 -1
  10. package/dist/components/InputBox.js +1 -1
  11. package/dist/components/MessageList.d.ts +2 -2
  12. package/dist/components/MessageList.d.ts.map +1 -1
  13. package/dist/components/MessageList.js +5 -6
  14. package/dist/constants/commands.d.ts +3 -0
  15. package/dist/constants/commands.d.ts.map +1 -0
  16. package/dist/constants/commands.js +38 -0
  17. package/dist/contexts/useChat.d.ts.map +1 -1
  18. package/dist/contexts/useChat.js +2 -17
  19. package/dist/hooks/useInputManager.d.ts +7 -8
  20. package/dist/hooks/useInputManager.d.ts.map +1 -1
  21. package/dist/hooks/useInputManager.js +224 -232
  22. package/dist/managers/inputHandlers.d.ts +28 -0
  23. package/dist/managers/inputHandlers.d.ts.map +1 -0
  24. package/dist/managers/inputHandlers.js +378 -0
  25. package/dist/managers/inputReducer.d.ts +157 -0
  26. package/dist/managers/inputReducer.d.ts.map +1 -0
  27. package/dist/managers/inputReducer.js +242 -0
  28. package/dist/utils/highlightUtils.d.ts.map +1 -1
  29. package/dist/utils/highlightUtils.js +66 -42
  30. package/package.json +2 -2
  31. package/src/components/ChatInterface.tsx +1 -1
  32. package/src/components/CommandSelector.tsx +1 -40
  33. package/src/components/ConfirmationSelector.tsx +13 -3
  34. package/src/components/HelpView.tsx +129 -16
  35. package/src/components/InputBox.tsx +3 -1
  36. package/src/components/MessageList.tsx +5 -6
  37. package/src/constants/commands.ts +41 -0
  38. package/src/contexts/useChat.tsx +2 -17
  39. package/src/hooks/useInputManager.ts +352 -299
  40. package/src/managers/inputHandlers.ts +560 -0
  41. package/src/managers/inputReducer.ts +367 -0
  42. package/src/utils/highlightUtils.ts +66 -42
  43. package/dist/managers/InputManager.d.ts +0 -156
  44. package/dist/managers/InputManager.d.ts.map +0 -1
  45. package/dist/managers/InputManager.js +0 -749
  46. package/src/managers/InputManager.ts +0 -1024
@@ -1,223 +1,249 @@
1
- import { useEffect, useRef, useState, useCallback } from "react";
2
- import { InputManager, } from "../managers/InputManager.js";
3
- import { logger } from "../utils/logger.js";
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 managerRef = useRef(null);
6
- const [isManagerReady, setIsManagerReady] = useState(false);
7
- // React state that mirrors InputManager state
8
- const [inputText, setInputText] = useState("");
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
- if (!managerRef.current) {
35
- // Create InputManager on first mount
36
- const manager = new InputManager({
37
- logger,
38
- onInputTextChange: setInputText,
39
- onCursorPositionChange: setCursorPosition,
40
- onFileSelectorStateChange: (show, files, query, position) => {
41
- setFileSelectorState({ show, files, query, position });
42
- },
43
- onCommandSelectorStateChange: (show, query, position) => {
44
- setCommandSelectorState({ show, query, position });
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
- else {
75
- // Update callbacks on existing manager
76
- managerRef.current.updateCallbacks({
77
- logger,
78
- onInputTextChange: setInputText,
79
- onCursorPositionChange: setCursorPosition,
80
- onFileSelectorStateChange: (show, files, query, position) => {
81
- setFileSelectorState({ show, files, query, position });
82
- },
83
- onCommandSelectorStateChange: (show, query, position) => {
84
- setCommandSelectorState({ show, query, position });
85
- },
86
- onHistorySearchStateChange: (show, query) => {
87
- setHistorySearchState({ show, query });
88
- },
89
- onBackgroundTaskManagerStateChange: (show) => {
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
- }, [callbacks]);
113
- // Cleanup on unmount
41
+ }, [state.showFileSelector, state.fileSearchQuery]);
42
+ // Handle paste debouncing
114
43
  useEffect(() => {
115
- return () => {
116
- if (managerRef.current) {
117
- managerRef.current.destroy();
118
- }
119
- };
120
- }, []);
121
- // Expose manager methods
122
- const insertTextAtCursor = useCallback((text, callback) => {
123
- managerRef.current?.insertTextAtCursor(text, callback);
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((callback) => {
126
- managerRef.current?.deleteCharAtCursor(callback);
102
+ const deleteCharAtCursor = useCallback(() => {
103
+ dispatch({ type: "DELETE_CHAR" });
127
104
  }, []);
128
105
  const clearInput = useCallback(() => {
129
- managerRef.current?.clearInput();
106
+ dispatch({ type: "CLEAR_INPUT" });
130
107
  }, []);
131
108
  const moveCursorLeft = useCallback(() => {
132
- managerRef.current?.moveCursorLeft();
109
+ dispatch({ type: "MOVE_CURSOR", payload: -1 });
133
110
  }, []);
134
111
  const moveCursorRight = useCallback(() => {
135
- managerRef.current?.moveCursorRight();
112
+ dispatch({ type: "MOVE_CURSOR", payload: 1 });
136
113
  }, []);
137
- // File selector methods
138
114
  const activateFileSelector = useCallback((position) => {
139
- managerRef.current?.activateFileSelector(position);
115
+ dispatch({ type: "ACTIVATE_FILE_SELECTOR", payload: position });
140
116
  }, []);
141
117
  const handleFileSelect = useCallback((filePath) => {
142
- return (managerRef.current?.handleFileSelect(filePath) || {
143
- newInput: inputText,
144
- newCursorPosition: cursorPosition,
145
- });
146
- }, [inputText, cursorPosition]);
118
+ return handlers.handleFileSelect(stateRef.current, dispatch, callbacksRef.current, filePath);
119
+ }, []);
147
120
  const handleCancelFileSelect = useCallback(() => {
148
- managerRef.current?.handleCancelFileSelect();
121
+ dispatch({ type: "CANCEL_FILE_SELECTOR" });
149
122
  }, []);
150
123
  const updateFileSearchQuery = useCallback((query) => {
151
- managerRef.current?.updateFileSearchQuery(query);
124
+ dispatch({ type: "SET_FILE_SEARCH_QUERY", payload: query });
152
125
  }, []);
153
126
  const checkForAtDeletion = useCallback((cursorPos) => {
154
- return managerRef.current?.checkForAtDeletion(cursorPos) || false;
127
+ return handlers.checkForAtDeletion(stateRef.current, dispatch, cursorPos);
155
128
  }, []);
156
- // Command selector methods
157
129
  const activateCommandSelector = useCallback((position) => {
158
- managerRef.current?.activateCommandSelector(position);
130
+ dispatch({ type: "ACTIVATE_COMMAND_SELECTOR", payload: position });
159
131
  }, []);
160
132
  const handleCommandSelect = useCallback((command) => {
161
- return (managerRef.current?.handleCommandSelect(command) || {
162
- newInput: inputText,
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
- return (managerRef.current?.handleCommandInsert(command) || {
168
- newInput: inputText,
169
- newCursorPosition: cursorPosition,
170
- });
171
- }, [inputText, cursorPosition]);
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
- managerRef.current?.handleCancelCommandSelect();
155
+ dispatch({ type: "CANCEL_COMMAND_SELECTOR" });
174
156
  }, []);
175
157
  const updateCommandSearchQuery = useCallback((query) => {
176
- managerRef.current?.updateCommandSearchQuery(query);
158
+ dispatch({ type: "SET_COMMAND_SEARCH_QUERY", payload: query });
177
159
  }, []);
178
160
  const checkForSlashDeletion = useCallback((cursorPos) => {
179
- return managerRef.current?.checkForSlashDeletion(cursorPos) || false;
161
+ return handlers.checkForSlashDeletion(stateRef.current, dispatch, cursorPos);
180
162
  }, []);
181
- // History search methods
182
163
  const handleHistorySearchSelect = useCallback((prompt) => {
183
- managerRef.current?.handleHistorySearchSelect(prompt);
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
- managerRef.current?.handleCancelHistorySearch();
169
+ dispatch({ type: "CANCEL_HISTORY_SEARCH" });
187
170
  }, []);
188
- // Special character handling
189
171
  const handleSpecialCharInput = useCallback((char) => {
190
- managerRef.current?.handleSpecialCharInput(char);
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
- // Direct state access methods (for compatibility with existing code)
193
- const setInputTextDirect = useCallback((text) => {
194
- managerRef.current?.setInputText(text);
220
+ const clearLongTextMap = useCallback(() => {
221
+ dispatch({ type: "CLEAR_LONG_TEXT_MAP" });
195
222
  }, []);
196
- const setCursorPositionDirect = useCallback((position) => {
197
- managerRef.current?.setCursorPosition(position);
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: fileSelectorState.show,
205
- filteredFiles: fileSelectorState.files,
206
- fileSearchQuery: fileSelectorState.query,
207
- atPosition: fileSelectorState.position,
208
- showCommandSelector: commandSelectorState.show,
209
- commandSearchQuery: commandSelectorState.query,
210
- slashPosition: commandSelectorState.position,
211
- showHistorySearch: historySearchState.show,
212
- historySearchQuery: historySearchState.query,
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: useCallback((show) => {
247
- managerRef.current?.setShowBackgroundTaskManager(show);
248
- }, []),
249
- setShowMcpManager: useCallback((show) => {
250
- managerRef.current?.setShowMcpManager(show);
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: useCallback((imagePath, mimeType) => {
270
- return managerRef.current?.addImage(imagePath, mimeType);
271
- }, []),
272
- removeImage: useCallback((imageId) => {
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: useCallback((input) => {
283
- managerRef.current?.handlePasteInput(input);
284
- }, []),
285
- handleSubmit: useCallback(async (attachedImages, isLoading = false, isCommandRunning = false) => {
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: useCallback(async (input, key, attachedImages, isLoading = false, isCommandRunning = false, clearImages) => {
296
- return ((await managerRef.current?.handleInput(input, key, attachedImages, isLoading, isCommandRunning, clearImages)) || false);
297
- }, []),
298
- // Direct state setters (for React compatibility)
299
- setInputText: setInputTextDirect,
300
- setCursorPosition: setCursorPositionDirect,
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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"}