centaurus-cli 3.0.0 → 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 -5037
- 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 +1513 -973
- 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 +605 -537
- 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 -400
- 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 -3249
- 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 -511
- 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 -167
- 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":"terminal-output.js","sourceRoot":"","sources":["../../src/utils/terminal-output.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/terminal-output.ts"],"sourcesContent":["/**\r\n * Utility for processing terminal output with proper carriage return handling.\r\n * \r\n * When commands output text with \\r (carriage return), it means \"go back to the start\r\n * of the line\" - used for spinners, progress bars, and other dynamic output.\r\n * \r\n * This module provides functions to correctly process such output so that only the\r\n * final rendered state is preserved (not intermediate states that should be overwritten).\r\n */\r\n\r\n\r\n\r\n/**\r\n * Process terminal output to properly handle carriage returns and ANSI sequences.\r\n * \r\n * This function simulates how a terminal would render the output:\r\n * - \\r (carriage return) moves cursor to the start of the line\r\n * - \\x1b[H (cursor home) also moves cursor to start - PTY uses this instead of \\r\r\n * - Subsequent text overwrites from the beginning\r\n * - ANSI cursor sequences are handled appropriately\r\n * \r\n * @param raw - Raw terminal output with potential \\r and ANSI sequences\r\n * @returns Processed output with only the final rendered state\r\n */\r\nexport function processTerminalOutput(raw: string, options?: { highlightCursor?: boolean }): string {\r\n if (!raw) return '';\r\n\r\n // Virtual Terminal Emulator Approach with Color Support\r\n // We maintain a virtual screen buffer of cells with char and style\r\n\r\n interface Cell {\r\n char: string;\r\n style: string;\r\n }\r\n\r\n const SCREEN_ROWS = 500;\r\n const MAX_CURSOR_ROW = 10000;\r\n const MAX_CURSOR_COL = 1000;\r\n // const SCREEN_COLS = 200; // Dynamic columns not needed for array-based storage\r\n\r\n // Initialize screen buffer - array of arrays of Cells\r\n // We use a sparse approach: rows are created as needed\r\n const screen: Cell[][] = [];\r\n\r\n // Ensure initial rows exist\r\n for (let i = 0; i < SCREEN_ROWS; i++) {\r\n screen[i] = [];\r\n }\r\n\r\n let cursorRow = 0;\r\n let cursorCol = 0;\r\n let maxRowUsed = 0;\r\n let currentStyle = ''; // Current accumulated ANSI style sequence\r\n\r\n // Pre-processing: Strip only non-SGR sequences that we don't handle\r\n // We keep \\x1b[...m (SGR) for colors\r\n let input = raw\r\n // OSC sequences (\\x1b] ... \\x07 or \\x1b\\) - Robustly consume until terminator\r\n .replace(/\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)/g, '')\r\n // Character set designations (e.g. \\x1b(0)\r\n .replace(/\\x1b[()#][0-9A-Za-z]/g, '')\r\n // BEL and Form Feed (ignore for layout)\r\n .replace(/\\x07/g, '')\r\n .replace(/\\x0C/g, '')\r\n // DEL\r\n .replace(/\\x7F/g, '');\r\n\r\n let i = 0;\r\n while (i < input.length) {\r\n // Check for escape sequences\r\n if (input[i] === '\\x1b') {\r\n // Check for CSI sequence: ESC [\r\n if (i + 1 < input.length && input[i + 1] === '[') {\r\n let j = i + 2;\r\n\r\n // 1. Parameter Bytes (0x30-0x3F): 0-9:;<=>?\r\n // These includes digits, semicolons, and private mode markers like ? and >\r\n let params = '';\r\n while (j < input.length && input.charCodeAt(j) >= 0x30 && input.charCodeAt(j) <= 0x3F) {\r\n params += input[j];\r\n j++;\r\n }\r\n\r\n // 2. Intermediate Bytes (0x20-0x2F): !\"#$%&'()*+,-./\r\n while (j < input.length && input.charCodeAt(j) >= 0x20 && input.charCodeAt(j) <= 0x2F) {\r\n // We consume but ignore intermediates for now as we don't support them\r\n j++;\r\n }\r\n\r\n // 3. Final Byte (0x40-0x7E): @A-Z[\\]^_`a-z{|}~\r\n if (j < input.length && input.charCodeAt(j) >= 0x40 && input.charCodeAt(j) <= 0x7E) {\r\n const cmd = input[j];\r\n\r\n // Parse parameters only if they exist and aren't just private markers\r\n // We filter out ?, > etc for the numeric splitting to avoid NaN\r\n // but keep them in 'params' string for detection if needed.\r\n const cleanParams = params.replace(/[<>=?]/g, '');\r\n const numbers = cleanParams.split(';').map(s => parseInt(s) || 0);\r\n\r\n // Default to 1 if missing, for most commands (1-based)\r\n const n = numbers[0] || 1;\r\n const m = numbers[1] || 1;\r\n\r\n // Handle supported commands\r\n switch (cmd) {\r\n case 'm': // SGR - Select Graphic Rendition (Colors)\r\n if (params === '' || params === '0' || (cleanParams === '0' && numbers.length === 1)) {\r\n currentStyle = ''; // Reset\r\n } else {\r\n // Add to current style. \r\n // Ideally we should be smarter about merging, but appending works.\r\n if (numbers.includes(0)) {\r\n // If sequence contains reset (e.g. 0;1;31), we treat it as reset + others.\r\n // For simplicity, we just take the whole sequence as the new style \r\n // since it usually starts with 0 if 0 is present.\r\n currentStyle = `\\x1b[${cleanParams}m`;\r\n } else {\r\n currentStyle += `\\x1b[${cleanParams}m`;\r\n }\r\n }\r\n break;\r\n\r\n case 'H': // CUP - Cursor Position\r\n case 'f': // HVP - Horizontal and Vertical Position\r\n // Defaults are 1,1\r\n cursorRow = Math.min(MAX_CURSOR_ROW, Math.max(0, (numbers[0] || 1) - 1));\r\n cursorCol = Math.min(MAX_CURSOR_COL, Math.max(0, (numbers[1] || 1) - 1));\r\n break;\r\n\r\n case 'A': // CUU - Cursor Up\r\n cursorRow = Math.max(0, cursorRow - n);\r\n break;\r\n\r\n case 'B': // CUD - Cursor Down\r\n case 'e': // VPR - Vertical Position Relative\r\n cursorRow = Math.min(MAX_CURSOR_ROW, cursorRow + n);\r\n break;\r\n\r\n case 'C': // CUF - Cursor Forward\r\n case 'a': // HPR - Horizontal Position Relative\r\n cursorCol = Math.min(MAX_CURSOR_COL, cursorCol + n);\r\n break;\r\n\r\n case 'D': // CUB - Cursor Back\r\n cursorCol = Math.max(0, cursorCol - n);\r\n break;\r\n\r\n case 'E': // CNL - Cursor Next Line\r\n cursorRow = Math.min(MAX_CURSOR_ROW, cursorRow + n);\r\n cursorCol = 0;\r\n break;\r\n\r\n case 'F': // CPL - Cursor Preceding Line\r\n cursorRow = Math.max(0, cursorRow - n);\r\n cursorCol = 0;\r\n break;\r\n\r\n case 'G': // CHA - Cursor Horizontal Absolute\r\n cursorCol = Math.min(MAX_CURSOR_COL, Math.max(0, n - 1));\r\n break;\r\n\r\n case 'd': // VPA - Vertical Position Absolute\r\n cursorRow = Math.min(MAX_CURSOR_ROW, Math.max(0, n - 1));\r\n break;\r\n\r\n case 'K': // EL - Erase in Line\r\n {\r\n const mode = numbers[0] || 0;\r\n if (!screen[cursorRow]) screen[cursorRow] = [];\r\n\r\n if (mode === 0) { // Cursor to end\r\n screen[cursorRow].splice(cursorCol);\r\n } else if (mode === 1) { // Start to cursor\r\n for (let k = 0; k <= cursorCol; k++) {\r\n if (k < screen[cursorRow].length) {\r\n screen[cursorRow][k] = { char: ' ', style: '' };\r\n }\r\n }\r\n } else if (mode === 2) { // Entire line\r\n screen[cursorRow] = [];\r\n }\r\n }\r\n break;\r\n\r\n case 'J': // ED - Erase in Display\r\n {\r\n const mode = numbers[0] || 0;\r\n if (mode === 0) {\r\n // Erase from cursor to end of display\r\n if (screen[cursorRow]) screen[cursorRow].splice(cursorCol);\r\n for (let r = cursorRow + 1; r <= maxRowUsed; r++) {\r\n screen[r] = [];\r\n }\r\n maxRowUsed = cursorRow;\r\n } else if (mode === 1) {\r\n // Erase from start of display to cursor\r\n for (let r = 0; r < cursorRow; r++) {\r\n screen[r] = [];\r\n }\r\n if (screen[cursorRow]) {\r\n for (let c = 0; c <= cursorCol; c++) {\r\n if (c < screen[cursorRow].length) {\r\n screen[cursorRow][c] = { char: ' ', style: '' };\r\n }\r\n }\r\n }\r\n } else if (mode === 2 || mode === 3) {\r\n // Erase entire display (2) or erase display + scrollback (3)\r\n for (let r = 0; r <= maxRowUsed; r++) {\r\n screen[r] = [];\r\n }\r\n maxRowUsed = cursorRow;\r\n }\r\n }\r\n break;\r\n\r\n // P (DCH), @ (ICH), L (IL), M (DL) - Delete/Insert characters/lines\r\n // These are complex to implement fully for a buffer-based approach without strict bounds.\r\n // For now we ignore them to avoid corruption, or we could implement simple versions.\r\n\r\n default:\r\n // Unknown command, we just consume it (which is the fix for the bug!)\r\n break;\r\n }\r\n\r\n // Move past the final byte\r\n i = j + 1;\r\n continue;\r\n } else {\r\n // Malformed CSI, treat as plain text if no final byte found? \r\n // Or just consume what we found? \r\n // ECMA-48 says if it doesn't end with 0x40-0x7E it's not a valid CSI?\r\n // But in practice we should probably just treat ESC as a char if not valid.\r\n }\r\n }\r\n // Check for simple ESC sequences (ESC X)\r\n // e.g. ESC 7 (Save Cursor), ESC 8 (Restore Cursor), ESC M (Reverse Index)\r\n else if (i + 1 < input.length) {\r\n // Simple 2-char escape\r\n const next = input[i + 1];\r\n // If it is [ it is CSI (handled above)\r\n // If not, we might want to handle some.\r\n\r\n // However, the main bug is CSI parsing.\r\n // Let's not be too aggressive with consuming other escapes unless we distinguish them.\r\n // Valid simple escapes are usually 0x30-0x7E.\r\n }\r\n }\r\n\r\n const char = input[i];\r\n\r\n if (char === '\\r') {\r\n cursorCol = 0;\r\n } else if (char === '\\n') {\r\n cursorRow++;\r\n cursorCol = 0;\r\n } else if (char === '\\x08') { // Backspace\r\n if (cursorCol > 0) cursorCol--;\r\n } else if (char === '\\t') {\r\n cursorCol = Math.min(MAX_CURSOR_COL, Math.floor(cursorCol / 8 + 1) * 8);\r\n } else if (char >= ' ' || char === '\\x00') {\r\n if (char === '\\x00') {\r\n i++;\r\n continue;\r\n }\r\n\r\n // Ensure row exists\r\n while (cursorRow >= screen.length) {\r\n screen.push([]);\r\n }\r\n if (!screen[cursorRow]) screen[cursorRow] = [];\r\n\r\n // Pad with spaces if needed\r\n while (screen[cursorRow].length < cursorCol) {\r\n screen[cursorRow].push({ char: ' ', style: '' });\r\n }\r\n\r\n // Write cell with current style\r\n screen[cursorRow][cursorCol] = { char: char, style: currentStyle };\r\n cursorCol++;\r\n\r\n if (cursorRow > maxRowUsed) maxRowUsed = cursorRow;\r\n }\r\n\r\n i++;\r\n }\r\n\r\n // ... (previous code)\r\n\r\n // Render to string with optimization\r\n const outputLines: string[] = [];\r\n let lastRenderedStyle = '';\r\n\r\n for (let row = 0; row <= maxRowUsed; row++) {\r\n let lineStr = '';\r\n const rowCells = screen[row] || [];\r\n\r\n // Ensure we process up to cursor column if this is the cursor row\r\n // This ensures the cursor is drawn even if it's past the end of text\r\n const effectiveLength = (options?.highlightCursor && row === cursorRow)\r\n ? Math.max(rowCells.length, cursorCol + 1)\r\n : rowCells.length;\r\n\r\n for (let col = 0; col < effectiveLength; col++) {\r\n let cell = rowCells[col] || { char: ' ', style: '' };\r\n\r\n // Apply cursor highlighting\r\n if (options?.highlightCursor && row === cursorRow && col === cursorCol) {\r\n // Invert colors for cursor\r\n // Standard ANSI invert is 7\r\n // We append it to the current style\r\n // If style is empty, it becomes \\x1b[7m\r\n // If style is \\x1b[31m, it becomes \\x1b[31m\\x1b[7m\r\n // We create a temporary cell for rendering\r\n cell = {\r\n char: cell.char || ' ', // Ensure visible char for cursor block\r\n style: cell.style + '\\x1b[7m'\r\n };\r\n }\r\n\r\n // If style changed, emit ANSI code\r\n if (cell.style !== lastRenderedStyle) {\r\n if (cell.style === '') {\r\n lineStr += '\\x1b[0m';\r\n } else {\r\n lineStr += '\\x1b[0m' + cell.style;\r\n }\r\n lastRenderedStyle = cell.style;\r\n }\r\n lineStr += cell.char;\r\n }\r\n\r\n // Reset at end of line\r\n if (lastRenderedStyle !== '') {\r\n lineStr += '\\x1b[0m';\r\n lastRenderedStyle = '';\r\n }\r\n\r\n outputLines.push(lineStr);\r\n }\r\n\r\n let result = outputLines.join('\\n');\r\n\r\n // Cleanup\r\n result = result.replace(/\\n{3,}/g, '\\n\\n');\r\n result = result.replace(/^\\n+/, '');\r\n result = result.trimEnd();\r\n // Ensure final reset\r\n result += '\\x1b[0m';\r\n\r\n return result;\r\n}\r\n"],"mappings":"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","names":["i"]}
|
|
@@ -1,76 +1,53 @@
|
|
|
1
|
-
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Copy text to clipboard using platform-specific commands.
|
|
14
|
-
* Uses a temp file approach to avoid shell escaping issues with large/complex text.
|
|
15
|
-
*/
|
|
16
|
-
export async function copyTextToClipboard(text) {
|
|
17
|
-
const platform = process.platform;
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import * as os from "os";
|
|
5
|
+
import { logDebug, logError } from "./logger.js";
|
|
6
|
+
async function copyTextToClipboard(text) {
|
|
7
|
+
const platform = process.platform;
|
|
8
|
+
try {
|
|
9
|
+
const tempDir = os.tmpdir();
|
|
10
|
+
const tempFile = path.join(tempDir, `centaurus-clipboard-${Date.now()}.txt`);
|
|
11
|
+
fs.writeFileSync(tempFile, text, "utf-8");
|
|
18
12
|
try {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
13
|
+
const pipeFileToCommand = (cmd, args) => {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
const proc = spawn(cmd, args, { shell: false });
|
|
16
|
+
const stream = fs.createReadStream(tempFile);
|
|
17
|
+
stream.on("error", reject);
|
|
18
|
+
proc.on("error", reject);
|
|
19
|
+
proc.on("close", (code) => {
|
|
20
|
+
if (code === 0) resolve();
|
|
21
|
+
else reject(new Error(`Command ${cmd} exited with code ${code}`));
|
|
22
|
+
});
|
|
23
|
+
stream.pipe(proc.stdin);
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
if (platform === "win32") {
|
|
27
|
+
await pipeFileToCommand("clip", []);
|
|
28
|
+
} else if (platform === "darwin") {
|
|
29
|
+
await pipeFileToCommand("pbcopy", []);
|
|
30
|
+
} else {
|
|
24
31
|
try {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const stream = fs.createReadStream(tempFile);
|
|
29
|
-
stream.on('error', reject);
|
|
30
|
-
proc.on('error', reject);
|
|
31
|
-
proc.on('close', (code) => {
|
|
32
|
-
if (code === 0)
|
|
33
|
-
resolve();
|
|
34
|
-
else
|
|
35
|
-
reject(new Error(`Command ${cmd} exited with code ${code}`));
|
|
36
|
-
});
|
|
37
|
-
stream.pipe(proc.stdin);
|
|
38
|
-
});
|
|
39
|
-
};
|
|
40
|
-
if (platform === 'win32') {
|
|
41
|
-
// Windows: Use clip
|
|
42
|
-
await pipeFileToCommand('clip', []);
|
|
43
|
-
}
|
|
44
|
-
else if (platform === 'darwin') {
|
|
45
|
-
// macOS: Use pbcopy
|
|
46
|
-
await pipeFileToCommand('pbcopy', []);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
// Linux: Try xclip first, then xsel
|
|
50
|
-
try {
|
|
51
|
-
await pipeFileToCommand('xclip', ['-selection', 'clipboard']);
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
// Fallback to xsel
|
|
55
|
-
await pipeFileToCommand('xsel', ['--clipboard', '--input']);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
logDebug(`Successfully copied ${text.length} characters to clipboard`);
|
|
59
|
-
return true;
|
|
32
|
+
await pipeFileToCommand("xclip", ["-selection", "clipboard"]);
|
|
33
|
+
} catch {
|
|
34
|
+
await pipeFileToCommand("xsel", ["--clipboard", "--input"]);
|
|
60
35
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
logError('Failed to copy text to clipboard', error instanceof Error ? error : undefined);
|
|
73
|
-
return false;
|
|
36
|
+
}
|
|
37
|
+
logDebug(`Successfully copied ${text.length} characters to clipboard`);
|
|
38
|
+
return true;
|
|
39
|
+
} finally {
|
|
40
|
+
try {
|
|
41
|
+
fs.unlinkSync(tempFile);
|
|
42
|
+
} catch {
|
|
43
|
+
}
|
|
74
44
|
}
|
|
45
|
+
} catch (error) {
|
|
46
|
+
logError("Failed to copy text to clipboard", error instanceof Error ? error : void 0);
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
75
49
|
}
|
|
50
|
+
export {
|
|
51
|
+
copyTextToClipboard
|
|
52
|
+
};
|
|
76
53
|
//# sourceMappingURL=text-clipboard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/utils/text-clipboard.ts"],"sourcesContent":["/**\r\n * Text Clipboard Utility\r\n * \r\n * Cross-platform utility to copy text to the system clipboard.\r\n * Uses native clipboard commands for Windows, macOS, and Linux.\r\n */\r\n\r\nimport { spawn } from 'child_process';\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport * as os from 'os';\r\nimport { logDebug, logError } from './logger.js';\r\n\r\n/**\r\n * Copy text to clipboard using platform-specific commands.\r\n * Uses a temp file approach to avoid shell escaping issues with large/complex text.\r\n */\r\nexport async function copyTextToClipboard(text: string): Promise<boolean> {\r\n const platform = process.platform;\r\n\r\n try {\r\n // Create a temp file to hold the text (avoids shell escaping issues)\r\n const tempDir = os.tmpdir();\r\n const tempFile = path.join(tempDir, `centaurus-clipboard-${Date.now()}.txt`);\r\n\r\n // Write text to temp file\r\n fs.writeFileSync(tempFile, text, 'utf-8');\r\n\r\n try {\r\n const pipeFileToCommand = (cmd: string, args: string[]): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n const proc = spawn(cmd, args, { shell: false });\r\n const stream = fs.createReadStream(tempFile);\r\n\r\n stream.on('error', reject);\r\n proc.on('error', reject);\r\n proc.on('close', (code) => {\r\n if (code === 0) resolve();\r\n else reject(new Error(`Command ${cmd} exited with code ${code}`));\r\n });\r\n\r\n stream.pipe(proc.stdin);\r\n });\r\n };\r\n\r\n if (platform === 'win32') {\r\n // Windows: Use clip\r\n await pipeFileToCommand('clip', []);\r\n } else if (platform === 'darwin') {\r\n // macOS: Use pbcopy\r\n await pipeFileToCommand('pbcopy', []);\r\n } else {\r\n // Linux: Try xclip first, then xsel\r\n try {\r\n await pipeFileToCommand('xclip', ['-selection', 'clipboard']);\r\n } catch {\r\n // Fallback to xsel\r\n await pipeFileToCommand('xsel', ['--clipboard', '--input']);\r\n }\r\n }\r\n\r\n logDebug(`Successfully copied ${text.length} characters to clipboard`);\r\n return true;\r\n } finally {\r\n // Clean up temp file\r\n try {\r\n fs.unlinkSync(tempFile);\r\n } catch {\r\n // Ignore cleanup errors\r\n }\r\n }\r\n } catch (error) {\r\n logError('Failed to copy text to clipboard', error instanceof Error ? error : undefined);\r\n return false;\r\n }\r\n}\r\n"],"mappings":"AAOA,SAAS,aAAa;AACtB,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,SAAS,UAAU,gBAAgB;AAMnC,eAAsB,oBAAoB,MAAgC;AACtE,QAAM,WAAW,QAAQ;AAEzB,MAAI;AAEA,UAAM,UAAU,GAAG,OAAO;AAC1B,UAAM,WAAW,KAAK,KAAK,SAAS,uBAAuB,KAAK,IAAI,CAAC,MAAM;AAG3E,OAAG,cAAc,UAAU,MAAM,OAAO;AAExC,QAAI;AACA,YAAM,oBAAoB,CAAC,KAAa,SAAkC;AACtE,eAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,gBAAM,OAAO,MAAM,KAAK,MAAM,EAAE,OAAO,MAAM,CAAC;AAC9C,gBAAM,SAAS,GAAG,iBAAiB,QAAQ;AAE3C,iBAAO,GAAG,SAAS,MAAM;AACzB,eAAK,GAAG,SAAS,MAAM;AACvB,eAAK,GAAG,SAAS,CAAC,SAAS;AACvB,gBAAI,SAAS,EAAG,SAAQ;AAAA,gBACnB,QAAO,IAAI,MAAM,WAAW,GAAG,qBAAqB,IAAI,EAAE,CAAC;AAAA,UACpE,CAAC;AAED,iBAAO,KAAK,KAAK,KAAK;AAAA,QAC1B,CAAC;AAAA,MACL;AAEA,UAAI,aAAa,SAAS;AAEtB,cAAM,kBAAkB,QAAQ,CAAC,CAAC;AAAA,MACtC,WAAW,aAAa,UAAU;AAE9B,cAAM,kBAAkB,UAAU,CAAC,CAAC;AAAA,MACxC,OAAO;AAEH,YAAI;AACA,gBAAM,kBAAkB,SAAS,CAAC,cAAc,WAAW,CAAC;AAAA,QAChE,QAAQ;AAEJ,gBAAM,kBAAkB,QAAQ,CAAC,eAAe,SAAS,CAAC;AAAA,QAC9D;AAAA,MACJ;AAEA,eAAS,uBAAuB,KAAK,MAAM,0BAA0B;AACrE,aAAO;AAAA,IACX,UAAE;AAEE,UAAI;AACA,WAAG,WAAW,QAAQ;AAAA,MAC1B,QAAQ;AAAA,MAER;AAAA,IACJ;AAAA,EACJ,SAAS,OAAO;AACZ,aAAS,oCAAoC,iBAAiB,QAAQ,QAAQ,MAAS;AACvF,WAAO;AAAA,EACX;AACJ;","names":[]}
|
|
@@ -1,211 +1,148 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unicode Sanitizer for Terminal Output
|
|
3
|
-
*
|
|
4
|
-
* This utility sanitizes problematic Unicode characters that cause display issues
|
|
5
|
-
* in terminal-based UIs like React Ink. The main problems are:
|
|
6
|
-
*
|
|
7
|
-
* 1. Emojis have double display width but string.length returns 1
|
|
8
|
-
* 2. Variation selectors (U+FE0F) change emoji rendering
|
|
9
|
-
* 3. Zero-width characters cause layout issues
|
|
10
|
-
* 4. Combining characters can cause unexpected visual output
|
|
11
|
-
*
|
|
12
|
-
* This module provides functions to:
|
|
13
|
-
* - Replace problematic emojis with ASCII fallbacks
|
|
14
|
-
* - Strip zero-width and invisible characters
|
|
15
|
-
* - Remove variation selectors
|
|
16
|
-
*/
|
|
17
|
-
/**
|
|
18
|
-
* Map of emojis to their ASCII text fallbacks.
|
|
19
|
-
* These are common emojis that might appear in terminal output.
|
|
20
|
-
*/
|
|
21
1
|
const EMOJI_FALLBACKS = {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
2
|
+
// Status indicators
|
|
3
|
+
"\u2713": "[ok]",
|
|
4
|
+
"\u2714": "[ok]",
|
|
5
|
+
"\u2717": "[x]",
|
|
6
|
+
"\u2718": "[x]",
|
|
7
|
+
"\u2705": "[ok]",
|
|
8
|
+
"\u274C": "[x]",
|
|
9
|
+
"\u26A0": "[!]",
|
|
10
|
+
"\u26A1": "*",
|
|
11
|
+
"\u2728": "*",
|
|
12
|
+
// Common emojis in dev tools
|
|
13
|
+
"\u{1F680}": ">",
|
|
14
|
+
"\u{1F4DD}": "#",
|
|
15
|
+
"\u{1F525}": "*",
|
|
16
|
+
"\u{1F4A1}": "*",
|
|
17
|
+
"\u{1F4E6}": "#",
|
|
18
|
+
"\u{1F527}": "*",
|
|
19
|
+
"\u2699": "*",
|
|
20
|
+
"\u{1F50D}": "*",
|
|
21
|
+
"\u{1F4C1}": "#",
|
|
22
|
+
"\u{1F4C2}": "#",
|
|
23
|
+
"\u{1F4AC}": "#",
|
|
24
|
+
"\u{1F389}": "*",
|
|
25
|
+
"\u{1F3AF}": "*",
|
|
26
|
+
"\u{1F41B}": "#",
|
|
27
|
+
"\u{1F512}": "#",
|
|
28
|
+
"\u{1F513}": "#",
|
|
29
|
+
// Arrows (these usually work, but some might cause issues)
|
|
30
|
+
"\u27A1": "->",
|
|
31
|
+
"\u2B05": "<-",
|
|
32
|
+
"\u2B06": "^",
|
|
33
|
+
"\u2B07": "v",
|
|
34
|
+
"\u2194": "<->",
|
|
35
|
+
"\u2195": "^v",
|
|
36
|
+
"\u21D0": "<=",
|
|
37
|
+
"\u21D2": "=>",
|
|
38
|
+
"\u21D1": "^^",
|
|
39
|
+
"\u21D3": "vv",
|
|
40
|
+
// Weather/Nature
|
|
41
|
+
"\u2600": "*",
|
|
42
|
+
"\u2601": "*",
|
|
43
|
+
"\u2602": "#",
|
|
44
|
+
"\u26C5": "*",
|
|
45
|
+
// Misc symbols that might cause issues
|
|
46
|
+
"\u2318": "#",
|
|
47
|
+
"\u2387": "#"
|
|
68
48
|
};
|
|
69
|
-
/**
|
|
70
|
-
* Regex patterns for Unicode ranges that should be handled
|
|
71
|
-
*/
|
|
72
49
|
const PATTERNS = {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
50
|
+
// Variation selectors: U+FE00-U+FE0F (VS1-VS16)
|
|
51
|
+
variationSelectors: /[\uFE00-\uFE0F]/g,
|
|
52
|
+
// Zero-width characters
|
|
53
|
+
zeroWidth: /[\u200B-\u200D\uFEFF\u2060]/g,
|
|
54
|
+
// Emoji modifiers (skin tones, etc.): U+1F3FB-U+1F3FF
|
|
55
|
+
emojiModifiers: /[\u{1F3FB}-\u{1F3FF}]/gu,
|
|
56
|
+
// Regional indicator symbols (flag emojis): U+1F1E0-U+1F1FF
|
|
57
|
+
regionalIndicators: /[\u{1F1E0}-\u{1F1FF}]/gu,
|
|
58
|
+
// Emoji presentation sequences (typically cause double-width issues)
|
|
59
|
+
// This covers most emoji ranges including:
|
|
60
|
+
// - Emoticons: U+1F600-U+1F64F
|
|
61
|
+
// - Miscellaneous Symbols and Pictographs: U+1F300-U+1F5FF
|
|
62
|
+
// - Transport and Map Symbols: U+1F680-U+1F6FF
|
|
63
|
+
// - Supplemental Symbols: U+1F900-U+1F9FF
|
|
64
|
+
// - Symbols and Pictographs Extended-A: U+1FA00-U+1FA6F
|
|
65
|
+
// - Additional emoji blocks: U+1FA70-U+1FAFF
|
|
66
|
+
commonEmojis: /[\u{1F300}-\u{1F9FF}\u{1FA00}-\u{1FAFF}]/gu,
|
|
67
|
+
// Enclosed alphanumerics and symbols (circled letters, numbers)
|
|
68
|
+
enclosedAlphanumerics: /[\u2460-\u24FF\u2776-\u2793]/g,
|
|
69
|
+
// Dingbats that might cause issues (but not all - keep common ones)
|
|
70
|
+
problematicDingbats: /[\u2700-\u27BF]/g,
|
|
71
|
+
// Miscellaneous symbols that are typically single-width: U+2600-U+26FF
|
|
72
|
+
// We'll handle these selectively
|
|
73
|
+
miscSymbols: /[\u2600-\u26FF]/g
|
|
97
74
|
};
|
|
98
|
-
/**
|
|
99
|
-
* Characters/ranges that should be PRESERVED (work fine in terminals)
|
|
100
|
-
*/
|
|
101
75
|
const PRESERVE_RANGES = {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
76
|
+
// Box-drawing characters: U+2500-U+257F
|
|
77
|
+
boxDrawing: /[\u2500-\u257F]/,
|
|
78
|
+
// Block elements: U+2580-U+259F
|
|
79
|
+
blockElements: /[\u2580-\u259F]/,
|
|
80
|
+
// Basic Latin punctuation and symbols
|
|
81
|
+
basicLatin: /[\u0020-\u007E]/,
|
|
82
|
+
// Latin-1 Supplement
|
|
83
|
+
latin1: /[\u00A0-\u00FF]/,
|
|
84
|
+
// General punctuation: U+2000-U+206F (except zero-width)
|
|
85
|
+
generalPunctuation: /[\u2010-\u205E]/,
|
|
86
|
+
// Arrows: U+2190-U+21FF (single-width arrows work fine)
|
|
87
|
+
arrows: /[\u2190-\u21FF]/,
|
|
88
|
+
// Mathematical operators: U+2200-U+22FF
|
|
89
|
+
mathOperators: /[\u2200-\u22FF]/,
|
|
90
|
+
// Currency symbols: U+20A0-U+20CF
|
|
91
|
+
currency: /[\u20A0-\u20CF]/,
|
|
92
|
+
// Common card suits and symbols that work: ♠♣♥♦★☆
|
|
93
|
+
commonSymbols: /[♠♣♥♦★☆]/
|
|
120
94
|
};
|
|
121
|
-
/**
|
|
122
|
-
* Check if a character should be preserved (not sanitized)
|
|
123
|
-
*/
|
|
124
95
|
function shouldPreserve(char) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
}
|
|
96
|
+
for (const pattern of Object.values(PRESERVE_RANGES)) {
|
|
97
|
+
if (pattern.test(char)) {
|
|
98
|
+
return true;
|
|
129
99
|
}
|
|
130
|
-
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
131
102
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const { useFallbacks = true, aggressive = false } = options;
|
|
144
|
-
let result = input;
|
|
145
|
-
// Step 1: Remove variation selectors (these change emoji presentation)
|
|
146
|
-
result = result.replace(PATTERNS.variationSelectors, '');
|
|
147
|
-
// Step 2: Remove zero-width characters
|
|
148
|
-
result = result.replace(PATTERNS.zeroWidth, '');
|
|
149
|
-
// Step 3: Remove emoji modifiers (skin tones)
|
|
150
|
-
result = result.replace(PATTERNS.emojiModifiers, '');
|
|
151
|
-
// Step 4: Remove regional indicators (flag emojis become letter pairs)
|
|
152
|
-
result = result.replace(PATTERNS.regionalIndicators, '');
|
|
153
|
-
// Step 5: Replace known emojis with fallbacks or strip them
|
|
154
|
-
if (useFallbacks) {
|
|
155
|
-
// Replace known emojis with their fallbacks
|
|
156
|
-
for (const [emoji, fallback] of Object.entries(EMOJI_FALLBACKS)) {
|
|
157
|
-
result = result.split(emoji).join(fallback);
|
|
158
|
-
}
|
|
103
|
+
function sanitizeUnicode(input, options = {}) {
|
|
104
|
+
if (!input) return "";
|
|
105
|
+
const { useFallbacks = true, aggressive = false } = options;
|
|
106
|
+
let result = input;
|
|
107
|
+
result = result.replace(PATTERNS.variationSelectors, "");
|
|
108
|
+
result = result.replace(PATTERNS.zeroWidth, "");
|
|
109
|
+
result = result.replace(PATTERNS.emojiModifiers, "");
|
|
110
|
+
result = result.replace(PATTERNS.regionalIndicators, "");
|
|
111
|
+
if (useFallbacks) {
|
|
112
|
+
for (const [emoji, fallback] of Object.entries(EMOJI_FALLBACKS)) {
|
|
113
|
+
result = result.split(emoji).join(fallback);
|
|
159
114
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
result = result.replace(PATTERNS.problematicDingbats, '');
|
|
175
|
-
}
|
|
176
|
-
// Step 8: Clean up any resulting double spaces
|
|
177
|
-
result = result.replace(/ +/g, ' ');
|
|
178
|
-
return result;
|
|
115
|
+
}
|
|
116
|
+
result = result.replace(PATTERNS.commonEmojis, aggressive ? "" : "*");
|
|
117
|
+
if (aggressive) {
|
|
118
|
+
result = result.replace(PATTERNS.miscSymbols, (char) => {
|
|
119
|
+
if (shouldPreserve(char)) {
|
|
120
|
+
return char;
|
|
121
|
+
}
|
|
122
|
+
return "";
|
|
123
|
+
});
|
|
124
|
+
result = result.replace(PATTERNS.enclosedAlphanumerics, "");
|
|
125
|
+
result = result.replace(PATTERNS.problematicDingbats, "");
|
|
126
|
+
}
|
|
127
|
+
result = result.replace(/ +/g, " ");
|
|
128
|
+
return result;
|
|
179
129
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
if (!input)
|
|
189
|
-
return '';
|
|
190
|
-
let result = input;
|
|
191
|
-
// Only remove variation selectors and zero-width characters
|
|
192
|
-
result = result.replace(PATTERNS.variationSelectors, '');
|
|
193
|
-
result = result.replace(PATTERNS.zeroWidth, '');
|
|
194
|
-
// Replace common problematic emojis with simple markers
|
|
195
|
-
result = result.replace(PATTERNS.commonEmojis, '*');
|
|
196
|
-
result = result.replace(PATTERNS.enclosedAlphanumerics, '#');
|
|
197
|
-
return result;
|
|
130
|
+
function sanitizeUnicodeLight(input) {
|
|
131
|
+
if (!input) return "";
|
|
132
|
+
let result = input;
|
|
133
|
+
result = result.replace(PATTERNS.variationSelectors, "");
|
|
134
|
+
result = result.replace(PATTERNS.zeroWidth, "");
|
|
135
|
+
result = result.replace(PATTERNS.commonEmojis, "*");
|
|
136
|
+
result = result.replace(PATTERNS.enclosedAlphanumerics, "#");
|
|
137
|
+
return result;
|
|
198
138
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
*/
|
|
203
|
-
export function hasProblematicUnicode(input) {
|
|
204
|
-
if (!input)
|
|
205
|
-
return false;
|
|
206
|
-
return (PATTERNS.commonEmojis.test(input) ||
|
|
207
|
-
PATTERNS.variationSelectors.test(input) ||
|
|
208
|
-
PATTERNS.emojiModifiers.test(input) ||
|
|
209
|
-
PATTERNS.regionalIndicators.test(input));
|
|
139
|
+
function hasProblematicUnicode(input) {
|
|
140
|
+
if (!input) return false;
|
|
141
|
+
return PATTERNS.commonEmojis.test(input) || PATTERNS.variationSelectors.test(input) || PATTERNS.emojiModifiers.test(input) || PATTERNS.regionalIndicators.test(input);
|
|
210
142
|
}
|
|
143
|
+
export {
|
|
144
|
+
hasProblematicUnicode,
|
|
145
|
+
sanitizeUnicode,
|
|
146
|
+
sanitizeUnicodeLight
|
|
147
|
+
};
|
|
211
148
|
//# sourceMappingURL=unicode-sanitizer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unicode-sanitizer.js","sourceRoot":"","sources":["../../src/utils/unicode-sanitizer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/unicode-sanitizer.ts"],"sourcesContent":["/**\r\n * Unicode Sanitizer for Terminal Output\r\n * \r\n * This utility sanitizes problematic Unicode characters that cause display issues\r\n * in terminal-based UIs like React Ink. The main problems are:\r\n * \r\n * 1. Emojis have double display width but string.length returns 1\r\n * 2. Variation selectors (U+FE0F) change emoji rendering\r\n * 3. Zero-width characters cause layout issues\r\n * 4. Combining characters can cause unexpected visual output\r\n * \r\n * This module provides functions to:\r\n * - Replace problematic emojis with ASCII fallbacks\r\n * - Strip zero-width and invisible characters\r\n * - Remove variation selectors\r\n */\r\n\r\n/**\r\n * Map of emojis to their ASCII text fallbacks.\r\n * These are common emojis that might appear in terminal output.\r\n */\r\nconst EMOJI_FALLBACKS: Record<string, string> = {\r\n // Status indicators\r\n '✓': '[ok]',\r\n '✔': '[ok]',\r\n '✗': '[x]',\r\n '✘': '[x]',\r\n '✅': '[ok]',\r\n '❌': '[x]',\r\n '⚠': '[!]',\r\n '⚡': '*',\r\n '✨': '*',\r\n\r\n // Common emojis in dev tools\r\n '🚀': '>',\r\n '📝': '#',\r\n '🔥': '*',\r\n '💡': '*',\r\n '📦': '#',\r\n '🔧': '*',\r\n '⚙': '*',\r\n '🔍': '*',\r\n '📁': '#',\r\n '📂': '#',\r\n '💬': '#',\r\n '🎉': '*',\r\n '🎯': '*',\r\n '🐛': '#',\r\n '🔒': '#',\r\n '🔓': '#',\r\n\r\n // Arrows (these usually work, but some might cause issues)\r\n '➡': '->',\r\n '⬅': '<-',\r\n '⬆': '^',\r\n '⬇': 'v',\r\n '↔': '<->',\r\n '↕': '^v',\r\n '⇐': '<=',\r\n '⇒': '=>',\r\n '⇑': '^^',\r\n '⇓': 'vv',\r\n\r\n // Weather/Nature\r\n '☀': '*',\r\n '☁': '*',\r\n '☂': '#',\r\n '⛅': '*',\r\n\r\n // Misc symbols that might cause issues\r\n '⌘': '#',\r\n '⎇': '#',\r\n};\r\n\r\n/**\r\n * Regex patterns for Unicode ranges that should be handled\r\n */\r\nconst PATTERNS = {\r\n // Variation selectors: U+FE00-U+FE0F (VS1-VS16)\r\n variationSelectors: /[\\uFE00-\\uFE0F]/g,\r\n\r\n // Zero-width characters\r\n zeroWidth: /[\\u200B-\\u200D\\uFEFF\\u2060]/g,\r\n\r\n // Emoji modifiers (skin tones, etc.): U+1F3FB-U+1F3FF\r\n emojiModifiers: /[\\u{1F3FB}-\\u{1F3FF}]/gu,\r\n\r\n // Regional indicator symbols (flag emojis): U+1F1E0-U+1F1FF\r\n regionalIndicators: /[\\u{1F1E0}-\\u{1F1FF}]/gu,\r\n\r\n // Emoji presentation sequences (typically cause double-width issues)\r\n // This covers most emoji ranges including:\r\n // - Emoticons: U+1F600-U+1F64F\r\n // - Miscellaneous Symbols and Pictographs: U+1F300-U+1F5FF\r\n // - Transport and Map Symbols: U+1F680-U+1F6FF\r\n // - Supplemental Symbols: U+1F900-U+1F9FF\r\n // - Symbols and Pictographs Extended-A: U+1FA00-U+1FA6F\r\n // - Additional emoji blocks: U+1FA70-U+1FAFF\r\n commonEmojis: /[\\u{1F300}-\\u{1F9FF}\\u{1FA00}-\\u{1FAFF}]/gu,\r\n\r\n // Enclosed alphanumerics and symbols (circled letters, numbers)\r\n enclosedAlphanumerics: /[\\u2460-\\u24FF\\u2776-\\u2793]/g,\r\n\r\n // Dingbats that might cause issues (but not all - keep common ones)\r\n problematicDingbats: /[\\u2700-\\u27BF]/g,\r\n\r\n // Miscellaneous symbols that are typically single-width: U+2600-U+26FF\r\n // We'll handle these selectively\r\n miscSymbols: /[\\u2600-\\u26FF]/g,\r\n};\r\n\r\n/**\r\n * Characters/ranges that should be PRESERVED (work fine in terminals)\r\n */\r\nconst PRESERVE_RANGES = {\r\n // Box-drawing characters: U+2500-U+257F\r\n boxDrawing: /[\\u2500-\\u257F]/,\r\n\r\n // Block elements: U+2580-U+259F\r\n blockElements: /[\\u2580-\\u259F]/,\r\n\r\n // Basic Latin punctuation and symbols\r\n basicLatin: /[\\u0020-\\u007E]/,\r\n\r\n // Latin-1 Supplement\r\n latin1: /[\\u00A0-\\u00FF]/,\r\n\r\n // General punctuation: U+2000-U+206F (except zero-width)\r\n generalPunctuation: /[\\u2010-\\u205E]/,\r\n\r\n // Arrows: U+2190-U+21FF (single-width arrows work fine)\r\n arrows: /[\\u2190-\\u21FF]/,\r\n\r\n // Mathematical operators: U+2200-U+22FF\r\n mathOperators: /[\\u2200-\\u22FF]/,\r\n\r\n // Currency symbols: U+20A0-U+20CF\r\n currency: /[\\u20A0-\\u20CF]/,\r\n\r\n // Common card suits and symbols that work: ♠♣♥♦★☆\r\n commonSymbols: /[♠♣♥♦★☆]/,\r\n};\r\n\r\n/**\r\n * Check if a character should be preserved (not sanitized)\r\n */\r\nfunction shouldPreserve(char: string): boolean {\r\n for (const pattern of Object.values(PRESERVE_RANGES)) {\r\n if (pattern.test(char)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Sanitize a string for terminal display by replacing or removing\r\n * problematic Unicode characters.\r\n * \r\n * @param input - The string to sanitize\r\n * @param options - Sanitization options\r\n * @returns Sanitized string safe for terminal display\r\n */\r\nexport function sanitizeUnicode(input: string, options: {\r\n /** Replace emojis with ASCII fallbacks instead of stripping */\r\n useFallbacks?: boolean;\r\n /** Aggressively strip all non-ASCII characters (except box-drawing) */\r\n aggressive?: boolean;\r\n} = {}): string {\r\n if (!input) return '';\r\n\r\n const { useFallbacks = true, aggressive = false } = options;\r\n\r\n let result = input;\r\n\r\n // Step 1: Remove variation selectors (these change emoji presentation)\r\n result = result.replace(PATTERNS.variationSelectors, '');\r\n\r\n // Step 2: Remove zero-width characters\r\n result = result.replace(PATTERNS.zeroWidth, '');\r\n\r\n // Step 3: Remove emoji modifiers (skin tones)\r\n result = result.replace(PATTERNS.emojiModifiers, '');\r\n\r\n // Step 4: Remove regional indicators (flag emojis become letter pairs)\r\n result = result.replace(PATTERNS.regionalIndicators, '');\r\n\r\n // Step 5: Replace known emojis with fallbacks or strip them\r\n if (useFallbacks) {\r\n // Replace known emojis with their fallbacks\r\n for (const [emoji, fallback] of Object.entries(EMOJI_FALLBACKS)) {\r\n result = result.split(emoji).join(fallback);\r\n }\r\n }\r\n\r\n // Step 6: Strip remaining common emojis\r\n result = result.replace(PATTERNS.commonEmojis, aggressive ? '' : '*');\r\n\r\n // Step 7: Handle miscellaneous symbols selectively\r\n // Many of these work fine, but some cause issues\r\n // In aggressive mode, strip all; otherwise, only strip known problematic ones\r\n if (aggressive) {\r\n result = result.replace(PATTERNS.miscSymbols, (char) => {\r\n // Preserve if it's in our preserve list\r\n if (shouldPreserve(char)) {\r\n return char;\r\n }\r\n return '';\r\n });\r\n\r\n result = result.replace(PATTERNS.enclosedAlphanumerics, '');\r\n result = result.replace(PATTERNS.problematicDingbats, '');\r\n }\r\n\r\n // Step 8: Clean up any resulting double spaces\r\n result = result.replace(/ +/g, ' ');\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Light sanitization that only removes the most problematic characters\r\n * while preserving as much Unicode as possible.\r\n * \r\n * Use this for final display where you want to keep most characters\r\n * but prevent layout breaking.\r\n */\r\nexport function sanitizeUnicodeLight(input: string): string {\r\n if (!input) return '';\r\n\r\n let result = input;\r\n\r\n // Only remove variation selectors and zero-width characters\r\n result = result.replace(PATTERNS.variationSelectors, '');\r\n result = result.replace(PATTERNS.zeroWidth, '');\r\n\r\n // Replace common problematic emojis with simple markers\r\n result = result.replace(PATTERNS.commonEmojis, '*');\r\n result = result.replace(PATTERNS.enclosedAlphanumerics, '#');\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Check if a string contains any potentially problematic Unicode\r\n * that might cause display issues.\r\n */\r\nexport function hasProblematicUnicode(input: string): boolean {\r\n if (!input) return false;\r\n\r\n return (\r\n PATTERNS.commonEmojis.test(input) ||\r\n PATTERNS.variationSelectors.test(input) ||\r\n PATTERNS.emojiModifiers.test(input) ||\r\n PATTERNS.regionalIndicators.test(input)\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
|