@opendatalabs/personal-server-ts-core 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 (322) hide show
  1. package/dist/api/index.d.ts +282 -9
  2. package/dist/api/index.d.ts.map +1 -1
  3. package/dist/api/index.js +867 -163
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/auth/request.d.ts.map +1 -1
  6. package/dist/auth/request.js.map +1 -1
  7. package/dist/client.d.ts +8 -1
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +21 -3
  10. package/dist/client.js.map +1 -1
  11. package/dist/contracts/binary.d.ts +12 -0
  12. package/dist/contracts/binary.d.ts.map +1 -1
  13. package/dist/contracts/binary.js +31 -0
  14. package/dist/contracts/binary.js.map +1 -1
  15. package/dist/contracts/data.d.ts +51 -5
  16. package/dist/contracts/data.d.ts.map +1 -1
  17. package/dist/contracts/data.js +166 -30
  18. package/dist/contracts/data.js.map +1 -1
  19. package/dist/contracts/grants.d.ts +7 -5
  20. package/dist/contracts/grants.d.ts.map +1 -1
  21. package/dist/contracts/grants.js +60 -37
  22. package/dist/contracts/grants.js.map +1 -1
  23. package/dist/contracts/index.d.ts +1 -1
  24. package/dist/contracts/index.d.ts.map +1 -1
  25. package/dist/contracts/index.js +1 -1
  26. package/dist/contracts/index.js.map +1 -1
  27. package/dist/derivatives/api.d.ts +48 -0
  28. package/dist/derivatives/api.d.ts.map +1 -0
  29. package/dist/derivatives/api.js +366 -0
  30. package/dist/derivatives/api.js.map +1 -0
  31. package/dist/derivatives/compute.d.ts +106 -0
  32. package/dist/derivatives/compute.d.ts.map +1 -0
  33. package/dist/derivatives/compute.js +414 -0
  34. package/dist/derivatives/compute.js.map +1 -0
  35. package/dist/derivatives/e2ee/aad.d.ts +22 -0
  36. package/dist/derivatives/e2ee/aad.d.ts.map +1 -0
  37. package/dist/derivatives/e2ee/aad.js +32 -0
  38. package/dist/derivatives/e2ee/aad.js.map +1 -0
  39. package/dist/derivatives/e2ee/attestation.d.ts +134 -0
  40. package/dist/derivatives/e2ee/attestation.d.ts.map +1 -0
  41. package/dist/derivatives/e2ee/attestation.js +248 -0
  42. package/dist/derivatives/e2ee/attestation.js.map +1 -0
  43. package/dist/derivatives/e2ee/index.d.ts +6 -0
  44. package/dist/derivatives/e2ee/index.d.ts.map +1 -0
  45. package/dist/derivatives/e2ee/index.js +6 -0
  46. package/dist/derivatives/e2ee/index.js.map +1 -0
  47. package/dist/derivatives/e2ee/jcs.d.ts +17 -0
  48. package/dist/derivatives/e2ee/jcs.d.ts.map +1 -0
  49. package/dist/derivatives/e2ee/jcs.js +55 -0
  50. package/dist/derivatives/e2ee/jcs.js.map +1 -0
  51. package/dist/derivatives/e2ee/phala.d.ts +62 -0
  52. package/dist/derivatives/e2ee/phala.d.ts.map +1 -0
  53. package/dist/derivatives/e2ee/phala.js +168 -0
  54. package/dist/derivatives/e2ee/phala.js.map +1 -0
  55. package/dist/derivatives/e2ee/suite.d.ts +56 -0
  56. package/dist/derivatives/e2ee/suite.d.ts.map +1 -0
  57. package/dist/derivatives/e2ee/suite.js +164 -0
  58. package/dist/derivatives/e2ee/suite.js.map +1 -0
  59. package/dist/derivatives/index.d.ts +10 -0
  60. package/dist/derivatives/index.d.ts.map +1 -0
  61. package/dist/derivatives/index.js +10 -0
  62. package/dist/derivatives/index.js.map +1 -0
  63. package/dist/derivatives/inference.d.ts +151 -0
  64. package/dist/derivatives/inference.d.ts.map +1 -0
  65. package/dist/derivatives/inference.js +262 -0
  66. package/dist/derivatives/inference.js.map +1 -0
  67. package/dist/derivatives/prompt.d.ts +64 -0
  68. package/dist/derivatives/prompt.d.ts.map +1 -0
  69. package/dist/derivatives/prompt.js +193 -0
  70. package/dist/derivatives/prompt.js.map +1 -0
  71. package/dist/derivatives/registration.d.ts +54 -0
  72. package/dist/derivatives/registration.d.ts.map +1 -0
  73. package/dist/derivatives/registration.js +180 -0
  74. package/dist/derivatives/registration.js.map +1 -0
  75. package/dist/derivatives/scheduler.d.ts +84 -0
  76. package/dist/derivatives/scheduler.d.ts.map +1 -0
  77. package/dist/derivatives/scheduler.js +257 -0
  78. package/dist/derivatives/scheduler.js.map +1 -0
  79. package/dist/derivatives/store.d.ts +14 -0
  80. package/dist/derivatives/store.d.ts.map +1 -0
  81. package/dist/derivatives/store.js +77 -0
  82. package/dist/derivatives/store.js.map +1 -0
  83. package/dist/derivatives/types.d.ts +92 -0
  84. package/dist/derivatives/types.d.ts.map +1 -0
  85. package/dist/derivatives/types.js +27 -0
  86. package/dist/derivatives/types.js.map +1 -0
  87. package/dist/errors/catalog.d.ts +75 -0
  88. package/dist/errors/catalog.d.ts.map +1 -1
  89. package/dist/errors/catalog.js +104 -0
  90. package/dist/errors/catalog.js.map +1 -1
  91. package/dist/grants/index.d.ts +2 -1
  92. package/dist/grants/index.d.ts.map +1 -1
  93. package/dist/grants/index.js +1 -1
  94. package/dist/grants/index.js.map +1 -1
  95. package/dist/keys/index.d.ts +1 -0
  96. package/dist/keys/index.d.ts.map +1 -1
  97. package/dist/keys/index.js +1 -1
  98. package/dist/keys/index.js.map +1 -1
  99. package/dist/keys/public-only-account.d.ts +8 -0
  100. package/dist/keys/public-only-account.d.ts.map +1 -0
  101. package/dist/keys/public-only-account.js +21 -0
  102. package/dist/keys/public-only-account.js.map +1 -0
  103. package/dist/keys/server-account.d.ts +2 -2
  104. package/dist/keys/server-account.d.ts.map +1 -1
  105. package/dist/lineage/attestation.d.ts +42 -0
  106. package/dist/lineage/attestation.d.ts.map +1 -0
  107. package/dist/lineage/attestation.js +25 -0
  108. package/dist/lineage/attestation.js.map +1 -0
  109. package/dist/lineage/gateway.d.ts +105 -0
  110. package/dist/lineage/gateway.d.ts.map +1 -0
  111. package/dist/lineage/gateway.js +242 -0
  112. package/dist/lineage/gateway.js.map +1 -0
  113. package/dist/lineage/index.d.ts +5 -0
  114. package/dist/lineage/index.d.ts.map +1 -0
  115. package/dist/lineage/index.js +5 -0
  116. package/dist/lineage/index.js.map +1 -0
  117. package/dist/lineage/lineage.d.ts +141 -0
  118. package/dist/lineage/lineage.d.ts.map +1 -0
  119. package/dist/lineage/lineage.js +255 -0
  120. package/dist/lineage/lineage.js.map +1 -0
  121. package/dist/logging/access-log.d.ts +10 -1
  122. package/dist/logging/access-log.d.ts.map +1 -1
  123. package/dist/mcp/activity.d.ts.map +1 -1
  124. package/dist/mcp/activity.js.map +1 -1
  125. package/dist/mcp/connection-api.d.ts.map +1 -1
  126. package/dist/mcp/connection-api.js +0 -1
  127. package/dist/mcp/connection-api.js.map +1 -1
  128. package/dist/mcp/index.d.ts +1 -0
  129. package/dist/mcp/index.d.ts.map +1 -1
  130. package/dist/mcp/index.js +1 -0
  131. package/dist/mcp/index.js.map +1 -1
  132. package/dist/mcp/read-client.d.ts +61 -1
  133. package/dist/mcp/read-client.d.ts.map +1 -1
  134. package/dist/mcp/read-client.js +397 -42
  135. package/dist/mcp/read-client.js.map +1 -1
  136. package/dist/mcp/resources.d.ts +37 -0
  137. package/dist/mcp/resources.d.ts.map +1 -0
  138. package/dist/mcp/resources.js +114 -0
  139. package/dist/mcp/resources.js.map +1 -0
  140. package/dist/mcp/search/index.d.ts.map +1 -1
  141. package/dist/mcp/search/index.js +108 -21
  142. package/dist/mcp/search/index.js.map +1 -1
  143. package/dist/mcp/server.d.ts.map +1 -1
  144. package/dist/mcp/server.js +27 -9
  145. package/dist/mcp/server.js.map +1 -1
  146. package/dist/mcp/session.d.ts +160 -0
  147. package/dist/mcp/session.d.ts.map +1 -0
  148. package/dist/mcp/session.js +243 -0
  149. package/dist/mcp/session.js.map +1 -0
  150. package/dist/mcp/tools.d.ts +29 -3
  151. package/dist/mcp/tools.d.ts.map +1 -1
  152. package/dist/mcp/tools.js +515 -48
  153. package/dist/mcp/tools.js.map +1 -1
  154. package/dist/mcp/types.d.ts.map +1 -1
  155. package/dist/payment/index.d.ts +2 -0
  156. package/dist/payment/index.d.ts.map +1 -0
  157. package/dist/payment/index.js +2 -0
  158. package/dist/payment/index.js.map +1 -0
  159. package/dist/payment/x402.d.ts +155 -0
  160. package/dist/payment/x402.d.ts.map +1 -0
  161. package/dist/payment/x402.js +402 -0
  162. package/dist/payment/x402.js.map +1 -0
  163. package/dist/policy/data-read.d.ts +18 -2
  164. package/dist/policy/data-read.d.ts.map +1 -1
  165. package/dist/policy/data-read.js +80 -49
  166. package/dist/policy/data-read.js.map +1 -1
  167. package/dist/policy/data-write.d.ts +69 -0
  168. package/dist/policy/data-write.d.ts.map +1 -0
  169. package/dist/policy/data-write.js +131 -0
  170. package/dist/policy/data-write.js.map +1 -0
  171. package/dist/policy/index.d.ts +3 -1
  172. package/dist/policy/index.d.ts.map +1 -1
  173. package/dist/policy/index.js +3 -1
  174. package/dist/policy/index.js.map +1 -1
  175. package/dist/policy/signed-artifacts.d.ts +17 -0
  176. package/dist/policy/signed-artifacts.d.ts.map +1 -0
  177. package/dist/policy/signed-artifacts.js +110 -0
  178. package/dist/policy/signed-artifacts.js.map +1 -0
  179. package/dist/ports/index.d.ts +159 -32
  180. package/dist/ports/index.d.ts.map +1 -1
  181. package/dist/ports/index.js +6 -5
  182. package/dist/ports/index.js.map +1 -1
  183. package/dist/schemas/server-config.d.ts +49 -4
  184. package/dist/schemas/server-config.d.ts.map +1 -1
  185. package/dist/schemas/server-config.js +95 -13
  186. package/dist/schemas/server-config.js.map +1 -1
  187. package/dist/signing/index.d.ts +2 -2
  188. package/dist/signing/index.d.ts.map +1 -1
  189. package/dist/signing/index.js +1 -1
  190. package/dist/signing/index.js.map +1 -1
  191. package/dist/signing/request-signer.d.ts +2 -0
  192. package/dist/signing/request-signer.d.ts.map +1 -1
  193. package/dist/signing/request-signer.js +1 -0
  194. package/dist/signing/request-signer.js.map +1 -1
  195. package/dist/signing/signer.d.ts +27 -25
  196. package/dist/signing/signer.d.ts.map +1 -1
  197. package/dist/signing/signer.js +27 -51
  198. package/dist/signing/signer.js.map +1 -1
  199. package/dist/storage/adapters/index.d.ts +1 -1
  200. package/dist/storage/adapters/index.d.ts.map +1 -1
  201. package/dist/storage/adapters/index.js +1 -1
  202. package/dist/storage/adapters/index.js.map +1 -1
  203. package/dist/storage/adapters/interface.d.ts +10 -0
  204. package/dist/storage/adapters/interface.d.ts.map +1 -1
  205. package/dist/storage/adapters/sdk.d.ts +11 -1
  206. package/dist/storage/adapters/sdk.d.ts.map +1 -1
  207. package/dist/storage/adapters/sdk.js +38 -3
  208. package/dist/storage/adapters/sdk.js.map +1 -1
  209. package/dist/storage/adapters/vana.d.ts +3 -0
  210. package/dist/storage/adapters/vana.d.ts.map +1 -1
  211. package/dist/storage/adapters/vana.js +95 -2
  212. package/dist/storage/adapters/vana.js.map +1 -1
  213. package/dist/storage/blocks/errors.d.ts.map +1 -1
  214. package/dist/storage/blocks/errors.js.map +1 -1
  215. package/dist/storage/blocks/index.d.ts +2 -0
  216. package/dist/storage/blocks/index.d.ts.map +1 -1
  217. package/dist/storage/blocks/index.js +2 -0
  218. package/dist/storage/blocks/index.js.map +1 -1
  219. package/dist/storage/blocks/select.d.ts +29 -0
  220. package/dist/storage/blocks/select.d.ts.map +1 -0
  221. package/dist/storage/blocks/select.js +120 -0
  222. package/dist/storage/blocks/select.js.map +1 -0
  223. package/dist/storage/blocks/types.d.ts +7 -0
  224. package/dist/storage/blocks/types.d.ts.map +1 -1
  225. package/dist/storage/index/manager.d.ts +30 -2
  226. package/dist/storage/index/manager.d.ts.map +1 -1
  227. package/dist/storage/index/schema.d.ts +1 -1
  228. package/dist/storage/index/schema.js +1 -1
  229. package/dist/storage/index/types.d.ts +6 -1
  230. package/dist/storage/index/types.d.ts.map +1 -1
  231. package/dist/sync/data-point-feed.d.ts +35 -0
  232. package/dist/sync/data-point-feed.d.ts.map +1 -0
  233. package/dist/sync/data-point-feed.js +122 -0
  234. package/dist/sync/data-point-feed.js.map +1 -0
  235. package/dist/sync/data-point-id.d.ts +7 -0
  236. package/dist/sync/data-point-id.d.ts.map +1 -0
  237. package/dist/sync/data-point-id.js +16 -0
  238. package/dist/sync/data-point-id.js.map +1 -0
  239. package/dist/sync/delete-data-port.d.ts +50 -0
  240. package/dist/sync/delete-data-port.d.ts.map +1 -0
  241. package/dist/sync/delete-data-port.js +244 -0
  242. package/dist/sync/delete-data-port.js.map +1 -0
  243. package/dist/sync/engine/sync-manager.d.ts +16 -4
  244. package/dist/sync/engine/sync-manager.d.ts.map +1 -1
  245. package/dist/sync/engine/sync-manager.js +93 -32
  246. package/dist/sync/engine/sync-manager.js.map +1 -1
  247. package/dist/sync/index.d.ts +7 -0
  248. package/dist/sync/index.d.ts.map +1 -1
  249. package/dist/sync/index.js +7 -0
  250. package/dist/sync/index.js.map +1 -1
  251. package/dist/sync/issues.d.ts.map +1 -1
  252. package/dist/sync/issues.js +21 -3
  253. package/dist/sync/issues.js.map +1 -1
  254. package/dist/sync/pending-blob-deletions.d.ts +29 -0
  255. package/dist/sync/pending-blob-deletions.d.ts.map +1 -0
  256. package/dist/sync/pending-blob-deletions.js +116 -0
  257. package/dist/sync/pending-blob-deletions.js.map +1 -0
  258. package/dist/sync/retry-memory.d.ts +33 -0
  259. package/dist/sync/retry-memory.d.ts.map +1 -0
  260. package/dist/sync/retry-memory.js +68 -0
  261. package/dist/sync/retry-memory.js.map +1 -0
  262. package/dist/sync/scope-deletions.d.ts +155 -0
  263. package/dist/sync/scope-deletions.d.ts.map +1 -0
  264. package/dist/sync/scope-deletions.js +225 -0
  265. package/dist/sync/scope-deletions.js.map +1 -0
  266. package/dist/sync/tombstone.d.ts +27 -0
  267. package/dist/sync/tombstone.d.ts.map +1 -0
  268. package/dist/sync/tombstone.js +28 -0
  269. package/dist/sync/tombstone.js.map +1 -0
  270. package/dist/sync/workers/delete.d.ts +152 -31
  271. package/dist/sync/workers/delete.d.ts.map +1 -1
  272. package/dist/sync/workers/delete.js +457 -55
  273. package/dist/sync/workers/delete.js.map +1 -1
  274. package/dist/sync/workers/download.d.ts +108 -27
  275. package/dist/sync/workers/download.d.ts.map +1 -1
  276. package/dist/sync/workers/download.js +321 -126
  277. package/dist/sync/workers/download.js.map +1 -1
  278. package/dist/sync/workers/upload.d.ts +65 -10
  279. package/dist/sync/workers/upload.d.ts.map +1 -1
  280. package/dist/sync/workers/upload.js +371 -42
  281. package/dist/sync/workers/upload.js.map +1 -1
  282. package/dist/test-utils/e2ee-fixtures.d.ts +94 -0
  283. package/dist/test-utils/e2ee-fixtures.d.ts.map +1 -0
  284. package/dist/test-utils/e2ee-fixtures.js +116 -0
  285. package/dist/test-utils/e2ee-fixtures.js.map +1 -0
  286. package/dist/test-utils/e2ee-gateway.d.ts +61 -0
  287. package/dist/test-utils/e2ee-gateway.d.ts.map +1 -0
  288. package/dist/test-utils/e2ee-gateway.js +248 -0
  289. package/dist/test-utils/e2ee-gateway.js.map +1 -0
  290. package/dist/test-utils/index.d.ts +3 -0
  291. package/dist/test-utils/index.d.ts.map +1 -1
  292. package/dist/test-utils/index.js +3 -0
  293. package/dist/test-utils/index.js.map +1 -1
  294. package/dist/test-utils/memory-storage.d.ts +12 -0
  295. package/dist/test-utils/memory-storage.d.ts.map +1 -0
  296. package/dist/test-utils/memory-storage.js +146 -0
  297. package/dist/test-utils/memory-storage.js.map +1 -0
  298. package/dist/test-utils/wallet.d.ts +6 -0
  299. package/dist/test-utils/wallet.d.ts.map +1 -1
  300. package/dist/test-utils/wallet.js +46 -0
  301. package/dist/test-utils/wallet.js.map +1 -1
  302. package/dist/write/attribution.d.ts +185 -0
  303. package/dist/write/attribution.d.ts.map +1 -0
  304. package/dist/write/attribution.js +450 -0
  305. package/dist/write/attribution.js.map +1 -0
  306. package/dist/write/authorize.d.ts +77 -0
  307. package/dist/write/authorize.d.ts.map +1 -0
  308. package/dist/write/authorize.js +109 -0
  309. package/dist/write/authorize.js.map +1 -0
  310. package/dist/write/index.d.ts +5 -0
  311. package/dist/write/index.d.ts.map +1 -0
  312. package/dist/write/index.js +5 -0
  313. package/dist/write/index.js.map +1 -0
  314. package/dist/write/route.d.ts +61 -0
  315. package/dist/write/route.d.ts.map +1 -0
  316. package/dist/write/route.js +132 -0
  317. package/dist/write/route.js.map +1 -0
  318. package/dist/write/session.d.ts +96 -0
  319. package/dist/write/session.d.ts.map +1 -0
  320. package/dist/write/session.js +136 -0
  321. package/dist/write/session.js.map +1 -0
  322. package/package.json +19 -3
