@fuzdev/fuz_app 0.1.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 (457) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/dist/actions/action_bridge.d.ts +65 -0
  4. package/dist/actions/action_bridge.d.ts.map +1 -0
  5. package/dist/actions/action_bridge.js +76 -0
  6. package/dist/actions/action_codegen.d.ts +97 -0
  7. package/dist/actions/action_codegen.d.ts.map +1 -0
  8. package/dist/actions/action_codegen.js +280 -0
  9. package/dist/actions/action_registry.d.ts +35 -0
  10. package/dist/actions/action_registry.d.ts.map +1 -0
  11. package/dist/actions/action_registry.js +83 -0
  12. package/dist/actions/action_spec.d.ts +169 -0
  13. package/dist/actions/action_spec.d.ts.map +1 -0
  14. package/dist/actions/action_spec.js +76 -0
  15. package/dist/auth/account_queries.d.ts +96 -0
  16. package/dist/auth/account_queries.d.ts.map +1 -0
  17. package/dist/auth/account_queries.js +172 -0
  18. package/dist/auth/account_routes.d.ts +86 -0
  19. package/dist/auth/account_routes.d.ts.map +1 -0
  20. package/dist/auth/account_routes.js +406 -0
  21. package/dist/auth/account_schema.d.ts +192 -0
  22. package/dist/auth/account_schema.d.ts.map +1 -0
  23. package/dist/auth/account_schema.js +105 -0
  24. package/dist/auth/admin_routes.d.ts +29 -0
  25. package/dist/auth/admin_routes.d.ts.map +1 -0
  26. package/dist/auth/admin_routes.js +193 -0
  27. package/dist/auth/api_token.d.ts +33 -0
  28. package/dist/auth/api_token.d.ts.map +1 -0
  29. package/dist/auth/api_token.js +36 -0
  30. package/dist/auth/api_token_queries.d.ts +80 -0
  31. package/dist/auth/api_token_queries.d.ts.map +1 -0
  32. package/dist/auth/api_token_queries.js +116 -0
  33. package/dist/auth/app_settings_queries.d.ts +33 -0
  34. package/dist/auth/app_settings_queries.d.ts.map +1 -0
  35. package/dist/auth/app_settings_queries.js +51 -0
  36. package/dist/auth/app_settings_routes.d.ts +27 -0
  37. package/dist/auth/app_settings_routes.d.ts.map +1 -0
  38. package/dist/auth/app_settings_routes.js +66 -0
  39. package/dist/auth/app_settings_schema.d.ts +35 -0
  40. package/dist/auth/app_settings_schema.d.ts.map +1 -0
  41. package/dist/auth/app_settings_schema.js +22 -0
  42. package/dist/auth/audit_log_queries.d.ts +90 -0
  43. package/dist/auth/audit_log_queries.d.ts.map +1 -0
  44. package/dist/auth/audit_log_queries.js +205 -0
  45. package/dist/auth/audit_log_routes.d.ts +33 -0
  46. package/dist/auth/audit_log_routes.d.ts.map +1 -0
  47. package/dist/auth/audit_log_routes.js +106 -0
  48. package/dist/auth/audit_log_schema.d.ts +259 -0
  49. package/dist/auth/audit_log_schema.d.ts.map +1 -0
  50. package/dist/auth/audit_log_schema.js +123 -0
  51. package/dist/auth/bearer_auth.d.ts +32 -0
  52. package/dist/auth/bearer_auth.d.ts.map +1 -0
  53. package/dist/auth/bearer_auth.js +90 -0
  54. package/dist/auth/bootstrap_account.d.ts +82 -0
  55. package/dist/auth/bootstrap_account.d.ts.map +1 -0
  56. package/dist/auth/bootstrap_account.js +97 -0
  57. package/dist/auth/bootstrap_routes.d.ts +74 -0
  58. package/dist/auth/bootstrap_routes.d.ts.map +1 -0
  59. package/dist/auth/bootstrap_routes.js +154 -0
  60. package/dist/auth/daemon_token.d.ts +49 -0
  61. package/dist/auth/daemon_token.d.ts.map +1 -0
  62. package/dist/auth/daemon_token.js +49 -0
  63. package/dist/auth/daemon_token_middleware.d.ts +93 -0
  64. package/dist/auth/daemon_token_middleware.d.ts.map +1 -0
  65. package/dist/auth/daemon_token_middleware.js +167 -0
  66. package/dist/auth/ddl.d.ts +27 -0
  67. package/dist/auth/ddl.d.ts.map +1 -0
  68. package/dist/auth/ddl.js +111 -0
  69. package/dist/auth/deps.d.ts +52 -0
  70. package/dist/auth/deps.d.ts.map +1 -0
  71. package/dist/auth/deps.js +10 -0
  72. package/dist/auth/invite_queries.d.ts +68 -0
  73. package/dist/auth/invite_queries.d.ts.map +1 -0
  74. package/dist/auth/invite_queries.js +105 -0
  75. package/dist/auth/invite_routes.d.ts +18 -0
  76. package/dist/auth/invite_routes.d.ts.map +1 -0
  77. package/dist/auth/invite_routes.js +129 -0
  78. package/dist/auth/invite_schema.d.ts +51 -0
  79. package/dist/auth/invite_schema.d.ts.map +1 -0
  80. package/dist/auth/invite_schema.js +25 -0
  81. package/dist/auth/keyring.d.ts +87 -0
  82. package/dist/auth/keyring.d.ts.map +1 -0
  83. package/dist/auth/keyring.js +142 -0
  84. package/dist/auth/middleware.d.ts +40 -0
  85. package/dist/auth/middleware.d.ts.map +1 -0
  86. package/dist/auth/middleware.js +64 -0
  87. package/dist/auth/migrations.d.ts +42 -0
  88. package/dist/auth/migrations.d.ts.map +1 -0
  89. package/dist/auth/migrations.js +79 -0
  90. package/dist/auth/password.d.ts +39 -0
  91. package/dist/auth/password.d.ts.map +1 -0
  92. package/dist/auth/password.js +25 -0
  93. package/dist/auth/password_argon2.d.ts +43 -0
  94. package/dist/auth/password_argon2.d.ts.map +1 -0
  95. package/dist/auth/password_argon2.js +76 -0
  96. package/dist/auth/permit_queries.d.ts +72 -0
  97. package/dist/auth/permit_queries.d.ts.map +1 -0
  98. package/dist/auth/permit_queries.js +116 -0
  99. package/dist/auth/request_context.d.ts +114 -0
  100. package/dist/auth/request_context.d.ts.map +1 -0
  101. package/dist/auth/request_context.js +176 -0
  102. package/dist/auth/require_keeper.d.ts +20 -0
  103. package/dist/auth/require_keeper.d.ts.map +1 -0
  104. package/dist/auth/require_keeper.js +35 -0
  105. package/dist/auth/role_schema.d.ts +69 -0
  106. package/dist/auth/role_schema.d.ts.map +1 -0
  107. package/dist/auth/role_schema.js +70 -0
  108. package/dist/auth/route_guards.d.ts +21 -0
  109. package/dist/auth/route_guards.d.ts.map +1 -0
  110. package/dist/auth/route_guards.js +32 -0
  111. package/dist/auth/session_cookie.d.ts +158 -0
  112. package/dist/auth/session_cookie.d.ts.map +1 -0
  113. package/dist/auth/session_cookie.js +135 -0
  114. package/dist/auth/session_lifecycle.d.ts +35 -0
  115. package/dist/auth/session_lifecycle.d.ts.map +1 -0
  116. package/dist/auth/session_lifecycle.js +27 -0
  117. package/dist/auth/session_middleware.d.ts +33 -0
  118. package/dist/auth/session_middleware.d.ts.map +1 -0
  119. package/dist/auth/session_middleware.js +62 -0
  120. package/dist/auth/session_queries.d.ts +135 -0
  121. package/dist/auth/session_queries.d.ts.map +1 -0
  122. package/dist/auth/session_queries.js +186 -0
  123. package/dist/auth/signup_routes.d.ts +32 -0
  124. package/dist/auth/signup_routes.d.ts.map +1 -0
  125. package/dist/auth/signup_routes.js +150 -0
  126. package/dist/cli/args.d.ts +48 -0
  127. package/dist/cli/args.d.ts.map +1 -0
  128. package/dist/cli/args.js +76 -0
  129. package/dist/cli/config.d.ts +48 -0
  130. package/dist/cli/config.d.ts.map +1 -0
  131. package/dist/cli/config.js +77 -0
  132. package/dist/cli/daemon.d.ts +82 -0
  133. package/dist/cli/daemon.d.ts.map +1 -0
  134. package/dist/cli/daemon.js +149 -0
  135. package/dist/cli/help.d.ts +85 -0
  136. package/dist/cli/help.d.ts.map +1 -0
  137. package/dist/cli/help.js +138 -0
  138. package/dist/cli/logger.d.ts +46 -0
  139. package/dist/cli/logger.d.ts.map +1 -0
  140. package/dist/cli/logger.js +48 -0
  141. package/dist/cli/util.d.ts +36 -0
  142. package/dist/cli/util.d.ts.map +1 -0
  143. package/dist/cli/util.js +50 -0
  144. package/dist/crypto.d.ts +13 -0
  145. package/dist/crypto.d.ts.map +1 -0
  146. package/dist/crypto.js +19 -0
  147. package/dist/db/assert_row.d.ts +18 -0
  148. package/dist/db/assert_row.d.ts.map +1 -0
  149. package/dist/db/assert_row.js +24 -0
  150. package/dist/db/create_db.d.ts +38 -0
  151. package/dist/db/create_db.d.ts.map +1 -0
  152. package/dist/db/create_db.js +57 -0
  153. package/dist/db/db.d.ts +97 -0
  154. package/dist/db/db.d.ts.map +1 -0
  155. package/dist/db/db.js +76 -0
  156. package/dist/db/db_pg.d.ts +21 -0
  157. package/dist/db/db_pg.d.ts.map +1 -0
  158. package/dist/db/db_pg.js +45 -0
  159. package/dist/db/db_pglite.d.ts +21 -0
  160. package/dist/db/db_pglite.d.ts.map +1 -0
  161. package/dist/db/db_pglite.js +28 -0
  162. package/dist/db/migrate.d.ts +67 -0
  163. package/dist/db/migrate.d.ts.map +1 -0
  164. package/dist/db/migrate.js +118 -0
  165. package/dist/db/pg_error.d.ts +16 -0
  166. package/dist/db/pg_error.d.ts.map +1 -0
  167. package/dist/db/pg_error.js +15 -0
  168. package/dist/db/query_deps.d.ts +14 -0
  169. package/dist/db/query_deps.d.ts.map +1 -0
  170. package/dist/db/query_deps.js +9 -0
  171. package/dist/db/sql_identifier.d.ts +27 -0
  172. package/dist/db/sql_identifier.d.ts.map +1 -0
  173. package/dist/db/sql_identifier.js +31 -0
  174. package/dist/db/status.d.ts +62 -0
  175. package/dist/db/status.d.ts.map +1 -0
  176. package/dist/db/status.js +116 -0
  177. package/dist/dev/setup.d.ts +159 -0
  178. package/dist/dev/setup.d.ts.map +1 -0
  179. package/dist/dev/setup.js +265 -0
  180. package/dist/env/dotenv.d.ts +25 -0
  181. package/dist/env/dotenv.d.ts.map +1 -0
  182. package/dist/env/dotenv.js +52 -0
  183. package/dist/env/load.d.ts +52 -0
  184. package/dist/env/load.d.ts.map +1 -0
  185. package/dist/env/load.js +79 -0
  186. package/dist/env/mask.d.ts +19 -0
  187. package/dist/env/mask.d.ts.map +1 -0
  188. package/dist/env/mask.js +26 -0
  189. package/dist/env/resolve.d.ts +126 -0
  190. package/dist/env/resolve.d.ts.map +1 -0
  191. package/dist/env/resolve.js +200 -0
  192. package/dist/hono_context.d.ts +48 -0
  193. package/dist/hono_context.d.ts.map +1 -0
  194. package/dist/hono_context.js +22 -0
  195. package/dist/http/common_routes.d.ts +52 -0
  196. package/dist/http/common_routes.d.ts.map +1 -0
  197. package/dist/http/common_routes.js +65 -0
  198. package/dist/http/db_routes.d.ts +57 -0
  199. package/dist/http/db_routes.d.ts.map +1 -0
  200. package/dist/http/db_routes.js +176 -0
  201. package/dist/http/error_schemas.d.ts +169 -0
  202. package/dist/http/error_schemas.d.ts.map +1 -0
  203. package/dist/http/error_schemas.js +178 -0
  204. package/dist/http/middleware_spec.d.ts +19 -0
  205. package/dist/http/middleware_spec.d.ts.map +1 -0
  206. package/dist/http/middleware_spec.js +9 -0
  207. package/dist/http/origin.d.ts +57 -0
  208. package/dist/http/origin.d.ts.map +1 -0
  209. package/dist/http/origin.js +207 -0
  210. package/dist/http/proxy.d.ts +112 -0
  211. package/dist/http/proxy.d.ts.map +1 -0
  212. package/dist/http/proxy.js +240 -0
  213. package/dist/http/route_spec.d.ts +197 -0
  214. package/dist/http/route_spec.d.ts.map +1 -0
  215. package/dist/http/route_spec.js +243 -0
  216. package/dist/http/schema_helpers.d.ts +64 -0
  217. package/dist/http/schema_helpers.d.ts.map +1 -0
  218. package/dist/http/schema_helpers.js +90 -0
  219. package/dist/http/surface.d.ts +132 -0
  220. package/dist/http/surface.d.ts.map +1 -0
  221. package/dist/http/surface.js +156 -0
  222. package/dist/http/surface_query.d.ts +77 -0
  223. package/dist/http/surface_query.d.ts.map +1 -0
  224. package/dist/http/surface_query.js +86 -0
  225. package/dist/rate_limiter.d.ts +94 -0
  226. package/dist/rate_limiter.d.ts.map +1 -0
  227. package/dist/rate_limiter.js +156 -0
  228. package/dist/realtime/sse.d.ts +80 -0
  229. package/dist/realtime/sse.d.ts.map +1 -0
  230. package/dist/realtime/sse.js +109 -0
  231. package/dist/realtime/sse_auth_guard.d.ts +93 -0
  232. package/dist/realtime/sse_auth_guard.d.ts.map +1 -0
  233. package/dist/realtime/sse_auth_guard.js +111 -0
  234. package/dist/realtime/subscriber_registry.d.ts +85 -0
  235. package/dist/realtime/subscriber_registry.d.ts.map +1 -0
  236. package/dist/realtime/subscriber_registry.js +108 -0
  237. package/dist/runtime/deno.d.ts +21 -0
  238. package/dist/runtime/deno.d.ts.map +1 -0
  239. package/dist/runtime/deno.js +83 -0
  240. package/dist/runtime/deps.d.ts +113 -0
  241. package/dist/runtime/deps.d.ts.map +1 -0
  242. package/dist/runtime/deps.js +10 -0
  243. package/dist/runtime/fs.d.ts +15 -0
  244. package/dist/runtime/fs.d.ts.map +1 -0
  245. package/dist/runtime/fs.js +17 -0
  246. package/dist/runtime/mock.d.ts +81 -0
  247. package/dist/runtime/mock.d.ts.map +1 -0
  248. package/dist/runtime/mock.js +195 -0
  249. package/dist/runtime/node.d.ts +17 -0
  250. package/dist/runtime/node.d.ts.map +1 -0
  251. package/dist/runtime/node.js +117 -0
  252. package/dist/schema_meta.d.ts +16 -0
  253. package/dist/schema_meta.d.ts.map +1 -0
  254. package/dist/schema_meta.js +9 -0
  255. package/dist/sensitivity.d.ts +15 -0
  256. package/dist/sensitivity.d.ts.map +1 -0
  257. package/dist/sensitivity.js +9 -0
  258. package/dist/server/app_backend.d.ts +74 -0
  259. package/dist/server/app_backend.d.ts.map +1 -0
  260. package/dist/server/app_backend.js +39 -0
  261. package/dist/server/app_server.d.ts +201 -0
  262. package/dist/server/app_server.d.ts.map +1 -0
  263. package/dist/server/app_server.js +266 -0
  264. package/dist/server/env.d.ts +68 -0
  265. package/dist/server/env.d.ts.map +1 -0
  266. package/dist/server/env.js +95 -0
  267. package/dist/server/startup.d.ts +22 -0
  268. package/dist/server/startup.d.ts.map +1 -0
  269. package/dist/server/startup.js +48 -0
  270. package/dist/server/static.d.ts +39 -0
  271. package/dist/server/static.d.ts.map +1 -0
  272. package/dist/server/static.js +38 -0
  273. package/dist/server/validate_nginx.d.ts +34 -0
  274. package/dist/server/validate_nginx.d.ts.map +1 -0
  275. package/dist/server/validate_nginx.js +118 -0
  276. package/dist/testing/CLAUDE.md +3 -0
  277. package/dist/testing/admin_integration.d.ts +45 -0
  278. package/dist/testing/admin_integration.d.ts.map +1 -0
  279. package/dist/testing/admin_integration.js +840 -0
  280. package/dist/testing/adversarial_404.d.ts +15 -0
  281. package/dist/testing/adversarial_404.d.ts.map +1 -0
  282. package/dist/testing/adversarial_404.js +118 -0
  283. package/dist/testing/adversarial_headers.d.ts +36 -0
  284. package/dist/testing/adversarial_headers.d.ts.map +1 -0
  285. package/dist/testing/adversarial_headers.js +128 -0
  286. package/dist/testing/adversarial_input.d.ts +56 -0
  287. package/dist/testing/adversarial_input.d.ts.map +1 -0
  288. package/dist/testing/adversarial_input.js +494 -0
  289. package/dist/testing/app_server.d.ts +169 -0
  290. package/dist/testing/app_server.d.ts.map +1 -0
  291. package/dist/testing/app_server.js +240 -0
  292. package/dist/testing/assert_dev_env.d.ts +10 -0
  293. package/dist/testing/assert_dev_env.d.ts.map +1 -0
  294. package/dist/testing/assert_dev_env.js +13 -0
  295. package/dist/testing/assertions.d.ts +61 -0
  296. package/dist/testing/assertions.d.ts.map +1 -0
  297. package/dist/testing/assertions.js +96 -0
  298. package/dist/testing/attack_surface.d.ts +63 -0
  299. package/dist/testing/attack_surface.d.ts.map +1 -0
  300. package/dist/testing/attack_surface.js +224 -0
  301. package/dist/testing/audit_completeness.d.ts +29 -0
  302. package/dist/testing/audit_completeness.d.ts.map +1 -0
  303. package/dist/testing/audit_completeness.js +410 -0
  304. package/dist/testing/auth_apps.d.ts +55 -0
  305. package/dist/testing/auth_apps.d.ts.map +1 -0
  306. package/dist/testing/auth_apps.js +122 -0
  307. package/dist/testing/data_exposure.d.ts +62 -0
  308. package/dist/testing/data_exposure.d.ts.map +1 -0
  309. package/dist/testing/data_exposure.js +297 -0
  310. package/dist/testing/db.d.ts +111 -0
  311. package/dist/testing/db.d.ts.map +1 -0
  312. package/dist/testing/db.js +258 -0
  313. package/dist/testing/entities.d.ts +21 -0
  314. package/dist/testing/entities.d.ts.map +1 -0
  315. package/dist/testing/entities.js +42 -0
  316. package/dist/testing/error_coverage.d.ts +78 -0
  317. package/dist/testing/error_coverage.d.ts.map +1 -0
  318. package/dist/testing/error_coverage.js +135 -0
  319. package/dist/testing/integration.d.ts +37 -0
  320. package/dist/testing/integration.d.ts.map +1 -0
  321. package/dist/testing/integration.js +1139 -0
  322. package/dist/testing/integration_helpers.d.ts +107 -0
  323. package/dist/testing/integration_helpers.d.ts.map +1 -0
  324. package/dist/testing/integration_helpers.js +246 -0
  325. package/dist/testing/middleware.d.ts +125 -0
  326. package/dist/testing/middleware.d.ts.map +1 -0
  327. package/dist/testing/middleware.js +210 -0
  328. package/dist/testing/rate_limiting.d.ts +43 -0
  329. package/dist/testing/rate_limiting.d.ts.map +1 -0
  330. package/dist/testing/rate_limiting.js +216 -0
  331. package/dist/testing/round_trip.d.ts +37 -0
  332. package/dist/testing/round_trip.d.ts.map +1 -0
  333. package/dist/testing/round_trip.js +128 -0
  334. package/dist/testing/schema_generators.d.ts +33 -0
  335. package/dist/testing/schema_generators.d.ts.map +1 -0
  336. package/dist/testing/schema_generators.js +137 -0
  337. package/dist/testing/standard.d.ts +49 -0
  338. package/dist/testing/standard.d.ts.map +1 -0
  339. package/dist/testing/standard.js +16 -0
  340. package/dist/testing/stubs.d.ts +96 -0
  341. package/dist/testing/stubs.d.ts.map +1 -0
  342. package/dist/testing/stubs.js +192 -0
  343. package/dist/testing/surface_invariants.d.ts +189 -0
  344. package/dist/testing/surface_invariants.d.ts.map +1 -0
  345. package/dist/testing/surface_invariants.js +450 -0
  346. package/dist/ui/AccountSessions.svelte +75 -0
  347. package/dist/ui/AccountSessions.svelte.d.ts +19 -0
  348. package/dist/ui/AccountSessions.svelte.d.ts.map +1 -0
  349. package/dist/ui/AdminAccounts.svelte +107 -0
  350. package/dist/ui/AdminAccounts.svelte.d.ts +19 -0
  351. package/dist/ui/AdminAccounts.svelte.d.ts.map +1 -0
  352. package/dist/ui/AdminAuditLog.svelte +144 -0
  353. package/dist/ui/AdminAuditLog.svelte.d.ts +4 -0
  354. package/dist/ui/AdminAuditLog.svelte.d.ts.map +1 -0
  355. package/dist/ui/AdminInvites.svelte +142 -0
  356. package/dist/ui/AdminInvites.svelte.d.ts +4 -0
  357. package/dist/ui/AdminInvites.svelte.d.ts.map +1 -0
  358. package/dist/ui/AdminOverview.svelte +337 -0
  359. package/dist/ui/AdminOverview.svelte.d.ts +4 -0
  360. package/dist/ui/AdminOverview.svelte.d.ts.map +1 -0
  361. package/dist/ui/AdminPermitHistory.svelte +61 -0
  362. package/dist/ui/AdminPermitHistory.svelte.d.ts +19 -0
  363. package/dist/ui/AdminPermitHistory.svelte.d.ts.map +1 -0
  364. package/dist/ui/AdminSessions.svelte +85 -0
  365. package/dist/ui/AdminSessions.svelte.d.ts +19 -0
  366. package/dist/ui/AdminSessions.svelte.d.ts.map +1 -0
  367. package/dist/ui/AdminSettings.svelte +32 -0
  368. package/dist/ui/AdminSettings.svelte.d.ts +19 -0
  369. package/dist/ui/AdminSettings.svelte.d.ts.map +1 -0
  370. package/dist/ui/AdminSurface.svelte +42 -0
  371. package/dist/ui/AdminSurface.svelte.d.ts +4 -0
  372. package/dist/ui/AdminSurface.svelte.d.ts.map +1 -0
  373. package/dist/ui/AppShell.svelte +93 -0
  374. package/dist/ui/AppShell.svelte.d.ts +20 -0
  375. package/dist/ui/AppShell.svelte.d.ts.map +1 -0
  376. package/dist/ui/BootstrapForm.svelte +105 -0
  377. package/dist/ui/BootstrapForm.svelte.d.ts +4 -0
  378. package/dist/ui/BootstrapForm.svelte.d.ts.map +1 -0
  379. package/dist/ui/ColumnLayout.svelte +46 -0
  380. package/dist/ui/ColumnLayout.svelte.d.ts +11 -0
  381. package/dist/ui/ColumnLayout.svelte.d.ts.map +1 -0
  382. package/dist/ui/ConfirmButton.svelte +125 -0
  383. package/dist/ui/ConfirmButton.svelte.d.ts +54 -0
  384. package/dist/ui/ConfirmButton.svelte.d.ts.map +1 -0
  385. package/dist/ui/Datatable.svelte +185 -0
  386. package/dist/ui/Datatable.svelte.d.ts +35 -0
  387. package/dist/ui/Datatable.svelte.d.ts.map +1 -0
  388. package/dist/ui/LoginForm.svelte +82 -0
  389. package/dist/ui/LoginForm.svelte.d.ts +8 -0
  390. package/dist/ui/LoginForm.svelte.d.ts.map +1 -0
  391. package/dist/ui/LogoutButton.svelte +36 -0
  392. package/dist/ui/LogoutButton.svelte.d.ts +10 -0
  393. package/dist/ui/LogoutButton.svelte.d.ts.map +1 -0
  394. package/dist/ui/MenuLink.svelte +35 -0
  395. package/dist/ui/MenuLink.svelte.d.ts +12 -0
  396. package/dist/ui/MenuLink.svelte.d.ts.map +1 -0
  397. package/dist/ui/OpenSignupToggle.svelte +36 -0
  398. package/dist/ui/OpenSignupToggle.svelte.d.ts +19 -0
  399. package/dist/ui/OpenSignupToggle.svelte.d.ts.map +1 -0
  400. package/dist/ui/PopoverButton.svelte +136 -0
  401. package/dist/ui/PopoverButton.svelte.d.ts +63 -0
  402. package/dist/ui/PopoverButton.svelte.d.ts.map +1 -0
  403. package/dist/ui/SignupForm.svelte +117 -0
  404. package/dist/ui/SignupForm.svelte.d.ts +7 -0
  405. package/dist/ui/SignupForm.svelte.d.ts.map +1 -0
  406. package/dist/ui/SurfaceExplorer.svelte +287 -0
  407. package/dist/ui/SurfaceExplorer.svelte.d.ts +8 -0
  408. package/dist/ui/SurfaceExplorer.svelte.d.ts.map +1 -0
  409. package/dist/ui/account_sessions_state.svelte.d.ts +15 -0
  410. package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -0
  411. package/dist/ui/account_sessions_state.svelte.js +45 -0
  412. package/dist/ui/admin_accounts_state.svelte.d.ts +19 -0
  413. package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -0
  414. package/dist/ui/admin_accounts_state.svelte.js +65 -0
  415. package/dist/ui/admin_invites_state.svelte.d.ts +19 -0
  416. package/dist/ui/admin_invites_state.svelte.d.ts.map +1 -0
  417. package/dist/ui/admin_invites_state.svelte.js +71 -0
  418. package/dist/ui/admin_sessions_state.svelte.d.ts +18 -0
  419. package/dist/ui/admin_sessions_state.svelte.d.ts.map +1 -0
  420. package/dist/ui/admin_sessions_state.svelte.js +62 -0
  421. package/dist/ui/app_settings_state.svelte.d.ts +14 -0
  422. package/dist/ui/app_settings_state.svelte.d.ts.map +1 -0
  423. package/dist/ui/app_settings_state.svelte.js +44 -0
  424. package/dist/ui/audit_log_state.svelte.d.ts +40 -0
  425. package/dist/ui/audit_log_state.svelte.d.ts.map +1 -0
  426. package/dist/ui/audit_log_state.svelte.js +153 -0
  427. package/dist/ui/auth_state.svelte.d.ts +85 -0
  428. package/dist/ui/auth_state.svelte.d.ts.map +1 -0
  429. package/dist/ui/auth_state.svelte.js +238 -0
  430. package/dist/ui/datatable.d.ts +25 -0
  431. package/dist/ui/datatable.d.ts.map +1 -0
  432. package/dist/ui/datatable.js +9 -0
  433. package/dist/ui/enter_advance.d.ts +13 -0
  434. package/dist/ui/enter_advance.d.ts.map +1 -0
  435. package/dist/ui/enter_advance.js +30 -0
  436. package/dist/ui/loadable.svelte.d.ts +55 -0
  437. package/dist/ui/loadable.svelte.d.ts.map +1 -0
  438. package/dist/ui/loadable.svelte.js +75 -0
  439. package/dist/ui/popover.svelte.d.ts +137 -0
  440. package/dist/ui/popover.svelte.d.ts.map +1 -0
  441. package/dist/ui/popover.svelte.js +288 -0
  442. package/dist/ui/position_helpers.d.ts +27 -0
  443. package/dist/ui/position_helpers.d.ts.map +1 -0
  444. package/dist/ui/position_helpers.js +81 -0
  445. package/dist/ui/sidebar_state.svelte.d.ts +30 -0
  446. package/dist/ui/sidebar_state.svelte.d.ts.map +1 -0
  447. package/dist/ui/sidebar_state.svelte.js +39 -0
  448. package/dist/ui/table_state.svelte.d.ts +63 -0
  449. package/dist/ui/table_state.svelte.d.ts.map +1 -0
  450. package/dist/ui/table_state.svelte.js +117 -0
  451. package/dist/ui/ui_fetch.d.ts +29 -0
  452. package/dist/ui/ui_fetch.d.ts.map +1 -0
  453. package/dist/ui/ui_fetch.js +37 -0
  454. package/dist/ui/ui_format.d.ts +63 -0
  455. package/dist/ui/ui_format.d.ts.map +1 -0
  456. package/dist/ui/ui_format.js +196 -0
  457. package/package.json +121 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Auth middleware stack factory.
