@syntero/orca-cli 1.3.3 → 1.3.5

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 (46) hide show
  1. package/dist/assistant/prompts.d.ts.map +1 -1
  2. package/dist/assistant/prompts.js +22 -0
  3. package/dist/assistant/prompts.js.map +1 -1
  4. package/dist/components/ChatApp.d.ts.map +1 -1
  5. package/dist/components/ChatApp.js +8 -6
  6. package/dist/components/ChatApp.js.map +1 -1
  7. package/dist/components/InputFooter.d.ts.map +1 -1
  8. package/dist/components/InputFooter.js +34 -695
  9. package/dist/components/InputFooter.js.map +1 -1
  10. package/dist/components/ResumeMenu.d.ts.map +1 -1
  11. package/dist/components/ResumeMenu.js +24 -3
  12. package/dist/components/ResumeMenu.js.map +1 -1
  13. package/dist/components/hooks/useCommandPalette.d.ts +13 -0
  14. package/dist/components/hooks/useCommandPalette.d.ts.map +1 -0
  15. package/dist/components/hooks/useCommandPalette.js +38 -0
  16. package/dist/components/hooks/useCommandPalette.js.map +1 -0
  17. package/dist/components/hooks/useInputKeyHandler.d.ts +14 -0
  18. package/dist/components/hooks/useInputKeyHandler.d.ts.map +1 -0
  19. package/dist/components/hooks/useInputKeyHandler.js +584 -0
  20. package/dist/components/hooks/useInputKeyHandler.js.map +1 -0
  21. package/dist/components/hooks/useInputLines.d.ts +18 -0
  22. package/dist/components/hooks/useInputLines.d.ts.map +1 -0
  23. package/dist/components/hooks/useInputLines.js +46 -0
  24. package/dist/components/hooks/useInputLines.js.map +1 -0
  25. package/dist/components/hooks/useMenus.d.ts +60 -0
  26. package/dist/components/hooks/useMenus.d.ts.map +1 -0
  27. package/dist/components/hooks/useMenus.js +266 -0
  28. package/dist/components/hooks/useMenus.js.map +1 -0
  29. package/dist/components/hooks/usePasteBlocks.d.ts +14 -0
  30. package/dist/components/hooks/usePasteBlocks.d.ts.map +1 -0
  31. package/dist/components/hooks/usePasteBlocks.js +32 -0
  32. package/dist/components/hooks/usePasteBlocks.js.map +1 -0
  33. package/dist/models.js +4 -4
  34. package/dist/settings.js +1 -1
  35. package/dist/tools/handler.d.ts.map +1 -1
  36. package/dist/tools/handler.js +11 -0
  37. package/dist/tools/handler.js.map +1 -1
  38. package/dist/tools/index.d.ts +152 -0
  39. package/dist/tools/index.d.ts.map +1 -1
  40. package/dist/tools/index.js +2 -0
  41. package/dist/tools/index.js.map +1 -1
  42. package/dist/tools/inference.d.ts +127 -0
  43. package/dist/tools/inference.d.ts.map +1 -0
  44. package/dist/tools/inference.js +318 -0
  45. package/dist/tools/inference.js.map +1 -0
  46. package/package.json +4 -4
