@opendatalabs/personal-server-ts-server 0.2.0-canary.6e65a3c → 1.0.1

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 (177) hide show
  1. package/dist/api-auth.d.ts +16 -0
  2. package/dist/api-auth.d.ts.map +1 -0
  3. package/dist/api-auth.js +97 -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 +46 -1
  10. package/dist/app.d.ts.map +1 -1
  11. package/dist/app.js +102 -30
  12. package/dist/app.js.map +1 -1
  13. package/dist/bootstrap.d.ts +11 -3
  14. package/dist/bootstrap.d.ts.map +1 -1
  15. package/dist/bootstrap.js +266 -33
  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 +368 -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 +74 -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/hono-context.d.ts +14 -0
  38. package/dist/hono-context.d.ts.map +1 -0
  39. package/dist/hono-context.js +2 -0
  40. package/dist/hono-context.js.map +1 -0
  41. package/dist/index.js +64 -12
  42. package/dist/index.js.map +1 -1
  43. package/dist/keys/server-account.d.ts +28 -0
  44. package/dist/keys/server-account.d.ts.map +1 -0
  45. package/dist/keys/server-account.js +48 -0
  46. package/dist/keys/server-account.js.map +1 -0
  47. package/dist/logger/index.d.ts +5 -0
  48. package/dist/logger/index.d.ts.map +1 -0
  49. package/dist/logger/index.js +9 -0
  50. package/dist/logger/index.js.map +1 -0
  51. package/dist/logging/access-log.d.ts +15 -0
  52. package/dist/logging/access-log.d.ts.map +1 -0
  53. package/dist/logging/access-log.js +25 -0
  54. package/dist/logging/access-log.js.map +1 -0
  55. package/dist/logging/access-reader.d.ts +19 -0
  56. package/dist/logging/access-reader.d.ts.map +1 -0
  57. package/dist/logging/access-reader.js +50 -0
  58. package/dist/logging/access-reader.js.map +1 -0
  59. package/dist/middleware/access-log.d.ts.map +1 -1
  60. package/dist/middleware/access-log.js +8 -2
  61. package/dist/middleware/access-log.js.map +1 -1
  62. package/dist/middleware/builder-check.d.ts +2 -2
  63. package/dist/middleware/builder-check.d.ts.map +1 -1
  64. package/dist/middleware/builder-check.js +7 -2
  65. package/dist/middleware/builder-check.js.map +1 -1
  66. package/dist/middleware/owner-check.js +1 -1
  67. package/dist/middleware/owner-check.js.map +1 -1
  68. package/dist/middleware/web3-auth.d.ts +12 -0
  69. package/dist/middleware/web3-auth.d.ts.map +1 -1
  70. package/dist/middleware/web3-auth.js +27 -31
  71. package/dist/middleware/web3-auth.js.map +1 -1
  72. package/dist/migrations/local-state.d.ts +21 -0
  73. package/dist/migrations/local-state.d.ts.map +1 -0
  74. package/dist/migrations/local-state.js +106 -0
  75. package/dist/migrations/local-state.js.map +1 -0
  76. package/dist/routes/access-logs.d.ts +7 -0
  77. package/dist/routes/access-logs.d.ts.map +1 -1
  78. package/dist/routes/access-logs.js +11 -17
  79. package/dist/routes/access-logs.js.map +1 -1
  80. package/dist/routes/auth-device.d.ts +49 -0
  81. package/dist/routes/auth-device.d.ts.map +1 -0
  82. package/dist/routes/auth-device.js +581 -0
  83. package/dist/routes/auth-device.js.map +1 -0
  84. package/dist/routes/data.d.ts +42 -1
  85. package/dist/routes/data.d.ts.map +1 -1
  86. package/dist/routes/data.js +36 -201
  87. package/dist/routes/data.js.map +1 -1
  88. package/dist/routes/grants.d.ts +9 -2
  89. package/dist/routes/grants.d.ts.map +1 -1
  90. package/dist/routes/grants.js +18 -196
  91. package/dist/routes/grants.js.map +1 -1
  92. package/dist/routes/health.d.ts +7 -1
  93. package/dist/routes/health.d.ts.map +1 -1
  94. package/dist/routes/health.js +39 -2
  95. package/dist/routes/health.js.map +1 -1
  96. package/dist/routes/mcp.d.ts +93 -6
  97. package/dist/routes/mcp.d.ts.map +1 -1
  98. package/dist/routes/mcp.js +526 -53
  99. package/dist/routes/mcp.js.map +1 -1
  100. package/dist/routes/oauth-token.d.ts +56 -0
  101. package/dist/routes/oauth-token.d.ts.map +1 -0
  102. package/dist/routes/oauth-token.js +49 -0
  103. package/dist/routes/oauth-token.js.map +1 -0
  104. package/dist/routes/sync.d.ts +7 -0
  105. package/dist/routes/sync.d.ts.map +1 -1
  106. package/dist/routes/sync.js +12 -39
  107. package/dist/routes/sync.js.map +1 -1
  108. package/dist/routes/ui-config.d.ts.map +1 -1
  109. package/dist/routes/ui-config.js +17 -82
  110. package/dist/routes/ui-config.js.map +1 -1
  111. package/dist/routes/ui-registration.d.ts +9 -0
  112. package/dist/routes/ui-registration.d.ts.map +1 -0
  113. package/dist/routes/ui-registration.js +217 -0
  114. package/dist/routes/ui-registration.js.map +1 -0
  115. package/dist/routes/ui.d.ts +1 -0
  116. package/dist/routes/ui.d.ts.map +1 -1
  117. package/dist/routes/ui.js +46 -4
  118. package/dist/routes/ui.js.map +1 -1
  119. package/dist/storage/hierarchy.d.ts +29 -0
  120. package/dist/storage/hierarchy.d.ts.map +1 -0
  121. package/dist/storage/hierarchy.js +241 -0
  122. package/dist/storage/hierarchy.js.map +1 -0
  123. package/dist/storage/index-manager.d.ts +53 -0
  124. package/dist/storage/index-manager.d.ts.map +1 -0
  125. package/dist/storage/index-manager.js +167 -0
  126. package/dist/storage/index-manager.js.map +1 -0
  127. package/dist/storage/index-schema.d.ts +5 -0
  128. package/dist/storage/index-schema.d.ts.map +1 -0
  129. package/dist/storage/index-schema.js +62 -0
  130. package/dist/storage/index-schema.js.map +1 -0
  131. package/dist/storage/node-data-storage.d.ts +9 -0
  132. package/dist/storage/node-data-storage.d.ts.map +1 -0
  133. package/dist/storage/node-data-storage.js +84 -0
  134. package/dist/storage/node-data-storage.js.map +1 -0
  135. package/dist/sync-cursor.d.ts +15 -0
  136. package/dist/sync-cursor.d.ts.map +1 -0
  137. package/dist/sync-cursor.js +110 -0
  138. package/dist/sync-cursor.js.map +1 -0
  139. package/dist/token-store.d.ts +22 -0
  140. package/dist/token-store.d.ts.map +1 -0
  141. package/dist/token-store.js +120 -0
  142. package/dist/token-store.js.map +1 -0
  143. package/dist/tunnel/auth.d.ts +4 -0
  144. package/dist/tunnel/auth.d.ts.map +1 -1
  145. package/dist/tunnel/auth.js +2 -1
  146. package/dist/tunnel/auth.js.map +1 -1
  147. package/dist/tunnel/config.d.ts +1 -0
  148. package/dist/tunnel/config.d.ts.map +1 -1
  149. package/dist/tunnel/config.js +1 -1
  150. package/dist/tunnel/config.js.map +1 -1
  151. package/dist/tunnel/manager.d.ts +21 -1
  152. package/dist/tunnel/manager.d.ts.map +1 -1
  153. package/dist/tunnel/manager.js +78 -23
  154. package/dist/tunnel/manager.js.map +1 -1
  155. package/dist/tunnel/verify.d.ts +1 -1
  156. package/dist/tunnel/verify.d.ts.map +1 -1
  157. package/dist/tunnel/verify.js +8 -2
  158. package/dist/tunnel/verify.js.map +1 -1
  159. package/dist/ui/browser_tls_rustls_bg.wasm +0 -0
  160. package/dist/ui/index.html +2192 -0
  161. package/dist/ui/ps-lite-debug.d.ts +93 -0
  162. package/dist/ui/ps-lite-debug.d.ts.map +1 -0
  163. package/dist/ui/ps-lite-debug.js +129415 -0
  164. package/dist/ui/ps-lite-debug.js.map +1 -0
  165. package/package.json +20 -8
  166. package/dist/middleware/grant-check.d.ts +0 -12
  167. package/dist/middleware/grant-check.d.ts.map +0 -1
  168. package/dist/middleware/grant-check.js +0 -90
  169. package/dist/middleware/grant-check.js.map +0 -1
  170. package/dist/oauth/provider.d.ts +0 -55
  171. package/dist/oauth/provider.d.ts.map +0 -1
  172. package/dist/oauth/provider.js +0 -160
  173. package/dist/oauth/provider.js.map +0 -1
  174. package/dist/oauth/routes.d.ts +0 -10
  175. package/dist/oauth/routes.d.ts.map +0 -1
  176. package/dist/oauth/routes.js +0 -206
  177. package/dist/oauth/routes.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,23 +1,66 @@
