@opendatalabs/personal-server-ts-server 0.0.1-canary.016adf9 → 0.0.1-canary.052d47e

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 (213) hide show
  1. package/dist/api-auth.d.ts +31 -0
  2. package/dist/api-auth.d.ts.map +1 -0
  3. package/dist/api-auth.js +148 -0
  4. package/dist/api-auth.js.map +1 -0
  5. package/dist/api.d.ts +4 -0
  6. package/dist/api.d.ts.map +1 -1
  7. package/dist/api.js +3 -0
  8. package/dist/api.js.map +1 -1
  9. package/dist/app.d.ts +77 -2
  10. package/dist/app.d.ts.map +1 -1
  11. package/dist/app.js +165 -9
  12. package/dist/app.js.map +1 -1
  13. package/dist/bootstrap.d.ts +36 -3
  14. package/dist/bootstrap.d.ts.map +1 -1
  15. package/dist/bootstrap.js +434 -39
  16. package/dist/bootstrap.js.map +1 -1
  17. package/dist/client.d.ts +17 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +369 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/config/defaults.d.ts +12 -0
  22. package/dist/config/defaults.d.ts.map +1 -0
  23. package/dist/config/defaults.js +14 -0
  24. package/dist/config/defaults.js.map +1 -0
  25. package/dist/config/index.d.ts +4 -0
  26. package/dist/config/index.d.ts.map +1 -0
  27. package/dist/config/index.js +4 -0
  28. package/dist/config/index.js.map +1 -0
  29. package/dist/config/loader.d.ts +8 -0
  30. package/dist/config/loader.d.ts.map +1 -0
  31. package/dist/config/loader.js +78 -0
  32. package/dist/config/loader.js.map +1 -0
  33. package/dist/config/paths.d.ts +9 -0
  34. package/dist/config/paths.d.ts.map +1 -0
  35. package/dist/config/paths.js +22 -0
  36. package/dist/config/paths.js.map +1 -0
  37. package/dist/enclave-main.d.ts +10 -0
  38. package/dist/enclave-main.d.ts.map +1 -0
  39. package/dist/enclave-main.js +115 -0
  40. package/dist/enclave-main.js.map +1 -0
  41. package/dist/hono-context.d.ts +14 -0
  42. package/dist/hono-context.d.ts.map +1 -0
  43. package/dist/hono-context.js +2 -0
  44. package/dist/hono-context.js.map +1 -0
  45. package/dist/index.js +48 -12
  46. package/dist/index.js.map +1 -1
  47. package/dist/jobs/types.d.ts +17 -0
  48. package/dist/jobs/types.d.ts.map +1 -0
  49. package/dist/jobs/types.js +3 -0
  50. package/dist/jobs/types.js.map +1 -0
  51. package/dist/jobs/worker.d.ts +30 -0
  52. package/dist/jobs/worker.d.ts.map +1 -0
  53. package/dist/jobs/worker.js +217 -0
  54. package/dist/jobs/worker.js.map +1 -0
  55. package/dist/keys/server-account.d.ts +28 -0
  56. package/dist/keys/server-account.d.ts.map +1 -0
  57. package/dist/keys/server-account.js +48 -0
  58. package/dist/keys/server-account.js.map +1 -0
  59. package/dist/listen.d.ts +11 -0
  60. package/dist/listen.d.ts.map +1 -0
  61. package/dist/listen.js +23 -0
  62. package/dist/listen.js.map +1 -0
  63. package/dist/logger/index.d.ts +5 -0
  64. package/dist/logger/index.d.ts.map +1 -0
  65. package/dist/logger/index.js +9 -0
  66. package/dist/logger/index.js.map +1 -0
  67. package/dist/logging/access-log.d.ts +4 -0
  68. package/dist/logging/access-log.d.ts.map +1 -0
  69. package/dist/logging/access-log.js +25 -0
  70. package/dist/logging/access-log.js.map +1 -0
  71. package/dist/logging/access-reader.d.ts +19 -0
  72. package/dist/logging/access-reader.d.ts.map +1 -0
  73. package/dist/logging/access-reader.js +50 -0
  74. package/dist/logging/access-reader.js.map +1 -0
  75. package/dist/middleware/access-log.d.ts.map +1 -1
  76. package/dist/middleware/access-log.js +8 -2
  77. package/dist/middleware/access-log.js.map +1 -1
  78. package/dist/middleware/builder-check.d.ts +2 -2
  79. package/dist/middleware/builder-check.d.ts.map +1 -1
  80. package/dist/middleware/builder-check.js +7 -2
  81. package/dist/middleware/builder-check.js.map +1 -1
  82. package/dist/middleware/cors.d.ts +18 -0
  83. package/dist/middleware/cors.d.ts.map +1 -0
  84. package/dist/middleware/cors.js +51 -0
  85. package/dist/middleware/cors.js.map +1 -0
  86. package/dist/middleware/owner-check.js +1 -1
  87. package/dist/middleware/owner-check.js.map +1 -1
  88. package/dist/middleware/web3-auth.d.ts +12 -0
  89. package/dist/middleware/web3-auth.d.ts.map +1 -1
  90. package/dist/middleware/web3-auth.js +27 -31
  91. package/dist/middleware/web3-auth.js.map +1 -1
  92. package/dist/migrations/detect-stuck-version-ledger.d.ts +43 -0
  93. package/dist/migrations/detect-stuck-version-ledger.d.ts.map +1 -0
  94. package/dist/migrations/detect-stuck-version-ledger.js +73 -0
  95. package/dist/migrations/detect-stuck-version-ledger.js.map +1 -0
  96. package/dist/migrations/local-state.d.ts +35 -0
  97. package/dist/migrations/local-state.d.ts.map +1 -0
  98. package/dist/migrations/local-state.js +133 -0
  99. package/dist/migrations/local-state.js.map +1 -0
  100. package/dist/migrations/state-migrations.d.ts +78 -0
  101. package/dist/migrations/state-migrations.d.ts.map +1 -0
  102. package/dist/migrations/state-migrations.js +72 -0
  103. package/dist/migrations/state-migrations.js.map +1 -0
  104. package/dist/pending-blob-deletions.d.ts +10 -0
  105. package/dist/pending-blob-deletions.d.ts.map +1 -0
  106. package/dist/pending-blob-deletions.js +38 -0
  107. package/dist/pending-blob-deletions.js.map +1 -0
  108. package/dist/routes/access-logs.d.ts +7 -0
  109. package/dist/routes/access-logs.d.ts.map +1 -1
  110. package/dist/routes/access-logs.js +11 -17
  111. package/dist/routes/access-logs.js.map +1 -1
  112. package/dist/routes/auth-device.d.ts +49 -0
  113. package/dist/routes/auth-device.d.ts.map +1 -0
  114. package/dist/routes/auth-device.js +581 -0
  115. package/dist/routes/auth-device.js.map +1 -0
  116. package/dist/routes/data.d.ts +67 -2
  117. package/dist/routes/data.d.ts.map +1 -1
  118. package/dist/routes/data.js +41 -201
  119. package/dist/routes/data.js.map +1 -1
  120. package/dist/routes/derivatives.d.ts +33 -0
  121. package/dist/routes/derivatives.d.ts.map +1 -0
  122. package/dist/routes/derivatives.js +33 -0
  123. package/dist/routes/derivatives.js.map +1 -0
  124. package/dist/routes/enclave-jobs.d.ts +9 -0
  125. package/dist/routes/enclave-jobs.d.ts.map +1 -0
  126. package/dist/routes/enclave-jobs.js +104 -0
  127. package/dist/routes/enclave-jobs.js.map +1 -0
  128. package/dist/routes/grants.d.ts +9 -2
  129. package/dist/routes/grants.d.ts.map +1 -1
  130. package/dist/routes/grants.js +18 -196
  131. package/dist/routes/grants.js.map +1 -1
  132. package/dist/routes/health.d.ts +7 -1
  133. package/dist/routes/health.d.ts.map +1 -1
  134. package/dist/routes/health.js +39 -2
  135. package/dist/routes/health.js.map +1 -1
  136. package/dist/routes/mcp.d.ts +115 -0
  137. package/dist/routes/mcp.d.ts.map +1 -0
  138. package/dist/routes/mcp.js +676 -0
  139. package/dist/routes/mcp.js.map +1 -0
  140. package/dist/routes/oauth-token.d.ts +56 -0
  141. package/dist/routes/oauth-token.d.ts.map +1 -0
  142. package/dist/routes/oauth-token.js +49 -0
  143. package/dist/routes/oauth-token.js.map +1 -0
  144. package/dist/routes/sync.d.ts +7 -0
  145. package/dist/routes/sync.d.ts.map +1 -1
  146. package/dist/routes/sync.js +12 -39
  147. package/dist/routes/sync.js.map +1 -1
  148. package/dist/routes/ui-config.d.ts.map +1 -1
  149. package/dist/routes/ui-config.js +17 -82
  150. package/dist/routes/ui-config.js.map +1 -1
  151. package/dist/routes/ui-registration.d.ts +9 -0
  152. package/dist/routes/ui-registration.d.ts.map +1 -0
  153. package/dist/routes/ui-registration.js +217 -0
  154. package/dist/routes/ui-registration.js.map +1 -0
  155. package/dist/routes/ui.d.ts +1 -0
  156. package/dist/routes/ui.d.ts.map +1 -1
  157. package/dist/routes/ui.js +46 -4
  158. package/dist/routes/ui.js.map +1 -1
  159. package/dist/routes/write-session.d.ts +37 -0
  160. package/dist/routes/write-session.d.ts.map +1 -0
  161. package/dist/routes/write-session.js +34 -0
  162. package/dist/routes/write-session.js.map +1 -0
  163. package/dist/storage/hierarchy.d.ts +36 -0
  164. package/dist/storage/hierarchy.d.ts.map +1 -0
  165. package/dist/storage/hierarchy.js +282 -0
  166. package/dist/storage/hierarchy.js.map +1 -0
  167. package/dist/storage/index-manager.d.ts +60 -0
  168. package/dist/storage/index-manager.d.ts.map +1 -0
  169. package/dist/storage/index-manager.js +174 -0
  170. package/dist/storage/index-manager.js.map +1 -0
  171. package/dist/storage/index-schema.d.ts +5 -0
  172. package/dist/storage/index-schema.d.ts.map +1 -0
  173. package/dist/storage/index-schema.js +69 -0
  174. package/dist/storage/index-schema.js.map +1 -0
  175. package/dist/storage/node-data-storage.d.ts +9 -0
  176. package/dist/storage/node-data-storage.d.ts.map +1 -0
  177. package/dist/storage/node-data-storage.js +105 -0
  178. package/dist/storage/node-data-storage.js.map +1 -0
  179. package/dist/storage/question-store.d.ts +9 -0
  180. package/dist/storage/question-store.d.ts.map +1 -0
  181. package/dist/storage/question-store.js +151 -0
  182. package/dist/storage/question-store.js.map +1 -0
  183. package/dist/sync-cursor.d.ts +15 -0
  184. package/dist/sync-cursor.d.ts.map +1 -0
  185. package/dist/sync-cursor.js +110 -0
  186. package/dist/sync-cursor.js.map +1 -0
  187. package/dist/token-store.d.ts +22 -0
  188. package/dist/token-store.d.ts.map +1 -0
  189. package/dist/token-store.js +120 -0
  190. package/dist/token-store.js.map +1 -0
  191. package/dist/tunnel/auth.d.ts +4 -0
  192. package/dist/tunnel/auth.d.ts.map +1 -1
  193. package/dist/tunnel/auth.js +2 -1
  194. package/dist/tunnel/auth.js.map +1 -1
  195. package/dist/tunnel/config.d.ts +1 -0
  196. package/dist/tunnel/config.d.ts.map +1 -1
  197. package/dist/tunnel/config.js +1 -1
  198. package/dist/tunnel/config.js.map +1 -1
  199. package/dist/tunnel/manager.d.ts +21 -1
  200. package/dist/tunnel/manager.d.ts.map +1 -1
  201. package/dist/tunnel/manager.js +78 -23
  202. package/dist/tunnel/manager.js.map +1 -1
  203. package/dist/ui/browser_tls_rustls_bg.wasm +0 -0
  204. package/dist/ui/index.html +2192 -0
  205. package/dist/ui/ps-lite-debug.d.ts +93 -0
  206. package/dist/ui/ps-lite-debug.d.ts.map +1 -0
  207. package/dist/ui/ps-lite-debug.js +135347 -0
  208. package/dist/ui/ps-lite-debug.js.map +1 -0
  209. package/package.json +20 -6
  210. package/dist/middleware/grant-check.d.ts +0 -12
  211. package/dist/middleware/grant-check.d.ts.map +0 -1
  212. package/dist/middleware/grant-check.js +0 -90
  213. package/dist/middleware/grant-check.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import { Hono } from "hono";