@@ -0,0 +1,46 @@
1
+ import { useState, useCallback } from 'react';
2
+ // ---------------------------------------------------------------------------
3
+ // Hook
4
+ // ---------------------------------------------------------------------------
5
+ export function useInputLines(onSubmit, pasteBlocks) {
6
+ const { expandLines, clearPasteBlocks } = pasteBlocks;
7
+ // State for multi-line input - combined into single object for atomic updates
8
+ const [inputState, setInputState] = useState({
9
+ lines: [''],
10
+ currentLine: 0,
11
+ cursorPos: 0,
12
+ });
13
+ // State for command history navigation
14
+ // historyIndex: -1 means not navigating, 0 = most recent, length-1 = oldest
15
+ const [historyIndex, setHistoryIndex] = useState(-1);
16
+ // savedInput: saves the current input when user starts navigating history
17
+ const [savedInput, setSavedInput] = useState('');
18
+ // Helper to update input state atomically
19
+ const updateInputState = (updates) => {
20
+ setInputState(prev => ({ ...prev, ...updates }));
21
+ };
22
+ const handleSubmit = useCallback(() => {
23
+ const result = expandLines(inputState.lines).join('\n').trim();
24
+ if (!result)
25
+ return;
26
+ // Reset history navigation state
27
+ setHistoryIndex(-1);
28
+ setSavedInput('');
29
+ // Clear input and paste blocks
30
+ setInputState({ lines: [''], currentLine: 0, cursorPos: 0 });
31
+ clearPasteBlocks();
32
+ // Call the onSubmit callback (parent handles queuing if streaming)
33
+ onSubmit(result);
34
+ }, [inputState.lines, expandLines, clearPasteBlocks, onSubmit]);
35
+ return {
36
+ inputState,
37
+ setInputState,
38
+ updateInputState,
39
+ historyIndex,
40
+ setHistoryIndex,
41
+ savedInput,
42
+ setSavedInput,
43
+ handleSubmit,
44
+ };
45
+ }
46
+ //# sourceMappingURL=useInputLines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInputLines.js","sourceRoot":"","sources":["../../../src/components/hooks/useInputLines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAwB9C,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E,MAAM,UAAU,aAAa,CAC3B,QAAiC,EACjC,WAAiC;IAEjC,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,WAAW,CAAC;IAEtD,8EAA8E;IAC9E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAa;QACvD,KAAK,EAAE,CAAC,EAAE,CAAC;QACX,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;KACb,CAAC,CAAC;IAEH,uCAAuC;IACvC,4EAA4E;IAC5E,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,0EAA0E;IAC1E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEjD,0CAA0C;IAC1C,MAAM,gBAAgB,GAAG,CAAC,OAA4B,EAAE,EAAE;QACxD,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,iCAAiC;QACjC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,+BAA+B;QAC/B,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7D,gBAAgB,EAAE,CAAC;QACnB,mEAAmE;QACnE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEhE,OAAO;QACL,UAAU;QACV,aAAa;QACb,gBAAgB;QAChB,YAAY;QACZ,eAAe;QACf,UAAU;QACV,aAAa;QACb,YAAY;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { type ConversationMeta } from '../../conversations/index.js';
2
+ import { Settings } from '../../settings.js';
3
+ import type { SyncMenuResult } from '../SyncMenu.js';
4
+ import type { UploadMenuResult } from '../UploadMenu.js';
5
+ import type { InputState } from './useInputLines.js';
6
+ export interface UseMenusParams {
7
+ settings: Settings | undefined;
8
+ onSubmit: (value: string) => void;
9
+ onResumeConversation?: (conversationId: string) => void;
10
+ onSettingsChange?: (settings: Settings) => void;
11
+ updateInputState: (updates: Partial<InputState>) => void;
12
+ }
13
+ export interface UseMenusReturn {
14
+ confirmationMessage: string | null;
15
+ setConfirmationMessage: React.Dispatch<React.SetStateAction<string | null>>;
16
+ currentSettings: Settings | undefined;
17
+ setCurrentSettings: React.Dispatch<React.SetStateAction<Settings | undefined>>;
18
+ showModelMenu: boolean;
19
+ setShowModelMenu: React.Dispatch<React.SetStateAction<boolean>>;
20
+ closeModelMenu: () => void;
21
+ handleModelSelect: (provider: string, modelId: string) => void;
22
+ handleModelCancel: () => void;
23
+ showStreamingMenu: boolean;
24
+ setShowStreamingMenu: React.Dispatch<React.SetStateAction<boolean>>;
25
+ closeStreamingMenu: () => void;
26
+ handleStreamingSelect: (streaming: boolean) => void;
27
+ handleStreamingCancel: () => void;
28
+ showConfigWizard: boolean;
29
+ setShowConfigWizard: React.Dispatch<React.SetStateAction<boolean>>;
30
+ closeConfigWizard: () => void;
31
+ handleConfigComplete: (newSettings: Settings) => void;
32
+ handleConfigCancel: () => void;
33
+ showTokenInput: boolean;
34
+ setShowTokenInput: React.Dispatch<React.SetStateAction<boolean>>;
35
+ closeTokenInput: () => void;
36
+ handleTokenSubmit: (token: string) => void;
37
+ handleTokenCancel: () => void;
38
+ showSyncMenu: boolean;
39
+ setShowSyncMenu: React.Dispatch<React.SetStateAction<boolean>>;
40
+ closeSyncMenu: () => void;
41
+ handleSyncSelect: (result: SyncMenuResult) => Promise<void>;
42
+ handleSyncCancel: () => void;
43
+ showUploadMenu: boolean;
44
+ setShowUploadMenu: React.Dispatch<React.SetStateAction<boolean>>;
45
+ closeUploadMenu: () => void;
46
+ handleUploadSelect: (result: UploadMenuResult) => void;
47
+ handleUploadCancel: () => void;
48
+ showResumeMenu: boolean;
49
+ setShowResumeMenu: React.Dispatch<React.SetStateAction<boolean>>;
50
+ closeResumeMenu: () => void;
51
+ handleResumeSelect: (conversationId: string) => void;
52
+ handleResumeCancel: () => void;
53
+ handleResumeDelete: (conversationId: string) => void;
54
+ resumeConversations: ConversationMeta[];
55
+ setResumeConversations: React.Dispatch<React.SetStateAction<ConversationMeta[]>>;
56
+ /** True when any sub-menu is open (used to suppress key handling) */
57
+ isAnyMenuOpen: boolean;
58
+ }
59
+ export declare function useMenus({ settings, onSubmit, onResumeConversation, onSettingsChange, updateInputState, }: UseMenusParams): UseMenusReturn;
60
+ //# sourceMappingURL=useMenus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMenus.d.ts","sourceRoot":"","sources":["../../../src/components/hooks/useMenus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,266 @@
1
+ import { useState, useCallback, useEffect } from 'react';
2
+ import { listConversations, deleteConversation } from '../../conversations/index.js';
3
+ import { Settings, Provider, saveSettings, debugLog as settingsDebugLog } from '../../settings.js';
4
+ import { isAuthenticated, setSelectedCloudProvider } from '../../auth.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Hook
7
+ // ---------------------------------------------------------------------------
8
+ export function useMenus({ settings, onSubmit, onResumeConversation, onSettingsChange, updateInputState, }) {
9
+ // ---- Confirmation message ----
10
+ const [confirmationMessage, setConfirmationMessage] = useState(null);
11
+ useEffect(() => {
12
+ if (confirmationMessage) {
13
+ const timer = setTimeout(() => {
14
+ setConfirmationMessage(null);
15
+ }, 2000);
16
+ return () => clearTimeout(timer);
17
+ }
18
+ }, [confirmationMessage]);
19
+ // ---- Settings ----
20
+ const [currentSettings, setCurrentSettings] = useState(settings);
21
+ useEffect(() => {
22
+ if (settings) {
23
+ setCurrentSettings(settings);
24
+ }
25
+ }, [settings]);
26
+ // ---- Model menu ----
27
+ const [showModelMenu, setShowModelMenu] = useState(false);
28
+ const closeModelMenu = useCallback(() => {
29
+ setShowModelMenu(false);
30
+ updateInputState({ lines: [''], cursorPos: 0 });
31
+ }, [updateInputState]);
32
+ const handleModelSelect = useCallback((provider, modelId) => {
33
+ if (!currentSettings) {
34
+ settingsDebugLog('[handleModelSelect] No currentSettings, aborting');
35
+ closeModelMenu();
36
+ return;
37
+ }
38
+ settingsDebugLog(`[handleModelSelect] Changing to provider=${provider}, model=${modelId}`);
39
+ settingsDebugLog(`[handleModelSelect] Before: provider=${currentSettings.provider}, isAuthenticated=${isAuthenticated()}`);
40
+ const updatedSettings = Settings.fromDict(currentSettings.toDict());
41
+ updatedSettings.provider = provider;
42
+ if (provider === Provider.ANTHROPIC || provider === 'anthropic') {
43
+ updatedSettings.anthropic.model = modelId;
44
+ }
45
+ else if (provider === Provider.OPENAI || provider === 'openai') {
46
+ updatedSettings.openai.model = modelId;
47
+ }
48
+ else if (provider === Provider.AZURE || provider === 'azure') {
49
+ updatedSettings.azure.deployment = modelId;
50
+ }
51
+ settingsDebugLog(`[handleModelSelect] Saving settings: provider=${updatedSettings.provider}`);
52
+ saveSettings(updatedSettings);
53
+ if (isAuthenticated()) {
54
+ settingsDebugLog(`[handleModelSelect] Cloud authenticated, calling setSelectedCloudProvider(${provider})`);
55
+ const cloudProviderSet = setSelectedCloudProvider(provider);
56
+ if (!cloudProviderSet) {
57
+ settingsDebugLog(`[handleModelSelect] WARNING: setSelectedCloudProvider returned false - provider ${provider} may not be available in cloud config`);
58
+ }
59
+ else {
60
+ settingsDebugLog(`[handleModelSelect] Cloud provider selection saved successfully`);
61
+ }
62
+ }
63
+ setCurrentSettings(updatedSettings);
64
+ const providerName = provider.charAt(0).toUpperCase() + provider.slice(1);
65
+ setConfirmationMessage(`Provider changed to ${providerName}, model: ${modelId}`);
66
+ closeModelMenu();
67
+ settingsDebugLog(`[handleModelSelect] Triggering reconnect via __CONFIG_SAVED__`);
68
+ setTimeout(() => {
69
+ onSubmit('__CONFIG_SAVED__');
70
+ }, 100);
71
+ }, [currentSettings, closeModelMenu, onSubmit]);
72
+ const handleModelCancel = useCallback(() => {
73
+ setConfirmationMessage('Model selection cancelled');
74
+ closeModelMenu();
75
+ }, [closeModelMenu]);
76
+ // ---- Streaming menu ----
77
+ const [showStreamingMenu, setShowStreamingMenu] = useState(false);
78
+ const closeStreamingMenu = useCallback(() => {
79
+ setShowStreamingMenu(false);
80
+ updateInputState({ lines: [''], cursorPos: 0 });
81
+ }, [updateInputState]);
82
+ const handleStreamingSelect = useCallback((streaming) => {
83
+ if (!currentSettings) {
84
+ closeStreamingMenu();
85
+ return;
86
+ }
87
+ const updatedSettings = Settings.fromDict({ ...currentSettings.toDict(), streaming });
88
+ saveSettings(updatedSettings);
89
+ setCurrentSettings(updatedSettings);
90
+ onSettingsChange?.(updatedSettings);
91
+ const statusText = streaming ? 'enabled' : 'disabled';
92
+ setConfirmationMessage(`Response streaming ${statusText}`);
93
+ closeStreamingMenu();
94
+ }, [currentSettings, closeStreamingMenu, onSettingsChange]);
95
+ const handleStreamingCancel = useCallback(() => {
96
+ setConfirmationMessage('Streaming selection cancelled');
97
+ closeStreamingMenu();
98
+ }, [closeStreamingMenu]);
99
+ // ---- Config wizard ----
100
+ const [showConfigWizard, setShowConfigWizard] = useState(false);
101
+ const closeConfigWizard = useCallback(() => {
102
+ setShowConfigWizard(false);
103
+ updateInputState({ lines: [''], cursorPos: 0 });
104
+ }, [updateInputState]);
105
+ const handleConfigComplete = useCallback((newSettings) => {
106
+ saveSettings(newSettings);
107
+ setCurrentSettings(newSettings);
108
+ setConfirmationMessage(`Configuration saved for ${newSettings.provider}`);
109
+ closeConfigWizard();
110
+ setTimeout(() => {
111
+ onSubmit('__CONFIG_SAVED__');
112
+ }, 100);
113
+ }, [closeConfigWizard, onSubmit]);
114
+ const handleConfigCancel = useCallback(() => {
115
+ setConfirmationMessage('Configuration cancelled');
116
+ closeConfigWizard();
117
+ }, [closeConfigWizard]);
118
+ // ---- Token input ----
119
+ const [showTokenInput, setShowTokenInput] = useState(false);
120
+ const closeTokenInput = useCallback(() => {
121
+ setShowTokenInput(false);
122
+ updateInputState({ lines: [''], cursorPos: 0 });
123
+ }, [updateInputState]);
124
+ const handleTokenSubmit = useCallback((token) => {
125
+ closeTokenInput();
126
+ onSubmit(`__TOKEN__:${token}`);
127
+ }, [closeTokenInput, onSubmit]);
128
+ const handleTokenCancel = useCallback(() => {
129
+ setConfirmationMessage('Token entry cancelled');
130
+ closeTokenInput();
131
+ }, [closeTokenInput]);
132
+ // ---- Sync menu ----
133
+ const [showSyncMenu, setShowSyncMenu] = useState(false);
134
+ const closeSyncMenu = useCallback(() => {
135
+ setShowSyncMenu(false);
136
+ updateInputState({ lines: [''], cursorPos: 0 });
137
+ }, [updateInputState]);
138
+ const handleSyncSelect = useCallback(async (result) => {
139
+ closeSyncMenu();
140
+ switch (result.action) {
141
+ case 'sync':
142
+ onSubmit(`__SYNC__:${JSON.stringify({
143
+ scope: result.scope ?? 'all',
144
+ force: result.force ?? false,
145
+ pathFilter: result.pathFilter,
146
+ workspaceUser: result.workspaceUser,
147
+ workspaceFolders: result.workspaceFolders,
148
+ orgId: result.orgId,
149
+ })}`);
150
+ break;
151
+ case 'preview':
152
+ onSubmit('__SYNC__:preview');
153
+ break;
154
+ case 'status':
155
+ onSubmit('__SYNC__:status');
156
+ break;
157
+ case 'resume':
158
+ onSubmit('__SYNC__:resume');
159
+ break;
160
+ case 'cancel':
161
+ break;
162
+ }
163
+ }, [closeSyncMenu, onSubmit]);
164
+ const handleSyncCancel = useCallback(() => {
165
+ setConfirmationMessage('Sync cancelled');
166
+ closeSyncMenu();
167
+ }, [closeSyncMenu]);
168
+ // ---- Upload menu ----
169
+ const [showUploadMenu, setShowUploadMenu] = useState(false);
170
+ const closeUploadMenu = useCallback(() => {
171
+ setShowUploadMenu(false);
172
+ updateInputState({ lines: [''], cursorPos: 0 });
173
+ }, [updateInputState]);
174
+ const handleUploadSelect = useCallback((result) => {
175
+ closeUploadMenu();
176
+ if (result.action === 'upload') {
177
+ onSubmit(`__UPLOAD__:${JSON.stringify({
178
+ scope: result.scope,
179
+ pathFilter: result.pathFilter,
180
+ workspaceUser: result.workspaceUser,
181
+ workspaceFolders: result.workspaceFolders,
182
+ orgId: result.orgId,
183
+ })}`);
184
+ }
185
+ }, [closeUploadMenu, onSubmit]);
186
+ const handleUploadCancel = useCallback(() => {
187
+ setConfirmationMessage('Upload cancelled');
188
+ closeUploadMenu();
189
+ }, [closeUploadMenu]);
190
+ // ---- Resume menu ----
191
+ const [showResumeMenu, setShowResumeMenu] = useState(false);
192
+ const [resumeConversations, setResumeConversations] = useState([]);
193
+ const closeResumeMenu = useCallback(() => {
194
+ setShowResumeMenu(false);
195
+ updateInputState({ lines: [''], cursorPos: 0 });
196
+ }, [updateInputState]);
197
+ const handleResumeSelect = useCallback((conversationId) => {
198
+ closeResumeMenu();
199
+ onResumeConversation?.(conversationId);
200
+ }, [closeResumeMenu, onResumeConversation]);
201
+ const handleResumeCancel = useCallback(() => {
202
+ setConfirmationMessage('Resume cancelled');
203
+ closeResumeMenu();
204
+ }, [closeResumeMenu]);
205
+ const handleResumeDelete = useCallback((conversationId) => {
206
+ const deleted = deleteConversation(conversationId);
207
+ if (deleted) {
208
+ setResumeConversations(listConversations());
209
+ setConfirmationMessage('Conversation deleted');
210
+ }
211
+ }, []);
212
+ // ---- Aggregate helper ----
213
+ const isAnyMenuOpen = showModelMenu ||
214
+ showStreamingMenu ||
215
+ showConfigWizard ||
216
+ showTokenInput ||
217
+ showSyncMenu ||
218
+ showUploadMenu ||
219
+ showResumeMenu;
220
+ return {
221
+ confirmationMessage,
222
+ setConfirmationMessage,
223
+ currentSettings,
224
+ setCurrentSettings,
225
+ showModelMenu,
226
+ setShowModelMenu,
227
+ closeModelMenu,
228
+ handleModelSelect,
229
+ handleModelCancel,
230
+ showStreamingMenu,
231
+ setShowStreamingMenu,
232
+ closeStreamingMenu,
233
+ handleStreamingSelect,
234
+ handleStreamingCancel,
235
+ showConfigWizard,
236
+ setShowConfigWizard,
237
+ closeConfigWizard,
238
+ handleConfigComplete,
239
+ handleConfigCancel,
240
+ showTokenInput,
241
+ setShowTokenInput,
242
+ closeTokenInput,
243
+ handleTokenSubmit,
244
+ handleTokenCancel,
245
+ showSyncMenu,
246
+ setShowSyncMenu,
247
+ closeSyncMenu,
248
+ handleSyncSelect,
249
+ handleSyncCancel,
250
+ showUploadMenu,
251
+ setShowUploadMenu,
252
+ closeUploadMenu,
253
+ handleUploadSelect,
254
+ handleUploadCancel,
255
+ showResumeMenu,
256
+ setShowResumeMenu,
257
+ closeResumeMenu,
258
+ handleResumeSelect,
259
+ handleResumeCancel,
260
+ handleResumeDelete,
261
+ resumeConversations,
262
+ setResumeConversations,
263
+ isAnyMenuOpen,
264
+ };
265
+ }
266
+ //# sourceMappingURL=useMenus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMenus.js","sourceRoot":"","sources":["../../../src/components/hooks/useMenus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare const isPasteMarker: (line: string) => boolean;
2
+ export declare const parsePasteMarker: (line: string) => {
3
+ id: number;
4
+ lineCount: number;
5
+ } | null;
6
+ export declare const makePasteMarker: (id: number, lineCount: number) => string;
7
+ export interface UsePasteBlocksReturn {
8
+ pasteBlocksRef: React.MutableRefObject<Map<number, string[]>>;
9
+ pasteCounterRef: React.MutableRefObject<number>;
10
+ expandLines: (linesToExpand: string[]) => string[];
11
+ clearPasteBlocks: () => void;
12
+ }
13
+ export declare function usePasteBlocks(): UsePasteBlocksReturn;
14
+ //# sourceMappingURL=usePasteBlocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePasteBlocks.d.ts","sourceRoot":"","sources":["../../../src/components/hooks/usePasteBlocks.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,YACc,CAAC;AAEzD,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM;;;QAG5C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,IAAI,MAAM,EAAE,WAAW,MAAM,WACzB,CAAC;AAMrC,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9D,eAAe,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChD,WAAW,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IACnD,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED,wBAAgB,cAAc,IAAI,oBAAoB,CAsBrD"}
@@ -0,0 +1,32 @@
1
+ import { useRef, useCallback } from 'react';
2
+ // ---------------------------------------------------------------------------
3
+ // Paste marker utilities for collapsed large pastes
4
+ // ---------------------------------------------------------------------------
5
+ const PASTE_MARKER_RE = /^\x01PASTE:(\d+):(\d+)\x01$/;
6
+ export const isPasteMarker = (line) => line.charCodeAt(0) === 1 && PASTE_MARKER_RE.test(line);
7
+ export const parsePasteMarker = (line) => {
8
+ const m = line.match(PASTE_MARKER_RE);
9
+ return m ? { id: parseInt(m[1], 10), lineCount: parseInt(m[2], 10) } : null;
10
+ };
11
+ export const makePasteMarker = (id, lineCount) => `\x01PASTE:${id}:${lineCount}\x01`;
12
+ export function usePasteBlocks() {
13
+ const pasteBlocksRef = useRef(new Map());
14
+ const pasteCounterRef = useRef(0);
15
+ // Expand paste markers back into real lines
16
+ const expandLines = useCallback((linesToExpand) => {
17
+ return linesToExpand.flatMap(line => {
18
+ const marker = parsePasteMarker(line);
19
+ if (marker) {
20
+ return pasteBlocksRef.current.get(marker.id) || [];
21
+ }
22
+ return [line];
23
+ });
24
+ }, []);
25
+ // Clear all paste block state
26
+ const clearPasteBlocks = useCallback(() => {
27
+ pasteBlocksRef.current.clear();
28
+ pasteCounterRef.current = 0;
29
+ }, []);
30
+ return { pasteBlocksRef, pasteCounterRef, expandLines, clearPasteBlocks };
31
+ }
32
+ //# sourceMappingURL=usePasteBlocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePasteBlocks.js","sourceRoot":"","sources":["../../../src/components/hooks/usePasteBlocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAE5C,8EAA8E;AAC9E,oDAAoD;AACpD,8EAA8E;AAE9E,MAAM,eAAe,GAAG,6BAA6B,CAAC;AAEtD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE,CAC5C,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE;IAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAChF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAU,EAAE,SAAiB,EAAE,EAAE,CAC/D,aAAa,EAAE,IAAI,SAAS,MAAM,CAAC;AAarC,MAAM,UAAU,cAAc;IAC5B,MAAM,cAAc,GAAG,MAAM,CAAwB,IAAI,GAAG,EAAE,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAElC,4CAA4C;IAC5C,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,aAAuB,EAAE,EAAE;QAC1D,OAAO,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACrD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,8BAA8B;IAC9B,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;QACxC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;AAC5E,CAAC"}
package/dist/models.js CHANGED
@@ -12,10 +12,10 @@ export class ModelRegistry {
12
12
  */
13
13
  static ALL_MODELS = {
14
14
  // Anthropic Models
15
- 'claude-opus-4-5': {
16
- id: 'claude-opus-4-5',
17
- name: 'claude-opus-4-5',
18
- displayName: 'Claude Opus 4.5',
15
+ 'claude-opus-4-6': {
16
+ id: 'claude-opus-4-6',
17
+ name: 'claude-opus-4-6',
18
+ displayName: 'Claude Opus 4.6',
19
19
  category: 'large',
20
20
  icon: 'brain',
21
21
  supportsThinking: true,
package/dist/settings.js CHANGED
@@ -52,7 +52,7 @@ export class Settings {
52
52
  provider = Provider.ANTHROPIC;
53
53
  anthropic = {
54
54
  api_key: '',
55
- model: ModelRegistry.getDefaultModel('anthropic'), // claude-opus-4-5
55
+ model: ModelRegistry.getDefaultModel('anthropic'), // claude-opus-4-6
56
56
  };
57
57
  openai = {
58
58
  api_key: '',
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/tools/handler.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAyD5H"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/tools/handler.ts"],"names":[],"mappings":"AAuBA;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA0E5H"}
@@ -5,6 +5,7 @@ import { queryDatabase } from './database.js';
5
5
  import { checkContainerHealth, searchLogs } from './docker.js';
6
6
  import { handleDockerLoginGhcr, handleCheckAuthStatus } from './auth-tools.js';
7
7
  import { handleDownloadDeploymentFiles, handleSaveDeploymentDir, handleGetDeploymentDir, logDeploymentEvent, getDeploymentHistory, listAvailableVersions, handleRecreateContainers, } from './deployment.js';
8
+ import { handleListExportableAgents, handleGetAgentExportInfo, handleDownloadAdapter, handleTestInferenceEndpoint, handleConfigureLocalLlm, } from './inference.js';
8
9
  /**
9
10
  * Handle a tool call and return the result.
10
11
  */
@@ -44,6 +45,16 @@ export async function handleToolCall(name, inputData, signal) {
44
45
  return listAvailableVersions(inputData.include_prerelease ?? false);
45
46
  case 'recreate_containers':
46
47
  return handleRecreateContainers(inputData.org_id);
48
+ case 'list_exportable_agents':
49
+ return handleListExportableAgents();
50
+ case 'get_agent_export_info':
51
+ return handleGetAgentExportInfo(inputData.agent_id);
52
+ case 'download_adapter':
53
+ return handleDownloadAdapter(inputData.agent_id, inputData.target_dir);
54
+ case 'test_inference_endpoint':
55
+ return handleTestInferenceEndpoint(inputData.endpoint_url, inputData.model, inputData.prompt);
56
+ case 'configure_local_llm':
57
+ return handleConfigureLocalLlm(inputData.endpoint_url, inputData.model_name);
47
58
  default:
48
59
  return `Unknown tool: ${name}`;
49
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/tools/handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/tools/handler.ts"],"names":[],"mappings":"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"}