@opendatalabs/personal-server-ts-core 0.0.1-canary.0078f25

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 (189) hide show
  1. package/dist/auth/web3-signed.d.ts +48 -0
  2. package/dist/auth/web3-signed.d.ts.map +1 -0
  3. package/dist/auth/web3-signed.js +110 -0
  4. package/dist/auth/web3-signed.js.map +1 -0
  5. package/dist/config/defaults.d.ts +12 -0
  6. package/dist/config/defaults.d.ts.map +1 -0
  7. package/dist/config/defaults.js +14 -0
  8. package/dist/config/defaults.js.map +1 -0
  9. package/dist/config/index.d.ts +4 -0
  10. package/dist/config/index.d.ts.map +1 -0
  11. package/dist/config/index.js +4 -0
  12. package/dist/config/index.js.map +1 -0
  13. package/dist/config/loader.d.ts +8 -0
  14. package/dist/config/loader.d.ts.map +1 -0
  15. package/dist/config/loader.js +38 -0
  16. package/dist/config/loader.js.map +1 -0
  17. package/dist/config/paths.d.ts +9 -0
  18. package/dist/config/paths.d.ts.map +1 -0
  19. package/dist/config/paths.js +22 -0
  20. package/dist/config/paths.js.map +1 -0
  21. package/dist/errors/catalog.d.ts +41 -0
  22. package/dist/errors/catalog.d.ts.map +1 -0
  23. package/dist/errors/catalog.js +79 -0
  24. package/dist/errors/catalog.js.map +1 -0
  25. package/dist/gateway/client.d.ts +98 -0
  26. package/dist/gateway/client.d.ts.map +1 -0
  27. package/dist/gateway/client.js +171 -0
  28. package/dist/gateway/client.js.map +1 -0
  29. package/dist/grants/eip712.d.ts +28 -0
  30. package/dist/grants/eip712.d.ts.map +1 -0
  31. package/dist/grants/eip712.js +30 -0
  32. package/dist/grants/eip712.js.map +1 -0
  33. package/dist/grants/index.d.ts +5 -0
  34. package/dist/grants/index.d.ts.map +1 -0
  35. package/dist/grants/index.js +3 -0
  36. package/dist/grants/index.js.map +1 -0
  37. package/dist/grants/types.d.ts +29 -0
  38. package/dist/grants/types.d.ts.map +1 -0
  39. package/dist/grants/types.js +6 -0
  40. package/dist/grants/types.js.map +1 -0
  41. package/dist/grants/verify.d.ts +24 -0
  42. package/dist/grants/verify.d.ts.map +1 -0
  43. package/dist/grants/verify.js +71 -0
  44. package/dist/grants/verify.js.map +1 -0
  45. package/dist/keys/derive.d.ts +18 -0
  46. package/dist/keys/derive.d.ts.map +1 -0
  47. package/dist/keys/derive.js +43 -0
  48. package/dist/keys/derive.js.map +1 -0
  49. package/dist/keys/index.d.ts +3 -0
  50. package/dist/keys/index.d.ts.map +1 -0
  51. package/dist/keys/index.js +3 -0
  52. package/dist/keys/index.js.map +1 -0
  53. package/dist/keys/server-account.d.ts +28 -0
  54. package/dist/keys/server-account.d.ts.map +1 -0
  55. package/dist/keys/server-account.js +48 -0
  56. package/dist/keys/server-account.js.map +1 -0
  57. package/dist/logger/index.d.ts +5 -0
  58. package/dist/logger/index.d.ts.map +1 -0
  59. package/dist/logger/index.js +9 -0
  60. package/dist/logger/index.js.map +1 -0
  61. package/dist/logging/access-log.d.ts +15 -0
  62. package/dist/logging/access-log.d.ts.map +1 -0
  63. package/dist/logging/access-log.js +25 -0
  64. package/dist/logging/access-log.js.map +1 -0
  65. package/dist/logging/access-reader.d.ts +19 -0
  66. package/dist/logging/access-reader.d.ts.map +1 -0
  67. package/dist/logging/access-reader.js +50 -0
  68. package/dist/logging/access-reader.js.map +1 -0
  69. package/dist/schemas/data-file.d.ts +20 -0
  70. package/dist/schemas/data-file.d.ts.map +1 -0
  71. package/dist/schemas/data-file.js +23 -0
  72. package/dist/schemas/data-file.js.map +1 -0
  73. package/dist/schemas/server-config.d.ts +116 -0
  74. package/dist/schemas/server-config.d.ts.map +1 -0
  75. package/dist/schemas/server-config.js +131 -0
  76. package/dist/schemas/server-config.js.map +1 -0
  77. package/dist/scopes/index.d.ts +3 -0
  78. package/dist/scopes/index.d.ts.map +1 -0
  79. package/dist/scopes/index.js +3 -0
  80. package/dist/scopes/index.js.map +1 -0
  81. package/dist/scopes/match.d.ts +13 -0
  82. package/dist/scopes/match.d.ts.map +1 -0
  83. package/dist/scopes/match.js +23 -0
  84. package/dist/scopes/match.js.map +1 -0
  85. package/dist/scopes/parse.d.ts +12 -0
  86. package/dist/scopes/parse.d.ts.map +1 -0
  87. package/dist/scopes/parse.js +29 -0
  88. package/dist/scopes/parse.js.map +1 -0
  89. package/dist/signing/eip712.d.ts +69 -0
  90. package/dist/signing/eip712.d.ts.map +1 -0
  91. package/dist/signing/eip712.js +68 -0
  92. package/dist/signing/eip712.js.map +1 -0
  93. package/dist/signing/index.d.ts +4 -0
  94. package/dist/signing/index.d.ts.map +1 -0
  95. package/dist/signing/index.js +4 -0
  96. package/dist/signing/index.js.map +1 -0
  97. package/dist/signing/request-signer.d.ts +12 -0
  98. package/dist/signing/request-signer.d.ts.map +1 -0
  99. package/dist/signing/request-signer.js +48 -0
  100. package/dist/signing/request-signer.js.map +1 -0
  101. package/dist/signing/signer.d.ts +14 -0
  102. package/dist/signing/signer.d.ts.map +1 -0
  103. package/dist/signing/signer.js +37 -0
  104. package/dist/signing/signer.js.map +1 -0
  105. package/dist/storage/adapters/index.d.ts +3 -0
  106. package/dist/storage/adapters/index.d.ts.map +1 -0
  107. package/dist/storage/adapters/index.js +2 -0
  108. package/dist/storage/adapters/index.js.map +1 -0
  109. package/dist/storage/adapters/interface.d.ts +47 -0
  110. package/dist/storage/adapters/interface.d.ts.map +1 -0
  111. package/dist/storage/adapters/interface.js +2 -0
  112. package/dist/storage/adapters/interface.js.map +1 -0
  113. package/dist/storage/adapters/vana.d.ts +32 -0
  114. package/dist/storage/adapters/vana.d.ts.map +1 -0
  115. package/dist/storage/adapters/vana.js +96 -0
  116. package/dist/storage/adapters/vana.js.map +1 -0
  117. package/dist/storage/encryption/decrypt.d.ts +10 -0
  118. package/dist/storage/encryption/decrypt.d.ts.map +1 -0
  119. package/dist/storage/encryption/decrypt.js +19 -0
  120. package/dist/storage/encryption/decrypt.js.map +1 -0
  121. package/dist/storage/encryption/encrypt.d.ts +10 -0
  122. package/dist/storage/encryption/encrypt.d.ts.map +1 -0
  123. package/dist/storage/encryption/encrypt.js +19 -0
  124. package/dist/storage/encryption/encrypt.js.map +1 -0
  125. package/dist/storage/encryption/index.d.ts +3 -0
  126. package/dist/storage/encryption/index.d.ts.map +1 -0
  127. package/dist/storage/encryption/index.js +3 -0
  128. package/dist/storage/encryption/index.js.map +1 -0
  129. package/dist/storage/hierarchy/index.d.ts +4 -0
  130. package/dist/storage/hierarchy/index.d.ts.map +1 -0
  131. package/dist/storage/hierarchy/index.js +3 -0
  132. package/dist/storage/hierarchy/index.js.map +1 -0
  133. package/dist/storage/hierarchy/manager.d.ts +23 -0
  134. package/dist/storage/hierarchy/manager.d.ts.map +1 -0
  135. package/dist/storage/hierarchy/manager.js +60 -0
  136. package/dist/storage/hierarchy/manager.js.map +1 -0
  137. package/dist/storage/hierarchy/paths.d.ts +11 -0
  138. package/dist/storage/hierarchy/paths.d.ts.map +1 -0
  139. package/dist/storage/hierarchy/paths.js +36 -0
  140. package/dist/storage/hierarchy/paths.js.map +1 -0
  141. package/dist/storage/index/index.d.ts +4 -0
  142. package/dist/storage/index/index.d.ts.map +1 -0
  143. package/dist/storage/index/index.js +3 -0
  144. package/dist/storage/index/index.js.map +1 -0
  145. package/dist/storage/index/manager.d.ts +37 -0
  146. package/dist/storage/index/manager.d.ts.map +1 -0
  147. package/dist/storage/index/manager.js +132 -0
  148. package/dist/storage/index/manager.js.map +1 -0
  149. package/dist/storage/index/schema.d.ts +4 -0
  150. package/dist/storage/index/schema.d.ts.map +1 -0
  151. package/dist/storage/index/schema.js +27 -0
  152. package/dist/storage/index/schema.js.map +1 -0
  153. package/dist/storage/index/types.d.ts +20 -0
  154. package/dist/storage/index/types.d.ts.map +1 -0
  155. package/dist/storage/index/types.js +2 -0
  156. package/dist/storage/index/types.js.map +1 -0
  157. package/dist/sync/cursor.d.ts +12 -0
  158. package/dist/sync/cursor.d.ts.map +1 -0
  159. package/dist/sync/cursor.js +19 -0
  160. package/dist/sync/cursor.js.map +1 -0
  161. package/dist/sync/engine/sync-manager.d.ts +25 -0
  162. package/dist/sync/engine/sync-manager.d.ts.map +1 -0
  163. package/dist/sync/engine/sync-manager.js +136 -0
  164. package/dist/sync/engine/sync-manager.js.map +1 -0
  165. package/dist/sync/index.d.ts +4 -0
  166. package/dist/sync/index.d.ts.map +1 -0
  167. package/dist/sync/index.js +3 -0
  168. package/dist/sync/index.js.map +1 -0
  169. package/dist/sync/types.d.ts +40 -0
  170. package/dist/sync/types.d.ts.map +1 -0
  171. package/dist/sync/types.js +2 -0
  172. package/dist/sync/types.js.map +1 -0
  173. package/dist/sync/workers/download.d.ts +41 -0
  174. package/dist/sync/workers/download.d.ts.map +1 -0
  175. package/dist/sync/workers/download.js +90 -0
  176. package/dist/sync/workers/download.js.map +1 -0
  177. package/dist/sync/workers/upload.d.ts +43 -0
  178. package/dist/sync/workers/upload.d.ts.map +1 -0
  179. package/dist/sync/workers/upload.js +75 -0
  180. package/dist/sync/workers/upload.js.map +1 -0
  181. package/dist/test-utils/index.d.ts +2 -0
  182. package/dist/test-utils/index.d.ts.map +1 -0
  183. package/dist/test-utils/index.js +2 -0
  184. package/dist/test-utils/index.js.map +1 -0
  185. package/dist/test-utils/wallet.d.ts +40 -0
  186. package/dist/test-utils/wallet.d.ts.map +1 -0
  187. package/dist/test-utils/wallet.js +74 -0
  188. package/dist/test-utils/wallet.js.map +1 -0
  189. package/package.json +115 -0
