@syntero/orca-cli 1.2.2 → 1.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/auth.d.ts +2 -1
  2. package/dist/auth.d.ts.map +1 -1
  3. package/dist/auth.js +6 -3
  4. package/dist/auth.js.map +1 -1
  5. package/dist/components/ChatApp.d.ts.map +1 -1
  6. package/dist/components/ChatApp.js +50 -339
  7. package/dist/components/ChatApp.js.map +1 -1
  8. package/dist/components/InputFooter.d.ts +23 -1
  9. package/dist/components/InputFooter.d.ts.map +1 -1
  10. package/dist/components/InputFooter.js +11 -8
  11. package/dist/components/InputFooter.js.map +1 -1
  12. package/dist/components/MultiSelectList.d.ts +25 -0
  13. package/dist/components/MultiSelectList.d.ts.map +1 -0
  14. package/dist/components/MultiSelectList.js +70 -0
  15. package/dist/components/MultiSelectList.js.map +1 -0
  16. package/dist/components/SyncMenu.d.ts +30 -6
  17. package/dist/components/SyncMenu.d.ts.map +1 -1
  18. package/dist/components/SyncMenu.js +383 -43
  19. package/dist/components/SyncMenu.js.map +1 -1
  20. package/dist/hooks/useConversationPersistence.d.ts +15 -0
  21. package/dist/hooks/useConversationPersistence.d.ts.map +1 -0
  22. package/dist/hooks/useConversationPersistence.js +86 -0
  23. package/dist/hooks/useConversationPersistence.js.map +1 -0
  24. package/dist/hooks/useInputDispatch.d.ts +11 -0
  25. package/dist/hooks/useInputDispatch.d.ts.map +1 -0
  26. package/dist/hooks/useInputDispatch.js +112 -0
  27. package/dist/hooks/useInputDispatch.js.map +1 -0
  28. package/dist/hooks/useSlashCommands.d.ts +21 -0
  29. package/dist/hooks/useSlashCommands.d.ts.map +1 -0
  30. package/dist/hooks/useSlashCommands.js +146 -0
  31. package/dist/hooks/useSlashCommands.js.map +1 -0
  32. package/dist/hooks/useSyncFetchers.d.ts +8 -0
  33. package/dist/hooks/useSyncFetchers.d.ts.map +1 -0
  34. package/dist/hooks/useSyncFetchers.js +103 -0
  35. package/dist/hooks/useSyncFetchers.js.map +1 -0
  36. package/dist/sync/download.d.ts +3 -3
  37. package/dist/sync/download.d.ts.map +1 -1
  38. package/dist/sync/download.js +16 -11
  39. package/dist/sync/download.js.map +1 -1
  40. package/dist/sync/sync-engine.d.ts.map +1 -1
  41. package/dist/sync/sync-engine.js +42 -4
  42. package/dist/sync/sync-engine.js.map +1 -1
  43. package/dist/types/sync.d.ts +2 -0
  44. package/dist/types/sync.d.ts.map +1 -1
  45. package/package.json +1 -1
