@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
@@ -12,7 +12,7 @@
12
12
  * @module
13
13
  */
14
14
  import { z } from 'zod';
15
- import type { RouteAuth } from './route_spec.js';
15
+ import { type RouteAuth } from './auth_shape.js';
16
16
  /** Request body failed Zod validation. */
17
17
  export declare const ERROR_INVALID_REQUEST_BODY: "invalid_request_body";
18
18
  /** Request body is not valid JSON or not an object. */
@@ -25,6 +25,16 @@ export declare const ERROR_INVALID_QUERY_PARAMS: "invalid_query_params";
25
25
  export declare const ERROR_AUTHENTICATION_REQUIRED: "authentication_required";
26
26
  /** Authenticated but missing required role. */
27
27
  export declare const ERROR_INSUFFICIENT_PERMISSIONS: "insufficient_permissions";
28
+ /**
29
+ * Route requires a credential type the request didn't arrive on.
30
+ * Symmetric with `ERROR_INSUFFICIENT_PERMISSIONS` + `required_roles`:
31
+ * the body carries `required_credential_types: ReadonlyArray<string>`
32
+ * — what the route demanded, not what arrived. Today the only
33
+ * credential gate is keeper (`['daemon_token']`); future gates
34
+ * (`agent_token`, `group_actor_token`) reuse the same literal and
35
+ * label themselves through the array.
36
+ */
37
+ export declare const ERROR_CREDENTIAL_TYPE_REQUIRED: "credential_type_required";
28
38
  /** Rate limiter rejected the request. */
29
39
  export declare const ERROR_RATE_LIMIT_EXCEEDED: "rate_limit_exceeded";
30
40
  /** Username or password is wrong (intentionally vague for enumeration prevention). */
@@ -41,8 +51,39 @@ export declare const ERROR_BEARER_REJECTED_BROWSER: "bearer_token_rejected_in_br
41
51
  export declare const ERROR_INVALID_TOKEN: "invalid_token";
42
52
  /** Token references a deleted account. */
43
53
  export declare const ERROR_ACCOUNT_NOT_FOUND: "account_not_found";
44
- /** Keeper routes require daemon_token credential type. */
45
- export declare const ERROR_KEEPER_REQUIRES_DAEMON_TOKEN: "keeper_requires_daemon_token";
54
+ /**
55
+ * Multi-actor account requires the request to carry an explicit `acting`
56
+ * field naming the actor the request is acting as, so the dispatcher's
57
+ * authorization phase doesn't pick a default actor silently. Returned
58
+ * with the available actors so the client can prompt.
59
+ */
60
+ export declare const ERROR_ACTOR_REQUIRED: "actor_required";
61
+ /**
62
+ * Supplied `acting` field does not name an actor on the authenticated
63
+ * account.
64
+ */
65
+ export declare const ERROR_ACTOR_NOT_ON_ACCOUNT: "actor_not_on_account";
66
+ /**
67
+ * Authenticated account exists but has no actors. Server invariant
68
+ * violation — signup / bootstrap always create an actor in the same
69
+ * transaction. Surfaced from the dispatcher's authorization phase as a
70
+ * 500 so the operator sees the corruption signal rather than a confusing
71
+ * 4xx. Distinct from `ERROR_ACCOUNT_VANISHED`: the actor list was
72
+ * enumerated successfully and came back empty.
73
+ */
74
+ export declare const ERROR_NO_ACTORS_ON_ACCOUNT: "no_actors_on_account";
75
+ /**
76
+ * Authentication validated an account, but a follow-up read in the
77
+ * authorization phase came back null — the account or its named actor
78
+ * row was deleted between the credential check and the dispatcher's
79
+ * `build_request_context` / `build_account_context` step. Torn read,
80
+ * not a missing-actor invariant violation. Surfaced as 500 so the
81
+ * operator sees the race signal; clients can retry. Distinct from
82
+ * `ERROR_ACCOUNT_NOT_FOUND` (stale token referencing a long-deleted
83
+ * account, raised at credential validation) and
84
+ * `ERROR_NO_ACTORS_ON_ACCOUNT` (the actor list enumerated empty).
85
+ */
86
+ export declare const ERROR_ACCOUNT_VANISHED: "account_vanished";
46
87
  /** Daemon token header present but malformed or not matching current/previous token. */
47
88
  export declare const ERROR_INVALID_DAEMON_TOKEN: "invalid_daemon_token";
48
89
  /** Daemon token valid but keeper account not yet resolved (pre-bootstrap). */
@@ -71,8 +112,8 @@ export declare const ERROR_INVITE_ACCOUNT_EXISTS_USERNAME: "invite_account_exist
71
112
  export declare const ERROR_INVITE_ACCOUNT_EXISTS_EMAIL: "invite_account_exists_email";
72
113
  /** Admin tried to grant a role that is not web-grantable. */
73
114
  export declare const ERROR_ROLE_NOT_WEB_GRANTABLE: "role_not_web_grantable";
