centaurus-cli 2.8.9 → 2.9.1

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 (109) hide show
  1. package/dist/cli-adapter.d.ts +29 -2
  2. package/dist/cli-adapter.d.ts.map +1 -1
  3. package/dist/cli-adapter.js +526 -84
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/config/build-config.d.ts +1 -1
  6. package/dist/config/build-config.js +1 -1
  7. package/dist/config/models.d.ts +8 -0
  8. package/dist/config/models.d.ts.map +1 -1
  9. package/dist/config/models.js +29 -0
  10. package/dist/config/models.js.map +1 -1
  11. package/dist/config/slash-commands.d.ts +1 -0
  12. package/dist/config/slash-commands.d.ts.map +1 -1
  13. package/dist/config/slash-commands.js +14 -1
  14. package/dist/config/slash-commands.js.map +1 -1
  15. package/dist/hooks/useConnectivity.d.ts +2 -0
  16. package/dist/hooks/useConnectivity.d.ts.map +1 -0
  17. package/dist/hooks/useConnectivity.js +12 -0
  18. package/dist/hooks/useConnectivity.js.map +1 -0
  19. package/dist/index.js +9 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/mcp/mcp-command-handler.d.ts.map +1 -1
  22. package/dist/mcp/mcp-command-handler.js +0 -3
  23. package/dist/mcp/mcp-command-handler.js.map +1 -1
  24. package/dist/mcp/mcp-tool-wrapper.d.ts.map +1 -1
  25. package/dist/mcp/mcp-tool-wrapper.js +8 -0
  26. package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
  27. package/dist/services/ai-service-client.d.ts +7 -1
  28. package/dist/services/ai-service-client.d.ts.map +1 -1
  29. package/dist/services/ai-service-client.js +6 -6
  30. package/dist/services/ai-service-client.js.map +1 -1
  31. package/dist/services/api-client.d.ts +35 -38
  32. package/dist/services/api-client.d.ts.map +1 -1
  33. package/dist/services/api-client.js +38 -30
  34. package/dist/services/api-client.js.map +1 -1
  35. package/dist/services/connectivity-manager.d.ts +18 -0
  36. package/dist/services/connectivity-manager.d.ts.map +1 -0
  37. package/dist/services/connectivity-manager.js +72 -0
  38. package/dist/services/connectivity-manager.js.map +1 -0
  39. package/dist/services/local-chat-storage.d.ts +5 -0
  40. package/dist/services/local-chat-storage.d.ts.map +1 -1
  41. package/dist/services/local-chat-storage.js +33 -0
  42. package/dist/services/local-chat-storage.js.map +1 -1
  43. package/dist/services/session-quota-manager.d.ts +101 -0
  44. package/dist/services/session-quota-manager.d.ts.map +1 -0
  45. package/dist/services/session-quota-manager.js +242 -0
  46. package/dist/services/session-quota-manager.js.map +1 -0
  47. package/dist/tools/background-command.d.ts +11 -0
  48. package/dist/tools/background-command.d.ts.map +1 -0
  49. package/dist/tools/background-command.js +162 -0
  50. package/dist/tools/background-command.js.map +1 -0
  51. package/dist/tools/command.d.ts.map +1 -1
  52. package/dist/tools/command.js +20 -6
  53. package/dist/tools/command.js.map +1 -1
  54. package/dist/tools/create-image.d.ts +10 -0
  55. package/dist/tools/create-image.d.ts.map +1 -0
  56. package/dist/tools/create-image.js +189 -0
  57. package/dist/tools/create-image.js.map +1 -0
  58. package/dist/tools/get-diff.d.ts.map +1 -1
  59. package/dist/tools/get-diff.js +4 -1
  60. package/dist/tools/get-diff.js.map +1 -1
  61. package/dist/tools/task-complete.d.ts.map +1 -1
  62. package/dist/tools/task-complete.js +8 -14
  63. package/dist/tools/task-complete.js.map +1 -1
  64. package/dist/ui/components/App.d.ts +5 -2
  65. package/dist/ui/components/App.d.ts.map +1 -1
  66. package/dist/ui/components/App.js +165 -45
  67. package/dist/ui/components/App.js.map +1 -1
  68. package/dist/ui/components/ContextWindowIndicator.d.ts.map +1 -1
  69. package/dist/ui/components/ContextWindowIndicator.js +43 -22
  70. package/dist/ui/components/ContextWindowIndicator.js.map +1 -1
  71. package/dist/ui/components/InputBox.d.ts +2 -0
  72. package/dist/ui/components/InputBox.d.ts.map +1 -1
  73. package/dist/ui/components/InputBox.js +217 -200
  74. package/dist/ui/components/InputBox.js.map +1 -1
  75. package/dist/ui/components/MessageDisplay.d.ts.map +1 -1
  76. package/dist/ui/components/MessageDisplay.js +8 -15
  77. package/dist/ui/components/MessageDisplay.js.map +1 -1
  78. package/dist/ui/components/SlashCommandAutocomplete.d.ts +2 -0
  79. package/dist/ui/components/SlashCommandAutocomplete.d.ts.map +1 -1
  80. package/dist/ui/components/SlashCommandAutocomplete.js +19 -10
  81. package/dist/ui/components/SlashCommandAutocomplete.js.map +1 -1
  82. package/dist/ui/components/StatusBar.d.ts.map +1 -1
  83. package/dist/ui/components/StatusBar.js +4 -0
  84. package/dist/ui/components/StatusBar.js.map +1 -1
  85. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
  86. package/dist/ui/components/ToolExecutionMessage.js +198 -39
  87. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  88. package/dist/ui/components/ToolExecutionStatus.d.ts.map +1 -1
  89. package/dist/ui/components/ToolExecutionStatus.js +1 -0
  90. package/dist/ui/components/ToolExecutionStatus.js.map +1 -1
  91. package/dist/utils/chat-formatter.d.ts +12 -0
  92. package/dist/utils/chat-formatter.d.ts.map +1 -0
  93. package/dist/utils/chat-formatter.js +326 -0
  94. package/dist/utils/chat-formatter.js.map +1 -0
  95. package/dist/utils/editor-utils.d.ts +3 -3
  96. package/dist/utils/editor-utils.d.ts.map +1 -1
  97. package/dist/utils/editor-utils.js +15 -12
  98. package/dist/utils/editor-utils.js.map +1 -1
  99. package/dist/utils/input-classifier.d.ts.map +1 -1
  100. package/dist/utils/input-classifier.js +140 -20
  101. package/dist/utils/input-classifier.js.map +1 -1
  102. package/dist/utils/terminal-output.d.ts.map +1 -1
  103. package/dist/utils/terminal-output.js +198 -171
  104. package/dist/utils/terminal-output.js.map +1 -1
  105. package/dist/utils/text-clipboard.d.ts +12 -0
  106. package/dist/utils/text-clipboard.d.ts.map +1 -0
  107. package/dist/utils/text-clipboard.js +63 -0
  108. package/dist/utils/text-clipboard.js.map +1 -0
  109. package/package.json +1 -1
