@panorama-ai/gateway 2.30.211 → 2.31.9

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 (120) hide show
  1. package/README.md +59 -63
  2. package/dist/cli-args.d.ts +0 -2
  3. package/dist/cli-args.d.ts.map +1 -1
  4. package/dist/cli-args.js +0 -8
  5. package/dist/cli-args.js.map +1 -1
  6. package/dist/cli-providers/types.d.ts +1 -1
  7. package/dist/cli-providers/types.d.ts.map +1 -1
  8. package/dist/database.types.d.ts +1974 -1024
  9. package/dist/database.types.d.ts.map +1 -1
  10. package/dist/database.types.js.map +1 -1
  11. package/dist/drive-sync/config.d.ts +14 -0
  12. package/dist/drive-sync/config.d.ts.map +1 -0
  13. package/dist/drive-sync/config.js +45 -0
  14. package/dist/drive-sync/config.js.map +1 -0
  15. package/dist/drive-sync/drive-sync-filesystem.d.ts +39 -0
  16. package/dist/drive-sync/drive-sync-filesystem.d.ts.map +1 -0
  17. package/dist/drive-sync/drive-sync-filesystem.js +434 -0
  18. package/dist/drive-sync/drive-sync-filesystem.js.map +1 -0
  19. package/dist/drive-sync/drive-sync-planner.d.ts +76 -0
  20. package/dist/drive-sync/drive-sync-planner.d.ts.map +1 -0
  21. package/dist/drive-sync/drive-sync-planner.js +363 -0
  22. package/dist/drive-sync/drive-sync-planner.js.map +1 -0
  23. package/dist/drive-sync/drive-sync-remote-planner.d.ts +52 -0
  24. package/dist/drive-sync/drive-sync-remote-planner.d.ts.map +1 -0
  25. package/dist/drive-sync/drive-sync-remote-planner.js +77 -0
  26. package/dist/drive-sync/drive-sync-remote-planner.js.map +1 -0
  27. package/dist/drive-sync/drive-sync-scheduler.d.ts +51 -0
  28. package/dist/drive-sync/drive-sync-scheduler.d.ts.map +1 -0
  29. package/dist/drive-sync/drive-sync-scheduler.js +304 -0
  30. package/dist/drive-sync/drive-sync-scheduler.js.map +1 -0
  31. package/dist/drive-sync/drive-sync-state-applier.d.ts +84 -0
  32. package/dist/drive-sync/drive-sync-state-applier.d.ts.map +1 -0
  33. package/dist/drive-sync/drive-sync-state-applier.js +153 -0
  34. package/dist/drive-sync/drive-sync-state-applier.js.map +1 -0
  35. package/dist/drive-sync/drive-sync-transfer.d.ts +86 -0
  36. package/dist/drive-sync/drive-sync-transfer.d.ts.map +1 -0
  37. package/dist/drive-sync/drive-sync-transfer.js +245 -0
  38. package/dist/drive-sync/drive-sync-transfer.js.map +1 -0
  39. package/dist/drive-sync/drive-sync.d.ts +433 -0
  40. package/dist/drive-sync/drive-sync.d.ts.map +1 -0
  41. package/dist/drive-sync/drive-sync.js +1677 -0
  42. package/dist/drive-sync/drive-sync.js.map +1 -0
  43. package/dist/{managed-runtime → drive-sync}/runtime-utils.d.ts +2 -2
  44. package/dist/drive-sync/runtime-utils.d.ts.map +1 -0
  45. package/dist/{managed-runtime → drive-sync}/runtime-utils.js +1 -1
  46. package/dist/drive-sync/runtime-utils.js.map +1 -0
  47. package/dist/finalize-subagent-run.d.ts +2 -1
  48. package/dist/finalize-subagent-run.d.ts.map +1 -1
  49. package/dist/finalize-subagent-run.js.map +1 -1
  50. package/dist/gateway-local-runtime.d.ts +7 -1
  51. package/dist/gateway-local-runtime.d.ts.map +1 -1
  52. package/dist/gateway-local-runtime.js +26 -5
  53. package/dist/gateway-local-runtime.js.map +1 -1
  54. package/dist/gateway-state.d.ts +4 -0
  55. package/dist/gateway-state.d.ts.map +1 -1
  56. package/dist/gateway-state.js +6 -2
  57. package/dist/gateway-state.js.map +1 -1
  58. package/dist/index.js +4102 -2409
  59. package/dist/index.js.map +4 -4
  60. package/dist/local-runtime/drive-sync-supervisor.d.ts +14 -0
  61. package/dist/local-runtime/drive-sync-supervisor.d.ts.map +1 -0
  62. package/dist/local-runtime/drive-sync-supervisor.js +79 -0
  63. package/dist/local-runtime/drive-sync-supervisor.js.map +1 -0
  64. package/dist/local-runtime/shutdown-supervisor.d.ts +1 -0
  65. package/dist/local-runtime/shutdown-supervisor.d.ts.map +1 -1
  66. package/dist/local-runtime/shutdown-supervisor.js +5 -2
  67. package/dist/local-runtime/shutdown-supervisor.js.map +1 -1
  68. package/dist/subagent-adapters/types.d.ts +1 -1
  69. package/dist/subagent-adapters/types.d.ts.map +1 -1
  70. package/dist/subagent-output-persistence.d.ts +1 -1
  71. package/dist/subagent-output-persistence.d.ts.map +1 -1
  72. package/dist/subagent-output-persistence.js +1 -1
  73. package/dist/subagent-output-persistence.js.map +1 -1
  74. package/package.json +6 -6
  75. package/dist/managed-runtime/config.d.ts +0 -20
  76. package/dist/managed-runtime/config.d.ts.map +0 -1
  77. package/dist/managed-runtime/config.js +0 -80
  78. package/dist/managed-runtime/config.js.map +0 -1
  79. package/dist/managed-runtime/control-client.d.ts +0 -66
  80. package/dist/managed-runtime/control-client.d.ts.map +0 -1
  81. package/dist/managed-runtime/control-client.js +0 -142
  82. package/dist/managed-runtime/control-client.js.map +0 -1
  83. package/dist/managed-runtime/dependencies.d.ts +0 -17
  84. package/dist/managed-runtime/dependencies.d.ts.map +0 -1
  85. package/dist/managed-runtime/dependencies.js +0 -28
  86. package/dist/managed-runtime/dependencies.js.map +0 -1
  87. package/dist/managed-runtime/execution-dispatcher.d.ts +0 -25
  88. package/dist/managed-runtime/execution-dispatcher.d.ts.map +0 -1
  89. package/dist/managed-runtime/execution-dispatcher.js +0 -155
  90. package/dist/managed-runtime/execution-dispatcher.js.map +0 -1
  91. package/dist/managed-runtime/heartbeat.d.ts +0 -7
  92. package/dist/managed-runtime/heartbeat.d.ts.map +0 -1
  93. package/dist/managed-runtime/heartbeat.js +0 -44
  94. package/dist/managed-runtime/heartbeat.js.map +0 -1
  95. package/dist/managed-runtime/host-state.d.ts +0 -15
  96. package/dist/managed-runtime/host-state.d.ts.map +0 -1
  97. package/dist/managed-runtime/host-state.js +0 -50
  98. package/dist/managed-runtime/host-state.js.map +0 -1
  99. package/dist/managed-runtime/realtime.d.ts +0 -25
  100. package/dist/managed-runtime/realtime.d.ts.map +0 -1
  101. package/dist/managed-runtime/realtime.js +0 -189
  102. package/dist/managed-runtime/realtime.js.map +0 -1
  103. package/dist/managed-runtime/runtime-utils.d.ts.map +0 -1
  104. package/dist/managed-runtime/runtime-utils.js.map +0 -1
  105. package/dist/managed-runtime/shell-execution.d.ts +0 -33
  106. package/dist/managed-runtime/shell-execution.d.ts.map +0 -1
  107. package/dist/managed-runtime/shell-execution.js +0 -186
  108. package/dist/managed-runtime/shell-execution.js.map +0 -1
  109. package/dist/managed-runtime/step-result.d.ts +0 -22
  110. package/dist/managed-runtime/step-result.d.ts.map +0 -1
  111. package/dist/managed-runtime/step-result.js +0 -252
  112. package/dist/managed-runtime/step-result.js.map +0 -1
  113. package/dist/managed-runtime/wake-signal.d.ts +0 -5
  114. package/dist/managed-runtime/wake-signal.d.ts.map +0 -1
  115. package/dist/managed-runtime/wake-signal.js +0 -29
  116. package/dist/managed-runtime/wake-signal.js.map +0 -1
  117. package/dist/managed-runtime.d.ts +0 -8
  118. package/dist/managed-runtime.d.ts.map +0 -1
  119. package/dist/managed-runtime.js +0 -224
  120. package/dist/managed-runtime.js.map +0 -1
