@syntero/orca-cli 1.2.11 → 1.2.12
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/autocomplete.d.ts.map +1 -1
- package/dist/autocomplete.js +1 -0
- package/dist/autocomplete.js.map +1 -1
- package/dist/components/ChatApp.js +2 -2
- package/dist/components/ChatApp.js.map +1 -1
- package/dist/components/FolderBrowser.d.ts +29 -0
- package/dist/components/FolderBrowser.d.ts.map +1 -0
- package/dist/components/FolderBrowser.js +195 -0
- package/dist/components/FolderBrowser.js.map +1 -0
- package/dist/components/InputFooter.d.ts +12 -10
- package/dist/components/InputFooter.d.ts.map +1 -1
- package/dist/components/InputFooter.js +38 -2
- package/dist/components/InputFooter.js.map +1 -1
- package/dist/components/SyncMenu.d.ts +5 -8
- package/dist/components/SyncMenu.d.ts.map +1 -1
- package/dist/components/SyncMenu.js +14 -52
- package/dist/components/SyncMenu.js.map +1 -1
- package/dist/components/UploadMenu.d.ts +38 -0
- package/dist/components/UploadMenu.d.ts.map +1 -0
- package/dist/components/UploadMenu.js +249 -0
- package/dist/components/UploadMenu.js.map +1 -0
- package/dist/hooks/useInputDispatch.d.ts.map +1 -1
- package/dist/hooks/useInputDispatch.js +61 -0
- package/dist/hooks/useInputDispatch.js.map +1 -1
- package/dist/hooks/useSlashCommands.d.ts.map +1 -1
- package/dist/hooks/useSlashCommands.js +5 -0
- package/dist/hooks/useSlashCommands.js.map +1 -1
- package/dist/hooks/useSyncFetchers.d.ts +22 -2
- package/dist/hooks/useSyncFetchers.d.ts.map +1 -1
- package/dist/hooks/useSyncFetchers.js +61 -4
- package/dist/hooks/useSyncFetchers.js.map +1 -1
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +2 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/upload.d.ts +47 -0
- package/dist/sync/upload.d.ts.map +1 -0
- package/dist/sync/upload.js +284 -0
- package/dist/sync/upload.js.map +1 -0
- package/package.json +1 -1
package/dist/sync/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEnF,mBAAmB;AACnB,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAErB,iBAAiB;AACjB,OAAO,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,UAAU,EACX,MAAM,WAAW,CAAC;AAEnB,oBAAoB;AACpB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,eAAe,CAAC;AAEvB,sBAAsB;AACtB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,eAAe,CAAC;AAEvB,qBAAqB;AACrB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAEvB,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,cAAc,EACd,cAAc,EACd,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,cAAc,EACf,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEnF,mBAAmB;AACnB,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,uBAAuB,EACxB,MAAM,aAAa,CAAC;AAErB,iBAAiB;AACjB,OAAO,EACL,QAAQ,EACR,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,UAAU,EACX,MAAM,WAAW,CAAC;AAEnB,oBAAoB;AACpB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,eAAe,CAAC;AAEvB,sBAAsB;AACtB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,eAAe,CAAC;AAEvB,qBAAqB;AACrB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAEvB,mBAAmB;AACnB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAGrB,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,cAAc,EACd,cAAc,EACd,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,cAAc,EACf,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload engine — push local sandbox files to cloud.
|
|
3
|
+
*
|
|
4
|
+
* Reads files from the local Docker container, optionally checks for
|
|
5
|
+
* conflicts against the remote manifest, then POSTs them to the
|
|
6
|
+
* backend upload-folder endpoint.
|
|
7
|
+
*/
|
|
8
|
+
export interface UploadOptions {
|
|
9
|
+
/** e.g. "/workspace/library" or "/workspace/users/{id}" */
|
|
10
|
+
basePath: string;
|
|
11
|
+
/** Selected folders to upload */
|
|
12
|
+
pathFilter: string[];
|
|
13
|
+
/** Organization ID */
|
|
14
|
+
orgId?: string;
|
|
15
|
+
/** Skip conflict warning */
|
|
16
|
+
force?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface UploadResult {
|
|
19
|
+
success: boolean;
|
|
20
|
+
filesUploaded: number;
|
|
21
|
+
filesSkipped: number;
|
|
22
|
+
errors: {
|
|
23
|
+
path: string;
|
|
24
|
+
error: string;
|
|
25
|
+
}[];
|
|
26
|
+
conflicts: string[];
|
|
27
|
+
}
|
|
28
|
+
interface LocalFile {
|
|
29
|
+
/** Relative path from basePath (e.g. "demo-testing/server.py") */
|
|
30
|
+
relativePath: string;
|
|
31
|
+
/** SHA-256 hash of the file */
|
|
32
|
+
hash: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* List all files under selected folders in the sandbox container.
|
|
36
|
+
*/
|
|
37
|
+
export declare function listFilesForUpload(orgId: string, basePath: string, folders: string[]): LocalFile[];
|
|
38
|
+
/**
|
|
39
|
+
* Check which local files conflict with remote versions.
|
|
40
|
+
*/
|
|
41
|
+
export declare function checkRemoteConflicts(localFiles: LocalFile[], basePath: string, orgId?: string): Promise<string[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Main upload orchestrator.
|
|
44
|
+
*/
|
|
45
|
+
export declare function runUpload(options: UploadOptions, onProgress?: (message: string) => void): Promise<UploadResult>;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/sync/upload.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAsBH,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,UAAU,SAAS;IACjB,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,GAChB,SAAS,EAAE,CAkBb;AAmCD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,SAAS,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBnB;AAsJD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,aAAa,EACtB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,YAAY,CAAC,CA0FvB"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload engine — push local sandbox files to cloud.
|
|
3
|
+
*
|
|
4
|
+
* Reads files from the local Docker container, optionally checks for
|
|
5
|
+
* conflicts against the remote manifest, then POSTs them to the
|
|
6
|
+
* backend upload-folder endpoint.
|
|
7
|
+
*/
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import { loadCredentials } from '../auth.js';
|
|
10
|
+
import { hashFileInSandbox, listSandboxDirectory, findSandboxContainer, readFileFromSandbox } from './docker.js';
|
|
11
|
+
import { loadLocalManifest, saveLocalManifest, ensureSyncDir } from './manifest.js';
|
|
12
|
+
import { debugLog } from '../utils.js';
|
|
13
|
+
/** Maximum files per upload batch */
|
|
14
|
+
const MAX_BATCH_SIZE = 50;
|
|
15
|
+
/** Maximum retries for upload */
|
|
16
|
+
const MAX_RETRIES = 3;
|
|
17
|
+
/** Backoff factor for retries (ms) */
|
|
18
|
+
const BACKOFF_BASE = 1000;
|
|
19
|
+
/**
|
|
20
|
+
* List all files under selected folders in the sandbox container.
|
|
21
|
+
*/
|
|
22
|
+
export function listFilesForUpload(orgId, basePath, folders) {
|
|
23
|
+
const files = [];
|
|
24
|
+
for (const folder of folders) {
|
|
25
|
+
const folderPath = `${basePath}/${folder}`;
|
|
26
|
+
const entries = listSandboxDirectory(orgId, folderPath);
|
|
27
|
+
for (const entry of entries) {
|
|
28
|
+
const relativePath = `${folder}/${entry}`;
|
|
29
|
+
const fullPath = `${basePath}/${relativePath}`;
|
|
30
|
+
const hash = hashFileInSandbox(orgId, fullPath);
|
|
31
|
+
if (hash) {
|
|
32
|
+
files.push({ relativePath, hash });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return files;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Fetch the remote manifest for a given base path to detect conflicts.
|
|
40
|
+
*/
|
|
41
|
+
async function fetchRemoteManifest(basePath, orgId) {
|
|
42
|
+
const creds = loadCredentials();
|
|
43
|
+
if (!creds) {
|
|
44
|
+
throw new Error('Not authenticated. Run /token first.');
|
|
45
|
+
}
|
|
46
|
+
const url = `${creds.endpoint}/api/v2/library/sync/manifest?base_path=${encodeURIComponent(basePath)}`;
|
|
47
|
+
const headers = {
|
|
48
|
+
'Authorization': `Bearer ${creds.token}`,
|
|
49
|
+
};
|
|
50
|
+
if (orgId) {
|
|
51
|
+
headers['X-Org-Id'] = orgId;
|
|
52
|
+
}
|
|
53
|
+
const response = await fetch(url, { method: 'GET', headers });
|
|
54
|
+
if (!response.ok) {
|
|
55
|
+
if (response.status === 404) {
|
|
56
|
+
// No remote manifest yet — no conflicts possible
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
throw new Error(`Failed to fetch remote manifest: HTTP ${response.status}`);
|
|
60
|
+
}
|
|
61
|
+
const data = await response.json();
|
|
62
|
+
return data.files ?? [];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check which local files conflict with remote versions.
|
|
66
|
+
*/
|
|
67
|
+
export async function checkRemoteConflicts(localFiles, basePath, orgId) {
|
|
68
|
+
const remoteFiles = await fetchRemoteManifest(basePath, orgId);
|
|
69
|
+
const remoteMap = new Map();
|
|
70
|
+
for (const f of remoteFiles) {
|
|
71
|
+
remoteMap.set(f.path, f.hash);
|
|
72
|
+
}
|
|
73
|
+
const conflicts = [];
|
|
74
|
+
for (const local of localFiles) {
|
|
75
|
+
const remoteHash = remoteMap.get(local.relativePath);
|
|
76
|
+
// A conflict is when the file exists remotely with a different hash
|
|
77
|
+
if (remoteHash && remoteHash !== local.hash) {
|
|
78
|
+
conflicts.push(local.relativePath);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return conflicts;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Split files into batches.
|
|
85
|
+
*/
|
|
86
|
+
function splitIntoBatches(items, maxSize = MAX_BATCH_SIZE) {
|
|
87
|
+
const batches = [];
|
|
88
|
+
for (let i = 0; i < items.length; i += maxSize) {
|
|
89
|
+
batches.push(items.slice(i, i + maxSize));
|
|
90
|
+
}
|
|
91
|
+
return batches;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Upload a batch of files to the cloud endpoint.
|
|
95
|
+
*/
|
|
96
|
+
async function uploadBatch(orgId, basePath, files, overwrite) {
|
|
97
|
+
const creds = loadCredentials();
|
|
98
|
+
if (!creds) {
|
|
99
|
+
throw new Error('Not authenticated. Run /token first.');
|
|
100
|
+
}
|
|
101
|
+
// Build multipart form
|
|
102
|
+
const formData = new FormData();
|
|
103
|
+
formData.append('destination_path', basePath);
|
|
104
|
+
if (overwrite) {
|
|
105
|
+
formData.append('overwrite', 'true');
|
|
106
|
+
}
|
|
107
|
+
for (const file of files) {
|
|
108
|
+
const fullPath = `${basePath}/${file.relativePath}`;
|
|
109
|
+
const content = await readFileFromSandbox(orgId, fullPath);
|
|
110
|
+
const blob = new Blob([content]);
|
|
111
|
+
formData.append('files', blob, path.basename(file.relativePath));
|
|
112
|
+
formData.append('paths', file.relativePath);
|
|
113
|
+
}
|
|
114
|
+
const url = `${creds.endpoint}/api/v2/workspace/upload-folder`;
|
|
115
|
+
const headers = {
|
|
116
|
+
'Authorization': `Bearer ${creds.token}`,
|
|
117
|
+
};
|
|
118
|
+
if (orgId) {
|
|
119
|
+
headers['X-Org-Id'] = orgId;
|
|
120
|
+
}
|
|
121
|
+
const response = await fetch(url, {
|
|
122
|
+
method: 'POST',
|
|
123
|
+
headers,
|
|
124
|
+
body: formData,
|
|
125
|
+
});
|
|
126
|
+
if (!response.ok) {
|
|
127
|
+
let errorMsg = `HTTP ${response.status}`;
|
|
128
|
+
try {
|
|
129
|
+
const errorData = await response.json();
|
|
130
|
+
errorMsg = errorData.message || errorMsg;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Ignore parse error
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
uploaded: 0,
|
|
137
|
+
errors: files.map(f => ({ path: f.relativePath, error: errorMsg })),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const data = await response.json();
|
|
141
|
+
return {
|
|
142
|
+
uploaded: data.data?.file_count ?? files.length,
|
|
143
|
+
errors: [],
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Upload a batch with retry logic.
|
|
148
|
+
*/
|
|
149
|
+
async function uploadBatchWithRetry(orgId, basePath, files, overwrite) {
|
|
150
|
+
let lastError = null;
|
|
151
|
+
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
152
|
+
try {
|
|
153
|
+
return await uploadBatch(orgId, basePath, files, overwrite);
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
lastError = e instanceof Error ? e.message : String(e);
|
|
157
|
+
if (attempt < MAX_RETRIES) {
|
|
158
|
+
const delay = BACKOFF_BASE * Math.pow(2, attempt - 1);
|
|
159
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
uploaded: 0,
|
|
165
|
+
errors: files.map(f => ({ path: f.relativePath, error: lastError || 'Upload failed after retries' })),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Update the local manifest after a successful upload so that
|
|
170
|
+
* the next /sync doesn't see these files as "changed remotely".
|
|
171
|
+
*/
|
|
172
|
+
function updateManifestAfterUpload(uploadedFiles, basePath, orgId) {
|
|
173
|
+
ensureSyncDir();
|
|
174
|
+
let manifest = loadLocalManifest();
|
|
175
|
+
if (!manifest) {
|
|
176
|
+
manifest = {
|
|
177
|
+
version: 2,
|
|
178
|
+
updated_at: new Date().toISOString(),
|
|
179
|
+
org_id: orgId,
|
|
180
|
+
endpoint: loadCredentials()?.endpoint ?? '',
|
|
181
|
+
base_path: basePath,
|
|
182
|
+
files: [],
|
|
183
|
+
services_registry: {},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// Build a map for quick lookup
|
|
187
|
+
const fileMap = new Map();
|
|
188
|
+
for (const f of manifest.files) {
|
|
189
|
+
fileMap.set(f.path, f);
|
|
190
|
+
}
|
|
191
|
+
// Update entries for uploaded files
|
|
192
|
+
for (const uf of uploadedFiles) {
|
|
193
|
+
fileMap.set(uf.relativePath, {
|
|
194
|
+
path: uf.relativePath,
|
|
195
|
+
hash: uf.hash,
|
|
196
|
+
size: 0, // Size is not critical for conflict detection
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
manifest.files = Array.from(fileMap.values());
|
|
200
|
+
manifest.updated_at = new Date().toISOString();
|
|
201
|
+
saveLocalManifest(manifest);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Main upload orchestrator.
|
|
205
|
+
*/
|
|
206
|
+
export async function runUpload(options, onProgress) {
|
|
207
|
+
const { basePath, pathFilter, orgId, force } = options;
|
|
208
|
+
const result = {
|
|
209
|
+
success: true,
|
|
210
|
+
filesUploaded: 0,
|
|
211
|
+
filesSkipped: 0,
|
|
212
|
+
errors: [],
|
|
213
|
+
conflicts: [],
|
|
214
|
+
};
|
|
215
|
+
const effectiveOrgId = orgId || loadCredentials()?.org_id;
|
|
216
|
+
if (!effectiveOrgId) {
|
|
217
|
+
throw new Error('No organization ID available. Authenticate first.');
|
|
218
|
+
}
|
|
219
|
+
// 1. Verify sandbox is available
|
|
220
|
+
const container = findSandboxContainer(effectiveOrgId);
|
|
221
|
+
if (!container) {
|
|
222
|
+
throw new Error(`Sandbox container not found for org ${effectiveOrgId}. Start the local deployment first.`);
|
|
223
|
+
}
|
|
224
|
+
// 2. List files from sandbox
|
|
225
|
+
onProgress?.('Scanning local files...');
|
|
226
|
+
const localFiles = listFilesForUpload(effectiveOrgId, basePath, pathFilter);
|
|
227
|
+
if (localFiles.length === 0) {
|
|
228
|
+
onProgress?.('No files found in selected folders.');
|
|
229
|
+
return result;
|
|
230
|
+
}
|
|
231
|
+
debugLog(`[upload] Found ${localFiles.length} files to upload`);
|
|
232
|
+
onProgress?.(`Found ${localFiles.length} file(s) to upload.`);
|
|
233
|
+
// 3. Check for conflicts (unless force)
|
|
234
|
+
if (!force) {
|
|
235
|
+
onProgress?.('Checking for remote conflicts...');
|
|
236
|
+
try {
|
|
237
|
+
const conflicts = await checkRemoteConflicts(localFiles, basePath, effectiveOrgId);
|
|
238
|
+
if (conflicts.length > 0) {
|
|
239
|
+
result.conflicts = conflicts;
|
|
240
|
+
debugLog(`[upload] ${conflicts.length} conflict(s) detected`);
|
|
241
|
+
// Caller (useInputDispatch) should prompt user for confirmation
|
|
242
|
+
return result;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (e) {
|
|
246
|
+
debugLog(`[upload] Conflict check failed (proceeding): ${e}`);
|
|
247
|
+
// If we can't check conflicts, proceed anyway
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// 4. Upload in batches
|
|
251
|
+
const batches = splitIntoBatches(localFiles);
|
|
252
|
+
let batchNum = 0;
|
|
253
|
+
for (const batch of batches) {
|
|
254
|
+
batchNum++;
|
|
255
|
+
if (batches.length > 1) {
|
|
256
|
+
onProgress?.(`Uploading batch ${batchNum}/${batches.length} (${batch.length} files)...`);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
onProgress?.(`Uploading ${batch.length} file(s)...`);
|
|
260
|
+
}
|
|
261
|
+
const batchResult = await uploadBatchWithRetry(effectiveOrgId, basePath, batch, force ?? false);
|
|
262
|
+
result.filesUploaded += batchResult.uploaded;
|
|
263
|
+
result.errors.push(...batchResult.errors);
|
|
264
|
+
}
|
|
265
|
+
if (result.errors.length > 0) {
|
|
266
|
+
result.success = false;
|
|
267
|
+
}
|
|
268
|
+
// 5. Update local manifest
|
|
269
|
+
if (result.filesUploaded > 0) {
|
|
270
|
+
onProgress?.('Updating local manifest...');
|
|
271
|
+
try {
|
|
272
|
+
updateManifestAfterUpload(localFiles, basePath, effectiveOrgId);
|
|
273
|
+
}
|
|
274
|
+
catch (e) {
|
|
275
|
+
debugLog(`[upload] Manifest update failed: ${e}`);
|
|
276
|
+
// Non-fatal
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
onProgress?.(result.success
|
|
280
|
+
? `Upload complete: ${result.filesUploaded} file(s) uploaded.`
|
|
281
|
+
: `Upload finished with errors: ${result.filesUploaded} uploaded, ${result.errors.length} failed.`);
|
|
282
|
+
return result;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/sync/upload.ts"],"names":[],"mappings":"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"}
|