@yielded/auth-persistence 0.1.0-beta.24 → 0.1.0-beta.26

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 (481) hide show
  1. package/README.md +6 -8
  2. package/dist/Adapter.d.mts +47 -33
  3. package/dist/Adapter.mjs +36 -23
  4. package/dist/OAuthPersistence.d.mts +35 -51
  5. package/dist/OAuthPersistence.mjs +60 -68
  6. package/dist/OAuthPersistence.mjs.map +1 -1
  7. package/dist/index.d.mts +2 -2
  8. package/dist/index.mjs +2 -2
  9. package/dist/internal/browser-login.d.mts +1 -1
  10. package/dist/internal/browser-login.mjs +29 -9
  11. package/dist/internal/browser-login.mjs.map +1 -1
  12. package/dist/internal/configuration.d.mts +13 -8
  13. package/dist/internal/configuration.mjs.map +1 -1
  14. package/dist/internal/crypto.d.mts +1 -0
  15. package/dist/internal/crypto.mjs +1 -1
  16. package/dist/internal/d1-planning.mjs +8 -0
  17. package/dist/internal/d1-planning.mjs.map +1 -0
  18. package/dist/internal/email-native-state.mjs +135 -0
  19. package/dist/internal/email-native-state.mjs.map +1 -0
  20. package/dist/internal/email-native.d.mts +17 -0
  21. package/dist/internal/email-native.mjs +245 -0
  22. package/dist/internal/email-native.mjs.map +1 -0
  23. package/dist/internal/email-policy.mjs +92 -0
  24. package/dist/internal/email-policy.mjs.map +1 -0
  25. package/dist/internal/email-registration-native.d.mts +38 -0
  26. package/dist/internal/email-registration-native.mjs +171 -0
  27. package/dist/internal/email-registration-native.mjs.map +1 -0
  28. package/dist/internal/models/email-model.d.mts +40 -104
  29. package/dist/internal/models/email-model.mjs +3 -5
  30. package/dist/internal/models/email-model.mjs.map +1 -1
  31. package/dist/internal/models/oauth-connected-model.d.mts +44 -213
  32. package/dist/internal/models/oauth-connected-model.mjs +6 -14
  33. package/dist/internal/models/oauth-connected-model.mjs.map +1 -1
  34. package/dist/internal/models/oauth-model.d.mts +95 -244
  35. package/dist/internal/models/oauth-model.mjs +28 -22
  36. package/dist/internal/models/oauth-model.mjs.map +1 -1
  37. package/dist/internal/models/passkey-model.d.mts +11 -147
  38. package/dist/internal/models/passkey-model.mjs +5 -24
  39. package/dist/internal/models/passkey-model.mjs.map +1 -1
  40. package/dist/internal/models/passkey-registration-ceremony-model.d.mts +5 -39
  41. package/dist/internal/models/passkey-write-model.d.mts +17 -75
  42. package/dist/internal/models/passkey-write-model.mjs +1 -7
  43. package/dist/internal/models/passkey-write-model.mjs.map +1 -1
  44. package/dist/internal/models/password-model.d.mts +16 -82
  45. package/dist/internal/models/password-model.mjs +1 -4
  46. package/dist/internal/models/password-model.mjs.map +1 -1
  47. package/dist/internal/models/phone-model.d.mts +86 -0
  48. package/dist/internal/models/phone-model.mjs +10 -0
  49. package/dist/internal/models/phone-model.mjs.map +1 -0
  50. package/dist/internal/models/proof-model.d.mts +43 -272
  51. package/dist/internal/models/proof-model.mjs +2 -10
  52. package/dist/internal/models/proof-model.mjs.map +1 -1
  53. package/dist/internal/models/session-model.d.mts +74 -93
  54. package/dist/internal/models/session-model.mjs +3 -11
  55. package/dist/internal/models/session-model.mjs.map +1 -1
  56. package/dist/internal/models/step-up-model.d.mts +12 -50
  57. package/dist/internal/models/step-up-model.mjs +2 -4
  58. package/dist/internal/models/step-up-model.mjs.map +1 -1
  59. package/dist/internal/models/totp-model.d.mts +76 -0
  60. package/dist/internal/models/totp-model.mjs +10 -0
  61. package/dist/internal/models/totp-model.mjs.map +1 -0
  62. package/dist/internal/native-sql-table.d.mts +21 -4
  63. package/dist/internal/native-sql-table.mjs +9 -5
  64. package/dist/internal/native-sql-table.mjs.map +1 -1
  65. package/dist/internal/oauth/native-accounts.d.mts +17 -0
  66. package/dist/internal/oauth/native-accounts.mjs +290 -0
  67. package/dist/internal/oauth/native-accounts.mjs.map +1 -0
  68. package/dist/internal/oauth/native-connected-state.d.mts +11 -0
  69. package/dist/internal/oauth/native-connected-state.mjs +146 -0
  70. package/dist/internal/oauth/native-connected-state.mjs.map +1 -0
  71. package/dist/internal/oauth/native-connected.d.mts +15 -0
  72. package/dist/internal/oauth/native-connected.mjs +462 -0
  73. package/dist/internal/oauth/native-connected.mjs.map +1 -0
  74. package/dist/internal/oauth/native-flow.mjs +138 -0
  75. package/dist/internal/oauth/native-flow.mjs.map +1 -0
  76. package/dist/internal/oauth/native-layers.d.mts +24 -0
  77. package/dist/internal/oauth/native-layers.mjs +13 -0
  78. package/dist/internal/oauth/native-layers.mjs.map +1 -0
  79. package/dist/internal/oauth/native-mutation.mjs +122 -0
  80. package/dist/internal/oauth/native-mutation.mjs.map +1 -0
  81. package/dist/internal/oauth/native-registration.d.mts +24 -0
  82. package/dist/internal/oauth/native-registration.mjs +328 -0
  83. package/dist/internal/oauth/native-registration.mjs.map +1 -0
  84. package/dist/internal/oauth/native-revocations.d.mts +17 -0
  85. package/dist/internal/oauth/native-revocations.mjs +106 -0
  86. package/dist/internal/oauth/native-revocations.mjs.map +1 -0
  87. package/dist/internal/oauth/native-sign-in.d.mts +17 -0
  88. package/dist/internal/oauth/native-sign-in.mjs +50 -0
  89. package/dist/internal/oauth/native-sign-in.mjs.map +1 -0
  90. package/dist/internal/oauth/native-state.d.mts +10 -0
  91. package/dist/internal/oauth/native-state.mjs +214 -0
  92. package/dist/internal/oauth/native-state.mjs.map +1 -0
  93. package/dist/internal/oauth/state.d.mts +10 -0
  94. package/dist/internal/oauth/state.mjs +3 -27
  95. package/dist/internal/oauth/state.mjs.map +1 -1
  96. package/dist/internal/passkey-actions.mjs +55 -0
  97. package/dist/internal/passkey-actions.mjs.map +1 -0
  98. package/dist/internal/passkey-inputs.mjs +73 -0
  99. package/dist/internal/passkey-inputs.mjs.map +1 -0
  100. package/dist/internal/passkey-managed.mjs +224 -0
  101. package/dist/internal/passkey-managed.mjs.map +1 -0
  102. package/dist/internal/passkey-native-ceremony.d.mts +35 -0
  103. package/dist/internal/passkey-native-ceremony.mjs +38 -0
  104. package/dist/internal/passkey-native-ceremony.mjs.map +1 -0
  105. package/dist/internal/passkey-native-flow.mjs +91 -0
  106. package/dist/internal/passkey-native-flow.mjs.map +1 -0
  107. package/dist/internal/passkey-native-registration.d.mts +10 -0
  108. package/dist/internal/passkey-native-registration.mjs +114 -0
  109. package/dist/internal/passkey-native-registration.mjs.map +1 -0
  110. package/dist/internal/passkey-native-state.d.mts +15 -0
  111. package/dist/internal/passkey-native-state.mjs +186 -0
  112. package/dist/internal/passkey-native-state.mjs.map +1 -0
  113. package/dist/internal/passkey-native-write.d.mts +82 -0
  114. package/dist/internal/passkey-native-write.mjs +330 -0
  115. package/dist/internal/passkey-native-write.mjs.map +1 -0
  116. package/dist/internal/passkey-native.d.mts +835 -0
  117. package/dist/internal/passkey-native.mjs +175 -0
  118. package/dist/internal/passkey-native.mjs.map +1 -0
  119. package/dist/internal/passkey-policy.mjs +115 -0
  120. package/dist/internal/passkey-policy.mjs.map +1 -0
  121. package/dist/internal/password-credentials.mjs +38 -9
  122. package/dist/internal/password-credentials.mjs.map +1 -1
  123. package/dist/internal/password-native.d.mts +14 -0
  124. package/dist/internal/password-native.mjs +292 -0
  125. package/dist/internal/password-native.mjs.map +1 -0
  126. package/dist/internal/password-policy.mjs +93 -0
  127. package/dist/internal/password-policy.mjs.map +1 -0
  128. package/dist/internal/password-registration-native.d.mts +22 -0
  129. package/dist/internal/password-registration-native.mjs +142 -0
  130. package/dist/internal/password-registration-native.mjs.map +1 -0
  131. package/dist/internal/persistence.d.mts +6 -19
  132. package/dist/internal/persistence.mjs +199 -166
  133. package/dist/internal/persistence.mjs.map +1 -1
  134. package/dist/internal/phone-composed.mjs +79 -0
  135. package/dist/internal/phone-composed.mjs.map +1 -0
  136. package/dist/internal/phone-native.d.mts +15 -0
  137. package/dist/internal/phone-native.mjs +354 -0
  138. package/dist/internal/phone-native.mjs.map +1 -0
  139. package/dist/internal/proof-native.d.mts +15 -0
  140. package/dist/internal/proof-native.mjs +289 -0
  141. package/dist/internal/proof-native.mjs.map +1 -0
  142. package/dist/internal/registration.mjs +50 -60
  143. package/dist/internal/registration.mjs.map +1 -1
  144. package/dist/internal/session-native-authority.d.mts +15 -0
  145. package/dist/internal/session-native-authority.mjs +91 -0
  146. package/dist/internal/session-native-authority.mjs.map +1 -0
  147. package/dist/internal/session-native-cleanup.d.mts +14 -0
  148. package/dist/internal/session-native-cleanup.mjs +48 -0
  149. package/dist/internal/session-native-cleanup.mjs.map +1 -0
  150. package/dist/internal/session-native-login.d.mts +15 -0
  151. package/dist/internal/session-native-login.mjs +87 -0
  152. package/dist/internal/session-native-login.mjs.map +1 -0
  153. package/dist/internal/session-native-pending-read.mjs +42 -0
  154. package/dist/internal/session-native-pending-read.mjs.map +1 -0
  155. package/dist/internal/session-native-pending.mjs +134 -0
  156. package/dist/internal/session-native-pending.mjs.map +1 -0
  157. package/dist/internal/session-native-record.mjs +79 -0
  158. package/dist/internal/session-native-record.mjs.map +1 -0
  159. package/dist/internal/session-native-state.mjs +130 -0
  160. package/dist/internal/session-native-state.mjs.map +1 -0
  161. package/dist/internal/session-native-stateful.d.mts +16 -0
  162. package/dist/internal/session-native-stateful.mjs +225 -0
  163. package/dist/internal/session-native-stateful.mjs.map +1 -0
  164. package/dist/internal/session-native-step-up.d.mts +15 -0
  165. package/dist/internal/session-native-step-up.mjs +212 -0
  166. package/dist/internal/session-native-step-up.mjs.map +1 -0
  167. package/dist/internal/session-native-validity.d.mts +15 -0
  168. package/dist/internal/session-native-validity.mjs +97 -0
  169. package/dist/internal/session-native-validity.mjs.map +1 -0
  170. package/dist/internal/session-policy.mjs +29 -0
  171. package/dist/internal/session-policy.mjs.map +1 -0
  172. package/dist/internal/sql-authority.d.mts +16 -0
  173. package/dist/internal/sql-authority.mjs +32 -0
  174. package/dist/internal/sql-authority.mjs.map +1 -0
  175. package/dist/internal/sql-change.mjs +21 -0
  176. package/dist/internal/sql-change.mjs.map +1 -0
  177. package/dist/internal/sql-cleanup.mjs +35 -0
  178. package/dist/internal/sql-cleanup.mjs.map +1 -0
  179. package/dist/internal/sql-commit.d.mts +72 -0
  180. package/dist/internal/sql-commit.mjs +176 -0
  181. package/dist/internal/sql-commit.mjs.map +1 -0
  182. package/dist/internal/sql-expression.d.mts +17 -0
  183. package/dist/internal/sql-expression.mjs +49 -0
  184. package/dist/internal/sql-expression.mjs.map +1 -0
  185. package/dist/internal/sql-oauth-connected-model.d.mts +7 -23
  186. package/dist/internal/sql-oauth-model.d.mts +27 -52
  187. package/dist/internal/sql-oauth-model.mjs +3 -4
  188. package/dist/internal/sql-oauth-model.mjs.map +1 -1
  189. package/dist/internal/sql-persistence.mjs +5 -9
  190. package/dist/internal/sql-persistence.mjs.map +1 -1
  191. package/dist/internal/sql-storage-validation.mjs +1 -2
  192. package/dist/internal/sql-storage-validation.mjs.map +1 -1
  193. package/dist/internal/sql-table.d.mts +3 -16
  194. package/dist/internal/sql-table.mjs +21 -42
  195. package/dist/internal/sql-table.mjs.map +1 -1
  196. package/dist/internal/standalone.mjs +2 -3
  197. package/dist/internal/standalone.mjs.map +1 -1
  198. package/dist/internal/step-up-state.mjs +5 -8
  199. package/dist/internal/step-up-state.mjs.map +1 -1
  200. package/dist/internal/storage-clock.mjs +44 -0
  201. package/dist/internal/storage-clock.mjs.map +1 -0
  202. package/dist/internal/storage-mapping.d.mts +11 -8
  203. package/dist/internal/storage-mapping.mjs +88 -302
  204. package/dist/internal/storage-mapping.mjs.map +1 -1
  205. package/dist/internal/storage-plans.mjs +15 -73
  206. package/dist/internal/storage-plans.mjs.map +1 -1
  207. package/dist/internal/storage-tables.d.mts +37 -520
  208. package/dist/internal/storage-tables.mjs +31 -211
  209. package/dist/internal/storage-tables.mjs.map +1 -1
  210. package/dist/internal/storage-validation.d.mts +1 -6
  211. package/dist/internal/storage-validation.mjs +1 -42
  212. package/dist/internal/storage-validation.mjs.map +1 -1
  213. package/dist/internal/table-model.d.mts +21 -0
  214. package/dist/internal/totp-native.d.mts +15 -0
  215. package/dist/internal/totp-native.mjs +401 -0
  216. package/dist/internal/totp-native.mjs.map +1 -0
  217. package/package.json +1 -1
  218. package/src/Adapter.ts +143 -199
  219. package/src/OAuthPersistence.ts +128 -271
  220. package/src/index.ts +1 -1
  221. package/src/internal/browser-login.ts +54 -24
  222. package/src/internal/configuration.ts +16 -31
  223. package/src/internal/d1-planning.ts +7 -0
  224. package/src/internal/email-native-state.ts +247 -0
  225. package/src/internal/email-native.ts +514 -0
  226. package/src/internal/email-policy.ts +235 -0
  227. package/src/internal/email-registration-native.ts +386 -0
  228. package/src/internal/models/email-model.ts +76 -214
  229. package/src/internal/models/oauth-connected-model.ts +50 -288
  230. package/src/internal/models/oauth-model.ts +147 -368
  231. package/src/internal/models/passkey-model.ts +11 -208
  232. package/src/internal/models/passkey-registration-ceremony-model.ts +6 -60
  233. package/src/internal/models/passkey-write-model.ts +14 -95
  234. package/src/internal/models/password-model.ts +28 -148
  235. package/src/internal/models/phone-model.ts +110 -0
  236. package/src/internal/models/proof-model.ts +48 -404
  237. package/src/internal/models/session-model.ts +102 -200
  238. package/src/internal/models/step-up-model.ts +17 -96
  239. package/src/internal/models/totp-model.ts +82 -0
  240. package/src/internal/native-sql-table.ts +32 -11
  241. package/src/internal/oauth/native-accounts.ts +576 -0
  242. package/src/internal/oauth/native-connected-state.ts +288 -0
  243. package/src/internal/oauth/native-connected.ts +888 -0
  244. package/src/internal/oauth/native-flow.ts +253 -0
  245. package/src/internal/oauth/native-layers.ts +83 -0
  246. package/src/internal/oauth/native-mutation.ts +222 -0
  247. package/src/internal/oauth/native-registration.ts +545 -0
  248. package/src/internal/oauth/native-revocations.ts +190 -0
  249. package/src/internal/oauth/native-sign-in.ts +111 -0
  250. package/src/internal/oauth/native-state.ts +346 -0
  251. package/src/internal/oauth/state.ts +2 -70
  252. package/src/internal/passkey-actions.ts +70 -0
  253. package/src/internal/passkey-inputs.ts +56 -0
  254. package/src/internal/passkey-managed.ts +360 -0
  255. package/src/internal/passkey-native-ceremony.ts +66 -0
  256. package/src/internal/passkey-native-flow.ts +140 -0
  257. package/src/internal/passkey-native-registration.ts +221 -0
  258. package/src/internal/passkey-native-state.ts +335 -0
  259. package/src/internal/passkey-native-write.ts +611 -0
  260. package/src/internal/passkey-native.ts +372 -0
  261. package/src/internal/passkey-policy.ts +246 -0
  262. package/src/internal/password-credentials.ts +52 -10
  263. package/src/internal/password-native.ts +571 -0
  264. package/src/internal/password-policy.ts +307 -0
  265. package/src/internal/password-registration-native.ts +322 -0
  266. package/src/internal/persistence.ts +336 -290
  267. package/src/internal/phone-composed.ts +86 -0
  268. package/src/internal/phone-native.ts +659 -0
  269. package/src/internal/proof-native.ts +448 -0
  270. package/src/internal/registration.ts +96 -143
  271. package/src/internal/session-native-authority.ts +247 -0
  272. package/src/internal/session-native-cleanup.ts +65 -0
  273. package/src/internal/session-native-login.ts +205 -0
  274. package/src/internal/session-native-pending-read.ts +68 -0
  275. package/src/internal/session-native-pending.ts +223 -0
  276. package/src/internal/session-native-record.ts +141 -0
  277. package/src/internal/session-native-state.ts +259 -0
  278. package/src/internal/session-native-stateful.ts +512 -0
  279. package/src/internal/session-native-step-up.ts +450 -0
  280. package/src/internal/session-native-validity.ts +208 -0
  281. package/src/internal/session-policy.ts +59 -0
  282. package/src/internal/sql-authority.ts +56 -0
  283. package/src/internal/sql-change.ts +38 -0
  284. package/src/internal/sql-cleanup.ts +56 -0
  285. package/src/internal/sql-commit.ts +435 -0
  286. package/src/internal/sql-expression.ts +94 -0
  287. package/src/internal/sql-metadata.ts +100 -0
  288. package/src/internal/sql-oauth-connected-model.ts +6 -95
  289. package/src/internal/sql-oauth-model.ts +31 -134
  290. package/src/internal/sql-persistence.ts +2 -6
  291. package/src/internal/sql-storage-validation.ts +1 -2
  292. package/src/internal/sql-table.ts +19 -52
  293. package/src/internal/standalone.ts +2 -11
  294. package/src/internal/step-up-state.ts +4 -17
  295. package/src/internal/storage-clock.ts +58 -0
  296. package/src/internal/storage-mapping.ts +125 -340
  297. package/src/internal/storage-plans.ts +14 -80
  298. package/src/internal/storage-tables.ts +28 -212
  299. package/src/internal/storage-validation.ts +0 -58
  300. package/src/internal/table-model.ts +24 -0
  301. package/src/internal/totp-native.ts +701 -0
  302. package/dist/internal/PasswordPreparedPostconditions.d.mts +0 -22
  303. package/dist/internal/PasswordPreparedPostconditions.mjs +0 -12
  304. package/dist/internal/PasswordPreparedPostconditions.mjs.map +0 -1
  305. package/dist/internal/authority-snapshot.mjs +0 -53
  306. package/dist/internal/authority-snapshot.mjs.map +0 -1
  307. package/dist/internal/email-kernel.d.mts +0 -276
  308. package/dist/internal/email-kernel.mjs +0 -497
  309. package/dist/internal/email-kernel.mjs.map +0 -1
  310. package/dist/internal/models/passkey-registration-ceremony-model.mjs +0 -18
  311. package/dist/internal/models/passkey-registration-ceremony-model.mjs.map +0 -1
  312. package/dist/internal/oauth/accounts.d.mts +0 -8
  313. package/dist/internal/oauth/accounts.mjs +0 -379
  314. package/dist/internal/oauth/accounts.mjs.map +0 -1
  315. package/dist/internal/oauth/connected-access.d.mts +0 -9
  316. package/dist/internal/oauth/connected-access.mjs +0 -229
  317. package/dist/internal/oauth/connected-access.mjs.map +0 -1
  318. package/dist/internal/oauth/connected-collection.d.mts +0 -7
  319. package/dist/internal/oauth/connected-collection.mjs +0 -214
  320. package/dist/internal/oauth/connected-collection.mjs.map +0 -1
  321. package/dist/internal/oauth/connected-custody.d.mts +0 -6
  322. package/dist/internal/oauth/connected-custody.mjs +0 -165
  323. package/dist/internal/oauth/connected-custody.mjs.map +0 -1
  324. package/dist/internal/oauth/connected-flow.d.mts +0 -7
  325. package/dist/internal/oauth/connected-flow.mjs +0 -324
  326. package/dist/internal/oauth/connected-flow.mjs.map +0 -1
  327. package/dist/internal/oauth/connected-input.mjs +0 -122
  328. package/dist/internal/oauth/connected-input.mjs.map +0 -1
  329. package/dist/internal/oauth/connected-keys.d.mts +0 -2
  330. package/dist/internal/oauth/connected-keys.mjs +0 -22
  331. package/dist/internal/oauth/connected-keys.mjs.map +0 -1
  332. package/dist/internal/oauth/connected-maintenance.d.mts +0 -9
  333. package/dist/internal/oauth/connected-maintenance.mjs +0 -226
  334. package/dist/internal/oauth/connected-maintenance.mjs.map +0 -1
  335. package/dist/internal/oauth/connected-management.d.mts +0 -9
  336. package/dist/internal/oauth/connected-management.mjs +0 -243
  337. package/dist/internal/oauth/connected-management.mjs.map +0 -1
  338. package/dist/internal/oauth/connected-reference.mjs +0 -63
  339. package/dist/internal/oauth/connected-reference.mjs.map +0 -1
  340. package/dist/internal/oauth/connected-settlement.d.mts +0 -8
  341. package/dist/internal/oauth/connected-settlement.mjs +0 -141
  342. package/dist/internal/oauth/connected-settlement.mjs.map +0 -1
  343. package/dist/internal/oauth/connected-sign-in.d.mts +0 -10
  344. package/dist/internal/oauth/connected-sign-in.mjs +0 -281
  345. package/dist/internal/oauth/connected-sign-in.mjs.map +0 -1
  346. package/dist/internal/oauth/connected-state.d.mts +0 -14
  347. package/dist/internal/oauth/connected-state.mjs +0 -469
  348. package/dist/internal/oauth/connected-state.mjs.map +0 -1
  349. package/dist/internal/oauth/connected-target.d.mts +0 -21
  350. package/dist/internal/oauth/connected-target.mjs +0 -117
  351. package/dist/internal/oauth/connected-target.mjs.map +0 -1
  352. package/dist/internal/oauth/flow.d.mts +0 -5
  353. package/dist/internal/oauth/flow.mjs +0 -279
  354. package/dist/internal/oauth/flow.mjs.map +0 -1
  355. package/dist/internal/oauth/input.mjs +0 -127
  356. package/dist/internal/oauth/input.mjs.map +0 -1
  357. package/dist/internal/oauth/owner.d.mts +0 -10
  358. package/dist/internal/oauth/owner.mjs +0 -10
  359. package/dist/internal/oauth/owner.mjs.map +0 -1
  360. package/dist/internal/oauth/query-compiler.d.mts +0 -7
  361. package/dist/internal/oauth/query-compiler.mjs +0 -9
  362. package/dist/internal/oauth/query-compiler.mjs.map +0 -1
  363. package/dist/internal/oauth/registration.d.mts +0 -7
  364. package/dist/internal/oauth/registration.mjs +0 -393
  365. package/dist/internal/oauth/registration.mjs.map +0 -1
  366. package/dist/internal/oauth/target.d.mts +0 -31
  367. package/dist/internal/oauth/target.mjs +0 -273
  368. package/dist/internal/oauth/target.mjs.map +0 -1
  369. package/dist/internal/oauth-kernel.d.mts +0 -1423
  370. package/dist/internal/oauth-kernel.mjs +0 -187
  371. package/dist/internal/oauth-kernel.mjs.map +0 -1
  372. package/dist/internal/passkey/admission.d.mts +0 -6
  373. package/dist/internal/passkey/admission.mjs +0 -220
  374. package/dist/internal/passkey/admission.mjs.map +0 -1
  375. package/dist/internal/passkey/credentials.d.mts +0 -14
  376. package/dist/internal/passkey/credentials.mjs +0 -249
  377. package/dist/internal/passkey/credentials.mjs.map +0 -1
  378. package/dist/internal/passkey/enrollment.mjs +0 -138
  379. package/dist/internal/passkey/enrollment.mjs.map +0 -1
  380. package/dist/internal/passkey/flow.d.mts +0 -21
  381. package/dist/internal/passkey/flow.mjs +0 -452
  382. package/dist/internal/passkey/flow.mjs.map +0 -1
  383. package/dist/internal/passkey/management.mjs +0 -231
  384. package/dist/internal/passkey/management.mjs.map +0 -1
  385. package/dist/internal/passkey/registration-ceremony.d.mts +0 -9
  386. package/dist/internal/passkey/registration-ceremony.mjs +0 -129
  387. package/dist/internal/passkey/registration-ceremony.mjs.map +0 -1
  388. package/dist/internal/passkey/registration-custody.d.mts +0 -2
  389. package/dist/internal/passkey/registration-custody.mjs +0 -52
  390. package/dist/internal/passkey/registration-custody.mjs.map +0 -1
  391. package/dist/internal/passkey/registration-write.mjs +0 -211
  392. package/dist/internal/passkey/registration-write.mjs.map +0 -1
  393. package/dist/internal/passkey/state.d.mts +0 -10
  394. package/dist/internal/passkey/state.mjs +0 -234
  395. package/dist/internal/passkey/state.mjs.map +0 -1
  396. package/dist/internal/passkey/target.d.mts +0 -20
  397. package/dist/internal/passkey/target.mjs +0 -200
  398. package/dist/internal/passkey/target.mjs.map +0 -1
  399. package/dist/internal/passkey/write-state.d.mts +0 -17
  400. package/dist/internal/passkey/write-state.mjs +0 -346
  401. package/dist/internal/passkey/write-state.mjs.map +0 -1
  402. package/dist/internal/passkey/write-target.mjs +0 -192
  403. package/dist/internal/passkey/write-target.mjs.map +0 -1
  404. package/dist/internal/passkey-kernel.d.mts +0 -6045
  405. package/dist/internal/passkey-kernel.mjs +0 -49
  406. package/dist/internal/passkey-kernel.mjs.map +0 -1
  407. package/dist/internal/passkeys.d.mts +0 -7
  408. package/dist/internal/passkeys.mjs +0 -387
  409. package/dist/internal/passkeys.mjs.map +0 -1
  410. package/dist/internal/password-credentials.d.mts +0 -11
  411. package/dist/internal/password-kernel.d.mts +0 -278
  412. package/dist/internal/password-kernel.mjs +0 -508
  413. package/dist/internal/password-kernel.mjs.map +0 -1
  414. package/dist/internal/phone-kernel.d.mts +0 -162
  415. package/dist/internal/phone-kernel.mjs +0 -437
  416. package/dist/internal/phone-kernel.mjs.map +0 -1
  417. package/dist/internal/proof-kernel.d.mts +0 -94
  418. package/dist/internal/proof-kernel.mjs +0 -624
  419. package/dist/internal/proof-kernel.mjs.map +0 -1
  420. package/dist/internal/query-operations.d.mts +0 -68
  421. package/dist/internal/session-kernel.d.mts +0 -62
  422. package/dist/internal/session-kernel.mjs +0 -820
  423. package/dist/internal/session-kernel.mjs.map +0 -1
  424. package/dist/internal/sql-oauth-connected-model.mjs +0 -7
  425. package/dist/internal/sql-oauth-connected-model.mjs.map +0 -1
  426. package/dist/internal/sql-query.d.mts +0 -12
  427. package/dist/internal/sql-query.mjs +0 -206
  428. package/dist/internal/sql-query.mjs.map +0 -1
  429. package/dist/internal/step-up-state.d.mts +0 -49
  430. package/dist/internal/transaction-execution-kernel.d.mts +0 -37
  431. package/dist/internal/transaction-execution-kernel.mjs +0 -120
  432. package/dist/internal/transaction-execution-kernel.mjs.map +0 -1
  433. package/dist/internal/transaction-kernel.d.mts +0 -81
  434. package/dist/internal/transaction-kernel.mjs +0 -264
  435. package/dist/internal/transaction-kernel.mjs.map +0 -1
  436. package/src/internal/PasswordPreparedPostconditions.ts +0 -30
  437. package/src/internal/authority-snapshot.ts +0 -91
  438. package/src/internal/email-kernel.ts +0 -1555
  439. package/src/internal/oauth/accounts.ts +0 -838
  440. package/src/internal/oauth/connected-access.ts +0 -388
  441. package/src/internal/oauth/connected-collection.ts +0 -345
  442. package/src/internal/oauth/connected-custody.ts +0 -308
  443. package/src/internal/oauth/connected-flow.ts +0 -562
  444. package/src/internal/oauth/connected-input.ts +0 -147
  445. package/src/internal/oauth/connected-keys.ts +0 -31
  446. package/src/internal/oauth/connected-maintenance.ts +0 -379
  447. package/src/internal/oauth/connected-management.ts +0 -391
  448. package/src/internal/oauth/connected-reference.ts +0 -135
  449. package/src/internal/oauth/connected-settlement.ts +0 -278
  450. package/src/internal/oauth/connected-sign-in.ts +0 -472
  451. package/src/internal/oauth/connected-state.ts +0 -924
  452. package/src/internal/oauth/connected-target.ts +0 -307
  453. package/src/internal/oauth/flow.ts +0 -505
  454. package/src/internal/oauth/input.ts +0 -201
  455. package/src/internal/oauth/owner.ts +0 -22
  456. package/src/internal/oauth/query-compiler.ts +0 -15
  457. package/src/internal/oauth/registration.ts +0 -676
  458. package/src/internal/oauth/target.ts +0 -803
  459. package/src/internal/oauth-kernel.ts +0 -294
  460. package/src/internal/passkey/admission.ts +0 -368
  461. package/src/internal/passkey/credentials.ts +0 -511
  462. package/src/internal/passkey/enrollment.ts +0 -326
  463. package/src/internal/passkey/flow.ts +0 -1062
  464. package/src/internal/passkey/management.ts +0 -426
  465. package/src/internal/passkey/registration-ceremony.ts +0 -283
  466. package/src/internal/passkey/registration-custody.ts +0 -91
  467. package/src/internal/passkey/registration-write.ts +0 -426
  468. package/src/internal/passkey/state.ts +0 -351
  469. package/src/internal/passkey/target.ts +0 -598
  470. package/src/internal/passkey/write-state.ts +0 -678
  471. package/src/internal/passkey/write-target.ts +0 -450
  472. package/src/internal/passkey-kernel.ts +0 -112
  473. package/src/internal/passkeys.ts +0 -652
  474. package/src/internal/password-kernel.ts +0 -1522
  475. package/src/internal/phone-kernel.ts +0 -872
  476. package/src/internal/proof-kernel.ts +0 -1992
  477. package/src/internal/query-operations.ts +0 -91
  478. package/src/internal/session-kernel.ts +0 -2406
  479. package/src/internal/sql-query.ts +0 -304
  480. package/src/internal/transaction-execution-kernel.ts +0 -335
  481. package/src/internal/transaction-kernel.ts +0 -603
