@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
@@ -1 +1 @@
1
- {"version":3,"file":"database.types.js","sourceRoot":"","sources":["../src/database.types.ts"],"names":[],"mappings":"AA6wVA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE;QACN,KAAK,EAAE,EAAE;KACV;CACO,CAAA"}
1
+ {"version":3,"file":"database.types.js","sourceRoot":"","sources":["../src/database.types.ts"],"names":[],"mappings":"AAksXA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE;QACN,KAAK,EAAE,EAAE;KACV;CACO,CAAA"}
@@ -0,0 +1,14 @@
1
+ export type GatewayDriveSyncConfig = {
2
+ enabled: boolean;
3
+ rootDir: string;
4
+ stateDir: string;
5
+ clientKey: string | null;
6
+ changeLimit: number;
7
+ maxBatchesPerTick: number;
8
+ debounceMs: number;
9
+ pollIntervalMs: number;
10
+ localAuditIntervalMs: number;
11
+ networkTimeoutMs?: number;
12
+ };
13
+ export declare function resolveGatewayDriveSyncConfig(env?: NodeJS.ProcessEnv): GatewayDriveSyncConfig;
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/drive-sync/config.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,sBAAsB,CAqCxB"}
@@ -0,0 +1,45 @@
1
+ import { DRIVE_TRANSFER_POLICY } from '@panorama/shared/drive-transfer-policy';
2
+ import process from 'node:process';
3
+ const DEFAULT_DRIVE_SYNC_ROOT = '/panorama/drives';
4
+ const DEFAULT_DRIVE_SYNC_STATE_DIR = '/var/lib/panorama/drive-sync';
5
+ const DEFAULT_DRIVE_SYNC_CHANGE_LIMIT = 50;
6
+ const DEFAULT_DRIVE_SYNC_MAX_BATCHES_PER_TICK = 25;
7
+ const DEFAULT_DRIVE_SYNC_DEBOUNCE_MS = 1_000;
8
+ const DEFAULT_DRIVE_SYNC_POLL_INTERVAL_MS = 5_000;
9
+ const DEFAULT_DRIVE_SYNC_LOCAL_AUDIT_INTERVAL_MS = 300_000;
10
+ const DEFAULT_DRIVE_SYNC_NETWORK_TIMEOUT_MS = DRIVE_TRANSFER_POLICY.networkRequestTimeoutMs;
11
+ export function resolveGatewayDriveSyncConfig(env = process.env) {
12
+ return {
13
+ enabled: readBoolean('PANORAMA_DRIVE_SYNC_ENABLED', false, env),
14
+ rootDir: env.PANORAMA_DRIVE_SYNC_ROOT?.trim() || DEFAULT_DRIVE_SYNC_ROOT,
15
+ stateDir: env.PANORAMA_DRIVE_SYNC_STATE_DIR?.trim() || DEFAULT_DRIVE_SYNC_STATE_DIR,
16
+ clientKey: env.PANORAMA_DRIVE_SYNC_CLIENT_KEY?.trim() || null,
17
+ changeLimit: readPositiveInt('PANORAMA_DRIVE_SYNC_CHANGE_LIMIT', DEFAULT_DRIVE_SYNC_CHANGE_LIMIT, env),
18
+ maxBatchesPerTick: readPositiveInt('PANORAMA_DRIVE_SYNC_MAX_BATCHES_PER_TICK', DEFAULT_DRIVE_SYNC_MAX_BATCHES_PER_TICK, env),
19
+ debounceMs: readPositiveInt('PANORAMA_DRIVE_SYNC_DEBOUNCE_MS', DEFAULT_DRIVE_SYNC_DEBOUNCE_MS, env),
20
+ pollIntervalMs: readPositiveInt('PANORAMA_DRIVE_SYNC_POLL_INTERVAL_MS', DEFAULT_DRIVE_SYNC_POLL_INTERVAL_MS, env),
21
+ localAuditIntervalMs: readPositiveInt('PANORAMA_DRIVE_SYNC_LOCAL_AUDIT_INTERVAL_MS', DEFAULT_DRIVE_SYNC_LOCAL_AUDIT_INTERVAL_MS, env),
22
+ networkTimeoutMs: readPositiveInt('PANORAMA_DRIVE_SYNC_NETWORK_TIMEOUT_MS', DEFAULT_DRIVE_SYNC_NETWORK_TIMEOUT_MS, env),
23
+ };
24
+ }
25
+ function readPositiveInt(name, fallback, env = process.env) {
26
+ const raw = env[name]?.trim();
27
+ if (!raw)
28
+ return fallback;
29
+ const parsed = Number(raw);
30
+ if (!Number.isFinite(parsed) || parsed <= 0) {
31
+ throw new Error(`${name} must be a positive number`);
32
+ }
33
+ return Math.floor(parsed);
34
+ }
35
+ function readBoolean(name, fallback, env = process.env) {
36
+ const raw = env[name]?.trim().toLowerCase();
37
+ if (!raw)
38
+ return fallback;
39
+ if (['1', 'true', 'yes', 'on'].includes(raw))
40
+ return true;
41
+ if (['0', 'false', 'no', 'off'].includes(raw))
42
+ return false;
43
+ throw new Error(`${name} must be a boolean`);
44
+ }
45
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/drive-sync/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAA;AAC9E,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,MAAM,uBAAuB,GAAG,kBAAkB,CAAA;AAClD,MAAM,4BAA4B,GAAG,8BAA8B,CAAA;AACnE,MAAM,+BAA+B,GAAG,EAAE,CAAA;AAC1C,MAAM,uCAAuC,GAAG,EAAE,CAAA;AAClD,MAAM,8BAA8B,GAAG,KAAK,CAAA;AAC5C,MAAM,mCAAmC,GAAG,KAAK,CAAA;AACjD,MAAM,0CAA0C,GAAG,OAAO,CAAA;AAC1D,MAAM,qCAAqC,GAAG,qBAAqB,CAAC,uBAAuB,CAAA;AAe3F,MAAM,UAAU,6BAA6B,CAC3C,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO;QACL,OAAO,EAAE,WAAW,CAAC,6BAA6B,EAAE,KAAK,EAAE,GAAG,CAAC;QAC/D,OAAO,EAAE,GAAG,CAAC,wBAAwB,EAAE,IAAI,EAAE,IAAI,uBAAuB;QACxE,QAAQ,EAAE,GAAG,CAAC,6BAA6B,EAAE,IAAI,EAAE,IAAI,4BAA4B;QACnF,SAAS,EAAE,GAAG,CAAC,8BAA8B,EAAE,IAAI,EAAE,IAAI,IAAI;QAC7D,WAAW,EAAE,eAAe,CAC1B,kCAAkC,EAClC,+BAA+B,EAC/B,GAAG,CACJ;QACD,iBAAiB,EAAE,eAAe,CAChC,0CAA0C,EAC1C,uCAAuC,EACvC,GAAG,CACJ;QACD,UAAU,EAAE,eAAe,CACzB,iCAAiC,EACjC,8BAA8B,EAC9B,GAAG,CACJ;QACD,cAAc,EAAE,eAAe,CAC7B,sCAAsC,EACtC,mCAAmC,EACnC,GAAG,CACJ;QACD,oBAAoB,EAAE,eAAe,CACnC,6CAA6C,EAC7C,0CAA0C,EAC1C,GAAG,CACJ;QACD,gBAAgB,EAAE,eAAe,CAC/B,wCAAwC,EACxC,qCAAqC,EACrC,GAAG,CACJ;KACF,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CACtB,IAAY,EACZ,QAAgB,EAChB,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAA;IAC7B,IAAI,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAA;IACzB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,4BAA4B,CAAC,CAAA;IACtD,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;AAC3B,CAAC;AAED,SAAS,WAAW,CAClB,IAAY,EACZ,QAAiB,EACjB,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,QAAQ,CAAA;IACzB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAA;IACzD,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA;IAC3D,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAA;AAC9C,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { type LocalDriveScanEntry } from './drive-sync-planner.js';
2
+ export declare const DRIVE_SYNC_MAX_LOCAL_FILE_BYTES: number;
3
+ export type LocalDriveScanResult = {
4
+ entries: Map<string, LocalDriveScanEntry>;
5
+ deferredPaths: Set<string>;
6
+ deferredFileCount: number;
7
+ };
8
+ export declare function resolveDriveLocalRoot(rootDir: string, driveId: string): string;
9
+ export declare function parkStaleDriveLocalFolder(rootDir: string, driveId: string): Promise<string | null>;
10
+ export declare function resolveDriveLocalPath(driveRoot: string, drivePath: string): string;
11
+ export declare function resolveDirtyDrivePathsForDrive(driveRoot: string, dirtyLocalPaths: string[] | undefined): Set<string> | null;
12
+ export declare function readLocalDriveEntryAtPath(params: {
13
+ driveId: string;
14
+ driveRoot: string;
15
+ drivePath: string;
16
+ }): Promise<LocalDriveScanEntry | null>;
17
+ export declare function scanLocalDriveEntries(params: {
18
+ driveId: string;
19
+ driveRoot: string;
20
+ rootDrivePaths?: Set<string>;
21
+ }): Promise<LocalDriveScanResult>;
22
+ export declare function writeLocalConflictCopy(params: {
23
+ driveRoot: string;
24
+ source: LocalDriveScanEntry;
25
+ sourceRootPath: string;
26
+ conflictRootPath: string;
27
+ }): Promise<string>;
28
+ export declare function resolveAvailableConflictDrivePath(params: {
29
+ driveRoot: string;
30
+ sourcePath: string;
31
+ sourceRootPath: string;
32
+ conflictRootPath: string;
33
+ }): Promise<string>;
34
+ export declare function buildSubtreeConflictRootPath(deletedSubtreePath: string): string;
35
+ export declare function assertPathExists(filePath: string, errorMessage: string): Promise<void>;
36
+ export declare function assertLocalPathIsNotSymlink(filePath: string, errorMessage: string): Promise<void>;
37
+ export declare function assertNoSymlinkInExistingPath(driveRoot: string, targetPath: string): Promise<void>;
38
+ export declare function normalizeDrivePath(input: string): string;
39
+ //# sourceMappingURL=drive-sync-filesystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive-sync-filesystem.d.ts","sourceRoot":"","sources":["../../src/drive-sync/drive-sync-filesystem.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAElE,eAAO,MAAM,+BAA+B,QAA2C,CAAA;AAEvF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IACzC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AASD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAK9E;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBxB;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAYlF;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EAAE,GAAG,SAAS,GACpC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAoBpB;AAED,wBAAsB,yBAAyB,CAAC,MAAM,EAAE;IACtD,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAyDtC;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC7B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoKhC;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,mBAAmB,CAAA;IAC3B,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;CACzB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBlB;AAED,wBAAsB,iCAAiC,CAAC,MAAM,EAAE;IAC9D,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;CACzB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BlB;AAED,wBAAgB,4BAA4B,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM,CAK/E;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5F;AAED,wBAAsB,2BAA2B,CAC/C,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,6BAA6B,CACjD,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWxD"}
@@ -0,0 +1,434 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { createReadStream } from 'node:fs';
3
+ import { copyFile, lstat, mkdir, readdir, readlink, rename, stat } from 'node:fs/promises';
4
+ import path from 'node:path';
5
+ import { DRIVE_TRANSFER_POLICY } from '@panorama/shared/drive-transfer-policy';
6
+ export const DRIVE_SYNC_MAX_LOCAL_FILE_BYTES = DRIVE_TRANSFER_POLICY.objectFileMaxBytes;
7
+ class UnstableLocalFileError extends Error {
8
+ drivePath;
9
+ constructor(drivePath) {
10
+ super(`Local drive file changed while it was being read; deferring sync for ${drivePath}`);
11
+ this.drivePath = drivePath;
12
+ this.name = 'UnstableLocalFileError';
13
+ }
14
+ }
15
+ export function resolveDriveLocalRoot(rootDir, driveId) {
16
+ if (!/^[0-9a-f-]{36}$/i.test(driveId)) {
17
+ throw new Error(`Invalid drive id "${driveId}"`);
18
+ }
19
+ return path.join(rootDir, driveId);
20
+ }
21
+ export async function parkStaleDriveLocalFolder(rootDir, driveId) {
22
+ const sourcePath = resolveDriveLocalRoot(rootDir, driveId);
23
+ try {
24
+ await lstat(sourcePath);
25
+ }
26
+ catch (error) {
27
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
28
+ return null;
29
+ }
30
+ throw error;
31
+ }
32
+ const staleRoot = path.join(path.resolve(rootDir), '.stale');
33
+ await mkdir(staleRoot, { recursive: true });
34
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
35
+ const targetPath = path.join(staleRoot, `${driveId}-${timestamp}-${randomUUID()}`);
36
+ await rename(sourcePath, targetPath);
37
+ return targetPath;
38
+ }
39
+ export function resolveDriveLocalPath(driveRoot, drivePath) {
40
+ const normalizedDrivePath = normalizeDrivePath(drivePath);
41
+ const resolvedRoot = path.resolve(driveRoot);
42
+ if (normalizedDrivePath === '/') {
43
+ return resolvedRoot;
44
+ }
45
+ const resolvedPath = path.resolve(resolvedRoot, normalizedDrivePath.slice(1));
46
+ if (resolvedPath !== resolvedRoot && !resolvedPath.startsWith(`${resolvedRoot}${path.sep}`)) {
47
+ throw new Error(`Drive path escapes drive root: ${drivePath}`);
48
+ }
49
+ return resolvedPath;
50
+ }
51
+ export function resolveDirtyDrivePathsForDrive(driveRoot, dirtyLocalPaths) {
52
+ if (!dirtyLocalPaths) {
53
+ return null;
54
+ }
55
+ const resolvedRoot = path.resolve(driveRoot);
56
+ const dirtyDrivePaths = new Set();
57
+ for (const dirtyLocalPath of dirtyLocalPaths) {
58
+ const resolvedDirtyPath = path.resolve(dirtyLocalPath);
59
+ const relativePath = path.relative(resolvedRoot, resolvedDirtyPath);
60
+ if (!relativePath) {
61
+ return null;
62
+ }
63
+ if (relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
64
+ continue;
65
+ }
66
+ dirtyDrivePaths.add(normalizeDrivePath(`/${relativePath.split(path.sep).join('/')}`));
67
+ }
68
+ return dirtyDrivePaths;
69
+ }
70
+ export async function readLocalDriveEntryAtPath(params) {
71
+ const absolutePath = resolveDriveLocalPath(params.driveRoot, params.drivePath);
72
+ let localStat;
73
+ try {
74
+ localStat = await lstat(absolutePath);
75
+ }
76
+ catch (error) {
77
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
78
+ return null;
79
+ }
80
+ throw error;
81
+ }
82
+ if (localStat.isDirectory()) {
83
+ return {
84
+ driveId: params.driveId,
85
+ path: normalizeDrivePath(params.drivePath),
86
+ entryType: 'directory',
87
+ contentSha256: null,
88
+ sizeBytes: null,
89
+ mimeType: null,
90
+ absolutePath,
91
+ };
92
+ }
93
+ if (localStat.isFile()) {
94
+ return await readStableLocalFileEntry({
95
+ driveId: params.driveId,
96
+ drivePath: normalizeDrivePath(params.drivePath),
97
+ absolutePath,
98
+ initialStat: localStat,
99
+ });
100
+ }
101
+ if (localStat.isSymbolicLink()) {
102
+ const linkTarget = await readlink(absolutePath).catch(() => '');
103
+ return {
104
+ driveId: params.driveId,
105
+ path: normalizeDrivePath(params.drivePath),
106
+ entryType: 'symlink',
107
+ contentSha256: sha256Hex(Buffer.from(linkTarget)),
108
+ sizeBytes: Buffer.byteLength(linkTarget),
109
+ mimeType: null,
110
+ absolutePath,
111
+ unsupportedReason: 'symlink_entry_unsupported',
112
+ };
113
+ }
114
+ return {
115
+ driveId: params.driveId,
116
+ path: normalizeDrivePath(params.drivePath),
117
+ entryType: 'unsupported',
118
+ contentSha256: null,
119
+ sizeBytes: null,
120
+ mimeType: null,
121
+ absolutePath,
122
+ unsupportedReason: describeUnsupportedLocalEntry(localStat),
123
+ };
124
+ }
125
+ export async function scanLocalDriveEntries(params) {
126
+ const entries = new Map();
127
+ const deferredPaths = new Set();
128
+ const visitedDirectories = new Set();
129
+ let deferredFileCount = 0;
130
+ async function addAncestorDirectories(drivePath) {
131
+ const normalizedPath = normalizeDrivePath(drivePath);
132
+ const segments = normalizedPath.split('/').filter(Boolean);
133
+ for (let index = 1; index < segments.length; index += 1) {
134
+ const ancestorPath = normalizeDrivePath(`/${segments.slice(0, index).join('/')}`);
135
+ if (entries.has(ancestorPath)) {
136
+ continue;
137
+ }
138
+ const absolutePath = resolveDriveLocalPath(params.driveRoot, ancestorPath);
139
+ try {
140
+ const ancestorStat = await lstat(absolutePath);
141
+ if (ancestorStat.isDirectory()) {
142
+ entries.set(ancestorPath, {
143
+ driveId: params.driveId,
144
+ path: ancestorPath,
145
+ entryType: 'directory',
146
+ contentSha256: null,
147
+ sizeBytes: null,
148
+ mimeType: null,
149
+ absolutePath,
150
+ });
151
+ }
152
+ }
153
+ catch (error) {
154
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
155
+ return;
156
+ }
157
+ throw error;
158
+ }
159
+ }
160
+ }
161
+ async function addPathEntry(absolutePath, drivePath, childStat) {
162
+ await addAncestorDirectories(drivePath);
163
+ if (childStat.isDirectory()) {
164
+ entries.set(drivePath, {
165
+ driveId: params.driveId,
166
+ path: drivePath,
167
+ entryType: 'directory',
168
+ contentSha256: null,
169
+ sizeBytes: null,
170
+ mimeType: null,
171
+ absolutePath,
172
+ });
173
+ await visitDirectory(absolutePath, drivePath);
174
+ return;
175
+ }
176
+ if (childStat.isFile()) {
177
+ try {
178
+ entries.set(drivePath, await readStableLocalFileEntry({
179
+ driveId: params.driveId,
180
+ drivePath,
181
+ absolutePath,
182
+ initialStat: childStat,
183
+ }));
184
+ }
185
+ catch (error) {
186
+ if (error instanceof UnstableLocalFileError) {
187
+ deferredPaths.add(drivePath);
188
+ deferredFileCount += 1;
189
+ return;
190
+ }
191
+ throw error;
192
+ }
193
+ return;
194
+ }
195
+ if (childStat.isSymbolicLink()) {
196
+ const linkTarget = await readlink(absolutePath).catch(() => '');
197
+ entries.set(drivePath, {
198
+ driveId: params.driveId,
199
+ path: drivePath,
200
+ entryType: 'symlink',
201
+ contentSha256: sha256Hex(Buffer.from(linkTarget)),
202
+ sizeBytes: Buffer.byteLength(linkTarget),
203
+ mimeType: null,
204
+ absolutePath,
205
+ unsupportedReason: 'symlink_entry_unsupported',
206
+ });
207
+ return;
208
+ }
209
+ entries.set(drivePath, {
210
+ driveId: params.driveId,
211
+ path: drivePath,
212
+ entryType: 'unsupported',
213
+ contentSha256: null,
214
+ sizeBytes: null,
215
+ mimeType: null,
216
+ absolutePath,
217
+ unsupportedReason: describeUnsupportedLocalEntry(childStat),
218
+ });
219
+ }
220
+ async function visitDirectory(absoluteDirectoryPath, driveDirectoryPath) {
221
+ const resolvedDirectoryPath = path.resolve(absoluteDirectoryPath);
222
+ if (visitedDirectories.has(resolvedDirectoryPath)) {
223
+ return;
224
+ }
225
+ visitedDirectories.add(resolvedDirectoryPath);
226
+ const children = await readdir(absoluteDirectoryPath, { withFileTypes: true });
227
+ for (const child of children) {
228
+ const childAbsolutePath = path.join(absoluteDirectoryPath, child.name);
229
+ const childDrivePath = normalizeDrivePath(driveDirectoryPath === '/' ? `/${child.name}` : `${driveDirectoryPath}/${child.name}`);
230
+ let childStat;
231
+ try {
232
+ childStat = await lstat(childAbsolutePath);
233
+ }
234
+ catch (error) {
235
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
236
+ continue;
237
+ }
238
+ throw error;
239
+ }
240
+ await addPathEntry(childAbsolutePath, childDrivePath, childStat);
241
+ }
242
+ }
243
+ const rootDrivePaths = params.rootDrivePaths;
244
+ if (!rootDrivePaths) {
245
+ await visitDirectory(path.resolve(params.driveRoot), '/');
246
+ return { entries, deferredPaths, deferredFileCount };
247
+ }
248
+ for (const dirtyPath of rootDrivePaths) {
249
+ const normalizedDirtyPath = normalizeDrivePath(dirtyPath);
250
+ if (normalizedDirtyPath === '/') {
251
+ await visitDirectory(path.resolve(params.driveRoot), '/');
252
+ return { entries, deferredPaths, deferredFileCount };
253
+ }
254
+ const absolutePath = resolveDriveLocalPath(params.driveRoot, normalizedDirtyPath);
255
+ try {
256
+ const childStat = await lstat(absolutePath);
257
+ await addPathEntry(absolutePath, normalizedDirtyPath, childStat);
258
+ }
259
+ catch (error) {
260
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
261
+ await addAncestorDirectories(normalizedDirtyPath);
262
+ continue;
263
+ }
264
+ throw error;
265
+ }
266
+ }
267
+ return { entries, deferredPaths, deferredFileCount };
268
+ }
269
+ export async function writeLocalConflictCopy(params) {
270
+ if (params.source.entryType !== 'file') {
271
+ throw new Error(`Cannot preserve non-file local conflict candidate: ${params.source.path}`);
272
+ }
273
+ const conflictDrivePath = await resolveAvailableConflictDrivePath({
274
+ driveRoot: params.driveRoot,
275
+ sourcePath: params.source.path,
276
+ sourceRootPath: params.sourceRootPath,
277
+ conflictRootPath: params.conflictRootPath,
278
+ });
279
+ const conflictLocalPath = resolveDriveLocalPath(params.driveRoot, conflictDrivePath);
280
+ await assertNoSymlinkInExistingPath(params.driveRoot, path.dirname(conflictLocalPath));
281
+ await mkdir(path.dirname(conflictLocalPath), { recursive: true });
282
+ await copyFile(params.source.absolutePath, conflictLocalPath);
283
+ return conflictDrivePath;
284
+ }
285
+ export async function resolveAvailableConflictDrivePath(params) {
286
+ const parsed = path.posix.parse(normalizeDrivePath(params.sourcePath));
287
+ const conflictRoot = normalizeDrivePath(params.conflictRootPath);
288
+ const sourceRoot = normalizeDrivePath(params.sourceRootPath);
289
+ const timestamp = new Date()
290
+ .toISOString()
291
+ .replace(/[-:]/g, '')
292
+ .replace(/\.\d{3}Z$/, 'Z');
293
+ const baseName = `${parsed.name} (Panorama conflict ${timestamp})`;
294
+ const targetDirectory = sourceRoot === params.sourcePath
295
+ ? parsed.dir || '/'
296
+ : path.posix.join(conflictRoot, path.posix.relative(sourceRoot, parsed.dir || '/'));
297
+ for (let attempt = 0; attempt < 100; attempt += 1) {
298
+ const suffix = attempt === 0 ? '' : ` ${attempt + 1}`;
299
+ const candidate = normalizeDrivePath(path.posix.join(targetDirectory, `${baseName}${suffix}${parsed.ext}`));
300
+ try {
301
+ await lstat(resolveDriveLocalPath(params.driveRoot, candidate));
302
+ }
303
+ catch (error) {
304
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
305
+ return candidate;
306
+ }
307
+ throw error;
308
+ }
309
+ }
310
+ throw new Error(`Could not allocate a local conflict path for ${params.sourcePath}`);
311
+ }
312
+ export function buildSubtreeConflictRootPath(deletedSubtreePath) {
313
+ const parsed = path.posix.parse(normalizeDrivePath(deletedSubtreePath));
314
+ return normalizeDrivePath(path.posix.join(parsed.dir || '/', `${parsed.base} (Panorama conflicts)`));
315
+ }
316
+ export async function assertPathExists(filePath, errorMessage) {
317
+ try {
318
+ await stat(filePath);
319
+ }
320
+ catch {
321
+ throw new Error(errorMessage);
322
+ }
323
+ }
324
+ export async function assertLocalPathIsNotSymlink(filePath, errorMessage) {
325
+ try {
326
+ const current = await lstat(filePath);
327
+ if (current.isSymbolicLink()) {
328
+ throw new Error(errorMessage);
329
+ }
330
+ }
331
+ catch (error) {
332
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
333
+ return;
334
+ }
335
+ throw error;
336
+ }
337
+ }
338
+ export async function assertNoSymlinkInExistingPath(driveRoot, targetPath) {
339
+ const resolvedRoot = path.resolve(driveRoot);
340
+ const resolvedTarget = path.resolve(targetPath);
341
+ const relativePath = path.relative(resolvedRoot, resolvedTarget);
342
+ if (relativePath.startsWith('..') || path.isAbsolute(relativePath)) {
343
+ throw new Error(`Local drive path escapes drive root: ${targetPath}`);
344
+ }
345
+ if (!relativePath) {
346
+ return;
347
+ }
348
+ let currentPath = resolvedRoot;
349
+ for (const segment of relativePath.split(path.sep).filter(Boolean)) {
350
+ currentPath = path.join(currentPath, segment);
351
+ try {
352
+ const current = await lstat(currentPath);
353
+ if (current.isSymbolicLink()) {
354
+ throw new Error(`Local drive path contains a symlink: ${currentPath}`);
355
+ }
356
+ }
357
+ catch (error) {
358
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
359
+ return;
360
+ }
361
+ throw error;
362
+ }
363
+ }
364
+ }
365
+ export function normalizeDrivePath(input) {
366
+ if (!input.startsWith('/')) {
367
+ throw new Error(`Drive path must be absolute: ${input}`);
368
+ }
369
+ const segments = input.split('/').filter(Boolean);
370
+ if (segments.some((segment) => segment === '.' || segment === '..')) {
371
+ throw new Error(`Drive path must not contain traversal segments: ${input}`);
372
+ }
373
+ return input === '/' ? '/' : `/${segments.join('/')}`;
374
+ }
375
+ async function readStableLocalFileEntry(params) {
376
+ const initialSizeBytes = Number(params.initialStat.size);
377
+ const initialMtimeMs = Number(params.initialStat.mtimeMs);
378
+ const initialCtimeMs = Number(params.initialStat.ctimeMs);
379
+ if (initialSizeBytes > DRIVE_SYNC_MAX_LOCAL_FILE_BYTES) {
380
+ return {
381
+ driveId: params.driveId,
382
+ path: params.drivePath,
383
+ entryType: 'unsupported',
384
+ contentSha256: null,
385
+ sizeBytes: initialSizeBytes,
386
+ mimeType: null,
387
+ absolutePath: params.absolutePath,
388
+ mtimeMs: initialMtimeMs,
389
+ ctimeMs: initialCtimeMs,
390
+ unsupportedReason: `file_size_${initialSizeBytes}_exceeds_${DRIVE_SYNC_MAX_LOCAL_FILE_BYTES}_byte_limit`,
391
+ };
392
+ }
393
+ const contentSha256 = await sha256File(params.absolutePath);
394
+ const finalStat = await lstat(params.absolutePath);
395
+ if (!finalStat.isFile() ||
396
+ Number(finalStat.size) !== initialSizeBytes ||
397
+ Number(finalStat.mtimeMs) !== initialMtimeMs ||
398
+ Number(finalStat.ctimeMs) !== initialCtimeMs) {
399
+ throw new UnstableLocalFileError(params.drivePath);
400
+ }
401
+ return {
402
+ driveId: params.driveId,
403
+ path: params.drivePath,
404
+ entryType: 'file',
405
+ contentSha256,
406
+ sizeBytes: Number(finalStat.size),
407
+ mimeType: null,
408
+ absolutePath: params.absolutePath,
409
+ mtimeMs: Number(finalStat.mtimeMs),
410
+ ctimeMs: Number(finalStat.ctimeMs),
411
+ };
412
+ }
413
+ async function sha256File(filePath) {
414
+ const hash = createHash('sha256');
415
+ for await (const chunk of createReadStream(filePath)) {
416
+ hash.update(chunk);
417
+ }
418
+ return hash.digest('hex');
419
+ }
420
+ function describeUnsupportedLocalEntry(entry) {
421
+ if (entry.isBlockDevice())
422
+ return 'block_device_unsupported';
423
+ if (entry.isCharacterDevice())
424
+ return 'character_device_unsupported';
425
+ if (entry.isFIFO())
426
+ return 'fifo_unsupported';
427
+ if (entry.isSocket())
428
+ return 'socket_unsupported';
429
+ return 'unsupported_entry_type';
430
+ }
431
+ function sha256Hex(bytes) {
432
+ return createHash('sha256').update(bytes).digest('hex');
433
+ }
434
+ //# sourceMappingURL=drive-sync-filesystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive-sync-filesystem.js","sourceRoot":"","sources":["../../src/drive-sync/drive-sync-filesystem.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ export type DriveSyncStateEntryType = 'file' | 'directory' | 'symlink' | 'unsupported';
2
+ export type DriveSyncStateEntry = {
3
+ driveId: string;
4
+ path: string;
5
+ entryType: DriveSyncStateEntryType;
6
+ versionId: string | null;
7
+ contentSha256: string | null;
8
+ sizeBytes: number | null;
9
+ mimeType: string | null;
10
+ };
11
+ export type DriveSyncConflictRecord = {
12
+ driveId: string;
13
+ path: string;
14
+ conflictType: 'local_upload' | 'remote_apply';
15
+ reason: string | null;
16
+ localContentSha256: string | null;
17
+ localSizeBytes: number | null;
18
+ localVersionId: string | null;
19
+ conflictId: string | null;
20
+ conflictPath: string | null;
21
+ remoteBatchId: string | null;
22
+ remoteSequence: number | null;
23
+ };
24
+ export type LocalDriveScanEntry = {
25
+ driveId: string;
26
+ path: string;
27
+ entryType: DriveSyncStateEntryType;
28
+ contentSha256: string | null;
29
+ sizeBytes: number | null;
30
+ mimeType: string | null;
31
+ absolutePath: string;
32
+ mtimeMs?: number;
33
+ ctimeMs?: number;
34
+ unsupportedReason?: string;
35
+ };
36
+ export type LocalDriveMutation = {
37
+ request: Record<string, unknown>;
38
+ stateEntry?: DriveSyncStateEntry;
39
+ uploadBytes: number;
40
+ localFilePath?: string;
41
+ localFingerprint?: {
42
+ sizeBytes: number;
43
+ mtimeMs: number;
44
+ ctimeMs: number;
45
+ };
46
+ };
47
+ export type LocalDriveConflictAction = {
48
+ type: 'clear_conflict';
49
+ driveId: string;
50
+ path: string;
51
+ reason: 'candidate_preserved' | 'candidate_removed';
52
+ } | {
53
+ type: 'update_conflict_path';
54
+ driveId: string;
55
+ path: string;
56
+ conflictPath: string;
57
+ reason: 'candidate_moved';
58
+ };
59
+ export type LocalDrivePlan = {
60
+ mutations: LocalDriveMutation[];
61
+ conflictActions: LocalDriveConflictAction[];
62
+ };
63
+ export type SyncedTree = Map<string, DriveSyncStateEntry>;
64
+ export type LocalTree = Map<string, LocalDriveScanEntry>;
65
+ export type ConflictSet = Map<string, DriveSyncConflictRecord>;
66
+ export type LocalDrivePlannerInput = {
67
+ baseline: SyncedTree;
68
+ local: LocalTree;
69
+ deferredPaths: Set<string>;
70
+ conflicts: ConflictSet;
71
+ };
72
+ export declare function buildLocalDriveMutations(params: LocalDrivePlannerInput): LocalDriveMutation[];
73
+ export declare function planLocalDriveSync(params: LocalDrivePlannerInput): LocalDrivePlan;
74
+ export declare function localEntryMatchesBaseline(localEntry: LocalDriveScanEntry, baselineEntry: DriveSyncStateEntry): boolean;
75
+ export declare function drivePathIsInSubtree(drivePath: string, subtreeRoot: string): boolean;
76
+ //# sourceMappingURL=drive-sync-planner.d.ts.map