snow-ai 0.4.15 → 0.4.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/cli.mjs +477445 -0
- package/bundle/sql-wasm.wasm +0 -0
- package/package.json +31 -26
- package/dist/agents/codebaseIndexAgent.d.ts +0 -102
- package/dist/agents/codebaseIndexAgent.js +0 -641
- package/dist/agents/codebaseReviewAgent.d.ts +0 -61
- package/dist/agents/codebaseReviewAgent.js +0 -301
- package/dist/agents/compactAgent.d.ts +0 -55
- package/dist/agents/compactAgent.js +0 -306
- package/dist/agents/promptOptimizeAgent.d.ts +0 -54
- package/dist/agents/promptOptimizeAgent.js +0 -268
- package/dist/agents/reviewAgent.d.ts +0 -50
- package/dist/agents/reviewAgent.js +0 -265
- package/dist/agents/summaryAgent.d.ts +0 -57
- package/dist/agents/summaryAgent.js +0 -260
- package/dist/api/anthropic.d.ts +0 -44
- package/dist/api/anthropic.js +0 -598
- package/dist/api/chat.d.ts +0 -73
- package/dist/api/chat.js +0 -386
- package/dist/api/embedding.d.ts +0 -34
- package/dist/api/embedding.js +0 -80
- package/dist/api/gemini.d.ts +0 -31
- package/dist/api/gemini.js +0 -445
- package/dist/api/models.d.ts +0 -15
- package/dist/api/models.js +0 -139
- package/dist/api/responses.d.ts +0 -38
- package/dist/api/responses.js +0 -515
- package/dist/api/systemPrompt.d.ts +0 -4
- package/dist/api/systemPrompt.js +0 -408
- package/dist/api/types.d.ts +0 -53
- package/dist/api/types.js +0 -4
- package/dist/app.d.ts +0 -8
- package/dist/app.js +0 -112
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +0 -199
- package/dist/hooks/useAgentPicker.d.ts +0 -14
- package/dist/hooks/useAgentPicker.js +0 -119
- package/dist/hooks/useClipboard.d.ts +0 -4
- package/dist/hooks/useClipboard.js +0 -175
- package/dist/hooks/useCommandHandler.d.ts +0 -35
- package/dist/hooks/useCommandHandler.js +0 -346
- package/dist/hooks/useCommandPanel.d.ts +0 -17
- package/dist/hooks/useCommandPanel.js +0 -114
- package/dist/hooks/useConversation.d.ts +0 -49
- package/dist/hooks/useConversation.js +0 -1052
- package/dist/hooks/useFilePicker.d.ts +0 -18
- package/dist/hooks/useFilePicker.js +0 -224
- package/dist/hooks/useGlobalExit.d.ts +0 -5
- package/dist/hooks/useGlobalExit.js +0 -34
- package/dist/hooks/useGlobalNavigation.d.ts +0 -6
- package/dist/hooks/useGlobalNavigation.js +0 -17
- package/dist/hooks/useHistoryNavigation.d.ts +0 -35
- package/dist/hooks/useHistoryNavigation.js +0 -133
- package/dist/hooks/useInputBuffer.d.ts +0 -6
- package/dist/hooks/useInputBuffer.js +0 -45
- package/dist/hooks/useKeyboardInput.d.ts +0 -80
- package/dist/hooks/useKeyboardInput.js +0 -608
- package/dist/hooks/useSessionManagement.d.ts +0 -10
- package/dist/hooks/useSessionManagement.js +0 -43
- package/dist/hooks/useSessionSave.d.ts +0 -8
- package/dist/hooks/useSessionSave.js +0 -63
- package/dist/hooks/useSnapshotState.d.ts +0 -26
- package/dist/hooks/useSnapshotState.js +0 -28
- package/dist/hooks/useStreamingState.d.ts +0 -33
- package/dist/hooks/useStreamingState.js +0 -105
- package/dist/hooks/useTerminalFocus.d.ts +0 -28
- package/dist/hooks/useTerminalFocus.js +0 -87
- package/dist/hooks/useTerminalSize.d.ts +0 -4
- package/dist/hooks/useTerminalSize.js +0 -20
- package/dist/hooks/useTodoPicker.d.ts +0 -16
- package/dist/hooks/useTodoPicker.js +0 -94
- package/dist/hooks/useToolConfirmation.d.ts +0 -19
- package/dist/hooks/useToolConfirmation.js +0 -61
- package/dist/hooks/useVSCodeState.d.ts +0 -8
- package/dist/hooks/useVSCodeState.js +0 -81
- package/dist/i18n/I18nContext.d.ts +0 -14
- package/dist/i18n/I18nContext.js +0 -24
- package/dist/i18n/index.d.ts +0 -3
- package/dist/i18n/index.js +0 -2
- package/dist/i18n/lang/en.d.ts +0 -2
- package/dist/i18n/lang/en.js +0 -502
- package/dist/i18n/lang/es.d.ts +0 -2
- package/dist/i18n/lang/es.js +0 -502
- package/dist/i18n/lang/ja.d.ts +0 -2
- package/dist/i18n/lang/ja.js +0 -502
- package/dist/i18n/lang/ko.d.ts +0 -2
- package/dist/i18n/lang/ko.js +0 -502
- package/dist/i18n/lang/zh-TW.d.ts +0 -2
- package/dist/i18n/lang/zh-TW.js +0 -502
- package/dist/i18n/lang/zh.d.ts +0 -2
- package/dist/i18n/lang/zh.js +0 -502
- package/dist/i18n/translations.d.ts +0 -2
- package/dist/i18n/translations.js +0 -14
- package/dist/i18n/types.d.ts +0 -478
- package/dist/i18n/types.js +0 -1
- package/dist/mcp/aceCodeSearch.d.ts +0 -247
- package/dist/mcp/aceCodeSearch.js +0 -1058
- package/dist/mcp/bash.d.ts +0 -50
- package/dist/mcp/bash.js +0 -153
- package/dist/mcp/codebaseSearch.d.ts +0 -44
- package/dist/mcp/codebaseSearch.js +0 -275
- package/dist/mcp/filesystem.d.ts +0 -392
- package/dist/mcp/filesystem.js +0 -1445
- package/dist/mcp/ideDiagnostics.d.ts +0 -36
- package/dist/mcp/ideDiagnostics.js +0 -90
- package/dist/mcp/notebook.d.ts +0 -10
- package/dist/mcp/notebook.js +0 -367
- package/dist/mcp/subagent.d.ts +0 -37
- package/dist/mcp/subagent.js +0 -113
- package/dist/mcp/todo.d.ts +0 -46
- package/dist/mcp/todo.js +0 -511
- package/dist/mcp/types/aceCodeSearch.types.d.ts +0 -92
- package/dist/mcp/types/aceCodeSearch.types.js +0 -4
- package/dist/mcp/types/bash.types.d.ts +0 -13
- package/dist/mcp/types/bash.types.js +0 -4
- package/dist/mcp/types/filesystem.types.d.ts +0 -210
- package/dist/mcp/types/filesystem.types.js +0 -27
- package/dist/mcp/types/todo.types.d.ts +0 -27
- package/dist/mcp/types/todo.types.js +0 -4
- package/dist/mcp/types/websearch.types.d.ts +0 -30
- package/dist/mcp/types/websearch.types.js +0 -4
- package/dist/mcp/utils/aceCodeSearch/filesystem.utils.d.ts +0 -34
- package/dist/mcp/utils/aceCodeSearch/filesystem.utils.js +0 -146
- package/dist/mcp/utils/aceCodeSearch/language.utils.d.ts +0 -14
- package/dist/mcp/utils/aceCodeSearch/language.utils.js +0 -418
- package/dist/mcp/utils/aceCodeSearch/search.utils.d.ts +0 -31
- package/dist/mcp/utils/aceCodeSearch/search.utils.js +0 -136
- package/dist/mcp/utils/aceCodeSearch/symbol.utils.d.ts +0 -20
- package/dist/mcp/utils/aceCodeSearch/symbol.utils.js +0 -141
- package/dist/mcp/utils/bash/security.utils.d.ts +0 -20
- package/dist/mcp/utils/bash/security.utils.js +0 -34
- package/dist/mcp/utils/filesystem/batch-operations.utils.d.ts +0 -39
- package/dist/mcp/utils/filesystem/batch-operations.utils.js +0 -182
- package/dist/mcp/utils/filesystem/code-analysis.utils.d.ts +0 -18
- package/dist/mcp/utils/filesystem/code-analysis.utils.js +0 -165
- package/dist/mcp/utils/filesystem/match-finder.utils.d.ts +0 -16
- package/dist/mcp/utils/filesystem/match-finder.utils.js +0 -85
- package/dist/mcp/utils/filesystem/office-parser.utils.d.ts +0 -43
- package/dist/mcp/utils/filesystem/office-parser.utils.js +0 -163
- package/dist/mcp/utils/filesystem/path-fixer.utils.d.ts +0 -7
- package/dist/mcp/utils/filesystem/path-fixer.utils.js +0 -60
- package/dist/mcp/utils/filesystem/similarity.utils.d.ts +0 -22
- package/dist/mcp/utils/filesystem/similarity.utils.js +0 -75
- package/dist/mcp/utils/todo/date.utils.d.ts +0 -9
- package/dist/mcp/utils/todo/date.utils.js +0 -14
- package/dist/mcp/utils/websearch/browser.utils.d.ts +0 -8
- package/dist/mcp/utils/websearch/browser.utils.js +0 -58
- package/dist/mcp/utils/websearch/text.utils.d.ts +0 -16
- package/dist/mcp/utils/websearch/text.utils.js +0 -39
- package/dist/mcp/websearch.d.ts +0 -88
- package/dist/mcp/websearch.js +0 -375
- package/dist/test/logger-test.d.ts +0 -1
- package/dist/test/logger-test.js +0 -7
- package/dist/types/index.d.ts +0 -15
- package/dist/types/index.js +0 -1
- package/dist/ui/components/AgentPickerPanel.d.ts +0 -10
- package/dist/ui/components/AgentPickerPanel.js +0 -74
- package/dist/ui/components/ChatInput.d.ts +0 -46
- package/dist/ui/components/ChatInput.js +0 -379
- package/dist/ui/components/CommandPanel.d.ts +0 -15
- package/dist/ui/components/CommandPanel.js +0 -80
- package/dist/ui/components/DiffViewer.d.ts +0 -11
- package/dist/ui/components/DiffViewer.js +0 -178
- package/dist/ui/components/FileList.d.ts +0 -15
- package/dist/ui/components/FileList.js +0 -360
- package/dist/ui/components/FileRollbackConfirmation.d.ts +0 -8
- package/dist/ui/components/FileRollbackConfirmation.js +0 -108
- package/dist/ui/components/HelpPanel.d.ts +0 -2
- package/dist/ui/components/HelpPanel.js +0 -67
- package/dist/ui/components/MCPInfoPanel.d.ts +0 -2
- package/dist/ui/components/MCPInfoPanel.js +0 -108
- package/dist/ui/components/MCPInfoScreen.d.ts +0 -7
- package/dist/ui/components/MCPInfoScreen.js +0 -115
- package/dist/ui/components/MarkdownRenderer.d.ts +0 -6
- package/dist/ui/components/MarkdownRenderer.js +0 -70
- package/dist/ui/components/Menu.d.ts +0 -17
- package/dist/ui/components/Menu.js +0 -88
- package/dist/ui/components/MessageList.d.ts +0 -56
- package/dist/ui/components/MessageList.js +0 -97
- package/dist/ui/components/PendingMessages.d.ts +0 -13
- package/dist/ui/components/PendingMessages.js +0 -29
- package/dist/ui/components/PendingToolCalls.d.ts +0 -11
- package/dist/ui/components/PendingToolCalls.js +0 -35
- package/dist/ui/components/ScrollableSelectInput.d.ts +0 -29
- package/dist/ui/components/ScrollableSelectInput.js +0 -157
- package/dist/ui/components/SessionListPanel.d.ts +0 -7
- package/dist/ui/components/SessionListPanel.js +0 -175
- package/dist/ui/components/SessionListScreen.d.ts +0 -7
- package/dist/ui/components/SessionListScreen.js +0 -217
- package/dist/ui/components/SessionListScreenWrapper.d.ts +0 -7
- package/dist/ui/components/SessionListScreenWrapper.js +0 -14
- package/dist/ui/components/ShimmerText.d.ts +0 -9
- package/dist/ui/components/ShimmerText.js +0 -30
- package/dist/ui/components/TodoPickerPanel.d.ts +0 -14
- package/dist/ui/components/TodoPickerPanel.js +0 -119
- package/dist/ui/components/TodoTree.d.ts +0 -15
- package/dist/ui/components/TodoTree.js +0 -60
- package/dist/ui/components/ToolConfirmation.d.ts +0 -21
- package/dist/ui/components/ToolConfirmation.js +0 -204
- package/dist/ui/components/ToolResultPreview.d.ts +0 -13
- package/dist/ui/components/ToolResultPreview.js +0 -337
- package/dist/ui/components/UsagePanel.d.ts +0 -2
- package/dist/ui/components/UsagePanel.js +0 -394
- package/dist/ui/contexts/ThemeContext.d.ts +0 -13
- package/dist/ui/contexts/ThemeContext.js +0 -28
- package/dist/ui/pages/ChatScreen.d.ts +0 -6
- package/dist/ui/pages/ChatScreen.js +0 -1495
- package/dist/ui/pages/CodeBaseConfigScreen.d.ts +0 -8
- package/dist/ui/pages/CodeBaseConfigScreen.js +0 -350
- package/dist/ui/pages/ConfigScreen.d.ts +0 -8
- package/dist/ui/pages/ConfigScreen.js +0 -1101
- package/dist/ui/pages/CustomHeadersScreen.d.ts +0 -6
- package/dist/ui/pages/CustomHeadersScreen.js +0 -502
- package/dist/ui/pages/HeadlessModeScreen.d.ts +0 -7
- package/dist/ui/pages/HeadlessModeScreen.js +0 -381
- package/dist/ui/pages/LanguageSettingsScreen.d.ts +0 -7
- package/dist/ui/pages/LanguageSettingsScreen.js +0 -91
- package/dist/ui/pages/MCPConfigScreen.d.ts +0 -6
- package/dist/ui/pages/MCPConfigScreen.js +0 -55
- package/dist/ui/pages/ProxyConfigScreen.d.ts +0 -8
- package/dist/ui/pages/ProxyConfigScreen.js +0 -149
- package/dist/ui/pages/SensitiveCommandConfigScreen.d.ts +0 -7
- package/dist/ui/pages/SensitiveCommandConfigScreen.js +0 -271
- package/dist/ui/pages/SubAgentConfigScreen.d.ts +0 -9
- package/dist/ui/pages/SubAgentConfigScreen.js +0 -435
- package/dist/ui/pages/SubAgentListScreen.d.ts +0 -9
- package/dist/ui/pages/SubAgentListScreen.js +0 -131
- package/dist/ui/pages/SystemPromptConfigScreen.d.ts +0 -6
- package/dist/ui/pages/SystemPromptConfigScreen.js +0 -326
- package/dist/ui/pages/ThemeSettingsScreen.d.ts +0 -7
- package/dist/ui/pages/ThemeSettingsScreen.js +0 -106
- package/dist/ui/pages/WelcomeScreen.d.ts +0 -7
- package/dist/ui/pages/WelcomeScreen.js +0 -217
- package/dist/ui/themes/index.d.ts +0 -23
- package/dist/ui/themes/index.js +0 -140
- package/dist/utils/apiConfig.d.ts +0 -126
- package/dist/utils/apiConfig.js +0 -423
- package/dist/utils/autoCompress.d.ts +0 -15
- package/dist/utils/autoCompress.js +0 -24
- package/dist/utils/chatExporter.d.ts +0 -9
- package/dist/utils/chatExporter.js +0 -118
- package/dist/utils/checkpointManager.d.ts +0 -74
- package/dist/utils/checkpointManager.js +0 -181
- package/dist/utils/codebaseConfig.d.ts +0 -16
- package/dist/utils/codebaseConfig.js +0 -67
- package/dist/utils/codebaseDatabase.d.ts +0 -102
- package/dist/utils/codebaseDatabase.js +0 -333
- package/dist/utils/codebaseSearchEvents.d.ts +0 -16
- package/dist/utils/codebaseSearchEvents.js +0 -13
- package/dist/utils/commandExecutor.d.ts +0 -13
- package/dist/utils/commandExecutor.js +0 -26
- package/dist/utils/commands/agent.d.ts +0 -2
- package/dist/utils/commands/agent.js +0 -12
- package/dist/utils/commands/clear.d.ts +0 -2
- package/dist/utils/commands/clear.js +0 -12
- package/dist/utils/commands/compact.d.ts +0 -2
- package/dist/utils/commands/compact.js +0 -12
- package/dist/utils/commands/export.d.ts +0 -2
- package/dist/utils/commands/export.js +0 -12
- package/dist/utils/commands/help.d.ts +0 -2
- package/dist/utils/commands/help.js +0 -11
- package/dist/utils/commands/home.d.ts +0 -2
- package/dist/utils/commands/home.js +0 -34
- package/dist/utils/commands/ide.d.ts +0 -2
- package/dist/utils/commands/ide.js +0 -32
- package/dist/utils/commands/init.d.ts +0 -2
- package/dist/utils/commands/init.js +0 -93
- package/dist/utils/commands/mcp.d.ts +0 -2
- package/dist/utils/commands/mcp.js +0 -12
- package/dist/utils/commands/resume.d.ts +0 -2
- package/dist/utils/commands/resume.js +0 -12
- package/dist/utils/commands/review.d.ts +0 -2
- package/dist/utils/commands/review.js +0 -81
- package/dist/utils/commands/role.d.ts +0 -2
- package/dist/utils/commands/role.js +0 -37
- package/dist/utils/commands/todoPicker.d.ts +0 -2
- package/dist/utils/commands/todoPicker.js +0 -12
- package/dist/utils/commands/usage.d.ts +0 -2
- package/dist/utils/commands/usage.js +0 -12
- package/dist/utils/commands/yolo.d.ts +0 -2
- package/dist/utils/commands/yolo.js +0 -12
- package/dist/utils/configManager.d.ts +0 -45
- package/dist/utils/configManager.js +0 -303
- package/dist/utils/contextCompressor.d.ts +0 -16
- package/dist/utils/contextCompressor.js +0 -334
- package/dist/utils/devMode.d.ts +0 -13
- package/dist/utils/devMode.js +0 -54
- package/dist/utils/escapeHandler.d.ts +0 -79
- package/dist/utils/escapeHandler.js +0 -153
- package/dist/utils/fileDialog.d.ts +0 -9
- package/dist/utils/fileDialog.js +0 -74
- package/dist/utils/fileUtils.d.ts +0 -40
- package/dist/utils/fileUtils.js +0 -185
- package/dist/utils/historyManager.d.ts +0 -45
- package/dist/utils/historyManager.js +0 -159
- package/dist/utils/incrementalSnapshot.d.ts +0 -109
- package/dist/utils/incrementalSnapshot.js +0 -383
- package/dist/utils/index.d.ts +0 -11
- package/dist/utils/index.js +0 -18
- package/dist/utils/languageConfig.d.ts +0 -21
- package/dist/utils/languageConfig.js +0 -61
- package/dist/utils/logger.d.ts +0 -37
- package/dist/utils/logger.js +0 -122
- package/dist/utils/mcpToolsManager.d.ts +0 -52
- package/dist/utils/mcpToolsManager.js +0 -878
- package/dist/utils/messageFormatter.d.ts +0 -12
- package/dist/utils/messageFormatter.js +0 -115
- package/dist/utils/notebookManager.d.ts +0 -59
- package/dist/utils/notebookManager.js +0 -213
- package/dist/utils/patch-highlight.d.ts +0 -5
- package/dist/utils/patch-highlight.js +0 -23
- package/dist/utils/processManager.d.ts +0 -27
- package/dist/utils/processManager.js +0 -75
- package/dist/utils/proxyUtils.d.ts +0 -15
- package/dist/utils/proxyUtils.js +0 -50
- package/dist/utils/resourceMonitor.d.ts +0 -65
- package/dist/utils/resourceMonitor.js +0 -175
- package/dist/utils/retryUtils.d.ts +0 -49
- package/dist/utils/retryUtils.js +0 -303
- package/dist/utils/sensitiveCommandManager.d.ts +0 -53
- package/dist/utils/sensitiveCommandManager.js +0 -308
- package/dist/utils/sessionConverter.d.ts +0 -7
- package/dist/utils/sessionConverter.js +0 -306
- package/dist/utils/sessionManager.d.ts +0 -53
- package/dist/utils/sessionManager.js +0 -371
- package/dist/utils/subAgentConfig.d.ts +0 -50
- package/dist/utils/subAgentConfig.js +0 -221
- package/dist/utils/subAgentExecutor.d.ts +0 -40
- package/dist/utils/subAgentExecutor.js +0 -434
- package/dist/utils/terminal.d.ts +0 -5
- package/dist/utils/terminal.js +0 -13
- package/dist/utils/textBuffer.d.ts +0 -99
- package/dist/utils/textBuffer.js +0 -547
- package/dist/utils/textUtils.d.ts +0 -37
- package/dist/utils/textUtils.js +0 -102
- package/dist/utils/themeConfig.d.ts +0 -21
- package/dist/utils/themeConfig.js +0 -61
- package/dist/utils/todoPreprocessor.d.ts +0 -5
- package/dist/utils/todoPreprocessor.js +0 -18
- package/dist/utils/todoScanner.d.ts +0 -8
- package/dist/utils/todoScanner.js +0 -148
- package/dist/utils/toolDisplayConfig.d.ts +0 -16
- package/dist/utils/toolDisplayConfig.js +0 -47
- package/dist/utils/toolExecutor.d.ts +0 -37
- package/dist/utils/toolExecutor.js +0 -224
- package/dist/utils/usageLogger.d.ts +0 -11
- package/dist/utils/usageLogger.js +0 -114
- package/dist/utils/vscodeConnection.d.ts +0 -76
- package/dist/utils/vscodeConnection.js +0 -430
- package/dist/utils/workspaceSnapshot.d.ts +0 -63
- package/dist/utils/workspaceSnapshot.js +0 -300
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { TextBuffer } from '../utils/textBuffer.js';
|
|
2
|
-
import { FileListRef } from '../ui/components/FileList.js';
|
|
3
|
-
export declare function useFilePicker(buffer: TextBuffer, triggerUpdate: () => void): {
|
|
4
|
-
showFilePicker: boolean;
|
|
5
|
-
setShowFilePicker: (show: boolean) => void;
|
|
6
|
-
fileSelectedIndex: number;
|
|
7
|
-
setFileSelectedIndex: (index: number | ((prev: number) => number)) => void;
|
|
8
|
-
fileQuery: string;
|
|
9
|
-
setFileQuery: (_query: string) => void;
|
|
10
|
-
atSymbolPosition: number;
|
|
11
|
-
setAtSymbolPosition: (_pos: number) => void;
|
|
12
|
-
filteredFileCount: number;
|
|
13
|
-
searchMode: "file" | "content";
|
|
14
|
-
updateFilePickerState: (_text: string, cursorPos: number) => void;
|
|
15
|
-
handleFileSelect: (filePath: string) => Promise<void>;
|
|
16
|
-
handleFilteredCountChange: (count: number) => void;
|
|
17
|
-
fileListRef: import("react").RefObject<FileListRef>;
|
|
18
|
-
};
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
import { useReducer, useCallback, useRef } from 'react';
|
|
2
|
-
function filePickerReducer(state, action) {
|
|
3
|
-
switch (action.type) {
|
|
4
|
-
case 'SHOW':
|
|
5
|
-
return {
|
|
6
|
-
...state,
|
|
7
|
-
showFilePicker: true,
|
|
8
|
-
fileSelectedIndex: 0,
|
|
9
|
-
fileQuery: action.query,
|
|
10
|
-
atSymbolPosition: action.position,
|
|
11
|
-
searchMode: action.searchMode,
|
|
12
|
-
};
|
|
13
|
-
case 'HIDE':
|
|
14
|
-
return {
|
|
15
|
-
...state,
|
|
16
|
-
showFilePicker: false,
|
|
17
|
-
fileSelectedIndex: 0,
|
|
18
|
-
fileQuery: '',
|
|
19
|
-
atSymbolPosition: -1,
|
|
20
|
-
};
|
|
21
|
-
case 'SELECT_FILE':
|
|
22
|
-
return {
|
|
23
|
-
...state,
|
|
24
|
-
showFilePicker: false,
|
|
25
|
-
fileSelectedIndex: 0,
|
|
26
|
-
fileQuery: '',
|
|
27
|
-
atSymbolPosition: -1,
|
|
28
|
-
};
|
|
29
|
-
case 'SET_SELECTED_INDEX':
|
|
30
|
-
return {
|
|
31
|
-
...state,
|
|
32
|
-
fileSelectedIndex: action.index,
|
|
33
|
-
};
|
|
34
|
-
case 'SET_FILTERED_COUNT':
|
|
35
|
-
return {
|
|
36
|
-
...state,
|
|
37
|
-
filteredFileCount: action.count,
|
|
38
|
-
};
|
|
39
|
-
default:
|
|
40
|
-
return state;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
export function useFilePicker(buffer, triggerUpdate) {
|
|
44
|
-
const [state, dispatch] = useReducer(filePickerReducer, {
|
|
45
|
-
showFilePicker: false,
|
|
46
|
-
fileSelectedIndex: 0,
|
|
47
|
-
fileQuery: '',
|
|
48
|
-
atSymbolPosition: -1,
|
|
49
|
-
filteredFileCount: 0,
|
|
50
|
-
searchMode: 'file',
|
|
51
|
-
});
|
|
52
|
-
const fileListRef = useRef(null);
|
|
53
|
-
// Update file picker state
|
|
54
|
-
const updateFilePickerState = useCallback((_text, cursorPos) => {
|
|
55
|
-
// Use display text (with placeholders) instead of full text (expanded)
|
|
56
|
-
// to ensure cursor position matches text content
|
|
57
|
-
// Note: _text parameter is ignored, we use buffer.text instead
|
|
58
|
-
const displayText = buffer.text;
|
|
59
|
-
if (!displayText.includes('@')) {
|
|
60
|
-
if (state.showFilePicker) {
|
|
61
|
-
dispatch({ type: 'HIDE' });
|
|
62
|
-
}
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
// Find the last '@' or '@@' symbol before the cursor
|
|
66
|
-
const beforeCursor = displayText.slice(0, cursorPos);
|
|
67
|
-
// Look for @@ first (content search), then @ (file search)
|
|
68
|
-
let searchMode = 'file';
|
|
69
|
-
let position = -1;
|
|
70
|
-
let query = '';
|
|
71
|
-
// Search backwards from cursor to find @@ or @
|
|
72
|
-
for (let i = beforeCursor.length - 1; i >= 0; i--) {
|
|
73
|
-
if (beforeCursor[i] === '@') {
|
|
74
|
-
// Check if this is part of @@
|
|
75
|
-
if (i > 0 && beforeCursor[i - 1] === '@') {
|
|
76
|
-
// Found @@, use content search
|
|
77
|
-
searchMode = 'content';
|
|
78
|
-
position = i - 1; // Position of first @
|
|
79
|
-
const afterDoubleAt = beforeCursor.slice(i + 1);
|
|
80
|
-
// Only activate if no space/newline after @@
|
|
81
|
-
if (!afterDoubleAt.includes(' ') && !afterDoubleAt.includes('\n')) {
|
|
82
|
-
query = afterDoubleAt;
|
|
83
|
-
break;
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
// Has space after @@, not valid
|
|
87
|
-
position = -1;
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
// Found single @, check if next char is also @
|
|
93
|
-
if (i < beforeCursor.length - 1 && beforeCursor[i + 1] === '@') {
|
|
94
|
-
// This @ is part of @@, continue searching
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
// Single @, use file search
|
|
98
|
-
searchMode = 'file';
|
|
99
|
-
position = i;
|
|
100
|
-
const afterAt = beforeCursor.slice(i + 1);
|
|
101
|
-
// Only activate if no space/newline after @
|
|
102
|
-
if (!afterAt.includes(' ') && !afterAt.includes('\n')) {
|
|
103
|
-
query = afterAt;
|
|
104
|
-
break;
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
// Has space after @, not valid
|
|
108
|
-
position = -1;
|
|
109
|
-
break;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
if (position !== -1) {
|
|
115
|
-
// For both @ and @@, position points to where we should start replacement
|
|
116
|
-
// For @@, position is the first @
|
|
117
|
-
// For @, position is the single @
|
|
118
|
-
if (!state.showFilePicker ||
|
|
119
|
-
state.fileQuery !== query ||
|
|
120
|
-
state.atSymbolPosition !== position ||
|
|
121
|
-
state.searchMode !== searchMode) {
|
|
122
|
-
dispatch({
|
|
123
|
-
type: 'SHOW',
|
|
124
|
-
query,
|
|
125
|
-
position,
|
|
126
|
-
searchMode,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
// Hide file picker if no valid @ context found
|
|
132
|
-
if (state.showFilePicker) {
|
|
133
|
-
dispatch({ type: 'HIDE' });
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}, [
|
|
137
|
-
buffer,
|
|
138
|
-
state.showFilePicker,
|
|
139
|
-
state.fileQuery,
|
|
140
|
-
state.atSymbolPosition,
|
|
141
|
-
state.searchMode,
|
|
142
|
-
]);
|
|
143
|
-
// Handle file selection
|
|
144
|
-
const handleFileSelect = useCallback(async (filePath) => {
|
|
145
|
-
if (state.atSymbolPosition !== -1) {
|
|
146
|
-
// Use display text (with placeholders) for position calculations
|
|
147
|
-
const displayText = buffer.text;
|
|
148
|
-
const cursorPos = buffer.getCursorPosition();
|
|
149
|
-
// Replace query with selected file path
|
|
150
|
-
// For content search (@@), the filePath already includes line number
|
|
151
|
-
// For file search (@), just the file path
|
|
152
|
-
const beforeAt = displayText.slice(0, state.atSymbolPosition);
|
|
153
|
-
const afterCursor = displayText.slice(cursorPos);
|
|
154
|
-
// Construct the replacement based on search mode
|
|
155
|
-
const prefix = state.searchMode === 'content' ? '@@' : '@';
|
|
156
|
-
const newText = beforeAt + prefix + filePath + ' ' + afterCursor;
|
|
157
|
-
// Set the new text and position cursor after the inserted file path + space
|
|
158
|
-
buffer.setText(newText);
|
|
159
|
-
// Calculate cursor position after the inserted text
|
|
160
|
-
// prefix length + filePath length + space
|
|
161
|
-
const insertedLength = prefix.length + filePath.length + 1;
|
|
162
|
-
const targetPos = state.atSymbolPosition + insertedLength;
|
|
163
|
-
// Reset cursor to beginning, then move to correct position
|
|
164
|
-
for (let i = 0; i < targetPos; i++) {
|
|
165
|
-
if (i < buffer.text.length) {
|
|
166
|
-
buffer.moveRight();
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
dispatch({ type: 'SELECT_FILE' });
|
|
170
|
-
triggerUpdate();
|
|
171
|
-
}
|
|
172
|
-
}, [state.atSymbolPosition, state.searchMode, buffer, triggerUpdate]);
|
|
173
|
-
// Handle filtered file count change
|
|
174
|
-
const handleFilteredCountChange = useCallback((count) => {
|
|
175
|
-
dispatch({ type: 'SET_FILTERED_COUNT', count });
|
|
176
|
-
}, []);
|
|
177
|
-
// Wrapper setters for backwards compatibility
|
|
178
|
-
const setShowFilePicker = useCallback((show) => {
|
|
179
|
-
if (show) {
|
|
180
|
-
dispatch({
|
|
181
|
-
type: 'SHOW',
|
|
182
|
-
query: '',
|
|
183
|
-
position: -1,
|
|
184
|
-
searchMode: 'file',
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
dispatch({ type: 'HIDE' });
|
|
189
|
-
}
|
|
190
|
-
}, []);
|
|
191
|
-
const setFileSelectedIndex = useCallback((index) => {
|
|
192
|
-
if (typeof index === 'function') {
|
|
193
|
-
// For functional updates, we need to get current state first
|
|
194
|
-
// This is a simplified version - in production you might want to use a ref
|
|
195
|
-
dispatch({
|
|
196
|
-
type: 'SET_SELECTED_INDEX',
|
|
197
|
-
index: index(state.fileSelectedIndex),
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
dispatch({ type: 'SET_SELECTED_INDEX', index });
|
|
202
|
-
}
|
|
203
|
-
}, [state.fileSelectedIndex]);
|
|
204
|
-
return {
|
|
205
|
-
showFilePicker: state.showFilePicker,
|
|
206
|
-
setShowFilePicker,
|
|
207
|
-
fileSelectedIndex: state.fileSelectedIndex,
|
|
208
|
-
setFileSelectedIndex,
|
|
209
|
-
fileQuery: state.fileQuery,
|
|
210
|
-
setFileQuery: (_query) => {
|
|
211
|
-
// Not used, but kept for compatibility
|
|
212
|
-
},
|
|
213
|
-
atSymbolPosition: state.atSymbolPosition,
|
|
214
|
-
setAtSymbolPosition: (_pos) => {
|
|
215
|
-
// Not used, but kept for compatibility
|
|
216
|
-
},
|
|
217
|
-
filteredFileCount: state.filteredFileCount,
|
|
218
|
-
searchMode: state.searchMode,
|
|
219
|
-
updateFilePickerState,
|
|
220
|
-
handleFileSelect,
|
|
221
|
-
handleFilteredCountChange,
|
|
222
|
-
fileListRef,
|
|
223
|
-
};
|
|
224
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { useInput } from 'ink';
|
|
2
|
-
import { useState } from 'react';
|
|
3
|
-
import { useI18n } from '../i18n/index.js';
|
|
4
|
-
export function useGlobalExit(onNotification) {
|
|
5
|
-
const { t } = useI18n();
|
|
6
|
-
const [lastCtrlCTime, setLastCtrlCTime] = useState(0);
|
|
7
|
-
const ctrlCTimeout = 1000; // 1 second timeout for double Ctrl+C
|
|
8
|
-
useInput((input, key) => {
|
|
9
|
-
if (key.ctrl && input === 'c') {
|
|
10
|
-
const now = Date.now();
|
|
11
|
-
if (now - lastCtrlCTime < ctrlCTimeout) {
|
|
12
|
-
// Second Ctrl+C within timeout - exit
|
|
13
|
-
process.exit(0);
|
|
14
|
-
}
|
|
15
|
-
else {
|
|
16
|
-
// First Ctrl+C - show notification
|
|
17
|
-
setLastCtrlCTime(now);
|
|
18
|
-
if (onNotification) {
|
|
19
|
-
onNotification({
|
|
20
|
-
show: true,
|
|
21
|
-
message: t.hooks.pressCtrlCAgain,
|
|
22
|
-
});
|
|
23
|
-
// Hide notification after timeout
|
|
24
|
-
setTimeout(() => {
|
|
25
|
-
onNotification({
|
|
26
|
-
show: false,
|
|
27
|
-
message: '',
|
|
28
|
-
});
|
|
29
|
-
}, ctrlCTimeout);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export declare const NAVIGATION_EVENT = "navigate";
|
|
2
|
-
export interface NavigationEvent {
|
|
3
|
-
destination: 'welcome' | 'chat' | 'settings' | 'mcp' | 'systemprompt' | 'customheaders';
|
|
4
|
-
}
|
|
5
|
-
export declare function navigateTo(destination: NavigationEvent['destination']): void;
|
|
6
|
-
export declare function onNavigate(handler: (event: NavigationEvent) => void): () => void;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'events';
|
|
2
|
-
// Global navigation event emitter
|
|
3
|
-
const navigationEmitter = new EventEmitter();
|
|
4
|
-
// Increase max listeners to prevent warnings, but not unlimited to catch real leaks
|
|
5
|
-
navigationEmitter.setMaxListeners(20);
|
|
6
|
-
export const NAVIGATION_EVENT = 'navigate';
|
|
7
|
-
// Emit navigation event
|
|
8
|
-
export function navigateTo(destination) {
|
|
9
|
-
navigationEmitter.emit(NAVIGATION_EVENT, { destination });
|
|
10
|
-
}
|
|
11
|
-
// Subscribe to navigation events
|
|
12
|
-
export function onNavigate(handler) {
|
|
13
|
-
navigationEmitter.on(NAVIGATION_EVENT, handler);
|
|
14
|
-
return () => {
|
|
15
|
-
navigationEmitter.off(NAVIGATION_EVENT, handler);
|
|
16
|
-
};
|
|
17
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { TextBuffer } from '../utils/textBuffer.js';
|
|
2
|
-
type ChatMessage = {
|
|
3
|
-
role: string;
|
|
4
|
-
content: string;
|
|
5
|
-
images?: Array<{
|
|
6
|
-
type: 'image';
|
|
7
|
-
data: string;
|
|
8
|
-
mimeType: string;
|
|
9
|
-
}>;
|
|
10
|
-
};
|
|
11
|
-
export declare function useHistoryNavigation(buffer: TextBuffer, triggerUpdate: () => void, chatHistory: ChatMessage[], onHistorySelect?: (selectedIndex: number, message: string, images?: Array<{
|
|
12
|
-
type: 'image';
|
|
13
|
-
data: string;
|
|
14
|
-
mimeType: string;
|
|
15
|
-
}>) => void): {
|
|
16
|
-
showHistoryMenu: boolean;
|
|
17
|
-
setShowHistoryMenu: import("react").Dispatch<import("react").SetStateAction<boolean>>;
|
|
18
|
-
historySelectedIndex: number;
|
|
19
|
-
setHistorySelectedIndex: import("react").Dispatch<import("react").SetStateAction<number>>;
|
|
20
|
-
escapeKeyCount: number;
|
|
21
|
-
setEscapeKeyCount: import("react").Dispatch<import("react").SetStateAction<number>>;
|
|
22
|
-
escapeKeyTimer: import("react").MutableRefObject<NodeJS.Timeout | null>;
|
|
23
|
-
getUserMessages: () => {
|
|
24
|
-
label: string;
|
|
25
|
-
value: string;
|
|
26
|
-
infoText: string;
|
|
27
|
-
}[];
|
|
28
|
-
handleHistorySelect: (value: string) => void;
|
|
29
|
-
currentHistoryIndex: number;
|
|
30
|
-
navigateHistoryUp: () => boolean;
|
|
31
|
-
navigateHistoryDown: () => boolean;
|
|
32
|
-
resetHistoryNavigation: () => void;
|
|
33
|
-
saveToHistory: (content: string) => Promise<void>;
|
|
34
|
-
};
|
|
35
|
-
export {};
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import { useState, useCallback, useRef, useEffect } from 'react';
|
|
2
|
-
import { historyManager } from '../utils/historyManager.js';
|
|
3
|
-
export function useHistoryNavigation(buffer, triggerUpdate, chatHistory, onHistorySelect) {
|
|
4
|
-
const [showHistoryMenu, setShowHistoryMenu] = useState(false);
|
|
5
|
-
const [historySelectedIndex, setHistorySelectedIndex] = useState(0);
|
|
6
|
-
const [escapeKeyCount, setEscapeKeyCount] = useState(0);
|
|
7
|
-
const escapeKeyTimer = useRef(null);
|
|
8
|
-
// Terminal-style history navigation state
|
|
9
|
-
const [currentHistoryIndex, setCurrentHistoryIndex] = useState(-1); // -1 means not in history mode
|
|
10
|
-
const savedInput = useRef(''); // Save current input when entering history mode
|
|
11
|
-
const [persistentHistory, setPersistentHistory] = useState([]);
|
|
12
|
-
const persistentHistoryRef = useRef([]);
|
|
13
|
-
// Keep ref in sync with state
|
|
14
|
-
useEffect(() => {
|
|
15
|
-
persistentHistoryRef.current = persistentHistory;
|
|
16
|
-
}, [persistentHistory]);
|
|
17
|
-
// Load persistent history on mount
|
|
18
|
-
useEffect(() => {
|
|
19
|
-
historyManager.loadHistory().then(entries => {
|
|
20
|
-
setPersistentHistory(entries);
|
|
21
|
-
});
|
|
22
|
-
}, []);
|
|
23
|
-
// Cleanup timer on unmount
|
|
24
|
-
useEffect(() => {
|
|
25
|
-
return () => {
|
|
26
|
-
if (escapeKeyTimer.current) {
|
|
27
|
-
clearTimeout(escapeKeyTimer.current);
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
}, []);
|
|
31
|
-
// Get user messages from chat history for navigation
|
|
32
|
-
const getUserMessages = useCallback(() => {
|
|
33
|
-
const userMessages = chatHistory
|
|
34
|
-
.map((msg, index) => ({ ...msg, originalIndex: index }))
|
|
35
|
-
.filter(msg => msg.role === 'user' && msg.content.trim());
|
|
36
|
-
// Keep original order (oldest first, newest last) and map with display numbers
|
|
37
|
-
return userMessages.map((msg, index) => {
|
|
38
|
-
// Remove all newlines, control characters and extra whitespace to ensure single line display
|
|
39
|
-
const cleanContent = msg.content
|
|
40
|
-
.replace(/[\r\n\t\v\f\u0000-\u001F\u007F-\u009F]+/g, ' ')
|
|
41
|
-
.replace(/\s+/g, ' ')
|
|
42
|
-
.trim();
|
|
43
|
-
return {
|
|
44
|
-
label: `${index + 1}. ${cleanContent.slice(0, 50)}${cleanContent.length > 50 ? '...' : ''}`,
|
|
45
|
-
value: msg.originalIndex.toString(),
|
|
46
|
-
infoText: msg.content,
|
|
47
|
-
};
|
|
48
|
-
});
|
|
49
|
-
}, [chatHistory]);
|
|
50
|
-
// Handle history selection
|
|
51
|
-
const handleHistorySelect = useCallback((value) => {
|
|
52
|
-
const selectedIndex = parseInt(value, 10);
|
|
53
|
-
const selectedMessage = chatHistory[selectedIndex];
|
|
54
|
-
if (selectedMessage && onHistorySelect) {
|
|
55
|
-
// Don't modify buffer here - let ChatInput handle everything via initialContent
|
|
56
|
-
// This prevents duplicate image placeholders
|
|
57
|
-
setShowHistoryMenu(false);
|
|
58
|
-
onHistorySelect(selectedIndex, selectedMessage.content, selectedMessage.images);
|
|
59
|
-
}
|
|
60
|
-
}, [chatHistory, onHistorySelect]);
|
|
61
|
-
// Terminal-style history navigation: navigate up (older)
|
|
62
|
-
const navigateHistoryUp = useCallback(() => {
|
|
63
|
-
const history = persistentHistoryRef.current;
|
|
64
|
-
if (history.length === 0)
|
|
65
|
-
return false;
|
|
66
|
-
// Save current input when first entering history mode
|
|
67
|
-
if (currentHistoryIndex === -1) {
|
|
68
|
-
savedInput.current = buffer.getFullText();
|
|
69
|
-
}
|
|
70
|
-
// Navigate to older message (persistentHistory is already newest first)
|
|
71
|
-
const newIndex = currentHistoryIndex === -1
|
|
72
|
-
? 0
|
|
73
|
-
: Math.min(history.length - 1, currentHistoryIndex + 1);
|
|
74
|
-
setCurrentHistoryIndex(newIndex);
|
|
75
|
-
const entry = history[newIndex];
|
|
76
|
-
if (entry) {
|
|
77
|
-
buffer.setText(entry.content);
|
|
78
|
-
triggerUpdate();
|
|
79
|
-
}
|
|
80
|
-
return true;
|
|
81
|
-
}, [currentHistoryIndex]); // 移除 buffer 避免循环依赖
|
|
82
|
-
// Terminal-style history navigation: navigate down (newer)
|
|
83
|
-
const navigateHistoryDown = useCallback(() => {
|
|
84
|
-
if (currentHistoryIndex === -1)
|
|
85
|
-
return false;
|
|
86
|
-
const newIndex = currentHistoryIndex - 1;
|
|
87
|
-
const history = persistentHistoryRef.current;
|
|
88
|
-
if (newIndex < 0) {
|
|
89
|
-
// Restore original input
|
|
90
|
-
buffer.setText(savedInput.current);
|
|
91
|
-
setCurrentHistoryIndex(-1);
|
|
92
|
-
savedInput.current = '';
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
setCurrentHistoryIndex(newIndex);
|
|
96
|
-
const entry = history[newIndex];
|
|
97
|
-
if (entry) {
|
|
98
|
-
buffer.setText(entry.content);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
triggerUpdate();
|
|
102
|
-
return true;
|
|
103
|
-
}, [currentHistoryIndex]); // 移除 buffer 避免循环依赖
|
|
104
|
-
// Reset history navigation state
|
|
105
|
-
const resetHistoryNavigation = useCallback(() => {
|
|
106
|
-
setCurrentHistoryIndex(-1);
|
|
107
|
-
savedInput.current = '';
|
|
108
|
-
}, []);
|
|
109
|
-
// Save message to persistent history
|
|
110
|
-
const saveToHistory = useCallback(async (content) => {
|
|
111
|
-
await historyManager.addEntry(content);
|
|
112
|
-
// Reload history to update the list
|
|
113
|
-
const entries = await historyManager.getEntries();
|
|
114
|
-
setPersistentHistory(entries);
|
|
115
|
-
}, []);
|
|
116
|
-
return {
|
|
117
|
-
showHistoryMenu,
|
|
118
|
-
setShowHistoryMenu,
|
|
119
|
-
historySelectedIndex,
|
|
120
|
-
setHistorySelectedIndex,
|
|
121
|
-
escapeKeyCount,
|
|
122
|
-
setEscapeKeyCount,
|
|
123
|
-
escapeKeyTimer,
|
|
124
|
-
getUserMessages,
|
|
125
|
-
handleHistorySelect,
|
|
126
|
-
// Terminal-style history navigation
|
|
127
|
-
currentHistoryIndex,
|
|
128
|
-
navigateHistoryUp,
|
|
129
|
-
navigateHistoryDown,
|
|
130
|
-
resetHistoryNavigation,
|
|
131
|
-
saveToHistory,
|
|
132
|
-
};
|
|
133
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { useState, useCallback, useEffect, useRef } from 'react';
|
|
2
|
-
import { TextBuffer } from '../utils/textBuffer.js';
|
|
3
|
-
export function useInputBuffer(viewport) {
|
|
4
|
-
const [, setForceUpdateState] = useState({});
|
|
5
|
-
const lastUpdateTime = useRef(0);
|
|
6
|
-
const bufferRef = useRef(null);
|
|
7
|
-
// Stable forceUpdate function using useRef
|
|
8
|
-
const forceUpdateRef = useRef(() => {
|
|
9
|
-
setForceUpdateState({});
|
|
10
|
-
});
|
|
11
|
-
// Stable triggerUpdate function using useRef
|
|
12
|
-
const triggerUpdateRef = useRef(() => {
|
|
13
|
-
const now = Date.now();
|
|
14
|
-
lastUpdateTime.current = now;
|
|
15
|
-
forceUpdateRef.current();
|
|
16
|
-
});
|
|
17
|
-
// Initialize buffer once
|
|
18
|
-
if (!bufferRef.current) {
|
|
19
|
-
bufferRef.current = new TextBuffer(viewport, triggerUpdateRef.current);
|
|
20
|
-
}
|
|
21
|
-
const buffer = bufferRef.current;
|
|
22
|
-
// Expose stable callback functions
|
|
23
|
-
const forceUpdate = useCallback(() => {
|
|
24
|
-
forceUpdateRef.current();
|
|
25
|
-
}, []);
|
|
26
|
-
const triggerUpdate = useCallback(() => {
|
|
27
|
-
triggerUpdateRef.current();
|
|
28
|
-
}, []);
|
|
29
|
-
// Update buffer viewport when viewport changes
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
buffer.updateViewport(viewport);
|
|
32
|
-
forceUpdateRef.current();
|
|
33
|
-
}, [viewport.width, viewport.height, buffer]);
|
|
34
|
-
// Cleanup buffer on unmount
|
|
35
|
-
useEffect(() => {
|
|
36
|
-
return () => {
|
|
37
|
-
buffer.destroy();
|
|
38
|
-
};
|
|
39
|
-
}, [buffer]);
|
|
40
|
-
return {
|
|
41
|
-
buffer,
|
|
42
|
-
triggerUpdate,
|
|
43
|
-
forceUpdate,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { TextBuffer } from '../utils/textBuffer.js';
|
|
2
|
-
import type { SubAgent } from '../utils/subAgentConfig.js';
|
|
3
|
-
type KeyboardInputOptions = {
|
|
4
|
-
buffer: TextBuffer;
|
|
5
|
-
disabled: boolean;
|
|
6
|
-
triggerUpdate: () => void;
|
|
7
|
-
forceUpdate: React.Dispatch<React.SetStateAction<{}>>;
|
|
8
|
-
showCommands: boolean;
|
|
9
|
-
setShowCommands: (show: boolean) => void;
|
|
10
|
-
commandSelectedIndex: number;
|
|
11
|
-
setCommandSelectedIndex: (index: number | ((prev: number) => number)) => void;
|
|
12
|
-
getFilteredCommands: () => Array<{
|
|
13
|
-
name: string;
|
|
14
|
-
description: string;
|
|
15
|
-
}>;
|
|
16
|
-
updateCommandPanelState: (text: string) => void;
|
|
17
|
-
onCommand?: (commandName: string, result: any) => void;
|
|
18
|
-
showFilePicker: boolean;
|
|
19
|
-
setShowFilePicker: (show: boolean) => void;
|
|
20
|
-
fileSelectedIndex: number;
|
|
21
|
-
setFileSelectedIndex: (index: number | ((prev: number) => number)) => void;
|
|
22
|
-
fileQuery: string;
|
|
23
|
-
setFileQuery: (query: string) => void;
|
|
24
|
-
atSymbolPosition: number;
|
|
25
|
-
setAtSymbolPosition: (pos: number) => void;
|
|
26
|
-
filteredFileCount: number;
|
|
27
|
-
updateFilePickerState: (text: string, cursorPos: number) => void;
|
|
28
|
-
handleFileSelect: (filePath: string) => Promise<void>;
|
|
29
|
-
fileListRef: React.RefObject<{
|
|
30
|
-
getSelectedFile: () => string | null;
|
|
31
|
-
}>;
|
|
32
|
-
showHistoryMenu: boolean;
|
|
33
|
-
setShowHistoryMenu: (show: boolean) => void;
|
|
34
|
-
historySelectedIndex: number;
|
|
35
|
-
setHistorySelectedIndex: (index: number | ((prev: number) => number)) => void;
|
|
36
|
-
escapeKeyCount: number;
|
|
37
|
-
setEscapeKeyCount: (count: number | ((prev: number) => number)) => void;
|
|
38
|
-
escapeKeyTimer: React.MutableRefObject<NodeJS.Timeout | null>;
|
|
39
|
-
getUserMessages: () => Array<{
|
|
40
|
-
label: string;
|
|
41
|
-
value: string;
|
|
42
|
-
infoText: string;
|
|
43
|
-
}>;
|
|
44
|
-
handleHistorySelect: (value: string) => void;
|
|
45
|
-
currentHistoryIndex: number;
|
|
46
|
-
navigateHistoryUp: () => boolean;
|
|
47
|
-
navigateHistoryDown: () => boolean;
|
|
48
|
-
resetHistoryNavigation: () => void;
|
|
49
|
-
saveToHistory: (content: string) => Promise<void>;
|
|
50
|
-
pasteFromClipboard: () => Promise<void>;
|
|
51
|
-
onSubmit: (message: string, images?: Array<{
|
|
52
|
-
data: string;
|
|
53
|
-
mimeType: string;
|
|
54
|
-
}>) => void;
|
|
55
|
-
ensureFocus: () => void;
|
|
56
|
-
showAgentPicker: boolean;
|
|
57
|
-
setShowAgentPicker: (show: boolean) => void;
|
|
58
|
-
agentSelectedIndex: number;
|
|
59
|
-
setAgentSelectedIndex: (index: number | ((prev: number) => number)) => void;
|
|
60
|
-
updateAgentPickerState: (text: string, cursorPos: number) => void;
|
|
61
|
-
getFilteredAgents: () => SubAgent[];
|
|
62
|
-
handleAgentSelect: (agent: SubAgent) => void;
|
|
63
|
-
showTodoPicker: boolean;
|
|
64
|
-
setShowTodoPicker: (show: boolean) => void;
|
|
65
|
-
todoSelectedIndex: number;
|
|
66
|
-
setTodoSelectedIndex: (index: number | ((prev: number) => number)) => void;
|
|
67
|
-
todos: Array<{
|
|
68
|
-
id: string;
|
|
69
|
-
file: string;
|
|
70
|
-
line: number;
|
|
71
|
-
content: string;
|
|
72
|
-
}>;
|
|
73
|
-
selectedTodos: Set<string>;
|
|
74
|
-
toggleTodoSelection: () => void;
|
|
75
|
-
confirmTodoSelection: () => void;
|
|
76
|
-
todoSearchQuery: string;
|
|
77
|
-
setTodoSearchQuery: (query: string) => void;
|
|
78
|
-
};
|
|
79
|
-
export declare function useKeyboardInput(options: KeyboardInputOptions): void;
|
|
80
|
-
export {};
|