@@ -11,6 +11,7 @@ interface AppProps {
11
11
  onResponseReceived: (callback: (message: string) => void) => void;
12
12
  onDirectMessage: (callback: (message: string) => void) => void;
13
13
  onResponseStream: (callback: (chunk: string) => void) => void;
14
+ onClearStreamedResponse: (callback: () => void) => void;
14
15
  onThoughtStream: (callback: (thought: string) => void) => void;
15
16
  onThoughtComplete: (callback: (durationSeconds: number) => void) => void;
16
17
  onPickerSetup: (callback: (options: {
@@ -49,7 +50,7 @@ interface AppProps {
49
50
  onPlanModeChange: (callback: (planMode: boolean) => void) => void;
50
51
  onPlanApprovalRequest: (callback: (plan: Plan) => Promise<boolean>) => void;
51
52
  onPlanCreated: (callback: (plan: Plan) => void) => void;
52
- onTaskCompleted: (callback: (task: PlanStep, taskNumber: number, totalTasks: number, completionNote?: string) => void) => void;
53
+ onTaskCompleted: (callback: (task: PlanStep, taskNumber: number, totalTasks: number, completionNote?: string, taskDescription?: string) => void) => void;
53
54
  onCommandModeChange: (callback: (commandMode: boolean) => void) => void;
54
55
  onToggleCommandMode: () => void;
55
56
  onBackgroundModeChange: (callback: (backgroundMode: boolean) => void) => void;
@@ -57,7 +58,7 @@ interface AppProps {
57
58
  onBackgroundTaskCountChange: (callback: (count: number) => void) => void;
58
59
  onSetAutoModeSetup: (callback: (enabled: boolean) => void) => void;
59
60
  onCwdChange: (callback: (cwd: string) => void) => void;
60
- onModelChange: (callback: (modelName: string) => void) => void;
61
+ onModelChange: (callback: (modelName: string, contextWindow: number) => void) => void;
61
62
  onSubshellContextChange: (callback: (context: SubshellContext) => void) => void;
62
63
  onPasswordRequest: (callback: (message: string) => Promise<string>) => void;
63
64
  onShellInput: (input: string) => void;
@@ -65,6 +66,7 @@ interface AppProps {
65
66
  onKillProcess: () => void;
66
67
  onInteractiveEditorMode: (callback: (active: boolean, command?: string, cwd?: string, remoteContext?: SubshellContext) => void) => void;
67
68
  onConnectionStatusUpdate: (callback: (status: ConnectionStatus) => void) => void;
69
+ onTokenCountUpdate: (callback: (tokens: number) => void) => void;
68
70
  onChatPickerSetup: (callback: (chats: Array<{
69
71
  id: string;
70
72
  title: string;
@@ -126,6 +128,7 @@ interface AppProps {
126
128
  onOutput: (handler: (chunk: string) => void) => void;
127
129
  onComplete: (handler: (exitCode: number) => void) => void;
128
130
  }) => void) => void;
131
+ onSessionQuotaUpdate: (callback: (remaining: number, canSend: boolean, timeRemaining: string) => void) => void;
129
132
  }
130
133
  export declare const App: React.FC<AppProps>;
131
134
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/ui/components/App.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/ui/components/App.tsx"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@ import { TaskCompletedMessage } from './TaskCompletedMessage.js';
24
24
  import { PlanAcceptedMessage } from './PlanAcceptedMessage.js';
25
25
  import { processTerminalOutput } from '../../utils/terminal-output.js';
26
26
  import { BackgroundTaskManager } from '../../services/background-task-manager.js';
27
+ import { useConnectivity } from '../../hooks/useConnectivity.js';
27
28
  import { apiClient } from '../../services/api-client.js';
28
29
  import { conversationManager } from '../../services/conversation-manager.js';
29
30
  import { logDebug, logError } from '../../utils/logger.js';
@@ -136,30 +137,30 @@ const RenameInputScreen = ({ currentTitle, onRename, onCancel }) => {
136
137
  React.createElement(Box, { marginTop: 1 },
137
138
  React.createElement(Text, { dimColor: true }, "Press Enter to save, ESC to cancel"))));
138
139
  };
139
- export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode, onResponseReceived, onDirectMessage, onResponseStream, onThoughtStream, onThoughtComplete, onPickerSetup, onPickerSelection, onToolExecutionUpdate, onToolApprovalRequest, onToolStreamingOutput, onPlanModeChange, onPlanApprovalRequest, onPlanCreated, onTaskCompleted, onCommandModeChange, onToggleCommandMode, onBackgroundModeChange, onToggleBackgroundMode, onBackgroundTaskCountChange, onSetAutoModeSetup, onCwdChange, onModelChange, onSubshellContextChange, onPasswordRequest, onShellInput, onShellSignal, onKillProcess, onInteractiveEditorMode, onConnectionStatusUpdate, onChatPickerSetup, onChatPickerSelection, onChatDeletePickerSetup, onChatDeletePickerSelection, onChatListSetup, onChatRenamePickerSetup, onChatRename, onRestoreMessagesSetup, onUIMessageHistoryUpdate, onBackgroundTaskListSetup, onBackgroundTaskSelection, onBackgroundTaskCancelSetup, onBackgroundTaskCancel, onBackgroundTaskViewSetup }) => {
140
+ 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, onSetAutoModeSetup, onCwdChange, onModelChange, onSubshellContextChange, onPasswordRequest, onShellInput, onShellSignal, onKillProcess, onInteractiveEditorMode, onConnectionStatusUpdate, onTokenCountUpdate, onChatPickerSetup, onChatPickerSelection, onChatDeletePickerSetup, onChatDeletePickerSelection, onChatListSetup, onChatRenamePickerSetup, onChatRename, onRestoreMessagesSetup, onUIMessageHistoryUpdate, onBackgroundTaskListSetup, onBackgroundTaskSelection, onBackgroundTaskCancelSetup, onBackgroundTaskCancel, onBackgroundTaskViewSetup, onSessionQuotaUpdate }) => {
140
141
  const { exit } = useApp();
141
142
  const autoAcceptRef = React.useRef(false);
142
143
  const setAutoModeCallbackRef = React.useRef(null);
144
+ // Connectivity State
145
+ const isConnected = useConnectivity();
143
146
  // Helper to clear screen
144
147
  const clearScreen = useCallback(() => {
145
148
  process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
146
149
  }, []);
147
- // Helper to get max tokens for a model
150
+ // Helper to get max tokens for a model (reads from cached backend config if available)
148
151
  const getMaxTokensForModel = useCallback((model) => {
149
- // Import dynamically to avoid circular dependencies
150
152
  try {
151
- const { getModelContextWindow } = require('../../config/models.js');
152
- return getModelContextWindow(model);
153
+ // Use sync function that reads from cached backend config
154
+ const { getModelContextWindowSync } = require('../../config/models.js');
155
+ return getModelContextWindowSync(model);
153
156
  }
154
157
  catch (error) {
155
- // Fallback to defaults if config loading fails
156
- if (model.includes('gemini-3'))
157
- return 2000000;
158
- if (model.includes('gemini-2.5'))
159
- return 2000000;
160
- if (model.includes('kimi'))
158
+ // Fallback defaults if import fails
159
+ if (model.toLowerCase().includes('kimi'))
161
160
  return 128000;
162
- return 2000000;
161
+ if (model.toLowerCase().includes('gemini'))
162
+ return 1000000;
163
+ return 1000000;
163
164
  }
164
165
  }, []);
165
166
  // Helper to estimate tokens (rough approximation: 1 token ≈ 4 characters)
@@ -202,6 +203,8 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
202
203
  passwordRequest: undefined,
203
204
  connectionStatus: undefined,
204
205
  backgroundTaskCount: 0,
206
+ sessionQuotaExhausted: false,
207
+ sessionQuotaTimeRemaining: '',
205
208
  });
206
209
  // Track last terminal width to detect actual width changes
207
210
  const lastTerminalWidthRef = React.useRef(process.stdout.columns || 80);
@@ -284,24 +287,45 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
284
287
  }));
