@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
@@ -18,22 +18,42 @@
18
18
  import { z } from 'zod';
19
19
  import { Uuid } from '@fuzdev/fuz_util/id.js';
20
20
  import { ROLE_ADMIN, RoleName } from './role_schema.js';
21
- import { AdminAccountEntryJson, Email, Username } from './account_schema.js';
22
- import { AdminSessionJson, AUDIT_LOG_DEFAULT_LIMIT, AuditEventTypeName, AuditLogEventWithUsernamesJson, AuditOutcome, PermitHistoryEventJson, } from './audit_log_schema.js';
21
+ import { AdminAccountEntryJson } from './account_schema.js';
22
+ import { Email, Username } from '../primitive_schemas.js';
23
+ import { ActingActor } from '../http/auth_shape.js';
24
+ import { AdminSessionJson, AUDIT_LOG_DEFAULT_LIMIT, AuditEventTypeName, AuditLogEventWithUsernamesJson, AuditOutcome, RoleGrantHistoryEventJson, } from './audit_log_schema.js';
23
25
  import { InviteJson, InviteWithUsernamesJson } from './invite_schema.js';
24
26
  import { AppSettingsWithUsernameJson } from './app_settings_schema.js';
25
- /** Max audit-log page size. Mirrors the former REST route's clamp. */
27
+ /** Max audit-log page size. */
26
28
  export const AUDIT_LOG_LIST_LIMIT_MAX = 200;
29
+ /** Default `admin_account_list` page size. */
30
+ export const ADMIN_ACCOUNT_LIST_DEFAULT_LIMIT = 50;
31
+ /** Max `admin_account_list` page size. */
32
+ export const ADMIN_ACCOUNT_LIST_LIMIT_MAX = 200;
27
33
  // -- Input/output schemas ---------------------------------------------------
28
- /** Input for `admin_account_list`. No parameters — the caller is the subject. */
29
- export const AdminAccountListInput = z.void();
34
+ /** Input for `admin_account_list`. */
35
+ export const AdminAccountListInput = z.strictObject({
36
+ acting: ActingActor,
37
+ limit: z
38
+ .number()
39
+ .int()
40
+ .min(1)
41
+ .max(ADMIN_ACCOUNT_LIST_LIMIT_MAX)
42
+ .nullish()
43
+ .meta({
44
+ description: `Max accounts to return (default ${ADMIN_ACCOUNT_LIST_DEFAULT_LIMIT}, max ${ADMIN_ACCOUNT_LIST_LIMIT_MAX}).`,
45
+ }),
46
+ offset: z.number().int().min(0).nullish().meta({ description: 'Pagination offset.' }),
47
+ });
30
48
  /** Output for `admin_account_list`. */
31
49
  export const AdminAccountListOutput = z.strictObject({
32
50
  accounts: z.array(AdminAccountEntryJson),
33
51
  grantable_roles: z.array(RoleName),
34
52
  });
35
- /** Input for `admin_session_list`. No parameters — reads every active session. */
36
- export const AdminSessionListInput = z.void();
53
+ /** Input for `admin_session_list`. */
54
+ export const AdminSessionListInput = z.strictObject({
55
+ acting: ActingActor,
56
+ });
37
57
  /** Output for `admin_session_list`. Cross-account listing; fan-out already scoped by role auth. */
