wave-code 0.11.6 → 0.12.0

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 (70) hide show
  1. package/dist/acp/agent.d.ts.map +1 -1
  2. package/dist/acp/agent.js +9 -0
  3. package/dist/commands/update.d.ts +2 -0
  4. package/dist/commands/update.d.ts.map +1 -0
  5. package/dist/commands/update.js +97 -0
  6. package/dist/components/App.js +1 -1
  7. package/dist/components/BtwDisplay.d.ts +8 -0
  8. package/dist/components/BtwDisplay.d.ts.map +1 -0
  9. package/dist/components/BtwDisplay.js +9 -0
  10. package/dist/components/ChatInterface.d.ts.map +1 -1
  11. package/dist/components/ChatInterface.js +3 -5
  12. package/dist/components/ConfirmationDetails.d.ts.map +1 -1
  13. package/dist/components/ConfirmationDetails.js +7 -1
  14. package/dist/components/InputBox.d.ts.map +1 -1
  15. package/dist/components/InputBox.js +18 -4
  16. package/dist/components/MessageBlockItem.d.ts.map +1 -1
  17. package/dist/components/MessageBlockItem.js +2 -1
  18. package/dist/components/MessageList.d.ts +1 -2
  19. package/dist/components/MessageList.d.ts.map +1 -1
  20. package/dist/components/MessageList.js +9 -6
  21. package/dist/components/ModelSelector.d.ts +9 -0
  22. package/dist/components/ModelSelector.d.ts.map +1 -0
  23. package/dist/components/ModelSelector.js +34 -0
  24. package/dist/components/RewindCommand.js +2 -2
  25. package/dist/components/SlashDisplay.d.ts +9 -0
  26. package/dist/components/SlashDisplay.d.ts.map +1 -0
  27. package/dist/components/SlashDisplay.js +20 -0
  28. package/dist/components/StatusLine.d.ts +8 -0
  29. package/dist/components/StatusLine.d.ts.map +1 -0
  30. package/dist/components/StatusLine.js +5 -0
  31. package/dist/constants/commands.d.ts.map +1 -1
  32. package/dist/constants/commands.js +12 -0
  33. package/dist/contexts/useChat.d.ts +8 -0
  34. package/dist/contexts/useChat.d.ts.map +1 -1
  35. package/dist/contexts/useChat.js +61 -1
  36. package/dist/hooks/useInputManager.d.ts +5 -0
  37. package/dist/hooks/useInputManager.d.ts.map +1 -1
  38. package/dist/hooks/useInputManager.js +58 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +4 -0
  41. package/dist/managers/inputHandlers.d.ts +1 -1
  42. package/dist/managers/inputHandlers.d.ts.map +1 -1
  43. package/dist/managers/inputHandlers.js +74 -5
  44. package/dist/managers/inputReducer.d.ts +22 -0
  45. package/dist/managers/inputReducer.d.ts.map +1 -1
  46. package/dist/managers/inputReducer.js +23 -0
  47. package/dist/utils/version.d.ts +2 -0
  48. package/dist/utils/version.d.ts.map +1 -0
  49. package/dist/utils/version.js +4 -0
  50. package/package.json +4 -2
  51. package/src/acp/agent.ts +10 -0
  52. package/src/commands/update.ts +116 -0
  53. package/src/components/App.tsx +1 -1
  54. package/src/components/BtwDisplay.tsx +33 -0
  55. package/src/components/ChatInterface.tsx +25 -29
  56. package/src/components/ConfirmationDetails.tsx +14 -0
  57. package/src/components/InputBox.tsx +47 -17
  58. package/src/components/MessageBlockItem.tsx +5 -5
  59. package/src/components/MessageList.tsx +9 -10
  60. package/src/components/ModelSelector.tsx +109 -0
  61. package/src/components/RewindCommand.tsx +2 -2
  62. package/src/components/SlashDisplay.tsx +70 -0
  63. package/src/components/StatusLine.tsx +36 -0
  64. package/src/constants/commands.ts +12 -0
  65. package/src/contexts/useChat.tsx +82 -1
  66. package/src/hooks/useInputManager.ts +69 -0
  67. package/src/index.ts +9 -0
  68. package/src/managers/inputHandlers.ts +92 -4
  69. package/src/managers/inputReducer.ts +41 -1
  70. package/src/utils/version.ts +8 -0