@@ -0,0 +1,48 @@
1
+ /**
2
+ * HTTP surface of the compute layer, mounted under `/v1/derivatives`:
3
+ *
4
+ * POST /questions register (builder write auth or owner)
5
+ * GET /questions list (owner; builder with ?derivedScope=)
6
+ * GET /questions/:id status (owner or the registering builder)
7
+ * POST /questions/:id/recompute owner or the registering builder
8
+ * DELETE /questions/:id owner or the registering builder
9
+ *
10
+ * Builder authentication is the Write API's: a write-session bearer token
11
+ * plus the X-Vana-Write-Signature proof over the request, authorized for
12
+ * `write:<derivedScope>` (api-auth authorizeWrite). No new credential.
13
+ *
14
+ * The proof signs the request URI INCLUDING its query string (see
15
+ * canonicalSignedUri in write/attribution.ts), because on the list route the
16
+ * query decides the authorization: `?derivedScope=X` is the scope the caller
17
+ * is authorized against, and a proof that did not commit to it could be
18
+ * captured on one scope and replayed on another.
19
+ */
20
+ import type { PersonalServerApiAuthPort, PersonalServerApiDispatchOptions } from "../api/index.js";
21
+ import type { RecomputeScheduler } from "./scheduler.js";
22
+ import { type QuestionStore } from "./types.js";
23
+ /** Registration bodies are small; anything larger is refused up front. */
24
+ export declare const MAX_QUESTION_BODY_BYTES: number;
25
+ export interface PersonalServerDerivativesApiDeps {
26
+ auth: Pick<PersonalServerApiAuthPort, "authorizeOwner" | "authorizeWrite" | "authorizeWriteSession" | "authorizeBuilderRead">;
27
+ /** Absent = the compute layer is not wired; every route answers 503. */
28
+ compute?: {
29
+ store: QuestionStore;
30
+ scheduler: Pick<RecomputeScheduler, "requestRecompute" | "markSourceChanged"> & {
31
+ /**
32
+ * Next scheduled automatic retry of a failed question (ISO time), or
33
+ * null. Optional so a minimal scheduler stays a valid dependency; the
34
+ * status route then reports no retry.
35
+ */
36
+ nextRetryAt?(questionId: string): string | null;
37
+ /** True while a retry compute is running (timer fired, not settled). */
38
+ retryInFlight?(questionId: string): boolean;
39
+ };
40
+ } | null;
41
+ now?: () => Date;
42
+ createQuestionId?: () => string;
43
+ logger?: {
44
+ info?(payload: Record<string, unknown>, message: string): void;
45
+ };
46
+ }
47
+ export declare function handlePersonalServerDerivativesRequest(request: Request, deps: PersonalServerDerivativesApiDeps, options?: PersonalServerApiDispatchOptions): Promise<Response>;
48
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/derivatives/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAaH,OAAO,KAAK,EACV,yBAAyB,EACzB,gCAAgC,EAGjC,MAAM,iBAAiB,CAAC;AAMzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAEpB,0EAA0E;AAC1E,eAAO,MAAM,uBAAuB,QAAY,CAAC;AAKjD,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,IAAI,CACR,yBAAyB,EACvB,gBAAgB,GAChB,gBAAgB,GAChB,uBAAuB,GACvB,sBAAsB,CACzB,CAAC;IACF,wEAAwE;IACxE,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,aAAa,CAAC;QACrB,SAAS,EAAE,IAAI,CACb,kBAAkB,EAClB,kBAAkB,GAAG,mBAAmB,CACzC,GAAG;YACF;;;;eAIG;YACH,WAAW,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;YAChD,wEAAwE;YACxE,aAAa,CAAC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;SAC7C,CAAC;KACH,GAAG,IAAI,CAAC;IACT,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAChE,CAAC;CACH;AAuOD,wBAAsB,sCAAsC,CAC1D,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,gCAAgC,EACtC,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,QAAQ,CAAC,CAqMnB"}
@@ -0,0 +1,366 @@
1
+ /**
2
+ * HTTP surface of the compute layer, mounted under `/v1/derivatives`:
3
+ *
4
+ * POST /questions register (builder write auth or owner)
5
+ * GET /questions list (owner; builder with ?derivedScope=)
6
+ * GET /questions/:id status (owner or the registering builder)
7
+ * POST /questions/:id/recompute owner or the registering builder
8
+ * DELETE /questions/:id owner or the registering builder
9
+ *
10
+ * Builder authentication is the Write API's: a write-session bearer token
11
+ * plus the X-Vana-Write-Signature proof over the request, authorized for
12
+ * `write:<derivedScope>` (api-auth authorizeWrite). No new credential.
13
+ *
14
+ * The proof signs the request URI INCLUDING its query string (see
15
+ * canonicalSignedUri in write/attribution.ts), because on the list route the
16
+ * query decides the authorization: `?derivedScope=X` is the scope the caller
17
+ * is authorized against, and a proof that did not commit to it could be
18
+ * captured on one scope and replayed on another.
19
+ */
20
+ import { ContentTooLargeError, DerivativeComputeUnavailableError, DerivativeDerivedScopeRequiredError, DerivativeQuestionNotFoundError, DerivativeSourceNotGrantedError, ProtocolError, } from "../errors/catalog.js";
21
+ import { parseJsonObjectBody } from "../contracts/http.js";
22
+ import { parseDataScopeContract } from "../contracts/data.js";
23
+ import { selectedGrantId } from "../api/index.js";
24
+ import { createQuestionRegistration, parseQuestionInput, uncoveredSourceScopes, } from "./registration.js";
25
+ import { questionRegistrationView, } from "./types.js";
26
+ /** Registration bodies are small; anything larger is refused up front. */
27
+ export const MAX_QUESTION_BODY_BYTES = 16 * 1024;
28
+ /** Poll hint served while a retry compute is in flight (no scheduled time). */
29
+ const RETRY_IN_FLIGHT_POLL_SECONDS = 5;
30
+ function jsonResponse(body, init) {
31
+ const headers = new Headers(init?.headers);
32
+ headers.set("Content-Type", "application/json");
33
+ return new Response(JSON.stringify(body), { ...init, headers });
34
+ }
35
+ function errorResponse(status, errorCode, message) {
36
+ return jsonResponse({ error: { code: status, errorCode, message } }, { status });
37
+ }
38
+ function stripBasePath(pathname, basePath) {
39
+ if (!basePath || basePath === "/")
40
+ return pathname;
41
+ if (pathname === basePath)
42
+ return "/";
43
+ if (pathname.startsWith(`${basePath}/`))
44
+ return pathname.slice(basePath.length);
45
+ return pathname;
46
+ }
47
+ /**
48
+ * Authorize as the owner or, through the write-session path, as a builder
49
+ * holding `write:<scope>`. Returns the builder result or undefined (owner).
50
+ */
51
+ async function authorizeOwnerOrWriter(deps, request, scope) {
52
+ if (deps.auth.authorizeWrite) {
53
+ return (await deps.auth.authorizeWrite({ request, scope })) ?? undefined;
54
+ }
55
+ await deps.auth.authorizeOwner(request);
56
+ return undefined;
57
+ }
58
+ function sameBuilder(a, b) {
59
+ return a.toLowerCase() === b.toLowerCase();
60
+ }
61
+ /**
62
+ * Is this a builder call at all? Identity only (no scope is authorized), for
63
+ * the two answers that have no scope to authorize against: an unknown
64
+ * question id and a list call with no `?derivedScope=`. Nothing is disclosed
65
+ * either way, and the caller's proof is handed straight back — the request
66
+ * ends in an error, so it must not burn the proof.
67
+ */
68
+ async function recognizeWriteSession(deps, request) {
69
+ if (!deps.auth.authorizeWriteSession)
70
+ return undefined;
71
+ const session = (await deps.auth.authorizeWriteSession(request)) ?? undefined;
72
+ await session?.releaseProof?.();
73
+ return session;
74
+ }
75
+ /**
76
+ * The registration a caller may act on, or a 404 for everyone who may not:
77
+ * the owner sees every registration; a builder sees the ones it registered.
78
+ * An id the store does not hold is 404 for any authenticated caller (a
79
+ * builder holding a live write session, or the owner) and 401 for everyone
80
+ * else, so a builder learns nothing from probing ids that it could not learn
81
+ * from probing another builder's ids, which already answers 404.
82
+ */
83
+ async function loadForCaller(deps, request, store, questionId) {
84
+ const registration = await store.get(questionId);
85
+ if (!registration) {
86
+ // No registration means no derived scope to authorize a builder against,
87
+ // so fall back to identity: a live write session is enough to be told
88
+ // 404. Without it the owner gate decides (and answers 401).
89
+ if (!(await recognizeWriteSession(deps, request))) {
90
+ await deps.auth.authorizeOwner(request);
91
+ }
92
+ throw new DerivativeQuestionNotFoundError({ questionId });
93
+ }
94
+ const writer = await authorizeOwnerOrWriter(deps, request, registration.derivedScope);
95
+ if (writer) {
96
+ const by = registration.registeredBy;
97
+ if (by.kind !== "builder" || !sameBuilder(by.builder, writer.builder)) {
98
+ await writer.releaseProof?.();
99
+ throw new DerivativeQuestionNotFoundError({ questionId });
100
+ }
101
+ }
102
+ return { registration, writer };
103
+ }
104
+ /**
105
+ * `GET /v1/derivatives/status?derivedScope=<scope>`: the lifecycle of the
106
+ * question behind a derived scope, for the party that will READ the answer.
107
+ *
108
+ * Authorization is the data read's (`authorizeBuilderRead`, i.e. a live
109
+ * grant covering the derived scope, or the owner) — deliberately NOT the
110
+ * write-session path, because a consent-flow reader holds only a bare read
111
+ * entry and can never open a write session. Nothing is served and nothing
112
+ * is charged: this is authorization only, no x402 challenge and no
113
+ * RECORD_DATA_ACCESS receipt, the same bar as the lineage read.
114
+ *
115
+ * The view is deliberately narrow: lifecycle only. The question text, the
116
+ * source scopes, the question id, the registrar and the raw error string
117
+ * stay owner-only — `errorCode` is a closed vocabulary precisely so a
118
+ * stored error like "source scope X is deleted" cannot leak a scope name.
119
+ * One class needs the same care as the raw string: `grant_invalid` arises
120
+ * only from a builder-registered question, so a third-party reader gets
121
+ * `internal` instead of learning who registered.
122
+ * Auth runs before the store lookup, so an uncovered caller cannot probe
123
+ * which scopes have questions behind them.
124
+ *
125
+ * Like every Web3Signed read (data, lineage), the signature covers the
126
+ * path, not the query; per-scope authorization is enforced live against
127
+ * the caller's grant on each request.
128
+ */
129
+ async function handleStatusRoute(request, url, deps, store, scheduler, now) {
130
+ if (request.method !== "GET") {
131
+ return errorResponse(405, "METHOD_NOT_ALLOWED", "Method not allowed");
132
+ }
133
+ const derivedScopeParam = url.searchParams.get("derivedScope");
134
+ if (!derivedScopeParam) {
135
+ throw new DerivativeDerivedScopeRequiredError();
136
+ }
137
+ // Same grammar gate as every scope-taking route, before anything is
138
+ // authorized: an arbitrary string never reaches the grant policy.
139
+ const scopeResult = parseDataScopeContract(derivedScopeParam);
140
+ if (!scopeResult.ok) {
141
+ return errorResponse(scopeResult.status, scopeResult.body.error, scopeResult.body.message);
142
+ }
143
+ const derivedScope = scopeResult.scope;
144
+ const auth = (await deps.auth.authorizeBuilderRead({
145
+ request,
146
+ scope: derivedScope,
147
+ grantId: selectedGrantId(request, url),
148
+ })) ?? undefined;
149
+ const registrations = await store.list({ derivedScope });
150
+ if (registrations.length === 0) {
151
+ throw new DerivativeQuestionNotFoundError({ derivedScope });
152
+ }
153
+ // Several registrations may share a derived scope, and data serving is
154
+ // registration-agnostic: if ANY of them is ready, the scope has an answer
155
+ // and the reader must not be told "failed" by a duplicate that never
156
+ // wrote anything. Report the most optimistic true state — ready, then an
157
+ // in-flight recompute, then never-computed, then failed — and within a
158
+ // class let the most recently updated registration speak.
159
+ const STATUS_PRECEDENCE = {
160
+ ready: 0,
161
+ stale: 1,
162
+ pending: 2,
163
+ failed: 3,
164
+ };
165
+ const registration = registrations.reduce((best, candidate) => {
166
+ const byStatus = STATUS_PRECEDENCE[candidate.status] - STATUS_PRECEDENCE[best.status];
167
+ if (byStatus !== 0)
168
+ return byStatus < 0 ? candidate : best;
169
+ return candidate.updatedAt >= best.updatedAt ? candidate : best;
170
+ });
171
+ const nextRetryAt = scheduler.nextRetryAt?.(registration.questionId) ?? null;
172
+ // While the retry compute is RUNNING there is no scheduled time, but null
173
+ // would be the terminal "will never retry" signature; serve a short poll
174
+ // hint instead. 0 is never served — it invites a tight poll loop.
175
+ const retryAfterSeconds = nextRetryAt !== null
176
+ ? Math.max(1, Math.ceil((Date.parse(nextRetryAt) - now().getTime()) / 1000))
177
+ : scheduler.retryInFlight?.(registration.questionId)
178
+ ? RETRY_IN_FLIGHT_POLL_SECONDS
179
+ : null;
180
+ // `grant_invalid` can only come from the live re-check of a REGISTERING
181
+ // BUILDER's grant, which an owner-registered question never runs. Serving
182
+ // it to a third-party reader would therefore disclose the registrar class
183
+ // the rest of this view withholds. The owner and the registrar itself lose
184
+ // nothing — they are the two parties who can act on it — and everyone else
185
+ // reads the honest generic class: something is wrong server-side and no
186
+ // retry is coming.
187
+ const registrarView = auth === undefined ||
188
+ auth.grantId === "owner" ||
189
+ auth.grantId === "policy-bypass" ||
190
+ (registration.registeredBy.kind === "builder" &&
191
+ typeof auth.builder === "string" &&
192
+ sameBuilder(registration.registeredBy.builder, auth.builder));
193
+ const disclosedErrorCode = registration.errorCode === "grant_invalid" && !registrarView
194
+ ? "internal"
195
+ : registration.errorCode;
196
+ return jsonResponse({
197
+ derivedScope: registration.derivedScope,
198
+ status: registration.status,
199
+ lastComputedAt: registration.lastComputedAt,
200
+ derivedVersion: registration.derivedVersion,
201
+ derivedCollectedAt: registration.derivedCollectedAt,
202
+ // Null unless failed, whatever an old store row holds: a stale question
203
+ // is a recompute in progress, not a terminal failure.
204
+ errorCode: registration.status === "failed" ? disclosedErrorCode : null,
205
+ retryAfterSeconds,
206
+ });
207
+ }
208
+ export async function handlePersonalServerDerivativesRequest(request, deps, options = {}) {
209
+ try {
210
+ const url = new URL(request.url);
211
+ const pathname = stripBasePath(url.pathname, options.basePath);
212
+ const parts = pathname.split("/").filter(Boolean);
213
+ const isStatusRoute = parts[0] === "status" && parts.length === 1;
214
+ if (!isStatusRoute && (parts[0] !== "questions" || parts.length > 3)) {
215
+ return errorResponse(404, "NOT_FOUND", "Not found");
216
+ }
217
+ const compute = deps.compute;
218
+ if (!compute)
219
+ throw new DerivativeComputeUnavailableError();
220
+ const { store, scheduler } = compute;
221
+ const now = deps.now ?? (() => new Date());
222
+ // /status — the reader-facing lifecycle view of a derived scope.
223
+ if (isStatusRoute) {
224
+ return await handleStatusRoute(request, url, deps, store, scheduler, now);
225
+ }
226
+ // /questions
227
+ if (parts.length === 1) {
228
+ if (request.method === "GET") {
229
+ const derivedScope = url.searchParams.get("derivedScope") ?? undefined;
230
+ if (derivedScope) {
231
+ const writer = await authorizeOwnerOrWriter(deps, request, derivedScope);
232
+ const registrations = await store.list({
233
+ derivedScope,
234
+ ...(writer ? { builder: writer.builder } : {}),
235
+ });
236
+ return jsonResponse({
237
+ questions: registrations.map(questionRegistrationView),
238
+ });
239
+ }
240
+ // The unfiltered list is the owner's. A builder that reached it
241
+ // simply forgot the parameter, so say that instead of 401: the
242
+ // 401 would send a re-handshake-on-401 client through a handshake
243
+ // and then report an authentication problem it does not have.
244
+ if (await recognizeWriteSession(deps, request)) {
245
+ throw new DerivativeDerivedScopeRequiredError();
246
+ }
247
+ await deps.auth.authorizeOwner(request);
248
+ const registrations = await store.list();
249
+ return jsonResponse({
250
+ questions: registrations.map(questionRegistrationView),
251
+ });
252
+ }
253
+ if (request.method === "POST") {
254
+ // The derived scope decides which write grant must cover the call,
255
+ // so the body is read (from a clone: the proof check reads it too)
256
+ // before authorization. Nothing is stored until auth passed.
257
+ const declared = Number(request.headers.get("content-length") ?? "0");
258
+ if (declared > MAX_QUESTION_BODY_BYTES) {
259
+ throw new ContentTooLargeError({ max: MAX_QUESTION_BODY_BYTES });
260
+ }
261
+ const bodyBytes = new Uint8Array(await request.clone().arrayBuffer());
262
+ if (bodyBytes.byteLength > MAX_QUESTION_BODY_BYTES) {
263
+ throw new ContentTooLargeError({ max: MAX_QUESTION_BODY_BYTES });
264
+ }
265
+ const parsed = await parseJsonObjectBody(request.clone(), "Request body must be valid JSON");
266
+ if (!parsed.ok) {
267
+ return jsonResponse(parsed.result.body, {
268
+ status: parsed.result.status,
269
+ });
270
+ }
271
+ const rawScope = parsed.body.derivedScope;
272
+ const scopeForAuth = typeof rawScope === "string" ? rawScope : "";
273
+ const writer = await authorizeOwnerOrWriter(deps, request, scopeForAuth);
274
+ const registeredBy = writer
275
+ ? {
276
+ kind: "builder",
277
+ builder: writer.builder,
278
+ grantId: writer.grantId,
279
+ }
280
+ : { kind: "owner" };
281
+ let registration;
282
+ try {
283
+ if (writer) {
284
+ // Consent: the answer exposes the sources to the builder, so
285
+ // every source must be read-granted to it. Fail closed when
286
+ // the auth port did not hand over the grant's scopes.
287
+ const input = parseQuestionInput(parsed.body);
288
+ const uncovered = uncoveredSourceScopes(input.sourceScopes, writer.grantScopes);
289
+ if (uncovered.length > 0) {
290
+ throw new DerivativeSourceNotGrantedError({ scopes: uncovered });
291
+ }
292
+ }
293
+ registration = await createQuestionRegistration({
294
+ body: parsed.body,
295
+ registeredBy,
296
+ store,
297
+ questionId: deps.createQuestionId?.() ?? crypto.randomUUID(),
298
+ now,
299
+ });
300
+ }
301
+ catch (err) {
302
+ // Nothing stored: hand the builder's proof back for a retry.
303
+ await writer?.releaseProof?.();
304
+ throw err;
305
+ }
306
+ deps.logger?.info?.({
307
+ questionId: registration.questionId,
308
+ derivedScope: registration.derivedScope,
309
+ sourceScopes: registration.sourceScopes,
310
+ registeredBy: registeredBy.kind,
311
+ ...(writer
312
+ ? { builder: writer.builder, grantId: writer.grantId }
313
+ : {}),
314
+ }, "Derivative question registered");
315
+ scheduler.requestRecompute(registration.questionId, {
316
+ immediate: true,
317
+ });
318
+ return jsonResponse(questionRegistrationView(registration), {
319
+ status: 201,
320
+ });
321
+ }
322
+ return errorResponse(405, "METHOD_NOT_ALLOWED", "Method not allowed");
323
+ }
324
+ const questionId = decodeURIComponent(parts[1] ?? "");
325
+ // /questions/:id/recompute
326
+ if (parts.length === 3) {
327
+ if (parts[2] !== "recompute") {
328
+ return errorResponse(404, "NOT_FOUND", "Not found");
329
+ }
330
+ if (request.method !== "POST") {
331
+ return errorResponse(405, "METHOD_NOT_ALLOWED", "Method not allowed");
332
+ }
333
+ // Owner, or the registering builder (its retry after a transient
334
+ // failure); same gate as GET / DELETE.
335
+ const { registration } = await loadForCaller(deps, request, store, questionId);
336
+ scheduler.requestRecompute(questionId, { immediate: true });
337
+ // The same registration view every other route returns, so a client
338
+ // needs one schema. The status is the one the scheduled run starts
339
+ // from: a question that never computed stays `pending`, anything else
340
+ // is `stale` until the run lands.
341
+ return jsonResponse(questionRegistrationView({
342
+ ...registration,
343
+ status: registration.status === "pending" ? "pending" : "stale",
344
+ }), { status: 202 });
345
+ }
346
+ // /questions/:id
347
+ if (request.method === "GET") {
348
+ const { registration } = await loadForCaller(deps, request, store, questionId);
349
+ return jsonResponse(questionRegistrationView(registration));
350
+ }
351
+ if (request.method === "DELETE") {
352
+ const { registration } = await loadForCaller(deps, request, store, questionId);
353
+ await store.delete(questionId);
354
+ deps.logger?.info?.({ questionId, derivedScope: registration.derivedScope }, "Derivative question deleted");
355
+ return jsonResponse({ questionId, deleted: true });
356
+ }
357
+ return errorResponse(405, "METHOD_NOT_ALLOWED", "Method not allowed");
358
+ }
359
+ catch (err) {
360
+ if (err instanceof ProtocolError) {
361
+ return jsonResponse(err.toJSON(), { status: err.code });
362
+ }
363
+ return errorResponse(500, "INTERNAL_ERROR", "Internal server error");
364
+ }
365
+ }
366
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/derivatives/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * The compute job: answer one registered question from local data and
3
+ * write the answer as a derivative record (owner path, `$lineage` = the
4
+ * source data points).
5
+ */
6
+ import type { ScopeDeletionTracker } from "../sync/scope-deletions.js";
7
+ import type { DataStoragePort, RuntimeAvailabilityPort } from "../ports/index.js";
8
+ import { type DataWritePolicyPorts } from "../policy/data-write.js";
9
+ import { type InferenceProvider } from "./inference.js";
10
+ import type { QuestionRegistration, QuestionStore } from "./types.js";
11
+ export interface ComputeLogger {
12
+ info?(payload: Record<string, unknown>, message: string): void;
13
+ warn?(payload: Record<string, unknown>, message: string): void;
14
+ }
15
+ export interface ComputeSyncNotifier {
16
+ notifyNewData?(): void;
17
+ trigger?(): Promise<void>;
18
+ }
19
+ export interface QuestionComputeDeps {
20
+ storage: DataStoragePort;
21
+ store: QuestionStore;
22
+ provider: InferenceProvider;
23
+ /** Required: lineage ids are keccak256(owner, scope). */
24
+ serverOwner: `0x${string}` | undefined;
25
+ /** Newest-first items kept per source scope (default 50). */
26
+ maxSourceItems?: number;
27
+ maxSourceChars?: number;
28
+ maxTokens?: number;
29
+ /** Uploads the derivative after it is written locally. */
30
+ syncManager?: ComputeSyncNotifier | null;
31
+ /** Re-add marker, same as an HTTP ingest (see api/index.ts). */
32
+ scopeDeletions?: ScopeDeletionTracker;
33
+ /**
34
+ * When present, a builder-registered question re-checks its write grant
35
+ * before every compute (revoked / expired / scope no longer covered =>
36
+ * failed, no inference call). Owner registrations skip the check.
37
+ */
38
+ writePolicyPorts?: DataWritePolicyPorts;
39
+ /**
40
+ * Called after the derivative is written and the question marked ready,
41
+ * so a question that reads THIS derived scope recomputes in turn
42
+ * (A -> B -> C chains). The compute path never goes through the HTTP
43
+ * ingest hook.
44
+ */
45
+ onDerivedWritten?: (event: {
46
+ scope: string;
47
+ collectedAt: string;
48
+ lineageSources: string[];
49
+ }) => void;
50
+ /** When unavailable the compute is skipped and the status left as is. */
51
+ runtimeAvailability?: RuntimeAvailabilityPort;
52
+ /**
53
+ * Backoff between retries of a transient inference or gateway failure
54
+ * (default 1s, 4s: three attempts). Tests pass zeros.
55
+ */
56
+ retryDelaysMs?: readonly number[];
57
+ sleep?: (ms: number) => Promise<void>;
58
+ now?: () => Date;
59
+ logger?: ComputeLogger;
60
+ }
61
+ export type ComputeOutcome = {
62
+ status: "ready";
63
+ registration: QuestionRegistration;
64
+ } | {
65
+ status: "failed";
66
+ registration: QuestionRegistration;
67
+ error: string;
68
+ } | {
69
+ status: "skipped";
70
+ reason: "unknown-question" | "runtime-unavailable";
71
+ };
72
+ /** The record written into the derived scope. */
73
+ export interface DerivativeAnswerRecord {
74
+ questionId: string;
75
+ question: string;
76
+ answer: string;
77
+ evidence: string | null;
78
+ model: string;
79
+ computedAt: string;
80
+ sources: Array<{
81
+ scope: string;
82
+ version: number;
83
+ collectedAt: string;
84
+ }>;
85
+ /** Caller-side lineage field, mirrored by the server into `$lineage`. */
86
+ lineage: `0x${string}`[];
87
+ inference?: {
88
+ receiptId?: string;
89
+ aciIdentity?: string;
90
+ };
91
+ [key: string]: unknown;
92
+ }
93
+ /**
94
+ * Version stamp for the derived record, second precision like an HTTP
95
+ * ingest. A recompute inside the same second as the previous one would
96
+ * collide on the (scope, collectedAt) path, so the stamp advances past any
97
+ * version the scope already holds (bounded: at most one minute ahead).
98
+ */
99
+ export declare function collectedAtStamp(now: () => Date, isTaken: (collectedAt: string) => boolean): string;
100
+ /**
101
+ * Compute one question end to end. Never throws for a compute failure: the
102
+ * registration is marked `failed` with a short reason and the outcome says
103
+ * so. Throws only when the store itself fails.
104
+ */
105
+ export declare function computeQuestion(questionId: string, deps: QuestionComputeDeps): Promise<ComputeOutcome>;
106
+ //# sourceMappingURL=compute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../../src/derivatives/compute.ts"],"names":[],"mappings":"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"}