@weaveprotocol/core 0.1.0

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 (430) hide show
  1. package/README.md +1106 -0
  2. package/dist/elements/auth-styles.d.ts +18 -0
  3. package/dist/elements/auth-styles.d.ts.map +1 -0
  4. package/dist/elements/auth-styles.js +150 -0
  5. package/dist/elements/auth-styles.js.map +1 -0
  6. package/dist/elements/dom.d.ts +28 -0
  7. package/dist/elements/dom.d.ts.map +1 -0
  8. package/dist/elements/dom.js +74 -0
  9. package/dist/elements/dom.js.map +1 -0
  10. package/dist/elements/index.d.ts +13 -0
  11. package/dist/elements/index.d.ts.map +1 -0
  12. package/dist/elements/index.js +11 -0
  13. package/dist/elements/index.js.map +1 -0
  14. package/dist/elements/weave-auth.d.ts +52 -0
  15. package/dist/elements/weave-auth.d.ts.map +1 -0
  16. package/dist/elements/weave-auth.js +427 -0
  17. package/dist/elements/weave-auth.js.map +1 -0
  18. package/dist/identity/account-store.d.ts +113 -0
  19. package/dist/identity/account-store.d.ts.map +1 -0
  20. package/dist/identity/account-store.js +305 -0
  21. package/dist/identity/account-store.js.map +1 -0
  22. package/dist/identity/account-vault.d.ts +199 -0
  23. package/dist/identity/account-vault.d.ts.map +1 -0
  24. package/dist/identity/account-vault.js +251 -0
  25. package/dist/identity/account-vault.js.map +1 -0
  26. package/dist/identity/agent-note.d.ts +19 -0
  27. package/dist/identity/agent-note.d.ts.map +1 -0
  28. package/dist/identity/agent-note.js +29 -0
  29. package/dist/identity/agent-note.js.map +1 -0
  30. package/dist/identity/crypto-p256.d.ts +7 -0
  31. package/dist/identity/crypto-p256.d.ts.map +1 -0
  32. package/dist/identity/crypto-p256.js +84 -0
  33. package/dist/identity/crypto-p256.js.map +1 -0
  34. package/dist/identity/device-key.d.ts +60 -0
  35. package/dist/identity/device-key.d.ts.map +1 -0
  36. package/dist/identity/device-key.js +103 -0
  37. package/dist/identity/device-key.js.map +1 -0
  38. package/dist/identity/did.d.ts +22 -0
  39. package/dist/identity/did.d.ts.map +1 -0
  40. package/dist/identity/did.js +37 -0
  41. package/dist/identity/did.js.map +1 -0
  42. package/dist/identity/folder-account.d.ts +65 -0
  43. package/dist/identity/folder-account.d.ts.map +1 -0
  44. package/dist/identity/folder-account.js +115 -0
  45. package/dist/identity/folder-account.js.map +1 -0
  46. package/dist/identity/identity-manager.d.ts +36 -0
  47. package/dist/identity/identity-manager.d.ts.map +1 -0
  48. package/dist/identity/identity-manager.js +115 -0
  49. package/dist/identity/identity-manager.js.map +1 -0
  50. package/dist/identity/index.d.ts +10 -0
  51. package/dist/identity/index.d.ts.map +1 -0
  52. package/dist/identity/index.js +10 -0
  53. package/dist/identity/index.js.map +1 -0
  54. package/dist/identity/keys.d.ts +24 -0
  55. package/dist/identity/keys.d.ts.map +1 -0
  56. package/dist/identity/keys.js +38 -0
  57. package/dist/identity/keys.js.map +1 -0
  58. package/dist/identity/pairing.d.ts +83 -0
  59. package/dist/identity/pairing.d.ts.map +1 -0
  60. package/dist/identity/pairing.js +120 -0
  61. package/dist/identity/pairing.js.map +1 -0
  62. package/dist/identity/passkey-diagnostics.d.ts +54 -0
  63. package/dist/identity/passkey-diagnostics.d.ts.map +1 -0
  64. package/dist/identity/passkey-diagnostics.js +178 -0
  65. package/dist/identity/passkey-diagnostics.js.map +1 -0
  66. package/dist/identity/recovery-code.d.ts +50 -0
  67. package/dist/identity/recovery-code.d.ts.map +1 -0
  68. package/dist/identity/recovery-code.js +116 -0
  69. package/dist/identity/recovery-code.js.map +1 -0
  70. package/dist/identity/root-signer.d.ts +59 -0
  71. package/dist/identity/root-signer.d.ts.map +1 -0
  72. package/dist/identity/root-signer.js +44 -0
  73. package/dist/identity/root-signer.js.map +1 -0
  74. package/dist/identity/ucan.d.ts +164 -0
  75. package/dist/identity/ucan.d.ts.map +1 -0
  76. package/dist/identity/ucan.js +273 -0
  77. package/dist/identity/ucan.js.map +1 -0
  78. package/dist/identity/webauthn.d.ts +87 -0
  79. package/dist/identity/webauthn.d.ts.map +1 -0
  80. package/dist/identity/webauthn.js +155 -0
  81. package/dist/identity/webauthn.js.map +1 -0
  82. package/dist/index.d.ts +116 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +85 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/network/index.d.ts +17 -0
  87. package/dist/network/index.d.ts.map +1 -0
  88. package/dist/network/index.js +10 -0
  89. package/dist/network/index.js.map +1 -0
  90. package/dist/network/introductions.d.ts +85 -0
  91. package/dist/network/introductions.d.ts.map +1 -0
  92. package/dist/network/introductions.js +94 -0
  93. package/dist/network/introductions.js.map +1 -0
  94. package/dist/network/local-transport.d.ts +22 -0
  95. package/dist/network/local-transport.d.ts.map +1 -0
  96. package/dist/network/local-transport.js +55 -0
  97. package/dist/network/local-transport.js.map +1 -0
  98. package/dist/network/mesh.d.ts +31 -0
  99. package/dist/network/mesh.d.ts.map +1 -0
  100. package/dist/network/mesh.js +332 -0
  101. package/dist/network/mesh.js.map +1 -0
  102. package/dist/network/multi-signaling.d.ts +29 -0
  103. package/dist/network/multi-signaling.d.ts.map +1 -0
  104. package/dist/network/multi-signaling.js +125 -0
  105. package/dist/network/multi-signaling.js.map +1 -0
  106. package/dist/network/network-manager.d.ts +37 -0
  107. package/dist/network/network-manager.d.ts.map +1 -0
  108. package/dist/network/network-manager.js +64 -0
  109. package/dist/network/network-manager.js.map +1 -0
  110. package/dist/network/peer-auth.d.ts +98 -0
  111. package/dist/network/peer-auth.d.ts.map +1 -0
  112. package/dist/network/peer-auth.js +86 -0
  113. package/dist/network/peer-auth.js.map +1 -0
  114. package/dist/network/rtc-transport.d.ts +18 -0
  115. package/dist/network/rtc-transport.d.ts.map +1 -0
  116. package/dist/network/rtc-transport.js +149 -0
  117. package/dist/network/rtc-transport.js.map +1 -0
  118. package/dist/network/signaling.d.ts +40 -0
  119. package/dist/network/signaling.d.ts.map +1 -0
  120. package/dist/network/signaling.js +124 -0
  121. package/dist/network/signaling.js.map +1 -0
  122. package/dist/network/transport.d.ts +50 -0
  123. package/dist/network/transport.d.ts.map +1 -0
  124. package/dist/network/transport.js +13 -0
  125. package/dist/network/transport.js.map +1 -0
  126. package/dist/network/ws-transport.d.ts +42 -0
  127. package/dist/network/ws-transport.d.ts.map +1 -0
  128. package/dist/network/ws-transport.js +194 -0
  129. package/dist/network/ws-transport.js.map +1 -0
  130. package/dist/node/actions.d.ts +62 -0
  131. package/dist/node/actions.d.ts.map +1 -0
  132. package/dist/node/actions.js +500 -0
  133. package/dist/node/actions.js.map +1 -0
  134. package/dist/node/carrier.d.ts +85 -0
  135. package/dist/node/carrier.d.ts.map +1 -0
  136. package/dist/node/carrier.js +192 -0
  137. package/dist/node/carrier.js.map +1 -0
  138. package/dist/node/copy.d.ts +38 -0
  139. package/dist/node/copy.d.ts.map +1 -0
  140. package/dist/node/copy.js +53 -0
  141. package/dist/node/copy.js.map +1 -0
  142. package/dist/node/index.d.ts +16 -0
  143. package/dist/node/index.d.ts.map +1 -0
  144. package/dist/node/index.js +11 -0
  145. package/dist/node/index.js.map +1 -0
  146. package/dist/node/node.d.ts +12 -0
  147. package/dist/node/node.d.ts.map +1 -0
  148. package/dist/node/node.js +872 -0
  149. package/dist/node/node.js.map +1 -0
  150. package/dist/node/space-runtime.d.ts +144 -0
  151. package/dist/node/space-runtime.d.ts.map +1 -0
  152. package/dist/node/space-runtime.js +1221 -0
  153. package/dist/node/space-runtime.js.map +1 -0
  154. package/dist/node/stores.d.ts +45 -0
  155. package/dist/node/stores.d.ts.map +1 -0
  156. package/dist/node/stores.js +31 -0
  157. package/dist/node/stores.js.map +1 -0
  158. package/dist/node/types.d.ts +508 -0
  159. package/dist/node/types.d.ts.map +1 -0
  160. package/dist/node/types.js +2 -0
  161. package/dist/node/types.js.map +1 -0
  162. package/dist/privacy/index.d.ts +4 -0
  163. package/dist/privacy/index.d.ts.map +1 -0
  164. package/dist/privacy/index.js +4 -0
  165. package/dist/privacy/index.js.map +1 -0
  166. package/dist/privacy/key-distribution.d.ts +42 -0
  167. package/dist/privacy/key-distribution.d.ts.map +1 -0
  168. package/dist/privacy/key-distribution.js +50 -0
  169. package/dist/privacy/key-distribution.js.map +1 -0
  170. package/dist/privacy/privacy-guard.d.ts +24 -0
  171. package/dist/privacy/privacy-guard.d.ts.map +1 -0
  172. package/dist/privacy/privacy-guard.js +87 -0
  173. package/dist/privacy/privacy-guard.js.map +1 -0
  174. package/dist/privacy/space-encryption.d.ts +48 -0
  175. package/dist/privacy/space-encryption.d.ts.map +1 -0
  176. package/dist/privacy/space-encryption.js +61 -0
  177. package/dist/privacy/space-encryption.js.map +1 -0
  178. package/dist/query/engine.d.ts +27 -0
  179. package/dist/query/engine.d.ts.map +1 -0
  180. package/dist/query/engine.js +84 -0
  181. package/dist/query/engine.js.map +1 -0
  182. package/dist/query/filter.d.ts +15 -0
  183. package/dist/query/filter.d.ts.map +1 -0
  184. package/dist/query/filter.js +207 -0
  185. package/dist/query/filter.js.map +1 -0
  186. package/dist/query/types.d.ts +144 -0
  187. package/dist/query/types.d.ts.map +1 -0
  188. package/dist/query/types.js +22 -0
  189. package/dist/query/types.js.map +1 -0
  190. package/dist/react/context.d.ts +81 -0
  191. package/dist/react/context.d.ts.map +1 -0
  192. package/dist/react/context.js +95 -0
  193. package/dist/react/context.js.map +1 -0
  194. package/dist/react/index.d.ts +40 -0
  195. package/dist/react/index.d.ts.map +1 -0
  196. package/dist/react/index.js +36 -0
  197. package/dist/react/index.js.map +1 -0
  198. package/dist/react/use-live.d.ts +16 -0
  199. package/dist/react/use-live.d.ts.map +1 -0
  200. package/dist/react/use-live.js +55 -0
  201. package/dist/react/use-live.js.map +1 -0
  202. package/dist/react/use-query.d.ts +17 -0
  203. package/dist/react/use-query.d.ts.map +1 -0
  204. package/dist/react/use-query.js +23 -0
  205. package/dist/react/use-query.js.map +1 -0
  206. package/dist/react/use-space.d.ts +29 -0
  207. package/dist/react/use-space.d.ts.map +1 -0
  208. package/dist/react/use-space.js +48 -0
  209. package/dist/react/use-space.js.map +1 -0
  210. package/dist/react/use-spaces.d.ts +19 -0
  211. package/dist/react/use-spaces.d.ts.map +1 -0
  212. package/dist/react/use-spaces.js +55 -0
  213. package/dist/react/use-spaces.js.map +1 -0
  214. package/dist/react/use-weave-auth.d.ts +10 -0
  215. package/dist/react/use-weave-auth.d.ts.map +1 -0
  216. package/dist/react/use-weave-auth.js +15 -0
  217. package/dist/react/use-weave-auth.js.map +1 -0
  218. package/dist/react/weave-auth.d.ts +17 -0
  219. package/dist/react/weave-auth.d.ts.map +1 -0
  220. package/dist/react/weave-auth.js +38 -0
  221. package/dist/react/weave-auth.js.map +1 -0
  222. package/dist/records/describe.d.ts +38 -0
  223. package/dist/records/describe.d.ts.map +1 -0
  224. package/dist/records/describe.js +101 -0
  225. package/dist/records/describe.js.map +1 -0
  226. package/dist/records/links.d.ts +14 -0
  227. package/dist/records/links.d.ts.map +1 -0
  228. package/dist/records/links.js +25 -0
  229. package/dist/records/links.js.map +1 -0
  230. package/dist/records/rules.d.ts +59 -0
  231. package/dist/records/rules.d.ts.map +1 -0
  232. package/dist/records/rules.js +118 -0
  233. package/dist/records/rules.js.map +1 -0
  234. package/dist/records/version.d.ts +54 -0
  235. package/dist/records/version.d.ts.map +1 -0
  236. package/dist/records/version.js +70 -0
  237. package/dist/records/version.js.map +1 -0
  238. package/dist/schema/collection-def.d.ts +96 -0
  239. package/dist/schema/collection-def.d.ts.map +1 -0
  240. package/dist/schema/collection-def.js +272 -0
  241. package/dist/schema/collection-def.js.map +1 -0
  242. package/dist/schema/expression.d.ts +69 -0
  243. package/dist/schema/expression.d.ts.map +1 -0
  244. package/dist/schema/expression.js +92 -0
  245. package/dist/schema/expression.js.map +1 -0
  246. package/dist/schema/index.d.ts +4 -0
  247. package/dist/schema/index.d.ts.map +1 -0
  248. package/dist/schema/index.js +4 -0
  249. package/dist/schema/index.js.map +1 -0
  250. package/dist/schema/schema-engine.d.ts +42 -0
  251. package/dist/schema/schema-engine.d.ts.map +1 -0
  252. package/dist/schema/schema-engine.js +36 -0
  253. package/dist/schema/schema-engine.js.map +1 -0
  254. package/dist/schema/signer.d.ts +27 -0
  255. package/dist/schema/signer.d.ts.map +1 -0
  256. package/dist/schema/signer.js +36 -0
  257. package/dist/schema/signer.js.map +1 -0
  258. package/dist/schemas/apps.d.ts +88 -0
  259. package/dist/schemas/apps.d.ts.map +1 -0
  260. package/dist/schemas/apps.js +168 -0
  261. package/dist/schemas/apps.js.map +1 -0
  262. package/dist/schemas/index.d.ts +410 -0
  263. package/dist/schemas/index.d.ts.map +1 -0
  264. package/dist/schemas/index.js +208 -0
  265. package/dist/schemas/index.js.map +1 -0
  266. package/dist/schemas/screens.d.ts +67 -0
  267. package/dist/schemas/screens.d.ts.map +1 -0
  268. package/dist/schemas/screens.js +242 -0
  269. package/dist/schemas/screens.js.map +1 -0
  270. package/dist/session/agent-link.d.ts +79 -0
  271. package/dist/session/agent-link.d.ts.map +1 -0
  272. package/dist/session/agent-link.js +251 -0
  273. package/dist/session/agent-link.js.map +1 -0
  274. package/dist/session/auth.d.ts +233 -0
  275. package/dist/session/auth.d.ts.map +1 -0
  276. package/dist/session/auth.js +783 -0
  277. package/dist/session/auth.js.map +1 -0
  278. package/dist/session/connect.d.ts +211 -0
  279. package/dist/session/connect.d.ts.map +1 -0
  280. package/dist/session/connect.js +355 -0
  281. package/dist/session/connect.js.map +1 -0
  282. package/dist/session/connection.d.ts +70 -0
  283. package/dist/session/connection.d.ts.map +1 -0
  284. package/dist/session/connection.js +120 -0
  285. package/dist/session/connection.js.map +1 -0
  286. package/dist/session/credentials.d.ts +44 -0
  287. package/dist/session/credentials.d.ts.map +1 -0
  288. package/dist/session/credentials.js +60 -0
  289. package/dist/session/credentials.js.map +1 -0
  290. package/dist/session/index.d.ts +25 -0
  291. package/dist/session/index.d.ts.map +1 -0
  292. package/dist/session/index.js +18 -0
  293. package/dist/session/index.js.map +1 -0
  294. package/dist/session/pairing.d.ts +59 -0
  295. package/dist/session/pairing.d.ts.map +1 -0
  296. package/dist/session/pairing.js +144 -0
  297. package/dist/session/pairing.js.map +1 -0
  298. package/dist/session/places.d.ts +62 -0
  299. package/dist/session/places.d.ts.map +1 -0
  300. package/dist/session/places.js +101 -0
  301. package/dist/session/places.js.map +1 -0
  302. package/dist/session/stay-signed-in.d.ts +37 -0
  303. package/dist/session/stay-signed-in.d.ts.map +1 -0
  304. package/dist/session/stay-signed-in.js +124 -0
  305. package/dist/session/stay-signed-in.js.map +1 -0
  306. package/dist/space/account-registry.d.ts +64 -0
  307. package/dist/space/account-registry.d.ts.map +1 -0
  308. package/dist/space/account-registry.js +66 -0
  309. package/dist/space/account-registry.js.map +1 -0
  310. package/dist/space/index.d.ts +3 -0
  311. package/dist/space/index.d.ts.map +1 -0
  312. package/dist/space/index.js +3 -0
  313. package/dist/space/index.js.map +1 -0
  314. package/dist/space/pass.d.ts +63 -0
  315. package/dist/space/pass.d.ts.map +1 -0
  316. package/dist/space/pass.js +54 -0
  317. package/dist/space/pass.js.map +1 -0
  318. package/dist/space/presets.d.ts +31 -0
  319. package/dist/space/presets.d.ts.map +1 -0
  320. package/dist/space/presets.js +24 -0
  321. package/dist/space/presets.js.map +1 -0
  322. package/dist/space/roles.d.ts +186 -0
  323. package/dist/space/roles.d.ts.map +1 -0
  324. package/dist/space/roles.js +500 -0
  325. package/dist/space/roles.js.map +1 -0
  326. package/dist/space/space-access.d.ts +80 -0
  327. package/dist/space/space-access.d.ts.map +1 -0
  328. package/dist/space/space-access.js +135 -0
  329. package/dist/space/space-access.js.map +1 -0
  330. package/dist/space/space-manager.d.ts +87 -0
  331. package/dist/space/space-manager.d.ts.map +1 -0
  332. package/dist/space/space-manager.js +187 -0
  333. package/dist/space/space-manager.js.map +1 -0
  334. package/dist/storage/directory-access.d.ts +78 -0
  335. package/dist/storage/directory-access.d.ts.map +1 -0
  336. package/dist/storage/directory-access.js +164 -0
  337. package/dist/storage/directory-access.js.map +1 -0
  338. package/dist/storage/encrypted-adapter.d.ts +49 -0
  339. package/dist/storage/encrypted-adapter.d.ts.map +1 -0
  340. package/dist/storage/encrypted-adapter.js +106 -0
  341. package/dist/storage/encrypted-adapter.js.map +1 -0
  342. package/dist/storage/folder-adapter.d.ts +105 -0
  343. package/dist/storage/folder-adapter.d.ts.map +1 -0
  344. package/dist/storage/folder-adapter.js +280 -0
  345. package/dist/storage/folder-adapter.js.map +1 -0
  346. package/dist/storage/folder-reconcile.d.ts +53 -0
  347. package/dist/storage/folder-reconcile.d.ts.map +1 -0
  348. package/dist/storage/folder-reconcile.js +65 -0
  349. package/dist/storage/folder-reconcile.js.map +1 -0
  350. package/dist/storage/index.d.ts +10 -0
  351. package/dist/storage/index.d.ts.map +1 -0
  352. package/dist/storage/index.js +9 -0
  353. package/dist/storage/index.js.map +1 -0
  354. package/dist/storage/indexeddb-adapter.d.ts +12 -0
  355. package/dist/storage/indexeddb-adapter.d.ts.map +1 -0
  356. package/dist/storage/indexeddb-adapter.js +190 -0
  357. package/dist/storage/indexeddb-adapter.js.map +1 -0
  358. package/dist/storage/mst.d.ts +121 -0
  359. package/dist/storage/mst.d.ts.map +1 -0
  360. package/dist/storage/mst.js +402 -0
  361. package/dist/storage/mst.js.map +1 -0
  362. package/dist/storage/storage-provider.d.ts +85 -0
  363. package/dist/storage/storage-provider.d.ts.map +1 -0
  364. package/dist/storage/storage-provider.js +220 -0
  365. package/dist/storage/storage-provider.js.map +1 -0
  366. package/dist/sync/anti-entropy.d.ts +49 -0
  367. package/dist/sync/anti-entropy.d.ts.map +1 -0
  368. package/dist/sync/anti-entropy.js +62 -0
  369. package/dist/sync/anti-entropy.js.map +1 -0
  370. package/dist/sync/index.d.ts +4 -0
  371. package/dist/sync/index.d.ts.map +1 -0
  372. package/dist/sync/index.js +4 -0
  373. package/dist/sync/index.js.map +1 -0
  374. package/dist/sync/sync-engine.d.ts +71 -0
  375. package/dist/sync/sync-engine.d.ts.map +1 -0
  376. package/dist/sync/sync-engine.js +309 -0
  377. package/dist/sync/sync-engine.js.map +1 -0
  378. package/dist/sync/sync-messages.d.ts +75 -0
  379. package/dist/sync/sync-messages.d.ts.map +1 -0
  380. package/dist/sync/sync-messages.js +12 -0
  381. package/dist/sync/sync-messages.js.map +1 -0
  382. package/dist/types.d.ts +243 -0
  383. package/dist/types.d.ts.map +1 -0
  384. package/dist/types.js +7 -0
  385. package/dist/types.js.map +1 -0
  386. package/dist/utils/encoding.d.ts +63 -0
  387. package/dist/utils/encoding.d.ts.map +1 -0
  388. package/dist/utils/encoding.js +130 -0
  389. package/dist/utils/encoding.js.map +1 -0
  390. package/dist/utils/errors.d.ts +43 -0
  391. package/dist/utils/errors.d.ts.map +1 -0
  392. package/dist/utils/errors.js +28 -0
  393. package/dist/utils/errors.js.map +1 -0
  394. package/dist/utils/events.d.ts +19 -0
  395. package/dist/utils/events.d.ts.map +1 -0
  396. package/dist/utils/events.js +27 -0
  397. package/dist/utils/events.js.map +1 -0
  398. package/dist/utils/hash.d.ts +23 -0
  399. package/dist/utils/hash.d.ts.map +1 -0
  400. package/dist/utils/hash.js +49 -0
  401. package/dist/utils/hash.js.map +1 -0
  402. package/dist/utils/index.d.ts +9 -0
  403. package/dist/utils/index.d.ts.map +1 -0
  404. package/dist/utils/index.js +9 -0
  405. package/dist/utils/index.js.map +1 -0
  406. package/dist/validation/capability-gate.d.ts +50 -0
  407. package/dist/validation/capability-gate.d.ts.map +1 -0
  408. package/dist/validation/capability-gate.js +71 -0
  409. package/dist/validation/capability-gate.js.map +1 -0
  410. package/dist/validation/crypto-gate.d.ts +16 -0
  411. package/dist/validation/crypto-gate.d.ts.map +1 -0
  412. package/dist/validation/crypto-gate.js +37 -0
  413. package/dist/validation/crypto-gate.js.map +1 -0
  414. package/dist/validation/index.d.ts +6 -0
  415. package/dist/validation/index.d.ts.map +1 -0
  416. package/dist/validation/index.js +6 -0
  417. package/dist/validation/index.js.map +1 -0
  418. package/dist/validation/stateful-gate.d.ts +15 -0
  419. package/dist/validation/stateful-gate.d.ts.map +1 -0
  420. package/dist/validation/stateful-gate.js +50 -0
  421. package/dist/validation/stateful-gate.js.map +1 -0
  422. package/dist/validation/structural-gate.d.ts +18 -0
  423. package/dist/validation/structural-gate.d.ts.map +1 -0
  424. package/dist/validation/structural-gate.js +54 -0
  425. package/dist/validation/structural-gate.js.map +1 -0
  426. package/dist/validation/validation-engine.d.ts +28 -0
  427. package/dist/validation/validation-engine.d.ts.map +1 -0
  428. package/dist/validation/validation-engine.js +38 -0
  429. package/dist/validation/validation-engine.js.map +1 -0
  430. package/package.json +107 -0
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @module root-signer
3
+ * Who holds the identity key, and how a session gets permission from it.
4
+ *
5
+ * The root key signs exactly one thing: a note saying "this session key may
6
+ * write for me, until this time". Everything else is signed by the session key.
7
+ * That one signature is the only reason an app needs the identity at all — so
8
+ * it is the only thing that has to be abstracted for the key to live somewhere
9
+ * other than the page.
10
+ *
11
+ * Somewhere else means an account home in another window, or anything that
12
+ * will hold a secret and answer questions about it. The page asks for a delegation
13
+ * and gets back a token; the seed never crosses the boundary.
14
+ *
15
+ * Everything downstream — DIDs, expressions, validation, sync — is unchanged by
16
+ * this, because none of it ever sees the root key either.
17
+ */
18
+ import { issueUCAN } from './ucan.js';
19
+ /**
20
+ * A signer for a key this page is holding.
21
+ *
22
+ * The ordinary case: the seed was unlocked here, so the key is in memory and
23
+ * signing is a local operation.
24
+ *
25
+ * @param identity The unlocked identity
26
+ * @param provider Crypto provider for signing
27
+ * @returns A signer over it
28
+ */
29
+ export function createLocalRootSigner(identity, provider) {
30
+ return Object.freeze({
31
+ did: identity.did,
32
+ custody: 'local',
33
+ async delegate(params) {
34
+ return issueUCAN({
35
+ issuer: { did: identity.did, privateKey: identity.privateKey },
36
+ audience: params.audience,
37
+ capabilities: params.capabilities,
38
+ expiration: params.expiration,
39
+ ...(params.facts?.length ? { facts: params.facts } : {}),
40
+ }, provider);
41
+ },
42
+ });
43
+ }
44
+ //# sourceMappingURL=root-signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-signer.js","sourceRoot":"","sources":["../../src/identity/root-signer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AA4BtC;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAgD,EAChD,QAAwB;IAExB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,OAAO,EAAE,OAAgB;QAEzB,KAAK,CAAC,QAAQ,CAAC,MAKd;YACC,OAAO,SAAS,CACd;gBACE,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE;gBAC9D,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzD,EACD,QAAQ,CACT,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,164 @@
1
+ import type { CryptoProvider } from '../types.js';
2
+ /** UCAN header */
3
+ export interface UCANHeader {
4
+ readonly alg: string;
5
+ readonly typ: 'JWT';
6
+ readonly ucv: '0.10.0';
7
+ }
8
+ /** A capability (attenuation) */
9
+ export interface Capability {
10
+ readonly with: string;
11
+ readonly can: string;
12
+ }
13
+ /** Optional fact attached to UCAN */
14
+ export interface Fact {
15
+ readonly [key: string]: unknown;
16
+ }
17
+ /** UCAN payload */
18
+ export interface UCANPayload {
19
+ readonly iss: string;
20
+ readonly aud: string;
21
+ readonly exp: number;
22
+ readonly nbf?: number;
23
+ readonly nnc?: string;
24
+ readonly att: ReadonlyArray<Capability>;
25
+ readonly prf: ReadonlyArray<string>;
26
+ readonly fct?: ReadonlyArray<Fact>;
27
+ }
28
+ /** A complete encoded UCAN token */
29
+ export interface UCANToken {
30
+ readonly header: UCANHeader;
31
+ readonly payload: UCANPayload;
32
+ readonly signature: string;
33
+ readonly encoded: string;
34
+ readonly cid: string;
35
+ }
36
+ /** Options for issuing a UCAN */
37
+ export interface IssueUCANOptions {
38
+ readonly issuer: {
39
+ readonly did: string;
40
+ readonly privateKey: CryptoKey;
41
+ };
42
+ readonly audience: string;
43
+ readonly capabilities: ReadonlyArray<Capability>;
44
+ readonly expiration?: number;
45
+ readonly notBefore?: number;
46
+ readonly nonce?: string;
47
+ readonly proofs?: ReadonlyArray<string>;
48
+ readonly facts?: ReadonlyArray<Fact>;
49
+ }
50
+ /** Result of UCAN validation */
51
+ export interface UCANValidation {
52
+ readonly valid: boolean;
53
+ readonly issuer: string;
54
+ readonly audience: string;
55
+ readonly capabilities: ReadonlyArray<Capability>;
56
+ readonly reason?: string;
57
+ }
58
+ /** Options for delegating capabilities */
59
+ export interface DelegateOptions {
60
+ readonly parent: UCANToken;
61
+ readonly issuer: {
62
+ readonly did: string;
63
+ readonly privateKey: CryptoKey;
64
+ };
65
+ readonly audience: string;
66
+ readonly capabilities: ReadonlyArray<Capability>;
67
+ readonly expiration?: number;
68
+ }
69
+ /** How far a token's start is set back for clocks that disagree — the allowance peers give a record's date. */
70
+ export declare const UCAN_CLOCK_SKEW_SECONDS = 300;
71
+ /**
72
+ * Creates and signs a UCAN token.
73
+ *
74
+ * @param {IssueUCANOptions} options Options for issuing the token
75
+ * @param {CryptoProvider} provider Crypto provider for signing
76
+ * @returns {Promise<UCANToken>} The created UCAN token
77
+ */
78
+ export declare function issueUCAN(options: IssueUCANOptions, provider: CryptoProvider): Promise<UCANToken>;
79
+ /**
80
+ * Parses an encoded UCAN string without verifying its signature.
81
+ *
82
+ * @param {string} encoded The JWT string to parse
83
+ * @returns {{ header: UCANHeader, payload: UCANPayload, signature: string }} The parsed UCAN parts
84
+ */
85
+ export declare function parseUCAN(encoded: string): {
86
+ readonly header: UCANHeader;
87
+ readonly payload: UCANPayload;
88
+ readonly signature: string;
89
+ };
90
+ /** When to judge a token's time bounds */
91
+ export interface VerifyOptions {
92
+ /**
93
+ * Unix seconds to check `exp` and `nbf` against. Default: now.
94
+ *
95
+ * A record is judged at the moment it was signed, not the moment someone
96
+ * reads it. Checking against now would make every record stop verifying
97
+ * the hour its session's delegation ran out — and a peer arriving later
98
+ * would refuse all of it.
99
+ */
100
+ readonly at?: number;
101
+ }
102
+ /**
103
+ * Verifies a UCAN token's signature and time bounds.
104
+ *
105
+ * @param {string} encoded The encoded UCAN token
106
+ * @param {CryptoProvider} provider Crypto provider for verifying
107
+ * @param {VerifyOptions} options When to judge expiry
108
+ * @returns {Promise<UCANValidation>} The validation result
109
+ */
110
+ export declare function verifyUCAN(encoded: string, provider: CryptoProvider, options?: VerifyOptions): Promise<UCANValidation>;
111
+ /**
112
+ * Checks if a child capability is a valid subset of a parent capability.
113
+ *
114
+ * @param {Capability} parent The parent capability
115
+ * @param {Capability} child The child capability
116
+ * @returns {boolean} True if child is a valid subset of parent
117
+ */
118
+ export declare function isCapabilitySubset(parent: Capability, child: Capability): boolean;
119
+ /**
120
+ * Validates a complete delegation chain of UCAN tokens.
121
+ *
122
+ * @param {string} token The leaf UCAN token to validate
123
+ * @param {ReadonlyArray<string>} proofTokens Array of encoded parent UCANs forming the proof chain
124
+ * @param {CryptoProvider} provider Crypto provider for verifying
125
+ * @returns {Promise<UCANValidation>} The chain validation result
126
+ */
127
+ export declare function validateDelegationChain(token: string, proofTokens: ReadonlyArray<string>, provider: CryptoProvider, options?: VerifyOptions): Promise<UCANValidation>;
128
+ /**
129
+ * Helper to delegate capabilities from a parent UCAN token.
130
+ *
131
+ * @param {DelegateOptions} options Delegation options
132
+ * @param {CryptoProvider} provider Crypto provider for signing
133
+ * @returns {Promise<UCANToken>} The delegated UCAN token
134
+ */
135
+ export declare function delegateCapabilities(options: DelegateOptions, provider: CryptoProvider): Promise<UCANToken>;
136
+ /** Resolves a proof token by its CID, returning null when it cannot be found. */
137
+ export type ProofResolver = (cid: string) => Promise<string | null> | string | null;
138
+ /** The outcome of walking a delegation chain back to its root */
139
+ export interface ChainResolution {
140
+ readonly valid: boolean;
141
+ /** The DID at the root of the chain — the identity ultimately being acted for */
142
+ readonly rootDid: string | null;
143
+ /** Capabilities the leaf token holds, once the chain is known to be sound */
144
+ readonly capabilities: ReadonlyArray<Capability>;
145
+ /** Audience of the leaf: the key allowed to use these capabilities */
146
+ readonly audience: string | null;
147
+ readonly reason?: string;
148
+ }
149
+ /**
150
+ * Walks a delegation chain from a leaf token back to its root, verifying every
151
+ * link: each token's signature, each parent's audience matching its child's
152
+ * issuer, and attenuation at every step.
153
+ *
154
+ * Each token is followed through the first entry of its `prf` array, so this
155
+ * resolves single-parent chains — the shape delegation takes in practice.
156
+ *
157
+ * @param encoded The leaf UCAN
158
+ * @param resolveProof Looks up a parent token by CID (from local storage, a peer, …)
159
+ * @param provider Crypto provider for signature verification
160
+ * @param options When to judge expiry — for a record, when it was signed
161
+ * @returns What the chain grants, and the root DID behind it
162
+ */
163
+ export declare function resolveDelegationRoot(encoded: string, resolveProof: ProofResolver, provider: CryptoProvider, options?: VerifyOptions): Promise<ChainResolution>;
164
+ //# sourceMappingURL=ucan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ucan.d.ts","sourceRoot":"","sources":["../../src/identity/ucan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,273 @@
1
+ import { base64UrlEncode, base64UrlDecode, utf8Encode, utf8Decode } from '../utils/encoding.js';
2
+ import { cidFromBytes } from '../utils/hash.js';
3
+ import { canonicalize } from '../schema/expression.js';
4
+ import { didToPublicKey } from './did.js';
5
+ /** How far a token's start is set back for clocks that disagree — the allowance peers give a record's date. */
6
+ export const UCAN_CLOCK_SKEW_SECONDS = 300;
7
+ /**
8
+ * Creates and signs a UCAN token.
9
+ *
10
+ * @param {IssueUCANOptions} options Options for issuing the token
11
+ * @param {CryptoProvider} provider Crypto provider for signing
12
+ * @returns {Promise<UCANToken>} The created UCAN token
13
+ */
14
+ export async function issueUCAN(options, provider) {
15
+ const header = { alg: 'ES256', typ: 'JWT', ucv: '0.10.0' };
16
+ const now = Math.floor(Date.now() / 1000);
17
+ const exp = options.expiration ?? (now + 3600);
18
+ // Records are judged at the time they claim to have been signed, so a token
19
+ // with no start would let a leaked key write "last year" for as long as the
20
+ // token lives. Set back by the clock skew peers already allow for.
21
+ const nbf = options.notBefore ?? now - UCAN_CLOCK_SKEW_SECONDS;
22
+ let nnc = options.nonce;
23
+ if (!nnc) {
24
+ const bytes = new Uint8Array(8);
25
+ globalThis.crypto.getRandomValues(bytes);
26
+ nnc = Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');
27
+ }
28
+ const payload = {
29
+ iss: options.issuer.did,
30
+ aud: options.audience,
31
+ exp,
32
+ nbf,
33
+ nnc,
34
+ att: options.capabilities,
35
+ prf: options.proofs ?? [],
36
+ fct: options.facts
37
+ };
38
+ // Clean up undefined properties for deterministic encoding
39
+ const cleanPayload = JSON.parse(JSON.stringify(payload));
40
+ const encodedHeader = base64UrlEncode(utf8Encode(canonicalize(header)));
41
+ const encodedPayload = base64UrlEncode(utf8Encode(canonicalize(cleanPayload)));
42
+ const dataToSign = `${encodedHeader}.${encodedPayload}`;
43
+ const signatureBytes = await provider.sign(options.issuer.privateKey, utf8Encode(dataToSign));
44
+ const signature = base64UrlEncode(signatureBytes);
45
+ const encoded = `${dataToSign}.${signature}`;
46
+ const cid = await cidFromBytes(utf8Encode(encoded));
47
+ return Object.freeze({
48
+ header: Object.freeze(header),
49
+ payload: Object.freeze(cleanPayload),
50
+ signature,
51
+ encoded,
52
+ cid
53
+ });
54
+ }
55
+ /**
56
+ * Parses an encoded UCAN string without verifying its signature.
57
+ *
58
+ * @param {string} encoded The JWT string to parse
59
+ * @returns {{ header: UCANHeader, payload: UCANPayload, signature: string }} The parsed UCAN parts
60
+ */
61
+ export function parseUCAN(encoded) {
62
+ const parts = encoded.split('.');
63
+ if (parts.length !== 3) {
64
+ throw new Error('Invalid UCAN token format');
65
+ }
66
+ const headerStr = utf8Decode(base64UrlDecode(parts[0]));
67
+ const payloadStr = utf8Decode(base64UrlDecode(parts[1]));
68
+ const header = JSON.parse(headerStr);
69
+ const payload = JSON.parse(payloadStr);
70
+ return {
71
+ header,
72
+ payload,
73
+ signature: parts[2]
74
+ };
75
+ }
76
+ /**
77
+ * Verifies a UCAN token's signature and time bounds.
78
+ *
79
+ * @param {string} encoded The encoded UCAN token
80
+ * @param {CryptoProvider} provider Crypto provider for verifying
81
+ * @param {VerifyOptions} options When to judge expiry
82
+ * @returns {Promise<UCANValidation>} The validation result
83
+ */
84
+ export async function verifyUCAN(encoded, provider, options = {}) {
85
+ try {
86
+ const parts = encoded.split('.');
87
+ if (parts.length !== 3) {
88
+ return { valid: false, issuer: '', audience: '', capabilities: [], reason: 'Invalid UCAN token format' };
89
+ }
90
+ const { header: _header, payload, signature } = parseUCAN(encoded);
91
+ const now = options.at ?? Math.floor(Date.now() / 1000);
92
+ // Both bounds are required: a token without `exp` would never expire
93
+ // (`undefined <= now` is false), and one without `nbf` could vouch for
94
+ // records dated any time before it was issued.
95
+ if (typeof payload.exp !== 'number' || !Number.isFinite(payload.exp) || typeof payload.nbf !== 'number' || !Number.isFinite(payload.nbf)) {
96
+ return { valid: false, issuer: payload.iss, audience: payload.aud, capabilities: payload.att, reason: 'Token must say when it starts and ends' };
97
+ }
98
+ if (payload.exp <= now) {
99
+ return { valid: false, issuer: payload.iss, audience: payload.aud, capabilities: payload.att, reason: 'Token has expired' };
100
+ }
101
+ if (payload.nbf > now) {
102
+ return { valid: false, issuer: payload.iss, audience: payload.aud, capabilities: payload.att, reason: 'Token not yet valid' };
103
+ }
104
+ const { publicKeyBytes } = didToPublicKey(payload.iss);
105
+ const publicKey = await provider.importPublicKey(publicKeyBytes);
106
+ const dataToVerify = `${parts[0]}.${parts[1]}`;
107
+ const signatureBytes = base64UrlDecode(signature);
108
+ const isValid = await provider.verify(publicKey, signatureBytes, utf8Encode(dataToVerify));
109
+ if (!isValid) {
110
+ return { valid: false, issuer: payload.iss, audience: payload.aud, capabilities: payload.att, reason: 'Invalid signature' };
111
+ }
112
+ return {
113
+ valid: true,
114
+ issuer: payload.iss,
115
+ audience: payload.aud,
116
+ capabilities: payload.att
117
+ };
118
+ }
119
+ catch (error) {
120
+ const reason = error instanceof Error ? error.message : 'Unknown verification error';
121
+ return { valid: false, issuer: '', audience: '', capabilities: [], reason };
122
+ }
123
+ }
124
+ /**
125
+ * Checks if a child capability is a valid subset of a parent capability.
126
+ *
127
+ * @param {Capability} parent The parent capability
128
+ * @param {Capability} child The child capability
129
+ * @returns {boolean} True if child is a valid subset of parent
130
+ */
131
+ export function isCapabilitySubset(parent, child) {
132
+ const withMatch = parent.with === '*' || parent.with === child.with;
133
+ if (!withMatch) {
134
+ return false;
135
+ }
136
+ if (parent.can === '*' || parent.can === child.can) {
137
+ return true;
138
+ }
139
+ if (parent.can.endsWith('/*')) {
140
+ const prefix = parent.can.slice(0, -1);
141
+ return child.can.startsWith(prefix);
142
+ }
143
+ return false;
144
+ }
145
+ /**
146
+ * Validates a complete delegation chain of UCAN tokens.
147
+ *
148
+ * @param {string} token The leaf UCAN token to validate
149
+ * @param {ReadonlyArray<string>} proofTokens Array of encoded parent UCANs forming the proof chain
150
+ * @param {CryptoProvider} provider Crypto provider for verifying
151
+ * @returns {Promise<UCANValidation>} The chain validation result
152
+ */
153
+ export async function validateDelegationChain(token, proofTokens, provider, options = {}) {
154
+ const leafValidation = await verifyUCAN(token, provider, options);
155
+ if (!leafValidation.valid) {
156
+ return leafValidation;
157
+ }
158
+ const parsedLeaf = parseUCAN(token);
159
+ // Base case: No proofs required if the token has no parent references
160
+ if (parsedLeaf.payload.prf.length === 0) {
161
+ return leafValidation;
162
+ }
163
+ // Parse all proof tokens
164
+ const proofs = await Promise.all(proofTokens.map(async (encoded) => {
165
+ const validation = await verifyUCAN(encoded, provider, options);
166
+ const parsed = parseUCAN(encoded);
167
+ const cid = await cidFromBytes(utf8Encode(encoded));
168
+ return { validation, parsed, encoded, cid };
169
+ }));
170
+ // Ensure all required proofs by CID are provided and valid
171
+ for (const requiredCid of parsedLeaf.payload.prf) {
172
+ const proof = proofs.find(p => p.cid === requiredCid);
173
+ if (!proof) {
174
+ return { ...leafValidation, valid: false, reason: `Missing proof token with CID: ${requiredCid}` };
175
+ }
176
+ if (!proof.validation.valid) {
177
+ return { ...leafValidation, valid: false, reason: `Invalid proof token in chain: ${proof.validation.reason}` };
178
+ }
179
+ // Check delegation linkage (parent audience must equal child issuer)
180
+ if (proof.parsed.payload.aud !== parsedLeaf.payload.iss) {
181
+ return { ...leafValidation, valid: false, reason: 'Delegation chain broken: audience/issuer mismatch' };
182
+ }
183
+ // Check capabilities attenuation
184
+ for (const childCap of parsedLeaf.payload.att) {
185
+ const isSubset = proof.parsed.payload.att.some(parentCap => isCapabilitySubset(parentCap, childCap));
186
+ if (!isSubset) {
187
+ return { ...leafValidation, valid: false, reason: 'Delegated capability is not a subset of parent capability' };
188
+ }
189
+ }
190
+ }
191
+ // All checks passed
192
+ return leafValidation;
193
+ }
194
+ /**
195
+ * Helper to delegate capabilities from a parent UCAN token.
196
+ *
197
+ * @param {DelegateOptions} options Delegation options
198
+ * @param {CryptoProvider} provider Crypto provider for signing
199
+ * @returns {Promise<UCANToken>} The delegated UCAN token
200
+ */
201
+ export async function delegateCapabilities(options, provider) {
202
+ // The delegator must be the audience of the parent token
203
+ if (options.parent.payload.aud !== options.issuer.did) {
204
+ throw new Error('Delegation chain broken: issuer must be the audience of the parent UCAN');
205
+ }
206
+ // Validate capabilities attenuation
207
+ for (const childCap of options.capabilities) {
208
+ const isSubset = options.parent.payload.att.some(parentCap => isCapabilitySubset(parentCap, childCap));
209
+ if (!isSubset) {
210
+ throw new Error(`Capability ${JSON.stringify(childCap)} is not a subset of parent capabilities`);
211
+ }
212
+ }
213
+ // Validate expiration
214
+ if (options.expiration !== undefined && options.expiration > options.parent.payload.exp) {
215
+ throw new Error('Delegated expiration cannot exceed parent expiration');
216
+ }
217
+ return await issueUCAN({
218
+ issuer: options.issuer,
219
+ audience: options.audience,
220
+ capabilities: options.capabilities,
221
+ expiration: options.expiration ?? options.parent.payload.exp,
222
+ proofs: [options.parent.cid]
223
+ }, provider);
224
+ }
225
+ /** Guards against a cyclic or absurdly deep proof chain. */
226
+ const MAX_CHAIN_DEPTH = 10;
227
+ /**
228
+ * Walks a delegation chain from a leaf token back to its root, verifying every
229
+ * link: each token's signature, each parent's audience matching its child's
230
+ * issuer, and attenuation at every step.
231
+ *
232
+ * Each token is followed through the first entry of its `prf` array, so this
233
+ * resolves single-parent chains — the shape delegation takes in practice.
234
+ *
235
+ * @param encoded The leaf UCAN
236
+ * @param resolveProof Looks up a parent token by CID (from local storage, a peer, …)
237
+ * @param provider Crypto provider for signature verification
238
+ * @param options When to judge expiry — for a record, when it was signed
239
+ * @returns What the chain grants, and the root DID behind it
240
+ */
241
+ export async function resolveDelegationRoot(encoded, resolveProof, provider, options = {}) {
242
+ const leafValidation = await verifyUCAN(encoded, provider, options);
243
+ if (!leafValidation.valid) {
244
+ return { valid: false, rootDid: null, capabilities: [], audience: null, reason: leafValidation.reason ?? 'Invalid token' };
245
+ }
246
+ const leaf = parseUCAN(encoded);
247
+ let current = { encoded, payload: leaf.payload };
248
+ for (let depth = 0; depth < MAX_CHAIN_DEPTH; depth++) {
249
+ const parentCid = current.payload.prf[0];
250
+ // No proof left to follow: this issuer is the root of the chain.
251
+ if (parentCid === undefined) {
252
+ return {
253
+ valid: true,
254
+ rootDid: current.payload.iss,
255
+ capabilities: leaf.payload.att,
256
+ audience: leaf.payload.aud
257
+ };
258
+ }
259
+ const parentEncoded = await resolveProof(parentCid);
260
+ if (!parentEncoded) {
261
+ return { valid: false, rootDid: null, capabilities: [], audience: null, reason: `Missing proof token with CID: ${parentCid}` };
262
+ }
263
+ // validateDelegationChain checks this single link: parent signature,
264
+ // audience → issuer linkage, and capability attenuation.
265
+ const link = await validateDelegationChain(current.encoded, [parentEncoded], provider, options);
266
+ if (!link.valid) {
267
+ return { valid: false, rootDid: null, capabilities: [], audience: null, reason: link.reason ?? 'Broken delegation chain' };
268
+ }
269
+ current = { encoded: parentEncoded, payload: parseUCAN(parentEncoded).payload };
270
+ }
271
+ return { valid: false, rootDid: null, capabilities: [], audience: null, reason: `Delegation chain deeper than ${MAX_CHAIN_DEPTH} links` };
272
+ }
273
+ //# sourceMappingURL=ucan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ucan.js","sourceRoot":"","sources":["../../src/identity/ucan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ export interface PasskeyOptions {
2
+ readonly rpId: string;
3
+ readonly rpName: string;
4
+ readonly userName: string;
5
+ readonly userId?: Uint8Array;
6
+ /**
7
+ * WebAuthn L3 hints steering which authenticator the browser offers first.
8
+ * `client-device` favours the platform passkey (Touch ID, Windows Hello) —
9
+ * useful when an installed credential manager handles passkeys by default but
10
+ * does not support PRF.
11
+ */
12
+ readonly hints?: ReadonlyArray<'client-device' | 'security-key' | 'hybrid'>;
13
+ /** Restrict to platform or roaming authenticators */
14
+ readonly attachment?: AuthenticatorAttachment;
15
+ }
16
+ export interface PasskeyRegistration {
17
+ readonly credentialId: string;
18
+ /**
19
+ * The user handle the passkey was made for, base64url. Keep it: it is the
20
+ * only way to ask the provider to relabel the passkey later
21
+ * ({@link renamePasskey}).
22
+ */
23
+ readonly userHandle: string;
24
+ readonly publicKey: Uint8Array;
25
+ /**
26
+ * What the client reported about PRF at creation time: true, false, or
27
+ * undefined when it said nothing at all.
28
+ *
29
+ * This is a weak signal. Several credential providers — Bitwarden among them —
30
+ * omit or deny it here and still evaluate PRF perfectly well during an
31
+ * assertion, so it must never be treated as a final answer. The only reliable
32
+ * test is asking for the secret and seeing whether one comes back.
33
+ */
34
+ readonly prfDeclared: boolean | undefined;
35
+ /** PRF output, when the authenticator already evaluates it during creation */
36
+ readonly prfOutput: Uint8Array | null;
37
+ }
38
+ export interface AuthOptions {
39
+ readonly rpId?: string;
40
+ /** See {@link PasskeyOptions.hints} */
41
+ readonly hints?: ReadonlyArray<'client-device' | 'security-key' | 'hybrid'>;
42
+ }
43
+ export interface PasskeyAuth {
44
+ readonly credentialId: string;
45
+ readonly prfOutput: Uint8Array | null;
46
+ readonly authenticatorData: Uint8Array;
47
+ }
48
+ /**
49
+ * Whether this device has a built-in authenticator — Touch ID, Windows Hello.
50
+ *
51
+ * Worth knowing before asking for one: `attachment: 'platform'` is a filter
52
+ * rather than a preference, so requesting it on a machine that has none fails
53
+ * outright instead of falling back.
54
+ *
55
+ * @returns Whether a platform authenticator can be used here
56
+ */
57
+ export declare function hasPlatformAuthenticator(): Promise<boolean>;
58
+ /**
59
+ * Registers a new passkey with PRF extension.
60
+ * @param {PasskeyOptions} options Registration options.
61
+ * @returns {Promise<PasskeyRegistration>} Registration result.
62
+ */
63
+ export declare function registerPasskey(options: PasskeyOptions): Promise<PasskeyRegistration>;
64
+ /**
65
+ * Asks the passkey provider to show a passkey under a new name.
66
+ *
67
+ * A site cannot edit a password manager, so after an account is renamed its
68
+ * passkey would keep the old label and look like a different account. The
69
+ * WebAuthn Signal API lets a site *ask*; the provider decides. Where the
70
+ * browser does not have it, this does nothing.
71
+ *
72
+ * @returns Whether the browser accepted the request — not whether the provider acted on it
73
+ */
74
+ export declare function renamePasskey(params: {
75
+ rpId: string;
76
+ userHandle: string;
77
+ name: string;
78
+ }): Promise<boolean>;
79
+ /**
80
+ * Authenticates using an existing passkey with PRF extension.
81
+ * @param {string} [credentialId] The credential to use. Omit to let the user pick
82
+ * any discoverable passkey for this origin.
83
+ * @param {AuthOptions} [options] Authentication options.
84
+ * @returns {Promise<PasskeyAuth>} Authentication result.
85
+ */
86
+ export declare function authenticatePasskey(credentialId?: string, options?: AuthOptions): Promise<PasskeyAuth>;
87
+ //# sourceMappingURL=webauthn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webauthn.d.ts","sourceRoot":"","sources":["../../src/identity/webauthn.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,eAAe,GAAG,cAAc,GAAG,QAAQ,CAAC,CAAC;IAC5E,qDAAqD;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,uBAAuB,CAAC;CAC/C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B;;;;;;;;OAQG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,eAAe,GAAG,cAAc,GAAG,QAAQ,CAAC,CAAC;CAC7E;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,iBAAiB,EAAE,UAAU,CAAC;CACxC;AAID;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC,CASjE;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgE3F;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBhH;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CA2C5G"}