centaurus-cli 2.8.9 → 2.9.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/cli-adapter.d.ts +21 -2
- package/dist/cli-adapter.d.ts.map +1 -1
- package/dist/cli-adapter.js +302 -68
- package/dist/cli-adapter.js.map +1 -1
- package/dist/config/models.d.ts +8 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +29 -0
- package/dist/config/models.js.map +1 -1
- package/dist/config/slash-commands.d.ts +1 -0
- package/dist/config/slash-commands.d.ts.map +1 -1
- package/dist/config/slash-commands.js +13 -1
- package/dist/config/slash-commands.js.map +1 -1
- package/dist/hooks/useConnectivity.d.ts +2 -0
- package/dist/hooks/useConnectivity.d.ts.map +1 -0
- package/dist/hooks/useConnectivity.js +12 -0
- package/dist/hooks/useConnectivity.js.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-command-handler.d.ts.map +1 -1
- package/dist/mcp/mcp-command-handler.js +0 -3
- package/dist/mcp/mcp-command-handler.js.map +1 -1
- package/dist/mcp/mcp-tool-wrapper.d.ts.map +1 -1
- package/dist/mcp/mcp-tool-wrapper.js +8 -0
- package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
- package/dist/services/ai-service-client.d.ts +1 -0
- package/dist/services/ai-service-client.d.ts.map +1 -1
- package/dist/services/ai-service-client.js.map +1 -1
- package/dist/services/api-client.d.ts +26 -40
- package/dist/services/api-client.d.ts.map +1 -1
- package/dist/services/api-client.js +32 -34
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/connectivity-manager.d.ts +18 -0
- package/dist/services/connectivity-manager.d.ts.map +1 -0
- package/dist/services/connectivity-manager.js +72 -0
- package/dist/services/connectivity-manager.js.map +1 -0
- package/dist/services/local-chat-storage.d.ts +5 -0
- package/dist/services/local-chat-storage.d.ts.map +1 -1
- package/dist/services/local-chat-storage.js +33 -0
- package/dist/services/local-chat-storage.js.map +1 -1
- package/dist/tools/background-command.d.ts +11 -0
- package/dist/tools/background-command.d.ts.map +1 -0
- package/dist/tools/background-command.js +162 -0
- package/dist/tools/background-command.js.map +1 -0
- package/dist/tools/command.d.ts.map +1 -1
- package/dist/tools/command.js +6 -3
- package/dist/tools/command.js.map +1 -1
- package/dist/tools/create-image.d.ts +10 -0
- package/dist/tools/create-image.d.ts.map +1 -0
- package/dist/tools/create-image.js +189 -0
- package/dist/tools/create-image.js.map +1 -0
- package/dist/ui/components/App.d.ts +3 -2
- package/dist/ui/components/App.d.ts.map +1 -1
- package/dist/ui/components/App.js +127 -44
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/ContextWindowIndicator.d.ts.map +1 -1
- package/dist/ui/components/ContextWindowIndicator.js +43 -22
- package/dist/ui/components/ContextWindowIndicator.js.map +1 -1
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +198 -199
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/MessageDisplay.d.ts.map +1 -1
- package/dist/ui/components/MessageDisplay.js +8 -15
- package/dist/ui/components/MessageDisplay.js.map +1 -1
- package/dist/ui/components/SlashCommandAutocomplete.d.ts +2 -0
- package/dist/ui/components/SlashCommandAutocomplete.d.ts.map +1 -1
- package/dist/ui/components/SlashCommandAutocomplete.js +19 -10
- package/dist/ui/components/SlashCommandAutocomplete.js.map +1 -1
- package/dist/ui/components/StatusBar.d.ts.map +1 -1
- package/dist/ui/components/StatusBar.js +4 -0
- package/dist/ui/components/StatusBar.js.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.js +153 -39
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/ui/components/ToolExecutionStatus.d.ts.map +1 -1
- package/dist/ui/components/ToolExecutionStatus.js +1 -0
- package/dist/ui/components/ToolExecutionStatus.js.map +1 -1
- package/dist/utils/chat-formatter.d.ts +12 -0
- package/dist/utils/chat-formatter.d.ts.map +1 -0
- package/dist/utils/chat-formatter.js +326 -0
- package/dist/utils/chat-formatter.js.map +1 -0
- package/dist/utils/input-classifier.d.ts.map +1 -1
- package/dist/utils/input-classifier.js +139 -20
- package/dist/utils/input-classifier.js.map +1 -1
- package/dist/utils/text-clipboard.d.ts +12 -0
- package/dist/utils/text-clipboard.d.ts.map +1 -0
- package/dist/utils/text-clipboard.js +63 -0
- package/dist/utils/text-clipboard.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-image.js","sourceRoot":"","sources":["../../src/tools/create-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,7 +49,7 @@ interface AppProps {
|
|
|
49
49
|
onPlanModeChange: (callback: (planMode: boolean) => void) => void;
|
|
50
50
|
onPlanApprovalRequest: (callback: (plan: Plan) => Promise<boolean>) => void;
|
|
51
51
|
onPlanCreated: (callback: (plan: Plan) => void) => void;
|
|
52
|
-
onTaskCompleted: (callback: (task: PlanStep, taskNumber: number, totalTasks: number, completionNote?: string) => void) => void;
|
|
52
|
+
onTaskCompleted: (callback: (task: PlanStep, taskNumber: number, totalTasks: number, completionNote?: string, taskDescription?: string) => void) => void;
|
|
53
53
|
onCommandModeChange: (callback: (commandMode: boolean) => void) => void;
|
|
54
54
|
onToggleCommandMode: () => void;
|
|
55
55
|
onBackgroundModeChange: (callback: (backgroundMode: boolean) => void) => void;
|
|
@@ -57,7 +57,7 @@ interface AppProps {
|
|
|
57
57
|
onBackgroundTaskCountChange: (callback: (count: number) => void) => void;
|
|
58
58
|
onSetAutoModeSetup: (callback: (enabled: boolean) => void) => void;
|
|
59
59
|
onCwdChange: (callback: (cwd: string) => void) => void;
|
|
60
|
-
onModelChange: (callback: (modelName: string) => void) => void;
|
|
60
|
+
onModelChange: (callback: (modelName: string, contextWindow: number) => void) => void;
|
|
61
61
|
onSubshellContextChange: (callback: (context: SubshellContext) => void) => void;
|
|
62
62
|
onPasswordRequest: (callback: (message: string) => Promise<string>) => void;
|
|
63
63
|
onShellInput: (input: string) => void;
|
|
@@ -65,6 +65,7 @@ interface AppProps {
|
|
|
65
65
|
onKillProcess: () => void;
|
|
66
66
|
onInteractiveEditorMode: (callback: (active: boolean, command?: string, cwd?: string, remoteContext?: SubshellContext) => void) => void;
|
|
67
67
|
onConnectionStatusUpdate: (callback: (status: ConnectionStatus) => void) => void;
|
|
68
|
+
onTokenCountUpdate: (callback: (tokens: number) => void) => void;
|
|
68
69
|
onChatPickerSetup: (callback: (chats: Array<{
|
|
69
70
|
id: string;
|
|
70
71
|
title: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/ui/components/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAsBrD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAO1D,OAAO,EAA2B,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;
|
|
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, 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 }) => {
|
|
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
|
-
|
|
152
|
-
|
|
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
|
|
156
|
-
if (model.includes('
|
|
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
|
-
|
|
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)
|
|
@@ -284,24 +285,45 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
284
285
|
}));
|
|
285
286
|
});
|
|
286
287
|
}, []);
|
|
288
|
+
// Fetch models config async and update maxTokens once loaded
|
|
289
|
+
// This ensures correct context window even on initial load
|
|
290
|
+
React.useEffect(() => {
|
|
291
|
+
const loadModelsConfig = async () => {
|
|
292
|
+
try {
|
|
293
|
+
// Import quickLog for debugging
|
|
294
|
+
const { quickLog } = await import('../../utils/conversation-logger.js');
|
|
295
|
+
quickLog(`[${new Date().toISOString()}] [App] loadModelsConfig effect starting, currentModel: ${initialModel}\n`);
|
|
296
|
+
const { fetchModelsConfig, getModelContextWindowSync } = await import('../../config/models.js');
|
|
297
|
+
quickLog(`[${new Date().toISOString()}] [App] fetchModelsConfig imported, calling...\n`);
|
|
298
|
+
const config = await fetchModelsConfig(); // This populates the cache
|
|
299
|
+
quickLog(`[${new Date().toISOString()}] [App] fetchModelsConfig returned, models count: ${config?.models?.length || 0}\n`);
|
|
300
|
+
// Now get maxTokens with the cached config
|
|
301
|
+
const newMaxTokens = getModelContextWindowSync(initialModel || 'gemini-2.5-flash');
|
|
302
|
+
quickLog(`[${new Date().toISOString()}] [App] Got newMaxTokens: ${newMaxTokens} for model "${initialModel}"\n`);
|
|
303
|
+
setState(prev => ({
|
|
304
|
+
...prev,
|
|
305
|
+
maxTokens: newMaxTokens
|
|
306
|
+
}));
|
|
307
|
+
quickLog(`[${new Date().toISOString()}] [App] Updated state.maxTokens to ${newMaxTokens}\n`);
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
// Log errors to file
|
|
311
|
+
try {
|
|
312
|
+
const { quickLog } = await import('../../utils/conversation-logger.js');
|
|
313
|
+
quickLog(`[${new Date().toISOString()}] [App] loadModelsConfig ERROR: ${error?.message || error}\n`);
|
|
314
|
+
}
|
|
315
|
+
catch { }
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
loadModelsConfig();
|
|
319
|
+
}, [initialModel]);
|
|
287
320
|
// Keep ref in sync with state
|
|
288
321
|
React.useEffect(() => {
|
|
289
322
|
autoAcceptRef.current = state.autoAcceptMode;
|
|
290
323
|
}, [state.autoAcceptMode]);
|
|
291
|
-
//
|
|
292
|
-
|
|
293
|
-
|
|
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]);
|
|
324
|
+
// NOTE: Token count is now updated via onTokenCountUpdate callback from cli-adapter
|
|
325
|
+
// which tracks the actual AI conversation history including system prompt.
|
|
326
|
+
// The old UI-based calculation has been removed to avoid overwriting correct values.
|
|
305
327
|
// Track if we're currently streaming
|
|
306
328
|
const isStreamingRef = React.useRef(false);
|
|
307
329
|
// Buffer content when terminal is too small for streaming display
|
|
@@ -1371,10 +1393,13 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
1371
1393
|
}, [onCwdChange]);
|
|
1372
1394
|
// Set up callback to receive model changes
|
|
1373
1395
|
React.useEffect(() => {
|
|
1374
|
-
onModelChange((modelName) => {
|
|
1396
|
+
onModelChange((modelName, contextWindow) => {
|
|
1397
|
+
// Update both currentModel AND maxTokens when model changes
|
|
1398
|
+
// contextWindow is passed directly from cli-adapter, no lookup needed
|
|
1375
1399
|
setState(prev => ({
|
|
1376
1400
|
...prev,
|
|
1377
|
-
currentModel: modelName
|
|
1401
|
+
currentModel: modelName,
|
|
1402
|
+
maxTokens: contextWindow
|
|
1378
1403
|
}));
|
|
1379
1404
|
});
|
|
1380
1405
|
}, [onModelChange]);
|
|
@@ -1387,6 +1412,15 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
1387
1412
|
}));
|
|
1388
1413
|
});
|
|
1389
1414
|
}, [onSubshellContextChange]);
|
|
1415
|
+
// Set up callback to receive actual AI context token count from cli-adapter
|
|
1416
|
+
React.useEffect(() => {
|
|
1417
|
+
onTokenCountUpdate((tokens) => {
|
|
1418
|
+
setState(prev => ({
|
|
1419
|
+
...prev,
|
|
1420
|
+
currentTokens: tokens
|
|
1421
|
+
}));
|
|
1422
|
+
});
|
|
1423
|
+
}, [onTokenCountUpdate]);
|
|
1390
1424
|
// Set up callback for plan approval requests
|
|
1391
1425
|
React.useEffect(() => {
|
|
1392
1426
|
onPlanApprovalRequest(async (plan) => {
|
|
@@ -1418,7 +1452,7 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
1418
1452
|
}, [onPlanCreated]);
|
|
1419
1453
|
// Set up callback for task completion
|
|
1420
1454
|
React.useEffect(() => {
|
|
1421
|
-
onTaskCompleted((task, taskNumber, totalTasks, completionNote) => {
|
|
1455
|
+
onTaskCompleted((task, taskNumber, totalTasks, completionNote, taskDescription) => {
|
|
1422
1456
|
// Add task completion message to history
|
|
1423
1457
|
setState(prev => {
|
|
1424
1458
|
const taskCompletedMessage = {
|
|
@@ -1429,7 +1463,8 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
1429
1463
|
taskCompletion: {
|
|
1430
1464
|
taskNumber,
|
|
1431
1465
|
totalTasks,
|
|
1432
|
-
taskDescription
|
|
1466
|
+
// Use the passed taskDescription if available (for subtasks), otherwise fall back to task.description
|
|
1467
|
+
taskDescription: taskDescription || task.description,
|
|
1433
1468
|
completionNote
|
|
1434
1469
|
}
|
|
1435
1470
|
};
|
|
@@ -1761,16 +1796,30 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
1761
1796
|
}
|
|
1762
1797
|
else if (!isSlashCommand) {
|
|
1763
1798
|
// Only add user message to display if it's not a slash command
|
|
1764
|
-
//
|
|
1799
|
+
// Show user message IMMEDIATELY with image breadcrumbs (uploading state)
|
|
1800
|
+
// Images will be uploaded in background, then AI will be called
|
|
1801
|
+
const hasImagesToUpload = clipboardImages && clipboardImages.length > 0;
|
|
1802
|
+
// Build initial content with placeholder image markers for immediate display
|
|
1803
|
+
let initialDisplayContent = trimmedValue;
|
|
1804
|
+
if (hasImagesToUpload) {
|
|
1805
|
+
// Add placeholder markers that will be shown immediately
|
|
1806
|
+
for (let i = 0; i < clipboardImages.length; i++) {
|
|
1807
|
+
const image = clipboardImages[i];
|
|
1808
|
+
// Use a placeholder format that MessageDisplay can render as breadcrumb
|
|
1809
|
+
// Format: [IMAGE: filename (uploading...)] - will be updated after upload
|
|
1810
|
+
initialDisplayContent = `${initialDisplayContent} [IMAGE: ${image.displayName} (gs://uploading)]`;
|
|
1811
|
+
}
|
|
1812
|
+
}
|
|
1813
|
+
// Generate a stable message ID that we can use to update the message later
|
|
1814
|
+
const userMessageId = `user-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
|
|
1765
1815
|
setState(prev => {
|
|
1766
|
-
// Move current message to history if exists
|
|
1767
1816
|
const newHistory = prev.currentMessage
|
|
1768
1817
|
? [...prev.messageHistory, prev.currentMessage]
|
|
1769
1818
|
: prev.messageHistory;
|
|
1770
1819
|
const userMessage = {
|
|
1771
|
-
id:
|
|
1820
|
+
id: userMessageId,
|
|
1772
1821
|
role: 'user',
|
|
1773
|
-
content:
|
|
1822
|
+
content: initialDisplayContent,
|
|
1774
1823
|
timestamp: new Date()
|
|
1775
1824
|
};
|
|
1776
1825
|
return {
|
|
@@ -1778,8 +1827,8 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
1778
1827
|
messageHistory: [...newHistory, userMessage],
|
|
1779
1828
|
currentMessage: null,
|
|
1780
1829
|
isLoading: true,
|
|
1781
|
-
loadingMessage: 'Processing your request...',
|
|
1782
|
-
isAiWorking: true
|
|
1830
|
+
loadingMessage: hasImagesToUpload ? 'Uploading image(s)...' : 'Processing your request...',
|
|
1831
|
+
isAiWorking: true
|
|
1783
1832
|
};
|
|
1784
1833
|
});
|
|
1785
1834
|
}
|
|
@@ -1840,7 +1889,8 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
1840
1889
|
// Only attempt upload if we have a valid conversation ID
|
|
1841
1890
|
if (conversationId && !conversationId.startsWith('temp_')) {
|
|
1842
1891
|
logDebug(`[CLIPBOARD] Starting upload for ${clipboardImages.length} images with conversationId: ${conversationId}`);
|
|
1843
|
-
// Upload each clipboard image
|
|
1892
|
+
// Upload each clipboard image and build the final message content
|
|
1893
|
+
const uploadedImageMarkers = [];
|
|
1844
1894
|
for (const image of clipboardImages) {
|
|
1845
1895
|
try {
|
|
1846
1896
|
logDebug(`[CLIPBOARD] Uploading image: ${image.displayName}, size: ${image.sizeBytes} bytes`);
|
|
@@ -1849,19 +1899,50 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
1849
1899
|
// Append image reference info to message (for AI to know an image was attached)
|
|
1850
1900
|
// The backend will use gcsUri for Vertex AI multimodal input
|
|
1851
1901
|
if (uploadResult.gcsUri) {
|
|
1852
|
-
//
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
logDebug(`[CLIPBOARD]
|
|
1902
|
+
// Build the real image marker with actual GCS URI
|
|
1903
|
+
messageWithImages = `${messageWithImages} [IMAGE: ${uploadResult.fileName} (${uploadResult.gcsUri})]`;
|
|
1904
|
+
uploadedImageMarkers.push(`[IMAGE: ${uploadResult.fileName} (${uploadResult.gcsUri})]`);
|
|
1905
|
+
logDebug(`[CLIPBOARD] Appended image marker: [IMAGE: ${uploadResult.fileName} (${uploadResult.gcsUri})]`);
|
|
1856
1906
|
}
|
|
1857
1907
|
}
|
|
1858
1908
|
catch (uploadError) {
|
|
1859
1909
|
// Log error but continue - image upload is optional
|
|
1860
1910
|
logError('Failed to upload clipboard image', uploadError instanceof Error ? uploadError : undefined);
|
|
1861
|
-
//
|
|
1862
|
-
|
|
1911
|
+
// Add a failed marker so user knows upload failed
|
|
1912
|
+
uploadedImageMarkers.push(`[IMAGE: ${image.displayName} (upload failed)]`);
|
|
1863
1913
|
}
|
|
1864
1914
|
}
|
|
1915
|
+
// Update the user message in history with actual GCS URIs
|
|
1916
|
+
// Replace placeholder markers (gs://uploading) with real ones
|
|
1917
|
+
setState(prev => {
|
|
1918
|
+
const updatedHistory = prev.messageHistory.map(msg => {
|
|
1919
|
+
// Find the user message we just added (it has placeholder markers)
|
|
1920
|
+
if (msg.role === 'user' && msg.content.includes('(gs://uploading)')) {
|
|
1921
|
+
// Build new content: original text + real image markers
|
|
1922
|
+
let newContent = trimmedValue;
|
|
1923
|
+
for (const marker of uploadedImageMarkers) {
|
|
1924
|
+
newContent = `${newContent} ${marker}`;
|
|
1925
|
+
}
|
|
1926
|
+
return { ...msg, content: newContent };
|
|
1927
|
+
}
|
|
1928
|
+
return msg;
|
|
1929
|
+
});
|
|
1930
|
+
return { ...prev, messageHistory: updatedHistory };
|
|
1931
|
+
});
|
|
1932
|
+
}
|
|
1933
|
+
else {
|
|
1934
|
+
// No valid conversation ID - update message to show upload failed
|
|
1935
|
+
setState(prev => {
|
|
1936
|
+
const updatedHistory = prev.messageHistory.map(msg => {
|
|
1937
|
+
if (msg.role === 'user' && msg.content.includes('(gs://uploading)')) {
|
|
1938
|
+
// Replace uploading placeholders with failed markers
|
|
1939
|
+
const newContent = msg.content.replace(/\(gs:\/\/uploading\)/g, '(upload failed - no conversation)');
|
|
1940
|
+
return { ...msg, content: newContent };
|
|
1941
|
+
}
|
|
1942
|
+
return msg;
|
|
1943
|
+
});
|
|
1944
|
+
return { ...prev, messageHistory: updatedHistory };
|
|
1945
|
+
});
|
|
1865
1946
|
} // End: if (conversationId && !startsWith temp_)
|
|
1866
1947
|
} // End: if (clipboardImages && clipboardImages.length > 0)
|
|
1867
1948
|
await onMessage(messageWithImages);
|
|
@@ -1979,7 +2060,9 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
|
|
|
1979
2060
|
setAutoModeCallbackRef.current = callback;
|
|
1980
2061
|
} }))),
|
|
1981
2062
|
state.showExitWarning && (React.createElement(Box, { marginTop: 1 },
|
|
1982
|
-
React.createElement(Text, { color: "#ffaa00", bold: true }, "\u26A0\uFE0F Press Ctrl+C again to exit")))
|
|
2063
|
+
React.createElement(Text, { color: "#ffaa00", bold: true }, "\u26A0\uFE0F Press Ctrl+C again to exit"))),
|
|
2064
|
+
!isConnected && (React.createElement(Box, { marginTop: 0, marginLeft: state.showExitWarning ? 2 : 0 },
|
|
2065
|
+
React.createElement(Text, { color: "red", bold: true }, "\u26A0\uFE0F No internet connection"))))),
|
|
1983
2066
|
state.screen === 'approval' && state.approvalRequest && (React.createElement(ApprovalSection, { key: `approval-${state.approvalRequest.message}`, approvalRequest: state.approvalRequest, onApprove: (approved) => {
|
|
1984
2067
|
const resolve = state.approvalRequest?.resolve;
|
|
1985
2068
|
if (resolve) {
|