@@ -1,13 +1,12 @@
1
+ import { SqlExpression, TableModel } from "../table-model.mjs";
1
2
  import { PersistenceMappingError } from "../mapping-error.mjs";
2
- import { SqlExpression, TableModel } from "../query-operations.mjs";
3
3
  import "./common.mjs";
4
- import { PasskeyColumn, PasskeyCredentialMapping, PasskeyFlowTable, PasskeyHandleReservationTable, PasskeyPersistenceMapping, PasskeyPersistenceServices } from "./passkey-model.mjs";
5
- import { PasskeyRegistrationIntentReadTable } from "./passkey-registration-ceremony-model.mjs";
4
+ import { PasskeyColumn, PasskeyCredentialMapping, PasskeyFlowTable, PasskeyPersistenceMapping, PasskeyPersistenceServices } from "./passkey-model.mjs";
6
5
  import { Effect, Schema } from "effect";
7
- import { PasskeyActionAuthorization, PasskeyCeremony, PasskeyClaim, PasskeyCredential, PasskeyCredentialSummary, PasskeyIssueDecision, PasskeyManagementPersistence, PasskeyManagementPolicy, PasskeyMethodPolicy, PasskeyRegistrationResult, PasskeyRegistrationVerified, PasskeyRequirement, PasskeyRevision, PasskeyUnavailable, PreparePasskeyCommit } from "@yielded/auth/Passkey";
8
- import { TokenDigest } from "@yielded/auth/Schema";
9
6
  import { PreparedCommit } from "@yielded/auth/Hooks";
