centaurus-cli 2.9.2 → 2.9.4
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/cli-adapter.d.ts +78 -11
- package/dist/cli-adapter.d.ts.map +1 -1
- package/dist/cli-adapter.js +851 -215
- package/dist/cli-adapter.js.map +1 -1
- package/dist/commands/CommandParser.d.ts +1 -1
- package/dist/commands/CommandParser.d.ts.map +1 -1
- package/dist/commands/CommandParser.js +113 -0
- package/dist/commands/CommandParser.js.map +1 -1
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +2 -0
- package/dist/config/models.js.map +1 -1
- package/dist/config/slash-commands.d.ts +5 -0
- package/dist/config/slash-commands.d.ts.map +1 -1
- package/dist/config/slash-commands.js +63 -1
- package/dist/config/slash-commands.js.map +1 -1
- package/dist/config/types.d.ts +2 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +1 -0
- package/dist/config/types.js.map +1 -1
- package/dist/context/context-manager.d.ts +1 -1
- package/dist/context/context-manager.d.ts.map +1 -1
- package/dist/context/context-manager.js +3 -1
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/handlers/docker-handler.d.ts +9 -0
- package/dist/context/handlers/docker-handler.d.ts.map +1 -1
- package/dist/context/handlers/docker-handler.js +99 -10
- package/dist/context/handlers/docker-handler.js.map +1 -1
- package/dist/context/handlers/ssh-handler.d.ts +20 -0
- package/dist/context/handlers/ssh-handler.d.ts.map +1 -1
- package/dist/context/handlers/ssh-handler.js +129 -1
- package/dist/context/handlers/ssh-handler.js.map +1 -1
- package/dist/context/subshell-handler.d.ts +15 -0
- package/dist/context/subshell-handler.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/services/ai-autocomplete-agent.d.ts +39 -0
- package/dist/services/ai-autocomplete-agent.d.ts.map +1 -0
- package/dist/services/ai-autocomplete-agent.js +189 -0
- package/dist/services/ai-autocomplete-agent.js.map +1 -0
- package/dist/services/ai-service-client.d.ts +25 -0
- package/dist/services/ai-service-client.d.ts.map +1 -1
- package/dist/services/ai-service-client.js +195 -12
- package/dist/services/ai-service-client.js.map +1 -1
- package/dist/services/api-client.js +1 -1
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/auth-handler.js +1 -1
- package/dist/services/auth-handler.js.map +1 -1
- package/dist/services/local-chat-storage.d.ts +21 -0
- package/dist/services/local-chat-storage.d.ts.map +1 -1
- package/dist/services/local-chat-storage.js +138 -43
- package/dist/services/local-chat-storage.js.map +1 -1
- package/dist/services/ollama-service.d.ts +197 -0
- package/dist/services/ollama-service.d.ts.map +1 -0
- package/dist/services/ollama-service.js +324 -0
- package/dist/services/ollama-service.js.map +1 -0
- package/dist/services/warpify-detector.d.ts +43 -0
- package/dist/services/warpify-detector.d.ts.map +1 -0
- package/dist/services/warpify-detector.js +203 -0
- package/dist/services/warpify-detector.js.map +1 -0
- package/dist/services/workflow-storage.d.ts +72 -0
- package/dist/services/workflow-storage.d.ts.map +1 -0
- package/dist/services/workflow-storage.js +239 -0
- package/dist/services/workflow-storage.js.map +1 -0
- package/dist/tools/command.d.ts.map +1 -1
- package/dist/tools/command.js +14 -0
- package/dist/tools/command.js.map +1 -1
- package/dist/tools/enter-remote-session.d.ts +13 -0
- package/dist/tools/enter-remote-session.d.ts.map +1 -0
- package/dist/tools/enter-remote-session.js +226 -0
- package/dist/tools/enter-remote-session.js.map +1 -0
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +9 -2
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/grep-search.d.ts +104 -31
- package/dist/tools/grep-search.d.ts.map +1 -1
- package/dist/tools/grep-search.js +699 -430
- package/dist/tools/grep-search.js.map +1 -1
- package/dist/tools/workflow-tool.d.ts +11 -0
- package/dist/tools/workflow-tool.d.ts.map +1 -0
- package/dist/tools/workflow-tool.js +87 -0
- package/dist/tools/workflow-tool.js.map +1 -0
- package/dist/types/workflow.d.ts +110 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +8 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/ui/components/App.d.ts +12 -3
- package/dist/ui/components/App.d.ts.map +1 -1
- package/dist/ui/components/App.js +162 -6
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/Breadcrumbs.d.ts +4 -3
- package/dist/ui/components/Breadcrumbs.d.ts.map +1 -1
- package/dist/ui/components/Breadcrumbs.js +60 -54
- package/dist/ui/components/Breadcrumbs.js.map +1 -1
- package/dist/ui/components/ConnectionStatusMessage.js +2 -2
- package/dist/ui/components/ConnectionStatusMessage.js.map +1 -1
- package/dist/ui/components/InputBox.d.ts +3 -0
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +488 -20
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/InteractiveShell.d.ts +2 -0
- package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
- package/dist/ui/components/InteractiveShell.js +13 -3
- package/dist/ui/components/InteractiveShell.js.map +1 -1
- package/dist/ui/components/MultiLineInput.d.ts.map +1 -1
- package/dist/ui/components/MultiLineInput.js +68 -2
- package/dist/ui/components/MultiLineInput.js.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.js +169 -26
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/ui/components/WorkflowCreatorScreen.d.ts +25 -0
- package/dist/ui/components/WorkflowCreatorScreen.d.ts.map +1 -0
- package/dist/ui/components/WorkflowCreatorScreen.js +164 -0
- package/dist/ui/components/WorkflowCreatorScreen.js.map +1 -0
- package/dist/utils/command-history.d.ts +12 -2
- package/dist/utils/command-history.d.ts.map +1 -1
- package/dist/utils/command-history.js +57 -13
- package/dist/utils/command-history.js.map +1 -1
- package/dist/utils/input-classifier.d.ts.map +1 -1
- package/dist/utils/input-classifier.js +3 -2
- package/dist/utils/input-classifier.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useState, useCallback } from 'react';
|
|
1
|
+
import React, { useState, useCallback, useMemo } from 'react';
|
|
2
2
|
import { Box, Text, useApp, useInput, Static } from 'ink';
|
|
3
3
|
import SelectInput from 'ink-select-input';
|
|
4
4
|
import { CircularSelectInput } from './CircularSelectInput.js';
|
|
@@ -27,17 +27,20 @@ import { PlanAcceptedMessage } from './PlanAcceptedMessage.js';
|
|
|
27
27
|
import { MCPAddScreen } from './MCPAddScreen.js';
|
|
28
28
|
import { MCPServerListScreen } from './MCPServerListScreen.js';
|
|
29
29
|
import { MCPListScreen } from './MCPListScreen.js';
|
|
30
|
+
import { WorkflowCreatorScreen } from './WorkflowCreatorScreen.js';
|
|
30
31
|
import { processTerminalOutput } from '../../utils/terminal-output.js';
|
|
31
32
|
import { BackgroundTaskManager } from '../../services/background-task-manager.js';
|
|
32
33
|
import { MonitorModeAIPanel } from './MonitorModeAIPanel.js';
|
|
33
34
|
import { detectInputRequirement, extractPromptContext, getInputTypeDescription } from '../../services/input-requirement-detector.js';
|
|
34
35
|
import { ShellInputAgent } from '../../services/shell-input-agent.js';
|
|
35
36
|
import { InputDetectionAgent } from '../../services/input-detection-agent.js';
|
|
37
|
+
import { detectWarpifySession, getSessionDescription } from '../../services/warpify-detector.js';
|
|
36
38
|
import { useConnectivity } from '../../hooks/useConnectivity.js';
|
|
37
39
|
import { apiClient } from '../../services/api-client.js';
|
|
38
40
|
import { conversationManager } from '../../services/conversation-manager.js';
|
|
39
41
|
import { logDebug, logError } from '../../utils/logger.js';
|
|
40
42
|
import { getTerminalDimensions } from '../../hooks/useTerminalDimensions.js';
|
|
43
|
+
import { ConfigManager } from '../../config/manager.js';
|
|
41
44
|
// Banner item with stable timestamp - created once outside component
|
|
42
45
|
const BANNER_ITEM = { id: '__banner__', role: '__banner__', content: '', timestamp: new Date(0) };
|
|
43
46
|
const MessageList = React.memo(({ history, current, showBanner }) => {
|
|
@@ -146,7 +149,7 @@ const RenameInputScreen = ({ currentTitle, onRename, onCancel }) => {
|
|
|
146
149
|
React.createElement(Box, { marginTop: 1 },
|
|
147
150
|
React.createElement(Text, { dimColor: true }, "Press Enter to save, ESC to cancel"))));
|
|
148
151
|
};
|
|
149
|
-
export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode, onResponseReceived, onDirectMessage, onResponseStream, onClearStreamedResponse, onThoughtStream, onThoughtComplete, onPickerSetup, onPickerSelection, onToolExecutionUpdate, onToolApprovalRequest, onToolStreamingOutput, onPlanModeChange, onPlanApprovalRequest, onPlanCreated, onTaskCompleted, onCommandModeChange, onToggleCommandMode, onBackgroundModeChange, onToggleBackgroundMode, onBackgroundTaskCountChange, onSubAgentCountChange, onSetAutoModeSetup, onCwdChange, onModelChange, onSubshellContextChange, onPasswordRequest, onShellInput, onShellSignal, onKillProcess, onInteractiveEditorMode, onConnectionStatusUpdate, onTokenCountUpdate, onContextLimitReached, onChatPickerSetup, onChatPickerSelection, onChatDeletePickerSetup, onChatDeletePickerSelection, onChatListSetup, onChatRenamePickerSetup, onChatRename, onRestoreMessagesSetup, onUIMessageHistoryUpdate, onBackgroundTaskListSetup, onBackgroundTaskSelection, onBackgroundTaskCancelSetup, onBackgroundTaskCancel, onBackgroundTaskViewSetup, onSessionQuotaUpdate, onMCPAddScreenSetup, onMCPRemoveScreenSetup, onMCPEnableScreenSetup, onMCPDisableScreenSetup, onMCPListScreenSetup, onMCPAddServer, onMCPRemoveServer, onMCPEnableServer, onMCPDisableServer, onMCPValidateConfig, onPromptAnswered, getMainConversation }) => {
|
|
152
|
+
export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode, onResponseReceived, onDirectMessage, onResponseStream, onClearStreamedResponse, onThoughtStream, onThoughtComplete, onPickerSetup, onPickerSelection, onToolExecutionUpdate, onToolApprovalRequest, onToolStreamingOutput, onPlanModeChange, onPlanApprovalRequest, onPlanCreated, onTaskCompleted, onCommandModeChange, onToggleCommandMode, onBackgroundModeChange, onToggleBackgroundMode, onBackgroundTaskCountChange, onSubAgentCountChange, onSetAutoModeSetup, onCwdChange, onModelChange, onSubshellContextChange, onPasswordRequest, onShellInput, onShellSignal, onKillProcess, onInteractiveEditorMode, onConnectionStatusUpdate, onTokenCountUpdate, onContextLimitReached, onChatPickerSetup, onChatPickerSelection, onChatDeletePickerSetup, onChatDeletePickerSelection, onChatListSetup, onChatRenamePickerSetup, onChatRename, onRestoreMessagesSetup, onUIMessageHistoryUpdate, onBackgroundTaskListSetup, onBackgroundTaskSelection, onBackgroundTaskCancelSetup, onBackgroundTaskCancel, onBackgroundTaskViewSetup, onSessionQuotaUpdate, onMCPAddScreenSetup, onMCPRemoveScreenSetup, onMCPEnableScreenSetup, onMCPDisableScreenSetup, onMCPListScreenSetup, onMCPAddServer, onMCPRemoveServer, onMCPEnableServer, onMCPDisableServer, onMCPValidateConfig, onPromptAnswered, getMainConversation, onWarpifySession, onWorkflowCreatorSetup, onWorkflowSave }) => {
|
|
150
153
|
const { exit } = useApp();
|
|
151
154
|
// Calculate limit for paginated lists (75% of terminal height)
|
|
152
155
|
const listLimit = Math.max(5, Math.floor((process.stdout.rows || 24) * 0.75));
|
|
@@ -205,6 +208,7 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
205
208
|
showExitWarning: false,
|
|
206
209
|
commandHistory: [],
|
|
207
210
|
subshellContext: undefined,
|
|
211
|
+
subshellContextStack: undefined,
|
|
208
212
|
versionInfo: undefined,
|
|
209
213
|
checkingVersion: true,
|
|
210
214
|
isAiWorking: false,
|
|
@@ -222,6 +226,7 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
222
226
|
subAgentCount: 0,
|
|
223
227
|
sessionQuotaExhausted: false,
|
|
224
228
|
sessionQuotaTimeRemaining: '',
|
|
229
|
+
aiAutoSuggest: false,
|
|
225
230
|
});
|
|
226
231
|
// Track last terminal width to detect actual width changes
|
|
227
232
|
const lastTerminalWidthRef = React.useRef(process.stdout.columns || 80);
|
|
@@ -323,6 +328,14 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
323
328
|
React.useEffect(() => {
|
|
324
329
|
const loadModelsConfig = async () => {
|
|
325
330
|
try {
|
|
331
|
+
// Initialize ConfigManager to load general settings
|
|
332
|
+
const configManager = new ConfigManager();
|
|
333
|
+
const generalConfig = configManager.load();
|
|
334
|
+
setState(prev => ({
|
|
335
|
+
...prev,
|
|
336
|
+
aiAutoSuggest: generalConfig.aiAutoSuggest === true
|
|
337
|
+
}));
|
|
338
|
+
// Import quickLog for debugging
|
|
326
339
|
// Import quickLog for debugging
|
|
327
340
|
const { quickLog } = await import('../../utils/conversation-logger.js');
|
|
328
341
|
quickLog(`[${new Date().toISOString()}] [App] loadModelsConfig effect starting, currentModel: ${initialModel}\n`);
|
|
@@ -1033,6 +1046,18 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
1033
1046
|
}));
|
|
1034
1047
|
});
|
|
1035
1048
|
}, []); // Empty dependency array - only register once
|
|
1049
|
+
// Set up callback for Workflow Creator screen
|
|
1050
|
+
React.useEffect(() => {
|
|
1051
|
+
onWorkflowCreatorSetup((initialSteps) => {
|
|
1052
|
+
clearScreen();
|
|
1053
|
+
setState(prev => ({
|
|
1054
|
+
...prev,
|
|
1055
|
+
screen: 'workflow-creator',
|
|
1056
|
+
isLoading: false,
|
|
1057
|
+
workflowCreatorInitialSteps: initialSteps
|
|
1058
|
+
}));
|
|
1059
|
+
});
|
|
1060
|
+
}, []); // Empty dependency array - only register once
|
|
1036
1061
|
// Set up callback for MCP Remove screen
|
|
1037
1062
|
React.useEffect(() => {
|
|
1038
1063
|
onMCPRemoveScreenSetup((servers) => {
|
|
@@ -1680,10 +1705,11 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
1680
1705
|
}, [onModelChange]);
|
|
1681
1706
|
// Set up callback to receive subshell context changes
|
|
1682
1707
|
React.useEffect(() => {
|
|
1683
|
-
onSubshellContextChange((context) => {
|
|
1708
|
+
onSubshellContextChange((context, stack) => {
|
|
1684
1709
|
setState(prev => ({
|
|
1685
1710
|
...prev,
|
|
1686
|
-
subshellContext: context
|
|
1711
|
+
subshellContext: context,
|
|
1712
|
+
subshellContextStack: stack
|
|
1687
1713
|
}));
|
|
1688
1714
|
});
|
|
1689
1715
|
}, [onSubshellContextChange]);
|
|
@@ -2129,6 +2155,33 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
2129
2155
|
}
|
|
2130
2156
|
else if (!isSlashCommand) {
|
|
2131
2157
|
// Only add user message to display if it's not a slash command
|
|
2158
|
+
// INTERRUPT HANDLING: If AI is currently working, cancel and clean up first
|
|
2159
|
+
// This allows the new message to replace the interrupted turn
|
|
2160
|
+
if (state.isAiWorking || state.isLoading) {
|
|
2161
|
+
// Cancel current request (cli-adapter will clean up its history)
|
|
2162
|
+
onCancelRequest();
|
|
2163
|
+
// Small delay to allow abort to propagate before new request starts
|
|
2164
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
2165
|
+
// Clean up UI state: remove any partial/interrupted messages
|
|
2166
|
+
setState(prev => {
|
|
2167
|
+
// Filter out the last user message (the one we're replacing)
|
|
2168
|
+
let cleanedHistory = [...prev.messageHistory];
|
|
2169
|
+
for (let i = cleanedHistory.length - 1; i >= 0; i--) {
|
|
2170
|
+
if (cleanedHistory[i].role === 'user') {
|
|
2171
|
+
cleanedHistory.splice(i, 1);
|
|
2172
|
+
break; // Only remove the most recent user message
|
|
2173
|
+
}
|
|
2174
|
+
}
|
|
2175
|
+
return {
|
|
2176
|
+
...prev,
|
|
2177
|
+
messageHistory: cleanedHistory,
|
|
2178
|
+
currentMessage: null,
|
|
2179
|
+
isLoading: false,
|
|
2180
|
+
isAiWorking: false,
|
|
2181
|
+
approvalRequest: undefined, // Clear any pending approval
|
|
2182
|
+
};
|
|
2183
|
+
});
|
|
2184
|
+
}
|
|
2132
2185
|
// Show user message IMMEDIATELY with image breadcrumbs (uploading state)
|
|
2133
2186
|
// Images will be uploaded in background, then AI will be called
|
|
2134
2187
|
const hasImagesToUpload = clipboardImages && clipboardImages.length > 0;
|
|
@@ -2320,6 +2373,12 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
2320
2373
|
const handleInputValueChange = useCallback((value) => {
|
|
2321
2374
|
preservedInputTextRef.current = value;
|
|
2322
2375
|
}, []);
|
|
2376
|
+
// Memoize session commands to prevent unnecessary re-renders in InputBox
|
|
2377
|
+
const sessionCommands = useMemo(() => {
|
|
2378
|
+
return state.messageHistory
|
|
2379
|
+
.filter(m => m.role === 'user')
|
|
2380
|
+
.map(m => m.content);
|
|
2381
|
+
}, [state.messageHistory]);
|
|
2323
2382
|
// If in interactive editor mode, render minimal UI to keep Ink mounted
|
|
2324
2383
|
// but don't render any visible content - the editor has the screen
|
|
2325
2384
|
if (state.isInteractiveEditorMode) {
|
|
@@ -2413,6 +2472,82 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
2413
2472
|
ShellInputAgent.terminateSession(shellId);
|
|
2414
2473
|
quickLog(`[${new Date().toISOString()}] [AgentControl] Terminated ShellInputAgent session for ${shellId}\n`);
|
|
2415
2474
|
}
|
|
2475
|
+
}, onWarpifySession: async () => {
|
|
2476
|
+
// Warpify: Detect if there's an active remote session and establish ssh2 connection
|
|
2477
|
+
const shellCommand = state.shellState?.command || '';
|
|
2478
|
+
const currentOutput = state.shellState?.output || '';
|
|
2479
|
+
const session = detectWarpifySession(shellCommand, currentOutput);
|
|
2480
|
+
quickLog(`[${new Date().toISOString()}] [Warpify] Command: "${shellCommand}", Detected: ${JSON.stringify(session)}\n`);
|
|
2481
|
+
if (session.type === 'none') {
|
|
2482
|
+
// No remote session detected - show message briefly
|
|
2483
|
+
setState(prev => ({
|
|
2484
|
+
...prev,
|
|
2485
|
+
connectionStatus: {
|
|
2486
|
+
type: 'ssh',
|
|
2487
|
+
status: 'error',
|
|
2488
|
+
error: 'No remote session detected. Enter an SSH/WSL/Docker session first.'
|
|
2489
|
+
}
|
|
2490
|
+
}));
|
|
2491
|
+
setTimeout(() => {
|
|
2492
|
+
setState(prev => ({
|
|
2493
|
+
...prev,
|
|
2494
|
+
connectionStatus: undefined
|
|
2495
|
+
}));
|
|
2496
|
+
}, 3000);
|
|
2497
|
+
return;
|
|
2498
|
+
}
|
|
2499
|
+
// Remote session detected - warpify it!
|
|
2500
|
+
const description = getSessionDescription(session);
|
|
2501
|
+
quickLog(`[${new Date().toISOString()}] [Warpify] Warpifying: ${description}\n`);
|
|
2502
|
+
// Terminate the PTY session (we'll use ssh2 handler instead)
|
|
2503
|
+
onShellSignal('SIGTERM');
|
|
2504
|
+
// Capture history commands
|
|
2505
|
+
const historyMessages = [];
|
|
2506
|
+
// 1. Add the command the user typed (e.g., "ssh user@host")
|
|
2507
|
+
if (shellCommand) {
|
|
2508
|
+
historyMessages.push({
|
|
2509
|
+
id: `warpify-cmd-${Date.now()}`,
|
|
2510
|
+
role: 'user',
|
|
2511
|
+
content: shellCommand,
|
|
2512
|
+
timestamp: new Date(),
|
|
2513
|
+
isCommandMode: false // Treat as a normal chat message for history
|
|
2514
|
+
});
|
|
2515
|
+
}
|
|
2516
|
+
// 2. Add the terminal output (e.g., login banner, password prompt output)
|
|
2517
|
+
if (currentOutput && currentOutput.trim().length > 0) {
|
|
2518
|
+
historyMessages.push({
|
|
2519
|
+
id: `warpify-out-${Date.now()}`,
|
|
2520
|
+
role: 'tool', // Use 'tool' role to mimic command execution output
|
|
2521
|
+
content: '',
|
|
2522
|
+
timestamp: new Date(),
|
|
2523
|
+
toolExecution: {
|
|
2524
|
+
toolName: 'execute_command',
|
|
2525
|
+
status: 'completed',
|
|
2526
|
+
result: currentOutput, // This contains the PTY output including ANSI codes
|
|
2527
|
+
arguments: {
|
|
2528
|
+
command: shellCommand,
|
|
2529
|
+
isPty: true
|
|
2530
|
+
}
|
|
2531
|
+
}
|
|
2532
|
+
});
|
|
2533
|
+
}
|
|
2534
|
+
// Clear the shell state AND append the history messages
|
|
2535
|
+
// Also reset isAiWorking to prevent "Boosting..." spinner from appearing
|
|
2536
|
+
setState(prev => ({
|
|
2537
|
+
...prev,
|
|
2538
|
+
messageHistory: [...prev.messageHistory, ...historyMessages],
|
|
2539
|
+
shellState: undefined,
|
|
2540
|
+
isAiWorking: false
|
|
2541
|
+
}));
|
|
2542
|
+
// Clear screen
|
|
2543
|
+
clearScreen();
|
|
2544
|
+
// Establish proper ssh2 connection via cli-adapter
|
|
2545
|
+
// This will prompt for password and set up full SSH functionality
|
|
2546
|
+
const success = await onWarpifySession(shellCommand, session.type, session.connectionString);
|
|
2547
|
+
if (!success) {
|
|
2548
|
+
// Connection failed - error already shown by cli.warpifySession
|
|
2549
|
+
quickLog(`[${new Date().toISOString()}] [Warpify] Failed to establish ssh2 connection\n`);
|
|
2550
|
+
}
|
|
2416
2551
|
} })),
|
|
2417
2552
|
state.shellState?.isAgentControlled && state.shellState?.isFocused && state.shellState?.isRunning && (React.createElement(MonitorModeAIPanel, { messages: [
|
|
2418
2553
|
...(state.shellState.monitoringMessages || []),
|
|
@@ -2439,9 +2574,9 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
2439
2574
|
// Clear preserved input on submit
|
|
2440
2575
|
preservedInputTextRef.current = '';
|
|
2441
2576
|
handleSubmit(value, clipboardImages);
|
|
2442
|
-
}, autoAcceptMode: state.autoAcceptMode, model: state.currentModel, planMode: state.planMode, commandMode: state.commandMode, backgroundMode: state.backgroundMode, currentWorkingDirectory: state.currentWorkingDirectory, commandHistory: state.commandHistory, onToggleAutoAccept: handleToggleAutoAccept, onToggleCommandMode: onToggleCommandMode, onToggleBackgroundMode: onToggleBackgroundMode, isActive: true, subshellContext: state.subshellContext, currentTokens: state.currentTokens, maxTokens: state.maxTokens, contextLimitReached: state.contextLimitReached, isShellRunning: state.shellState?.isRunning, backgroundTaskCount: state.backgroundTaskCount, subAgentCount: state.subAgentCount, initialValue: preservedInputTextRef.current, onValueChange: handleInputValueChange, onSetAutoModeSetup: (callback) => {
|
|
2577
|
+
}, autoAcceptMode: state.autoAcceptMode, model: state.currentModel, planMode: state.planMode, commandMode: state.commandMode, backgroundMode: state.backgroundMode, currentWorkingDirectory: state.currentWorkingDirectory, commandHistory: state.commandHistory, onToggleAutoAccept: handleToggleAutoAccept, onToggleCommandMode: onToggleCommandMode, onToggleBackgroundMode: onToggleBackgroundMode, isActive: true, subshellContext: state.subshellContext, subshellContextStack: state.subshellContextStack, currentTokens: state.currentTokens, maxTokens: state.maxTokens, contextLimitReached: state.contextLimitReached, isShellRunning: state.shellState?.isRunning, backgroundTaskCount: state.backgroundTaskCount, subAgentCount: state.subAgentCount, initialValue: preservedInputTextRef.current, onValueChange: handleInputValueChange, onSetAutoModeSetup: (callback) => {
|
|
2443
2578
|
setAutoModeCallbackRef.current = callback;
|
|
2444
|
-
}, sessionQuotaExhausted: state.sessionQuotaExhausted, sessionQuotaTimeRemaining: state.sessionQuotaTimeRemaining }))),
|
|
2579
|
+
}, sessionQuotaExhausted: state.sessionQuotaExhausted, sessionQuotaTimeRemaining: state.sessionQuotaTimeRemaining, aiAutoSuggestEnabled: state.aiAutoSuggest, sessionCommands: sessionCommands }))),
|
|
2445
2580
|
state.showExitWarning && (React.createElement(Box, { marginTop: 1 },
|
|
2446
2581
|
React.createElement(Text, { color: "#ffaa00", bold: true }, "\u26A0\uFE0F Press Ctrl+C again to exit"))),
|
|
2447
2582
|
!isConnected && (React.createElement(Box, { marginTop: 0, marginLeft: state.showExitWarning ? 2 : 0 },
|
|
@@ -2935,6 +3070,27 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
2935
3070
|
screen: 'chat',
|
|
2936
3071
|
mcpListData: undefined
|
|
2937
3072
|
}));
|
|
3073
|
+
} })),
|
|
3074
|
+
state.screen === 'workflow-creator' && (React.createElement(WorkflowCreatorScreen, { initialSteps: state.workflowCreatorInitialSteps, onSave: (name, steps, description) => {
|
|
3075
|
+
onWorkflowSave(name, steps, description);
|
|
3076
|
+
const successMessage = {
|
|
3077
|
+
id: `workflow-created-${Date.now()}`,
|
|
3078
|
+
role: 'system',
|
|
3079
|
+
content: `✅ Workflow "${name}" saved successfully with ${steps.length} steps!\n\nRun it with: /workflow run ${name}`,
|
|
3080
|
+
timestamp: new Date()
|
|
3081
|
+
};
|
|
3082
|
+
setState(prev => ({
|
|
3083
|
+
...prev,
|
|
3084
|
+
screen: 'chat',
|
|
3085
|
+
messageHistory: [...prev.messageHistory, successMessage],
|
|
3086
|
+
workflowCreatorInitialSteps: undefined // Clear initial steps
|
|
3087
|
+
}));
|
|
3088
|
+
}, onCancel: () => {
|
|
3089
|
+
setState(prev => ({
|
|
3090
|
+
...prev,
|
|
3091
|
+
screen: 'chat',
|
|
3092
|
+
workflowCreatorInitialSteps: undefined // Clear initial steps
|
|
3093
|
+
}));
|
|
2938
3094
|
} }))));
|
|
2939
3095
|
};
|
|
2940
3096
|
//# sourceMappingURL=App.js.map
|