@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
@@ -0,0 +1,22 @@
1
+ import { homedir } from "node:os";
2
+ import { resolve } from "node:path";
3
+ import { DEFAULT_ROOT_PATH } from "./defaults.js";
4
+ /**
5
+ * Expands a leading "~" to the current user's home directory.
6
+ */
7
+ export function expandHomePath(input) {
8
+ if (input === "~") {
9
+ return homedir();
10
+ }
11
+ if (input.startsWith("~/")) {
12
+ return resolve(homedir(), input.slice(2));
13
+ }
14
+ return input;
15
+ }
16
+ /**
17
+ * Resolves the configured root path (or default) to an absolute path.
18
+ */
19
+ export function resolveRootPath(input) {
20
+ return resolve(expandHomePath(input ?? DEFAULT_ROOT_PATH));
21
+ }
22
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAClB,OAAO,OAAO,EAAE,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,iBAAiB,CAAC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type Address, type Hex } from "viem";
2
+ export interface EnclaveEnv {
3
+ ownerSignature: Hex;
4
+ accessToken: string;
5
+ serverAddress: Address;
6
+ serverPublicKey: Hex;
7
+ }
8
+ export declare function readEnclaveEnv(env: NodeJS.ProcessEnv): EnclaveEnv;
9
+ export declare function runEnclaveMain(): Promise<void>;
10
+ //# sourceMappingURL=enclave-main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enclave-main.d.ts","sourceRoot":"","sources":["../src/enclave-main.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAahE,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,GAAG,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,GAAG,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,UAAU,CAmCjE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA6DpD"}
@@ -0,0 +1,115 @@
1
+ import { createPublicOnlyAccount } from "@opendatalabs/personal-server-ts-core/keys";
2
+ import { isAddress, isHex } from "viem";
3
+ import { createServer } from "./bootstrap.js";
4
+ import { loadConfig } from "./config/index.js";
5
+ import { listenHttpServer } from "./listen.js";
6
+ const REQUIRED_ENV = [
7
+ "VANA_MASTER_KEY_SIGNATURE",
8
+ "PS_ACCESS_TOKEN",
9
+ "PS_SERVER_ADDRESS",
10
+ "PS_SERVER_PUBLIC_KEY",
11
+ ];
12
+ const SYNC_DISABLED = "false";
13
+ export function readEnclaveEnv(env) {
14
+ if (env.VANA_OWNER_PRIVATE_KEY) {
15
+ throw new Error("VANA_OWNER_PRIVATE_KEY is forbidden in enclave profile");
16
+ }
17
+ for (const key of REQUIRED_ENV) {
18
+ if (!env[key]) {
19
+ throw new Error(`${key} is required in enclave profile`);
20
+ }
21
+ }
22
+ const ownerSignature = env.VANA_MASTER_KEY_SIGNATURE;
23
+ const accessToken = env.PS_ACCESS_TOKEN;
24
+ const serverAddress = env.PS_SERVER_ADDRESS;
25
+ const serverPublicKey = env.PS_SERVER_PUBLIC_KEY;
26
+ // Drop the master signature before config and application code can inspect env.
27
+ delete env.VANA_MASTER_KEY_SIGNATURE;
28
+ if (!isHex(ownerSignature)) {
29
+ throw new Error("VANA_MASTER_KEY_SIGNATURE must be hex encoded");
30
+ }
31
+ if (!isAddress(serverAddress)) {
32
+ throw new Error("PS_SERVER_ADDRESS must be an address");
33
+ }
34
+ if (!isHex(serverPublicKey)) {
35
+ throw new Error("PS_SERVER_PUBLIC_KEY must be hex encoded");
36
+ }
37
+ return {
38
+ ownerSignature,
39
+ accessToken,
40
+ serverAddress,
41
+ serverPublicKey,
42
+ };
43
+ }
44
+ export async function runEnclaveMain() {
45
+ const enclaveEnv = readEnclaveEnv(process.env);
46
+ const rootPath = process.env.PERSONAL_SERVER_ROOT_PATH;
47
+ const config = await loadConfig({ rootPath });
48
+ if (process.env.GATEWAY_URL) {
49
+ config.gateway.url = process.env.GATEWAY_URL;
50
+ }
51
+ if (process.env.STORAGE_API_URL) {
52
+ let storageApiUrl;
53
+ try {
54
+ storageApiUrl = new URL(process.env.STORAGE_API_URL);
55
+ }
56
+ catch {
57
+ throw new Error("STORAGE_API_URL must be a valid absolute https URL");
58
+ }
59
+ if (storageApiUrl.protocol !== "https:") {
60
+ throw new Error("STORAGE_API_URL must be a valid absolute https URL");
61
+ }
62
+ config.storage.config.vana = {
63
+ ...config.storage.config.vana,
64
+ apiUrl: process.env.STORAGE_API_URL,
65
+ };
66
+ }
67
+ // Preview-testing hook; production fetch behaviour is unchanged when unset.
68
+ if (process.env.VERCEL_PROTECTION_BYPASS) {
69
+ installGatewayBypass(config.gateway.url, process.env.VERCEL_PROTECTION_BYPASS);
70
+ }
71
+ config.sync.enabled = process.env.SYNC_ENABLED !== SYNC_DISABLED;
72
+ config.devUi.enabled = false;
73
+ config.tunnel.enabled = false;
74
+ const serverAccount = createPublicOnlyAccount({
75
+ address: enclaveEnv.serverAddress,
76
+ publicKey: enclaveEnv.serverPublicKey,
77
+ });
78
+ const context = await createServer(config, {
79
+ rootPath,
80
+ ownerSignature: enclaveEnv.ownerSignature,
81
+ serverAccount,
82
+ profile: "enclave",
83
+ });
84
+ const server = await listenHttpServer({
85
+ fetch: context.app.fetch,
86
+ port: config.server.port,
87
+ onListening: (info) => {
88
+ context.logger.info({ port: info.port }, "Enclave server started");
89
+ },
90
+ });
91
+ void context.startBackgroundServices();
92
+ const shutdown = (signal) => {
93
+ context.logger.info({ signal }, "Shutdown signal received");
94
+ server.close(() => {
95
+ void context.cleanup();
96
+ });
97
+ };
98
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
99
+ process.on("SIGINT", () => shutdown("SIGINT"));
100
+ }
101
+ function installGatewayBypass(gatewayUrl, secret) {
102
+ const gatewayOrigin = new URL(gatewayUrl).origin;
103
+ const requestFetch = globalThis.fetch;
104
+ globalThis.fetch = (input, init) => {
105
+ const requestUrl = new URL(input instanceof Request ? input.url : input.toString());
106
+ if (requestUrl.origin !== gatewayOrigin) {
107
+ return requestFetch(input, init);
108
+ }
109
+ const headers = new Headers(input instanceof Request ? input.headers : undefined);
110
+ new Headers(init?.headers).forEach((value, key) => headers.set(key, value));
111
+ headers.set("x-vercel-protection-bypass", secret);
112
+ return requestFetch(input, { ...init, headers });
113
+ };
114
+ }
115
+ //# sourceMappingURL=enclave-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enclave-main.js","sourceRoot":"","sources":["../src/enclave-main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import "hono";
2
+ import type { GatewayGrantResponse } from "@opendatalabs/vana-sdk/node";
3
+ import type { AuthMechanism, RequestAuth } from "./middleware/web3-auth.js";
4
+ declare module "hono" {
5
+ interface ContextVariableMap {
6
+ auth: RequestAuth | undefined;
7
+ grant: GatewayGrantResponse | undefined;
8
+ authMechanism: AuthMechanism | undefined;
9
+ isPolicyBypass: boolean | undefined;
10
+ devBypass: boolean | undefined;
11
+ }
12
+ }
13
+ export {};
14
+ //# sourceMappingURL=hono-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono-context.d.ts","sourceRoot":"","sources":["../src/hono-context.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,CAAC;AACd,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE5E,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAU,kBAAkB;QAC1B,IAAI,EAAE,WAAW,GAAG,SAAS,CAAC;QAC9B,KAAK,EAAE,oBAAoB,GAAG,SAAS,CAAC;QACxC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;QACzC,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;QACpC,SAAS,EAAE,OAAO,GAAG,SAAS,CAAC;KAChC;CACF;AAED,OAAO,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import "hono";
2
+ //# sourceMappingURL=hono-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono-context.js","sourceRoot":"","sources":["../src/hono-context.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,CAAC"}
package/dist/index.js CHANGED
@@ -1,23 +1,50 @@
1
- import { serve } from "@hono/node-server";
2
1
  import { createRequire } from "node:module";
