wave-code 0.6.1 → 0.6.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 (66) hide show
  1. package/dist/components/App.d.ts.map +1 -1
  2. package/dist/components/App.js +14 -12
  3. package/dist/components/ChatInterface.d.ts.map +1 -1
  4. package/dist/components/ChatInterface.js +2 -1
  5. package/dist/components/CommandOutputDisplay.d.ts.map +1 -1
  6. package/dist/components/CommandOutputDisplay.js +6 -17
  7. package/dist/components/CommandSelector.d.ts.map +1 -1
  8. package/dist/components/CommandSelector.js +6 -0
  9. package/dist/components/ConfirmationSelector.d.ts.map +1 -1
  10. package/dist/components/ConfirmationSelector.js +1 -1
  11. package/dist/components/DiffDisplay.d.ts.map +1 -1
  12. package/dist/components/DiffDisplay.js +4 -0
  13. package/dist/components/HelpView.d.ts +6 -0
  14. package/dist/components/HelpView.d.ts.map +1 -0
  15. package/dist/components/HelpView.js +24 -0
  16. package/dist/components/InputBox.d.ts +1 -1
  17. package/dist/components/InputBox.d.ts.map +1 -1
  18. package/dist/components/InputBox.js +10 -3
  19. package/dist/components/LoadingIndicator.js +1 -1
  20. package/dist/components/MessageItem.d.ts +1 -1
  21. package/dist/components/MessageItem.d.ts.map +1 -1
  22. package/dist/components/MessageItem.js +3 -4
  23. package/dist/components/MessageList.d.ts.map +1 -1
  24. package/dist/components/MessageList.js +24 -7
  25. package/dist/components/RewindCommand.js +1 -1
  26. package/dist/components/TaskList.d.ts.map +1 -1
  27. package/dist/components/TaskList.js +4 -13
  28. package/dist/components/ToolDisplay.d.ts +9 -0
  29. package/dist/components/ToolDisplay.d.ts.map +1 -0
  30. package/dist/components/ToolDisplay.js +44 -0
  31. package/dist/contexts/useChat.d.ts.map +1 -1
  32. package/dist/contexts/useChat.js +15 -1
  33. package/dist/hooks/useInputManager.d.ts +2 -2
  34. package/dist/hooks/useInputManager.d.ts.map +1 -1
  35. package/dist/hooks/useInputManager.js +12 -8
  36. package/dist/managers/InputManager.d.ts +4 -2
  37. package/dist/managers/InputManager.d.ts.map +1 -1
  38. package/dist/managers/InputManager.js +17 -17
  39. package/dist/print-cli.d.ts.map +1 -1
  40. package/dist/print-cli.js +11 -30
  41. package/package.json +2 -2
  42. package/src/components/App.tsx +16 -15
  43. package/src/components/ChatInterface.tsx +3 -2
  44. package/src/components/CommandOutputDisplay.tsx +16 -38
  45. package/src/components/CommandSelector.tsx +6 -0
  46. package/src/components/ConfirmationSelector.tsx +5 -9
  47. package/src/components/DiffDisplay.tsx +9 -0
  48. package/src/components/HelpView.tsx +59 -0
  49. package/src/components/InputBox.tsx +43 -33
  50. package/src/components/LoadingIndicator.tsx +1 -1
  51. package/src/components/MessageItem.tsx +12 -21
  52. package/src/components/MessageList.tsx +40 -17
  53. package/src/components/RewindCommand.tsx +1 -1
  54. package/src/components/TaskList.tsx +4 -16
  55. package/src/components/{ToolResultDisplay.tsx → ToolDisplay.tsx} +6 -16
  56. package/src/contexts/useChat.tsx +16 -1
  57. package/src/hooks/useInputManager.ts +12 -10
  58. package/src/managers/InputManager.ts +19 -21
  59. package/src/print-cli.ts +17 -35
  60. package/dist/components/SubagentBlock.d.ts +0 -8
  61. package/dist/components/SubagentBlock.d.ts.map +0 -1
  62. package/dist/components/SubagentBlock.js +0 -73
  63. package/dist/components/ToolResultDisplay.d.ts +0 -9
  64. package/dist/components/ToolResultDisplay.d.ts.map +0 -1
  65. package/dist/components/ToolResultDisplay.js +0 -54
  66. package/src/components/SubagentBlock.tsx +0 -152
