@fuzdev/fuz_app 0.54.0 → 0.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/dist/actions/CLAUDE.md +214 -103
  2. package/dist/actions/action_bridge.d.ts +8 -5
  3. package/dist/actions/action_bridge.d.ts.map +1 -1
  4. package/dist/actions/action_bridge.js +1 -11
  5. package/dist/actions/action_codegen.d.ts +32 -0
  6. package/dist/actions/action_codegen.d.ts.map +1 -1
  7. package/dist/actions/action_codegen.js +35 -15
  8. package/dist/actions/action_registry.d.ts.map +1 -1
  9. package/dist/actions/action_registry.js +5 -2
  10. package/dist/actions/action_rpc.d.ts +141 -22
  11. package/dist/actions/action_rpc.d.ts.map +1 -1
  12. package/dist/actions/action_rpc.js +106 -187
  13. package/dist/actions/action_spec.d.ts +55 -16
  14. package/dist/actions/action_spec.d.ts.map +1 -1
  15. package/dist/actions/action_spec.js +16 -11
  16. package/dist/actions/action_types.d.ts +28 -60
  17. package/dist/actions/action_types.d.ts.map +1 -1
  18. package/dist/actions/action_types.js +13 -5
  19. package/dist/actions/broadcast_api.d.ts +2 -2
  20. package/dist/actions/broadcast_api.js +2 -2
  21. package/dist/actions/compile_action_registry.d.ts +50 -0
  22. package/dist/actions/compile_action_registry.d.ts.map +1 -0
  23. package/dist/actions/compile_action_registry.js +69 -0
  24. package/dist/actions/heartbeat.d.ts +8 -4
  25. package/dist/actions/heartbeat.d.ts.map +1 -1
  26. package/dist/actions/heartbeat.js +5 -4
  27. package/dist/actions/perform_action.d.ts +145 -0
  28. package/dist/actions/perform_action.d.ts.map +1 -0
  29. package/dist/actions/perform_action.js +258 -0
  30. package/dist/actions/register_action_ws.d.ts +46 -40
  31. package/dist/actions/register_action_ws.d.ts.map +1 -1
  32. package/dist/actions/register_action_ws.js +101 -159
  33. package/dist/actions/register_ws_endpoint.d.ts +15 -10
  34. package/dist/actions/register_ws_endpoint.d.ts.map +1 -1
  35. package/dist/actions/register_ws_endpoint.js +54 -7
  36. package/dist/actions/transports.d.ts.map +1 -1
  37. package/dist/actions/transports.js +0 -4
  38. package/dist/actions/transports_ws_auth_guard.d.ts +1 -1
  39. package/dist/actions/transports_ws_auth_guard.js +1 -1
  40. package/dist/actions/transports_ws_backend.d.ts +1 -1
  41. package/dist/actions/transports_ws_backend.js +1 -1
  42. package/dist/auth/CLAUDE.md +794 -410
  43. package/dist/auth/account_action_specs.d.ts +28 -7
  44. package/dist/auth/account_action_specs.d.ts.map +1 -1
  45. package/dist/auth/account_action_specs.js +7 -7
  46. package/dist/auth/account_actions.d.ts +7 -13
  47. package/dist/auth/account_actions.d.ts.map +1 -1
  48. package/dist/auth/account_actions.js +26 -35
  49. package/dist/auth/account_queries.d.ts +52 -16
  50. package/dist/auth/account_queries.d.ts.map +1 -1
  51. package/dist/auth/account_queries.js +87 -38
  52. package/dist/auth/account_routes.d.ts +9 -11
  53. package/dist/auth/account_routes.d.ts.map +1 -1
  54. package/dist/auth/account_routes.js +118 -46
  55. package/dist/auth/account_schema.d.ts +46 -35
  56. package/dist/auth/account_schema.d.ts.map +1 -1
  57. package/dist/auth/account_schema.js +21 -28
  58. package/dist/auth/admin_action_specs.d.ts +100 -32
  59. package/dist/auth/admin_action_specs.d.ts.map +1 -1
  60. package/dist/auth/admin_action_specs.js +64 -33
  61. package/dist/auth/admin_actions.d.ts +13 -19
  62. package/dist/auth/admin_actions.d.ts.map +1 -1
  63. package/dist/auth/admin_actions.js +37 -41
  64. package/dist/auth/audit_emitter.d.ts +160 -0
  65. package/dist/auth/audit_emitter.d.ts.map +1 -0
  66. package/dist/auth/audit_emitter.js +83 -0
  67. package/dist/auth/audit_log_queries.d.ts +17 -48
  68. package/dist/auth/audit_log_queries.d.ts.map +1 -1
  69. package/dist/auth/audit_log_queries.js +20 -56
  70. package/dist/auth/audit_log_routes.d.ts +1 -1
  71. package/dist/auth/audit_log_routes.d.ts.map +1 -1
  72. package/dist/auth/audit_log_routes.js +7 -3
  73. package/dist/auth/audit_log_schema.d.ts +92 -32
  74. package/dist/auth/audit_log_schema.d.ts.map +1 -1
  75. package/dist/auth/audit_log_schema.js +75 -46
  76. package/dist/auth/auth_guard_resolver.d.ts +44 -0
  77. package/dist/auth/auth_guard_resolver.d.ts.map +1 -0
  78. package/dist/auth/auth_guard_resolver.js +56 -0
  79. package/dist/auth/bearer_auth.d.ts +9 -7
  80. package/dist/auth/bearer_auth.d.ts.map +1 -1
  81. package/dist/auth/bearer_auth.js +13 -21
  82. package/dist/auth/bootstrap_account.d.ts +7 -7
  83. package/dist/auth/bootstrap_account.d.ts.map +1 -1
  84. package/dist/auth/bootstrap_account.js +7 -7
  85. package/dist/auth/bootstrap_routes.d.ts.map +1 -1
  86. package/dist/auth/bootstrap_routes.js +11 -10
  87. package/dist/auth/cleanup.d.ts +20 -26
  88. package/dist/auth/cleanup.d.ts.map +1 -1
  89. package/dist/auth/cleanup.js +33 -42
  90. package/dist/auth/credential_type_schema.d.ts +115 -0
  91. package/dist/auth/credential_type_schema.d.ts.map +1 -0
  92. package/dist/auth/credential_type_schema.js +127 -0
  93. package/dist/auth/daemon_token_middleware.d.ts +23 -11
  94. package/dist/auth/daemon_token_middleware.d.ts.map +1 -1
  95. package/dist/auth/daemon_token_middleware.js +28 -22
  96. package/dist/auth/ddl.d.ts +2 -2
  97. package/dist/auth/ddl.d.ts.map +1 -1
  98. package/dist/auth/ddl.js +6 -6
  99. package/dist/auth/deps.d.ts +7 -18
  100. package/dist/auth/deps.d.ts.map +1 -1
  101. package/dist/auth/grant_path_schema.d.ts +117 -0
  102. package/dist/auth/grant_path_schema.d.ts.map +1 -0
  103. package/dist/auth/grant_path_schema.js +137 -0
  104. package/dist/auth/invite_queries.d.ts +12 -1
  105. package/dist/auth/invite_queries.d.ts.map +1 -1
  106. package/dist/auth/invite_queries.js +12 -1
  107. package/dist/auth/invite_schema.d.ts +1 -1
  108. package/dist/auth/invite_schema.d.ts.map +1 -1
  109. package/dist/auth/invite_schema.js +1 -1
  110. package/dist/auth/middleware.d.ts.map +1 -1
  111. package/dist/auth/middleware.js +9 -4
  112. package/dist/auth/migrations.d.ts +37 -14
  113. package/dist/auth/migrations.d.ts.map +1 -1
  114. package/dist/auth/migrations.js +79 -32
  115. package/dist/auth/request_context.d.ts +331 -61
  116. package/dist/auth/request_context.d.ts.map +1 -1
  117. package/dist/auth/request_context.js +378 -95
  118. package/dist/auth/{permit_offer_action_specs.d.ts → role_grant_offer_action_specs.d.ts} +163 -94
  119. package/dist/auth/role_grant_offer_action_specs.d.ts.map +1 -0
  120. package/dist/auth/role_grant_offer_action_specs.js +262 -0
  121. package/dist/auth/role_grant_offer_actions.d.ts +104 -0
  122. package/dist/auth/role_grant_offer_actions.d.ts.map +1 -0
  123. package/dist/auth/role_grant_offer_actions.js +473 -0
  124. package/dist/auth/{permit_offer_notifications.d.ts → role_grant_offer_notifications.d.ts} +90 -70
  125. package/dist/auth/role_grant_offer_notifications.d.ts.map +1 -0
  126. package/dist/auth/role_grant_offer_notifications.js +182 -0
  127. package/dist/auth/role_grant_offer_queries.d.ts +242 -0
  128. package/dist/auth/role_grant_offer_queries.d.ts.map +1 -0
  129. package/dist/auth/role_grant_offer_queries.js +533 -0
  130. package/dist/auth/role_grant_offer_schema.d.ts +150 -0
  131. package/dist/auth/role_grant_offer_schema.d.ts.map +1 -0
  132. package/dist/auth/{permit_offer_schema.js → role_grant_offer_schema.js} +60 -36
  133. package/dist/auth/role_grant_queries.d.ts +231 -0
  134. package/dist/auth/role_grant_queries.d.ts.map +1 -0
  135. package/dist/auth/role_grant_queries.js +320 -0
  136. package/dist/auth/role_schema.d.ts +150 -40
  137. package/dist/auth/role_schema.d.ts.map +1 -1
  138. package/dist/auth/role_schema.js +144 -45
  139. package/dist/auth/scope_kind_schema.d.ts +96 -0
  140. package/dist/auth/scope_kind_schema.d.ts.map +1 -0
  141. package/dist/auth/scope_kind_schema.js +94 -0
  142. package/dist/auth/self_service_role_action_specs.d.ts +6 -1
  143. package/dist/auth/self_service_role_action_specs.d.ts.map +1 -1
  144. package/dist/auth/self_service_role_action_specs.js +3 -1
  145. package/dist/auth/self_service_role_actions.d.ts +34 -27
  146. package/dist/auth/self_service_role_actions.d.ts.map +1 -1
  147. package/dist/auth/self_service_role_actions.js +68 -48
  148. package/dist/auth/session_cookie.d.ts +43 -6
  149. package/dist/auth/session_cookie.d.ts.map +1 -1
  150. package/dist/auth/session_cookie.js +31 -5
  151. package/dist/auth/session_middleware.d.ts +37 -3
  152. package/dist/auth/session_middleware.d.ts.map +1 -1
  153. package/dist/auth/session_middleware.js +33 -7
  154. package/dist/auth/signup_routes.d.ts.map +1 -1
  155. package/dist/auth/signup_routes.js +48 -19
  156. package/dist/auth/standard_action_specs.d.ts +2 -2
  157. package/dist/auth/standard_action_specs.js +4 -4
  158. package/dist/auth/standard_rpc_actions.d.ts +23 -19
  159. package/dist/auth/standard_rpc_actions.d.ts.map +1 -1
  160. package/dist/auth/standard_rpc_actions.js +12 -12
  161. package/dist/db/migrate.d.ts +12 -8
  162. package/dist/db/migrate.d.ts.map +1 -1
  163. package/dist/db/migrate.js +10 -7
  164. package/dist/dev/setup.d.ts +2 -2
  165. package/dist/dev/setup.d.ts.map +1 -1
  166. package/dist/dev/setup.js +9 -7
  167. package/dist/env/load.d.ts +1 -1
  168. package/dist/env/load.js +1 -1
  169. package/dist/hono_context.d.ts +64 -5
  170. package/dist/hono_context.d.ts.map +1 -1
  171. package/dist/hono_context.js +38 -2
  172. package/dist/http/CLAUDE.md +264 -87
  173. package/dist/http/auth_shape.d.ts +191 -0
  174. package/dist/http/auth_shape.d.ts.map +1 -0
  175. package/dist/http/auth_shape.js +237 -0
  176. package/dist/http/common_routes.js +3 -3
  177. package/dist/http/db_routes.d.ts +4 -0
  178. package/dist/http/db_routes.d.ts.map +1 -1
  179. package/dist/http/db_routes.js +44 -7
  180. package/dist/http/error_schemas.d.ts +132 -19
  181. package/dist/http/error_schemas.d.ts.map +1 -1
  182. package/dist/http/error_schemas.js +132 -40
  183. package/dist/http/jsonrpc_errors.d.ts +27 -2
  184. package/dist/http/jsonrpc_errors.d.ts.map +1 -1
  185. package/dist/http/jsonrpc_errors.js +26 -2
  186. package/dist/http/pending_effects.d.ts +71 -18
  187. package/dist/http/pending_effects.d.ts.map +1 -1
  188. package/dist/http/pending_effects.js +87 -18
  189. package/dist/http/proxy.d.ts +52 -5
  190. package/dist/http/proxy.d.ts.map +1 -1
  191. package/dist/http/proxy.js +92 -14
  192. package/dist/http/route_spec.d.ts +113 -41
  193. package/dist/http/route_spec.d.ts.map +1 -1
  194. package/dist/http/route_spec.js +130 -52
  195. package/dist/http/schema_helpers.d.ts +3 -2
  196. package/dist/http/schema_helpers.d.ts.map +1 -1
  197. package/dist/http/schema_helpers.js +9 -2
  198. package/dist/http/surface.d.ts +2 -1
  199. package/dist/http/surface.d.ts.map +1 -1
  200. package/dist/http/surface.js +1 -2
  201. package/dist/http/surface_query.d.ts +39 -35
  202. package/dist/http/surface_query.d.ts.map +1 -1
  203. package/dist/http/surface_query.js +79 -36
  204. package/dist/primitive_schemas.d.ts +39 -0
  205. package/dist/primitive_schemas.d.ts.map +1 -0
  206. package/dist/primitive_schemas.js +40 -0
  207. package/dist/realtime/sse_auth_guard.d.ts +5 -5
  208. package/dist/realtime/sse_auth_guard.js +9 -9
  209. package/dist/runtime/mock.d.ts +1 -1
  210. package/dist/runtime/mock.js +1 -1
  211. package/dist/server/app_backend.d.ts +14 -11
  212. package/dist/server/app_backend.d.ts.map +1 -1
  213. package/dist/server/app_backend.js +12 -8
  214. package/dist/server/app_server.d.ts +7 -7
  215. package/dist/server/app_server.d.ts.map +1 -1
  216. package/dist/server/app_server.js +36 -31
  217. package/dist/server/validate_nginx.d.ts +1 -1
  218. package/dist/server/validate_nginx.js +1 -1
  219. package/dist/testing/CLAUDE.md +73 -55
  220. package/dist/testing/admin_integration.d.ts +5 -6
  221. package/dist/testing/admin_integration.d.ts.map +1 -1
  222. package/dist/testing/admin_integration.js +100 -96
  223. package/dist/testing/adversarial_headers.js +1 -1
  224. package/dist/testing/app_server.d.ts +11 -14
  225. package/dist/testing/app_server.d.ts.map +1 -1
  226. package/dist/testing/app_server.js +18 -17
  227. package/dist/testing/assertions.d.ts.map +1 -1
  228. package/dist/testing/assertions.js +2 -1
  229. package/dist/testing/attack_surface.d.ts.map +1 -1
  230. package/dist/testing/attack_surface.js +15 -9
  231. package/dist/testing/audit_completeness.d.ts +2 -2
  232. package/dist/testing/audit_completeness.d.ts.map +1 -1
  233. package/dist/testing/audit_completeness.js +53 -39
  234. package/dist/testing/auth_apps.d.ts +5 -4
  235. package/dist/testing/auth_apps.d.ts.map +1 -1
  236. package/dist/testing/auth_apps.js +28 -22
  237. package/dist/testing/data_exposure.d.ts.map +1 -1
  238. package/dist/testing/data_exposure.js +5 -5
  239. package/dist/testing/db.d.ts +1 -1
  240. package/dist/testing/db.d.ts.map +1 -1
  241. package/dist/testing/db.js +4 -4
  242. package/dist/testing/db_entities.d.ts +22 -0
  243. package/dist/testing/db_entities.d.ts.map +1 -0
  244. package/dist/testing/db_entities.js +28 -0
  245. package/dist/testing/entities.d.ts +10 -8
  246. package/dist/testing/entities.d.ts.map +1 -1
  247. package/dist/testing/entities.js +22 -18
  248. package/dist/testing/integration.d.ts.map +1 -1
  249. package/dist/testing/integration.js +13 -14
  250. package/dist/testing/integration_helpers.d.ts +8 -6
  251. package/dist/testing/integration_helpers.d.ts.map +1 -1
  252. package/dist/testing/integration_helpers.js +29 -23
  253. package/dist/testing/middleware.d.ts +15 -11
  254. package/dist/testing/middleware.d.ts.map +1 -1
  255. package/dist/testing/middleware.js +75 -32
  256. package/dist/testing/rpc_attack_surface.d.ts.map +1 -1
  257. package/dist/testing/rpc_attack_surface.js +40 -24
  258. package/dist/testing/rpc_helpers.d.ts.map +1 -1
  259. package/dist/testing/rpc_helpers.js +3 -1
  260. package/dist/testing/rpc_round_trip.d.ts +1 -1
  261. package/dist/testing/rpc_round_trip.d.ts.map +1 -1
  262. package/dist/testing/rpc_round_trip.js +14 -13
  263. package/dist/testing/sse_round_trip.d.ts +3 -4
  264. package/dist/testing/sse_round_trip.d.ts.map +1 -1
  265. package/dist/testing/sse_round_trip.js +7 -11
  266. package/dist/testing/standard.d.ts +1 -1
  267. package/dist/testing/stubs.d.ts +25 -0
  268. package/dist/testing/stubs.d.ts.map +1 -1
  269. package/dist/testing/stubs.js +43 -2
  270. package/dist/testing/surface_invariants.d.ts +2 -2
  271. package/dist/testing/ws_round_trip.d.ts +12 -13
  272. package/dist/testing/ws_round_trip.d.ts.map +1 -1
  273. package/dist/testing/ws_round_trip.js +24 -12
  274. package/dist/ui/AdminAccounts.svelte +23 -20
  275. package/dist/ui/AdminOverview.svelte +15 -13
  276. package/dist/ui/AdminOverview.svelte.d.ts.map +1 -1
  277. package/dist/ui/{AdminPermitHistory.svelte → AdminRoleGrantHistory.svelte} +12 -12
  278. package/dist/ui/AdminRoleGrantHistory.svelte.d.ts +4 -0
  279. package/dist/ui/AdminRoleGrantHistory.svelte.d.ts.map +1 -0
  280. package/dist/ui/BootstrapForm.svelte +1 -1
  281. package/dist/ui/CLAUDE.md +65 -59
  282. package/dist/ui/{PermitOfferForm.svelte → RoleGrantOfferForm.svelte} +37 -22
  283. package/dist/ui/RoleGrantOfferForm.svelte.d.ts +20 -0
  284. package/dist/ui/RoleGrantOfferForm.svelte.d.ts.map +1 -0
  285. package/dist/ui/{PermitOfferHistory.svelte → RoleGrantOfferHistory.svelte} +12 -12
  286. package/dist/ui/{PermitOfferHistory.svelte.d.ts → RoleGrantOfferHistory.svelte.d.ts} +4 -4
  287. package/dist/ui/RoleGrantOfferHistory.svelte.d.ts.map +1 -0
  288. package/dist/ui/{PermitOfferInbox.svelte → RoleGrantOfferInbox.svelte} +14 -14
  289. package/dist/ui/{PermitOfferInbox.svelte.d.ts → RoleGrantOfferInbox.svelte.d.ts} +4 -4
  290. package/dist/ui/RoleGrantOfferInbox.svelte.d.ts.map +1 -0
  291. package/dist/ui/SignupForm.svelte +1 -1
  292. package/dist/ui/SurfaceExplorer.svelte +35 -15
  293. package/dist/ui/SurfaceExplorer.svelte.d.ts.map +1 -1
  294. package/dist/ui/account_sessions_state.svelte.d.ts +2 -3
  295. package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -1
  296. package/dist/ui/account_sessions_state.svelte.js +2 -3
  297. package/dist/ui/admin_accounts_state.svelte.d.ts +25 -18
  298. package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -1
  299. package/dist/ui/admin_accounts_state.svelte.js +28 -17
  300. package/dist/ui/admin_rpc_adapters.d.ts +20 -20
  301. package/dist/ui/admin_rpc_adapters.d.ts.map +1 -1
  302. package/dist/ui/admin_rpc_adapters.js +17 -17
  303. package/dist/ui/admin_sessions_state.svelte.d.ts +2 -2
  304. package/dist/ui/admin_sessions_state.svelte.js +2 -2
  305. package/dist/ui/audit_log_state.svelte.d.ts +7 -7
  306. package/dist/ui/audit_log_state.svelte.d.ts.map +1 -1
  307. package/dist/ui/audit_log_state.svelte.js +6 -6
  308. package/dist/ui/auth_state.svelte.d.ts +3 -3
  309. package/dist/ui/auth_state.svelte.d.ts.map +1 -1
  310. package/dist/ui/auth_state.svelte.js +6 -6
  311. package/dist/ui/format_scope.d.ts +2 -2
  312. package/dist/ui/format_scope.js +2 -2
  313. package/dist/ui/{permit_offers_state.svelte.d.ts → role_grant_offers_state.svelte.d.ts} +39 -31
  314. package/dist/ui/role_grant_offers_state.svelte.d.ts.map +1 -0
  315. package/dist/ui/{permit_offers_state.svelte.js → role_grant_offers_state.svelte.js} +25 -19
  316. package/dist/ui/ui_format.js +2 -2
  317. package/package.json +3 -3
  318. package/dist/auth/permit_offer_action_specs.d.ts.map +0 -1
  319. package/dist/auth/permit_offer_action_specs.js +0 -227
  320. package/dist/auth/permit_offer_actions.d.ts +0 -110
  321. package/dist/auth/permit_offer_actions.d.ts.map +0 -1
  322. package/dist/auth/permit_offer_actions.js +0 -452
  323. package/dist/auth/permit_offer_notifications.d.ts.map +0 -1
  324. package/dist/auth/permit_offer_notifications.js +0 -182
  325. package/dist/auth/permit_offer_queries.d.ts +0 -183
  326. package/dist/auth/permit_offer_queries.d.ts.map +0 -1
  327. package/dist/auth/permit_offer_queries.js +0 -408
  328. package/dist/auth/permit_offer_schema.d.ts +0 -103
  329. package/dist/auth/permit_offer_schema.d.ts.map +0 -1
  330. package/dist/auth/permit_queries.d.ts +0 -210
  331. package/dist/auth/permit_queries.d.ts.map +0 -1
  332. package/dist/auth/permit_queries.js +0 -294
  333. package/dist/auth/require_keeper.d.ts +0 -20
  334. package/dist/auth/require_keeper.d.ts.map +0 -1
  335. package/dist/auth/require_keeper.js +0 -35
  336. package/dist/auth/route_guards.d.ts +0 -21
  337. package/dist/auth/route_guards.d.ts.map +0 -1
  338. package/dist/auth/route_guards.js +0 -32
  339. package/dist/auth/session_lifecycle.d.ts +0 -37
  340. package/dist/auth/session_lifecycle.d.ts.map +0 -1
  341. package/dist/auth/session_lifecycle.js +0 -29
  342. package/dist/ui/AdminPermitHistory.svelte.d.ts +0 -4
  343. package/dist/ui/AdminPermitHistory.svelte.d.ts.map +0 -1
  344. package/dist/ui/PermitOfferForm.svelte.d.ts +0 -14
  345. package/dist/ui/PermitOfferForm.svelte.d.ts.map +0 -1
  346. package/dist/ui/PermitOfferHistory.svelte.d.ts.map +0 -1
  347. package/dist/ui/PermitOfferInbox.svelte.d.ts.map +0 -1
  348. package/dist/ui/permit_offers_state.svelte.d.ts.map +0 -1
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Credential-type registry — how a request was authenticated.
3
+ *
4
+ * Three builtins: `session` (cookie-based), `api_token` (HTTP Bearer
5
+ * token), `daemon_token` (filesystem proof for the keeper account).
6
+ * Open-string registry on top so consumers can declare additional
7
+ * credential types (e.g. `'sso_assertion'`, `'agent_token'`) without an
8
+ * upstream release. `RoleSpec.required_credential_types` references
9
+ * entries from this registry; v1 keeps the field informative-only
10
+ * (consumed by `auth/middleware.ts` and the dispatcher). Mirrors the
11
+ * open-registry pattern used for `RoleName`, `ScopeKindName`,
12
+ * `GrantPathName`, and `AuditEventTypeName`.
13
+ *
14
+ * The Hono-side wire-validated `CredentialType` Zod enum (in
15
+ * `hono_context.ts`) is the closed-set narrow type middleware sets on
16
+ * the context; the constants below are the source of truth for those
17
+ * three string values. Future builtin credential types added here
18
+ * propagate to the wire enum by editing the import list.
19
+ *
20
+ * @module
21
+ */
22
+ import { z } from 'zod';
23
+ /**
24
+ * Letter (lowercase a-z) start and end (or single letter), with letters
25
+ * and underscores in between. Mirrors `RoleName`, `ScopeKindName`,
26
+ * `GrantPathName`. Rejects empty strings, leading or trailing
27
+ * underscores, uppercase, and digits.
28
+ */
29
+ export declare const CREDENTIAL_TYPE_NAME_REGEX: RegExp;
30
+ /** Zod schema for valid credential-type name strings. */
31
+ export declare const CredentialTypeName: z.ZodString;
32
+ export type CredentialTypeName = z.infer<typeof CredentialTypeName>;
33
+ /** Cookie-based session credential. */
34
+ export declare const CREDENTIAL_TYPE_SESSION = "session";
35
+ /**
36
+ * HTTP `Authorization: Bearer` API token credential. The wire literal
37
+ * `'api_token'` aligns with the `api_token` storage table name; the
38
+ * constant is named `_API_TOKEN` (not `_BEARER`) to keep wire and
39
+ * storage nomenclature in lockstep.
40
+ */
41
+ export declare const CREDENTIAL_TYPE_API_TOKEN = "api_token";
42
+ /** Daemon-token credential — filesystem proof for the keeper account. */
43
+ export declare const CREDENTIAL_TYPE_DAEMON_TOKEN = "daemon_token";
44
+ /** The builtin credential-type names as a const tuple. */
45
+ export declare const BUILTIN_CREDENTIAL_TYPES: readonly ["session", "api_token", "daemon_token"];
46
+ /** Zod enum for builtin credential types only. */
47
+ export declare const BuiltinCredentialType: z.ZodEnum<{
48
+ daemon_token: "daemon_token";
49
+ session: "session";
50
+ api_token: "api_token";
51
+ }>;
52
+ export type BuiltinCredentialType = z.infer<typeof BuiltinCredentialType>;
53
+ /**
54
+ * Per-credential-type metadata. `description` is admin-UI-facing copy
55
+ * (mirrors `RoleSpec.description` and `ScopeKindMeta.description`).
56
+ * Open shape so v2 can extend without a breaking change.
57
+ */
58
+ export interface CredentialTypeMeta {
59
+ description?: string;
60
+ }
61
+ /**
62
+ * Builtin credential-type metadata. Not overridable by consumers.
63
+ *
64
+ * Typed `ReadonlyMap` for the contract — but JS Maps don't honor
65
+ * `Object.freeze` for `.set` / `.delete` / `.clear` (they mutate
66
+ * internal slots, not own properties), so freeze adds no runtime guard
67
+ * here. Read once at startup by `create_credential_type_schema`;
68
+ * runtime mutation has no effect on already-built schemas.
69
+ */
70
+ export declare const BUILTIN_CREDENTIAL_TYPE_META: ReadonlyMap<string, CredentialTypeMeta>;
71
+ /** The result of `create_credential_type_schema` — a Zod schema and metadata map. */
72
+ export interface CredentialTypeSchemaResult {
73
+ /**
74
+ * Zod schema that validates credential-type name strings against the
75
+ * registered set (builtins + consumer-declared). Use at I/O
76
+ * boundaries (admin UIs, codegen) and as the construction-time check
77
+ * inside `create_role_schema` for every
78
+ * `RoleSpec.required_credential_types` entry.
79
+ */
80
+ CredentialType: z.ZodType<string>;
81
+ /**
82
+ * Map of every registered credential-type to its metadata. Keyed by
83
+ * name. Read at startup by admin / codegen surfaces.
84
+ */
85
+ credential_types: ReadonlyMap<string, CredentialTypeMeta>;
86
+ }
87
+ /**
88
+ * Create a credential-type schema from the builtin set plus optional
89
+ * consumer-declared additions.
90
+ *
91
+ * Builtins (`session`, `api_token`, `daemon_token`) are always present;
92
+ * consumer entries that collide with a builtin name throw at
93
+ * construction. Pass the result into `create_role_schema`'s optional
94
+ * `credential_types` parameter so each role's
95
+ * `required_credential_types` entries are validated against this set
96
+ * at construction time.
97
+ *
98
+ * @param consumer_types - optional consumer-declared credential-type set with optional metadata
99
+ * @returns `{CredentialType, credential_types}` — Zod schema and metadata map
100
+ *
101
+ * @throws Error if any `consumer_types` key fails the `CredentialTypeName` regex, collides with a builtin name, or appears more than once
102
+ *
103
+ * @example
104
+ * ```ts
105
+ * // simple — builtins only
106
+ * const {CredentialType, credential_types} = create_credential_type_schema();
107
+ *
108
+ * // with consumer extensions
109
+ * const {CredentialType} = create_credential_type_schema({
110
+ * sso_assertion: {description: 'OIDC SSO assertion bound to an IdP-asserted account.'},
111
+ * });
112
+ * ```
113
+ */
114
+ export declare const create_credential_type_schema: (consumer_types?: Record<string, CredentialTypeMeta>) => CredentialTypeSchemaResult;
115
+ //# sourceMappingURL=credential_type_schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential_type_schema.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/credential_type_schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,QAAgC,CAAC;AAExE,yDAAyD;AACzD,eAAO,MAAM,kBAAkB,aAK7B,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAIpE,uCAAuC;AACvC,eAAO,MAAM,uBAAuB,YAAY,CAAC;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,cAAc,CAAC;AAErD,yEAAyE;AACzE,eAAO,MAAM,4BAA4B,iBAAiB,CAAC;AAE3D,0DAA0D;AAC1D,eAAO,MAAM,wBAAwB,mDAI3B,CAAC;AAEX,kDAAkD;AAClD,eAAO,MAAM,qBAAqB;;;;EAAmC,CAAC;AACtE,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE1E;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAa/E,CAAC;AAEH,qFAAqF;AACrF,MAAM,WAAW,0BAA0B;IAC1C;;;;;;OAMG;IACH,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC;;;OAGG;IACH,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC1D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,6BAA6B,GACzC,iBAAgB,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAM,KACrD,0BA2BF,CAAC"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Credential-type registry — how a request was authenticated.
3
+ *
4
+ * Three builtins: `session` (cookie-based), `api_token` (HTTP Bearer
5
+ * token), `daemon_token` (filesystem proof for the keeper account).
6
+ * Open-string registry on top so consumers can declare additional
7
+ * credential types (e.g. `'sso_assertion'`, `'agent_token'`) without an
8
+ * upstream release. `RoleSpec.required_credential_types` references
9
+ * entries from this registry; v1 keeps the field informative-only
10
+ * (consumed by `auth/middleware.ts` and the dispatcher). Mirrors the
11
+ * open-registry pattern used for `RoleName`, `ScopeKindName`,
12
+ * `GrantPathName`, and `AuditEventTypeName`.
13
+ *
14
+ * The Hono-side wire-validated `CredentialType` Zod enum (in
15
+ * `hono_context.ts`) is the closed-set narrow type middleware sets on
16
+ * the context; the constants below are the source of truth for those
17
+ * three string values. Future builtin credential types added here
18
+ * propagate to the wire enum by editing the import list.
19
+ *
20
+ * @module
21
+ */
22
+ import { z } from 'zod';
23
+ /**
24
+ * Letter (lowercase a-z) start and end (or single letter), with letters
25
+ * and underscores in between. Mirrors `RoleName`, `ScopeKindName`,
26
+ * `GrantPathName`. Rejects empty strings, leading or trailing
27
+ * underscores, uppercase, and digits.
28
+ */
29
+ export const CREDENTIAL_TYPE_NAME_REGEX = /^[a-z][a-z_]*[a-z]$|^[a-z]$/;
30
+ /** Zod schema for valid credential-type name strings. */
31
+ export const CredentialTypeName = z
32
+ .string()
33
+ .regex(CREDENTIAL_TYPE_NAME_REGEX, 'Credential-type names must be lowercase letters and underscores (a-z_), no leading/trailing underscore');
34
+ // Builtin credential types — provided by fuz_app, always available.
35
+ /** Cookie-based session credential. */
36
+ export const CREDENTIAL_TYPE_SESSION = 'session';
37
+ /**
38
+ * HTTP `Authorization: Bearer` API token credential. The wire literal
39
+ * `'api_token'` aligns with the `api_token` storage table name; the
40
+ * constant is named `_API_TOKEN` (not `_BEARER`) to keep wire and
41
+ * storage nomenclature in lockstep.
42
+ */
43
+ export const CREDENTIAL_TYPE_API_TOKEN = 'api_token';
44
+ /** Daemon-token credential — filesystem proof for the keeper account. */
45
+ export const CREDENTIAL_TYPE_DAEMON_TOKEN = 'daemon_token';
46
+ /** The builtin credential-type names as a const tuple. */
47
+ export const BUILTIN_CREDENTIAL_TYPES = [
48
+ CREDENTIAL_TYPE_SESSION,
49
+ CREDENTIAL_TYPE_API_TOKEN,
50
+ CREDENTIAL_TYPE_DAEMON_TOKEN,
51
+ ];
52
+ /** Zod enum for builtin credential types only. */
53
+ export const BuiltinCredentialType = z.enum(BUILTIN_CREDENTIAL_TYPES);
54
+ /**
55
+ * Builtin credential-type metadata. Not overridable by consumers.
56
+ *
57
+ * Typed `ReadonlyMap` for the contract — but JS Maps don't honor
58
+ * `Object.freeze` for `.set` / `.delete` / `.clear` (they mutate
59
+ * internal slots, not own properties), so freeze adds no runtime guard
60
+ * here. Read once at startup by `create_credential_type_schema`;
61
+ * runtime mutation has no effect on already-built schemas.
62
+ */
63
+ export const BUILTIN_CREDENTIAL_TYPE_META = new Map([
64
+ [
65
+ CREDENTIAL_TYPE_SESSION,
66
+ { description: 'Cookie-based session credential, signed and validated server-side.' },
67
+ ],
68
+ [
69
+ CREDENTIAL_TYPE_API_TOKEN,
70
+ { description: 'HTTP Authorization: Bearer API token credential, hashed at rest.' },
71
+ ],
72
+ [
73
+ CREDENTIAL_TYPE_DAEMON_TOKEN,
74
+ { description: 'Filesystem-proof daemon-token credential, scoped to the keeper account.' },
75
+ ],
76
+ ]);
77
+ /**
78
+ * Create a credential-type schema from the builtin set plus optional
79
+ * consumer-declared additions.
80
+ *
81
+ * Builtins (`session`, `api_token`, `daemon_token`) are always present;
82
+ * consumer entries that collide with a builtin name throw at
83
+ * construction. Pass the result into `create_role_schema`'s optional
84
+ * `credential_types` parameter so each role's
85
+ * `required_credential_types` entries are validated against this set
86
+ * at construction time.
87
+ *
88
+ * @param consumer_types - optional consumer-declared credential-type set with optional metadata
89
+ * @returns `{CredentialType, credential_types}` — Zod schema and metadata map
90
+ *
91
+ * @throws Error if any `consumer_types` key fails the `CredentialTypeName` regex, collides with a builtin name, or appears more than once
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * // simple — builtins only
96
+ * const {CredentialType, credential_types} = create_credential_type_schema();
97
+ *
98
+ * // with consumer extensions
99
+ * const {CredentialType} = create_credential_type_schema({
100
+ * sso_assertion: {description: 'OIDC SSO assertion bound to an IdP-asserted account.'},
101
+ * });
102
+ * ```
103
+ */
104
+ export const create_credential_type_schema = (consumer_types = {}) => {
105
+ const consumer_names = Object.keys(consumer_types);
106
+ const seen = new Set();
107
+ for (const name of consumer_names) {
108
+ const parsed = CredentialTypeName.safeParse(name);
109
+ if (!parsed.success) {
110
+ throw new Error(`Invalid credential-type name "${name}": ${parsed.error.issues[0].message}`);
111
+ }
112
+ if (BUILTIN_CREDENTIAL_TYPE_META.has(name)) {
113
+ throw new Error(`Consumer credential-type "${name}" collides with builtin credential-type`);
114
+ }
115
+ if (seen.has(name)) {
116
+ throw new Error(`Duplicate credential-type name "${name}"`);
117
+ }
118
+ seen.add(name);
119
+ }
120
+ const all_names = [...BUILTIN_CREDENTIAL_TYPES, ...consumer_names];
121
+ const CredentialType = z.enum(all_names);
122
+ const credential_types = new Map(BUILTIN_CREDENTIAL_TYPE_META);
123
+ for (const name of consumer_names) {
124
+ credential_types.set(name, consumer_types[name]);
125
+ }
126
+ return { CredentialType, credential_types };
127
+ };
@@ -41,10 +41,16 @@ export declare const get_daemon_token_path: (runtime: Pick<EnvDeps, "env_get">,
41
41
  */
42
42
  export declare const write_daemon_token: (runtime: DaemonTokenWriteDeps, token_path: string, token: string) => Promise<void>;
43
43
  /**
44
- * Resolve the keeper account ID by querying for the account with an active keeper permit.
44
+ * Resolve the keeper account ID by querying for the account with an active
45
+ * keeper role_grant.
45
46
  *
46
- * There is exactly one keeper account (the bootstrap account). Runs once at
47
- * server startup — the result is cached in `DaemonTokenState.keeper_account_id`.
47
+ * There is exactly one keeper account (the bootstrap account). Runs once
48
+ * at server startup — the result is cached in
49
+ * `DaemonTokenState.keeper_account_id`. The acting actor is resolved
50
+ * per-request by the dispatcher's authorization phase (which runs
51
+ * `resolve_acting_actor` against this account id), so multi-actor keeper
52
+ * accounts surface `actor_required` if a daemon caller doesn't pass an
53
+ * explicit `acting`.
48
54
  *
49
55
  * @param deps - query dependencies
50
56
  * @returns the keeper account ID, or `null` if no keeper exists yet (pre-bootstrap)
@@ -83,15 +89,21 @@ export declare const start_daemon_token_rotation: (runtime: DaemonTokenWriteDeps
83
89
  * Create middleware that authenticates via daemon token.
84
90
  *
85
91
  * Checks the `X-Daemon-Token` header. Behavior:
86
- * - No header: pass through (don't touch existing context)
87
- * - Header present + valid: build `RequestContext` from keeper account,
88
- * set `credential_type: 'daemon_token'` (overrides any existing session/bearer context)
89
- * - Header present + invalid: return 401 (fail-closed, no downgrade)
90
- * - Header present + valid but `keeper_account_id` is null: return 503
92
+ * - No header: pass through (don't touch existing context).
93
+ * - Header present + Zod-invalid: return 401 (fail-closed).
94
+ * - Header present + invalid value: return 401 (fail-closed, no downgrade).
95
+ * - Header present + valid + `keeper_account_id` null: return 503.
96
+ * - Header present + valid + ok: set `c.var.auth_account_id =
97
+ * state.keeper_account_id`, `CREDENTIAL_TYPE_KEY = 'daemon_token'`
98
+ * (overrides any existing session / bearer identity).
99
+ *
100
+ * Acting-actor resolution + `RequestContext` construction are deferred
101
+ * to the dispatcher's authorization phase. Multi-actor keeper accounts
102
+ * surface `actor_required` from there if a daemon caller doesn't pass
103
+ * an explicit `acting` value.
91
104
  *
92
105
  * @param state - the daemon token runtime state
93
- * @param deps - query dependencies (pool-level db for middleware)
94
- * @mutates Hono context - sets `REQUEST_CONTEXT_KEY`, `CREDENTIAL_TYPE_KEY`, and `AUTH_API_TOKEN_ID_KEY` on a valid token
106
+ * @mutates Hono context - sets `ACCOUNT_ID_KEY`, `CREDENTIAL_TYPE_KEY`, and `AUTH_API_TOKEN_ID_KEY` on a valid token
95
107
  */
96
- export declare const create_daemon_token_middleware: (state: DaemonTokenState, deps: QueryDeps) => MiddlewareHandler;
108
+ export declare const create_daemon_token_middleware: (state: DaemonTokenState, _deps: QueryDeps) => MiddlewareHandler;
97
109
  //# sourceMappingURL=daemon_token_middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"daemon_token_middleware.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/daemon_token_middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,MAAM,CAAC;AAC5C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAC,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAWrF,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAKN,KAAK,gBAAgB,EACrB,MAAM,mBAAmB,CAAC;AAE3B,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD,iDAAiD;AACjD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAC1D,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,iBAAiB,GAAG,QAAQ,CAAC,GAAG;IAC3D,6FAA6F;IAC7F,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GACjC,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EACjC,MAAM,MAAM,KACV,MAAM,GAAG,IAGX,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,GAC9B,SAAS,oBAAoB,EAC7B,YAAY,MAAM,EAClB,OAAO,MAAM,KACX,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,GAAU,MAAM,SAAS,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAEtF,CAAC;AAEF,yCAAyC;AACzC,MAAM,WAAW,0BAA0B;IAC1C,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,gDAAgD;AAChD,MAAM,WAAW,mBAAmB;IACnC,2EAA2E;IAC3E,KAAK,EAAE,gBAAgB,CAAC;IACxB,kGAAkG;IAClG,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,2BAA2B,GACvC,SAAS,oBAAoB,GAAG,YAAY,EAC5C,MAAM,SAAS,EACf,SAAS,0BAA0B,EACnC,KAAK,MAAM,KACT,OAAO,CAAC,mBAAmB,CAwD7B,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,8BAA8B,GAC1C,OAAO,gBAAgB,EACvB,MAAM,SAAS,KACb,iBAqCF,CAAC"}
1
+ {"version":3,"file":"daemon_token_middleware.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/daemon_token_middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,MAAM,CAAC;AAC5C,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAC,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,OAAO,EAAC,MAAM,oBAAoB,CAAC;AASrF,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAKN,KAAK,gBAAgB,EACrB,MAAM,mBAAmB,CAAC;AAE3B,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B,QAAS,CAAC;AAEnD,iDAAiD;AACjD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAC1D,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,iBAAiB,GAAG,QAAQ,CAAC,GAAG;IAC3D,6FAA6F;IAC7F,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GACjC,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EACjC,MAAM,MAAM,KACV,MAAM,GAAG,IAGX,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,GAC9B,SAAS,oBAAoB,EAC7B,YAAY,MAAM,EAClB,OAAO,MAAM,KACX,OAAO,CAAC,IAAI,CAKd,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,yBAAyB,GAAU,MAAM,SAAS,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAEtF,CAAC;AAEF,yCAAyC;AACzC,MAAM,WAAW,0BAA0B;IAC1C,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,gDAAgD;AAChD,MAAM,WAAW,mBAAmB;IACnC,2EAA2E;IAC3E,KAAK,EAAE,gBAAgB,CAAC;IACxB,kGAAkG;IAClG,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,2BAA2B,GACvC,SAAS,oBAAoB,GAAG,YAAY,EAC5C,MAAM,SAAS,EACf,SAAS,0BAA0B,EACnC,KAAK,MAAM,KACT,OAAO,CAAC,mBAAmB,CAwD7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,8BAA8B,GAC1C,OAAO,gBAAgB,EACvB,OAAO,SAAS,KACd,iBA+BF,CAAC"}
@@ -12,10 +12,9 @@
12
12
  import {} from '../runtime/deps.js';
13
13
  import { write_file_atomic } from '../runtime/fs.js';
14
14
  import { get_app_dir } from '../cli/config.js';
15
- import { REQUEST_CONTEXT_KEY, build_request_context } from './request_context.js';
16
- import { AUTH_API_TOKEN_ID_KEY, CREDENTIAL_TYPE_KEY } from '../hono_context.js';
17
- import { ERROR_INVALID_DAEMON_TOKEN, ERROR_KEEPER_ACCOUNT_NOT_CONFIGURED, ERROR_KEEPER_ACCOUNT_NOT_FOUND, } from '../http/error_schemas.js';
18
- import { query_permit_find_account_id_for_role } from './permit_queries.js';
15
+ import { ACCOUNT_ID_KEY, AUTH_API_TOKEN_ID_KEY, CREDENTIAL_TYPE_KEY } from '../hono_context.js';
16
+ import { ERROR_INVALID_DAEMON_TOKEN, ERROR_KEEPER_ACCOUNT_NOT_CONFIGURED, } from '../http/error_schemas.js';
17
+ import { query_role_grant_find_account_id_for_role } from './role_grant_queries.js';
19
18
  import { ROLE_KEEPER } from './role_schema.js';
20
19
  import { DaemonToken, DAEMON_TOKEN_HEADER, generate_daemon_token, validate_daemon_token, } from './daemon_token.js';
21
20
  /** Default rotation interval in milliseconds (30 seconds). */
@@ -48,16 +47,22 @@ export const write_daemon_token = async (runtime, token_path, token) => {
48
47
  }
49
48
  };
