centaurus-cli 3.0.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/types.js +0 -1
- package/dist/ai/types.js.map +1 -1
- package/dist/cli-adapter.js +5047 -5158
- package/dist/cli-adapter.js.map +1 -1
- package/dist/commands/CommandParser.js +372 -315
- package/dist/commands/CommandParser.js.map +1 -1
- package/dist/config/build-config.js +11 -42
- package/dist/config/build-config.js.map +1 -1
- package/dist/config/defaultConfig.js +94 -82
- package/dist/config/defaultConfig.js.map +1 -1
- package/dist/config/manager.js +144 -160
- package/dist/config/manager.js.map +1 -1
- package/dist/config/mcp-config-manager.js +411 -364
- package/dist/config/mcp-config-manager.js.map +1 -1
- package/dist/config/models.js +118 -185
- package/dist/config/models.js.map +1 -1
- package/dist/config/slash-commands.js +186 -184
- package/dist/config/slash-commands.js.map +1 -1
- package/dist/config/types.js +33 -26
- package/dist/config/types.js.map +1 -1
- package/dist/context/command-detector.js +63 -67
- package/dist/context/command-detector.js.map +1 -1
- package/dist/context/context-manager.js +533 -518
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/handlers/docker-handler.js +518 -576
- package/dist/context/handlers/docker-handler.js.map +1 -1
- package/dist/context/handlers/ssh-handler.js +1050 -1109
- package/dist/context/handlers/ssh-handler.js.map +1 -1
- package/dist/context/handlers/wsl-handler.js +558 -630
- package/dist/context/handlers/wsl-handler.js.map +1 -1
- package/dist/context/index.js +42 -6
- package/dist/context/index.js.map +1 -1
- package/dist/context/subshell-handler.js +0 -4
- package/dist/context/subshell-handler.js.map +1 -1
- package/dist/context/types.js +20 -31
- package/dist/context/types.js.map +1 -1
- package/dist/hooks/useConnectivity.js +13 -10
- package/dist/hooks/useConnectivity.js.map +1 -1
- package/dist/hooks/useTerminalDimensions.js +67 -79
- package/dist/hooks/useTerminalDimensions.js.map +1 -1
- package/dist/index.js +228 -251
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-command-handler.js +297 -260
- package/dist/mcp/mcp-command-handler.js.map +1 -1
- package/dist/mcp/mcp-server-manager.js +139 -155
- package/dist/mcp/mcp-server-manager.js.map +1 -1
- package/dist/mcp/mcp-tool-wrapper.js +74 -94
- package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
- package/dist/services/ai-autocomplete-agent.js +169 -181
- package/dist/services/ai-autocomplete-agent.js.map +1 -1
- package/dist/services/ai-context-injector.js +180 -93
- package/dist/services/ai-context-injector.js.map +1 -1
- package/dist/services/ai-service-client.js +513 -456
- package/dist/services/ai-service-client.js.map +1 -1
- package/dist/services/api-client.js +443 -441
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/auth-handler.js +162 -198
- package/dist/services/auth-handler.js.map +1 -1
- package/dist/services/background-task-manager.js +258 -282
- package/dist/services/background-task-manager.js.map +1 -1
- package/dist/services/checkpoint-manager.js +1526 -1512
- package/dist/services/checkpoint-manager.js.map +1 -1
- package/dist/services/clipboard-service.js +151 -200
- package/dist/services/clipboard-service.js.map +1 -1
- package/dist/services/connectivity-manager.js +63 -65
- package/dist/services/connectivity-manager.js.map +1 -1
- package/dist/services/conversation-manager.js +118 -121
- package/dist/services/conversation-manager.js.map +1 -1
- package/dist/services/environment-context-injector.js +160 -187
- package/dist/services/environment-context-injector.js.map +1 -1
- package/dist/services/fast-context-agent.js +203 -243
- package/dist/services/fast-context-agent.js.map +1 -1
- package/dist/services/input-detection-agent.js +190 -202
- package/dist/services/input-detection-agent.js.map +1 -1
- package/dist/services/input-requirement-detector.js +155 -189
- package/dist/services/input-requirement-detector.js.map +1 -1
- package/dist/services/local-chat-storage.js +342 -365
- package/dist/services/local-chat-storage.js.map +1 -1
- package/dist/services/monitored-shell-manager.js +225 -233
- package/dist/services/monitored-shell-manager.js.map +1 -1
- package/dist/services/ollama-service.js +293 -310
- package/dist/services/ollama-service.js.map +1 -1
- package/dist/services/rules-storage.js +142 -0
- package/dist/services/rules-storage.js.map +1 -0
- package/dist/services/session-quota-manager.js +219 -235
- package/dist/services/session-quota-manager.js.map +1 -1
- package/dist/services/shell-input-agent.js +299 -334
- package/dist/services/shell-input-agent.js.map +1 -1
- package/dist/services/sub-agent-manager.js +459 -501
- package/dist/services/sub-agent-manager.js.map +1 -1
- package/dist/services/warpify-detector.js +133 -183
- package/dist/services/warpify-detector.js.map +1 -1
- package/dist/services/workflow-storage.js +202 -217
- package/dist/services/workflow-storage.js.map +1 -1
- package/dist/test-ssh-handler.js +148 -193
- package/dist/test-ssh-handler.js.map +1 -1
- package/dist/tools/add-mcp.js +161 -0
- package/dist/tools/add-mcp.js.map +1 -0
- package/dist/tools/background-command.js +240 -273
- package/dist/tools/background-command.js.map +1 -1
- package/dist/tools/command.js +447 -440
- package/dist/tools/command.js.map +1 -1
- package/dist/tools/create-image.js +172 -202
- package/dist/tools/create-image.js.map +1 -1
- package/dist/tools/enter-remote-session.js +169 -215
- package/dist/tools/enter-remote-session.js.map +1 -1
- package/dist/tools/fast-context.js +60 -67
- package/dist/tools/fast-context.js.map +1 -1
- package/dist/tools/file-ops.js +601 -572
- package/dist/tools/file-ops.js.map +1 -1
- package/dist/tools/find-files.js +262 -303
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/get-diff.js +423 -406
- package/dist/tools/get-diff.js.map +1 -1
- package/dist/tools/grep-search.js +966 -948
- package/dist/tools/grep-search.js.map +1 -1
- package/dist/tools/inspect-symbol.js +308 -323
- package/dist/tools/inspect-symbol.js.map +1 -1
- package/dist/tools/plan-mode.js +459 -503
- package/dist/tools/plan-mode.js.map +1 -1
- package/dist/tools/read-binary-file.js +160 -190
- package/dist/tools/read-binary-file.js.map +1 -1
- package/dist/tools/registry.js +100 -84
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/reproduce_issue.js +170 -151
- package/dist/tools/reproduce_issue.js.map +1 -1
- package/dist/tools/sub-agent.js +223 -228
- package/dist/tools/sub-agent.js.map +1 -1
- package/dist/tools/task-complete.js +28 -27
- package/dist/tools/task-complete.js.map +1 -1
- package/dist/tools/types.js +0 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/validation.js +96 -118
- package/dist/tools/validation.js.map +1 -1
- package/dist/tools/web-search.js +194 -194
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/workflow-tool.js +77 -82
- package/dist/tools/workflow-tool.js.map +1 -1
- package/dist/types/index.js +0 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/rule.js +1 -0
- package/dist/types/rule.js.map +1 -0
- package/dist/types/workflow.js +0 -7
- package/dist/types/workflow.js.map +1 -1
- package/dist/ui/components/AgentTimer.js +24 -25
- package/dist/ui/components/AgentTimer.js.map +1 -1
- package/dist/ui/components/App.js +3266 -3263
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/AuthScreen.js +22 -34
- package/dist/ui/components/AuthScreen.js.map +1 -1
- package/dist/ui/components/AuthWelcomeScreen.js +30 -24
- package/dist/ui/components/AuthWelcomeScreen.js.map +1 -1
- package/dist/ui/components/Breadcrumbs.js +53 -82
- package/dist/ui/components/Breadcrumbs.js.map +1 -1
- package/dist/ui/components/CircularSelectInput.js +59 -67
- package/dist/ui/components/CircularSelectInput.js.map +1 -1
- package/dist/ui/components/ClipboardFileAutocomplete.js +78 -39
- package/dist/ui/components/ClipboardFileAutocomplete.js.map +1 -1
- package/dist/ui/components/CodeBlock.js +24 -42
- package/dist/ui/components/CodeBlock.js.map +1 -1
- package/dist/ui/components/ConfigViewer.js +18 -25
- package/dist/ui/components/ConfigViewer.js.map +1 -1
- package/dist/ui/components/ConfirmPrompt.js +49 -71
- package/dist/ui/components/ConfirmPrompt.js.map +1 -1
- package/dist/ui/components/ConnectionStatusMessage.js +32 -83
- package/dist/ui/components/ConnectionStatusMessage.js.map +1 -1
- package/dist/ui/components/ContextWindowIndicator.js +34 -49
- package/dist/ui/components/ContextWindowIndicator.js.map +1 -1
- package/dist/ui/components/DetailedPlanReviewScreen.js +104 -106
- package/dist/ui/components/DetailedPlanReviewScreen.js.map +1 -1
- package/dist/ui/components/DiffViewer.js +68 -121
- package/dist/ui/components/DiffViewer.js.map +1 -1
- package/dist/ui/components/ErrorBoundary.js +40 -48
- package/dist/ui/components/ErrorBoundary.js.map +1 -1
- package/dist/ui/components/FileCreationPreview.js +29 -60
- package/dist/ui/components/FileCreationPreview.js.map +1 -1
- package/dist/ui/components/FileOperation.js +34 -29
- package/dist/ui/components/FileOperation.js.map +1 -1
- package/dist/ui/components/FileTagAutocomplete.js +55 -25
- package/dist/ui/components/FileTagAutocomplete.js.map +1 -1
- package/dist/ui/components/FontRecommendation.js.map +1 -1
- package/dist/ui/components/GitDiffBreadcrumb.js +29 -0
- package/dist/ui/components/GitDiffBreadcrumb.js.map +1 -0
- package/dist/ui/components/InputBox.js +1620 -2150
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/InteractiveShell.js +234 -352
- package/dist/ui/components/InteractiveShell.js.map +1 -1
- package/dist/ui/components/KeyboardHelp.js +34 -35
- package/dist/ui/components/KeyboardHelp.js.map +1 -1
- package/dist/ui/components/LoadingIndicator.js +22 -25
- package/dist/ui/components/LoadingIndicator.js.map +1 -1
- package/dist/ui/components/MCPAddScreen.js +40 -51
- package/dist/ui/components/MCPAddScreen.js.map +1 -1
- package/dist/ui/components/MCPListScreen.js +40 -48
- package/dist/ui/components/MCPListScreen.js.map +1 -1
- package/dist/ui/components/MCPServerListScreen.js +49 -56
- package/dist/ui/components/MCPServerListScreen.js.map +1 -1
- package/dist/ui/components/MarkdownRenderer.js +69 -96
- package/dist/ui/components/MarkdownRenderer.js.map +1 -1
- package/dist/ui/components/MessageBox.js +66 -48
- package/dist/ui/components/MessageBox.js.map +1 -1
- package/dist/ui/components/MessageDisplay.js +150 -142
- package/dist/ui/components/MessageDisplay.js.map +1 -1
- package/dist/ui/components/MonitorModeAIPanel.js +46 -65
- package/dist/ui/components/MonitorModeAIPanel.js.map +1 -1
- package/dist/ui/components/MultiLineInput.js +243 -277
- package/dist/ui/components/MultiLineInput.js.map +1 -1
- package/dist/ui/components/PasswordPrompt.js +37 -18
- package/dist/ui/components/PasswordPrompt.js.map +1 -1
- package/dist/ui/components/PlanAcceptedMessage.js +27 -38
- package/dist/ui/components/PlanAcceptedMessage.js.map +1 -1
- package/dist/ui/components/PlanReviewScreen.js +46 -50
- package/dist/ui/components/PlanReviewScreen.js.map +1 -1
- package/dist/ui/components/RulesEditorScreen.js +81 -0
- package/dist/ui/components/RulesEditorScreen.js.map +1 -0
- package/dist/ui/components/SelectPrompt.js +19 -8
- package/dist/ui/components/SelectPrompt.js.map +1 -1
- package/dist/ui/components/ShimmerText.js +44 -0
- package/dist/ui/components/ShimmerText.js.map +1 -0
- package/dist/ui/components/SlashCommandAutocomplete.js +49 -22
- package/dist/ui/components/SlashCommandAutocomplete.js.map +1 -1
- package/dist/ui/components/StatusBar.js +56 -87
- package/dist/ui/components/StatusBar.js.map +1 -1
- package/dist/ui/components/StreamingMessageDisplay.js +116 -99
- package/dist/ui/components/StreamingMessageDisplay.js.map +1 -1
- package/dist/ui/components/TaskCompletedMessage.js +28 -23
- package/dist/ui/components/TaskCompletedMessage.js.map +1 -1
- package/dist/ui/components/TaskProgressIndicator.js +44 -70
- package/dist/ui/components/TaskProgressIndicator.js.map +1 -1
- package/dist/ui/components/ThinkingDisplay.js +44 -41
- package/dist/ui/components/ThinkingDisplay.js.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.js +772 -1326
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/ui/components/ToolExecutionStatus.js +53 -84
- package/dist/ui/components/ToolExecutionStatus.js.map +1 -1
- package/dist/ui/components/ToolResult.js +22 -15
- package/dist/ui/components/ToolResult.js.map +1 -1
- package/dist/ui/components/VersionUpdatePrompt.js +88 -120
- package/dist/ui/components/VersionUpdatePrompt.js.map +1 -1
- package/dist/ui/components/WelcomeBanner.js +176 -26
- package/dist/ui/components/WelcomeBanner.js.map +1 -1
- package/dist/ui/components/WorkflowCreatorScreen.js +94 -161
- package/dist/ui/components/WorkflowCreatorScreen.js.map +1 -1
- package/dist/utils/ansi-encoder.js +30 -61
- package/dist/utils/ansi-encoder.js.map +1 -1
- package/dist/utils/chat-formatter.js +327 -305
- package/dist/utils/chat-formatter.js.map +1 -1
- package/dist/utils/command-history.js +152 -174
- package/dist/utils/command-history.js.map +1 -1
- package/dist/utils/context-sanitizer.js +49 -112
- package/dist/utils/context-sanitizer.js.map +1 -1
- package/dist/utils/conversation-logger.js +292 -324
- package/dist/utils/conversation-logger.js.map +1 -1
- package/dist/utils/custom-commands-manager.js +126 -131
- package/dist/utils/custom-commands-manager.js.map +1 -1
- package/dist/utils/editor-utils.js +732 -837
- package/dist/utils/editor-utils.js.map +1 -1
- package/dist/utils/file.js +174 -213
- package/dist/utils/file.js.map +1 -1
- package/dist/utils/git-stats.js +169 -0
- package/dist/utils/git-stats.js.map +1 -0
- package/dist/utils/input-classifier.js +960 -482
- package/dist/utils/input-classifier.js.map +1 -1
- package/dist/utils/logger.js +48 -73
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/markdown-parser.js +277 -310
- package/dist/utils/markdown-parser.js.map +1 -1
- package/dist/utils/rule-reference-resolver.js +54 -0
- package/dist/utils/rule-reference-resolver.js.map +1 -0
- package/dist/utils/shell.js +144 -156
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/state.js +23 -22
- package/dist/utils/state.js.map +1 -1
- package/dist/utils/syntax-checker.js +279 -327
- package/dist/utils/syntax-checker.js.map +1 -1
- package/dist/utils/terminal-output.js +199 -302
- package/dist/utils/terminal-output.js.map +1 -1
- package/dist/utils/text-clipboard.js +47 -70
- package/dist/utils/text-clipboard.js.map +1 -1
- package/dist/utils/unicode-sanitizer.js +134 -197
- package/dist/utils/unicode-sanitizer.js.map +1 -1
- package/dist/utils/version-checker.js +46 -56
- package/dist/utils/version-checker.js.map +1 -1
- package/package.json +6 -4
- package/dist/ai/types.d.ts +0 -20
- package/dist/ai/types.d.ts.map +0 -1
- package/dist/cli-adapter.d.ts +0 -514
- package/dist/cli-adapter.d.ts.map +0 -1
- package/dist/commands/CommandParser.d.ts +0 -27
- package/dist/commands/CommandParser.d.ts.map +0 -1
- package/dist/config/build-config.d.ts +0 -42
- package/dist/config/build-config.d.ts.map +0 -1
- package/dist/config/defaultConfig.d.ts +0 -79
- package/dist/config/defaultConfig.d.ts.map +0 -1
- package/dist/config/manager.d.ts +0 -62
- package/dist/config/manager.d.ts.map +0 -1
- package/dist/config/mcp-config-manager.d.ts +0 -79
- package/dist/config/mcp-config-manager.d.ts.map +0 -1
- package/dist/config/models.d.ts +0 -83
- package/dist/config/models.d.ts.map +0 -1
- package/dist/config/slash-commands.d.ts +0 -23
- package/dist/config/slash-commands.d.ts.map +0 -1
- package/dist/config/types.d.ts +0 -35
- package/dist/config/types.d.ts.map +0 -1
- package/dist/context/command-detector.d.ts +0 -50
- package/dist/context/command-detector.d.ts.map +0 -1
- package/dist/context/context-manager.d.ts +0 -157
- package/dist/context/context-manager.d.ts.map +0 -1
- package/dist/context/handlers/docker-handler.d.ts +0 -130
- package/dist/context/handlers/docker-handler.d.ts.map +0 -1
- package/dist/context/handlers/ssh-handler.d.ts +0 -201
- package/dist/context/handlers/ssh-handler.d.ts.map +0 -1
- package/dist/context/handlers/wsl-handler.d.ts +0 -146
- package/dist/context/handlers/wsl-handler.d.ts.map +0 -1
- package/dist/context/index.d.ts +0 -8
- package/dist/context/index.d.ts.map +0 -1
- package/dist/context/subshell-handler.d.ts +0 -165
- package/dist/context/subshell-handler.d.ts.map +0 -1
- package/dist/context/types.d.ts +0 -70
- package/dist/context/types.d.ts.map +0 -1
- package/dist/hooks/useConnectivity.d.ts +0 -2
- package/dist/hooks/useConnectivity.d.ts.map +0 -1
- package/dist/hooks/useTerminalDimensions.d.ts +0 -41
- package/dist/hooks/useTerminalDimensions.d.ts.map +0 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/mcp/mcp-command-handler.d.ts +0 -47
- package/dist/mcp/mcp-command-handler.d.ts.map +0 -1
- package/dist/mcp/mcp-server-manager.d.ts +0 -30
- package/dist/mcp/mcp-server-manager.d.ts.map +0 -1
- package/dist/mcp/mcp-tool-wrapper.d.ts +0 -12
- package/dist/mcp/mcp-tool-wrapper.d.ts.map +0 -1
- package/dist/services/ai-autocomplete-agent.d.ts +0 -39
- package/dist/services/ai-autocomplete-agent.d.ts.map +0 -1
- package/dist/services/ai-context-injector.d.ts +0 -41
- package/dist/services/ai-context-injector.d.ts.map +0 -1
- package/dist/services/ai-service-client.d.ts +0 -128
- package/dist/services/ai-service-client.d.ts.map +0 -1
- package/dist/services/api-client.d.ts +0 -353
- package/dist/services/api-client.d.ts.map +0 -1
- package/dist/services/auth-handler.d.ts +0 -30
- package/dist/services/auth-handler.d.ts.map +0 -1
- package/dist/services/background-task-manager.d.ts +0 -114
- package/dist/services/background-task-manager.d.ts.map +0 -1
- package/dist/services/checkpoint-manager.d.ts +0 -204
- package/dist/services/checkpoint-manager.d.ts.map +0 -1
- package/dist/services/clipboard-service.d.ts +0 -37
- package/dist/services/clipboard-service.d.ts.map +0 -1
- package/dist/services/connectivity-manager.d.ts +0 -18
- package/dist/services/connectivity-manager.d.ts.map +0 -1
- package/dist/services/conversation-manager.d.ts +0 -73
- package/dist/services/conversation-manager.d.ts.map +0 -1
- package/dist/services/environment-context-injector.d.ts +0 -69
- package/dist/services/environment-context-injector.d.ts.map +0 -1
- package/dist/services/fast-context-agent.d.ts +0 -12
- package/dist/services/fast-context-agent.d.ts.map +0 -1
- package/dist/services/input-detection-agent.d.ts +0 -40
- package/dist/services/input-detection-agent.d.ts.map +0 -1
- package/dist/services/input-requirement-detector.d.ts +0 -28
- package/dist/services/input-requirement-detector.d.ts.map +0 -1
- package/dist/services/local-chat-storage.d.ts +0 -182
- package/dist/services/local-chat-storage.d.ts.map +0 -1
- package/dist/services/monitored-shell-manager.d.ts +0 -120
- package/dist/services/monitored-shell-manager.d.ts.map +0 -1
- package/dist/services/ollama-service.d.ts +0 -197
- package/dist/services/ollama-service.d.ts.map +0 -1
- package/dist/services/session-quota-manager.d.ts +0 -101
- package/dist/services/session-quota-manager.d.ts.map +0 -1
- package/dist/services/shell-input-agent.d.ts +0 -89
- package/dist/services/shell-input-agent.d.ts.map +0 -1
- package/dist/services/sub-agent-manager.d.ts +0 -140
- package/dist/services/sub-agent-manager.d.ts.map +0 -1
- package/dist/services/warpify-detector.d.ts +0 -43
- package/dist/services/warpify-detector.d.ts.map +0 -1
- package/dist/services/workflow-storage.d.ts +0 -72
- package/dist/services/workflow-storage.d.ts.map +0 -1
- package/dist/test-ssh-handler.d.ts +0 -8
- package/dist/test-ssh-handler.d.ts.map +0 -1
- package/dist/tools/background-command.d.ts +0 -11
- package/dist/tools/background-command.d.ts.map +0 -1
- package/dist/tools/command.d.ts +0 -3
- package/dist/tools/command.d.ts.map +0 -1
- package/dist/tools/create-image.d.ts +0 -10
- package/dist/tools/create-image.d.ts.map +0 -1
- package/dist/tools/enter-remote-session.d.ts +0 -48
- package/dist/tools/enter-remote-session.d.ts.map +0 -1
- package/dist/tools/fast-context.d.ts +0 -3
- package/dist/tools/fast-context.d.ts.map +0 -1
- package/dist/tools/file-ops.d.ts +0 -7
- package/dist/tools/file-ops.d.ts.map +0 -1
- package/dist/tools/find-files.d.ts +0 -49
- package/dist/tools/find-files.d.ts.map +0 -1
- package/dist/tools/get-diff.d.ts +0 -14
- package/dist/tools/get-diff.d.ts.map +0 -1
- package/dist/tools/grep-search.d.ts +0 -155
- package/dist/tools/grep-search.d.ts.map +0 -1
- package/dist/tools/inspect-symbol.d.ts +0 -32
- package/dist/tools/inspect-symbol.d.ts.map +0 -1
- package/dist/tools/plan-mode.d.ts +0 -140
- package/dist/tools/plan-mode.d.ts.map +0 -1
- package/dist/tools/read-binary-file.d.ts +0 -10
- package/dist/tools/read-binary-file.d.ts.map +0 -1
- package/dist/tools/registry.d.ts +0 -31
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/reproduce_issue.d.ts +0 -2
- package/dist/tools/reproduce_issue.d.ts.map +0 -1
- package/dist/tools/sub-agent.d.ts +0 -9
- package/dist/tools/sub-agent.d.ts.map +0 -1
- package/dist/tools/task-complete.d.ts +0 -3
- package/dist/tools/task-complete.d.ts.map +0 -1
- package/dist/tools/types.d.ts +0 -40
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/validation.d.ts +0 -47
- package/dist/tools/validation.d.ts.map +0 -1
- package/dist/tools/web-search.d.ts +0 -24
- package/dist/tools/web-search.d.ts.map +0 -1
- package/dist/tools/workflow-tool.d.ts +0 -11
- package/dist/tools/workflow-tool.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -123
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/workflow.d.ts +0 -110
- package/dist/types/workflow.d.ts.map +0 -1
- package/dist/ui/components/AgentTimer.d.ts +0 -7
- package/dist/ui/components/AgentTimer.d.ts.map +0 -1
- package/dist/ui/components/App.d.ts +0 -197
- package/dist/ui/components/App.d.ts.map +0 -1
- package/dist/ui/components/AuthScreen.d.ts +0 -8
- package/dist/ui/components/AuthScreen.d.ts.map +0 -1
- package/dist/ui/components/AuthWelcomeScreen.d.ts +0 -8
- package/dist/ui/components/AuthWelcomeScreen.d.ts.map +0 -1
- package/dist/ui/components/Breadcrumbs.d.ts +0 -13
- package/dist/ui/components/Breadcrumbs.d.ts.map +0 -1
- package/dist/ui/components/CircularSelectInput.d.ts +0 -24
- package/dist/ui/components/CircularSelectInput.d.ts.map +0 -1
- package/dist/ui/components/ClipboardFileAutocomplete.d.ts +0 -10
- package/dist/ui/components/ClipboardFileAutocomplete.d.ts.map +0 -1
- package/dist/ui/components/CodeBlock.d.ts +0 -9
- package/dist/ui/components/CodeBlock.d.ts.map +0 -1
- package/dist/ui/components/ConfigViewer.d.ts +0 -11
- package/dist/ui/components/ConfigViewer.d.ts.map +0 -1
- package/dist/ui/components/ConfirmPrompt.d.ts +0 -13
- package/dist/ui/components/ConfirmPrompt.d.ts.map +0 -1
- package/dist/ui/components/ConnectionStatusMessage.d.ts +0 -17
- package/dist/ui/components/ConnectionStatusMessage.d.ts.map +0 -1
- package/dist/ui/components/ContextWindowIndicator.d.ts +0 -8
- package/dist/ui/components/ContextWindowIndicator.d.ts.map +0 -1
- package/dist/ui/components/DetailedPlanReviewScreen.d.ts +0 -17
- package/dist/ui/components/DetailedPlanReviewScreen.d.ts.map +0 -1
- package/dist/ui/components/DiffViewer.d.ts +0 -9
- package/dist/ui/components/DiffViewer.d.ts.map +0 -1
- package/dist/ui/components/ErrorBoundary.d.ts +0 -17
- package/dist/ui/components/ErrorBoundary.d.ts.map +0 -1
- package/dist/ui/components/FileCreationPreview.d.ts +0 -8
- package/dist/ui/components/FileCreationPreview.d.ts.map +0 -1
- package/dist/ui/components/FileOperation.d.ts +0 -10
- package/dist/ui/components/FileOperation.d.ts.map +0 -1
- package/dist/ui/components/FileTagAutocomplete.d.ts +0 -11
- package/dist/ui/components/FileTagAutocomplete.d.ts.map +0 -1
- package/dist/ui/components/FontRecommendation.d.ts +0 -1
- package/dist/ui/components/FontRecommendation.d.ts.map +0 -1
- package/dist/ui/components/InputBox.d.ts +0 -42
- package/dist/ui/components/InputBox.d.ts.map +0 -1
- package/dist/ui/components/InteractiveShell.d.ts +0 -30
- package/dist/ui/components/InteractiveShell.d.ts.map +0 -1
- package/dist/ui/components/KeyboardHelp.d.ts +0 -7
- package/dist/ui/components/KeyboardHelp.d.ts.map +0 -1
- package/dist/ui/components/LoadingIndicator.d.ts +0 -3
- package/dist/ui/components/LoadingIndicator.d.ts.map +0 -1
- package/dist/ui/components/MCPAddScreen.d.ts +0 -13
- package/dist/ui/components/MCPAddScreen.d.ts.map +0 -1
- package/dist/ui/components/MCPListScreen.d.ts +0 -17
- package/dist/ui/components/MCPListScreen.d.ts.map +0 -1
- package/dist/ui/components/MCPServerListScreen.d.ts +0 -16
- package/dist/ui/components/MCPServerListScreen.d.ts.map +0 -1
- package/dist/ui/components/MarkdownRenderer.d.ts +0 -8
- package/dist/ui/components/MarkdownRenderer.d.ts.map +0 -1
- package/dist/ui/components/MessageBox.d.ts +0 -10
- package/dist/ui/components/MessageBox.d.ts.map +0 -1
- package/dist/ui/components/MessageDisplay.d.ts +0 -14
- package/dist/ui/components/MessageDisplay.d.ts.map +0 -1
- package/dist/ui/components/MonitorModeAIPanel.d.ts +0 -23
- package/dist/ui/components/MonitorModeAIPanel.d.ts.map +0 -1
- package/dist/ui/components/MultiLineInput.d.ts +0 -13
- package/dist/ui/components/MultiLineInput.d.ts.map +0 -1
- package/dist/ui/components/PasswordPrompt.d.ts +0 -9
- package/dist/ui/components/PasswordPrompt.d.ts.map +0 -1
- package/dist/ui/components/PlanAcceptedMessage.d.ts +0 -20
- package/dist/ui/components/PlanAcceptedMessage.d.ts.map +0 -1
- package/dist/ui/components/PlanReviewScreen.d.ts +0 -14
- package/dist/ui/components/PlanReviewScreen.d.ts.map +0 -1
- package/dist/ui/components/SelectPrompt.d.ts +0 -12
- package/dist/ui/components/SelectPrompt.d.ts.map +0 -1
- package/dist/ui/components/SlashCommandAutocomplete.d.ts +0 -13
- package/dist/ui/components/SlashCommandAutocomplete.d.ts.map +0 -1
- package/dist/ui/components/StatusBar.d.ts +0 -14
- package/dist/ui/components/StatusBar.d.ts.map +0 -1
- package/dist/ui/components/StreamingMessageDisplay.d.ts +0 -15
- package/dist/ui/components/StreamingMessageDisplay.d.ts.map +0 -1
- package/dist/ui/components/TaskCompletedMessage.d.ts +0 -14
- package/dist/ui/components/TaskCompletedMessage.d.ts.map +0 -1
- package/dist/ui/components/TaskProgressIndicator.d.ts +0 -18
- package/dist/ui/components/TaskProgressIndicator.d.ts.map +0 -1
- package/dist/ui/components/ThinkingDisplay.d.ts +0 -15
- package/dist/ui/components/ThinkingDisplay.d.ts.map +0 -1
- package/dist/ui/components/ToolExecutionMessage.d.ts +0 -8
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +0 -1
- package/dist/ui/components/ToolExecutionStatus.d.ts +0 -10
- package/dist/ui/components/ToolExecutionStatus.d.ts.map +0 -1
- package/dist/ui/components/ToolResult.d.ts +0 -10
- package/dist/ui/components/ToolResult.d.ts.map +0 -1
- package/dist/ui/components/VersionUpdatePrompt.d.ts +0 -9
- package/dist/ui/components/VersionUpdatePrompt.d.ts.map +0 -1
- package/dist/ui/components/WelcomeBanner.d.ts +0 -3
- package/dist/ui/components/WelcomeBanner.d.ts.map +0 -1
- package/dist/ui/components/WorkflowCreatorScreen.d.ts +0 -25
- package/dist/ui/components/WorkflowCreatorScreen.d.ts.map +0 -1
- package/dist/utils/ansi-encoder.d.ts +0 -7
- package/dist/utils/ansi-encoder.d.ts.map +0 -1
- package/dist/utils/chat-formatter.d.ts +0 -12
- package/dist/utils/chat-formatter.d.ts.map +0 -1
- package/dist/utils/command-history.d.ts +0 -24
- package/dist/utils/command-history.d.ts.map +0 -1
- package/dist/utils/context-sanitizer.d.ts +0 -50
- package/dist/utils/context-sanitizer.d.ts.map +0 -1
- package/dist/utils/conversation-logger.d.ts +0 -142
- package/dist/utils/conversation-logger.d.ts.map +0 -1
- package/dist/utils/custom-commands-manager.d.ts +0 -59
- package/dist/utils/custom-commands-manager.d.ts.map +0 -1
- package/dist/utils/editor-utils.d.ts +0 -101
- package/dist/utils/editor-utils.d.ts.map +0 -1
- package/dist/utils/file.d.ts +0 -61
- package/dist/utils/file.d.ts.map +0 -1
- package/dist/utils/input-classifier.d.ts +0 -25
- package/dist/utils/input-classifier.d.ts.map +0 -1
- package/dist/utils/logger.d.ts +0 -17
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/markdown-parser.d.ts +0 -60
- package/dist/utils/markdown-parser.d.ts.map +0 -1
- package/dist/utils/shell.d.ts +0 -47
- package/dist/utils/shell.d.ts.map +0 -1
- package/dist/utils/state.d.ts +0 -13
- package/dist/utils/state.d.ts.map +0 -1
- package/dist/utils/syntax-checker.d.ts +0 -24
- package/dist/utils/syntax-checker.d.ts.map +0 -1
- package/dist/utils/terminal-output.d.ts +0 -25
- package/dist/utils/terminal-output.d.ts.map +0 -1
- package/dist/utils/text-clipboard.d.ts +0 -12
- package/dist/utils/text-clipboard.d.ts.map +0 -1
- package/dist/utils/unicode-sanitizer.d.ts +0 -44
- package/dist/utils/unicode-sanitizer.d.ts.map +0 -1
- package/dist/utils/version-checker.d.ts +0 -14
- package/dist/utils/version-checker.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-formatter.js","sourceRoot":"","sources":["../../src/utils/chat-formatter.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/chat-formatter.ts"],"sourcesContent":["/**\r\n * Chat Formatter Utility\r\n * \r\n * Formats chat messages into human-readable text for clipboard sharing.\r\n * Converts internal tool call JSON and execution data into readable descriptions.\r\n */\r\n\r\nimport { Message, ToolExecution } from '../types/index.js';\r\nimport stripAnsi from 'strip-ansi';\r\n\r\n/**\r\n * Clean Unicode characters that might get corrupted in clipboard.\r\n * Removes emojis, box-drawing characters, and other problematic Unicode.\r\n */\r\nfunction cleanUnicode(text: string): string {\r\n return text\r\n // Remove box-drawing characters (used in UI borders)\r\n .replace(/[\\u2500-\\u257F]/g, '')\r\n // Remove block elements\r\n .replace(/[\\u2580-\\u259F]/g, '')\r\n // Remove emojis and pictographs (replace with text equivalents)\r\n .replace(/✓/g, '[OK]')\r\n .replace(/✗/g, '[FAIL]')\r\n .replace(/📖/g, '[READ]')\r\n .replace(/📁/g, '[DIR]')\r\n .replace(/📂/g, '[DIR]')\r\n .replace(/📄/g, '[FILE]')\r\n .replace(/✅/g, '[DONE]')\r\n .replace(/❌/g, '[ERROR]')\r\n .replace(/📭/g, '[EMPTY]')\r\n .replace(/📋/g, '[CLIPBOARD]')\r\n .replace(/🔗/g, '[LINK]')\r\n .replace(/🔌/g, '[DISCONNECT]')\r\n .replace(/⚠️/g, '[WARNING]')\r\n .replace(/🆕/g, '[NEW]')\r\n // Remove remaining emojis (broad Unicode ranges)\r\n .replace(/[\\u{1F300}-\\u{1F9FF}]/gu, '')\r\n .replace(/[\\u{2600}-\\u{26FF}]/gu, '')\r\n .replace(/[\\u{2700}-\\u{27BF}]/gu, '')\r\n // Remove common corrupted sequences (Γ, ≡, etc.)\r\n .replace(/Γ[^\\s]*/g, '')\r\n .replace(/≡[^\\s]*/g, '')\r\n // Clean up extra whitespace from removals\r\n .replace(/\\n{3,}/g, '\\n\\n')\r\n .trim();\r\n}\r\n\r\n/**\r\n * Format a tool execution into human-readable text.\r\n */\r\nfunction formatToolExecution(toolExecution: ToolExecution): string {\r\n const { toolName, status, result, error, arguments: args } = toolExecution;\r\n\r\n // Only format completed or error executions\r\n if (status !== 'completed' && status !== 'error') {\r\n return '';\r\n }\r\n\r\n const statusLabel = status === 'completed' ? '✓' : '✗';\r\n\r\n // Clean result output (remove ANSI codes)\r\n const cleanResult = result ? stripAnsi(result).trim() : '';\r\n\r\n // Helper to truncate long content\r\n const truncate = (text: string, maxLen: number = 3000): string => {\r\n if (text.length <= maxLen) return text;\r\n return text.substring(0, maxLen) + '\\n... (content truncated)';\r\n };\r\n\r\n // Handle different tool types\r\n switch (toolName) {\r\n case 'execute_command': {\r\n const command = args?.command || args?.CommandLine || args?.commandLine || 'unknown command';\r\n const cwd = args?.cwd || '';\r\n let output = `${statusLabel} The assistant ran a shell command: \\`${command}\\``;\r\n if (cwd) {\r\n output += ` (in directory: ${cwd})`;\r\n }\r\n if (cleanResult) {\r\n output += `\\n\\nOutput:\\n\\`\\`\\`\\n${truncate(cleanResult, 2000)}\\n\\`\\`\\``;\r\n }\r\n if (status === 'error' && error) {\r\n output += `\\n\\nError: ${error}`;\r\n }\r\n return output;\r\n }\r\n\r\n case 'view_file': {\r\n const filePath = args?.AbsolutePath || args?.file_path || 'unknown file';\r\n const startLine = args?.StartLine;\r\n const endLine = args?.EndLine;\r\n let output = `${statusLabel} The assistant read file: \\`${filePath}\\``;\r\n if (startLine && endLine) {\r\n output += ` (lines ${startLine}-${endLine})`;\r\n }\r\n // Include the file contents from the result\r\n if (cleanResult) {\r\n output += `\\n\\nFile contents:\\n\\`\\`\\`\\n${truncate(cleanResult)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'write_to_file': {\r\n const filePath = args?.TargetFile || args?.file_path || 'unknown file';\r\n const content = args?.CodeContent || '';\r\n const lines = content ? content.split('\\n').length : 0;\r\n let output = `${statusLabel} The assistant wrote to file: \\`${filePath}\\` (${lines} lines)`;\r\n // Include the content that was written\r\n if (content) {\r\n output += `\\n\\nNew file contents:\\n\\`\\`\\`\\n${truncate(content)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'edit_file':\r\n case 'replace_file_content': {\r\n const filePath = args?.file_path || args?.TargetFile || 'unknown file';\r\n const targetContent = args?.TargetContent || args?.target_content || '';\r\n const replacementContent = args?.ReplacementContent || args?.replacement_content || '';\r\n let output = `${statusLabel} The assistant edited file: \\`${filePath}\\``;\r\n\r\n // Include the edit details\r\n if (targetContent || replacementContent) {\r\n output += `\\n\\nEdit made:`;\r\n if (targetContent) {\r\n output += `\\n\\nOriginal:\\n\\`\\`\\`\\n${truncate(targetContent, 500)}\\n\\`\\`\\``;\r\n }\r\n if (replacementContent) {\r\n output += `\\n\\nReplaced with:\\n\\`\\`\\`\\n${truncate(replacementContent, 500)}\\n\\`\\`\\``;\r\n }\r\n }\r\n return output;\r\n }\r\n\r\n case 'multi_edit_file':\r\n case 'multi_replace_file_content': {\r\n const filePath = args?.file_path || args?.TargetFile || 'unknown file';\r\n const chunks = args?.ReplacementChunks || args?.edits || [];\r\n let output = `${statusLabel} The assistant made ${chunks.length || 'multiple'} edits to file: \\`${filePath}\\``;\r\n\r\n // Include each edit\r\n if (Array.isArray(chunks) && chunks.length > 0) {\r\n output += `\\n\\nEdits made:`;\r\n chunks.slice(0, 5).forEach((chunk: any, i: number) => {\r\n const target = chunk.TargetContent || chunk.target_content || '';\r\n const replacement = chunk.ReplacementContent || chunk.replacement_content || '';\r\n output += `\\n\\n**Edit ${i + 1}:**`;\r\n if (target) {\r\n output += `\\nOriginal:\\n\\`\\`\\`\\n${truncate(target, 300)}\\n\\`\\`\\``;\r\n }\r\n if (replacement) {\r\n output += `\\nReplaced with:\\n\\`\\`\\`\\n${truncate(replacement, 300)}\\n\\`\\`\\``;\r\n }\r\n });\r\n if (chunks.length > 5) {\r\n output += `\\n\\n... and ${chunks.length - 5} more edits`;\r\n }\r\n }\r\n return output;\r\n }\r\n\r\n case 'list_dir': {\r\n const dirPath = args?.DirectoryPath || args?.directory || 'unknown directory';\r\n let output = `${statusLabel} The assistant listed directory: \\`${dirPath}\\``;\r\n if (cleanResult) {\r\n output += `\\n\\nContents:\\n\\`\\`\\`\\n${truncate(cleanResult, 1000)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'grep_search': {\r\n const query = args?.Query || args?.query || 'unknown query';\r\n let output = `${statusLabel} The assistant searched for: \"${query}\"`;\r\n if (cleanResult) {\r\n output += `\\n\\nSearch results:\\n\\`\\`\\`\\n${truncate(cleanResult, 1500)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'find_files':\r\n case 'find_by_name': {\r\n const pattern = args?.pattern || args?.Pattern || '*';\r\n let output = `${statusLabel} The assistant searched for files matching: \"${pattern}\"`;\r\n if (cleanResult) {\r\n output += `\\n\\nFiles found:\\n\\`\\`\\`\\n${truncate(cleanResult, 1000)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'web_search':\r\n case 'search_web': {\r\n const query = args?.query || 'unknown query';\r\n let output = `${statusLabel} The assistant searched the web for: \"${query}\"`;\r\n if (cleanResult) {\r\n output += `\\n\\nSearch results:\\n${truncate(cleanResult, 2000)}`;\r\n }\r\n return output;\r\n }\r\n\r\n case 'fetch_url':\r\n case 'read_url_content': {\r\n const url = args?.url || args?.Url || 'unknown URL';\r\n let output = `${statusLabel} The assistant fetched URL: ${url}`;\r\n if (cleanResult) {\r\n output += `\\n\\nContent:\\n${truncate(cleanResult, 2000)}`;\r\n }\r\n return output;\r\n }\r\n\r\n case 'view_code_item':\r\n case 'inspect_symbol': {\r\n const filePath = args?.filePath || args?.File || 'unknown file';\r\n const nodePaths = args?.NodePaths || args?.symbols || [];\r\n let output = `${statusLabel} The assistant inspected code in: \\`${filePath}\\``;\r\n if (Array.isArray(nodePaths) && nodePaths.length > 0) {\r\n output += ` (symbols: ${nodePaths.join(', ')})`;\r\n }\r\n if (cleanResult) {\r\n output += `\\n\\nCode:\\n\\`\\`\\`\\n${truncate(cleanResult)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'view_file_outline': {\r\n const filePath = args?.AbsolutePath || 'unknown file';\r\n let output = `${statusLabel} The assistant viewed outline of: \\`${filePath}\\``;\r\n if (cleanResult) {\r\n output += `\\n\\nOutline:\\n\\`\\`\\`\\n${truncate(cleanResult, 1500)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n case 'read_binary_file': {\r\n const filePath = args?.file_path || 'unknown file';\r\n return `${statusLabel} The assistant uploaded binary file: \\`${filePath}\\``;\r\n }\r\n\r\n case 'create_image':\r\n case 'generate_image': {\r\n const outputPath = args?.output_path || args?.ImageName || 'unknown path';\r\n const prompt = args?.Prompt || args?.image_prompt || '';\r\n let output = `${statusLabel} The assistant generated an image: \\`${outputPath}\\``;\r\n if (prompt) {\r\n output += `\\n\\nPrompt used: \"${truncate(prompt, 500)}\"`;\r\n }\r\n return output;\r\n }\r\n\r\n default: {\r\n // Check for MCP tools (mcp_servername_toolname)\r\n if (toolName.startsWith('mcp_')) {\r\n const parts = toolName.slice(4).split('_');\r\n const serverName = parts[0] || 'unknown';\r\n const mcpToolName = parts.slice(1).join('_') || 'unknown';\r\n let output = `${statusLabel} The assistant used MCP tool: ${serverName}.${mcpToolName}`;\r\n\r\n // Include the full MCP result\r\n if (cleanResult) {\r\n output += `\\n\\nResult:\\n\\`\\`\\`\\n${truncate(cleanResult)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n\r\n // Generic tool formatting\r\n let output = `${statusLabel} The assistant used tool: ${toolName}`;\r\n if (cleanResult) {\r\n output += `\\n\\nResult:\\n\\`\\`\\`\\n${truncate(cleanResult, 1000)}\\n\\`\\`\\``;\r\n }\r\n return output;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Format a single message into human-readable text.\r\n */\r\nfunction formatMessage(message: Message): string {\r\n const { role, content, toolExecution, isCommandMode, taskCompletion, planAccepted, connectionStatus } = message;\r\n\r\n // Skip system messages\r\n if (role === 'system') {\r\n return '';\r\n }\r\n\r\n // Handle connection status messages\r\n if (connectionStatus) {\r\n const { type, status, connectionString, error: connError } = connectionStatus;\r\n if (status === 'connected') {\r\n return `🔗 Connected to ${type.toUpperCase()}: ${connectionString || 'session'}`;\r\n } else if (status === 'disconnected') {\r\n return `🔌 Disconnected from ${type.toUpperCase()} session`;\r\n } else if (status === 'error') {\r\n return `❌ ${type.toUpperCase()} connection error: ${connError || 'unknown error'}`;\r\n }\r\n return '';\r\n }\r\n\r\n // Handle plan accepted messages\r\n if (planAccepted) {\r\n const { planTitle, totalTasks } = planAccepted;\r\n return `📋 Plan accepted: \"${planTitle || 'Implementation Plan'}\" with ${totalTasks || 0} tasks`;\r\n }\r\n\r\n // Handle task completion messages\r\n if (taskCompletion) {\r\n const { taskNumber, totalTasks, taskDescription, completionNote } = taskCompletion;\r\n let output = `✅ Task ${taskNumber}/${totalTasks} completed: ${taskDescription}`;\r\n if (completionNote) {\r\n output += `\\nNote: ${completionNote}`;\r\n }\r\n return output;\r\n }\r\n\r\n // Handle tool execution messages\r\n if (toolExecution) {\r\n return formatToolExecution(toolExecution);\r\n }\r\n\r\n // Handle user messages\r\n if (role === 'user') {\r\n if (isCommandMode) {\r\n return `## User (Terminal Command)\\n\\`\\`\\`\\n${content}\\n\\`\\`\\``;\r\n }\r\n return `## User\\n${content}`;\r\n }\r\n\r\n // Handle assistant messages\r\n if (role === 'assistant') {\r\n if (content && content.trim()) {\r\n return `## Assistant\\n${content}`;\r\n }\r\n return '';\r\n }\r\n\r\n // Handle tool result messages (usually internal, skip)\r\n if (role === 'tool') {\r\n return '';\r\n }\r\n\r\n return '';\r\n}\r\n\r\n/**\r\n * Format entire chat history into human-readable text for clipboard sharing.\r\n */\r\nexport function formatChatForClipboard(messages: Message[]): string {\r\n const header = `# Chat Session Export\r\nGenerated: ${new Date().toLocaleString()}\r\n---\r\n\r\n`;\r\n\r\n const formattedMessages = messages\r\n .map(formatMessage)\r\n .filter(text => text.trim() !== '')\r\n .join('\\n\\n---\\n\\n');\r\n\r\n if (!formattedMessages) {\r\n return cleanUnicode(header + 'No messages in this chat session.');\r\n }\r\n\r\n return cleanUnicode(header + formattedMessages);\r\n}\r\n"],"mappings":"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","names":["output"]}
|
|
@@ -1,185 +1,163 @@
|
|
|
1
|
-
import * as fs from
|
|
2
|
-
import * as path from
|
|
3
|
-
import * as os from
|
|
4
|
-
import { logError } from
|
|
5
|
-
const HISTORY_FILE =
|
|
1
|
+
import * as fs from "fs/promises";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import * as os from "os";
|
|
4
|
+
import { logError } from "./logger.js";
|
|
5
|
+
const HISTORY_FILE = "history.json";
|
|
6
6
|
const MAX_HISTORY_SIZE = 200;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
class CommandHistoryManager {
|
|
8
|
+
static instance;
|
|
9
|
+
historyPath;
|
|
10
|
+
data = { version: 1, commands: {} };
|
|
11
|
+
loaded = false;
|
|
12
|
+
constructor() {
|
|
13
|
+
const configDir = path.join(os.homedir(), ".centaurus");
|
|
14
|
+
this.historyPath = path.join(configDir, HISTORY_FILE);
|
|
15
|
+
}
|
|
16
|
+
static getInstance() {
|
|
17
|
+
if (!CommandHistoryManager.instance) {
|
|
18
|
+
CommandHistoryManager.instance = new CommandHistoryManager();
|
|
15
19
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// Treat old commands as having global count 1, unknown CWD
|
|
35
|
-
parsed.forEach(cmd => {
|
|
36
|
-
if (typeof cmd === 'string') {
|
|
37
|
-
this.data.commands[cmd] = {
|
|
38
|
-
lastExecuted: Date.now(),
|
|
39
|
-
globalCount: 1,
|
|
40
|
-
cwdCounts: {}
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
// Assume valid new format (or empty)
|
|
47
|
-
this.data = parsed;
|
|
48
|
-
// Ensure structure integrity
|
|
49
|
-
if (!this.data.commands)
|
|
50
|
-
this.data.commands = {};
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
// Start fresh if file missing or corrupt
|
|
55
|
-
this.data = { version: 1, commands: {} };
|
|
56
|
-
}
|
|
57
|
-
this.loaded = true;
|
|
58
|
-
}
|
|
59
|
-
async save() {
|
|
60
|
-
try {
|
|
61
|
-
const configDir = path.dirname(this.historyPath);
|
|
62
|
-
try {
|
|
63
|
-
await fs.access(configDir);
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
await fs.mkdir(configDir, { recursive: true });
|
|
67
|
-
}
|
|
68
|
-
await fs.writeFile(this.historyPath, JSON.stringify(this.data, null, 2), 'utf-8');
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
logError('Failed to save command history', error);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Get all commands executed in the specific directory/environment context.
|
|
76
|
-
* Sorted by frequency (descending) then recency (descending).
|
|
77
|
-
*/
|
|
78
|
-
getDirectoryHistory(cwd, environment = 'local') {
|
|
79
|
-
const contextKey = this.buildContextKey(cwd, environment);
|
|
80
|
-
if (!contextKey)
|
|
81
|
-
return [];
|
|
82
|
-
const commands = Object.keys(this.data.commands);
|
|
83
|
-
const contextCommands = commands
|
|
84
|
-
.filter(cmd => {
|
|
85
|
-
const stats = this.data.commands[cmd];
|
|
86
|
-
return stats.cwdCounts[contextKey] && stats.cwdCounts[contextKey] > 0;
|
|
87
|
-
})
|
|
88
|
-
.map(cmd => {
|
|
89
|
-
const stats = this.data.commands[cmd];
|
|
90
|
-
return {
|
|
91
|
-
cmd,
|
|
92
|
-
score: stats.cwdCounts[contextKey],
|
|
93
|
-
lastExecuted: stats.lastExecuted
|
|
20
|
+
return CommandHistoryManager.instance;
|
|
21
|
+
}
|
|
22
|
+
async load() {
|
|
23
|
+
if (this.loaded) return;
|
|
24
|
+
try {
|
|
25
|
+
const fileContent = await fs.readFile(this.historyPath, "utf-8");
|
|
26
|
+
const parsed = JSON.parse(fileContent);
|
|
27
|
+
if (Array.isArray(parsed)) {
|
|
28
|
+
this.data = {
|
|
29
|
+
version: 1,
|
|
30
|
+
commands: {}
|
|
31
|
+
};
|
|
32
|
+
parsed.forEach((cmd) => {
|
|
33
|
+
if (typeof cmd === "string") {
|
|
34
|
+
this.data.commands[cmd] = {
|
|
35
|
+
lastExecuted: Date.now(),
|
|
36
|
+
globalCount: 1,
|
|
37
|
+
cwdCounts: {}
|
|
94
38
|
};
|
|
39
|
+
}
|
|
95
40
|
});
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
});
|
|
103
|
-
return contextCommands.map(m => m.cmd);
|
|
41
|
+
} else {
|
|
42
|
+
this.data = parsed;
|
|
43
|
+
if (!this.data.commands) this.data.commands = {};
|
|
44
|
+
}
|
|
45
|
+
} catch (error) {
|
|
46
|
+
this.data = { version: 1, commands: {} };
|
|
104
47
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
48
|
+
this.loaded = true;
|
|
49
|
+
}
|
|
50
|
+
async save() {
|
|
51
|
+
try {
|
|
52
|
+
const configDir = path.dirname(this.historyPath);
|
|
53
|
+
try {
|
|
54
|
+
await fs.access(configDir);
|
|
55
|
+
} catch {
|
|
56
|
+
await fs.mkdir(configDir, { recursive: true });
|
|
57
|
+
}
|
|
58
|
+
await fs.writeFile(
|
|
59
|
+
this.historyPath,
|
|
60
|
+
JSON.stringify(this.data, null, 2),
|
|
61
|
+
"utf-8"
|
|
62
|
+
);
|
|
63
|
+
} catch (error) {
|
|
64
|
+
logError("Failed to save command history", error);
|
|
113
65
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get all commands executed in the specific directory/environment context.
|
|
69
|
+
* Sorted by frequency (descending) then recency (descending).
|
|
70
|
+
*/
|
|
71
|
+
getDirectoryHistory(cwd, environment = "local") {
|
|
72
|
+
const contextKey = this.buildContextKey(cwd, environment);
|
|
73
|
+
if (!contextKey) return [];
|
|
74
|
+
const commands = Object.keys(this.data.commands);
|
|
75
|
+
const contextCommands = commands.filter((cmd) => {
|
|
76
|
+
const stats = this.data.commands[cmd];
|
|
77
|
+
return stats.cwdCounts[contextKey] && stats.cwdCounts[contextKey] > 0;
|
|
78
|
+
}).map((cmd) => {
|
|
79
|
+
const stats = this.data.commands[cmd];
|
|
80
|
+
return {
|
|
81
|
+
cmd,
|
|
82
|
+
score: stats.cwdCounts[contextKey],
|
|
83
|
+
lastExecuted: stats.lastExecuted
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
contextCommands.sort((a, b) => {
|
|
87
|
+
if (a.score !== b.score) {
|
|
88
|
+
return b.score - a.score;
|
|
89
|
+
}
|
|
90
|
+
return b.lastExecuted - a.lastExecuted;
|
|
91
|
+
});
|
|
92
|
+
return contextCommands.map((m) => m.cmd);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Build an environment-qualified context key for directory isolation.
|
|
96
|
+
* Format: "environment:path" (e.g., "local:/c/Users/...", "ssh:user@host:/home/...", "wsl:Ubuntu:/home/...")
|
|
97
|
+
*/
|
|
98
|
+
buildContextKey(cwd, environment = "local") {
|
|
99
|
+
if (!cwd) return "";
|
|
100
|
+
return `${environment}:${cwd}`;
|
|
101
|
+
}
|
|
102
|
+
async addCommand(command, cwd = "", environment = "local") {
|
|
103
|
+
if (!command || !command.trim()) return;
|
|
104
|
+
const trimmedCommand = command.trim();
|
|
105
|
+
const now = Date.now();
|
|
106
|
+
if (!this.data.commands[trimmedCommand]) {
|
|
107
|
+
this.data.commands[trimmedCommand] = {
|
|
108
|
+
lastExecuted: now,
|
|
109
|
+
globalCount: 0,
|
|
110
|
+
cwdCounts: {}
|
|
111
|
+
};
|
|
147
112
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
const matches = commands.filter(cmd => cmd.toLowerCase().startsWith(lowerPrefix) && cmd !== prefix);
|
|
155
|
-
// Score matches - ONLY suggest commands that have been run in this context
|
|
156
|
-
const contextKey = this.buildContextKey(cwd, environment);
|
|
157
|
-
const scoredMatches = matches
|
|
158
|
-
.filter(cmd => {
|
|
159
|
-
const stats = this.data.commands[cmd];
|
|
160
|
-
// Only include commands that have been run in this specific environment+directory
|
|
161
|
-
// This ensures true directory isolation - no suggestions from other directories
|
|
162
|
-
return contextKey && stats.cwdCounts[contextKey] && stats.cwdCounts[contextKey] > 0;
|
|
163
|
-
})
|
|
164
|
-
.map(cmd => {
|
|
165
|
-
const stats = this.data.commands[cmd];
|
|
166
|
-
// Score based on context frequency (how many times run in this directory)
|
|
167
|
-
const score = stats.cwdCounts[contextKey] || 0;
|
|
168
|
-
return { cmd, score, lastExecuted: stats.lastExecuted };
|
|
169
|
-
});
|
|
170
|
-
// Sort by Score DESC, then LastExecuted DESC
|
|
171
|
-
scoredMatches.sort((a, b) => {
|
|
172
|
-
if (a.score !== b.score) {
|
|
173
|
-
return b.score - a.score;
|
|
174
|
-
}
|
|
175
|
-
return b.lastExecuted - a.lastExecuted;
|
|
176
|
-
});
|
|
177
|
-
return scoredMatches.map(m => m.cmd);
|
|
113
|
+
const stats = this.data.commands[trimmedCommand];
|
|
114
|
+
stats.lastExecuted = now;
|
|
115
|
+
stats.globalCount += 1;
|
|
116
|
+
if (cwd) {
|
|
117
|
+
const contextKey = this.buildContextKey(cwd, environment);
|
|
118
|
+
stats.cwdCounts[contextKey] = (stats.cwdCounts[contextKey] || 0) + 1;
|
|
178
119
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
120
|
+
const keys = Object.keys(this.data.commands);
|
|
121
|
+
if (keys.length > 1e3) {
|
|
122
|
+
const sortedKeys = keys.sort(
|
|
123
|
+
(a, b) => this.data.commands[a].lastExecuted - this.data.commands[b].lastExecuted
|
|
124
|
+
);
|
|
125
|
+
for (let i = 0; i < 200; i++) {
|
|
126
|
+
delete this.data.commands[sortedKeys[i]];
|
|
127
|
+
}
|
|
183
128
|
}
|
|
129
|
+
await this.save();
|
|
130
|
+
}
|
|
131
|
+
getMatches(prefix, cwd = "", environment = "local") {
|
|
132
|
+
if (!prefix || !prefix.trim()) return [];
|
|
133
|
+
const lowerPrefix = prefix.toLowerCase();
|
|
134
|
+
const commands = Object.keys(this.data.commands);
|
|
135
|
+
const matches = commands.filter(
|
|
136
|
+
(cmd) => cmd.toLowerCase().startsWith(lowerPrefix) && cmd !== prefix
|
|
137
|
+
);
|
|
138
|
+
const contextKey = this.buildContextKey(cwd, environment);
|
|
139
|
+
const scoredMatches = matches.filter((cmd) => {
|
|
140
|
+
const stats = this.data.commands[cmd];
|
|
141
|
+
return contextKey && stats.cwdCounts[contextKey] && stats.cwdCounts[contextKey] > 0;
|
|
142
|
+
}).map((cmd) => {
|
|
143
|
+
const stats = this.data.commands[cmd];
|
|
144
|
+
const score = stats.cwdCounts[contextKey] || 0;
|
|
145
|
+
return { cmd, score, lastExecuted: stats.lastExecuted };
|
|
146
|
+
});
|
|
147
|
+
scoredMatches.sort((a, b) => {
|
|
148
|
+
if (a.score !== b.score) {
|
|
149
|
+
return b.score - a.score;
|
|
150
|
+
}
|
|
151
|
+
return b.lastExecuted - a.lastExecuted;
|
|
152
|
+
});
|
|
153
|
+
return scoredMatches.map((m) => m.cmd);
|
|
154
|
+
}
|
|
155
|
+
// Helper to get simple history list (sorted by recency) for arrow key navigation
|
|
156
|
+
getHistory() {
|
|
157
|
+
return Object.keys(this.data.commands).sort((a, b) => this.data.commands[b].lastExecuted - this.data.commands[a].lastExecuted);
|
|
158
|
+
}
|
|
184
159
|
}
|
|
160
|
+
export {
|
|
161
|
+
CommandHistoryManager
|
|
162
|
+
};
|
|
185
163
|
//# sourceMappingURL=command-history.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-history.js","sourceRoot":"","sources":["../../src/utils/command-history.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/command-history.ts"],"sourcesContent":["import * as fs from 'fs/promises';\r\nimport * as path from 'path';\r\nimport * as os from 'os';\r\nimport { logError } from './logger.js';\r\n\r\nconst HISTORY_FILE = 'history.json';\r\nconst MAX_HISTORY_SIZE = 200;\r\n\r\ninterface CommandStats {\r\n lastExecuted: number;\r\n globalCount: number;\r\n cwdCounts: Record<string, number>;\r\n}\r\n\r\ninterface HistoryData {\r\n version: number;\r\n commands: Record<string, CommandStats>;\r\n}\r\n\r\nexport class CommandHistoryManager {\r\n private static instance: CommandHistoryManager;\r\n private historyPath: string;\r\n private data: HistoryData = { version: 1, commands: {} };\r\n private loaded: boolean = false;\r\n\r\n private constructor() {\r\n const configDir = path.join(os.homedir(), '.centaurus');\r\n this.historyPath = path.join(configDir, HISTORY_FILE);\r\n }\r\n\r\n static getInstance(): CommandHistoryManager {\r\n if (!CommandHistoryManager.instance) {\r\n CommandHistoryManager.instance = new CommandHistoryManager();\r\n }\r\n return CommandHistoryManager.instance;\r\n }\r\n\r\n async load(): Promise<void> {\r\n if (this.loaded) return;\r\n\r\n try {\r\n const fileContent = await fs.readFile(this.historyPath, 'utf-8');\r\n const parsed = JSON.parse(fileContent);\r\n\r\n if (Array.isArray(parsed)) {\r\n // Migration: Convert old array format to new object format\r\n this.data = {\r\n version: 1,\r\n commands: {}\r\n };\r\n // Treat old commands as having global count 1, unknown CWD\r\n parsed.forEach(cmd => {\r\n if (typeof cmd === 'string') {\r\n this.data.commands[cmd] = {\r\n lastExecuted: Date.now(),\r\n globalCount: 1,\r\n cwdCounts: {}\r\n };\r\n }\r\n });\r\n } else {\r\n // Assume valid new format (or empty)\r\n this.data = parsed;\r\n // Ensure structure integrity\r\n if (!this.data.commands) this.data.commands = {};\r\n }\r\n } catch (error) {\r\n // Start fresh if file missing or corrupt\r\n this.data = { version: 1, commands: {} };\r\n }\r\n this.loaded = true;\r\n }\r\n\r\n async save(): Promise<void> {\r\n try {\r\n const configDir = path.dirname(this.historyPath);\r\n try {\r\n await fs.access(configDir);\r\n } catch {\r\n await fs.mkdir(configDir, { recursive: true });\r\n }\r\n\r\n await fs.writeFile(\r\n this.historyPath,\r\n JSON.stringify(this.data, null, 2),\r\n 'utf-8'\r\n );\r\n } catch (error) {\r\n logError('Failed to save command history', error as Error);\r\n }\r\n }\r\n\r\n /**\r\n * Get all commands executed in the specific directory/environment context.\r\n * Sorted by frequency (descending) then recency (descending).\r\n */\r\n getDirectoryHistory(cwd: string, environment: string = 'local'): string[] {\r\n const contextKey = this.buildContextKey(cwd, environment);\r\n if (!contextKey) return [];\r\n\r\n const commands = Object.keys(this.data.commands);\r\n\r\n const contextCommands = commands\r\n .filter(cmd => {\r\n const stats = this.data.commands[cmd];\r\n return stats.cwdCounts[contextKey] && stats.cwdCounts[contextKey] > 0;\r\n })\r\n .map(cmd => {\r\n const stats = this.data.commands[cmd];\r\n return {\r\n cmd,\r\n score: stats.cwdCounts[contextKey],\r\n lastExecuted: stats.lastExecuted\r\n };\r\n });\r\n\r\n // Sort by Score DESC, then LastExecuted DESC\r\n contextCommands.sort((a, b) => {\r\n if (a.score !== b.score) {\r\n return b.score - a.score;\r\n }\r\n return b.lastExecuted - a.lastExecuted;\r\n });\r\n\r\n return contextCommands.map(m => m.cmd);\r\n }\r\n\r\n\r\n /**\r\n * Build an environment-qualified context key for directory isolation.\r\n * Format: \"environment:path\" (e.g., \"local:/c/Users/...\", \"ssh:user@host:/home/...\", \"wsl:Ubuntu:/home/...\")\r\n */\r\n private buildContextKey(cwd: string, environment: string = 'local'): string {\r\n if (!cwd) return '';\r\n return `${environment}:${cwd}`;\r\n }\r\n\r\n async addCommand(command: string, cwd: string = '', environment: string = 'local'): Promise<void> {\r\n if (!command || !command.trim()) return;\r\n\r\n const trimmedCommand = command.trim();\r\n const now = Date.now();\r\n\r\n if (!this.data.commands[trimmedCommand]) {\r\n this.data.commands[trimmedCommand] = {\r\n lastExecuted: now,\r\n globalCount: 0,\r\n cwdCounts: {}\r\n };\r\n }\r\n\r\n const stats = this.data.commands[trimmedCommand];\r\n stats.lastExecuted = now;\r\n stats.globalCount += 1;\r\n\r\n if (cwd) {\r\n // Use environment-qualified key for directory isolation\r\n const contextKey = this.buildContextKey(cwd, environment);\r\n stats.cwdCounts[contextKey] = (stats.cwdCounts[contextKey] || 0) + 1;\r\n }\r\n\r\n // Pruning logic: If history gets too big, remove least used/oldest\r\n // For now, let's just keep it simple or implement a soft limit if needed.\r\n // Given the object structure, 200 items is nothing. We can store thousands easily.\r\n // Let's implement a cleanup if keys > 1000\r\n const keys = Object.keys(this.data.commands);\r\n if (keys.length > 1000) {\r\n // Sort by lastExecuted and remove oldest 200\r\n const sortedKeys = keys.sort((a, b) =>\r\n this.data.commands[a].lastExecuted - this.data.commands[b].lastExecuted\r\n );\r\n for (let i = 0; i < 200; i++) {\r\n delete this.data.commands[sortedKeys[i]];\r\n }\r\n }\r\n\r\n await this.save();\r\n }\r\n\r\n getMatches(prefix: string, cwd: string = '', environment: string = 'local'): string[] {\r\n if (!prefix || !prefix.trim()) return [];\r\n\r\n const lowerPrefix = prefix.toLowerCase();\r\n const commands = Object.keys(this.data.commands);\r\n\r\n // Filter matches\r\n const matches = commands.filter(cmd =>\r\n cmd.toLowerCase().startsWith(lowerPrefix) && cmd !== prefix\r\n );\r\n\r\n // Score matches - ONLY suggest commands that have been run in this context\r\n const contextKey = this.buildContextKey(cwd, environment);\r\n\r\n const scoredMatches = matches\r\n .filter(cmd => {\r\n const stats = this.data.commands[cmd];\r\n // Only include commands that have been run in this specific environment+directory\r\n // This ensures true directory isolation - no suggestions from other directories\r\n return contextKey && stats.cwdCounts[contextKey] && stats.cwdCounts[contextKey] > 0;\r\n })\r\n .map(cmd => {\r\n const stats = this.data.commands[cmd];\r\n\r\n // Score based on context frequency (how many times run in this directory)\r\n const score = stats.cwdCounts[contextKey] || 0;\r\n\r\n return { cmd, score, lastExecuted: stats.lastExecuted };\r\n });\r\n\r\n // Sort by Score DESC, then LastExecuted DESC\r\n scoredMatches.sort((a, b) => {\r\n if (a.score !== b.score) {\r\n return b.score - a.score;\r\n }\r\n return b.lastExecuted - a.lastExecuted;\r\n });\r\n\r\n return scoredMatches.map(m => m.cmd);\r\n }\r\n\r\n // Helper to get simple history list (sorted by recency) for arrow key navigation\r\n getHistory(): string[] {\r\n return Object.keys(this.data.commands)\r\n .sort((a, b) => this.data.commands[b].lastExecuted - this.data.commands[a].lastExecuted);\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -1,119 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Sanitizes tool output before it is added to the AI conversation context.
|
|
5
|
-
* This reduces token consumption without affecting what the user sees in the UI.
|
|
6
|
-
*
|
|
7
|
-
* Two main functions:
|
|
8
|
-
* 1. stripAnsiCodes() - Removes ANSI escape sequences and control codes
|
|
9
|
-
* 2. compactWriteResult() - Replaces verbose file write results with compact confirmations
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Strip ALL ANSI escape sequences and terminal control codes from text.
|
|
13
|
-
*
|
|
14
|
-
* Handles:
|
|
15
|
-
* - Color/style codes: \x1b[Nm (e.g., \x1b[34m, \x1b[0m)
|
|
16
|
-
* - Cursor movement: \x1b[NA, \x1b[NB, \x1b[NG
|
|
17
|
-
* - Cursor visibility: \x1b[?25l, \x1b[?25h
|
|
18
|
-
* - Clear line/screen: \x1b[K, \x1b[2K, \x1b[2J
|
|
19
|
-
* - Any CSI sequence: \x1b[<params><letter>
|
|
20
|
-
* - OSC sequences: \x1b]...\x07 or \x1b]...\x1b\\
|
|
21
|
-
* - Standalone \r (carriage returns not part of \r\n)
|
|
22
|
-
*/
|
|
23
|
-
export function stripAnsiCodes(text) {
|
|
24
|
-
if (!text || typeof text !== 'string')
|
|
25
|
-
return text;
|
|
26
|
-
return text
|
|
27
|
-
// Remove CSI sequences: \x1b[ followed by params and a letter
|
|
28
|
-
.replace(/\x1b\[[0-9;?]*[A-Za-z]/g, '')
|
|
29
|
-
// Remove OSC sequences: \x1b] ... \x07 or \x1b] ... \x1b\\
|
|
30
|
-
.replace(/\x1b\].*?(?:\x07|\x1b\\)/g, '')
|
|
31
|
-
// Remove other single-character escape sequences: \x1b followed by a single char
|
|
32
|
-
.replace(/\x1b[^[\]]/g, '')
|
|
33
|
-
// Strip standalone \r that are NOT part of \r\n (carriage returns used for overwriting lines)
|
|
34
|
-
.replace(/\r(?!\n)/g, '');
|
|
1
|
+
function stripAnsiCodes(text) {
|
|
2
|
+
if (!text || typeof text !== "string") return text;
|
|
3
|
+
return text.replace(/\x1b\[[0-9;?]*[A-Za-z]/g, "").replace(/\x1b\].*?(?:\x07|\x1b\\)/g, "").replace(/\x1b[^[\]]/g, "").replace(/\r(?!\n)/g, "");
|
|
35
4
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (result.startsWith('Error:') || result.includes('Error:'))
|
|
59
|
-
return result;
|
|
60
|
-
if (args) {
|
|
61
|
-
if (toolName === 'write_to_file') {
|
|
62
|
-
const fileName = args.TargetFile || 'file';
|
|
63
|
-
const content = args.CodeContent || '';
|
|
64
|
-
const lines = content.split('\n').length;
|
|
65
|
-
const bytes = Buffer.byteLength(content, 'utf8');
|
|
66
|
-
return `[OK] Wrote to ${fileName} (${lines} lines, ${bytes} bytes)`;
|
|
67
|
-
}
|
|
68
|
-
else if (toolName === 'edit_file') {
|
|
69
|
-
const fileName = args.file_path || 'file';
|
|
70
|
-
const replacement = args.replacement || '';
|
|
71
|
-
const lines = replacement.split('\n').length;
|
|
72
|
-
const bytes = Buffer.byteLength(replacement, 'utf8');
|
|
73
|
-
return `[OK] Edited ${fileName} (${lines} lines inserted, ${bytes} bytes)`;
|
|
74
|
-
}
|
|
75
|
-
else if (toolName === 'multi_edit_file') {
|
|
76
|
-
const fileName = args.file_path || 'file';
|
|
77
|
-
const editCount = Array.isArray(args.edits) ? args.edits.length : 0;
|
|
78
|
-
return `[OK] Applied ${editCount} edits to ${fileName}`;
|
|
79
|
-
}
|
|
5
|
+
const FILE_WRITE_TOOLS = /* @__PURE__ */ new Set(["write_to_file", "edit_file", "multi_edit_file"]);
|
|
6
|
+
function compactWriteResult(toolName, result, args) {
|
|
7
|
+
if (!FILE_WRITE_TOOLS.has(toolName)) return result;
|
|
8
|
+
if (!result || typeof result !== "string") return result;
|
|
9
|
+
if (result.startsWith("Error:") || result.includes("Error:")) return result;
|
|
10
|
+
if (args) {
|
|
11
|
+
if (toolName === "write_to_file") {
|
|
12
|
+
const fileName = args.TargetFile || "file";
|
|
13
|
+
const content = args.CodeContent || "";
|
|
14
|
+
const lines = content.split("\n").length;
|
|
15
|
+
const bytes = Buffer.byteLength(content, "utf8");
|
|
16
|
+
return `[OK] Wrote to ${fileName} (${lines} lines, ${bytes} bytes)`;
|
|
17
|
+
} else if (toolName === "edit_file") {
|
|
18
|
+
const fileName = args.file_path || "file";
|
|
19
|
+
const replacement = args.replacement || "";
|
|
20
|
+
const lines = replacement.split("\n").length;
|
|
21
|
+
const bytes = Buffer.byteLength(replacement, "utf8");
|
|
22
|
+
return `[OK] Edited ${fileName} (${lines} lines inserted, ${bytes} bytes)`;
|
|
23
|
+
} else if (toolName === "multi_edit_file") {
|
|
24
|
+
const fileName = args.file_path || "file";
|
|
25
|
+
const editCount = Array.isArray(args.edits) ? args.edits.length : 0;
|
|
26
|
+
return `[OK] Applied ${editCount} edits to ${fileName}`;
|
|
80
27
|
}
|
|
81
|
-
|
|
82
|
-
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
83
30
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
export function sanitizeForContext(toolName, result, args) {
|
|
97
|
-
if (typeof result === 'string') {
|
|
98
|
-
let sanitized = stripAnsiCodes(result);
|
|
99
|
-
sanitized = compactWriteResult(toolName, sanitized, args);
|
|
100
|
-
return sanitized;
|
|
31
|
+
function sanitizeForContext(toolName, result, args) {
|
|
32
|
+
if (typeof result === "string") {
|
|
33
|
+
let sanitized = stripAnsiCodes(result);
|
|
34
|
+
sanitized = compactWriteResult(toolName, sanitized, args);
|
|
35
|
+
return sanitized;
|
|
36
|
+
}
|
|
37
|
+
if (result && typeof result === "object") {
|
|
38
|
+
const copy = { ...result };
|
|
39
|
+
for (const key of ["content", "output", "result", "text", "stdout", "stderr"]) {
|
|
40
|
+
if (typeof copy[key] === "string") {
|
|
41
|
+
copy[key] = stripAnsiCodes(copy[key]);
|
|
42
|
+
}
|
|
101
43
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
// If it has a 'content' or 'output' field that's a string, sanitize it
|
|
105
|
-
const copy = { ...result };
|
|
106
|
-
for (const key of ['content', 'output', 'result', 'text', 'stdout', 'stderr']) {
|
|
107
|
-
if (typeof copy[key] === 'string') {
|
|
108
|
-
copy[key] = stripAnsiCodes(copy[key]);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
// Compact the result field if it's a file write tool
|
|
112
|
-
if (FILE_WRITE_TOOLS.has(toolName) && typeof copy.result === 'string') {
|
|
113
|
-
copy.result = compactWriteResult(toolName, copy.result, args);
|
|
114
|
-
}
|
|
115
|
-
return copy;
|
|
44
|
+
if (FILE_WRITE_TOOLS.has(toolName) && typeof copy.result === "string") {
|
|
45
|
+
copy.result = compactWriteResult(toolName, copy.result, args);
|
|
116
46
|
}
|
|
117
|
-
return
|
|
47
|
+
return copy;
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
118
50
|
}
|
|
51
|
+
export {
|
|
52
|
+
compactWriteResult,
|
|
53
|
+
sanitizeForContext,
|
|
54
|
+
stripAnsiCodes
|
|
55
|
+
};
|
|
119
56
|
//# sourceMappingURL=context-sanitizer.js.map
|