@opendatalabs/personal-server-ts-core 0.0.1-canary.00328bf

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 (573) hide show
  1. package/dist/api/index.d.ts +408 -0
  2. package/dist/api/index.d.ts.map +1 -0
  3. package/dist/api/index.js +1257 -0
  4. package/dist/api/index.js.map +1 -0
  5. package/dist/api/raw-envelope.d.ts +3 -0
  6. package/dist/api/raw-envelope.d.ts.map +1 -0
  7. package/dist/api/raw-envelope.js +215 -0
  8. package/dist/api/raw-envelope.js.map +1 -0
  9. package/dist/auth/index.d.ts +2 -0
  10. package/dist/auth/index.d.ts.map +1 -0
  11. package/dist/auth/index.js +2 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/auth/request.d.ts +28 -0
  14. package/dist/auth/request.d.ts.map +1 -0
  15. package/dist/auth/request.js +106 -0
  16. package/dist/auth/request.js.map +1 -0
  17. package/dist/client.d.ts +233 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +243 -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 +12 -0
  24. package/dist/config/defaults.js.map +1 -0
  25. package/dist/config/index.d.ts +3 -0
  26. package/dist/config/index.d.ts.map +1 -0
  27. package/dist/config/index.js +3 -0
  28. package/dist/config/index.js.map +1 -0
  29. package/dist/config/paths.d.ts +9 -0
  30. package/dist/config/paths.d.ts.map +1 -0
  31. package/dist/config/paths.js +14 -0
  32. package/dist/config/paths.js.map +1 -0
  33. package/dist/contracts/access-logs.d.ts +8 -0
  34. package/dist/contracts/access-logs.d.ts.map +1 -0
  35. package/dist/contracts/access-logs.js +7 -0
  36. package/dist/contracts/access-logs.js.map +1 -0
  37. package/dist/contracts/auth-device.d.ts +70 -0
  38. package/dist/contracts/auth-device.d.ts.map +1 -0
  39. package/dist/contracts/auth-device.js +163 -0
  40. package/dist/contracts/auth-device.js.map +1 -0
  41. package/dist/contracts/binary.d.ts +66 -0
  42. package/dist/contracts/binary.d.ts.map +1 -0
  43. package/dist/contracts/binary.js +123 -0
  44. package/dist/contracts/binary.js.map +1 -0
  45. package/dist/contracts/config.d.ts +5 -0
  46. package/dist/contracts/config.d.ts.map +1 -0
  47. package/dist/contracts/config.js +30 -0
  48. package/dist/contracts/config.js.map +1 -0
  49. package/dist/contracts/data.d.ts +165 -0
  50. package/dist/contracts/data.d.ts.map +1 -0
  51. package/dist/contracts/data.js +371 -0
  52. package/dist/contracts/data.js.map +1 -0
  53. package/dist/contracts/grants.d.ts +45 -0
  54. package/dist/contracts/grants.d.ts.map +1 -0
  55. package/dist/contracts/grants.js +177 -0
  56. package/dist/contracts/grants.js.map +1 -0
  57. package/dist/contracts/http.d.ts +21 -0
  58. package/dist/contracts/http.d.ts.map +1 -0
  59. package/dist/contracts/http.js +49 -0
  60. package/dist/contracts/http.js.map +1 -0
  61. package/dist/contracts/index.d.ts +16 -0
  62. package/dist/contracts/index.d.ts.map +1 -0
  63. package/dist/contracts/index.js +10 -0
  64. package/dist/contracts/index.js.map +1 -0
  65. package/dist/contracts/oauth.d.ts +38 -0
  66. package/dist/contracts/oauth.d.ts.map +1 -0
  67. package/dist/contracts/oauth.js +130 -0
  68. package/dist/contracts/oauth.js.map +1 -0
  69. package/dist/contracts/sync.d.ts +10 -0
  70. package/dist/contracts/sync.d.ts.map +1 -0
  71. package/dist/contracts/sync.js +35 -0
  72. package/dist/contracts/sync.js.map +1 -0
  73. package/dist/derivatives/answer-shape.d.ts +83 -0
  74. package/dist/derivatives/answer-shape.d.ts.map +1 -0
  75. package/dist/derivatives/answer-shape.js +320 -0
  76. package/dist/derivatives/answer-shape.js.map +1 -0
  77. package/dist/derivatives/api.d.ts +48 -0
  78. package/dist/derivatives/api.d.ts.map +1 -0
  79. package/dist/derivatives/api.js +374 -0
  80. package/dist/derivatives/api.js.map +1 -0
  81. package/dist/derivatives/compute.d.ts +112 -0
  82. package/dist/derivatives/compute.d.ts.map +1 -0
  83. package/dist/derivatives/compute.js +476 -0
  84. package/dist/derivatives/compute.js.map +1 -0
  85. package/dist/derivatives/e2ee/aad.d.ts +22 -0
  86. package/dist/derivatives/e2ee/aad.d.ts.map +1 -0
  87. package/dist/derivatives/e2ee/aad.js +32 -0
  88. package/dist/derivatives/e2ee/aad.js.map +1 -0
  89. package/dist/derivatives/e2ee/attestation.d.ts +134 -0
  90. package/dist/derivatives/e2ee/attestation.d.ts.map +1 -0
  91. package/dist/derivatives/e2ee/attestation.js +248 -0
  92. package/dist/derivatives/e2ee/attestation.js.map +1 -0
  93. package/dist/derivatives/e2ee/index.d.ts +6 -0
  94. package/dist/derivatives/e2ee/index.d.ts.map +1 -0
  95. package/dist/derivatives/e2ee/index.js +6 -0
  96. package/dist/derivatives/e2ee/index.js.map +1 -0
  97. package/dist/derivatives/e2ee/jcs.d.ts +17 -0
  98. package/dist/derivatives/e2ee/jcs.d.ts.map +1 -0
  99. package/dist/derivatives/e2ee/jcs.js +55 -0
  100. package/dist/derivatives/e2ee/jcs.js.map +1 -0
  101. package/dist/derivatives/e2ee/phala.d.ts +62 -0
  102. package/dist/derivatives/e2ee/phala.d.ts.map +1 -0
  103. package/dist/derivatives/e2ee/phala.js +168 -0
  104. package/dist/derivatives/e2ee/phala.js.map +1 -0
  105. package/dist/derivatives/e2ee/suite.d.ts +56 -0
  106. package/dist/derivatives/e2ee/suite.d.ts.map +1 -0
  107. package/dist/derivatives/e2ee/suite.js +164 -0
  108. package/dist/derivatives/e2ee/suite.js.map +1 -0
  109. package/dist/derivatives/index.d.ts +11 -0
  110. package/dist/derivatives/index.d.ts.map +1 -0
  111. package/dist/derivatives/index.js +11 -0
  112. package/dist/derivatives/index.js.map +1 -0
  113. package/dist/derivatives/inference.d.ts +151 -0
  114. package/dist/derivatives/inference.d.ts.map +1 -0
  115. package/dist/derivatives/inference.js +262 -0
  116. package/dist/derivatives/inference.js.map +1 -0
  117. package/dist/derivatives/prompt.d.ts +99 -0
  118. package/dist/derivatives/prompt.d.ts.map +1 -0
  119. package/dist/derivatives/prompt.js +281 -0
  120. package/dist/derivatives/prompt.js.map +1 -0
  121. package/dist/derivatives/registration.d.ts +56 -0
  122. package/dist/derivatives/registration.d.ts.map +1 -0
  123. package/dist/derivatives/registration.js +187 -0
  124. package/dist/derivatives/registration.js.map +1 -0
  125. package/dist/derivatives/scheduler.d.ts +114 -0
  126. package/dist/derivatives/scheduler.d.ts.map +1 -0
  127. package/dist/derivatives/scheduler.js +331 -0
  128. package/dist/derivatives/scheduler.js.map +1 -0
  129. package/dist/derivatives/store.d.ts +14 -0
  130. package/dist/derivatives/store.d.ts.map +1 -0
  131. package/dist/derivatives/store.js +79 -0
  132. package/dist/derivatives/store.js.map +1 -0
  133. package/dist/derivatives/types.d.ts +102 -0
  134. package/dist/derivatives/types.d.ts.map +1 -0
  135. package/dist/derivatives/types.js +29 -0
  136. package/dist/derivatives/types.js.map +1 -0
  137. package/dist/errors/catalog.d.ts +125 -0
  138. package/dist/errors/catalog.d.ts.map +1 -0
  139. package/dist/errors/catalog.js +198 -0
  140. package/dist/errors/catalog.js.map +1 -0
  141. package/dist/errors/pdpp-catalog.d.ts +36 -0
  142. package/dist/errors/pdpp-catalog.d.ts.map +1 -0
  143. package/dist/errors/pdpp-catalog.js +82 -0
  144. package/dist/errors/pdpp-catalog.js.map +1 -0
  145. package/dist/grants/index.d.ts +5 -0
  146. package/dist/grants/index.d.ts.map +1 -0
  147. package/dist/grants/index.js +6 -0
  148. package/dist/grants/index.js.map +1 -0
  149. package/dist/grants/pdpp-binding-store.d.ts +58 -0
  150. package/dist/grants/pdpp-binding-store.d.ts.map +1 -0
  151. package/dist/grants/pdpp-binding-store.js +97 -0
  152. package/dist/grants/pdpp-binding-store.js.map +1 -0
  153. package/dist/grants/pdpp-binding.d.ts +179 -0
  154. package/dist/grants/pdpp-binding.d.ts.map +1 -0
  155. package/dist/grants/pdpp-binding.js +214 -0
  156. package/dist/grants/pdpp-binding.js.map +1 -0
  157. package/dist/keys/index.d.ts +3 -0
  158. package/dist/keys/index.d.ts.map +1 -0
  159. package/dist/keys/index.js +2 -0
  160. package/dist/keys/index.js.map +1 -0
  161. package/dist/keys/public-only-account.d.ts +8 -0
  162. package/dist/keys/public-only-account.d.ts.map +1 -0
  163. package/dist/keys/public-only-account.js +21 -0
  164. package/dist/keys/public-only-account.js.map +1 -0
  165. package/dist/keys/server-account.d.ts +24 -0
  166. package/dist/keys/server-account.d.ts.map +1 -0
  167. package/dist/keys/server-account.js +2 -0
  168. package/dist/keys/server-account.js.map +1 -0
  169. package/dist/lineage/attestation.d.ts +42 -0
  170. package/dist/lineage/attestation.d.ts.map +1 -0
  171. package/dist/lineage/attestation.js +25 -0
  172. package/dist/lineage/attestation.js.map +1 -0
  173. package/dist/lineage/gateway.d.ts +105 -0
  174. package/dist/lineage/gateway.d.ts.map +1 -0
  175. package/dist/lineage/gateway.js +242 -0
  176. package/dist/lineage/gateway.js.map +1 -0
  177. package/dist/lineage/index.d.ts +5 -0
  178. package/dist/lineage/index.d.ts.map +1 -0
  179. package/dist/lineage/index.js +5 -0
  180. package/dist/lineage/index.js.map +1 -0
  181. package/dist/lineage/lineage.d.ts +141 -0
  182. package/dist/lineage/lineage.d.ts.map +1 -0
  183. package/dist/lineage/lineage.js +255 -0
  184. package/dist/lineage/lineage.js.map +1 -0
  185. package/dist/logger/index.d.ts +9 -0
  186. package/dist/logger/index.d.ts.map +1 -0
  187. package/dist/logger/index.js +5 -0
  188. package/dist/logger/index.js.map +1 -0
  189. package/dist/logging/access-log.d.ts +23 -0
  190. package/dist/logging/access-log.d.ts.map +1 -0
  191. package/dist/logging/access-log.js +2 -0
  192. package/dist/logging/access-log.js.map +1 -0
  193. package/dist/logging/access-reader.d.ts +14 -0
  194. package/dist/logging/access-reader.d.ts.map +1 -0
  195. package/dist/logging/access-reader.js +2 -0
  196. package/dist/logging/access-reader.js.map +1 -0
  197. package/dist/mcp/activity.d.ts +68 -0
  198. package/dist/mcp/activity.d.ts.map +1 -0
  199. package/dist/mcp/activity.js +111 -0
  200. package/dist/mcp/activity.js.map +1 -0
  201. package/dist/mcp/builder-registration.d.ts +24 -0
  202. package/dist/mcp/builder-registration.d.ts.map +1 -0
  203. package/dist/mcp/builder-registration.js +89 -0
  204. package/dist/mcp/builder-registration.js.map +1 -0
  205. package/dist/mcp/connection-api.d.ts +201 -0
  206. package/dist/mcp/connection-api.d.ts.map +1 -0
  207. package/dist/mcp/connection-api.js +506 -0
  208. package/dist/mcp/connection-api.js.map +1 -0
  209. package/dist/mcp/grantee.d.ts +52 -0
  210. package/dist/mcp/grantee.d.ts.map +1 -0
  211. package/dist/mcp/grantee.js +91 -0
  212. package/dist/mcp/grantee.js.map +1 -0
  213. package/dist/mcp/index.d.ts +12 -0
  214. package/dist/mcp/index.d.ts.map +1 -0
  215. package/dist/mcp/index.js +12 -0
  216. package/dist/mcp/index.js.map +1 -0
  217. package/dist/mcp/read-client.d.ts +176 -0
  218. package/dist/mcp/read-client.d.ts.map +1 -0
  219. package/dist/mcp/read-client.js +579 -0
  220. package/dist/mcp/read-client.js.map +1 -0
  221. package/dist/mcp/resources.d.ts +37 -0
  222. package/dist/mcp/resources.d.ts.map +1 -0
  223. package/dist/mcp/resources.js +114 -0
  224. package/dist/mcp/resources.js.map +1 -0
  225. package/dist/mcp/search/index.d.ts +34 -0
  226. package/dist/mcp/search/index.d.ts.map +1 -0
  227. package/dist/mcp/search/index.js +156 -0
  228. package/dist/mcp/search/index.js.map +1 -0
  229. package/dist/mcp/server.d.ts +72 -0
  230. package/dist/mcp/server.d.ts.map +1 -0
  231. package/dist/mcp/server.js +447 -0
  232. package/dist/mcp/server.js.map +1 -0
  233. package/dist/mcp/session.d.ts +160 -0
  234. package/dist/mcp/session.d.ts.map +1 -0
  235. package/dist/mcp/session.js +243 -0
  236. package/dist/mcp/session.js.map +1 -0
  237. package/dist/mcp/store.d.ts +13 -0
  238. package/dist/mcp/store.d.ts.map +1 -0
  239. package/dist/mcp/store.js +119 -0
  240. package/dist/mcp/store.js.map +1 -0
  241. package/dist/mcp/token-expiry.d.ts +38 -0
  242. package/dist/mcp/token-expiry.d.ts.map +1 -0
  243. package/dist/mcp/token-expiry.js +55 -0
  244. package/dist/mcp/token-expiry.js.map +1 -0
  245. package/dist/mcp/tools.d.ts +95 -0
  246. package/dist/mcp/tools.d.ts.map +1 -0
  247. package/dist/mcp/tools.js +1381 -0
  248. package/dist/mcp/tools.js.map +1 -0
  249. package/dist/mcp/types.d.ts +135 -0
  250. package/dist/mcp/types.d.ts.map +1 -0
  251. package/dist/mcp/types.js +24 -0
  252. package/dist/mcp/types.js.map +1 -0
  253. package/dist/payment/index.d.ts +2 -0
  254. package/dist/payment/index.d.ts.map +1 -0
  255. package/dist/payment/index.js +2 -0
  256. package/dist/payment/index.js.map +1 -0
  257. package/dist/payment/x402.d.ts +155 -0
  258. package/dist/payment/x402.d.ts.map +1 -0
  259. package/dist/payment/x402.js +402 -0
  260. package/dist/payment/x402.js.map +1 -0
  261. package/dist/pdpp/approval.d.ts +182 -0
  262. package/dist/pdpp/approval.d.ts.map +1 -0
  263. package/dist/pdpp/approval.js +337 -0
  264. package/dist/pdpp/approval.js.map +1 -0
  265. package/dist/pdpp/client-identity.d.ts +88 -0
  266. package/dist/pdpp/client-identity.d.ts.map +1 -0
  267. package/dist/pdpp/client-identity.js +183 -0
  268. package/dist/pdpp/client-identity.js.map +1 -0
  269. package/dist/pdpp/client-metadata.d.ts +95 -0
  270. package/dist/pdpp/client-metadata.d.ts.map +1 -0
  271. package/dist/pdpp/client-metadata.js +96 -0
  272. package/dist/pdpp/client-metadata.js.map +1 -0
  273. package/dist/pdpp/declaration.d.ts +118 -0
  274. package/dist/pdpp/declaration.d.ts.map +1 -0
  275. package/dist/pdpp/declaration.js +549 -0
  276. package/dist/pdpp/declaration.js.map +1 -0
  277. package/dist/pdpp/index.d.ts +35 -0
  278. package/dist/pdpp/index.d.ts.map +1 -0
  279. package/dist/pdpp/index.js +22 -0
  280. package/dist/pdpp/index.js.map +1 -0
  281. package/dist/pdpp/issuance.d.ts +91 -0
  282. package/dist/pdpp/issuance.d.ts.map +1 -0
  283. package/dist/pdpp/issuance.js +124 -0
  284. package/dist/pdpp/issuance.js.map +1 -0
  285. package/dist/pdpp/pkce.d.ts +53 -0
  286. package/dist/pdpp/pkce.d.ts.map +1 -0
  287. package/dist/pdpp/pkce.js +109 -0
  288. package/dist/pdpp/pkce.js.map +1 -0
  289. package/dist/pdpp/redirect.d.ts +60 -0
  290. package/dist/pdpp/redirect.d.ts.map +1 -0
  291. package/dist/pdpp/redirect.js +125 -0
  292. package/dist/pdpp/redirect.js.map +1 -0
  293. package/dist/pdpp/resolve.d.ts +53 -0
  294. package/dist/pdpp/resolve.d.ts.map +1 -0
  295. package/dist/pdpp/resolve.js +218 -0
  296. package/dist/pdpp/resolve.js.map +1 -0
  297. package/dist/pdpp/review.d.ts +155 -0
  298. package/dist/pdpp/review.d.ts.map +1 -0
  299. package/dist/pdpp/review.js +142 -0
  300. package/dist/pdpp/review.js.map +1 -0
  301. package/dist/pdpp/selection.d.ts +43 -0
  302. package/dist/pdpp/selection.d.ts.map +1 -0
  303. package/dist/pdpp/selection.js +211 -0
  304. package/dist/pdpp/selection.js.map +1 -0
  305. package/dist/pdpp/store.d.ts +204 -0
  306. package/dist/pdpp/store.d.ts.map +1 -0
  307. package/dist/pdpp/store.js +501 -0
  308. package/dist/pdpp/store.js.map +1 -0
  309. package/dist/pdpp/tokens.d.ts +149 -0
  310. package/dist/pdpp/tokens.d.ts.map +1 -0
  311. package/dist/pdpp/tokens.js +387 -0
  312. package/dist/pdpp/tokens.js.map +1 -0
  313. package/dist/pdpp/types.d.ts +258 -0
  314. package/dist/pdpp/types.d.ts.map +1 -0
  315. package/dist/pdpp/types.js +40 -0
  316. package/dist/pdpp/types.js.map +1 -0
  317. package/dist/pdpp-version.d.ts +28 -0
  318. package/dist/pdpp-version.d.ts.map +1 -0
  319. package/dist/pdpp-version.js +28 -0
  320. package/dist/pdpp-version.js.map +1 -0
  321. package/dist/policy/data-read.d.ts +56 -0
  322. package/dist/policy/data-read.d.ts.map +1 -0
  323. package/dist/policy/data-read.js +176 -0
  324. package/dist/policy/data-read.js.map +1 -0
  325. package/dist/policy/data-write.d.ts +69 -0
  326. package/dist/policy/data-write.d.ts.map +1 -0
  327. package/dist/policy/data-write.js +131 -0
  328. package/dist/policy/data-write.js.map +1 -0
  329. package/dist/policy/index.d.ts +4 -0
  330. package/dist/policy/index.d.ts.map +1 -0
  331. package/dist/policy/index.js +4 -0
  332. package/dist/policy/index.js.map +1 -0
  333. package/dist/policy/signed-artifacts.d.ts +17 -0
  334. package/dist/policy/signed-artifacts.d.ts.map +1 -0
  335. package/dist/policy/signed-artifacts.js +110 -0
  336. package/dist/policy/signed-artifacts.js.map +1 -0
  337. package/dist/ports/index.d.ts +243 -0
  338. package/dist/ports/index.d.ts.map +1 -0
  339. package/dist/ports/index.js +7 -0
  340. package/dist/ports/index.js.map +1 -0
  341. package/dist/ports/pdpp-auth.d.ts +103 -0
  342. package/dist/ports/pdpp-auth.d.ts.map +1 -0
  343. package/dist/ports/pdpp-auth.js +37 -0
  344. package/dist/ports/pdpp-auth.js.map +1 -0
  345. package/dist/ports/pdpp-auth.test-utils.d.ts +9 -0
  346. package/dist/ports/pdpp-auth.test-utils.d.ts.map +1 -0
  347. package/dist/ports/pdpp-auth.test-utils.js +18 -0
  348. package/dist/ports/pdpp-auth.test-utils.js.map +1 -0
  349. package/dist/schemas/server-config.d.ts +190 -0
  350. package/dist/schemas/server-config.d.ts.map +1 -0
  351. package/dist/schemas/server-config.js +282 -0
  352. package/dist/schemas/server-config.js.map +1 -0
  353. package/dist/signing/index.d.ts +3 -0
  354. package/dist/signing/index.d.ts.map +1 -0
  355. package/dist/signing/index.js +3 -0
  356. package/dist/signing/index.js.map +1 -0
  357. package/dist/signing/request-signer.d.ts +20 -0
  358. package/dist/signing/request-signer.d.ts.map +1 -0
  359. package/dist/signing/request-signer.js +23 -0
  360. package/dist/signing/request-signer.js.map +1 -0
  361. package/dist/signing/signer.d.ts +40 -0
  362. package/dist/signing/signer.d.ts.map +1 -0
  363. package/dist/signing/signer.js +56 -0
  364. package/dist/signing/signer.js.map +1 -0
  365. package/dist/storage/adapters/index.d.ts +4 -0
  366. package/dist/storage/adapters/index.d.ts.map +1 -0
  367. package/dist/storage/adapters/index.js +3 -0
  368. package/dist/storage/adapters/index.js.map +1 -0
  369. package/dist/storage/adapters/interface.d.ts +57 -0
  370. package/dist/storage/adapters/interface.d.ts.map +1 -0
  371. package/dist/storage/adapters/interface.js +2 -0
  372. package/dist/storage/adapters/interface.js.map +1 -0
  373. package/dist/storage/adapters/sdk.d.ts +23 -0
  374. package/dist/storage/adapters/sdk.d.ts.map +1 -0
  375. package/dist/storage/adapters/sdk.js +73 -0
  376. package/dist/storage/adapters/sdk.js.map +1 -0
  377. package/dist/storage/adapters/vana.d.ts +12 -0
  378. package/dist/storage/adapters/vana.d.ts.map +1 -0
  379. package/dist/storage/adapters/vana.js +111 -0
  380. package/dist/storage/adapters/vana.js.map +1 -0
  381. package/dist/storage/blocks/build.d.ts +20 -0
  382. package/dist/storage/blocks/build.d.ts.map +1 -0
  383. package/dist/storage/blocks/build.js +378 -0
  384. package/dist/storage/blocks/build.js.map +1 -0
  385. package/dist/storage/blocks/cursor.d.ts +33 -0
  386. package/dist/storage/blocks/cursor.d.ts.map +1 -0
  387. package/dist/storage/blocks/cursor.js +142 -0
  388. package/dist/storage/blocks/cursor.js.map +1 -0
  389. package/dist/storage/blocks/errors.d.ts +6 -0
  390. package/dist/storage/blocks/errors.d.ts.map +1 -0
  391. package/dist/storage/blocks/errors.js +9 -0
  392. package/dist/storage/blocks/errors.js.map +1 -0
  393. package/dist/storage/blocks/index.d.ts +6 -0
  394. package/dist/storage/blocks/index.d.ts.map +1 -0
  395. package/dist/storage/blocks/index.js +5 -0
  396. package/dist/storage/blocks/index.js.map +1 -0
  397. package/dist/storage/blocks/select.d.ts +29 -0
  398. package/dist/storage/blocks/select.d.ts.map +1 -0
  399. package/dist/storage/blocks/select.js +120 -0
  400. package/dist/storage/blocks/select.js.map +1 -0
  401. package/dist/storage/blocks/types.d.ts +56 -0
  402. package/dist/storage/blocks/types.d.ts.map +1 -0
  403. package/dist/storage/blocks/types.js +2 -0
  404. package/dist/storage/blocks/types.js.map +1 -0
  405. package/dist/storage/hierarchy/index.d.ts +3 -0
  406. package/dist/storage/hierarchy/index.d.ts.map +1 -0
  407. package/dist/storage/hierarchy/index.js +2 -0
  408. package/dist/storage/hierarchy/index.js.map +1 -0
  409. package/dist/storage/hierarchy/manager.d.ts +9 -0
  410. package/dist/storage/hierarchy/manager.d.ts.map +1 -0
  411. package/dist/storage/hierarchy/manager.js +2 -0
  412. package/dist/storage/hierarchy/manager.js.map +1 -0
  413. package/dist/storage/hierarchy/paths.d.ts +11 -0
  414. package/dist/storage/hierarchy/paths.d.ts.map +1 -0
  415. package/dist/storage/hierarchy/paths.js +43 -0
  416. package/dist/storage/hierarchy/paths.js.map +1 -0
  417. package/dist/storage/index/index.d.ts +3 -0
  418. package/dist/storage/index/index.d.ts.map +1 -0
  419. package/dist/storage/index/index.js +2 -0
  420. package/dist/storage/index/index.js.map +1 -0
  421. package/dist/storage/index/manager.d.ts +63 -0
  422. package/dist/storage/index/manager.d.ts.map +1 -0
  423. package/dist/storage/index/manager.js +2 -0
  424. package/dist/storage/index/manager.js.map +1 -0
  425. package/dist/storage/index/schema.d.ts +2 -0
  426. package/dist/storage/index/schema.d.ts.map +1 -0
  427. package/dist/storage/index/schema.js +2 -0
  428. package/dist/storage/index/schema.js.map +1 -0
  429. package/dist/storage/index/types.d.ts +37 -0
  430. package/dist/storage/index/types.d.ts.map +1 -0
  431. package/dist/storage/index/types.js +2 -0
  432. package/dist/storage/index/types.js.map +1 -0
  433. package/dist/storage/pdpp-records/cursor.d.ts +27 -0
  434. package/dist/storage/pdpp-records/cursor.d.ts.map +1 -0
  435. package/dist/storage/pdpp-records/cursor.js +49 -0
  436. package/dist/storage/pdpp-records/cursor.js.map +1 -0
  437. package/dist/storage/pdpp-records/enforcement.d.ts +37 -0
  438. package/dist/storage/pdpp-records/enforcement.d.ts.map +1 -0
  439. package/dist/storage/pdpp-records/enforcement.js +79 -0
  440. package/dist/storage/pdpp-records/enforcement.js.map +1 -0
  441. package/dist/storage/pdpp-records/index.d.ts +8 -0
  442. package/dist/storage/pdpp-records/index.d.ts.map +1 -0
  443. package/dist/storage/pdpp-records/index.js +8 -0
  444. package/dist/storage/pdpp-records/index.js.map +1 -0
  445. package/dist/storage/pdpp-records/interface.d.ts +49 -0
  446. package/dist/storage/pdpp-records/interface.d.ts.map +1 -0
  447. package/dist/storage/pdpp-records/interface.js +2 -0
  448. package/dist/storage/pdpp-records/interface.js.map +1 -0
  449. package/dist/storage/pdpp-records/memory-store.d.ts +9 -0
  450. package/dist/storage/pdpp-records/memory-store.d.ts.map +1 -0
  451. package/dist/storage/pdpp-records/memory-store.js +0 -0
  452. package/dist/storage/pdpp-records/memory-store.js.map +1 -0
  453. package/dist/storage/pdpp-records/record-key.d.ts +52 -0
  454. package/dist/storage/pdpp-records/record-key.d.ts.map +1 -0
  455. package/dist/storage/pdpp-records/record-key.js +97 -0
  456. package/dist/storage/pdpp-records/record-key.js.map +1 -0
  457. package/dist/storage/pdpp-records/stream-declaration.d.ts +43 -0
  458. package/dist/storage/pdpp-records/stream-declaration.d.ts.map +1 -0
  459. package/dist/storage/pdpp-records/stream-declaration.js +17 -0
  460. package/dist/storage/pdpp-records/stream-declaration.js.map +1 -0
  461. package/dist/storage/pdpp-records/types.d.ts +93 -0
  462. package/dist/storage/pdpp-records/types.d.ts.map +1 -0
  463. package/dist/storage/pdpp-records/types.js +17 -0
  464. package/dist/storage/pdpp-records/types.js.map +1 -0
  465. package/dist/storage/preview.d.ts +12 -0
  466. package/dist/storage/preview.d.ts.map +1 -0
  467. package/dist/storage/preview.js +239 -0
  468. package/dist/storage/preview.js.map +1 -0
  469. package/dist/sync/cursor.d.ts +10 -0
  470. package/dist/sync/cursor.d.ts.map +1 -0
  471. package/dist/sync/cursor.js +2 -0
  472. package/dist/sync/cursor.js.map +1 -0
  473. package/dist/sync/data-point-feed.d.ts +35 -0
  474. package/dist/sync/data-point-feed.d.ts.map +1 -0
  475. package/dist/sync/data-point-feed.js +122 -0
  476. package/dist/sync/data-point-feed.js.map +1 -0
  477. package/dist/sync/data-point-id.d.ts +7 -0
  478. package/dist/sync/data-point-id.d.ts.map +1 -0
  479. package/dist/sync/data-point-id.js +16 -0
  480. package/dist/sync/data-point-id.js.map +1 -0
  481. package/dist/sync/delete-data-port.d.ts +50 -0
  482. package/dist/sync/delete-data-port.d.ts.map +1 -0
  483. package/dist/sync/delete-data-port.js +244 -0
  484. package/dist/sync/delete-data-port.js.map +1 -0
  485. package/dist/sync/engine/sync-manager.d.ts +58 -0
  486. package/dist/sync/engine/sync-manager.d.ts.map +1 -0
  487. package/dist/sync/engine/sync-manager.js +285 -0
  488. package/dist/sync/engine/sync-manager.js.map +1 -0
  489. package/dist/sync/index.d.ts +15 -0
  490. package/dist/sync/index.d.ts.map +1 -0
  491. package/dist/sync/index.js +14 -0
  492. package/dist/sync/index.js.map +1 -0
  493. package/dist/sync/issues.d.ts +55 -0
  494. package/dist/sync/issues.d.ts.map +1 -0
  495. package/dist/sync/issues.js +168 -0
  496. package/dist/sync/issues.js.map +1 -0
  497. package/dist/sync/pdpp-import.d.ts +192 -0
  498. package/dist/sync/pdpp-import.d.ts.map +1 -0
  499. package/dist/sync/pdpp-import.js +422 -0
  500. package/dist/sync/pdpp-import.js.map +1 -0
  501. package/dist/sync/pending-blob-deletions.d.ts +29 -0
  502. package/dist/sync/pending-blob-deletions.d.ts.map +1 -0
  503. package/dist/sync/pending-blob-deletions.js +116 -0
  504. package/dist/sync/pending-blob-deletions.js.map +1 -0
  505. package/dist/sync/retry-memory.d.ts +33 -0
  506. package/dist/sync/retry-memory.d.ts.map +1 -0
  507. package/dist/sync/retry-memory.js +68 -0
  508. package/dist/sync/retry-memory.js.map +1 -0
  509. package/dist/sync/scope-deletions.d.ts +155 -0
  510. package/dist/sync/scope-deletions.d.ts.map +1 -0
  511. package/dist/sync/scope-deletions.js +225 -0
  512. package/dist/sync/scope-deletions.js.map +1 -0
  513. package/dist/sync/tombstone.d.ts +27 -0
  514. package/dist/sync/tombstone.d.ts.map +1 -0
  515. package/dist/sync/tombstone.js +28 -0
  516. package/dist/sync/tombstone.js.map +1 -0
  517. package/dist/sync/types.d.ts +27 -0
  518. package/dist/sync/types.d.ts.map +1 -0
  519. package/dist/sync/types.js +2 -0
  520. package/dist/sync/types.js.map +1 -0
  521. package/dist/sync/workers/delete.d.ts +163 -0
  522. package/dist/sync/workers/delete.d.ts.map +1 -0
  523. package/dist/sync/workers/delete.js +474 -0
  524. package/dist/sync/workers/delete.js.map +1 -0
  525. package/dist/sync/workers/download.d.ts +159 -0
  526. package/dist/sync/workers/download.d.ts.map +1 -0
  527. package/dist/sync/workers/download.js +731 -0
  528. package/dist/sync/workers/download.js.map +1 -0
  529. package/dist/sync/workers/upload.d.ts +98 -0
  530. package/dist/sync/workers/upload.d.ts.map +1 -0
  531. package/dist/sync/workers/upload.js +412 -0
  532. package/dist/sync/workers/upload.js.map +1 -0
  533. package/dist/test-utils/e2ee-fixtures.d.ts +94 -0
  534. package/dist/test-utils/e2ee-fixtures.d.ts.map +1 -0
  535. package/dist/test-utils/e2ee-fixtures.js +116 -0
  536. package/dist/test-utils/e2ee-fixtures.js.map +1 -0
  537. package/dist/test-utils/e2ee-gateway.d.ts +61 -0
  538. package/dist/test-utils/e2ee-gateway.d.ts.map +1 -0
  539. package/dist/test-utils/e2ee-gateway.js +248 -0
  540. package/dist/test-utils/e2ee-gateway.js.map +1 -0
  541. package/dist/test-utils/index.d.ts +5 -0
  542. package/dist/test-utils/index.d.ts.map +1 -0
  543. package/dist/test-utils/index.js +5 -0
  544. package/dist/test-utils/index.js.map +1 -0
  545. package/dist/test-utils/memory-storage.d.ts +12 -0
  546. package/dist/test-utils/memory-storage.d.ts.map +1 -0
  547. package/dist/test-utils/memory-storage.js +146 -0
  548. package/dist/test-utils/memory-storage.js.map +1 -0
  549. package/dist/test-utils/wallet.d.ts +47 -0
  550. package/dist/test-utils/wallet.d.ts.map +1 -0
  551. package/dist/test-utils/wallet.js +98 -0
  552. package/dist/test-utils/wallet.js.map +1 -0
  553. package/dist/write/attribution.d.ts +185 -0
  554. package/dist/write/attribution.d.ts.map +1 -0
  555. package/dist/write/attribution.js +450 -0
  556. package/dist/write/attribution.js.map +1 -0
  557. package/dist/write/authorize.d.ts +77 -0
  558. package/dist/write/authorize.d.ts.map +1 -0
  559. package/dist/write/authorize.js +109 -0
  560. package/dist/write/authorize.js.map +1 -0
  561. package/dist/write/index.d.ts +5 -0
  562. package/dist/write/index.d.ts.map +1 -0
  563. package/dist/write/index.js +5 -0
  564. package/dist/write/index.js.map +1 -0
  565. package/dist/write/route.d.ts +61 -0
  566. package/dist/write/route.d.ts.map +1 -0
  567. package/dist/write/route.js +132 -0
  568. package/dist/write/route.js.map +1 -0
  569. package/dist/write/session.d.ts +96 -0
  570. package/dist/write/session.d.ts.map +1 -0
  571. package/dist/write/session.js +136 -0
  572. package/dist/write/session.js.map +1 -0
  573. package/package.json +175 -0