285
288
  });
286
289
  }, []);
290
+ // Fetch models config async and update maxTokens once loaded
291
+ // This ensures correct context window even on initial load
292
+ React.useEffect(() => {
293
+ const loadModelsConfig = async () => {
294
+ try {
295
+ // Import quickLog for debugging
296
+ const { quickLog } = await import('../../utils/conversation-logger.js');
297
+ quickLog(`[${new Date().toISOString()}] [App] loadModelsConfig effect starting, currentModel: ${initialModel}\n`);
298
+ const { fetchModelsConfig, getModelContextWindowSync } = await import('../../config/models.js');
299
+ quickLog(`[${new Date().toISOString()}] [App] fetchModelsConfig imported, calling...\n`);
300
+ const config = await fetchModelsConfig(); // This populates the cache
301
+ quickLog(`[${new Date().toISOString()}] [App] fetchModelsConfig returned, models count: ${config?.models?.length || 0}\n`);
302
+ // Now get maxTokens with the cached config
303
+ const newMaxTokens = getModelContextWindowSync(initialModel || 'gemini-2.5-flash');
304
+ quickLog(`[${new Date().toISOString()}] [App] Got newMaxTokens: ${newMaxTokens} for model "${initialModel}"\n`);
305
+ setState(prev => ({
306
+ ...prev,
307
+ maxTokens: newMaxTokens
308
+ }));
309
+ quickLog(`[${new Date().toISOString()}] [App] Updated state.maxTokens to ${newMaxTokens}\n`);
310
+ }
311
+ catch (error) {
312
+ // Log errors to file
313
+ try {
314
+ const { quickLog } = await import('../../utils/conversation-logger.js');
315
+ quickLog(`[${new Date().toISOString()}] [App] loadModelsConfig ERROR: ${error?.message || error}\n`);
316
+ }
317
+ catch { }
318
+ }
319
+ };
320
+ loadModelsConfig();
321
+ }, [initialModel]);
287
322
  // Keep ref in sync with state