50
49
  /**
51
- * Resolve the keeper account ID by querying for the account with an active keeper permit.
50
+ * Resolve the keeper account ID by querying for the account with an active
51
+ * keeper role_grant.
52
52
  *
53
- * There is exactly one keeper account (the bootstrap account). Runs once at
54
- * server startup — the result is cached in `DaemonTokenState.keeper_account_id`.
53
+ * There is exactly one keeper account (the bootstrap account). Runs once
54
+ * at server startup — the result is cached in
55
+ * `DaemonTokenState.keeper_account_id`. The acting actor is resolved
56
+ * per-request by the dispatcher's authorization phase (which runs
57
+ * `resolve_acting_actor` against this account id), so multi-actor keeper
58
+ * accounts surface `actor_required` if a daemon caller doesn't pass an
59
+ * explicit `acting`.
55
60
  *
56
61
  * @param deps - query dependencies
57
62
  * @returns the keeper account ID, or `null` if no keeper exists yet (pre-bootstrap)
58
63
  */
59
64
  export const resolve_keeper_account_id = async (deps) => {
60
- return query_permit_find_account_id_for_role(deps, ROLE_KEEPER);
65
+ return query_role_grant_find_account_id_for_role(deps, ROLE_KEEPER);
61
66
  };
62
67
  /**
63
68
  * Start daemon token rotation.
@@ -129,17 +134,23 @@ export const start_daemon_token_rotation = async (runtime, deps, options, log) =
129
134
  * Create middleware that authenticates via daemon token.
130
135
  *
131
136
  * Checks the `X-Daemon-Token` header. Behavior:
132
- * - No header: pass through (don't touch existing context)
133
- * - Header present + valid: build `RequestContext` from keeper account,
134
- * set `credential_type: 'daemon_token'` (overrides any existing session/bearer context)
135
- * - Header present + invalid: return 401 (fail-closed, no downgrade)
136
- * - Header present + valid but `keeper_account_id` is null: return 503
137
+ * - No header: pass through (don't touch existing context).
138
+ * - Header present + Zod-invalid: return 401 (fail-closed).
139
+ * - Header present + invalid value: return 401 (fail-closed, no downgrade).
140
+ * - Header present + valid + `keeper_account_id` null: return 503.
141
+ * - Header present + valid + ok: set `c.var.auth_account_id =
142
+ * state.keeper_account_id`, `CREDENTIAL_TYPE_KEY = 'daemon_token'`
143
+ * (overrides any existing session / bearer identity).
144
+ *
145
+ * Acting-actor resolution + `RequestContext` construction are deferred
146
+ * to the dispatcher's authorization phase. Multi-actor keeper accounts
147
+ * surface `actor_required` from there if a daemon caller doesn't pass
148
+ * an explicit `acting` value.
137
149
  *
138
150
  * @param state - the daemon token runtime state
139
- * @param deps - query dependencies (pool-level db for middleware)
140
- * @mutates Hono context - sets `REQUEST_CONTEXT_KEY`, `CREDENTIAL_TYPE_KEY`, and `AUTH_API_TOKEN_ID_KEY` on a valid token
151
+ * @mutates Hono context - sets `ACCOUNT_ID_KEY`, `CREDENTIAL_TYPE_KEY`, and `AUTH_API_TOKEN_ID_KEY` on a valid token
141
152
  */