@@ -0,0 +1,86 @@
1
+ import { useState, useCallback, useRef } from 'react';
2
+ import { generateAITitle } from '../assistant/index.js';
3
+ import { debugLog } from '../settings.js';
4
+ import { createConversation, saveConversation, loadConversation, updateConversation, updateConversationTitle, } from '../conversations/index.js';
5
+ import { setConversationTitle, resetTerminalTitle } from '../terminalTitle.js';
6
+ export function useConversationPersistence(client, settings, getNextId) {
7
+ const [currentConversationId, setCurrentConversationId] = useState(null);
8
+ const currentConversationIdRef = useRef(null);
9
+ // Called after streaming completes with the final messages + history.
10
+ // Persists the conversation and returns the new conversation ID (if created), or null.
11
+ const autoSave = useCallback((messages, conversationHistory) => {
12
+ // Filter out system messages for storage (keep only user/assistant)
13
+ const savableMessages = messages.filter(m => m.role !== 'system');
14
+ if (savableMessages.length === 0)
15
+ return;
16
+ try {
17
+ // Use ref to get current conversation ID (avoids closure stale value issue)
18
+ const convId = currentConversationIdRef.current;
19
+ debugLog(`[auto-save] convId from ref: ${convId}, savableMessages: ${savableMessages.length}`);
20
+ if (convId) {
21
+ // Update existing conversation
22
+ debugLog(`[auto-save] Updating existing conversation: ${convId}`);
23
+ updateConversation(convId, savableMessages, conversationHistory);
24
+ }
25
+ else {
26
+ // Create new conversation
27
+ const newConversation = createConversation(savableMessages, conversationHistory);
28
+ debugLog(`[auto-save] Creating NEW conversation: ${newConversation.id}`);
29
+ saveConversation(newConversation);
30
+ // Set both ref and state immediately to prevent race condition
31
+ currentConversationIdRef.current = newConversation.id;
32
+ setCurrentConversationId(newConversation.id);
33
+ // Generate AI title asynchronously in background
34
+ // Don't block the user - do it after save completes
35
+ setTimeout(async () => {
36
+ try {
37
+ const aiTitle = await generateAITitle(client, settings, savableMessages);
38
+ if (aiTitle) {
39
+ updateConversationTitle(newConversation.id, aiTitle);
40
+ setConversationTitle(aiTitle); // Update terminal title
41
+ debugLog(`[auto-save] AI title generated: "${aiTitle}"`);
42
+ }
43
+ }
44
+ catch (titleError) {
45
+ // Silently fail - AI title is non-critical
46
+ debugLog(`[auto-save] AI title generation failed: ${titleError}`);
47
+ }
48
+ }, 100);
49
+ }
50
+ }
51
+ catch (saveError) {
52
+ // Silently fail on save errors - don't interrupt user experience
53
+ debugLog(`[auto-save] Error saving conversation: ${saveError}`);
54
+ }
55
+ }, [client, settings]);
56
+ // Resume a conversation by ID; returns the data or null
57
+ const handleResume = useCallback((conversationId) => {
58
+ const conversation = loadConversation(conversationId);
59
+ if (!conversation)
60
+ return null;
61
+ // Reassign message IDs so Ink's Static component treats them as new
62
+ // (Static only renders items it hasn't seen before based on key)
63
+ const messagesWithNewIds = conversation.messages.map(msg => ({
64
+ ...msg,
65
+ id: getNextId(),
66
+ }));
67
+ // Update internal tracking
68
+ currentConversationIdRef.current = conversation.id;
69
+ setCurrentConversationId(conversation.id);
70
+ // Update terminal title to reflect the resumed conversation
71
+ setConversationTitle(conversation.title);
72
+ return {
73
+ messages: messagesWithNewIds,
74
+ conversationHistory: conversation.conversationHistory,
75
+ title: conversation.title,
76
+ };
77
+ }, [getNextId]);
78
+ // Clear conversation tracking (called by /clear)
79
+ const clearConversation = useCallback(() => {
80
+ currentConversationIdRef.current = null;
81
+ setCurrentConversationId(null);
82
+ resetTerminalTitle();
83
+ }, []);
84
+ return { currentConversationId, autoSave, handleResume, clearConversation };
85
+ }
86
+ //# sourceMappingURL=useConversationPersistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConversationPersistence.js","sourceRoot":"","sources":["../../src/hooks/useConversationPersistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Settings } from '../settings.js';
2
+ export interface InputDispatchDeps {
3
+ settings: Settings;
4
+ reconnectClient: (s: Settings) => {
5
+ isCloud: boolean;
6
+ cloudProvider?: string;
7
+ };
8
+ addSystemMessage: (content: string) => void;
9
+ }
10
+ export declare function useInputDispatch(deps: InputDispatchDeps): (input: string) => Promise<boolean>;
11
+ //# sourceMappingURL=useInputDispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInputDispatch.d.ts","sourceRoot":"","sources":["../../src/hooks/useInputDispatch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAA0B,MAAM,gBAAgB,CAAC;AAOlE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CA6H7F"}
@@ -0,0 +1,112 @@
1
+ import { useCallback } from 'react';
2
+ import { loadSettings, debugLog } from '../settings.js';
3
+ import { Colors, color } from '../utils.js';
4
+ import { setToken as authSetToken, loadCredentials, } from '../auth.js';
5
+ export function useInputDispatch(deps) {
6
+ return useCallback(async (input) => {
7
+ // Handle special token submission from InputFooter
8
+ if (input.startsWith('__TOKEN__:')) {
9
+ const token = input.slice('__TOKEN__:'.length);
10
+ const success = await authSetToken(token);
11
+ if (success) {
12
+ const newClient = deps.reconnectClient(deps.settings);
13
+ if (newClient.isCloud && newClient.cloudProvider) {
14
+ const creds = loadCredentials();
15
+ if (creds) {
16
+ deps.addSystemMessage(color(`Using cloud: ${creds.user.email} (${newClient.cloudProvider})`, Colors.green));
17
+ }
18
+ }
19
+ }
20
+ return true;
21
+ }
22
+ // Handle sync menu actions
23
+ if (input.startsWith('__SYNC__:')) {
24
+ const payload = input.slice('__SYNC__:'.length);
25
+ const { runSync, resumeSync, showSyncStatus } = await import('../sync/index.js');
26
+ // Legacy string actions (backward compat)
27
+ if (payload === 'normal') {
28
+ await runSync({ force: false });
29
+ return true;
30
+ }
31
+ if (payload === 'force') {
32
+ await runSync({ force: true });
33
+ return true;
34
+ }
35
+ if (payload === 'preview') {
36
+ await runSync({ dryRun: true });
37
+ return true;
38
+ }
39
+ if (payload === 'status') {
40
+ await showSyncStatus();
41
+ return true;
42
+ }
43
+ if (payload === 'resume') {
44
+ await resumeSync({});
45
+ return true;
46
+ }
47
+ // JSON payload from expanded sync menu
48
+ if (payload.startsWith('{')) {
49
+ try {
50
+ const params = JSON.parse(payload);
51
+ if (params.scope === 'all') {
52
+ // Sync library then workspace
53
+ await runSync({ force: params.force, orgId: params.orgId });
54
+ // runWorkspaceSync() will be implemented in a follow-up task
55
+ }
56
+ else if (params.scope === 'library') {
57
+ await runSync({
58
+ force: params.force,
59
+ solutionFilter: params.solutionFilter,
60
+ orgId: params.orgId,
61
+ });
62
+ }
63
+ else if (params.scope === 'workspace') {
64
+ // runWorkspaceSync() will be implemented in a follow-up task
65
+ // For now, show a message that workspace sync is not yet available
66
+ deps.addSystemMessage(color('Workspace sync is not yet implemented. Coming soon.', Colors.yellow));
67
+ }
68
+ }
69
+ catch (e) {
70
+ deps.addSystemMessage(color(`Sync error: ${e instanceof Error ? e.message : String(e)}`, Colors.red));
71
+ }
72
+ }
73
+ return true;
74
+ }
75
+ // Handle config saved
76
+ if (input === '__CONFIG_SAVED__') {
77
+ debugLog(`[processMessage] Received __CONFIG_SAVED__, reloading settings`);
78
+ const reloadedSettings = loadSettings();
79
+ debugLog(`[processMessage] Reloaded settings: provider=${reloadedSettings.provider}, anthropic.model=${reloadedSettings.anthropic.model}, openai.model=${reloadedSettings.openai.model}`);
80
+ const newClient = deps.reconnectClient(reloadedSettings);
81
+ debugLog(`[processMessage] Client reconnected: isCloud=${newClient.isCloud}, cloudProvider=${newClient.cloudProvider}`);
82
+ if (newClient.isCloud && newClient.cloudProvider) {
83
+ const creds = loadCredentials();
84
+ // Get the actual model being used based on the cloud provider
85
+ let modelInUse;
86
+ if (newClient.cloudProvider === 'anthropic') {
87
+ modelInUse = reloadedSettings.anthropic.model;
88
+ }
89
+ else if (newClient.cloudProvider === 'openai') {
90
+ modelInUse = reloadedSettings.openai.model;
91
+ }
92
+ else if (newClient.cloudProvider === 'azure') {
93
+ modelInUse = reloadedSettings.azure.deployment;
94
+ }
95
+ else {
96
+ modelInUse = 'unknown';
97
+ }
98
+ debugLog(`[processMessage] Cloud mode: provider=${newClient.cloudProvider}, model=${modelInUse}`);
99
+ if (creds) {
100
+ deps.addSystemMessage(color(`Using cloud: ${creds.user.email} (${newClient.cloudProvider}: ${modelInUse})`, Colors.green));
101
+ }
102
+ }
103
+ else {
104
+ debugLog(`[processMessage] Local mode: provider=${reloadedSettings.provider}`);
105
+ deps.addSystemMessage(color(`Using local provider: ${reloadedSettings.provider}`, Colors.green));
106
+ }
107
+ return true;
108
+ }
109
+ return false;
110
+ }, [deps.settings, deps.reconnectClient, deps.addSystemMessage]);
111
+ }
112
+ //# sourceMappingURL=useInputDispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInputDispatch.js","sourceRoot":"","sources":["../../src/hooks/useInputDispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Settings } from '../settings.js';
2
+ import { AnthropicMessage } from '../assistant/index.js';
3
+ export interface CommandResult {
4
+ handled: boolean;
5
+ message?: string;
6
+ output?: string;
7
+ }
8
+ export interface SlashCommandDeps {
9
+ settings: Settings;
10
+ conversationHistory: AnthropicMessage[];
11
+ currentConversationId: string | null;
12
+ reconnectClient: (s: Settings) => {
13
+ isCloud: boolean;
14
+ cloudProvider?: string;
15
+ };
16
+ performCompaction: (instructions?: string) => Promise<boolean>;
17
+ addSystemMessage: (content: string) => void;
18
+ clearConversation: () => void;
19
+ }
20
+ export declare function useSlashCommands(deps: SlashCommandDeps): (command: string) => Promise<CommandResult>;
21
+ //# sourceMappingURL=useSlashCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSlashCommands.d.ts","sourceRoot":"","sources":["../../src/hooks/useSlashCommands.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAsBzD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,EAAE,gBAAgB,EAAE,CAAC;IACxC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,iBAAiB,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAoJpG"}
@@ -0,0 +1,146 @@
1
+ import { useCallback } from 'react';
2
+ import { createRequire } from 'module';
3
+ import { Colors, color } from '../utils.js';
4
+ import { logout as authLogout, status as authStatus, loadCredentials, } from '../auth.js';
5
+ import { estimateConversationTokens, formatTokenCount, AUTO_COMPACT_THRESHOLD, calculateContextBreakdown, generateContextDisplay, } from '../tokens.js';
6
+ import { debugLog } from '../settings.js';
7
+ import { renameConversation } from '../conversations/index.js';
8
+ import { setConversationTitle } from '../terminalTitle.js';
9
+ // Get package version
10
+ const require = createRequire(import.meta.url);
11
+ const pkg = require('../../package.json');
12
+ export function useSlashCommands(deps) {
13
+ return useCallback(async (command) => {
14
+ const parts = command.trim().split(/\s+/);
15
+ const cmd = parts[0].toLowerCase();
16
+ const args = parts.slice(1).join(' ');
17
+ if (cmd === '/token') {
18
+ // Token is handled inline by InputFooter
19
+ return { handled: false };
20
+ }
21
+ if (cmd === '/logout') {
22
+ await authLogout();
23
+ const newClient = deps.reconnectClient(deps.settings);
24
+ return {
25
+ handled: true,
26
+ output: newClient.isCloud && newClient.cloudProvider
27
+ ? color(`Using cloud: ${loadCredentials()?.user.email} (${newClient.cloudProvider})`, Colors.green)
28
+ : color(`Using local provider: ${deps.settings.provider}`, Colors.green),
29
+ };
30
+ }
31
+ if (cmd === '/status') {
32
+ await authStatus();
33
+ return { handled: true };
34
+ }
35
+ if (cmd === '/config') {
36
+ // Config is handled inline by InputFooter
37
+ return { handled: false };
38
+ }
39
+ if (cmd === '/settings') {
40
+ return { handled: true, output: `\n${deps.settings.getMaskedDisplay()}\n` };
41
+ }
42
+ if (cmd === '/context') {
43
+ // Determine the current model based on provider (handles both cloud and local mode)
44
+ let currentModel;
45
+ const effectiveProvider = deps.settings.provider;
46
+ if (effectiveProvider === 'anthropic') {
47
+ currentModel = deps.settings.anthropic.model;
48
+ }
49
+ else if (effectiveProvider === 'openai') {
50
+ currentModel = deps.settings.openai.model;
51
+ }
52
+ else if (effectiveProvider === 'azure') {
53
+ currentModel = deps.settings.azure.deployment;
54
+ }
55
+ else {
56
+ currentModel = deps.settings.openai.model; // Fallback
57
+ }
58
+ debugLog(`[/context] effectiveProvider=${effectiveProvider}, currentModel=${currentModel}`);
59
+ const breakdown = calculateContextBreakdown(currentModel, deps.conversationHistory);
60
+ const display = generateContextDisplay(breakdown);
61
+ return { handled: true, output: `\n${display}\n` };
62
+ }
63
+ if (cmd === '/help') {
64
+ const tokenCount = estimateConversationTokens(deps.conversationHistory);
65
+ const streamingStatus = deps.settings.streaming !== false ? 'enabled' : 'disabled';
66
+ const helpText = `
67
+ Available commands:
68
+ /token Enter CLI token from web UI
69
+ /token <token> Set CLI token directly
70
+ /logout Log out from cloud platform
71
+ /status Show authentication status
72
+ /config Configure local API keys (instead of cloud)
73
+ /model Select AI model for current provider
74
+ /settings Show current settings
75
+ /streaming Configure response streaming (currently ${streamingStatus})
76
+ /sync Sync library from cloud (opens menu)
77
+ /resume Resume a previous conversation
78
+ /rename <title> Rename current conversation
79
+ /clear Clear conversation
80
+ /compact [msg] Compact conversation (summarize and reset)
81
+ Optional: add instructions for what to preserve
82
+ /context Show token usage breakdown
83
+ /version Show CLI version
84
+ /help Show this help
85
+ quit, exit Exit
86
+
87
+ Current conversation: ~${formatTokenCount(tokenCount)} tokens (auto-compact at ${formatTokenCount(AUTO_COMPACT_THRESHOLD)})
88
+
89
+ Tip: Ask the AI to "update Orca" and it will handle the deployment update process.
90
+ `;
91
+ return { handled: true, output: helpText };
92
+ }
93
+ if (cmd === '/version') {
94
+ return { handled: true, output: `orca v${pkg.version}` };
95
+ }
96
+ if (cmd === '/clear') {
97
+ deps.clearConversation();
98
+ return { handled: true, output: color('Conversation cleared.', Colors.dim) };
99
+ }
100
+ if (cmd === '/compact') {
101
+ if (deps.conversationHistory.length === 0) {
102
+ return { handled: true, output: color('Nothing to compact - conversation is empty.', Colors.dim) };
103
+ }
104
+ // Extract custom instructions if provided
105
+ const customInstructions = args.trim() || undefined;
106
+ const tokenCount = estimateConversationTokens(deps.conversationHistory);
107
+ deps.addSystemMessage(color(`Compacting conversation (~${formatTokenCount(tokenCount)} tokens)...`, Colors.dim));
108
+ // Perform compaction asynchronously
109
+ deps.performCompaction(customInstructions);
110
+ return { handled: true };
111
+ }
112
+ if (cmd === '/sync') {
113
+ // Sync is handled inline by InputFooter via SyncMenu
114
+ return { handled: false };
115
+ }
116
+ if (cmd === '/resume') {
117
+ // Resume is handled inline by InputFooter via ResumeMenu
118
+ return { handled: false };
119
+ }
120
+ if (cmd === '/rename') {
121
+ if (!deps.currentConversationId) {
122
+ return { handled: true, output: color('No active conversation to rename.', Colors.yellow) };
123
+ }
124
+ const newTitle = args.trim();
125
+ if (!newTitle) {
126
+ return { handled: true, output: color('Usage: /rename <new title>', Colors.yellow) };
127
+ }
128
+ const success = renameConversation(deps.currentConversationId, newTitle);
129
+ if (success) {
130
+ setConversationTitle(newTitle); // Update terminal title
131
+ return { handled: true, output: color(`Conversation renamed to: "${newTitle}"`, Colors.green) };
132
+ }
133
+ return { handled: true, output: color('Failed to rename conversation.', Colors.red) };
134
+ }
135
+ if (cmd === '/streaming') {
136
+ // Streaming menu is handled inline by InputFooter
137
+ return { handled: false };
138
+ }
139
+ if (cmd === '/model') {
140
+ // Model selection is handled inline by InputFooter
141
+ return { handled: false };
142
+ }
143
+ return { handled: false };
144
+ }, [deps.settings, deps.conversationHistory, deps.currentConversationId, deps.reconnectClient, deps.performCompaction, deps.addSystemMessage, deps.clearConversation]);
145
+ }
146
+ //# sourceMappingURL=useSlashCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSlashCommands.js","sourceRoot":"","sources":["../../src/hooks/useSlashCommands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function useSyncFetchers(): {
2
+ fetchSolutions: (orgId?: string) => Promise<any>;
3
+ fetchUsers: (orgId?: string) => Promise<any[]>;
4
+ fetchFolders: (userId: string, orgId?: string) => Promise<any>;
5
+ fetchOrganizations: () => Promise<any>;
6
+ userRole: string | undefined;
7
+ };
8
+ //# sourceMappingURL=useSyncFetchers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSyncFetchers.d.ts","sourceRoot":"","sources":["../../src/hooks/useSyncFetchers.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe;6BACqB,MAAM;yBAkBV,MAAM;2BAqDJ,MAAM,UAAU,MAAM;;;EA2BvE"}
@@ -0,0 +1,103 @@
1
+ import { useCallback } from 'react';
2
+ import { cloudRequest, loadCredentials } from '../auth.js';
3
+ import { debugLog } from '../settings.js';
4
+ export function useSyncFetchers() {
5
+ const fetchSolutions = useCallback(async (orgId) => {
6
+ debugLog(`[fetchSolutions] Starting request to /api/v2/solution-library${orgId ? ` (org=${orgId})` : ''}`);
7
+ try {
8
+ const headers = orgId ? { 'X-Org-Id': orgId } : undefined;
9
+ const response = await cloudRequest('GET', '/api/v2/solution-library', undefined, headers);
10
+ debugLog(`[fetchSolutions] Response status=${response.status}, data keys=${Object.keys(response.data || {})}`);
11
+ debugLog(`[fetchSolutions] Response data: ${JSON.stringify(response.data).substring(0, 500)}`);
12
+ const solutions = response.data?.data?.solutions ?? [];
13
+ debugLog(`[fetchSolutions] Parsed ${solutions.length} solutions`);
14
+ const result = solutions.map((s) => ({ id: s.library_id, name: s.name || s.library_id }));
15
+ debugLog(`[fetchSolutions] Returning ${result.length} items`);
16
+ return result;
17
+ }
18
+ catch (e) {
19
+ debugLog(`[fetchSolutions] ERROR: ${e instanceof Error ? e.message : String(e)}`);
20
+ throw e;
21
+ }
22
+ }, []);
23
+ const fetchUsers = useCallback(async (orgId) => {
24
+ debugLog(`[fetchUsers] Starting request to /api/v1/users/organization/users${orgId ? ` (org=${orgId})` : ''}`);
25
+ try {
26
+ const headers = orgId ? { 'X-Org-Id': orgId } : undefined;
27
+ const response = await cloudRequest('GET', '/api/v1/users/organization/users', undefined, headers);
28
+ debugLog(`[fetchUsers] Response status=${response.status}`);
29
+ const creds = loadCredentials();
30
+ const currentUserId = creds?.user?.id;
31
+ const currentUserEmail = creds?.user?.email;
32
+ // When querying a different org, don't prepend the current user
33
+ const isSameOrg = !orgId || orgId === creds?.org_id;
34
+ const orgUsers = response.data?.users ?? [];
35
+ const users = [
36
+ // Current user first (only when querying own org)
37
+ ...(isSameOrg && currentUserId && currentUserEmail ? [{
38
+ id: currentUserId,
39
+ email: currentUserEmail,
40
+ isCurrentUser: true,
41
+ }] : []),
42
+ ...orgUsers.map((u) => ({
43
+ id: u.id,
44
+ email: u.email,
45
+ isCurrentUser: false,
46
+ })),
47
+ ];
48
+ debugLog(`[fetchUsers] Returning ${users.length} users`);
49
+ return users;
50
+ }
51
+ catch (e) {
52
+ debugLog(`[fetchUsers] ERROR: ${e instanceof Error ? e.message : String(e)}`);
53
+ throw e;
54
+ }
55
+ }, []);
56
+ const fetchOrganizations = useCallback(async () => {
57
+ debugLog('[fetchOrganizations] Starting request to /api/v1/super-admin/organizations');
58
+ try {
59
+ const response = await cloudRequest('GET', '/api/v1/super-admin/organizations?per_page=100');
60
+ debugLog(`[fetchOrganizations] Response status=${response.status}`);
61
+ const orgs = response.data?.data?.organizations ?? [];
62
+ const creds = loadCredentials();
63
+ const result = orgs.map((o) => ({
64
+ id: o.id,
65
+ name: o.name,
66
+ isCurrent: o.id === creds?.org_id,
67
+ }));
68
+ debugLog(`[fetchOrganizations] Returning ${result.length} organizations`);
69
+ return result;
70
+ }
71
+ catch (e) {
72
+ debugLog(`[fetchOrganizations] ERROR: ${e instanceof Error ? e.message : String(e)}`);
73
+ throw e;
74
+ }
75
+ }, []);
76
+ const fetchFolders = useCallback(async (userId, orgId) => {
77
+ debugLog(`[fetchFolders] Starting request for user=${userId}${orgId ? ` (org=${orgId})` : ''}`);
78
+ try {
79
+ const headers = orgId ? { 'X-Org-Id': orgId } : undefined;
80
+ const userPath = `/workspace/users/${userId}`;
81
+ const response = await cloudRequest('GET', `/api/v2/workspace/tree?path=${encodeURIComponent(userPath)}`, undefined, headers);
82
+ debugLog(`[fetchFolders] Response status=${response.status}`);
83
+ const items = response.data?.items ?? [];
84
+ // Only include directories
85
+ const folders = items
86
+ .filter((item) => item.type === 'directory')
87
+ .map((item) => ({
88
+ path: item.name,
89
+ solutionCount: item.items ?? 0,
90
+ }));
91
+ debugLog(`[fetchFolders] Returning ${folders.length} folders`);
92
+ return folders;
93
+ }
94
+ catch (e) {
95
+ debugLog(`[fetchFolders] ERROR: ${e instanceof Error ? e.message : String(e)}`);
96
+ throw e;
97
+ }
98
+ }, []);
99
+ // Get user role from credentials for super_admin features
100
+ const userRole = loadCredentials()?.user?.role;
101
+ return { fetchSolutions, fetchUsers, fetchFolders, fetchOrganizations, userRole };
102
+ }
103
+ //# sourceMappingURL=useSyncFetchers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSyncFetchers.js","sourceRoot":"","sources":["../../src/hooks/useSyncFetchers.ts"],"names":[],"mappings":"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"}
@@ -60,14 +60,14 @@ export declare function splitIntoBatches(files: FileToDownload[], maxSize?: numb
60
60
  * @param expectedHash Expected SHA-256 hash
61
61
  * @returns Downloaded file content
62
62
  */
63
- export declare function downloadSingleFile(solution: string, filePath: string, expectedHash: string): Promise<Buffer>;
63
+ export declare function downloadSingleFile(solution: string, filePath: string, expectedHash: string, orgId?: string): Promise<Buffer>;
64
64
  /**
65
65
  * Download a batch of files as a tar.gz archive.
66
66
  *
67
67
  * @param files Files to download
68
68
  * @returns Path to downloaded archive
69
69
  */
70
- export declare function downloadBatch(files: FileToDownload[]): Promise<string>;
70
+ export declare function downloadBatch(files: FileToDownload[], orgId?: string): Promise<string>;
71
71
  /**
72
72
  * Extract a tar.gz archive and verify file hashes.
73
73
  *
@@ -83,5 +83,5 @@ export declare function extractAndVerify(archivePath: string, expectedFiles: Fil
83
83
  * @param onProgress Progress callback
84
84
  * @returns Download result
85
85
  */
86
- export declare function downloadWithRetry(files: FileToDownload[], onProgress?: (downloaded: number, total: number) => void): Promise<DownloadResult>;
86
+ export declare function downloadWithRetry(files: FileToDownload[], onProgress?: (downloaded: number, total: number) => void, orgId?: string): Promise<DownloadResult>;
87
87
  //# sourceMappingURL=download.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/sync/download.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMpD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,MAAuB,GAC/B,cAAc,EAAE,EAAE,CAQpB;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,cAAc,EAAE,GACtB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AA4CD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,cAAc,EAAE,GAC9B,OAAO,CAAC,cAAc,CAAC,CAmFzB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,cAAc,EAAE,EACvB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACvD,OAAO,CAAC,cAAc,CAAC,CAyEzB"}
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/sync/download.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMpD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,MAAuB,GAC/B,cAAc,EAAE,EAAE,CAQpB;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,cAAc,EAAE,EACvB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAkDD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,cAAc,EAAE,GAC9B,OAAO,CAAC,cAAc,CAAC,CAmFzB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,cAAc,EAAE,EACvB,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,EACxD,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,cAAc,CAAC,CAyEzB"}