288
323
  React.useEffect(() => {
289
324
  autoAcceptRef.current = state.autoAcceptMode;
290
325
  }, [state.autoAcceptMode]);
291
- // Update token count whenever messages change
292
- React.useEffect(() => {
293
- const allMessages = [...state.messageHistory];
294
- if (state.currentMessage) {
295
- allMessages.push(state.currentMessage);
296
- }
297
- const totalTokens = calculateTotalTokens(allMessages);
298
- if (totalTokens !== state.currentTokens) {
299
- setState(prev => ({
300
- ...prev,
301
- currentTokens: totalTokens
302
- }));
303
- }
304
- }, [state.messageHistory, state.currentMessage, calculateTotalTokens]);
326
+ // NOTE: Token count is now updated via onTokenCountUpdate callback from cli-adapter
327
+ // which tracks the actual AI conversation history including system prompt.
328
+ // The old UI-based calculation has been removed to avoid overwriting correct values.
305
329
  // Track if we're currently streaming
306
330
  const isStreamingRef = React.useRef(false);
307
331
  // Buffer content when terminal is too small for streaming display
@@ -384,6 +408,31 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
384
408
  });
385
409
  });
386
410
  }, [onResponseStream]);
411
+ // Set up callback to clear streamed response when task_complete has a summary
412
+ // This prevents showing both the streamed text AND the task_complete summary
413
+ React.useEffect(() => {
414
+ onClearStreamedResponse(() => {
415
+ try {
416
+ quickLog(`[${new Date().toISOString()}] [App] onClearStreamedResponse called - clearing current message content\n`);
417
+ }
418
+ catch (e) {
419
+ // Ignore logging errors
420
+ }
421
+ setState(prev => {
422
+ // Clear the current message's content (not the whole message, so thoughts and thinking are preserved)
423
+ if (prev.currentMessage && prev.currentMessage.role === 'assistant') {
424
+ return {
425
+ ...prev,
426
+ currentMessage: {
427
+ ...prev.currentMessage,
428
+ content: '' // Clear the content - task_complete will stream the summary next
429
+ }
430
+ };
431
+ }
432
+ return prev;
433
+ });
434
+ });
435
+ }, [onClearStreamedResponse]);
387
436
  // Ref to accumulate all thought text across multiple chunks
