@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,337 @@
1
+ <script lang="ts">
2
+ import {onMount} from 'svelte';
3
+ import {resolve} from '$app/paths';
4
+ import {auth_state_context} from './auth_state.svelte.js';
5
+ import {AdminAccountsState} from './admin_accounts_state.svelte.js';
6
+ import {AdminSessionsState} from './admin_sessions_state.svelte.js';
7
+ import {AdminInvitesState} from './admin_invites_state.svelte.js';
8
+ import {AuditLogState} from './audit_log_state.svelte.js';
9
+ import {AppSettingsState} from './app_settings_state.svelte.js';
10
+ import {format_relative_time, format_datetime_local} from './ui_format.js';
11
+ import ConfirmButton from './ConfirmButton.svelte';
12
+
13
+ const auth_state = auth_state_context.get();
14
+
15
+ const accounts = new AdminAccountsState();
16
+ const sessions = new AdminSessionsState();
17
+ const invites = new AdminInvitesState();
18
+ const audit_log = new AuditLogState();
19
+ const app_settings = new AppSettingsState();
20
+
21
+ // accounts - dynamic role breakdown
22
+ const role_counts = $derived.by(() => {
23
+ // eslint-disable-next-line svelte/prefer-svelte-reactivity
24
+ const counts = new Map<string, number>();
25
+ for (const entry of accounts.accounts) {
26
+ const roles = new Set(entry.permits.map((p) => p.role));
27
+ for (const role of roles) {
28
+ counts.set(role, (counts.get(role) || 0) + 1);
29
+ }
30
+ }
31
+ return Array.from(counts.entries());
32
+ });
33
+ const unroled_count = $derived(accounts.accounts.filter((a) => a.permits.length === 0).length);
34
+
35
+ // sessions
36
+ const unique_users = $derived(new Set(sessions.sessions.map((s) => s.username)).size);
37
+ const most_recent = $derived(
38
+ sessions.sessions.length > 0
39
+ ? sessions.sessions.reduce((a, b) =>
40
+ new Date(a.last_seen_at) > new Date(b.last_seen_at) ? a : b,
41
+ )
42
+ : null,
43
+ );
44
+
45
+ // audit log
46
+ const recent_events = $derived(audit_log.events.slice(0, 8));
47
+ const failed_logins = $derived(
48
+ audit_log.events.filter((e) => e.event_type === 'login' && e.outcome === 'failure'),
49
+ );
50
+ const permit_changes = $derived(
51
+ audit_log.events.filter(
52
+ (e) => e.event_type === 'permit_grant' || e.event_type === 'permit_revoke',
53
+ ),
54
+ );
55
+
56
+ onMount(() => {
57
+ void Promise.all([
58
+ accounts.fetch(),
59
+ sessions.fetch(),
60
+ invites.fetch(),
61
+ audit_log.fetch({limit: 30}),
62
+ app_settings.fetch(),
63
+ ]);
64
+ });
65
+ </script>
66
+
67
+ <!-- TODO: panels will be user-draggable/rearrangeable, hardcoded order for now -->
68
+ <div class="overview">
69
+ <section>
70
+ <div class="panel_header">
71
+ <h3>accounts</h3>
72
+ <a href={resolve('/admin/accounts' as any)} class="text_50 font_size_sm">view all &rarr;</a>
73
+ </div>
74
+ {#if accounts.loading}
75
+ <p class="text_50">loading...</p>
76
+ {:else if accounts.error}
77
+ <p class="color_c">{accounts.error}</p>
78
+ {:else}
79
+ <div class="baseline_row gap_xs">
80
+ <strong class="font_size_lg">{accounts.account_count}</strong>
81
+ <span class="text_50">accounts</span>
82
+ </div>
83
+ <div class="baseline_row gap_xs flex-wrap:wrap font_size_sm mt_xs">
84
+ {#each role_counts as [role, count] (role)}
85
+ <span>{count} {role}</span>
86
+ <span class="text_50">&middot;</span>
87
+ {/each}
88
+ <span>{unroled_count} unroled</span>
89
+ </div>
90
+ {#if accounts.accounts.length > 0}
91
+ <ul class="compact_list">
92
+ {#each accounts.accounts.slice(0, 6) as entry (entry)}
93
+ <li>
94
+ <strong>{entry.account.username}</strong>
95
+ {#each entry.permits as permit (permit.id)}
96
+ <span class="chip font_size_sm">{permit.role}</span>
97
+ {/each}
98
+ {#if entry.permits.length === 0}
99
+ <span class="text_50 font_size_sm">no roles</span>
100
+ {/if}
101
+ </li>
102
+ {/each}
103
+ {#if accounts.accounts.length > 6}
104
+ <li class="text_50 font_size_sm">+{accounts.accounts.length - 6} more</li>
105
+ {/if}
106
+ </ul>
107
+ {/if}
108
+ {/if}
109
+ </section>
110
+
111
+ <section>
112
+ <div class="panel_header">
113
+ <h3>sessions</h3>
114
+ <a href={resolve('/admin/sessions' as any)} class="text_50 font_size_sm">view all &rarr;</a>
115
+ </div>
116
+ {#if sessions.loading}
117
+ <p class="text_50">loading...</p>
118
+ {:else if sessions.error}
119
+ <p class="color_c">{sessions.error}</p>
120
+ {:else}
121
+ <div class="baseline_row gap_xs">
122
+ <strong class="font_size_lg">{sessions.active_count}</strong>
123
+ <span class="text_50">active</span>
124
+ </div>
125
+ <div class="baseline_row gap_xs">
126
+ <strong class="font_size_lg">{unique_users}</strong>
127
+ <span class="text_50">unique users</span>
128
+ </div>
129
+ {#if most_recent}
130
+ <div class="baseline_row gap_xs font_size_sm mt_sm">
131
+ <span class="text_50">last active:</span>
132
+ <strong>{most_recent.username}</strong>
133
+ <span class="text_50" title={format_datetime_local(most_recent.last_seen_at)}
134
+ >{format_relative_time(most_recent.last_seen_at)}</span
135
+ >
136
+ </div>
137
+ {/if}
138
+ {/if}
139
+ </section>
140
+
141
+ <section>
142
+ <div class="panel_header">
143
+ <h3>invites</h3>
144
+ <a href={resolve('/admin/invites' as any)} class="text_50 font_size_sm">view all &rarr;</a>
145
+ </div>
146
+ {#if invites.loading}
147
+ <p class="text_50">loading...</p>
148
+ {:else if invites.error}
149
+ <p class="color_c">{invites.error}</p>
150
+ {:else}
151
+ <div class="baseline_row gap_sm">
152
+ <span class="text_50">public signup</span>
153
+ {#if app_settings.settings?.open_signup}
154
+ <span class="chip color_b">open</span>
155
+ {:else}
156
+ <span class="chip">closed</span>
157
+ {/if}
158
+ </div>
159
+ <div class="baseline_row gap_xs">
160
+ <strong class="font_size_lg">{invites.unclaimed_count}</strong>
161
+ <span class="text_50">unclaimed</span>
162
+ <span class="text_50">/</span>
163
+ <span>{invites.invite_count}</span>
164
+ <span class="text_50">total</span>
165
+ </div>
166
+ {#if invites.invites.length > 0}
167
+ <ul class="compact_list">
168
+ {#each invites.invites.slice(0, 4) as invite (invite.id)}
169
+ <li>
170
+ <span>{invite.email || invite.username || '—'}</span>
171
+ {#if invite.claimed_at}
172
+ <span class="chip font_size_sm color_b">claimed</span>
173
+ {:else}
174
+ <span class="chip font_size_sm">unclaimed</span>
175
+ {/if}
176
+ </li>
177
+ {/each}
178
+ {#if invites.invites.length > 4}
179
+ <li class="text_50 font_size_sm">+{invites.invites.length - 4} more</li>
180
+ {/if}
181
+ </ul>
182
+ {/if}
183
+ {/if}
184
+ </section>
185
+
186
+ <section>
187
+ <div class="panel_header">
188
+ <h3>recent activity</h3>
189
+ <a href={resolve('/admin/audit-log' as any)} class="text_50 font_size_sm">view all &rarr;</a>
190
+ </div>
191
+ {#if audit_log.loading}
192
+ <p class="text_50">loading...</p>
193
+ {:else if audit_log.error}
194
+ <p class="color_c">{audit_log.error}</p>
195
+ {:else if recent_events.length === 0}
196
+ <p class="text_50">no events</p>
197
+ {:else}
198
+ <ul class="compact_list">
199
+ {#each recent_events as event (event.id)}
200
+ <li>
201
+ <span class="text_50 font_size_sm" title={format_datetime_local(event.created_at)}
202
+ >{format_relative_time(event.created_at)}</span
203
+ >
204
+ <code class="font_size_sm">{event.event_type}</code>
205
+ {#if event.outcome === 'failure'}
206
+ <span class="chip font_size_sm color_c">fail</span>
207
+ {/if}
208
+ </li>
209
+ {/each}
210
+ </ul>
211
+ {/if}
212
+ </section>
213
+
214
+ <section>
215
+ <div class="panel_header">
216
+ <h3>security</h3>
217
+ <a href={resolve('/admin/audit-log' as any)} class="text_50 font_size_sm">audit log &rarr;</a>
218
+ </div>
219
+ {#if audit_log.loading}
220
+ <p class="text_50">loading...</p>
221
+ {:else if audit_log.error}
222
+ <p class="color_c">{audit_log.error}</p>
223
+ {:else}
224
+ <div class="baseline_row gap_xs">
225
+ <strong class="font_size_lg" class:color_c={failed_logins.length > 0}>
226
+ {failed_logins.length}
227
+ </strong>
228
+ <span class="text_50">failed logins</span>
229
+ </div>
230
+ <div class="baseline_row gap_xs">
231
+ <strong class="font_size_lg">{permit_changes.length}</strong>
232
+ <span class="text_50">permit changes</span>
233
+ </div>
234
+ {#if permit_changes.length > 0}
235
+ <ul class="compact_list">
236
+ {#each permit_changes.slice(0, 4) as event (event.id)}
237
+ <li class="font_size_sm">
238
+ <span class="text_50" title={format_datetime_local(event.created_at)}
239
+ >{format_relative_time(event.created_at)}</span
240
+ >
241
+ <code>{event.event_type === 'permit_grant' ? 'grant' : 'revoke'}</code>
242
+ {#if event.metadata?.role}
243
+ <span class="chip font_size_sm">{event.metadata.role}</span>
244
+ {/if}
245
+ </li>
246
+ {/each}
247
+ </ul>
248
+ {/if}
249
+ {/if}
250
+ </section>
251
+
252
+ <section>
253
+ <div class="panel_header">
254
+ <h3>system</h3>
255
+ </div>
256
+ {#if app_settings.loading}
257
+ <p class="text_50">loading...</p>
258
+ {:else if app_settings.error}
259
+ <p class="color_c">{app_settings.error}</p>
260
+ {:else}
261
+ <div class="baseline_row gap_sm">
262
+ <span class="text_50">public signup</span>
263
+ {#if app_settings.settings?.open_signup}
264
+ <span class="chip color_b">open</span>
265
+ {:else}
266
+ <span class="chip">invite-only</span>
267
+ {/if}
268
+ </div>
269
+ {#if app_settings.settings?.updated_at}
270
+ <div class="baseline_row gap_xs font_size_sm mt_xs">
271
+ <span class="text_50">last changed:</span>
272
+ <span title={format_datetime_local(app_settings.settings.updated_at)}>
273
+ {format_relative_time(app_settings.settings.updated_at)}
274
+ </span>
275
+ {#if app_settings.settings.updated_by_username}
276
+ <span class="text_50">by</span>
277
+ <strong>{app_settings.settings.updated_by_username}</strong>
278
+ {/if}
279
+ </div>
280
+ {/if}
281
+ {/if}
282
+ {#if auth_state.account}
283
+ <div class="baseline_row gap_sm">
284
+ <span class="text_50">logged in as</span>
285
+ <strong>{auth_state.account.username}</strong>
286
+ </div>
287
+ <div class="mt_md">
288
+ <ConfirmButton
289
+ onconfirm={async () => {
290
+ await auth_state.logout();
291
+ }}
292
+ title="log out"
293
+ >
294
+ {#snippet children(_popover, _confirm)}
295
+ log out
296
+ {/snippet}
297
+ {#snippet popover_button_content()}
298
+ <span class="p_md"> log out </span>
299
+ {/snippet}
300
+ </ConfirmButton>
301
+ </div>
302
+ {/if}
303
+ </section>
304
+ </div>
305
+
306
+ <style>
307
+ .overview {
308
+ display: grid;
309
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
310
+ gap: var(--space_lg);
311
+ }
312
+
313
+ .panel_header {
314
+ display: flex;
315
+ justify-content: space-between;
316
+ align-items: baseline;
317
+ margin-bottom: var(--space_md);
318
+ }
319
+
320
+ .baseline_row {
321
+ display: flex;
322
+ align-items: baseline;
323
+ }
324
+
325
+ .compact_list {
326
+ list-style: none;
327
+ padding: 0;
328
+ margin: var(--space_sm) 0 0;
329
+ }
330
+
331
+ .compact_list li {
332
+ display: flex;
333
+ align-items: baseline;
334
+ gap: var(--space_xs);
335
+ padding: 2px 0;
336
+ }
337
+ </style>
@@ -0,0 +1,4 @@
1
+ declare const AdminOverview: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type AdminOverview = ReturnType<typeof AdminOverview>;
3
+ export default AdminOverview;
4
+ //# sourceMappingURL=AdminOverview.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminOverview.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminOverview.svelte"],"names":[],"mappings":"AAwTA,QAAA,MAAM,aAAa,2DAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -0,0 +1,61 @@
1
+ <script lang="ts">
2
+ import {AuditLogState} from './audit_log_state.svelte.js';
3
+ import {format_relative_time, format_datetime_local, truncate_uuid} from './ui_format.js';
4
+ import Datatable from './Datatable.svelte';
5
+ import type {DatatableColumn} from './datatable.js';
6
+ import type {PermitHistoryEventJson} from '../auth/audit_log_schema.js';
7
+
8
+ const audit_log = new AuditLogState();
9
+
10
+ void audit_log.fetch_permit_history();
11
+
12
+ const columns: Array<DatatableColumn<PermitHistoryEventJson>> = [
13
+ {key: 'event_type', label: 'action', width: 100},
14
+ {key: 'metadata', label: 'role', width: 100},
15
+ {key: 'username', label: 'by', width: 140},
16
+ {key: 'target_username', label: 'target', width: 140},
17
+ {key: 'created_at', label: 'time', width: 100},
18
+ ];
19
+ </script>
20
+
21
+ <section>
22
+ <h1>permit history</h1>
23
+
24
+ {#if audit_log.loading}
25
+ <p class="text_50">loading permit history...</p>
26
+ {:else if audit_log.error}
27
+ <p class="color_c_50">{audit_log.error}</p>
28
+ {:else}
29
+ <Datatable {columns} rows={audit_log.permit_history_events} height="400px" row_key="id">
30
+ {#snippet cell(column, row)}
31
+ {#if column.key === 'event_type'}
32
+ <span
33
+ class="chip"
34
+ class:color_b={row.event_type === 'permit_grant'}
35
+ class:color_c={row.event_type === 'permit_revoke'}
36
+ >
37
+ {row.event_type === 'permit_grant' ? 'grant' : 'revoke'}
38
+ </span>
39
+ {:else if column.key === 'metadata'}
40
+ {#if row.metadata}
41
+ <code>{row.metadata.role ?? ''}</code>
42
+ {/if}
43
+ {:else if column.key === 'username'}
44
+ <span class="text_50">{row.username ?? truncate_uuid(row.account_id ?? '?')}</span>
45
+ {:else if column.key === 'target_username'}
46
+ <span class="text_50"
47
+ >{row.target_username ?? truncate_uuid(row.target_account_id ?? '?')}</span
48
+ >
49
+ {:else if column.key === 'created_at'}
50
+ <span title={format_datetime_local(row.created_at)}>
51
+ {format_relative_time(row.created_at)}
52
+ </span>
53
+ {:else if column.format}
54
+ {column.format(row[column.key], row)}
55
+ {:else}
56
+ {row[column.key]}
57
+ {/if}
58
+ {/snippet}
59
+ </Datatable>
60
+ {/if}
61
+ </section>
@@ -0,0 +1,19 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const AdminPermitHistory: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type AdminPermitHistory = InstanceType<typeof AdminPermitHistory>;
18
+ export default AdminPermitHistory;
19
+ //# sourceMappingURL=AdminPermitHistory.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminPermitHistory.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminPermitHistory.svelte"],"names":[],"mappings":"AAmEA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,kBAAkB;;kBAA+E,CAAC;AACtF,KAAK,kBAAkB,GAAG,YAAY,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACpE,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,85 @@
1
+ <script lang="ts">
2
+ import {AdminSessionsState} from './admin_sessions_state.svelte.js';
3
+ import {format_relative_time, format_datetime_local, truncate_uuid} from './ui_format.js';
4
+ import ConfirmButton from './ConfirmButton.svelte';
5
+ import Datatable from './Datatable.svelte';
6
+ import type {DatatableColumn} from './datatable.js';
7
+ import type {AdminSessionJson} from '../auth/audit_log_schema.js';
8
+
9
+ const admin_sessions = new AdminSessionsState();
10
+
11
+ void admin_sessions.fetch();
12
+
13
+ const columns: Array<DatatableColumn<AdminSessionJson>> = [
14
+ {key: 'username', label: 'user', width: 120},
15
+ {key: 'id', label: 'session', width: 130},
16
+ {key: 'created_at', label: 'created', width: 100},
17
+ {key: 'last_seen_at', label: 'last seen', width: 100},
18
+ {key: 'expires_at', label: 'expires', width: 100},
19
+ {key: 'account_id', label: '', width: 220},
20
+ ];
21
+ </script>
22
+
23
+ <section>
24
+ <h1>active sessions</h1>
25
+ {#if admin_sessions.active_count > 0}
26
+ <p>
27
+ <span class="chip color_a">{admin_sessions.active_count} active</span>
28
+ </p>
29
+ {/if}
30
+
31
+ {#if admin_sessions.loading}
32
+ <p class="text_50">loading sessions...</p>
33
+ {:else if admin_sessions.error}
34
+ <p class="color_c_50">{admin_sessions.error}</p>
35
+ {:else}
36
+ <Datatable {columns} rows={admin_sessions.sessions} height="400px">
37
+ {#snippet cell(column, row)}
38
+ {#if column.key === 'id'}
39
+ <code class="font_size_sm text_50">{truncate_uuid(row.id)}</code>
40
+ {:else if column.key === 'created_at'}
41
+ <span title={format_datetime_local(row.created_at)}>
42
+ {format_relative_time(row.created_at)}
43
+ </span>
44
+ {:else if column.key === 'last_seen_at'}
45
+ <span title={format_datetime_local(row.last_seen_at)}>
46
+ {format_relative_time(row.last_seen_at)}
47
+ </span>
48
+ {:else if column.key === 'expires_at'}
49
+ <span title={format_datetime_local(row.expires_at)}>
50
+ {format_relative_time(row.expires_at)}
51
+ </span>
52
+ {:else if column.key === 'account_id'}
53
+ <ConfirmButton
54
+ onconfirm={() => admin_sessions.revoke_all_for_account(row.account_id)}
55
+ title="revoke all sessions for {row.username}"
56
+ class="sm"
57
+ disabled={admin_sessions.revoking_account_ids.has(row.account_id)}
58
+ >
59
+ {#snippet children(_popover, _confirm)}
60
+ {admin_sessions.revoking_account_ids.has(row.account_id)
61
+ ? 'revoking…'
62
+ : 'revoke sessions'}
63
+ {/snippet}
64
+ </ConfirmButton>
65
+ <ConfirmButton
66
+ onconfirm={() => admin_sessions.revoke_all_tokens_for_account(row.account_id)}
67
+ title="revoke all tokens for {row.username}"
68
+ class="sm"
69
+ disabled={admin_sessions.revoking_token_account_ids.has(row.account_id)}
70
+ >
71
+ {#snippet children(_popover, _confirm)}
72
+ {admin_sessions.revoking_token_account_ids.has(row.account_id)
73
+ ? 'revoking…'
74
+ : 'revoke tokens'}
75
+ {/snippet}
76
+ </ConfirmButton>
77
+ {:else if column.format}
78
+ {column.format(row[column.key], row)}
79
+ {:else}
80
+ {row[column.key]}
81
+ {/if}
82
+ {/snippet}
83
+ </Datatable>
84
+ {/if}
85
+ </section>
@@ -0,0 +1,19 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const AdminSessions: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type AdminSessions = InstanceType<typeof AdminSessions>;
18
+ export default AdminSessions;
19
+ //# sourceMappingURL=AdminSessions.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminSessions.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminSessions.svelte"],"names":[],"mappings":"AAwFA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,aAAa;;kBAA+E,CAAC;AACjF,KAAK,aAAa,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAC1D,eAAe,aAAa,CAAC"}
@@ -0,0 +1,32 @@
1
+ <script lang="ts">
2
+ import {auth_state_context} from './auth_state.svelte.js';
3
+ import ConfirmButton from './ConfirmButton.svelte';
4
+ import OpenSignupToggle from './OpenSignupToggle.svelte';
5
+
6
+ const auth_state = auth_state_context.get();
7
+ </script>
8
+
9
+ <section>
10
+ <h1>settings</h1>
11
+ <h2>signup</h2>
12
+ <OpenSignupToggle />
13
+ <h2>authentication</h2>
14
+ {#if auth_state.account}
15
+ <p>Logged in as <strong>{auth_state.account.username}</strong>.</p>
16
+ {:else}
17
+ <p>Logged in via session cookie.</p>
18
+ {/if}
19
+ <ConfirmButton
20
+ onconfirm={async () => {
21
+ await auth_state.logout();
22
+ }}
23
+ title="log out"
24
+ >
25
+ {#snippet children(_popover, _confirm)}
26
+ log out
27
+ {/snippet}
28
+ {#snippet popover_button_content()}
29
+ <span class="p_md"> log out </span>
30
+ {/snippet}
31
+ </ConfirmButton>
32
+ </section>
@@ -0,0 +1,19 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const AdminSettings: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type AdminSettings = InstanceType<typeof AdminSettings>;
18
+ export default AdminSettings;
19
+ //# sourceMappingURL=AdminSettings.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminSettings.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminSettings.svelte"],"names":[],"mappings":"AAqCA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,aAAa;;kBAA+E,CAAC;AACjF,KAAK,aAAa,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAC1D,eAAe,aAAa,CAAC"}
@@ -0,0 +1,42 @@
1
+ <script lang="ts">
2
+ import type {AppSurface} from '../http/surface.js';
3
+ import SurfaceExplorer from './SurfaceExplorer.svelte';
4
+ import {ui_fetch} from './ui_fetch.js';
5
+
6
+ let surface: AppSurface | null = $state(null);
7
+ let loading = $state(true);
8
+ let error: string | null = $state(null);
9
+
10
+ const load = async (): Promise<void> => {
11
+ loading = true;
12
+ error = null;
13
+ try {
14
+ const res = await ui_fetch('/api/surface');
15
+ if (!res.ok) {
16
+ error = `Failed to load surface: ${res.status}`;
17
+ return;
18
+ }
19
+ surface = await res.json();
20
+ } catch (e) {
21
+ error = e instanceof Error ? e.message : 'Unknown error';
22
+ } finally {
23
+ loading = false;
24
+ }
25
+ };
26
+
27
+ void load();
28
+ </script>
29
+
30
+ <section>
31
+ <h1>surface</h1>
32
+ <p class="text_50">API routes, middleware, schemas, environment, and events.</p>
33
+
34
+ {#if loading}
35
+ <p class="text_50">loading surface...</p>
36
+ {:else if error}
37
+ <p class="color_c_50">{error}</p>
38
+ <button type="button" onclick={() => void load()}>retry</button>
39
+ {:else if surface}
40
+ <SurfaceExplorer {surface} />
41
+ {/if}
42
+ </section>
@@ -0,0 +1,4 @@
1
+ declare const AdminSurface: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type AdminSurface = ReturnType<typeof AdminSurface>;
3
+ export default AdminSurface;
4
+ //# sourceMappingURL=AdminSurface.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminSurface.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/AdminSurface.svelte"],"names":[],"mappings":"AAoDA,QAAA,MAAM,YAAY,2DAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}