7
+ import { PasskeyAccess, PasskeyActionAuthorization, PasskeyCeremony, PasskeyCredential, PasskeyCredentialSummary, PasskeyIssueDecision, PasskeyManagementPersistence, PasskeyManagementPolicy, PasskeyRegistrationResult, PasskeyRegistrationVerified, PasskeyRequirement, PasskeyRevision, PasskeyUnavailable, PreparePasskeyCommit } from "@yielded/auth/Passkey";
10
8
  import { SessionInvalidationWindow } from "@yielded/auth/Sessions";
9
+ import { TokenDigest } from "@yielded/auth/Schema";
11
10
  //#region src/internal/models/passkey-write-model.d.ts
12
11
  export interface PasskeyCredentialInsert<N> {
13
12
  readonly subjectId: N;
@@ -15,7 +14,7 @@ export interface PasskeyCredentialInsert<N> {
15
14
  readonly summary: PasskeyCredentialSummary;
16
15
  readonly marker: string;
17
16
  }
18
- export interface PasskeyWriteTables<S extends TableModel, C extends TableModel, F extends TableModel, O extends TableModel, H extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
17
+ export interface PasskeyWriteTables<S extends TableModel, C extends TableModel, F extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
19
18
  readonly credential: {
20
19
  readonly name: PasskeyColumn<C>;
21
20
  readonly createdAt: PasskeyColumn<C>;
@@ -31,21 +30,7 @@ export interface PasskeyWriteTables<S extends TableModel, C extends TableModel,
31
30
  readonly activeStatus: unknown;
32
31
  readonly removedStatus: unknown;
33
32
  };
34
- readonly credentialOwnership: {
35
- readonly encodeInsert: (input: PasskeyCredentialInsert<N>) => O["insert"];
36
- readonly ownedState: unknown;
37
- readonly removedState: unknown;
38
- };
39
- readonly handleOwnership: {
40
- readonly encodeInsert: (input: {
41
- readonly subjectId: N;
42
- readonly rpId: string;
43
- readonly userHandle: string;
44
- readonly marker: string;
45
- }) => H["insert"];
46
- readonly ownedState: unknown;
47
- };
48
- /** All mutable policy dependencies must be subject columns or declared module guards. */
33
+ /** Mutable management policy dependencies belong to the locked subject row. */
49
34
  readonly policy: {
50
35
  readonly subjectColumns: ReadonlyArray<PasskeyColumn<S>>;
51
36
  readonly management: (row: Readonly<Partial<S["select"]>>) => PasskeyManagementPolicy;
@@ -75,27 +60,8 @@ export declare const passkeyInvalidationMutation: <T extends TableModel, N, Expr
75
60
  readonly values: (input: PasskeyInvalidationInput<N>) => Partial<T["insert"]>;
76
61
  readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;
77
62
  }) => PasskeyInvalidationMutation<N, Expression>;