388
437
  const thoughtAccumulatorRef = React.useRef('');
389
438
  // Set up callback to receive thought chunks
@@ -1371,10 +1420,13 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
1371
1420
  }, [onCwdChange]);
1372
1421
  // Set up callback to receive model changes
1373
1422
  React.useEffect(() => {
1374
- onModelChange((modelName) => {
1423
+ onModelChange((modelName, contextWindow) => {
1424
+ // Update both currentModel AND maxTokens when model changes
1425
+ // contextWindow is passed directly from cli-adapter, no lookup needed
1375
1426
  setState(prev => ({
1376
1427
  ...prev,
1377
- currentModel: modelName
1428
+ currentModel: modelName,
1429
+ maxTokens: contextWindow
1378
1430
  }));
1379
1431
  });
1380
1432
  }, [onModelChange]);
@@ -1387,6 +1439,25 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
1387
1439
  }));
1388
1440
  });
1389
1441
  }, [onSubshellContextChange]);
1442
+ // Set up callback to receive actual AI context token count from cli-adapter
1443
+ React.useEffect(() => {
1444
+ onTokenCountUpdate((tokens) => {
1445
+ setState(prev => ({
1446
+ ...prev,
1447
+ currentTokens: tokens
1448
+ }));
1449
+ });
1450
+ }, [onTokenCountUpdate]);
1451
+ // Set up callback to receive session quota updates from cli-adapter
1452
+ React.useEffect(() => {
1453
+ onSessionQuotaUpdate((remaining, canSend, timeRemaining) => {
1454
+ setState(prev => ({
1455
+ ...prev,
1456
+ sessionQuotaExhausted: !canSend,
1457
+ sessionQuotaTimeRemaining: timeRemaining
1458
+ }));
1459
+ });
1460
+ }, [onSessionQuotaUpdate]);
1390
1461
  // Set up callback for plan approval requests
