@opendatalabs/personal-server-ts-server 0.0.1-canary.01ca694 → 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 (130) hide show
  1. package/dist/api-auth.d.ts +16 -2
  2. package/dist/api-auth.d.ts.map +1 -1
  3. package/dist/api-auth.js +72 -22
  4. package/dist/api-auth.js.map +1 -1
  5. package/dist/app.d.ts +51 -3
  6. package/dist/app.d.ts.map +1 -1
  7. package/dist/app.js +72 -11
  8. package/dist/app.js.map +1 -1
  9. package/dist/bootstrap.d.ts +25 -5
  10. package/dist/bootstrap.d.ts.map +1 -1
  11. package/dist/bootstrap.js +294 -37
  12. package/dist/bootstrap.js.map +1 -1
  13. package/dist/client.d.ts +1 -1
  14. package/dist/client.d.ts.map +1 -1
  15. package/dist/client.js +4 -2
  16. package/dist/client.js.map +1 -1
  17. package/dist/config/loader.d.ts.map +1 -1
  18. package/dist/config/loader.js +6 -14
  19. package/dist/config/loader.js.map +1 -1
  20. package/dist/enclave-main.d.ts +10 -0
  21. package/dist/enclave-main.d.ts.map +1 -0
  22. package/dist/enclave-main.js +115 -0
  23. package/dist/enclave-main.js.map +1 -0
  24. package/dist/index.js +6 -22
  25. package/dist/index.js.map +1 -1
  26. package/dist/jobs/types.d.ts +17 -0
  27. package/dist/jobs/types.d.ts.map +1 -0
  28. package/dist/jobs/types.js +3 -0
  29. package/dist/jobs/types.js.map +1 -0
  30. package/dist/jobs/worker.d.ts +30 -0
  31. package/dist/jobs/worker.d.ts.map +1 -0
  32. package/dist/jobs/worker.js +217 -0
  33. package/dist/jobs/worker.js.map +1 -0
  34. package/dist/listen.d.ts +11 -0
  35. package/dist/listen.d.ts.map +1 -0
  36. package/dist/listen.js +23 -0
  37. package/dist/listen.js.map +1 -0
  38. package/dist/logging/access-log.d.ts +2 -13
  39. package/dist/logging/access-log.d.ts.map +1 -1
  40. package/dist/logging/access-log.js.map +1 -1
  41. package/dist/middleware/cors.d.ts +18 -0
  42. package/dist/middleware/cors.d.ts.map +1 -0
  43. package/dist/middleware/cors.js +51 -0
  44. package/dist/middleware/cors.js.map +1 -0
  45. package/dist/middleware/web3-auth.d.ts +1 -0
  46. package/dist/middleware/web3-auth.d.ts.map +1 -1
  47. package/dist/middleware/web3-auth.js +6 -0
  48. package/dist/middleware/web3-auth.js.map +1 -1
  49. package/dist/migrations/detect-stuck-version-ledger.d.ts +43 -0
  50. package/dist/migrations/detect-stuck-version-ledger.d.ts.map +1 -0
  51. package/dist/migrations/detect-stuck-version-ledger.js +73 -0
  52. package/dist/migrations/detect-stuck-version-ledger.js.map +1 -0
  53. package/dist/migrations/local-state.d.ts +14 -0
  54. package/dist/migrations/local-state.d.ts.map +1 -1
  55. package/dist/migrations/local-state.js +27 -0
  56. package/dist/migrations/local-state.js.map +1 -1
  57. package/dist/migrations/state-migrations.d.ts +78 -0
  58. package/dist/migrations/state-migrations.d.ts.map +1 -0
  59. package/dist/migrations/state-migrations.js +72 -0
  60. package/dist/migrations/state-migrations.js.map +1 -0
  61. package/dist/pending-blob-deletions.d.ts +10 -0
  62. package/dist/pending-blob-deletions.d.ts.map +1 -0
  63. package/dist/pending-blob-deletions.js +38 -0
  64. package/dist/pending-blob-deletions.js.map +1 -0
  65. package/dist/routes/data.d.ts +61 -10
  66. package/dist/routes/data.d.ts.map +1 -1
  67. package/dist/routes/data.js +19 -12
  68. package/dist/routes/data.js.map +1 -1
  69. package/dist/routes/derivatives.d.ts +33 -0
  70. package/dist/routes/derivatives.d.ts.map +1 -0
  71. package/dist/routes/derivatives.js +33 -0
  72. package/dist/routes/derivatives.js.map +1 -0
  73. package/dist/routes/enclave-jobs.d.ts +9 -0
  74. package/dist/routes/enclave-jobs.d.ts.map +1 -0
  75. package/dist/routes/enclave-jobs.js +104 -0
  76. package/dist/routes/enclave-jobs.js.map +1 -0
  77. package/dist/routes/mcp.d.ts +23 -4
  78. package/dist/routes/mcp.d.ts.map +1 -1
  79. package/dist/routes/mcp.js +161 -24
  80. package/dist/routes/mcp.js.map +1 -1
  81. package/dist/routes/ui-registration.d.ts +2 -0
  82. package/dist/routes/ui-registration.d.ts.map +1 -1
  83. package/dist/routes/ui-registration.js +4 -2
  84. package/dist/routes/ui-registration.js.map +1 -1
  85. package/dist/routes/write-session.d.ts +37 -0
  86. package/dist/routes/write-session.d.ts.map +1 -0
  87. package/dist/routes/write-session.js +34 -0
  88. package/dist/routes/write-session.js.map +1 -0
  89. package/dist/storage/hierarchy.d.ts +7 -0
  90. package/dist/storage/hierarchy.d.ts.map +1 -1
  91. package/dist/storage/hierarchy.js +42 -1
  92. package/dist/storage/hierarchy.js.map +1 -1
  93. package/dist/storage/index-manager.d.ts +25 -2
  94. package/dist/storage/index-manager.d.ts.map +1 -1
  95. package/dist/storage/index-manager.js +42 -4
  96. package/dist/storage/index-manager.js.map +1 -1
  97. package/dist/storage/index-schema.d.ts +1 -1
  98. package/dist/storage/index-schema.d.ts.map +1 -1
  99. package/dist/storage/index-schema.js +23 -2
  100. package/dist/storage/index-schema.js.map +1 -1
  101. package/dist/storage/node-data-storage.d.ts.map +1 -1
  102. package/dist/storage/node-data-storage.js +34 -1
  103. package/dist/storage/node-data-storage.js.map +1 -1
  104. package/dist/storage/question-store.d.ts +9 -0
  105. package/dist/storage/question-store.d.ts.map +1 -0
  106. package/dist/storage/question-store.js +151 -0
  107. package/dist/storage/question-store.js.map +1 -0
  108. package/dist/sync-cursor.d.ts.map +1 -1
  109. package/dist/sync-cursor.js.map +1 -1
  110. package/dist/tunnel/manager.d.ts +15 -1
  111. package/dist/tunnel/manager.d.ts.map +1 -1
  112. package/dist/tunnel/manager.js +34 -7
  113. package/dist/tunnel/manager.js.map +1 -1
  114. package/dist/ui/index.html +1 -2
  115. package/dist/ui/ps-lite-debug.d.ts.map +1 -1
  116. package/dist/ui/ps-lite-debug.js +13992 -5161
  117. package/dist/ui/ps-lite-debug.js.map +1 -1
  118. package/package.json +7 -7
  119. package/dist/grant-fee-verifier.d.ts +0 -27
  120. package/dist/grant-fee-verifier.d.ts.map +0 -1
  121. package/dist/grant-fee-verifier.js +0 -40
  122. package/dist/grant-fee-verifier.js.map +0 -1
  123. package/dist/middleware/data-read-policy.d.ts +0 -11
  124. package/dist/middleware/data-read-policy.d.ts.map +0 -1
  125. package/dist/middleware/data-read-policy.js +0 -39
  126. package/dist/middleware/data-read-policy.js.map +0 -1
  127. package/dist/schema-registrar.d.ts +0 -26
  128. package/dist/schema-registrar.d.ts.map +0 -1
  129. package/dist/schema-registrar.js +0 -61
  130. package/dist/schema-registrar.js.map +0 -1
