@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.
- package/LICENSE +21 -0
- package/README.md +49 -0
- package/dist/actions/action_bridge.d.ts +65 -0
- package/dist/actions/action_bridge.d.ts.map +1 -0
- package/dist/actions/action_bridge.js +76 -0
- package/dist/actions/action_codegen.d.ts +97 -0
- package/dist/actions/action_codegen.d.ts.map +1 -0
- package/dist/actions/action_codegen.js +280 -0
- package/dist/actions/action_registry.d.ts +35 -0
- package/dist/actions/action_registry.d.ts.map +1 -0
- package/dist/actions/action_registry.js +83 -0
- package/dist/actions/action_spec.d.ts +169 -0
- package/dist/actions/action_spec.d.ts.map +1 -0
- package/dist/actions/action_spec.js +76 -0
- package/dist/auth/account_queries.d.ts +96 -0
- package/dist/auth/account_queries.d.ts.map +1 -0
- package/dist/auth/account_queries.js +172 -0
- package/dist/auth/account_routes.d.ts +86 -0
- package/dist/auth/account_routes.d.ts.map +1 -0
- package/dist/auth/account_routes.js +406 -0
- package/dist/auth/account_schema.d.ts +192 -0
- package/dist/auth/account_schema.d.ts.map +1 -0
- package/dist/auth/account_schema.js +105 -0
- package/dist/auth/admin_routes.d.ts +29 -0
- package/dist/auth/admin_routes.d.ts.map +1 -0
- package/dist/auth/admin_routes.js +193 -0
- package/dist/auth/api_token.d.ts +33 -0
- package/dist/auth/api_token.d.ts.map +1 -0
- package/dist/auth/api_token.js +36 -0
- package/dist/auth/api_token_queries.d.ts +80 -0
- package/dist/auth/api_token_queries.d.ts.map +1 -0
- package/dist/auth/api_token_queries.js +116 -0
- package/dist/auth/app_settings_queries.d.ts +33 -0
- package/dist/auth/app_settings_queries.d.ts.map +1 -0
- package/dist/auth/app_settings_queries.js +51 -0
- package/dist/auth/app_settings_routes.d.ts +27 -0
- package/dist/auth/app_settings_routes.d.ts.map +1 -0
- package/dist/auth/app_settings_routes.js +66 -0
- package/dist/auth/app_settings_schema.d.ts +35 -0
- package/dist/auth/app_settings_schema.d.ts.map +1 -0
- package/dist/auth/app_settings_schema.js +22 -0
- package/dist/auth/audit_log_queries.d.ts +90 -0
- package/dist/auth/audit_log_queries.d.ts.map +1 -0
- package/dist/auth/audit_log_queries.js +205 -0
- package/dist/auth/audit_log_routes.d.ts +33 -0
- package/dist/auth/audit_log_routes.d.ts.map +1 -0
- package/dist/auth/audit_log_routes.js +106 -0
- package/dist/auth/audit_log_schema.d.ts +259 -0
- package/dist/auth/audit_log_schema.d.ts.map +1 -0
- package/dist/auth/audit_log_schema.js +123 -0
- package/dist/auth/bearer_auth.d.ts +32 -0
- package/dist/auth/bearer_auth.d.ts.map +1 -0
- package/dist/auth/bearer_auth.js +90 -0
- package/dist/auth/bootstrap_account.d.ts +82 -0
- package/dist/auth/bootstrap_account.d.ts.map +1 -0
- package/dist/auth/bootstrap_account.js +97 -0
- package/dist/auth/bootstrap_routes.d.ts +74 -0
- package/dist/auth/bootstrap_routes.d.ts.map +1 -0
- package/dist/auth/bootstrap_routes.js +154 -0
- package/dist/auth/daemon_token.d.ts +49 -0
- package/dist/auth/daemon_token.d.ts.map +1 -0
- package/dist/auth/daemon_token.js +49 -0
- package/dist/auth/daemon_token_middleware.d.ts +93 -0
- package/dist/auth/daemon_token_middleware.d.ts.map +1 -0
- package/dist/auth/daemon_token_middleware.js +167 -0
- package/dist/auth/ddl.d.ts +27 -0
- package/dist/auth/ddl.d.ts.map +1 -0
- package/dist/auth/ddl.js +111 -0
- package/dist/auth/deps.d.ts +52 -0
- package/dist/auth/deps.d.ts.map +1 -0
- package/dist/auth/deps.js +10 -0
- package/dist/auth/invite_queries.d.ts +68 -0
- package/dist/auth/invite_queries.d.ts.map +1 -0
- package/dist/auth/invite_queries.js +105 -0
- package/dist/auth/invite_routes.d.ts +18 -0
- package/dist/auth/invite_routes.d.ts.map +1 -0
- package/dist/auth/invite_routes.js +129 -0
- package/dist/auth/invite_schema.d.ts +51 -0
- package/dist/auth/invite_schema.d.ts.map +1 -0
- package/dist/auth/invite_schema.js +25 -0
- package/dist/auth/keyring.d.ts +87 -0
- package/dist/auth/keyring.d.ts.map +1 -0
- package/dist/auth/keyring.js +142 -0
- package/dist/auth/middleware.d.ts +40 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +64 -0
- package/dist/auth/migrations.d.ts +42 -0
- package/dist/auth/migrations.d.ts.map +1 -0
- package/dist/auth/migrations.js +79 -0
- package/dist/auth/password.d.ts +39 -0
- package/dist/auth/password.d.ts.map +1 -0
- package/dist/auth/password.js +25 -0
- package/dist/auth/password_argon2.d.ts +43 -0
- package/dist/auth/password_argon2.d.ts.map +1 -0
- package/dist/auth/password_argon2.js +76 -0
- package/dist/auth/permit_queries.d.ts +72 -0
- package/dist/auth/permit_queries.d.ts.map +1 -0
- package/dist/auth/permit_queries.js +116 -0
- package/dist/auth/request_context.d.ts +114 -0
- package/dist/auth/request_context.d.ts.map +1 -0
- package/dist/auth/request_context.js +176 -0
- package/dist/auth/require_keeper.d.ts +20 -0
- package/dist/auth/require_keeper.d.ts.map +1 -0
- package/dist/auth/require_keeper.js +35 -0
- package/dist/auth/role_schema.d.ts +69 -0
- package/dist/auth/role_schema.d.ts.map +1 -0
- package/dist/auth/role_schema.js +70 -0
- package/dist/auth/route_guards.d.ts +21 -0
- package/dist/auth/route_guards.d.ts.map +1 -0
- package/dist/auth/route_guards.js +32 -0
- package/dist/auth/session_cookie.d.ts +158 -0
- package/dist/auth/session_cookie.d.ts.map +1 -0
- package/dist/auth/session_cookie.js +135 -0
- package/dist/auth/session_lifecycle.d.ts +35 -0
- package/dist/auth/session_lifecycle.d.ts.map +1 -0
- package/dist/auth/session_lifecycle.js +27 -0
- package/dist/auth/session_middleware.d.ts +33 -0
- package/dist/auth/session_middleware.d.ts.map +1 -0
- package/dist/auth/session_middleware.js +62 -0
- package/dist/auth/session_queries.d.ts +135 -0
- package/dist/auth/session_queries.d.ts.map +1 -0
- package/dist/auth/session_queries.js +186 -0
- package/dist/auth/signup_routes.d.ts +32 -0
- package/dist/auth/signup_routes.d.ts.map +1 -0
- package/dist/auth/signup_routes.js +150 -0
- package/dist/cli/args.d.ts +48 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +76 -0
- package/dist/cli/config.d.ts +48 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +77 -0
- package/dist/cli/daemon.d.ts +82 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +149 -0
- package/dist/cli/help.d.ts +85 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +138 -0
- package/dist/cli/logger.d.ts +46 -0
- package/dist/cli/logger.d.ts.map +1 -0
- package/dist/cli/logger.js +48 -0
- package/dist/cli/util.d.ts +36 -0
- package/dist/cli/util.d.ts.map +1 -0
- package/dist/cli/util.js +50 -0
- package/dist/crypto.d.ts +13 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +19 -0
- package/dist/db/assert_row.d.ts +18 -0
- package/dist/db/assert_row.d.ts.map +1 -0
- package/dist/db/assert_row.js +24 -0
- package/dist/db/create_db.d.ts +38 -0
- package/dist/db/create_db.d.ts.map +1 -0
- package/dist/db/create_db.js +57 -0
- package/dist/db/db.d.ts +97 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +76 -0
- package/dist/db/db_pg.d.ts +21 -0
- package/dist/db/db_pg.d.ts.map +1 -0
- package/dist/db/db_pg.js +45 -0
- package/dist/db/db_pglite.d.ts +21 -0
- package/dist/db/db_pglite.d.ts.map +1 -0
- package/dist/db/db_pglite.js +28 -0
- package/dist/db/migrate.d.ts +67 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +118 -0
- package/dist/db/pg_error.d.ts +16 -0
- package/dist/db/pg_error.d.ts.map +1 -0
- package/dist/db/pg_error.js +15 -0
- package/dist/db/query_deps.d.ts +14 -0
- package/dist/db/query_deps.d.ts.map +1 -0
- package/dist/db/query_deps.js +9 -0
- package/dist/db/sql_identifier.d.ts +27 -0
- package/dist/db/sql_identifier.d.ts.map +1 -0
- package/dist/db/sql_identifier.js +31 -0
- package/dist/db/status.d.ts +62 -0
- package/dist/db/status.d.ts.map +1 -0
- package/dist/db/status.js +116 -0
- package/dist/dev/setup.d.ts +159 -0
- package/dist/dev/setup.d.ts.map +1 -0
- package/dist/dev/setup.js +265 -0
- package/dist/env/dotenv.d.ts +25 -0
- package/dist/env/dotenv.d.ts.map +1 -0
- package/dist/env/dotenv.js +52 -0
- package/dist/env/load.d.ts +52 -0
- package/dist/env/load.d.ts.map +1 -0
- package/dist/env/load.js +79 -0
- package/dist/env/mask.d.ts +19 -0
- package/dist/env/mask.d.ts.map +1 -0
- package/dist/env/mask.js +26 -0
- package/dist/env/resolve.d.ts +126 -0
- package/dist/env/resolve.d.ts.map +1 -0
- package/dist/env/resolve.js +200 -0
- package/dist/hono_context.d.ts +48 -0
- package/dist/hono_context.d.ts.map +1 -0
- package/dist/hono_context.js +22 -0
- package/dist/http/common_routes.d.ts +52 -0
- package/dist/http/common_routes.d.ts.map +1 -0
- package/dist/http/common_routes.js +65 -0
- package/dist/http/db_routes.d.ts +57 -0
- package/dist/http/db_routes.d.ts.map +1 -0
- package/dist/http/db_routes.js +176 -0
- package/dist/http/error_schemas.d.ts +169 -0
- package/dist/http/error_schemas.d.ts.map +1 -0
- package/dist/http/error_schemas.js +178 -0
- package/dist/http/middleware_spec.d.ts +19 -0
- package/dist/http/middleware_spec.d.ts.map +1 -0
- package/dist/http/middleware_spec.js +9 -0
- package/dist/http/origin.d.ts +57 -0
- package/dist/http/origin.d.ts.map +1 -0
- package/dist/http/origin.js +207 -0
- package/dist/http/proxy.d.ts +112 -0
- package/dist/http/proxy.d.ts.map +1 -0
- package/dist/http/proxy.js +240 -0
- package/dist/http/route_spec.d.ts +197 -0
- package/dist/http/route_spec.d.ts.map +1 -0
- package/dist/http/route_spec.js +243 -0
- package/dist/http/schema_helpers.d.ts +64 -0
- package/dist/http/schema_helpers.d.ts.map +1 -0
- package/dist/http/schema_helpers.js +90 -0
- package/dist/http/surface.d.ts +132 -0
- package/dist/http/surface.d.ts.map +1 -0
- package/dist/http/surface.js +156 -0
- package/dist/http/surface_query.d.ts +77 -0
- package/dist/http/surface_query.d.ts.map +1 -0
- package/dist/http/surface_query.js +86 -0
- package/dist/rate_limiter.d.ts +94 -0
- package/dist/rate_limiter.d.ts.map +1 -0
- package/dist/rate_limiter.js +156 -0
- package/dist/realtime/sse.d.ts +80 -0
- package/dist/realtime/sse.d.ts.map +1 -0
- package/dist/realtime/sse.js +109 -0
- package/dist/realtime/sse_auth_guard.d.ts +93 -0
- package/dist/realtime/sse_auth_guard.d.ts.map +1 -0
- package/dist/realtime/sse_auth_guard.js +111 -0
- package/dist/realtime/subscriber_registry.d.ts +85 -0
- package/dist/realtime/subscriber_registry.d.ts.map +1 -0
- package/dist/realtime/subscriber_registry.js +108 -0
- package/dist/runtime/deno.d.ts +21 -0
- package/dist/runtime/deno.d.ts.map +1 -0
- package/dist/runtime/deno.js +83 -0
- package/dist/runtime/deps.d.ts +113 -0
- package/dist/runtime/deps.d.ts.map +1 -0
- package/dist/runtime/deps.js +10 -0
- package/dist/runtime/fs.d.ts +15 -0
- package/dist/runtime/fs.d.ts.map +1 -0
- package/dist/runtime/fs.js +17 -0
- package/dist/runtime/mock.d.ts +81 -0
- package/dist/runtime/mock.d.ts.map +1 -0
- package/dist/runtime/mock.js +195 -0
- package/dist/runtime/node.d.ts +17 -0
- package/dist/runtime/node.d.ts.map +1 -0
- package/dist/runtime/node.js +117 -0
- package/dist/schema_meta.d.ts +16 -0
- package/dist/schema_meta.d.ts.map +1 -0
- package/dist/schema_meta.js +9 -0
- package/dist/sensitivity.d.ts +15 -0
- package/dist/sensitivity.d.ts.map +1 -0
- package/dist/sensitivity.js +9 -0
- package/dist/server/app_backend.d.ts +74 -0
- package/dist/server/app_backend.d.ts.map +1 -0
- package/dist/server/app_backend.js +39 -0
- package/dist/server/app_server.d.ts +201 -0
- package/dist/server/app_server.d.ts.map +1 -0
- package/dist/server/app_server.js +266 -0
- package/dist/server/env.d.ts +68 -0
- package/dist/server/env.d.ts.map +1 -0
- package/dist/server/env.js +95 -0
- package/dist/server/startup.d.ts +22 -0
- package/dist/server/startup.d.ts.map +1 -0
- package/dist/server/startup.js +48 -0
- package/dist/server/static.d.ts +39 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +38 -0
- package/dist/server/validate_nginx.d.ts +34 -0
- package/dist/server/validate_nginx.d.ts.map +1 -0
- package/dist/server/validate_nginx.js +118 -0
- package/dist/testing/CLAUDE.md +3 -0
- package/dist/testing/admin_integration.d.ts +45 -0
- package/dist/testing/admin_integration.d.ts.map +1 -0
- package/dist/testing/admin_integration.js +840 -0
- package/dist/testing/adversarial_404.d.ts +15 -0
- package/dist/testing/adversarial_404.d.ts.map +1 -0
- package/dist/testing/adversarial_404.js +118 -0
- package/dist/testing/adversarial_headers.d.ts +36 -0
- package/dist/testing/adversarial_headers.d.ts.map +1 -0
- package/dist/testing/adversarial_headers.js +128 -0
- package/dist/testing/adversarial_input.d.ts +56 -0
- package/dist/testing/adversarial_input.d.ts.map +1 -0
- package/dist/testing/adversarial_input.js +494 -0
- package/dist/testing/app_server.d.ts +169 -0
- package/dist/testing/app_server.d.ts.map +1 -0
- package/dist/testing/app_server.js +240 -0
- package/dist/testing/assert_dev_env.d.ts +10 -0
- package/dist/testing/assert_dev_env.d.ts.map +1 -0
- package/dist/testing/assert_dev_env.js +13 -0
- package/dist/testing/assertions.d.ts +61 -0
- package/dist/testing/assertions.d.ts.map +1 -0
- package/dist/testing/assertions.js +96 -0
- package/dist/testing/attack_surface.d.ts +63 -0
- package/dist/testing/attack_surface.d.ts.map +1 -0
- package/dist/testing/attack_surface.js +224 -0
- package/dist/testing/audit_completeness.d.ts +29 -0
- package/dist/testing/audit_completeness.d.ts.map +1 -0
- package/dist/testing/audit_completeness.js +410 -0
- package/dist/testing/auth_apps.d.ts +55 -0
- package/dist/testing/auth_apps.d.ts.map +1 -0
- package/dist/testing/auth_apps.js +122 -0
- package/dist/testing/data_exposure.d.ts +62 -0
- package/dist/testing/data_exposure.d.ts.map +1 -0
- package/dist/testing/data_exposure.js +297 -0
- package/dist/testing/db.d.ts +111 -0
- package/dist/testing/db.d.ts.map +1 -0
- package/dist/testing/db.js +258 -0
- package/dist/testing/entities.d.ts +21 -0
- package/dist/testing/entities.d.ts.map +1 -0
- package/dist/testing/entities.js +42 -0
- package/dist/testing/error_coverage.d.ts +78 -0
- package/dist/testing/error_coverage.d.ts.map +1 -0
- package/dist/testing/error_coverage.js +135 -0
- package/dist/testing/integration.d.ts +37 -0
- package/dist/testing/integration.d.ts.map +1 -0
- package/dist/testing/integration.js +1139 -0
- package/dist/testing/integration_helpers.d.ts +107 -0
- package/dist/testing/integration_helpers.d.ts.map +1 -0
- package/dist/testing/integration_helpers.js +246 -0
- package/dist/testing/middleware.d.ts +125 -0
- package/dist/testing/middleware.d.ts.map +1 -0
- package/dist/testing/middleware.js +210 -0
- package/dist/testing/rate_limiting.d.ts +43 -0
- package/dist/testing/rate_limiting.d.ts.map +1 -0
- package/dist/testing/rate_limiting.js +216 -0
- package/dist/testing/round_trip.d.ts +37 -0
- package/dist/testing/round_trip.d.ts.map +1 -0
- package/dist/testing/round_trip.js +128 -0
- package/dist/testing/schema_generators.d.ts +33 -0
- package/dist/testing/schema_generators.d.ts.map +1 -0
- package/dist/testing/schema_generators.js +137 -0
- package/dist/testing/standard.d.ts +49 -0
- package/dist/testing/standard.d.ts.map +1 -0
- package/dist/testing/standard.js +16 -0
- package/dist/testing/stubs.d.ts +96 -0
- package/dist/testing/stubs.d.ts.map +1 -0
- package/dist/testing/stubs.js +192 -0
- package/dist/testing/surface_invariants.d.ts +189 -0
- package/dist/testing/surface_invariants.d.ts.map +1 -0
- package/dist/testing/surface_invariants.js +450 -0
- package/dist/ui/AccountSessions.svelte +75 -0
- package/dist/ui/AccountSessions.svelte.d.ts +19 -0
- package/dist/ui/AccountSessions.svelte.d.ts.map +1 -0
- package/dist/ui/AdminAccounts.svelte +107 -0
- package/dist/ui/AdminAccounts.svelte.d.ts +19 -0
- package/dist/ui/AdminAccounts.svelte.d.ts.map +1 -0
- package/dist/ui/AdminAuditLog.svelte +144 -0
- package/dist/ui/AdminAuditLog.svelte.d.ts +4 -0
- package/dist/ui/AdminAuditLog.svelte.d.ts.map +1 -0
- package/dist/ui/AdminInvites.svelte +142 -0
- package/dist/ui/AdminInvites.svelte.d.ts +4 -0
- package/dist/ui/AdminInvites.svelte.d.ts.map +1 -0
- package/dist/ui/AdminOverview.svelte +337 -0
- package/dist/ui/AdminOverview.svelte.d.ts +4 -0
- package/dist/ui/AdminOverview.svelte.d.ts.map +1 -0
- package/dist/ui/AdminPermitHistory.svelte +61 -0
- package/dist/ui/AdminPermitHistory.svelte.d.ts +19 -0
- package/dist/ui/AdminPermitHistory.svelte.d.ts.map +1 -0
- package/dist/ui/AdminSessions.svelte +85 -0
- package/dist/ui/AdminSessions.svelte.d.ts +19 -0
- package/dist/ui/AdminSessions.svelte.d.ts.map +1 -0
- package/dist/ui/AdminSettings.svelte +32 -0
- package/dist/ui/AdminSettings.svelte.d.ts +19 -0
- package/dist/ui/AdminSettings.svelte.d.ts.map +1 -0
- package/dist/ui/AdminSurface.svelte +42 -0
- package/dist/ui/AdminSurface.svelte.d.ts +4 -0
- package/dist/ui/AdminSurface.svelte.d.ts.map +1 -0
- package/dist/ui/AppShell.svelte +93 -0
- package/dist/ui/AppShell.svelte.d.ts +20 -0
- package/dist/ui/AppShell.svelte.d.ts.map +1 -0
- package/dist/ui/BootstrapForm.svelte +105 -0
- package/dist/ui/BootstrapForm.svelte.d.ts +4 -0
- package/dist/ui/BootstrapForm.svelte.d.ts.map +1 -0
- package/dist/ui/ColumnLayout.svelte +46 -0
- package/dist/ui/ColumnLayout.svelte.d.ts +11 -0
- package/dist/ui/ColumnLayout.svelte.d.ts.map +1 -0
- package/dist/ui/ConfirmButton.svelte +125 -0
- package/dist/ui/ConfirmButton.svelte.d.ts +54 -0
- package/dist/ui/ConfirmButton.svelte.d.ts.map +1 -0
- package/dist/ui/Datatable.svelte +185 -0
- package/dist/ui/Datatable.svelte.d.ts +35 -0
- package/dist/ui/Datatable.svelte.d.ts.map +1 -0
- package/dist/ui/LoginForm.svelte +82 -0
- package/dist/ui/LoginForm.svelte.d.ts +8 -0
- package/dist/ui/LoginForm.svelte.d.ts.map +1 -0
- package/dist/ui/LogoutButton.svelte +36 -0
- package/dist/ui/LogoutButton.svelte.d.ts +10 -0
- package/dist/ui/LogoutButton.svelte.d.ts.map +1 -0
- package/dist/ui/MenuLink.svelte +35 -0
- package/dist/ui/MenuLink.svelte.d.ts +12 -0
- package/dist/ui/MenuLink.svelte.d.ts.map +1 -0
- package/dist/ui/OpenSignupToggle.svelte +36 -0
- package/dist/ui/OpenSignupToggle.svelte.d.ts +19 -0
- package/dist/ui/OpenSignupToggle.svelte.d.ts.map +1 -0
- package/dist/ui/PopoverButton.svelte +136 -0
- package/dist/ui/PopoverButton.svelte.d.ts +63 -0
- package/dist/ui/PopoverButton.svelte.d.ts.map +1 -0
- package/dist/ui/SignupForm.svelte +117 -0
- package/dist/ui/SignupForm.svelte.d.ts +7 -0
- package/dist/ui/SignupForm.svelte.d.ts.map +1 -0
- package/dist/ui/SurfaceExplorer.svelte +287 -0
- package/dist/ui/SurfaceExplorer.svelte.d.ts +8 -0
- package/dist/ui/SurfaceExplorer.svelte.d.ts.map +1 -0
- package/dist/ui/account_sessions_state.svelte.d.ts +15 -0
- package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -0
- package/dist/ui/account_sessions_state.svelte.js +45 -0
- package/dist/ui/admin_accounts_state.svelte.d.ts +19 -0
- package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -0
- package/dist/ui/admin_accounts_state.svelte.js +65 -0
- package/dist/ui/admin_invites_state.svelte.d.ts +19 -0
- package/dist/ui/admin_invites_state.svelte.d.ts.map +1 -0
- package/dist/ui/admin_invites_state.svelte.js +71 -0
- package/dist/ui/admin_sessions_state.svelte.d.ts +18 -0
- package/dist/ui/admin_sessions_state.svelte.d.ts.map +1 -0
- package/dist/ui/admin_sessions_state.svelte.js +62 -0
- package/dist/ui/app_settings_state.svelte.d.ts +14 -0
- package/dist/ui/app_settings_state.svelte.d.ts.map +1 -0
- package/dist/ui/app_settings_state.svelte.js +44 -0
- package/dist/ui/audit_log_state.svelte.d.ts +40 -0
- package/dist/ui/audit_log_state.svelte.d.ts.map +1 -0
- package/dist/ui/audit_log_state.svelte.js +153 -0
- package/dist/ui/auth_state.svelte.d.ts +85 -0
- package/dist/ui/auth_state.svelte.d.ts.map +1 -0
- package/dist/ui/auth_state.svelte.js +238 -0
- package/dist/ui/datatable.d.ts +25 -0
- package/dist/ui/datatable.d.ts.map +1 -0
- package/dist/ui/datatable.js +9 -0
- package/dist/ui/enter_advance.d.ts +13 -0
- package/dist/ui/enter_advance.d.ts.map +1 -0
- package/dist/ui/enter_advance.js +30 -0
- package/dist/ui/loadable.svelte.d.ts +55 -0
- package/dist/ui/loadable.svelte.d.ts.map +1 -0
- package/dist/ui/loadable.svelte.js +75 -0
- package/dist/ui/popover.svelte.d.ts +137 -0
- package/dist/ui/popover.svelte.d.ts.map +1 -0
- package/dist/ui/popover.svelte.js +288 -0
- package/dist/ui/position_helpers.d.ts +27 -0
- package/dist/ui/position_helpers.d.ts.map +1 -0
- package/dist/ui/position_helpers.js +81 -0
- package/dist/ui/sidebar_state.svelte.d.ts +30 -0
- package/dist/ui/sidebar_state.svelte.d.ts.map +1 -0
- package/dist/ui/sidebar_state.svelte.js +39 -0
- package/dist/ui/table_state.svelte.d.ts +63 -0
- package/dist/ui/table_state.svelte.d.ts.map +1 -0
- package/dist/ui/table_state.svelte.js +117 -0
- package/dist/ui/ui_fetch.d.ts +29 -0
- package/dist/ui/ui_fetch.d.ts.map +1 -0
- package/dist/ui/ui_fetch.js +37 -0
- package/dist/ui/ui_format.d.ts +63 -0
- package/dist/ui/ui_format.d.ts.map +1 -0
- package/dist/ui/ui_format.js +196 -0
- package/package.json +121 -0
|
@@ -0,0 +1,205 @@
|
|
|
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 { DEV } from 'esm-env';
|
|
15
|
+
import { assert_row } from '../db/assert_row.js';
|
|
16
|
+
import { AUDIT_METADATA_SCHEMAS, } from './audit_log_schema.js';
|
|
17
|
+
/** Default limit for audit log listings. */
|
|
18
|
+
export const AUDIT_LOG_DEFAULT_LIMIT = 50;
|
|
19
|
+
/**
|
|
20
|
+
* Insert an audit log entry.
|
|
21
|
+
*
|
|
22
|
+
* Uses `RETURNING *` to return the full inserted row including
|
|
23
|
+
* DB-assigned fields (`id`, `seq`, `created_at`).
|
|
24
|
+
*
|
|
25
|
+
* In DEV mode, validates metadata against the per-event-type schema
|
|
26
|
+
* before writing (warns on mismatch, never throws).
|
|
27
|
+
*
|
|
28
|
+
* @param deps - query dependencies
|
|
29
|
+
* @param input - the audit event to record
|
|
30
|
+
* @returns the inserted audit log row
|
|
31
|
+
*/
|
|
32
|
+
export const query_audit_log = async (deps, input) => {
|
|
33
|
+
if (DEV && input.metadata != null) {
|
|
34
|
+
const schema = AUDIT_METADATA_SCHEMAS[input.event_type];
|
|
35
|
+
const result = schema.safeParse(input.metadata);
|
|
36
|
+
if (!result.success) {
|
|
37
|
+
console.warn(`[audit_log] Metadata mismatch for '${input.event_type}':`, result.error.issues);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const rows = await deps.db.query(`INSERT INTO audit_log (event_type, outcome, actor_id, account_id, target_account_id, ip, metadata)
|
|
41
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
42
|
+
RETURNING *`, [
|
|
43
|
+
input.event_type,
|
|
44
|
+
input.outcome ?? 'success',
|
|
45
|
+
input.actor_id ?? null,
|
|
46
|
+
input.account_id ?? null,
|
|
47
|
+
input.target_account_id ?? null,
|
|
48
|
+
input.ip ?? null,
|
|
49
|
+
input.metadata ? JSON.stringify(input.metadata) : null,
|
|
50
|
+
]);
|
|
51
|
+
return assert_row(rows[0], 'INSERT INTO audit_log');
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* List audit log entries, newest first.
|
|
55
|
+
*
|
|
56
|
+
* @param deps - query dependencies
|
|
57
|
+
* @param options - filters and pagination
|
|
58
|
+
* @returns matching audit log entries
|
|
59
|
+
*/
|
|
60
|
+
export const query_audit_log_list = async (deps, options) => {
|
|
61
|
+
const conditions = [];
|
|
62
|
+
const params = [];
|
|
63
|
+
let param_index = 1;
|
|
64
|
+
if (options?.event_type) {
|
|
65
|
+
conditions.push(`event_type = $${param_index++}`);
|
|
66
|
+
params.push(options.event_type);
|
|
67
|
+
}
|
|
68
|
+
if (options?.event_type_in && options.event_type_in.length > 0) {
|
|
69
|
+
const placeholders = options.event_type_in.map(() => `$${param_index++}`);
|
|
70
|
+
conditions.push(`event_type IN (${placeholders.join(', ')})`);
|
|
71
|
+
params.push(...options.event_type_in);
|
|
72
|
+
}
|
|
73
|
+
if (options?.account_id) {
|
|
74
|
+
conditions.push(`(account_id = $${param_index} OR target_account_id = $${param_index})`);
|
|
75
|
+
param_index++;
|
|
76
|
+
params.push(options.account_id);
|
|
77
|
+
}
|
|
78
|
+
if (options?.outcome) {
|
|
79
|
+
conditions.push(`outcome = $${param_index++}`);
|
|
80
|
+
params.push(options.outcome);
|
|
81
|
+
}
|
|
82
|
+
if (options?.since_seq != null) {
|
|
83
|
+
conditions.push(`seq > $${param_index++}`);
|
|
84
|
+
params.push(options.since_seq);
|
|
85
|
+
}
|
|
86
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
87
|
+
const limit = options?.limit ?? AUDIT_LOG_DEFAULT_LIMIT;
|
|
88
|
+
const offset = options?.offset ?? 0;
|
|
89
|
+
return deps.db.query(`SELECT * FROM audit_log ${where} ORDER BY seq DESC LIMIT $${param_index++} OFFSET $${param_index}`, [...params, limit, offset]);
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* List audit log entries with resolved usernames, newest first.
|
|
93
|
+
*
|
|
94
|
+
* @param deps - query dependencies
|
|
95
|
+
* @param options - filters and pagination
|
|
96
|
+
* @returns matching audit log entries with `username` and `target_username`
|
|
97
|
+
*/
|
|
98
|
+
export const query_audit_log_list_with_usernames = async (deps, options) => {
|
|
99
|
+
const conditions = [];
|
|
100
|
+
const params = [];
|
|
101
|
+
let param_index = 1;
|
|
102
|
+
if (options?.event_type) {
|
|
103
|
+
conditions.push(`al.event_type = $${param_index++}`);
|
|
104
|
+
params.push(options.event_type);
|
|
105
|
+
}
|
|
106
|
+
if (options?.event_type_in && options.event_type_in.length > 0) {
|
|
107
|
+
const placeholders = options.event_type_in.map(() => `$${param_index++}`);
|
|
108
|
+
conditions.push(`al.event_type IN (${placeholders.join(', ')})`);
|
|
109
|
+
params.push(...options.event_type_in);
|
|
110
|
+
}
|
|
111
|
+
if (options?.account_id) {
|
|
112
|
+
conditions.push(`(al.account_id = $${param_index} OR al.target_account_id = $${param_index})`);
|
|
113
|
+
param_index++;
|
|
114
|
+
params.push(options.account_id);
|
|
115
|
+
}
|
|
116
|
+
if (options?.outcome) {
|
|
117
|
+
conditions.push(`al.outcome = $${param_index++}`);
|
|
118
|
+
params.push(options.outcome);
|
|
119
|
+
}
|
|
120
|
+
if (options?.since_seq != null) {
|
|
121
|
+
conditions.push(`al.seq > $${param_index++}`);
|
|
122
|
+
params.push(options.since_seq);
|
|
123
|
+
}
|
|
124
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
125
|
+
const limit = options?.limit ?? AUDIT_LOG_DEFAULT_LIMIT;
|
|
126
|
+
const offset = options?.offset ?? 0;
|
|
127
|
+
return deps.db.query(`SELECT al.*,
|
|
128
|
+
a1.username AS username,
|
|
129
|
+
a2.username AS target_username
|
|
130
|
+
FROM audit_log al
|
|
131
|
+
LEFT JOIN account a1 ON a1.id = al.account_id
|
|
132
|
+
LEFT JOIN account a2 ON a2.id = al.target_account_id
|
|
133
|
+
${where} ORDER BY al.seq DESC LIMIT $${param_index++} OFFSET $${param_index}`, [...params, limit, offset]);
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* List audit log entries related to an account (as actor or target).
|
|
137
|
+
*
|
|
138
|
+
* @param deps - query dependencies
|
|
139
|
+
* @param account_id - the account to query for
|
|
140
|
+
* @param limit - maximum entries to return
|
|
141
|
+
*/
|
|
142
|
+
export const query_audit_log_list_for_account = async (deps, account_id, limit = AUDIT_LOG_DEFAULT_LIMIT) => {
|
|
143
|
+
return deps.db.query(`SELECT * FROM audit_log
|
|
144
|
+
WHERE account_id = $1 OR target_account_id = $1
|
|
145
|
+
ORDER BY seq DESC LIMIT $2`, [account_id, limit]);
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* List permit grant/revoke events with resolved usernames.
|
|
149
|
+
*
|
|
150
|
+
* @param deps - query dependencies
|
|
151
|
+
* @param limit - maximum entries to return
|
|
152
|
+
* @param offset - number of entries to skip
|
|
153
|
+
* @returns permit history events with `username` and `target_username`
|
|
154
|
+
*/
|
|
155
|
+
export const query_audit_log_list_permit_history = async (deps, limit = AUDIT_LOG_DEFAULT_LIMIT, offset = 0) => {
|
|
156
|
+
return deps.db.query(`SELECT al.*,
|
|
157
|
+
a1.username AS username,
|
|
158
|
+
a2.username AS target_username
|
|
159
|
+
FROM audit_log al
|
|
160
|
+
LEFT JOIN account a1 ON a1.id = al.account_id
|
|
161
|
+
LEFT JOIN account a2 ON a2.id = al.target_account_id
|
|
162
|
+
WHERE al.event_type IN ('permit_grant', 'permit_revoke')
|
|
163
|
+
ORDER BY al.seq DESC LIMIT $1 OFFSET $2`, [limit, offset]);
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Delete audit log entries older than the given date.
|
|
167
|
+
*
|
|
168
|
+
* @param deps - query dependencies
|
|
169
|
+
* @param before - delete entries created before this date
|
|
170
|
+
* @returns the number of entries deleted
|
|
171
|
+
*/
|
|
172
|
+
export const query_audit_log_cleanup_before = async (deps, before) => {
|
|
173
|
+
const rows = await deps.db.query(`DELETE FROM audit_log WHERE created_at < $1 RETURNING id`, [before.toISOString()]);
|
|
174
|
+
return rows.length;
|
|
175
|
+
};
|
|
176
|
+
/**
|
|
177
|
+
* Log an audit event without blocking the caller.
|
|
178
|
+
*
|
|
179
|
+
* Errors are logged to console — audit logging never breaks auth flows.
|
|
180
|
+
* Uses `background_db` so audit entries persist even if the request transaction rolls back.
|
|
181
|
+
* Write failures and `on_event` callback failures are logged separately
|
|
182
|
+
* so the error message indicates which phase failed.
|
|
183
|
+
*
|
|
184
|
+
* @param route - `background_db` and `pending_effects` from the route context
|
|
185
|
+
* @param input - the audit event to record
|
|
186
|
+
* @param log - the logger instance
|
|
187
|
+
* @param on_event - callback invoked with the inserted row after a successful write
|
|
188
|
+
* @returns the settled promise (callers may ignore it — fire-and-forget semantics preserved)
|
|
189
|
+
*/
|
|
190
|
+
export const audit_log_fire_and_forget = (route, input, log, on_event) => {
|
|
191
|
+
const p = query_audit_log({ db: route.background_db }, input)
|
|
192
|
+
.then((event) => {
|
|
193
|
+
try {
|
|
194
|
+
on_event(event);
|
|
195
|
+
}
|
|
196
|
+
catch (callback_err) {
|
|
197
|
+
log.error('Audit log on_event callback failed:', callback_err);
|
|
198
|
+
}
|
|
199
|
+
})
|
|
200
|
+
.catch((err) => {
|
|
201
|
+
log.error('Audit log write failed:', err);
|
|
202
|
+
});
|
|
203
|
+
route.pending_effects.push(p);
|
|
204
|
+
return p;
|
|
205
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit log and admin observability route specs.
|
|
3
|
+
*
|
|
4
|
+
* All routes require admin role by default. Provides audit event listing,
|
|
5
|
+
* permit history shortcut, and active session overview.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { Logger } from '@fuzdev/fuz_util/log.js';
|
|
10
|
+
import type { RouteSpec } from '../http/route_spec.js';
|
|
11
|
+
import { type SseStream, type SseNotification } from '../realtime/sse.js';
|
|
12
|
+
/** Options for audit log route specs. */
|
|
13
|
+
export interface AuditLogRouteOptions {
|
|
14
|
+
/** Role required to access audit routes. Default `'admin'`. */
|
|
15
|
+
required_role?: string;
|
|
16
|
+
/**
|
|
17
|
+
* When provided, includes an SSE route at `/audit-log/stream` for realtime audit events.
|
|
18
|
+
* The `subscribe` function receives the stream, channels, and the subscriber's `account_id`
|
|
19
|
+
* as an identity key — enabling `close_by_identity()` for auth revocation.
|
|
20
|
+
*/
|
|
21
|
+
stream?: {
|
|
22
|
+
subscribe: (stream: SseStream<SseNotification>, channels?: Array<string>, identity?: string) => () => void;
|
|
23
|
+
log: Logger;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create audit log and admin observability route specs.
|
|
28
|
+
*
|
|
29
|
+
* @param options - optional options with role override
|
|
30
|
+
* @returns route specs for audit log and admin session management
|
|
31
|
+
*/
|
|
32
|
+
export declare const create_audit_log_route_specs: (options?: AuditLogRouteOptions) => Array<RouteSpec>;
|
|
33
|
+
//# sourceMappingURL=audit_log_routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit_log_routes.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/audit_log_routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAQpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAQrD,OAAO,EAAsB,KAAK,SAAS,EAAE,KAAK,eAAe,EAAC,MAAM,oBAAoB,CAAC;AAU7F,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACpC,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,MAAM,CAAC,EAAE;QACR,SAAS,EAAE,CACV,MAAM,EAAE,SAAS,CAAC,eAAe,CAAC,EAClC,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EACxB,QAAQ,CAAC,EAAE,MAAM,KACb,MAAM,IAAI,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;KACZ,CAAC;CACF;AAED;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,GAAI,UAAU,oBAAoB,KAAG,KAAK,CAAC,SAAS,CAuF5F,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit log and admin observability route specs.
|
|
3
|
+
*
|
|
4
|
+
* All routes require admin role by default. Provides audit event listing,
|
|
5
|
+
* permit history shortcut, and active session overview.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { AuditLogEventWithUsernamesJson, AdminSessionJson, AuditEventType, PermitHistoryEventJson, } from './audit_log_schema.js';
|
|
11
|
+
import { AUDIT_LOG_DEFAULT_LIMIT, query_audit_log_list_with_usernames, query_audit_log_list_permit_history, } from './audit_log_queries.js';
|
|
12
|
+
import { query_session_list_all_active } from './session_queries.js';
|
|
13
|
+
import { ERROR_INVALID_EVENT_TYPE } from '../http/error_schemas.js';
|
|
14
|
+
import { create_sse_response } from '../realtime/sse.js';
|
|
15
|
+
import { require_request_context } from './request_context.js';
|
|
16
|
+
// TODO upstream to fuz_util
|
|
17
|
+
/** Parse a string to an integer, returning `undefined` for non-numeric input (including `NaN`). */
|
|
18
|
+
const parse_int_or_undefined = (value) => {
|
|
19
|
+
const n = parseInt(value, 10);
|
|
20
|
+
return Number.isFinite(n) ? n : undefined;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Create audit log and admin observability route specs.
|
|
24
|
+
*
|
|
25
|
+
* @param options - optional options with role override
|
|
26
|
+
* @returns route specs for audit log and admin session management
|
|
27
|
+
*/
|
|
28
|
+
export const create_audit_log_route_specs = (options) => {
|
|
29
|
+
const role = options?.required_role ?? 'admin';
|
|
30
|
+
const routes = [
|
|
31
|
+
{
|
|
32
|
+
method: 'GET',
|
|
33
|
+
path: '/audit-log',
|
|
34
|
+
auth: { type: 'role', role },
|
|
35
|
+
description: 'List audit log events with optional filters',
|
|
36
|
+
input: z.null(),
|
|
37
|
+
output: z.strictObject({ events: z.array(AuditLogEventWithUsernamesJson) }),
|
|
38
|
+
errors: { 400: z.looseObject({ error: z.literal(ERROR_INVALID_EVENT_TYPE) }) },
|
|
39
|
+
handler: async (c, route) => {
|
|
40
|
+
const raw_event_type = c.req.query('event_type') || undefined;
|
|
41
|
+
if (raw_event_type && !AuditEventType.safeParse(raw_event_type).success) {
|
|
42
|
+
return c.json({ error: ERROR_INVALID_EVENT_TYPE }, 400);
|
|
43
|
+
}
|
|
44
|
+
const event_type = raw_event_type;
|
|
45
|
+
const account_id = c.req.query('account_id') || undefined;
|
|
46
|
+
const limit = Math.max(1, Math.min(200, parseInt(c.req.query('limit') ?? '', 10) || AUDIT_LOG_DEFAULT_LIMIT));
|
|
47
|
+
const offset = Math.max(0, parseInt(c.req.query('offset') ?? '', 10) || 0);
|
|
48
|
+
const raw_since_seq = c.req.query('since_seq');
|
|
49
|
+
const since_seq = raw_since_seq != null ? parse_int_or_undefined(raw_since_seq) : undefined;
|
|
50
|
+
const events = await query_audit_log_list_with_usernames(route, {
|
|
51
|
+
event_type,
|
|
52
|
+
account_id,
|
|
53
|
+
limit,
|
|
54
|
+
offset,
|
|
55
|
+
since_seq,
|
|
56
|
+
});
|
|
57
|
+
return c.json({ events });
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
method: 'GET',
|
|
62
|
+
path: '/audit-log/permit-history',
|
|
63
|
+
auth: { type: 'role', role },
|
|
64
|
+
description: 'List permit grant and revoke events with usernames',
|
|
65
|
+
input: z.null(),
|
|
66
|
+
output: z.strictObject({ events: z.array(PermitHistoryEventJson) }),
|
|
67
|
+
handler: async (c, route) => {
|
|
68
|
+
const limit = Math.max(1, Math.min(200, parseInt(c.req.query('limit') ?? '', 10) || AUDIT_LOG_DEFAULT_LIMIT));
|
|
69
|
+
const offset = Math.max(0, parseInt(c.req.query('offset') ?? '', 10) || 0);
|
|
70
|
+
const events = await query_audit_log_list_permit_history(route, limit, offset);
|
|
71
|
+
return c.json({ events });
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
method: 'GET',
|
|
76
|
+
path: '/sessions',
|
|
77
|
+
auth: { type: 'role', role },
|
|
78
|
+
description: 'List all active sessions across all accounts',
|
|
79
|
+
input: z.null(),
|
|
80
|
+
output: z.strictObject({ sessions: z.array(AdminSessionJson) }),
|
|
81
|
+
handler: async (c, route) => {
|
|
82
|
+
const sessions = await query_session_list_all_active(route);
|
|
83
|
+
return c.json({ sessions });
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
if (options?.stream) {
|
|
88
|
+
const { subscribe, log } = options.stream;
|
|
89
|
+
routes.push({
|
|
90
|
+
method: 'GET',
|
|
91
|
+
path: '/audit-log/stream',
|
|
92
|
+
auth: { type: 'role', role },
|
|
93
|
+
description: 'Subscribe to realtime audit log events',
|
|
94
|
+
input: z.null(),
|
|
95
|
+
output: z.null(), // SSE — no JSON response
|
|
96
|
+
handler: (c) => {
|
|
97
|
+
const ctx = require_request_context(c);
|
|
98
|
+
const { response, stream } = create_sse_response(c, log);
|
|
99
|
+
const unsubscribe = subscribe(stream, ['audit_log'], ctx.account.id);
|
|
100
|
+
stream.on_close(unsubscribe);
|
|
101
|
+
return response;
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return routes;
|
|
106
|
+
};
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit log database schema and types.
|
|
3
|
+
*
|
|
4
|
+
* Records auth mutations (login, logout, grant, revoke, etc.) for
|
|
5
|
+
* security monitoring and operational visibility.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
/** All tracked auth event types. */
|
|
11
|
+
export declare const AUDIT_EVENT_TYPES: readonly ["login", "logout", "bootstrap", "signup", "password_change", "session_revoke", "session_revoke_all", "token_create", "token_revoke", "token_revoke_all", "permit_grant", "permit_revoke", "invite_create", "invite_delete", "app_settings_update"];
|
|
12
|
+
/** Zod schema for audit event types. */
|
|
13
|
+
export declare const AuditEventType: z.ZodEnum<{
|
|
14
|
+
login: "login";
|
|
15
|
+
logout: "logout";
|
|
16
|
+
bootstrap: "bootstrap";
|
|
17
|
+
signup: "signup";
|
|
18
|
+
password_change: "password_change";
|
|
19
|
+
session_revoke: "session_revoke";
|
|
20
|
+
session_revoke_all: "session_revoke_all";
|
|
21
|
+
token_create: "token_create";
|
|
22
|
+
token_revoke: "token_revoke";
|
|
23
|
+
token_revoke_all: "token_revoke_all";
|
|
24
|
+
permit_grant: "permit_grant";
|
|
25
|
+
permit_revoke: "permit_revoke";
|
|
26
|
+
invite_create: "invite_create";
|
|
27
|
+
invite_delete: "invite_delete";
|
|
28
|
+
app_settings_update: "app_settings_update";
|
|
29
|
+
}>;
|
|
30
|
+
export type AuditEventType = z.infer<typeof AuditEventType>;
|
|
31
|
+
/** Zod schema for audit event outcomes. */
|
|
32
|
+
export declare const AuditOutcome: z.ZodEnum<{
|
|
33
|
+
success: "success";
|
|
34
|
+
failure: "failure";
|
|
35
|
+
}>;
|
|
36
|
+
export type AuditOutcome = z.infer<typeof AuditOutcome>;
|
|
37
|
+
/**
|
|
38
|
+
* Per-event-type metadata Zod schemas.
|
|
39
|
+
*
|
|
40
|
+
* Uses `z.looseObject` so consumers can add extra fields
|
|
41
|
+
* (e.g. visiones `self_service`) while known fields are validated.
|
|
42
|
+
* Events with outcome-dependent metadata use a union with `z.null()`.
|
|
43
|
+
*/
|
|
44
|
+
export declare const AUDIT_METADATA_SCHEMAS: {
|
|
45
|
+
login: z.ZodNullable<z.ZodObject<{
|
|
46
|
+
username: z.ZodString;
|
|
47
|
+
}, z.core.$loose>>;
|
|
48
|
+
logout: z.ZodNull;
|
|
49
|
+
bootstrap: z.ZodNullable<z.ZodObject<{
|
|
50
|
+
error: z.ZodString;
|
|
51
|
+
}, z.core.$loose>>;
|
|
52
|
+
signup: z.ZodObject<{
|
|
53
|
+
username: z.ZodString;
|
|
54
|
+
invite_id: z.ZodOptional<z.ZodString>;
|
|
55
|
+
open_signup: z.ZodOptional<z.ZodBoolean>;
|
|
56
|
+
}, z.core.$loose>;
|
|
57
|
+
password_change: z.ZodNullable<z.ZodObject<{
|
|
58
|
+
sessions_revoked: z.ZodNumber;
|
|
59
|
+
}, z.core.$loose>>;
|
|
60
|
+
session_revoke: z.ZodObject<{
|
|
61
|
+
session_id: z.ZodString;
|
|
62
|
+
}, z.core.$loose>;
|
|
63
|
+
session_revoke_all: z.ZodObject<{
|
|
64
|
+
count: z.ZodNumber;
|
|
65
|
+
}, z.core.$loose>;
|
|
66
|
+
token_create: z.ZodObject<{
|
|
67
|
+
token_id: z.ZodString;
|
|
68
|
+
name: z.ZodString;
|
|
69
|
+
}, z.core.$loose>;
|
|
70
|
+
token_revoke: z.ZodObject<{
|
|
71
|
+
token_id: z.ZodString;
|
|
72
|
+
}, z.core.$loose>;
|
|
73
|
+
token_revoke_all: z.ZodObject<{
|
|
74
|
+
count: z.ZodNumber;
|
|
75
|
+
}, z.core.$loose>;
|
|
76
|
+
permit_grant: z.ZodObject<{
|
|
77
|
+
role: z.ZodString;
|
|
78
|
+
permit_id: z.ZodString;
|
|
79
|
+
}, z.core.$loose>;
|
|
80
|
+
permit_revoke: z.ZodObject<{
|
|
81
|
+
role: z.ZodString;
|
|
82
|
+
permit_id: z.ZodString;
|
|
83
|
+
}, z.core.$loose>;
|
|
84
|
+
invite_create: z.ZodObject<{
|
|
85
|
+
invite_id: z.ZodString;
|
|
86
|
+
email: z.ZodNullable<z.ZodString>;
|
|
87
|
+
username: z.ZodNullable<z.ZodString>;
|
|
88
|
+
}, z.core.$loose>;
|
|
89
|
+
invite_delete: z.ZodObject<{
|
|
90
|
+
invite_id: z.ZodString;
|
|
91
|
+
}, z.core.$loose>;
|
|
92
|
+
app_settings_update: z.ZodObject<{
|
|
93
|
+
setting: z.ZodString;
|
|
94
|
+
old_value: z.ZodUnknown;
|
|
95
|
+
new_value: z.ZodUnknown;
|
|
96
|
+
}, z.core.$loose>;
|
|
97
|
+
};
|
|
98
|
+
/** Mapped type of metadata shapes per event type, derived from Zod schemas. */
|
|
99
|
+
export type AuditMetadataMap = {
|
|
100
|
+
[K in AuditEventType]: z.infer<(typeof AUDIT_METADATA_SCHEMAS)[K]>;
|
|
101
|
+
};
|
|
102
|
+
/** Audit log row from the database. */
|
|
103
|
+
export interface AuditLogEvent {
|
|
104
|
+
id: string;
|
|
105
|
+
seq: number;
|
|
106
|
+
event_type: AuditEventType;
|
|
107
|
+
outcome: AuditOutcome;
|
|
108
|
+
actor_id: string | null;
|
|
109
|
+
account_id: string | null;
|
|
110
|
+
target_account_id: string | null;
|
|
111
|
+
ip: string | null;
|
|
112
|
+
created_at: string;
|
|
113
|
+
metadata: Record<string, unknown> | null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Narrow metadata type for a known event type.
|
|
117
|
+
*
|
|
118
|
+
* Use after checking `event_type` to get typed metadata access.
|
|
119
|
+
*/
|
|
120
|
+
export declare const get_audit_metadata: <T extends AuditEventType>(event: AuditLogEvent & {
|
|
121
|
+
event_type: T;
|
|
122
|
+
}) => AuditMetadataMap[T] | null;
|
|
123
|
+
/** Input for creating an audit log entry. */
|
|
124
|
+
export interface AuditLogInput<T extends AuditEventType = AuditEventType> {
|
|
125
|
+
event_type: T;
|
|
126
|
+
outcome?: AuditOutcome;
|
|
127
|
+
actor_id?: string | null;
|
|
128
|
+
account_id?: string | null;
|
|
129
|
+
target_account_id?: string | null;
|
|
130
|
+
ip?: string | null;
|
|
131
|
+
metadata?: (AuditMetadataMap[T] & Record<string, unknown>) | null;
|
|
132
|
+
}
|
|
133
|
+
/** Options for listing audit log entries. */
|
|
134
|
+
export interface AuditLogListOptions {
|
|
135
|
+
limit?: number;
|
|
136
|
+
offset?: number;
|
|
137
|
+
event_type?: AuditEventType;
|
|
138
|
+
event_type_in?: Array<AuditEventType>;
|
|
139
|
+
account_id?: string;
|
|
140
|
+
outcome?: AuditOutcome;
|
|
141
|
+
/** When set, only return events with `seq` greater than this value. Enables SSE reconnection gap fill. */
|
|
142
|
+
since_seq?: number;
|
|
143
|
+
}
|
|
144
|
+
/** Zod schema for client-safe audit log event. */
|
|
145
|
+
export declare const AuditLogEventJson: z.ZodObject<{
|
|
146
|
+
id: z.ZodString;
|
|
147
|
+
seq: z.ZodNumber;
|
|
148
|
+
event_type: z.ZodEnum<{
|
|
149
|
+
login: "login";
|
|
150
|
+
logout: "logout";
|
|
151
|
+
bootstrap: "bootstrap";
|
|
152
|
+
signup: "signup";
|
|
153
|
+
password_change: "password_change";
|
|
154
|
+
session_revoke: "session_revoke";
|
|
155
|
+
session_revoke_all: "session_revoke_all";
|
|
156
|
+
token_create: "token_create";
|
|
157
|
+
token_revoke: "token_revoke";
|
|
158
|
+
token_revoke_all: "token_revoke_all";
|
|
159
|
+
permit_grant: "permit_grant";
|
|
160
|
+
permit_revoke: "permit_revoke";
|
|
161
|
+
invite_create: "invite_create";
|
|
162
|
+
invite_delete: "invite_delete";
|
|
163
|
+
app_settings_update: "app_settings_update";
|
|
164
|
+
}>;
|
|
165
|
+
outcome: z.ZodEnum<{
|
|
166
|
+
success: "success";
|
|
167
|
+
failure: "failure";
|
|
168
|
+
}>;
|
|
169
|
+
actor_id: z.ZodNullable<z.ZodString>;
|
|
170
|
+
account_id: z.ZodNullable<z.ZodString>;
|
|
171
|
+
target_account_id: z.ZodNullable<z.ZodString>;
|
|
172
|
+
ip: z.ZodNullable<z.ZodString>;
|
|
173
|
+
created_at: z.ZodString;
|
|
174
|
+
metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
175
|
+
}, z.core.$strict>;
|
|
176
|
+
export type AuditLogEventJson = z.infer<typeof AuditLogEventJson>;
|
|
177
|
+
/** Zod schema for audit log events with resolved usernames. */
|
|
178
|
+
export declare const AuditLogEventWithUsernamesJson: z.ZodObject<{
|
|
179
|
+
id: z.ZodString;
|
|
180
|
+
seq: z.ZodNumber;
|
|
181
|
+
event_type: z.ZodEnum<{
|
|
182
|
+
login: "login";
|
|
183
|
+
logout: "logout";
|
|
184
|
+
bootstrap: "bootstrap";
|
|
185
|
+
signup: "signup";
|
|
186
|
+
password_change: "password_change";
|
|
187
|
+
session_revoke: "session_revoke";
|
|
188
|
+
session_revoke_all: "session_revoke_all";
|
|
189
|
+
token_create: "token_create";
|
|
190
|
+
token_revoke: "token_revoke";
|
|
191
|
+
token_revoke_all: "token_revoke_all";
|
|
192
|
+
permit_grant: "permit_grant";
|
|
193
|
+
permit_revoke: "permit_revoke";
|
|
194
|
+
invite_create: "invite_create";
|
|
195
|
+
invite_delete: "invite_delete";
|
|
196
|
+
app_settings_update: "app_settings_update";
|
|
197
|
+
}>;
|
|
198
|
+
outcome: z.ZodEnum<{
|
|
199
|
+
success: "success";
|
|
200
|
+
failure: "failure";
|
|
201
|
+
}>;
|
|
202
|
+
actor_id: z.ZodNullable<z.ZodString>;
|
|
203
|
+
account_id: z.ZodNullable<z.ZodString>;
|
|
204
|
+
target_account_id: z.ZodNullable<z.ZodString>;
|
|
205
|
+
ip: z.ZodNullable<z.ZodString>;
|
|
206
|
+
created_at: z.ZodString;
|
|
207
|
+
metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
208
|
+
username: z.ZodNullable<z.ZodString>;
|
|
209
|
+
target_username: z.ZodNullable<z.ZodString>;
|
|
210
|
+
}, z.core.$strict>;
|
|
211
|
+
export type AuditLogEventWithUsernamesJson = z.infer<typeof AuditLogEventWithUsernamesJson>;
|
|
212
|
+
/** Zod schema for permit history events with resolved usernames. */
|
|
213
|
+
export declare const PermitHistoryEventJson: z.ZodObject<{
|
|
214
|
+
id: z.ZodString;
|
|
215
|
+
seq: z.ZodNumber;
|
|
216
|
+
event_type: z.ZodEnum<{
|
|
217
|
+
login: "login";
|
|
218
|
+
logout: "logout";
|
|
219
|
+
bootstrap: "bootstrap";
|
|
220
|
+
signup: "signup";
|
|
221
|
+
password_change: "password_change";
|
|
222
|
+
session_revoke: "session_revoke";
|
|
223
|
+
session_revoke_all: "session_revoke_all";
|
|
224
|
+
token_create: "token_create";
|
|
225
|
+
token_revoke: "token_revoke";
|
|
226
|
+
token_revoke_all: "token_revoke_all";
|
|
227
|
+
permit_grant: "permit_grant";
|
|
228
|
+
permit_revoke: "permit_revoke";
|
|
229
|
+
invite_create: "invite_create";
|
|
230
|
+
invite_delete: "invite_delete";
|
|
231
|
+
app_settings_update: "app_settings_update";
|
|
232
|
+
}>;
|
|
233
|
+
outcome: z.ZodEnum<{
|
|
234
|
+
success: "success";
|
|
235
|
+
failure: "failure";
|
|
236
|
+
}>;
|
|
237
|
+
actor_id: z.ZodNullable<z.ZodString>;
|
|
238
|
+
account_id: z.ZodNullable<z.ZodString>;
|
|
239
|
+
target_account_id: z.ZodNullable<z.ZodString>;
|
|
240
|
+
ip: z.ZodNullable<z.ZodString>;
|
|
241
|
+
created_at: z.ZodString;
|
|
242
|
+
metadata: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
243
|
+
username: z.ZodNullable<z.ZodString>;
|
|
244
|
+
target_username: z.ZodNullable<z.ZodString>;
|
|
245
|
+
}, z.core.$strict>;
|
|
246
|
+
export type PermitHistoryEventJson = z.infer<typeof PermitHistoryEventJson>;
|
|
247
|
+
/** Zod schema for admin session listing (session + username). */
|
|
248
|
+
export declare const AdminSessionJson: z.ZodObject<{
|
|
249
|
+
id: z.ZodString;
|
|
250
|
+
account_id: z.ZodString;
|
|
251
|
+
created_at: z.ZodString;
|
|
252
|
+
expires_at: z.ZodString;
|
|
253
|
+
last_seen_at: z.ZodString;
|
|
254
|
+
username: z.ZodString;
|
|
255
|
+
}, z.core.$strict>;
|
|
256
|
+
export type AdminSessionJson = z.infer<typeof AdminSessionJson>;
|
|
257
|
+
export declare const AUDIT_LOG_SCHEMA = "\nCREATE TABLE IF NOT EXISTS audit_log (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n seq SERIAL NOT NULL,\n event_type TEXT NOT NULL,\n outcome TEXT NOT NULL DEFAULT 'success',\n actor_id UUID REFERENCES actor(id) ON DELETE SET NULL,\n account_id UUID REFERENCES account(id) ON DELETE SET NULL,\n target_account_id UUID REFERENCES account(id) ON DELETE SET NULL,\n ip TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n metadata JSONB\n)";
|
|
258
|
+
export declare const AUDIT_LOG_INDEXES: string[];
|
|
259
|
+
//# sourceMappingURL=audit_log_schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit_log_schema.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/audit_log_schema.ts"],"names":[],"mappings":"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"}
|