1391
1462
  React.useEffect(() => {
1392
1463
  onPlanApprovalRequest(async (plan) => {
@@ -1418,7 +1489,7 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
1418
1489
  }, [onPlanCreated]);
1419
1490
  // Set up callback for task completion
1420
1491
  React.useEffect(() => {
1421
- onTaskCompleted((task, taskNumber, totalTasks, completionNote) => {
1492
+ onTaskCompleted((task, taskNumber, totalTasks, completionNote, taskDescription) => {
1422
1493
  // Add task completion message to history
1423
1494
  setState(prev => {
1424
1495
  const taskCompletedMessage = {
@@ -1429,7 +1500,8 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
1429
1500
  taskCompletion: {
1430
1501
  taskNumber,
1431
1502
  totalTasks,
1432
- taskDescription: task.description,
1503
+ // Use the passed taskDescription if available (for subtasks), otherwise fall back to task.description
1504
+ taskDescription: taskDescription || task.description,
1433
1505
  completionNote
1434
1506
  }
1435
1507
  };
@@ -1761,16 +1833,30 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
1761
1833
  }
1762
1834
  else if (!isSlashCommand) {
1763
1835
  // Only add user message to display if it's not a slash command
1764
- // (slash commands will show their response only)
1836
+ // Show user message IMMEDIATELY with image breadcrumbs (uploading state)
1837
+ // Images will be uploaded in background, then AI will be called
1838
+ const hasImagesToUpload = clipboardImages && clipboardImages.length > 0;
1839
+ // Build initial content with placeholder image markers for immediate display
1840
+ let initialDisplayContent = trimmedValue;
1841
+ if (hasImagesToUpload) {
1842
+ // Add placeholder markers that will be shown immediately
1843
+ for (let i = 0; i < clipboardImages.length; i++) {
1844
+ const image = clipboardImages[i];
1845
+ // Use a placeholder format that MessageDisplay can render as breadcrumb
1846
+ // Format: [IMAGE: filename (uploading...)] - will be updated after upload
1847
+ initialDisplayContent = `${initialDisplayContent} [IMAGE: ${image.displayName} (gs://uploading)]`;
1848
+ }
1849
+ }
1850
+ // Generate a stable message ID that we can use to update the message later
1851
+ const userMessageId = `user-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
1765
1852
  setState(prev => {
1766
- // Move current message to history if exists
1767
1853
  const newHistory = prev.currentMessage
1768
1854
  ? [...prev.messageHistory, prev.currentMessage]
1769
1855
  : prev.messageHistory;
1770
1856
  const userMessage = {
1771
- id: `user-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`,
1857
+ id: userMessageId,
1772
1858
  role: 'user',
1773
- content: trimmedValue,
1859
+ content: initialDisplayContent,
1774
1860
  timestamp: new Date()
1775
1861
  };
1776
1862
  return {
@@ -1778,8 +1864,8 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
1778
1864
  messageHistory: [...newHistory, userMessage],
1779
1865
  currentMessage: null,
1780
1866
  isLoading: true,
1781
- loadingMessage: 'Processing your request...',
1782
- isAiWorking: true // AI is starting to work
1867
+ loadingMessage: hasImagesToUpload ? 'Uploading image(s)...' : 'Processing your request...',
1868
+ isAiWorking: true
1783
1869
  };
1784
1870
  });
1785
1871
  }
@@ -1840,7 +1926,8 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
1840
1926
  // Only attempt upload if we have a valid conversation ID
1841
1927
  if (conversationId && !conversationId.startsWith('temp_')) {
1842
1928
  logDebug(`[CLIPBOARD] Starting upload for ${clipboardImages.length} images with conversationId: ${conversationId}`);
1843
- // Upload each clipboard image
1929
+ // Upload each clipboard image and build the final message content
1930
+ const uploadedImageMarkers = [];
1844
1931
  for (const image of clipboardImages) {
1845
1932
  try {
1846
1933
  logDebug(`[CLIPBOARD] Uploading image: ${image.displayName}, size: ${image.sizeBytes} bytes`);
@@ -1849,19 +1936,50 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
1849
1936
  // Append image reference info to message (for AI to know an image was attached)
1850
1937
  // The backend will use gcsUri for Vertex AI multimodal input
1851
1938
  if (uploadResult.gcsUri) {
1852
- // Replace #image with the actual gcsUri marker
1853
- // Case insensitive, first occurrence only
1854
- messageWithImages = messageWithImages.replace(/#image\b/i, `[IMAGE: ${uploadResult.fileName} (${uploadResult.gcsUri})]`);
1855
- logDebug(`[CLIPBOARD] Replaced #image with: [IMAGE: ${uploadResult.fileName} (${uploadResult.gcsUri})]`);
1939
+ // Build the real image marker with actual GCS URI
1940
+ messageWithImages = `${messageWithImages} [IMAGE: ${uploadResult.fileName} (${uploadResult.gcsUri})]`;
1941
+ uploadedImageMarkers.push(`[IMAGE: ${uploadResult.fileName} (${uploadResult.gcsUri})]`);
1942
+ logDebug(`[CLIPBOARD] Appended image marker: [IMAGE: ${uploadResult.fileName} (${uploadResult.gcsUri})]`);
1856
1943
  }
1857
1944
  }
1858
1945
  catch (uploadError) {
1859
1946
  // Log error but continue - image upload is optional
1860
1947
  logError('Failed to upload clipboard image', uploadError instanceof Error ? uploadError : undefined);
1861
- // Remove the #image placeholder if upload failed
1862
- messageWithImages = messageWithImages.replace(/#image\b/i, '[IMAGE UPLOAD FAILED]');
1948
+ // Add a failed marker so user knows upload failed
1949
+ uploadedImageMarkers.push(`[IMAGE: ${image.displayName} (upload failed)]`);
1863
1950
  }
1864
1951
  }
1952
+ // Update the user message in history with actual GCS URIs
1953
+ // Replace placeholder markers (gs://uploading) with real ones
1954
+ setState(prev => {
1955
+ const updatedHistory = prev.messageHistory.map(msg => {
1956
+ // Find the user message we just added (it has placeholder markers)
1957
+ if (msg.role === 'user' && msg.content.includes('(gs://uploading)')) {
1958
+ // Build new content: original text + real image markers
1959
+ let newContent = trimmedValue;
1960
+ for (const marker of uploadedImageMarkers) {
1961
+ newContent = `${newContent} ${marker}`;
1962
+ }
1963
+ return { ...msg, content: newContent };
1964
+ }
1965
+ return msg;
1966
+ });
1967
+ return { ...prev, messageHistory: updatedHistory };
1968
+ });
1969
+ }
1970
+ else {
1971
+ // No valid conversation ID - update message to show upload failed
1972
+ setState(prev => {
1973
+ const updatedHistory = prev.messageHistory.map(msg => {
1974
+ if (msg.role === 'user' && msg.content.includes('(gs://uploading)')) {
1975
+ // Replace uploading placeholders with failed markers
1976
+ const newContent = msg.content.replace(/\(gs:\/\/uploading\)/g, '(upload failed - no conversation)');
1977
+ return { ...msg, content: newContent };
1978
+ }
1979
+ return msg;
1980
+ });
1981
+ return { ...prev, messageHistory: updatedHistory };
1982
+ });
1865
1983
  } // End: if (conversationId && !startsWith temp_)
1866
1984
  } // End: if (clipboardImages && clipboardImages.length > 0)
1867
1985
  await onMessage(messageWithImages);
@@ -1977,9 +2095,11 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
1977
2095
  handleSubmit(value, clipboardImages);
1978
2096
  }, 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, isShellRunning: state.shellState?.isRunning, backgroundTaskCount: state.backgroundTaskCount, initialValue: preservedInputTextRef.current, onValueChange: handleInputValueChange, onSetAutoModeSetup: (callback) => {
1979
2097
  setAutoModeCallbackRef.current = callback;
1980
- } }))),
2098
+ }, sessionQuotaExhausted: state.sessionQuotaExhausted, sessionQuotaTimeRemaining: state.sessionQuotaTimeRemaining }))),
1981
2099
  state.showExitWarning && (React.createElement(Box, { marginTop: 1 },
1982
- React.createElement(Text, { color: "#ffaa00", bold: true }, "\u26A0\uFE0F Press Ctrl+C again to exit"))))),
2100
+ React.createElement(Text, { color: "#ffaa00", bold: true }, "\u26A0\uFE0F Press Ctrl+C again to exit"))),
2101
+ !isConnected && (React.createElement(Box, { marginTop: 0, marginLeft: state.showExitWarning ? 2 : 0 },
2102
+ React.createElement(Text, { color: "red", bold: true }, "\u26A0\uFE0F No internet connection"))))),
1983
2103
  state.screen === 'approval' && state.approvalRequest && (React.createElement(ApprovalSection, { key: `approval-${state.approvalRequest.message}`, approvalRequest: state.approvalRequest, onApprove: (approved) => {
1984
2104
  const resolve = state.approvalRequest?.resolve;
1985
2105
  if (resolve) {