38
58
  export const AdminSessionListOutput = z.strictObject({
39
59
  sessions: z.array(AdminSessionJson),
@@ -41,6 +61,7 @@ export const AdminSessionListOutput = z.strictObject({
41
61
  /** Input for `admin_session_revoke_all`. */
42
62
  export const AdminSessionRevokeAllInput = z.strictObject({
43
63
  account_id: Uuid.meta({ description: 'Account whose sessions to revoke.' }),
64
+ acting: ActingActor,
44
65
  });
45
66
  /** Output for `admin_session_revoke_all`. */
46
67
  export const AdminSessionRevokeAllOutput = z.strictObject({
@@ -50,6 +71,7 @@ export const AdminSessionRevokeAllOutput = z.strictObject({
50
71
  /** Input for `admin_token_revoke_all`. */
51
72
  export const AdminTokenRevokeAllInput = z.strictObject({
52
73
  account_id: Uuid.meta({ description: 'Account whose API tokens to revoke.' }),
74
+ acting: ActingActor,
53
75
  });
54
76
  /** Output for `admin_token_revoke_all`. */
55
77
  export const AdminTokenRevokeAllOutput = z.strictObject({
@@ -83,13 +105,14 @@ export const AuditLogListInput = z.strictObject({
83
105
  since_seq: z.number().int().min(0).nullish().meta({
84
106
  description: 'Gap-fill from this seq forward. Used for SSE reconnection.',
85
107
  }),
108
+ acting: ActingActor,
86
109
  });
87
110
  /** Output for `audit_log_list`. */
88
111
  export const AuditLogListOutput = z.strictObject({
89
112
  events: z.array(AuditLogEventWithUsernamesJson),
90
113
  });
91
- /** Input for `audit_log_permit_history`. */
92
- export const AuditLogPermitHistoryInput = z.strictObject({
114
+ /** Input for `audit_log_role_grant_history`. */
115
+ export const AuditLogRoleGrantHistoryInput = z.strictObject({
93
116
  limit: z
94
117
  .number()
95
118
  .int()
@@ -100,15 +123,17 @@ export const AuditLogPermitHistoryInput = z.strictObject({
100
123
  description: `Max rows to return (default ${AUDIT_LOG_DEFAULT_LIMIT}, max ${AUDIT_LOG_LIST_LIMIT_MAX}).`,
101
124
  }),
102
125
  offset: z.number().int().min(0).nullish().meta({ description: 'Pagination offset.' }),
126
+ acting: ActingActor,
103
127
  });
104
- /** Output for `audit_log_permit_history`. */
105
- export const AuditLogPermitHistoryOutput = z.strictObject({
106
- events: z.array(PermitHistoryEventJson),
128
+ /** Output for `audit_log_role_grant_history`. */
129
+ export const AuditLogRoleGrantHistoryOutput = z.strictObject({
130
+ events: z.array(RoleGrantHistoryEventJson),
107
131
  });
108
132
  /** Input for `invite_create`. At least one of `email` / `username` must be provided. */
109
133
  export const InviteCreateInput = z.strictObject({
110
134
  email: Email.nullish().meta({ description: 'Invitee email.' }),
111
135
  username: Username.nullish().meta({ description: 'Invitee username.' }),
136
+ acting: ActingActor,
112
137
  });
113
138
  /** Output for `invite_create`. */
114
139
  export const InviteCreateOutput = z.strictObject({
@@ -116,7 +141,9 @@ export const InviteCreateOutput = z.strictObject({
116
141
  invite: InviteJson,
117
142
  });
118
143
  /** Input for `invite_list`. */
119
- export const InviteListInput = z.void();
144
+ export const InviteListInput = z.strictObject({
145
+ acting: ActingActor,
146
+ });
120
147
  /** Output for `invite_list`. Uses the enriched row including creator/claimer usernames. */
121
148
  export const InviteListOutput = z.strictObject({
122
149
  invites: z.array(InviteWithUsernamesJson),
@@ -124,13 +151,16 @@ export const InviteListOutput = z.strictObject({
124
151
  /** Input for `invite_delete`. */
125
152
  export const InviteDeleteInput = z.strictObject({
126
153
  invite_id: Uuid.meta({ description: 'Invite to delete. Must be unclaimed.' }),
154
+ acting: ActingActor,
127
155
  });
128
156
  /** Output for `invite_delete`. */
129
157
  export const InviteDeleteOutput = z.strictObject({
130
158
  ok: z.literal(true),
131
159
  });
132
- /** Input for `app_settings_get`. No parameters. */
133
- export const AppSettingsGetInput = z.void();
160
+ /** Input for `app_settings_get`. */
161
+ export const AppSettingsGetInput = z.strictObject({
162
+ acting: ActingActor,
163
+ });
134
164
  /** Output for `app_settings_get`. */
135
165
  export const AppSettingsGetOutput = z.strictObject({
136
166
  settings: AppSettingsWithUsernameJson,
@@ -138,6 +168,7 @@ export const AppSettingsGetOutput = z.strictObject({
138
168
  /** Input for `app_settings_update`. */
139
169
  export const AppSettingsUpdateInput = z.strictObject({
140
170
  open_signup: z.boolean().meta({ description: 'New value for the open signup toggle.' }),
171
+ acting: ActingActor,
141
172
  });
142
173
  /** Output for `app_settings_update`. */
143
174
  export const AppSettingsUpdateOutput = z.strictObject({
@@ -149,18 +180,18 @@ export const admin_account_list_action_spec = {
149
180
  method: 'admin_account_list',
150
181
  kind: 'request_response',
151
182
  initiator: 'frontend',
152
- auth: { role: ROLE_ADMIN },
183
+ auth: { account: 'required', actor: 'required', roles: [ROLE_ADMIN] },
153
184
  side_effects: false,
154
185
  input: AdminAccountListInput,
155
186
  output: AdminAccountListOutput,
156
187
  async: true,
157
- description: 'List all accounts with their actors, permits, and pending offers. Admin-only.',
188
+ description: 'List all accounts with their actors, role_grants, and pending offers. Admin-only.',
158
189
  };
159
190
  export const admin_session_list_action_spec = {
160
191
  method: 'admin_session_list',
161
192
  kind: 'request_response',
162
193
  initiator: 'frontend',
163
- auth: { role: ROLE_ADMIN },
194
+ auth: { account: 'required', actor: 'required', roles: [ROLE_ADMIN] },
164
195
  side_effects: false,
165
196
  input: AdminSessionListInput,
166
197
  output: AdminSessionListOutput,
@@ -171,7 +202,7 @@ export const admin_session_revoke_all_action_spec = {
171
202
  method: 'admin_session_revoke_all',
172
203
  kind: 'request_response',
173
204
  initiator: 'frontend',
174
- auth: { role: ROLE_ADMIN },
205
+ auth: { account: 'required', actor: 'required', roles: [ROLE_ADMIN] },
175
206
  side_effects: true,
176
207
  input: AdminSessionRevokeAllInput,
177
208
  output: AdminSessionRevokeAllOutput,
@@ -183,7 +214,7 @@ export const admin_token_revoke_all_action_spec = {
183
214
  method: 'admin_token_revoke_all',
184
215
  kind: 'request_response',
185
216
  initiator: 'frontend',
186
- auth: { role: ROLE_ADMIN },
217
+ auth: { account: 'required', actor: 'required', roles: [ROLE_ADMIN] },
187
218
  side_effects: true,
188
219
  input: AdminTokenRevokeAllInput,
189
220
  output: AdminTokenRevokeAllOutput,
@@ -195,29 +226,29 @@ export const audit_log_list_action_spec = {
195
226
  method: 'audit_log_list',
196
227
  kind: 'request_response',
197
228
  initiator: 'frontend',
198
- auth: { role: ROLE_ADMIN },
229
+ auth: { account: 'required', actor: 'required', roles: [ROLE_ADMIN] },
199
230
  side_effects: false,
200
231
  input: AuditLogListInput,
201
232
  output: AuditLogListOutput,
202
233
  async: true,
203
234
  description: 'List audit log events with optional filters. Admin-only.',
204
235
  };
205
- export const audit_log_permit_history_action_spec = {
206
- method: 'audit_log_permit_history',
236
+ export const audit_log_role_grant_history_action_spec = {
237
+ method: 'audit_log_role_grant_history',
207
238
  kind: 'request_response',
208
239
  initiator: 'frontend',
209
- auth: { role: ROLE_ADMIN },
240
+ auth: { account: 'required', actor: 'required', roles: [ROLE_ADMIN] },
210
241
  side_effects: false,
211
- input: AuditLogPermitHistoryInput,
212
- output: AuditLogPermitHistoryOutput,
242
+ input: AuditLogRoleGrantHistoryInput,
243
+ output: AuditLogRoleGrantHistoryOutput,
213
244
  async: true,
214
- description: 'List permit grant and revoke events with usernames. Admin-only.',
245
+ description: 'List role_grant grant and revoke events with usernames. Admin-only.',
215
246
  };
216
247
  export const invite_create_action_spec = {
217
248
  method: 'invite_create',
218
249
  kind: 'request_response',
219
250
  initiator: 'frontend',
220
- auth: { role: ROLE_ADMIN },
251
+ auth: { account: 'required', actor: 'required', roles: [ROLE_ADMIN] },
221
252
  side_effects: true,
222
253
  input: InviteCreateInput,
223
254
  output: InviteCreateOutput,
@@ -229,7 +260,7 @@ export const invite_list_action_spec = {
229
260
  method: 'invite_list',
230
261
  kind: 'request_response',
231
262
  initiator: 'frontend',
232
- auth: { role: ROLE_ADMIN },
263
+ auth: { account: 'required', actor: 'required', roles: [ROLE_ADMIN] },
233
264
  side_effects: false,
234
265
  input: InviteListInput,
235
266
  output: InviteListOutput,
@@ -240,7 +271,7 @@ export const invite_delete_action_spec = {
240
271
  method: 'invite_delete',
241
272
  kind: 'request_response',
242
273
  initiator: 'frontend',
243
- auth: { role: ROLE_ADMIN },
274
+ auth: { account: 'required', actor: 'required', roles: [ROLE_ADMIN] },
244
275
  side_effects: true,
245
276
  input: InviteDeleteInput,
246
277
  output: InviteDeleteOutput,
@@ -252,7 +283,7 @@ export const app_settings_get_action_spec = {
252
283
  method: 'app_settings_get',
253
284
  kind: 'request_response',
254
285
  initiator: 'frontend',
255
- auth: { role: ROLE_ADMIN },
286
+ auth: { account: 'required', actor: 'required', roles: [ROLE_ADMIN] },
256
287
  side_effects: false,
257
288
  input: AppSettingsGetInput,
258
289
  output: AppSettingsGetOutput,
@@ -263,7 +294,7 @@ export const app_settings_update_action_spec = {
263
294
  method: 'app_settings_update',
264
295
  kind: 'request_response',
265
296
  initiator: 'frontend',
266
- auth: { role: ROLE_ADMIN },
297
+ auth: { account: 'required', actor: 'required', roles: [ROLE_ADMIN] },
267
298
  side_effects: true,
268
299
  input: AppSettingsUpdateInput,
269
300
  output: AppSettingsUpdateOutput,
@@ -284,7 +315,7 @@ export const all_admin_action_specs = [
284
315
  admin_session_revoke_all_action_spec,
285
316
  admin_token_revoke_all_action_spec,
286
317
  audit_log_list_action_spec,
287
- audit_log_permit_history_action_spec,
318
+ audit_log_role_grant_history_action_spec,
288
319
  invite_create_action_spec,
289
320
  invite_list_action_spec,
290
321
  invite_delete_action_spec,
@@ -5,23 +5,23 @@
5
5
  *
6
6
  * - Account management: `admin_account_list`, `admin_session_list`,
7
7
  * `admin_session_revoke_all`, `admin_token_revoke_all`.
8
- * - Audit log reads: `audit_log_list`, `audit_log_permit_history`.
8
+ * - Audit log reads: `audit_log_list`, `audit_log_role_grant_history`.
9
9
  * - Invite CRUD: `invite_create`, `invite_list`, `invite_delete`.
10
10
  * - App settings: `app_settings_get`, `app_settings_update` (registered only
11
11
  * when `AdminActionOptions.app_settings` is provided — the mutable ref is
12
12
  * owned by the server context and shared with signup middleware).
13
13
  *
14
14
  * The action specs themselves live in `auth/admin_action_specs.ts`. Mutations
15
- * emit matching audit events via `audit_log_fire_and_forget`.
15
+ * emit matching audit events via `deps.audit.emit`.
16
16
  *
17
17
  * Authorization is declared at the spec level (`auth: {role: 'admin'}`) so
18
18
  * the RPC dispatcher enforces it before the handler runs and the generated
19
- * surface accurately reports the requirement. `permit_revoke` in
20
- * `auth/permit_offer_actions.ts` uses the same spec-level pattern even though its
19
+ * surface accurately reports the requirement. `role_grant_revoke` in
20
+ * `auth/role_grant_offer_actions.ts` uses the same spec-level pattern even though its
21
21
  * sibling methods are authenticated-but-not-admin — the dispatcher checks
22
22
  * auth per-spec, so mixed-auth endpoints compose cleanly. Handler-level
23
23
  * gates are reserved for input-dependent elevation (e.g.
24
- * `permit_offer_list`/`_history` elevate to admin only when the caller
24
+ * `role_grant_offer_list`/`_history` elevate to admin only when the caller
25
25
  * passes an `account_id` other than their own — an input-dependent check
26
26
  * the spec can't express).
27
27
  *
@@ -35,8 +35,9 @@ import type { RouteFactoryDeps } from './deps.js';
35
35
  export interface AdminActionOptions {
36
36
  /**
37
37
  * Role schema result from `create_role_schema()`. Defaults to builtin
38
- * roles only. Used to derive `grantable_roles` (the `web_grantable`
39
- * subset) returned by `admin_account_list`.
38
+ * roles only. Used to derive `grantable_roles` (the subset whose
39
+ * `RoleSpec.grant_paths` includes `'admin'`) returned by
40
+ * `admin_account_list`.
40
41
  */
41
42
  roles?: RoleSchemaResult;
42
43
  /**
@@ -49,23 +50,16 @@ export interface AdminActionOptions {
49
50
  */
50
51
  app_settings?: AppSettings;
51
52
  }
52
- /**
53
- * Dependencies for `create_admin_actions`.
54
- *
55
- * Shares shape with `PermitOfferActionDeps` so consumers can pass the same
56
- * deps to both factories. `log` drives RPC-internal error logging;
57
- * `on_audit_event` is wired by the two revoke-all mutations so SSE fan-out
58
- * mirrors the former REST-route behavior. `audit_log_config` flows from
59
- * `AppDeps` and is consumed by `audit_log_fire_and_forget`.
60
- */
61
- export type AdminActionDeps = Pick<RouteFactoryDeps, 'log' | 'on_audit_event' | 'audit_log_config'>;
62
53
  /**
63
54
  * Create the admin-only RPC actions.
64
55
  *
65
- * @param deps - `AdminActionDeps` slice of `AppDeps` (`log`, `on_audit_event`, optional `audit_log_config`)
56
+ * @param deps - `RouteFactoryDeps` (`log`, `audit`, …). `log` drives RPC-
57
+ * internal error logging; `audit.emit` writes audit rows via the captured
58
+ * pool. The bound emitter encapsulates `on_audit_event` fan-out and the
59
+ * optional `AuditLogConfig`.
66
60
  * @param options - role schema for `grantable_roles` derivation
67
61
  * @returns the `RpcAction` array to spread into a `create_rpc_endpoint` call
68
62
  * @mutates `options.app_settings` ref - `app_settings_update` writes `open_signup`, `updated_at`, and `updated_by` so signup middleware reads without a DB round trip
69
63
  */
70
- export declare const create_admin_actions: (deps: AdminActionDeps, options?: AdminActionOptions) => Array<RpcAction>;
64
+ export declare const create_admin_actions: (deps: Pick<RouteFactoryDeps, "log" | "audit">, options?: AdminActionOptions) => Array<RpcAction>;
71
65
  //# sourceMappingURL=admin_actions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin_actions.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/admin_actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAiC,KAAK,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAExF,OAAO,EAAuB,KAAK,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAuB7E,OAAO,EAAC,KAAK,WAAW,EAAC,MAAM,0BAA0B,CAAC;AAK1D,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,WAAW,CAAC;AA8ChD,0CAA0C;AAC1C,MAAM,WAAW,kBAAkB;IAClC;;;;OAIG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,gBAAgB,GAAG,kBAAkB,CAAC,CAAC;AAEpG;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,GAChC,MAAM,eAAe,EACrB,UAAS,kBAAuB,KAC9B,KAAK,CAAC,SAAS,CAmSjB,CAAC"}
1
+ {"version":3,"file":"admin_actions.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/admin_actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAsC,KAAK,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAE7F,OAAO,EAGN,KAAK,gBAAgB,EACrB,MAAM,kBAAkB,CAAC;AAuB1B,OAAO,EAAC,KAAK,WAAW,EAAC,MAAM,0BAA0B,CAAC;AAK1D,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,WAAW,CAAC;AA8ChD,0CAA0C;AAC1C,MAAM,WAAW,kBAAkB;IAClC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,GAChC,MAAM,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,OAAO,CAAC,EAC7C,UAAS,kBAAuB,KAC9B,KAAK,CAAC,SAAS,CAgQjB,CAAC"}
@@ -5,23 +5,23 @@
5
5
  *
6
6
  * - Account management: `admin_account_list`, `admin_session_list`,
7
7
  * `admin_session_revoke_all`, `admin_token_revoke_all`.
8
- * - Audit log reads: `audit_log_list`, `audit_log_permit_history`.
8
+ * - Audit log reads: `audit_log_list`, `audit_log_role_grant_history`.
9
9
  * - Invite CRUD: `invite_create`, `invite_list`, `invite_delete`.
10
10
  * - App settings: `app_settings_get`, `app_settings_update` (registered only
11
11
  * when `AdminActionOptions.app_settings` is provided — the mutable ref is
12
12
  * owned by the server context and shared with signup middleware).
13
13
  *
14
14
  * The action specs themselves live in `auth/admin_action_specs.ts`. Mutations
15
- * emit matching audit events via `audit_log_fire_and_forget`.
15
+ * emit matching audit events via `deps.audit.emit`.
16
16
  *
17
17
  * Authorization is declared at the spec level (`auth: {role: 'admin'}`) so
18
18
  * the RPC dispatcher enforces it before the handler runs and the generated
19
- * surface accurately reports the requirement. `permit_revoke` in
20
- * `auth/permit_offer_actions.ts` uses the same spec-level pattern even though its
19
+ * surface accurately reports the requirement. `role_grant_revoke` in
20
+ * `auth/role_grant_offer_actions.ts` uses the same spec-level pattern even though its
21
21
  * sibling methods are authenticated-but-not-admin — the dispatcher checks
22
22
  * auth per-spec, so mixed-auth endpoints compose cleanly. Handler-level
23
23
  * gates are reserved for input-dependent elevation (e.g.
24
- * `permit_offer_list`/`_history` elevate to admin only when the caller
24
+ * `role_grant_offer_list`/`_history` elevate to admin only when the caller
25
25
  * passes an `account_id` other than their own — an input-dependent check
26
26
  * the spec can't express).
27
27
  *
@@ -29,35 +29,38 @@
29
29
  */
30
30
  import { rpc_action } from '../actions/action_rpc.js';
31
31
  import { jsonrpc_errors } from '../http/jsonrpc_errors.js';
32
- import { BUILTIN_ROLE_OPTIONS } from './role_schema.js';
32
+ import { BUILTIN_ROLE_SPECS_BY_NAME, list_roles_with_grant_path, } from './role_schema.js';
33
+ import { GRANT_PATH_ADMIN } from './grant_path_schema.js';
33
34
  import { query_account_by_email, query_account_by_id, query_account_by_username, query_admin_account_list, } from './account_queries.js';
34
35
  import { query_session_list_all_active, query_session_revoke_all_for_account, } from './session_queries.js';
35
36
  import { query_revoke_all_api_tokens_for_account } from './api_token_queries.js';
36
- import { audit_log_fire_and_forget, query_audit_log_list_permit_history, query_audit_log_list_with_usernames, } from './audit_log_queries.js';
37
+ import { query_audit_log_list_role_grant_history, query_audit_log_list_with_usernames, } from './audit_log_queries.js';
37
38
  import { AUDIT_LOG_DEFAULT_LIMIT } from './audit_log_schema.js';
38
39
  import { query_create_invite, query_invite_delete_unclaimed, query_invite_list_all_with_usernames, } from './invite_queries.js';
39
40
  import {} from './app_settings_schema.js';
40
41
  import { query_app_settings_load_with_username, query_app_settings_update, } from './app_settings_queries.js';
41
42
  import { is_pg_unique_violation } from '../db/pg_error.js';
42
43
  import { ERROR_ACCOUNT_NOT_FOUND, ERROR_INVITE_ACCOUNT_EXISTS_EMAIL, ERROR_INVITE_ACCOUNT_EXISTS_USERNAME, ERROR_INVITE_DUPLICATE, ERROR_INVITE_MISSING_IDENTIFIER, ERROR_INVITE_NOT_FOUND, } from '../http/error_schemas.js';
43
- import { admin_account_list_action_spec, admin_session_list_action_spec, admin_session_revoke_all_action_spec, admin_token_revoke_all_action_spec, audit_log_list_action_spec, audit_log_permit_history_action_spec, invite_create_action_spec, invite_list_action_spec, invite_delete_action_spec, app_settings_get_action_spec, app_settings_update_action_spec, } from './admin_action_specs.js';
44
+ import { admin_account_list_action_spec, admin_session_list_action_spec, admin_session_revoke_all_action_spec, admin_token_revoke_all_action_spec, audit_log_list_action_spec, audit_log_role_grant_history_action_spec, invite_create_action_spec, invite_list_action_spec, invite_delete_action_spec, app_settings_get_action_spec, app_settings_update_action_spec, } from './admin_action_specs.js';
44
45
  /**
45
46
  * Create the admin-only RPC actions.
46
47
  *
47
- * @param deps - `AdminActionDeps` slice of `AppDeps` (`log`, `on_audit_event`, optional `audit_log_config`)
48
+ * @param deps - `RouteFactoryDeps` (`log`, `audit`, …). `log` drives RPC-
49
+ * internal error logging; `audit.emit` writes audit rows via the captured
50
+ * pool. The bound emitter encapsulates `on_audit_event` fan-out and the
51
+ * optional `AuditLogConfig`.
48
52
  * @param options - role schema for `grantable_roles` derivation
49
53
  * @returns the `RpcAction` array to spread into a `create_rpc_endpoint` call
50
54
  * @mutates `options.app_settings` ref - `app_settings_update` writes `open_signup`, `updated_at`, and `updated_by` so signup middleware reads without a DB round trip
51
55
  */
52
56
  export const create_admin_actions = (deps, options = {}) => {
53
- const role_options = options.roles?.role_options ?? BUILTIN_ROLE_OPTIONS;
54
- const grantable_roles = [];
55
- for (const [name, rc] of role_options) {
56
- if (rc.web_grantable)
57
- grantable_roles.push(name);
58
- }
59
- const account_list_handler = async (_input, ctx) => {
60
- const accounts = await query_admin_account_list(ctx);
57
+ const role_specs = options.roles?.role_specs ?? BUILTIN_ROLE_SPECS_BY_NAME;
58
+ const grantable_roles = list_roles_with_grant_path(role_specs, GRANT_PATH_ADMIN);
59
+ const account_list_handler = async (input, ctx) => {
60
+ const accounts = await query_admin_account_list(ctx, {
61
+ limit: input.limit,
62
+ offset: input.offset,
63
+ });
61
64
  return { accounts, grantable_roles };
62
65
  };
63
66
  const session_list_handler = async (_input, ctx) => {
@@ -68,10 +71,9 @@ export const create_admin_actions = (deps, options = {}) => {
68
71
  const auth = ctx.auth;
69
72
  const account = await query_account_by_id(ctx, input.account_id);
70
73
  if (!account) {
71
- void audit_log_fire_and_forget(ctx, {
74
+ deps.audit.emit(ctx, {
72
75
  event_type: 'session_revoke_all',
73
76
  outcome: 'failure',
74
- actor_id: auth.actor.id,
75
77
  account_id: auth.account.id,
76
78
  // `target_account_id` is null: the FK to `account` would reject
77
79
  // a probe for a non-existent id. The probed value is preserved
@@ -82,28 +84,26 @@ export const create_admin_actions = (deps, options = {}) => {
82
84
  reason: ERROR_ACCOUNT_NOT_FOUND,
83
85
  attempted_account_id: input.account_id,
84
86
  },
85
- }, deps);
87
+ });
86
88
  throw jsonrpc_errors.not_found('account', { reason: ERROR_ACCOUNT_NOT_FOUND });
87
89
  }
88
90
  const count = await query_session_revoke_all_for_account(ctx, input.account_id);
89
- void audit_log_fire_and_forget(ctx, {
91
+ deps.audit.emit(ctx, {
90
92
  event_type: 'session_revoke_all',
91
- actor_id: auth.actor.id,
92
93
  account_id: auth.account.id,
93
94
  target_account_id: input.account_id,
94
95
  ip: ctx.client_ip,
95
96
  metadata: { count },
96
- }, deps);
97
+ });
97
98
  return { ok: true, count };
98
99
  };
99
100
  const token_revoke_all_handler = async (input, ctx) => {
100
101
  const auth = ctx.auth;
101
102
  const account = await query_account_by_id(ctx, input.account_id);
102
103
  if (!account) {
103
- void audit_log_fire_and_forget(ctx, {
104
+ deps.audit.emit(ctx, {
104
105
  event_type: 'token_revoke_all',
105
106
  outcome: 'failure',
106
- actor_id: auth.actor.id,
107
107
  account_id: auth.account.id,
108
108
  // See `session_revoke_all_handler` — FK forces null here; the
109
109
  // probed id lives under `metadata.attempted_account_id`.
@@ -113,18 +113,17 @@ export const create_admin_actions = (deps, options = {}) => {
113
113
  reason: ERROR_ACCOUNT_NOT_FOUND,
114
114
  attempted_account_id: input.account_id,
115
115
  },
116
- }, deps);
116
+ });
117
117
  throw jsonrpc_errors.not_found('account', { reason: ERROR_ACCOUNT_NOT_FOUND });
118
118
  }
119
119
  const count = await query_revoke_all_api_tokens_for_account(ctx, input.account_id);
120
- void audit_log_fire_and_forget(ctx, {
120
+ deps.audit.emit(ctx, {
121
121
  event_type: 'token_revoke_all',
122
- actor_id: auth.actor.id,
123
122
  account_id: auth.account.id,
124
123
  target_account_id: input.account_id,
125
124
  ip: ctx.client_ip,
126
125
  metadata: { count },
127
- }, deps);
126
+ });
128
127
  return { ok: true, count };
129
128
  };
130
129
  const audit_log_list_handler = async (input, ctx) => {
@@ -138,8 +137,8 @@ export const create_admin_actions = (deps, options = {}) => {
138
137
  });
139
138
  return { events };
140
139
  };
141
- const audit_log_permit_history_handler = async (input, ctx) => {
142
- const events = await query_audit_log_list_permit_history(ctx, input.limit ?? AUDIT_LOG_DEFAULT_LIMIT, input.offset ?? 0);
140
+ const audit_log_role_grant_history_handler = async (input, ctx) => {
141
+ const events = await query_audit_log_list_role_grant_history(ctx, input.limit ?? AUDIT_LOG_DEFAULT_LIMIT, input.offset ?? 0);
143
142
  return { events };
144
143
  };
145
144
  const invite_create_handler = async (input, ctx) => {
@@ -183,13 +182,12 @@ export const create_admin_actions = (deps, options = {}) => {
183
182
  }
184
183
  throw err;
185
184
  }
186
- void audit_log_fire_and_forget(ctx, {
185
+ deps.audit.emit(ctx, {
187
186
  event_type: 'invite_create',
188
- actor_id: auth.actor.id,
189
187
  account_id: auth.account.id,
190
188
  ip: ctx.client_ip,
191
189
  metadata: { invite_id: invite.id, email, username },
192
- }, deps);
190
+ });
193
191
  return { ok: true, invite };
194
192
  };
195
193
  const invite_list_handler = async (_input, ctx) => {
@@ -202,13 +200,12 @@ export const create_admin_actions = (deps, options = {}) => {
202
200
  if (!deleted) {
203
201
  throw jsonrpc_errors.not_found('invite', { reason: ERROR_INVITE_NOT_FOUND });
204
202
  }
205
- void audit_log_fire_and_forget(ctx, {
203
+ deps.audit.emit(ctx, {
206
204
  event_type: 'invite_delete',
207
- actor_id: auth.actor.id,
208
205
  account_id: auth.account.id,
209
206
  ip: ctx.client_ip,
210
207
  metadata: { invite_id: input.invite_id },
211
- }, deps);
208
+ });
212
209
  return { ok: true };
213
210
  };
214
211
  const actions = [
@@ -217,7 +214,7 @@ export const create_admin_actions = (deps, options = {}) => {
217
214
  rpc_action(admin_session_revoke_all_action_spec, session_revoke_all_handler),
218
215
  rpc_action(admin_token_revoke_all_action_spec, token_revoke_all_handler),
219
216
  rpc_action(audit_log_list_action_spec, audit_log_list_handler),
220
- rpc_action(audit_log_permit_history_action_spec, audit_log_permit_history_handler),
217
+ rpc_action(audit_log_role_grant_history_action_spec, audit_log_role_grant_history_handler),
221
218
  rpc_action(invite_create_action_spec, invite_create_handler),
222
219
  rpc_action(invite_list_action_spec, invite_list_handler),
223
220
  rpc_action(invite_delete_action_spec, invite_delete_handler),
@@ -237,9 +234,8 @@ export const create_admin_actions = (deps, options = {}) => {
237
234
  app_settings.open_signup = updated.open_signup;
238
235
  app_settings.updated_at = updated.updated_at;
239
236
  app_settings.updated_by = updated.updated_by;
240
- void audit_log_fire_and_forget(ctx, {
237
+ deps.audit.emit(ctx, {
241
238
  event_type: 'app_settings_update',
242
- actor_id: auth.actor.id,
243
239
  account_id: auth.account.id,
244
240
  ip: ctx.client_ip,
245
241
  metadata: {
@@ -247,7 +243,7 @@ export const create_admin_actions = (deps, options = {}) => {
247
243
  old_value,
248
244
  new_value: input.open_signup,
249
245
  },
250
- }, deps);
246
+ });
251
247
  const settings = await query_app_settings_load_with_username(ctx);
252
248
  return { ok: true, settings };
253
249
  };