@@ -0,0 +1,91 @@
1
+ /**
2
+ * PDPP Core §7 grant issuance.
3
+ *
4
+ * Issuance is the moment every request-only convenience becomes a frozen fact.
5
+ * The guard that matters most here is staleness: §7 requires the AS to reject
6
+ * approval if instance eligibility or the reviewed revision changed between
7
+ * the owner seeing the review surface and the approval landing.
8
+ *
9
+ * We enforce that by recomputing the review digest from what we are about to
10
+ * issue and comparing it to the digest the owner approved. Any drift — a newly
11
+ * connected instance changing an auto-resolved handle, a re-fetched
12
+ * declaration, an edited field list — moves the digest and kills the approval.
13
+ * This is a re-derivation, not a stored-value comparison, so it catches drift
14
+ * in inputs that were never persisted alongside the approval.
15
+ */
16
+ import { computeReviewDigest, type RequesterIdentity } from "./review.js";
17
+ import { type InstanceInventory } from "./resolve.js";
18
+ import { type DeclarationSnapshot, type Grant, type SelectionRequest } from "./types.js";
19
+ export type IssuanceFailureCode =
20
+ /** The reviewed revision or instance eligibility moved before approval. */
21
+ "stale_approval"
22
+ /** purpose/ai_training without explicit affirmative consent. */
23
+ | "ai_training_consent_required" | "resolution_failed" | "access_denied";
24
+ export interface IssuanceFailure {
25
+ code: IssuanceFailureCode;
26
+ message: string;
27
+ }
28
+ export type IssuanceResult = {
29
+ ok: true;
30
+ grant: Grant;
31
+ consentEvidence: ConsentEvidence;
32
+ } | {
33
+ ok: false;
34
+ failure: IssuanceFailure;
35
+ };
36
+ /**
37
+ * Retained consent evidence. §6 requires the normalized exact client claims,
38
+ * with attribution, to be bound into the final approval artifact and preserved
39
+ * here — while staying outside the grant, introspection, and RS enforcement.
40
+ * Keeping them in a separate structure from `Grant` is what makes that
41
+ * separation structural rather than a convention someone can forget.
42
+ */
43
+ export interface ConsentEvidence {
44
+ review_digest: string;
45
+ approved_at: string;
46
+ /** The exact snapshot identity consent was given against. */
47
+ declaration: {
48
+ source_id: string;
49
+ version: string;
50
+ digest: string;
51
+ };
52
+ client_claims?: {
53
+ attributed_to: string;
54
+ commitments: string[];
55
+ };
56
+ /** Recorded only for purpose codes that require it. */
57
+ explicit_ai_training_consent?: boolean;
58
+ }
59
+ export interface IssueGrantInput {
60
+ subjectId: string;
61
+ request: SelectionRequest;
62
+ /** The retained snapshot — the same one validation and review ran against. */
63
+ snapshot: DeclarationSnapshot;
64
+ /** Instance inventory as of *now*, re-read at approval time on purpose. */
65
+ inventory: InstanceInventory;
66
+ requester: RequesterIdentity;
67
+ /** The digest the owner actually approved. */
68
+ approvedReviewDigest: string;
69
+ /**
70
+ * Explicit affirmative consent for `purpose/ai_training`. Required only for
71
+ * that code (§6 AI training consent); ignored otherwise.
72
+ */
73
+ explicitAiTrainingConsent?: boolean;
74
+ /** AS-policy grant expiry. Absent means the grant never expires. */
75
+ expiresAt?: string;
76
+ streamDescriptions?: Record<string, string>;
77
+ now?: Date;
78
+ }
79
+ /**
80
+ * Resolve, re-verify the approval, and issue.
81
+ *
82
+ * Deliberately re-runs resolution against the *current* inventory rather than
83
+ * trusting the streams captured at review time. If the owner connected or
84
+ * disconnected an instance while the consent screen was open, resolution now
85
+ * produces different handles, the recomputed digest diverges, and we reject.
86
+ * Trusting the review-time streams would issue a grant the owner never saw.
87
+ */
88
+ export declare function issueGrant(input: IssueGrantInput): IssuanceResult;
89
+ /** Re-export so callers get the digest helper from the issuance seam. */
90
+ export { computeReviewDigest };
91
+ //# sourceMappingURL=issuance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issuance.d.ts","sourceRoot":"","sources":["../../src/pdpp/issuance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAEL,mBAAmB,EAEnB,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,KAAK,EACV,KAAK,gBAAgB,EACtB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,mBAAmB;AAC7B,2EAA2E;AACzE,gBAAgB;AAClB,gEAAgE;GAC9D,8BAA8B,GAC9B,mBAAmB,GACnB,eAAe,CAAC;AAEpB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,eAAe,EAAE,eAAe,CAAA;CAAE,GAC5D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,WAAW,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,aAAa,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACjE,uDAAuD;IACvD,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,8EAA8E;IAC9E,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,2EAA2E;IAC3E,SAAS,EAAE,iBAAiB,CAAC;IAC7B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,8CAA8C;IAC9C,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAMD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,CAwGjE;AAED,yEAAyE;AACzE,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * PDPP Core §7 grant issuance.
3
+ *
4
+ * Issuance is the moment every request-only convenience becomes a frozen fact.
5
+ * The guard that matters most here is staleness: §7 requires the AS to reject
6
+ * approval if instance eligibility or the reviewed revision changed between
7
+ * the owner seeing the review surface and the approval landing.
8
+ *
9
+ * We enforce that by recomputing the review digest from what we are about to
10
+ * issue and comparing it to the digest the owner approved. Any drift — a newly
11
+ * connected instance changing an auto-resolved handle, a re-fetched
12
+ * declaration, an edited field list — moves the digest and kills the approval.
13
+ * This is a re-derivation, not a stored-value comparison, so it catches drift
14
+ * in inputs that were never persisted alongside the approval.
15
+ */
16
+ import { randomBytes } from "node:crypto";
17
+ import { buildConsentReview, computeReviewDigest, normalizeClientClaims, } from "./review.js";
18
+ import { resolveSelection } from "./resolve.js";
19
+ import { AI_TRAINING_PURPOSE, PDPP_GRANT_VERSION, } from "./types.js";
20
+ function newGrantId() {
21
+ return `grt_${randomBytes(12).toString("hex")}`;
22
+ }
23
+ /**
24
+ * Resolve, re-verify the approval, and issue.
25
+ *
26
+ * Deliberately re-runs resolution against the *current* inventory rather than
27
+ * trusting the streams captured at review time. If the owner connected or
28
+ * disconnected an instance while the consent screen was open, resolution now
29
+ * produces different handles, the recomputed digest diverges, and we reject.
30
+ * Trusting the review-time streams would issue a grant the owner never saw.
31
+ */
32
+ export function issueGrant(input) {
33
+ const now = input.now ?? new Date();
34
+ if (input.request.purpose_code === AI_TRAINING_PURPOSE &&
35
+ input.explicitAiTrainingConsent !== true) {
36
+ return {
37
+ ok: false,
38
+ failure: {
39
+ code: "ai_training_consent_required",
40
+ message: "purpose/ai_training requires explicit affirmative consent before a grant may be issued",
41
+ },
42
+ };
43
+ }
44
+ const resolution = resolveSelection(input.request, input.snapshot, input.inventory);
45
+ if (!resolution.ok) {
46
+ return {
47
+ ok: false,
48
+ failure: {
49
+ code: "resolution_failed",
50
+ message: resolution.failure.message,
51
+ },
52
+ };
53
+ }
54
+ // Re-derive the review the owner would see from what we are about to issue.
55
+ const review = buildConsentReview({
56
+ subjectId: input.subjectId,
57
+ request: input.request,
58
+ snapshot: input.snapshot,
59
+ resolvedStreams: resolution.streams,
60
+ requester: input.requester,
61
+ expiresAt: input.expiresAt,
62
+ streamDescriptions: input.streamDescriptions,
63
+ });
64
+ if (review.review_digest !== input.approvedReviewDigest) {
65
+ return {
66
+ ok: false,
67
+ failure: {
68
+ code: "stale_approval",
69
+ message: "the reviewed selection or instance eligibility changed before approval; a new review is required",
70
+ },
71
+ };
72
+ }
73
+ const grant = {
74
+ version: PDPP_GRANT_VERSION,
75
+ grant_id: newGrantId(),
76
+ issued_at: now.toISOString(),
77
+ subject: { id: input.subjectId },
78
+ client: {
79
+ client_id: input.requester.client_id,
80
+ // §7: retained client_display is the AS-resolved identity, not raw
81
+ // inline input. `requester.display` already went through resolution.
82
+ ...(input.requester.display && {
83
+ client_display: input.requester.display,
84
+ }),
85
+ },
86
+ // Provenance comes from the accepted declaration, never from the request.
87
+ source: { kind: input.snapshot.source_kind, id: input.snapshot.source_id },
88
+ source_declaration: { version: input.snapshot.version },
89
+ purpose_code: input.request.purpose_code,
90
+ ...(input.request.purpose_description && {
91
+ purpose_description: input.request.purpose_description,
92
+ }),
93
+ access_mode: input.request.access_mode,
94
+ streams: resolution.streams,
95
+ ...(input.request.selection_preset && {
96
+ selection_preset: input.request.selection_preset,
97
+ }),
98
+ ...(input.request.retention && { retention: input.request.retention }),
99
+ ...(input.expiresAt && { expires_at: input.expiresAt }),
100
+ };
101
+ const normalizedClaims = normalizeClientClaims(input.request.client_claims);
102
+ const consentEvidence = {
103
+ review_digest: review.review_digest,
104
+ approved_at: now.toISOString(),
105
+ declaration: {
106
+ source_id: input.snapshot.source_id,
107
+ version: input.snapshot.version,
108
+ digest: input.snapshot.digest,
109
+ },
110
+ ...(normalizedClaims && {
111
+ client_claims: {
112
+ attributed_to: input.requester.display_name,
113
+ commitments: normalizedClaims,
114
+ },
115
+ }),
116
+ ...(input.request.purpose_code === AI_TRAINING_PURPOSE && {
117
+ explicit_ai_training_consent: true,
118
+ }),
119
+ };
120
+ return { ok: true, grant, consentEvidence };
121
+ }
122
+ /** Re-export so callers get the digest helper from the issuance seam. */
123
+ export { computeReviewDigest };
124
+ //# sourceMappingURL=issuance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issuance.js","sourceRoot":"","sources":["../../src/pdpp/issuance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * PKCE (RFC 7636) for the PDPP authorization-code flow.
3
+ *
4
+ * PDPP clients are public clients: a browser app or a desktop tool holds no
5
+ * client secret, so `client_id` + `redirect_uri` alone do not prove that the
6
+ * party redeeming a code is the party that requested it. An attacker who
7
+ * intercepts the code — a malicious app registered on the same custom URI
8
+ * scheme, a leaked Referer, a shoulder-surfed loopback redirect — can redeem
9
+ * it and receive a grant-bound token. RFC 7636 §1 describes exactly this.
10
+ *
11
+ * PKCE closes it: the client sends a challenge up front and must present the
12
+ * verifier at redemption. The AS binds the two. An intercepted code is useless
13
+ * without the verifier, which never leaves the requesting client.
14
+ *
15
+ * Only S256 is supported. `plain` is in RFC 7636 for constrained clients that
16
+ * cannot compute SHA-256, and it defeats the purpose here: an attacker who
17
+ * sees the challenge in the authorization request has the verifier. RFC 7636
18
+ * §4.2 says a server MUST support S256 and clients MUST use it where they can;
19
+ * for a protocol carrying personal data there is no reason to accept the weak
20
+ * mode, so this AS declines `plain` explicitly rather than silently.
21
+ */
22
+ /** The only challenge method this AS accepts. */
23
+ export declare const PKCE_METHOD_S256 = "S256";
24
+ /**
25
+ * base64url per RFC 7636 §appendix A: standard base64 with `+/` mapped to
26
+ * `-_` and padding stripped. Node's `base64url` encoding already does this.
27
+ */
28
+ export declare function computeS256Challenge(verifier: string): string;
29
+ export type PkceFailureCode = "missing_verifier" | "invalid_verifier" | "unsupported_method" | "missing_challenge";
30
+ export interface PkceFailure {
31
+ code: PkceFailureCode;
32
+ message: string;
33
+ }
34
+ /**
35
+ * Validate a challenge at authorization time.
36
+ *
37
+ * Rejecting an unsupported method here, rather than at redemption, means a
38
+ * client learns its flow is unusable before the owner is asked to consent to
39
+ * anything — failing after consent would waste a real human decision.
40
+ */
41
+ export declare function validateCodeChallenge(challenge: string | undefined, method: string | undefined, options: {
42
+ required: boolean;
43
+ }): PkceFailure | null;
44
+ /**
45
+ * Verify a presented verifier against the stored challenge at redemption.
46
+ *
47
+ * The comparison is constant-time. A challenge is not a secret in the way a
48
+ * password is — it is already public in the authorization request — but the
49
+ * verifier is, and an early-exit comparison over attacker-chosen input is a
50
+ * habit worth not forming in an authorization server.
51
+ */
52
+ export declare function verifyCodeVerifier(verifier: string | undefined, storedChallenge: string | null, storedMethod: string | null): PkceFailure | null;
53
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/pdpp/pkce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,iDAAiD;AACjD,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAKvC;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,MAAM,MAAM,eAAe,GACvB,kBAAkB,GAClB,kBAAkB,GAClB,oBAAoB,GACpB,mBAAmB,CAAC;AAExB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC7B,WAAW,GAAG,IAAI,CAoBpB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,eAAe,EAAE,MAAM,GAAG,IAAI,EAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,GAC1B,WAAW,GAAG,IAAI,CA8CpB"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * PKCE (RFC 7636) for the PDPP authorization-code flow.
3
+ *
4
+ * PDPP clients are public clients: a browser app or a desktop tool holds no
5
+ * client secret, so `client_id` + `redirect_uri` alone do not prove that the
6
+ * party redeeming a code is the party that requested it. An attacker who
7
+ * intercepts the code — a malicious app registered on the same custom URI
8
+ * scheme, a leaked Referer, a shoulder-surfed loopback redirect — can redeem
9
+ * it and receive a grant-bound token. RFC 7636 §1 describes exactly this.
10
+ *
11
+ * PKCE closes it: the client sends a challenge up front and must present the
12
+ * verifier at redemption. The AS binds the two. An intercepted code is useless
13
+ * without the verifier, which never leaves the requesting client.
14
+ *
15
+ * Only S256 is supported. `plain` is in RFC 7636 for constrained clients that
16
+ * cannot compute SHA-256, and it defeats the purpose here: an attacker who
17
+ * sees the challenge in the authorization request has the verifier. RFC 7636
18
+ * §4.2 says a server MUST support S256 and clients MUST use it where they can;
19
+ * for a protocol carrying personal data there is no reason to accept the weak
20
+ * mode, so this AS declines `plain` explicitly rather than silently.
21
+ */
22
+ import { createHash, timingSafeEqual } from "node:crypto";
23
+ /** The only challenge method this AS accepts. */
24
+ export const PKCE_METHOD_S256 = "S256";
25
+ /** RFC 7636 §4.1: the verifier is 43–128 characters of unreserved ASCII. */
26
+ const VERIFIER_RE = /^[A-Za-z0-9\-._~]{43,128}$/;
27
+ /**
28
+ * base64url per RFC 7636 §appendix A: standard base64 with `+/` mapped to
29
+ * `-_` and padding stripped. Node's `base64url` encoding already does this.
30
+ */
31
+ export function computeS256Challenge(verifier) {
32
+ return createHash("sha256").update(verifier, "ascii").digest("base64url");
33
+ }
34
+ /**
35
+ * Validate a challenge at authorization time.
36
+ *
37
+ * Rejecting an unsupported method here, rather than at redemption, means a
38
+ * client learns its flow is unusable before the owner is asked to consent to
39
+ * anything — failing after consent would waste a real human decision.
40
+ */
41
+ export function validateCodeChallenge(challenge, method, options) {
42
+ if (challenge === undefined || challenge.length === 0) {
43
+ if (!options.required)
44
+ return null;
45
+ return {
46
+ code: "missing_challenge",
47
+ message: "code_challenge is required for the authorization code flow",
48
+ };
49
+ }
50
+ // An absent method defaults to `plain` under RFC 7636 §4.3. We do not accept
51
+ // plain, so an omitted method is an explicit error rather than a silent
52
+ // downgrade to the mode we refuse.
53
+ if (method !== PKCE_METHOD_S256) {
54
+ return {
55
+ code: "unsupported_method",
56
+ message: `code_challenge_method must be ${PKCE_METHOD_S256}; 'plain' is not accepted`,
57
+ };
58
+ }
59
+ return null;
60
+ }
61
+ /**
62
+ * Verify a presented verifier against the stored challenge at redemption.
63
+ *
64
+ * The comparison is constant-time. A challenge is not a secret in the way a
65
+ * password is — it is already public in the authorization request — but the
66
+ * verifier is, and an early-exit comparison over attacker-chosen input is a
67
+ * habit worth not forming in an authorization server.
68
+ */
69
+ export function verifyCodeVerifier(verifier, storedChallenge, storedMethod) {
70
+ if (storedChallenge === null || storedChallenge.length === 0) {
71
+ // The code was issued without PKCE. Whether that is allowed is the
72
+ // authorization endpoint's decision (see `validateCodeChallenge`); by the
73
+ // time a code exists, there is nothing to verify against.
74
+ return null;
75
+ }
76
+ if (storedMethod !== PKCE_METHOD_S256) {
77
+ // A stored non-S256 method means the code was minted by a path that did
78
+ // not enforce the method check. Fail closed rather than honouring it.
79
+ return {
80
+ code: "unsupported_method",
81
+ message: "authorization code carries an unsupported code_challenge_method",
82
+ };
83
+ }
84
+ if (verifier === undefined || verifier.length === 0) {
85
+ return {
86
+ code: "missing_verifier",
87
+ message: "code_verifier is required to redeem this authorization code",
88
+ };
89
+ }
90
+ if (!VERIFIER_RE.test(verifier)) {
91
+ // Enforcing the shape stops a trivially-guessable short verifier from
92
+ // being accepted just because it happens to hash correctly.
93
+ return {
94
+ code: "invalid_verifier",
95
+ message: "code_verifier must be 43-128 characters of [A-Za-z0-9-._~] (RFC 7636 §4.1)",
96
+ };
97
+ }
98
+ const computed = computeS256Challenge(verifier);
99
+ const a = Buffer.from(computed, "utf8");
100
+ const b = Buffer.from(storedChallenge, "utf8");
101
+ if (a.length !== b.length || !timingSafeEqual(a, b)) {
102
+ return {
103
+ code: "invalid_verifier",
104
+ message: "code_verifier does not match the code_challenge",
105
+ };
106
+ }
107
+ return null;
108
+ }
109
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/pdpp/pkce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,iDAAiD;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,4EAA4E;AAC5E,MAAM,WAAW,GAAG,4BAA4B,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5E,CAAC;AAaD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAA6B,EAC7B,MAA0B,EAC1B,OAA8B;IAE9B,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,4DAA4D;SACtE,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,wEAAwE;IACxE,mCAAmC;IACnC,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,iCAAiC,gBAAgB,2BAA2B;SACtF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAA4B,EAC5B,eAA8B,EAC9B,YAA2B;IAE3B,IAAI,eAAe,KAAK,IAAI,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,mEAAmE;QACnE,0EAA0E;QAC1E,0DAA0D;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,YAAY,KAAK,gBAAgB,EAAE,CAAC;QACtC,wEAAwE;QACxE,sEAAsE;QACtE,OAAO;YACL,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EACL,iEAAiE;SACpE,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,6DAA6D;SACvE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,sEAAsE;QACtE,4DAA4D;QAC5D,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,OAAO,EACL,4EAA4E;SAC/E,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,iDAAiD;SAC3D,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Redirect URI validation (RFC 6749 §3.1.2, §10.6; RFC 8252 §7.3).
3
+ *
4
+ * The authorization code travels to the client in this redirect. If the AS
5
+ * honours whatever `redirect_uri` a caller supplies, the attack is direct: an
6
+ * attacker opens an authorization session pointing at their own host, the
7
+ * owner sees a consent screen that looks entirely legitimate (it is — the AS
8
+ * generated it), approves, and the code is delivered to the attacker.
9
+ *
10
+ * **PKCE does not mitigate this.** PKCE binds the code to whoever chose the
11
+ * challenge, and in this attack that is the attacker. They hold the matching
12
+ * verifier, so they redeem the stolen code and receive a grant-bound token
13
+ * over the owner's personal data. Code interception and code *misdelivery* are
14
+ * different problems; §10.6 is the one that covers misdelivery.
15
+ *
16
+ * Validation is by exact match against the client's registered redirect URIs.
17
+ * RFC 6749 §3.1.2.2 requires registration, and §3.1.2.3 allows fuzzier
18
+ * matching only for clients that registered a full URI — we do not take that
19
+ * latitude. Prefix or subdomain matching is where open-redirect bugs live: a
20
+ * registered `https://app.example.com/cb` "matching"
21
+ * `https://app.example.com.evil.test/cb` or `https://app.example.com/cb/../x`
22
+ * is the classic failure. Exact string equality after normalization has no
23
+ * such edge, and the cost is that a client registers each callback it uses.
24
+ */
25
+ export type RedirectFailureCode = "unregistered_redirect_uri" | "insecure_redirect_uri" | "malformed_redirect_uri" | "no_registered_redirect_uris";
26
+ export interface RedirectFailure {
27
+ code: RedirectFailureCode;
28
+ message: string;
29
+ }
30
+ /**
31
+ * Registered metadata for a client, as the deployment holds it.
32
+ *
33
+ * `redirect_uris` is required and non-empty for the code flow: a client with
34
+ * no registered callback cannot safely receive a code, and defaulting to
35
+ * "accept anything" would reintroduce exactly the hole this module closes.
36
+ */
37
+ export interface RegisteredRedirectPolicy {
38
+ client_id: string;
39
+ redirect_uris: string[];
40
+ }
41
+ /**
42
+ * Validate a requested redirect URI against the client's registered set.
43
+ *
44
+ * Returns null when the URI is acceptable. Every rejection is deliberately
45
+ * the same shape, so a caller probing for registered URIs learns only that
46
+ * theirs was not one.
47
+ */
48
+ export declare function validateRedirectUri(requested: string | undefined, policy: RegisteredRedirectPolicy | null): RedirectFailure | null;
49
+ /**
50
+ * Whether a redirect failure may be reported *by redirecting*.
51
+ *
52
+ * RFC 6749 §4.1.2.1 is explicit: when the redirect URI is invalid or
53
+ * unregistered, the AS MUST NOT automatically redirect the user-agent to it.
54
+ * Doing so would turn the authorization endpoint into an open redirector and
55
+ * would hand the attacker the error response they were fishing for. Every
56
+ * failure from `validateRedirectUri` is therefore reported directly to the
57
+ * caller and never as a redirect.
58
+ */
59
+ export declare const REDIRECT_FAILURES_ARE_NEVER_REDIRECTED: true;
60
+ //# sourceMappingURL=redirect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirect.d.ts","sourceRoot":"","sources":["../../src/pdpp/redirect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,MAAM,MAAM,mBAAmB,GAC3B,2BAA2B,GAC3B,uBAAuB,GACvB,wBAAwB,GACxB,6BAA6B,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAmBD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,EAAE,wBAAwB,GAAG,IAAI,GACtC,eAAe,GAAG,IAAI,CAqExB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,sCAAsC,EAAG,IAAa,CAAC"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Redirect URI validation (RFC 6749 §3.1.2, §10.6; RFC 8252 §7.3).
3
+ *
4
+ * The authorization code travels to the client in this redirect. If the AS
5
+ * honours whatever `redirect_uri` a caller supplies, the attack is direct: an
6
+ * attacker opens an authorization session pointing at their own host, the
7
+ * owner sees a consent screen that looks entirely legitimate (it is — the AS
8
+ * generated it), approves, and the code is delivered to the attacker.
9
+ *
10
+ * **PKCE does not mitigate this.** PKCE binds the code to whoever chose the
11
+ * challenge, and in this attack that is the attacker. They hold the matching
12
+ * verifier, so they redeem the stolen code and receive a grant-bound token
13
+ * over the owner's personal data. Code interception and code *misdelivery* are
14
+ * different problems; §10.6 is the one that covers misdelivery.
15
+ *
16
+ * Validation is by exact match against the client's registered redirect URIs.
17
+ * RFC 6749 §3.1.2.2 requires registration, and §3.1.2.3 allows fuzzier
18
+ * matching only for clients that registered a full URI — we do not take that
19
+ * latitude. Prefix or subdomain matching is where open-redirect bugs live: a
20
+ * registered `https://app.example.com/cb` "matching"
21
+ * `https://app.example.com.evil.test/cb` or `https://app.example.com/cb/../x`
22
+ * is the classic failure. Exact string equality after normalization has no
23
+ * such edge, and the cost is that a client registers each callback it uses.
24
+ */
25
+ /** Loopback hosts, where RFC 8252 §7.3 permits plain http for native apps. */
26
+ const LOOPBACK_HOSTS = new Set(["127.0.0.1", "[::1]", "::1", "localhost"]);
27
+ /**
28
+ * Normalize for comparison without loosening the match.
29
+ *
30
+ * `URL` resolves dot-segments and lowercases scheme and host, so
31
+ * `https://App.Example.com/cb/../cb` and `https://app.example.com/cb` compare
32
+ * equal — that is canonicalization, not fuzzy matching. Query and fragment are
33
+ * preserved, because a registered URI that carries a query is a different
34
+ * endpoint from one that does not.
35
+ */
36
+ function normalize(raw) {
37
+ try {
38
+ return new URL(raw);
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ /**
45
+ * Validate a requested redirect URI against the client's registered set.
46
+ *
47
+ * Returns null when the URI is acceptable. Every rejection is deliberately
48
+ * the same shape, so a caller probing for registered URIs learns only that
49
+ * theirs was not one.
50
+ */
51
+ export function validateRedirectUri(requested, policy) {
52
+ if (!requested || requested.length === 0) {
53
+ return {
54
+ code: "malformed_redirect_uri",
55
+ message: "redirect_uri is required",
56
+ };
57
+ }
58
+ const url = normalize(requested);
59
+ if (!url) {
60
+ return {
61
+ code: "malformed_redirect_uri",
62
+ message: "redirect_uri is not a valid absolute URI",
63
+ };
64
+ }
65
+ // RFC 6749 §3.1.2: the endpoint URI MUST NOT include a fragment. A fragment
66
+ // is also how a target gets smuggled past a naive prefix check.
67
+ if (url.hash.length > 0) {
68
+ return {
69
+ code: "malformed_redirect_uri",
70
+ message: "redirect_uri must not include a fragment component",
71
+ };
72
+ }
73
+ // Scheme gate before anything else. `javascript:` and `data:` are the
74
+ // XSS-on-redirect shapes; everything non-http(s) is refused outright rather
75
+ // than enumerated, so a scheme nobody thought of is refused by default.
76
+ const isLoopback = LOOPBACK_HOSTS.has(url.hostname);
77
+ if (url.protocol === "http:") {
78
+ // RFC 8252 §7.3: loopback http is the native-app redirect, and is fine.
79
+ if (!isLoopback) {
80
+ return {
81
+ code: "insecure_redirect_uri",
82
+ message: "redirect_uri must use https except for loopback addresses",
83
+ };
84
+ }
85
+ }
86
+ else if (url.protocol !== "https:") {
87
+ return {
88
+ code: "insecure_redirect_uri",
89
+ message: `redirect_uri scheme '${url.protocol}' is not permitted`,
90
+ };
91
+ }
92
+ if (!policy || policy.redirect_uris.length === 0) {
93
+ // No registration means no safe target. Failing closed here is the whole
94
+ // point: an AS that falls back to "trust the request" when it has no
95
+ // policy has no policy.
96
+ return {
97
+ code: "no_registered_redirect_uris",
98
+ message: "client has no registered redirect URIs; register one before requesting authorization",
99
+ };
100
+ }
101
+ // Exact match after canonicalization. No prefix, no subdomain, no wildcard.
102
+ const matched = policy.redirect_uris.some((candidate) => {
103
+ const registered = normalize(candidate);
104
+ return registered !== null && registered.toString() === url.toString();
105
+ });
106
+ if (!matched) {
107
+ return {
108
+ code: "unregistered_redirect_uri",
109
+ message: "redirect_uri does not exactly match a registered redirect URI",
110
+ };
111
+ }
112
+ return null;
113
+ }
114
+ /**
115
+ * Whether a redirect failure may be reported *by redirecting*.
116
+ *
117
+ * RFC 6749 §4.1.2.1 is explicit: when the redirect URI is invalid or
118
+ * unregistered, the AS MUST NOT automatically redirect the user-agent to it.
119
+ * Doing so would turn the authorization endpoint into an open redirector and
120
+ * would hand the attacker the error response they were fishing for. Every
121
+ * failure from `validateRedirectUri` is therefore reported directly to the
122
+ * caller and never as a redirect.
123
+ */
124
+ export const REDIRECT_FAILURES_ARE_NEVER_REDIRECTED = true;
125
+ //# sourceMappingURL=redirect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirect.js","sourceRoot":"","sources":["../../src/pdpp/redirect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,8EAA8E;AAC9E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;AAyB3E;;;;;;;;GAQG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAA6B,EAC7B,MAAuC;IAEvC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO;YACL,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,0BAA0B;SACpC,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;YACL,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,0CAA0C;SACpD,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,gEAAgE;IAChE,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,oDAAoD;SAC9D,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,4EAA4E;IAC5E,wEAAwE;IACxE,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC7B,wEAAwE;QACxE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;gBACL,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,2DAA2D;aACrE,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,wBAAwB,GAAG,CAAC,QAAQ,oBAAoB;SAClE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,yEAAyE;QACzE,qEAAqE;QACrE,wBAAwB;QACxB,OAAO;YACL,IAAI,EAAE,6BAA6B;YACnC,OAAO,EACL,sFAAsF;SACzF,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;QACtD,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,UAAU,KAAK,IAAI,IAAI,UAAU,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE,+DAA+D;SACzE,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG,IAAa,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * PDPP Core §6→§7 resolution: turn a validated selection request into the
3
+ * explicit grant facts that get frozen at issuance.
4
+ *
5
+ * Every request-only convenience dies here. Wildcards and presets expand to
6
+ * concrete stream rows, views resolve to field lists, omitted fields become
7
+ * the declaration's full field set, omitted instance handles resolve against
8
+ * the owner's connection inventory, and `time_range` freezes against the
9
+ * declaration's `consent_time_field`. §7 is explicit that none of these
10
+ * conveniences are continuing authority in the grant — the RS must never have
11
+ * to resolve anything, which is also what the AS→RS contract promises.
12
+ *
13
+ * Resolution runs against the same retained snapshot `selection.ts` validated
14
+ * against. Passing a newer declaration here is the bug §9 AS item 16 exists to
15
+ * prevent: it would let a later declaration widen an in-flight authorization.
16
+ */
17
+ import { type DeclarationSnapshot, type SelectionRequest, type StreamGrant } from "./types.js";
18
+ /**
19
+ * The owner's connected instances for a source, as the AS knows them at
20
+ * resolution time. §6 is strict that omitting `instance_ids` never means
21
+ * fan-in: the AS resolves exactly one eligible handle or requires an explicit
22
+ * owner choice.
23
+ */
24
+ export interface InstanceInventory {
25
+ /** Eligible opaque handles for a given stream, in the owner's connection state. */
26
+ eligibleFor(streamName: string): string[];
27
+ }
28
+ export type ResolutionFailureCode = "unknown_stream" | "unknown_instance" | "instance_choice_required" | "no_eligible_instance" | "unknown_view" | "empty_field_set";
29
+ export interface ResolutionFailure {
30
+ code: ResolutionFailureCode;
31
+ message: string;
32
+ /** The stream that could not be resolved, when the failure is stream-scoped. */
33
+ stream?: string;
34
+ /** For `instance_choice_required`: the handles the owner must choose between. */
35
+ candidates?: string[];
36
+ }
37
+ export type ResolutionResult = {
38
+ ok: true;
39
+ streams: StreamGrant[];
40
+ } | {
41
+ ok: false;
42
+ failure: ResolutionFailure;
43
+ };
44
+ /**
45
+ * Resolve every enforcement axis for a validated selection request.
46
+ *
47
+ * Call this before showing the final approval surface: §7 requires the
48
+ * approval artifact to contain the exact resolved instance handles, stream
49
+ * names, fields, resources, and temporal bounds, which only exist once this
50
+ * has run.
51
+ */
52
+ export declare function resolveSelection(request: SelectionRequest, snapshot: DeclarationSnapshot, inventory: InstanceInventory): ResolutionResult;
53
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/pdpp/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,KAAK,mBAAmB,EAExB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAGjB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC3C;AAED,MAAM,MAAM,qBAAqB,GAC7B,gBAAgB,GAChB,kBAAkB,GAClB,0BAA0B,GAC1B,sBAAsB,GACtB,cAAc,GACd,iBAAiB,CAAC;AAEtB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAAC;AA6N9C;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,EAAE,iBAAiB,GAC3B,gBAAgB,CA0BlB"}