@@ -0,0 +1,38 @@
1
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { createPendingBlobDeletionStore, normalizePendingBlobDeletions, } from "@opendatalabs/personal-server-ts-core/sync";
4
+ /**
5
+ * File-backed retry markers for blob deletions whose gateway tombstone landed
6
+ * but whose storage DELETE did not finish: one exact (scope, version) key
7
+ * each. Lives next to `sync-cursor.json` under the server root; written
8
+ * atomically (tmp + rename) like the cursor. A version-1 file (whole scopes)
9
+ * is read as version-less markers the retry expands into exact keys.
10
+ */
11
+ export function createFilePendingBlobDeletionStore(filePath) {
12
+ const kv = {
13
+ async read() {
14
+ try {
15
+ const raw = await readFile(filePath, "utf8");
16
+ const parsed = JSON.parse(raw);
17
+ return normalizePendingBlobDeletions(parsed.keys ?? parsed.scopes);
18
+ }
19
+ catch (err) {
20
+ if (err instanceof Error &&
21
+ "code" in err &&
22
+ err.code === "ENOENT") {
23
+ return null;
24
+ }
25
+ throw err;
26
+ }
27
+ },
28
+ async write(keys) {
29
+ await mkdir(dirname(filePath), { recursive: true });
30
+ const tmpPath = `${filePath}.tmp`;
31
+ const state = { version: 2, keys };
32
+ await writeFile(tmpPath, `${JSON.stringify(state, null, 2)}\n`);
33
+ await rename(tmpPath, filePath);
34
+ },
35
+ };
36
+ return createPendingBlobDeletionStore(kv);
37
+ }
38
+ //# sourceMappingURL=pending-blob-deletions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-blob-deletions.js","sourceRoot":"","sources":["../src/pending-blob-deletions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAE9B,MAAM,4CAA4C,CAAC;AAWpD;;;;;;GAMG;AACH,MAAM,UAAU,kCAAkC,CAChD,QAAgB;IAEhB,MAAM,EAAE,GAA0B;QAChC,KAAK,CAAC,IAAI;YACR,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAI5B,CAAC;gBACF,OAAO,6BAA6B,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IACE,GAAG,YAAY,KAAK;oBACpB,MAAM,IAAI,GAAG;oBACZ,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAChD,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAI;YACd,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,GAAG,QAAQ,MAAM,CAAC;YAClC,MAAM,KAAK,GAA6B,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;YAC7D,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAChE,MAAM,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;IACF,OAAO,8BAA8B,CAAC,EAAE,CAAC,CAAC;AAC5C,CAAC"}
@@ -1,14 +1,16 @@
1
1
  import { Hono } from "hono";
