wave-code 0.0.3 → 0.0.5

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 (82) hide show
  1. package/dist/components/InputBox.d.ts.map +1 -1
  2. package/dist/components/InputBox.js +69 -95
  3. package/dist/components/MemoryDisplay.js +1 -1
  4. package/dist/components/MemoryTypeSelector.js +1 -1
  5. package/dist/components/MessageList.d.ts.map +1 -1
  6. package/dist/components/MessageList.js +2 -1
  7. package/dist/components/SubagentBlock.d.ts +1 -1
  8. package/dist/components/SubagentBlock.d.ts.map +1 -1
  9. package/dist/components/SubagentBlock.js +12 -2
  10. package/dist/components/ToolResultDisplay.js +1 -1
  11. package/dist/contexts/useChat.d.ts +2 -1
  12. package/dist/contexts/useChat.d.ts.map +1 -1
  13. package/dist/contexts/useChat.js +18 -0
  14. package/dist/hooks/useInputManager.d.ts +91 -0
  15. package/dist/hooks/useInputManager.d.ts.map +1 -0
  16. package/dist/hooks/useInputManager.js +319 -0
  17. package/dist/index.js +9 -9
  18. package/dist/managers/InputManager.d.ts +169 -0
  19. package/dist/managers/InputManager.d.ts.map +1 -0
  20. package/dist/managers/InputManager.js +806 -0
  21. package/dist/print-cli.d.ts +7 -0
  22. package/dist/print-cli.d.ts.map +1 -0
  23. package/dist/{plain-cli.js → print-cli.js} +21 -2
  24. package/dist/utils/constants.d.ts +1 -1
  25. package/dist/utils/constants.js +1 -1
  26. package/dist/utils/fileSearch.d.ts +20 -0
  27. package/dist/utils/fileSearch.d.ts.map +1 -0
  28. package/dist/utils/fileSearch.js +102 -0
  29. package/dist/utils/logger.js +3 -3
  30. package/dist/utils/usageSummary.d.ts +27 -0
  31. package/dist/utils/usageSummary.d.ts.map +1 -0
  32. package/dist/utils/usageSummary.js +82 -0
  33. package/package.json +2 -2
  34. package/src/components/InputBox.tsx +114 -153
  35. package/src/components/MemoryDisplay.tsx +1 -1
  36. package/src/components/MemoryTypeSelector.tsx +1 -1
  37. package/src/components/MessageList.tsx +14 -10
  38. package/src/components/SubagentBlock.tsx +14 -3
  39. package/src/components/ToolResultDisplay.tsx +1 -1
  40. package/src/contexts/useChat.tsx +23 -0
  41. package/src/hooks/useInputManager.ts +443 -0
  42. package/src/index.ts +9 -9
  43. package/src/managers/InputManager.ts +1102 -0
  44. package/src/{plain-cli.ts → print-cli.ts} +21 -3
  45. package/src/utils/constants.ts +1 -1
  46. package/src/utils/fileSearch.ts +133 -0
  47. package/src/utils/logger.ts +3 -3
  48. package/src/utils/usageSummary.ts +125 -0
  49. package/dist/hooks/useBashHistorySelector.d.ts +0 -15
  50. package/dist/hooks/useBashHistorySelector.d.ts.map +0 -1
  51. package/dist/hooks/useBashHistorySelector.js +0 -61
  52. package/dist/hooks/useCommandSelector.d.ts +0 -24
  53. package/dist/hooks/useCommandSelector.d.ts.map +0 -1
  54. package/dist/hooks/useCommandSelector.js +0 -98
  55. package/dist/hooks/useFileSelector.d.ts +0 -16
  56. package/dist/hooks/useFileSelector.d.ts.map +0 -1
  57. package/dist/hooks/useFileSelector.js +0 -174
  58. package/dist/hooks/useImageManager.d.ts +0 -13
  59. package/dist/hooks/useImageManager.d.ts.map +0 -1
  60. package/dist/hooks/useImageManager.js +0 -46
  61. package/dist/hooks/useInputHistory.d.ts +0 -11
  62. package/dist/hooks/useInputHistory.d.ts.map +0 -1
  63. package/dist/hooks/useInputHistory.js +0 -64
  64. package/dist/hooks/useInputKeyboardHandler.d.ts +0 -83
  65. package/dist/hooks/useInputKeyboardHandler.d.ts.map +0 -1
  66. package/dist/hooks/useInputKeyboardHandler.js +0 -507
  67. package/dist/hooks/useInputState.d.ts +0 -14
  68. package/dist/hooks/useInputState.d.ts.map +0 -1
  69. package/dist/hooks/useInputState.js +0 -57
  70. package/dist/hooks/useMemoryTypeSelector.d.ts +0 -9
  71. package/dist/hooks/useMemoryTypeSelector.d.ts.map +0 -1
  72. package/dist/hooks/useMemoryTypeSelector.js +0 -27
  73. package/dist/plain-cli.d.ts +0 -7
  74. package/dist/plain-cli.d.ts.map +0 -1
  75. package/src/hooks/useBashHistorySelector.ts +0 -77
  76. package/src/hooks/useCommandSelector.ts +0 -131
  77. package/src/hooks/useFileSelector.ts +0 -227
  78. package/src/hooks/useImageManager.ts +0 -64
  79. package/src/hooks/useInputHistory.ts +0 -74
  80. package/src/hooks/useInputKeyboardHandler.ts +0 -778
  81. package/src/hooks/useInputState.ts +0 -66
  82. package/src/hooks/useMemoryTypeSelector.ts +0 -40