78
- export interface PasskeyCommandTable<T extends TableModel, N> {
79
- readonly table: T["table"];
80
- readonly moduleId: PasskeyColumn<T>;
81
- readonly commandId: PasskeyColumn<T>;
82
- readonly subjectId: PasskeyColumn<T>;
83
- readonly credentialId: PasskeyColumn<T>;
84
- readonly intent: PasskeyColumn<T>;
85
- readonly decision: PasskeyColumn<T>;
86
- readonly retentionUntil: PasskeyColumn<T>;
87
- readonly version: PasskeyColumn<T>;
88
- readonly encodeInsert: (input: {
89
- readonly moduleId: string;
90
- readonly commandId: string;
91
- readonly subjectId: N;
92
- readonly credentialId: string;
93
- }) => T["insert"];
94
- }
95
- export interface PasskeyManagementMapping<S extends TableModel, C extends TableModel, F extends TableModel, O extends TableModel, H extends TableModel, M extends TableModel, Flow extends TableModel, A extends TableModel, Charge extends TableModel, Command extends TableModel, N, Expression extends SqlExpression = SqlExpression> extends PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, O, H, N, Expression>, M, Flow, A, Charge, N, Expression, C> {
96
- readonly write: PasskeyWriteTables<S, C, F, O, H, N, Expression>;
97
- readonly command: PasskeyCommandTable<Command, N>;
98
- readonly managementConstraints: typeof requiredPasskeyManagementConstraints;
63
+ export interface PasskeyManagementMapping<S extends TableModel, C extends TableModel, F extends TableModel, Flow extends TableModel, N, Expression extends SqlExpression = SqlExpression> extends PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, N, Expression>, Flow, N, Expression, C> {
64
+ readonly write: PasskeyWriteTables<S, C, F, N, Expression>;
99
65
  /** Removal must match the installed session strategy and change the subject revision; immediate sessions must consult that authority or be updated here. Enrollment preserves existing authentication. */
100
66
  readonly invalidation: {
101
67
  readonly window: SessionInvalidationWindow;
@@ -103,9 +69,6 @@ export interface PasskeyManagementMapping<S extends TableModel, C extends TableM
103
69
  readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;
104
70
  };
105
71
  }
106
- export declare const requiredPasskeyManagementConstraints: {
107
- readonly command: readonly ["moduleId", "commandId"];
108
- };
109
72
  export interface PasskeyManagementServices extends PasskeyPersistenceServices {
110
73
  readonly passkeyManagementPersistence: PasskeyManagementPersistence["Service"];
111
74
  }
@@ -118,13 +81,12 @@ export interface PasskeyRegistrationWriter<R> {
118
81
  }, PasskeyUnavailable>;
119
82
  readonly issueRegistration: <A>(input: {
120
83
  readonly ceremony: PasskeyCeremony;
121
- readonly policy: PasskeyMethodPolicy;
122
84
  readonly registration: R;
123
85
  }, prepare: PreparePasskeyCommit<PasskeyIssueDecision, A>) => Effect.Effect<PreparedCommit<A>, PasskeyUnavailable>;
124
86
  readonly completeRegistration: <A>(input: {
125
- readonly claim: PasskeyClaim;
87
+ readonly access: PasskeyAccess;
88
+ readonly ceremony: PasskeyCeremony;
126
89
  readonly verified: PasskeyRegistrationVerified;
127
- readonly nowMillis: number;
128
90
  }, prepare: PreparePasskeyCommit<PasskeyRegistrationResult | {
129
91
  readonly _tag: "Rejected";
130
92
  }, A>) => Effect.Effect<PreparedCommit<A>, PasskeyUnavailable>;
@@ -132,26 +94,11 @@ export interface PasskeyRegistrationWriter<R> {
132
94
  export interface PasskeyRegistrationServices<R> extends PasskeyPersistenceServices {
133
95
  readonly passkeyRegistrationAuthority: PasskeyRegistrationWriter<R>;
134
96
  }
135
- export interface PasskeyRegistrationMapping<S extends TableModel, C extends TableModel, F extends TableModel, O extends TableModel, H extends TableModel, M extends TableModel, Flow extends TableModel, A extends TableModel, Charge extends TableModel, Intent extends TableModel, N, R, Expression extends SqlExpression = SqlExpression> extends PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, O, H, N, Expression>, M, Flow, A, Charge, N, Expression, C> {
136
- readonly write: PasskeyWriteTables<S, C, F, O, H, N, Expression>;
97
+ export interface PasskeyRegistrationMapping<S extends TableModel, C extends TableModel, F extends TableModel, Flow extends TableModel, N, R, Expression extends SqlExpression = SqlExpression> extends PasskeyPersistenceMapping<PasskeyCredentialMapping<S, C, F, N, Expression>, Flow, N, Expression, C> {
98
+ readonly write: PasskeyWriteTables<S, C, F, N, Expression>;
137
99
  readonly flow: PasskeyFlowTable<Flow>;
138
- readonly handle: PasskeyHandleReservationTable<H, Expression> & {
139
- readonly reservedState: unknown;
140
- readonly encodeInsert: (input: {
141
- readonly ceremony: PasskeyCeremony;
142
- readonly reservationId: string;
143
- }) => H["insert"];
144
- };
145
- readonly intent: PasskeyRegistrationIntentReadTable<Intent, Expression> & {
146
- readonly pendingState: unknown;
147
- readonly acceptedState: unknown;
148
- readonly rejectedState: unknown;
149
- readonly encodeInsert: (input: {
150
- readonly ceremony: PasskeyCeremony;
151
- readonly registration: R;
152
- readonly reservationId: string;
153
- }) => Intent["insert"];
154
- };
100
+ /** Schema-encoded original registration payload on the same immutable flow row. */
101
+ readonly applicationSnapshot: PasskeyColumn<Flow>;
155
102
  /** Consumer-owned data and identity, synchronously encoded inside the owner. A SQL-local registration creates no session and needs no email address. */
156
103
  readonly registration: {
157
104
  readonly schema: Schema.Codec<R, unknown, never, never>;
@@ -162,12 +109,13 @@ export interface PasskeyRegistrationMapping<S extends TableModel, C extends Tabl
162
109
  readonly eligible: (registration: R) => Expression;
163
110
  /** Commit-time application policy after provisioning. Unlike `eligible`, this
164
111
  * must permit the newly created subject and retain every mutable prerequisite.
165
- * Declare mutable external policy rows in module.guards so native locking
166
- * owners serialize revocation through commit; this predicate alone is not a lock. */
112
+ * Subject-local prerequisites are checked under its lock. */
167
113
  readonly finalEligibility: (input: {
168
114
  readonly registration: R;
169
115
  readonly subjectId: N;
170
116
  }) => Expression;
117
+ /** D1 plans require explicit subject identity, status, and security revision
118
+ * values; they cannot read database defaults before the atomic batch runs. */
171
119
  readonly subject: (input: {
172
120
  readonly registration: R;
173
121
  readonly ceremony: PasskeyCeremony;
@@ -178,12 +126,6 @@ export interface PasskeyRegistrationMapping<S extends TableModel, C extends Tabl
178
126
  };
179
127
  readonly activeStatus: unknown;
180
128
  };
181
- readonly registrationConstraints: typeof requiredPasskeyRegistrationWriteConstraints;
182
129
  }
183
- export declare const requiredPasskeyRegistrationWriteConstraints: {
184
- readonly intentFlow: readonly ["moduleId", "flowId"];
185
- readonly intentCommand: readonly ["moduleId", "commandId"];
186
- readonly handle: readonly ["handleKey"];
187
- };
188
130
  //#endregion
189
131
  //# sourceMappingURL=passkey-write-model.d.mts.map
@@ -1,13 +1,7 @@
1
1
  //#region src/internal/models/passkey-write-model.ts
2
2
  /** Same-owner updates for consumer session/pending tables. No external effects or callbacks after commit. */
3
3
  const passkeyInvalidationMutation = (input) => input;
4
- const requiredPasskeyManagementConstraints = { command: ["moduleId", "commandId"] };
5
- const requiredPasskeyRegistrationWriteConstraints = {
6
- intentFlow: ["moduleId", "flowId"],
7
- intentCommand: ["moduleId", "commandId"],
8
- handle: ["handleKey"]
9
- };
10
4
  //#endregion
11
- export { passkeyInvalidationMutation, requiredPasskeyManagementConstraints, requiredPasskeyRegistrationWriteConstraints };
5
+ export { passkeyInvalidationMutation };
12
6
 
13
7
  //# sourceMappingURL=passkey-write-model.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"passkey-write-model.mjs","names":[],"sources":["../../../src/internal/models/passkey-write-model.ts"],"sourcesContent":["import type { PreparedCommit } from \"@yielded/auth/Hooks\";\nimport type {\n PasskeyUnavailable,\n PasskeyActionAuthorization,\n PasskeyCeremony,\n PasskeyClaim,\n PasskeyCredential,\n PasskeyCredentialSummary,\n PasskeyIssueDecision,\n PasskeyRegistrationResult,\n PasskeyRegistrationVerified,\n PasskeyRequirement,\n PasskeyRevision,\n PasskeyManagementPersistence,\n PreparePasskeyCommit,\n PasskeyManagementPolicy,\n PasskeyMethodPolicy,\n} from \"@yielded/auth/Passkey\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport type { SessionInvalidationWindow } from \"@yielded/auth/Sessions\";\nimport type { Effect, Schema } from \"effect\";\n\nimport type { TableModel as Table, SqlExpression } from \"../query-operations\";\nimport type { PersistenceMappingError } from \"./common\";\nimport type {\n PasskeyColumn,\n PasskeyCredentialMapping,\n PasskeyFlowTable,\n PasskeyHandleReservationTable,\n PasskeyPersistenceMapping,\n PasskeyPersistenceServices,\n} from \"./passkey-model\";\nimport type { PasskeyRegistrationIntentReadTable } from \"./passkey-registration-ceremony-model\";\n\nexport interface PasskeyCredentialInsert<N> {\n readonly subjectId: N;\n readonly credential: PasskeyCredential;\n readonly summary: PasskeyCredentialSummary;\n readonly marker: string;\n}\n\nexport interface PasskeyWriteTables<\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly credential: {\n readonly name: PasskeyColumn<C>;\n readonly createdAt: PasskeyColumn<C>;\n readonly encodeInsert: (input: PasskeyCredentialInsert<N>) => C[\"insert\"];\n readonly encodePrimarySignIn: (value: boolean) => unknown;\n readonly encodeEnrollmentUserVerified: (value: boolean) => unknown;\n readonly encodeBackupEligible: (value: boolean) => unknown;\n readonly activeStatus: unknown;\n readonly removedStatus: unknown;\n };\n readonly authority: {\n readonly encodeInsert: (input: PasskeyCredentialInsert<N>) => F[\"insert\"];\n readonly activeStatus: unknown;\n readonly removedStatus: unknown;\n };\n readonly credentialOwnership: {\n readonly encodeInsert: (input: PasskeyCredentialInsert<N>) => O[\"insert\"];\n readonly ownedState: unknown;\n readonly removedState: unknown;\n };\n readonly handleOwnership: {\n readonly encodeInsert: (input: {\n readonly subjectId: N;\n readonly rpId: string;\n readonly userHandle: string;\n readonly marker: string;\n }) => H[\"insert\"];\n readonly ownedState: unknown;\n };\n /** All mutable policy dependencies must be subject columns or declared module guards. */\n readonly policy: {\n readonly subjectColumns: ReadonlyArray<PasskeyColumn<S>>;\n readonly management: (row: Readonly<Partial<S[\"select\"]>>) => PasskeyManagementPolicy;\n readonly requirement: (\n row: Readonly<Partial<S[\"select\"]>>,\n action: PasskeyActionAuthorization[\"challenge\"][\"action\"],\n ) => Effect.Effect<typeof PasskeyRequirement.Type, PersistenceMappingError>;\n readonly metadata: (subjectId: N) => Expression;\n readonly action: (subjectId: N, authorization: PasskeyActionAuthorization) => Expression;\n /** Usable primary/recovery path AND required remaining factors. Evaluated with the target excluded, before and after removal. Connected grants/factor-only credentials are not primary paths. */\n readonly remainingSignIn: (\n subjectId: N,\n removedCredentialId: string,\n row: Readonly<Partial<S[\"select\"]>>,\n ) => Effect.Effect<Expression, PersistenceMappingError>;\n };\n}\n\nexport interface PasskeyInvalidationInput<N> {\n readonly subjectId: N;\n readonly previousRevision: typeof PasskeyRevision.Type.securityRevision;\n readonly securityRevision: typeof PasskeyRevision.Type.securityRevision;\n readonly invalidation: SessionInvalidationWindow;\n}\n\nexport interface PasskeyInvalidationMutation<N, Expression extends SqlExpression = SqlExpression> {\n readonly table: object;\n readonly where: (input: PasskeyInvalidationInput<N>) => Expression;\n readonly values: (input: PasskeyInvalidationInput<N>) => Readonly<Record<string, unknown>>;\n readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;\n}\n\n/** Same-owner updates for consumer session/pending tables. No external effects or callbacks after commit. */\nexport const passkeyInvalidationMutation = <\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(input: {\n readonly table: T[\"table\"];\n readonly where: (input: PasskeyInvalidationInput<N>) => Expression;\n readonly values: (input: PasskeyInvalidationInput<N>) => Partial<T[\"insert\"]>;\n readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;\n}): PasskeyInvalidationMutation<N, Expression> => input;\n\nexport interface PasskeyCommandTable<T extends Table, N> {\n readonly table: T[\"table\"];\n readonly moduleId: PasskeyColumn<T>;\n readonly commandId: PasskeyColumn<T>;\n readonly subjectId: PasskeyColumn<T>;\n readonly credentialId: PasskeyColumn<T>;\n readonly intent: PasskeyColumn<T>;\n readonly decision: PasskeyColumn<T>;\n readonly retentionUntil: PasskeyColumn<T>;\n readonly version: PasskeyColumn<T>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly commandId: string;\n readonly subjectId: N;\n readonly credentialId: string;\n }) => T[\"insert\"];\n}\n\nexport interface PasskeyManagementMapping<\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n A extends Table,\n Charge extends Table,\n Command extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> extends PasskeyPersistenceMapping<\n PasskeyCredentialMapping<S, C, F, O, H, N, Expression>,\n M,\n Flow,\n A,\n Charge,\n N,\n Expression,\n C\n> {\n readonly write: PasskeyWriteTables<S, C, F, O, H, N, Expression>;\n readonly command: PasskeyCommandTable<Command, N>;\n readonly managementConstraints: typeof requiredPasskeyManagementConstraints;\n /** Removal must match the installed session strategy and change the subject revision; immediate sessions must consult that authority or be updated here. Enrollment preserves existing authentication. */\n readonly invalidation: {\n readonly window: SessionInvalidationWindow;\n readonly mutations: ReadonlyArray<PasskeyInvalidationMutation<N, Expression>>;\n readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;\n };\n}\n\nexport const requiredPasskeyManagementConstraints = { command: [\"moduleId\", \"commandId\"] } as const;\n\nexport interface PasskeyManagementServices extends PasskeyPersistenceServices {\n readonly passkeyManagementPersistence: PasskeyManagementPersistence[\"Service\"];\n}\n\nexport interface PasskeyRegistrationWriter<R> {\n readonly inspect: (registration: R) => Effect.Effect<\n {\n readonly fingerprint: TokenDigest;\n readonly eligible: boolean;\n readonly name: string;\n readonly displayName: string;\n },\n PasskeyUnavailable\n >;\n readonly issueRegistration: <A>(\n input: {\n readonly ceremony: PasskeyCeremony;\n readonly policy: PasskeyMethodPolicy;\n readonly registration: R;\n },\n prepare: PreparePasskeyCommit<PasskeyIssueDecision, A>,\n ) => Effect.Effect<PreparedCommit<A>, PasskeyUnavailable>;\n readonly completeRegistration: <A>(\n input: {\n readonly claim: PasskeyClaim;\n readonly verified: PasskeyRegistrationVerified;\n readonly nowMillis: number;\n },\n prepare: PreparePasskeyCommit<\n | PasskeyRegistrationResult\n | {\n readonly _tag: \"Rejected\";\n },\n A\n >,\n ) => Effect.Effect<PreparedCommit<A>, PasskeyUnavailable>;\n}\n\nexport interface PasskeyRegistrationServices<R> extends PasskeyPersistenceServices {\n readonly passkeyRegistrationAuthority: PasskeyRegistrationWriter<R>;\n}\n\nexport interface PasskeyRegistrationMapping<\n S extends Table,\n C extends Table,\n F extends Table,\n O extends Table,\n H extends Table,\n M extends Table,\n Flow extends Table,\n A extends Table,\n Charge extends Table,\n Intent extends Table,\n N,\n R,\n Expression extends SqlExpression = SqlExpression,\n> extends PasskeyPersistenceMapping<\n PasskeyCredentialMapping<S, C, F, O, H, N, Expression>,\n M,\n Flow,\n A,\n Charge,\n N,\n Expression,\n C\n> {\n readonly write: PasskeyWriteTables<S, C, F, O, H, N, Expression>;\n readonly flow: PasskeyFlowTable<Flow>;\n readonly handle: PasskeyHandleReservationTable<H, Expression> & {\n readonly reservedState: unknown;\n readonly encodeInsert: (input: {\n readonly ceremony: PasskeyCeremony;\n readonly reservationId: string;\n }) => H[\"insert\"];\n };\n readonly intent: PasskeyRegistrationIntentReadTable<Intent, Expression> & {\n readonly pendingState: unknown;\n readonly acceptedState: unknown;\n readonly rejectedState: unknown;\n readonly encodeInsert: (input: {\n readonly ceremony: PasskeyCeremony;\n readonly registration: R;\n readonly reservationId: string;\n }) => Intent[\"insert\"];\n };\n /** Consumer-owned data and identity, synchronously encoded inside the owner. A SQL-local registration creates no session and needs no email address. */\n readonly registration: {\n readonly schema: Schema.Codec<R, unknown, never, never>;\n readonly describe: (registration: R) => {\n readonly name: string;\n readonly displayName: string;\n };\n readonly eligible: (registration: R) => Expression;\n /** Commit-time application policy after provisioning. Unlike `eligible`, this\n * must permit the newly created subject and retain every mutable prerequisite.\n * Declare mutable external policy rows in module.guards so native locking\n * owners serialize revocation through commit; this predicate alone is not a lock. */\n readonly finalEligibility: (input: {\n readonly registration: R;\n readonly subjectId: N;\n }) => Expression;\n readonly subject: (input: {\n readonly registration: R;\n readonly ceremony: PasskeyCeremony;\n readonly marker: string;\n }) => {\n readonly subjectId: N;\n readonly values: S[\"insert\"];\n };\n readonly activeStatus: unknown;\n };\n readonly registrationConstraints: typeof requiredPasskeyRegistrationWriteConstraints;\n}\n\nexport const requiredPasskeyRegistrationWriteConstraints = {\n intentFlow: [\"moduleId\", \"flowId\"],\n intentCommand: [\"moduleId\", \"commandId\"],\n handle: [\"handleKey\"],\n} as const;\n"],"mappings":";;AAiHA,MAAa,+BAIX,UAKgD;AAsDlD,MAAa,uCAAuC,EAAE,SAAS,CAAC,YAAY,WAAW,EAAE;AAoHzF,MAAa,8CAA8C;CACzD,YAAY,CAAC,YAAY,QAAQ;CACjC,eAAe,CAAC,YAAY,WAAW;CACvC,QAAQ,CAAC,WAAW;AACtB"}
1
+ {"version":3,"file":"passkey-write-model.mjs","names":[],"sources":["../../../src/internal/models/passkey-write-model.ts"],"sourcesContent":["import type { PreparedCommit } from \"@yielded/auth/Hooks\";\nimport type {\n PasskeyUnavailable,\n PasskeyActionAuthorization,\n PasskeyCeremony,\n PasskeyAccess,\n PasskeyCredential,\n PasskeyCredentialSummary,\n PasskeyIssueDecision,\n PasskeyRegistrationResult,\n PasskeyRegistrationVerified,\n PasskeyRequirement,\n PasskeyRevision,\n PasskeyManagementPersistence,\n PreparePasskeyCommit,\n PasskeyManagementPolicy,\n} from \"@yielded/auth/Passkey\";\nimport type { TokenDigest } from \"@yielded/auth/Schema\";\nimport type { SessionInvalidationWindow } from \"@yielded/auth/Sessions\";\nimport type { Effect, Schema } from \"effect\";\n\nimport type { TableModel as Table, SqlExpression } from \"../table-model\";\nimport type { PersistenceMappingError } from \"./common\";\nimport type {\n PasskeyColumn,\n PasskeyCredentialMapping,\n PasskeyFlowTable,\n PasskeyPersistenceMapping,\n PasskeyPersistenceServices,\n} from \"./passkey-model\";\n\nexport interface PasskeyCredentialInsert<N> {\n readonly subjectId: N;\n readonly credential: PasskeyCredential;\n readonly summary: PasskeyCredentialSummary;\n readonly marker: string;\n}\n\nexport interface PasskeyWriteTables<\n S extends Table,\n C extends Table,\n F extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly credential: {\n readonly name: PasskeyColumn<C>;\n readonly createdAt: PasskeyColumn<C>;\n readonly encodeInsert: (input: PasskeyCredentialInsert<N>) => C[\"insert\"];\n readonly encodePrimarySignIn: (value: boolean) => unknown;\n readonly encodeEnrollmentUserVerified: (value: boolean) => unknown;\n readonly encodeBackupEligible: (value: boolean) => unknown;\n readonly activeStatus: unknown;\n readonly removedStatus: unknown;\n };\n readonly authority: {\n readonly encodeInsert: (input: PasskeyCredentialInsert<N>) => F[\"insert\"];\n readonly activeStatus: unknown;\n readonly removedStatus: unknown;\n };\n /** Mutable management policy dependencies belong to the locked subject row. */\n readonly policy: {\n readonly subjectColumns: ReadonlyArray<PasskeyColumn<S>>;\n readonly management: (row: Readonly<Partial<S[\"select\"]>>) => PasskeyManagementPolicy;\n readonly requirement: (\n row: Readonly<Partial<S[\"select\"]>>,\n action: PasskeyActionAuthorization[\"challenge\"][\"action\"],\n ) => Effect.Effect<typeof PasskeyRequirement.Type, PersistenceMappingError>;\n readonly metadata: (subjectId: N) => Expression;\n readonly action: (subjectId: N, authorization: PasskeyActionAuthorization) => Expression;\n /** Usable primary/recovery path AND required remaining factors. Evaluated with the target excluded, before and after removal. Connected grants/factor-only credentials are not primary paths. */\n readonly remainingSignIn: (\n subjectId: N,\n removedCredentialId: string,\n row: Readonly<Partial<S[\"select\"]>>,\n ) => Effect.Effect<Expression, PersistenceMappingError>;\n };\n}\n\nexport interface PasskeyInvalidationInput<N> {\n readonly subjectId: N;\n readonly previousRevision: typeof PasskeyRevision.Type.securityRevision;\n readonly securityRevision: typeof PasskeyRevision.Type.securityRevision;\n readonly invalidation: SessionInvalidationWindow;\n}\n\nexport interface PasskeyInvalidationMutation<N, Expression extends SqlExpression = SqlExpression> {\n readonly table: object;\n readonly where: (input: PasskeyInvalidationInput<N>) => Expression;\n readonly values: (input: PasskeyInvalidationInput<N>) => Readonly<Record<string, unknown>>;\n readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;\n}\n\n/** Same-owner updates for consumer session/pending tables. No external effects or callbacks after commit. */\nexport const passkeyInvalidationMutation = <\n T extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n>(input: {\n readonly table: T[\"table\"];\n readonly where: (input: PasskeyInvalidationInput<N>) => Expression;\n readonly values: (input: PasskeyInvalidationInput<N>) => Partial<T[\"insert\"]>;\n readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;\n}): PasskeyInvalidationMutation<N, Expression> => input;\n\nexport interface PasskeyManagementMapping<\n S extends Table,\n C extends Table,\n F extends Table,\n Flow extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> extends PasskeyPersistenceMapping<\n PasskeyCredentialMapping<S, C, F, N, Expression>,\n Flow,\n N,\n Expression,\n C\n> {\n readonly write: PasskeyWriteTables<S, C, F, N, Expression>;\n /** Removal must match the installed session strategy and change the subject revision; immediate sessions must consult that authority or be updated here. Enrollment preserves existing authentication. */\n readonly invalidation: {\n readonly window: SessionInvalidationWindow;\n readonly mutations: ReadonlyArray<PasskeyInvalidationMutation<N, Expression>>;\n readonly postcondition: (input: PasskeyInvalidationInput<N>) => Expression;\n };\n}\n\nexport interface PasskeyManagementServices extends PasskeyPersistenceServices {\n readonly passkeyManagementPersistence: PasskeyManagementPersistence[\"Service\"];\n}\n\nexport interface PasskeyRegistrationWriter<R> {\n readonly inspect: (registration: R) => Effect.Effect<\n {\n readonly fingerprint: TokenDigest;\n readonly eligible: boolean;\n readonly name: string;\n readonly displayName: string;\n },\n PasskeyUnavailable\n >;\n readonly issueRegistration: <A>(\n input: {\n readonly ceremony: PasskeyCeremony;\n readonly registration: R;\n },\n prepare: PreparePasskeyCommit<PasskeyIssueDecision, A>,\n ) => Effect.Effect<PreparedCommit<A>, PasskeyUnavailable>;\n readonly completeRegistration: <A>(\n input: {\n readonly access: PasskeyAccess;\n readonly ceremony: PasskeyCeremony;\n readonly verified: PasskeyRegistrationVerified;\n },\n prepare: PreparePasskeyCommit<\n | PasskeyRegistrationResult\n | {\n readonly _tag: \"Rejected\";\n },\n A\n >,\n ) => Effect.Effect<PreparedCommit<A>, PasskeyUnavailable>;\n}\n\nexport interface PasskeyRegistrationServices<R> extends PasskeyPersistenceServices {\n readonly passkeyRegistrationAuthority: PasskeyRegistrationWriter<R>;\n}\n\nexport interface PasskeyRegistrationMapping<\n S extends Table,\n C extends Table,\n F extends Table,\n Flow extends Table,\n N,\n R,\n Expression extends SqlExpression = SqlExpression,\n> extends PasskeyPersistenceMapping<\n PasskeyCredentialMapping<S, C, F, N, Expression>,\n Flow,\n N,\n Expression,\n C\n> {\n readonly write: PasskeyWriteTables<S, C, F, N, Expression>;\n readonly flow: PasskeyFlowTable<Flow>;\n /** Schema-encoded original registration payload on the same immutable flow row. */\n readonly applicationSnapshot: PasskeyColumn<Flow>;\n /** Consumer-owned data and identity, synchronously encoded inside the owner. A SQL-local registration creates no session and needs no email address. */\n readonly registration: {\n readonly schema: Schema.Codec<R, unknown, never, never>;\n readonly describe: (registration: R) => {\n readonly name: string;\n readonly displayName: string;\n };\n readonly eligible: (registration: R) => Expression;\n /** Commit-time application policy after provisioning. Unlike `eligible`, this\n * must permit the newly created subject and retain every mutable prerequisite.\n * Subject-local prerequisites are checked under its lock. */\n readonly finalEligibility: (input: {\n readonly registration: R;\n readonly subjectId: N;\n }) => Expression;\n /** D1 plans require explicit subject identity, status, and security revision\n * values; they cannot read database defaults before the atomic batch runs. */\n readonly subject: (input: {\n readonly registration: R;\n readonly ceremony: PasskeyCeremony;\n readonly marker: string;\n }) => {\n readonly subjectId: N;\n readonly values: S[\"insert\"];\n };\n readonly activeStatus: unknown;\n };\n}\n"],"mappings":";;AA8FA,MAAa,+BAIX,UAKgD"}
@@ -1,10 +1,11 @@
1
+ import { AnyTableModel, SqlExpression, TableModel } from "../table-model.mjs";
1
2
  import { PersistenceMappingError } from "../mapping-error.mjs";
2
- import { AnyTableModel, SqlExpression, TableModel } from "../query-operations.mjs";
3
3
  import { SubjectIdCodec } from "./common.mjs";
4
+ import { ProofClock } from "./proof-model.mjs";
4
5
  import { Effect, Redacted } from "effect";
6
+ import { EncodedPasswordHash, PasswordAction, PasswordCredentialSnapshot, PasswordReplacement } from "@yielded/auth/Password";
5
7
  import { AuthenticationRequirement, SecurityRevision } from "@yielded/auth/Sessions";
6
- import { EncodedPasswordHash, PasswordAction, PasswordCredentialSnapshot, PasswordRegistrationDecision, PasswordReplacement } from "@yielded/auth/Password";
7
- import { LoginIdentifier, RecoveryReference } from "@yielded/auth/Identity";
8
+ import { LoginIdentifier } from "@yielded/auth/Identity";
8
9
  //#region src/internal/models/password-model.d.ts
9
10
  type ColumnKey<T extends TableModel> = T["column"];
10
11
  export interface PasswordSubjectTable<Subject extends TableModel, _NativeSubjectId> {
@@ -82,48 +83,19 @@ export interface PasswordCredentialTable<Subject extends TableModel, Identifier
82
83
  readonly credential: Credential["select"];
83
84
  }) => Effect.Effect<PasswordCredentialSnapshot, PersistenceMappingError>;
84
85
  }
85
- export interface PasswordCommandTable<Command extends TableModel> {
86
- readonly table: Command["table"];
87
- readonly moduleId: ColumnKey<Command>;
88
- readonly commandId: ColumnKey<Command>;
89
- readonly action: ColumnKey<Command>;
90
- readonly bindingDigest: ColumnKey<Command>;
91
- readonly decision: ColumnKey<Command>;
92
- readonly retentionUntil: ColumnKey<Command>;
93
- readonly encodeInsert: (input: {
94
- readonly moduleId: string;
95
- readonly commandId: string;
96
- readonly action: string;
97
- readonly bindingDigest: string;
98
- readonly decision: "changed";
99
- readonly retentionUntilMillis: number;
100
- }) => Command["insert"];
101
- }
102
86
  export interface RequiredPasswordConstraints {
103
87
  readonly identifier: "unique(identifier.namespace,identifier.value)";
104
88
  readonly authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)";
105
89
  readonly credentialSubject: "unique(credential.moduleId,credential.subjectId)";
106
90
  readonly credentialId: "unique(credential.moduleId,credential.credentialId)";
107
- readonly command: "unique(command.moduleId,command.commandId)";
108
91
  }
109
92
  export declare const requiredPasswordConstraints: RequiredPasswordConstraints;
110
- export interface PasswordConstraintClassifier {
111
- /** Match only the mapped command uniqueness constraint. */
112
- readonly isCommandConflict: (cause: unknown) => boolean;
113
- }
114
- export interface PasswordD1Clock<Expression extends SqlExpression = SqlExpression> {
115
- readonly engineNow: Expression;
116
- readonly engineNowMillis: Expression;
117
- readonly engineInstantMinus: (millis: number) => Expression;
118
- readonly engineInstantPlus: (millis: number) => Expression;
119
- }
120
- export interface PasswordPersistenceMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, Command extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> extends PasswordConstraintClassifier {
93
+ export interface PasswordPersistenceMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> {
121
94
  readonly subject: PasswordSubjectTable<Subject, NativeSubjectId>;
122
95
  readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression>;
123
96
  readonly credential: PasswordCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;
124
97
  /** Every factor revision named by action evidence, including non-password factors. */
125
98
  readonly authorityCredential: PasswordAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;
126
- readonly command: PasswordCommandTable<Command>;
127
99
  readonly subjectId: SubjectIdCodec<NativeSubjectId>;
128
100
  readonly constraints: RequiredPasswordConstraints;
129
101
  readonly encodeInstant: (epochMillis: number) => unknown;
@@ -132,27 +104,14 @@ export interface PasswordPersistenceMapping<Subject extends TableModel, Identifi
132
104
  readonly allocateCredentialIdSync?: () => string;
133
105
  readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;
134
106
  readonly allocateRevisionSync?: () => SecurityRevision;
135
- readonly commandRetentionMillis: number;
136
- /** All semantic replacements still bump subject revision. This flag only declares bearer invalidation latency. */
107
+ /** All semantic replacements still bump subject revision. This flag declares
108
+ * authoritative verification's invalidation latency; cookie exposure is separate. */
137
109
  readonly sessionInvalidation: "same-authority-immediate" | "original-absolute-expiry";
138
- readonly d1?: PasswordD1Clock<Expression>;
139
- }
140
- export type D1PasswordPersistenceMapping<Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, Command extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> = PasswordPersistenceMapping<Subject, Identifier, Credential, AuthorityCredential, Command, NativeSubjectId, Expression> & {
141
- readonly d1: PasswordD1Clock<Expression>;
142
- readonly subject: PasswordSubjectTable<Subject, NativeSubjectId> & {
143
- readonly d1ActiveStatusValue: unknown;
110
+ readonly clock: ProofClock<Expression>;
111
+ readonly d1?: {
112
+ readonly primary: true;
144
113
  };
145
- readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression> & {
146
- readonly d1CurrentCondition: (input: {
147
- readonly identifier: LoginIdentifier;
148
- readonly nativeSubjectId: NativeSubjectId;
149
- }) => Expression;
150
- };
151
- readonly authorityCredential: PasswordAuthorityCredentialTable<AuthorityCredential, NativeSubjectId> & {
152
- readonly d1ActiveStatusValue: unknown;
153
- };
154
- };
155
- export type PasswordRegistrationState = "pending" | "created";
114
+ }
156
115
  export interface PasswordRegistrationIntent<Registration> {
157
116
  readonly moduleId: string;
158
117
  readonly requestId: string;
@@ -160,23 +119,6 @@ export interface PasswordRegistrationIntent<Registration> {
160
119
  readonly registration: Registration;
161
120
  readonly replacement: PasswordReplacement;
162
121
  }
163
- export interface PasswordRegistrationTable<Registration, Request extends TableModel, NativeSubjectId> {
164
- readonly table: Request["table"];
165
- readonly moduleId: ColumnKey<Request>;
166
- readonly requestId: ColumnKey<Request>;
167
- readonly state: ColumnKey<Request>;
168
- readonly subjectId: ColumnKey<Request>;
169
- readonly recoveryReference: ColumnKey<Request>;
170
- readonly encodeInsert: (input: PasswordRegistrationIntent<Registration>, state: {
171
- readonly state: PasswordRegistrationState;
172
- readonly nativeSubjectId?: NativeSubjectId;
173
- readonly recoveryReference?: typeof RecoveryReference.Type;
174
- }) => Request["insert"];
175
- /** Replay projection must never expose a stored subject or decode protected intent. */
176
- readonly decodeReplay: (row: Request["select"]) => Effect.Effect<Exclude<PasswordRegistrationDecision, {
177
- readonly _tag: "Created";
178
- }>, PersistenceMappingError>;
179
- }
180
122
  export interface PasswordRegistrationProvisioning<Registration, Subject extends TableModel, NativeSubjectId> {
181
123
  readonly encodeSubjectInsert: (input: PasswordRegistrationIntent<Registration>, values: {
182
124
  readonly nativeSubjectId: NativeSubjectId | undefined;
@@ -188,31 +130,27 @@ export interface PasswordRegistrationProvisioning<Registration, Subject extends
188
130
  readonly decodeGeneratedId?: (rows: ReadonlyArray<unknown>) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;
189
131
  }
190
132
  export interface RequiredPasswordRegistrationConstraints {
191
- readonly request: "unique(registration.moduleId,registration.requestId)";
192
- readonly recoveryReference: "unique(registration.recoveryReference)";
193
133
  readonly identifier: "unique(identifier.namespace,identifier.value)";
194
134
  readonly credentialSubject: "unique(credential.moduleId,credential.subjectId)";
195
135
  readonly authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)";
196
136
  }
197
137
  export declare const requiredPasswordRegistrationConstraints: RequiredPasswordRegistrationConstraints;
198
138
  export interface PasswordRegistrationConstraintClassifier {
199
- readonly isRequestConflict: (cause: unknown) => boolean;
200
139
  readonly isIdentifierConflict: (cause: unknown) => boolean;
201
140
  readonly isCredentialConflict: (cause: unknown) => boolean;
202
141
  }
203
- export type PasswordRegistrationMapping<Registration, Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, Request extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> = PasswordRegistrationConstraintClassifier & {
142
+ export type PasswordRegistrationMapping<Registration, Subject extends TableModel, Identifier extends TableModel, Credential extends TableModel, AuthorityCredential extends TableModel, NativeSubjectId, Expression extends SqlExpression = SqlExpression> = PasswordRegistrationConstraintClassifier & {
204
143
  readonly subject: PasswordSubjectTable<Subject, NativeSubjectId>;
205
144
  readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression>;
206
145
  readonly credential: PasswordCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;
207
146
  readonly authorityCredential: PasswordAuthorityCredentialTable<AuthorityCredential, NativeSubjectId>;
208
- readonly registration: PasswordRegistrationTable<Registration, Request, NativeSubjectId>;
209
147
  readonly subjectId: SubjectIdCodec<NativeSubjectId>;
210
148
  readonly constraints: RequiredPasswordRegistrationConstraints;
211
149
  readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;
212
150
  readonly allocateCredentialIdSync?: () => string;
213
151
  readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;
214
152
  readonly allocateRevisionSync?: () => SecurityRevision;
215
- } & ({
153
+ } & {
216
154
  readonly mode: "atomic";
217
155
  readonly provisioning: PasswordRegistrationProvisioning<Registration, Subject, NativeSubjectId> & ({
218
156
  readonly idMode: "allocated";
@@ -224,12 +162,8 @@ export type PasswordRegistrationMapping<Registration, Subject extends TableModel
224
162
  readonly idMode: "generated";
225
163
  readonly decodeGeneratedId: (rows: ReadonlyArray<unknown>) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;
226
164
  });
227
- } | {
228
- readonly mode: "pending";
229
- readonly allocateRecoveryReference?: Effect.Effect<typeof RecoveryReference.Type, PersistenceMappingError>;
230
- readonly allocateRecoveryReferenceSync?: () => typeof RecoveryReference.Type;
231
- });
232
- export type AnyPasswordPersistenceMapping<Expression extends SqlExpression = SqlExpression> = PasswordPersistenceMapping<AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
233
- export type AnyPasswordRegistrationMapping<Registration = unknown, Expression extends SqlExpression = SqlExpression> = PasswordRegistrationMapping<Registration, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
165
+ };
166
+ export type AnyPasswordPersistenceMapping<Expression extends SqlExpression = SqlExpression> = PasswordPersistenceMapping<AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
167
+ export type AnyPasswordRegistrationMapping<Registration = unknown, Expression extends SqlExpression = SqlExpression> = PasswordRegistrationMapping<Registration, AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
234
168
  //#endregion
235
169
  //# sourceMappingURL=password-model.d.mts.map
@@ -4,12 +4,9 @@ const requiredPasswordConstraints = {
4
4
  identifier: "unique(identifier.namespace,identifier.value)",
5
5
  authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)",
6
6
  credentialSubject: "unique(credential.moduleId,credential.subjectId)",
7
- credentialId: "unique(credential.moduleId,credential.credentialId)",
8
- command: "unique(command.moduleId,command.commandId)"
7
+ credentialId: "unique(credential.moduleId,credential.credentialId)"
9
8
  };
10
9
  const requiredPasswordRegistrationConstraints = {
11
- request: "unique(registration.moduleId,registration.requestId)",
12
- recoveryReference: "unique(registration.recoveryReference)",
13
10
  identifier: "unique(identifier.namespace,identifier.value)",
14
11
  credentialSubject: "unique(credential.moduleId,credential.subjectId)",
15
12
  authorityCredential: "unique(authorityCredential.subjectId,authorityCredential.credentialId)"
@@ -1 +1 @@
1
- {"version":3,"file":"password-model.mjs","names":[],"sources":["../../../src/internal/models/password-model.ts"],"sourcesContent":["import { type RecoveryReference, type LoginIdentifier } from \"@yielded/auth/Identity\";\nimport type {\n PasswordAction,\n PasswordCredentialSnapshot,\n PasswordReplacement,\n PasswordRegistrationDecision,\n EncodedPasswordHash,\n} from \"@yielded/auth/Password\";\nimport type { AuthenticationRequirement, SecurityRevision } from \"@yielded/auth/Sessions\";\nimport type { Effect, Redacted } from \"effect\";\n\nimport type { AnyTableModel, TableModel as Table, SqlExpression } from \"../query-operations\";\nimport type { PersistenceMappingError, SubjectIdCodec } from \"./common\";\n\ntype ColumnKey<T extends Table> = T[\"column\"];\n\nexport interface PasswordSubjectTable<Subject extends Table, _NativeSubjectId> {\n readonly table: Subject[\"table\"];\n readonly id: ColumnKey<Subject>;\n readonly status: ColumnKey<Subject>;\n readonly securityRevision: ColumnKey<Subject>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly decodeRequirement: (\n row: Subject[\"select\"],\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n /** Current policy for this exact credential mutation, decoded under the subject lock. */\n readonly decodeActionRequirement: (\n row: Subject[\"select\"],\n action: PasswordAction,\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n readonly nextSecurityRevision?: (\n current: SecurityRevision,\n ) => Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly nextSecurityRevisionSync?: (current: SecurityRevision) => SecurityRevision;\n /** Required only by D1 conditional statements. */\n readonly d1ActiveStatusValue?: unknown;\n}\n\nexport interface PasswordIdentifierTable<\n Identifier extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: Identifier[\"table\"];\n readonly namespace: ColumnKey<Identifier>;\n readonly value: ColumnKey<Identifier>;\n readonly subjectId: ColumnKey<Identifier>;\n readonly verifiedAt: ColumnKey<Identifier>;\n readonly bindingRevision: ColumnKey<Identifier>;\n /** Consumer-owned current login/recovery eligibility, including row status. */\n readonly isCurrent: (row: Identifier[\"select\"]) => boolean;\n /** Required by D1 so current ownership/eligibility is rechecked in the batch. */\n readonly d1CurrentCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n }) => Expression;\n readonly encodeInitialInsert: (\n identifier: LoginIdentifier,\n subjectId: NativeSubjectId,\n bindingRevision: SecurityRevision,\n ) => Identifier[\"insert\"];\n}\n\nexport interface PasswordAuthorityCredentialTable<Credential extends Table, NativeSubjectId> {\n readonly table: Credential[\"table\"];\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly revision: ColumnKey<Credential>;\n readonly status?: ColumnKey<Credential>;\n readonly isActiveStatus?: (value: unknown) => boolean;\n readonly d1ActiveStatusValue?: unknown;\n readonly encodeInsert: (input: {\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => Credential[\"insert\"];\n readonly encodeRevision: (revision: SecurityRevision) => Partial<Credential[\"insert\"]>;\n}\n\nexport interface PasswordCredentialTable<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n NativeSubjectId,\n> {\n readonly table: Credential[\"table\"];\n readonly moduleId: ColumnKey<Credential>;\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly credentialRevision: ColumnKey<Credential>;\n readonly verifierVersion: ColumnKey<Credential>;\n readonly verifier: ColumnKey<Credential>;\n readonly normalization: ColumnKey<Credential>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly credentialRevision: SecurityRevision;\n readonly verifierVersion: SecurityRevision;\n readonly replacement: PasswordReplacement;\n }) => Credential[\"insert\"];\n readonly encodeVerifier: (\n verifier: Redacted.Redacted<EncodedPasswordHash>,\n verifierVersion: SecurityRevision,\n ) => Partial<Credential[\"insert\"]>;\n readonly encodeReplacement: (input: {\n readonly replacement: PasswordReplacement;\n readonly credentialRevision: SecurityRevision;\n readonly verifierVersion: SecurityRevision;\n }) => Partial<Credential[\"insert\"]>;\n readonly decode: (input: {\n readonly moduleId: string;\n readonly subject: Subject[\"select\"];\n readonly identifier: Identifier[\"select\"];\n readonly credential: Credential[\"select\"];\n }) => Effect.Effect<PasswordCredentialSnapshot, PersistenceMappingError>;\n}\n\nexport interface PasswordCommandTable<Command extends Table> {\n readonly table: Command[\"table\"];\n readonly moduleId: ColumnKey<Command>;\n readonly commandId: ColumnKey<Command>;\n readonly action: ColumnKey<Command>;\n readonly bindingDigest: ColumnKey<Command>;\n readonly decision: ColumnKey<Command>;\n readonly retentionUntil: ColumnKey<Command>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly commandId: string;\n readonly action: string;\n readonly bindingDigest: string;\n readonly decision: \"changed\";\n readonly retentionUntilMillis: number;\n }) => Command[\"insert\"];\n}\n\nexport interface RequiredPasswordConstraints {\n readonly identifier: \"unique(identifier.namespace,identifier.value)\";\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n readonly credentialSubject: \"unique(credential.moduleId,credential.subjectId)\";\n readonly credentialId: \"unique(credential.moduleId,credential.credentialId)\";\n readonly command: \"unique(command.moduleId,command.commandId)\";\n}\n\nexport const requiredPasswordConstraints: RequiredPasswordConstraints = {\n identifier: \"unique(identifier.namespace,identifier.value)\",\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n credentialSubject: \"unique(credential.moduleId,credential.subjectId)\",\n credentialId: \"unique(credential.moduleId,credential.credentialId)\",\n command: \"unique(command.moduleId,command.commandId)\",\n};\n\nexport interface PasswordConstraintClassifier {\n /** Match only the mapped command uniqueness constraint. */\n readonly isCommandConflict: (cause: unknown) => boolean;\n}\n\nexport interface PasswordD1Clock<Expression extends SqlExpression = SqlExpression> {\n readonly engineNow: Expression;\n readonly engineNowMillis: Expression;\n readonly engineInstantMinus: (millis: number) => Expression;\n readonly engineInstantPlus: (millis: number) => Expression;\n}\n\nexport interface PasswordPersistenceMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n Command extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> extends PasswordConstraintClassifier {\n readonly subject: PasswordSubjectTable<Subject, NativeSubjectId>;\n readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: PasswordCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;\n /** Every factor revision named by action evidence, including non-password factors. */\n readonly authorityCredential: PasswordAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n >;\n readonly command: PasswordCommandTable<Command>;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredPasswordConstraints;\n readonly encodeInstant: (epochMillis: number) => unknown;\n readonly decodeInstant: (native: unknown) => Effect.Effect<number, PersistenceMappingError>;\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n readonly commandRetentionMillis: number;\n /** All semantic replacements still bump subject revision. This flag only declares bearer invalidation latency. */\n readonly sessionInvalidation: \"same-authority-immediate\" | \"original-absolute-expiry\";\n readonly d1?: PasswordD1Clock<Expression>;\n}\n\nexport type D1PasswordPersistenceMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n Command extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> = PasswordPersistenceMapping<\n Subject,\n Identifier,\n Credential,\n AuthorityCredential,\n Command,\n NativeSubjectId,\n Expression\n> & {\n readonly d1: PasswordD1Clock<Expression>;\n readonly subject: PasswordSubjectTable<Subject, NativeSubjectId> & {\n readonly d1ActiveStatusValue: unknown;\n };\n readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression> & {\n readonly d1CurrentCondition: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n }) => Expression;\n };\n readonly authorityCredential: PasswordAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n > & {\n readonly d1ActiveStatusValue: unknown;\n };\n};\n\nexport type PasswordRegistrationState = \"pending\" | \"created\";\n\nexport interface PasswordRegistrationIntent<Registration> {\n readonly moduleId: string;\n readonly requestId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly replacement: PasswordReplacement;\n}\n\nexport interface PasswordRegistrationTable<Registration, Request extends Table, NativeSubjectId> {\n readonly table: Request[\"table\"];\n readonly moduleId: ColumnKey<Request>;\n readonly requestId: ColumnKey<Request>;\n readonly state: ColumnKey<Request>;\n readonly subjectId: ColumnKey<Request>;\n readonly recoveryReference: ColumnKey<Request>;\n readonly encodeInsert: (\n input: PasswordRegistrationIntent<Registration>,\n state: {\n readonly state: PasswordRegistrationState;\n readonly nativeSubjectId?: NativeSubjectId;\n readonly recoveryReference?: typeof RecoveryReference.Type;\n },\n ) => Request[\"insert\"];\n /** Replay projection must never expose a stored subject or decode protected intent. */\n readonly decodeReplay: (row: Request[\"select\"]) => Effect.Effect<\n Exclude<\n PasswordRegistrationDecision,\n {\n readonly _tag: \"Created\";\n }\n >,\n PersistenceMappingError\n >;\n}\n\nexport interface PasswordRegistrationProvisioning<\n Registration,\n Subject extends Table,\n NativeSubjectId,\n> {\n readonly encodeSubjectInsert: (\n input: PasswordRegistrationIntent<Registration>,\n values: {\n readonly nativeSubjectId: NativeSubjectId | undefined;\n readonly securityRevision: SecurityRevision;\n },\n ) => Subject[\"insert\"];\n readonly allocateSubjectId?: Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n readonly allocateSubjectIdSync?: () => NativeSubjectId;\n /** Interactive targets use this for database-generated/autoincrement keys. */\n readonly decodeGeneratedId?: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n}\n\nexport interface RequiredPasswordRegistrationConstraints {\n readonly request: \"unique(registration.moduleId,registration.requestId)\";\n readonly recoveryReference: \"unique(registration.recoveryReference)\";\n readonly identifier: \"unique(identifier.namespace,identifier.value)\";\n readonly credentialSubject: \"unique(credential.moduleId,credential.subjectId)\";\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n}\n\nexport const requiredPasswordRegistrationConstraints: RequiredPasswordRegistrationConstraints = {\n request: \"unique(registration.moduleId,registration.requestId)\",\n recoveryReference: \"unique(registration.recoveryReference)\",\n identifier: \"unique(identifier.namespace,identifier.value)\",\n credentialSubject: \"unique(credential.moduleId,credential.subjectId)\",\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n};\n\nexport interface PasswordRegistrationConstraintClassifier {\n readonly isRequestConflict: (cause: unknown) => boolean;\n readonly isIdentifierConflict: (cause: unknown) => boolean;\n readonly isCredentialConflict: (cause: unknown) => boolean;\n}\n\nexport type PasswordRegistrationMapping<\n Registration,\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n Request extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> = PasswordRegistrationConstraintClassifier & {\n readonly subject: PasswordSubjectTable<Subject, NativeSubjectId>;\n readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: PasswordCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;\n readonly authorityCredential: PasswordAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n >;\n readonly registration: PasswordRegistrationTable<Registration, Request, NativeSubjectId>;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredPasswordRegistrationConstraints;\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n} & (\n | {\n readonly mode: \"atomic\";\n readonly provisioning: PasswordRegistrationProvisioning<\n Registration,\n Subject,\n NativeSubjectId\n > &\n (\n | {\n readonly idMode: \"allocated\";\n readonly allocateSubjectId: Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n }\n | {\n readonly idMode: \"synchronous\";\n readonly allocateSubjectIdSync: () => NativeSubjectId;\n }\n | {\n readonly idMode: \"generated\";\n readonly decodeGeneratedId: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n }\n );\n }\n | {\n readonly mode: \"pending\";\n readonly allocateRecoveryReference?: Effect.Effect<\n typeof RecoveryReference.Type,\n PersistenceMappingError\n >;\n readonly allocateRecoveryReferenceSync?: () => typeof RecoveryReference.Type;\n }\n );\n\nexport type AnyPasswordPersistenceMapping<Expression extends SqlExpression = SqlExpression> =\n PasswordPersistenceMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n >;\n\nexport type AnyPasswordRegistrationMapping<\n Registration = unknown,\n Expression extends SqlExpression = SqlExpression,\n> = PasswordRegistrationMapping<\n Registration,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n>;\n"],"mappings":";;AAgJA,MAAa,8BAA2D;CACtE,YAAY;CACZ,qBAAqB;CACrB,mBAAmB;CACnB,cAAc;CACd,SAAS;AACX;AAkJA,MAAa,0CAAmF;CAC9F,SAAS;CACT,mBAAmB;CACnB,YAAY;CACZ,mBAAmB;CACnB,qBAAqB;AACvB"}
1
+ {"version":3,"file":"password-model.mjs","names":[],"sources":["../../../src/internal/models/password-model.ts"],"sourcesContent":["import { type LoginIdentifier } from \"@yielded/auth/Identity\";\nimport type {\n PasswordAction,\n PasswordCredentialSnapshot,\n PasswordReplacement,\n EncodedPasswordHash,\n} from \"@yielded/auth/Password\";\nimport type { AuthenticationRequirement, SecurityRevision } from \"@yielded/auth/Sessions\";\nimport type { Effect, Redacted } from \"effect\";\n\nimport type { AnyTableModel, TableModel as Table, SqlExpression } from \"../table-model\";\nimport type { PersistenceMappingError, SubjectIdCodec } from \"./common\";\nimport type { ProofClock } from \"./proof-model\";\n\ntype ColumnKey<T extends Table> = T[\"column\"];\n\nexport interface PasswordSubjectTable<Subject extends Table, _NativeSubjectId> {\n readonly table: Subject[\"table\"];\n readonly id: ColumnKey<Subject>;\n readonly status: ColumnKey<Subject>;\n readonly securityRevision: ColumnKey<Subject>;\n readonly isActiveStatus: (value: unknown) => boolean;\n readonly decodeRequirement: (\n row: Subject[\"select\"],\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n /** Current policy for this exact credential mutation, decoded under the subject lock. */\n readonly decodeActionRequirement: (\n row: Subject[\"select\"],\n action: PasswordAction,\n ) => Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n readonly nextSecurityRevision?: (\n current: SecurityRevision,\n ) => Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly nextSecurityRevisionSync?: (current: SecurityRevision) => SecurityRevision;\n /** Required only by D1 conditional statements. */\n readonly d1ActiveStatusValue?: unknown;\n}\n\nexport interface PasswordIdentifierTable<\n Identifier extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly table: Identifier[\"table\"];\n readonly namespace: ColumnKey<Identifier>;\n readonly value: ColumnKey<Identifier>;\n readonly subjectId: ColumnKey<Identifier>;\n readonly verifiedAt: ColumnKey<Identifier>;\n readonly bindingRevision: ColumnKey<Identifier>;\n /** Consumer-owned current login/recovery eligibility, including row status. */\n readonly isCurrent: (row: Identifier[\"select\"]) => boolean;\n /** Required by D1 so current ownership/eligibility is rechecked in the batch. */\n readonly d1CurrentCondition?: (input: {\n readonly identifier: LoginIdentifier;\n readonly nativeSubjectId: NativeSubjectId;\n }) => Expression;\n readonly encodeInitialInsert: (\n identifier: LoginIdentifier,\n subjectId: NativeSubjectId,\n bindingRevision: SecurityRevision,\n ) => Identifier[\"insert\"];\n}\n\nexport interface PasswordAuthorityCredentialTable<Credential extends Table, NativeSubjectId> {\n readonly table: Credential[\"table\"];\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly revision: ColumnKey<Credential>;\n readonly status?: ColumnKey<Credential>;\n readonly isActiveStatus?: (value: unknown) => boolean;\n readonly d1ActiveStatusValue?: unknown;\n readonly encodeInsert: (input: {\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly revision: SecurityRevision;\n }) => Credential[\"insert\"];\n readonly encodeRevision: (revision: SecurityRevision) => Partial<Credential[\"insert\"]>;\n}\n\nexport interface PasswordCredentialTable<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n NativeSubjectId,\n> {\n readonly table: Credential[\"table\"];\n readonly moduleId: ColumnKey<Credential>;\n readonly subjectId: ColumnKey<Credential>;\n readonly credentialId: ColumnKey<Credential>;\n readonly credentialRevision: ColumnKey<Credential>;\n readonly verifierVersion: ColumnKey<Credential>;\n readonly verifier: ColumnKey<Credential>;\n readonly normalization: ColumnKey<Credential>;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly subjectId: NativeSubjectId;\n readonly credentialId: string;\n readonly credentialRevision: SecurityRevision;\n readonly verifierVersion: SecurityRevision;\n readonly replacement: PasswordReplacement;\n }) => Credential[\"insert\"];\n readonly encodeVerifier: (\n verifier: Redacted.Redacted<EncodedPasswordHash>,\n verifierVersion: SecurityRevision,\n ) => Partial<Credential[\"insert\"]>;\n readonly encodeReplacement: (input: {\n readonly replacement: PasswordReplacement;\n readonly credentialRevision: SecurityRevision;\n readonly verifierVersion: SecurityRevision;\n }) => Partial<Credential[\"insert\"]>;\n readonly decode: (input: {\n readonly moduleId: string;\n readonly subject: Subject[\"select\"];\n readonly identifier: Identifier[\"select\"];\n readonly credential: Credential[\"select\"];\n }) => Effect.Effect<PasswordCredentialSnapshot, PersistenceMappingError>;\n}\n\nexport interface RequiredPasswordConstraints {\n readonly identifier: \"unique(identifier.namespace,identifier.value)\";\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n readonly credentialSubject: \"unique(credential.moduleId,credential.subjectId)\";\n readonly credentialId: \"unique(credential.moduleId,credential.credentialId)\";\n}\n\nexport const requiredPasswordConstraints: RequiredPasswordConstraints = {\n identifier: \"unique(identifier.namespace,identifier.value)\",\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n credentialSubject: \"unique(credential.moduleId,credential.subjectId)\",\n credentialId: \"unique(credential.moduleId,credential.credentialId)\",\n};\n\nexport interface PasswordPersistenceMapping<\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly subject: PasswordSubjectTable<Subject, NativeSubjectId>;\n readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: PasswordCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;\n /** Every factor revision named by action evidence, including non-password factors. */\n readonly authorityCredential: PasswordAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n >;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredPasswordConstraints;\n readonly encodeInstant: (epochMillis: number) => unknown;\n readonly decodeInstant: (native: unknown) => Effect.Effect<number, PersistenceMappingError>;\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n /** All semantic replacements still bump subject revision. This flag declares\n * authoritative verification's invalidation latency; cookie exposure is separate. */\n readonly sessionInvalidation: \"same-authority-immediate\" | \"original-absolute-expiry\";\n readonly clock: ProofClock<Expression>;\n readonly d1?: { readonly primary: true };\n}\n\nexport interface PasswordRegistrationIntent<Registration> {\n readonly moduleId: string;\n readonly requestId: string;\n readonly identifier: LoginIdentifier;\n readonly registration: Registration;\n readonly replacement: PasswordReplacement;\n}\n\nexport interface PasswordRegistrationProvisioning<\n Registration,\n Subject extends Table,\n NativeSubjectId,\n> {\n readonly encodeSubjectInsert: (\n input: PasswordRegistrationIntent<Registration>,\n values: {\n readonly nativeSubjectId: NativeSubjectId | undefined;\n readonly securityRevision: SecurityRevision;\n },\n ) => Subject[\"insert\"];\n readonly allocateSubjectId?: Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n readonly allocateSubjectIdSync?: () => NativeSubjectId;\n /** Interactive targets use this for database-generated/autoincrement keys. */\n readonly decodeGeneratedId?: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n}\n\nexport interface RequiredPasswordRegistrationConstraints {\n readonly identifier: \"unique(identifier.namespace,identifier.value)\";\n readonly credentialSubject: \"unique(credential.moduleId,credential.subjectId)\";\n readonly authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\";\n}\n\nexport const requiredPasswordRegistrationConstraints: RequiredPasswordRegistrationConstraints = {\n identifier: \"unique(identifier.namespace,identifier.value)\",\n credentialSubject: \"unique(credential.moduleId,credential.subjectId)\",\n authorityCredential: \"unique(authorityCredential.subjectId,authorityCredential.credentialId)\",\n};\n\nexport interface PasswordRegistrationConstraintClassifier {\n readonly isIdentifierConflict: (cause: unknown) => boolean;\n readonly isCredentialConflict: (cause: unknown) => boolean;\n}\n\nexport type PasswordRegistrationMapping<\n Registration,\n Subject extends Table,\n Identifier extends Table,\n Credential extends Table,\n AuthorityCredential extends Table,\n NativeSubjectId,\n Expression extends SqlExpression = SqlExpression,\n> = PasswordRegistrationConstraintClassifier & {\n readonly subject: PasswordSubjectTable<Subject, NativeSubjectId>;\n readonly identifier: PasswordIdentifierTable<Identifier, NativeSubjectId, Expression>;\n readonly credential: PasswordCredentialTable<Subject, Identifier, Credential, NativeSubjectId>;\n readonly authorityCredential: PasswordAuthorityCredentialTable<\n AuthorityCredential,\n NativeSubjectId\n >;\n readonly subjectId: SubjectIdCodec<NativeSubjectId>;\n readonly constraints: RequiredPasswordRegistrationConstraints;\n readonly allocateCredentialId?: Effect.Effect<string, PersistenceMappingError>;\n readonly allocateCredentialIdSync?: () => string;\n readonly allocateRevision?: Effect.Effect<SecurityRevision, PersistenceMappingError>;\n readonly allocateRevisionSync?: () => SecurityRevision;\n} & {\n readonly mode: \"atomic\";\n readonly provisioning: PasswordRegistrationProvisioning<Registration, Subject, NativeSubjectId> &\n (\n | {\n readonly idMode: \"allocated\";\n readonly allocateSubjectId: Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n }\n | {\n readonly idMode: \"synchronous\";\n readonly allocateSubjectIdSync: () => NativeSubjectId;\n }\n | {\n readonly idMode: \"generated\";\n readonly decodeGeneratedId: (\n rows: ReadonlyArray<unknown>,\n ) => Effect.Effect<NativeSubjectId, PersistenceMappingError>;\n }\n );\n};\n\nexport type AnyPasswordPersistenceMapping<Expression extends SqlExpression = SqlExpression> =\n PasswordPersistenceMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n >;\n\nexport type AnyPasswordRegistrationMapping<\n Registration = unknown,\n Expression extends SqlExpression = SqlExpression,\n> = PasswordRegistrationMapping<\n Registration,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n>;\n"],"mappings":";;AA6HA,MAAa,8BAA2D;CACtE,YAAY;CACZ,qBAAqB;CACrB,mBAAmB;CACnB,cAAc;AAChB;AAmEA,MAAa,0CAAmF;CAC9F,YAAY;CACZ,mBAAmB;CACnB,qBAAqB;AACvB"}
@@ -0,0 +1,86 @@
1
+ import { AnyTableModel, SqlExpression, TableModel } from "../table-model.mjs";
2
+ import { PersistenceMappingError } from "../mapping-error.mjs";
3
+ import "./common.mjs";
4
+ import { ProofPersistenceMapping } from "./proof-model.mjs";
5
+ import { Effect } from "effect";
6
+ import { PhoneLifecyclePolicy, PhoneNumber } from "@yielded/auth/PhoneOtp";
7
+ import { AuthenticationRequirement } from "@yielded/auth/Sessions";
8
+ import { SubjectId } from "@yielded/auth/Schema";
9
+ //#region src/internal/models/phone-model.d.ts
10
+ type PhoneColumn<T extends TableModel> = T["column"];
11
+ export declare const requiredPhoneConstraints: {
12
+ readonly subject: "unique(id)";
13
+ readonly identifier: "unique(namespace,value)";
14
+ readonly credential: "unique(credentialId)";
15
+ };
16
+ /** Consumer-owned schema; encoders and allocators are synchronous and side-effect free.
17
+ * Identifiers store permanent number custody. Never delete retired rows to make a recycled number eligible. A consumer's
18
+ * explicit recovery workflow may resolve custody only after independent authentication.
19
+ * Subject defaults own account provisioning; no email/profile schema is prescribed. */
20
+ export interface PhoneMapping<S extends TableModel, I extends TableModel, C extends TableModel, P extends TableModel, N, Expression extends SqlExpression = SqlExpression> {
21
+ readonly moduleId: string;
22
+ readonly policy: PhoneLifecyclePolicy;
23
+ readonly constraints: typeof requiredPhoneConstraints;
24
+ readonly proofs: ProofPersistenceMapping<P, S, N, Expression>;
25
+ readonly subjectIds: {
26
+ readonly toNative: (id: SubjectId) => N | Effect.Effect<N, PersistenceMappingError>;
27
+ readonly toSubject: (id: N) => SubjectId | Effect.Effect<SubjectId, PersistenceMappingError>;
28
+ readonly allocate?: () => N | Effect.Effect<N, PersistenceMappingError>;
29
+ };
30
+ readonly subject: {
31
+ readonly table: S["table"];
32
+ readonly id: PhoneColumn<S>;
33
+ readonly securityRevision: PhoneColumn<S>;
34
+ readonly activeCondition: Expression;
35
+ readonly decodeRequirement: (row: S["select"]) => AuthenticationRequirement | Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;
36
+ /** Current action policy, independently from primary sign-in assurance. */
37
+ readonly decodeActionRequirement?: (row: S["select"], action: "verify" | "change") => AuthenticationRequirement | Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;
38
+ readonly encodeInsert?: (input: {
39
+ readonly id: N;
40
+ readonly securityRevision: string;
41
+ readonly phoneNumber: PhoneNumber;
42
+ }) => S["insert"];
43
+ };
44
+ readonly identifier: {
45
+ readonly table: I["table"];
46
+ readonly moduleId: PhoneColumn<I>;
47
+ readonly credentialId: PhoneColumn<I>;
48
+ readonly namespace: PhoneColumn<I>;
49
+ readonly value: PhoneColumn<I>;
50
+ readonly subjectId: PhoneColumn<I>;
51
+ readonly revision: PhoneColumn<I>;
52
+ readonly verifiedAt: PhoneColumn<I>;
53
+ readonly status: PhoneColumn<I>;
54
+ readonly activeCondition: Expression;
55
+ readonly encodeStatus: (active: boolean) => unknown;
56
+ readonly encodeInsert: (input: {
57
+ readonly moduleId: string;
58
+ readonly credentialId: string;
59
+ readonly phoneNumber: PhoneNumber;
60
+ readonly subjectId: N;
61
+ readonly revision: string;
62
+ readonly verifiedAtMillis: number;
63
+ readonly active: boolean;
64
+ }) => I["insert"];
65
+ };
66
+ readonly credential: {
67
+ readonly table: C["table"];
68
+ readonly id: PhoneColumn<C>;
69
+ readonly subjectId: PhoneColumn<C>;
70
+ readonly revision: PhoneColumn<C>;
71
+ readonly status: PhoneColumn<C>;
72
+ readonly activeCondition: Expression;
73
+ readonly encodeStatus: (active: boolean) => unknown;
74
+ readonly encodeInsert: (input: {
75
+ readonly credentialId: string;
76
+ readonly subjectId: N;
77
+ readonly revision: string;
78
+ readonly active: boolean;
79
+ }) => C["insert"];
80
+ };
81
+ readonly encodeInstant: (millis: number) => unknown;
82
+ readonly engineNowMillis: Expression;
83
+ }
84
+ export type AnyPhoneMapping<Expression extends SqlExpression = SqlExpression> = PhoneMapping<AnyTableModel, AnyTableModel, AnyTableModel, AnyTableModel, unknown, Expression>;
85
+ //#endregion
86
+ //# sourceMappingURL=phone-model.d.mts.map
@@ -0,0 +1,10 @@
1
+ //#region src/internal/models/phone-model.ts
2
+ const requiredPhoneConstraints = {
3
+ subject: "unique(id)",
4
+ identifier: "unique(namespace,value)",
5
+ credential: "unique(credentialId)"
6
+ };
7
+ //#endregion
8
+ export { requiredPhoneConstraints };
9
+
10
+ //# sourceMappingURL=phone-model.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone-model.mjs","names":[],"sources":["../../../src/internal/models/phone-model.ts"],"sourcesContent":["import type { PhoneLifecyclePolicy, PhoneNumber } from \"@yielded/auth/PhoneOtp\";\nimport type { SubjectId } from \"@yielded/auth/Schema\";\nimport type { AuthenticationRequirement } from \"@yielded/auth/Sessions\";\nimport type { Effect } from \"effect\";\n\nimport type { AnyTableModel, TableModel as Table, SqlExpression } from \"../table-model\";\nimport type { PersistenceMappingError } from \"./common\";\nimport type { ProofPersistenceMapping } from \"./proof-model\";\n\ntype PhoneColumn<T extends Table> = T[\"column\"];\n\nexport const requiredPhoneConstraints = {\n subject: \"unique(id)\",\n identifier: \"unique(namespace,value)\",\n credential: \"unique(credentialId)\",\n} as const;\n\n/** Consumer-owned schema; encoders and allocators are synchronous and side-effect free.\n * Identifiers store permanent number custody. Never delete retired rows to make a recycled number eligible. A consumer's\n * explicit recovery workflow may resolve custody only after independent authentication.\n * Subject defaults own account provisioning; no email/profile schema is prescribed. */\nexport interface PhoneMapping<\n S extends Table,\n I extends Table,\n C extends Table,\n P extends Table,\n N,\n Expression extends SqlExpression = SqlExpression,\n> {\n readonly moduleId: string;\n readonly policy: PhoneLifecyclePolicy;\n readonly constraints: typeof requiredPhoneConstraints;\n readonly proofs: ProofPersistenceMapping<P, S, N, Expression>;\n readonly subjectIds: {\n readonly toNative: (id: SubjectId) => N | Effect.Effect<N, PersistenceMappingError>;\n readonly toSubject: (id: N) => SubjectId | Effect.Effect<SubjectId, PersistenceMappingError>;\n readonly allocate?: () => N | Effect.Effect<N, PersistenceMappingError>;\n };\n readonly subject: {\n readonly table: S[\"table\"];\n readonly id: PhoneColumn<S>;\n readonly securityRevision: PhoneColumn<S>;\n readonly activeCondition: Expression;\n readonly decodeRequirement: (\n row: S[\"select\"],\n ) =>\n | AuthenticationRequirement\n | Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n /** Current action policy, independently from primary sign-in assurance. */\n readonly decodeActionRequirement?: (\n row: S[\"select\"],\n action: \"verify\" | \"change\",\n ) =>\n | AuthenticationRequirement\n | Effect.Effect<AuthenticationRequirement, PersistenceMappingError>;\n readonly encodeInsert?: (input: {\n readonly id: N;\n readonly securityRevision: string;\n readonly phoneNumber: PhoneNumber;\n }) => S[\"insert\"];\n };\n readonly identifier: {\n readonly table: I[\"table\"];\n readonly moduleId: PhoneColumn<I>;\n readonly credentialId: PhoneColumn<I>;\n readonly namespace: PhoneColumn<I>;\n readonly value: PhoneColumn<I>;\n readonly subjectId: PhoneColumn<I>;\n readonly revision: PhoneColumn<I>;\n readonly verifiedAt: PhoneColumn<I>;\n readonly status: PhoneColumn<I>;\n readonly activeCondition: Expression;\n readonly encodeStatus: (active: boolean) => unknown;\n readonly encodeInsert: (input: {\n readonly moduleId: string;\n readonly credentialId: string;\n readonly phoneNumber: PhoneNumber;\n readonly subjectId: N;\n readonly revision: string;\n readonly verifiedAtMillis: number;\n readonly active: boolean;\n }) => I[\"insert\"];\n };\n readonly credential: {\n readonly table: C[\"table\"];\n readonly id: PhoneColumn<C>;\n readonly subjectId: PhoneColumn<C>;\n readonly revision: PhoneColumn<C>;\n readonly status: PhoneColumn<C>;\n readonly activeCondition: Expression;\n readonly encodeStatus: (active: boolean) => unknown;\n readonly encodeInsert: (input: {\n readonly credentialId: string;\n readonly subjectId: N;\n readonly revision: string;\n readonly active: boolean;\n }) => C[\"insert\"];\n };\n readonly encodeInstant: (millis: number) => unknown;\n readonly engineNowMillis: Expression;\n}\n\nexport type AnyPhoneMapping<Expression extends SqlExpression = SqlExpression> = PhoneMapping<\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n AnyTableModel,\n unknown,\n Expression\n>;\n"],"mappings":";AAWA,MAAa,2BAA2B;CACtC,SAAS;CACT,YAAY;CACZ,YAAY;AACd"}