@@ -0,0 +1,245 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { createReadStream, createWriteStream } from 'node:fs';
3
+ import { lstat, mkdir, rename, rm, writeFile } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { Readable } from 'node:stream';
6
+ import { pipeline } from 'node:stream/promises';
7
+ import { DRIVE_TRANSFER_POLICY } from '@panorama/shared/drive-transfer-policy';
8
+ import { normalizeDrivePath } from './drive-sync-filesystem.js';
9
+ const DEFAULT_DRIVE_SYNC_TRANSFER_TIMEOUT_MS = DRIVE_TRANSFER_POLICY.networkRequestTimeoutMs;
10
+ export class LocalDriveFileDeferredError extends Error {
11
+ drivePath;
12
+ constructor(drivePath, message) {
13
+ super(message ?? `Local drive file changed while it was being read; deferring sync for ${drivePath}`);
14
+ this.name = 'LocalDriveFileDeferredError';
15
+ this.drivePath = drivePath;
16
+ }
17
+ }
18
+ export function isLocalDriveFileDeferredError(error) {
19
+ return error instanceof LocalDriveFileDeferredError;
20
+ }
21
+ export async function prepareLocalMutationUploads(params) {
22
+ const preparedMutations = [];
23
+ const deferredPaths = [];
24
+ const requiresUploadApi = params.mutations.some((mutation) => mutation.request.type === 'write_file' &&
25
+ mutation.localFilePath &&
26
+ typeof mutation.request.storage_key !== 'string');
27
+ if (requiresUploadApi && !params.api.prepareFileUpload) {
28
+ throw new Error('Drive sync direct upload API is not configured');
29
+ }
30
+ for (const mutation of params.mutations) {
31
+ const localFilePath = mutation.localFilePath;
32
+ if (mutation.request.type !== 'write_file' || !localFilePath) {
33
+ preparedMutations.push(mutation);
34
+ continue;
35
+ }
36
+ if (typeof mutation.request.storage_key === 'string') {
37
+ preparedMutations.push(mutation);
38
+ continue;
39
+ }
40
+ const drivePath = readMutationString(mutation.request, 'path');
41
+ try {
42
+ const contentSha256 = readMutationString(mutation.request, 'content_sha256');
43
+ const sizeBytes = readMutationNumber(mutation.request, 'size_bytes');
44
+ const versionId = buildDeterministicDriveVersionId({
45
+ driveId: params.driveId,
46
+ path: drivePath,
47
+ contentSha256,
48
+ sizeBytes,
49
+ baseVersionId: typeof mutation.request.base_version_id === 'string'
50
+ ? mutation.request.base_version_id
51
+ : null,
52
+ });
53
+ await assertLocalFileFingerprint(mutation);
54
+ const prepared = await params.api.prepareFileUpload({
55
+ sync_client_id: params.syncClientId,
56
+ drive_id: params.driveId,
57
+ path: drivePath,
58
+ version_id: versionId,
59
+ content_sha256: contentSha256,
60
+ size_bytes: sizeBytes,
61
+ mime_type: typeof mutation.request.mime_type === 'string' ? mutation.request.mime_type : null,
62
+ });
63
+ if (prepared.upload_request) {
64
+ await uploadLocalFileToSignedRequest({
65
+ filePath: localFilePath,
66
+ sizeBytes,
67
+ signedRequest: prepared.upload_request,
68
+ });
69
+ }
70
+ else if (prepared.upload_status !== 'committed') {
71
+ throw new Error('Prepared drive upload did not include an upload request');
72
+ }
73
+ await assertLocalFileFingerprint(mutation);
74
+ mutation.request.version_id = prepared.version_id;
75
+ mutation.request.storage_key = prepared.storage_key;
76
+ preparedMutations.push(mutation);
77
+ }
78
+ catch (error) {
79
+ if (!isLocalDriveFileDeferredError(error)) {
80
+ throw error;
81
+ }
82
+ deferredPaths.push(error.drivePath);
83
+ }
84
+ }
85
+ return { preparedMutations, deferredPaths };
86
+ }
87
+ export async function downloadDriveVersionToLocalFile(params) {
88
+ const response = await params.api.downloadFileVersion({
89
+ sync_client_id: params.syncClientId,
90
+ drive_id: params.driveId,
91
+ version_id: params.versionId,
92
+ format: 'base64',
93
+ transfer_mode: 'direct',
94
+ });
95
+ if (response.file.transfer_mode === 'direct' && response.file.download_request) {
96
+ return await downloadSignedRequestToFile({
97
+ signedRequest: response.file.download_request,
98
+ targetPath: params.targetPath,
99
+ expectedSizeBytes: params.expectedSizeBytes,
100
+ expectedSha256: params.expectedSha256,
101
+ });
102
+ }
103
+ if (response.file.content_format !== 'base64' || !response.file.content_base64) {
104
+ throw new Error(`Drive file version ${params.versionId} was not returned as base64`);
105
+ }
106
+ const bytes = Buffer.from(response.file.content_base64, 'base64');
107
+ const contentSha256 = sha256Hex(bytes);
108
+ if (params.expectedSizeBytes !== null && bytes.byteLength !== params.expectedSizeBytes) {
109
+ throw new Error(`Downloaded drive file size mismatch for ${params.versionId}`);
110
+ }
111
+ if (params.expectedSha256 && contentSha256 !== params.expectedSha256) {
112
+ throw new Error(`Downloaded drive file hash mismatch for ${params.versionId}`);
113
+ }
114
+ await mkdir(path.dirname(params.targetPath), { recursive: true });
115
+ await writeFile(params.targetPath, bytes);
116
+ return { sizeBytes: bytes.byteLength, contentSha256 };
117
+ }
118
+ async function assertLocalFileFingerprint(mutation) {
119
+ if (!mutation.localFilePath || !mutation.localFingerprint) {
120
+ return;
121
+ }
122
+ const current = await lstat(mutation.localFilePath);
123
+ if (!current.isFile() ||
124
+ current.size !== mutation.localFingerprint.sizeBytes ||
125
+ current.mtimeMs !== mutation.localFingerprint.mtimeMs ||
126
+ current.ctimeMs !== mutation.localFingerprint.ctimeMs) {
127
+ const drivePath = readMutationString(mutation.request, 'path');
128
+ throw new LocalDriveFileDeferredError(drivePath);
129
+ }
130
+ }
131
+ async function uploadLocalFileToSignedRequest(params) {
132
+ const headers = new Headers(params.signedRequest.headers);
133
+ headers.set('content-length', String(params.sizeBytes));
134
+ const response = await fetchWithTimeout(params.signedRequest.url, {
135
+ method: params.signedRequest.method,
136
+ headers,
137
+ body: createReadStream(params.filePath),
138
+ duplex: 'half',
139
+ }, {
140
+ timeoutMs: DEFAULT_DRIVE_SYNC_TRANSFER_TIMEOUT_MS,
141
+ label: 'Drive object upload',
142
+ });
143
+ if (!response.ok) {
144
+ const body = await response.text().catch(() => '');
145
+ throw new Error(`Drive object upload failed with status ${response.status}${body ? ` body=${body.slice(0, 500)}` : ''}`);
146
+ }
147
+ }
148
+ async function downloadSignedRequestToFile(params) {
149
+ const response = await fetchWithTimeout(params.signedRequest.url, {
150
+ method: params.signedRequest.method,
151
+ headers: params.signedRequest.headers,
152
+ }, {
153
+ timeoutMs: DEFAULT_DRIVE_SYNC_TRANSFER_TIMEOUT_MS,
154
+ label: 'Drive object download',
155
+ });
156
+ if (!response.ok || !response.body) {
157
+ const body = await response.text().catch(() => '');
158
+ throw new Error(`Drive object download failed with status ${response.status}${body ? ` body=${body.slice(0, 500)}` : ''}`);
159
+ }
160
+ await mkdir(path.dirname(params.targetPath), { recursive: true });
161
+ const tempPath = `${params.targetPath}.panorama-download-${randomUUID()}.tmp`;
162
+ const hash = createHash('sha256');
163
+ let sizeBytes = 0;
164
+ try {
165
+ const source = Readable.fromWeb(response.body);
166
+ await pipeline(source, async function* hashChunks(chunks) {
167
+ for await (const chunk of chunks) {
168
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
169
+ sizeBytes += buffer.byteLength;
170
+ hash.update(buffer);
171
+ yield buffer;
172
+ }
173
+ }, createWriteStream(tempPath));
174
+ const contentSha256 = hash.digest('hex');
175
+ if (params.expectedSizeBytes !== null && sizeBytes !== params.expectedSizeBytes) {
176
+ throw new Error(`Downloaded drive file size mismatch for ${params.targetPath}`);
177
+ }
178
+ if (params.expectedSha256 && contentSha256 !== params.expectedSha256) {
179
+ throw new Error(`Downloaded drive file hash mismatch for ${params.targetPath}`);
180
+ }
181
+ await rename(tempPath, params.targetPath);
182
+ return { sizeBytes, contentSha256 };
183
+ }
184
+ catch (error) {
185
+ await rm(tempPath, { force: true }).catch(() => undefined);
186
+ throw error;
187
+ }
188
+ }
189
+ async function fetchWithTimeout(input, init, options) {
190
+ const controller = new AbortController();
191
+ const timer = setTimeout(() => {
192
+ controller.abort();
193
+ }, options.timeoutMs);
194
+ timer.unref?.();
195
+ try {
196
+ return await fetch(input, {
197
+ ...init,
198
+ signal: init.signal ?? controller.signal,
199
+ });
200
+ }
201
+ catch (error) {
202
+ if (controller.signal.aborted) {
203
+ throw new Error(`${options.label} timed out after ${options.timeoutMs}ms`);
204
+ }
205
+ throw error;
206
+ }
207
+ finally {
208
+ clearTimeout(timer);
209
+ }
210
+ }
211
+ function buildDeterministicDriveVersionId(params) {
212
+ const hash = createHash('sha256')
213
+ .update([
214
+ 'panorama-drive-version-v1',
215
+ params.driveId,
216
+ normalizeDrivePath(params.path),
217
+ params.contentSha256,
218
+ String(params.sizeBytes),
219
+ params.baseVersionId ?? '',
220
+ ].join('\0'))
221
+ .digest();
222
+ const bytes = Buffer.from(hash.subarray(0, 16));
223
+ bytes[6] = (bytes[6] & 0x0f) | 0x50;
224
+ bytes[8] = (bytes[8] & 0x3f) | 0x80;
225
+ const hex = bytes.toString('hex');
226
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
227
+ }
228
+ function readMutationString(request, key) {
229
+ const value = request[key];
230
+ if (typeof value !== 'string') {
231
+ throw new Error(`Local drive sync mutation is missing ${key}`);
232
+ }
233
+ return value;
234
+ }
235
+ function readMutationNumber(request, key) {
236
+ const value = request[key];
237
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) {
238
+ throw new Error(`Local drive sync mutation is missing numeric ${key}`);
239
+ }
240
+ return value;
241
+ }
242
+ function sha256Hex(bytes) {
243
+ return createHash('sha256').update(bytes).digest('hex');
244
+ }
245
+ //# sourceMappingURL=drive-sync-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive-sync-transfer.js","sourceRoot":"","sources":["../../src/drive-sync/drive-sync-transfer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,433 @@
1
+ import type { GatewayDriveSyncConfig } from './config.js';
2
+ import { type DriveSyncConflictRecord, type DriveSyncStateEntry } from './drive-sync-planner.js';
3
+ import { type DriveSyncStateMutationStore, type LocalDriveMutationResult } from './drive-sync-state-applier.js';
4
+ import { type DriveSyncSupabaseClient } from './runtime-utils.js';
5
+ export type { DriveSyncConflictRecord, DriveSyncStateEntry, DriveSyncStateEntryType, LocalDriveMutation, LocalDriveScanEntry, } from './drive-sync-planner.js';
6
+ export { resolveDriveLocalPath, resolveDriveLocalRoot } from './drive-sync-filesystem.js';
7
+ type DriveSyncClientResponse = {
8
+ id: string;
9
+ team_id: string;
10
+ agent_id: string | null;
11
+ host_id: string | null;
12
+ vm_id: string | null;
13
+ display_name: string | null;
14
+ status: string;
15
+ metadata: Record<string, unknown>;
16
+ created_at: string;
17
+ updated_at: string;
18
+ };
19
+ type DriveSyncCursorResponse = {
20
+ id: string;
21
+ sync_client_id: string;
22
+ drive_id: string;
23
+ last_batch_sequence: number;
24
+ status: string;
25
+ last_success_at: string | null;
26
+ last_error: string | null;
27
+ metadata: Record<string, unknown>;
28
+ created_at: string;
29
+ updated_at: string;
30
+ };
31
+ type DriveSyncStatusValue = 'active' | 'degraded' | 'error';
32
+ type DriveSyncStatusSummaryResponse = {
33
+ applied_batch_count: number;
34
+ applied_path_count: number;
35
+ remote_conflict_count: number;
36
+ uploaded_batch_count: number;
37
+ uploaded_change_count: number;
38
+ uploaded_applied_count: number;
39
+ uploaded_conflict_count: number;
40
+ uploaded_unsupported_count: number;
41
+ uploaded_rejected_count: number;
42
+ deferred_file_count: number;
43
+ };
44
+ type DriveSyncStatusReportResponse = {
45
+ id: string;
46
+ sync_client_id: string;
47
+ drive_id: string;
48
+ status: DriveSyncStatusValue;
49
+ last_reason: string | null;
50
+ last_error: string | null;
51
+ last_batch_sequence: number | null;
52
+ last_sync_at: string;
53
+ last_success_at: string | null;
54
+ summary: DriveSyncStatusSummaryResponse;
55
+ metadata: Record<string, unknown>;
56
+ created_at: string;
57
+ updated_at: string;
58
+ };
59
+ type DriveResourceResponse = {
60
+ id: string;
61
+ title: string | null;
62
+ metadata: Record<string, unknown>;
63
+ created_at: string;
64
+ updated_at: string;
65
+ };
66
+ type DriveChangeBatchPathResponse = {
67
+ id: string;
68
+ path: string;
69
+ scope: string;
70
+ change_type: string | null;
71
+ entry_type: string | null;
72
+ from_path: string | null;
73
+ to_path: string | null;
74
+ version_id: string | null;
75
+ version: {
76
+ id: string;
77
+ drive_id: string;
78
+ path: string;
79
+ content_sha256: string;
80
+ size_bytes: number;
81
+ mime_type: string | null;
82
+ } | null;
83
+ };
84
+ type DriveChangeBatchResponse = {
85
+ id: string;
86
+ sequence: number;
87
+ drive_id: string;
88
+ summary: string;
89
+ confidence: string;
90
+ counters: Record<string, unknown>;
91
+ observation_metadata: Record<string, unknown>;
92
+ completed_at: string;
93
+ created_at: string;
94
+ paths: DriveChangeBatchPathResponse[];
95
+ };
96
+ type RegisterDriveSyncClientResponse = {
97
+ success: true;
98
+ sync_client: DriveSyncClientResponse;
99
+ };
100
+ type ListSyncDrivesResponse = {
101
+ success: true;
102
+ sync_client: DriveSyncClientResponse;
103
+ drives: Array<{
104
+ resource: DriveResourceResponse;
105
+ cursor: DriveSyncCursorResponse | null;
106
+ sync_status?: DriveSyncStatusReportResponse | null;
107
+ }>;
108
+ };
109
+ type GetDriveChangesResponse = {
110
+ success: true;
111
+ sync_client: DriveSyncClientResponse;
112
+ drive_id: string;
113
+ cursor: DriveSyncCursorResponse;
114
+ changes: DriveChangeBatchResponse[];
115
+ next_batch_sequence: number | null;
116
+ has_more: boolean;
117
+ };
118
+ type DownloadDriveFileVersionResponse = {
119
+ success: true;
120
+ file: {
121
+ path: string;
122
+ version_id: string;
123
+ content_sha256: string;
124
+ mime_type: string | null;
125
+ size_bytes: number;
126
+ transfer_mode?: 'direct';
127
+ download_request?: DriveObjectSignedRequestResponse;
128
+ content_format?: 'base64' | 'text';
129
+ is_utf8_text?: boolean;
130
+ content_base64?: string;
131
+ text_content?: string;
132
+ };
133
+ };
134
+ type DriveObjectSignedRequestResponse = {
135
+ method: 'GET' | 'PUT' | 'DELETE';
136
+ url: string;
137
+ headers: Record<string, string>;
138
+ expires_at: string;
139
+ };
140
+ type PrepareDriveFileUploadResponse = {
141
+ success: true;
142
+ sync_client: DriveSyncClientResponse;
143
+ drive_id: string;
144
+ path: string;
145
+ version_id: string;
146
+ storage_backend: 'object';
147
+ storage_key: string;
148
+ content_sha256: string;
149
+ size_bytes: number;
150
+ mime_type: string | null;
151
+ upload_id?: string;
152
+ upload_expires_at?: string;
153
+ upload_status?: 'pending' | 'committed';
154
+ upload_request: DriveObjectSignedRequestResponse | null;
155
+ };
156
+ type AckDriveChangesResponse = {
157
+ success: true;
158
+ sync_client: DriveSyncClientResponse;
159
+ cursor: DriveSyncCursorResponse;
160
+ remote_conflict_count?: number;
161
+ remote_conflicts?: RemoteConflictAckResult[];
162
+ resource_operation_id?: string;
163
+ resource_operation_status?: string;
164
+ };
165
+ type RemoteConflictAckPayload = {
166
+ path: string;
167
+ reason: string | null;
168
+ conflict_path: string | null;
169
+ local_content_sha256: string | null;
170
+ local_size_bytes: number | null;
171
+ local_version_id: string | null;
172
+ remote_batch_id: string | null;
173
+ remote_sequence: number | null;
174
+ };
175
+ type RemoteConflictAckResult = {
176
+ path?: string;
177
+ status?: string;
178
+ conflict_id?: string | null;
179
+ conflict_path?: string | null;
180
+ reason?: string | null;
181
+ remote_batch_id?: string | null;
182
+ remote_sequence?: number | null;
183
+ };
184
+ type ApplyLocalDriveChangeBatchResponse = {
185
+ success: true;
186
+ idempotent: boolean;
187
+ drive_id: string;
188
+ sync_client_id: string;
189
+ batch: {
190
+ id: string;
191
+ sequence: number;
192
+ } | null;
193
+ results: LocalDriveChangeResult[];
194
+ applied_count: number;
195
+ conflict_count: number;
196
+ unsupported_count: number;
197
+ rejected_count: number;
198
+ resource_operation_status?: string;
199
+ };
200
+ type ApplyDriveConflictActionsResponse = {
201
+ success: true;
202
+ sync_client: DriveSyncClientResponse;
203
+ drive_id: string;
204
+ resolved_count: number;
205
+ ignored_count: number;
206
+ updated_count: number;
207
+ missing_count: number;
208
+ results: DriveConflictActionResult[];
209
+ };
210
+ type DriveConflictActionResult = {
211
+ index?: number;
212
+ type?: string;
213
+ path?: string;
214
+ conflict_id?: string | null;
215
+ conflict_path?: string | null;
216
+ status?: string;
217
+ };
218
+ type ReportDriveSyncStatusResponse = {
219
+ success: true;
220
+ sync_client: DriveSyncClientResponse;
221
+ status_report: DriveSyncStatusReportResponse;
222
+ };
223
+ type LocalDriveChangeResultBase = {
224
+ index: number;
225
+ type: string;
226
+ path?: string;
227
+ from_path?: string;
228
+ to_path?: string;
229
+ version_id?: string;
230
+ conflict_id?: string;
231
+ reason?: string;
232
+ };
233
+ type LocalDriveChangeResult = (LocalDriveChangeResultBase & LocalDriveMutationResult) | (LocalDriveChangeResultBase & {
234
+ status: 'staged';
235
+ });
236
+ export type DriveSyncFunctionApi = {
237
+ registerClient(body: {
238
+ team_id?: string;
239
+ agent_id?: string | null;
240
+ host_id?: string | null;
241
+ vm_id?: string | null;
242
+ client_key: string;
243
+ display_name: string;
244
+ metadata: Record<string, unknown>;
245
+ }): Promise<RegisterDriveSyncClientResponse>;
246
+ listDrives(body: {
247
+ sync_client_id: string;
248
+ }): Promise<ListSyncDrivesResponse>;
249
+ getChanges(body: {
250
+ sync_client_id: string;
251
+ drive_id: string;
252
+ limit: number;
253
+ }): Promise<GetDriveChangesResponse>;
254
+ downloadFileVersion(body: {
255
+ sync_client_id: string;
256
+ drive_id: string;
257
+ version_id: string;
258
+ format: 'base64';
259
+ transfer_mode?: 'direct';
260
+ }): Promise<DownloadDriveFileVersionResponse>;
261
+ prepareFileUpload?(body: {
262
+ sync_client_id: string;
263
+ drive_id: string;
264
+ path: string;
265
+ version_id: string;
266
+ content_sha256: string;
267
+ size_bytes: number;
268
+ mime_type?: string | null;
269
+ }): Promise<PrepareDriveFileUploadResponse>;
270
+ ackChanges(body: {
271
+ sync_client_id: string;
272
+ drive_id: string;
273
+ operation_id?: string;
274
+ last_batch_sequence: number;
275
+ last_error?: string | null;
276
+ remote_conflicts?: RemoteConflictAckPayload[];
277
+ }): Promise<AckDriveChangesResponse>;
278
+ applyLocalChangeBatch(body: {
279
+ sync_client_id: string;
280
+ drive_id: string;
281
+ resource_operation_id: string;
282
+ resource_operation_fingerprint: string;
283
+ resource_operation_chunk_fingerprint: string;
284
+ resource_operation_chunk_fingerprints: string[];
285
+ resource_operation_chunk_index: number;
286
+ resource_operation_chunk_count: number;
287
+ base_cursor_sequence: number | null;
288
+ changes: Record<string, unknown>[];
289
+ }): Promise<ApplyLocalDriveChangeBatchResponse>;
290
+ applyConflictActions?(body: {
291
+ sync_client_id: string;
292
+ drive_id: string;
293
+ operation_id: string;
294
+ actions: Record<string, unknown>[];
295
+ }): Promise<ApplyDriveConflictActionsResponse>;
296
+ reportStatus(body: {
297
+ sync_client_id: string;
298
+ drive_id: string;
299
+ status?: DriveSyncStatusValue | null;
300
+ last_reason?: string | null;
301
+ last_error?: string | null;
302
+ last_batch_sequence?: number | null;
303
+ summary?: DriveSyncStatusSummaryResponse;
304
+ metadata?: Record<string, unknown>;
305
+ }): Promise<ReportDriveSyncStatusResponse>;
306
+ };
307
+ export type DriveSyncStateDrive = {
308
+ id: string;
309
+ title: string | null;
310
+ rootPath: string;
311
+ };
312
+ export type DriveSyncStateStoreLike = DriveSyncStateMutationStore & {
313
+ getOrCreateClientKey?(prefix: string): string;
314
+ getEntry?(driveId: string, drivePath: string): DriveSyncStateEntry | null;
315
+ listEntries?(driveId: string): DriveSyncStateEntry[];
316
+ listDrives?(): DriveSyncStateDrive[];
317
+ listConflicts?(driveId: string): DriveSyncConflictRecord[];
318
+ setSyncClient(client: DriveSyncClientResponse): void;
319
+ upsertDrive(drive: {
320
+ id: string;
321
+ title: string | null;
322
+ rootPath: string;
323
+ }): void;
324
+ removeDrive?(driveId: string): void;
325
+ setCursor(driveId: string, lastBatchSequence: number): void;
326
+ close?(): void;
327
+ };
328
+ export declare class DriveSyncStateStore implements DriveSyncStateStoreLike {
329
+ private readonly db;
330
+ private constructor();
331
+ static open(stateDir: string): Promise<DriveSyncStateStore>;
332
+ close(): void;
333
+ getOrCreateClientKey(prefix: string): string;
334
+ getEntry(driveId: string, drivePath: string): DriveSyncStateEntry | null;
335
+ listEntries(driveId: string): DriveSyncStateEntry[];
336
+ listDrives(): DriveSyncStateDrive[];
337
+ getConflict(driveId: string, drivePath: string): DriveSyncConflictRecord | null;
338
+ listConflicts(driveId: string): DriveSyncConflictRecord[];
339
+ setSyncClient(client: DriveSyncClientResponse): void;
340
+ upsertDrive(drive: {
341
+ id: string;
342
+ title: string | null;
343
+ rootPath: string;
344
+ }): void;
345
+ removeDrive(driveId: string): void;
346
+ setCursor(driveId: string, lastBatchSequence: number): void;
347
+ upsertEntry(entry: DriveSyncStateEntry): void;
348
+ upsertConflict(conflict: DriveSyncConflictRecord): void;
349
+ deleteConflict(driveId: string, drivePath: string): void;
350
+ deleteConflictTree(driveId: string, drivePath: string): void;
351
+ deleteEntryTree(driveId: string, drivePath: string): void;
352
+ moveEntryTree(driveId: string, fromPath: string, toPath: string): void;
353
+ private ensureSchema;
354
+ private ensureColumn;
355
+ }
356
+ export type DriveSyncOptions = {
357
+ includeLocalWrites?: boolean;
358
+ dirtyLocalPaths?: string[];
359
+ schedulerStatus?: {
360
+ watchStatus: 'active' | 'unavailable' | 'error';
361
+ watchError: string | null;
362
+ };
363
+ };
364
+ export type DriveSyncService = {
365
+ syncOnce(options?: DriveSyncOptions): Promise<DriveSyncRunSummary>;
366
+ close(): void;
367
+ };
368
+ export type DriveSyncRunSummary = {
369
+ driveCount: number;
370
+ failedDriveCount: number;
371
+ appliedBatchCount: number;
372
+ appliedPathCount: number;
373
+ remoteConflictCount: number;
374
+ uploadedBatchCount: number;
375
+ uploadedChangeCount: number;
376
+ uploadedAppliedCount: number;
377
+ uploadedConflictCount: number;
378
+ uploadedUnsupportedCount: number;
379
+ uploadedRejectedCount: number;
380
+ deferredFileCount: number;
381
+ };
382
+ export type DriveSyncRuntimeIdentity = {
383
+ kind: 'vm_gateway';
384
+ teamId: string;
385
+ vmId: string;
386
+ gatewayId: string;
387
+ generation: number | null;
388
+ agentId?: string | null;
389
+ };
390
+ export type DriveSyncRuntimeConfig = {
391
+ runtimeId: string;
392
+ driveSync: GatewayDriveSyncConfig;
393
+ identity: DriveSyncRuntimeIdentity;
394
+ };
395
+ export declare function createDriveSyncService(params: {
396
+ config: DriveSyncRuntimeConfig;
397
+ supabase: DriveSyncSupabaseClient;
398
+ api?: DriveSyncFunctionApi;
399
+ stateStore?: DriveSyncStateStoreLike;
400
+ }): Promise<DriveSyncService>;
401
+ export declare function createSupabaseDriveSyncApi(supabase: DriveSyncSupabaseClient, options?: {
402
+ timeoutMs?: number;
403
+ }): DriveSyncFunctionApi;
404
+ export declare function applyDriveChangeBatchToLocalFilesystem(params: {
405
+ syncClientId: string;
406
+ driveRoot: string;
407
+ batch: DriveChangeBatchResponse;
408
+ api: Pick<DriveSyncFunctionApi, 'downloadFileVersion'>;
409
+ stateStore: DriveSyncStateStoreLike;
410
+ }): Promise<{
411
+ appliedPathCount: number;
412
+ remoteConflictCount: number;
413
+ remoteConflicts: DriveSyncConflictRecord[];
414
+ }>;
415
+ export declare function reconcileLocalDriveToCloud(params: {
416
+ syncClientId: string;
417
+ driveId: string;
418
+ driveRoot: string;
419
+ baseCursorSequence: number | null;
420
+ api: Pick<DriveSyncFunctionApi, 'applyLocalChangeBatch' | 'prepareFileUpload' | 'applyConflictActions'>;
421
+ stateStore: DriveSyncStateStoreLike;
422
+ dirtyDrivePaths?: Set<string> | null;
423
+ }): Promise<{
424
+ uploadedBatchCount: number;
425
+ uploadedChangeCount: number;
426
+ uploadedAppliedCount: number;
427
+ uploadedConflictCount: number;
428
+ uploadedUnsupportedCount: number;
429
+ uploadedRejectedCount: number;
430
+ deferredFileCount: number;
431
+ }>;
432
+ export declare function logDriveSyncRunSummary(summary: DriveSyncRunSummary): void;
433
+ //# sourceMappingURL=drive-sync.d.ts.map