@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,80 @@
1
+ /**
2
+ * API token query functions for token CRUD and validation.
3
+ *
4
+ * @module
5
+ */
6
+ import type { Logger } from '@fuzdev/fuz_util/log.js';
7
+ import type { QueryDeps } from '../db/query_deps.js';
8
+ import type { ApiToken } from './account_schema.js';
9
+ /** Extended deps for `query_validate_api_token` which needs a logger. */
10
+ export interface ApiTokenQueryDeps extends QueryDeps {
11
+ log: Logger;
12
+ }
13
+ /**
14
+ * Store a new API token (the hash, not the raw token).
15
+ *
16
+ * @param deps - query dependencies
17
+ * @param id - the public token id (e.g. `tok_abc123`)
18
+ * @param account_id - the owning account
19
+ * @param name - human-readable name
20
+ * @param token_hash - blake3 hash of the raw token
21
+ * @param expires_at - optional expiration
22
+ * @returns the stored token record
23
+ */
24
+ export declare const query_create_api_token: (deps: QueryDeps, id: string, account_id: string, name: string, token_hash: string, expires_at?: Date | null) => Promise<ApiToken>;
25
+ /**
26
+ * Validate a raw API token and return the token record.
27
+ *
28
+ * Hashes the token with blake3, looks up the hash, and checks
29
+ * expiration. Updates `last_used_at` and `last_used_ip` on success
30
+ * (fire-and-forget — errors logged, never thrown).
31
+ *
32
+ * @param deps - query dependencies with logger
33
+ * @param raw_token - the raw API token from the Authorization header
34
+ * @param ip - the client IP address (for audit)
35
+ * @param pending_effects - optional array to register the usage-tracking effect for later awaiting
36
+ * @returns the token record if valid, or `undefined`
37
+ */
38
+ export declare const query_validate_api_token: (deps: ApiTokenQueryDeps, raw_token: string, ip: string | undefined, pending_effects: Array<Promise<void>> | undefined) => Promise<ApiToken | undefined>;
39
+ /**
40
+ * Revoke all tokens for an account.
41
+ *
42
+ * @param deps - query dependencies
43
+ * @param account_id - the account whose tokens to revoke
44
+ * @returns the number of tokens revoked
45
+ */
46
+ export declare const query_revoke_all_api_tokens_for_account: (deps: QueryDeps, account_id: string) => Promise<number>;
47
+ /**
48
+ * Revoke a token only if it belongs to the specified account.
49
+ *
50
+ * Prevents cross-account token revocation.
51
+ *
52
+ * @param deps - query dependencies
53
+ * @param id - the public token id
54
+ * @param account_id - the account that must own the token
55
+ * @returns `true` if a token was revoked, `false` if not found or wrong account
56
+ */
57
+ export declare const query_revoke_api_token_for_account: (deps: QueryDeps, id: string, account_id: string) => Promise<boolean>;
58
+ /**
59
+ * List all tokens for an account (does not include hashes).
60
+ *
61
+ * Columns are enumerated explicitly to exclude `token_hash`.
62
+ * Must be updated if the `api_token` table gains new columns.
63
+ */
64
+ export declare const query_api_token_list_for_account: (deps: QueryDeps, account_id: string) => Promise<Array<Omit<ApiToken, "token_hash">>>;
65
+ /**
66
+ * Enforce a per-account token limit by evicting the oldest tokens.
67
+ *
68
+ * Race safety: this function must run inside a transaction alongside the
69
+ * INSERT that created the new token. The caller (`POST /tokens/create`)
70
+ * uses the default `transaction: true` (framework-managed transaction
71
+ * wrapping in `apply_route_specs`), ensuring the INSERT + enforce_limit
72
+ * pair is atomic — concurrent token creation cannot interleave.
73
+ *
74
+ * @param deps - query dependencies (must be transaction-scoped)
75
+ * @param account_id - the account to enforce the limit for
76
+ * @param max_tokens - maximum number of tokens to keep
77
+ * @returns the number of tokens evicted
78
+ */
79
+ export declare const query_api_token_enforce_limit: (deps: QueryDeps, account_id: string, max_tokens: number) => Promise<number>;
80
+ //# sourceMappingURL=api_token_queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api_token_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/api_token_queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,qBAAqB,CAAC;AAGlD,yEAAyE;AACzE,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IACnD,GAAG,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,GAClC,MAAM,SAAS,EACf,IAAI,MAAM,EACV,YAAY,MAAM,EAClB,MAAM,MAAM,EACZ,YAAY,MAAM,EAClB,aAAa,IAAI,GAAG,IAAI,KACtB,OAAO,CAAC,QAAQ,CAQlB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,wBAAwB,GACpC,MAAM,iBAAiB,EACvB,WAAW,MAAM,EACjB,IAAI,MAAM,GAAG,SAAS,EACtB,iBAAiB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,KAC/C,OAAO,CAAC,QAAQ,GAAG,SAAS,CAuB9B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,uCAAuC,GACnD,MAAM,SAAS,EACf,YAAY,MAAM,KAChB,OAAO,CAAC,MAAM,CAMhB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,kCAAkC,GAC9C,MAAM,SAAS,EACf,IAAI,MAAM,EACV,YAAY,MAAM,KAChB,OAAO,CAAC,OAAO,CAMjB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,GAC5C,MAAM,SAAS,EACf,YAAY,MAAM,KAChB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAM7C,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,6BAA6B,GACzC,MAAM,SAAS,EACf,YAAY,MAAM,EAClB,YAAY,MAAM,KAChB,OAAO,CAAC,MAAM,CAYhB,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * API token query functions for token CRUD and validation.
3
+ *
4
+ * @module
5
+ */
6
+ import { assert_row } from '../db/assert_row.js';
7
+ import { hash_api_token } from './api_token.js';
8
+ /**
9
+ * Store a new API token (the hash, not the raw token).
10
+ *
11
+ * @param deps - query dependencies
12
+ * @param id - the public token id (e.g. `tok_abc123`)
13
+ * @param account_id - the owning account
14
+ * @param name - human-readable name
15
+ * @param token_hash - blake3 hash of the raw token
16
+ * @param expires_at - optional expiration
17
+ * @returns the stored token record
18
+ */
19
+ export const query_create_api_token = async (deps, id, account_id, name, token_hash, expires_at) => {
20
+ const row = await deps.db.query_one(`INSERT INTO api_token (id, account_id, name, token_hash, expires_at)
21
+ VALUES ($1, $2, $3, $4, $5)
22
+ RETURNING *`, [id, account_id, name, token_hash, expires_at?.toISOString() ?? null]);
23
+ return assert_row(row, 'INSERT INTO api_token');
24
+ };
25
+ /**
26
+ * Validate a raw API token and return the token record.
27
+ *
28
+ * Hashes the token with blake3, looks up the hash, and checks
29
+ * expiration. Updates `last_used_at` and `last_used_ip` on success
30
+ * (fire-and-forget — errors logged, never thrown).
31
+ *
32
+ * @param deps - query dependencies with logger
33
+ * @param raw_token - the raw API token from the Authorization header
34
+ * @param ip - the client IP address (for audit)
35
+ * @param pending_effects - optional array to register the usage-tracking effect for later awaiting
36
+ * @returns the token record if valid, or `undefined`
37
+ */
38
+ export const query_validate_api_token = async (deps, raw_token, ip, pending_effects) => {
39
+ const token_hash = hash_api_token(raw_token);
40
+ const row = await deps.db.query_one(`SELECT * FROM api_token
41
+ WHERE token_hash = $1
42
+ AND (expires_at IS NULL OR expires_at > NOW())`, [token_hash]);
43
+ if (!row)
44
+ return undefined;
45
+ // Fire-and-forget usage tracking
46
+ const p = deps.db
47
+ .query(`UPDATE api_token SET last_used_at = NOW(), last_used_ip = $1 WHERE id = $2`, [
48
+ ip ?? null,
49
+ row.id,
50
+ ])
51
+ .then(() => { }) // eslint-disable-line @typescript-eslint/no-empty-function
52
+ .catch((err) => {
53
+ deps.log.error('Failed to update last_used_at:', err);
54
+ });
55
+ pending_effects?.push(p);
56
+ return row;
57
+ };
58
+ /**
59
+ * Revoke all tokens for an account.
60
+ *
61
+ * @param deps - query dependencies
62
+ * @param account_id - the account whose tokens to revoke
63
+ * @returns the number of tokens revoked
64
+ */
65
+ export const query_revoke_all_api_tokens_for_account = async (deps, account_id) => {
66
+ const rows = await deps.db.query(`DELETE FROM api_token WHERE account_id = $1 RETURNING id`, [account_id]);
67
+ return rows.length;
68
+ };
69
+ /**
70
+ * Revoke a token only if it belongs to the specified account.
71
+ *
72
+ * Prevents cross-account token revocation.
73
+ *
74
+ * @param deps - query dependencies
75
+ * @param id - the public token id
76
+ * @param account_id - the account that must own the token
77
+ * @returns `true` if a token was revoked, `false` if not found or wrong account
78
+ */
79
+ export const query_revoke_api_token_for_account = async (deps, id, account_id) => {
80
+ const rows = await deps.db.query(`DELETE FROM api_token WHERE id = $1 AND account_id = $2 RETURNING id`, [id, account_id]);
81
+ return rows.length > 0;
82
+ };
83
+ /**
84
+ * List all tokens for an account (does not include hashes).
85
+ *
86
+ * Columns are enumerated explicitly to exclude `token_hash`.
87
+ * Must be updated if the `api_token` table gains new columns.
88
+ */
89
+ export const query_api_token_list_for_account = async (deps, account_id) => {
90
+ return deps.db.query(`SELECT id, account_id, name, expires_at, last_used_at, last_used_ip, created_at
91
+ FROM api_token WHERE account_id = $1 ORDER BY created_at DESC`, [account_id]);
92
+ };
93
+ /**
94
+ * Enforce a per-account token limit by evicting the oldest tokens.
95
+ *
96
+ * Race safety: this function must run inside a transaction alongside the
97
+ * INSERT that created the new token. The caller (`POST /tokens/create`)
98
+ * uses the default `transaction: true` (framework-managed transaction
99
+ * wrapping in `apply_route_specs`), ensuring the INSERT + enforce_limit
100
+ * pair is atomic — concurrent token creation cannot interleave.
101
+ *
102
+ * @param deps - query dependencies (must be transaction-scoped)
103
+ * @param account_id - the account to enforce the limit for
104
+ * @param max_tokens - maximum number of tokens to keep
105
+ * @returns the number of tokens evicted
106
+ */
107
+ export const query_api_token_enforce_limit = async (deps, account_id, max_tokens) => {
108
+ const rows = await deps.db.query(`DELETE FROM api_token
109
+ WHERE id IN (
110
+ SELECT id FROM api_token
111
+ WHERE account_id = $1
112
+ ORDER BY created_at DESC
113
+ OFFSET $2
114
+ ) RETURNING id`, [account_id, max_tokens]);
115
+ return rows.length;
116
+ };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * App settings database queries.
3
+ *
4
+ * Single-row table queries for global app configuration.
5
+ *
6
+ * @module
7
+ */
8
+ import type { QueryDeps } from '../db/query_deps.js';
9
+ import type { AppSettings, AppSettingsWithUsernameJson } from './app_settings_schema.js';
10
+ /**
11
+ * Load the current app settings.
12
+ *
13
+ * @param deps - query dependencies
14
+ * @returns the app settings row
15
+ */
16
+ export declare const query_app_settings_load: (deps: QueryDeps) => Promise<AppSettings>;
17
+ /**
18
+ * Load the current app settings with resolved updater username.
19
+ *
20
+ * @param deps - query dependencies
21
+ * @returns the app settings with `updated_by_username`
22
+ */
23
+ export declare const query_app_settings_load_with_username: (deps: QueryDeps) => Promise<AppSettingsWithUsernameJson>;
24
+ /**
25
+ * Update app settings and return the updated row.
26
+ *
27
+ * @param deps - query dependencies
28
+ * @param open_signup - new value for the open_signup toggle
29
+ * @param actor_id - the actor making the change
30
+ * @returns the updated app settings row
31
+ */
32
+ export declare const query_app_settings_update: (deps: QueryDeps, open_signup: boolean, actor_id: string) => Promise<AppSettings>;
33
+ //# sourceMappingURL=app_settings_queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app_settings_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/app_settings_queries.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAC,WAAW,EAAE,2BAA2B,EAAC,MAAM,0BAA0B,CAAC;AAEvF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAAU,MAAM,SAAS,KAAG,OAAO,CAAC,WAAW,CAQlF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qCAAqC,GACjD,MAAM,SAAS,KACb,OAAO,CAAC,2BAA2B,CAWrC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,GACrC,MAAM,SAAS,EACf,aAAa,OAAO,EACpB,UAAU,MAAM,KACd,OAAO,CAAC,WAAW,CASrB,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * App settings database queries.
3
+ *
4
+ * Single-row table queries for global app configuration.
5
+ *
6
+ * @module
7
+ */
8
+ /**
9
+ * Load the current app settings.
10
+ *
11
+ * @param deps - query dependencies
12
+ * @returns the app settings row
13
+ */
14
+ export const query_app_settings_load = async (deps) => {
15
+ const row = await deps.db.query_one(`SELECT open_signup, updated_at, updated_by FROM app_settings WHERE id = 1`);
16
+ if (!row) {
17
+ throw new Error('app_settings row not found — migration may not have run');
18
+ }
19
+ return row;
20
+ };
21
+ /**
22
+ * Load the current app settings with resolved updater username.
23
+ *
24
+ * @param deps - query dependencies
25
+ * @returns the app settings with `updated_by_username`
26
+ */
27
+ export const query_app_settings_load_with_username = async (deps) => {
28
+ const row = await deps.db.query_one(`SELECT s.open_signup, s.updated_at, s.updated_by, act.name AS updated_by_username
29
+ FROM app_settings s
30
+ LEFT JOIN actor act ON act.id = s.updated_by
31
+ WHERE s.id = 1`);
32
+ if (!row) {
33
+ throw new Error('app_settings row not found — migration may not have run');
34
+ }
35
+ return row;
36
+ };
37
+ /**
38
+ * Update app settings and return the updated row.
39
+ *
40
+ * @param deps - query dependencies
41
+ * @param open_signup - new value for the open_signup toggle
42
+ * @param actor_id - the actor making the change
43
+ * @returns the updated app settings row
44
+ */
45
+ export const query_app_settings_update = async (deps, open_signup, actor_id) => {
46
+ const row = await deps.db.query_one(`UPDATE app_settings SET open_signup = $1, updated_at = NOW(), updated_by = $2 WHERE id = 1 RETURNING open_signup, updated_at, updated_by`, [open_signup, actor_id]);
47
+ if (!row) {
48
+ throw new Error('app_settings row not found — migration may not have run');
49
+ }
50
+ return row;
51
+ };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Admin app settings route specs.
3
+ *
4
+ * GET and PATCH routes for managing global app settings (e.g. open signup toggle).
5
+ * All routes require the `admin` role.
6
+ *
7
+ * @module
8
+ */
9
+ import { type RouteSpec } from '../http/route_spec.js';
10
+ import { type AppSettings } from './app_settings_schema.js';
11
+ import type { RouteFactoryDeps } from './deps.js';
12
+ /**
13
+ * Per-factory configuration for app settings route specs.
14
+ */
15
+ export interface AppSettingsRouteOptions {
16
+ /** Mutable ref to the in-memory app settings — mutated on PATCH. */
17
+ app_settings: AppSettings;
18
+ }
19
+ /**
20
+ * Create admin app settings route specs.
21
+ *
22
+ * @param deps - stateless capabilities (log, on_audit_event)
23
+ * @param options - per-factory configuration
24
+ * @returns route specs for app settings management
25
+ */
26
+ export declare const create_app_settings_route_specs: (deps: Pick<RouteFactoryDeps, "log" | "on_audit_event">, options: AppSettingsRouteOptions) => Array<RouteSpec>;
27
+ //# sourceMappingURL=app_settings_routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app_settings_routes.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/app_settings_routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAkB,KAAK,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAQtE,OAAO,EAGN,KAAK,WAAW,EAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC,oEAAoE;IACpE,YAAY,EAAE,WAAW,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,GAC3C,MAAM,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,gBAAgB,CAAC,EACtD,SAAS,uBAAuB,KAC9B,KAAK,CAAC,SAAS,CAoDjB,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Admin app settings route specs.
3
+ *
4
+ * GET and PATCH routes for managing global app settings (e.g. open signup toggle).
5
+ * All routes require the `admin` role.
6
+ *
7
+ * @module
8
+ */
9
+ import { z } from 'zod';
10
+ import { get_route_input } from '../http/route_spec.js';
11
+ import { require_request_context } from './request_context.js';
12
+ import { get_client_ip } from '../http/proxy.js';
13
+ import { audit_log_fire_and_forget } from './audit_log_queries.js';
14
+ import { query_app_settings_load_with_username, query_app_settings_update, } from './app_settings_queries.js';
15
+ import { AppSettingsWithUsernameJson, UpdateAppSettingsInput, } from './app_settings_schema.js';
16
+ /**
17
+ * Create admin app settings route specs.
18
+ *
19
+ * @param deps - stateless capabilities (log, on_audit_event)
20
+ * @param options - per-factory configuration
21
+ * @returns route specs for app settings management
22
+ */
23
+ export const create_app_settings_route_specs = (deps, options) => {
24
+ const { app_settings } = options;
25
+ return [
26
+ {
27
+ method: 'GET',
28
+ path: '/settings',
29
+ auth: { type: 'role', role: 'admin' },
30
+ description: 'Get app settings',
31
+ input: z.null(),
32
+ output: z.strictObject({ settings: AppSettingsWithUsernameJson }),
33
+ handler: async (c, route) => {
34
+ const settings = await query_app_settings_load_with_username(route);
35
+ return c.json({ settings });
36
+ },
37
+ },
38
+ {
39
+ method: 'PATCH',
40
+ path: '/settings',
41
+ auth: { type: 'role', role: 'admin' },
42
+ description: 'Update app settings',
43
+ input: UpdateAppSettingsInput,
44
+ output: z.strictObject({ ok: z.literal(true), settings: AppSettingsWithUsernameJson }),
45
+ handler: async (c, route) => {
46
+ const ctx = require_request_context(c);
47
+ const { open_signup } = get_route_input(c);
48
+ const old_value = app_settings.open_signup;
49
+ const updated = await query_app_settings_update(route, open_signup, ctx.actor.id);
50
+ // Mutate the in-memory ref so GET reads are consistent
51
+ app_settings.open_signup = updated.open_signup;
52
+ app_settings.updated_at = updated.updated_at;
53
+ app_settings.updated_by = updated.updated_by;
54
+ void audit_log_fire_and_forget(route, {
55
+ event_type: 'app_settings_update',
56
+ actor_id: ctx.actor.id,
57
+ account_id: ctx.account.id,
58
+ ip: get_client_ip(c),
59
+ metadata: { setting: 'open_signup', old_value, new_value: open_signup },
60
+ }, deps.log, deps.on_audit_event);
61
+ const settings_with_username = await query_app_settings_load_with_username(route);
62
+ return c.json({ ok: true, settings: settings_with_username });
63
+ },
64
+ },
65
+ ];
66
+ };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * App settings types and client-safe schemas.
3
+ *
4
+ * Single-row table for global app configuration (e.g. open signup toggle).
5
+ *
6
+ * @module
7
+ */
8
+ import { z } from 'zod';
9
+ /** App settings row from the database. */
10
+ export interface AppSettings {
11
+ open_signup: boolean;
12
+ updated_at: string | null;
13
+ updated_by: string | null;
14
+ }
15
+ /** Zod schema for client-safe app settings data. */
16
+ export declare const AppSettingsJson: z.ZodObject<{
17
+ open_signup: z.ZodBoolean;
18
+ updated_at: z.ZodNullable<z.ZodString>;
19
+ updated_by: z.ZodNullable<z.ZodString>;
20
+ }, z.core.$strict>;
21
+ export type AppSettingsJson = z.infer<typeof AppSettingsJson>;
22
+ /** Zod schema for admin app settings with resolved updater username. */
23
+ export declare const AppSettingsWithUsernameJson: z.ZodObject<{
24
+ open_signup: z.ZodBoolean;
25
+ updated_at: z.ZodNullable<z.ZodString>;
26
+ updated_by: z.ZodNullable<z.ZodString>;
27
+ updated_by_username: z.ZodNullable<z.ZodString>;
28
+ }, z.core.$strict>;
29
+ export type AppSettingsWithUsernameJson = z.infer<typeof AppSettingsWithUsernameJson>;
30
+ /** Zod schema for updating app settings. */
31
+ export declare const UpdateAppSettingsInput: z.ZodObject<{
32
+ open_signup: z.ZodBoolean;
33
+ }, z.core.$strict>;
34
+ export type UpdateAppSettingsInput = z.infer<typeof UpdateAppSettingsInput>;
35
+ //# sourceMappingURL=app_settings_schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app_settings_schema.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/app_settings_schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,oDAAoD;AACpD,eAAO,MAAM,eAAe;;;;kBAI1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,wEAAwE;AACxE,eAAO,MAAM,2BAA2B;;;;;kBAEtC,CAAC;AACH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEtF,4CAA4C;AAC5C,eAAO,MAAM,sBAAsB;;kBAEjC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * App settings types and client-safe schemas.
3
+ *
4
+ * Single-row table for global app configuration (e.g. open signup toggle).
5
+ *
6
+ * @module
7
+ */
8
+ import { z } from 'zod';
9
+ /** Zod schema for client-safe app settings data. */
10
+ export const AppSettingsJson = z.strictObject({
11
+ open_signup: z.boolean(),
12
+ updated_at: z.string().nullable(),
13
+ updated_by: z.string().nullable(),
14
+ });
15
+ /** Zod schema for admin app settings with resolved updater username. */
16
+ export const AppSettingsWithUsernameJson = AppSettingsJson.extend({
17
+ updated_by_username: z.string().nullable(),
18
+ });
19
+ /** Zod schema for updating app settings. */
20
+ export const UpdateAppSettingsInput = z.strictObject({
21
+ open_signup: z.boolean(),
22
+ });
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Audit log database queries.
3
+ *
4
+ * Records and retrieves auth mutation events for security monitoring.
5
+ * All write operations should use `audit_log_fire_and_forget` to
6
+ * ensure audit logging never blocks or breaks auth flows.
7
+ *
8
+ * Rollback resilience: `audit_log_fire_and_forget` writes to `background_db`
9
+ * (pool-level), not the handler's transaction-scoped `db`, so audit entries
10
+ * persist even when the request transaction rolls back.
11
+ *
12
+ * @module
13
+ */
14
+ import type { Logger } from '@fuzdev/fuz_util/log.js';
15
+ import type { QueryDeps } from '../db/query_deps.js';
16
+ import type { RouteContext } from '../http/route_spec.js';
17
+ import { type AuditEventType, type AuditLogEvent, type AuditLogInput, type AuditLogListOptions, type AuditLogEventWithUsernamesJson, type PermitHistoryEventJson } from './audit_log_schema.js';
18
+ /** Default limit for audit log listings. */
19
+ export declare const AUDIT_LOG_DEFAULT_LIMIT = 50;
20
+ /**
21
+ * Insert an audit log entry.
22
+ *
23
+ * Uses `RETURNING *` to return the full inserted row including
24
+ * DB-assigned fields (`id`, `seq`, `created_at`).
25
+ *
26
+ * In DEV mode, validates metadata against the per-event-type schema
27
+ * before writing (warns on mismatch, never throws).
28
+ *
29
+ * @param deps - query dependencies
30
+ * @param input - the audit event to record
31
+ * @returns the inserted audit log row
32
+ */
33
+ export declare const query_audit_log: <T extends AuditEventType>(deps: QueryDeps, input: AuditLogInput<T>) => Promise<AuditLogEvent>;
34
+ /**
35
+ * List audit log entries, newest first.
36
+ *
37
+ * @param deps - query dependencies
38
+ * @param options - filters and pagination
39
+ * @returns matching audit log entries
40
+ */
41
+ export declare const query_audit_log_list: (deps: QueryDeps, options?: AuditLogListOptions) => Promise<Array<AuditLogEvent>>;
42
+ /**
43
+ * List audit log entries with resolved usernames, newest first.
44
+ *
45
+ * @param deps - query dependencies
46
+ * @param options - filters and pagination
47
+ * @returns matching audit log entries with `username` and `target_username`
48
+ */
49
+ export declare const query_audit_log_list_with_usernames: (deps: QueryDeps, options?: AuditLogListOptions) => Promise<Array<AuditLogEventWithUsernamesJson>>;
50
+ /**
51
+ * List audit log entries related to an account (as actor or target).
52
+ *
53
+ * @param deps - query dependencies
54
+ * @param account_id - the account to query for
55
+ * @param limit - maximum entries to return
56
+ */
57
+ export declare const query_audit_log_list_for_account: (deps: QueryDeps, account_id: string, limit?: number) => Promise<Array<AuditLogEvent>>;
58
+ /**
59
+ * List permit grant/revoke events with resolved usernames.
60
+ *
61
+ * @param deps - query dependencies
62
+ * @param limit - maximum entries to return
63
+ * @param offset - number of entries to skip
64
+ * @returns permit history events with `username` and `target_username`
65
+ */
66
+ export declare const query_audit_log_list_permit_history: (deps: QueryDeps, limit?: number, offset?: number) => Promise<Array<PermitHistoryEventJson>>;
67
+ /**
68
+ * Delete audit log entries older than the given date.
69
+ *
70
+ * @param deps - query dependencies
71
+ * @param before - delete entries created before this date
72
+ * @returns the number of entries deleted
73
+ */
74
+ export declare const query_audit_log_cleanup_before: (deps: QueryDeps, before: Date) => Promise<number>;
75
+ /**
76
+ * Log an audit event without blocking the caller.
77
+ *
78
+ * Errors are logged to console — audit logging never breaks auth flows.
79
+ * Uses `background_db` so audit entries persist even if the request transaction rolls back.
80
+ * Write failures and `on_event` callback failures are logged separately
81
+ * so the error message indicates which phase failed.
82
+ *
83
+ * @param route - `background_db` and `pending_effects` from the route context
84
+ * @param input - the audit event to record
85
+ * @param log - the logger instance
86
+ * @param on_event - callback invoked with the inserted row after a successful write
87
+ * @returns the settled promise (callers may ignore it — fire-and-forget semantics preserved)
88
+ */
89
+ export declare const audit_log_fire_and_forget: <T extends AuditEventType>(route: Pick<RouteContext, "background_db" | "pending_effects">, input: AuditLogInput<T>, log: Logger, on_event: (event: AuditLogEvent) => void) => Promise<void>;
90
+ //# sourceMappingURL=audit_log_queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit_log_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/audit_log_queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAGpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAEN,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,EAC3B,MAAM,uBAAuB,CAAC;AAE/B,4CAA4C;AAC5C,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,GAAU,CAAC,SAAS,cAAc,EAC7D,MAAM,SAAS,EACf,OAAO,aAAa,CAAC,CAAC,CAAC,KACrB,OAAO,CAAC,aAAa,CAuBvB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAChC,MAAM,SAAS,EACf,UAAU,mBAAmB,KAC3B,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAwC9B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC,GAC/C,MAAM,SAAS,EACf,UAAU,mBAAmB,KAC3B,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CA8C/C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,gCAAgC,GAC5C,MAAM,SAAS,EACf,YAAY,MAAM,EAClB,cAA+B,KAC7B,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAO9B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mCAAmC,GAC/C,MAAM,SAAS,EACf,cAA+B,EAC/B,eAAU,KACR,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAYvC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,8BAA8B,GAC1C,MAAM,SAAS,EACf,QAAQ,IAAI,KACV,OAAO,CAAC,MAAM,CAMhB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,yBAAyB,GAAI,CAAC,SAAS,cAAc,EACjE,OAAO,IAAI,CAAC,YAAY,EAAE,eAAe,GAAG,iBAAiB,CAAC,EAC9D,OAAO,aAAa,CAAC,CAAC,CAAC,EACvB,KAAK,MAAM,EACX,UAAU,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,KACtC,OAAO,CAAC,IAAI,CAcd,CAAC"}