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.
Files changed (121) hide show
  1. package/dist/cli-adapter.d.ts +78 -11
  2. package/dist/cli-adapter.d.ts.map +1 -1
  3. package/dist/cli-adapter.js +851 -215
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/commands/CommandParser.d.ts +1 -1
  6. package/dist/commands/CommandParser.d.ts.map +1 -1
  7. package/dist/commands/CommandParser.js +113 -0
  8. package/dist/commands/CommandParser.js.map +1 -1
  9. package/dist/config/models.d.ts.map +1 -1
  10. package/dist/config/models.js +2 -0
  11. package/dist/config/models.js.map +1 -1
  12. package/dist/config/slash-commands.d.ts +5 -0
  13. package/dist/config/slash-commands.d.ts.map +1 -1
  14. package/dist/config/slash-commands.js +63 -1
  15. package/dist/config/slash-commands.js.map +1 -1
  16. package/dist/config/types.d.ts +2 -0
  17. package/dist/config/types.d.ts.map +1 -1
  18. package/dist/config/types.js +1 -0
  19. package/dist/config/types.js.map +1 -1
  20. package/dist/context/context-manager.d.ts +1 -1
  21. package/dist/context/context-manager.d.ts.map +1 -1
  22. package/dist/context/context-manager.js +3 -1
  23. package/dist/context/context-manager.js.map +1 -1
  24. package/dist/context/handlers/docker-handler.d.ts +9 -0
  25. package/dist/context/handlers/docker-handler.d.ts.map +1 -1
  26. package/dist/context/handlers/docker-handler.js +99 -10
  27. package/dist/context/handlers/docker-handler.js.map +1 -1
  28. package/dist/context/handlers/ssh-handler.d.ts +20 -0
  29. package/dist/context/handlers/ssh-handler.d.ts.map +1 -1
  30. package/dist/context/handlers/ssh-handler.js +129 -1
  31. package/dist/context/handlers/ssh-handler.js.map +1 -1
  32. package/dist/context/subshell-handler.d.ts +15 -0
  33. package/dist/context/subshell-handler.d.ts.map +1 -1
  34. package/dist/index.js +10 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/services/ai-autocomplete-agent.d.ts +39 -0
  37. package/dist/services/ai-autocomplete-agent.d.ts.map +1 -0
  38. package/dist/services/ai-autocomplete-agent.js +189 -0
  39. package/dist/services/ai-autocomplete-agent.js.map +1 -0
  40. package/dist/services/ai-service-client.d.ts +25 -0
  41. package/dist/services/ai-service-client.d.ts.map +1 -1
  42. package/dist/services/ai-service-client.js +195 -12
  43. package/dist/services/ai-service-client.js.map +1 -1
  44. package/dist/services/api-client.js +1 -1
  45. package/dist/services/api-client.js.map +1 -1
  46. package/dist/services/auth-handler.js +1 -1
  47. package/dist/services/auth-handler.js.map +1 -1
  48. package/dist/services/local-chat-storage.d.ts +21 -0
  49. package/dist/services/local-chat-storage.d.ts.map +1 -1
  50. package/dist/services/local-chat-storage.js +138 -43
  51. package/dist/services/local-chat-storage.js.map +1 -1
  52. package/dist/services/ollama-service.d.ts +197 -0
  53. package/dist/services/ollama-service.d.ts.map +1 -0
  54. package/dist/services/ollama-service.js +324 -0
  55. package/dist/services/ollama-service.js.map +1 -0
  56. package/dist/services/warpify-detector.d.ts +43 -0
  57. package/dist/services/warpify-detector.d.ts.map +1 -0
  58. package/dist/services/warpify-detector.js +203 -0
  59. package/dist/services/warpify-detector.js.map +1 -0
  60. package/dist/services/workflow-storage.d.ts +72 -0
  61. package/dist/services/workflow-storage.d.ts.map +1 -0
  62. package/dist/services/workflow-storage.js +239 -0
  63. package/dist/services/workflow-storage.js.map +1 -0
  64. package/dist/tools/command.d.ts.map +1 -1
  65. package/dist/tools/command.js +14 -0
  66. package/dist/tools/command.js.map +1 -1
  67. package/dist/tools/enter-remote-session.d.ts +13 -0
  68. package/dist/tools/enter-remote-session.d.ts.map +1 -0
  69. package/dist/tools/enter-remote-session.js +226 -0
  70. package/dist/tools/enter-remote-session.js.map +1 -0
  71. package/dist/tools/find-files.d.ts.map +1 -1
  72. package/dist/tools/find-files.js +9 -2
  73. package/dist/tools/find-files.js.map +1 -1
  74. package/dist/tools/grep-search.d.ts +104 -31
  75. package/dist/tools/grep-search.d.ts.map +1 -1
  76. package/dist/tools/grep-search.js +699 -430
  77. package/dist/tools/grep-search.js.map +1 -1
  78. package/dist/tools/workflow-tool.d.ts +11 -0
  79. package/dist/tools/workflow-tool.d.ts.map +1 -0
  80. package/dist/tools/workflow-tool.js +87 -0
  81. package/dist/tools/workflow-tool.js.map +1 -0
  82. package/dist/types/workflow.d.ts +110 -0
  83. package/dist/types/workflow.d.ts.map +1 -0
  84. package/dist/types/workflow.js +8 -0
  85. package/dist/types/workflow.js.map +1 -0
  86. package/dist/ui/components/App.d.ts +12 -3
  87. package/dist/ui/components/App.d.ts.map +1 -1
  88. package/dist/ui/components/App.js +162 -6
  89. package/dist/ui/components/App.js.map +1 -1
  90. package/dist/ui/components/Breadcrumbs.d.ts +4 -3
  91. package/dist/ui/components/Breadcrumbs.d.ts.map +1 -1
  92. package/dist/ui/components/Breadcrumbs.js +60 -54
  93. package/dist/ui/components/Breadcrumbs.js.map +1 -1
  94. package/dist/ui/components/ConnectionStatusMessage.js +2 -2
  95. package/dist/ui/components/ConnectionStatusMessage.js.map +1 -1
  96. package/dist/ui/components/InputBox.d.ts +3 -0
  97. package/dist/ui/components/InputBox.d.ts.map +1 -1
  98. package/dist/ui/components/InputBox.js +488 -20
  99. package/dist/ui/components/InputBox.js.map +1 -1
  100. package/dist/ui/components/InteractiveShell.d.ts +2 -0
  101. package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
  102. package/dist/ui/components/InteractiveShell.js +13 -3
  103. package/dist/ui/components/InteractiveShell.js.map +1 -1
  104. package/dist/ui/components/MultiLineInput.d.ts.map +1 -1
  105. package/dist/ui/components/MultiLineInput.js +68 -2
  106. package/dist/ui/components/MultiLineInput.js.map +1 -1
  107. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
  108. package/dist/ui/components/ToolExecutionMessage.js +169 -26
  109. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  110. package/dist/ui/components/WorkflowCreatorScreen.d.ts +25 -0
  111. package/dist/ui/components/WorkflowCreatorScreen.d.ts.map +1 -0
  112. package/dist/ui/components/WorkflowCreatorScreen.js +164 -0
  113. package/dist/ui/components/WorkflowCreatorScreen.js.map +1 -0
  114. package/dist/utils/command-history.d.ts +12 -2
  115. package/dist/utils/command-history.d.ts.map +1 -1
  116. package/dist/utils/command-history.js +57 -13
  117. package/dist/utils/command-history.js.map +1 -1
  118. package/dist/utils/input-classifier.d.ts.map +1 -1
  119. package/dist/utils/input-classifier.js +3 -2
  120. package/dist/utils/input-classifier.js.map +1 -1
  121. 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