3
- import { loadConfig } from "@opendatalabs/personal-server-ts-core/config";
2
+ import { loadConfig } from "./config/index.js";
4
3
  import { createServer } from "./bootstrap.js";
5
4
  import { verifyTunnelUrl } from "./tunnel/index.js";
5
+ import { runEnclaveMain } from "./enclave-main.js";
6
+ import { listenHttpServer } from "./listen.js";
6
7
  const require = createRequire(import.meta.url);
7
8
  const pkg = require("../package.json");
8
9
  const DRAIN_TIMEOUT_MS = 5_000;
9
10
  async function main() {
11
+ if (process.env.ENCLAVE_MODE === "true") {
12
+ await runEnclaveMain();
13
+ return;
14
+ }
10
15
  const rootPath = process.env.PERSONAL_SERVER_ROOT_PATH;
11
16
  const config = await loadConfig({ rootPath });
12
17
  const context = await createServer(config, { rootPath });
13
18
  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
- }
19
+ const server = await listenHttpServer({
20
+ fetch: app.fetch,
21
+ port: config.server.port,
22
+ onListening: (info) => {
23
+ logger.info({ port: info.port, version: pkg.version }, "Server started");
24
+ if (devToken) {
25
+ logger.info({ url: `http://localhost:${info.port}/ui` }, "Dev UI available");
26
+ logger.info({ devToken }, "Dev token (ephemeral)");
27
+ }
28
+ },
20
29
  });
