@fuzdev/fuz_app 0.55.0 → 0.57.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 (333) hide show
  1. package/dist/actions/CLAUDE.md +211 -155
  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 +19 -0
  6. package/dist/actions/action_codegen.d.ts.map +1 -1
  7. package/dist/actions/action_codegen.js +20 -14
  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 +110 -44
  11. package/dist/actions/action_rpc.d.ts.map +1 -1
  12. package/dist/actions/action_rpc.js +92 -287
  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 +44 -38
  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 +2 -10
  34. package/dist/actions/register_ws_endpoint.d.ts.map +1 -1
  35. package/dist/actions/register_ws_endpoint.js +32 -10
  36. package/dist/actions/transports_ws_auth_guard.d.ts +1 -1
  37. package/dist/actions/transports_ws_auth_guard.js +1 -1
  38. package/dist/actions/transports_ws_backend.d.ts +1 -1
  39. package/dist/actions/transports_ws_backend.js +1 -1
  40. package/dist/auth/CLAUDE.md +673 -442
  41. package/dist/auth/account_action_specs.d.ts +28 -7
  42. package/dist/auth/account_action_specs.d.ts.map +1 -1
  43. package/dist/auth/account_action_specs.js +7 -7
  44. package/dist/auth/account_actions.d.ts +8 -14
  45. package/dist/auth/account_actions.d.ts.map +1 -1
  46. package/dist/auth/account_actions.js +26 -32
  47. package/dist/auth/account_queries.d.ts +46 -13
  48. package/dist/auth/account_queries.d.ts.map +1 -1
  49. package/dist/auth/account_queries.js +73 -33
  50. package/dist/auth/account_routes.d.ts +4 -3
  51. package/dist/auth/account_routes.d.ts.map +1 -1
  52. package/dist/auth/account_routes.js +58 -33
  53. package/dist/auth/account_schema.d.ts +46 -54
  54. package/dist/auth/account_schema.d.ts.map +1 -1
  55. package/dist/auth/account_schema.js +21 -48
  56. package/dist/auth/admin_action_specs.d.ts +55 -21
  57. package/dist/auth/admin_action_specs.d.ts.map +1 -1
  58. package/dist/auth/admin_action_specs.js +42 -26
  59. package/dist/auth/admin_actions.d.ts +14 -21
  60. package/dist/auth/admin_actions.d.ts.map +1 -1
  61. package/dist/auth/admin_actions.js +47 -44
  62. package/dist/auth/audit_emitter.d.ts +160 -0
  63. package/dist/auth/audit_emitter.d.ts.map +1 -0
  64. package/dist/auth/audit_emitter.js +83 -0
  65. package/dist/auth/audit_log_queries.d.ts +17 -87
  66. package/dist/auth/audit_log_queries.d.ts.map +1 -1
  67. package/dist/auth/audit_log_queries.js +17 -96
  68. package/dist/auth/audit_log_routes.d.ts +1 -1
  69. package/dist/auth/audit_log_routes.d.ts.map +1 -1
  70. package/dist/auth/audit_log_routes.js +7 -3
  71. package/dist/auth/audit_log_schema.d.ts +48 -42
  72. package/dist/auth/audit_log_schema.d.ts.map +1 -1
  73. package/dist/auth/audit_log_schema.js +56 -43
  74. package/dist/auth/auth_guard_resolver.d.ts +44 -0
  75. package/dist/auth/auth_guard_resolver.d.ts.map +1 -0
  76. package/dist/auth/auth_guard_resolver.js +56 -0
  77. package/dist/auth/bootstrap_account.d.ts +7 -7
  78. package/dist/auth/bootstrap_account.d.ts.map +1 -1
  79. package/dist/auth/bootstrap_account.js +7 -7
  80. package/dist/auth/bootstrap_routes.d.ts.map +1 -1
  81. package/dist/auth/bootstrap_routes.js +11 -10
  82. package/dist/auth/cleanup.d.ts +20 -26
  83. package/dist/auth/cleanup.d.ts.map +1 -1
  84. package/dist/auth/cleanup.js +33 -47
  85. package/dist/auth/credential_type_schema.d.ts +115 -0
  86. package/dist/auth/credential_type_schema.d.ts.map +1 -0
  87. package/dist/auth/credential_type_schema.js +127 -0
  88. package/dist/auth/daemon_token_middleware.d.ts +1 -1
  89. package/dist/auth/daemon_token_middleware.js +3 -3
  90. package/dist/auth/ddl.d.ts +2 -2
  91. package/dist/auth/ddl.d.ts.map +1 -1
  92. package/dist/auth/ddl.js +6 -6
  93. package/dist/auth/deps.d.ts +7 -32
  94. package/dist/auth/deps.d.ts.map +1 -1
  95. package/dist/auth/grant_path_schema.d.ts +117 -0
  96. package/dist/auth/grant_path_schema.d.ts.map +1 -0
  97. package/dist/auth/grant_path_schema.js +137 -0
  98. package/dist/auth/invite_queries.d.ts +12 -1
  99. package/dist/auth/invite_queries.d.ts.map +1 -1
  100. package/dist/auth/invite_queries.js +12 -1
  101. package/dist/auth/invite_schema.d.ts +1 -1
  102. package/dist/auth/invite_schema.d.ts.map +1 -1
  103. package/dist/auth/invite_schema.js +1 -1
  104. package/dist/auth/middleware.d.ts.map +1 -1
  105. package/dist/auth/middleware.js +5 -2
  106. package/dist/auth/migrations.d.ts +22 -7
  107. package/dist/auth/migrations.d.ts.map +1 -1
  108. package/dist/auth/migrations.js +64 -25
  109. package/dist/auth/request_context.d.ts +157 -170
  110. package/dist/auth/request_context.d.ts.map +1 -1
  111. package/dist/auth/request_context.js +224 -268
  112. package/dist/auth/{permit_offer_action_specs.d.ts → role_grant_offer_action_specs.d.ts} +130 -100
  113. package/dist/auth/role_grant_offer_action_specs.d.ts.map +1 -0
  114. package/dist/auth/role_grant_offer_action_specs.js +262 -0
  115. package/dist/auth/role_grant_offer_actions.d.ts +104 -0
  116. package/dist/auth/role_grant_offer_actions.d.ts.map +1 -0
  117. package/dist/auth/{permit_offer_actions.js → role_grant_offer_actions.js} +153 -140
  118. package/dist/auth/{permit_offer_notifications.d.ts → role_grant_offer_notifications.d.ts} +80 -70
  119. package/dist/auth/role_grant_offer_notifications.d.ts.map +1 -0
  120. package/dist/auth/role_grant_offer_notifications.js +182 -0
  121. package/dist/auth/{permit_offer_queries.d.ts → role_grant_offer_queries.d.ts} +64 -64
  122. package/dist/auth/role_grant_offer_queries.d.ts.map +1 -0
  123. package/dist/auth/{permit_offer_queries.js → role_grant_offer_queries.js} +136 -123
  124. package/dist/auth/role_grant_offer_schema.d.ts +150 -0
  125. package/dist/auth/role_grant_offer_schema.d.ts.map +1 -0
  126. package/dist/auth/{permit_offer_schema.js → role_grant_offer_schema.js} +55 -36
  127. package/dist/auth/role_grant_queries.d.ts +231 -0
  128. package/dist/auth/role_grant_queries.d.ts.map +1 -0
  129. package/dist/auth/role_grant_queries.js +320 -0
  130. package/dist/auth/role_schema.d.ts +150 -40
  131. package/dist/auth/role_schema.d.ts.map +1 -1
  132. package/dist/auth/role_schema.js +144 -45
  133. package/dist/auth/scope_kind_schema.d.ts +96 -0
  134. package/dist/auth/scope_kind_schema.d.ts.map +1 -0
  135. package/dist/auth/scope_kind_schema.js +94 -0
  136. package/dist/auth/self_service_role_action_specs.d.ts +4 -1
  137. package/dist/auth/self_service_role_action_specs.d.ts.map +1 -1
  138. package/dist/auth/self_service_role_action_specs.js +2 -2
  139. package/dist/auth/self_service_role_actions.d.ts +35 -29
  140. package/dist/auth/self_service_role_actions.d.ts.map +1 -1
  141. package/dist/auth/self_service_role_actions.js +58 -48
  142. package/dist/auth/session_cookie.d.ts +43 -6
  143. package/dist/auth/session_cookie.d.ts.map +1 -1
  144. package/dist/auth/session_cookie.js +31 -5
  145. package/dist/auth/session_middleware.d.ts +37 -3
  146. package/dist/auth/session_middleware.d.ts.map +1 -1
  147. package/dist/auth/session_middleware.js +33 -7
  148. package/dist/auth/signup_routes.d.ts.map +1 -1
  149. package/dist/auth/signup_routes.js +48 -19
  150. package/dist/auth/standard_action_specs.d.ts +2 -2
  151. package/dist/auth/standard_action_specs.js +4 -4
  152. package/dist/auth/standard_rpc_actions.d.ts +23 -19
  153. package/dist/auth/standard_rpc_actions.d.ts.map +1 -1
  154. package/dist/auth/standard_rpc_actions.js +12 -12
  155. package/dist/db/migrate.d.ts +1 -1
  156. package/dist/db/migrate.js +1 -1
  157. package/dist/dev/setup.d.ts +2 -2
  158. package/dist/dev/setup.d.ts.map +1 -1
  159. package/dist/dev/setup.js +4 -4
  160. package/dist/env/load.d.ts +1 -1
  161. package/dist/env/load.js +1 -1
  162. package/dist/hono_context.d.ts +27 -45
  163. package/dist/hono_context.d.ts.map +1 -1
  164. package/dist/hono_context.js +14 -28
  165. package/dist/http/CLAUDE.md +235 -121
  166. package/dist/http/auth_shape.d.ts +191 -0
  167. package/dist/http/auth_shape.d.ts.map +1 -0
  168. package/dist/http/auth_shape.js +237 -0
  169. package/dist/http/common_routes.js +3 -3
  170. package/dist/http/db_routes.d.ts +4 -0
  171. package/dist/http/db_routes.d.ts.map +1 -1
  172. package/dist/http/db_routes.js +44 -7
  173. package/dist/http/error_schemas.d.ts +72 -39
  174. package/dist/http/error_schemas.d.ts.map +1 -1
  175. package/dist/http/error_schemas.js +81 -33
  176. package/dist/http/pending_effects.d.ts +71 -18
  177. package/dist/http/pending_effects.d.ts.map +1 -1
  178. package/dist/http/pending_effects.js +87 -18
  179. package/dist/http/proxy.d.ts +52 -5
  180. package/dist/http/proxy.d.ts.map +1 -1
  181. package/dist/http/proxy.js +92 -14
  182. package/dist/http/route_spec.d.ts +89 -75
  183. package/dist/http/route_spec.d.ts.map +1 -1
  184. package/dist/http/route_spec.js +54 -72
  185. package/dist/http/schema_helpers.d.ts +3 -14
  186. package/dist/http/schema_helpers.d.ts.map +1 -1
  187. package/dist/http/schema_helpers.js +2 -14
  188. package/dist/http/surface.d.ts +2 -10
  189. package/dist/http/surface.d.ts.map +1 -1
  190. package/dist/http/surface.js +3 -4
  191. package/dist/http/surface_query.d.ts +39 -35
  192. package/dist/http/surface_query.d.ts.map +1 -1
  193. package/dist/http/surface_query.js +79 -36
  194. package/dist/primitive_schemas.d.ts +39 -0
  195. package/dist/primitive_schemas.d.ts.map +1 -0
  196. package/dist/primitive_schemas.js +40 -0
  197. package/dist/realtime/sse_auth_guard.d.ts +5 -5
  198. package/dist/realtime/sse_auth_guard.js +9 -9
  199. package/dist/runtime/mock.d.ts +1 -1
  200. package/dist/runtime/mock.js +1 -1
  201. package/dist/server/app_backend.d.ts +14 -11
  202. package/dist/server/app_backend.d.ts.map +1 -1
  203. package/dist/server/app_backend.js +12 -8
  204. package/dist/server/app_server.d.ts +7 -7
  205. package/dist/server/app_server.d.ts.map +1 -1
  206. package/dist/server/app_server.js +35 -40
  207. package/dist/server/validate_nginx.d.ts +1 -1
  208. package/dist/server/validate_nginx.js +1 -1
  209. package/dist/testing/CLAUDE.md +50 -38
  210. package/dist/testing/admin_integration.d.ts +5 -6
  211. package/dist/testing/admin_integration.d.ts.map +1 -1
  212. package/dist/testing/admin_integration.js +87 -85
  213. package/dist/testing/app_server.d.ts +11 -14
  214. package/dist/testing/app_server.d.ts.map +1 -1
  215. package/dist/testing/app_server.js +16 -15
  216. package/dist/testing/assertions.d.ts.map +1 -1
  217. package/dist/testing/assertions.js +2 -1
  218. package/dist/testing/attack_surface.d.ts.map +1 -1
  219. package/dist/testing/attack_surface.js +15 -9
  220. package/dist/testing/audit_completeness.d.ts +2 -2
  221. package/dist/testing/audit_completeness.d.ts.map +1 -1
  222. package/dist/testing/audit_completeness.js +36 -36
  223. package/dist/testing/auth_apps.d.ts +5 -4
  224. package/dist/testing/auth_apps.d.ts.map +1 -1
  225. package/dist/testing/auth_apps.js +22 -19
  226. package/dist/testing/data_exposure.d.ts.map +1 -1
  227. package/dist/testing/data_exposure.js +5 -5
  228. package/dist/testing/db.d.ts +1 -1
  229. package/dist/testing/db.d.ts.map +1 -1
  230. package/dist/testing/db.js +4 -4
  231. package/dist/testing/db_entities.d.ts +22 -0
  232. package/dist/testing/db_entities.d.ts.map +1 -0
  233. package/dist/testing/db_entities.js +28 -0
  234. package/dist/testing/entities.d.ts +8 -7
  235. package/dist/testing/entities.d.ts.map +1 -1
  236. package/dist/testing/entities.js +21 -18
  237. package/dist/testing/integration.d.ts.map +1 -1
  238. package/dist/testing/integration.js +13 -14
  239. package/dist/testing/integration_helpers.d.ts +4 -4
  240. package/dist/testing/integration_helpers.d.ts.map +1 -1
  241. package/dist/testing/integration_helpers.js +20 -18
  242. package/dist/testing/middleware.d.ts +4 -4
  243. package/dist/testing/middleware.d.ts.map +1 -1
  244. package/dist/testing/middleware.js +12 -11
  245. package/dist/testing/rpc_attack_surface.d.ts.map +1 -1
  246. package/dist/testing/rpc_attack_surface.js +40 -24
  247. package/dist/testing/rpc_round_trip.d.ts +1 -1
  248. package/dist/testing/rpc_round_trip.d.ts.map +1 -1
  249. package/dist/testing/rpc_round_trip.js +14 -13
  250. package/dist/testing/sse_round_trip.d.ts +3 -4
  251. package/dist/testing/sse_round_trip.d.ts.map +1 -1
  252. package/dist/testing/sse_round_trip.js +7 -11
  253. package/dist/testing/standard.d.ts +1 -1
  254. package/dist/testing/stubs.d.ts +25 -0
  255. package/dist/testing/stubs.d.ts.map +1 -1
  256. package/dist/testing/stubs.js +43 -2
  257. package/dist/testing/surface_invariants.d.ts +14 -6
  258. package/dist/testing/surface_invariants.d.ts.map +1 -1
  259. package/dist/testing/surface_invariants.js +119 -43
  260. package/dist/testing/ws_round_trip.d.ts +12 -13
  261. package/dist/testing/ws_round_trip.d.ts.map +1 -1
  262. package/dist/testing/ws_round_trip.js +19 -11
  263. package/dist/ui/AdminAccounts.svelte +23 -20
  264. package/dist/ui/AdminOverview.svelte +15 -13
  265. package/dist/ui/AdminOverview.svelte.d.ts.map +1 -1
  266. package/dist/ui/{AdminPermitHistory.svelte → AdminRoleGrantHistory.svelte} +12 -12
  267. package/dist/ui/AdminRoleGrantHistory.svelte.d.ts +4 -0
  268. package/dist/ui/AdminRoleGrantHistory.svelte.d.ts.map +1 -0
  269. package/dist/ui/BootstrapForm.svelte +1 -1
  270. package/dist/ui/CLAUDE.md +60 -60
  271. package/dist/ui/{PermitOfferForm.svelte → RoleGrantOfferForm.svelte} +27 -26
  272. package/dist/ui/{PermitOfferForm.svelte.d.ts → RoleGrantOfferForm.svelte.d.ts} +7 -7
  273. package/dist/ui/RoleGrantOfferForm.svelte.d.ts.map +1 -0
  274. package/dist/ui/{PermitOfferHistory.svelte → RoleGrantOfferHistory.svelte} +12 -12
  275. package/dist/ui/{PermitOfferHistory.svelte.d.ts → RoleGrantOfferHistory.svelte.d.ts} +4 -4
  276. package/dist/ui/RoleGrantOfferHistory.svelte.d.ts.map +1 -0
  277. package/dist/ui/{PermitOfferInbox.svelte → RoleGrantOfferInbox.svelte} +14 -14
  278. package/dist/ui/{PermitOfferInbox.svelte.d.ts → RoleGrantOfferInbox.svelte.d.ts} +4 -4
  279. package/dist/ui/RoleGrantOfferInbox.svelte.d.ts.map +1 -0
  280. package/dist/ui/SignupForm.svelte +1 -1
  281. package/dist/ui/SurfaceExplorer.svelte +35 -15
  282. package/dist/ui/SurfaceExplorer.svelte.d.ts.map +1 -1
  283. package/dist/ui/account_sessions_state.svelte.d.ts +2 -3
  284. package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -1
  285. package/dist/ui/account_sessions_state.svelte.js +2 -3
  286. package/dist/ui/admin_accounts_state.svelte.d.ts +18 -18
  287. package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -1
  288. package/dist/ui/admin_accounts_state.svelte.js +16 -16
  289. package/dist/ui/admin_rpc_adapters.d.ts +20 -20
  290. package/dist/ui/admin_rpc_adapters.d.ts.map +1 -1
  291. package/dist/ui/admin_rpc_adapters.js +17 -17
  292. package/dist/ui/admin_sessions_state.svelte.d.ts +2 -2
  293. package/dist/ui/admin_sessions_state.svelte.js +2 -2
  294. package/dist/ui/audit_log_state.svelte.d.ts +7 -7
  295. package/dist/ui/audit_log_state.svelte.d.ts.map +1 -1
  296. package/dist/ui/audit_log_state.svelte.js +6 -6
  297. package/dist/ui/auth_state.svelte.d.ts +3 -3
  298. package/dist/ui/auth_state.svelte.d.ts.map +1 -1
  299. package/dist/ui/auth_state.svelte.js +6 -6
  300. package/dist/ui/format_scope.d.ts +2 -2
  301. package/dist/ui/format_scope.js +2 -2
  302. package/dist/ui/{permit_offers_state.svelte.d.ts → role_grant_offers_state.svelte.d.ts} +30 -30
  303. package/dist/ui/role_grant_offers_state.svelte.d.ts.map +1 -0
  304. package/dist/ui/{permit_offers_state.svelte.js → role_grant_offers_state.svelte.js} +18 -18
  305. package/dist/ui/ui_format.js +2 -2
  306. package/package.json +3 -3
  307. package/dist/auth/permit_offer_action_specs.d.ts.map +0 -1
  308. package/dist/auth/permit_offer_action_specs.js +0 -258
  309. package/dist/auth/permit_offer_actions.d.ts +0 -110
  310. package/dist/auth/permit_offer_actions.d.ts.map +0 -1
  311. package/dist/auth/permit_offer_notifications.d.ts.map +0 -1
  312. package/dist/auth/permit_offer_notifications.js +0 -182
  313. package/dist/auth/permit_offer_queries.d.ts.map +0 -1
  314. package/dist/auth/permit_offer_schema.d.ts +0 -125
  315. package/dist/auth/permit_offer_schema.d.ts.map +0 -1
  316. package/dist/auth/permit_queries.d.ts +0 -222
  317. package/dist/auth/permit_queries.d.ts.map +0 -1
  318. package/dist/auth/permit_queries.js +0 -305
  319. package/dist/auth/require_keeper.d.ts +0 -20
  320. package/dist/auth/require_keeper.d.ts.map +0 -1
  321. package/dist/auth/require_keeper.js +0 -35
  322. package/dist/auth/route_guards.d.ts +0 -27
  323. package/dist/auth/route_guards.d.ts.map +0 -1
  324. package/dist/auth/route_guards.js +0 -38
  325. package/dist/auth/session_lifecycle.d.ts +0 -37
  326. package/dist/auth/session_lifecycle.d.ts.map +0 -1
  327. package/dist/auth/session_lifecycle.js +0 -29
  328. package/dist/ui/AdminPermitHistory.svelte.d.ts +0 -4
  329. package/dist/ui/AdminPermitHistory.svelte.d.ts.map +0 -1
  330. package/dist/ui/PermitOfferForm.svelte.d.ts.map +0 -1
  331. package/dist/ui/PermitOfferHistory.svelte.d.ts.map +0 -1
  332. package/dist/ui/PermitOfferInbox.svelte.d.ts.map +0 -1
  333. package/dist/ui/permit_offers_state.svelte.d.ts.map +0 -1