@@ -31,6 +31,8 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
31
31
  const [sessionId, setSessionId] = useState("");
32
32
  const [isCommandRunning, setIsCommandRunning] = useState(false);
33
33
  const [isCompressing, setIsCompressing] = useState(false);
34
+ const [currentModel, setCurrentModelState] = useState("");
35
+ const [configuredModels, setConfiguredModels] = useState([]);
34
36
  // MCP State
35
37
  const [mcpServers, setMcpServers] = useState([]);
36
38
  // Background tasks state
@@ -54,8 +56,24 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
54
56
  const [rewindId, setRewindId] = useState(0);
55
57
  // Status metadata state
56
58
  const [workingDirectory, setWorkingDirectory] = useState("");
59
+ // /btw state
60
+ const [btwState, setBtwStateInternal] = useState({
61
+ isActive: false,
62
+ question: "",
63
+ isLoading: false,
64
+ });
65
+ const setBtwState = useCallback((payload) => {
66
+ setBtwStateInternal((prev) => {
67
+ const newState = { ...prev, ...payload };
68
+ if (process.env.NODE_ENV === "test") {
69
+ // console.log("setBtwState", newState);
70
+ }
71
+ return newState;
72
+ });
73
+ }, []);
57
74
  // Confirmation too tall state
58
75
  const [wasLastDetailsTooTall, setWasLastDetailsTooTall] = useState(0);
76
+ const allowBypassInCycle = !!bypassPermissions || initialPermissionMode === "bypassPermissions";
59
77
  const agentRef = useRef(null);
60
78
  const taskUpdateTimerRef = useRef(null);
61
79
  const debouncedSetTasks = useCallback((newTasks) => {
@@ -126,6 +144,12 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
126
144
  onPermissionModeChange: (mode) => {
127
145
  setPermissionModeState(mode);
128
146
  },
147
+ onModelChange: (model) => {
148
+ setCurrentModelState(model);
149
+ },
150
+ onConfiguredModelsChange: (models) => {
151
+ setConfiguredModels(models);
152
+ },
129
153
  };
130
154
  try {
131
155
  // Create the permission callback inside the try block to access showConfirmation
@@ -171,6 +195,8 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
171
195
  setIsCompressing(agent.isCompressing);
172
196
  setPermissionModeState(agent.getPermissionMode());
173
197
  setWorkingDirectory(agent.workingDirectory);
198
+ setCurrentModelState(agent.getModelConfig().model);
199
+ setConfiguredModels(agent.getConfiguredModels());
174
200
  // Get initial MCP servers state
175
201
  const mcpServers = agent.getMcpServers?.() || [];
176
202
  setMcpServers(mcpServers);
@@ -267,6 +293,12 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
267
293
  // Loading state will be automatically updated by the useEffect that watches messages
268
294
  }
269
295
  }, [isLoading, isCommandRunning]);
296
+ const askBtw = useCallback(async (question) => {
297
+ if (!agentRef.current) {
298
+ throw new Error("Agent not initialized");
299
+ }
300
+ return await agentRef.current.askBtw(question);
301
+ }, []);
270
302
  // Process queued messages when idle
271
303
  useEffect(() => {
272
304
  if (!isLoading && !isCommandRunning && queuedMessages.length > 0) {
@@ -384,6 +416,18 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
384
416
  }
385
417
  return agentRef.current.getModelConfig();
386
418
  }, []);
419
+ const getConfiguredModels = useCallback(() => {
420
+ if (!agentRef.current) {
421
+ return [];
422
+ }
423
+ return agentRef.current.getConfiguredModels();
424
+ }, []);
425
+ const setModel = useCallback((model) => {
426
+ if (agentRef.current) {
427
+ agentRef.current.setModel(model);
428
+ setCurrentModelState(model);
429
+ }
430
+ }, []);
387
431
  // Listen for Ctrl+O hotkey to toggle collapse/expand state and ESC to cancel confirmation