@@ -1 +1 @@
1
- {"version":3,"file":"InputBox.d.ts","sourceRoot":"","sources":["../../src/components/InputBox.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAgBrD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEpE,eAAO,MAAM,sBAAsB,yGACqE,CAAC;AAEzG,eAAO,MAAM,6BAA6B,QAGzC,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,KAC/C,IAAI,CAAC;IACV,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1E,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/D,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CAClD;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAuQ5C,CAAC"}
1
+ {"version":3,"file":"InputBox.d.ts","sourceRoot":"","sources":["../../src/components/InputBox.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAiC,MAAM,OAAO,CAAC;AAWtD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEpE,eAAO,MAAM,sBAAsB,yGACqE,CAAC;AAEzG,eAAO,MAAM,6BAA6B,QAGzC,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,KAC/C,IAAI,CAAC;IACV,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1E,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAE/D,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CAClD;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAqO5C,CAAC"}
@@ -1,118 +1,92 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useCallback } from "react";
2
+ import { useCallback, useEffect } from "react";
3
3
  import { Box, Text } from "ink";
4
+ import { useInput } from "ink";
4
5
  import { FileSelector } from "./FileSelector.js";
5
6
  import { CommandSelector } from "./CommandSelector.js";
6
7
  import { BashHistorySelector } from "./BashHistorySelector.js";
7
8
  import { MemoryTypeSelector } from "./MemoryTypeSelector.js";
8
9
  import { BashShellManager } from "./BashShellManager.js";
9
10
  import { McpManager } from "./McpManager.js";
10
- import { useInputState } from "../hooks/useInputState.js";
11
- import { useFileSelector } from "../hooks/useFileSelector.js";
12
- import { useCommandSelector } from "../hooks/useCommandSelector.js";
13
- import { useBashHistorySelector } from "../hooks/useBashHistorySelector.js";
14
- import { useMemoryTypeSelector } from "../hooks/useMemoryTypeSelector.js";
15
- import { useInputHistory } from "../hooks/useInputHistory.js";
16
- import { useInputKeyboardHandler } from "../hooks/useInputKeyboardHandler.js";
17
- import { useImageManager } from "../hooks/useImageManager.js";
11
+ import { useInputManager } from "../hooks/useInputManager.js";
18
12
  export const INPUT_PLACEHOLDER_TEXT = "Type your message (use @ to reference files, / for commands, ! for bash history, # to add memory)...";
19
13
  export const INPUT_PLACEHOLDER_TEXT_PREFIX = INPUT_PLACEHOLDER_TEXT.substring(0, 10);
20
14
  export const InputBox = ({ isLoading = false, isCommandRunning = false, workdir, userInputHistory = [], sendMessage = () => { }, abortMessage = () => { }, saveMemory = async () => { }, mcpServers = [], connectMcpServer = async () => false, disconnectMcpServer = async () => false, slashCommands = [], hasSlashCommand = () => false, }) => {
21
15
  // Get current working directory
22
16
  const currentWorkdir = workdir || process.cwd();
23
- // Bash shell manager state
24
- const [showBashManager, setShowBashManager] = useState(false);
25
- // MCP manager state
26
- const [showMcpManager, setShowMcpManager] = useState(false);
27
- // Basic input state
28
- const { inputText, setInputText, cursorPosition, setCursorPosition, insertTextAtCursor, deleteCharAtCursor, clearInput, moveCursorLeft, moveCursorRight, moveCursorToStart, moveCursorToEnd, } = useInputState();
29
- // File selector functionality
30
- const { showFileSelector, filteredFiles, searchQuery, activateFileSelector, handleFileSelect: handleFileSelectorSelect, handleCancelFileSelect, updateSearchQuery, checkForAtDeletion, atPosition, } = useFileSelector();
31
- // Command selector functionality
32
- const { showCommandSelector, commandSearchQuery, activateCommandSelector, handleCommandSelect: handleCommandSelectorSelect, handleCommandInsert: handleCommandSelectorInsert, handleCancelCommandSelect, updateCommandSearchQuery, checkForSlashDeletion, slashPosition, } = useCommandSelector({
17
+ // Simple history navigation reset function
18
+ const resetHistoryNavigation = useCallback(() => {
19
+ // This will be handled by InputManager through callbacks
20
+ }, []);
21
+ // Input manager with all input state and functionality (including images)
22
+ const { inputText, cursorPosition, clearInput,
23
+ // Image management
24
+ attachedImages, clearImages,
25
+ // File selector
26
+ showFileSelector, filteredFiles, fileSearchQuery: searchQuery, handleFileSelect: handleFileSelectorSelect, handleCancelFileSelect,
27
+ // Command selector
28
+ showCommandSelector, commandSearchQuery, handleCommandSelect: handleCommandSelectorSelect, handleCommandInsert: handleCommandSelectorInsert, handleCancelCommandSelect,
29
+ // Bash history selector
30
+ showBashHistorySelector, bashHistorySearchQuery, handleBashHistorySelect: handleBashHistorySelectorSelect, handleBashHistoryExecute, handleCancelBashHistorySelect,
31
+ // Memory type selector
32
+ showMemoryTypeSelector, memoryMessage, handleMemoryTypeSelect: handleMemoryTypeSelectorSelect, handleCancelMemoryTypeSelect,
33
+ // Bash/MCP Manager
34
+ showBashManager, showMcpManager, setShowBashManager, setShowMcpManager,
35
+ // Input history
36
+ setUserInputHistory,
37
+ // Main handler
38
+ handleInput, } = useInputManager({
33
39
  onShowBashManager: () => setShowBashManager(true),
34
40
  onShowMcpManager: () => setShowMcpManager(true),
35
- sendMessage: async (content) => {
36
- await sendMessage(content);
37
- },
38
- hasSlashCommand,
41
+ onSendMessage: sendMessage,
42
+ onHasSlashCommand: hasSlashCommand,
43
+ onSaveMemory: saveMemory,
44
+ onAbortMessage: abortMessage,
45
+ onResetHistoryNavigation: resetHistoryNavigation,
39
46
  });
40
- // Bash history selector functionality
41
- const { showBashHistorySelector, bashHistorySearchQuery, activateBashHistorySelector, handleBashHistorySelect: handleBashHistorySelectorSelect, handleBashHistoryExecute, handleCancelBashHistorySelect, updateBashHistorySearchQuery, checkForExclamationDeletion, exclamationPosition, } = useBashHistorySelector();
42
- // Memory type selector functionality
43
- const { showMemoryTypeSelector, memoryMessage, activateMemoryTypeSelector, handleMemoryTypeSelect: handleMemoryTypeSelectorSelect, handleCancelMemoryTypeSelect, } = useMemoryTypeSelector();
44
- // Input history functionality
45
- const { resetHistoryNavigation, navigateHistory } = useInputHistory({
46
- userInputHistory,
47
- });
48
- // Image management functionality (includes clipboard paste)
49
- const { attachedImages, clearImages, handlePasteImage } = useImageManager(insertTextAtCursor);
50
- // Keyboard handling
51
- const { handleFileSelect, handleCommandSelect, handleBashHistorySelect, handleBashHistoryExecute: keyboardHandleBashHistoryExecute, handleMemoryTypeSelect, } = useInputKeyboardHandler({
52
- inputText,
53
- setInputText,
54
- cursorPosition,
55
- setCursorPosition,
56
- moveCursorLeft,
57
- moveCursorRight,
58
- moveCursorToStart,
59
- moveCursorToEnd,
60
- deleteCharAtCursor,
61
- insertTextAtCursor,
62
- clearInput,
63
- resetHistoryNavigation,
64
- navigateHistory,
65
- handlePasteImage,
66
- attachedImages,
67
- clearImages,
68
- showFileSelector,
69
- activateFileSelector,
70
- handleFileSelect: handleFileSelectorSelect,
71
- handleCancelFileSelect,
72
- updateSearchQuery,
73
- checkForAtDeletion,
74
- atPosition,
75
- showCommandSelector,
76
- activateCommandSelector,
77
- handleCommandSelect: handleCommandSelectorSelect,
78
- handleCommandInsert: handleCommandSelectorInsert,
79
- handleCancelCommandSelect,
80
- updateCommandSearchQuery,
81
- checkForSlashDeletion,
82
- slashPosition,
83
- showBashHistorySelector,
84
- activateBashHistorySelector,
85
- handleBashHistorySelect: handleBashHistorySelectorSelect,
86
- handleBashHistoryExecute,
87
- handleCancelBashHistorySelect,
88
- updateBashHistorySearchQuery,
89
- checkForExclamationDeletion,
90
- exclamationPosition,
91
- showMemoryTypeSelector,
92
- activateMemoryTypeSelector,
93
- handleMemoryTypeSelect: handleMemoryTypeSelectorSelect,
94
- showBashManager,
95
- showMcpManager,
96
- isCommandRunning,
97
- isLoading,
98
- sendMessage,
99
- abortMessage,
100
- saveMemory,
47
+ // Set user input history when it changes
48
+ useEffect(() => {
49
+ setUserInputHistory(userInputHistory);
50
+ }, [userInputHistory, setUserInputHistory]);
51
+ // Use the InputManager's unified input handler
52
+ useInput(async (input, key) => {
53
+ await handleInput(input, key, attachedImages, isLoading, isCommandRunning, clearImages);
101
54
  });
55
+ // Handler functions for keyboard events
56
+ const handleFileSelect = useCallback((filePath) => {
57
+ handleFileSelectorSelect(filePath);
58
+ }, [handleFileSelectorSelect]);
59
+ const handleCommandSelect = useCallback((command) => {
60
+ handleCommandSelectorSelect(command);
61
+ }, [handleCommandSelectorSelect]);
62
+ const handleBashHistorySelect = useCallback((command) => {
63
+ handleBashHistorySelectorSelect(command);
64
+ }, [handleBashHistorySelectorSelect]);
65
+ const keyboardHandleBashHistoryExecute = useCallback((command) => {
66
+ const commandToExecute = handleBashHistoryExecute(command);
67
+ // Clear input box and execute command, ensure command starts with !
68
+ const bashCommand = commandToExecute.startsWith("!")
69
+ ? commandToExecute
70
+ : `!${commandToExecute}`;
71
+ clearInput();
72
+ sendMessage(bashCommand);
73
+ }, [handleBashHistoryExecute, clearInput, sendMessage]);
74
+ const handleMemoryTypeSelect = useCallback(async (type) => {
75
+ const currentMessage = inputText.trim();
76
+ if (currentMessage.startsWith("#")) {
77
+ await saveMemory(currentMessage, type);
78
+ }
79
+ // Call the handler function to close the selector
80
+ handleMemoryTypeSelectorSelect(type);
81
+ // Clear input box
82
+ clearInput();
83
+ }, [inputText, saveMemory, handleMemoryTypeSelectorSelect, clearInput]);
102
84
  const isPlaceholder = !inputText;
103
85
  const placeholderText = INPUT_PLACEHOLDER_TEXT;
104
86
  // Create adapter function for CommandSelector
105
87
  const handleCommandInsert = useCallback((command) => {
106
- const result = handleCommandSelectorInsert(command, inputText, cursorPosition);
107
- setInputText(result.newInput);
108
- setCursorPosition(result.newCursorPosition);
109
- }, [
110
- handleCommandSelectorInsert,
111
- inputText,
112
- cursorPosition,
113
- setInputText,
114
- setCursorPosition,
115
- ]);
88
+ handleCommandSelectorInsert(command);
89
+ }, [handleCommandSelectorInsert]);
116
90
  // Split text into three parts: before cursor, cursor position, after cursor
117
91
  const displayText = isPlaceholder ? placeholderText : inputText;
118
92
  const beforeCursor = displayText.substring(0, cursorPosition);
@@ -120,5 +94,5 @@ export const InputBox = ({ isLoading = false, isCommandRunning = false, workdir,
120
94
  const afterCursor = displayText.substring(cursorPosition + 1);
121
95
  // Always show cursor, allow user to continue input during loading
122
96
  const shouldShowCursor = true;
123
- return (_jsxs(Box, { flexDirection: "column", width: "100%", children: [showFileSelector && (_jsx(FileSelector, { files: filteredFiles, searchQuery: searchQuery, onSelect: handleFileSelect, onCancel: handleCancelFileSelect })), showCommandSelector && (_jsx(CommandSelector, { searchQuery: commandSearchQuery, onSelect: handleCommandSelect, onInsert: handleCommandInsert, onCancel: handleCancelCommandSelect, commands: slashCommands })), showBashHistorySelector && (_jsx(BashHistorySelector, { searchQuery: bashHistorySearchQuery, workdir: currentWorkdir, onSelect: handleBashHistorySelect, onExecute: keyboardHandleBashHistoryExecute, onCancel: handleCancelBashHistorySelect })), showMemoryTypeSelector && (_jsx(MemoryTypeSelector, { message: memoryMessage, onSelect: handleMemoryTypeSelect, onCancel: handleCancelMemoryTypeSelect })), showBashManager && (_jsx(BashShellManager, { onCancel: () => setShowBashManager(false) })), showMcpManager && (_jsx(McpManager, { onCancel: () => setShowMcpManager(false), servers: mcpServers, onConnectServer: connectMcpServer, onDisconnectServer: disconnectMcpServer })), showBashManager || showMcpManager || (_jsx(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, children: _jsx(Box, { width: "100%", flexDirection: "row", justifyContent: "space-between", children: _jsx(Text, { color: isPlaceholder ? "gray" : "white", children: shouldShowCursor ? (_jsxs(_Fragment, { children: [beforeCursor, _jsx(Text, { backgroundColor: "white", color: "black", children: atCursor }), afterCursor] })) : (displayText) }) }) }))] }));
97
+ return (_jsxs(Box, { flexDirection: "column", width: "100%", children: [showFileSelector && (_jsx(FileSelector, { files: filteredFiles, searchQuery: searchQuery, onSelect: handleFileSelect, onCancel: handleCancelFileSelect })), showCommandSelector && (_jsx(CommandSelector, { searchQuery: commandSearchQuery, onSelect: handleCommandSelect, onInsert: handleCommandInsert, onCancel: handleCancelCommandSelect, commands: slashCommands })), showBashHistorySelector && (_jsx(BashHistorySelector, { searchQuery: bashHistorySearchQuery, workdir: currentWorkdir, onSelect: handleBashHistorySelect, onExecute: keyboardHandleBashHistoryExecute, onCancel: handleCancelBashHistorySelect })), showMemoryTypeSelector && (_jsx(MemoryTypeSelector, { message: memoryMessage, onSelect: handleMemoryTypeSelect, onCancel: handleCancelMemoryTypeSelect })), showBashManager && (_jsx(BashShellManager, { onCancel: () => setShowBashManager(false) })), showMcpManager && (_jsx(McpManager, { onCancel: () => setShowMcpManager(false), servers: mcpServers, onConnectServer: connectMcpServer, onDisconnectServer: disconnectMcpServer })), showBashManager || showMcpManager || (_jsx(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, children: _jsx(Text, { color: isPlaceholder ? "gray" : "white", children: shouldShowCursor ? (_jsxs(_Fragment, { children: [beforeCursor, _jsx(Text, { backgroundColor: "white", color: "black", children: atCursor }), afterCursor] })) : (displayText) }) }))] }));
124
98
  };
@@ -18,7 +18,7 @@ export const MemoryDisplay = ({ block }) => {
18
18
  return `Memory saved to ${storagePath || "user-memory.md"}`;
19
19
  }
20
20
  else {
21
- return `Memory saved to ${storagePath || "WAVE.md"}`;
21
+ return `Memory saved to ${storagePath || "AGENTS.md"}`;
22
22
  }
23
23
  };
24
24
  return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { color: getStatusColor(), children: [getStatusIcon(), " "] }), _jsx(Text, { color: getStatusColor(), children: getStatusText() })] }), content && (_jsx(Box, { marginTop: 1, paddingLeft: 2, children: _jsx(Box, { borderLeft: true, borderColor: isSuccess ? "green" : "red", paddingLeft: 1, children: _jsx(Text, { color: "gray", children: content }) }) })), isSuccess && (_jsx(Box, { paddingLeft: 2, marginTop: 1, children: _jsx(Text, { color: "yellow", dimColor: true, children: getStorageText() }) }))] }));