142
- export const create_daemon_token_middleware = (state, deps) => {
153
+ export const create_daemon_token_middleware = (state, _deps) => {
143
154
  return async (c, next) => {
144
155
  const token_header = c.req.header(DAEMON_TOKEN_HEADER);
145
156
  if (!token_header) {
@@ -159,12 +170,7 @@ export const create_daemon_token_middleware = (state, deps) => {
159
170
  if (!state.keeper_account_id) {
160
171
  return c.json({ error: ERROR_KEEPER_ACCOUNT_NOT_CONFIGURED }, 503);
161
172
  }
162
- // build request context from the keeper account (overrides any existing session/bearer context)
163
- const ctx = await build_request_context(deps, state.keeper_account_id);
164
- if (!ctx) {
165
- return c.json({ error: ERROR_KEEPER_ACCOUNT_NOT_FOUND }, 500);
166
- }
167
- c.set(REQUEST_CONTEXT_KEY, ctx);
173
+ c.set(ACCOUNT_ID_KEY, state.keeper_account_id);
168
174
  c.set(CREDENTIAL_TYPE_KEY, 'daemon_token');
169
175
  c.set(AUTH_API_TOKEN_ID_KEY, null);
170
176
  await next();
@@ -9,8 +9,8 @@
9
9
  export declare const ACCOUNT_SCHEMA = "\nCREATE TABLE IF NOT EXISTS account (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n username TEXT UNIQUE NOT NULL,\n email TEXT,\n email_verified BOOLEAN NOT NULL DEFAULT false,\n password_hash TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n created_by UUID,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n updated_by UUID\n)";
10
10
  export declare const ACTOR_SCHEMA = "\nCREATE TABLE IF NOT EXISTS actor (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n account_id UUID NOT NULL REFERENCES account(id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n updated_at TIMESTAMPTZ,\n updated_by UUID REFERENCES actor(id) ON DELETE SET NULL\n)";
11
11
  export declare const ACTOR_INDEX = "\nCREATE INDEX IF NOT EXISTS idx_actor_account ON actor(account_id)";
12
- export declare const PERMIT_SCHEMA = "\nCREATE TABLE IF NOT EXISTS permit (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n actor_id UUID NOT NULL REFERENCES actor(id) ON DELETE CASCADE,\n role TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n expires_at TIMESTAMPTZ,\n revoked_at TIMESTAMPTZ,\n revoked_by UUID REFERENCES actor(id) ON DELETE SET NULL,\n granted_by UUID REFERENCES actor(id) ON DELETE SET NULL\n)";
13
- export declare const PERMIT_INDEXES: string[];
12
+ export declare const ROLE_GRANT_SCHEMA = "\nCREATE TABLE IF NOT EXISTS role_grant (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n actor_id UUID NOT NULL REFERENCES actor(id) ON DELETE CASCADE,\n role TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n expires_at TIMESTAMPTZ,\n revoked_at TIMESTAMPTZ,\n revoked_by UUID REFERENCES actor(id) ON DELETE SET NULL,\n granted_by UUID REFERENCES actor(id) ON DELETE SET NULL\n)";
13
+ export declare const ROLE_GRANT_INDEXES: string[];
14
14
  export declare const AUTH_SESSION_SCHEMA = "\nCREATE TABLE IF NOT EXISTS auth_session (\n id TEXT PRIMARY KEY,\n account_id UUID NOT NULL REFERENCES account(id) ON DELETE CASCADE,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n expires_at TIMESTAMPTZ NOT NULL,\n last_seen_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n)";
15
15
  export declare const AUTH_SESSION_INDEXES: string[];
16
16
  export declare const API_TOKEN_SCHEMA = "\nCREATE TABLE IF NOT EXISTS api_token (\n id TEXT PRIMARY KEY,\n account_id UUID NOT NULL REFERENCES account(id) ON DELETE CASCADE,\n name TEXT NOT NULL,\n token_hash TEXT NOT NULL,\n expires_at TIMESTAMPTZ,\n last_used_at TIMESTAMPTZ,\n last_used_ip TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n)";
@@ -1 +1 @@
1
- {"version":3,"file":"ddl.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/ddl.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,cAAc,8WAWzB,CAAC;AAEH,eAAO,MAAM,YAAY,mUAQvB,CAAC;AAEH,eAAO,MAAM,WAAW,wEAC0C,CAAC;AAEnE,eAAO,MAAM,aAAa,uZAUxB,CAAC;AAEH,eAAO,MAAM,cAAc,UAI1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,0RAO9B,CAAC;AAEH,eAAO,MAAM,oBAAoB,UAGhC,CAAC;AAEF,eAAO,MAAM,gBAAgB,iUAU3B,CAAC;AAEH,eAAO,MAAM,mBAAmB,4GACsE,CAAC;AAEvG,eAAO,MAAM,yBAAyB,6FACiD,CAAC;AAExF,eAAO,MAAM,eAAe,gFAC8C,CAAC;AAE3E,eAAO,MAAM,qBAAqB,wJAIhC,CAAC;AAEH,6FAA6F;AAC7F,eAAO,MAAM,mBAAmB,yHAGP,CAAC;AAE1B,eAAO,MAAM,aAAa,6ZAUxB,CAAC;AAEH,eAAO,MAAM,cAAc,UAI1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,oMAM9B,CAAC;AAEH,eAAO,MAAM,iBAAiB,sEACkC,CAAC"}
1
+ {"version":3,"file":"ddl.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/ddl.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,cAAc,8WAWzB,CAAC;AAEH,eAAO,MAAM,YAAY,mUAQvB,CAAC;AAEH,eAAO,MAAM,WAAW,wEAC0C,CAAC;AAEnE,eAAO,MAAM,iBAAiB,2ZAU5B,CAAC;AAEH,eAAO,MAAM,kBAAkB,UAI9B,CAAC;AAEF,eAAO,MAAM,mBAAmB,0RAO9B,CAAC;AAEH,eAAO,MAAM,oBAAoB,UAGhC,CAAC;AAEF,eAAO,MAAM,gBAAgB,iUAU3B,CAAC;AAEH,eAAO,MAAM,mBAAmB,4GACsE,CAAC;AAEvG,eAAO,MAAM,yBAAyB,6FACiD,CAAC;AAExF,eAAO,MAAM,eAAe,gFAC8C,CAAC;AAE3E,eAAO,MAAM,qBAAqB,wJAIhC,CAAC;AAEH,6FAA6F;AAC7F,eAAO,MAAM,mBAAmB,yHAGP,CAAC;AAE1B,eAAO,MAAM,aAAa,6ZAUxB,CAAC;AAEH,eAAO,MAAM,cAAc,UAI1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,oMAM9B,CAAC;AAEH,eAAO,MAAM,iBAAiB,sEACkC,CAAC"}
package/dist/auth/ddl.js CHANGED
@@ -29,8 +29,8 @@ CREATE TABLE IF NOT EXISTS actor (
29
29
  )`;
30
30
  export const ACTOR_INDEX = `
31
31
  CREATE INDEX IF NOT EXISTS idx_actor_account ON actor(account_id)`;
32
- export const PERMIT_SCHEMA = `
33
- CREATE TABLE IF NOT EXISTS permit (
32
+ export const ROLE_GRANT_SCHEMA = `
33
+ CREATE TABLE IF NOT EXISTS role_grant (
34
34
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
35
35
  actor_id UUID NOT NULL REFERENCES actor(id) ON DELETE CASCADE,
36
36
  role TEXT NOT NULL,
@@ -40,10 +40,10 @@ CREATE TABLE IF NOT EXISTS permit (
40
40
  revoked_by UUID REFERENCES actor(id) ON DELETE SET NULL,
41
41
  granted_by UUID REFERENCES actor(id) ON DELETE SET NULL
42
42
  )`;
43
- export const PERMIT_INDEXES = [
44
- `CREATE INDEX IF NOT EXISTS idx_permit_actor ON permit(actor_id)`,
45
- `CREATE UNIQUE INDEX IF NOT EXISTS permit_actor_role_active_unique
46
- ON permit (actor_id, role) WHERE revoked_at IS NULL`,
43
+ export const ROLE_GRANT_INDEXES = [
44
+ `CREATE INDEX IF NOT EXISTS idx_role_grant_actor ON role_grant(actor_id)`,
45
+ `CREATE UNIQUE INDEX IF NOT EXISTS role_grant_actor_role_active_unique
46
+ ON role_grant (actor_id, role) WHERE revoked_at IS NULL`,
47
47
  ];
48
48
  export const AUTH_SESSION_SCHEMA = `
49
49
  CREATE TABLE IF NOT EXISTS auth_session (
@@ -12,7 +12,7 @@ import type { Keyring } from './keyring.js';
12
12
  import type { PasswordHashDeps } from './password.js';
13
13
  import type { Db } from '../db/db.js';
14
14
  import type { StatResult } from '../runtime/deps.js';
15
- import type { AuditLogConfig, AuditLogEvent } from './audit_log_schema.js';
15
+ import type { AuditEmitter } from './audit_emitter.js';
16
16
  /**
17
17
  * Stateless capabilities bundle for fuz_app backends.
18
18
  *
@@ -35,24 +35,13 @@ export interface AppDeps {
35
35
  /** Structured logger instance. */
36
36
  log: Logger;
37
37
  /**
38
- * Called after each audit log INSERT succeeds.
39
- * Use to broadcast audit events via SSE. Flows automatically to all
40
- * route factories that receive `deps` or `RouteFactoryDeps`.
41
- * Defaults to a noop when not wired to SSE.
38
+ * Bound audit emitter. Closes over the pool, the `on_audit_event`
39
+ * subscriber chain, and the optional `AuditLogConfig`. Built once at
40
+ * backend assembly via `create_audit_emitter` so handlers can never
41
+ * accidentally write audits against the request transaction there
42
+ * is no pool slot on the handler context.
42
43
  */
43
- on_audit_event: (event: AuditLogEvent) => void;
44
- /**
45
- * Audit-log config for `audit_log_fire_and_forget` and `query_audit_log`.
46
- * Built once at startup via `create_audit_log_config({extra_events})` to
47
- * register consumer event types. Optional — defaults to
48
- * `BUILTIN_AUDIT_LOG_CONFIG` when absent.
49
- *
50
- * Threaded through `AppDeps` (instead of a per-call positional arg) so
51
- * consumer handlers cannot silently fall back to the builtin config by
52
- * forgetting to pass theirs — the deps bundle carries it everywhere
53
- * fuz_app emits an audit event.
54
- */
55
- audit_log_config?: AuditLogConfig;
44
+ audit: AuditEmitter;
56
45
  }
57
46
  /**
58
47
  * Capabilities for route spec factories.
@@ -1 +1 @@
1
- {"version":3,"file":"deps.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAC,cAAc,EAAE,aAAa,EAAC,MAAM,uBAAuB,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACvB,+DAA+D;IAC/D,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnD,2BAA2B;IAC3B,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,qBAAqB;IACrB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,yBAAyB;IACzB,EAAE,EAAE,EAAE,CAAC;IACP,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;IACH,cAAc,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC/C;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,EAAE,cAAc,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"deps.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAErD;;;;;GAKG;AACH,MAAM,WAAW,OAAO;IACvB,+DAA+D;IAC/D,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnD,2BAA2B;IAC3B,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,qBAAqB;IACrB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,yBAAyB;IACzB,EAAE,EAAE,EAAE,CAAC;IACP,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;OAMG;IACH,KAAK,EAAE,YAAY,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Grant-path registry — the surfaces through which a role can be
3
+ * granted to an actor.
4
+ *
5
+ * Four builtins:
6
+ *
7
+ * - `admin` — granted by an admin via `role_grant_offer_create` (subject to
8
+ * the consumer's `authorize` callback) or admin-side direct grant.
9
+ * - `self_service` — toggled by the holder themselves via
10
+ * `self_service_role_set` (allowlisted by `eligible_roles`).
11
+ * - `system` — granted by system code paths (signup, automation, etc.)
12
+ * that don't fit either of the above.
13
+ * - `bootstrap` — granted exactly once during the bootstrap flow
14
+ * (`keeper`, `admin` on a fresh install).
15
+ *
16
+ * Open registry on top so consumers can declare additional paths
17
+ * (e.g. `'invite_only'`, `'sso_assertion'`) without an upstream release.
18
+ * `RoleSpec.grant_paths` references entries from this registry; the
19
+ * default for `admin_actions.grantable_roles` is `grant_paths.includes('admin')`,
20
+ * the default for `self_service_role_actions` eligibility is
21
+ * `grant_paths.includes('self_service')`. Mirrors the open-registry
22
+ * pattern used for `RoleName`, `ScopeKindName`, `CredentialTypeName`,
23
+ * and `AuditEventTypeName`.
24
+ *
25
+ * @module
26
+ */
27
+ import { z } from 'zod';
28
+ /**
29
+ * Letter (lowercase a-z) start and end (or single letter), with letters
30
+ * and underscores in between. Mirrors `RoleName`, `ScopeKindName`,
31
+ * `CredentialTypeName`. Rejects empty strings, leading or trailing
32
+ * underscores, uppercase, and digits.
33
+ */
34
+ export declare const GRANT_PATH_NAME_REGEX: RegExp;
35
+ /** Zod schema for valid grant-path name strings. */
36
+ export declare const GrantPathName: z.ZodString;
37
+ export type GrantPathName = z.infer<typeof GrantPathName>;
38
+ /** Admin-mediated grant — `role_grant_offer_create` plus admin-direct flows. */
39
+ export declare const GRANT_PATH_ADMIN = "admin";
40
+ /** Self-service grant — caller toggles their own role_grant via `self_service_role_set`. */
41
+ export declare const GRANT_PATH_SELF_SERVICE = "self_service";
42
+ /** System-mediated grant — signup hooks, automation, internal service flows. */
43
+ export declare const GRANT_PATH_SYSTEM = "system";
44
+ /** Bootstrap grant — one-shot flow during the keep's first-run bootstrap. */
45
+ export declare const GRANT_PATH_BOOTSTRAP = "bootstrap";
46
+ /** The builtin grant-path names as a const tuple. */
47
+ export declare const BUILTIN_GRANT_PATHS: readonly ["admin", "self_service", "system", "bootstrap"];
48
+ /** Zod enum for builtin grant paths only. */
49
+ export declare const BuiltinGrantPath: z.ZodEnum<{
50
+ admin: "admin";
51
+ self_service: "self_service";
52
+ system: "system";
53
+ bootstrap: "bootstrap";
54
+ }>;
55
+ export type BuiltinGrantPath = z.infer<typeof BuiltinGrantPath>;
56
+ /**
57
+ * Per-grant-path metadata. `description` is admin-UI-facing copy
58
+ * (mirrors `RoleSpec.description` and `ScopeKindMeta.description`).
59
+ * Open shape so v2 can extend without a breaking change.
60
+ */
61
+ export interface GrantPathMeta {
62
+ description?: string;
63
+ }
64
+ /**
65
+ * Builtin grant-path metadata. Not overridable by consumers.
66
+ *
67
+ * Typed `ReadonlyMap` for the contract — but JS Maps don't honor
68
+ * `Object.freeze` for `.set` / `.delete` / `.clear` (they mutate
69
+ * internal slots, not own properties), so freeze adds no runtime guard
70
+ * here. Read once at startup by `create_grant_path_schema`; runtime
71
+ * mutation has no effect on already-built schemas.
72
+ */
73
+ export declare const BUILTIN_GRANT_PATH_META: ReadonlyMap<string, GrantPathMeta>;
74
+ /** The result of `create_grant_path_schema` — a Zod schema and metadata map. */
75
+ export interface GrantPathSchemaResult {
76
+ /**
77
+ * Zod schema that validates grant-path name strings against the
78
+ * registered set (builtins + consumer-declared). Use at I/O
79
+ * boundaries (admin UIs, codegen) and as the construction-time check
80
+ * inside `create_role_schema` for every `RoleSpec.grant_paths`
81
+ * entry.
82
+ */
83
+ GrantPath: z.ZodType<string>;
84
+ /**
85
+ * Map of every registered grant-path to its metadata. Keyed by
86
+ * name. Read at startup by admin / codegen surfaces.
87
+ */
88
+ grant_paths: ReadonlyMap<string, GrantPathMeta>;
89
+ }
90
+ /**
91
+ * Create a grant-path schema from the builtin set plus optional
92
+ * consumer-declared additions.
93
+ *
94
+ * Builtins (`admin`, `self_service`, `system`, `bootstrap`) are always
95
+ * present; consumer entries that collide with a builtin name throw at
96
+ * construction. Pass the result into `create_role_schema`'s optional
97
+ * `grant_paths` parameter so each role's `grant_paths` entries are
98
+ * validated against this set at construction time.
99
+ *
100
+ * @param consumer_paths - optional consumer-declared grant-path set with optional metadata
101
+ * @returns `{GrantPath, grant_paths}` — Zod schema and metadata map
102
+ *
103
+ * @throws Error if any `consumer_paths` key fails the `GrantPathName` regex, collides with a builtin name, or appears more than once
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * // simple — builtins only
108
+ * const {GrantPath, grant_paths} = create_grant_path_schema();
109
+ *
110
+ * // with consumer extensions
111
+ * const {GrantPath} = create_grant_path_schema({
112
+ * invite_only: {description: 'Granted by claiming a consumer-issued invite.'},
113
+ * });
114
+ * ```
115
+ */
116
+ export declare const create_grant_path_schema: (consumer_paths?: Record<string, GrantPathMeta>) => GrantPathSchemaResult;
117
+ //# sourceMappingURL=grant_path_schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grant_path_schema.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/grant_path_schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,QAAgC,CAAC;AAEnE,oDAAoD;AACpD,eAAO,MAAM,aAAa,aAKxB,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAI1D,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAExC,4FAA4F;AAC5F,eAAO,MAAM,uBAAuB,iBAAiB,CAAC;AAEtD,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAEhD,qDAAqD;AACrD,eAAO,MAAM,mBAAmB,2DAKtB,CAAC;AAEX,6CAA6C;AAC7C,eAAO,MAAM,gBAAgB;;;;;EAA8B,CAAC;AAC5D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAuBrE,CAAC;AAEH,gFAAgF;AAChF,MAAM,WAAW,qBAAqB;IACrC;;;;;;OAMG;IACH,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B;;;OAGG;IACH,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,wBAAwB,GACpC,iBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,CAAM,KAChD,qBA2BF,CAAC"}