388
432
  useInput((input, key) => {
389
433
  if (key.ctrl && input === "o") {
@@ -413,11 +457,19 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
413
457
  if (key.ctrl && input === "t") {
414
458
  setIsTaskListVisible((prev) => !prev);
415
459
  }
416
- // Handle ESC key to cancel confirmation
460
+ // Handle ESC key to cancel confirmation or dismiss BTW
417
461
  if (key.escape) {
418
462
  if (isConfirmationVisible) {
419
463
  handleConfirmationCancel();
420
464
  }
465
+ else if (btwState.isActive) {
466
+ setBtwState({
467
+ isActive: false,
468
+ question: "",
469
+ answer: undefined,
470
+ isLoading: false,
471
+ });
472
+ }
421
473
  }
422
474
  });
423
475
  const contextValue = {
@@ -430,8 +482,13 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
430
482
  queuedMessages,
431
483
  sessionId,
432
484
  sendMessage,
485
+ askBtw,
433
486
  abortMessage,
434
487
  latestTotalTokens,
488
+ currentModel,
489
+ configuredModels,
490
+ getConfiguredModels,
491
+ setModel,
435
492
  isCompressing,
436
493
  mcpServers,
437
494
  connectMcpServer,
@@ -446,6 +503,7 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
446
503
  subagentLatestTokens,
447
504
  permissionMode,
448
505
  setPermissionMode,
506
+ allowBypassInCycle,
449
507
  isConfirmationVisible,
450
508
  confirmingTool,
451
509
  showConfirmation,
@@ -463,6 +521,8 @@ export const ChatProvider = ({ children, bypassPermissions, permissionMode: init
463
521
  workingDirectory,
464
522
  version,
465
523
  workdir,
524
+ btwState,
525
+ setBtwState,
466
526
  };
467
527
  return (_jsx(ChatContext.Provider, { value: contextValue, children: children }));
468
528
  };
@@ -20,8 +20,10 @@ export declare const useInputManager: (callbacks?: Partial<InputManagerCallbacks
20
20
  showHelp: boolean;
21
21
  showStatusCommand: boolean;
22
22
  showPluginManager: boolean;
23
+ showModelSelector: boolean;
23
24
  permissionMode: PermissionMode;
24
25
  attachedImages: import("../managers/inputReducer.js").AttachedImage[];
26
+ btwState: import("../managers/inputReducer.js").BtwState;
25
27
  isManagerReady: boolean;
26
28
  insertTextAtCursor: (text: string) => void;
27
29
  deleteCharAtCursor: () => void;
@@ -57,7 +59,10 @@ export declare const useInputManager: (callbacks?: Partial<InputManagerCallbacks
57
59
  setShowHelp: (show: boolean) => void;
58
60
  setShowStatusCommand: (show: boolean) => void;
59
61
  setShowPluginManager: (show: boolean) => void;
62
+ setShowModelSelector: (show: boolean) => void;
60
63
  setPermissionMode: (mode: PermissionMode) => void;
64
+ setAllowBypassInCycle: (allow: boolean) => void;
65
+ setBtwState: (payload: Partial<import("../managers/inputReducer.js").BtwState>) => void;
61
66
  addImage: (imagePath: string, mimeType: string) => void;
62
67
  removeImage: (imageId: number) => void;
63
68
  clearImages: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useInputManager.d.ts","sourceRoot":"","sources":["../../src/hooks/useInputManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAGL,qBAAqB,EACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEL,cAAc,EACd,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAGxB,eAAO,MAAM,eAAe,GAC1B,YAAW,OAAO,CAAC,qBAAqB,CAAM;;;;;;;;;;;;;;;;;;;;;;+BA6IA,MAAM;;;;;qCAoBA,MAAM;iCAIV,MAAM;;;;;mCAaJ,MAAM;oCAIL,MAAM;wCAIF,MAAM;mCAIX,MAAM;;;;mCASN,MAAM;;;;;sCAkCH,MAAM;uCAIL,MAAM;uCAQN,WAAW;;iCAQjB,MAAM;yCAYE,OAAO;8BAIlB,OAAO;iCAIJ,OAAO;wBAIhB,OAAO;iCAIE,OAAO;iCAIP,OAAO;8BAIV,cAAc;0BAKlB,MAAM,YAAY,MAAM;2BAIvB,MAAM;;;8BAYH,MAAM;mCAW/B,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;uCAYnB,MAAM;;yBAajD,MAAM,OACR,GAAG,kBACQ,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,gBACvD,MAAM,IAAI;yBA5FY,MAAM;kCAIG,MAAM;;CA0LxD,CAAC"}
1
+ {"version":3,"file":"useInputManager.d.ts","sourceRoot":"","sources":["../../src/hooks/useInputManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAGL,qBAAqB,EACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEL,cAAc,EACd,WAAW,EACZ,MAAM,gBAAgB,CAAC;AAGxB,eAAO,MAAM,eAAe,GAC1B,YAAW,OAAO,CAAC,qBAAqB,CAAM;;;;;;;;;;;;;;;;;;;;;;;;+BA0LA,MAAM;;;;;qCAoBA,MAAM;iCAIV,MAAM;;;;;mCAaJ,MAAM;oCAIL,MAAM;wCAIF,MAAM;mCAIX,MAAM;;;;mCASN,MAAM;;;;;sCAkCH,MAAM;uCAIL,MAAM;uCAQN,WAAW;;iCAQjB,MAAM;yCAYE,OAAO;8BAIlB,OAAO;iCAIJ,OAAO;wBAIhB,OAAO;iCAIE,OAAO;iCAIP,OAAO;iCAIP,OAAO;8BAIV,cAAc;mCAKT,OAAO;2BAK7C,OAAO,CAAC,OAAO,6BAA6B,EAAE,QAAQ,CAAC;0BAU1B,MAAM,YAAY,MAAM;2BAIvB,MAAM;;;8BAYH,MAAM;mCAW/B,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;uCAYnB,MAAM;;yBAajD,MAAM,OACR,GAAG,kBACQ,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,gBACvD,MAAM,IAAI;yBA/GY,MAAM;kCAIG,MAAM;;CAkNxD,CAAC"}
@@ -100,9 +100,48 @@ export const useInputManager = (callbacks = {}) => {
100
100
  useEffect(() => {
101
101
  callbacksRef.current.onPluginManagerStateChange?.(state.showPluginManager);
102
102
  }, [state.showPluginManager]);
103
+ useEffect(() => {
104
+ callbacksRef.current.onModelSelectorStateChange?.(state.showModelSelector);
105
+ }, [state.showModelSelector]);
103
106
  useEffect(() => {
104
107
  callbacksRef.current.onImagesStateChange?.(state.attachedImages);
105
108
  }, [state.attachedImages]);
109
+ useEffect(() => {
110
+ if (callbacksRef.current.onBtwStateChange) {
111
+ callbacksRef.current.onBtwStateChange(state.btwState);
112
+ }
113
+ }, [state.btwState]);
114
+ // Handle /btw side question
115
+ useEffect(() => {
116
+ if (state.btwState.isActive &&
117
+ state.btwState.isLoading &&
118
+ state.btwState.question) {
119
+ const askBtw = async () => {
120
+ try {
121
+ const answer = await callbacksRef.current.onAskBtw?.(state.btwState.question);
122
+ dispatch({
123
+ type: "SET_BTW_STATE",
124
+ payload: { answer, isLoading: false },
125
+ });
126
+ }
127
+ catch (error) {
128
+ console.error("Failed to ask side question:", error);
129
+ dispatch({
130
+ type: "SET_BTW_STATE",
131
+ payload: {
132
+ answer: "Error: Failed to get an answer for your side question.",
133
+ isLoading: false,
134
+ },
135
+ });
136
+ }
137
+ };
138
+ askBtw();
139
+ }
140
+ }, [
141
+ state.btwState.isActive,
142
+ state.btwState.isLoading,
143
+ state.btwState.question,
144
+ ]);
106
145
  // Methods
107
146
  const insertTextAtCursor = useCallback((text) => {
108
147
  dispatch({ type: "INSERT_TEXT", payload: text });
@@ -202,10 +241,24 @@ export const useInputManager = (callbacks = {}) => {
202
241
  const setShowPluginManager = useCallback((show) => {
203
242
  dispatch({ type: "SET_SHOW_PLUGIN_MANAGER", payload: show });
204
243
  }, []);
244
+ const setShowModelSelector = useCallback((show) => {
245
+ dispatch({ type: "SET_SHOW_MODEL_SELECTOR", payload: show });
246
+ }, []);
205
247
  const setPermissionMode = useCallback((mode) => {
206
248
  dispatch({ type: "SET_PERMISSION_MODE", payload: mode });
207
249
  callbacksRef.current.onPermissionModeChange?.(mode);
208
250
  }, []);
251
+ const setAllowBypassInCycle = useCallback((allow) => {
252
+ dispatch({ type: "SET_ALLOW_BYPASS_IN_CYCLE", payload: allow });
253
+ }, []);
254
+ const setBtwState = useCallback((payload) => {
255
+ if (callbacksRef.current.onBtwStateChange) {
256
+ callbacksRef.current.onBtwStateChange(payload);
257
+ }
258
+ else {
259
+ dispatch({ type: "SET_BTW_STATE", payload });
260
+ }
261
+ }, []);
209
262
  const addImage = useCallback((imagePath, mimeType) => {
210
263
  dispatch({ type: "ADD_IMAGE", payload: { path: imagePath, mimeType } });
211
264
  }, []);
@@ -253,8 +306,10 @@ export const useInputManager = (callbacks = {}) => {
253
306
  showHelp: state.showHelp,
254
307
  showStatusCommand: state.showStatusCommand,
255
308
  showPluginManager: state.showPluginManager,
309
+ showModelSelector: state.showModelSelector,
256
310
  permissionMode: state.permissionMode,
257
311
  attachedImages: state.attachedImages,
312
+ btwState: state.btwState,
258
313
  isManagerReady: true,
259
314
  // Methods
260
315
  insertTextAtCursor,
@@ -287,7 +342,10 @@ export const useInputManager = (callbacks = {}) => {
287
342
  setShowHelp,
288
343
  setShowStatusCommand,
289
344
  setShowPluginManager,
345
+ setShowModelSelector,
290
346
  setPermissionMode,
347
+ setAllowBypassInCycle,
348
+ setBtwState,
291
349
  // Image management
292
350
  addImage,
293
351
  removeImage,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,wBAAsB,IAAI,kBA2WzB;AAGD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGpC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,wBAAsB,IAAI,kBAoXzB;AAGD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGpC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -161,6 +161,10 @@ export async function main() {
161
161
  const { updatePluginCommand } = await import("./commands/plugin/update.js");
162
162
  await updatePluginCommand(argv);
163
163
  });
164
+ })
165
+ .command("update", "Update WAVE Code to the latest version", {}, async () => {
166
+ const { updateCommand } = await import("./commands/update.js");
167
+ await updateCommand();
164
168
  })
165
169
  .version()
166
170
  .alias("v", "version")
@@ -8,7 +8,7 @@ export declare const handleSubmit: (state: InputState, dispatch: React.Dispatch<
8
8
  mimeType: string;
9
9
  }>) => Promise<void>;
10
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;
11
+ export declare const cyclePermissionMode: (currentMode: PermissionMode, dispatch: React.Dispatch<InputAction>, callbacks: Partial<InputManagerCallbacks>, allowBypassInCycle?: boolean) => void;
12
12
  export declare const getAtSelectorPosition: (text: string, cursorPosition: number) => number;
13
13
  export declare const getSlashSelectorPosition: (text: string, cursorPosition: number) => number;
14
14
  export declare const updateSearchQueriesForActiveSelectors: (state: InputState, dispatch: React.Dispatch<InputAction>, inputText: string, cursorPosition: number) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"inputHandlers.d.ts","sourceRoot":"","sources":["../../src/managers/inputHandlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inputHandlers.d.ts","sourceRoot":"","sources":["../../src/managers/inputHandlers.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,25 @@ export const handleSubmit = async (state, dispatch, callbacks, attachedImagesOve
28
28
  const contentWithPlaceholders = state.inputText
29
29
  .replace(imageRegex, "")
30
30
  .trim();
31
+ if (contentWithPlaceholders === "/btw" ||
32
+ contentWithPlaceholders.startsWith("/btw ")) {
33
+ const question = contentWithPlaceholders.startsWith("/btw ")
34
+ ? contentWithPlaceholders.substring(5).trim()
35
+ : "";
36
+ const payload = {
37
+ isActive: true,
38
+ question,
39
+ isLoading: question !== "",
40
+ };
41
+ dispatch({
42
+ type: "SET_BTW_STATE",
43
+ payload,
44
+ });
45
+ dispatch({ type: "CLEAR_INPUT" });
46
+ dispatch({ type: "RESET_HISTORY_NAVIGATION" });
47
+ dispatch({ type: "CLEAR_LONG_TEXT_MAP" });
48
+ return;
49
+ }
31
50
  PromptHistoryManager.addEntry(contentWithPlaceholders, callbacks.sessionId, state.longTextMap, callbacks.workdir).catch((err) => {
32
51
  callbacks.logger?.error("Failed to save prompt history", err);
33
52
  });
@@ -54,8 +73,11 @@ export const handlePasteImage = async (dispatch) => {
54
73
  return false;
55
74
  }
56
75
  };
57
- export const cyclePermissionMode = (currentMode, dispatch, callbacks) => {
76
+ export const cyclePermissionMode = (currentMode, dispatch, callbacks, allowBypassInCycle = false) => {
58
77
  const modes = ["default", "acceptEdits", "plan"];
78
+ if (allowBypassInCycle) {
79
+ modes.push("bypassPermissions");
80
+ }
59
81
  const currentIndex = modes.indexOf(currentMode);
60
82
  const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % modes.length;
61
83
  const nextMode = modes[nextIndex];
@@ -246,6 +268,15 @@ export const handleCommandSelect = (state, dispatch, callbacks, command) => {
246
268
  else if (command === "plugin") {
247
269
  dispatch({ type: "SET_SHOW_PLUGIN_MANAGER", payload: true });
248
270
  }
271
+ else if (command === "model") {
272
+ dispatch({ type: "SET_SHOW_MODEL_SELECTOR", payload: true });
273
+ }
274
+ else if (command === "btw") {
275
+ dispatch({
276
+ type: "SET_BTW_STATE",
277
+ payload: { isActive: true, question: "", isLoading: false },
278
+ });
279
+ }
249
280
  }
250
281
  })();
251
282
  dispatch({ type: "CANCEL_COMMAND_SELECTOR" });
@@ -321,9 +352,11 @@ export const handleSelectorInput = (state, dispatch, callbacks, input, key) => {
321
352
  if (input === " ") {
322
353
  if (state.showFileSelector) {
323
354
  dispatch({ type: "CANCEL_FILE_SELECTOR" });
355
+ return false;
324
356
  }
325
357
  else if (state.showCommandSelector) {
326
358
  dispatch({ type: "CANCEL_COMMAND_SELECTOR" });
359
+ return false;
327
360
  }
328
361
  }
329
362
  if (input &&
@@ -475,6 +508,36 @@ export const handleInput = async (state, dispatch, callbacks, input, key, clearI
475
508
  if (state.selectorJustUsed) {
476
509
  return true;
477
510
  }
511
+ if (state.btwState.isActive) {
512
+ if (key.escape) {
513
+ dispatch({
514
+ type: "SET_BTW_STATE",
515
+ payload: {
516
+ isActive: false,
517
+ question: "",
518
+ answer: undefined,
519
+ isLoading: false,
520
+ },
521
+ });
522
+ return true;
523
+ }
524
+ if (key.return) {
525
+ if (state.inputText.trim() && !state.btwState.isLoading) {
526
+ dispatch({
527
+ type: "SET_BTW_STATE",
528
+ payload: {
529
+ question: state.inputText.trim(),
530
+ isLoading: true,
531
+ answer: undefined,
532
+ },
533
+ });
534
+ dispatch({ type: "CLEAR_INPUT" });
535
+ }
536
+ return true;
537
+ }
538
+ // Handle normal input for the question
539
+ return await handleNormalInput(state, dispatch, callbacks, input, key, clearImages);
540
+ }
478
541
  if (key.escape) {
479
542
  if (!(state.showFileSelector ||
480
543
  state.showCommandSelector ||
@@ -484,13 +547,15 @@ export const handleInput = async (state, dispatch, callbacks, input, key, clearI
484
547
  state.showRewindManager ||
485
548
  state.showHelp ||
486
549
  state.showStatusCommand ||
487
- state.showPluginManager)) {
550
+ state.showPluginManager ||
551
+ state.showModelSelector ||
552
+ state.btwState.isActive)) {
488
553
  callbacks.onAbortMessage?.();
489
554
  return true;
490
555
  }
491
556
  }
492
557
  if (key.tab && key.shift) {
493
- cyclePermissionMode(state.permissionMode, dispatch, callbacks);
558
+ cyclePermissionMode(state.permissionMode, dispatch, callbacks, state.allowBypassInCycle);
494
559
  return true;
495
560
  }
496
561
  if (state.showFileSelector ||
@@ -501,13 +566,17 @@ export const handleInput = async (state, dispatch, callbacks, input, key, clearI
501
566
  state.showRewindManager ||
502
567
  state.showHelp ||
503
568
  state.showStatusCommand ||
504
- state.showPluginManager) {
569
+ state.showPluginManager ||
570
+ state.showModelSelector ||
571
+ state.btwState.isActive) {
505
572
  if (state.showBackgroundTaskManager ||
506
573
  state.showMcpManager ||
507
574
  state.showRewindManager ||
508
575
  state.showHelp ||
509
576
  state.showStatusCommand ||
510
- state.showPluginManager) {
577
+ state.showPluginManager ||
578
+ state.showModelSelector ||
579
+ state.btwState.isActive) {
511
580
  return true;
512
581
  }
513
582
  if (state.showHistorySearch) {
@@ -4,6 +4,12 @@ export interface AttachedImage {
4
4
  path: string;
5
5
  mimeType: string;
6
6
  }
7
+ export interface BtwState {
8
+ isActive: boolean;
9
+ question: string;
10
+ answer?: string;
11
+ isLoading: boolean;
12
+ }
7
13
  export interface InputManagerCallbacks {
8
14
  onInputTextChange?: (text: string) => void;
9
15
  onCursorPositionChange?: (position: number) => void;
@@ -16,6 +22,7 @@ export interface InputManagerCallbacks {
16
22
  onHelpStateChange?: (show: boolean) => void;
17
23
  onStatusCommandStateChange?: (show: boolean) => void;
18
24
  onPluginManagerStateChange?: (show: boolean) => void;
25
+ onModelSelectorStateChange?: (show: boolean) => void;
19
26
  onImagesStateChange?: (images: AttachedImage[]) => void;
20
27
  onSendMessage?: (content: string, images?: Array<{
21
28
  path: string;
@@ -25,6 +32,9 @@ export interface InputManagerCallbacks {
25
32
  onAbortMessage?: () => void;
26
33
  onBackgroundCurrentTask?: () => void;
27
34
  onPermissionModeChange?: (mode: PermissionMode) => void;
35
+ onAskBtw?: (question: string) => Promise<string>;
36
+ btwState?: BtwState;
37
+ onBtwStateChange?: (payload: Partial<BtwState>) => void;
28
38
  sessionId?: string;
29
39
  workdir?: string;
30
40
  getFullMessageThread?: () => Promise<{
@@ -55,7 +65,9 @@ export interface InputState {
55
65
  showHelp: boolean;
56
66
  showStatusCommand: boolean;
57
67
  showPluginManager: boolean;
68
+ showModelSelector: boolean;
58
69
  permissionMode: PermissionMode;
70
+ allowBypassInCycle: boolean;
59
71
  selectorJustUsed: boolean;
60
72
  isPasting: boolean;
61
73
  pasteBuffer: string;
@@ -65,6 +77,7 @@ export interface InputState {
65
77
  originalInputText: string;
66
78
  originalLongTextMap: Record<string, string>;
67
79
  isFileSearching: boolean;
80
+ btwState: BtwState;
68
81
  }
69
82
  export declare const initialState: InputState;
70
83
  export type InputAction = {
@@ -136,9 +149,15 @@ export type InputAction = {
136
149
  } | {
137
150
  type: "SET_SHOW_PLUGIN_MANAGER";
138
151
  payload: boolean;
152
+ } | {
153
+ type: "SET_SHOW_MODEL_SELECTOR";
154
+ payload: boolean;
139
155
  } | {
140
156
  type: "SET_PERMISSION_MODE";
141
157
  payload: PermissionMode;
158
+ } | {
159
+ type: "SET_ALLOW_BYPASS_IN_CYCLE";
160
+ payload: boolean;
142
161
  } | {
143
162
  type: "SET_SELECTOR_JUST_USED";
144
163
  payload: boolean;
@@ -177,6 +196,9 @@ export type InputAction = {
177
196
  } | {
178
197
  type: "SELECT_HISTORY_ENTRY";
179
198
  payload: PromptEntry;
199
+ } | {
200
+ type: "SET_BTW_STATE";
201
+ payload: Partial<BtwState>;
180
202
  };
181
203
  export declare function inputReducer(state: InputState, action: InputAction): InputState;
182
204
  //# sourceMappingURL=inputReducer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"inputReducer.d.ts","sourceRoot":"","sources":["../../src/managers/inputReducer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inputReducer.d.ts","sourceRoot":"","sources":["../../src/managers/inputReducer.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,9 @@ export const initialState = {
20
20
  showHelp: false,
21
21
  showStatusCommand: false,
22
22
  showPluginManager: false,
23
+ showModelSelector: false,
23
24
  permissionMode: "default",
25
+ allowBypassInCycle: false,
24
26
  selectorJustUsed: false,
25
27
  isPasting: false,
26
28
  pasteBuffer: "",
@@ -30,6 +32,11 @@ export const initialState = {
30
32
  originalInputText: "",
31
33
  originalLongTextMap: {},
32
34
  isFileSearching: false,
35
+ btwState: {
36
+ isActive: false,
37
+ question: "",
38
+ isLoading: false,
39
+ },
33
40
  };
34
41
  export function inputReducer(state, action) {
35
42
  switch (action.type) {
@@ -193,8 +200,16 @@ export function inputReducer(state, action) {
193
200
  showPluginManager: action.payload,
194
201
  selectorJustUsed: !action.payload ? true : state.selectorJustUsed,
195
202
  };
203
+ case "SET_SHOW_MODEL_SELECTOR":
204
+ return {
205
+ ...state,
206
+ showModelSelector: action.payload,
207
+ selectorJustUsed: !action.payload ? true : state.selectorJustUsed,
208
+ };
196
209
  case "SET_PERMISSION_MODE":
197
210
  return { ...state, permissionMode: action.payload };
211
+ case "SET_ALLOW_BYPASS_IN_CYCLE":
212
+ return { ...state, allowBypassInCycle: action.payload };
198
213
  case "SET_SELECTOR_JUST_USED":
199
214
  return { ...state, selectorJustUsed: action.payload };
200
215
  case "INSERT_TEXT_WITH_PLACEHOLDER": {
@@ -335,6 +350,14 @@ export function inputReducer(state, action) {
335
350
  originalInputText: "",
336
351
  originalLongTextMap: {},
337
352
  };
353
+ case "SET_BTW_STATE":
354
+ return {
355
+ ...state,
356
+ btwState: {
357
+ ...state.btwState,
358
+ ...action.payload,
359
+ },
360
+ };
338
361
  default:
339
362
  return state;
340
363
  }
@@ -0,0 +1,2 @@
1
+ export declare function isUpdateAvailable(currentVersion: string, latestVersion: string): boolean;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,MAAM,EACtB,aAAa,EAAE,MAAM,GACpB,OAAO,CAET"}
@@ -0,0 +1,4 @@
1
+ import semver from "semver";
2
+ export function isUpdateAvailable(currentVersion, latestVersion) {
3
+ return semver.gt(latestVersion, currentVersion);
4
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wave-code",
3
- "version": "0.11.6",
3
+ "version": "0.12.0",
4
4
  "description": "CLI-based code assistant powered by AI, built with React and Ink",
5
5
  "repository": {
6
6
  "type": "git",
@@ -39,12 +39,14 @@
39
39
  "node-html-parser": "^7.0.2",
40
40
  "react": "^19.2.4",
41
41
  "react-dom": "19.2.4",
42
+ "semver": "^7.7.4",
42
43
  "yargs": "^17.7.2",
43
44
  "zod": "^3.23.8",
44
- "wave-agent-sdk": "0.11.6"
45
+ "wave-agent-sdk": "0.12.0"
45
46
  },
46
47
  "devDependencies": {
47
48
  "@types/react": "^19.1.8",
49
+ "@types/semver": "^7.7.1",
48
50
  "@types/yargs": "^17.0.0",
49
51
  "@vitest/coverage-v8": "^4.0.18",
50
52
  "eslint-plugin-react": "^7.37.5",
package/src/acp/agent.ts CHANGED
@@ -669,6 +669,16 @@ export class WaveAcpAgent implements AcpAgent {
669
669
  },
670
670
  });
671
671
  }
672
+
673
+ if (contents.length === 0) {
674
+ contents.push({
675
+ type: "content",
676
+ content: {
677
+ type: "text",
678
+ text: "```json\n" + JSON.stringify(parameters, null, 2) + "\n```",
679
+ },
680
+ });
681
+ }
672
682
  }
673
683
 
674
684
  if (shortResult) {