@@ -25,6 +25,7 @@ export const useInputManager = (callbacks = {}) => {
25
25
  const [showBackgroundTaskManager, setShowBackgroundTaskManager] = useState(false);
26
26
  const [showMcpManager, setShowMcpManager] = useState(false);
27
27
  const [showRewindManager, setShowRewindManager] = useState(false);
28
+ const [showHelp, setShowHelp] = useState(false);
28
29
  const [permissionMode, setPermissionModeState] = useState("default");
29
30
  const [attachedImages, setAttachedImages] = useState([]);
30
31
  // Create InputManager on mount and update callbacks when they change
@@ -53,6 +54,9 @@ export const useInputManager = (callbacks = {}) => {
53
54
  onRewindManagerStateChange: (show) => {
54
55
  setShowRewindManager(show);
55
56
  },
57
+ onHelpStateChange: (show) => {
58
+ setShowHelp(show);
59
+ },
56
60
  onPermissionModeChange: (mode) => {
57
61
  setPermissionModeState(mode);
58
62
  callbacks.onPermissionModeChange?.(mode);
@@ -87,6 +91,9 @@ export const useInputManager = (callbacks = {}) => {
87
91
  onRewindManagerStateChange: (show) => {
88
92
  setShowRewindManager(show);
89
93
  },
94
+ onHelpStateChange: (show) => {
95
+ setShowHelp(show);
96
+ },
90
97
  onPermissionModeChange: (mode) => {
91
98
  setPermissionModeState(mode);
92
99
  callbacks.onPermissionModeChange?.(mode);
@@ -120,12 +127,6 @@ export const useInputManager = (callbacks = {}) => {
120
127
  const moveCursorRight = useCallback(() => {
121
128
  managerRef.current?.moveCursorRight();
122
129
  }, []);
123
- const moveCursorToStart = useCallback(() => {
124
- managerRef.current?.moveCursorToStart();
125
- }, []);
126
- const moveCursorToEnd = useCallback(() => {
127
- managerRef.current?.moveCursorToEnd();
128
- }, []);
129
130
  // File selector methods
130
131
  const activateFileSelector = useCallback((position) => {
131
132
  managerRef.current?.activateFileSelector(position);
@@ -205,6 +206,7 @@ export const useInputManager = (callbacks = {}) => {
205
206
  showBackgroundTaskManager,
206
207
  showMcpManager,
207
208
  showRewindManager,
209
+ showHelp,
208
210
  permissionMode,
209
211
  attachedImages,
210
212
  isManagerReady,
@@ -214,8 +216,6 @@ export const useInputManager = (callbacks = {}) => {
214
216
  clearInput,
215
217
  moveCursorLeft,
216
218
  moveCursorRight,
217
- moveCursorToStart,
218
- moveCursorToEnd,
219
219
  // File selector
220
220
  activateFileSelector,
221
221
  handleFileSelect,
@@ -245,6 +245,10 @@ export const useInputManager = (callbacks = {}) => {
245
245
  managerRef.current?.setShowRewindManager(show);
246
246
  setShowRewindManager(show);
247
247
  }, []),
248
+ setShowHelp: useCallback((show) => {
249
+ managerRef.current?.setShowHelp(show);
250
+ setShowHelp(show);
251
+ }, []),
248
252
  setPermissionMode: useCallback((mode) => {
249
253
  setPermissionModeState(mode);
250
254
  managerRef.current?.setPermissionMode(mode);
@@ -15,6 +15,7 @@ export interface InputManagerCallbacks {
15
15
  onBackgroundTaskManagerStateChange?: (show: boolean) => void;
16
16
  onMcpManagerStateChange?: (show: boolean) => void;
17
17
  onRewindManagerStateChange?: (show: boolean) => void;
18
+ onHelpStateChange?: (show: boolean) => void;
18
19
  onImagesStateChange?: (images: AttachedImage[]) => void;
19
20
  onSendMessage?: (content: string, images?: Array<{
20
21
  path: string;
@@ -51,6 +52,7 @@ export declare class InputManager {
51
52
  private showBackgroundTaskManager;
52
53
  private showMcpManager;
53
54
  private showRewindManager;
55
+ private showHelp;
54
56
  private permissionMode;
55
57
  private selectorJustUsed;
56
58
  private callbacks;
@@ -66,8 +68,6 @@ export declare class InputManager {
66
68
  clearInput(): void;
67
69
  moveCursorLeft(): void;
68
70
  moveCursorRight(): void;
69
- moveCursorToStart(): void;
70
- moveCursorToEnd(): void;
71
71
  private searchFiles;
72
72
  private debouncedSearchFiles;
73
73
  activateFileSelector(position: number): void;
@@ -120,6 +120,8 @@ export declare class InputManager {
120
120
  setShowMcpManager(show: boolean): void;
121
121
  getShowRewindManager(): boolean;
122
122
  setShowRewindManager(show: boolean): void;
123
+ getShowHelp(): boolean;
124
+ setShowHelp(show: boolean): void;
123
125
  getPermissionMode(): PermissionMode;
124
126
  setPermissionMode(mode: PermissionMode): void;
125
127
  cyclePermissionMode(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"InputManager.d.ts","sourceRoot":"","sources":["../../src/managers/InputManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InputManager.d.ts","sourceRoot":"","sources":["../../src/managers/InputManager.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,7 @@ export class InputManager {
33
33
  this.showBackgroundTaskManager = false;
34
34
  this.showMcpManager = false;
35
35
  this.showRewindManager = false;
36
+ this.showHelp = false;
36
37
  // Permission mode state
37
38
  this.permissionMode = "default";
38
39
  // Flag to prevent handleInput conflicts when selector selection occurs
@@ -98,12 +99,6 @@ export class InputManager {
98
99
  moveCursorRight() {
99
100
  this.setCursorPosition(this.cursorPosition + 1);
100
101
  }
101
- moveCursorToStart() {
102
- this.setCursorPosition(0);
103
- }
104
- moveCursorToEnd() {
105
- this.setCursorPosition(this.inputText.length);
106
- }
107
102
  // File selector methods
108
103
  async searchFiles(query) {
109
104
  try {
@@ -225,6 +220,10 @@ export class InputManager {
225
220
  this.setShowRewindManager(true);
226
221
  commandExecuted = true;
227
222
  }
223
+ else if (command === "help") {
224
+ this.setShowHelp(true);
225
+ commandExecuted = true;
226
+ }
228
227
  }
229
228
  })();
230
229
  this.handleCancelCommandSelect();
@@ -467,6 +466,13 @@ export class InputManager {
467
466
  this.showRewindManager = show;
468
467
  this.callbacks.onRewindManagerStateChange?.(show);
469
468
  }
469
+ getShowHelp() {
470
+ return this.showHelp;
471
+ }
472
+ setShowHelp(show) {
473
+ this.showHelp = show;
474
+ this.callbacks.onHelpStateChange?.(show);
475
+ }
470
476
  // Permission mode methods
471
477
  getPermissionMode() {
472
478
  return this.permissionMode;
@@ -614,14 +620,6 @@ export class InputManager {
614
620
  this.moveCursorRight();
615
621
  return true;
616
622
  }
617
- if (("home" in key && key.home) || (key.ctrl && input === "a")) {
618
- this.moveCursorToStart();
619
- return true;
620
- }
621
- if (("end" in key && key.end) || (key.ctrl && input === "e")) {
622
- this.moveCursorToEnd();
623
- return true;
624
- }
625
623
  // Handle Ctrl+V for pasting images
626
624
  if (key.ctrl && input === "v") {
627
625
  this.handlePasteImage().catch((error) => {
@@ -685,11 +683,13 @@ export class InputManager {
685
683
  this.showHistorySearch ||
686
684
  this.showBackgroundTaskManager ||
687
685
  this.showMcpManager ||
688
- this.showRewindManager) {
686
+ this.showRewindManager ||
687
+ this.showHelp) {
689
688
  if (this.showBackgroundTaskManager ||
690
689
  this.showMcpManager ||
691
- this.showRewindManager) {
692
- // Task manager, MCP manager and Rewind don't need to handle input, handled by component itself
690
+ this.showRewindManager ||
691
+ this.showHelp) {
692
+ // Task manager, MCP manager, Rewind and Help don't need to handle input, handled by component itself
693
693
  // Return true to indicate we've "handled" it (by ignoring it) so it doesn't leak to normal input
694
694
  return true;
695
695
  }
@@ -1 +1 @@
1
- {"version":3,"file":"print-cli.d.ts","sourceRoot":"","sources":["../src/print-cli.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAgBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAgL3E"}
1
+ {"version":3,"file":"print-cli.d.ts","sourceRoot":"","sources":["../src/print-cli.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAgBD,wBAAsB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8J3E"}
package/dist/print-cli.js CHANGED
@@ -48,38 +48,10 @@ export async function startPrintCli(options) {
48
48
  // FR-001: Stream content updates for real-time display - output only the new chunk
49
49
  process.stdout.write(chunk);
50
50
  },
51
- // Tool block callback - display tool name when tool starts
52
- onToolBlockUpdated: (params) => {
53
- // Print tool name only during 'running' stage (happens once per tool call)
54
- if (params.stage === "running" && params.name) {
55
- process.stdout.write(`\n🔧 ${params.name}`);
56
- if (params.compactParams) {
57
- process.stdout.write(` ${params.compactParams}`);
58
- }
59
- process.stdout.write(`\n`);
60
- }
61
- },
62
- // Subagent block callbacks
63
- onSubAgentBlockAdded: (subagentId, parameters) => {
64
- // Display subagent creation with indentation
65
- process.stdout.write(`\n🤖 Subagent [${parameters.subagent_type}]: ${parameters.description}\n`);
66
- },
67
- onSubAgentBlockUpdated: (subagentId, status) => {
68
- // Display subagent status updates
69
- const statusIconMap = {
70
- active: "🔄",
71
- completed: "✅",
72
- error: "❌",
73
- aborted: "⚠️",
74
- };
75
- const statusIcon = statusIconMap[status] ?? "🔄";
76
- process.stdout.write(` ${statusIcon} Subagent status: ${status}\n`);
77
- },
78
51
  // Subagent message callbacks
79
52
  onSubagentAssistantMessageAdded: (subagentId) => {
80
53
  subagentReasoningStates.set(subagentId, false);
81
54
  subagentContentStates.set(subagentId, false);
82
- // Subagent assistant message started - add indentation
83
55
  process.stdout.write("\n ");
84
56
  },
85
57
  onSubagentAssistantReasoningUpdated: (subagentId, chunk) => {
@@ -95,13 +67,22 @@ export async function startPrintCli(options) {
95
67
  process.stdout.write("\n 📝 Response: ");
96
68
  subagentContentStates.set(subagentId, true);
97
69
  }
98
- // Stream subagent content with indentation - output only the new chunk
99
70
  process.stdout.write(chunk);
100
71
  },
101
72
  onSubagentUserMessageAdded: (_subagentId, params) => {
102
- // Display subagent user messages with indentation
103
73
  process.stdout.write(`\n 👤 User: ${params.content}\n`);
104
74
  },
75
+ // Tool block callback - display tool name when tool starts
76
+ onToolBlockUpdated: (params) => {
77
+ // Print tool name only during 'running' stage (happens once per tool call)
78
+ if (params.stage === "running" && params.name) {
79
+ process.stdout.write(`\n🔧 ${params.name}`);
80
+ if (params.compactParams) {
81
+ process.stdout.write(` ${params.compactParams}`);
82
+ }
83
+ process.stdout.write(`\n`);
84
+ }
85
+ },
105
86
  // Error block callback
106
87
  onErrorBlockAdded: (error) => {
107
88
  // Display error blocks with distinct formatting
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wave-code",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "description": "CLI-based code assistant powered by AI, built with React and Ink",
5
5
  "repository": {
6
6
  "type": "git",
@@ -37,7 +37,7 @@
37
37
  "react": "^19.2.4",
38
38
  "react-dom": "19.2.4",
39
39
  "yargs": "^17.7.2",
40
- "wave-agent-sdk": "0.6.1"
40
+ "wave-agent-sdk": "0.6.2"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/react": "^19.1.8",
@@ -33,24 +33,25 @@ const ChatInterfaceWithRemount: React.FC = () => {
33
33
  const prevSessionId = useRef(sessionId);
34
34
 
35
35
  useEffect(() => {
36
- let newKey = String(isExpanded) + rewindId + wasLastDetailsTooTall;
37
-
38
- const isSessionChanged =
39
- prevSessionId.current && sessionId && prevSessionId.current !== sessionId;
40
-
41
- if (isSessionChanged) {
42
- newKey += sessionId;
43
- }
36
+ const newKey =
37
+ String(isExpanded) +
38
+ rewindId +
39
+ wasLastDetailsTooTall +
40
+ (prevSessionId.current && sessionId && prevSessionId.current !== sessionId
41
+ ? sessionId
42
+ : "");
44
43
 
45
44
  if (newKey !== remountKey) {
46
- stdout?.write("\u001b[2J\u001b[0;0H", (err?: Error | null) => {
47
- if (err) {
48
- console.error("Failed to clear terminal:", err);
49
- }
50
- setTimeout(() => {
45
+ const timeout = setTimeout(() => {
46
+ stdout?.write("\u001b[2J\u001b[0;0H", (err?: Error | null) => {
47
+ if (err) {
48
+ console.error("Failed to clear terminal:", err);
49
+ }
51
50
  setRemountKey(newKey);
52
- }, 100);
53
- });
51
+ });
52
+ }, 100);
53
+
54
+ return () => clearTimeout(timeout);
54
55
  }
55
56
 
56
57
  if (sessionId) {
@@ -84,7 +84,8 @@ export const ChatInterface: React.FC = () => {
84
84
  />
85
85
 
86
86
  {(isLoading || isCommandRunning || isCompressing) &&
87
- !isConfirmationVisible && (
87
+ !isConfirmationVisible &&
88
+ !isExpanded && (
88
89
  <LoadingIndicator
89
90
  isLoading={isLoading}
90
91
  isCommandRunning={isCommandRunning}
@@ -92,7 +93,7 @@ export const ChatInterface: React.FC = () => {
92
93
  latestTotalTokens={latestTotalTokens}
93
94
  />
94
95
  )}
95
- {!isConfirmationVisible && <TaskList />}
96
+ {!isConfirmationVisible && !isExpanded && <TaskList />}
96
97
 
97
98
  {isConfirmationVisible && (
98
99
  <>
@@ -13,7 +13,7 @@ export const CommandOutputDisplay: React.FC<CommandOutputDisplayProps> = ({
13
13
  }) => {
14
14
  const { command, output, isRunning, exitCode } = block;
15
15
  const [isOverflowing, setIsOverflowing] = useState(false);
16
- const MAX_LINES = 10; // Set maximum display lines
16
+ const MAX_LINES = 3; // Set maximum display lines
17
17
 
18
18
  // Detect if content is overflowing
19
19
  useEffect(() => {
@@ -30,50 +30,28 @@ export const CommandOutputDisplay: React.FC<CommandOutputDisplayProps> = ({
30
30
  return "gray"; // Unknown state
31
31
  };
32
32
 
33
- const getStatusText = () => {
34
- if (isRunning) return "🔄";
35
- if (exitCode === 0) return "✅";
36
- if (exitCode === 130) return "⚠️"; // SIGINT (Ctrl+C)
37
- if (exitCode !== null && exitCode !== 0) return "❌";
38
- return ""; // Don't display text for unknown state
39
- };
40
-
41
33
  return (
42
34
  <Box flexDirection="column">
43
35
  <Box>
44
- <Text color="cyan">$ </Text>
36
+ <Text color={getStatusColor()}>$ </Text>
45
37
  <Text color="white">{command}</Text>
46
- <Text color={getStatusColor()}> {getStatusText()}</Text>
47
38
  </Box>
48
39
 
49
40
  {output && (
50
- <Box marginTop={1} flexDirection="column">
51
- <Box
52
- paddingLeft={2}
53
- borderLeft
54
- borderColor="gray"
55
- flexDirection="column"
56
- height={
57
- isExpanded
58
- ? undefined
59
- : Math.min(output.split("\n").length, MAX_LINES)
60
- }
61
- overflow="hidden"
62
- >
63
- <Text color="gray">
64
- {isOverflowing
65
- ? output.split("\n").slice(-MAX_LINES).join("\n")
66
- : output}
67
- </Text>
68
- </Box>
69
- {isOverflowing && (
70
- <Box paddingLeft={2} marginTop={1}>
71
- <Text color="yellow" dimColor>
72
- Content truncated ({output.split("\n").length} lines total,
73
- showing last {MAX_LINES} lines)
74
- </Text>
75
- </Box>
76
- )}
41
+ <Box
42
+ paddingLeft={2}
43
+ height={
44
+ isExpanded
45
+ ? undefined
46
+ : Math.min(output.split("\n").length, MAX_LINES)
47
+ }
48
+ overflow="hidden"
49
+ >
50
+ <Text color="gray">
51
+ {isOverflowing
52
+ ? output.split("\n").slice(-MAX_LINES).join("\n")
53
+ : output}
54
+ </Text>
77
55
  </Box>
78
56
  )}
79
57
  </Box>
@@ -22,6 +22,12 @@ const AVAILABLE_COMMANDS: SlashCommand[] = [
22
22
  "Revert conversation and file changes to a previous checkpoint",
23
23
  handler: () => {}, // Handler here won't be used, actual processing is in the hook
24
24
  },
25
+ {
26
+ id: "help",
27
+ name: "help",
28
+ description: "Show help and key bindings",
29
+ handler: () => {}, // Handler here won't be used, actual processing is in the hook
30
+ },
25
31
  ];
26
32
 
27
33
  export interface CommandSelectorProps {
@@ -314,16 +314,12 @@ export const ConfirmationSelector: React.FC<ConfirmationSelectorProps> = ({
314
314
  !isExpanded && (
315
315
  <Box flexDirection="column" marginTop={1}>
316
316
  <Box marginBottom={1}>
317
- <Box
318
- backgroundColor={getHeaderColor(currentQuestion.header)}
319
- paddingX={1}
320
- marginRight={1}
321
- >
322
- <Text color="black" bold>
323
- {currentQuestion.header.slice(0, 12).toUpperCase()}
324
- </Text>
317
+ <Text color={getHeaderColor(currentQuestion.header)} bold>
318
+ {currentQuestion.header.slice(0, 12).toUpperCase()}
319
+ </Text>
320
+ <Box marginLeft={1}>
321
+ <Text bold>{currentQuestion.question}</Text>
325
322
  </Box>
326
- <Text bold>{currentQuestion.question}</Text>
327
323
  </Box>
328
324
  <Box flexDirection="column">
329
325
  {[...currentQuestion.options, { label: "Other" }].map(
@@ -109,6 +109,15 @@ export const DiffDisplay: React.FC<DiffDisplayProps> = ({
109
109
 
110
110
  changes.forEach((change, changeIndex) => {
111
111
  try {
112
+ // Add ellipsis between non-contiguous edits in MultiEdit
113
+ if (toolName === MULTI_EDIT_TOOL_NAME && changeIndex > 0) {
114
+ allElements.push(
115
+ <Box key={`multi-edit-separator-${changeIndex}`}>
116
+ <Text color="gray">...</Text>
117
+ </Box>,
118
+ );
119
+ }
120
+
112
121
  // Get line-level diff to understand the structure
113
122
  const lineDiffs = diffLines(
114
123
  change.oldContent || "",
@@ -0,0 +1,59 @@
1
+ import React from "react";
2
+ import { Box, Text, useInput } from "ink";
3
+
4
+ export interface HelpViewProps {
5
+ onCancel: () => void;
6
+ }
7
+
8
+ export const HelpView: React.FC<HelpViewProps> = ({ onCancel }) => {
9
+ useInput((_, key) => {
10
+ if (key.escape || key.return) {
11
+ onCancel();
12
+ }
13
+ });
14
+
15
+ const helpItems = [
16
+ { key: "@", description: "Reference files" },
17
+ { key: "/", description: "Commands" },
18
+ { key: "Ctrl+R", description: "Search history" },
19
+ { key: "Ctrl+O", description: "Expand/collapse messages" },
20
+ { key: "Ctrl+T", description: "Toggle task list" },
21
+ { key: "Ctrl+B", description: "Background current task" },
22
+ { key: "Ctrl+V", description: "Paste image" },
23
+ { key: "Shift+Tab", description: "Cycle permission mode" },
24
+ {
25
+ key: "Esc",
26
+ description: "Interrupt AI or command / Cancel selector / Close help",
27
+ },
28
+ ];
29
+
30
+ return (
31
+ <Box
32
+ flexDirection="column"
33
+ borderStyle="single"
34
+ borderColor="cyan"
35
+ borderLeft={false}
36
+ borderRight={false}
37
+ paddingX={1}
38
+ >
39
+ <Box marginBottom={1}>
40
+ <Text color="cyan" bold underline>
41
+ Help & Key Bindings
42
+ </Text>
43
+ </Box>
44
+
45
+ {helpItems.map((item, index) => (
46
+ <Box key={index}>
47
+ <Box width={20}>
48
+ <Text color="yellow">{item.key}</Text>
49
+ </Box>
50
+ <Text color="white">{item.description}</Text>
51
+ </Box>
52
+ ))}
53
+
54
+ <Box marginTop={1}>
55
+ <Text dimColor>Press Esc or Enter to close</Text>
56
+ </Box>
57
+ </Box>
58
+ );
59
+ };
@@ -7,13 +7,14 @@ import { HistorySearch } from "./HistorySearch.js";
7
7
  import { BackgroundTaskManager } from "./BackgroundTaskManager.js";
8
8
  import { McpManager } from "./McpManager.js";
9
9
  import { RewindCommand } from "./RewindCommand.js";
10
+ import { HelpView } from "./HelpView.js";
10
11
  import { useInputManager } from "../hooks/useInputManager.js";
11
12
  import { useChat } from "../contexts/useChat.js";
12
13
 
13
14
  import type { McpServerStatus, SlashCommand } from "wave-agent-sdk";
14
15
 
15
16
  export const INPUT_PLACEHOLDER_TEXT =
16
- "Type your message (use @ to reference files, / for commands, Ctrl+R to search history, Ctrl+O to expand messages, Ctrl+T to toggle tasks)...";
17
+ "Type your message (use /help for more info)...";
17
18
 
18
19
  export const INPUT_PLACEHOLDER_TEXT_PREFIX = INPUT_PLACEHOLDER_TEXT.substring(
19
20
  0,
@@ -86,9 +87,11 @@ export const InputBox: React.FC<InputBoxProps> = ({
86
87
  showBackgroundTaskManager,
87
88
  showMcpManager,
88
89
  showRewindManager,
90
+ showHelp,
89
91
  setShowBackgroundTaskManager,
90
92
  setShowMcpManager,
91
93
  setShowRewindManager,
94
+ setShowHelp,
92
95
  // Permission mode
93
96
  permissionMode,
94
97
  setPermissionMode,
@@ -165,6 +168,10 @@ export const InputBox: React.FC<InputBoxProps> = ({
165
168
  );
166
169
  }
167
170
 
171
+ if (showHelp) {
172
+ return <HelpView onCancel={() => setShowHelp(false)} />;
173
+ }
174
+
168
175
  return (
169
176
  <Box flexDirection="column">
170
177
  {showFileSelector && (
@@ -209,39 +216,42 @@ export const InputBox: React.FC<InputBoxProps> = ({
209
216
  />
210
217
  )}
211
218
 
212
- {showBackgroundTaskManager || showMcpManager || showRewindManager || (
213
- <Box flexDirection="column">
214
- <Box
215
- borderStyle="single"
216
- borderColor="gray"
217
- borderLeft={false}
218
- borderRight={false}
219
- >
220
- <Text color={isPlaceholder ? "gray" : "white"}>
221
- {shouldShowCursor ? (
222
- <>
223
- {beforeCursor}
224
- <Text backgroundColor="white" color="black">
225
- {atCursor}
226
- </Text>
227
- {afterCursor}
228
- </>
229
- ) : (
230
- displayText
231
- )}
232
- </Text>
219
+ {showBackgroundTaskManager ||
220
+ showMcpManager ||
221
+ showRewindManager ||
222
+ showHelp || (
223
+ <Box flexDirection="column">
224
+ <Box
225
+ borderStyle="single"
226
+ borderColor="gray"
227
+ borderLeft={false}
228
+ borderRight={false}
229
+ >
230
+ <Text color={isPlaceholder ? "gray" : "white"}>
231
+ {shouldShowCursor ? (
232
+ <>
233
+ {beforeCursor}
234
+ <Text backgroundColor="white" color="black">
235
+ {atCursor}
236
+ </Text>
237
+ {afterCursor}
238
+ </>
239
+ ) : (
240
+ displayText
241
+ )}
242
+ </Text>
243
+ </Box>
244
+ <Box paddingRight={1} justifyContent="space-between" width="100%">
245
+ <Text color="gray">
246
+ Mode:{" "}
247
+ <Text color={permissionMode === "plan" ? "yellow" : "cyan"}>
248
+ {permissionMode}
249
+ </Text>{" "}
250
+ (Shift+Tab to cycle)
251
+ </Text>
252
+ </Box>
233
253
  </Box>
234
- <Box paddingRight={1} justifyContent="space-between" width="100%">
235
- <Text color="gray">
236
- Mode:{" "}
237
- <Text color={permissionMode === "plan" ? "yellow" : "cyan"}>
238
- {permissionMode}
239
- </Text>{" "}
240
- (Shift+Tab to cycle)
241
- </Text>
242
- </Box>
243
- </Box>
244
- )}
254
+ )}
245
255
  </Box>
246
256
  );
247
257
  };