@panorama-ai/gateway 2.30.211 → 2.30.279

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 (57) hide show
  1. package/README.md +10 -0
  2. package/dist/cli-providers/types.d.ts +1 -1
  3. package/dist/cli-providers/types.d.ts.map +1 -1
  4. package/dist/database.types.d.ts +1723 -172
  5. package/dist/database.types.d.ts.map +1 -1
  6. package/dist/database.types.js.map +1 -1
  7. package/dist/finalize-subagent-run.d.ts +2 -1
  8. package/dist/finalize-subagent-run.d.ts.map +1 -1
  9. package/dist/finalize-subagent-run.js.map +1 -1
  10. package/dist/index.js +3384 -241
  11. package/dist/index.js.map +4 -4
  12. package/dist/managed-runtime/config.d.ts +13 -0
  13. package/dist/managed-runtime/config.d.ts.map +1 -1
  14. package/dist/managed-runtime/config.js +31 -0
  15. package/dist/managed-runtime/config.js.map +1 -1
  16. package/dist/managed-runtime/dependencies.d.ts +2 -0
  17. package/dist/managed-runtime/dependencies.d.ts.map +1 -1
  18. package/dist/managed-runtime/dependencies.js +2 -0
  19. package/dist/managed-runtime/dependencies.js.map +1 -1
  20. package/dist/managed-runtime/drive-sync-filesystem.d.ts +39 -0
  21. package/dist/managed-runtime/drive-sync-filesystem.d.ts.map +1 -0
  22. package/dist/managed-runtime/drive-sync-filesystem.js +434 -0
  23. package/dist/managed-runtime/drive-sync-filesystem.js.map +1 -0
  24. package/dist/managed-runtime/drive-sync-planner.d.ts +76 -0
  25. package/dist/managed-runtime/drive-sync-planner.d.ts.map +1 -0
  26. package/dist/managed-runtime/drive-sync-planner.js +363 -0
  27. package/dist/managed-runtime/drive-sync-planner.js.map +1 -0
  28. package/dist/managed-runtime/drive-sync-remote-planner.d.ts +52 -0
  29. package/dist/managed-runtime/drive-sync-remote-planner.d.ts.map +1 -0
  30. package/dist/managed-runtime/drive-sync-remote-planner.js +77 -0
  31. package/dist/managed-runtime/drive-sync-remote-planner.js.map +1 -0
  32. package/dist/managed-runtime/drive-sync-scheduler.d.ts +50 -0
  33. package/dist/managed-runtime/drive-sync-scheduler.d.ts.map +1 -0
  34. package/dist/managed-runtime/drive-sync-scheduler.js +302 -0
  35. package/dist/managed-runtime/drive-sync-scheduler.js.map +1 -0
  36. package/dist/managed-runtime/drive-sync-state-applier.d.ts +84 -0
  37. package/dist/managed-runtime/drive-sync-state-applier.d.ts.map +1 -0
  38. package/dist/managed-runtime/drive-sync-state-applier.js +153 -0
  39. package/dist/managed-runtime/drive-sync-state-applier.js.map +1 -0
  40. package/dist/managed-runtime/drive-sync-transfer.d.ts +86 -0
  41. package/dist/managed-runtime/drive-sync-transfer.d.ts.map +1 -0
  42. package/dist/managed-runtime/drive-sync-transfer.js +245 -0
  43. package/dist/managed-runtime/drive-sync-transfer.js.map +1 -0
  44. package/dist/managed-runtime/drive-sync.d.ts +416 -0
  45. package/dist/managed-runtime/drive-sync.d.ts.map +1 -0
  46. package/dist/managed-runtime/drive-sync.js +1641 -0
  47. package/dist/managed-runtime/drive-sync.js.map +1 -0
  48. package/dist/managed-runtime.d.ts.map +1 -1
  49. package/dist/managed-runtime.js +44 -0
  50. package/dist/managed-runtime.js.map +1 -1
  51. package/dist/subagent-adapters/types.d.ts +1 -1
  52. package/dist/subagent-adapters/types.d.ts.map +1 -1
  53. package/dist/subagent-output-persistence.d.ts +1 -1
  54. package/dist/subagent-output-persistence.d.ts.map +1 -1
  55. package/dist/subagent-output-persistence.js +1 -1
  56. package/dist/subagent-output-persistence.js.map +1 -1
  57. package/package.json +5 -5