2
2
  export interface UiRouteDeps {
3
3
  devToken: string;
4
+ psLiteBootstrap?: unknown;
4
5
  }
5
6
  export declare function uiRoute(deps: UiRouteDeps): Hono;
6
7
  //# sourceMappingURL=ui.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/routes/ui.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAiBD,wBAAgB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAsB/C"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/routes/ui.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAqCD,wBAAgB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAoD/C"}
package/dist/routes/ui.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { readFileSync } from "node:fs";
2
- import { join, dirname } from "node:path";
2
+ import { join, dirname, sep } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { Hono } from "hono";
5
5
  // Read the HTML file once at module load time
@@ -8,17 +8,34 @@ function getHtmlPath() {
8
8
  const currentDir = dirname(fileURLToPath(import.meta.url));
9
9
  return join(currentDir, "..", "ui", "index.html");
10
10
  }
11
- function loadHtml(devToken) {
11
+ function getUiAssetPath(fileName) {
12
+ const currentDir = dirname(fileURLToPath(import.meta.url));
13
+ const distPath = join(currentDir, "..", "ui", fileName);
14
+ if (!currentDir.endsWith(`${sep}dist${sep}routes`)) {
15
+ return join(currentDir, "..", "..", "dist", "ui", fileName);
16
+ }
17
+ return distPath;
18
+ }
19
+ function loadHtml(devToken, psLiteBootstrap) {
12
20
  if (!cachedHtml) {
13
21
  cachedHtml = readFileSync(getHtmlPath(), "utf-8");
14
22
  }
15
- return cachedHtml.replace("__DEV_TOKEN__", devToken);
23
+ return cachedHtml
24
+ .replace("__DEV_TOKEN__", devToken)
25
+ .replace('"__PS_LITE_BOOTSTRAP_JSON__"', JSON.stringify(psLiteBootstrap ?? null));
26
+ }
27
+ function contentTypeFor(fileName) {
28
+ if (fileName.endsWith(".js"))
29
+ return "application/javascript; charset=utf-8";
30
+ if (fileName.endsWith(".wasm"))
31
+ return "application/wasm";
32
+ return "application/octet-stream";
16
33
  }
17
34
  export function uiRoute(deps) {
18
35
  const app = new Hono();
19
36
  app.get("/", (c) => {
20
37
  try {
21
- const html = loadHtml(deps.devToken);
38
+ const html = loadHtml(deps.devToken, deps.psLiteBootstrap);
22
39
  return c.html(html);
23
40
  }
24
41
  catch {
@@ -31,6 +48,31 @@ export function uiRoute(deps) {
31
48
  }, 500);
32
49
  }
33
50
  });
51
+ app.get("/:file", (c) => {
52
+ const fileName = c.req.param("file");
53
+ if (fileName !== "ps-lite-debug.js" &&
54
+ fileName !== "browser_tls_rustls_bg.wasm") {
55
+ return c.notFound();
56
+ }
57
+ try {
58
+ const asset = readFileSync(getUiAssetPath(fileName));
59
+ return new Response(asset, {
60
+ headers: {
61
+ "content-type": contentTypeFor(fileName),
62
+ "cache-control": "no-store",
63
+ },
64
+ });
65
+ }
66
+ catch {
67
+ return c.json({
68
+ error: {
69
+ code: 404,
70
+ errorCode: "UI_ASSET_NOT_FOUND",
71
+ message: "UI asset not found. Run npm run build.",
72
+ },
73
+ }, 404);
74
+ }
75
+ });
34
76
  return app;
35
77
  }