74
- /** Permit ID not found or not owned by the target actor. */
75
- export declare const ERROR_PERMIT_NOT_FOUND: "permit_not_found";
115
+ /** Role grant ID not found or not owned by the target actor. */
116
+ export declare const ERROR_ROLE_GRANT_NOT_FOUND: "role_grant_not_found";
76
117
  /** Query parameter `event_type` is not a valid audit event type. */
77
118
  export declare const ERROR_INVALID_EVENT_TYPE: "invalid_event_type";
78
119
  /** DELETE blocked by a foreign key constraint. */
@@ -104,18 +145,37 @@ export declare const ValidationError: z.ZodObject<{
104
145
  }, z.core.$loose>>;
105
146
  }, z.core.$loose>;
106
147
  export type ValidationError = z.infer<typeof ValidationError>;
107
- /** Permission error — returned by `require_role()` when the required role is missing. */
148
+ /**
149
+ * Permission error — returned by `require_role()` and the dispatcher's
150
+ * post-authorization role gate when the actor's role_grants don't include any
151
+ * of the route's `auth.roles`.
152
+ *
153
+ * `required_roles` carries the full disjunction the route declared
154
+ * (`auth.roles` from the new flat-record shape). Single-role specs surface
155
+ * as a one-element array; multi-role disjunctions show every admittable
156
+ * role so clients can render targeted copy ("requires admin or steward").
157
+ */
108
158
  export declare const PermissionError: z.ZodObject<{
109
159
  error: z.ZodLiteral<"insufficient_permissions">;
110
- required_role: z.ZodString;
160
+ required_roles: z.ZodReadonly<z.ZodArray<z.ZodString>>;
111
161
  }, z.core.$loose>;
112
162
  export type PermissionError = z.infer<typeof PermissionError>;
