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":"local-chat-storage.js","sourceRoot":"","sources":["../../src/services/local-chat-storage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/services/local-chat-storage.ts"],"sourcesContent":["/**\r\n * Local Chat Storage Service\r\n * \r\n * Provides persistent local storage for CLI conversations.\r\n * Stores chats in ~/.centaurus/chats/ directory as JSON files.\r\n */\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport * as os from 'os';\r\nimport { logError } from '../utils/logger.js';\r\n\r\n/**\r\n * Message interface matching the AIMessage type from ai-service-client\r\n */\r\nexport interface StoredMessage {\r\n role: 'user' | 'assistant' | 'system' | 'tool';\r\n content: string;\r\n tool_calls?: Array<{\r\n id: string;\r\n name: string;\r\n arguments: Record<string, any>;\r\n }>;\r\n tool_call_id?: string;\r\n}\r\n\r\n/**\r\n * UI Message for restoring full chat history display\r\n * This is a serializable version of the Message type from types/index.ts\r\n */\r\nexport interface StoredUIMessage {\r\n id: string;\r\n role: 'user' | 'assistant' | 'system' | 'tool';\r\n content: string;\r\n timestamp?: string; // ISO string (Date is not JSON serializable)\r\n toolExecution?: {\r\n toolName: string;\r\n status: 'pending' | 'executing' | 'completed' | 'error';\r\n result?: string;\r\n error?: string;\r\n arguments?: Record<string, any>;\r\n };\r\n shouldStream?: boolean;\r\n isCommandMode?: boolean;\r\n tool_call_id?: string;\r\n tool_calls?: Array<{ id: string; name: string; arguments: Record<string, any> }>;\r\n thinkingDuration?: number;\r\n taskCompletion?: {\r\n taskNumber: number;\r\n totalTasks: number;\r\n taskDescription: string;\r\n completionNote?: string;\r\n };\r\n planAccepted?: {\r\n planTitle?: string;\r\n totalTasks?: number;\r\n };\r\n connectionStatus?: { // For SSH/WSL/Docker connection status\r\n type: 'ssh' | 'wsl' | 'docker';\r\n status: 'connecting' | 'connected' | 'error' | 'disconnected';\r\n connectionString?: string;\r\n error?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Remote environment context for SSH/WSL/Docker sessions\r\n * Used to restore remote session state when resuming a chat\r\n */\r\nexport interface StoredRemoteContext {\r\n type: 'ssh' | 'wsl' | 'docker';\r\n connectionCommand: string; // Original command to reconnect (e.g., \"ssh user@host\" or \"wsl\")\r\n remoteCwd: string; // CWD in the remote environment\r\n localCwdBeforeRemote: string; // Local CWD before entering remote session\r\n metadata?: {\r\n hostname?: string; // For SSH\r\n username?: string; // For SSH \r\n distroName?: string; // For WSL\r\n containerId?: string; // For Docker\r\n port?: number; // For SSH\r\n };\r\n}\r\n\r\n/**\r\n * Serialized checkpoint metadata stored with chat history.\r\n * This allows checkpoint state to be restored even if the checkpoint index file is missing.\r\n */\r\nexport interface StoredCheckpointMeta {\r\n id: string;\r\n prompt: string;\r\n createdAt: string;\r\n createdAtMs: number;\r\n cwd: string;\r\n contextType: 'local' | 'ssh' | 'wsl' | 'docker';\r\n remoteSessionInfo?: {\r\n hostname?: string;\r\n username?: string;\r\n sessionId: string;\r\n connectionString?: string;\r\n };\r\n conversationIndex: number;\r\n uiMessageIndex?: number;\r\n uiMessageId?: string;\r\n snapshotDir: string;\r\n manifestPath: string;\r\n changes?: {\r\n added: string[];\r\n modified: string[];\r\n deleted: string[];\r\n };\r\n commands: string[];\r\n toolCalls: Array<{\r\n id?: string;\r\n name: string;\r\n arguments?: Record<string, any>;\r\n timestamp: string;\r\n }>;\r\n status: 'active' | 'finalized' | 'discarded';\r\n}\r\n\r\n/**\r\n * Local chat metadata (without messages, for listing)\r\n */\r\nexport interface LocalChatMeta {\r\n id: string;\r\n title: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n messageCount: number;\r\n environment?: string; // 'local' or 'ssh:user@host' or 'wsl:distro' or 'docker:container'\r\n}\r\n\r\n/**\r\n * Full local chat with messages\r\n */\r\nexport interface LocalChat extends LocalChatMeta {\r\n messages: StoredMessage[];\r\n uiMessages?: StoredUIMessage[]; // Full UI history for restoration\r\n cwd?: string; // Working directory at time of save (for restoration)\r\n remoteContext?: StoredRemoteContext; // Remote context if saved while in SSH/WSL/Docker (backward compat)\r\n remoteContextStack?: StoredRemoteContext[]; // Stack of nested contexts (for SSH>SSH, SSH>Docker, etc.)\r\n checkpointIndex?: StoredCheckpointMeta[]; // Serialized checkpoint metadata for resume/revert restoration\r\n backendConversationId?: string; // Backend conversation UUID (for file storage/deletion)\r\n}\r\n\r\n/**\r\n * LocalChatStorage class for managing local conversation persistence\r\n */\r\nexport class LocalChatStorage {\r\n private chatsDir: string;\r\n private indexPath: string;\r\n private chatIndex: Map<string, LocalChatMeta> = new Map();\r\n private indexLoaded: boolean = false;\r\n\r\n constructor() {\r\n const homeDir = os.homedir();\r\n this.chatsDir = path.join(homeDir, '.centaurus', 'chats');\r\n this.indexPath = path.join(this.chatsDir, 'index.json');\r\n\r\n // Ensure chats directory exists\r\n if (!fs.existsSync(this.chatsDir)) {\r\n fs.mkdirSync(this.chatsDir, { recursive: true });\r\n }\r\n\r\n // Load or build the index\r\n this.loadIndex();\r\n }\r\n\r\n /**\r\n * Load the metadata index from disk, or rebuild it from chat files if missing\r\n */\r\n private loadIndex(): void {\r\n if (this.indexLoaded) return;\r\n\r\n try {\r\n if (fs.existsSync(this.indexPath)) {\r\n const data = fs.readFileSync(this.indexPath, 'utf-8');\r\n const indexArray: LocalChatMeta[] = JSON.parse(data);\r\n this.chatIndex.clear();\r\n for (const meta of indexArray) {\r\n this.chatIndex.set(meta.id, meta);\r\n }\r\n this.indexLoaded = true;\r\n return;\r\n }\r\n } catch (error) {\r\n // Index file corrupted, rebuild it\r\n }\r\n\r\n // Rebuild index from chat files (one-time migration)\r\n this.rebuildIndex();\r\n }\r\n\r\n /**\r\n * Rebuild the index by reading metadata from all chat files\r\n * This is a one-time migration that reads full files, but only happens once\r\n */\r\n private rebuildIndex(): void {\r\n this.chatIndex.clear();\r\n\r\n if (!fs.existsSync(this.chatsDir)) {\r\n this.indexLoaded = true;\r\n return;\r\n }\r\n\r\n const files = fs.readdirSync(this.chatsDir)\r\n .filter(f => f.endsWith('.json') && f !== 'index.json');\r\n\r\n for (const file of files) {\r\n try {\r\n const filePath = path.join(this.chatsDir, file);\r\n const data = fs.readFileSync(filePath, 'utf-8');\r\n const chat = JSON.parse(data) as LocalChat;\r\n\r\n // Determine environment string from remoteContext\r\n let environment = 'local';\r\n if (chat.remoteContext) {\r\n const rc = chat.remoteContext;\r\n if (rc.type === 'ssh' && rc.metadata?.hostname) {\r\n environment = `ssh:${rc.metadata.username || 'user'}@${rc.metadata.hostname}`;\r\n } else if (rc.type === 'wsl') {\r\n environment = `wsl:${rc.metadata?.distroName || 'Ubuntu'}`;\r\n } else if (rc.type === 'docker' && rc.metadata?.containerId) {\r\n environment = `docker:${rc.metadata.containerId.substring(0, 12)}`;\r\n } else {\r\n environment = rc.type;\r\n }\r\n }\r\n\r\n // Store metadata only\r\n this.chatIndex.set(chat.id, {\r\n id: chat.id,\r\n title: chat.title,\r\n createdAt: chat.createdAt,\r\n updatedAt: chat.updatedAt,\r\n messageCount: chat.messageCount,\r\n environment,\r\n });\r\n } catch (error) {\r\n // Skip invalid files\r\n continue;\r\n }\r\n }\r\n\r\n this.indexLoaded = true;\r\n this.saveIndex();\r\n }\r\n\r\n /**\r\n * Save the metadata index to disk\r\n */\r\n private saveIndex(): void {\r\n try {\r\n const indexArray = Array.from(this.chatIndex.values());\r\n fs.writeFileSync(this.indexPath, JSON.stringify(indexArray, null, 2), 'utf-8');\r\n } catch (error) {\r\n logError('Failed to save chat index', error as Error);\r\n }\r\n }\r\n\r\n /**\r\n * Update the index entry for a chat\r\n */\r\n private updateIndexEntry(chat: LocalChat): void {\r\n let environment = 'local';\r\n if (chat.remoteContext) {\r\n const rc = chat.remoteContext;\r\n if (rc.type === 'ssh' && rc.metadata?.hostname) {\r\n environment = `ssh:${rc.metadata.username || 'user'}@${rc.metadata.hostname}`;\r\n } else if (rc.type === 'wsl') {\r\n environment = `wsl:${rc.metadata?.distroName || 'Ubuntu'}`;\r\n } else if (rc.type === 'docker' && rc.metadata?.containerId) {\r\n environment = `docker:${rc.metadata.containerId.substring(0, 12)}`;\r\n } else {\r\n environment = rc.type;\r\n }\r\n }\r\n\r\n this.chatIndex.set(chat.id, {\r\n id: chat.id,\r\n title: chat.title,\r\n createdAt: chat.createdAt,\r\n updatedAt: chat.updatedAt,\r\n messageCount: chat.messageCount,\r\n environment,\r\n });\r\n this.saveIndex();\r\n }\r\n\r\n /**\r\n * Generate a unique chat ID based on timestamp\r\n */\r\n generateChatId(): string {\r\n const now = new Date();\r\n const timestamp = now.toISOString().replace(/[:.]/g, '-').slice(0, 19);\r\n const random = Math.random().toString(36).substring(2, 6);\r\n return `chat-${timestamp}-${random}`;\r\n }\r\n\r\n /**\r\n * Generate a title from the first user message\r\n */\r\n generateTitle(messages: StoredMessage[]): string {\r\n const firstUserMessage = messages.find(m => m.role === 'user');\r\n if (!firstUserMessage || !firstUserMessage.content) {\r\n return 'New Chat';\r\n }\r\n\r\n // Take first 60 chars, trim to last word boundary\r\n let title = firstUserMessage.content.substring(0, 60);\r\n if (firstUserMessage.content.length > 60) {\r\n const lastSpace = title.lastIndexOf(' ');\r\n if (lastSpace > 30) {\r\n title = title.substring(0, lastSpace);\r\n }\r\n title += '...';\r\n }\r\n\r\n // Clean up whitespace and newlines\r\n title = title.replace(/\\s+/g, ' ').trim();\r\n\r\n return title || 'New Chat';\r\n }\r\n\r\n /**\r\n * Get the file path for a chat\r\n */\r\n private getChatPath(chatId: string): string {\r\n return path.join(this.chatsDir, `${chatId}.json`);\r\n }\r\n\r\n /**\r\n * Save a chat to disk\r\n * @param remoteContext - undefined = preserve existing, null = clear, StoredRemoteContext = set new value\r\n * @param remoteContextStack - Stack of nested contexts for SSH>SSH, SSH>Docker etc.\r\n * @param checkpointIndex - undefined = preserve existing, null = clear, array = set latest checkpoint metadata\r\n */\r\n saveChat(\r\n chatId: string,\r\n messages: StoredMessage[],\r\n uiMessages?: StoredUIMessage[],\r\n cwd?: string,\r\n remoteContext?: StoredRemoteContext | null,\r\n remoteContextStack?: StoredRemoteContext[] | null,\r\n checkpointIndex?: StoredCheckpointMeta[] | null\r\n ): LocalChat {\r\n const chatPath = this.getChatPath(chatId);\r\n const now = new Date().toISOString();\r\n\r\n let chat: LocalChat;\r\n\r\n if (fs.existsSync(chatPath)) {\r\n // Update existing chat\r\n const existing = this.loadChat(chatId);\r\n if (existing) {\r\n chat = {\r\n ...existing,\r\n messages,\r\n uiMessages: uiMessages || existing.uiMessages,\r\n cwd: cwd || existing.cwd, // Preserve CWD if not provided\r\n // remoteContext: null = clear it, undefined = preserve existing\r\n remoteContext: remoteContext === null ? undefined : (remoteContext !== undefined ? remoteContext : existing.remoteContext),\r\n // remoteContextStack: null = clear it, undefined = preserve existing\r\n remoteContextStack: remoteContextStack === null ? undefined : (remoteContextStack !== undefined ? remoteContextStack : existing.remoteContextStack),\r\n // checkpointIndex: null = clear it, undefined = preserve existing\r\n checkpointIndex: checkpointIndex === null ? undefined : (checkpointIndex !== undefined ? checkpointIndex : existing.checkpointIndex),\r\n // Preserve backendConversationId if it exists\r\n backendConversationId: existing.backendConversationId,\r\n messageCount: messages.length,\r\n updatedAt: now,\r\n };\r\n } else {\r\n // File exists but couldn't be parsed, create new\r\n chat = {\r\n id: chatId,\r\n title: this.generateTitle(messages),\r\n createdAt: now,\r\n updatedAt: now,\r\n messageCount: messages.length,\r\n messages,\r\n uiMessages,\r\n cwd,\r\n remoteContext: remoteContext ?? undefined,\r\n remoteContextStack: remoteContextStack ?? undefined,\r\n checkpointIndex: checkpointIndex ?? undefined,\r\n };\r\n }\r\n } else {\r\n // Create new chat\r\n chat = {\r\n id: chatId,\r\n title: this.generateTitle(messages),\r\n createdAt: now,\r\n updatedAt: now,\r\n messageCount: messages.length,\r\n messages,\r\n uiMessages,\r\n cwd,\r\n remoteContext: remoteContext ?? undefined,\r\n remoteContextStack: remoteContextStack ?? undefined,\r\n checkpointIndex: checkpointIndex ?? undefined,\r\n };\r\n }\r\n\r\n fs.writeFileSync(chatPath, JSON.stringify(chat, null, 2), 'utf-8');\r\n\r\n // Update the metadata index\r\n this.updateIndexEntry(chat);\r\n\r\n return chat;\r\n }\r\n\r\n /**\r\n * Set the backend conversation ID for a chat\r\n * This is used to associate local chats with backend file storage\r\n */\r\n setBackendConversationId(chatId: string, backendConversationId: string): boolean {\r\n const chat = this.loadChat(chatId);\r\n if (!chat) {\r\n return false;\r\n }\r\n\r\n try {\r\n chat.backendConversationId = backendConversationId;\r\n chat.updatedAt = new Date().toISOString();\r\n const chatPath = this.getChatPath(chatId);\r\n fs.writeFileSync(chatPath, JSON.stringify(chat, null, 2), 'utf-8');\r\n return true;\r\n } catch (error) {\r\n logError(`Failed to set backend conversation ID for chat ${chatId}`, error as Error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Get the backend conversation ID for a chat (if any)\r\n */\r\n getBackendConversationId(chatId: string): string | undefined {\r\n const chat = this.loadChat(chatId);\r\n return chat?.backendConversationId;\r\n }\r\n\r\n /**\r\n * Load a chat by ID\r\n */\r\n loadChat(chatId: string): LocalChat | null {\r\n const chatPath = this.getChatPath(chatId);\r\n\r\n if (!fs.existsSync(chatPath)) {\r\n return null;\r\n }\r\n\r\n try {\r\n const data = fs.readFileSync(chatPath, 'utf-8');\r\n return JSON.parse(data) as LocalChat;\r\n } catch (error) {\r\n logError(`Failed to load chat ${chatId}`, error as Error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * List all chats (metadata only, sorted by updatedAt descending)\r\n * Uses the in-memory index to avoid loading full chat files\r\n */\r\n listChats(): LocalChatMeta[] {\r\n // Ensure index is loaded\r\n this.loadIndex();\r\n\r\n // Return sorted metadata from the cache\r\n const chats = Array.from(this.chatIndex.values());\r\n\r\n // Sort by updatedAt descending (most recent first)\r\n chats.sort((a, b) =>\r\n new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()\r\n );\r\n\r\n return chats;\r\n }\r\n\r\n /**\r\n * Delete a chat by ID\r\n */\r\n deleteChat(chatId: string): boolean {\r\n const chatPath = this.getChatPath(chatId);\r\n const checkpointsPath = path.join(os.homedir(), '.centaurus', 'checkpoints', chatId);\r\n\r\n if (!fs.existsSync(chatPath)) {\r\n // Best-effort cleanup for orphaned checkpoint data.\r\n if (fs.existsSync(checkpointsPath)) {\r\n try {\r\n fs.rmSync(checkpointsPath, { recursive: true, force: true });\r\n } catch {\r\n // Ignore cleanup errors for missing chats.\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n try {\r\n fs.unlinkSync(chatPath);\r\n if (fs.existsSync(checkpointsPath)) {\r\n fs.rmSync(checkpointsPath, { recursive: true, force: true });\r\n }\r\n\r\n // Remove from index\r\n this.chatIndex.delete(chatId);\r\n this.saveIndex();\r\n\r\n return true;\r\n } catch (error) {\r\n logError(`Failed to delete chat ${chatId}`, error as Error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Import a full chat object (used for restoring from cloud sync)\r\n * Overwrites existing chat with same ID if present\r\n */\r\n importChat(chat: LocalChat): boolean {\r\n if (!chat || !chat.id) {\r\n return false;\r\n }\r\n\r\n try {\r\n const chatPath = this.getChatPath(chat.id);\r\n\r\n // Ensure the chat has required fields\r\n const now = new Date().toISOString();\r\n const importedChat: LocalChat = {\r\n id: chat.id,\r\n title: chat.title || 'Imported Chat',\r\n createdAt: chat.createdAt || now,\r\n updatedAt: now, // Always update the timestamp on import\r\n messageCount: chat.messages?.length || chat.messageCount || 0,\r\n messages: chat.messages || [],\r\n uiMessages: chat.uiMessages,\r\n cwd: chat.cwd,\r\n remoteContext: chat.remoteContext,\r\n remoteContextStack: chat.remoteContextStack,\r\n checkpointIndex: chat.checkpointIndex,\r\n backendConversationId: chat.backendConversationId,\r\n environment: chat.environment,\r\n };\r\n\r\n fs.writeFileSync(chatPath, JSON.stringify(importedChat, null, 2), 'utf-8');\r\n\r\n // Update the index\r\n this.updateIndexEntry(importedChat);\r\n\r\n return true;\r\n } catch (error) {\r\n logError(`Failed to import chat ${chat.id}`, error as Error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Rename a chat by ID\r\n */\r\n renameChat(chatId: string, newTitle: string): boolean {\r\n const chat = this.loadChat(chatId);\r\n if (!chat) {\r\n return false;\r\n }\r\n\r\n try {\r\n chat.title = newTitle;\r\n chat.updatedAt = new Date().toISOString();\r\n const chatPath = this.getChatPath(chatId);\r\n fs.writeFileSync(chatPath, JSON.stringify(chat, null, 2), 'utf-8');\r\n\r\n // Update the index\r\n this.updateIndexEntry(chat);\r\n\r\n return true;\r\n } catch (error) {\r\n logError(`Failed to rename chat ${chatId}`, error as Error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Get the chats directory path\r\n */\r\n getChatsDir(): string {\r\n return this.chatsDir;\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const localChatStorage = new LocalChatStorage();\r\n"],"mappings":"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","names":[]}
|
|
@@ -1,239 +1,231 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Manages agent-controlled shell sessions, detecting when input is required
|
|
5
|
-
* and coordinating with the AI to provide appropriate responses.
|
|
6
|
-
*/
|
|
7
|
-
import { detectInputRequirement, extractPromptContext, getInputTypeDescription } from './input-requirement-detector.js';
|
|
8
|
-
import { quickLog } from '../utils/conversation-logger.js';
|
|
9
|
-
/**
|
|
10
|
-
* Monitored Shell Manager
|
|
11
|
-
*
|
|
12
|
-
* Handles tracking of agent-controlled shells and coordinating input detection.
|
|
13
|
-
*/
|
|
1
|
+
import { detectInputRequirement, extractPromptContext, getInputTypeDescription } from "./input-requirement-detector.js";
|
|
2
|
+
import { quickLog } from "../utils/conversation-logger.js";
|
|
14
3
|
class MonitoredShellManagerClass {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
4
|
+
sessions = /* @__PURE__ */ new Map();
|
|
5
|
+
onAIInputRequest;
|
|
6
|
+
onMonitoringMessage;
|
|
7
|
+
inputCheckIntervalMs = 500;
|
|
8
|
+
shellIdCounter = 0;
|
|
9
|
+
/**
|
|
10
|
+
* Generate a unique shell ID
|
|
11
|
+
*/
|
|
12
|
+
generateShellId() {
|
|
13
|
+
this.shellIdCounter++;
|
|
14
|
+
return `shell-${Date.now()}-${this.shellIdCounter}`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Set the callback for requesting AI input
|
|
18
|
+
*/
|
|
19
|
+
setOnAIInputRequest(callback) {
|
|
20
|
+
this.onAIInputRequest = callback;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Set the callback for new monitoring messages
|
|
24
|
+
*/
|
|
25
|
+
setOnMonitoringMessage(callback) {
|
|
26
|
+
this.onMonitoringMessage = callback;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Start monitoring a shell session
|
|
30
|
+
*/
|
|
31
|
+
startMonitoring(shellId, command, cwd, onInputRequired) {
|
|
32
|
+
this.stopMonitoring(shellId);
|
|
33
|
+
const session = {
|
|
34
|
+
shellId,
|
|
35
|
+
command,
|
|
36
|
+
cwd,
|
|
37
|
+
output: "",
|
|
38
|
+
isRunning: true,
|
|
39
|
+
lastOutputTime: Date.now(),
|
|
40
|
+
monitoringMessages: [],
|
|
41
|
+
onInputRequired
|
|
42
|
+
};
|
|
43
|
+
session.inputCheckInterval = setInterval(() => {
|
|
44
|
+
this.checkForInputRequirement(shellId);
|
|
45
|
+
}, this.inputCheckIntervalMs);
|
|
46
|
+
this.sessions.set(shellId, session);
|
|
47
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [MonitoredShellManager] Started monitoring shell ${shellId}: ${command}
|
|
48
|
+
`);
|
|
49
|
+
return session;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Stop monitoring a shell session
|
|
53
|
+
*/
|
|
54
|
+
stopMonitoring(shellId) {
|
|
55
|
+
const session = this.sessions.get(shellId);
|
|
56
|
+
if (session) {
|
|
57
|
+
if (session.inputCheckInterval) {
|
|
58
|
+
clearInterval(session.inputCheckInterval);
|
|
59
|
+
}
|
|
60
|
+
this.sessions.delete(shellId);
|
|
61
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [MonitoredShellManager] Stopped monitoring shell ${shellId}
|
|
62
|
+
`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Update shell output for a monitored session
|
|
67
|
+
*/
|
|
68
|
+
updateOutput(shellId, newOutput) {
|
|
69
|
+
const session = this.sessions.get(shellId);
|
|
70
|
+
if (session) {
|
|
71
|
+
session.output += newOutput;
|
|
72
|
+
session.lastOutputTime = Date.now();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Mark a shell session as complete
|
|
77
|
+
*/
|
|
78
|
+
markComplete(shellId) {
|
|
79
|
+
const session = this.sessions.get(shellId);
|
|
80
|
+
if (session) {
|
|
81
|
+
session.isRunning = false;
|
|
82
|
+
this.stopMonitoring(shellId);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get a session by ID
|
|
87
|
+
*/
|
|
88
|
+
getSession(shellId) {
|
|
89
|
+
return this.sessions.get(shellId);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if a specific shell session is active
|
|
93
|
+
*/
|
|
94
|
+
isSessionActive(shellId) {
|
|
95
|
+
return this.sessions.has(shellId);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get all active shell IDs
|
|
99
|
+
*/
|
|
100
|
+
getActiveShellIds() {
|
|
101
|
+
return Array.from(this.sessions.keys());
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Add a monitoring message to a session
|
|
105
|
+
*/
|
|
106
|
+
addMonitoringMessage(shellId, type, content) {
|
|
107
|
+
const session = this.sessions.get(shellId);
|
|
108
|
+
const message = {
|
|
109
|
+
id: `msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
110
|
+
type,
|
|
111
|
+
content,
|
|
112
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
113
|
+
};
|
|
114
|
+
if (session) {
|
|
115
|
+
session.monitoringMessages.push(message);
|
|
116
|
+
if (this.onMonitoringMessage) {
|
|
117
|
+
this.onMonitoringMessage(shellId, message);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return message;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get monitoring messages for a session
|
|
124
|
+
*/
|
|
125
|
+
getMonitoringMessages(shellId) {
|
|
126
|
+
return this.sessions.get(shellId)?.monitoringMessages || [];
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Clear monitoring messages for a session
|
|
130
|
+
*/
|
|
131
|
+
clearMonitoringMessages(shellId) {
|
|
132
|
+
const session = this.sessions.get(shellId);
|
|
133
|
+
if (session) {
|
|
134
|
+
session.monitoringMessages = [];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Mark the most recent 'thinking' message as answered
|
|
139
|
+
* This changes the spinner to a tick in the UI
|
|
140
|
+
*/
|
|
141
|
+
markLastThinkingAsAnswered(shellId) {
|
|
142
|
+
const session = this.sessions.get(shellId);
|
|
143
|
+
if (session) {
|
|
144
|
+
for (let i = session.monitoringMessages.length - 1; i >= 0; i--) {
|
|
145
|
+
const msg = session.monitoringMessages[i];
|
|
146
|
+
if (msg.type === "thinking" && !msg.isAnswered) {
|
|
147
|
+
msg.isAnswered = true;
|
|
148
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [MonitoredShellManager] Marked message ${msg.id} as answered
|
|
149
|
+
`);
|
|
150
|
+
break;
|
|
84
151
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
content,
|
|
123
|
-
timestamp: new Date()
|
|
124
|
-
};
|
|
125
|
-
if (session) {
|
|
126
|
-
session.monitoringMessages.push(message);
|
|
127
|
-
// Callback to notify UI
|
|
128
|
-
if (this.onMonitoringMessage) {
|
|
129
|
-
this.onMonitoringMessage(shellId, message);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return message;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Get monitoring messages for a session
|
|
136
|
-
*/
|
|
137
|
-
getMonitoringMessages(shellId) {
|
|
138
|
-
return this.sessions.get(shellId)?.monitoringMessages || [];
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Clear monitoring messages for a session
|
|
142
|
-
*/
|
|
143
|
-
clearMonitoringMessages(shellId) {
|
|
144
|
-
const session = this.sessions.get(shellId);
|
|
145
|
-
if (session) {
|
|
146
|
-
session.monitoringMessages = [];
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Mark the most recent 'thinking' message as answered
|
|
151
|
-
* This changes the spinner to a tick in the UI
|
|
152
|
-
*/
|
|
153
|
-
markLastThinkingAsAnswered(shellId) {
|
|
154
|
-
const session = this.sessions.get(shellId);
|
|
155
|
-
if (session) {
|
|
156
|
-
// Find the last 'thinking' message that isn't already answered
|
|
157
|
-
for (let i = session.monitoringMessages.length - 1; i >= 0; i--) {
|
|
158
|
-
const msg = session.monitoringMessages[i];
|
|
159
|
-
if (msg.type === 'thinking' && !msg.isAnswered) {
|
|
160
|
-
msg.isAnswered = true;
|
|
161
|
-
quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Marked message ${msg.id} as answered\n`);
|
|
162
|
-
break;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Check if a shell requires input and trigger AI prompt if needed
|
|
169
|
-
*/
|
|
170
|
-
async checkForInputRequirement(shellId) {
|
|
171
|
-
const session = this.sessions.get(shellId);
|
|
172
|
-
if (!session || !session.isRunning) {
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
const timeSinceLastOutput = Date.now() - session.lastOutputTime;
|
|
176
|
-
const result = detectInputRequirement(session.output, timeSinceLastOutput);
|
|
177
|
-
if (result.requiresInput && result.confidence !== 'low') {
|
|
178
|
-
quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Input detected for ${shellId}: ${result.matchedPattern}\n`);
|
|
179
|
-
// Notify session callback
|
|
180
|
-
if (session.onInputRequired) {
|
|
181
|
-
session.onInputRequired(session, result);
|
|
182
|
-
}
|
|
183
|
-
// Request AI input
|
|
184
|
-
if (this.onAIInputRequest) {
|
|
185
|
-
const promptContext = extractPromptContext(session.output);
|
|
186
|
-
const inputType = getInputTypeDescription(result);
|
|
187
|
-
// Add "thinking" message
|
|
188
|
-
this.addMonitoringMessage(shellId, 'thinking', 'Analyzing shell prompt...');
|
|
189
|
-
try {
|
|
190
|
-
const aiInput = await this.onAIInputRequest(shellId, session.output, promptContext, inputType);
|
|
191
|
-
if (aiInput !== null) {
|
|
192
|
-
// Add message showing what input was sent
|
|
193
|
-
this.addMonitoringMessage(shellId, 'input_sent', `Sent input: ${aiInput}`);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
catch (error) {
|
|
197
|
-
quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Error requesting AI input: ${error.message}\n`);
|
|
198
|
-
this.addMonitoringMessage(shellId, 'text', `Error: ${error.message}`);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Check if a shell requires input and trigger AI prompt if needed
|
|
157
|
+
*/
|
|
158
|
+
async checkForInputRequirement(shellId) {
|
|
159
|
+
const session = this.sessions.get(shellId);
|
|
160
|
+
if (!session || !session.isRunning) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const timeSinceLastOutput = Date.now() - session.lastOutputTime;
|
|
164
|
+
const result = detectInputRequirement(session.output, timeSinceLastOutput);
|
|
165
|
+
if (result.requiresInput && result.confidence !== "low") {
|
|
166
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [MonitoredShellManager] Input detected for ${shellId}: ${result.matchedPattern}
|
|
167
|
+
`);
|
|
168
|
+
if (session.onInputRequired) {
|
|
169
|
+
session.onInputRequired(session, result);
|
|
170
|
+
}
|
|
171
|
+
if (this.onAIInputRequest) {
|
|
172
|
+
const promptContext = extractPromptContext(session.output);
|
|
173
|
+
const inputType = getInputTypeDescription(result);
|
|
174
|
+
this.addMonitoringMessage(shellId, "thinking", "Analyzing shell prompt...");
|
|
175
|
+
try {
|
|
176
|
+
const aiInput = await this.onAIInputRequest(
|
|
177
|
+
shellId,
|
|
178
|
+
session.output,
|
|
179
|
+
promptContext,
|
|
180
|
+
inputType
|
|
181
|
+
);
|
|
182
|
+
if (aiInput !== null) {
|
|
183
|
+
this.addMonitoringMessage(shellId, "input_sent", `Sent input: ${aiInput}`);
|
|
184
|
+
}
|
|
185
|
+
} catch (error) {
|
|
186
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [MonitoredShellManager] Error requesting AI input: ${error.message}
|
|
187
|
+
`);
|
|
188
|
+
this.addMonitoringMessage(shellId, "text", `Error: ${error.message}`);
|
|
201
189
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
\`\`\`
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
**
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
- For
|
|
225
|
-
- For
|
|
226
|
-
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Build a prompt for the AI to provide shell input
|
|
195
|
+
* This is used when the AI needs to decide what to input
|
|
196
|
+
*/
|
|
197
|
+
buildInputPrompt(shellOutput, promptContext, inputType, originalCommand) {
|
|
198
|
+
return `The command "${originalCommand}" is currently running and requires user input.
|
|
199
|
+
|
|
200
|
+
**Current shell output (last 50 lines):**
|
|
201
|
+
\`\`\`
|
|
202
|
+
${this.getLastNLines(shellOutput, 50)}
|
|
203
|
+
\`\`\`
|
|
204
|
+
|
|
205
|
+
**The command is asking for:** ${promptContext}
|
|
206
|
+
|
|
207
|
+
**Expected input type:** ${inputType}
|
|
208
|
+
|
|
209
|
+
Please provide the appropriate input to respond to this prompt. Use the execute_command tool with the shell_input parameter to send your response.
|
|
210
|
+
|
|
211
|
+
Guidelines:
|
|
212
|
+
- For yes/no prompts, respond with "y" or "n" (or "yes"/"no" if the prompt requires full words)
|
|
213
|
+
- For password prompts, you should NOT provide passwords - ask the user to handle this manually
|
|
214
|
+
- For npm init style prompts, provide reasonable defaults or press Enter for default values
|
|
215
|
+
- For other prompts, provide the most appropriate response based on context
|
|
216
|
+
|
|
227
217
|
If this appears to be a security-sensitive prompt (passwords, authentication), respond with a message indicating the user should handle this manually.`;
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Get the last N lines of output
|
|
221
|
+
*/
|
|
222
|
+
getLastNLines(text, n) {
|
|
223
|
+
const lines = text.split("\n");
|
|
224
|
+
return lines.slice(-n).join("\n");
|
|
225
|
+
}
|
|
236
226
|
}
|
|
237
|
-
|
|
238
|
-
export
|
|
227
|
+
const MonitoredShellManager = new MonitoredShellManagerClass();
|
|
228
|
+
export {
|
|
229
|
+
MonitoredShellManager
|
|
230
|
+
};
|
|
239
231
|
//# sourceMappingURL=monitored-shell-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monitored-shell-manager.js","sourceRoot":"","sources":["../../src/services/monitored-shell-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,uBAAuB,EAAkD,MAAM,iCAAiC,CAAC;AACxK,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAsC3D;;;;GAIG;AACH,MAAM,0BAA0B;IACpB,QAAQ,GAAuC,IAAI,GAAG,EAAE,CAAC;IACzD,gBAAgB,CAA4B;IAC5C,mBAAmB,CAAsD;IACzE,oBAAoB,GAAW,GAAG,CAAC;IACnC,cAAc,GAAW,CAAC,CAAC;IAEnC;;OAEG;IACH,eAAe;QACX,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,QAAkC;QAClD,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,QAA4D;QAC/E,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,eAAe,CACX,OAAe,EACf,OAAe,EACf,GAAW,EACX,eAAiG;QAEjG,iDAAiD;QACjD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAE7B,MAAM,OAAO,GAA0B;YACnC,OAAO;YACP,OAAO;YACP,GAAG;YACH,MAAM,EAAE,EAAE;YACV,SAAS,EAAE,IAAI;YACf,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE;YAC1B,kBAAkB,EAAE,EAAE;YACtB,eAAe;SAClB,CAAC;QAEF,iCAAiC;QACjC,OAAO,CAAC,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;YAC1C,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAE9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEpC,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,sDAAsD,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC;QAEpH,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAe;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;gBAC7B,aAAa,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9B,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,sDAAsD,OAAO,IAAI,CAAC,CAAC;QAC5G,CAAC;IACL,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAe,EAAE,SAAiB;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;YAC5B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAe;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAe;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAe;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,iBAAiB;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,OAAe,EAAE,IAA4B,EAAE,OAAe;QAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAmB;YAC5B,EAAE,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YAClE,IAAI;YACJ,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE;SACxB,CAAC;QAEF,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEzC,wBAAwB;YACxB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,OAAe;QACjC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,kBAAkB,IAAI,EAAE,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,OAAe;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,kBAAkB,GAAG,EAAE,CAAC;QACpC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,0BAA0B,CAAC,OAAe;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,OAAO,EAAE,CAAC;YACV,+DAA+D;YAC/D,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;gBAC1C,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;oBAC7C,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;oBACtB,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,4CAA4C,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC;oBACzG,MAAM;gBACV,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,wBAAwB,CAAC,OAAe;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACjC,OAAO;QACX,CAAC;QAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC;QAChE,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAE3E,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;YACtD,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,gDAAgD,OAAO,KAAK,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC;YAE5H,0BAA0B;YAC1B,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;gBAC1B,OAAO,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7C,CAAC;YAED,mBAAmB;YACnB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC3D,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;gBAElD,yBAAyB;gBACzB,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,2BAA2B,CAAC,CAAC;gBAE5E,IAAI,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACvC,OAAO,EACP,OAAO,CAAC,MAAM,EACd,aAAa,EACb,SAAS,CACZ,CAAC;oBAEF,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;wBACnB,0CAA0C;wBAC1C,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,YAAY,EAAE,eAAe,OAAO,EAAE,CAAC,CAAC;oBAC/E,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBAClB,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,wDAAwD,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;oBAChH,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,WAAmB,EAAE,aAAqB,EAAE,SAAiB,EAAE,eAAuB;QACnG,OAAO,gBAAgB,eAAe;;;;EAI5C,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC;;;iCAGJ,aAAa;;2BAEnB,SAAS;;;;;;;;;;uJAUmH,CAAC;IACpJ,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,IAAY,EAAE,CAAS;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CACJ;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,0BAA0B,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"sources":["../../src/services/monitored-shell-manager.ts"],"sourcesContent":["/**\r\n * Monitored Shell Manager Service\r\n * \r\n * Manages agent-controlled shell sessions, detecting when input is required\r\n * and coordinating with the AI to provide appropriate responses.\r\n */\r\n\r\nimport { detectInputRequirement, extractPromptContext, getInputTypeDescription, InputDetectionResult, DEFAULT_STALL_TIMEOUT_MS } from './input-requirement-detector.js';\r\nimport { quickLog } from '../utils/conversation-logger.js';\r\n\r\n/**\r\n * Represents a message displayed during monitoring mode\r\n */\r\nexport interface MonitorMessage {\r\n id: string;\r\n type: 'thinking' | 'tool_call' | 'text' | 'input_sent';\r\n content: string;\r\n timestamp: Date;\r\n isAnswered?: boolean; // For 'thinking' type: true when the prompt has been answered\r\n}\r\n\r\n/**\r\n * Represents an active monitored shell session\r\n */\r\nexport interface MonitoredShellSession {\r\n shellId: string;\r\n command: string;\r\n cwd: string;\r\n output: string;\r\n isRunning: boolean;\r\n lastOutputTime: number;\r\n monitoringMessages: MonitorMessage[];\r\n inputCheckInterval?: NodeJS.Timeout;\r\n onInputRequired?: (session: MonitoredShellSession, detectionResult: InputDetectionResult) => void;\r\n}\r\n\r\n/**\r\n * Callback when the AI needs to be prompted for shell input\r\n */\r\nexport type OnAIInputRequestCallback = (\r\n shellId: string,\r\n shellOutput: string,\r\n promptContext: string,\r\n inputType: string\r\n) => Promise<string | null>;\r\n\r\n/**\r\n * Monitored Shell Manager\r\n * \r\n * Handles tracking of agent-controlled shells and coordinating input detection.\r\n */\r\nclass MonitoredShellManagerClass {\r\n private sessions: Map<string, MonitoredShellSession> = new Map();\r\n private onAIInputRequest?: OnAIInputRequestCallback;\r\n private onMonitoringMessage?: (shellId: string, message: MonitorMessage) => void;\r\n private inputCheckIntervalMs: number = 500;\r\n private shellIdCounter: number = 0;\r\n\r\n /**\r\n * Generate a unique shell ID\r\n */\r\n generateShellId(): string {\r\n this.shellIdCounter++;\r\n return `shell-${Date.now()}-${this.shellIdCounter}`;\r\n }\r\n\r\n /**\r\n * Set the callback for requesting AI input\r\n */\r\n setOnAIInputRequest(callback: OnAIInputRequestCallback): void {\r\n this.onAIInputRequest = callback;\r\n }\r\n\r\n /**\r\n * Set the callback for new monitoring messages\r\n */\r\n setOnMonitoringMessage(callback: (shellId: string, message: MonitorMessage) => void): void {\r\n this.onMonitoringMessage = callback;\r\n }\r\n\r\n /**\r\n * Start monitoring a shell session\r\n */\r\n startMonitoring(\r\n shellId: string,\r\n command: string,\r\n cwd: string,\r\n onInputRequired?: (session: MonitoredShellSession, detectionResult: InputDetectionResult) => void\r\n ): MonitoredShellSession {\r\n // Clean up any existing session with the same ID\r\n this.stopMonitoring(shellId);\r\n\r\n const session: MonitoredShellSession = {\r\n shellId,\r\n command,\r\n cwd,\r\n output: '',\r\n isRunning: true,\r\n lastOutputTime: Date.now(),\r\n monitoringMessages: [],\r\n onInputRequired\r\n };\r\n\r\n // Start periodic input detection\r\n session.inputCheckInterval = setInterval(() => {\r\n this.checkForInputRequirement(shellId);\r\n }, this.inputCheckIntervalMs);\r\n\r\n this.sessions.set(shellId, session);\r\n\r\n quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Started monitoring shell ${shellId}: ${command}\\n`);\r\n\r\n return session;\r\n }\r\n\r\n /**\r\n * Stop monitoring a shell session\r\n */\r\n stopMonitoring(shellId: string): void {\r\n const session = this.sessions.get(shellId);\r\n if (session) {\r\n if (session.inputCheckInterval) {\r\n clearInterval(session.inputCheckInterval);\r\n }\r\n this.sessions.delete(shellId);\r\n quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Stopped monitoring shell ${shellId}\\n`);\r\n }\r\n }\r\n\r\n /**\r\n * Update shell output for a monitored session\r\n */\r\n updateOutput(shellId: string, newOutput: string): void {\r\n const session = this.sessions.get(shellId);\r\n if (session) {\r\n session.output += newOutput;\r\n session.lastOutputTime = Date.now();\r\n }\r\n }\r\n\r\n /**\r\n * Mark a shell session as complete\r\n */\r\n markComplete(shellId: string): void {\r\n const session = this.sessions.get(shellId);\r\n if (session) {\r\n session.isRunning = false;\r\n this.stopMonitoring(shellId);\r\n }\r\n }\r\n\r\n /**\r\n * Get a session by ID\r\n */\r\n getSession(shellId: string): MonitoredShellSession | undefined {\r\n return this.sessions.get(shellId);\r\n }\r\n\r\n /**\r\n * Check if a specific shell session is active\r\n */\r\n isSessionActive(shellId: string): boolean {\r\n return this.sessions.has(shellId);\r\n }\r\n\r\n /**\r\n * Get all active shell IDs\r\n */\r\n getActiveShellIds(): string[] {\r\n return Array.from(this.sessions.keys());\r\n }\r\n\r\n /**\r\n * Add a monitoring message to a session\r\n */\r\n addMonitoringMessage(shellId: string, type: MonitorMessage['type'], content: string): MonitorMessage {\r\n const session = this.sessions.get(shellId);\r\n const message: MonitorMessage = {\r\n id: `msg-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\r\n type,\r\n content,\r\n timestamp: new Date()\r\n };\r\n\r\n if (session) {\r\n session.monitoringMessages.push(message);\r\n\r\n // Callback to notify UI\r\n if (this.onMonitoringMessage) {\r\n this.onMonitoringMessage(shellId, message);\r\n }\r\n }\r\n\r\n return message;\r\n }\r\n\r\n /**\r\n * Get monitoring messages for a session\r\n */\r\n getMonitoringMessages(shellId: string): MonitorMessage[] {\r\n return this.sessions.get(shellId)?.monitoringMessages || [];\r\n }\r\n\r\n /**\r\n * Clear monitoring messages for a session\r\n */\r\n clearMonitoringMessages(shellId: string): void {\r\n const session = this.sessions.get(shellId);\r\n if (session) {\r\n session.monitoringMessages = [];\r\n }\r\n }\r\n\r\n /**\r\n * Mark the most recent 'thinking' message as answered\r\n * This changes the spinner to a tick in the UI\r\n */\r\n markLastThinkingAsAnswered(shellId: string): void {\r\n const session = this.sessions.get(shellId);\r\n if (session) {\r\n // Find the last 'thinking' message that isn't already answered\r\n for (let i = session.monitoringMessages.length - 1; i >= 0; i--) {\r\n const msg = session.monitoringMessages[i];\r\n if (msg.type === 'thinking' && !msg.isAnswered) {\r\n msg.isAnswered = true;\r\n quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Marked message ${msg.id} as answered\\n`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Check if a shell requires input and trigger AI prompt if needed\r\n */\r\n private async checkForInputRequirement(shellId: string): Promise<void> {\r\n const session = this.sessions.get(shellId);\r\n if (!session || !session.isRunning) {\r\n return;\r\n }\r\n\r\n const timeSinceLastOutput = Date.now() - session.lastOutputTime;\r\n const result = detectInputRequirement(session.output, timeSinceLastOutput);\r\n\r\n if (result.requiresInput && result.confidence !== 'low') {\r\n quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Input detected for ${shellId}: ${result.matchedPattern}\\n`);\r\n\r\n // Notify session callback\r\n if (session.onInputRequired) {\r\n session.onInputRequired(session, result);\r\n }\r\n\r\n // Request AI input\r\n if (this.onAIInputRequest) {\r\n const promptContext = extractPromptContext(session.output);\r\n const inputType = getInputTypeDescription(result);\r\n\r\n // Add \"thinking\" message\r\n this.addMonitoringMessage(shellId, 'thinking', 'Analyzing shell prompt...');\r\n\r\n try {\r\n const aiInput = await this.onAIInputRequest(\r\n shellId,\r\n session.output,\r\n promptContext,\r\n inputType\r\n );\r\n\r\n if (aiInput !== null) {\r\n // Add message showing what input was sent\r\n this.addMonitoringMessage(shellId, 'input_sent', `Sent input: ${aiInput}`);\r\n }\r\n } catch (error: any) {\r\n quickLog(`[${new Date().toISOString()}] [MonitoredShellManager] Error requesting AI input: ${error.message}\\n`);\r\n this.addMonitoringMessage(shellId, 'text', `Error: ${error.message}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Build a prompt for the AI to provide shell input\r\n * This is used when the AI needs to decide what to input\r\n */\r\n buildInputPrompt(shellOutput: string, promptContext: string, inputType: string, originalCommand: string): string {\r\n return `The command \"${originalCommand}\" is currently running and requires user input.\r\n\r\n**Current shell output (last 50 lines):**\r\n\\`\\`\\`\r\n${this.getLastNLines(shellOutput, 50)}\r\n\\`\\`\\`\r\n\r\n**The command is asking for:** ${promptContext}\r\n\r\n**Expected input type:** ${inputType}\r\n\r\nPlease provide the appropriate input to respond to this prompt. Use the execute_command tool with the shell_input parameter to send your response.\r\n\r\nGuidelines:\r\n- For yes/no prompts, respond with \"y\" or \"n\" (or \"yes\"/\"no\" if the prompt requires full words)\r\n- For password prompts, you should NOT provide passwords - ask the user to handle this manually\r\n- For npm init style prompts, provide reasonable defaults or press Enter for default values\r\n- For other prompts, provide the most appropriate response based on context\r\n\r\nIf this appears to be a security-sensitive prompt (passwords, authentication), respond with a message indicating the user should handle this manually.`;\r\n }\r\n\r\n /**\r\n * Get the last N lines of output\r\n */\r\n private getLastNLines(text: string, n: number): string {\r\n const lines = text.split('\\n');\r\n return lines.slice(-n).join('\\n');\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const MonitoredShellManager = new MonitoredShellManagerClass();\r\n"],"mappings":"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","names":[]}
|