@syntero/orca-cli 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assistant.d.ts +17 -3
- package/dist/assistant.d.ts.map +1 -1
- package/dist/assistant.js +217 -22
- package/dist/assistant.js.map +1 -1
- package/dist/auth.d.ts +97 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +438 -0
- package/dist/auth.js.map +1 -0
- package/dist/autocomplete.d.ts +24 -0
- package/dist/autocomplete.d.ts.map +1 -0
- package/dist/autocomplete.js +43 -0
- package/dist/autocomplete.js.map +1 -0
- package/dist/components/ChatApp.d.ts +32 -0
- package/dist/components/ChatApp.d.ts.map +1 -0
- package/dist/components/ChatApp.js +470 -0
- package/dist/components/ChatApp.js.map +1 -0
- package/dist/components/CommandPalette.d.ts +15 -0
- package/dist/components/CommandPalette.d.ts.map +1 -0
- package/dist/components/CommandPalette.js +22 -0
- package/dist/components/CommandPalette.js.map +1 -0
- package/dist/components/ConfigWizard.d.ts +25 -0
- package/dist/components/ConfigWizard.d.ts.map +1 -0
- package/dist/components/ConfigWizard.js +401 -0
- package/dist/components/ConfigWizard.js.map +1 -0
- package/dist/components/InputFooter.d.ts +33 -0
- package/dist/components/InputFooter.d.ts.map +1 -0
- package/dist/components/InputFooter.js +618 -0
- package/dist/components/InputFooter.js.map +1 -0
- package/dist/components/InputModal.d.ts +25 -0
- package/dist/components/InputModal.d.ts.map +1 -0
- package/dist/components/InputModal.js +529 -0
- package/dist/components/InputModal.js.map +1 -0
- package/dist/components/ModelMenu.d.ts +24 -0
- package/dist/components/ModelMenu.d.ts.map +1 -0
- package/dist/components/ModelMenu.js +175 -0
- package/dist/components/ModelMenu.js.map +1 -0
- package/dist/components/ProviderMenu.d.ts +20 -0
- package/dist/components/ProviderMenu.d.ts.map +1 -0
- package/dist/components/ProviderMenu.js +31 -0
- package/dist/components/ProviderMenu.js.map +1 -0
- package/dist/components/SyncMenu.d.ts +23 -0
- package/dist/components/SyncMenu.d.ts.map +1 -0
- package/dist/components/SyncMenu.js +135 -0
- package/dist/components/SyncMenu.js.map +1 -0
- package/dist/components/TokenInput.d.ts +15 -0
- package/dist/components/TokenInput.d.ts.map +1 -0
- package/dist/components/TokenInput.js +103 -0
- package/dist/components/TokenInput.js.map +1 -0
- package/dist/index.js +323 -173
- package/dist/index.js.map +1 -1
- package/dist/ink-input.d.ts +14 -0
- package/dist/ink-input.d.ts.map +1 -0
- package/dist/ink-input.js +92 -0
- package/dist/ink-input.js.map +1 -0
- package/dist/models.d.ts +115 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +221 -0
- package/dist/models.js.map +1 -0
- package/dist/providers.d.ts +19 -4
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +80 -112
- package/dist/providers.js.map +1 -1
- package/dist/settings.d.ts +15 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +56 -21
- package/dist/settings.js.map +1 -1
- package/dist/sync/docker.d.ts +68 -0
- package/dist/sync/docker.d.ts.map +1 -0
- package/dist/sync/docker.js +234 -0
- package/dist/sync/docker.js.map +1 -0
- package/dist/sync/download.d.ts +87 -0
- package/dist/sync/download.d.ts.map +1 -0
- package/dist/sync/download.js +291 -0
- package/dist/sync/download.js.map +1 -0
- package/dist/sync/hash.d.ts +60 -0
- package/dist/sync/hash.d.ts.map +1 -0
- package/dist/sync/hash.js +92 -0
- package/dist/sync/hash.js.map +1 -0
- package/dist/sync/index.d.ts +15 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +21 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/manifest.d.ts +132 -0
- package/dist/sync/manifest.d.ts.map +1 -0
- package/dist/sync/manifest.js +260 -0
- package/dist/sync/manifest.js.map +1 -0
- package/dist/sync/progress.d.ts +164 -0
- package/dist/sync/progress.d.ts.map +1 -0
- package/dist/sync/progress.js +233 -0
- package/dist/sync/progress.js.map +1 -0
- package/dist/sync/services.d.ts +70 -0
- package/dist/sync/services.d.ts.map +1 -0
- package/dist/sync/services.js +134 -0
- package/dist/sync/services.js.map +1 -0
- package/dist/sync/sync-engine.d.ts +69 -0
- package/dist/sync/sync-engine.d.ts.map +1 -0
- package/dist/sync/sync-engine.js +533 -0
- package/dist/sync/sync-engine.js.map +1 -0
- package/dist/tokens.d.ts +70 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +198 -0
- package/dist/tokens.js.map +1 -0
- package/dist/tools.d.ts +60 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +34 -0
- package/dist/tools.js.map +1 -1
- package/dist/types/sync.d.ts +284 -0
- package/dist/types/sync.d.ts.map +1 -0
- package/dist/types/sync.js +5 -0
- package/dist/types/sync.js.map +1 -0
- package/package.json +10 -2
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useCallback, useRef } from 'react';
|
|
3
|
+
import { Static, Box, Text, useApp, useInput } from 'ink';
|
|
4
|
+
import { InputFooter } from './InputFooter.js';
|
|
5
|
+
import { loadSettings } from '../settings.js';
|
|
6
|
+
import { runAssistant, summarizeConversation } from '../assistant.js';
|
|
7
|
+
import { Colors, color } from '../utils.js';
|
|
8
|
+
import { setToken as authSetToken, logout as authLogout, status as authStatus, loadCredentials, } from '../auth.js';
|
|
9
|
+
import { estimateConversationTokens, shouldAutoCompact, formatTokenCount, AUTO_COMPACT_THRESHOLD, calculateContextBreakdown, generateContextDisplay, } from '../tokens.js';
|
|
10
|
+
import { debugLog } from '../settings.js';
|
|
11
|
+
/**
|
|
12
|
+
* ChatApp - Main chat component using Ink's Static for persistent footer pattern.
|
|
13
|
+
*
|
|
14
|
+
* Architecture:
|
|
15
|
+
* - <Static> for completed messages (user + assistant) - these are permanently rendered
|
|
16
|
+
* - Dynamic area for currently streaming response
|
|
17
|
+
* - Persistent input footer that's always visible
|
|
18
|
+
*/
|
|
19
|
+
export function ChatApp({ settings: initialSettings, createClient, onUpdateCommand }) {
|
|
20
|
+
const { exit } = useApp();
|
|
21
|
+
// Settings state (can be updated by config wizard)
|
|
22
|
+
const [settings, setSettings] = useState(initialSettings);
|
|
23
|
+
// LLM client state
|
|
24
|
+
const [client, setClient] = useState(() => createClient(initialSettings).client);
|
|
25
|
+
const [isCloud, setIsCloud] = useState(() => createClient(initialSettings).isCloud);
|
|
26
|
+
const [cloudProvider, setCloudProvider] = useState(() => createClient(initialSettings).cloudProvider);
|
|
27
|
+
// Chat state
|
|
28
|
+
const [messages, setMessages] = useState([]);
|
|
29
|
+
const [conversationHistory, setConversationHistory] = useState([]);
|
|
30
|
+
const [streamingContent, setStreamingContent] = useState('');
|
|
31
|
+
const [isStreaming, setIsStreaming] = useState(false);
|
|
32
|
+
const [isCompacting, setIsCompacting] = useState(false);
|
|
33
|
+
// Message queue for messages sent during streaming (using ref for stable reference)
|
|
34
|
+
// Messages are injected at each agent iteration via getQueuedMessage callback
|
|
35
|
+
const messageQueueRef = useRef([]);
|
|
36
|
+
const [queueLength, setQueueLength] = useState(0); // For triggering re-renders
|
|
37
|
+
// Command history for up/down arrow navigation (newest first)
|
|
38
|
+
const [commandHistory, setCommandHistory] = useState([]);
|
|
39
|
+
// Abort controller for interrupting streams
|
|
40
|
+
const abortControllerRef = useRef(null);
|
|
41
|
+
// Next message ID
|
|
42
|
+
const nextIdRef = useRef(1);
|
|
43
|
+
const getNextId = () => nextIdRef.current++;
|
|
44
|
+
// Reconnect client with new settings
|
|
45
|
+
const reconnectClient = useCallback((newSettings) => {
|
|
46
|
+
debugLog(`[reconnectClient] called with provider=${newSettings.provider}, anthropic.model=${newSettings.anthropic.model}, openai.model=${newSettings.openai.model}`);
|
|
47
|
+
const result = createClient(newSettings);
|
|
48
|
+
debugLog(`[reconnectClient] createClient returned isCloud=${result.isCloud}, cloudProvider=${result.cloudProvider}`);
|
|
49
|
+
setClient(result.client);
|
|
50
|
+
setIsCloud(result.isCloud);
|
|
51
|
+
setCloudProvider(result.cloudProvider);
|
|
52
|
+
setSettings(newSettings);
|
|
53
|
+
debugLog(`[reconnectClient] state updated, settings.provider is now ${newSettings.provider}`);
|
|
54
|
+
return result;
|
|
55
|
+
}, [createClient]);
|
|
56
|
+
// Perform conversation compaction
|
|
57
|
+
const performCompaction = useCallback(async (customInstructions) => {
|
|
58
|
+
if (conversationHistory.length === 0) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
setIsCompacting(true);
|
|
62
|
+
try {
|
|
63
|
+
// Get current token count for display
|
|
64
|
+
const tokensBefore = estimateConversationTokens(conversationHistory);
|
|
65
|
+
// Generate summary
|
|
66
|
+
const summary = await summarizeConversation(client, settings, conversationHistory, customInstructions);
|
|
67
|
+
if (!summary) {
|
|
68
|
+
setIsCompacting(false);
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
// Create a new conversation history with just the summary as context
|
|
72
|
+
const summaryMessage = {
|
|
73
|
+
role: 'user',
|
|
74
|
+
content: `[Previous conversation summary - use this as context]\n\n${summary}\n\n[End of summary - conversation continues below]`,
|
|
75
|
+
};
|
|
76
|
+
// Clear and reset conversation
|
|
77
|
+
setConversationHistory([summaryMessage]);
|
|
78
|
+
// Add a system message to display in the UI
|
|
79
|
+
const tokensAfter = estimateConversationTokens([summaryMessage]);
|
|
80
|
+
setMessages(prev => [...prev, {
|
|
81
|
+
id: getNextId(),
|
|
82
|
+
role: 'system',
|
|
83
|
+
content: color(`Conversation compacted: ${formatTokenCount(tokensBefore)} -> ${formatTokenCount(tokensAfter)} tokens`, Colors.dim),
|
|
84
|
+
timestamp: Date.now(),
|
|
85
|
+
}]);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
setMessages(prev => [...prev, {
|
|
90
|
+
id: getNextId(),
|
|
91
|
+
role: 'system',
|
|
92
|
+
content: color(`Compaction failed: ${e instanceof Error ? e.message : String(e)}`, Colors.red),
|
|
93
|
+
timestamp: Date.now(),
|
|
94
|
+
}]);
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
setIsCompacting(false);
|
|
99
|
+
}
|
|
100
|
+
}, [client, settings, conversationHistory]);
|
|
101
|
+
// Handle slash commands
|
|
102
|
+
const handleCommand = useCallback(async (command) => {
|
|
103
|
+
const parts = command.trim().split(/\s+/);
|
|
104
|
+
const cmd = parts[0].toLowerCase();
|
|
105
|
+
const args = parts.slice(1).join(' ');
|
|
106
|
+
if (cmd === '/token') {
|
|
107
|
+
// Token is handled inline by InputFooter
|
|
108
|
+
return { handled: false };
|
|
109
|
+
}
|
|
110
|
+
if (cmd === '/logout') {
|
|
111
|
+
await authLogout();
|
|
112
|
+
const newClient = reconnectClient(settings);
|
|
113
|
+
return {
|
|
114
|
+
handled: true,
|
|
115
|
+
output: newClient.isCloud && newClient.cloudProvider
|
|
116
|
+
? color(`Using cloud: ${loadCredentials()?.user.email} (${newClient.cloudProvider})`, Colors.green)
|
|
117
|
+
: color(`Using local provider: ${settings.provider}`, Colors.green),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (cmd === '/status') {
|
|
121
|
+
await authStatus();
|
|
122
|
+
return { handled: true };
|
|
123
|
+
}
|
|
124
|
+
if (cmd === '/config') {
|
|
125
|
+
// Config is handled inline by InputFooter
|
|
126
|
+
return { handled: false };
|
|
127
|
+
}
|
|
128
|
+
if (cmd === '/settings') {
|
|
129
|
+
return { handled: true, output: `\n${settings.getMaskedDisplay()}\n` };
|
|
130
|
+
}
|
|
131
|
+
if (cmd === '/context') {
|
|
132
|
+
// Determine the current model based on provider (handles both cloud and local mode)
|
|
133
|
+
let currentModel;
|
|
134
|
+
const effectiveProvider = settings.provider;
|
|
135
|
+
if (effectiveProvider === 'anthropic') {
|
|
136
|
+
currentModel = settings.anthropic.model;
|
|
137
|
+
}
|
|
138
|
+
else if (effectiveProvider === 'openai') {
|
|
139
|
+
currentModel = settings.openai.model;
|
|
140
|
+
}
|
|
141
|
+
else if (effectiveProvider === 'azure') {
|
|
142
|
+
currentModel = settings.azure.deployment;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
currentModel = settings.openai.model; // Fallback
|
|
146
|
+
}
|
|
147
|
+
debugLog(`[/context] effectiveProvider=${effectiveProvider}, currentModel=${currentModel}`);
|
|
148
|
+
const breakdown = calculateContextBreakdown(currentModel, conversationHistory);
|
|
149
|
+
const display = generateContextDisplay(breakdown);
|
|
150
|
+
return { handled: true, output: `\n${display}\n` };
|
|
151
|
+
}
|
|
152
|
+
if (cmd === '/help') {
|
|
153
|
+
const tokenCount = estimateConversationTokens(conversationHistory);
|
|
154
|
+
const helpText = `
|
|
155
|
+
Available commands:
|
|
156
|
+
/token Enter CLI token from web UI
|
|
157
|
+
/token <token> Set CLI token directly
|
|
158
|
+
/logout Log out from cloud platform
|
|
159
|
+
/status Show authentication status
|
|
160
|
+
/config Configure local API keys (instead of cloud)
|
|
161
|
+
/model Select AI model for current provider
|
|
162
|
+
/settings Show current settings
|
|
163
|
+
/update [path] Update to latest version (pull images, restart services)
|
|
164
|
+
/sync Sync library from cloud (opens menu)
|
|
165
|
+
/clear Clear conversation
|
|
166
|
+
/compact [msg] Compact conversation (summarize and reset)
|
|
167
|
+
Optional: add instructions for what to preserve
|
|
168
|
+
/context Show token usage breakdown
|
|
169
|
+
/help Show this help
|
|
170
|
+
quit, exit Exit
|
|
171
|
+
|
|
172
|
+
Current conversation: ~${formatTokenCount(tokenCount)} tokens (auto-compact at ${formatTokenCount(AUTO_COMPACT_THRESHOLD)})
|
|
173
|
+
`;
|
|
174
|
+
return { handled: true, output: helpText };
|
|
175
|
+
}
|
|
176
|
+
if (cmd === '/clear') {
|
|
177
|
+
setMessages([]);
|
|
178
|
+
setConversationHistory([]);
|
|
179
|
+
return { handled: true, output: color('Conversation cleared.', Colors.dim) };
|
|
180
|
+
}
|
|
181
|
+
if (cmd === '/compact') {
|
|
182
|
+
if (conversationHistory.length === 0) {
|
|
183
|
+
return { handled: true, output: color('Nothing to compact - conversation is empty.', Colors.dim) };
|
|
184
|
+
}
|
|
185
|
+
// Extract custom instructions if provided
|
|
186
|
+
const customInstructions = args.trim() || undefined;
|
|
187
|
+
const tokenCount = estimateConversationTokens(conversationHistory);
|
|
188
|
+
setMessages(prev => [...prev, {
|
|
189
|
+
id: getNextId(),
|
|
190
|
+
role: 'system',
|
|
191
|
+
content: color(`Compacting conversation (~${formatTokenCount(tokenCount)} tokens)...`, Colors.dim),
|
|
192
|
+
timestamp: Date.now(),
|
|
193
|
+
}]);
|
|
194
|
+
// Perform compaction asynchronously
|
|
195
|
+
performCompaction(customInstructions);
|
|
196
|
+
return { handled: true };
|
|
197
|
+
}
|
|
198
|
+
if (cmd === '/update') {
|
|
199
|
+
const deployPath = parts.slice(1).join(' ') || undefined;
|
|
200
|
+
// Run update command - it outputs directly to console
|
|
201
|
+
await onUpdateCommand(deployPath);
|
|
202
|
+
return { handled: true };
|
|
203
|
+
}
|
|
204
|
+
if (cmd === '/sync') {
|
|
205
|
+
// Sync is handled inline by InputFooter via SyncMenu
|
|
206
|
+
return { handled: false };
|
|
207
|
+
}
|
|
208
|
+
if (cmd === '/model') {
|
|
209
|
+
// Model selection is handled inline by InputFooter
|
|
210
|
+
return { handled: false };
|
|
211
|
+
}
|
|
212
|
+
return { handled: false };
|
|
213
|
+
}, [settings, reconnectClient, onUpdateCommand, conversationHistory, performCompaction]);
|
|
214
|
+
// Process a single message (used by both direct submission and queue processing)
|
|
215
|
+
const processMessage = useCallback(async (input) => {
|
|
216
|
+
// Handle special token submission from InputFooter
|
|
217
|
+
if (input.startsWith('__TOKEN__:')) {
|
|
218
|
+
const token = input.slice('__TOKEN__:'.length);
|
|
219
|
+
const success = await authSetToken(token);
|
|
220
|
+
if (success) {
|
|
221
|
+
const newClient = reconnectClient(settings);
|
|
222
|
+
if (newClient.isCloud && newClient.cloudProvider) {
|
|
223
|
+
const creds = loadCredentials();
|
|
224
|
+
if (creds) {
|
|
225
|
+
setMessages(prev => [...prev, {
|
|
226
|
+
id: getNextId(),
|
|
227
|
+
role: 'system',
|
|
228
|
+
content: color(`Using cloud: ${creds.user.email} (${newClient.cloudProvider})`, Colors.green),
|
|
229
|
+
timestamp: Date.now(),
|
|
230
|
+
}]);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
// Handle sync menu actions
|
|
237
|
+
if (input.startsWith('__SYNC__:')) {
|
|
238
|
+
const action = input.slice('__SYNC__:'.length);
|
|
239
|
+
const { runSync, resumeSync, showSyncStatus } = await import('../sync/index.js');
|
|
240
|
+
switch (action) {
|
|
241
|
+
case 'normal':
|
|
242
|
+
await runSync({ force: false });
|
|
243
|
+
break;
|
|
244
|
+
case 'force':
|
|
245
|
+
await runSync({ force: true });
|
|
246
|
+
break;
|
|
247
|
+
case 'preview':
|
|
248
|
+
await runSync({ dryRun: true });
|
|
249
|
+
break;
|
|
250
|
+
case 'status':
|
|
251
|
+
await showSyncStatus();
|
|
252
|
+
break;
|
|
253
|
+
case 'resume':
|
|
254
|
+
await resumeSync({});
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
// Handle config saved
|
|
260
|
+
if (input === '__CONFIG_SAVED__') {
|
|
261
|
+
debugLog(`[processMessage] Received __CONFIG_SAVED__, reloading settings`);
|
|
262
|
+
const reloadedSettings = loadSettings();
|
|
263
|
+
debugLog(`[processMessage] Reloaded settings: provider=${reloadedSettings.provider}, anthropic.model=${reloadedSettings.anthropic.model}, openai.model=${reloadedSettings.openai.model}`);
|
|
264
|
+
const newClient = reconnectClient(reloadedSettings);
|
|
265
|
+
debugLog(`[processMessage] Client reconnected: isCloud=${newClient.isCloud}, cloudProvider=${newClient.cloudProvider}`);
|
|
266
|
+
if (newClient.isCloud && newClient.cloudProvider) {
|
|
267
|
+
const creds = loadCredentials();
|
|
268
|
+
// Get the actual model being used based on the cloud provider
|
|
269
|
+
let modelInUse;
|
|
270
|
+
if (newClient.cloudProvider === 'anthropic') {
|
|
271
|
+
modelInUse = reloadedSettings.anthropic.model;
|
|
272
|
+
}
|
|
273
|
+
else if (newClient.cloudProvider === 'openai') {
|
|
274
|
+
modelInUse = reloadedSettings.openai.model;
|
|
275
|
+
}
|
|
276
|
+
else if (newClient.cloudProvider === 'azure') {
|
|
277
|
+
modelInUse = reloadedSettings.azure.deployment;
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
modelInUse = 'unknown';
|
|
281
|
+
}
|
|
282
|
+
debugLog(`[processMessage] Cloud mode: provider=${newClient.cloudProvider}, model=${modelInUse}`);
|
|
283
|
+
if (creds) {
|
|
284
|
+
setMessages(prev => [...prev, {
|
|
285
|
+
id: getNextId(),
|
|
286
|
+
role: 'system',
|
|
287
|
+
content: color(`Using cloud: ${creds.user.email} (${newClient.cloudProvider}: ${modelInUse})`, Colors.green),
|
|
288
|
+
timestamp: Date.now(),
|
|
289
|
+
}]);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
debugLog(`[processMessage] Local mode: provider=${reloadedSettings.provider}`);
|
|
294
|
+
setMessages(prev => [...prev, {
|
|
295
|
+
id: getNextId(),
|
|
296
|
+
role: 'system',
|
|
297
|
+
content: color(`Using local provider: ${reloadedSettings.provider}`, Colors.green),
|
|
298
|
+
timestamp: Date.now(),
|
|
299
|
+
}]);
|
|
300
|
+
}
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (!input.trim())
|
|
304
|
+
return;
|
|
305
|
+
// Handle exit commands
|
|
306
|
+
if (['quit', 'exit', 'q'].includes(input.toLowerCase())) {
|
|
307
|
+
exit();
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
// Add to command history (newest first, avoid duplicates at the front)
|
|
311
|
+
if (commandHistory[0] !== input) {
|
|
312
|
+
setCommandHistory(prev => {
|
|
313
|
+
const newHistory = [input, ...prev];
|
|
314
|
+
return newHistory.slice(0, 100); // Limit history size
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
// Handle slash commands
|
|
318
|
+
if (input.startsWith('/')) {
|
|
319
|
+
const result = await handleCommand(input);
|
|
320
|
+
if (result.handled) {
|
|
321
|
+
if (result.output) {
|
|
322
|
+
setMessages(prev => [...prev, {
|
|
323
|
+
id: getNextId(),
|
|
324
|
+
role: 'system',
|
|
325
|
+
content: result.output,
|
|
326
|
+
timestamp: Date.now(),
|
|
327
|
+
}]);
|
|
328
|
+
}
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// Regular chat message - add user message to history
|
|
333
|
+
const userMsg = {
|
|
334
|
+
id: getNextId(),
|
|
335
|
+
role: 'user',
|
|
336
|
+
content: input,
|
|
337
|
+
timestamp: Date.now(),
|
|
338
|
+
};
|
|
339
|
+
setMessages(prev => [...prev, userMsg]);
|
|
340
|
+
// Start streaming
|
|
341
|
+
setIsStreaming(true);
|
|
342
|
+
setStreamingContent('');
|
|
343
|
+
abortControllerRef.current = new AbortController();
|
|
344
|
+
// Create callback to get queued messages (called at each agent iteration)
|
|
345
|
+
const getQueuedMessage = () => {
|
|
346
|
+
if (messageQueueRef.current.length > 0) {
|
|
347
|
+
const msg = messageQueueRef.current.shift();
|
|
348
|
+
setQueueLength(messageQueueRef.current.length);
|
|
349
|
+
return msg;
|
|
350
|
+
}
|
|
351
|
+
return null;
|
|
352
|
+
};
|
|
353
|
+
try {
|
|
354
|
+
const generator = runAssistant(client, settings, input, conversationHistory, abortControllerRef.current.signal, getQueuedMessage);
|
|
355
|
+
let fullResponse = '';
|
|
356
|
+
let result = await generator.next();
|
|
357
|
+
while (!result.done) {
|
|
358
|
+
fullResponse += result.value;
|
|
359
|
+
setStreamingContent(fullResponse);
|
|
360
|
+
result = await generator.next();
|
|
361
|
+
}
|
|
362
|
+
// Update conversation history with the returned value
|
|
363
|
+
if (result.value) {
|
|
364
|
+
setConversationHistory(result.value);
|
|
365
|
+
// Check for auto-compaction after updating history
|
|
366
|
+
if (shouldAutoCompact(result.value)) {
|
|
367
|
+
const tokenCount = estimateConversationTokens(result.value);
|
|
368
|
+
setMessages(prev => [...prev, {
|
|
369
|
+
id: getNextId(),
|
|
370
|
+
role: 'system',
|
|
371
|
+
content: color(`Context limit approaching (~${formatTokenCount(tokenCount)} tokens). Auto-compacting conversation...`, Colors.yellow),
|
|
372
|
+
timestamp: Date.now(),
|
|
373
|
+
}]);
|
|
374
|
+
// Trigger auto-compaction after a brief delay to allow UI update
|
|
375
|
+
setTimeout(() => performCompaction(), 100);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// Move completed response to static messages
|
|
379
|
+
const assistantMsg = {
|
|
380
|
+
id: getNextId(),
|
|
381
|
+
role: 'assistant',
|
|
382
|
+
content: fullResponse,
|
|
383
|
+
timestamp: Date.now(),
|
|
384
|
+
};
|
|
385
|
+
setMessages(prev => [...prev, assistantMsg]);
|
|
386
|
+
}
|
|
387
|
+
catch (e) {
|
|
388
|
+
// Handle abort error gracefully (user interrupted with Escape)
|
|
389
|
+
if (e instanceof Error && (e.name === 'AbortError' || e.message.includes('aborted'))) {
|
|
390
|
+
const streamedSoFar = streamingContent;
|
|
391
|
+
if (streamedSoFar) {
|
|
392
|
+
// Save what was streamed so far
|
|
393
|
+
setMessages(prev => [...prev, {
|
|
394
|
+
id: getNextId(),
|
|
395
|
+
role: 'assistant',
|
|
396
|
+
content: streamedSoFar + color(' (interrupted)', Colors.dim),
|
|
397
|
+
timestamp: Date.now(),
|
|
398
|
+
}]);
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
setMessages(prev => [...prev, {
|
|
402
|
+
id: getNextId(),
|
|
403
|
+
role: 'system',
|
|
404
|
+
content: color('(interrupted)', Colors.dim),
|
|
405
|
+
timestamp: Date.now(),
|
|
406
|
+
}]);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
setMessages(prev => [...prev, {
|
|
411
|
+
id: getNextId(),
|
|
412
|
+
role: 'system',
|
|
413
|
+
content: color(`Error: ${e instanceof Error ? e.message : String(e)}`, Colors.red),
|
|
414
|
+
timestamp: Date.now(),
|
|
415
|
+
}]);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
finally {
|
|
419
|
+
setStreamingContent('');
|
|
420
|
+
setIsStreaming(false);
|
|
421
|
+
abortControllerRef.current = null;
|
|
422
|
+
}
|
|
423
|
+
}, [client, settings, conversationHistory, streamingContent, commandHistory, handleCommand, reconnectClient, exit, performCompaction]);
|
|
424
|
+
// Handle user input submission - queues messages during streaming
|
|
425
|
+
const handleSubmit = useCallback(async (input) => {
|
|
426
|
+
if (!input.trim())
|
|
427
|
+
return;
|
|
428
|
+
// Special inputs bypass queuing
|
|
429
|
+
if (input.startsWith('__TOKEN__:') || input === '__CONFIG_SAVED__' || input.startsWith('__SYNC__:')) {
|
|
430
|
+
await processMessage(input);
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
// If streaming, queue the message for injection at next agent iteration
|
|
434
|
+
if (isStreaming) {
|
|
435
|
+
messageQueueRef.current.push(input);
|
|
436
|
+
setQueueLength(messageQueueRef.current.length);
|
|
437
|
+
// Add a system message indicating the message was queued
|
|
438
|
+
setMessages(prev => [...prev, {
|
|
439
|
+
id: getNextId(),
|
|
440
|
+
role: 'system',
|
|
441
|
+
content: color(`[Queued for next iteration] "${input.length > 50 ? input.slice(0, 50) + '...' : input}"`, Colors.dim),
|
|
442
|
+
timestamp: Date.now(),
|
|
443
|
+
}]);
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
// Not streaming - process immediately
|
|
447
|
+
await processMessage(input);
|
|
448
|
+
}, [isStreaming, processMessage]);
|
|
449
|
+
// Handle Escape key to interrupt streaming
|
|
450
|
+
useInput((input, key) => {
|
|
451
|
+
if (key.escape && isStreaming && abortControllerRef.current) {
|
|
452
|
+
abortControllerRef.current.abort();
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
// Render a single message
|
|
456
|
+
const renderMessage = (msg) => {
|
|
457
|
+
if (msg.role === 'user') {
|
|
458
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: "green", bold: true, children: "You: " }), _jsx(Text, { children: msg.content })] }, msg.id));
|
|
459
|
+
}
|
|
460
|
+
else if (msg.role === 'assistant') {
|
|
461
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: "blue", bold: true, children: "Assistant: " }), _jsx(Text, { children: msg.content })] }, msg.id));
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
// System message
|
|
465
|
+
return (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { children: msg.content }) }, msg.id));
|
|
466
|
+
}
|
|
467
|
+
};
|
|
468
|
+
return (_jsxs(Box, { flexDirection: "column", width: "100%", children: [_jsx(Static, { items: messages, children: renderMessage }), isStreaming && streamingContent && (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: "blue", bold: true, children: "Assistant: " }), _jsx(Text, { children: streamingContent })] })), isStreaming && !streamingContent && (_jsxs(Box, { marginBottom: 1, children: [_jsx(Text, { dimColor: true, children: "Thinking..." }), queueLength > 0 && (_jsxs(Text, { dimColor: true, children: [" (", queueLength, " message", queueLength > 1 ? 's' : '', " queued)"] }))] })), isStreaming && streamingContent && queueLength > 0 && (_jsx(Box, { marginBottom: 0, children: _jsxs(Text, { dimColor: true, children: ["(", queueLength, " message", queueLength > 1 ? 's' : '', " queued)"] }) })), _jsx(InputFooter, { onSubmit: handleSubmit, history: commandHistory, isDisabled: isStreaming || isCompacting, settings: settings })] }));
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=ChatApp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatApp.js","sourceRoot":"","sources":["../../src/components/ChatApp.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { CommandDefinition } from '../autocomplete.js';
|
|
3
|
+
interface CommandPaletteProps {
|
|
4
|
+
commands: CommandDefinition[];
|
|
5
|
+
selectedIndex: number;
|
|
6
|
+
filterText: string;
|
|
7
|
+
isOpen: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Inline command palette component that displays below the input box.
|
|
11
|
+
* Shows filtered commands with the selected item highlighted.
|
|
12
|
+
*/
|
|
13
|
+
export declare function CommandPalette({ commands, selectedIndex, filterText, isOpen, }: CommandPaletteProps): React.ReactElement | null;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=CommandPalette.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.d.ts","sourceRoot":"","sources":["../../src/components/CommandPalette.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,aAAa,EACb,UAAU,EACV,MAAM,GACP,EAAE,mBAAmB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CA+DjD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
/**
|
|
4
|
+
* Inline command palette component that displays below the input box.
|
|
5
|
+
* Shows filtered commands with the selected item highlighted.
|
|
6
|
+
*/
|
|
7
|
+
export function CommandPalette({ commands, selectedIndex, filterText, isOpen, }) {
|
|
8
|
+
if (!isOpen || commands.length === 0) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
// Limit displayed commands to prevent overflow
|
|
12
|
+
const maxDisplayCommands = 8;
|
|
13
|
+
const displayCommands = commands.slice(0, maxDisplayCommands);
|
|
14
|
+
// Calculate the longest command name for alignment
|
|
15
|
+
const maxNameLength = Math.max(...displayCommands.map((cmd) => cmd.name.length));
|
|
16
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "single", borderColor: "cyan", paddingX: 1, marginTop: 0, children: [_jsx(Box, { marginBottom: 0, children: _jsxs(Text, { dimColor: true, children: ["Commands", filterText ? ` matching "/${filterText}"` : '', ":"] }) }), displayCommands.map((cmd, index) => {
|
|
17
|
+
const isSelected = index === selectedIndex;
|
|
18
|
+
const paddedName = cmd.name.padEnd(maxNameLength + 2);
|
|
19
|
+
return (_jsx(Box, { children: isSelected ? (_jsxs(Text, { inverse: true, bold: true, children: [' ', paddedName, cmd.description] })) : (_jsxs(Text, { children: [_jsxs(Text, { color: "cyan", children: [' ', cmd.name] }), _jsxs(Text, { dimColor: true, children: [' '.repeat(maxNameLength - cmd.name.length + 2), cmd.description] })] })) }, cmd.name));
|
|
20
|
+
}), commands.length > maxDisplayCommands && (_jsxs(Text, { dimColor: true, italic: true, children: [' ', "...and ", commands.length - maxDisplayCommands, " more"] })), _jsx(Box, { marginTop: 0, children: _jsxs(Text, { dimColor: true, children: [' ', "Use arrows to navigate, Enter to select, Esc to close"] }) })] }));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=CommandPalette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.js","sourceRoot":"","sources":["../../src/components/CommandPalette.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAUhC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,QAAQ,EACR,aAAa,EACb,UAAU,EACV,MAAM,GACc;IACpB,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+CAA+C;IAC/C,MAAM,kBAAkB,GAAG,CAAC,CAAC;IAC7B,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAE9D,mDAAmD;IACnD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEjF,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,SAAS,EAAE,CAAC,aAGZ,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,MAAC,IAAI,IAAC,QAAQ,+BACH,UAAU,CAAC,CAAC,CAAC,eAAe,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,SAClD,GACH,EAGL,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBAClC,MAAM,UAAU,GAAG,KAAK,KAAK,aAAa,CAAC;gBAC3C,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;gBAEtD,OAAO,CACL,KAAC,GAAG,cACD,UAAU,CAAC,CAAC,CAAC,CACZ,MAAC,IAAI,IAAC,OAAO,QAAC,IAAI,mBACf,GAAG,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,IAC5B,CACR,CAAC,CAAC,CAAC,CACF,MAAC,IAAI,eACH,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,aAAE,GAAG,EAAE,GAAG,CAAC,IAAI,IAAQ,EACzC,MAAC,IAAI,IAAC,QAAQ,mBAAE,GAAG,CAAC,MAAM,CAAC,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,WAAW,IAAQ,IACnF,CACR,IAVO,GAAG,CAAC,IAAI,CAWZ,CACP,CAAC;YACJ,CAAC,CAAC,EAGD,QAAQ,CAAC,MAAM,GAAG,kBAAkB,IAAI,CACvC,MAAC,IAAI,IAAC,QAAQ,QAAC,MAAM,mBAClB,GAAG,aAAS,QAAQ,CAAC,MAAM,GAAG,kBAAkB,aAC5C,CACR,EAGD,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,QAAQ,mBACX,GAAG,6DACC,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Settings } from '../settings.js';
|
|
3
|
+
interface ConfigWizardProps {
|
|
4
|
+
isOpen: boolean;
|
|
5
|
+
settings: Settings;
|
|
6
|
+
onComplete: (settings: Settings) => void;
|
|
7
|
+
onCancel: () => void;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* ConfigWizard - Multi-step inline configuration wizard for LLM providers.
|
|
11
|
+
*
|
|
12
|
+
* Steps:
|
|
13
|
+
* 1. Select provider (Anthropic, OpenAI, Azure)
|
|
14
|
+
* 2. Enter API key (masked input)
|
|
15
|
+
* 3. Select model (Anthropic/OpenAI) or continue Azure flow
|
|
16
|
+
*
|
|
17
|
+
* For Azure:
|
|
18
|
+
* 2. Enter endpoint
|
|
19
|
+
* 3. Enter API key (masked)
|
|
20
|
+
* 4. Enter API version
|
|
21
|
+
* 5. Enter deployment name
|
|
22
|
+
*/
|
|
23
|
+
export declare function ConfigWizard({ isOpen, settings, onComplete, onCancel, }: ConfigWizardProps): React.ReactElement | null;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=ConfigWizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigWizard.d.ts","sourceRoot":"","sources":["../../src/components/ConfigWizard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAA0B,MAAM,gBAAgB,CAAC;AAWlE,UAAU,iBAAiB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACzC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAaD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,UAAU,EACV,QAAQ,GACT,EAAE,iBAAiB,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAsd/C"}
|