113
- /** Keeper credential error — returned by `require_keeper` when credential type is wrong. */
114
- export declare const KeeperError: z.ZodObject<{
115
- error: z.ZodLiteral<"keeper_requires_daemon_token">;
116
- credential_type: z.ZodString;
163
+ /**
164
+ * Credential-type error — returned by the dispatcher's post-authorization
165
+ * credential gate (and the `require_credential_types` REST middleware) when
166
+ * the request's credential type isn't in the route's
167
+ * `auth.credential_types` allowlist.
168
+ *
169
+ * `required_credential_types` carries what the route declared
170
+ * (`['daemon_token']` for keeper; future gates carry their own labels).
171
+ * Symmetric with `PermissionError`'s `required_roles`: clients see what
172
+ * the route demanded, not what their credential is.
173
+ */
174
+ export declare const CredentialTypeRequiredError: z.ZodObject<{
175
+ error: z.ZodLiteral<"credential_type_required">;
176
+ required_credential_types: z.ZodReadonly<z.ZodArray<z.ZodString>>;
117
177
  }, z.core.$loose>;
118
- export type KeeperError = z.infer<typeof KeeperError>;
178
+ export type CredentialTypeRequiredError = z.infer<typeof CredentialTypeRequiredError>;
119
179
  /** Rate limit error — returned when a rate limiter rejects the request. */
120
180
  export declare const RateLimitError: z.ZodObject<{
121
181
  error: z.ZodLiteral<"rate_limit_exceeded">;
@@ -132,6 +192,44 @@ export declare const ForeignKeyError: z.ZodObject<{
132
192
  error: z.ZodLiteral<"foreign_key_violation">;
133
193
  }, z.core.$loose>;
134
194
  export type ForeignKeyError = z.infer<typeof ForeignKeyError>;
195
+ /**
196
+ * Authorization-phase failure shapes. Surfaced when the dispatcher's
197
+ * `apply_authorization_phase` rejects a request before the handler runs —
198
+ * the route is acting-aware (input declares `acting?: ActingActor` or
199
+ * auth requires role_grants), but actor resolution failed.
200
+ *
201
+ * 400: `actor_required` (with `available[]`) for unspecified-actor on
202
+ * a multi-actor account; `actor_not_on_account` for a supplied actor
203
+ * id that doesn't belong to the authenticated account.
204
+ *
205
+ * 500: `no_actors_on_account` for a signup-invariant violation (the
206
+ * actor list enumerated empty); `account_vanished` for a torn-read
207
+ * race (account/actor row deleted between credential validation and
208
+ * the dispatcher's follow-up read).
209
+ *
210
+ * Used by `derive_error_schemas` when `auth.actor !== 'none'` so the
211
+ * merged error surface matches what the dispatcher actually emits.
212
+ */
213
+ export declare const ActorRequiredError: z.ZodObject<{
214
+ error: z.ZodLiteral<"actor_required">;
215
+ available: z.ZodArray<z.ZodObject<{
216
+ id: z.ZodString;
217
+ name: z.ZodString;
218
+ }, z.core.$loose>>;
219
+ }, z.core.$loose>;
220
+ export type ActorRequiredError = z.infer<typeof ActorRequiredError>;
221
+ export declare const ActorNotOnAccountError: z.ZodObject<{
222
+ error: z.ZodLiteral<"actor_not_on_account">;
223
+ }, z.core.$loose>;
224
+ export type ActorNotOnAccountError = z.infer<typeof ActorNotOnAccountError>;
225
+ export declare const NoActorsOnAccountError: z.ZodObject<{
226
+ error: z.ZodLiteral<"no_actors_on_account">;
227
+ }, z.core.$loose>;
228
+ export type NoActorsOnAccountError = z.infer<typeof NoActorsOnAccountError>;
229
+ export declare const AccountVanishedError: z.ZodObject<{
230
+ error: z.ZodLiteral<"account_vanished">;
231
+ }, z.core.$loose>;
232
+ export type AccountVanishedError = z.infer<typeof AccountVanishedError>;
135
233
  /**
136
234
  * Error schema map — maps HTTP status codes to Zod schemas.
137
235
  *
@@ -161,12 +259,27 @@ export type RateLimitKey = z.infer<typeof RateLimitKey>;
161
259
  * Route handlers can declare additional error schemas via `RouteSpec.errors`;
162
260
  * explicit entries override auto-derived ones for the same status code.
163
261
  *
164
- * Derivation rules:
165
- * - **Has input schema** (non-null) or **has params schema** or **has query schema**: 400 (validation error with issues)
166
- * - **auth: authenticated**: 401
167
- * - **auth: role**: 401 + 403 (with `required_role`)
168
- * - **auth: keeper**: 401 + 403 (keeper-specific)
169
- * - **rate_limit**: 429 (rate limit exceeded with `retry_after`)
262
+ * Derivation rules under the new flat-record auth shape:
263
+ * - **Has input / params / query schema**: 400 (`ValidationError`).
264
+ * - **`auth.account === 'required'`** or **`auth.actor === 'required'`**: 401
265
+ * (`ApiError`) — pre-validation 401 fires when the credential isn't there.
266
+ * `'optional'` does not derive 401.
267
+ * - **`auth.roles?.length`**: 403 (`PermissionError` carrying `required_roles`).
268
+ * - **`auth.credential_types?.length`**: 403 (`CredentialTypeRequiredError`
269
+ * carrying `required_credential_types` — symmetric with `PermissionError`).
270
+ * Today the only credential gate is keeper; future gates reuse the literal.
271
+ * - **`auth.actor !== 'none'`** (`'optional'` or `'required'`): extends 400
272
+ * with `ActorRequiredError` / `ActorNotOnAccountError` and adds 500 union
273
+ * of `NoActorsOnAccountError` / `AccountVanishedError`. The dispatcher's
274
+ * authorization phase emits these whenever it tries to resolve an actor.
275
+ * - **rate_limit**: 429 (`RateLimitError` with `retry_after`).
170
276
  */
171
- export declare const derive_error_schemas: (auth: RouteAuth, has_input: boolean, has_params?: boolean, has_query?: boolean, rate_limit?: RateLimitKey) => RouteErrorSchemas;
277
+ export interface DeriveErrorSchemasOptions {
278
+ auth: RouteAuth;
279
+ has_input?: boolean;
280
+ has_params?: boolean;
281
+ has_query?: boolean;
282
+ rate_limit?: RateLimitKey;
283
+ }
284
+ export declare const derive_error_schemas: ({ auth, has_input, has_params, has_query, rate_limit, }: DeriveErrorSchemasOptions) => RouteErrorSchemas;
172
285
  //# sourceMappingURL=error_schemas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error_schemas.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/error_schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAI/C,0CAA0C;AAC1C,eAAO,MAAM,0BAA0B,EAAG,sBAA+B,CAAC;AAE1E,uDAAuD;AACvD,eAAO,MAAM,uBAAuB,EAAG,mBAA4B,CAAC;AAEpE,6CAA6C;AAC7C,eAAO,MAAM,0BAA0B,EAAG,sBAA+B,CAAC;AAE1E,8CAA8C;AAC9C,eAAO,MAAM,0BAA0B,EAAG,sBAA+B,CAAC;AAI1E,wCAAwC;AACxC,eAAO,MAAM,6BAA6B,EAAG,yBAAkC,CAAC;AAEhF,+CAA+C;AAC/C,eAAO,MAAM,8BAA8B,EAAG,0BAAmC,CAAC;AAElF,yCAAyC;AACzC,eAAO,MAAM,yBAAyB,EAAG,qBAA8B,CAAC;AAExE,sFAAsF;AACtF,eAAO,MAAM,yBAAyB,EAAG,qBAA8B,CAAC;AAExE,qDAAqD;AACrD,eAAO,MAAM,uBAAuB,EAAG,mBAA4B,CAAC;AAIpE,uCAAuC;AACvC,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,wCAAwC;AACxC,eAAO,MAAM,uBAAuB,EAAG,mBAA4B,CAAC;AAEpE,sEAAsE;AACtE,eAAO,MAAM,6BAA6B,EAAG,0CAAmD,CAAC;AAEjG,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,EAAG,eAAwB,CAAC;AAE5D,0CAA0C;AAC1C,eAAO,MAAM,uBAAuB,EAAG,mBAA4B,CAAC;AAIpE,0DAA0D;AAC1D,eAAO,MAAM,kCAAkC,EAAG,8BAAuC,CAAC;AAE1F,wFAAwF;AACxF,eAAO,MAAM,0BAA0B,EAAG,sBAA+B,CAAC;AAE1E,8EAA8E;AAC9E,eAAO,MAAM,mCAAmC,EAAG,+BAAwC,CAAC;AAE5F,uDAAuD;AACvD,eAAO,MAAM,8BAA8B,EAAG,0BAAmC,CAAC;AAIlF,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,EAAG,sBAA+B,CAAC;AAE1E,8CAA8C;AAC9C,eAAO,MAAM,wBAAwB,EAAG,oBAA6B,CAAC;AAEtE,8DAA8D;AAC9D,eAAO,MAAM,8BAA8B,EAAG,0BAAmC,CAAC;AAIlF,0DAA0D;AAC1D,eAAO,MAAM,wBAAwB,EAAG,oBAA6B,CAAC;AAEtE,0GAA0G;AAC1G,eAAO,MAAM,qBAAqB,EAAG,iBAA0B,CAAC;AAEhE,gDAAgD;AAChD,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,sDAAsD;AACtD,eAAO,MAAM,+BAA+B,EAAG,2BAAoC,CAAC;AAEpF,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,6DAA6D;AAC7D,eAAO,MAAM,oCAAoC,EAAG,gCAAyC,CAAC;AAE9F,0DAA0D;AAC1D,eAAO,MAAM,iCAAiC,EAAG,6BAAsC,CAAC;AAIxF,6DAA6D;AAC7D,eAAO,MAAM,4BAA4B,EAAG,wBAAiC,CAAC;AAE9E,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,EAAG,oBAA6B,CAAC;AAItE,kDAAkD;AAClD,eAAO,MAAM,2BAA2B,EAAG,uBAAgC,CAAC;AAE5E,oDAAoD;AACpD,eAAO,MAAM,qBAAqB,EAAG,iBAA0B,CAAC;AAEhE,iEAAiE;AACjE,eAAO,MAAM,0BAA0B,EAAG,sBAA+B,CAAC;AAE1E,6CAA6C;AAC7C,eAAO,MAAM,mBAAmB,EAAG,eAAwB,CAAC;AAE5D,wEAAwE;AACxE,eAAO,MAAM,gCAAgC,EAAG,4BAAqC,CAAC;AAKtF,iFAAiF;AACjF,eAAO,MAAM,QAAQ;;iBAAqC,CAAC;AAC3D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;iBAS1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,yFAAyF;AACzF,eAAO,MAAM,eAAe;;;iBAG1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,4FAA4F;AAC5F,eAAO,MAAM,WAAW;;;iBAGtB,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,2EAA2E;AAC3E,eAAO,MAAM,cAAc;;;iBAGzB,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D,uFAAuF;AACvF,eAAO,MAAM,oBAAoB;;iBAE/B,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE,qFAAqF;AACrF,eAAO,MAAM,eAAe;;iBAE1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAEnE;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY;;;;EAAoC,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,oBAAoB,GAChC,MAAM,SAAS,EACf,WAAW,OAAO,EAClB,oBAAkB,EAClB,mBAAiB,EACjB,aAAa,YAAY,KACvB,iBA4BF,CAAC"}
1
+ {"version":3,"file":"error_schemas.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/error_schemas.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@
12
12
  * @module
13
13
  */
14
14
  import { z } from 'zod';
15
+ import { needs_actor } from './auth_shape.js';
15
16
  // --- Core: Validation (auto-derived by route spec middleware) ---
16
17
  /** Request body failed Zod validation. */
17
18
  export const ERROR_INVALID_REQUEST_BODY = 'invalid_request_body';
@@ -26,6 +27,16 @@ export const ERROR_INVALID_QUERY_PARAMS = 'invalid_query_params';
26
27
  export const ERROR_AUTHENTICATION_REQUIRED = 'authentication_required';
27
28
  /** Authenticated but missing required role. */
28
29
  export const ERROR_INSUFFICIENT_PERMISSIONS = 'insufficient_permissions';
30
+ /**
31
+ * Route requires a credential type the request didn't arrive on.
32
+ * Symmetric with `ERROR_INSUFFICIENT_PERMISSIONS` + `required_roles`:
33
+ * the body carries `required_credential_types: ReadonlyArray<string>`
34
+ * — what the route demanded, not what arrived. Today the only
35
+ * credential gate is keeper (`['daemon_token']`); future gates
36
+ * (`agent_token`, `group_actor_token`) reuse the same literal and
37
+ * label themselves through the array.
38
+ */
39
+ export const ERROR_CREDENTIAL_TYPE_REQUIRED = 'credential_type_required';
29
40
  /** Rate limiter rejected the request. */
30
41
  export const ERROR_RATE_LIMIT_EXCEEDED = 'rate_limit_exceeded';
31
42
  /** Username or password is wrong (intentionally vague for enumeration prevention). */
@@ -43,9 +54,40 @@ export const ERROR_BEARER_REJECTED_BROWSER = 'bearer_token_rejected_in_browser_c
43
54
  export const ERROR_INVALID_TOKEN = 'invalid_token';
44
55
  /** Token references a deleted account. */
45
56
  export const ERROR_ACCOUNT_NOT_FOUND = 'account_not_found';
57
+ /**
58
+ * Multi-actor account requires the request to carry an explicit `acting`
59
+ * field naming the actor the request is acting as, so the dispatcher's
60
+ * authorization phase doesn't pick a default actor silently. Returned
61
+ * with the available actors so the client can prompt.
62
+ */
63
+ export const ERROR_ACTOR_REQUIRED = 'actor_required';
64
+ /**
65
+ * Supplied `acting` field does not name an actor on the authenticated
66
+ * account.
67
+ */
68
+ export const ERROR_ACTOR_NOT_ON_ACCOUNT = 'actor_not_on_account';
69
+ /**
70
+ * Authenticated account exists but has no actors. Server invariant
71
+ * violation — signup / bootstrap always create an actor in the same
72
+ * transaction. Surfaced from the dispatcher's authorization phase as a
73
+ * 500 so the operator sees the corruption signal rather than a confusing
74
+ * 4xx. Distinct from `ERROR_ACCOUNT_VANISHED`: the actor list was
75
+ * enumerated successfully and came back empty.
76
+ */
77
+ export const ERROR_NO_ACTORS_ON_ACCOUNT = 'no_actors_on_account';
78
+ /**
79
+ * Authentication validated an account, but a follow-up read in the
80
+ * authorization phase came back null — the account or its named actor
81
+ * row was deleted between the credential check and the dispatcher's
82
+ * `build_request_context` / `build_account_context` step. Torn read,
83
+ * not a missing-actor invariant violation. Surfaced as 500 so the
84
+ * operator sees the race signal; clients can retry. Distinct from
85
+ * `ERROR_ACCOUNT_NOT_FOUND` (stale token referencing a long-deleted
86
+ * account, raised at credential validation) and
87
+ * `ERROR_NO_ACTORS_ON_ACCOUNT` (the actor list enumerated empty).
88
+ */
89
+ export const ERROR_ACCOUNT_VANISHED = 'account_vanished';
46
90
  // --- Keeper / daemon token ---
47
- /** Keeper routes require daemon_token credential type. */
48
- export const ERROR_KEEPER_REQUIRES_DAEMON_TOKEN = 'keeper_requires_daemon_token';
49
91
  /** Daemon token header present but malformed or not matching current/previous token. */
50
92
  export const ERROR_INVALID_DAEMON_TOKEN = 'invalid_daemon_token';
51
93
  /** Daemon token valid but keeper account not yet resolved (pre-bootstrap). */
@@ -77,8 +119,8 @@ export const ERROR_INVITE_ACCOUNT_EXISTS_EMAIL = 'invite_account_exists_email';
77
119
  // --- Admin routes ---
78
120
  /** Admin tried to grant a role that is not web-grantable. */
79
121
  export const ERROR_ROLE_NOT_WEB_GRANTABLE = 'role_not_web_grantable';
80
- /** Permit ID not found or not owned by the target actor. */
81
- export const ERROR_PERMIT_NOT_FOUND = 'permit_not_found';
122
+ /** Role grant ID not found or not owned by the target actor. */
123
+ export const ERROR_ROLE_GRANT_NOT_FOUND = 'role_grant_not_found';
82
124
  /** Query parameter `event_type` is not a valid audit event type. */
83
125
  export const ERROR_INVALID_EVENT_TYPE = 'invalid_event_type';
84
126
  // --- DB table browser ---
@@ -109,15 +151,34 @@ export const ValidationError = z.looseObject({
109
151
  path: z.array(z.union([z.string(), z.number()])),
110
152
  })),
111
153
  });