36
78
  //# sourceMappingURL=ui.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/routes/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,8CAA8C;AAC9C,IAAI,UAAU,GAAkB,IAAI,CAAC;AAErC,SAAS,WAAW;IAClB,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB;IAChC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,YAAY,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAiB;IACvC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC,IAAI,CACX;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,GAAG;oBACT,SAAS,EAAE,UAAU;oBACrB,OAAO,EAAE,mBAAmB;iBAC7B;aACF,EACD,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/routes/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Write API session route — POST /v1/write/session.
3
+ *
4
+ * The builder proves control of its key + write-grant with a Web3Signed proof
5
+ * (same handshake shape as the self-signing MCP session, routes/mcp.ts) and
6
+ * gets a short-lived bearer token. The token then gates delegated writes on
7
+ * the EXISTING ingest endpoint (POST /v1/data/:scope) — see api-auth.ts
8
+ * authorizeWrite. The PS keeps signing AddData as the owner; the builder
9
+ * never holds the owner key.
10
+ *
11
+ * The handshake itself is runtime-agnostic and lives in core
12
+ * (write/route.ts), so the browser build mounts the identical logic. This file
13
+ * is only the Hono mounting and this build's dependency wiring.
14
+ */
15
+ import { Hono } from "hono";
16
+ import type { Logger } from "pino";
17
+ import type { GatewayClient } from "@opendatalabs/vana-sdk/node";
18
+ import { type WriteProofReplayStore, type WriteSessionStore } from "@opendatalabs/personal-server-ts-core/write";
19
+ import type { TokenStore } from "../token-store.js";
20
+ export interface WriteSessionRouteDeps {
21
+ logger: Logger;
22
+ serverOrigin: string | (() => string);
23
+ serverOwner?: `0x${string}`;
24
+ gateway: GatewayClient;
25
+ devToken?: string;
26
+ accessToken?: string;
27
+ tokenStore?: TokenStore;
28
+ /**
29
+ * Session store shared with the data routes (api-auth authorizeWrite reads
30
+ * the tokens this route mints). The caller wires ONE store into both.
31
+ */
32
+ sessionStore: WriteSessionStore;
33
+ /** Defaults to a per-route in-memory replay guard. */
34
+ proofReplayStore?: WriteProofReplayStore;
35
+ }
36
+ export declare function writeSessionRoutes(deps: WriteSessionRouteDeps): Hono;
37
+ //# sourceMappingURL=write-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-session.d.ts","sourceRoot":"","sources":["../../src/routes/write-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACvB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;;;OAGG;IACH,YAAY,EAAE,iBAAiB,CAAC;IAChC,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;CAC1C;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAqBpE"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Write API session route — POST /v1/write/session.
3
+ *
4
+ * The builder proves control of its key + write-grant with a Web3Signed proof
5
+ * (same handshake shape as the self-signing MCP session, routes/mcp.ts) and
6
+ * gets a short-lived bearer token. The token then gates delegated writes on
7
+ * the EXISTING ingest endpoint (POST /v1/data/:scope) — see api-auth.ts
8
+ * authorizeWrite. The PS keeps signing AddData as the owner; the builder
9
+ * never holds the owner key.
10
+ *
11
+ * The handshake itself is runtime-agnostic and lives in core
12
+ * (write/route.ts), so the browser build mounts the identical logic. This file
13
+ * is only the Hono mounting and this build's dependency wiring.
14
+ */
15
+ import { Hono } from "hono";
16
+ import { createInMemoryWriteProofReplayStore, handleWriteSessionRequest, } from "@opendatalabs/personal-server-ts-core/write";
17
+ export function writeSessionRoutes(deps) {
18
+ const app = new Hono();
19
+ const proofReplayStore = deps.proofReplayStore ?? createInMemoryWriteProofReplayStore();
20
+ app.post("/session", (c) => handleWriteSessionRequest(c.req.raw, {
21
+ serverOrigin: deps.serverOrigin,
22
+ serverOwner: deps.serverOwner,
23
+ sessionStore: deps.sessionStore,
24
+ replayStore: proofReplayStore,
25
+ authSessionVerifier: deps.gateway,
26
+ grantVerifier: deps.gateway,
27
+ devToken: deps.devToken,
28
+ accessToken: deps.accessToken,
29
+ tokenStore: deps.tokenStore,
30
+ logger: deps.logger,
31
+ }));
32
+ return app;
33
+ }
34
+ //# sourceMappingURL=write-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-session.js","sourceRoot":"","sources":["../../src/routes/write-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EACL,mCAAmC,EACnC,yBAAyB,GAG1B,MAAM,6CAA6C,CAAC;AAoBrD,MAAM,UAAU,kBAAkB,CAAC,IAA2B;IAC5D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,gBAAgB,GACpB,IAAI,CAAC,gBAAgB,IAAI,mCAAmC,EAAE,CAAC;IAEjE,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CACzB,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE;QACnC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,gBAAgB;QAC7B,mBAAmB,EAAE,IAAI,CAAC,OAAO;QACjC,aAAa,EAAE,IAAI,CAAC,OAAO;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CACH,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { type DataFileEnvelope } from "@opendatalabs/vana-sdk/browser";
2
+ import { type HierarchyManagerOptions, type WriteResult } from "@opendatalabs/personal-server-ts-core/storage/hierarchy";
3
+ import { type DataBlockManifest, type DataScopeBlock, type ReadScopeBlocksResponse } from "@opendatalabs/personal-server-ts-core/storage/blocks";
4
+ /** Atomic write: mkdir -p, write temp file, rename */
5
+ export declare function writeDataFile(options: HierarchyManagerOptions, envelope: DataFileEnvelope): Promise<WriteResult>;
6
+ /** Read and parse a data file */
7
+ export declare function readDataFile(options: HierarchyManagerOptions, scope: string, collectedAt: string): Promise<DataFileEnvelope>;
8
+ /** Read a bounded UTF-8 text prefix without parsing the full envelope. */
9
+ export declare function readDataFilePreview(options: HierarchyManagerOptions, scope: string, collectedAt: string, maxBytes: number): Promise<{
10
+ text: string;
11
+ truncated: boolean;
12
+ }>;
13
+ export declare function writeBlockManifest(options: HierarchyManagerOptions, scope: string, collectedAt: string, manifest: DataBlockManifest, blocks: DataScopeBlock[]): Promise<void>;
14
+ export declare function readScopeBlocks(options: HierarchyManagerOptions, scope: string, collectedAt: string, readOptions: {
15
+ cursor?: string;
16
+ maxBytes: number;
17
+ blockIds?: readonly string[];
18
+ }): Promise<ReadScopeBlocksResponse>;
19
+ /**
20
+ * Manifest as a table of contents. Unlike the internal reader this returns null
21
+ * for a scope that was stored before block sidecars existed, so callers can
22
+ * degrade instead of failing.
23
+ */
24
+ export declare function readScopeBlockManifest(options: HierarchyManagerOptions, scope: string, collectedAt: string): Promise<DataBlockManifest | null>;
25
+ export declare function hasScopeBlocks(options: HierarchyManagerOptions, scope: string, collectedAt: string): Promise<boolean>;
26
+ /** List version filenames for a scope, newest first. Empty array if scope dir doesn't exist. */
27
+ export declare function listVersions(options: HierarchyManagerOptions, scope: string): Promise<string[]>;
28
+ /** Delete a single data file. Idempotent: a missing file is a no-op (matches deleteByFileId's
29
+ * no-op contract and avoids stalling the sync cursor when the blob is already gone). */
30
+ export declare function deleteDataFile(options: HierarchyManagerOptions, scope: string, collectedAt: string): Promise<void>;
31
+ /**
32
+ * Delete all files for a scope by removing the scope directory recursively.
33
+ * No-op if directory doesn't exist.
34
+ */
35
+ export declare function deleteAllForScope(options: HierarchyManagerOptions, scope: string): Promise<void>;
36
+ //# sourceMappingURL=hierarchy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchy.d.ts","sourceRoot":"","sources":["../../src/storage/hierarchy.ts"],"names":[],"mappings":"AAcA,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAIL,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EACjB,MAAM,yDAAyD,CAAC;AACjE,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC7B,MAAM,sDAAsD,CAAC;AAO9D,sDAAsD;AACtD,wBAAsB,aAAa,CACjC,OAAO,EAAE,uBAAuB,EAChC,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,WAAW,CAAC,CAuBtB;AAED,iCAAiC;AACjC,wBAAsB,YAAY,CAChC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAI3B;AAED,0EAA0E;AAC1E,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAgB/C;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,cAAc,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B,GACA,OAAO,CAAC,uBAAuB,CAAC,CAsFlC;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAYnC;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED,gGAAgG;AAChG,wBAAsB,YAAY,CAChC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAmBnB;AAED;wFACwF;AACxF,wBAAsB,cAAc,CAClC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAKf"}
@@ -0,0 +1,282 @@
1
+ import { access, mkdir, open, readFile, writeFile, readdir, unlink, rename, stat, rm, } from "node:fs/promises";
2
+ import { dirname, join, relative } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { DataFileEnvelopeSchema, } from "@opendatalabs/vana-sdk/browser";
5
+ import { buildDataFilePath, buildScopeDir, filenameToTimestamp, } from "@opendatalabs/personal-server-ts-core/storage/hierarchy";
6
+ import { DataBlockStorageError, encodeDataBlockCursor, selectScopeBlocksByIds, validateDataBlockCursor, } from "@opendatalabs/personal-server-ts-core/storage/blocks";
7
+ import { previewJsonEnvelopePrefix } from "@opendatalabs/personal-server-ts-core/storage/preview";
8
+ const TEXT_PAGE_MEDIA_TYPE = "text/plain; charset=utf-8";
9
+ const textEncoder = new TextEncoder();
10
+ const textDecoder = new TextDecoder();
11
+ /** Atomic write: mkdir -p, write temp file, rename */
12
+ export async function writeDataFile(options, envelope) {
13
+ const filePath = buildDataFilePath(options.dataDir, envelope.scope, envelope.collectedAt);
14
+ const dir = dirname(filePath);
15
+ await mkdir(dir, { recursive: true });
16
+ const content = JSON.stringify(envelope, null, 2);
17
+ const tempPath = filePath + ".tmp." + randomUUID();
18
+ await writeFile(tempPath, content, "utf-8");
19
+ await rename(tempPath, filePath);
20
+ const stats = await stat(filePath);
21
+ return {
22
+ path: filePath,
23
+ relativePath: relative(options.dataDir, filePath),
24
+ sizeBytes: stats.size,
25
+ };
26
+ }
27
+ /** Read and parse a data file */
28
+ export async function readDataFile(options, scope, collectedAt) {
29
+ const filePath = buildDataFilePath(options.dataDir, scope, collectedAt);
30
+ const content = await readFile(filePath, "utf-8");
31
+ return DataFileEnvelopeSchema.parse(JSON.parse(content));
32
+ }
33
+ /** Read a bounded UTF-8 text prefix without parsing the full envelope. */
34
+ export async function readDataFilePreview(options, scope, collectedAt, maxBytes) {
35
+ const filePath = buildDataFilePath(options.dataDir, scope, collectedAt);
36
+ const handle = await open(filePath, "r");
37
+ try {
38
+ const stats = await handle.stat();
39
+ const bytesToRead = Math.max(0, Math.min(maxBytes, stats.size));
40
+ const buffer = Buffer.alloc(bytesToRead);
41
+ const { bytesRead } = await handle.read(buffer, 0, bytesToRead, 0);
42
+ return previewJsonEnvelopePrefix(buffer.subarray(0, bytesRead).toString("utf-8"), maxBytes, { sourceTruncated: stats.size > bytesRead });
43
+ }
44
+ finally {
45
+ await handle.close();
46
+ }
47
+ }
48
+ export async function writeBlockManifest(options, scope, collectedAt, manifest, blocks) {
49
+ const dir = buildBlockDir(options.dataDir, scope, collectedAt);
50
+ const tempDir = `${dir}.tmp.${randomUUID()}`;
51
+ await mkdir(tempDir, { recursive: true });
52
+ try {
53
+ for (const block of blocks) {
54
+ await writeFile(buildBlockPayloadPath(tempDir, block.id), JSON.stringify(block), "utf-8");
55
+ }
56
+ await rm(dir, { recursive: true, force: true });
57
+ await rename(tempDir, dir);
58
+ const manifestPath = buildBlockManifestPath(options.dataDir, scope, collectedAt);
59
+ const tempManifestPath = `${manifestPath}.tmp.${randomUUID()}`;
60
+ await writeFile(tempManifestPath, JSON.stringify(manifest, null, 2), "utf-8");
61
+ await rename(tempManifestPath, manifestPath);
62
+ }
63
+ catch (err) {
64
+ await rm(tempDir, { recursive: true, force: true });
65
+ throw err;
66
+ }
67
+ }
68
+ export async function readScopeBlocks(options, scope, collectedAt, readOptions) {
69
+ const manifest = await readBlockManifest(options, scope, collectedAt);
70
+ if (readOptions.blockIds?.length) {
71
+ const selection = await selectScopeBlocksByIds(manifest, readOptions.blockIds, { maxBytes: readOptions.maxBytes }, (blockId) => readBlockPayloadIfPresent(options, scope, collectedAt, blockId));
72
+ return {
73
+ scope: manifest.scope,
74
+ collectedAt: manifest.collectedAt,
75
+ ...(manifest.schemaId ? { schemaId: manifest.schemaId } : {}),
76
+ contentKind: manifest.contentKind,
77
+ blocks: selection.blocks,
78
+ warnings: [...manifest.warnings, ...selection.warnings],
79
+ };
80
+ }
81
+ const cursor = readOptions.cursor
82
+ ? validateDataBlockCursor(readOptions.cursor, { scope, collectedAt })
83
+ : undefined;
84
+ if (cursor && !cursor.ok) {
85
+ throw new DataBlockStorageError("cursor_invalid", cursor.error.message);
86
+ }
87
+ const maxBytes = Math.max(1, readOptions.maxBytes);
88
+ const startIndex = cursor?.ok ? cursor.cursor.blockIndex : 0;
89
+ const startOffset = cursor?.ok ? (cursor.cursor.intraBlockOffset ?? 0) : 0;
90
+ const blocks = [];
91
+ let totalBytes = 0;
92
+ let nextIndex = startIndex;
93
+ let nextOffset;
94
+ while (nextIndex < manifest.blocks.length) {
95
+ const ref = manifest.blocks[nextIndex];
96
+ const offset = nextIndex === startIndex ? startOffset : 0;
97
+ if (offset >= ref.sizeBytes) {
98
+ nextIndex++;
99
+ continue;
100
+ }
101
+ if (blocks.length > 0 &&
102
+ offset === 0 &&
103
+ totalBytes + ref.sizeBytes > maxBytes)
104
+ break;
105
+ const block = await readBlockPayload(options, scope, collectedAt, ref.id);
106
+ const page = pageBlock(block, offset, maxBytes - totalBytes);
107
+ blocks.push(page.block);
108
+ totalBytes += page.block.sizeBytes;
109
+ if (page.nextOffset !== undefined) {
110
+ nextOffset = page.nextOffset;
111
+ break;
112
+ }
113
+ nextIndex++;
114
+ if (totalBytes >= maxBytes)
115
+ break;
116
+ }
117
+ return {
118
+ scope: manifest.scope,
119
+ collectedAt: manifest.collectedAt,
120
+ ...(manifest.schemaId ? { schemaId: manifest.schemaId } : {}),
121
+ contentKind: manifest.contentKind,
122
+ blocks,
123
+ ...(nextOffset !== undefined || nextIndex < manifest.blocks.length
124
+ ? {
125
+ nextCursor: encodeDataBlockCursor({
126
+ scope,
127
+ collectedAt,
128
+ blockIndex: nextIndex,
129
+ ...(nextOffset === undefined
130
+ ? {}
131
+ : { intraBlockOffset: nextOffset }),
132
+ }),
133
+ }
134
+ : {}),
135
+ warnings: manifest.warnings,
136
+ };
137
+ }
138
+ /**
139
+ * Manifest as a table of contents. Unlike the internal reader this returns null
140
+ * for a scope that was stored before block sidecars existed, so callers can
141
+ * degrade instead of failing.
142
+ */
143
+ export async function readScopeBlockManifest(options, scope, collectedAt) {
144
+ try {
145
+ return await readBlockManifest(options, scope, collectedAt);
146
+ }
147
+ catch (err) {
148
+ if (err instanceof DataBlockStorageError &&
149
+ err.code === "block_manifest_not_found") {
150
+ return null;
151
+ }
152
+ throw err;
153
+ }
154
+ }
155
+ export async function hasScopeBlocks(options, scope, collectedAt) {
156
+ try {
157
+ await access(buildBlockManifestPath(options.dataDir, scope, collectedAt));
158
+ return true;
159
+ }
160
+ catch (err) {
161
+ if (err.code === "ENOENT") {
162
+ return false;
163
+ }
164
+ throw err;
165
+ }
166
+ }
167
+ /** List version filenames for a scope, newest first. Empty array if scope dir doesn't exist. */
168
+ export async function listVersions(options, scope) {
169
+ const scopeDir = buildScopeDir(options.dataDir, scope);
170
+ let entries;
171
+ try {
172
+ entries = await readdir(scopeDir);
173
+ }
174
+ catch (err) {
175
+ if (err.code === "ENOENT") {
176
+ return [];
177
+ }
178
+ throw err;
179
+ }
180
+ const jsonFiles = entries
181
+ .filter((f) => f.endsWith(".json"))
182
+ .sort()
183
+ .reverse();
184
+ return jsonFiles.map((f) => filenameToTimestamp(f.replace(".json", "")));
185
+ }
186
+ /** Delete a single data file. Idempotent: a missing file is a no-op (matches deleteByFileId's
187
+ * no-op contract and avoids stalling the sync cursor when the blob is already gone). */
188
+ export async function deleteDataFile(options, scope, collectedAt) {
189
+ const filePath = buildDataFilePath(options.dataDir, scope, collectedAt);
190
+ try {
191
+ await unlink(filePath);
192
+ }
193
+ catch (err) {
194
+ if (err.code !== "ENOENT")
195
+ throw err;
196
+ }
197
+ await deleteBlockSidecars(options, scope, collectedAt);
198
+ }
199
+ /**
200
+ * Delete all files for a scope by removing the scope directory recursively.
201
+ * No-op if directory doesn't exist.
202
+ */
203
+ export async function deleteAllForScope(options, scope) {
204
+ const scopeDir = buildScopeDir(options.dataDir, scope);
205
+ await rm(scopeDir, { recursive: true, force: true });
206
+ const blockScopeDir = buildScopeDir(join(options.dataDir, "blocks"), scope);
207
+ await rm(blockScopeDir, { recursive: true, force: true });
208
+ }
209
+ async function readBlockManifest(options, scope, collectedAt) {
210
+ try {
211
+ return JSON.parse(await readFile(buildBlockManifestPath(options.dataDir, scope, collectedAt), "utf-8"));
212
+ }
213
+ catch (err) {
214
+ if (err.code === "ENOENT") {
215
+ throw new DataBlockStorageError("block_manifest_not_found", `Block manifest not found for ${scope} at ${collectedAt}`);
216
+ }
217
+ throw err;
218
+ }
219
+ }
220
+ async function readBlockPayload(options, scope, collectedAt, blockId) {
221
+ try {
222
+ return JSON.parse(await readFile(buildBlockPayloadPath(buildBlockDir(options.dataDir, scope, collectedAt), blockId), "utf-8"));
223
+ }
224
+ catch (err) {
225
+ if (err.code === "ENOENT") {
226
+ throw new DataBlockStorageError("block_payload_not_found", `Block payload not found for ${scope} at ${collectedAt}: ${blockId}`);
227
+ }
228
+ throw err;
229
+ }
230
+ }
231
+ /** Payload read for block-addressed selection: a missing id is a warning, not a throw. */
232
+ async function readBlockPayloadIfPresent(options, scope, collectedAt, blockId) {
233
+ try {
234
+ return await readBlockPayload(options, scope, collectedAt, blockId);
235
+ }
236
+ catch (err) {
237
+ if (err instanceof DataBlockStorageError &&
238
+ err.code === "block_payload_not_found") {
239
+ return null;
240
+ }
241
+ throw err;
242
+ }
243
+ }
244
+ function pageBlock(block, offsetBytes, maxBytes) {
245
+ const text = typeof block.value === "string" ? block.value : JSON.stringify(block.value);
246
+ const bytes = textEncoder.encode(text);
247
+ if (offsetBytes <= 0 && bytes.length <= maxBytes) {
248
+ return { block };
249
+ }
250
+ const start = Math.min(Math.max(0, offsetBytes), bytes.length);
251
+ const end = Math.min(bytes.length, start + Math.max(1, maxBytes));
252
+ const value = textDecoder.decode(bytes.slice(start, end));
253
+ return {
254
+ block: {
255
+ ...block,
256
+ path: `${block.path}[bytes ${start}:${end}]`,
257
+ mediaType: block.mediaType.startsWith("text/")
258
+ ? block.mediaType
259
+ : TEXT_PAGE_MEDIA_TYPE,
260
+ value,
261
+ sizeBytes: end - start,
262
+ truncated: end < bytes.length,
263
+ },
264
+ ...(end < bytes.length ? { nextOffset: end } : {}),
265
+ };
266
+ }
267
+ async function deleteBlockSidecars(options, scope, collectedAt) {
268
+ await rm(buildBlockDir(options.dataDir, scope, collectedAt), {
269
+ recursive: true,
270
+ force: true,
271
+ });
272
+ }
273
+ function buildBlockDir(dataDir, scope, collectedAt) {
274
+ return join(buildScopeDir(join(dataDir, "blocks"), scope), collectedAt);
275
+ }
276
+ function buildBlockManifestPath(dataDir, scope, collectedAt) {
277
+ return join(buildBlockDir(dataDir, scope, collectedAt), "manifest.json");
278
+ }
279
+ function buildBlockPayloadPath(dir, blockId) {
280
+ return join(dir, `${encodeURIComponent(blockId)}.json`);
281
+ }
282
+ //# sourceMappingURL=hierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../src/storage/hierarchy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { IndexEntry, IndexListOptions, NewIndexEntry, ScopeSummary } from "@opendatalabs/personal-server-ts-core/storage/index";
3
+ export interface IndexManager {
4
+ insert(entry: NewIndexEntry): 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
+ /**
11
+ * Delete a row by path ONLY if it is still unsynced (`data_point_id IS NULL`).
12
+ * Atomic guard against a TOCTOU: a row that became synced after the caller
13
+ * selected it must keep its metadata (the gateway/on-chain state references
14
+ * it). Returns true only when an unsynced row was actually removed.
15
+ */
16
+ deleteUnsyncedByPath(path: string): boolean;
17
+ listDistinctScopes(options?: {
18
+ scopePrefix?: string;
19
+ limit?: number;
20
+ offset?: number;
21
+ }): {
22
+ scopes: ScopeSummary[];
23
+ total: number;
24
+ };
25
+ findClosestByScope(scope: string, at: string): IndexEntry | undefined;
26
+ findByFileId(fileId: string): IndexEntry | undefined;
27
+ /** Find an index entry by its DPv2 data-point id (download dedup). */
28
+ findByDataPointId(dataPointId: string): IndexEntry | undefined;
29
+ /**
30
+ * Find all index entries where dataPointId is null (not yet synced /
31
+ * registered on-chain). Returns entries ordered by created_at ASC (oldest
32
+ * first).
33
+ */
34
+ findUnsynced(options?: {
35
+ limit?: number;
36
+ }): IndexEntry[];
37
+ /**
38
+ * Update the fileId for an index entry (after successful upload + on-chain registration).
39
+ * @returns true if row was updated, false if path not found
40
+ */
41
+ updateFileId(path: string, fileId: string): boolean;
42
+ /** Highest stored `version` for a scope; 0 if none. */
43
+ findLatestVersionByScope(scope: string): number;
44
+ /**
45
+ * Update the dataPointId for an index entry (after DPv2 registerDataPoint).
46
+ * @returns true if row was updated, false if path not found
47
+ */
48
+ updateDataPointId(path: string, dataPointId: string): boolean;
49
+ /**
50
+ * Update the DPv2 `version` for an index entry (upload-worker rebase after
51
+ * a stale-expectedVersion conflict).
52
+ * @returns true if row was updated, false if path not found
53
+ */
54
+ updateVersion(path: string, version: number): boolean;
55
+ /** Deletes all index entries for a scope. Returns count of deleted rows. */
56
+ deleteByScope(scope: string): number;
57
+ close(): void;
58
+ }
59
+ export declare function createIndexManager(db: Database.Database): IndexManager;
60
+ //# sourceMappingURL=index-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-manager.d.ts","sourceRoot":"","sources":["../../src/storage/index-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,YAAY,EACb,MAAM,qDAAqD,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,CAAC;IACzC,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;;;;;OAKG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5C,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,sEAAsE;IACtE,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/D;;;;OAIG;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,uDAAuD;IACvD,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD;;;OAGG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9D;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACtD,4EAA4E;IAC5E,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACrC,KAAK,IAAI,IAAI,CAAC;CACf;AAgCD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,YAAY,CAoQtE"}