3
+ *
4
+ * Creates the standard middleware layers (origin, session, request_context,
5
+ * bearer_auth, optional daemon_token) from configuration.
6
+ *
7
+ * @module
8
+ */
9
+ import { ApiError, RateLimitError } from '../http/error_schemas.js';
10
+ /**
11
+ * Create the auth middleware stack.
12
+ *
13
+ * Returns `[origin, session, request_context, bearer_auth]` middleware specs
14
+ * for the given path pattern. When `daemon_token_state` is provided, appends
15
+ * a 5th `daemon_token` layer. Apps can append extra entries for non-standard
16
+ * paths (e.g., tx's `/tx` binary endpoint).
17
+ *
18
+ * @param deps - stateless capabilities (keyring, db)
19
+ * @param options - middleware configuration (allowed_origins, session_options, path, daemon_token_state)
20
+ * @returns the middleware spec array
21
+ */
22
+ export const create_auth_middleware_specs = async (deps, options) => {
23
+ const { keyring, db } = deps;
24
+ const { allowed_origins, session_options, path = '/api/*', daemon_token_state, bearer_ip_rate_limiter, } = options;
25
+ const query_deps = { db };
26
+ // Dynamic imports to avoid pulling heavy dependencies into this module
27
+ // when consumers only need types (MiddlewareSpec, RouteSpec, etc.)
28
+ const [{ verify_request_source }, { create_session_middleware }, { create_request_context_middleware }, { create_bearer_auth_middleware },] = await Promise.all([
29
+ import('../http/origin.js'),
30
+ import('./session_middleware.js'),
31
+ import('./request_context.js'),
32
+ import('./bearer_auth.js'),
33
+ ]);
34
+ const session_middleware = create_session_middleware(keyring, session_options);
35
+ const request_context_middleware = create_request_context_middleware(query_deps, deps.log);
36
+ const bearer_auth_middleware = create_bearer_auth_middleware(query_deps, bearer_ip_rate_limiter, deps.log);
37
+ const specs = [
38
+ {
39
+ name: 'origin',
40
+ path,
41
+ handler: verify_request_source(allowed_origins),
42
+ errors: { 403: ApiError },
43
+ },
44
+ { name: 'session', path, handler: session_middleware },
45
+ { name: 'request_context', path, handler: request_context_middleware },
46
+ {
47
+ name: 'bearer_auth',
48
+ path,
49
+ handler: bearer_auth_middleware,
50
+ errors: { 401: ApiError, 403: ApiError, 429: RateLimitError },
51
+ },
52
+ ];
53
+ if (daemon_token_state) {
54
+ const { create_daemon_token_middleware } = await import('./daemon_token_middleware.js');
55
+ const daemon_token_middleware = create_daemon_token_middleware(daemon_token_state, query_deps);
56
+ specs.push({
57
+ name: 'daemon_token',
58
+ path,
59
+ handler: daemon_token_middleware,
60
+ errors: { 401: ApiError, 500: ApiError, 503: ApiError },
61
+ });
62
+ }
63
+ return specs;
64
+ };
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Auth schema migrations.
3
+ *
4
+ * Single v0 migration for the fuz identity system tables.
5
+ * Consumed by `run_migrations` with namespace `'fuz_auth'`.
6
+ *
7
+ * Collapsed to a single v0 for the 0.1.0 release — no production databases
8
+ * exist, so the prior v0–v6 development iterations are consolidated.
9
+ * Post-0.1.0, each new migration appends as v1, v2, etc.
10
+ *
11
+ * To add a migration, append a new entry to `AUTH_MIGRATIONS`:
12
+ *
13
+ * ```ts
14
+ * // v1: add display_name to account
15
+ * {
16
+ * name: 'account_display_name',
17
+ * up: async (db) => {
18
+ * await db.query('ALTER TABLE account ADD COLUMN display_name TEXT');
19
+ * },
20
+ * },
21
+ * ```
22
+ *
23
+ * Migrations are forward-only (no down). Use `IF NOT EXISTS` / `IF EXISTS`
24
+ * for DDL safety. Named migrations (`{name, up}`) are preferred for
25
+ * debuggability — the name appears in error messages on failure.
26
+ *
27
+ * @module
28
+ */
29
+ import type { Migration, MigrationNamespace } from '../db/migrate.js';
30
+ /** Namespace identifier for fuz_app auth migrations. */
31
+ export declare const AUTH_MIGRATION_NAMESPACE = "fuz_auth";
32
+ /**
33
+ * Auth schema migrations in order.
34
+ *
35
+ * - v0: Full auth schema — account (with email_verified), actor, permit,
36
+ * auth_session, api_token, audit_log (with seq), bootstrap_lock, invite,
37
+ * app_settings, plus all indexes and seeds.
38
+ */
39
+ export declare const AUTH_MIGRATIONS: Array<Migration>;
40
+ /** Pre-composed migration namespace for auth tables. */
41
+ export declare const AUTH_MIGRATION_NS: MigrationNamespace;
42
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAuBH,OAAO,KAAK,EAAC,SAAS,EAAE,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AAEpE,wDAAwD;AACxD,eAAO,MAAM,wBAAwB,aAAa,CAAC;AAEnD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,SAAS,CAkC5C,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,iBAAiB,EAAE,kBAG/B,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Auth schema migrations.
3
+ *
4
+ * Single v0 migration for the fuz identity system tables.
5
+ * Consumed by `run_migrations` with namespace `'fuz_auth'`.
6
+ *
7
+ * Collapsed to a single v0 for the 0.1.0 release — no production databases
8
+ * exist, so the prior v0–v6 development iterations are consolidated.
9
+ * Post-0.1.0, each new migration appends as v1, v2, etc.
10
+ *
11
+ * To add a migration, append a new entry to `AUTH_MIGRATIONS`:
12
+ *
13
+ * ```ts
14
+ * // v1: add display_name to account
15
+ * {
16
+ * name: 'account_display_name',
17
+ * up: async (db) => {
18
+ * await db.query('ALTER TABLE account ADD COLUMN display_name TEXT');
19
+ * },
20
+ * },
21
+ * ```
22
+ *
23
+ * Migrations are forward-only (no down). Use `IF NOT EXISTS` / `IF EXISTS`
24
+ * for DDL safety. Named migrations (`{name, up}`) are preferred for
25
+ * debuggability — the name appears in error messages on failure.
26
+ *
27
+ * @module
28
+ */
29
+ import { ACCOUNT_SCHEMA, ACCOUNT_EMAIL_INDEX, ACCOUNT_USERNAME_CI_INDEX, ACTOR_SCHEMA, ACTOR_INDEX, PERMIT_SCHEMA, PERMIT_INDEXES, AUTH_SESSION_SCHEMA, AUTH_SESSION_INDEXES, API_TOKEN_SCHEMA, API_TOKEN_INDEX, BOOTSTRAP_LOCK_SCHEMA, BOOTSTRAP_LOCK_SEED, INVITE_SCHEMA, INVITE_INDEXES, APP_SETTINGS_SCHEMA, APP_SETTINGS_SEED, } from './ddl.js';
30
+ import { AUDIT_LOG_SCHEMA, AUDIT_LOG_INDEXES } from './audit_log_schema.js';
31
+ /** Namespace identifier for fuz_app auth migrations. */
32
+ export const AUTH_MIGRATION_NAMESPACE = 'fuz_auth';
33
+ /**
34
+ * Auth schema migrations in order.
35
+ *
36
+ * - v0: Full auth schema — account (with email_verified), actor, permit,
37
+ * auth_session, api_token, audit_log (with seq), bootstrap_lock, invite,
38
+ * app_settings, plus all indexes and seeds.
39
+ */
40
+ export const AUTH_MIGRATIONS = [
41
+ // v0: full auth schema — all IF NOT EXISTS, safe for existing databases
42
+ {
43
+ name: 'full_auth_schema',
44
+ up: async (db) => {
45
+ await db.query(ACCOUNT_SCHEMA);
46
+ await db.query(ACCOUNT_EMAIL_INDEX);
47
+ await db.query(ACCOUNT_USERNAME_CI_INDEX);
48
+ await db.query(ACTOR_SCHEMA);
49
+ await db.query(ACTOR_INDEX);
50
+ await db.query(PERMIT_SCHEMA);
51
+ for (const sql of PERMIT_INDEXES) {
52
+ await db.query(sql); // eslint-disable-line no-await-in-loop
53
+ }
54
+ await db.query(AUTH_SESSION_SCHEMA);
55
+ for (const sql of AUTH_SESSION_INDEXES) {
56
+ await db.query(sql); // eslint-disable-line no-await-in-loop
57
+ }
58
+ await db.query(API_TOKEN_SCHEMA);
59
+ await db.query(API_TOKEN_INDEX);
60
+ await db.query(AUDIT_LOG_SCHEMA);
61
+ for (const sql of AUDIT_LOG_INDEXES) {
62
+ await db.query(sql); // eslint-disable-line no-await-in-loop
63
+ }
64
+ await db.query(BOOTSTRAP_LOCK_SCHEMA);
65
+ await db.query(BOOTSTRAP_LOCK_SEED);
66
+ await db.query(INVITE_SCHEMA);
67
+ for (const sql of INVITE_INDEXES) {
68
+ await db.query(sql); // eslint-disable-line no-await-in-loop
69
+ }
70
+ await db.query(APP_SETTINGS_SCHEMA);
71
+ await db.query(APP_SETTINGS_SEED);
72
+ },
73
+ },
74
+ ];
75
+ /** Pre-composed migration namespace for auth tables. */
76
+ export const AUTH_MIGRATION_NS = {
77
+ namespace: AUTH_MIGRATION_NAMESPACE,
78
+ migrations: AUTH_MIGRATIONS,
79
+ };
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Password hashing type definitions.
3
+ *
4
+ * Defines the `PasswordHashDeps` injectable interface and `PASSWORD_LENGTH_MIN`.
5
+ * Concrete Argon2id implementation lives in `password_argon2.ts`.
6
+ *
7
+ * @module
8
+ */
9
+ import { z } from 'zod';
10
+ /** Minimum password length (OWASP recommendation). */
11
+ export declare const PASSWORD_LENGTH_MIN = 12;
12
+ /** Maximum password length. Caps hashing cost to prevent DoS via oversized passwords. */
13
+ export declare const PASSWORD_LENGTH_MAX = 300;
14
+ /** Password for account creation or password change — enforces current length policy. Also usable for client-side UX validation. */
15
+ export declare const Password: z.ZodString;
16
+ export type Password = z.infer<typeof Password>;
17
+ /** Password submitted for login or verification — minimal validation for forward-compatibility if length requirements change. */
18
+ export declare const PasswordProvided: z.ZodString;
19
+ export type PasswordProvided = z.infer<typeof PasswordProvided>;
20
+ /**
21
+ * Injectable password hashing dependencies.
22
+ *
23
+ * Groups all three password operations for injection in route factories
24
+ * and other callers. Use `Pick<PasswordHashDeps, ...>` when only a subset is needed:
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * // Login handler only needs verification
29
+ * password: Pick<PasswordHashDeps, 'verify_password' | 'verify_dummy'>;
30
+ * // Bootstrap only needs hashing
31
+ * password: Pick<PasswordHashDeps, 'hash_password'>;
32
+ * ```
33
+ */
34
+ export interface PasswordHashDeps {
35
+ hash_password: (password: string) => Promise<string>;
36
+ verify_password: (password: string, password_hash: string) => Promise<boolean>;
37
+ verify_dummy: (password: string) => Promise<boolean>;
38
+ }
39
+ //# sourceMappingURL=password.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/password.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,sDAAsD;AACtD,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,yFAAyF;AACzF,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,oIAAoI;AACpI,eAAO,MAAM,QAAQ,aAIU,CAAC;AAChC,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEhD,iIAAiI;AACjI,eAAO,MAAM,gBAAgB,aAIE,CAAC;AAChC,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,gBAAgB;IAChC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACrD"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Password hashing type definitions.
3
+ *
4
+ * Defines the `PasswordHashDeps` injectable interface and `PASSWORD_LENGTH_MIN`.
5
+ * Concrete Argon2id implementation lives in `password_argon2.ts`.
6
+ *
7
+ * @module
8
+ */
9
+ import { z } from 'zod';
10
+ /** Minimum password length (OWASP recommendation). */
11
+ export const PASSWORD_LENGTH_MIN = 12;
12
+ /** Maximum password length. Caps hashing cost to prevent DoS via oversized passwords. */
13
+ export const PASSWORD_LENGTH_MAX = 300;
14
+ /** Password for account creation or password change — enforces current length policy. Also usable for client-side UX validation. */
15
+ export const Password = z
16
+ .string()
17
+ .min(PASSWORD_LENGTH_MIN)
18
+ .max(PASSWORD_LENGTH_MAX)
19
+ .meta({ sensitivity: 'secret' });
20
+ /** Password submitted for login or verification — minimal validation for forward-compatibility if length requirements change. */
21
+ export const PasswordProvided = z
22
+ .string()
23
+ .min(1)
24
+ .max(PASSWORD_LENGTH_MAX)
25
+ .meta({ sensitivity: 'secret' });
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Argon2id password hashing implementation.
3
+ *
4
+ * Uses `@node-rs/argon2` for native performance with OWASP-recommended parameters.
5
+ * Includes timing attack resistance via `verify_dummy`.
6
+ *
7
+ * Import `argon2_password_deps` for use as `PasswordHashDeps` in `AppDeps`.
8
+ *
9
+ * @module
10
+ */
11
+ import type { PasswordHashDeps } from './password.js';
12
+ /**
13
+ * Hash a password using Argon2id.
14
+ *
15
+ * @param password - the plaintext password to hash
16
+ * @returns the Argon2id hash string
17
+ */
18
+ export declare const hash_password: (password: string) => Promise<string>;
19
+ /**
20
+ * Verify a password against an Argon2id hash.
21
+ *
22
+ * @param password - the plaintext password to verify
23
+ * @param password_hash - the Argon2id hash to verify against
24
+ * @returns `true` if the password matches
25
+ */
26
+ export declare const verify_password: (password: string, password_hash: string) => Promise<boolean>;
27
+ /**
28
+ * Verify a password against a dummy hash for timing attack resistance.
29
+ *
30
+ * Always returns `false`, but takes the same time as a real verification.
31
+ * Call when account lookup fails to prevent timing-based user enumeration.
32
+ *
33
+ * @param password - the plaintext password to "verify"
34
+ * @returns always `false`
35
+ */
36
+ export declare const verify_dummy: (password: string) => Promise<boolean>;
37
+ /**
38
+ * Argon2id implementation of `PasswordHashDeps`.
39
+ *
40
+ * Pass as `password` in `AppDeps` / `CreateAppBackendOptions` for production use.
41
+ */
42
+ export declare const argon2_password_deps: PasswordHashDeps;
43
+ //# sourceMappingURL=password_argon2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password_argon2.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/password_argon2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,eAAe,CAAC;AAiBpD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,MAAM,CAEpE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAC3B,UAAU,MAAM,EAChB,eAAe,MAAM,KACnB,OAAO,CAAC,OAAO,CAMjB,CAAC;AAKF;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,OAAO,CAMpE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,gBAIlC,CAAC"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Argon2id password hashing implementation.
3
+ *
4
+ * Uses `@node-rs/argon2` for native performance with OWASP-recommended parameters.
5
+ * Includes timing attack resistance via `verify_dummy`.
6
+ *
7
+ * Import `argon2_password_deps` for use as `PasswordHashDeps` in `AppDeps`.
8
+ *
9
+ * @module
10
+ */
11
+ import { hash, verify } from '@node-rs/argon2';
12
+ /**
13
+ * Argon2id options following OWASP recommendations.
14
+ *
15
+ * @see https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html
16
+ */
17
+ /** @node-rs/argon2 `Algorithm.Argon2id` — const enum, cannot import with isolatedModules. */
18
+ const ARGON2ID = 2;
19
+ const ARGON2_OPTIONS = {
20
+ algorithm: ARGON2ID,
21
+ memoryCost: 19456, // 19 MiB
22
+ timeCost: 2,
23
+ parallelism: 1,
24
+ };
25
+ /**
26
+ * Hash a password using Argon2id.
27
+ *
28
+ * @param password - the plaintext password to hash
29
+ * @returns the Argon2id hash string
30
+ */
31
+ export const hash_password = async (password) => {
32
+ return hash(password, ARGON2_OPTIONS);
33
+ };
34
+ /**
35
+ * Verify a password against an Argon2id hash.
36
+ *
37
+ * @param password - the plaintext password to verify
38
+ * @param password_hash - the Argon2id hash to verify against
39
+ * @returns `true` if the password matches
40
+ */
41
+ export const verify_password = async (password, password_hash) => {
42
+ try {
43
+ return await verify(password_hash, password);
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ };
49
+ /** Cached dummy hash for timing attack resistance. */
50
+ let dummy_hash = null;
51
+ /**
52
+ * Verify a password against a dummy hash for timing attack resistance.
53
+ *
54
+ * Always returns `false`, but takes the same time as a real verification.
55
+ * Call when account lookup fails to prevent timing-based user enumeration.
56
+ *
57
+ * @param password - the plaintext password to "verify"
58
+ * @returns always `false`
59
+ */
60
+ export const verify_dummy = async (password) => {
61
+ if (!dummy_hash) {
62
+ dummy_hash = await hash_password('dummy_password_for_timing_resistance');
63
+ }
64
+ await verify_password(password, dummy_hash);
65
+ return false;
66
+ };
67
+ /**
68
+ * Argon2id implementation of `PasswordHashDeps`.
69
+ *
70
+ * Pass as `password` in `AppDeps` / `CreateAppBackendOptions` for production use.
71
+ */
72
+ export const argon2_password_deps = {
73
+ hash_password,
74
+ verify_password,
75
+ verify_dummy,
76
+ };
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Permit database queries.
3
+ *
4
+ * Permits are time-bounded, revocable grants of a role to an actor.
5
+ * The system is safe by default — no permit, no capability.
6
+ *
7
+ * @module
8
+ */
9
+ import type { QueryDeps } from '../db/query_deps.js';
10
+ import type { Permit, GrantPermitInput } from './account_schema.js';
11
+ /**
12
+ * Grant a permit to an actor.
13
+ * Idempotent — if an active permit already exists for this actor and role,
14
+ * returns the existing permit instead of creating a duplicate.
15
+ *
16
+ * @param deps - query dependencies
17
+ * @param input - the permit fields
18
+ * @returns the created or existing active permit
19
+ */
20
+ export declare const query_grant_permit: (deps: QueryDeps, input: GrantPermitInput) => Promise<Permit>;
21
+ /**
22
+ * Revoke a permit by id, constrained to a specific actor.
23
+ *
24
+ * Requires `actor_id` to prevent cross-account revocation (IDOR guard).
25
+ * Returns `null` if the permit is not found, already revoked, or belongs
26
+ * to a different actor. Returns `{id, role}` on success for audit logging.
27
+ *
28
+ * @param deps - query dependencies
29
+ * @param permit_id - the permit to revoke
30
+ * @param actor_id - the actor that must own the permit
31
+ * @param revoked_by - the actor who revoked it (for audit trail)
32
+ */
33
+ export declare const query_revoke_permit: (deps: QueryDeps, permit_id: string, actor_id: string, revoked_by: string | null) => Promise<{
34
+ id: string;
35
+ role: string;
36
+ } | null>;
37
+ /**
38
+ * Find all active (non-revoked, non-expired) permits for an actor.
39
+ */
40
+ export declare const query_permit_find_active_for_actor: (deps: QueryDeps, actor_id: string) => Promise<Array<Permit>>;
41
+ /**
42
+ * Check if an actor has an active permit for a given role.
43
+ */
44
+ export declare const query_permit_has_role: (deps: QueryDeps, actor_id: string, role: string) => Promise<boolean>;
45
+ /**
46
+ * List all permits for an actor (including revoked/expired).
47
+ */
48
+ export declare const query_permit_list_for_actor: (deps: QueryDeps, actor_id: string) => Promise<Array<Permit>>;
49
+ /**
50
+ * Find the account ID of an account that holds an active permit for a given role.
51
+ *
52
+ * Joins permit → actor → account. Returns the first match, or `null` if none.
53
+ *
54
+ * @param deps - query dependencies
55
+ * @param role - the role to search for
56
+ * @returns the account ID, or `null`
57
+ */
58
+ export declare const query_permit_find_account_id_for_role: (deps: QueryDeps, role: string) => Promise<string | null>;
59
+ /**
60
+ * Revoke the active permit for an actor with a given role.
61
+ *
62
+ * Due to the unique partial index on `(actor_id, role) WHERE revoked_at IS NULL`,
63
+ * at most one active permit exists per actor+role combination.
64
+ *
65
+ * @param deps - query dependencies
66
+ * @param actor_id - the actor whose permit to revoke
67
+ * @param role - the role to revoke
68
+ * @param revoked_by - the actor who revoked it (for audit trail)
69
+ * @returns `true` if a permit was revoked, `false` if none was active
70
+ */
71
+ export declare const query_permit_revoke_role: (deps: QueryDeps, actor_id: string, role: string, revoked_by: string | null) => Promise<boolean>;
72
+ //# sourceMappingURL=permit_queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permit_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/permit_queries.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAC,MAAM,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAGlE;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAC9B,MAAM,SAAS,EACf,OAAO,gBAAgB,KACrB,OAAO,CAAC,MAAM,CAiBhB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAC/B,MAAM,SAAS,EACf,WAAW,MAAM,EACjB,UAAU,MAAM,EAChB,YAAY,MAAM,GAAG,IAAI,KACvB,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GAAG,IAAI,CAQ3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kCAAkC,GAC9C,MAAM,SAAS,EACf,UAAU,MAAM,KACd,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CASvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,GACjC,MAAM,SAAS,EACf,UAAU,MAAM,EAChB,MAAM,MAAM,KACV,OAAO,CAAC,OAAO,CAYjB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,GACvC,MAAM,SAAS,EACf,UAAU,MAAM,KACd,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAKvB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,qCAAqC,GACjD,MAAM,SAAS,EACf,MAAM,MAAM,KACV,OAAO,CAAC,MAAM,GAAG,IAAI,CAavB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,GACpC,MAAM,SAAS,EACf,UAAU,MAAM,EAChB,MAAM,MAAM,EACZ,YAAY,MAAM,GAAG,IAAI,KACvB,OAAO,CAAC,OAAO,CAQjB,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Permit database queries.
3
+ *
4
+ * Permits are time-bounded, revocable grants of a role to an actor.
5
+ * The system is safe by default — no permit, no capability.
6
+ *
7
+ * @module
8
+ */
9
+ import { assert_row } from '../db/assert_row.js';
10
+ /**
11
+ * Grant a permit to an actor.
12
+ * Idempotent — if an active permit already exists for this actor and role,
13
+ * returns the existing permit instead of creating a duplicate.
14
+ *
15
+ * @param deps - query dependencies
16
+ * @param input - the permit fields
17
+ * @returns the created or existing active permit
18
+ */
19
+ export const query_grant_permit = async (deps, input) => {
20
+ const inserted = await deps.db.query_one(`INSERT INTO permit (actor_id, role, expires_at, granted_by)
21
+ VALUES ($1, $2, $3, $4)
22
+ ON CONFLICT (actor_id, role) WHERE revoked_at IS NULL
23
+ DO NOTHING
24
+ RETURNING *`, [input.actor_id, input.role, input.expires_at?.toISOString() ?? null, input.granted_by ?? null]);
25
+ if (inserted)
26
+ return inserted;
27
+ // Active permit already exists — return it (idempotent grant).
28
+ const existing = await deps.db.query_one(`SELECT * FROM permit
29
+ WHERE actor_id = $1 AND role = $2 AND revoked_at IS NULL`, [input.actor_id, input.role]);
30
+ return assert_row(existing, 'idempotent permit grant');
31
+ };
32
+ /**
33
+ * Revoke a permit by id, constrained to a specific actor.
34
+ *
35
+ * Requires `actor_id` to prevent cross-account revocation (IDOR guard).
36
+ * Returns `null` if the permit is not found, already revoked, or belongs
37
+ * to a different actor. Returns `{id, role}` on success for audit logging.
38
+ *
39
+ * @param deps - query dependencies
40
+ * @param permit_id - the permit to revoke
41
+ * @param actor_id - the actor that must own the permit
42
+ * @param revoked_by - the actor who revoked it (for audit trail)
43
+ */
44
+ export const query_revoke_permit = async (deps, permit_id, actor_id, revoked_by) => {
45
+ const rows = await deps.db.query(`UPDATE permit SET revoked_at = NOW(), revoked_by = $3
46
+ WHERE id = $1 AND actor_id = $2 AND revoked_at IS NULL
47
+ RETURNING id, role`, [permit_id, actor_id, revoked_by ?? null]);
48
+ return rows[0] ?? null;
49
+ };
50
+ /**
51
+ * Find all active (non-revoked, non-expired) permits for an actor.
52
+ */
53
+ export const query_permit_find_active_for_actor = async (deps, actor_id) => {
54
+ return deps.db.query(`SELECT * FROM permit
55
+ WHERE actor_id = $1
56
+ AND revoked_at IS NULL
57
+ AND (expires_at IS NULL OR expires_at > NOW())
58
+ ORDER BY created_at`, [actor_id]);
59
+ };
60
+ /**
61
+ * Check if an actor has an active permit for a given role.
62
+ */
63
+ export const query_permit_has_role = async (deps, actor_id, role) => {
64
+ const row = await deps.db.query_one(`SELECT EXISTS(
65
+ SELECT 1 FROM permit
66
+ WHERE actor_id = $1
67
+ AND role = $2
68
+ AND revoked_at IS NULL
69
+ AND (expires_at IS NULL OR expires_at > NOW())
70
+ ) AS exists`, [actor_id, role]);
71
+ return row?.exists ?? false;
72
+ };
73
+ /**
74
+ * List all permits for an actor (including revoked/expired).
75
+ */
76
+ export const query_permit_list_for_actor = async (deps, actor_id) => {
77
+ return deps.db.query(`SELECT * FROM permit WHERE actor_id = $1 ORDER BY created_at DESC`, [actor_id]);
78
+ };
79
+ /**
80
+ * Find the account ID of an account that holds an active permit for a given role.
81
+ *
82
+ * Joins permit → actor → account. Returns the first match, or `null` if none.
83
+ *
84
+ * @param deps - query dependencies
85
+ * @param role - the role to search for
86
+ * @returns the account ID, or `null`
87
+ */
88
+ export const query_permit_find_account_id_for_role = async (deps, role) => {
89
+ const row = await deps.db.query_one(`SELECT a.id AS account_id
90
+ FROM permit p
91
+ JOIN actor act ON act.id = p.actor_id
92
+ JOIN account a ON a.id = act.account_id
93
+ WHERE p.role = $1
94
+ AND p.revoked_at IS NULL
95
+ AND (p.expires_at IS NULL OR p.expires_at > NOW())
96
+ LIMIT 1`, [role]);
97
+ return row?.account_id ?? null;
98
+ };
99
+ /**
100
+ * Revoke the active permit for an actor with a given role.
101
+ *
102
+ * Due to the unique partial index on `(actor_id, role) WHERE revoked_at IS NULL`,
103
+ * at most one active permit exists per actor+role combination.
104
+ *
105
+ * @param deps - query dependencies
106
+ * @param actor_id - the actor whose permit to revoke
107
+ * @param role - the role to revoke
108
+ * @param revoked_by - the actor who revoked it (for audit trail)
109
+ * @returns `true` if a permit was revoked, `false` if none was active
110
+ */
111
+ export const query_permit_revoke_role = async (deps, actor_id, role, revoked_by) => {
112
+ const rows = await deps.db.query(`UPDATE permit SET revoked_at = NOW(), revoked_by = $3
113
+ WHERE actor_id = $1 AND role = $2 AND revoked_at IS NULL
114
+ RETURNING id`, [actor_id, role, revoked_by ?? null]);
115
+ return rows.length > 0;
116
+ };