@@ -0,0 +1,50 @@
1
+ import { type DriveSyncRunSummary, type ManagedDriveSyncService } from './drive-sync.js';
2
+ export type ManagedDriveSyncSchedulerStatus = {
3
+ running: boolean;
4
+ pending: boolean;
5
+ watchStatus: 'active' | 'unavailable' | 'error';
6
+ lastReason: string | null;
7
+ lastStartedAt: string | null;
8
+ lastFinishedAt: string | null;
9
+ lastError: string | null;
10
+ watchError: string | null;
11
+ lastSummary: DriveSyncRunSummary | null;
12
+ };
13
+ export type ManagedDriveSyncRequestResult = {
14
+ status: 'success';
15
+ summary: DriveSyncRunSummary;
16
+ } | {
17
+ status: 'degraded';
18
+ summary: DriveSyncRunSummary;
19
+ error: string;
20
+ } | {
21
+ status: 'failed';
22
+ error: string;
23
+ } | {
24
+ status: 'skipped';
25
+ reason: string;
26
+ };
27
+ export type ManagedDriveSyncScheduler = {
28
+ requestSync(reason: string, options?: {
29
+ immediate?: boolean;
30
+ dirtyLocalPaths?: Iterable<string>;
31
+ }): Promise<ManagedDriveSyncRequestResult>;
32
+ getStatus(): ManagedDriveSyncSchedulerStatus;
33
+ stop(): Promise<void>;
34
+ };
35
+ type WatchHandle = {
36
+ close(): void;
37
+ };
38
+ type ManagedDriveSyncSchedulerDependencies = {
39
+ watchRoot?: (rootDir: string, onChange: (reason: string, dirtyPath?: string | null) => void, onError: (error: Error) => void) => WatchHandle | null;
40
+ };
41
+ export declare function startManagedDriveSyncScheduler(params: {
42
+ service: ManagedDriveSyncService;
43
+ rootDir: string;
44
+ debounceMs: number;
45
+ pollIntervalMs: number;
46
+ localAuditIntervalMs?: number;
47
+ dependencies?: ManagedDriveSyncSchedulerDependencies;
48
+ }): ManagedDriveSyncScheduler;
49
+ export {};
50
+ //# sourceMappingURL=drive-sync-scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive-sync-scheduler.d.ts","sourceRoot":"","sources":["../../src/managed-runtime/drive-sync-scheduler.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,mBAAmB,EAExB,KAAK,uBAAuB,EAC7B,MAAM,iBAAiB,CAAA;AAGxB,MAAM,MAAM,+BAA+B,GAAG;IAC5C,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,QAAQ,GAAG,aAAa,GAAG,OAAO,CAAA;IAC/C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,WAAW,EAAE,mBAAmB,GAAG,IAAI,CAAA;CACxC,CAAA;AAED,MAAM,MAAM,6BAA6B,GACrC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,GACnD;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAEzC,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,CACT,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;KAAE,GACpE,OAAO,CAAC,6BAA6B,CAAC,CAAA;IACzC,SAAS,IAAI,+BAA+B,CAAA;IAC5C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,KAAK,IAAI,IAAI,CAAA;CACd,CAAA;AAED,KAAK,qCAAqC,GAAG;IAC3C,SAAS,CAAC,EAAE,CACV,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,EAC7D,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KAC5B,WAAW,GAAG,IAAI,CAAA;CACxB,CAAA;AAMD,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IACrD,OAAO,EAAE,uBAAuB,CAAA;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,YAAY,CAAC,EAAE,qCAAqC,CAAA;CACrD,GAAG,yBAAyB,CAoP5B"}
@@ -0,0 +1,302 @@
1
+ import { lstatSync, readdirSync, watch } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { logDriveSyncRunSummary, } from './drive-sync.js';
4
+ import { asError, MANAGED_GATEWAY_LOG_PREFIX } from './runtime-utils.js';
5
+ export function startManagedDriveSyncScheduler(params) {
6
+ let stopped = false;
7
+ let running = false;
8
+ let pendingReason = null;
9
+ let pendingRequiresLocalWrites = false;
10
+ let pendingRequiresFullLocalScan = false;
11
+ let pendingDirtyLocalPaths = new Set();
12
+ let pendingWaiters = [];
13
+ let debounceTimer = null;
14
+ let pollTimer = null;
15
+ let currentRun = null;
16
+ let watchHandle = null;
17
+ let watchStatus = 'unavailable';
18
+ let lastReason = null;
19
+ let lastStartedAt = null;
20
+ let lastFinishedAt = null;
21
+ let lastError = null;
22
+ let watchError = null;
23
+ let lastSummary = null;
24
+ let lastSuccessfulLocalWriteSyncAt = Date.now();
25
+ let hasCompletedLocalWriteSync = false;
26
+ const localAuditIntervalMs = params.localAuditIntervalMs ?? 300_000;
27
+ const completeWaiters = (waiters, result) => {
28
+ for (const waiter of waiters) {
29
+ waiter.resolve(result);
30
+ }
31
+ };
32
+ const clearDebounceTimer = () => {
33
+ if (!debounceTimer) {
34
+ return;
35
+ }
36
+ clearTimeout(debounceTimer);
37
+ debounceTimer = null;
38
+ };
39
+ const runPendingSync = async () => {
40
+ if (stopped || running || !pendingReason) {
41
+ return;
42
+ }
43
+ clearDebounceTimer();
44
+ const reason = pendingReason;
45
+ const includeLocalWrites = pendingRequiresLocalWrites;
46
+ const dirtyLocalPaths = pendingRequiresFullLocalScan ? undefined : [...pendingDirtyLocalPaths];
47
+ const waiters = pendingWaiters;
48
+ pendingReason = null;
49
+ pendingRequiresLocalWrites = false;
50
+ pendingRequiresFullLocalScan = false;
51
+ pendingDirtyLocalPaths = new Set();
52
+ pendingWaiters = [];
53
+ running = true;
54
+ lastReason = reason;
55
+ lastStartedAt = new Date().toISOString();
56
+ lastError = null;
57
+ const run = (async () => {
58
+ let result = {
59
+ status: 'failed',
60
+ error: 'Drive sync did not produce a result',
61
+ };
62
+ try {
63
+ const syncOptions = {
64
+ includeLocalWrites,
65
+ dirtyLocalPaths,
66
+ schedulerStatus: {
67
+ watchStatus,
68
+ watchError,
69
+ },
70
+ };
71
+ const summary = await params.service.syncOnce(syncOptions);
72
+ lastSummary = summary;
73
+ logDriveSyncRunSummary(summary);
74
+ result =
75
+ summary.failedDriveCount > 0
76
+ ? {
77
+ status: 'degraded',
78
+ summary,
79
+ error: `${summary.failedDriveCount} drive sync${summary.failedDriveCount === 1 ? '' : 's'} failed`,
80
+ }
81
+ : { status: 'success', summary };
82
+ }
83
+ catch (error) {
84
+ const normalizedError = asError(error);
85
+ lastError = normalizedError.message;
86
+ result = { status: 'failed', error: normalizedError.message };
87
+ console.error(`${MANAGED_GATEWAY_LOG_PREFIX} failed to sync drives`, {
88
+ reason,
89
+ error: normalizedError,
90
+ });
91
+ }
92
+ finally {
93
+ if (includeLocalWrites &&
94
+ (result.status === 'success' ||
95
+ (result.status === 'degraded' && result.summary.failedDriveCount === 0))) {
96
+ lastSuccessfulLocalWriteSyncAt = Date.now();
97
+ hasCompletedLocalWriteSync = true;
98
+ }
99
+ lastFinishedAt = new Date().toISOString();
100
+ running = false;
101
+ completeWaiters(waiters, result);
102
+ if (pendingReason && !stopped) {
103
+ schedulePendingSync(false);
104
+ }
105
+ }
106
+ })();
107
+ currentRun = run;
108
+ await run;
109
+ if (currentRun === run) {
110
+ currentRun = null;
111
+ }
112
+ };
113
+ const schedulePendingSync = (immediate) => {
114
+ if (stopped || running || !pendingReason) {
115
+ return;
116
+ }
117
+ if (immediate) {
118
+ clearDebounceTimer();
119
+ void runPendingSync();
120
+ return;
121
+ }
122
+ if (debounceTimer) {
123
+ return;
124
+ }
125
+ debounceTimer = setTimeout(() => {
126
+ debounceTimer = null;
127
+ void runPendingSync();
128
+ }, params.debounceMs);
129
+ debounceTimer.unref?.();
130
+ };
131
+ const requestSync = (reason, options = {}) => {
132
+ if (stopped) {
133
+ return Promise.resolve({ status: 'skipped', reason: 'scheduler_stopped' });
134
+ }
135
+ pendingReason = reason;
136
+ const requiresLocalWrites = requestRequiresLocalWrites({
137
+ reason,
138
+ watchStatus,
139
+ lastSuccessfulLocalWriteSyncAt,
140
+ hasCompletedLocalWriteSync,
141
+ localAuditIntervalMs,
142
+ });
143
+ pendingRequiresLocalWrites = pendingRequiresLocalWrites || requiresLocalWrites;
144
+ if (options.dirtyLocalPaths && !pendingRequiresFullLocalScan) {
145
+ for (const dirtyPath of options.dirtyLocalPaths) {
146
+ pendingDirtyLocalPaths.add(dirtyPath);
147
+ }
148
+ }
149
+ else if (requiresLocalWrites) {
150
+ pendingRequiresFullLocalScan = true;
151
+ pendingDirtyLocalPaths.clear();
152
+ }
153
+ const promise = new Promise((resolve) => {
154
+ pendingWaiters.push({ resolve });
155
+ });
156
+ schedulePendingSync(options.immediate === true);
157
+ return promise;
158
+ };
159
+ const startWatching = () => {
160
+ try {
161
+ watchHandle = (params.dependencies?.watchRoot ?? watchDriveRoot)(params.rootDir, (reason, dirtyPath) => {
162
+ void requestSync(reason, {
163
+ dirtyLocalPaths: dirtyPath ? [dirtyPath] : undefined,
164
+ });
165
+ }, (error) => {
166
+ const normalizedError = asError(error);
167
+ watchStatus = 'error';
168
+ watchError = normalizedError.message;
169
+ console.error(`${MANAGED_GATEWAY_LOG_PREFIX} drive sync filesystem watcher failed`, {
170
+ rootDir: params.rootDir,
171
+ error: normalizedError,
172
+ });
173
+ });
174
+ watchStatus = watchHandle ? 'active' : 'unavailable';
175
+ watchError = watchHandle ? null : 'filesystem watcher unavailable';
176
+ }
177
+ catch (error) {
178
+ const normalizedError = asError(error);
179
+ watchStatus = 'unavailable';
180
+ watchError = normalizedError.message;
181
+ console.warn(`${MANAGED_GATEWAY_LOG_PREFIX} drive sync filesystem watcher unavailable`, {
182
+ rootDir: params.rootDir,
183
+ error: normalizedError,
184
+ });
185
+ }
186
+ };
187
+ startWatching();
188
+ pollTimer = setInterval(() => {
189
+ void requestSync('drive_sync_poll', { immediate: true });
190
+ }, params.pollIntervalMs);
191
+ pollTimer.unref?.();
192
+ return {
193
+ requestSync,
194
+ getStatus() {
195
+ return {
196
+ running,
197
+ pending: pendingReason !== null,
198
+ watchStatus,
199
+ lastReason,
200
+ lastStartedAt,
201
+ lastFinishedAt,
202
+ lastError,
203
+ watchError,
204
+ lastSummary,
205
+ };
206
+ },
207
+ async stop() {
208
+ stopped = true;
209
+ clearDebounceTimer();
210
+ if (pollTimer) {
211
+ clearInterval(pollTimer);
212
+ pollTimer = null;
213
+ }
214
+ watchHandle?.close();
215
+ watchHandle = null;
216
+ completeWaiters(pendingWaiters, { status: 'skipped', reason: 'scheduler_stopped' });
217
+ pendingWaiters = [];
218
+ pendingReason = null;
219
+ pendingRequiresLocalWrites = false;
220
+ pendingRequiresFullLocalScan = false;
221
+ pendingDirtyLocalPaths.clear();
222
+ await currentRun;
223
+ },
224
+ };
225
+ }
226
+ function requestRequiresLocalWrites(params) {
227
+ if (params.reason !== 'drive_sync_poll') {
228
+ return true;
229
+ }
230
+ if (!params.hasCompletedLocalWriteSync && params.watchStatus !== 'active') {
231
+ return true;
232
+ }
233
+ return Date.now() - params.lastSuccessfulLocalWriteSyncAt >= params.localAuditIntervalMs;
234
+ }
235
+ function watchDriveRoot(rootDir, onChange, onError) {
236
+ const watchers = new Map();
237
+ let closed = false;
238
+ let refreshTimer = null;
239
+ const addDirectoryTree = (directoryPath) => {
240
+ if (closed || watchers.has(directoryPath)) {
241
+ return;
242
+ }
243
+ const directoryStat = lstatSync(directoryPath);
244
+ if (!directoryStat.isDirectory() || directoryStat.isSymbolicLink()) {
245
+ return;
246
+ }
247
+ const watcher = watch(directoryPath, (_eventType, filename) => {
248
+ const dirtyPath = typeof filename === 'string' || Buffer.isBuffer(filename)
249
+ ? path.join(directoryPath, filename.toString())
250
+ : directoryPath;
251
+ onChange('drive_sync_filesystem_change', dirtyPath);
252
+ scheduleRefresh();
253
+ });
254
+ watcher.on('error', (error) => {
255
+ watchers.delete(directoryPath);
256
+ onError(asError(error));
257
+ });
258
+ watchers.set(directoryPath, watcher);
259
+ for (const child of readdirSync(directoryPath, { withFileTypes: true })) {
260
+ if (!child.isDirectory()) {
261
+ continue;
262
+ }
263
+ addDirectoryTree(path.join(directoryPath, child.name));
264
+ }
265
+ };
266
+ const refreshDirectoryTree = () => {
267
+ if (closed) {
268
+ return;
269
+ }
270
+ try {
271
+ addDirectoryTree(rootDir);
272
+ }
273
+ catch (error) {
274
+ onError(asError(error));
275
+ }
276
+ };
277
+ const scheduleRefresh = () => {
278
+ if (closed || refreshTimer) {
279
+ return;
280
+ }
281
+ refreshTimer = setTimeout(() => {
282
+ refreshTimer = null;
283
+ refreshDirectoryTree();
284
+ }, 250);
285
+ refreshTimer.unref?.();
286
+ };
287
+ addDirectoryTree(rootDir);
288
+ return {
289
+ close() {
290
+ closed = true;
291
+ if (refreshTimer) {
292
+ clearTimeout(refreshTimer);
293
+ refreshTimer = null;
294
+ }
295
+ for (const watcher of watchers.values()) {
296
+ watcher.close();
297
+ }
298
+ watchers.clear();
299
+ },
300
+ };
301
+ }
302
+ //# sourceMappingURL=drive-sync-scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive-sync-scheduler.js","sourceRoot":"","sources":["../../src/managed-runtime/drive-sync-scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { type DriveSyncConflictRecord, type DriveSyncStateEntry, type LocalDriveConflictAction, type LocalDriveMutation, type LocalDriveScanEntry } from './drive-sync-planner.js';
2
+ export type DriveSyncStateMutationStore = {
3
+ getConflict?(driveId: string, drivePath: string): DriveSyncConflictRecord | null;
4
+ upsertEntry(entry: DriveSyncStateEntry): void;
5
+ upsertConflict?(conflict: DriveSyncConflictRecord): void;
6
+ deleteConflict?(driveId: string, drivePath: string): void;
7
+ deleteConflictTree?(driveId: string, drivePath: string): void;
8
+ deleteEntryTree(driveId: string, drivePath: string): void;
9
+ moveEntryTree(driveId: string, fromPath: string, toPath: string): void;
10
+ };
11
+ export type LocalDriveMutationResult = {
12
+ status: 'applied' | 'conflicted' | 'unsupported' | 'rejected';
13
+ path?: string;
14
+ from_path?: string;
15
+ to_path?: string;
16
+ version_id?: string;
17
+ conflict_id?: string;
18
+ reason?: string;
19
+ };
20
+ export type RemoteDriveVersionMetadata = {
21
+ content_sha256: string;
22
+ size_bytes: number;
23
+ mime_type: string | null;
24
+ } | null;
25
+ export declare function applyLocalDriveConflictActions(params: {
26
+ stateStore: Pick<DriveSyncStateMutationStore, 'getConflict' | 'upsertConflict' | 'deleteConflict'>;
27
+ actions: LocalDriveConflictAction[];
28
+ }): void;
29
+ export declare function applyAppliedLocalDriveMutationState(params: {
30
+ stateStore: DriveSyncStateMutationStore;
31
+ driveId: string;
32
+ mutation: LocalDriveMutation;
33
+ result: LocalDriveMutationResult;
34
+ }): void;
35
+ export declare function applyUnsupportedLocalDriveMutationState(params: {
36
+ stateStore: DriveSyncStateMutationStore;
37
+ driveId: string;
38
+ mutation: LocalDriveMutation;
39
+ }): void;
40
+ export declare function recordLocalUploadConflict(params: {
41
+ stateStore: DriveSyncStateMutationStore;
42
+ driveId: string;
43
+ mutation: LocalDriveMutation;
44
+ result: LocalDriveMutationResult;
45
+ conflictPath: string;
46
+ localConflictPath: string | null;
47
+ }): void;
48
+ export declare function applyRemoteDriveMoveState(params: {
49
+ stateStore: DriveSyncStateMutationStore;
50
+ driveId: string;
51
+ fromPath: string;
52
+ toPath: string;
53
+ }): void;
54
+ export declare function applyRemoteDriveDeleteState(params: {
55
+ stateStore: DriveSyncStateMutationStore;
56
+ driveId: string;
57
+ path: string;
58
+ }): void;
59
+ export declare function applyRemoteDriveDirectoryState(params: {
60
+ stateStore: DriveSyncStateMutationStore;
61
+ driveId: string;
62
+ path: string;
63
+ }): void;
64
+ export declare function applyRemoteDriveFileState(params: {
65
+ stateStore: DriveSyncStateMutationStore;
66
+ driveId: string;
67
+ path: string;
68
+ versionId: string;
69
+ version: RemoteDriveVersionMetadata;
70
+ downloadedSizeBytes: number;
71
+ }): void;
72
+ export declare function recordRemoteApplyConflict(params: {
73
+ stateStore: DriveSyncStateMutationStore;
74
+ driveId: string;
75
+ path: string;
76
+ reason: string;
77
+ localEntry: LocalDriveScanEntry | null;
78
+ baselineEntry: DriveSyncStateEntry | null;
79
+ conflictPath: string | null;
80
+ remoteBatchId: string;
81
+ remoteSequence: number;
82
+ }): DriveSyncConflictRecord;
83
+ export declare function resolveLocalMutationResultPath(result: LocalDriveMutationResult, mutation: LocalDriveMutation): string;
84
+ //# sourceMappingURL=drive-sync-state-applier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive-sync-state-applier.d.ts","sourceRoot":"","sources":["../../src/managed-runtime/drive-sync-state-applier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ export function applyLocalDriveConflictActions(params) {
2
+ for (const action of params.actions) {
3
+ if (action.type === 'clear_conflict') {
4
+ params.stateStore.deleteConflict?.(action.driveId, action.path);
5
+ continue;
6
+ }
7
+ const existingConflict = params.stateStore.getConflict?.(action.driveId, action.path) ?? null;
8
+ if (!existingConflict) {
9
+ continue;
10
+ }
11
+ params.stateStore.upsertConflict?.({
12
+ ...existingConflict,
13
+ conflictPath: action.conflictPath,
14
+ });
15
+ }
16
+ }
17
+ export function applyAppliedLocalDriveMutationState(params) {
18
+ if (params.mutation.request.type === 'move') {
19
+ const fromPath = readMutationPath(params.mutation.request, 'from_path');
20
+ const toPath = readMutationPath(params.mutation.request, 'to_path');
21
+ params.stateStore.moveEntryTree(params.driveId, fromPath, toPath);
22
+ params.stateStore.deleteConflictTree?.(params.driveId, fromPath);
23
+ params.stateStore.deleteConflictTree?.(params.driveId, toPath);
24
+ return;
25
+ }
26
+ if (params.mutation.request.type === 'delete') {
27
+ const drivePath = readMutationPath(params.mutation.request, 'path');
28
+ params.stateStore.deleteEntryTree(params.driveId, drivePath);
29
+ params.stateStore.deleteConflictTree?.(params.driveId, drivePath);
30
+ return;
31
+ }
32
+ if (!params.mutation.stateEntry) {
33
+ return;
34
+ }
35
+ params.stateStore.upsertEntry({
36
+ ...params.mutation.stateEntry,
37
+ versionId: typeof params.result.version_id === 'string'
38
+ ? params.result.version_id
39
+ : params.mutation.stateEntry.versionId,
40
+ });
41
+ params.stateStore.deleteConflict?.(params.driveId, params.mutation.stateEntry.path);
42
+ }
43
+ export function applyUnsupportedLocalDriveMutationState(params) {
44
+ if (!params.mutation.stateEntry) {
45
+ return;
46
+ }
47
+ params.stateStore.upsertEntry(params.mutation.stateEntry);
48
+ params.stateStore.deleteConflict?.(params.driveId, params.mutation.stateEntry.path);
49
+ }
50
+ export function recordLocalUploadConflict(params) {
51
+ params.stateStore.upsertConflict?.({
52
+ driveId: params.driveId,
53
+ path: params.conflictPath,
54
+ conflictType: 'local_upload',
55
+ reason: params.result.reason ?? null,
56
+ localContentSha256: params.mutation.stateEntry?.contentSha256 ?? null,
57
+ localSizeBytes: params.mutation.stateEntry?.sizeBytes ?? null,
58
+ localVersionId: typeof params.result.version_id === 'string'
59
+ ? params.result.version_id
60
+ : (params.mutation.stateEntry?.versionId ?? null),
61
+ conflictId: typeof params.result.conflict_id === 'string' ? params.result.conflict_id : null,
62
+ conflictPath: params.localConflictPath,
63
+ remoteBatchId: null,
64
+ remoteSequence: null,
65
+ });
66
+ }
67
+ export function applyRemoteDriveMoveState(params) {
68
+ params.stateStore.moveEntryTree(params.driveId, normalizeDrivePath(params.fromPath), normalizeDrivePath(params.toPath));
69
+ }
70
+ export function applyRemoteDriveDeleteState(params) {
71
+ params.stateStore.deleteEntryTree(params.driveId, normalizeDrivePath(params.path));
72
+ }
73
+ export function applyRemoteDriveDirectoryState(params) {
74
+ params.stateStore.upsertEntry({
75
+ driveId: params.driveId,
76
+ path: normalizeDrivePath(params.path),
77
+ entryType: 'directory',
78
+ versionId: null,
79
+ contentSha256: null,
80
+ sizeBytes: null,
81
+ mimeType: null,
82
+ });
83
+ }
84
+ export function applyRemoteDriveFileState(params) {
85
+ params.stateStore.upsertEntry({
86
+ driveId: params.driveId,
87
+ path: normalizeDrivePath(params.path),
88
+ entryType: 'file',
89
+ versionId: params.versionId,
90
+ contentSha256: params.version?.content_sha256 ?? null,
91
+ sizeBytes: params.version?.size_bytes ?? params.downloadedSizeBytes,
92
+ mimeType: params.version?.mime_type ?? null,
93
+ });
94
+ }
95
+ export function recordRemoteApplyConflict(params) {
96
+ const conflict = {
97
+ driveId: params.driveId,
98
+ path: normalizeDrivePath(params.path),
99
+ conflictType: 'remote_apply',
100
+ reason: params.reason,
101
+ localContentSha256: params.localEntry?.contentSha256 ?? null,
102
+ localSizeBytes: params.localEntry?.sizeBytes ?? null,
103
+ localVersionId: params.baselineEntry?.versionId ?? null,
104
+ conflictId: null,
105
+ conflictPath: params.conflictPath,
106
+ remoteBatchId: params.remoteBatchId,
107
+ remoteSequence: params.remoteSequence,
108
+ };
109
+ params.stateStore.upsertConflict?.(conflict);
110
+ return conflict;
111
+ }
112
+ export function resolveLocalMutationResultPath(result, mutation) {
113
+ if (typeof result.path === 'string') {
114
+ return normalizeDrivePath(result.path);
115
+ }
116
+ if (typeof result.to_path === 'string') {
117
+ return normalizeDrivePath(result.to_path);
118
+ }
119
+ if (typeof result.from_path === 'string') {
120
+ return normalizeDrivePath(result.from_path);
121
+ }
122
+ if (mutation.stateEntry) {
123
+ return mutation.stateEntry.path;
124
+ }
125
+ if (typeof mutation.request.path === 'string') {
126
+ return normalizeDrivePath(mutation.request.path);
127
+ }
128
+ if (typeof mutation.request.to_path === 'string') {
129
+ return normalizeDrivePath(mutation.request.to_path);
130
+ }
131
+ if (typeof mutation.request.from_path === 'string') {
132
+ return normalizeDrivePath(mutation.request.from_path);
133
+ }
134
+ throw new Error('Local drive sync mutation result did not include a path');
135
+ }
136
+ function readMutationPath(request, key) {
137
+ const value = request[key];
138
+ if (typeof value !== 'string') {
139
+ throw new Error(`Local drive sync mutation is missing ${key}`);
140
+ }
141
+ return normalizeDrivePath(value);
142
+ }
143
+ function normalizeDrivePath(input) {
144
+ if (!input.startsWith('/')) {
145
+ throw new Error(`Drive path must be absolute: ${input}`);
146
+ }
147
+ const segments = input.split('/').filter(Boolean);
148
+ if (segments.some((segment) => segment === '.' || segment === '..')) {
149
+ throw new Error(`Drive path must not contain traversal segments: ${input}`);
150
+ }
151
+ return input === '/' ? '/' : `/${segments.join('/')}`;
152
+ }
153
+ //# sourceMappingURL=drive-sync-state-applier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive-sync-state-applier.js","sourceRoot":"","sources":["../../src/managed-runtime/drive-sync-state-applier.ts"],"names":[],"mappings":"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"}