@@ -1,305 +0,0 @@
1
- /**
2
- * Permit database queries.
3
- *
4
- * Permits are time-bounded, revocable grants of a role to an actor.
5
- * The system is safe by default — no permit, no capability.
6
- *
7
- * @module
8
- */
9
- import { assert_row } from '../db/assert_row.js';
10
- import { PERMIT_OFFER_SCOPE_SENTINEL_UUID } from './permit_offer_schema.js';
11
- /**
12
- * Grant a permit to an actor.
13
- * Idempotent — if an active permit already exists for this actor, role, and
14
- * scope, returns the existing permit instead of creating a duplicate.
15
- *
16
- * The `ON CONFLICT` target and the fallback `SELECT` both collapse `NULL`
17
- * scopes via the same sentinel used by the partial unique index
18
- * (`permit_actor_role_scope_active_unique`). The `IS NOT DISTINCT FROM`
19
- * form on the fallback is deliberate — plain `=` would miss the
20
- * NULL-scope case where the conflict fired.
21
- *
22
- * @param deps - query dependencies
23
- * @param input - the permit fields
24
- * @returns the created or existing active permit
25
- * @mutates `permit` table - inserts a row when no active permit matches `(actor_id, role, scope_id)`
26
- */
27
- export const query_grant_permit = async (deps, input) => {
28
- const inserted = await deps.db.query_one(`INSERT INTO permit (actor_id, role, scope_id, expires_at, granted_by, source_offer_id)
29
- VALUES ($1, $2, $3, $4, $5, $6)
30
- ON CONFLICT (actor_id, role, COALESCE(scope_id, '${PERMIT_OFFER_SCOPE_SENTINEL_UUID}'::uuid))
31
- WHERE revoked_at IS NULL
32
- DO NOTHING
33
- RETURNING *`, [
34
- input.actor_id,
35
- input.role,
36
- input.scope_id ?? null,
37
- input.expires_at?.toISOString() ?? null,
38
- input.granted_by ?? null,
39
- input.source_offer_id ?? null,
40
- ]);
41
- if (inserted)
42
- return inserted;
43
- // Active permit already exists — return it (idempotent grant).
44
- const existing = await deps.db.query_one(`SELECT * FROM permit
45
- WHERE actor_id = $1
46
- AND role = $2
47
- AND scope_id IS NOT DISTINCT FROM $3
48
- AND revoked_at IS NULL`, [input.actor_id, input.role, input.scope_id ?? null]);
49
- return assert_row(existing, 'idempotent permit grant');
50
- };
51
- /**
52
- * Look up the role of an active permit (constrained to a specific
53
- * actor) plus the actor's `account_id`.
54
- *
55
- * Used by admin routes to inspect the permit's role before acting
56
- * (e.g., enforcing `web_grantable` on revoke). The actor constraint
57
- * mirrors `query_revoke_permit` so IDOR protection is consistent:
58
- * a caller can only see permits belonging to the target actor.
59
- *
60
- * The JOIN to `actor` collapses what used to be a second
61
- * `query_actor_by_id` round-trip in the revoke handler into one read,
62
- * which closes the small TOCTOU window where the actor row could be
63
- * deleted between the IDOR check and the actor lookup. The `account_id`
64
- * is needed by the audit envelope's `target_account_id` field and the
65
- * SSE/WS socket-close fan-out targeting.
66
- *
67
- * Returns `null` if the permit is not found, already revoked, or
68
- * belongs to a different actor.
69
- *
70
- * @param deps - query dependencies
71
- * @param permit_id - the permit id to look up
72
- * @param actor_id - the actor that must own the permit
73
- * @returns `{role, account_id}` on a match, or `null`
74
- */
75
- export const query_permit_find_active_role_for_actor = async (deps, permit_id, actor_id) => {
76
- const row = await deps.db.query_one(`SELECT permit.role, actor.account_id
77
- FROM permit
78
- JOIN actor ON actor.id = permit.actor_id
79
- WHERE permit.id = $1 AND permit.actor_id = $2 AND permit.revoked_at IS NULL`, [permit_id, actor_id]);
80
- return row ?? null;
81
- };
82
- /**
83
- * Revoke a permit by id, constrained to a specific actor.
84
- *
85
- * Requires `actor_id` to prevent cross-account revocation (IDOR guard).
86
- * Returns `null` if the permit is not found, already revoked, or belongs
87
- * to a different actor.
88
- *
89
- * Supersedes any pending offers for the revoked permit's
90
- * `(to_account, role, scope)` in the same transaction. Prevents the
91
- * "accept a pre-revoke offer to bypass the revoke" path — any stale
92
- * offer becomes terminal at revoke time. A fresh post-revoke grant
93
- * requires the grantor to call `query_permit_offer_create` again.
94
- *
95
- * @param deps - query dependencies
96
- * @param permit_id - the permit to revoke
97
- * @param actor_id - the actor that must own the permit
98
- * @param revoked_by - the actor who revoked it (for audit trail)
99
- * @param reason - optional free-form reason, stamped on `permit.revoked_reason` and surfaced to the revokee notification.
100
- * @mutates `permit` row - sets `revoked_at`, `revoked_by`, and `revoked_reason`
101
- * @mutates `permit_offer` rows - stamps `superseded_at` on every pending sibling for the same `(account, role, scope)`
102
- */
103
- export const query_revoke_permit = async (deps, permit_id, actor_id, revoked_by, reason) => {
104
- const rows = await deps.db.query(`UPDATE permit SET revoked_at = NOW(), revoked_by = $3, revoked_reason = $4
105
- WHERE id = $1 AND actor_id = $2 AND revoked_at IS NULL
106
- RETURNING id, role, scope_id`, [permit_id, actor_id, revoked_by ?? null, reason ?? null]);
107
- const revoked = rows[0];
108
- if (!revoked)
109
- return null;
110
- // CTE joins `actor` after the UPDATE so each superseded row carries the
111
- // grantor's `account_id` — callers fan out `permit_offer_supersede`
112
- // notifications to that account without a second round-trip.
113
- const superseded_offers = await deps.db.query(`WITH updated AS (
114
- UPDATE permit_offer o
115
- SET superseded_at = NOW()
116
- FROM actor a
117
- WHERE a.id = $1
118
- AND o.to_account_id = a.account_id
119
- AND o.role = $2
120
- AND o.scope_id IS NOT DISTINCT FROM $3
121
- AND o.accepted_at IS NULL
122
- AND o.declined_at IS NULL
123
- AND o.retracted_at IS NULL
124
- AND o.superseded_at IS NULL
125
- RETURNING o.*
126
- )
127
- SELECT u.*, grantor.account_id AS from_account_id
128
- FROM updated u
129
- JOIN actor grantor ON grantor.id = u.from_actor_id`, [actor_id, revoked.role, revoked.scope_id]);
130
- return {
131
- id: revoked.id,
132
- role: revoked.role,
133
- scope_id: revoked.scope_id,
134
- superseded_offers,
135
- };
136
- };
137
- /**
138
- * Find all active (non-revoked, non-expired) permits for an actor.
139
- */
140
- export const query_permit_find_active_for_actor = async (deps, actor_id) => {
141
- return deps.db.query(`SELECT * FROM permit
142
- WHERE actor_id = $1
143
- AND revoked_at IS NULL
144
- AND (expires_at IS NULL OR expires_at > NOW())
145
- ORDER BY created_at`, [actor_id]);
146
- };
147
- /**
148
- * Check if an actor has an active permit for a given role.
149
- *
150
- * The `scope_id` parameter selects between global and scoped checks:
151
- * - Omitted or `null` — matches a global permit (`scope_id IS NULL`).
152
- * Pre-scope callers keep their existing semantics.
153
- * - A scope uuid — matches a permit bound to that exact scope.
154
- *
155
- * The `IS NOT DISTINCT FROM` comparison handles the NULL case uniformly.
156
- */
157
- export const query_permit_has_role = async (deps, actor_id, role, scope_id) => {
158
- const row = await deps.db.query_one(`SELECT EXISTS(
159
- SELECT 1 FROM permit
160
- WHERE actor_id = $1
161
- AND role = $2
162
- AND scope_id IS NOT DISTINCT FROM $3
163
- AND revoked_at IS NULL
164
- AND (expires_at IS NULL OR expires_at > NOW())
165
- ) AS exists`, [actor_id, role, scope_id ?? null]);
166
- return row?.exists ?? false;
167
- };
168
- /**
169
- * List all permits for an actor (including revoked/expired).
170
- */
171
- export const query_permit_list_for_actor = async (deps, actor_id) => {
172
- return deps.db.query(`SELECT * FROM permit WHERE actor_id = $1 ORDER BY created_at DESC`, [actor_id]);
173
- };
174
- /**
175
- * Find the account ID of an account that holds an active permit for a given role.
176
- *
177
- * Joins permit → actor → account. Returns the first match, or `null` if none.
178
- *
179
- * @param deps - query dependencies
180
- * @param role - the role to search for
181
- * @returns the account ID, or `null`
182
- */
183
- export const query_permit_find_account_id_for_role = async (deps, role) => {
184
- const row = await deps.db.query_one(`SELECT a.id AS account_id
185
- FROM permit p
186
- JOIN actor act ON act.id = p.actor_id
187
- JOIN account a ON a.id = act.account_id
188
- WHERE p.role = $1
189
- AND p.revoked_at IS NULL
190
- AND (p.expires_at IS NULL OR p.expires_at > NOW())
191
- LIMIT 1`, [role]);
192
- return row?.account_id ?? null;
193
- };
194
- /**
195
- * Revoke every active permit bound to a scope and supersede every pending
196
- * offer at the scope, in one cascade.
197
- *
198
- * Use this from a consumer's parent-scope delete handler (e.g., classroom
199
- * deletion) — `permit.scope_id` and `permit_offer.scope_id` are polymorphic
200
- * with no FK constraint by design, so a parent row deletion would otherwise
201
- * orphan permits and offers. The cascade is **role-agnostic**: anything
202
- * attached to the destroyed scope is cleaned up.
203
- *
204
- * Both updates run as separate statements inside the caller's transaction
205
- * (mirrors `query_permit_revoke_role`'s shape). The two halves are
206
- * independent — orphan pending offers can exist at a scope with no active
207
- * permits, so the supersede half always runs even when no permit was
208
- * revoked.
209
- *
210
- * @param deps - query dependencies
211
- * @param scope_id - the scope whose permits and offers to terminate
212
- * @param revoked_by - the actor performing the cascade (audit trail)
213
- * @param reason - optional free-form reason, stamped on `permit.revoked_reason`.
214
- * @returns the revoked permits (with `account_id` for fan-out) and superseded offers (with `from_account_id` for fan-out)
215
- * @mutates `permit` table - sets `revoked_at`/`revoked_by`/`revoked_reason` on every active row at `scope_id`
216
- * @mutates `permit_offer` table - stamps `superseded_at` on every pending row at `scope_id`
217
- */
218
- export const query_permit_revoke_for_scope = async (deps, scope_id, revoked_by, reason) => {
219
- // Revoke every active permit at the scope. CTE returns `actor_id` directly
220
- // from the permit row (drives `target_actor_id` audit envelopes); a join
221
- // against `actor` resolves `account_id` for `target_account_id`
222
- // + WS/SSE socket-close fan-out, all in one round-trip.
223
- const revoked = await deps.db.query(`WITH updated AS (
224
- UPDATE permit
225
- SET revoked_at = NOW(), revoked_by = $2, revoked_reason = $3
226
- WHERE scope_id = $1 AND revoked_at IS NULL
227
- RETURNING id, role, scope_id, actor_id
228
- )
229
- SELECT u.id AS permit_id, u.role, u.scope_id, u.actor_id, a.account_id
230
- FROM updated u
231
- JOIN actor a ON a.id = u.actor_id`, [scope_id, revoked_by ?? null, reason ?? null]);
232
- // Supersede every pending offer at the scope — tuple-matched or orphan,
233
- // no distinction. The cause of every supersede in this cascade is the
234
- // scope deletion; offers tuple-matched to a revoked permit are not
235
- // tagged separately because the revoke is itself a consequence of the
236
- // scope going away.
237
- const superseded_offers = await deps.db.query(`WITH updated AS (
238
- UPDATE permit_offer o
239
- SET superseded_at = NOW()
240
- WHERE o.scope_id = $1
241
- AND o.accepted_at IS NULL
242
- AND o.declined_at IS NULL
243
- AND o.retracted_at IS NULL
244
- AND o.superseded_at IS NULL
245
- RETURNING o.*
246
- )
247
- SELECT u.*, grantor.account_id AS from_account_id
248
- FROM updated u
249
- JOIN actor grantor ON grantor.id = u.from_actor_id`, [scope_id]);
250
- return { revoked, superseded_offers };
251
- };
252
- /**
253
- * Revoke every active permit an actor holds for a given role.
254
- *
255
- * With scoped permits a single actor+role tuple can hold several active
256
- * permits (one per scope), so this revokes all of them. Pass
257
- * `query_revoke_permit(permit_id, ...)` when a single scoped permit
258
- * is the target.
259
- *
260
- * Also supersedes pending offers for the actor's account across every
261
- * scope of this role (the actor can no longer hold the role, so any
262
- * pending offer of the same role is a bypass vector).
263
- *
264
- * @param deps - query dependencies
265
- * @param actor_id - the actor whose permits to revoke
266
- * @param role - the role to revoke
267
- * @param revoked_by - the actor who revoked it (for audit trail)
268
- * @param reason - optional free-form reason, stamped on `permit.revoked_reason`.
269
- * @returns the list of revoked permits (empty if none were active) and superseded pending offers
270
- * @mutates `permit` table - sets `revoked_at`/`revoked_by`/`revoked_reason` on every active row for `(actor, role)`
271
- * @mutates `permit_offer` table - stamps `superseded_at` on every matching pending offer
272
- */
273
- export const query_permit_revoke_role = async (deps, actor_id, role, revoked_by, reason) => {
274
- // CTE pulls the revokee's `account_id` via a join on `actor` so callers
275
- // can address the revokee without an extra round-trip.
276
- const revoked = await deps.db.query(`WITH updated AS (
277
- UPDATE permit
278
- SET revoked_at = NOW(), revoked_by = $3, revoked_reason = $4
279
- WHERE actor_id = $1 AND role = $2 AND revoked_at IS NULL
280
- RETURNING id, role, scope_id, actor_id
281
- )
282
- SELECT u.id AS permit_id, u.role, u.scope_id, a.account_id
283
- FROM updated u
284
- JOIN actor a ON a.id = u.actor_id`, [actor_id, role, revoked_by ?? null, reason ?? null]);
285
- if (revoked.length === 0) {
286
- return { revoked: [], superseded_offers: [] };
287
- }
288
- const superseded_offers = await deps.db.query(`WITH updated AS (
289
- UPDATE permit_offer o
290
- SET superseded_at = NOW()
291
- FROM actor a
292
- WHERE a.id = $1
293
- AND o.to_account_id = a.account_id
294
- AND o.role = $2
295
- AND o.accepted_at IS NULL
296
- AND o.declined_at IS NULL
297
- AND o.retracted_at IS NULL
298
- AND o.superseded_at IS NULL
299
- RETURNING o.*
300
- )
301
- SELECT u.*, grantor.account_id AS from_account_id
302
- FROM updated u
303
- JOIN actor grantor ON grantor.id = u.from_actor_id`, [actor_id, role]);
304
- return { revoked, superseded_offers };
305
- };
@@ -1,20 +0,0 @@
1
- /**
2
- * Keeper credential type guard.
3
- *
4
- * Two-part check:
5
- * 1. Credential type must be `daemon_token` (not session cookie, not API token).
6
- * 2. Account must hold active keeper permit.
7
- *
8
- * Both must pass. A session cookie from the bootstrap account still fails check #1.
9
- *
10
- * @module
11
- */
12
- import type { MiddlewareHandler } from 'hono';
13
- /**
14
- * Middleware that requires keeper credentials.
15
- *
16
- * Returns 401 if unauthenticated, 403 if credential type is not
17
- * `daemon_token` or if the keeper role is missing.
18
- */
19
- export declare const require_keeper: MiddlewareHandler;
20
- //# sourceMappingURL=require_keeper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"require_keeper.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/require_keeper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,MAAM,CAAC;AAW5C;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,iBAmB5B,CAAC"}
@@ -1,35 +0,0 @@
1
- /**
2
- * Keeper credential type guard.
3
- *
4
- * Two-part check:
5
- * 1. Credential type must be `daemon_token` (not session cookie, not API token).
6
- * 2. Account must hold active keeper permit.
7
- *
8
- * Both must pass. A session cookie from the bootstrap account still fails check #1.
9
- *
10
- * @module
11
- */
12
- import { get_request_context, has_role } from './request_context.js';
13
- import { CREDENTIAL_TYPE_KEY } from '../hono_context.js';
14
- import { ROLE_KEEPER } from './role_schema.js';
15
- import { ERROR_AUTHENTICATION_REQUIRED, ERROR_INSUFFICIENT_PERMISSIONS, ERROR_KEEPER_REQUIRES_DAEMON_TOKEN, } from '../http/error_schemas.js';
16
- /**
17
- * Middleware that requires keeper credentials.
18
- *
19
- * Returns 401 if unauthenticated, 403 if credential type is not
20
- * `daemon_token` or if the keeper role is missing.
21
- */
22
- export const require_keeper = async (c, next) => {
23
- const ctx = get_request_context(c);
24
- if (!ctx) {
25
- return c.json({ error: ERROR_AUTHENTICATION_REQUIRED }, 401);
26
- }
27
- const credential_type = c.get(CREDENTIAL_TYPE_KEY);
28
- if (credential_type !== 'daemon_token') {
29
- return c.json({ error: ERROR_KEEPER_REQUIRES_DAEMON_TOKEN, credential_type: credential_type ?? 'none' }, 403);
30
- }
31
- if (!has_role(ctx, ROLE_KEEPER)) {
32
- return c.json({ error: ERROR_INSUFFICIENT_PERMISSIONS, required_role: ROLE_KEEPER }, 403);
33
- }
34
- await next();
35
- };
@@ -1,27 +0,0 @@
1
- /**
2
- * Auth guard resolver for the route spec system.
3
- *
4
- * Maps `RouteAuth` discriminants to two-phase auth middleware sets.
5
- * `pre_validation` carries the 401 check (`require_auth`) so
6
- * unauthenticated callers never see route-shape information from input
7
- * parse failures. `post_authorization` carries the 403 role / keeper
8
- * checks because they read the `RequestContext` populated by the
9
- * dispatcher's authorization phase.
10
- *
11
- * Injected into `apply_route_specs` to decouple the generic HTTP
12
- * framework (`http/route_spec.ts`) from auth-specific middleware.
13
- *
14
- * @module
15
- */
16
- import type { AuthGuardResolver } from '../http/route_spec.js';
17
- /**
18
- * Standard auth guard resolver for fuz_app.
19
- *
20
- * Maps `RouteAuth` to middleware:
21
- * - `none` → no guards
22
- * - `authenticated` → pre-validation `require_auth`
23
- * - `role` → pre-validation `require_auth` + post-authorization `require_role(role)`
24
- * - `keeper` → pre-validation `require_auth` + post-authorization `require_keeper`
25
- */
26
- export declare const fuz_auth_guard_resolver: AuthGuardResolver;
27
- //# sourceMappingURL=route_guards.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"route_guards.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/route_guards.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAE7D;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,iBAWrC,CAAC"}
@@ -1,38 +0,0 @@
1
- /**
2
- * Auth guard resolver for the route spec system.
3
- *
4
- * Maps `RouteAuth` discriminants to two-phase auth middleware sets.
5
- * `pre_validation` carries the 401 check (`require_auth`) so
6
- * unauthenticated callers never see route-shape information from input
7
- * parse failures. `post_authorization` carries the 403 role / keeper
8
- * checks because they read the `RequestContext` populated by the
9
- * dispatcher's authorization phase.
10
- *
11
- * Injected into `apply_route_specs` to decouple the generic HTTP
12
- * framework (`http/route_spec.ts`) from auth-specific middleware.
13
- *
14
- * @module
15
- */
16
- import { require_auth, require_role } from './request_context.js';
17
- import { require_keeper } from './require_keeper.js';
18
- /**
19
- * Standard auth guard resolver for fuz_app.
20
- *
21
- * Maps `RouteAuth` to middleware:
22
- * - `none` → no guards
23
- * - `authenticated` → pre-validation `require_auth`
24
- * - `role` → pre-validation `require_auth` + post-authorization `require_role(role)`
25
- * - `keeper` → pre-validation `require_auth` + post-authorization `require_keeper`
26
- */
27
- export const fuz_auth_guard_resolver = (auth) => {
28
- switch (auth.type) {
29
- case 'none':
30
- return { pre_validation: [], post_authorization: [] };
31
- case 'authenticated':
32
- return { pre_validation: [require_auth], post_authorization: [] };
33
- case 'role':
34
- return { pre_validation: [require_auth], post_authorization: [require_role(auth.role)] };
35
- case 'keeper':
36
- return { pre_validation: [require_auth], post_authorization: [require_keeper] };
37
- }
38
- };
@@ -1,37 +0,0 @@
1
- /**
2
- * Session lifecycle — creation and cookie management shared across login and bootstrap flows.
3
- *
4
- * @module
5
- */
6
- import type { Context } from 'hono';
7
- import type { Keyring } from './keyring.js';
8
- import { type SessionOptions } from './session_cookie.js';
9
- import type { QueryDeps } from '../db/query_deps.js';
10
- /**
11
- * Options for `create_session_and_set_cookie`.
12
- */
13
- export interface CreateSessionAndSetCookieOptions {
14
- /** Keyring for cookie signing. */
15
- keyring: Keyring;
16
- /** Query deps (needs db for session creation). */
17
- deps: QueryDeps;
18
- /** Hono context for setting the cookie. */
19
- c: Context;
20
- /** The account to create a session for. */
21
- account_id: string;
22
- /** Session cookie configuration. */
23
- session_options: SessionOptions<string>;
24
- /** Per-account session cap (`null` to skip enforcement). */
25
- max_sessions?: number | null;
26
- }
27
- /**
28
- * Create an auth session and set the session cookie on the response.
29
- *
30
- * Shared by login and bootstrap — generates a token, hashes it, persists
31
- * the session row, optionally enforces a per-account session limit, and
32
- * sets the signed cookie.
33
- *
34
- * @mutates `auth_session` table - inserts the new session row (and evicts older rows when `max_sessions` is set)
35
- */
36
- export declare const create_session_and_set_cookie: (options: CreateSessionAndSetCookieOptions) => Promise<void>;
37
- //# sourceMappingURL=session_lifecycle.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session_lifecycle.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/session_lifecycle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAElC,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,EAA8B,KAAK,cAAc,EAAC,MAAM,qBAAqB,CAAC;AASrF,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAChD,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,IAAI,EAAE,SAAS,CAAC;IAChB,2CAA2C;IAC3C,CAAC,EAAE,OAAO,CAAC;IACX,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,6BAA6B,GACzC,SAAS,gCAAgC,KACvC,OAAO,CAAC,IAAI,CAad,CAAC"}
@@ -1,29 +0,0 @@
1
- /**
2
- * Session lifecycle — creation and cookie management shared across login and bootstrap flows.
3
- *
4
- * @module
5
- */
6
- import { create_session_cookie_value } from './session_cookie.js';
7
- import { set_session_cookie } from './session_middleware.js';
8
- import { generate_session_token, hash_session_token, AUTH_SESSION_LIFETIME_MS, query_create_session, query_session_enforce_limit, } from './session_queries.js';
9
- /**
10
- * Create an auth session and set the session cookie on the response.
11
- *
12
- * Shared by login and bootstrap — generates a token, hashes it, persists
13
- * the session row, optionally enforces a per-account session limit, and
14
- * sets the signed cookie.
15
- *
16
- * @mutates `auth_session` table - inserts the new session row (and evicts older rows when `max_sessions` is set)
17
- */
18
- export const create_session_and_set_cookie = async (options) => {
19
- const { keyring, deps, c, account_id, session_options, max_sessions } = options;
20
- const session_token = generate_session_token();
21
- const token_hash = hash_session_token(session_token);
22
- const expires_at = new Date(Date.now() + AUTH_SESSION_LIFETIME_MS);
23
- await query_create_session(deps, token_hash, account_id, expires_at);
24
- if (max_sessions != null) {
25
- await query_session_enforce_limit(deps, account_id, max_sessions);
26
- }
27
- const cookie_value = await create_session_cookie_value(keyring, session_token, session_options);
28
- set_session_cookie(c, cookie_value, session_options);
29
- };
@@ -1,4 +0,0 @@
1
- declare const AdminPermitHistory: import("svelte").Component<Record<string, never>, {}, "">;
2
- type AdminPermitHistory = ReturnType<typeof AdminPermitHistory>;
3
- export default AdminPermitHistory;
4
- //# sourceMappingURL=AdminPermitHistory.svelte.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AdminPermitHistory.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminPermitHistory.svelte"],"names":[],"mappings":"AAiGA,QAAA,MAAM,kBAAkB,2DAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PermitOfferForm.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/PermitOfferForm.svelte"],"names":[],"mappings":"AAiBA,OAAO,EAEL,KAAK,eAAe,EACpB,MAAM,gCAAgC,CAAC;AASxC,KAAK,gBAAgB,GAAI;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,+EAA+E;IAC/E,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9C,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC,CAAC;AA4GH,QAAA,MAAM,eAAe,sDAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PermitOfferHistory.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/PermitOfferHistory.svelte"],"names":[],"mappings":"AAmBA,OAAO,EAA4C,KAAK,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAE7F,KAAK,gBAAgB,GAAI;IACxB,oFAAoF;IACpF,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD;;;;OAIG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC,CAAC;AAkGH,QAAA,MAAM,kBAAkB,sDAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PermitOfferInbox.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/PermitOfferInbox.svelte"],"names":[],"mappings":"AAmBA,OAAO,EAA4C,KAAK,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAE7F,KAAK,gBAAgB,GAAI;IACxB,uEAAuE;IACvE,YAAY,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;IACjD;;;;OAIG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,+DAA+D;IAC/D,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACvC,CAAC;AA2FH,QAAA,MAAM,gBAAgB,sDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"permit_offers_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/permit_offers_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAC9C,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAUpE;;;;GAIG;AACH,eAAO,MAAM,2BAA2B;;;;CAAsC,CAAC;AAE/E;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,OAAO,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;KAAC,CAAC,CAAC;IACtD,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,OAAO,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;KAAC,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,MAAM,EAAE;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,KAAK,OAAO,CAAC;QAAC,KAAK,EAAE,eAAe,CAAA;KAAC,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QACrC,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,eAAe,CAAC;QACvB,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;KACpC,CAAC,CAAC;IACH,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,IAAI,CAAA;KAAC,CAAC,CAAC;IAC3E,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QAAC,EAAE,EAAE,IAAI,CAAA;KAAC,CAAC,CAAC;CACnD;AAED,yFAAyF;AACzF,MAAM,WAAW,uBAAuB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CAChB;AAED,qFAAqF;AACrF,MAAM,MAAM,oBAAoB,GAAG,CAClC,OAAO,EAAE,CAAC,YAAY,EAAE,uBAAuB,KAAK,IAAI,KACpD,MAAM,IAAI,CAAC;AAEhB,MAAM,WAAW,wBAAwB;IACxC,GAAG,EAAE,eAAe,CAAC;IACrB,oFAAoF;IACpF,UAAU,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAChC;;;OAGG;IACH,QAAQ,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CAC9B;AAQD,qBAAa,iBAAkB,SAAQ,QAAQ;;IAO9C,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAatC;IAEH,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAatC;IAEH,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAIrC;IAEH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAkC;gBAErD,OAAO,EAAE,wBAAwB;IAO7C,4DAA4D;IACtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,6DAA6D;IACvD,aAAa,CAAC,OAAO,CAAC,EAAE;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/E;;;;;;OAMG;IACG,MAAM,CAAC,MAAM,EAAE;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAQxC,qGAAqG;IAC/F,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAavC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9C;;;OAGG;IACH,SAAS,CAAC,YAAY,EAAE,oBAAoB,GAAG,MAAM,IAAI;IAMzD;;;;;;OAMG;IACH,kBAAkB,CAAC,YAAY,EAAE,uBAAuB,GAAG,IAAI;IAwB/D,qDAAqD;IAC5C,KAAK,IAAI,IAAI;CAmBtB"}