2
- import { type PersonalServerApiDispatchOptions } from "@opendatalabs/personal-server-ts-core/api";
2
+ import { type PersonalServerApiDispatchOptions, type PersonalServerReadFulfillmentReporter } from "@opendatalabs/personal-server-ts-core/api";
3
3
  import type { HierarchyManagerOptions } from "@opendatalabs/personal-server-ts-core/storage/hierarchy";
4
4
  import type { IndexManager } from "@opendatalabs/personal-server-ts-core/storage/index";
5
- import type { GatewayClient } from "@opendatalabs/vana-sdk/node";
5
+ import type { DataPortabilityGatewayConfig, GatewayClient } from "@opendatalabs/vana-sdk/node";
6
6
  import type { AccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
7
- import type { SyncManager } from "@opendatalabs/personal-server-ts-core/sync";
8
- import type { FeeVerifierPort, DataStoragePort, RuntimeAvailabilityPort } from "@opendatalabs/personal-server-ts-core/ports";
7
+ import type { ScopeDeletionTracker, SyncManager } from "@opendatalabs/personal-server-ts-core/sync";
8
+ import type { DataStoragePort, RuntimeAvailabilityPort } from "@opendatalabs/personal-server-ts-core/ports";
9
+ import type { ServerSigner } from "@opendatalabs/personal-server-ts-core/signing";
9
10
  import type { TokenStore } from "../token-store.js";
11
+ import type { WriteProofReplayStore, WriteSessionStore } from "@opendatalabs/personal-server-ts-core/write";
12
+ import type { LineageGatewayPort } from "@opendatalabs/personal-server-ts-core/lineage";
10
13
  import type { Logger } from "pino";
11
- import type { ServerSigner } from "@opendatalabs/personal-server-ts-core/signing";
12
14
  export interface DataRouteDeps {
13
15
  indexManager: IndexManager;
14
16
  hierarchyOptions: HierarchyManagerOptions;
@@ -16,19 +18,68 @@ export interface DataRouteDeps {
16
18
  serverOrigin: string | (() => string);
17
19
  serverOwner?: `0x${string}`;
18
20
  gateway: GatewayClient;
21
+ /**
22
+ * Required for the X402 flow on GET /v1/data/:scope. Provides the EIP-712
23
+ * domain (escrowPaymentDomain + dataRegistryDomain) the server uses to
24
+ * recover X-PAYMENT signatures and the embedded accessRecord signatures.
25
+ */
26
+ gatewayConfig?: DataPortabilityGatewayConfig;
27
+ /**
28
+ * Gateway base URL. Used by the X402 forward path — the handler `fetch`es
29
+ * POST /v1/escrow/pay directly so it can inspect the gateway's structured
30
+ * error body (the SDK's gateway.payForOperation discards it).
31
+ */
32
+ gatewayUrl?: string;
33
+ /**
34
+ * When true, GET /v1/data/:scope enforces the X402 challenge / X-PAYMENT
35
+ * cycle on every read. Off-by-default so dev / test setups don't require
36
+ * builder-side payment signing.
37
+ */
38
+ paymentEnabled?: boolean;
19
39
  accessLogWriter: AccessLogWriter;
40
+ readFulfillmentReporter?: PersonalServerReadFulfillmentReporter;
20
41
  syncManager?: SyncManager | null;
42
+ /** Read-side tombstone memory; reads of a deleted scope answer 410. */
43
+ scopeDeletions?: ScopeDeletionTracker;
21
44
  devToken?: string;
22
45
  accessToken?: string;
23
46
  tokenStore?: TokenStore;
24
- feeVerifier?: FeeVerifierPort;
25
47
  dataStorage?: DataStoragePort;
26
48
  runtimeAvailability?: RuntimeAvailabilityPort;
27
- mountPath?: PersonalServerApiDispatchOptions["basePath"];
28
- /** Server signing account enables binary schema auto-registration. */
49
+ /**
50
+ * Write API sessions (POST /v1/write/session). When present, the ingest
51
+ * endpoint accepts write-session bearer tokens for delegated builder
52
+ * writes; absent = owner-only ingest, unchanged.
53
+ */
54
+ writeSessionStore?: WriteSessionStore;
55
+ /** Replay guard for per-write proofs; defaults to in-memory (api-auth). */
56
+ writeProofReplayStore?: WriteProofReplayStore;
57
+ /**
58
+ * Powers the RECORD_DATA_ACCESS attestation embedded in 402 challenges.
59
+ * When supplied alongside serverOwner + paymentEnabled, every challenge
60
+ * carries a server-signed accessRecord. Required for the on-chain
61
+ * recordDataAccess to be scheduled by gateway.settle later.
62
+ */
29
63
  serverSigner?: ServerSigner;
30
- /** Gateway base URL, required (with serverSigner) for schema registration. */
31
- gatewayUrl?: string;
64
+ /**
65
+ * Personal server's own EOA address. Needed by the X402 verifier so it
66
+ * can confirm that the accessRecord echoed back in X-PAYMENT was signed
67
+ * by this server (not forged by a malicious builder).
68
+ */
69
+ serverAddress?: `0x${string}`;
70
+ /**
71
+ * Gateway access for derivative data: lineage source lookups on write, the
72
+ * signed lineage read and the cascade delete walk. Absent = lineage writes
73
+ * can only cite local scopes; lineage read / cascade answer 503 / 501.
74
+ */
75
+ lineageGateway?: LineageGatewayPort;
76
+ /** Post-commit write hook (derivative recompute on refresh). */
77
+ onDataWritten?: (event: {
78
+ scope: string;
79
+ collectedAt: string;
80
+ lineageSources?: string[];
81
+ }) => void;
82
+ mountPath?: PersonalServerApiDispatchOptions["basePath"];
32
83
  }
33
84
  export declare function dataRoutes(deps: DataRouteDeps): Hono;
34
85
  //# sourceMappingURL=data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAEL,KAAK,gCAAgC,EACtC,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AACvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,uBAAuB,EACxB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAQnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAElF,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,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,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C,SAAS,CAAC,EAAE,gCAAgC,CAAC,UAAU,CAAC,CAAC;IACzD,wEAAwE;IACxE,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAkDpD"}
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAEL,KAAK,gCAAgC,EACrC,KAAK,qCAAqC,EAC3C,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AACvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EACV,4BAA4B,EAC5B,aAAa,EACd,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EACV,oBAAoB,EACpB,WAAW,EACZ,MAAM,4CAA4C,CAAC;AACpD,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACxB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAQnC,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,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;;;;OAIG;IACH,aAAa,CAAC,EAAE,4BAA4B,CAAC;IAC7C;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,uBAAuB,CAAC,EAAE,qCAAqC,CAAC;IAChE,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,uEAAuE;IACvE,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,2EAA2E;IAC3E,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC9B;;;;OAIG;IACH,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,gEAAgE;IAChE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,KAAK,IAAI,CAAC;IACX,SAAS,CAAC,EAAE,gCAAgC,CAAC,UAAU,CAAC,CAAC;CAC1D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CAwDpD"}
@@ -3,7 +3,6 @@ import { handlePersonalServerDataRequest, } from "@opendatalabs/personal-server-
3
3
  import { createBodyLimit, DATA_INGEST_MAX_SIZE, } from "../middleware/body-limit.js";
4
4
  import { createNodeDataStorage } from "../storage/node-data-storage.js";
5
5
  import { createServerApiAuth } from "../api-auth.js";
6
- import { createSchemaRegistrar } from "../schema-registrar.js";
7
6
  export function dataRoutes(deps) {
8
7
  const app = new Hono();
9
8
  const dataStorage = deps.dataStorage ??
@@ -19,26 +18,34 @@ export function dataRoutes(deps) {
19
18
  accessToken: deps.accessToken,
20
19
  tokenStore: deps.tokenStore,
21
20
  dataStorage,
22
- feeVerifier: deps.feeVerifier,
23
21
  runtimeAvailability: deps.runtimeAvailability,
22
+ writeSessionStore: deps.writeSessionStore,
23
+ writeProofReplayStore: deps.writeProofReplayStore,
24
24
  });
25
- const schemaRegistrar = deps.serverSigner && deps.gatewayUrl
26
- ? createSchemaRegistrar({
27
- gatewayUrl: deps.gatewayUrl,
28
- signer: deps.serverSigner,
29
- logger: deps.logger,
30
- })
31
- : undefined;
32
25
  app.use("/:scope", createBodyLimit(DATA_INGEST_MAX_SIZE));
33
26
  app.all("*", (c) => handlePersonalServerDataRequest(c.req.raw, {
34
27
  storage: dataStorage,
35
28
  auth,
36
- schemaResolver: deps.gateway,
37
- schemaRegistrar,
38
29
  accessLogWriter: deps.accessLogWriter,
30
+ readFulfillmentReporter: deps.readFulfillmentReporter,
39
31
  syncManager: deps.syncManager ?? null,
32
+ scopeDeletions: deps.scopeDeletions,
40
33
  runtimeAvailability: deps.runtimeAvailability,
41
- feeVerifier: deps.feeVerifier,
34
+ serverSigner: deps.serverSigner,
35
+ serverOwner: deps.serverOwner,
36
+ serverAddress: deps.serverAddress,
37
+ gateway: deps.gateway,
38
+ gatewayConfig: deps.gatewayConfig,
39
+ gatewayUrl: deps.gatewayUrl,
40
+ paymentEnabled: deps.paymentEnabled,
41
+ lineageGateway: deps.lineageGateway,
42
+ onDataWritten: deps.onDataWritten,
43
+ // Network identifier for the 402 challenge body. We use the chain
44
+ // id as the convention since the gateway is chain-scoped; clients
45
+ // dispatch on the (scheme, chainId) pair, not the human name.
46
+ network: deps.gatewayConfig
47
+ ? `vana:${deps.gatewayConfig.chainId}`
48
+ : undefined,
42
49
  logger: deps.logger,
43
50
  }, { basePath: deps.mountPath }));
44
51
  return app;
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,+BAA+B,GAEhC,MAAM,2CAA2C,CAAC;AAanD,OAAO,EACL,eAAe,EACf,oBAAoB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAyB/D,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,MAAM,WAAW,GACf,IAAI,CAAC,WAAW;QAChB,qBAAqB,CAAC;YACpB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SACxC,CAAC,CAAC;IACL,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW;QACX,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;KAC9C,CAAC,CAAC;IAEH,MAAM,eAAe,GACnB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU;QAClC,CAAC,CAAC,qBAAqB,CAAC;YACpB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,IAAI,CAAC,YAAY;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;QACJ,CAAC,CAAC,SAAS,CAAC;IAEhB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC1D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CACjB,+BAA+B,CAC7B,CAAC,CAAC,GAAG,CAAC,GAAG,EACT;QACE,OAAO,EAAE,WAAW;QACpB,IAAI;QACJ,cAAc,EAAE,IAAI,CAAC,OAAO;QAC5B,eAAe;QACf,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;QACrC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAC7B,CACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/routes/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,+BAA+B,GAGhC,MAAM,2CAA2C,CAAC;AAwBnD,OAAO,EACL,eAAe,EACf,oBAAoB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAyErD,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,MAAM,WAAW,GACf,IAAI,CAAC,WAAW;QAChB,qBAAqB,CAAC;YACpB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SACxC,CAAC,CAAC;IACL,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW;QACX,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;KAClD,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC1D,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CACjB,+BAA+B,CAC7B,CAAC,CAAC,GAAG,CAAC,GAAG,EACT;QACE,OAAO,EAAE,WAAW;QACpB,IAAI;QACJ,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;QACrD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;QACrC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,kEAAkE;QAClE,kEAAkE;QAClE,8DAA8D;QAC9D,OAAO,EAAE,IAAI,CAAC,aAAa;YACzB,CAAC,CAAC,QAAQ,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;YACtC,CAAC,CAAC,SAAS;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAC7B,CACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Derivative compute routes: /v1/derivatives/questions. Thin Hono wrapper
3
+ * over the runtime-agnostic core handler; builder auth is the Write API's
4
+ * (write-session token + signed proof), owner auth is the usual owner gate.
5
+ */
6
+ import { Hono } from "hono";
7
+ import type { Logger } from "pino";
8
+ import type { GatewayClient } from "@opendatalabs/vana-sdk/node";
9
+ import { type PersonalServerDerivativesApiDeps } from "@opendatalabs/personal-server-ts-core/derivatives";
10
+ import type { PersonalServerApiDispatchOptions } from "@opendatalabs/personal-server-ts-core/api";
11
+ import type { DataStoragePort, RuntimeAvailabilityPort } from "@opendatalabs/personal-server-ts-core/ports";
12
+ import type { WriteProofReplayStore, WriteSessionStore } from "@opendatalabs/personal-server-ts-core/write";
13
+ import type { TokenStore } from "../token-store.js";
14
+ export interface DerivativesRouteDeps {
15
+ logger: Logger;
16
+ serverOrigin: string | (() => string);
17
+ serverOwner?: `0x${string}`;
18
+ gateway: GatewayClient;
19
+ devToken?: string;
20
+ accessToken?: string;
21
+ tokenStore?: TokenStore;
22
+ dataStorage?: DataStoragePort;
23
+ runtimeAvailability?: RuntimeAvailabilityPort;
24
+ /** Shared with the data routes so builder tokens work on both. */
25
+ writeSessionStore?: WriteSessionStore;
26
+ writeProofReplayStore?: WriteProofReplayStore;
27
+ /** The compute layer (store + scheduler). Absent = every route answers 503. */
28
+ compute?: PersonalServerDerivativesApiDeps["compute"];
29
+ now?: () => Date;
30
+ mountPath?: PersonalServerApiDispatchOptions["basePath"];
31
+ }
32
+ export declare function derivativesRoutes(deps: DerivativesRouteDeps): Hono;
33
+ //# sourceMappingURL=derivatives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derivatives.d.ts","sourceRoot":"","sources":["../../src/routes/derivatives.ts"],"names":[],"mappings":"AAAA;;;;GAIG;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,gCAAgC,EACtC,MAAM,mDAAmD,CAAC;AAC3D,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,2CAA2C,CAAC;AAClG,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACxB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,MAAM,WAAW,oBAAoB;IACnC,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,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,+EAA+E;IAC/E,OAAO,CAAC,EAAE,gCAAgC,CAAC,SAAS,CAAC,CAAC;IACtD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,gCAAgC,CAAC,UAAU,CAAC,CAAC;CAC1D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CA6BlE"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Derivative compute routes: /v1/derivatives/questions. Thin Hono wrapper
3
+ * over the runtime-agnostic core handler; builder auth is the Write API's
4
+ * (write-session token + signed proof), owner auth is the usual owner gate.
5
+ */
6
+ import { Hono } from "hono";
7
+ import { handlePersonalServerDerivativesRequest, MAX_QUESTION_BODY_BYTES, } from "@opendatalabs/personal-server-ts-core/derivatives";
8
+ import { createBodyLimit } from "../middleware/body-limit.js";
9
+ import { createServerApiAuth } from "../api-auth.js";
10
+ export function derivativesRoutes(deps) {
11
+ const app = new Hono();
12
+ const auth = createServerApiAuth({
13
+ serverOrigin: deps.serverOrigin,
14
+ serverOwner: deps.serverOwner,
15
+ gateway: deps.gateway,
16
+ devToken: deps.devToken,
17
+ accessToken: deps.accessToken,
18
+ tokenStore: deps.tokenStore,
19
+ dataStorage: deps.dataStorage,
20
+ runtimeAvailability: deps.runtimeAvailability,
21
+ writeSessionStore: deps.writeSessionStore,
22
+ writeProofReplayStore: deps.writeProofReplayStore,
23
+ });
24
+ app.use("*", createBodyLimit(MAX_QUESTION_BODY_BYTES));
25
+ app.all("*", (c) => handlePersonalServerDerivativesRequest(c.req.raw, {
26
+ auth,
27
+ compute: deps.compute ?? null,
28
+ now: deps.now,
29
+ logger: deps.logger,
30
+ }, { basePath: deps.mountPath }));
31
+ return app;
32
+ }
33
+ //# sourceMappingURL=derivatives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derivatives.js","sourceRoot":"","sources":["../../src/routes/derivatives.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EACL,sCAAsC,EACtC,uBAAuB,GAExB,MAAM,mDAAmD,CAAC;AAW3D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAqBrD,MAAM,UAAU,iBAAiB,CAAC,IAA0B;IAC1D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;QAC7C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;KAClD,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACvD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CACjB,sCAAsC,CACpC,CAAC,CAAC,GAAG,CAAC,GAAG,EACT;QACE,IAAI;QACJ,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;QAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAC7B,CACF,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Hono } from "hono";
2
+ import { type JobRequestEnvelope } from "@opendatalabs/vana-sdk/protocol/jobs";
3
+ import type { JobExecuteResponse } from "../jobs/types.js";
4
+ export interface EnclaveJobRouteDeps {
5
+ accessToken: string;
6
+ executeJob(envelope: JobRequestEnvelope): Promise<JobExecuteResponse>;
7
+ }
8
+ export declare function enclaveJobRoutes(deps: EnclaveJobRouteDeps): Hono;
9
+ //# sourceMappingURL=enclave-jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enclave-jobs.d.ts","sourceRoot":"","sources":["../../src/routes/enclave-jobs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAM1B,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACvE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CA0ChE"}
@@ -0,0 +1,104 @@
1
+ import { timingSafeEqual } from "node:crypto";
2
+ import { Hono } from "hono";
3
+ import { isAddress, isHex } from "viem";
4
+ import { JOB_OPERATIONS, JOB_PROTOCOL_VERSION, } from "@opendatalabs/vana-sdk/protocol/jobs";
5
+ import { createBodyLimit } from "../middleware/body-limit.js";
6
+ import { JobFailure } from "../jobs/worker.js";
7
+ const MAX_JOB_BODY_BYTES = 256 * 1024;
8
+ const BEARER_PREFIX = "Bearer ";
9
+ export function enclaveJobRoutes(deps) {
10
+ const app = new Hono();
11
+ app.use("/execute", createBodyLimit(MAX_JOB_BODY_BYTES));
12
+ app.post("/execute", async (context) => {
13
+ if (!hasValidBearer(context.req.header("authorization"), deps.accessToken)) {
14
+ return context.json(jobError("AUTH_INVALID", "invalid bearer token"), 401);
15
+ }
16
+ let body;
17
+ try {
18
+ body = await context.req.json();
19
+ }
20
+ catch {
21
+ return context.json({ error: { message: "invalid request body" } }, 400);
22
+ }
23
+ if (!isJobEnvelope(body)) {
24
+ return context.json({ error: { message: "invalid request body" } }, 400);
25
+ }
26
+ try {
27
+ return context.json(await deps.executeJob(body), 200);
28
+ }
29
+ catch (error) {
30
+ if (error instanceof JobFailure) {
31
+ return context.json(jobError(error.code, error.message, error.retryable), statusFor(error.code));
32
+ }
33
+ return context.json(jobError("INTERNAL", "job execution failed", true), 500);
34
+ }
35
+ });
36
+ return app;
37
+ }
38
+ function hasValidBearer(header, expected) {
39
+ if (!header?.startsWith(BEARER_PREFIX)) {
40
+ return false;
41
+ }
42
+ const received = Buffer.from(header.slice(BEARER_PREFIX.length));
43
+ const target = Buffer.from(expected);
44
+ if (received.length !== target.length) {
45
+ return false;
46
+ }
47
+ return timingSafeEqual(received, target);
48
+ }
49
+ function isJobEnvelope(value) {
50
+ if (!isRecord(value) || !isRecord(value.request)) {
51
+ return false;
52
+ }
53
+ const request = value.request;
54
+ return (value.auth !== "" &&
55
+ typeof value.auth === "string" &&
56
+ request.v === JOB_PROTOCOL_VERSION &&
57
+ typeof request.jobId === "string" &&
58
+ isAddressValue(request.owner) &&
59
+ isAddressValue(request.builder) &&
60
+ isHexValue(request.builderPublicKey) &&
61
+ isHexValue(request.grantId) &&
62
+ typeof request.scope === "string" &&
63
+ JOB_OPERATIONS.some((operation) => operation === request.operation) &&
64
+ (request.pinnedVersion === null ||
65
+ typeof request.pinnedVersion === "string") &&
66
+ typeof request.deadline === "string");
67
+ }
68
+ function isAddressValue(value) {
69
+ return typeof value === "string" && isAddress(value);
70
+ }
71
+ function isHexValue(value) {
72
+ return typeof value === "string" && isHex(value);
73
+ }
74
+ function isRecord(value) {
75
+ return typeof value === "object" && value !== null;
76
+ }
77
+ function jobError(code, message, retryable = false) {
78
+ return { error: { code, message, retryable } };
79
+ }
80
+ function statusFor(code) {
81
+ switch (code) {
82
+ case "AUTH_INVALID":
83
+ return 401;
84
+ case "BUILDER_MISMATCH":
85
+ case "OWNER_MISMATCH":
86
+ case "GRANT_REVOKED":
87
+ case "GRANT_INVALID":
88
+ case "SIGNED_ARTIFACT_MISSING":
89
+ case "SIGNED_ARTIFACT_INVALID":
90
+ case "SERVER_NOT_REGISTERED":
91
+ return 403;
92
+ case "SCOPE_NOT_FOUND":
93
+ return 404;
94
+ case "VERSION_MISMATCH":
95
+ return 409;
96
+ case "DEADLINE_PASSED":
97
+ return 410;
98
+ case "RESULT_TOO_LARGE":
99
+ return 413;
100
+ case "INTERNAL":
101
+ return 500;
102
+ }
103
+ }
104
+ //# sourceMappingURL=enclave-jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enclave-jobs.js","sourceRoot":"","sources":["../../src/routes/enclave-jobs.ts"],"names":[],"mappings":"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"}
@@ -19,12 +19,13 @@
19
19
  import { Hono } from "hono";
20
20
  import type { Logger } from "pino";
21
21
  import type { DataPortabilityGatewayConfig, GatewayClient } from "@opendatalabs/vana-sdk/node";
22
- import { buildMcpUrl, buildStableMcpUrl, type McpConnectionStore, type McpOAuthAuthorizationStore, type McpActivityRecorder } from "@opendatalabs/personal-server-ts-core/mcp";
22
+ import { buildMcpUrl, buildStableMcpUrl, type McpProofReplayStore, type McpConnectionStore, type McpSessionStore, type McpOAuthAuthorizationStore, type McpActivityRecorder } from "@opendatalabs/personal-server-ts-core/mcp";
23
+ import type { PersonalServerReadFulfillmentReporter } from "@opendatalabs/personal-server-ts-core/api";
23
24
  import type { AccessLogWriter } from "@opendatalabs/personal-server-ts-core/logging/access-log";
24
25
  import type { ServerSigner } from "@opendatalabs/personal-server-ts-core/signing";
25
26
  import type { HierarchyManagerOptions } from "@opendatalabs/personal-server-ts-core/storage/hierarchy";
26
27
  import type { IndexManager } from "@opendatalabs/personal-server-ts-core/storage/index";
27
- import type { DataStoragePort, FeeVerifierPort, RuntimeAvailabilityPort } from "@opendatalabs/personal-server-ts-core/ports";
28
+ import type { DataStoragePort, RuntimeAvailabilityPort } from "@opendatalabs/personal-server-ts-core/ports";
28
29
  import type { TokenStore } from "../token-store.js";
29
30
  export interface McpRouteDeps {
30
31
  logger: Logger;
@@ -36,22 +37,40 @@ export interface McpRouteDeps {
36
37
  */
37
38
  serverOrigin: string | (() => string);
38
39
  serverOwner?: `0x${string}`;
39
- serverSigner?: Pick<ServerSigner, "signGrantRegistration">;
40
+ /** The server's own account address — required for x402 payment settlement. */
41
+ serverAddress?: `0x${string}`;
42
+ serverSigner?: Pick<ServerSigner, "signGrantRegistration" | "signRecordDataAccess">;
40
43
  gateway: GatewayClient;
41
44
  gatewayConfig?: (DataPortabilityGatewayConfig & {
42
45
  url?: string;
43
46
  }) | null;
47
+ /**
48
+ * Enables x402 pay-per-read for self-signing (chatbot) MCP sessions only.
49
+ * The owner/OAuth connection path is always free regardless of this flag.
50
+ */
51
+ paymentEnabled?: boolean;
44
52
  devToken?: string;
45
53
  accessToken?: string;
46
54
  tokenStore?: TokenStore;
47
55
  accessLogWriter: AccessLogWriter;
56
+ readFulfillmentReporter?: PersonalServerReadFulfillmentReporter;
48
57
  indexManager?: IndexManager;
49
58
  hierarchyOptions?: HierarchyManagerOptions;
50
59
  dataStorage?: DataStoragePort;
51
- feeVerifier?: FeeVerifierPort;
52
60
  runtimeAvailability?: RuntimeAvailabilityPort;
53
61
  /** Per-process connection store. Defaults to in-memory. */
54
62
  connectionStore?: McpConnectionStore;
63
+ /**
64
+ * Per-process store for self-signing chatbot MCP sessions (Option A).
65
+ * Defaults to in-memory. Shared within `mcpStreamableHttpRoutes` between the
66
+ * `/mcp/session` handshake and the `/mcp` reads.
67
+ */
68
+ sessionStore?: McpSessionStore;
69
+ /**
70
+ * Per-process replay guard for `/mcp/session` handshake proofs. Defaults to
71
+ * in-memory. Rejects reuse of a still-valid Web3Signed proof.
72
+ */
73
+ proofReplayStore?: McpProofReplayStore;
55
74
  /**
56
75
  * OAuth authorization store shared by `/mcp/oauth/authorize`,
57
76
  * `/mcp/oauth/token`, and the owner approval endpoint.
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/routes/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EACV,4BAA4B,EAC5B,aAAa,EACd,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAKL,WAAW,EACX,iBAAiB,EAkBjB,KAAK,kBAAkB,EACvB,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACzB,MAAM,2CAA2C,CAAC;AAOnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC;AACvG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qDAAqD,CAAC;AACxF,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,uBAAuB,EACxB,MAAM,6CAA6C,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,YAAY,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;IAC3D,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,4BAA4B,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C,2DAA2D;IAC3D,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC;;;OAGG;IACH,uBAAuB,CAAC,EAAE,0BAA0B,CAAC;IACrD,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IACvC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;CAC5C;AAuID;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAqG7D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAgTvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAoFhE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAkC1D;AAED,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/routes/mcp.ts"],"names":[],"mappings":"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"}