@@ -0,0 +1,60 @@
1
+ import { mkdir, readFile, writeFile, readdir, unlink, rename, stat, rm, } from "node:fs/promises";
2
+ import { dirname, relative } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { DataFileEnvelopeSchema } from "../../schemas/data-file.js";
5
+ import { buildDataFilePath, buildScopeDir, filenameToTimestamp, } from "./paths.js";
6
+ /** Atomic write: mkdir -p, write temp file, rename */
7
+ export async function writeDataFile(options, envelope) {
8
+ const filePath = buildDataFilePath(options.dataDir, envelope.scope, envelope.collectedAt);
9
+ const dir = dirname(filePath);
10
+ await mkdir(dir, { recursive: true });
11
+ const content = JSON.stringify(envelope, null, 2);
12
+ const tempPath = filePath + ".tmp." + randomUUID();
13
+ await writeFile(tempPath, content, "utf-8");
14
+ await rename(tempPath, filePath);
15
+ const stats = await stat(filePath);
16
+ return {
17
+ path: filePath,
18
+ relativePath: relative(options.dataDir, filePath),
19
+ sizeBytes: stats.size,
20
+ };
21
+ }
22
+ /** Read and parse a data file */
23
+ export async function readDataFile(options, scope, collectedAt) {
24
+ const filePath = buildDataFilePath(options.dataDir, scope, collectedAt);
25
+ const content = await readFile(filePath, "utf-8");
26
+ return DataFileEnvelopeSchema.parse(JSON.parse(content));
27
+ }
28
+ /** List version filenames for a scope, newest first. Empty array if scope dir doesn't exist. */
29
+ export async function listVersions(options, scope) {
30
+ const scopeDir = buildScopeDir(options.dataDir, scope);
31
+ let entries;
32
+ try {
33
+ entries = await readdir(scopeDir);
34
+ }
35
+ catch (err) {
36
+ if (err.code === "ENOENT") {
37
+ return [];
38
+ }
39
+ throw err;
40
+ }
41
+ const jsonFiles = entries
42
+ .filter((f) => f.endsWith(".json"))
43
+ .sort()
44
+ .reverse();
45
+ return jsonFiles.map((f) => filenameToTimestamp(f.replace(".json", "")));
46
+ }
47
+ /** Delete a single data file */
48
+ export async function deleteDataFile(options, scope, collectedAt) {
49
+ const filePath = buildDataFilePath(options.dataDir, scope, collectedAt);
50
+ await unlink(filePath);
51
+ }
52
+ /**
53
+ * Delete all files for a scope by removing the scope directory recursively.
54
+ * No-op if directory doesn't exist.
55
+ */
56
+ export async function deleteAllForScope(options, scope) {
57
+ const scopeDir = buildScopeDir(options.dataDir, scope);
58
+ await rm(scopeDir, { recursive: true, force: true });
59
+ }
60
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/storage/hierarchy/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** "2026-01-21T10:00:00Z" → "2026-01-21T10-00-00Z" */
2
+ export declare function timestampToFilename(isoTimestamp: string): string;
3
+ /** "2026-01-21T10-00-00Z" → "2026-01-21T10:00:00Z" */
4
+ export declare function filenameToTimestamp(filename: string): string;
5
+ /** Full file path: join(baseDir, ...scopeSegments, timestamp.json) */
6
+ export declare function buildDataFilePath(baseDir: string, scope: string, collectedAt: string): string;
7
+ /** Directory path for a scope */
8
+ export declare function buildScopeDir(baseDir: string, scope: string): string;
9
+ /** Generate current UTC timestamp without milliseconds, ending in Z */
10
+ export declare function generateCollectedAt(): string;
11
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/storage/hierarchy/paths.ts"],"names":[],"mappings":"AAGA,sDAAsD;AACtD,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,sDAAsD;AACtD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS5D;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,MAAM,CAIR;AAED,iCAAiC;AACjC,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED,uEAAuE;AACvE,wBAAgB,mBAAmB,IAAI,MAAM,CAI5C"}
@@ -0,0 +1,36 @@
1
+ import { join } from "node:path";
2
+ import { scopeToPathSegments } from "../../scopes/parse.js";
3
+ /** "2026-01-21T10:00:00Z" → "2026-01-21T10-00-00Z" */
4
+ export function timestampToFilename(isoTimestamp) {
5
+ return isoTimestamp.replace(/:/g, "-");
6
+ }
7
+ /** "2026-01-21T10-00-00Z" → "2026-01-21T10:00:00Z" */
8
+ export function filenameToTimestamp(filename) {
9
+ // Replace hyphens that appear in the time portion (after the T) back to colons.
10
+ // The date portion also has hyphens (2026-01-21) which must stay.
11
+ // Pattern: after T, every hyphen that separates HH-MM-SS should become a colon.
12
+ const tIndex = filename.indexOf("T");
13
+ if (tIndex === -1)
14
+ return filename;
15
+ const datePart = filename.slice(0, tIndex);
16
+ const timePart = filename.slice(tIndex);
17
+ return datePart + timePart.replace(/-/g, ":");
18
+ }
19
+ /** Full file path: join(baseDir, ...scopeSegments, timestamp.json) */
20
+ export function buildDataFilePath(baseDir, scope, collectedAt) {
21
+ const segments = scopeToPathSegments(scope);
22
+ const filename = timestampToFilename(collectedAt) + ".json";
23
+ return join(baseDir, ...segments, filename);
24
+ }
25
+ /** Directory path for a scope */
26
+ export function buildScopeDir(baseDir, scope) {
27
+ const segments = scopeToPathSegments(scope);
28
+ return join(baseDir, ...segments);
29
+ }
30
+ /** Generate current UTC timestamp without milliseconds, ending in Z */
31
+ export function generateCollectedAt() {
32
+ const now = new Date();
33
+ now.setMilliseconds(0);
34
+ return now.toISOString().replace(".000Z", "Z");
35
+ }
36
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/storage/hierarchy/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,sDAAsD;AACtD,MAAM,UAAU,mBAAmB,CAAC,YAAoB;IACtD,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,gFAAgF;IAChF,kEAAkE;IAClE,gFAAgF;IAChF,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,KAAa,EACb,WAAmB;IAEnB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC;IAC5D,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,KAAa;IAC1D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { IndexEntry, IndexListOptions } from "./types.js";
2
+ export { initializeDatabase } from "./schema.js";
3
+ export { createIndexManager, type IndexManager } from "./manager.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/index/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { initializeDatabase } from "./schema.js";
2
+ export { createIndexManager } from "./manager.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/index/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAqB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { IndexEntry, IndexListOptions, ScopeSummary } from "./types.js";
3
+ export interface IndexManager {
4
+ insert(entry: Omit<IndexEntry, "id" | "createdAt">): IndexEntry;
5
+ findByPath(path: string): IndexEntry | undefined;
6
+ findByScope(options: IndexListOptions): IndexEntry[];
7
+ findLatestByScope(scope: string): IndexEntry | undefined;
8
+ countByScope(scope: string): number;
9
+ deleteByPath(path: string): boolean;
10
+ listDistinctScopes(options?: {
11
+ scopePrefix?: string;
12
+ limit?: number;
13
+ offset?: number;
14
+ }): {
15
+ scopes: ScopeSummary[];
16
+ total: number;
17
+ };
18
+ findClosestByScope(scope: string, at: string): IndexEntry | undefined;
19
+ findByFileId(fileId: string): IndexEntry | undefined;
20
+ /**
21
+ * Find all index entries where fileId is null (not yet synced to storage backend).
22
+ * Returns entries ordered by created_at ASC (oldest first).
23
+ */
24
+ findUnsynced(options?: {
25
+ limit?: number;
26
+ }): IndexEntry[];
27
+ /**
28
+ * Update the fileId for an index entry (after successful upload + on-chain registration).
29
+ * @returns true if row was updated, false if path not found
30
+ */
31
+ updateFileId(path: string, fileId: string): boolean;
32
+ /** Deletes all index entries for a scope. Returns count of deleted rows. */
33
+ deleteByScope(scope: string): number;
34
+ close(): void;
35
+ }
36
+ export declare function createIndexManager(db: Database.Database): IndexManager;
37
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/storage/index/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE7E,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,UAAU,CAAC;IAChE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IACjD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,UAAU,EAAE,CAAC;IACrD,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IACzD,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACpC,kBAAkB,CAAC,OAAO,CAAC,EAAE;QAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG;QAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IACtE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IACrD;;;OAGG;IACH,YAAY,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU,EAAE,CAAC;IACzD;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACpD,4EAA4E;IAC5E,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACrC,KAAK,IAAI,IAAI,CAAC;CACf;AAwBD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,YAAY,CAgMtE"}
@@ -0,0 +1,132 @@
1
+ function rowToEntry(row) {
2
+ return {
3
+ id: row.id,
4
+ fileId: row.file_id,
5
+ path: row.path,
6
+ scope: row.scope,
7
+ collectedAt: row.collected_at,
8
+ createdAt: row.created_at,
9
+ sizeBytes: row.size_bytes,
10
+ };
11
+ }
12
+ export function createIndexManager(db) {
13
+ const insertStmt = db.prepare(`INSERT INTO data_files (file_id, path, scope, collected_at, size_bytes)
14
+ VALUES (@file_id, @path, @scope, @collected_at, @size_bytes)`);
15
+ const findByPathStmt = db.prepare("SELECT * FROM data_files WHERE path = @path");
16
+ const findLatestByScopeStmt = db.prepare("SELECT * FROM data_files WHERE scope = @scope ORDER BY collected_at DESC LIMIT 1");
17
+ const countByScopeStmt = db.prepare("SELECT COUNT(*) AS cnt FROM data_files WHERE scope = @scope");
18
+ const deleteByPathStmt = db.prepare("DELETE FROM data_files WHERE path = @path");
19
+ const findClosestByScopeStmt = db.prepare("SELECT * FROM data_files WHERE scope = @scope AND collected_at <= @at ORDER BY collected_at DESC LIMIT 1");
20
+ const findByFileIdStmt = db.prepare("SELECT * FROM data_files WHERE file_id = @file_id");
21
+ const findUnsyncedStmt = db.prepare("SELECT * FROM data_files WHERE file_id IS NULL ORDER BY created_at ASC");
22
+ const findUnsyncedLimitStmt = db.prepare("SELECT * FROM data_files WHERE file_id IS NULL ORDER BY created_at ASC LIMIT @limit");
23
+ const updateFileIdStmt = db.prepare("UPDATE data_files SET file_id = @file_id WHERE path = @path");
24
+ const deleteByScopeStmt = db.prepare("DELETE FROM data_files WHERE scope = @scope");
25
+ return {
26
+ insert(entry) {
27
+ const result = insertStmt.run({
28
+ file_id: entry.fileId,
29
+ path: entry.path,
30
+ scope: entry.scope,
31
+ collected_at: entry.collectedAt,
32
+ size_bytes: entry.sizeBytes,
33
+ });
34
+ const row = db
35
+ .prepare("SELECT * FROM data_files WHERE id = ?")
36
+ .get(result.lastInsertRowid);
37
+ return rowToEntry(row);
38
+ },
39
+ findByPath(path) {
40
+ const row = findByPathStmt.get({ path });
41
+ return row ? rowToEntry(row) : undefined;
42
+ },
43
+ findByScope(options) {
44
+ let sql = "SELECT * FROM data_files";
45
+ const params = {};
46
+ if (options.scope) {
47
+ sql += " WHERE scope = @scope";
48
+ params.scope = options.scope;
49
+ }
50
+ sql += " ORDER BY collected_at DESC";
51
+ if (options.limit !== undefined) {
52
+ sql += " LIMIT @limit";
53
+ params.limit = options.limit;
54
+ }
55
+ if (options.offset !== undefined) {
56
+ sql += " OFFSET @offset";
57
+ params.offset = options.offset;
58
+ }
59
+ const rows = db.prepare(sql).all(params);
60
+ return rows.map(rowToEntry);
61
+ },
62
+ findLatestByScope(scope) {
63
+ const row = findLatestByScopeStmt.get({ scope });
64
+ return row ? rowToEntry(row) : undefined;
65
+ },
66
+ countByScope(scope) {
67
+ const row = countByScopeStmt.get({ scope });
68
+ return row.cnt;
69
+ },
70
+ deleteByPath(path) {
71
+ const result = deleteByPathStmt.run({ path });
72
+ return result.changes > 0;
73
+ },
74
+ listDistinctScopes(options) {
75
+ const hasPrefix = options?.scopePrefix !== undefined && options.scopePrefix !== "";
76
+ const prefix = hasPrefix ? options.scopePrefix + "%" : "%";
77
+ const countRow = db
78
+ .prepare("SELECT COUNT(DISTINCT scope) AS cnt FROM data_files WHERE scope LIKE @prefix")
79
+ .get({ prefix });
80
+ const total = countRow.cnt;
81
+ let sql = "SELECT scope, MAX(collected_at) AS latest_collected_at, COUNT(*) AS version_count FROM data_files WHERE scope LIKE @prefix GROUP BY scope ORDER BY scope ASC";
82
+ const params = { prefix };
83
+ if (options?.limit !== undefined) {
84
+ sql += " LIMIT @limit";
85
+ params.limit = options.limit;
86
+ }
87
+ if (options?.offset !== undefined) {
88
+ sql += " OFFSET @offset";
89
+ params.offset = options.offset;
90
+ }
91
+ const rows = db.prepare(sql).all(params);
92
+ return {
93
+ scopes: rows.map((r) => ({
94
+ scope: r.scope,
95
+ latestCollectedAt: r.latest_collected_at,
96
+ versionCount: r.version_count,
97
+ })),
98
+ total,
99
+ };
100
+ },
101
+ findClosestByScope(scope, at) {
102
+ const row = findClosestByScopeStmt.get({ scope, at });
103
+ return row ? rowToEntry(row) : undefined;
104
+ },
105
+ findByFileId(fileId) {
106
+ const row = findByFileIdStmt.get({ file_id: fileId });
107
+ return row ? rowToEntry(row) : undefined;
108
+ },
109
+ findUnsynced(options) {
110
+ if (options?.limit !== undefined) {
111
+ const rows = findUnsyncedLimitStmt.all({
112
+ limit: options.limit,
113
+ });
114
+ return rows.map(rowToEntry);
115
+ }
116
+ const rows = findUnsyncedStmt.all();
117
+ return rows.map(rowToEntry);
118
+ },
119
+ updateFileId(path, fileId) {
120
+ const result = updateFileIdStmt.run({ file_id: fileId, path });
121
+ return result.changes > 0;
122
+ },
123
+ deleteByScope(scope) {
124
+ const result = deleteByScopeStmt.run({ scope });
125
+ return result.changes;
126
+ },
127
+ close() {
128
+ db.close();
129
+ },
130
+ };
131
+ }
132
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/storage/index/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import Database from "better-sqlite3";
2
+ /** Open/create SQLite database, run CREATE TABLE IF NOT EXISTS, set WAL mode */
3
+ export declare function initializeDatabase(dbPath: string): Database.Database;
4
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/storage/index/schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAmBtC,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAWpE"}
@@ -0,0 +1,27 @@
1
+ import Database from "better-sqlite3";
2
+ const CREATE_TABLE_SQL = `
3
+ CREATE TABLE IF NOT EXISTS data_files (
4
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
5
+ file_id TEXT,
6
+ path TEXT NOT NULL UNIQUE,
7
+ scope TEXT NOT NULL,
8
+ collected_at TEXT NOT NULL,
9
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
10
+ size_bytes INTEGER NOT NULL DEFAULT 0
11
+ )`;
12
+ const CREATE_INDEXES_SQL = [
13
+ "CREATE INDEX IF NOT EXISTS idx_data_files_scope ON data_files (scope)",
14
+ "CREATE INDEX IF NOT EXISTS idx_data_files_collected_at ON data_files (collected_at)",
15
+ "CREATE INDEX IF NOT EXISTS idx_data_files_file_id ON data_files (file_id)",
16
+ ];
17
+ /** Open/create SQLite database, run CREATE TABLE IF NOT EXISTS, set WAL mode */
18
+ export function initializeDatabase(dbPath) {
19
+ const db = new Database(dbPath);
20
+ db.pragma("journal_mode = WAL");
21
+ db.exec(CREATE_TABLE_SQL);
22
+ for (const sql of CREATE_INDEXES_SQL) {
23
+ db.exec(sql);
24
+ }
25
+ return db;
26
+ }
27
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/storage/index/schema.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,gBAAgB,GAAG;;;;;;;;;EASvB,CAAC;AAEH,MAAM,kBAAkB,GAAG;IACzB,uEAAuE;IACvE,qFAAqF;IACrF,2EAA2E;CAC5E,CAAC;AAEF,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEhC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAEhC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACrC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,20 @@
1
+ export interface IndexEntry {
2
+ id: number;
3
+ fileId: string | null;
4
+ path: string;
5
+ scope: string;
6
+ collectedAt: string;
7
+ createdAt: string;
8
+ sizeBytes: number;
9
+ }
10
+ export interface IndexListOptions {
11
+ scope?: string;
12
+ limit?: number;
13
+ offset?: number;
14
+ }
15
+ export interface ScopeSummary {
16
+ scope: string;
17
+ latestCollectedAt: string;
18
+ versionCount: number;
19
+ }
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/storage/index/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/storage/index/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ export interface SyncCursor {
2
+ /** Read the lastProcessedTimestamp from config.json */
3
+ read(): Promise<string | null>;
4
+ /** Write the lastProcessedTimestamp to config.json */
5
+ write(timestamp: string): Promise<void>;
6
+ }
7
+ /**
8
+ * Creates a cursor that reads/writes sync.lastProcessedTimestamp in config.json.
9
+ * Uses loadConfig/saveConfig to preserve other config fields.
10
+ */
11
+ export declare function createSyncCursor(configPath: string): SyncCursor;
12
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/sync/cursor.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE/B,sDAAsD;IACtD,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAa/D"}
@@ -0,0 +1,19 @@
1
+ import { loadConfig, saveConfig } from "../config/index.js";
2
+ /**
3
+ * Creates a cursor that reads/writes sync.lastProcessedTimestamp in config.json.
4
+ * Uses loadConfig/saveConfig to preserve other config fields.
5
+ */
6
+ export function createSyncCursor(configPath) {
7
+ return {
8
+ async read() {
9
+ const config = await loadConfig({ configPath });
10
+ return config.sync.lastProcessedTimestamp;
11
+ },
12
+ async write(timestamp) {
13
+ const config = await loadConfig({ configPath });
14
+ config.sync.lastProcessedTimestamp = timestamp;
15
+ await saveConfig(config, { configPath });
16
+ },
17
+ };
18
+ }
19
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/sync/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAU5D;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;YAChD,OAAO,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC;QAC5C,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,SAAS;YACnB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;YAC/C,MAAM,UAAU,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAC3C,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { UploadWorkerDeps } from "../workers/upload.js";
2
+ import type { DownloadWorkerDeps } from "../workers/download.js";
3
+ import type { SyncStatus } from "../types.js";
4
+ export interface SyncManagerOptions {
5
+ /** Polling interval in milliseconds (default: 60_000 = 1 minute) */
6
+ pollInterval?: number;
7
+ /** Max upload batch size per cycle (default: 50) */
8
+ uploadBatchSize?: number;
9
+ }
10
+ export interface SyncManager {
11
+ /** Start the background sync loop */
12
+ start(): void;
13
+ /** Stop the background sync loop gracefully */
14
+ stop(): Promise<void>;
15
+ /** Trigger an immediate sync cycle (skips wait) */
16
+ trigger(): Promise<void>;
17
+ /** Get current sync status */
18
+ getStatus(): SyncStatus;
19
+ /** Signal that new data has been ingested (next cycle picks it up) */
20
+ notifyNewData(): void;
21
+ /** Whether the sync manager is currently running */
22
+ readonly running: boolean;
23
+ }
24
+ export declare function createSyncManager(uploadDeps: UploadWorkerDeps, downloadDeps: DownloadWorkerDeps, options?: SyncManagerOptions): SyncManager;
25
+ //# sourceMappingURL=sync-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-manager.d.ts","sourceRoot":"","sources":["../../../src/sync/engine/sync-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,aAAa,CAAC;AAIzD,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,KAAK,IAAI,IAAI,CAAC;IAEd,+CAA+C;IAC/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,mDAAmD;IACnD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB,8BAA8B;IAC9B,SAAS,IAAI,UAAU,CAAC;IAExB,sEAAsE;IACtE,aAAa,IAAI,IAAI,CAAC;IAEtB,oDAAoD;IACpD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAID,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,gBAAgB,EAC5B,YAAY,EAAE,kBAAkB,EAChC,OAAO,CAAC,EAAE,kBAAkB,GAC3B,WAAW,CA8Jb"}
@@ -0,0 +1,136 @@
1
+ import { uploadAll } from "../workers/upload.js";
2
+ import { downloadAll } from "../workers/download.js";
3
+ const MAX_ERRORS = 10;
4
+ export function createSyncManager(uploadDeps, downloadDeps, options) {
5
+ const pollInterval = options?.pollInterval ?? 60_000;
6
+ const uploadBatchSize = options?.uploadBatchSize ?? 50;
7
+ let intervalId = null;
8
+ let isRunning = false;
9
+ let lastSync = null;
10
+ let lastProcessedTimestamp = null;
11
+ let errors = [];
12
+ let cycleInFlight = null;
13
+ async function runCycle() {
14
+ // Prevent concurrent cycles
15
+ if (cycleInFlight) {
16
+ return cycleInFlight;
17
+ }
18
+ cycleInFlight = (async () => {
19
+ try {
20
+ // Upload unsynced local files
21
+ const uploadResults = await uploadAll(uploadDeps, {
22
+ batchSize: uploadBatchSize,
23
+ });
24
+ uploadDeps.logger.debug({ uploaded: uploadResults.length }, "Upload cycle complete");
25
+ }
26
+ catch (err) {
27
+ const syncError = {
28
+ fileId: null,
29
+ scope: null,
30
+ message: `Upload cycle failed: ${err.message}`,
31
+ timestamp: new Date().toISOString(),
32
+ };
33
+ pushError(syncError);
34
+ uploadDeps.logger.error({ error: err.message }, "Upload cycle failed");
35
+ }
36
+ try {
37
+ // Download new remote files
38
+ const downloadResults = await downloadAll(downloadDeps);
39
+ downloadDeps.logger.debug({ downloaded: downloadResults.length }, "Download cycle complete");
40
+ }
41
+ catch (err) {
42
+ const syncError = {
43
+ fileId: null,
44
+ scope: null,
45
+ message: `Download cycle failed: ${err.message}`,
46
+ timestamp: new Date().toISOString(),
47
+ };
48
+ pushError(syncError);
49
+ downloadDeps.logger.error({ error: err.message }, "Download cycle failed");
50
+ }
51
+ // Update cached cursor value
52
+ try {
53
+ lastProcessedTimestamp = await downloadDeps.cursor.read();
54
+ }
55
+ catch {
56
+ // Non-critical: status will show stale value
57
+ }
58
+ lastSync = new Date().toISOString();
59
+ })();
60
+ try {
61
+ await cycleInFlight;
62
+ }
63
+ finally {
64
+ cycleInFlight = null;
65
+ }
66
+ }
67
+ function pushError(error) {
68
+ errors.push(error);
69
+ if (errors.length > MAX_ERRORS) {
70
+ errors = errors.slice(-MAX_ERRORS);
71
+ }
72
+ }
73
+ function startInterval() {
74
+ if (intervalId !== null)
75
+ return;
76
+ intervalId = setInterval(() => {
77
+ runCycle().catch(() => {
78
+ // Errors already captured in ring buffer
79
+ });
80
+ }, pollInterval);
81
+ }
82
+ function clearIntervalTimer() {
83
+ if (intervalId !== null) {
84
+ clearInterval(intervalId);
85
+ intervalId = null;
86
+ }
87
+ }
88
+ const manager = {
89
+ get running() {
90
+ return isRunning;
91
+ },
92
+ start() {
93
+ if (isRunning)
94
+ return; // Idempotent
95
+ isRunning = true;
96
+ // Crash recovery: run one cycle immediately on start
97
+ runCycle().catch(() => {
98
+ // Errors already captured in ring buffer
99
+ });
100
+ startInterval();
101
+ },
102
+ async stop() {
103
+ clearIntervalTimer();
104
+ isRunning = false;
105
+ // Wait for any in-flight cycle to complete
106
+ if (cycleInFlight) {
107
+ await cycleInFlight;
108
+ }
109
+ },
110
+ async trigger() {
111
+ // Clear existing interval, run immediately, restart interval
112
+ clearIntervalTimer();
113
+ await runCycle();
114
+ if (isRunning) {
115
+ startInterval();
116
+ }
117
+ },
118
+ getStatus() {
119
+ const pendingFiles = uploadDeps.indexManager.findUnsynced().length;
120
+ return {
121
+ enabled: true,
122
+ running: isRunning,
123
+ lastSync,
124
+ lastProcessedTimestamp,
125
+ pendingFiles,
126
+ errors: [...errors],
127
+ };
128
+ },
129
+ notifyNewData() {
130
+ // No-op signal — the next cycle picks up unsynced entries automatically.
131
+ uploadDeps.logger.debug("New data notification received");
132
+ },
133
+ };
134
+ return manager;
135
+ }
136
+ //# sourceMappingURL=sync-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-manager.js","sourceRoot":"","sources":["../../../src/sync/engine/sync-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { FileRecord, FileListResult, RegisterFileParams, FileRegistration, SyncStatus, SyncError, } from "./types.js";
2
+ export { createSyncCursor, type SyncCursor } from "./cursor.js";
3
+ export { createSyncManager, type SyncManager, type SyncManagerOptions, } from "./engine/sync-manager.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACV,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EACL,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { createSyncCursor } from "./cursor.js";
2
+ export { createSyncManager, } from "./engine/sync-manager.js";
3
+ //# sourceMappingURL=index.js.map