1
- import { serve } from "@hono/node-server";
1
+ import { createAdaptorServer } from "@hono/node-server";
2
2
  import { createRequire } from "node:module";
3
- import { loadConfig } from "@opendatalabs/personal-server-ts-core/config";
3
+ import { loadConfig } from "./config/index.js";
4
4
  import { createServer } from "./bootstrap.js";
5
5
  import { verifyTunnelUrl } from "./tunnel/index.js";
6
6
  const require = createRequire(import.meta.url);
7
7
  const pkg = require("../package.json");
8
8
  const DRAIN_TIMEOUT_MS = 5_000;
9
+ async function listenHttpServer(params) {
10
+ const server = createAdaptorServer({ fetch: params.fetch });
11
+ await new Promise((resolve, reject) => {
12
+ const onError = (error) => {
13
+ server.off("error", onError);
14
+ reject(error);
15
+ };
16
+ server.once("error", onError);
17
+ server.listen(params.port, params.hostname, () => {
18
+ server.off("error", onError);
19
+ const address = server.address();
20
+ if (!address || typeof address === "string") {
21
+ reject(new Error("Could not resolve bound server address"));
22
+ return;
23
+ }
24
+ params.onListening?.(address);
25
+ resolve();
26
+ });
27
+ });
28
+ return server;
29
+ }
9
30
  async function main() {
10
31
  const rootPath = process.env.PERSONAL_SERVER_ROOT_PATH;
11
32
  const config = await loadConfig({ rootPath });
12
33
  const context = await createServer(config, { rootPath });
13
34
  const { app, logger, devToken } = context;
14
- const server = serve({ fetch: app.fetch, port: config.server.port }, (info) => {
15
- logger.info({ port: info.port, version: pkg.version }, "Server started");
16
- if (devToken) {
17
- logger.info({ url: `http://localhost:${info.port}/ui` }, "Dev UI available");
18
- logger.info({ devToken }, "Dev token (ephemeral)");
19
- }
35
+ const server = await listenHttpServer({
36
+ fetch: app.fetch,
37
+ port: config.server.port,
38
+ onListening: (info) => {
39
+ logger.info({ port: info.port, version: pkg.version }, "Server started");
40
+ if (devToken) {
41
+ logger.info({ url: `http://localhost:${info.port}/ui` }, "Dev UI available");
42
+ logger.info({ devToken }, "Dev token (ephemeral)");
43
+ }
44
+ },
20
45
  });
46
+ let localAuthServer;
47
+ if (context.localApprovalPort) {
48
+ try {
49
+ localAuthServer = await listenHttpServer({
50
+ fetch: app.fetch,
51
+ port: context.localApprovalPort,
52
+ hostname: "127.0.0.1",
53
+ onListening: (info) => {
54
+ const localApprovalOrigin = `http://127.0.0.1:${info.port}`;
55
+ context.setLocalApprovalOrigin(localApprovalOrigin);
56
+ logger.info({ localApprovalOrigin }, "Loopback auth listener started");
57
+ },
58
+ });
59
+ }
60
+ catch (err) {
61
+ logger.warn({ err, port: context.localApprovalPort }, "Loopback auth listener unavailable — public approval flow will require owner wallet auth");
62
+ }
63
+ }
21
64
  // Fire-and-forget: gateway check + tunnel connect (slow operations)
22
65
  // HTTP server is already listening so POST /v1/data/:scope works immediately
23
66
  context.startBackgroundServices().then(() => {
@@ -25,6 +68,7 @@ async function main() {
25
68
  const { tunnelManager, tunnelUrl } = context;
26
69
  if (tunnelUrl &&
27
70
  tunnelManager &&
71
+ context.isServerRegistered() &&
28
72
  tunnelManager.getStatus().status !== "error") {
29
73
  logger.info({ tunnelUrl }, "Verifying tunnel URL is reachable...");
30
74
  verifyTunnelUrl(tunnelUrl).then((result) => {
@@ -40,10 +84,18 @@ async function main() {
40
84
  });
41
85
  function shutdown(signal) {
42
86
  logger.info({ signal }, "Shutdown signal received, draining connections");
43
- server.close(() => {
44
- logger.info("Server stopped");
45
- process.exit(0);
46
- });
87
+ let pending = localAuthServer ? 2 : 1;
88
+ const finish = () => {
89
+ pending -= 1;
90
+ if (pending === 0) {
91
+ logger.info("Server stopped");
92
+ process.exit(0);
93
+ }
94
+ };
95
+ server.close(finish);
96
+ if (localAuthServer) {
97
+ localAuthServer.close(finish);
98
+ }
47
99
  // Force exit after drain timeout
48
100
  setTimeout(() => {
49
101
  logger.warn("Drain timeout exceeded, forcing exit");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * ServerAccount wraps a randomly generated private key for EIP-712 signing.
3
+ * The key is persisted to disk so the same address survives restarts.
4
+ */
5
+ import type { TypedDataDomain } from "viem";
6
+ export interface SignTypedDataParams {
7
+ domain: TypedDataDomain;
8
+ types: Record<string, Array<{
9
+ name: string;
10
+ type: string;
11
+ }>>;
12
+ primaryType: string;
13
+ message: Record<string, unknown>;
14
+ }
15
+ export interface ServerAccount {
16
+ address: `0x${string}`;
17
+ /** Uncompressed public key (65 bytes, 0x04 prefix). */
18
+ publicKey: `0x${string}`;
19
+ signTypedData(params: SignTypedDataParams): Promise<`0x${string}`>;
20
+ /** Sign a personal message (EIP-191). */
21
+ signMessage(message: string): Promise<`0x${string}`>;
22
+ }
23
+ /**
24
+ * Loads an existing server keypair from disk, or generates a new random one
25
+ * and persists it. Returns a ServerAccount suitable for EIP-712 signing.
26
+ */
27
+ export declare function loadOrCreateServerAccount(keyPath: string): ServerAccount;
28
+ //# sourceMappingURL=server-account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-account.d.ts","sourceRoot":"","sources":["../../src/keys/server-account.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAE5C,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;IACvB,uDAAuD;IACvD,SAAS,EAAE,KAAK,MAAM,EAAE,CAAC;IACzB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;IACnE,yCAAyC;IACzC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;CACtD;AAQD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CA2CxE"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * ServerAccount wraps a randomly generated private key for EIP-712 signing.
3
+ * The key is persisted to disk so the same address survives restarts.
4
+ */
5
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
6
+ import { dirname } from "node:path";
7
+ import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
8
+ /**
9
+ * Loads an existing server keypair from disk, or generates a new random one
10
+ * and persists it. Returns a ServerAccount suitable for EIP-712 signing.
11
+ */
12
+ export function loadOrCreateServerAccount(keyPath) {
13
+ let privateKey;
14
+ if (existsSync(keyPath)) {
15
+ const raw = readFileSync(keyPath, "utf-8");
16
+ const data = JSON.parse(raw);
17
+ privateKey = data.privateKey;
18
+ }
19
+ else {
20
+ privateKey = generatePrivateKey();
21
+ const account = privateKeyToAccount(privateKey);
22
+ // Ensure parent directories exist
23
+ mkdirSync(dirname(keyPath), { recursive: true });
24
+ const data = {
25
+ address: account.address,
26
+ publicKey: account.publicKey,
27
+ privateKey,
28
+ };
29
+ writeFileSync(keyPath, JSON.stringify(data, null, 2), { mode: 0o600 });
30
+ }
31
+ const account = privateKeyToAccount(privateKey);
32
+ return {
33
+ address: account.address,
34
+ publicKey: account.publicKey,
35
+ async signTypedData(params) {
36
+ return account.signTypedData({
37
+ domain: params.domain,
38
+ types: params.types,
39
+ primaryType: params.primaryType,
40
+ message: params.message,
41
+ });
42
+ },
43
+ async signMessage(message) {
44
+ return account.signMessage({ message });
45
+ },
46
+ };
47
+ }
48
+ //# sourceMappingURL=server-account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-account.js","sourceRoot":"","sources":["../../src/keys/server-account.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAyBxE;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,IAAI,UAAyB,CAAC;IAE9B,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAgB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,UAAU,GAAG,IAAI,CAAC,UAA2B,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,kBAAkB,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAEhD,kCAAkC;QAClC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAgB;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU;SACX,CAAC;QACF,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEhD,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,KAAK,CAAC,aAAa,CAAC,MAA2B;YAC7C,OAAO,OAAO,CAAC,aAAa,CAAC;gBAC3B,MAAM,EAAE,MAAM,CAAC,MAED;gBACd,KAAK,EAAE,MAAM,CAAC,KAED;gBACb,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,OAAe;YAC/B,OAAO,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type Logger } from "pino";
2
+ import type { LoggingConfig } from "@opendatalabs/personal-server-ts-core/schemas";
3
+ export type { Logger } from "pino";
4
+ export declare function createLogger(config: LoggingConfig): Logger;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,OAAa,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAEnF,YAAY,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAO1D"}
@@ -0,0 +1,9 @@
1
+ import pino from "pino";
2
+ export function createLogger(config) {
3
+ const usePretty = config.pretty || process.env.NODE_ENV !== "production";
4
+ return pino({
5
+ level: config.level,
6
+ ...(usePretty ? { transport: { target: "pino-pretty" } } : {}),
7
+ });
8
+ }
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAqB,MAAM,MAAM,CAAC;AAKzC,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IAEzE,OAAO,IAAI,CAAC;QACV,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface AccessLogEntry {
2
+ logId: string;
3
+ grantId: string;
4
+ builder: string;
5
+ action: "read";
6
+ scope: string;
7
+ timestamp: string;
8
+ ipAddress: string;
9
+ userAgent: string;
10
+ }
11
+ export interface AccessLogWriter {
12
+ write(entry: AccessLogEntry): Promise<void>;
13
+ }
14
+ export declare function createAccessLogWriter(logsDir: string): AccessLogWriter;
15
+ //# sourceMappingURL=access-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-log.d.ts","sourceRoot":"","sources":["../../src/logging/access-log.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAUD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAiBtE"}
@@ -0,0 +1,25 @@
1
+ import { mkdir, appendFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ function formatDateForFilename(isoTimestamp) {
4
+ const date = new Date(isoTimestamp);
5
+ const yyyy = date.getUTCFullYear();
6
+ const mm = String(date.getUTCMonth() + 1).padStart(2, "0");
7
+ const dd = String(date.getUTCDate()).padStart(2, "0");
8
+ return `${yyyy}-${mm}-${dd}`;
9
+ }
10
+ export function createAccessLogWriter(logsDir) {
11
+ let dirCreated = false;
12
+ return {
13
+ async write(entry) {
14
+ if (!dirCreated) {
15
+ await mkdir(logsDir, { recursive: true });
16
+ dirCreated = true;
17
+ }
18
+ const dateStr = formatDateForFilename(entry.timestamp);
19
+ const filename = `access-${dateStr}.log`;
20
+ const filepath = join(logsDir, filename);
21
+ await appendFile(filepath, JSON.stringify(entry) + "\n", "utf-8");
22
+ },
23
+ };
24
+ }
25
+ //# sourceMappingURL=access-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-log.js","sourceRoot":"","sources":["../../src/logging/access-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAiBjC,SAAS,qBAAqB,CAAC,YAAoB;IACjD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACnC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,KAAqB;YAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1C,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;YAED,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,UAAU,OAAO,MAAM,CAAC;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEzC,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QACpE,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { AccessLogEntry } from "./access-log.js";
2
+ export interface AccessLogReadResult {
3
+ logs: AccessLogEntry[];
4
+ total: number;
5
+ limit: number;
6
+ offset: number;
7
+ }
8
+ export interface AccessLogReader {
9
+ read(options?: {
10
+ limit?: number;
11
+ offset?: number;
12
+ }): Promise<AccessLogReadResult>;
13
+ }
14
+ /**
15
+ * Reads all access-*.log files from logsDir, merges entries,
16
+ * sorts by timestamp DESC, and paginates.
17
+ */
18
+ export declare function createAccessLogReader(logsDir: string): AccessLogReader;
19
+ //# sourceMappingURL=access-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-reader.d.ts","sourceRoot":"","sources":["../../src/logging/access-reader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,OAAO,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAqDtE"}
@@ -0,0 +1,50 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ /**
4
+ * Reads all access-*.log files from logsDir, merges entries,
5
+ * sorts by timestamp DESC, and paginates.
6
+ */
7
+ export function createAccessLogReader(logsDir) {
8
+ return {
9
+ async read(options) {
10
+ const limit = options?.limit ?? 50;
11
+ const offset = options?.offset ?? 0;
12
+ let filenames;
13
+ try {
14
+ filenames = await readdir(logsDir);
15
+ }
16
+ catch {
17
+ // Directory doesn't exist — return empty result
18
+ return { logs: [], total: 0, limit, offset };
19
+ }
20
+ const logFiles = filenames.filter((f) => f.startsWith("access-") && f.endsWith(".log"));
21
+ const allEntries = [];
22
+ for (const filename of logFiles) {
23
+ const filepath = join(logsDir, filename);
24
+ const content = await readFile(filepath, "utf-8");
25
+ const lines = content
26
+ .split("\n")
27
+ .filter((line) => line.trim().length > 0);
28
+ for (const line of lines) {
29
+ try {
30
+ const entry = JSON.parse(line);
31
+ allEntries.push(entry);
32
+ }
33
+ catch {
34
+ // Skip malformed lines
35
+ }
36
+ }
37
+ }
38
+ // Sort by timestamp DESC (newest first)
39
+ allEntries.sort((a, b) => {
40
+ const ta = new Date(a.timestamp).getTime();
41
+ const tb = new Date(b.timestamp).getTime();
42
+ return tb - ta;
43
+ });
44
+ const total = allEntries.length;
45
+ const paginated = allEntries.slice(offset, offset + limit);
46
+ return { logs: paginated, total, limit, offset };
47
+ },
48
+ };
49
+ }
50
+ //# sourceMappingURL=access-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access-reader.js","sourceRoot":"","sources":["../../src/logging/access-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAiBjC;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,OAGV;YACC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC;YAEpC,IAAI,SAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,gDAAgD;gBAChD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YAC/C,CAAC;YAED,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CACrD,CAAC;YAEF,MAAM,UAAU,GAAqB,EAAE,CAAC;YAExC,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,OAAO;qBAClB,KAAK,CAAC,IAAI,CAAC;qBACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAE5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;wBACjD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACzB,CAAC;oBAAC,MAAM,CAAC;wBACP,uBAAuB;oBACzB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,wCAAwC;YACxC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACvB,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC3C,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC3C,OAAO,EAAE,GAAG,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;YAChC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;YAE3D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"access-log.d.ts","sourceRoot":"","sources":["../../src/middleware/access-log.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAIhG;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,GACtB,iBAAiB,CAoCnB"}
1
+ {"version":3,"file":"access-log.d.ts","sourceRoot":"","sources":["../../src/middleware/access-log.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAIhG;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,GACtB,iBAAiB,CA0CnB"}
@@ -12,14 +12,20 @@ export function createAccessLogMiddleware(writer) {
12
12
  }
13
13
  const auth = c.get("auth");
14
14
  const grant = c.get("grant");
15
- if (!auth || !grant) {
15
+ if (!auth) {
16
16
  return;
17
17
  }
18
+ const grantId = grant?.id ??
19
+ (c.get("isPolicyBypass") || c.get("devBypass")
20
+ ? "policy-bypass"
21
+ : undefined);
22
+ if (!grantId)
23
+ return;
18
24
  const scope = c.req.param("scope") ?? "unknown";
19
25
  try {
20
26
  await writer.write({
21
27
  logId: randomUUID(),
22
- grantId: grant.id,
28
+ grantId,
23
29
  builder: auth.signer,
24
30
  action: "read",
25
31
  scope,
@@ -1 +1 @@
1
- {"version":3,"file":"access-log.js","sourceRoot":"","sources":["../../src/middleware/access-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMzC;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAuB;IAEvB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,IAAI,EAAE,CAAC;QAEb,4BAA4B;QAC5B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAA6B,CAAC;QACvD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAqC,CAAC;QAEjE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC;gBACjB,KAAK,EAAE,UAAU,EAAE;gBACnB,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,OAAO,EAAE,IAAI,CAAC,MAAM;gBACpB,MAAM,EAAE,MAAM;gBACd,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,SAAS,EACP,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC;oBAC/B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;oBACzB,SAAS;gBACX,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,SAAS;aACnD,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"access-log.js","sourceRoot":"","sources":["../../src/middleware/access-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAMzC;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAuB;IAEvB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,IAAI,EAAE,CAAC;QAEb,4BAA4B;QAC5B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAA4B,CAAC;QACtD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAqC,CAAC;QAEjE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GACX,KAAK,EAAE,EAAE;YACT,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC5C,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,SAAS,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;QAEhD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC;gBACjB,KAAK,EAAE,UAAU,EAAE;gBACnB,OAAO;gBACP,OAAO,EAAE,IAAI,CAAC,MAAM;gBACpB,MAAM,EAAE,MAAM;gBACd,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,SAAS,EACP,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC;oBAC/B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;oBACzB,SAAS;gBACX,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,SAAS;aACnD,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import type { MiddlewareHandler } from "hono";
2
- import type { GatewayClient } from "@opendatalabs/personal-server-ts-core/gateway";
2
+ import type { GatewayClient } from "@opendatalabs/vana-sdk/node";
3
3
  /**
4
4
  * Verifies authenticated signer is a registered builder via Gateway.
5
5
  * Must run AFTER web3-auth middleware.
6
6
  */
7
- export declare function createBuilderCheckMiddleware(gateway: GatewayClient): MiddlewareHandler;
7
+ export declare function createBuilderCheckMiddleware(gateway: GatewayClient, serverOwner?: `0x${string}`): MiddlewareHandler;
8
8
  //# sourceMappingURL=builder-check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder-check.d.ts","sourceRoot":"","sources":["../../src/middleware/builder-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AAInF;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,aAAa,GACrB,iBAAiB,CAyBnB"}
1
+ {"version":3,"file":"builder-check.d.ts","sourceRoot":"","sources":["../../src/middleware/builder-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAIjE;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,aAAa,EACtB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,GAC1B,iBAAiB,CAgCnB"}
@@ -3,13 +3,18 @@ import { UnregisteredBuilderError } from "@opendatalabs/personal-server-ts-core/
3
3
  * Verifies authenticated signer is a registered builder via Gateway.
4
4
  * Must run AFTER web3-auth middleware.
5
5
  */
6
- export function createBuilderCheckMiddleware(gateway) {
6
+ export function createBuilderCheckMiddleware(gateway, serverOwner) {
7
7
  return async (c, next) => {
8
- if (c.get("devBypass")) {
8
+ if (c.get("isPolicyBypass") ?? c.get("devBypass")) {
9
9
  await next();
10
10
  return;
11
11
  }
12
12
  const auth = c.get("auth");
13
+ if (serverOwner &&
14
+ auth.signer.toLowerCase() === serverOwner.toLowerCase()) {
15
+ await next();
16
+ return;
17
+ }
13
18
  try {
14
19
  const registered = await gateway.isRegisteredBuilder(auth.signer);
15
20
  if (!registered) {
@@ -1 +1 @@
1
- {"version":3,"file":"builder-check.js","sourceRoot":"","sources":["../../src/middleware/builder-check.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8CAA8C,CAAC;AAExF;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAsB;IAEtB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAiB,CAAC;QAE3C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAElE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,IAAI,wBAAwB,EAAE,CAAC;gBAC3C,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YACnC,CAAC;YAED,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,wBAAwB,EAAE,CAAC;gBAC5C,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YACnC,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"builder-check.js","sourceRoot":"","sources":["../../src/middleware/builder-check.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,8CAA8C,CAAC;AAGxF;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAsB,EACtB,WAA2B;IAE3B,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAgB,CAAC;QAC1C,IACE,WAAW;YACX,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,EACvD,CAAC;YACD,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAElE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,IAAI,wBAAwB,EAAE,CAAC;gBAC3C,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YACnC,CAAC;YAED,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,wBAAwB,EAAE,CAAC;gBAC5C,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YACnC,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -7,7 +7,7 @@ import { NotOwnerError } from "@opendatalabs/personal-server-ts-core/errors";
7
7
  */
8
8
  export function createOwnerCheckMiddleware(serverOwner) {
9
9
  return async (c, next) => {
10
- if (c.get("devBypass")) {
10
+ if (c.get("isPolicyBypass") ?? c.get("devBypass")) {
11
11
  await next();
12
12
  return;
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"owner-check.js","sourceRoot":"","sources":["../../src/middleware/owner-check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAG7E;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAAsC;IAEtC,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,IAAI,CACX;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,GAAG;oBACT,SAAS,EAAE,uBAAuB;oBAClC,OAAO,EACL,0FAA0F;iBAC7F;aACF,EACD,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAA6B,CAAC;QAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5D,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC;gBAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,WAAW;aACtB,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"owner-check.js","sourceRoot":"","sources":["../../src/middleware/owner-check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAG7E;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAAsC;IAEtC,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,IAAI,CACX;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,GAAG;oBACT,SAAS,EAAE,uBAAuB;oBAClC,OAAO,EACL,0FAA0F;iBAC7F;aACF,EACD,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAA4B,CAAC;QAEtD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;YAC5D,MAAM,GAAG,GAAG,IAAI,aAAa,CAAC;gBAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,WAAW;aACtB,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,EAAE,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
@@ -1,7 +1,14 @@
1
1
  import type { MiddlewareHandler } from "hono";
2
+ import { mapSdkAuthError, type AuthMechanism, type RequestAuth, type SessionTokenVerifierPort } from "@opendatalabs/personal-server-ts-core/auth";
3
+ import type { TokenStore } from "../token-store.js";
4
+ import "../hono-context.js";
5
+ export { mapSdkAuthError };
6
+ export type { AuthMechanism, RequestAuth };
2
7
  export interface Web3AuthMiddlewareDeps {
3
8
  serverOrigin: string | (() => string);
4
9
  devToken?: string;
10
+ accessToken?: string;
11
+ tokenStore?: TokenStore | SessionTokenVerifierPort;
5
12
  serverOwner?: `0x${string}`;
6
13
  }
7
14
  /**
@@ -11,6 +18,11 @@ export interface Web3AuthMiddlewareDeps {
11
18
  * When a devToken is configured and the request carries a matching
12
19
  * Bearer token, auth context is populated with the server owner
13
20
  * and c.set('devBypass', true) is set to skip downstream checks.
21
+ *
22
+ * When a control-plane token (PS_ACCESS_TOKEN) or tokenStore-issued CLI token is
23
+ * configured and the request carries a matching Bearer token, auth context
24
+ * is populated with the server owner. These are owner-authenticated requests,
25
+ * not dev-bypass requests.
14
26
  */
15
27
  export declare function createWeb3AuthMiddleware(depsOrOrigin: Web3AuthMiddlewareDeps | string): MiddlewareHandler;
16
28
  //# sourceMappingURL=web3-auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"web3-auth.d.ts","sourceRoot":"","sources":["../../src/middleware/web3-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAI9C,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,sBAAsB,GAAG,MAAM,GAC5C,iBAAiB,CAsDnB"}
1
+ {"version":3,"file":"web3-auth.d.ts","sourceRoot":"","sources":["../../src/middleware/web3-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,EAEL,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,wBAAwB,EAC9B,MAAM,4CAA4C,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,oBAAoB,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;AAE3C,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,GAAG,wBAAwB,CAAC;IACnD,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,sBAAsB,GAAG,MAAM,GAC5C,iBAAiB,CA+BnB"}
@@ -1,5 +1,12 @@
1
- import { verifyWeb3Signed } from "@opendatalabs/personal-server-ts-core/auth";
1
+ import { authenticateRequest, mapSdkAuthError, } from "@opendatalabs/personal-server-ts-core/auth";
2
2
  import { ProtocolError } from "@opendatalabs/personal-server-ts-core/errors";
3
+ // Ambient module augmentation that types `c.get("authMechanism")` etc. —
4
+ // must be in the TS module graph so the augmentation takes effect. The
5
+ // previous reach-through (data-read-policy.ts) was deleted in the X402
6
+ // migration; the web3-auth middleware is the most natural new anchor
7
+ // since it's the one writing these context vars in the first place.
8
+ import "../hono-context.js";
9
+ export { mapSdkAuthError };
3
10
  /**
4
11
  * Parses + verifies Web3Signed Authorization header.
5
12
  * Sets c.set('auth', VerifiedAuth) for downstream handlers.
@@ -7,47 +14,36 @@ import { ProtocolError } from "@opendatalabs/personal-server-ts-core/errors";
7
14
  * When a devToken is configured and the request carries a matching
8
15
  * Bearer token, auth context is populated with the server owner
9
16
  * and c.set('devBypass', true) is set to skip downstream checks.
17
+ *
18
+ * When a control-plane token (PS_ACCESS_TOKEN) or tokenStore-issued CLI token is
19
+ * configured and the request carries a matching Bearer token, auth context
20
+ * is populated with the server owner. These are owner-authenticated requests,
21
+ * not dev-bypass requests.
10
22
  */
11
23
  export function createWeb3AuthMiddleware(depsOrOrigin) {
12
24
  const deps = typeof depsOrOrigin === "string"
13
25
  ? { serverOrigin: depsOrOrigin }
14
26
  : depsOrOrigin;
15
27
  return async (c, next) => {
16
- // Dev token bypass: if configured and header matches, skip Web3Signed verification
17
- if (deps.devToken) {
18
- const authHeader = c.req.header("authorization");
19
- if (authHeader === `Bearer ${deps.devToken}`) {
20
- if (!deps.serverOwner) {
21
- return c.json({
22
- error: {
23
- code: 500,
24
- errorCode: "SERVER_NOT_CONFIGURED",
25
- message: "Server owner address not configured. Set VANA_MASTER_KEY_SIGNATURE environment variable.",
26
- },
27
- }, 500);
28
- }
29
- c.set("auth", {
30
- signer: deps.serverOwner,
31
- payload: {},
32
- });
33
- c.set("devBypass", true);
34
- await next();
35
- return;
36
- }
37
- }
38
28
  try {
39
- const auth = await verifyWeb3Signed({
40
- headerValue: c.req.header("authorization"),
41
- expectedOrigin: typeof deps.serverOrigin === "function"
42
- ? deps.serverOrigin()
43
- : deps.serverOrigin,
44
- expectedMethod: c.req.method,
45
- expectedPath: new URL(c.req.url).pathname,
29
+ const result = await authenticateRequest({
30
+ request: c.req.raw,
31
+ serverOrigin: deps.serverOrigin,
32
+ devToken: deps.devToken,
33
+ accessToken: deps.accessToken,
34
+ sessionTokenVerifier: deps.tokenStore,
35
+ serverOwner: deps.serverOwner,
46
36
  });
47
- c.set("auth", auth);
37
+ c.set("auth", result.auth);
38
+ c.set("authMechanism", result.mechanism);
39
+ c.set("isPolicyBypass", result.isPolicyBypass);
40
+ c.set("devBypass", result.devBypass);
48
41
  await next();
49
42
  }
50
43
  catch (err) {
44
+ const authError = mapSdkAuthError(err);
45
+ if (authError)
46
+ return c.json(authError.toJSON(), authError.code);
51
47
  if (err instanceof ProtocolError) {
52
48
  return c.json(err.toJSON(), err.code);
53
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"web3-auth.js","sourceRoot":"","sources":["../../src/middleware/web3-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAQ7E;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CACtC,YAA6C;IAE7C,MAAM,IAAI,GACR,OAAO,YAAY,KAAK,QAAQ;QAC9B,CAAC,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE;QAChC,CAAC,CAAC,YAAY,CAAC;IAEnB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,mFAAmF;QACnF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YACjD,IAAI,UAAU,KAAK,UAAU,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;oBACtB,OAAO,CAAC,CAAC,IAAI,CACX;wBACE,KAAK,EAAE;4BACL,IAAI,EAAE,GAAG;4BACT,SAAS,EAAE,uBAAuB;4BAClC,OAAO,EACL,0FAA0F;yBAC7F;qBACF,EACD,GAAG,CACJ,CAAC;gBACJ,CAAC;gBACD,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE;oBACZ,MAAM,EAAE,IAAI,CAAC,WAAW;oBACxB,OAAO,EAAE,EAAE;iBACZ,CAAC,CAAC;gBACH,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBACzB,MAAM,IAAI,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC;gBAClC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC;gBAC1C,cAAc,EACZ,OAAO,IAAI,CAAC,YAAY,KAAK,UAAU;oBACrC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE;oBACrB,CAAC,CAAC,IAAI,CAAC,YAAY;gBACvB,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;gBAC5B,YAAY,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ;aAC1C,CAAC,CAAC;YAEH,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACpB,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;gBACjC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,IAAiB,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"web3-auth.js","sourceRoot":"","sources":["../../src/middleware/web3-auth.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,eAAe,GAIhB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAE7E,yEAAyE;AACzE,uEAAuE;AACvE,uEAAuE;AACvE,qEAAqE;AACrE,oEAAoE;AACpE,OAAO,oBAAoB,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,CAAC;AAW3B;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,wBAAwB,CACtC,YAA6C;IAE7C,MAAM,IAAI,GACR,OAAO,YAAY,KAAK,QAAQ;QAC9B,CAAC,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE;QAChC,CAAC,CAAC,YAAY,CAAC;IAEnB,OAAO,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC;gBACvC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG;gBAClB,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,oBAAoB,EAAE,IAAI,CAAC,UAAU;gBACrC,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC,CAAC;YAEH,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,SAAiC,CAAC,CAAC;YACjE,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAC/C,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACrC,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,SAAS;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,IAAW,CAAC,CAAC;YACxE,IAAI,GAAG,YAAY,aAAa,EAAE,CAAC;gBACjC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,IAAiB,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ export declare const LOCAL_STATE_VERSION = 1;
2
+ export declare const INDEX_STATE_VERSION = 1;
3
+ export declare const TOKEN_STORE_VERSION = 1;
4
+ export declare const SYNC_CURSOR_VERSION = 1;
5
+ export declare const DATA_HIERARCHY_VERSION = 1;
6
+ export declare const CONFIG_STATE_VERSION = 1;
7
+ export interface LocalStateMigrationOptions {
8
+ storageRoot: string;
9
+ dataDir: string;
10
+ configPath: string;
11
+ syncCursorPath: string;
12
+ tokensPath: string;
13
+ statePath?: string;
14
+ }
15
+ export interface LocalStateMigrationResult {
16
+ statePath: string;
17
+ syncCursorCreated: boolean;
18
+ tokensFileVersioned: boolean;
19
+ }
20
+ export declare function migrateLocalState(options: LocalStateMigrationOptions): Promise<LocalStateMigrationResult>;
21
+ //# sourceMappingURL=local-state.d.ts.map