112
- /** Permission error — returned by `require_role()` when the required role is missing. */
154
+ /**
155
+ * Permission error — returned by `require_role()` and the dispatcher's
156
+ * post-authorization role gate when the actor's role_grants don't include any
157
+ * of the route's `auth.roles`.
158
+ *
159
+ * `required_roles` carries the full disjunction the route declared
160
+ * (`auth.roles` from the new flat-record shape). Single-role specs surface
161
+ * as a one-element array; multi-role disjunctions show every admittable
162
+ * role so clients can render targeted copy ("requires admin or steward").
163
+ */
113
164
  export const PermissionError = z.looseObject({
114
165
  error: z.literal(ERROR_INSUFFICIENT_PERMISSIONS),
115
- required_role: z.string(),
166
+ required_roles: z.array(z.string()).readonly(),
116
167
  });
117
- /** Keeper credential error — returned by `require_keeper` when credential type is wrong. */
118
- export const KeeperError = z.looseObject({
119
- error: z.literal(ERROR_KEEPER_REQUIRES_DAEMON_TOKEN),
120
- credential_type: z.string(),
168
+ /**
169
+ * Credential-type error — returned by the dispatcher's post-authorization
170
+ * credential gate (and the `require_credential_types` REST middleware) when
171
+ * the request's credential type isn't in the route's
172
+ * `auth.credential_types` allowlist.
173
+ *
174
+ * `required_credential_types` carries what the route declared
175
+ * (`['daemon_token']` for keeper; future gates carry their own labels).
176
+ * Symmetric with `PermissionError`'s `required_roles`: clients see what
177
+ * the route demanded, not what their credential is.
178
+ */
179
+ export const CredentialTypeRequiredError = z.looseObject({
180
+ error: z.literal(ERROR_CREDENTIAL_TYPE_REQUIRED),
181
+ required_credential_types: z.array(z.string()).readonly(),
121
182
  });
122
183
  /** Rate limit error — returned when a rate limiter rejects the request. */
123
184
  export const RateLimitError = z.looseObject({
@@ -132,6 +193,37 @@ export const PayloadTooLargeError = z.looseObject({
132
193
  export const ForeignKeyError = z.looseObject({
133
194
  error: z.literal(ERROR_FOREIGN_KEY_VIOLATION),
134
195
  });
196
+ /**
197
+ * Authorization-phase failure shapes. Surfaced when the dispatcher's
198
+ * `apply_authorization_phase` rejects a request before the handler runs —
199
+ * the route is acting-aware (input declares `acting?: ActingActor` or
200
+ * auth requires role_grants), but actor resolution failed.
201
+ *
202
+ * 400: `actor_required` (with `available[]`) for unspecified-actor on
203
+ * a multi-actor account; `actor_not_on_account` for a supplied actor
204
+ * id that doesn't belong to the authenticated account.
205
+ *
206
+ * 500: `no_actors_on_account` for a signup-invariant violation (the
207
+ * actor list enumerated empty); `account_vanished` for a torn-read
208
+ * race (account/actor row deleted between credential validation and
209
+ * the dispatcher's follow-up read).
210
+ *
211
+ * Used by `derive_error_schemas` when `auth.actor !== 'none'` so the
212
+ * merged error surface matches what the dispatcher actually emits.
213
+ */
214
+ export const ActorRequiredError = z.looseObject({
215
+ error: z.literal(ERROR_ACTOR_REQUIRED),
216
+ available: z.array(z.looseObject({ id: z.string(), name: z.string() })),
217
+ });
218
+ export const ActorNotOnAccountError = z.looseObject({
219
+ error: z.literal(ERROR_ACTOR_NOT_ON_ACCOUNT),
220
+ });
221
+ export const NoActorsOnAccountError = z.looseObject({
222
+ error: z.literal(ERROR_NO_ACTORS_ON_ACCOUNT),
223
+ });
224
+ export const AccountVanishedError = z.looseObject({
225
+ error: z.literal(ERROR_ACCOUNT_VANISHED),
226
+ });
135
227
  /**
136
228
  * Rate limit key type — declares what a route or RPC action's rate limiter
137
229
  * is keyed on.
@@ -143,39 +235,39 @@ export const ForeignKeyError = z.looseObject({
143
235
  * - `'both'` — both keys.
144
236
  */
145
237
  export const RateLimitKey = z.enum(['ip', 'account', 'both']);
146
- /**
147
- * Derive error schemas from a route's auth requirement, input schema, and rate limit config.
148
- *
149
- * Returns the error schemas that middleware will auto-produce for this route.
150
- * Route handlers can declare additional error schemas via `RouteSpec.errors`;
151
- * explicit entries override auto-derived ones for the same status code.
152
- *
153
- * Derivation rules:
154
- * - **Has input schema** (non-null) or **has params schema** or **has query schema**: 400 (validation error with issues)
155
- * - **auth: authenticated**: 401
156
- * - **auth: role**: 401 + 403 (with `required_role`)
157
- * - **auth: keeper**: 401 + 403 (keeper-specific)
158
- * - **rate_limit**: 429 (rate limit exceeded with `retry_after`)
159
- */
160
- export const derive_error_schemas = (auth, has_input, has_params = false, has_query = false, rate_limit) => {
238
+ export const derive_error_schemas = ({ auth, has_input = false, has_params = false, has_query = false, rate_limit, }) => {
161
239
  const errors = {};
162
- if (has_input || has_params || has_query) {
240
+ const has_validation = has_input || has_params || has_query;
241
+ if (needs_actor(auth)) {
242
+ errors[400] = has_validation
243
+ ? z.union([ValidationError, ActorRequiredError, ActorNotOnAccountError])
244
+ : z.union([ActorRequiredError, ActorNotOnAccountError]);
245
+ errors[500] = z.union([NoActorsOnAccountError, AccountVanishedError]);
246
+ }
247
+ else if (has_validation) {
163
248
  errors[400] = ValidationError;
164
249
  }
165
- switch (auth.type) {
166
- case 'none':
167
- break;
168
- case 'authenticated':
169
- errors[401] = ApiError;
170
- break;
171
- case 'role':
172
- errors[401] = ApiError;
173
- errors[403] = PermissionError;
174
- break;
175
- case 'keeper':
176
- errors[401] = ApiError;
177
- errors[403] = KeeperError;
178
- break;
250
+ // 401 fires when the dispatcher's pre-validation gate rejects an
251
+ // unauthenticated caller — `account === 'required'` (no credential) or
252
+ // `actor === 'required'` (no credential to resolve an actor against,
253
+ // per registry-time invariant 3 forbidding accountless actors in v1).
254
+ if (auth.account === 'required' || auth.actor === 'required') {
255
+ errors[401] = ApiError;
256
+ }
257
+ // 403 fires when `auth.roles` or `auth.credential_types` rejects a
258
+ // resolved request context. With both axes set, the 403 body could be
259
+ // either shape — emit the union so DEV-mode error-schema validation
260
+ // accepts whichever the dispatcher produced.
261
+ const has_role_gate = !!auth.roles?.length;
262
+ const has_credential_gate = !!auth.credential_types?.length;
263
+ if (has_role_gate && has_credential_gate) {
264
+ errors[403] = z.union([PermissionError, CredentialTypeRequiredError]);
265
+ }
266
+ else if (has_role_gate) {
267
+ errors[403] = PermissionError;
268
+ }
269
+ else if (has_credential_gate) {
270
+ errors[403] = CredentialTypeRequiredError;
179
271
  }
180
272
  if (rate_limit) {
181
273
  errors[429] = RateLimitError;
@@ -16,6 +16,7 @@
16
16
  *
17
17
  * @module
18
18
  */
19
+ import type { ContentfulStatusCode } from 'hono/utils/http-status';
19
20
  import { type JsonrpcErrorCode, type JsonrpcErrorObject } from './jsonrpc.js';
20
21
  /** Default message for unknown errors. */
21
22
  export declare const UNKNOWN_ERROR_MESSAGE = "unknown error";
@@ -97,13 +98,37 @@ export declare const HTTP_STATUS_TO_JSONRPC_ERROR_CODE: Record<number, JsonrpcEr
97
98
  * Map a JSON-RPC error code to an HTTP status code.
98
99
  *
99
100
  * Returns 500 for unrecognized codes (consumer-defined codes
100
- * without a mapping default to internal server error).
101
+ * without a mapping default to internal server error). The return
102
+ * is narrowed to Hono's `ContentfulStatusCode` so call sites can
103
+ * pass the result to `c.json(body, status)` without `as any` —
104
+ * 499 (nginx "client closed request") is non-standard and gets
105
+ * absorbed by the cast here rather than at every dispatcher branch.
101
106
  */
102
- export declare const jsonrpc_error_code_to_http_status: (code: JsonrpcErrorCode) => number;
107
+ export declare const jsonrpc_error_code_to_http_status: (code: JsonrpcErrorCode) => ContentfulStatusCode;
103
108
  /**
104
109
  * Map an HTTP status code to a JSON-RPC error code.
105
110
  *
106
111
  * Returns `internal_error` (-32603) for unrecognized status codes.
107
112
  */
108
113
  export declare const http_status_to_jsonrpc_error_code: (status: number) => JsonrpcErrorCode;
114
+ /**
115
+ * Reverse map of `JSONRPC_ERROR_CODES` — JSON-RPC error code → name.
116
+ *
117
+ * Used by REST emitters that need a stable string identifier for the
118
+ * code in their flat-shape error body (`{error: '<name>', ...}`)
119
+ * without inventing a separate vocabulary. Built once at module load
120
+ * from the canonical `JSONRPC_ERROR_CODES` map so the two cannot drift.
121
+ *
122
+ * Consumer-defined codes outside the standard taxonomy are not present;
123
+ * `jsonrpc_error_code_to_name` falls back to `'internal_error'` so the
124
+ * REST shape always carries some reason rather than `undefined`.
125
+ */
126
+ export declare const JSONRPC_ERROR_CODE_TO_NAME: Readonly<Record<number, JsonrpcErrorName>>;
127
+ /**
128
+ * Map a JSON-RPC error code to its canonical name (`'not_found'`,
129
+ * `'forbidden'`, etc.). Falls back to `'internal_error'` for codes
130
+ * outside the standard taxonomy so REST emitters that read this for
131
+ * their `error` field always have a stable string to emit.
132
+ */
133
+ export declare const jsonrpc_error_code_to_name: (code: JsonrpcErrorCode) => JsonrpcErrorName;
109
134
  //# sourceMappingURL=jsonrpc_errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsonrpc_errors.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/jsonrpc_errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAMN,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,MAAM,cAAc,CAAC;AAEtB,0CAA0C;AAC1C,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,sEAAsE;AACtE,MAAM,MAAM,gBAAgB,GACzB,aAAa,GACb,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,iBAAiB,GACjB,WAAW,GACX,WAAW,GACX,UAAU,GACV,kBAAkB,GAClB,cAAc,GACd,qBAAqB,GACrB,SAAS,GACT,gBAAgB,GAChB,mBAAmB,CAAC;AAEvB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,EA0C1B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAE3D;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,EAmG7B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC;AAEtF;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEH,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY;CAK3F;AAWD;;;;GAIG;AACH,eAAO,MAAM,cAAc;8CAXQ,kBAAkB;kDAAlB,kBAAkB;mDAAlB,kBAAkB;iDAAlB,kBAAkB;iDAAlB,kBAAkB;kDAAlB,kBAAkB;4CAAlB,kBAAkB;4CAAlB,kBAAkB;2CAAlB,kBAAkB;mDAAlB,kBAAkB;+CAAlB,kBAAkB;sDAAlB,kBAAkB;0CAAlB,kBAAkB;iDAAlB,kBAAkB;oDAAlB,kBAAkB;CA2BqC,CAAC;AAI3F;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkBpE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAMzC,CAAC;AAEvC;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,GAAI,MAAM,gBAAgB,KAAG,MAClB,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,GAAI,QAAQ,MAAM,KAAG,gBACa,CAAC"}
1
+ {"version":3,"file":"jsonrpc_errors.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/jsonrpc_errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAMN,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,MAAM,cAAc,CAAC;AAEtB,0CAA0C;AAC1C,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,sEAAsE;AACtE,MAAM,MAAM,gBAAgB,GACzB,aAAa,GACb,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,iBAAiB,GACjB,WAAW,GACX,WAAW,GACX,UAAU,GACV,kBAAkB,GAClB,cAAc,GACd,qBAAqB,GACrB,SAAS,GACT,gBAAgB,GAChB,mBAAmB,CAAC;AAEvB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,EA0C1B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAE3D;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,EAmG7B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC;AAEtF;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEH,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY;CAK3F;AAWD;;;;GAIG;AACH,eAAO,MAAM,cAAc;8CAXQ,kBAAkB;kDAAlB,kBAAkB;mDAAlB,kBAAkB;iDAAlB,kBAAkB;iDAAlB,kBAAkB;kDAAlB,kBAAkB;4CAAlB,kBAAkB;4CAAlB,kBAAkB;2CAAlB,kBAAkB;mDAAlB,kBAAkB;+CAAlB,kBAAkB;sDAAlB,kBAAkB;0CAAlB,kBAAkB;iDAAlB,kBAAkB;oDAAlB,kBAAkB;CA2BqC,CAAC;AAI3F;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkBpE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAMzC,CAAC;AAEvC;;;;;;;;;GASG;AACH,eAAO,MAAM,iCAAiC,GAAI,MAAM,gBAAgB,KAAG,oBACQ,CAAC;AAEpF;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,GAAI,QAAQ,MAAM,KAAG,gBACa,CAAC;AAEjF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAMjF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GAAI,MAAM,gBAAgB,KAAG,gBACL,CAAC"}
@@ -242,12 +242,36 @@ export const HTTP_STATUS_TO_JSONRPC_ERROR_CODE = Object.fromEntries(Object.entri
242
242
  * Map a JSON-RPC error code to an HTTP status code.
243
243
  *
244
244
  * Returns 500 for unrecognized codes (consumer-defined codes
245
- * without a mapping default to internal server error).
245
+ * without a mapping default to internal server error). The return
246
+ * is narrowed to Hono's `ContentfulStatusCode` so call sites can
247
+ * pass the result to `c.json(body, status)` without `as any` —
248
+ * 499 (nginx "client closed request") is non-standard and gets
249
+ * absorbed by the cast here rather than at every dispatcher branch.
246
250
  */
247
- export const jsonrpc_error_code_to_http_status = (code) => JSONRPC_ERROR_CODE_TO_HTTP_STATUS[code] ?? 500;
251
+ export const jsonrpc_error_code_to_http_status = (code) => (JSONRPC_ERROR_CODE_TO_HTTP_STATUS[code] ?? 500);
248
252
  /**
249
253
  * Map an HTTP status code to a JSON-RPC error code.
250
254
  *
251
255
  * Returns `internal_error` (-32603) for unrecognized status codes.
252
256
  */
253
257
  export const http_status_to_jsonrpc_error_code = (status) => HTTP_STATUS_TO_JSONRPC_ERROR_CODE[status] ?? JSONRPC_ERROR_CODES.internal_error;
258
+ /**
259
+ * Reverse map of `JSONRPC_ERROR_CODES` — JSON-RPC error code → name.
260
+ *
261
+ * Used by REST emitters that need a stable string identifier for the
262
+ * code in their flat-shape error body (`{error: '<name>', ...}`)
263
+ * without inventing a separate vocabulary. Built once at module load
264
+ * from the canonical `JSONRPC_ERROR_CODES` map so the two cannot drift.
265
+ *
266
+ * Consumer-defined codes outside the standard taxonomy are not present;
267
+ * `jsonrpc_error_code_to_name` falls back to `'internal_error'` so the
268
+ * REST shape always carries some reason rather than `undefined`.
269
+ */
270
+ export const JSONRPC_ERROR_CODE_TO_NAME = Object.freeze(Object.fromEntries(Object.entries(JSONRPC_ERROR_CODES).map(([name, code]) => [code, name])));
271
+ /**
272
+ * Map a JSON-RPC error code to its canonical name (`'not_found'`,
273
+ * `'forbidden'`, etc.). Falls back to `'internal_error'` for codes
274
+ * outside the standard taxonomy so REST emitters that read this for
275
+ * their `error` field always have a stable string to emit.
276
+ */
277
+ export const jsonrpc_error_code_to_name = (code) => JSONRPC_ERROR_CODE_TO_NAME[code] ?? 'internal_error';