30
+ let localAuthServer;
31
+ if (context.localApprovalPort) {
32
+ try {
33
+ localAuthServer = await listenHttpServer({
34
+ fetch: app.fetch,
35
+ port: context.localApprovalPort,
36
+ hostname: "127.0.0.1",
37
+ onListening: (info) => {
38
+ const localApprovalOrigin = `http://127.0.0.1:${info.port}`;
39
+ context.setLocalApprovalOrigin(localApprovalOrigin);
40
+ logger.info({ localApprovalOrigin }, "Loopback auth listener started");
41
+ },
42
+ });
43
+ }
44
+ catch (err) {
45
+ logger.warn({ err, port: context.localApprovalPort }, "Loopback auth listener unavailable — public approval flow will require owner wallet auth");
46
+ }
47
+ }
21
48
  // Fire-and-forget: gateway check + tunnel connect (slow operations)
22
49
  // HTTP server is already listening so POST /v1/data/:scope works immediately
23
50
  context.startBackgroundServices().then(() => {
@@ -25,6 +52,7 @@ async function main() {
25
52
  const { tunnelManager, tunnelUrl } = context;
26
53
  if (tunnelUrl &&
27
54
  tunnelManager &&
55
+ context.isServerRegistered() &&
28
56
  tunnelManager.getStatus().status !== "error") {
29
57
  logger.info({ tunnelUrl }, "Verifying tunnel URL is reachable...");
30
58
  verifyTunnelUrl(tunnelUrl).then((result) => {
@@ -40,10 +68,18 @@ async function main() {
40
68
  });
41
69
  function shutdown(signal) {
42
70
  logger.info({ signal }, "Shutdown signal received, draining connections");
43
- server.close(() => {
44
- logger.info("Server stopped");
45
- process.exit(0);
46
- });
71
+ let pending = localAuthServer ? 2 : 1;
72
+ const finish = () => {
73
+ pending -= 1;
74
+ if (pending === 0) {
75
+ logger.info("Server stopped");
76
+ process.exit(0);
77
+ }
78
+ };
79
+ server.close(finish);
80
+ if (localAuthServer) {
81
+ localAuthServer.close(finish);
82
+ }
47
83
  // Force exit after drain timeout
48
84
  setTimeout(() => {
49
85
  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,17 @@
1
+ import type { Hex } from "viem";
2
+ export type JobFailureCode = "AUTH_INVALID" | "BUILDER_MISMATCH" | "OWNER_MISMATCH" | "GRANT_REVOKED" | "GRANT_INVALID" | "SIGNED_ARTIFACT_MISSING" | "SIGNED_ARTIFACT_INVALID" | "SERVER_NOT_REGISTERED" | "SCOPE_NOT_FOUND" | "VERSION_MISMATCH" | "DEADLINE_PASSED" | "RESULT_TOO_LARGE" | "INTERNAL";
3
+ export interface JobExecuteResponse {
4
+ /** Base64 ECIES bytes: iv || ephemeral public key || ciphertext || MAC. */
5
+ resultCiphertext: string;
6
+ /** SHA-256 of ciphertext bytes. */
7
+ resultHash: Hex;
8
+ resultSize: number;
9
+ }
10
+ export interface JobExecuteError {
11
+ error: {
12
+ code: JobFailureCode;
13
+ message: string;
14
+ retryable: boolean;
15
+ };
16
+ }
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/jobs/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAGhC,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,kBAAkB,GAClB,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,yBAAyB,GACzB,yBAAyB,GACzB,uBAAuB,GACvB,iBAAiB,GACjB,kBAAkB,GAClB,iBAAiB,GACjB,kBAAkB,GAClB,UAAU,CAAC;AAEf,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,gBAAgB,EAAE,MAAM,CAAC;IACzB,mCAAmC;IACnC,UAAU,EAAE,GAAG,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE;QACL,IAAI,EAAE,cAAc,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;CACH"}
@@ -0,0 +1,3 @@
1
+ export {};
2
+ // JOB_EXECUTE_WIRE_END
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/jobs/types.ts"],"names":[],"mappings":";AAiCA,uBAAuB"}
@@ -0,0 +1,30 @@
1
+ import type { AccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
2
+ import type { DataStoragePort, ProtocolGatewayPort } from "@opendatalabs/personal-server-ts-core/ports";
3
+ import type { ScopeDeletionTracker } from "@opendatalabs/personal-server-ts-core/sync";
4
+ import { type DataPortabilityGatewayConfig } from "@opendatalabs/vana-sdk/node";
5
+ import { type JobRequestEnvelope } from "@opendatalabs/vana-sdk/protocol/jobs";
6
+ import type { ECIESProvider } from "@opendatalabs/vana-sdk/crypto/ecies/interface";
7
+ import type { Logger } from "pino";
8
+ import { type Address, type Hex } from "viem";
9
+ import type { JobExecuteResponse, JobFailureCode } from "./types.js";
10
+ export interface JobWorkerDeps {
11
+ serverOwner: Address;
12
+ serverAddress: Address;
13
+ serverPublicKey: Hex;
14
+ authAudience: string;
15
+ gateway: ProtocolGatewayPort;
16
+ gatewayConfig: DataPortabilityGatewayConfig;
17
+ storage: DataStoragePort;
18
+ ecies: ECIESProvider;
19
+ now?: () => Date;
20
+ logger: Logger;
21
+ accessLogWriter: AccessLogWriter;
22
+ scopeDeletions?: ScopeDeletionTracker;
23
+ }
24
+ export declare class JobFailure extends Error {
25
+ readonly code: JobFailureCode;
26
+ readonly retryable: boolean;
27
+ constructor(code: JobFailureCode, message: string, retryable: boolean);
28
+ }
29
+ export declare function executeJob(envelope: JobRequestEnvelope, deps: JobWorkerDeps): Promise<JobExecuteResponse>;
30
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/jobs/worker.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACpB,MAAM,6CAA6C,CAAC;AAKrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+CAA+C,CAAC;AACnF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAkB,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAE9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAUrE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,GAAG,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,aAAa,EAAE,4BAA4B,CAAC;IAC5C,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,EAAE,aAAa,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,eAAe,CAAC;IACjC,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAED,qBAAa,UAAW,SAAQ,KAAK;aAEjB,IAAI,EAAE,cAAc;aAEpB,SAAS,EAAE,OAAO;gBAFlB,IAAI,EAAE,cAAc,EACpC,OAAO,EAAE,MAAM,EACC,SAAS,EAAE,OAAO;CAKrC;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAc7B"}
@@ -0,0 +1,217 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { assertScopeNotDeleted, redactEnvelopeForGrantee, } from "@opendatalabs/personal-server-ts-core/api";
3
+ import { readDataContract } from "@opendatalabs/personal-server-ts-core/contracts";
4
+ import { DataDeletedError, GrantRevokedError, InvalidSignatureError, ProtocolError, SignedArtifactInvalidError, SignedArtifactMissingError, UnregisteredBuilderError, } from "@opendatalabs/personal-server-ts-core/errors";
5
+ import { verifyDataReadPolicy, verifySignedArtifacts, } from "@opendatalabs/personal-server-ts-core/policy";
6
+ import { verifyWeb3Signed, } from "@opendatalabs/vana-sdk/node";
7
+ import { canonicalJobRequestBytes, sealJobResult, } from "@opendatalabs/vana-sdk/crypto/envelope/job";
8
+ import { JOB_PROTOCOL_VERSION, MAX_INLINE_RESULT_BYTES, } from "@opendatalabs/vana-sdk/protocol/jobs";
9
+ import { isAddressEqual } from "viem";
10
+ import { publicKeyToAddress } from "viem/accounts";
11
+ const RAW_READ = "raw_read";
12
+ const EXECUTE_PATH = "/v1/jobs/execute";
13
+ const POST = "POST";
14
+ const JSON_CONTENT_TYPE = "application/json";
15
+ const UNKNOWN_METADATA = "unknown";
16
+ const MILLISECONDS_PER_SECOND = 1_000;
17
+ const JOB_EXECUTION_FAILED_LOG = "Enclave job execution failed";
18
+ export class JobFailure extends Error {
19
+ code;
20
+ retryable;
21
+ constructor(code, message, retryable) {
22
+ super(message);
23
+ this.code = code;
24
+ this.retryable = retryable;
25
+ this.name = "JobFailure";
26
+ }
27
+ }
28
+ export async function executeJob(envelope, deps) {
29
+ try {
30
+ return await executeJobUnsafe(envelope, deps);
31
+ }
32
+ catch (error) {
33
+ if (error instanceof JobFailure) {
34
+ throw error;
35
+ }
36
+ deps.logger.warn({ jobId: envelope.request.jobId, error: errorSummary(error) }, JOB_EXECUTION_FAILED_LOG);
37
+ throw new JobFailure("INTERNAL", "job execution failed", true);
38
+ }
39
+ }
40
+ async function executeJobUnsafe(envelope, deps) {
41
+ const { request } = envelope;
42
+ if (request.v !== JOB_PROTOCOL_VERSION) {
43
+ throw new JobFailure("INTERNAL", "protocol version not supported", false);
44
+ }
45
+ if (request.operation !== RAW_READ) {
46
+ throw new JobFailure("INTERNAL", "operation not supported", false);
47
+ }
48
+ const now = deps.now?.() ?? new Date();
49
+ if (!validDeadline(request.deadline, now)) {
50
+ throw new JobFailure("DEADLINE_PASSED", "job deadline passed", false);
51
+ }
52
+ const auth = await verifyJobAuth(envelope, deps.authAudience, now);
53
+ if (!sameAddress(auth.signer, request.builder)) {
54
+ throw new JobFailure("BUILDER_MISMATCH", "builder identity mismatch", false);
55
+ }
56
+ if (!sameAddress(request.owner, deps.serverOwner)) {
57
+ throw new JobFailure("OWNER_MISMATCH", "job owner mismatch", false);
58
+ }
59
+ let grant;
60
+ try {
61
+ grant = await verifyDataReadPolicy({
62
+ signer: request.builder,
63
+ grantId: request.grantId,
64
+ requestedScope: request.scope,
65
+ serverOwner: deps.serverOwner,
66
+ }, { authSessionVerifier: deps.gateway, grantVerifier: deps.gateway });
67
+ }
68
+ catch (error) {
69
+ throw mapPolicyFailure(error);
70
+ }
71
+ const builder = await deps.gateway.getBuilder(request.builder);
72
+ if (!builder) {
73
+ throw new JobFailure("BUILDER_MISMATCH", "builder is not registered", false);
74
+ }
75
+ try {
76
+ await verifySignedArtifacts({
77
+ grant,
78
+ builder,
79
+ gatewayConfig: deps.gatewayConfig,
80
+ ownerAddress: deps.serverOwner,
81
+ });
82
+ }
83
+ catch (error) {
84
+ throw mapArtifactFailure(error);
85
+ }
86
+ let builderKeyAddress;
87
+ try {
88
+ builderKeyAddress = publicKeyToAddress(builder.publicKey);
89
+ }
90
+ catch {
91
+ throw new JobFailure("SIGNED_ARTIFACT_INVALID", "builder public key is invalid", false);
92
+ }
93
+ if (!sameAddress(builderKeyAddress, request.builder) ||
94
+ builder.publicKey.toLowerCase() !== request.builderPublicKey.toLowerCase()) {
95
+ throw new JobFailure("BUILDER_MISMATCH", "builder key mismatch", false);
96
+ }
97
+ const registration = await deps.gateway.getServer(deps.serverAddress);
98
+ if (!registration ||
99
+ registration.revokedAt !== null ||
100
+ !sameAddress(registration.ownerAddress, deps.serverOwner) ||
101
+ registration.publicKey.toLowerCase() !== deps.serverPublicKey.toLowerCase()) {
102
+ throw new JobFailure("SERVER_NOT_REGISTERED", "server registration is invalid", false);
103
+ }
104
+ const entry = deps.storage.findEntry({ scope: request.scope });
105
+ try {
106
+ await assertScopeNotDeleted({ scopeDeletions: deps.scopeDeletions, serverOwner: deps.serverOwner }, request.scope, entry);
107
+ }
108
+ catch (error) {
109
+ if (error instanceof DataDeletedError) {
110
+ throw new JobFailure("SCOPE_NOT_FOUND", "scope not found", false);
111
+ }
112
+ throw error;
113
+ }
114
+ const read = await readDataContract({
115
+ storage: deps.storage,
116
+ scopeParam: request.scope,
117
+ });
118
+ if (!read.ok || !entry) {
119
+ throw new JobFailure("SCOPE_NOT_FOUND", "scope not found", false);
120
+ }
121
+ const localVersion = await deps.storage.findLatestVersionByScope(request.scope);
122
+ if (request.pinnedVersion !== null &&
123
+ String(localVersion) !== request.pinnedVersion) {
124
+ throw new JobFailure("VERSION_MISMATCH", "scope version mismatch", true);
125
+ }
126
+ const redacted = redactEnvelopeForGrantee(read.envelope);
127
+ const result = {
128
+ v: JOB_PROTOCOL_VERSION,
129
+ jobId: request.jobId,
130
+ scope: request.scope,
131
+ version: localVersion === 0 ? null : String(localVersion),
132
+ contentType: JSON_CONTENT_TYPE,
133
+ body: Buffer.from(JSON.stringify(redacted)).toString("base64"),
134
+ };
135
+ const sealed = await sealJobResult(result, request.builderPublicKey, deps.ecies);
136
+ if (sealed.size > MAX_INLINE_RESULT_BYTES) {
137
+ throw new JobFailure("RESULT_TOO_LARGE", "encrypted result is too large", false);
138
+ }
139
+ await deps.accessLogWriter.write({
140
+ logId: randomUUID(),
141
+ grantId: request.grantId,
142
+ builder: request.builder,
143
+ action: "read",
144
+ scope: request.scope,
145
+ timestamp: now.toISOString(),
146
+ ipAddress: UNKNOWN_METADATA,
147
+ userAgent: UNKNOWN_METADATA,
148
+ });
149
+ deps.logger.info({ jobId: request.jobId, scope: request.scope, version: localVersion }, "Enclave job read served");
150
+ return {
151
+ resultCiphertext: sealed.ciphertext,
152
+ resultHash: sealed.hash,
153
+ resultSize: sealed.size,
154
+ };
155
+ }
156
+ async function verifyJobAuth(envelope, authAudience, now) {
157
+ try {
158
+ // aud = Gateway origin; contract section 1 step 1 amendment.
159
+ return await verifyWeb3Signed({
160
+ headerValue: envelope.auth,
161
+ expectedOrigin: authAudience,
162
+ expectedMethod: POST,
163
+ expectedPath: EXECUTE_PATH,
164
+ bodyBytes: canonicalJobRequestBytes(envelope.request),
165
+ now: Math.floor(now.getTime() / MILLISECONDS_PER_SECOND),
166
+ });
167
+ }
168
+ catch {
169
+ throw new JobFailure("AUTH_INVALID", "job authorization is invalid", false);
170
+ }
171
+ }
172
+ function mapPolicyFailure(error) {
173
+ if (error instanceof GrantRevokedError) {
174
+ return new JobFailure("GRANT_REVOKED", "grant is revoked", false);
175
+ }
176
+ if (error instanceof InvalidSignatureError ||
177
+ error instanceof UnregisteredBuilderError) {
178
+ return new JobFailure("BUILDER_MISMATCH", "builder is not authorized", false);
179
+ }
180
+ if (error instanceof ProtocolError) {
181
+ return new JobFailure("GRANT_INVALID", "grant is invalid", false);
182
+ }
183
+ return new JobFailure("INTERNAL", "policy verification failed", true);
184
+ }
185
+ function mapArtifactFailure(error) {
186
+ if (error instanceof SignedArtifactMissingError) {
187
+ return new JobFailure("SIGNED_ARTIFACT_MISSING", "signed artifact is missing", false);
188
+ }
189
+ if (error instanceof GrantRevokedError) {
190
+ return new JobFailure("GRANT_REVOKED", "grant is revoked", false);
191
+ }
192
+ if (error instanceof SignedArtifactInvalidError) {
193
+ return new JobFailure("SIGNED_ARTIFACT_INVALID", "signed artifact is invalid", false);
194
+ }
195
+ if (error instanceof ProtocolError) {
196
+ return new JobFailure("SIGNED_ARTIFACT_INVALID", "signed artifact is invalid", false);
197
+ }
198
+ return new JobFailure("INTERNAL", "artifact verification failed", true);
199
+ }
200
+ function errorSummary(error) {
201
+ return error instanceof Error
202
+ ? `${error.name}: ${error.message}`
203
+ : String(error);
204
+ }
205
+ function validDeadline(deadline, now) {
206
+ const timestamp = Date.parse(deadline);
207
+ return Number.isFinite(timestamp) && timestamp > now.getTime();
208
+ }
209
+ function sameAddress(left, right) {
210
+ try {
211
+ return isAddressEqual(left, right);
212
+ }
213
+ catch {
214
+ return false;
215
+ }
216
+ }
217
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/jobs/worker.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"}