@@ -7,7 +7,7 @@ export const MemoryTypeSelector = ({ message, onSelect, onCancel, }) => {
7
7
  {
8
8
  type: "project",
9
9
  label: "Project Memory",
10
- description: "Save to current project (WAVE.md)",
10
+ description: "Save to current project (AGENTS.md)",
11
11
  },
12
12
  {
13
13
  type: "user",
@@ -1 +1 @@
1
- {"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAuG9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAyGlD,CAAC"}
1
+ {"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../src/components/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AA2G9C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAyGlD,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useMemo } from "react";
3
3
  import { Box, Text } from "ink";
4
+ import { MessageSource } from "wave-agent-sdk";
4
5
  import { DiffViewer } from "./DiffViewer.js";
5
6
  import { CommandOutputDisplay } from "./CommandOutputDisplay.js";
6
7
  import { ToolResultDisplay } from "./ToolResultDisplay.js";
@@ -11,7 +12,7 @@ import { usePagination } from "../hooks/usePagination.js";
11
12
  // Function to render a single message
12
13
  const renderMessageItem = (message, originalIndex, isExpanded, previousMessage) => {
13
14
  const shouldShowHeader = previousMessage?.role !== message.role;
14
- return (_jsxs(Box, { flexDirection: "column", children: [shouldShowHeader && (_jsx(Box, { children: _jsxs(Text, { color: message.role === "user" ? "cyan" : "green", bold: true, children: [message.role === "user" ? "👤 You" : "🤖 Assistant", _jsxs(Text, { color: "gray", dimColor: true, children: [" ", "#", originalIndex + 1] })] }) })), _jsx(Box, { marginLeft: 2, flexDirection: "column", gap: 1, marginTop: shouldShowHeader ? 1 : 0, children: message.blocks.map((block, blockIndex) => (_jsxs(Box, { children: [block.type === "text" && block.content.trim() && (_jsx(Box, { children: _jsx(Text, { children: block.content }) })), block.type === "error" && (_jsx(Box, { children: _jsxs(Text, { color: "red", children: ["\u274C Error: ", block.content] }) })), block.type === "diff" && (_jsx(DiffViewer, { block: block, isExpanded: isExpanded })), block.type === "command_output" && (_jsx(CommandOutputDisplay, { block: block, isExpanded: isExpanded })), block.type === "tool" && (_jsx(ToolResultDisplay, { block: block, isExpanded: isExpanded })), block.type === "image" && (_jsxs(Box, { children: [_jsx(Text, { color: "magenta", bold: true, children: "\uD83D\uDCF7 Image" }), block.imageUrls && block.imageUrls.length > 0 && (_jsxs(Text, { color: "gray", dimColor: true, children: [" ", "(", block.imageUrls.length, ")"] }))] })), block.type === "memory" && _jsx(MemoryDisplay, { block: block }), block.type === "compress" && (_jsx(CompressDisplay, { block: block, isExpanded: isExpanded })), block.type === "custom_command" && (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", bold: true, children: "\u26A1" }), _jsx(Text, { children: block.originalInput || `/${block.commandName}` })] })), block.type === "subagent" && (_jsx(SubagentBlock, { block: block, isExpanded: isExpanded }))] }, blockIndex))) })] }, `message-${originalIndex}`));
15
+ return (_jsxs(Box, { flexDirection: "column", children: [shouldShowHeader && (_jsx(Box, { children: _jsxs(Text, { color: message.role === "user" ? "cyan" : "green", bold: true, children: [message.role === "user" ? "👤 You" : "🤖 Assistant", _jsxs(Text, { color: "gray", dimColor: true, children: [" ", "#", originalIndex + 1] })] }) })), _jsx(Box, { marginLeft: 2, flexDirection: "column", gap: 1, marginTop: shouldShowHeader ? 1 : 0, children: message.blocks.map((block, blockIndex) => (_jsxs(Box, { children: [block.type === "text" && block.content.trim() && (_jsx(Box, { children: _jsxs(Text, { children: [block.customCommandContent && (_jsxs(Text, { color: "cyan", bold: true, children: ["\u26A1", " "] })), block.source === MessageSource.HOOK && (_jsxs(Text, { color: "magenta", bold: true, children: ["\uD83D\uDD17", " "] })), block.content] }) })), block.type === "error" && (_jsx(Box, { children: _jsxs(Text, { color: "red", children: ["\u274C Error: ", block.content] }) })), block.type === "diff" && (_jsx(DiffViewer, { block: block, isExpanded: isExpanded })), block.type === "command_output" && (_jsx(CommandOutputDisplay, { block: block, isExpanded: isExpanded })), block.type === "tool" && (_jsx(ToolResultDisplay, { block: block, isExpanded: isExpanded })), block.type === "image" && (_jsxs(Box, { children: [_jsx(Text, { color: "magenta", bold: true, children: "\uD83D\uDCF7 Image" }), block.imageUrls && block.imageUrls.length > 0 && (_jsxs(Text, { color: "gray", dimColor: true, children: [" ", "(", block.imageUrls.length, ")"] }))] })), block.type === "memory" && _jsx(MemoryDisplay, { block: block }), block.type === "compress" && (_jsx(CompressDisplay, { block: block, isExpanded: isExpanded })), block.type === "subagent" && (_jsx(SubagentBlock, { block: block, isExpanded: isExpanded }))] }, blockIndex))) })] }, `message-${originalIndex}`));
15
16
  };
16
17
  export const MessageList = ({ messages, isLoading = false, isCommandRunning = false, isCompressing = false, latestTotalTokens = 0, isExpanded = false, }) => {
17
18
  // Use original messages for pagination calculation
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import type { SubagentBlock as SubagentBlockType } from "wave-agent-sdk/src/types.js";
2
+ import type { SubagentBlock as SubagentBlockType } from "wave-agent-sdk";
3
3
  interface SubagentBlockProps {
4
4
  block: SubagentBlockType;
5
5
  isExpanded?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"SubagentBlock.d.ts","sourceRoot":"","sources":["../../src/components/SubagentBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EACV,aAAa,IAAI,iBAAiB,EAGnC,MAAM,6BAA6B,CAAC;AA4BrC,UAAU,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAuFtD,CAAC"}
1
+ {"version":3,"file":"SubagentBlock.d.ts","sourceRoot":"","sources":["../../src/components/SubagentBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EACV,aAAa,IAAI,iBAAiB,EAGnC,MAAM,gBAAgB,CAAC;AAuCxB,UAAU,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAuFtD,CAAC"}
@@ -2,9 +2,19 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Box, Text } from "ink";
3
3
  import { ToolResultDisplay } from "./ToolResultDisplay.js";
4
4
  const MessageBlockRenderer = ({ block, isExpanded, }) => {
5
+ const truncateText = (text, maxLines) => {
6
+ const lines = text.split("\n");
7
+ if (lines.length <= maxLines) {
8
+ return text;
9
+ }
10
+ return lines.slice(0, maxLines).join("\n") + "\n...";
11
+ };
5
12
  switch (block.type) {
6
- case "text":
7
- return _jsx(Text, { children: block.content });
13
+ case "text": {
14
+ const maxLines = isExpanded ? 50 : 10;
15
+ const truncatedContent = truncateText(block.content, maxLines);
16
+ return _jsx(Text, { children: truncatedContent });
17
+ }
8
18
  case "error":
9
19
  return _jsxs(Text, { color: "red", children: ["\u274C Error: ", block.content] });
10
20
  case "tool":
@@ -48,5 +48,5 @@ export const ToolResultDisplay = ({ block, isExpanded = false, }) => {
48
48
  return null;
49
49
  };
50
50
  const shortResult = getShortResult();
51
- return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "magenta", children: "\uD83D\uDD27 " }), _jsx(Text, { color: "white", children: toolName }), !isExpanded && compactParams && (_jsxs(Text, { color: "gray", children: [" (", compactParams, ")"] })), _jsxs(Text, { color: getStatusColor(), children: [" ", getStatusText()] }), hasImages() && _jsxs(Text, { color: "blue", children: [" ", getImageIndicator()] })] }), !isExpanded && shortResult && (_jsx(Box, { paddingLeft: 2, borderLeft: true, borderColor: "gray", flexDirection: "column", children: shortResult.split("\n").map((line, index) => (_jsx(Text, { color: "white", children: line }, index))) })), isExpanded && parameters && (_jsxs(Box, { paddingLeft: 2, borderLeft: true, borderColor: "gray", flexDirection: "column", children: [_jsx(Text, { color: "cyan", bold: true, children: "Parameters:" }), _jsx(Text, { color: "gray", children: parameters })] })), isExpanded && result && (_jsx(Box, { flexDirection: "column", children: _jsxs(Box, { paddingLeft: 2, borderLeft: true, borderColor: "green", flexDirection: "column", children: [_jsx(Text, { color: "cyan", bold: true, children: "Result:" }), _jsx(Text, { color: "white", children: result })] }) })), error && (_jsx(Box, { children: _jsxs(Text, { color: "red", children: ["Error: ", typeof error === "string" ? error : String(error)] }) }))] }));
51
+ return (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "magenta", children: "\uD83D\uDD27 " }), _jsx(Text, { color: "white", children: toolName }), !isExpanded && compactParams && (_jsxs(Text, { color: "gray", children: [" (", compactParams, ")"] })), _jsxs(Text, { color: getStatusColor(), children: [" ", getStatusText()] }), hasImages() && _jsxs(Text, { color: "blue", children: [" ", getImageIndicator()] })] }), !isExpanded && shortResult && !error && (_jsx(Box, { paddingLeft: 2, borderLeft: true, borderColor: "gray", flexDirection: "column", children: shortResult.split("\n").map((line, index) => (_jsx(Text, { color: "white", children: line }, index))) })), isExpanded && parameters && (_jsxs(Box, { paddingLeft: 2, borderLeft: true, borderColor: "gray", flexDirection: "column", children: [_jsx(Text, { color: "cyan", bold: true, children: "Parameters:" }), _jsx(Text, { color: "gray", children: parameters })] })), isExpanded && result && (_jsx(Box, { flexDirection: "column", children: _jsxs(Box, { paddingLeft: 2, borderLeft: true, borderColor: "green", flexDirection: "column", children: [_jsx(Text, { color: "cyan", bold: true, children: "Result:" }), _jsx(Text, { color: "white", children: result })] }) })), error && (_jsx(Box, { children: _jsxs(Text, { color: "red", children: ["Error: ", typeof error === "string" ? error : String(error)] }) }))] }));
52
52
  };
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import type { Message, McpServerStatus, BackgroundShell, SlashCommand } from "wave-agent-sdk";
2
+ import type { Message, McpServerStatus, BackgroundShell, SlashCommand, Usage } from "wave-agent-sdk";
3
3
  export interface ChatContextType {
4
4
  messages: Message[];
5
5
  isLoading: boolean;
@@ -27,6 +27,7 @@ export interface ChatContextType {
27
27
  killBackgroundShell: (shellId: string) => boolean;
28
28
  slashCommands: SlashCommand[];
29
29
  hasSlashCommand: (commandId: string) => boolean;
30
+ usages: Usage[];
30
31
  }
31
32
  export declare const useChat: () => ChatContextType;
32
33
  export interface ChatProviderProps {
@@ -1 +1 @@
1
- {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/contexts/useChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EACV,OAAO,EACP,eAAe,EACf,eAAe,EACf,YAAY,EACb,MAAM,gBAAgB,CAAC;AAKxB,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAE3B,UAAU,EAAE,OAAO,CAAC;IAEpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,CACX,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,KAC/C,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAE1B,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzE,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,mBAAmB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9D,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,wBAAwB,EAAE,CACxB,OAAO,EAAE,MAAM,KACZ;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/D,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAElD,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CACjD;AAID,eAAO,MAAM,OAAO,uBAMnB,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAwOpD,CAAC"}
1
+ {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/contexts/useChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EACV,OAAO,EACP,eAAe,EACf,eAAe,EACf,YAAY,EACZ,KAAK,EACN,MAAM,gBAAgB,CAAC;AAMxB,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAE3B,UAAU,EAAE,OAAO,CAAC;IAEpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,CACX,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,KAC/C,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAE1B,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzE,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,mBAAmB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAE9D,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,wBAAwB,EAAE,CACxB,OAAO,EAAE,MAAM,KACZ;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/D,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAElD,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IAEhD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAID,eAAO,MAAM,OAAO,uBAMnB,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA2PpD,CAAC"}
@@ -4,6 +4,7 @@ import { useInput } from "ink";
4
4
  import { useAppConfig } from "./useAppConfig.js";
5
5
  import { Agent } from "wave-agent-sdk";
6
6
  import { logger } from "../utils/logger.js";
7
+ import { displayUsageSummary } from "../utils/usageSummary.js";
7
8
  const ChatContext = createContext(null);
8
9
  export const useChat = () => {
9
10
  const context = useContext(ChatContext);
@@ -30,6 +31,8 @@ export const ChatProvider = ({ children }) => {
30
31
  const [backgroundShells, setBackgroundShells] = useState([]);
31
32
  // Command state
32
33
  const [slashCommands, setSlashCommands] = useState([]);
34
+ // Usage tracking state
35
+ const [usages, setUsages] = useState([]);
33
36
  const agentRef = useRef(null);
34
37
  // Listen for Ctrl+O hotkey to toggle collapse/expand state
35
38
  useInput((input, key) => {
@@ -62,6 +65,9 @@ export const ChatProvider = ({ children }) => {
62
65
  onShellsChange: (shells) => {
63
66
  setBackgroundShells([...shells]);
64
67
  },
68
+ onUsagesChange: (newUsages) => {
69
+ setUsages([...newUsages]);
70
+ },
65
71
  };
66
72
  try {
67
73
  const agent = await Agent.create({
@@ -85,6 +91,8 @@ export const ChatProvider = ({ children }) => {
85
91
  // Get initial commands
86
92
  const agentSlashCommands = agent.getSlashCommands?.() || [];
87
93
  setSlashCommands(agentSlashCommands);
94
+ // Get initial usages
95
+ setUsages(agent.usages);
88
96
  }
89
97
  catch (error) {
90
98
  console.error("Failed to initialize AI manager:", error);
@@ -96,6 +104,15 @@ export const ChatProvider = ({ children }) => {
96
104
  useEffect(() => {
97
105
  return () => {
98
106
  if (agentRef.current) {
107
+ try {
108
+ // Display usage summary before cleanup
109
+ const usages = agentRef.current.usages;
110
+ const sessionFilePath = agentRef.current.sessionFilePath;
111
+ displayUsageSummary(usages, sessionFilePath);
112
+ }
113
+ catch {
114
+ // Silently ignore usage summary errors during cleanup
115
+ }
99
116
  agentRef.current.destroy();
100
117
  }
101
118
  };
@@ -203,6 +220,7 @@ export const ChatProvider = ({ children }) => {
203
220
  killBackgroundShell,
204
221
  slashCommands,
205
222
  hasSlashCommand,
223
+ usages,
206
224
  };
207
225
  return (_jsx(ChatContext.Provider, { value: contextValue, children: children }));
208
226
  };
@@ -0,0 +1,91 @@
1
+ import { Key } from "ink";
2
+ import { InputManager, InputManagerCallbacks, AttachedImage } from "../managers/InputManager.js";
3
+ import { FileItem } from "../components/FileSelector.js";
4
+ export declare const useInputManager: (callbacks?: Partial<InputManagerCallbacks>) => {
5
+ inputText: string;
6
+ cursorPosition: number;
7
+ showFileSelector: boolean;
8
+ filteredFiles: FileItem[];
9
+ fileSearchQuery: string;
10
+ atPosition: number;
11
+ showCommandSelector: boolean;
12
+ commandSearchQuery: string;
13
+ slashPosition: number;
14
+ showBashHistorySelector: boolean;
15
+ bashHistorySearchQuery: string;
16
+ exclamationPosition: number;
17
+ showMemoryTypeSelector: boolean;
18
+ memoryMessage: string;
19
+ showBashManager: boolean;
20
+ showMcpManager: boolean;
21
+ attachedImages: AttachedImage[];
22
+ insertTextAtCursor: (text: string, callback?: (newText: string, newCursorPosition: number) => void) => void;
23
+ deleteCharAtCursor: (callback?: (newText: string, newCursorPosition: number) => void) => void;
24
+ clearInput: () => void;
25
+ moveCursorLeft: () => void;
26
+ moveCursorRight: () => void;
27
+ moveCursorToStart: () => void;
28
+ moveCursorToEnd: () => void;
29
+ activateFileSelector: (position: number) => void;
30
+ handleFileSelect: (filePath: string) => {
31
+ newInput: string;
32
+ newCursorPosition: number;
33
+ };
34
+ handleCancelFileSelect: () => void;
35
+ updateFileSearchQuery: (query: string) => void;
36
+ checkForAtDeletion: (cursorPos: number) => boolean;
37
+ activateCommandSelector: (position: number) => void;
38
+ handleCommandSelect: (command: string) => {
39
+ newInput: string;
40
+ newCursorPosition: number;
41
+ };
42
+ handleCommandInsert: (command: string) => {
43
+ newInput: string;
44
+ newCursorPosition: number;
45
+ };
46
+ handleCancelCommandSelect: () => void;
47
+ updateCommandSearchQuery: (query: string) => void;
48
+ checkForSlashDeletion: (cursorPos: number) => boolean;
49
+ activateBashHistorySelector: (position: number) => void;
50
+ handleBashHistorySelect: (command: string) => {
51
+ newInput: string;
52
+ newCursorPosition: number;
53
+ };
54
+ handleCancelBashHistorySelect: () => void;
55
+ updateBashHistorySearchQuery: (query: string) => void;
56
+ handleBashHistoryExecute: (command: string) => string;
57
+ checkForExclamationDeletion: (cursorPos: number) => boolean;
58
+ activateMemoryTypeSelector: (message: string) => void;
59
+ handleMemoryTypeSelect: (type: "project" | "user") => void;
60
+ handleCancelMemoryTypeSelect: () => void;
61
+ setUserInputHistory: (history: string[]) => void;
62
+ navigateHistory: (direction: "up" | "down", currentInput: string) => {
63
+ newInput: string;
64
+ newCursorPosition: number;
65
+ };
66
+ resetHistoryNavigation: () => void;
67
+ handleSpecialCharInput: (char: string) => void;
68
+ setShowBashManager: (show: boolean) => void;
69
+ setShowMcpManager: (show: boolean) => void;
70
+ addImage: (imagePath: string, mimeType: string) => AttachedImage | undefined;
71
+ removeImage: (imageId: number) => void;
72
+ clearImages: () => void;
73
+ handlePasteImage: () => Promise<boolean>;
74
+ handlePasteInput: (input: string) => void;
75
+ handleSubmit: (attachedImages: Array<{
76
+ id: number;
77
+ path: string;
78
+ mimeType: string;
79
+ }>, isLoading?: boolean, isCommandRunning?: boolean) => Promise<void>;
80
+ expandLongTextPlaceholders: (text: string) => string;
81
+ clearLongTextMap: () => void;
82
+ handleInput: (input: string, key: Key, attachedImages: Array<{
83
+ id: number;
84
+ path: string;
85
+ mimeType: string;
86
+ }>, isLoading?: boolean, isCommandRunning?: boolean, clearImages?: () => void) => Promise<boolean>;
87
+ setInputText: (text: string) => void;
88
+ setCursorPosition: (position: number) => void;
89
+ manager: InputManager | null;
90
+ };
91
+ //# sourceMappingURL=useInputManager.d.ts.map
@@ -0,0 +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,EACL,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACd,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEzD,eAAO,MAAM,eAAe,GAC1B,YAAW,OAAO,CAAC,qBAAqB,CAAM;;;;;;;;;;;;;;;;;;+BAsGpC,MAAM,aACD,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,KAAK,IAAI;oCAQrD,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,KAAK,IAAI;;;;;;qCA2Bd,MAAM;iCAK7C,MAAM;;;;;mCAe+B,MAAM;oCAIL,MAAM;wCAKF,MAAM;mCAKjD,MAAM;;;;mCAYN,MAAM;;;;;sCAemC,MAAM;uCAIL,MAAM;4CAKD,MAAM;uCAKrD,MAAM;;;;;0CAeuC,MAAM;wCAIR,MAAM;6CAID,MAAM;0CAKT,MAAM;mCAIb,SAAS,GAAG,MAAM;;mCASlB,MAAM,EAAE;iCAK5C,IAAI,GAAG,MAAM,gBAAgB,MAAM;;;;;mCAgBC,MAAM;+BAgFf,OAAO;8BAGR,OAAO;0BAKX,MAAM,YAAY,MAAM;2BAGvB,MAAM;;;8BAWH,MAAM;mCAKxB,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,cAC1D,OAAO,qBACA,OAAO;uCAUkB,MAAM;;yBAU1C,MAAM,OACR,GAAG,kBACQ,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,cAC1D,OAAO,qBACA,OAAO,gBACX,MAAM,IAAI;yBAjIgB,MAAM;kCAIG,MAAM;;CAoJ9D,CAAC"}