@fuzdev/fuz_app 0.104.0 → 0.105.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/dist/actions/CLAUDE.md +2 -2
- package/dist/actions/action_bridge.d.ts.map +1 -1
- package/dist/actions/action_bridge.js +2 -2
- package/dist/actions/action_codegen.d.ts.map +1 -1
- package/dist/actions/action_codegen.js +3 -3
- package/dist/actions/action_dispatcher.d.ts.map +1 -1
- package/dist/actions/action_dispatcher.js +3 -3
- package/dist/actions/action_event.d.ts.map +1 -1
- package/dist/actions/action_event.js +11 -11
- package/dist/actions/action_event_data.d.ts.map +1 -1
- package/dist/actions/action_event_data.js +2 -2
- package/dist/actions/action_event_helpers.d.ts.map +1 -1
- package/dist/actions/action_event_helpers.js +2 -2
- package/dist/actions/action_event_types.d.ts.map +1 -1
- package/dist/actions/action_event_types.js +4 -4
- package/dist/actions/action_rpc.d.ts.map +1 -1
- package/dist/actions/action_rpc.js +13 -13
- package/dist/actions/action_spec.d.ts.map +1 -1
- package/dist/actions/action_spec.js +6 -6
- package/dist/actions/action_types.d.ts.map +1 -1
- package/dist/actions/broadcast_api.d.ts.map +1 -1
- package/dist/actions/broadcast_api.js +1 -1
- package/dist/actions/cancel.d.ts.map +1 -1
- package/dist/actions/cancel.js +3 -3
- package/dist/actions/compile_action_registry.d.ts.map +1 -1
- package/dist/actions/frontend_rpc_client.d.ts.map +1 -1
- package/dist/actions/frontend_rpc_client.js +3 -3
- package/dist/actions/heartbeat.d.ts.map +1 -1
- package/dist/actions/heartbeat.js +2 -2
- package/dist/actions/peer_ping.d.ts.map +1 -1
- package/dist/actions/peer_ping.js +6 -6
- package/dist/actions/peer_request.d.ts.map +1 -1
- package/dist/actions/perform_action.d.ts.map +1 -1
- package/dist/actions/perform_action.js +13 -13
- package/dist/actions/protocol.d.ts.map +1 -1
- package/dist/actions/protocol.js +1 -1
- package/dist/actions/register_action_ws.d.ts.map +1 -1
- package/dist/actions/register_action_ws.js +14 -11
- package/dist/actions/register_ws_endpoint.d.ts.map +1 -1
- package/dist/actions/register_ws_endpoint.js +3 -3
- package/dist/actions/request_tracker.svelte.d.ts.map +1 -1
- package/dist/actions/request_tracker.svelte.js +2 -2
- package/dist/actions/rpc_client.d.ts.map +1 -1
- package/dist/actions/rpc_client.js +7 -7
- package/dist/actions/socket.svelte.d.ts.map +1 -1
- package/dist/actions/socket.svelte.js +4 -3
- package/dist/actions/transports.d.ts.map +1 -1
- package/dist/actions/transports_http.d.ts.map +1 -1
- package/dist/actions/transports_http.js +7 -7
- package/dist/actions/transports_ws.d.ts.map +1 -1
- package/dist/actions/transports_ws.js +3 -3
- package/dist/actions/transports_ws_auth_guard.d.ts +4 -4
- package/dist/actions/transports_ws_auth_guard.d.ts.map +1 -1
- package/dist/actions/transports_ws_auth_guard.js +5 -5
- package/dist/actions/transports_ws_backend.d.ts.map +1 -1
- package/dist/actions/transports_ws_backend.js +2 -2
- package/dist/actions/ws_endpoint_spec.d.ts +2 -2
- package/dist/actions/ws_endpoint_spec.d.ts.map +1 -1
- package/dist/auth/CLAUDE.md +11 -7
- package/dist/auth/account_action_specs.d.ts +4 -4
- package/dist/auth/account_action_specs.d.ts.map +1 -1
- package/dist/auth/account_action_specs.js +18 -19
- package/dist/auth/account_actions.d.ts +3 -3
- package/dist/auth/account_actions.d.ts.map +1 -1
- package/dist/auth/account_actions.js +10 -10
- package/dist/auth/account_queries.d.ts.map +1 -1
- package/dist/auth/account_queries.js +6 -6
- package/dist/auth/account_route_schema.d.ts.map +1 -1
- package/dist/auth/account_route_schema.js +19 -19
- package/dist/auth/account_routes.d.ts +2 -2
- package/dist/auth/account_routes.d.ts.map +1 -1
- package/dist/auth/account_routes.js +27 -27
- package/dist/auth/account_schema.d.ts +13 -2
- package/dist/auth/account_schema.d.ts.map +1 -1
- package/dist/auth/account_schema.js +22 -11
- package/dist/auth/actor_lookup_action_specs.d.ts.map +1 -1
- package/dist/auth/actor_lookup_action_specs.js +5 -5
- package/dist/auth/actor_lookup_actions.d.ts +4 -2
- package/dist/auth/actor_lookup_actions.d.ts.map +1 -1
- package/dist/auth/actor_lookup_actions.js +3 -3
- package/dist/auth/actor_lookup_queries.d.ts.map +1 -1
- package/dist/auth/actor_search_action_specs.d.ts.map +1 -1
- package/dist/auth/actor_search_action_specs.js +6 -6
- package/dist/auth/actor_search_actions.d.ts +4 -2
- package/dist/auth/actor_search_actions.d.ts.map +1 -1
- package/dist/auth/actor_search_actions.js +5 -5
- package/dist/auth/actor_search_queries.d.ts.map +1 -1
- package/dist/auth/admin_action_specs.d.ts +2 -2
- package/dist/auth/admin_action_specs.d.ts.map +1 -1
- package/dist/auth/admin_action_specs.js +55 -55
- package/dist/auth/admin_actions.d.ts +5 -5
- package/dist/auth/admin_actions.d.ts.map +1 -1
- package/dist/auth/admin_actions.js +45 -44
- package/dist/auth/all_action_spec_registries.d.ts.map +1 -1
- package/dist/auth/all_action_spec_registries.js +1 -1
- package/dist/auth/all_cell_actions.d.ts.map +1 -1
- package/dist/auth/all_cell_actions.js +1 -1
- package/dist/auth/api_token.d.ts.map +1 -1
- package/dist/auth/api_token_queries.d.ts +7 -2
- package/dist/auth/api_token_queries.d.ts.map +1 -1
- package/dist/auth/api_token_queries.js +8 -3
- package/dist/auth/app_settings_queries.d.ts.map +1 -1
- package/dist/auth/app_settings_schema.d.ts.map +1 -1
- package/dist/auth/app_settings_schema.js +3 -3
- package/dist/auth/audit_emitter.d.ts +28 -20
- package/dist/auth/audit_emitter.d.ts.map +1 -1
- package/dist/auth/audit_emitter.js +37 -19
- package/dist/auth/audit_log_ddl.js +1 -1
- package/dist/auth/audit_log_queries.d.ts.map +1 -1
- package/dist/auth/audit_log_queries.js +2 -2
- package/dist/auth/audit_log_route_schema.d.ts.map +1 -1
- package/dist/auth/audit_log_route_schema.js +1 -1
- package/dist/auth/audit_log_routes.d.ts.map +1 -1
- package/dist/auth/audit_log_routes.js +3 -3
- package/dist/auth/audit_log_schema.d.ts +2 -2
- package/dist/auth/audit_log_schema.d.ts.map +1 -1
- package/dist/auth/audit_log_schema.js +69 -68
- package/dist/auth/auth_ddl.js +3 -3
- package/dist/auth/auth_guard_resolver.d.ts.map +1 -1
- package/dist/auth/bearer_auth.d.ts.map +1 -1
- package/dist/auth/bootstrap_account.d.ts.map +1 -1
- package/dist/auth/bootstrap_account.js +5 -5
- package/dist/auth/bootstrap_route_schema.d.ts.map +1 -1
- package/dist/auth/bootstrap_route_schema.js +6 -6
- package/dist/auth/bootstrap_routes.d.ts.map +1 -1
- package/dist/auth/bootstrap_routes.js +7 -7
- package/dist/auth/cell_action_specs.d.ts +1 -1
- package/dist/auth/cell_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_action_specs.js +47 -47
- package/dist/auth/cell_actions.d.ts +2 -2
- package/dist/auth/cell_actions.d.ts.map +1 -1
- package/dist/auth/cell_actions.js +37 -37
- package/dist/auth/cell_audit_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_audit_action_specs.js +4 -4
- package/dist/auth/cell_audit_actions.d.ts.map +1 -1
- package/dist/auth/cell_audit_actions.js +3 -3
- package/dist/auth/cell_audit_events.d.ts.map +1 -1
- package/dist/auth/cell_audit_events.js +5 -5
- package/dist/auth/cell_audit_metadata.d.ts.map +1 -1
- package/dist/auth/cell_audit_metadata.js +3 -3
- package/dist/auth/cell_authorize.d.ts.map +1 -1
- package/dist/auth/cell_data_schema.d.ts.map +1 -1
- package/dist/auth/cell_data_schema.js +1 -1
- package/dist/auth/cell_field_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_field_action_specs.js +16 -16
- package/dist/auth/cell_field_actions.d.ts +2 -2
- package/dist/auth/cell_field_actions.d.ts.map +1 -1
- package/dist/auth/cell_field_actions.js +11 -11
- package/dist/auth/cell_field_audit_metadata.d.ts.map +1 -1
- package/dist/auth/cell_field_audit_metadata.js +2 -2
- package/dist/auth/cell_grant_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_grant_action_specs.js +15 -15
- package/dist/auth/cell_grant_actions.d.ts +2 -2
- package/dist/auth/cell_grant_actions.d.ts.map +1 -1
- package/dist/auth/cell_grant_actions.js +12 -12
- package/dist/auth/cell_grant_audit_metadata.d.ts.map +1 -1
- package/dist/auth/cell_grant_audit_metadata.js +3 -3
- package/dist/auth/cell_item_action_specs.d.ts +6 -2
- package/dist/auth/cell_item_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_item_action_specs.js +25 -21
- package/dist/auth/cell_item_actions.d.ts +2 -2
- package/dist/auth/cell_item_actions.d.ts.map +1 -1
- package/dist/auth/cell_item_actions.js +14 -14
- package/dist/auth/cell_item_audit_metadata.d.ts.map +1 -1
- package/dist/auth/cell_item_audit_metadata.js +3 -3
- package/dist/auth/cell_relation_visibility.d.ts.map +1 -1
- package/dist/auth/cleanup.d.ts.map +1 -1
- package/dist/auth/cleanup.js +2 -2
- package/dist/auth/credential_type_schema.d.ts.map +1 -1
- package/dist/auth/credential_type_schema.js +5 -5
- package/dist/auth/daemon_token.d.ts.map +1 -1
- package/dist/auth/daemon_token_middleware.d.ts.map +1 -1
- package/dist/auth/daemon_token_middleware.js +2 -2
- package/dist/auth/deps.d.ts +20 -5
- package/dist/auth/deps.d.ts.map +1 -1
- package/dist/auth/grant_path_schema.d.ts.map +1 -1
- package/dist/auth/grant_path_schema.js +8 -8
- package/dist/auth/invite_queries.d.ts.map +1 -1
- package/dist/auth/invite_schema.d.ts.map +1 -1
- package/dist/auth/invite_schema.js +2 -2
- package/dist/auth/keyring.d.ts.map +1 -1
- package/dist/auth/keyring.js +1 -1
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +7 -7
- package/dist/auth/migrations.d.ts.map +1 -1
- package/dist/auth/migrations.js +22 -20
- package/dist/auth/password.d.ts.map +1 -1
- package/dist/auth/password_argon2.d.ts.map +1 -1
- package/dist/auth/password_argon2.js +2 -2
- package/dist/auth/request_context.d.ts.map +1 -1
- package/dist/auth/request_context.js +7 -7
- package/dist/auth/role_grant_offer_action_specs.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_action_specs.js +35 -35
- package/dist/auth/role_grant_offer_actions.d.ts +7 -4
- package/dist/auth/role_grant_offer_actions.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_actions.js +43 -43
- package/dist/auth/role_grant_offer_notifications.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_notifications.js +13 -13
- package/dist/auth/role_grant_offer_queries.d.ts +1 -1
- package/dist/auth/role_grant_offer_queries.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_queries.js +11 -11
- package/dist/auth/role_grant_offer_schema.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_schema.js +7 -7
- package/dist/auth/role_grant_queries.d.ts.map +1 -1
- package/dist/auth/role_grant_queries.js +3 -3
- package/dist/auth/role_schema.d.ts.map +1 -1
- package/dist/auth/role_schema.js +7 -7
- package/dist/auth/scope_kind_schema.d.ts.map +1 -1
- package/dist/auth/self_service_role_action_specs.d.ts.map +1 -1
- package/dist/auth/self_service_role_action_specs.js +5 -5
- package/dist/auth/self_service_role_actions.d.ts +3 -3
- package/dist/auth/self_service_role_actions.d.ts.map +1 -1
- package/dist/auth/self_service_role_actions.js +9 -9
- package/dist/auth/session_cookie.d.ts.map +1 -1
- package/dist/auth/session_cookie.js +3 -3
- package/dist/auth/session_middleware.d.ts.map +1 -1
- package/dist/auth/session_middleware.js +4 -4
- package/dist/auth/session_queries.d.ts +14 -4
- package/dist/auth/session_queries.d.ts.map +1 -1
- package/dist/auth/session_queries.js +13 -3
- package/dist/auth/signup_route_schema.d.ts.map +1 -1
- package/dist/auth/signup_route_schema.js +6 -6
- package/dist/auth/signup_routes.d.ts.map +1 -1
- package/dist/auth/signup_routes.js +11 -11
- package/dist/auth/standard_action_specs.d.ts.map +1 -1
- package/dist/auth/standard_action_specs.js +1 -1
- package/dist/auth/standard_rpc_actions.d.ts +4 -4
- package/dist/auth/standard_rpc_actions.d.ts.map +1 -1
- package/dist/auth/standard_rpc_actions.js +3 -3
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +3 -3
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +1 -1
- package/dist/cli/logger.d.ts.map +1 -1
- package/dist/cli/logger.js +1 -1
- package/dist/cli/util.d.ts.map +1 -1
- package/dist/cli/util.js +1 -1
- package/dist/db/cell_audit_queries.d.ts.map +1 -1
- package/dist/db/cell_audit_queries.js +1 -1
- package/dist/db/cell_ddl.d.ts.map +1 -1
- package/dist/db/cell_ddl.js +7 -7
- package/dist/db/cell_field_queries.d.ts.map +1 -1
- package/dist/db/cell_grant_queries.d.ts.map +1 -1
- package/dist/db/cell_grant_queries.js +1 -1
- package/dist/db/cell_history_ddl.d.ts.map +1 -1
- package/dist/db/cell_history_ddl.js +4 -4
- package/dist/db/cell_item_queries.d.ts.map +1 -1
- package/dist/db/cell_queries.d.ts +1 -1
- package/dist/db/cell_queries.d.ts.map +1 -1
- package/dist/db/cell_queries.js +3 -3
- package/dist/db/create_db.d.ts.map +1 -1
- package/dist/db/create_db.js +1 -1
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db_pg.d.ts.map +1 -1
- package/dist/db/db_pg.js +1 -1
- package/dist/db/db_pglite.d.ts.map +1 -1
- package/dist/db/db_pglite.js +1 -1
- package/dist/db/fact_ddl.d.ts.map +1 -1
- package/dist/db/fact_ddl.js +3 -3
- package/dist/db/fact_disk_storage.d.ts +1 -1
- package/dist/db/fact_disk_storage.d.ts.map +1 -1
- package/dist/db/fact_disk_storage.js +6 -6
- package/dist/db/fact_queries.d.ts +1 -1
- package/dist/db/fact_queries.d.ts.map +1 -1
- package/dist/db/fact_queries.js +2 -2
- package/dist/db/fact_store.d.ts +1 -1
- package/dist/db/fact_store.d.ts.map +1 -1
- package/dist/db/fact_store.js +9 -9
- package/dist/db/fact_store_errors.d.ts.map +1 -1
- package/dist/db/file_fact_url.d.ts +1 -1
- package/dist/db/file_fact_url.d.ts.map +1 -1
- package/dist/db/file_fact_url.js +1 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/pg_error.d.ts.map +1 -1
- package/dist/db/query_deps.d.ts.map +1 -1
- package/dist/db/schema_ready.d.ts.map +1 -1
- package/dist/db/schema_ready.js +2 -2
- package/dist/db/status.d.ts.map +1 -1
- package/dist/db/status.js +6 -6
- package/dist/dev/setup.d.ts.map +1 -1
- package/dist/dev/setup.js +6 -6
- package/dist/env/dotenv.d.ts.map +1 -1
- package/dist/env/load.d.ts.map +1 -1
- package/dist/env/resolve.d.ts.map +1 -1
- package/dist/hono_context.d.ts.map +1 -1
- package/dist/hono_context.js +2 -2
- package/dist/http/auth_shape.d.ts.map +1 -1
- package/dist/http/auth_shape.js +6 -6
- package/dist/http/client_ip.d.ts.map +1 -1
- package/dist/http/common_routes.d.ts.map +1 -1
- package/dist/http/common_routes.js +8 -8
- package/dist/http/db_routes.d.ts.map +1 -1
- package/dist/http/db_routes.js +27 -23
- package/dist/http/error_schemas.d.ts +1 -1
- package/dist/http/error_schemas.d.ts.map +1 -1
- package/dist/http/error_schemas.js +13 -13
- package/dist/http/jsonrpc.d.ts.map +1 -1
- package/dist/http/jsonrpc.js +9 -9
- package/dist/http/jsonrpc_errors.d.ts.map +1 -1
- package/dist/http/jsonrpc_errors.js +21 -21
- package/dist/http/jsonrpc_helpers.d.ts.map +1 -1
- package/dist/http/jsonrpc_helpers.js +7 -7
- package/dist/http/middleware_spec.d.ts.map +1 -1
- package/dist/http/origin.d.ts.map +1 -1
- package/dist/http/pending_effects.d.ts.map +1 -1
- package/dist/http/proxy.d.ts.map +1 -1
- package/dist/http/proxy.js +1 -1
- package/dist/http/route_spec.d.ts.map +1 -1
- package/dist/http/route_spec.js +6 -6
- package/dist/http/schema_helpers.d.ts.map +1 -1
- package/dist/http/schema_helpers.js +1 -1
- package/dist/http/surface.d.ts.map +1 -1
- package/dist/http/surface.js +11 -11
- package/dist/http/surface_query.d.ts.map +1 -1
- package/dist/http/surface_query.js +1 -1
- package/dist/primitive_schemas.d.ts.map +1 -1
- package/dist/primitive_schemas.js +1 -1
- package/dist/rate_limiter.d.ts.map +1 -1
- package/dist/rate_limiter.js +4 -4
- package/dist/realtime/sse.d.ts.map +1 -1
- package/dist/realtime/sse.js +2 -2
- package/dist/realtime/sse_auth_guard.d.ts +4 -4
- package/dist/realtime/sse_auth_guard.d.ts.map +1 -1
- package/dist/realtime/sse_auth_guard.js +8 -8
- package/dist/realtime/subscriber_registry.d.ts.map +1 -1
- package/dist/runtime/deno.d.ts.map +1 -1
- package/dist/runtime/deno.js +7 -7
- package/dist/runtime/deps.d.ts.map +1 -1
- package/dist/runtime/fs.d.ts.map +1 -1
- package/dist/runtime/mock.d.ts.map +1 -1
- package/dist/runtime/mock.js +3 -3
- package/dist/runtime/node.d.ts.map +1 -1
- package/dist/runtime/node.js +7 -7
- package/dist/schema_meta.d.ts.map +1 -1
- package/dist/server/app_backend.d.ts +3 -3
- package/dist/server/app_backend.d.ts.map +1 -1
- package/dist/server/app_backend.js +3 -3
- package/dist/server/app_server.d.ts +6 -6
- package/dist/server/app_server.d.ts.map +1 -1
- package/dist/server/app_server.js +32 -32
- package/dist/server/app_server_context.d.ts.map +1 -1
- package/dist/server/env.d.ts.map +1 -1
- package/dist/server/env.js +9 -9
- package/dist/server/fact_write.d.ts +1 -1
- package/dist/server/fact_write.d.ts.map +1 -1
- package/dist/server/fact_write.js +2 -1
- package/dist/server/file_fact_fetcher.d.ts.map +1 -1
- package/dist/server/file_fact_fetcher.js +1 -1
- package/dist/server/serve_fact_route.d.ts.map +1 -1
- package/dist/server/serve_fact_route.js +15 -13
- package/dist/server/startup.d.ts.map +1 -1
- package/dist/server/static.d.ts.map +1 -1
- package/dist/server/validate_nginx.js +1 -1
- package/dist/server/x_accel.d.ts.map +1 -1
- package/dist/server/x_accel.js +1 -1
- package/dist/testing/CLAUDE.md +2 -2
- package/dist/testing/admin_integration.d.ts.map +1 -1
- package/dist/testing/admin_integration.js +62 -62
- package/dist/testing/adversarial_404.d.ts.map +1 -1
- package/dist/testing/adversarial_404.js +1 -1
- package/dist/testing/adversarial_headers.d.ts.map +1 -1
- package/dist/testing/adversarial_headers.js +15 -15
- package/dist/testing/adversarial_input.d.ts.map +1 -1
- package/dist/testing/adversarial_input.js +22 -22
- package/dist/testing/app_server.d.ts.map +1 -1
- package/dist/testing/app_server.js +32 -32
- package/dist/testing/assertions.d.ts.map +1 -1
- package/dist/testing/attack_surface.d.ts.map +1 -1
- package/dist/testing/attack_surface.js +12 -12
- package/dist/testing/audit_completeness.d.ts.map +1 -1
- package/dist/testing/audit_completeness.js +41 -41
- package/dist/testing/audit_drift_guard.d.ts +3 -1
- package/dist/testing/audit_drift_guard.d.ts.map +1 -1
- package/dist/testing/audit_drift_guard.js +12 -6
- package/dist/testing/auth_apps.d.ts.map +1 -1
- package/dist/testing/auth_apps.js +4 -4
- package/dist/testing/bootstrap_success.d.ts.map +1 -1
- package/dist/testing/bootstrap_success.js +11 -11
- package/dist/testing/connection_closer_helpers.d.ts.map +1 -1
- package/dist/testing/connection_closer_helpers.js +1 -1
- package/dist/testing/cross_backend/account_lifecycle.d.ts.map +1 -1
- package/dist/testing/cross_backend/account_lifecycle.js +1 -1
- package/dist/testing/cross_backend/action_manifest.d.ts.map +1 -1
- package/dist/testing/cross_backend/action_manifest.js +4 -4
- package/dist/testing/cross_backend/action_manifest_parity.d.ts.map +1 -1
- package/dist/testing/cross_backend/actor_lookup.d.ts.map +1 -1
- package/dist/testing/cross_backend/actor_lookup.js +3 -3
- package/dist/testing/cross_backend/actor_search.d.ts.map +1 -1
- package/dist/testing/cross_backend/actor_search.js +5 -5
- package/dist/testing/cross_backend/app_settings.d.ts.map +1 -1
- package/dist/testing/cross_backend/app_settings.js +6 -6
- package/dist/testing/cross_backend/backend_config.d.ts.map +1 -1
- package/dist/testing/cross_backend/bench/bench_report.d.ts.map +1 -1
- package/dist/testing/cross_backend/bench/bench_report.js +5 -5
- package/dist/testing/cross_backend/bench/run_cross_impl_bench.d.ts.map +1 -1
- package/dist/testing/cross_backend/bench/run_cross_impl_bench.js +2 -2
- package/dist/testing/cross_backend/bench/scenario.d.ts.map +1 -1
- package/dist/testing/cross_backend/bench/scenario.js +1 -1
- package/dist/testing/cross_backend/body_size.d.ts.map +1 -1
- package/dist/testing/cross_backend/body_size.js +1 -1
- package/dist/testing/cross_backend/bootstrap_backend.d.ts.map +1 -1
- package/dist/testing/cross_backend/bootstrap_backend.js +2 -2
- package/dist/testing/cross_backend/build_test_backend_paths.js +1 -1
- package/dist/testing/cross_backend/capabilities.js +2 -2
- package/dist/testing/cross_backend/cell_cross_helpers.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_crud.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_crud.js +5 -2
- package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_gated_create.js +8 -7
- package/dist/testing/cross_backend/cell_grant_role.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_grant_role.js +2 -2
- package/dist/testing/cross_backend/cell_relations.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_relations.js +13 -13
- package/dist/testing/cross_backend/conformance_case.d.ts.map +1 -1
- package/dist/testing/cross_backend/conformance_case.js +11 -11
- package/dist/testing/cross_backend/conformance_table.d.ts.map +1 -1
- package/dist/testing/cross_backend/conformance_table.js +11 -11
- package/dist/testing/cross_backend/cookie_attributes.d.ts.map +1 -1
- package/dist/testing/cross_backend/cookie_attributes.js +4 -4
- package/dist/testing/cross_backend/create_cross_backend_global_setup.d.ts +1 -1
- package/dist/testing/cross_backend/create_cross_backend_global_setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/create_cross_backend_global_setup.js +1 -1
- package/dist/testing/cross_backend/create_dual_spawn_global_setup.d.ts +1 -1
- package/dist/testing/cross_backend/create_dual_spawn_global_setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/create_dual_spawn_global_setup.js +1 -1
- package/dist/testing/cross_backend/credential_header_robustness.js +1 -1
- package/dist/testing/cross_backend/default_backend_configs.d.ts.map +1 -1
- package/dist/testing/cross_backend/default_backend_configs.js +12 -12
- package/dist/testing/cross_backend/default_spine_surface.d.ts.map +1 -1
- package/dist/testing/cross_backend/default_spine_surface.js +9 -9
- package/dist/testing/cross_backend/fact_serving.d.ts.map +1 -1
- package/dist/testing/cross_backend/fact_serving.js +2 -2
- package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -1
- package/dist/testing/cross_backend/full_spine_mount.js +4 -4
- package/dist/testing/cross_backend/identity_parity.d.ts.map +1 -1
- package/dist/testing/cross_backend/identity_parity.js +28 -24
- package/dist/testing/cross_backend/in_process_setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/in_process_setup.js +9 -9
- package/dist/testing/cross_backend/login_security.d.ts.map +1 -1
- package/dist/testing/cross_backend/login_security.js +2 -2
- package/dist/testing/cross_backend/make_cross_backend_project.d.ts +1 -1
- package/dist/testing/cross_backend/make_cross_backend_project.d.ts.map +1 -1
- package/dist/testing/cross_backend/make_cross_backend_project.js +3 -3
- package/dist/testing/cross_backend/method_coverage.d.ts.map +1 -1
- package/dist/testing/cross_backend/origin.d.ts.map +1 -1
- package/dist/testing/cross_backend/origin.js +4 -4
- package/dist/testing/cross_backend/peer_ping_ws.d.ts.map +1 -1
- package/dist/testing/cross_backend/peer_ping_ws.js +6 -6
- package/dist/testing/cross_backend/ready.d.ts.map +1 -1
- package/dist/testing/cross_backend/role_grant_offer_enumeration.d.ts.map +1 -1
- package/dist/testing/cross_backend/role_grant_offer_enumeration.js +1 -1
- package/dist/testing/cross_backend/role_grant_offer_notification_ws.d.ts.map +1 -1
- package/dist/testing/cross_backend/role_grant_offer_notification_ws.js +1 -1
- package/dist/testing/cross_backend/role_grant_participation.d.ts.map +1 -1
- package/dist/testing/cross_backend/rust_spine_stub_backend_config.d.ts.map +1 -1
- package/dist/testing/cross_backend/rust_spine_stub_backend_config.js +5 -5
- package/dist/testing/cross_backend/setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/setup.js +36 -36
- package/dist/testing/cross_backend/spawn_backend.d.ts.map +1 -1
- package/dist/testing/cross_backend/spawn_backend.js +1 -1
- package/dist/testing/cross_backend/sse_round_trip.d.ts.map +1 -1
- package/dist/testing/cross_backend/sse_round_trip.js +10 -7
- package/dist/testing/cross_backend/standard.d.ts.map +1 -1
- package/dist/testing/cross_backend/standard.js +5 -5
- package/dist/testing/cross_backend/testing_backdoor.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_backdoor.js +7 -7
- package/dist/testing/cross_backend/testing_reset_actions.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_reset_actions.js +24 -23
- package/dist/testing/cross_backend/testing_server_bun.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_server_bun.js +3 -3
- package/dist/testing/cross_backend/testing_server_core.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_server_core.js +1 -1
- package/dist/testing/cross_backend/testing_server_deno.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_server_deno.js +1 -1
- package/dist/testing/cross_backend/testing_server_node.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_server_node.js +3 -3
- package/dist/testing/cross_backend/ts_spine_backend_config.d.ts.map +1 -1
- package/dist/testing/cross_backend/ts_spine_backend_config.js +13 -13
- package/dist/testing/cross_backend/ws_round_trip.d.ts.map +1 -1
- package/dist/testing/cross_backend/ws_round_trip.js +2 -2
- package/dist/testing/data_exposure.d.ts.map +1 -1
- package/dist/testing/data_exposure.js +8 -8
- package/dist/testing/db.d.ts.map +1 -1
- package/dist/testing/db.js +3 -3
- package/dist/testing/db_entities.d.ts.map +1 -1
- package/dist/testing/db_entities.js +1 -1
- package/dist/testing/entities.d.ts.map +1 -1
- package/dist/testing/entities.js +5 -5
- package/dist/testing/error_coverage.d.ts.map +1 -1
- package/dist/testing/integration.d.ts.map +1 -1
- package/dist/testing/integration.js +106 -106
- package/dist/testing/integration_helpers.d.ts.map +1 -1
- package/dist/testing/integration_helpers.js +3 -3
- package/dist/testing/middleware.d.ts.map +1 -1
- package/dist/testing/middleware.js +11 -11
- package/dist/testing/mock_fs.js +1 -1
- package/dist/testing/rate_limiting.d.ts.map +1 -1
- package/dist/testing/rate_limiting.js +23 -23
- package/dist/testing/role_grant_helpers.d.ts.map +1 -1
- package/dist/testing/role_grant_helpers.js +3 -3
- package/dist/testing/round_trip.d.ts.map +1 -1
- package/dist/testing/round_trip.js +6 -6
- package/dist/testing/rpc_attack_surface.d.ts.map +1 -1
- package/dist/testing/rpc_attack_surface.js +12 -12
- package/dist/testing/rpc_helpers.d.ts.map +1 -1
- package/dist/testing/rpc_helpers.js +11 -11
- package/dist/testing/rpc_round_trip.d.ts.map +1 -1
- package/dist/testing/rpc_round_trip.js +3 -3
- package/dist/testing/schema_generators.d.ts.map +1 -1
- package/dist/testing/schema_generators.js +3 -3
- package/dist/testing/schema_introspect.d.ts.map +1 -1
- package/dist/testing/schema_introspect.js +12 -12
- package/dist/testing/schema_parity.d.ts.map +1 -1
- package/dist/testing/schema_parity.js +7 -7
- package/dist/testing/schema_ready_fixture.d.ts.map +1 -1
- package/dist/testing/sse_round_trip.d.ts.map +1 -1
- package/dist/testing/sse_round_trip.js +8 -8
- package/dist/testing/standard.d.ts.map +1 -1
- package/dist/testing/standard.js +8 -8
- package/dist/testing/stubs.d.ts +6 -6
- package/dist/testing/stubs.d.ts.map +1 -1
- package/dist/testing/stubs.js +26 -23
- package/dist/testing/surface_invariants.d.ts.map +1 -1
- package/dist/testing/surface_invariants.js +5 -5
- package/dist/testing/testing_rate_limiter.d.ts.map +1 -1
- package/dist/testing/transports/bootstrap.d.ts.map +1 -1
- package/dist/testing/transports/bootstrap.js +4 -4
- package/dist/testing/transports/fetch_transport.d.ts.map +1 -1
- package/dist/testing/transports/sse_frame_reader.d.ts.map +1 -1
- package/dist/testing/transports/sse_transport.js +1 -1
- package/dist/testing/transports/ws_client.d.ts.map +1 -1
- package/dist/testing/transports/ws_client.js +1 -1
- package/dist/testing/transports/ws_transport.js +4 -4
- package/dist/testing/ws_round_trip.d.ts.map +1 -1
- package/dist/testing/ws_round_trip.js +21 -21
- package/dist/ui/AccountSessions.svelte +11 -11
- package/dist/ui/AdminAccounts.svelte +10 -10
- package/dist/ui/AdminAuditLog.svelte +14 -14
- package/dist/ui/AdminInvites.svelte +13 -13
- package/dist/ui/AdminOverview.svelte +22 -22
- package/dist/ui/AdminRoleGrantHistory.svelte +11 -11
- package/dist/ui/AdminSessions.svelte +12 -12
- package/dist/ui/AdminSettings.svelte +1 -1
- package/dist/ui/AdminSurface.svelte +3 -3
- package/dist/ui/AppShell.svelte +8 -8
- package/dist/ui/AppShell.svelte.d.ts.map +1 -1
- package/dist/ui/BootstrapForm.svelte +9 -9
- package/dist/ui/CLAUDE.md +1 -1
- package/dist/ui/ColumnLayout.svelte +2 -2
- package/dist/ui/ColumnLayout.svelte.d.ts.map +1 -1
- package/dist/ui/ConfirmButton.svelte +8 -8
- package/dist/ui/ConfirmButton.svelte.d.ts.map +1 -1
- package/dist/ui/Datatable.svelte +6 -6
- package/dist/ui/Datatable.svelte.d.ts.map +1 -1
- package/dist/ui/LoginForm.svelte +6 -6
- package/dist/ui/LogoutButton.svelte +2 -2
- package/dist/ui/LogoutButton.svelte.d.ts.map +1 -1
- package/dist/ui/MenuLink.svelte +5 -5
- package/dist/ui/MenuLink.svelte.d.ts.map +1 -1
- package/dist/ui/OpenSignupToggle.svelte +2 -2
- package/dist/ui/PopoverButton.svelte +10 -10
- package/dist/ui/PopoverButton.svelte.d.ts.map +1 -1
- package/dist/ui/RoleGrantOfferForm.svelte +8 -11
- package/dist/ui/RoleGrantOfferForm.svelte.d.ts.map +1 -1
- package/dist/ui/RoleGrantOfferHistory.svelte +11 -11
- package/dist/ui/RoleGrantOfferHistory.svelte.d.ts.map +1 -1
- package/dist/ui/RoleGrantOfferInbox.svelte +6 -6
- package/dist/ui/RoleGrantOfferInbox.svelte.d.ts.map +1 -1
- package/dist/ui/SignupForm.svelte +9 -9
- package/dist/ui/SurfaceExplorer.svelte +11 -11
- package/dist/ui/SurfaceExplorer.svelte.d.ts.map +1 -1
- package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -1
- package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -1
- package/dist/ui/admin_accounts_state.svelte.js +2 -2
- package/dist/ui/admin_invites_state.svelte.d.ts.map +1 -1
- package/dist/ui/admin_rpc_adapters.d.ts.map +1 -1
- package/dist/ui/admin_rpc_adapters.js +5 -5
- package/dist/ui/admin_sessions_state.svelte.d.ts.map +1 -1
- package/dist/ui/app_settings_state.svelte.d.ts.map +1 -1
- package/dist/ui/async_slot.svelte.d.ts.map +1 -1
- package/dist/ui/audit_log_state.svelte.d.ts.map +1 -1
- package/dist/ui/audit_log_state.svelte.js +1 -1
- package/dist/ui/auth_state.svelte.js +4 -4
- package/dist/ui/form_state.svelte.d.ts.map +1 -1
- package/dist/ui/format_scope.d.ts.map +1 -1
- package/dist/ui/keyed_async_slot.svelte.d.ts.map +1 -1
- package/dist/ui/popover.svelte.d.ts.map +1 -1
- package/dist/ui/popover.svelte.js +1 -1
- package/dist/ui/position_helpers.js +1 -1
- package/dist/ui/role_grant_offers_state.svelte.d.ts.map +1 -1
- package/dist/ui/role_grant_offers_state.svelte.js +1 -1
- package/dist/ui/table_state.svelte.d.ts.map +1 -1
- package/dist/ui/ui_fetch.d.ts.map +1 -1
- package/dist/ui/ui_format.js +2 -2
- package/package.json +13 -12
|
@@ -30,27 +30,27 @@
|
|
|
30
30
|
*/
|
|
31
31
|
import { rpc_action } from '../actions/action_rpc.js';
|
|
32
32
|
import { jsonrpc_errors } from '../http/jsonrpc_errors.js';
|
|
33
|
-
import { builtin_role_specs_by_name, list_roles_with_grant_path, ROLE_ADMIN, ROLE_KEEPER
|
|
33
|
+
import { builtin_role_specs_by_name, list_roles_with_grant_path, ROLE_ADMIN, ROLE_KEEPER } from './role_schema.js';
|
|
34
34
|
import { has_role } from './request_context.js';
|
|
35
|
-
import { query_account_has_global_role, query_account_has_active_global_role, query_count_active_accounts_with_global_role
|
|
35
|
+
import { query_account_has_global_role, query_account_has_active_global_role, query_count_active_accounts_with_global_role } from './role_grant_queries.js';
|
|
36
36
|
import { GRANT_PATH_ADMIN } from './grant_path_schema.js';
|
|
37
|
-
import { query_account_by_email, query_account_by_id, query_account_by_username, query_account_soft_delete, query_account_undelete, query_actor_soft_delete, query_actor_undelete, query_actors_by_account, query_admin_account_list, query_purge_account
|
|
38
|
-
import { query_session_list_all_active, query_session_revoke_all_for_account
|
|
37
|
+
import { query_account_by_email, query_account_by_id, query_account_by_username, query_account_soft_delete, query_account_undelete, query_actor_soft_delete, query_actor_undelete, query_actors_by_account, query_admin_account_list, query_purge_account } from './account_queries.js';
|
|
38
|
+
import { query_session_list_all_active, query_session_revoke_all_for_account } from './session_queries.js';
|
|
39
39
|
import { query_revoke_all_api_tokens_for_account } from './api_token_queries.js';
|
|
40
|
-
import { query_audit_log_list_role_grant_history, query_audit_log_list_with_usernames
|
|
40
|
+
import { query_audit_log_list_role_grant_history, query_audit_log_list_with_usernames } from './audit_log_queries.js';
|
|
41
41
|
import { AUDIT_LOG_DEFAULT_LIMIT } from './audit_log_schema.js';
|
|
42
|
-
import { query_create_invite, query_invite_delete_unclaimed, query_invite_list_all_with_usernames
|
|
43
|
-
import { query_app_settings_load, query_app_settings_load_with_username, query_app_settings_update
|
|
42
|
+
import { query_create_invite, query_invite_delete_unclaimed, query_invite_list_all_with_usernames } from './invite_queries.js';
|
|
43
|
+
import { query_app_settings_load, query_app_settings_load_with_username, query_app_settings_update } from './app_settings_queries.js';
|
|
44
44
|
import { is_pg_unique_violation } from '../db/pg_error.js';
|
|
45
|
-
import { ERROR_ACCOUNT_NOT_FOUND, ERROR_INSUFFICIENT_PERMISSIONS, ERROR_INVITE_ACCOUNT_EXISTS_EMAIL, ERROR_INVITE_ACCOUNT_EXISTS_USERNAME, ERROR_INVITE_DUPLICATE, ERROR_INVITE_NOT_FOUND
|
|
46
|
-
import { admin_account_list_action_spec, admin_session_list_action_spec, admin_session_revoke_all_action_spec, admin_token_revoke_all_action_spec, audit_log_list_action_spec, audit_log_role_grant_history_action_spec, invite_create_action_spec, invite_list_action_spec, invite_delete_action_spec, account_delete_action_spec, account_purge_action_spec, account_undelete_action_spec, app_settings_get_action_spec, app_settings_update_action_spec, ERROR_PURGE_NOT_CONFIRMED, ERROR_CANNOT_DELETE_KEEPER, ERROR_CANNOT_DELETE_LAST_ADMIN
|
|
45
|
+
import { ERROR_ACCOUNT_NOT_FOUND, ERROR_INSUFFICIENT_PERMISSIONS, ERROR_INVITE_ACCOUNT_EXISTS_EMAIL, ERROR_INVITE_ACCOUNT_EXISTS_USERNAME, ERROR_INVITE_DUPLICATE, ERROR_INVITE_NOT_FOUND } from '../http/error_schemas.js';
|
|
46
|
+
import { admin_account_list_action_spec, admin_session_list_action_spec, admin_session_revoke_all_action_spec, admin_token_revoke_all_action_spec, audit_log_list_action_spec, audit_log_role_grant_history_action_spec, invite_create_action_spec, invite_list_action_spec, invite_delete_action_spec, account_delete_action_spec, account_purge_action_spec, account_undelete_action_spec, app_settings_get_action_spec, app_settings_update_action_spec, ERROR_PURGE_NOT_CONFIRMED, ERROR_CANNOT_DELETE_KEEPER, ERROR_CANNOT_DELETE_LAST_ADMIN } from './admin_action_specs.js';
|
|
47
47
|
/**
|
|
48
48
|
* Create the admin-only RPC actions.
|
|
49
49
|
*
|
|
50
|
-
* @param deps - `
|
|
50
|
+
* @param deps - `ActionFactoryDeps` (`log`, `audit`). `log` drives RPC-
|
|
51
51
|
* internal error logging; `audit.emit` writes audit rows via the captured
|
|
52
|
-
* pool. The bound emitter encapsulates
|
|
53
|
-
*
|
|
52
|
+
* pool. The bound emitter encapsulates listener fan-out and the optional
|
|
53
|
+
* `AuditLogConfig`.
|
|
54
54
|
* @param options - role schema for `grantable_roles` derivation
|
|
55
55
|
* @returns the `RpcAction` array to spread into a `create_rpc_endpoint` call
|
|
56
56
|
*/
|
|
@@ -62,7 +62,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
62
62
|
const accounts = await query_admin_account_list(ctx, {
|
|
63
63
|
limit: input.limit,
|
|
64
64
|
offset: input.offset,
|
|
65
|
-
include_deleted: input.include_deleted
|
|
65
|
+
include_deleted: input.include_deleted
|
|
66
66
|
});
|
|
67
67
|
return { accounts, grantable_roles };
|
|
68
68
|
};
|
|
@@ -85,17 +85,18 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
85
85
|
ip: ctx.client_ip,
|
|
86
86
|
metadata: {
|
|
87
87
|
reason: ERROR_ACCOUNT_NOT_FOUND,
|
|
88
|
-
attempted_account_id: input.account_id
|
|
89
|
-
}
|
|
88
|
+
attempted_account_id: input.account_id
|
|
89
|
+
}
|
|
90
90
|
});
|
|
91
91
|
throw jsonrpc_errors.not_found('account', { reason: ERROR_ACCOUNT_NOT_FOUND });
|
|
92
92
|
}
|
|
93
93
|
const count = await query_session_revoke_all_for_account(ctx, input.account_id);
|
|
94
94
|
// Handler-side belt+suspenders — close the target account's live WS
|
|
95
95
|
// sockets BEFORE the audit emit so revocation lands even if the audit
|
|
96
|
-
// INSERT fails. Listener-based close (`transports_ws_auth_guard`
|
|
97
|
-
// `audit.
|
|
98
|
-
// sites. Idempotent — see
|
|
96
|
+
// INSERT fails. Listener-based close (`transports_ws_auth_guard`
|
|
97
|
+
// registered via `audit.add_listener`) stays as a fail-safe for
|
|
98
|
+
// out-of-band emit sites. Idempotent — see
|
|
99
|
+
// `account_actions.ts::session_revoke_handler`.
|
|
99
100
|
if (connection_closer) {
|
|
100
101
|
connection_closer.close_sockets_for_account(input.account_id);
|
|
101
102
|
}
|
|
@@ -113,7 +114,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
113
114
|
account_id: auth.account.id,
|
|
114
115
|
target_account_id: input.account_id,
|
|
115
116
|
ip: ctx.client_ip,
|
|
116
|
-
metadata: { count }
|
|
117
|
+
metadata: { count }
|
|
117
118
|
});
|
|
118
119
|
return { ok: true, count };
|
|
119
120
|
};
|
|
@@ -131,8 +132,8 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
131
132
|
ip: ctx.client_ip,
|
|
132
133
|
metadata: {
|
|
133
134
|
reason: ERROR_ACCOUNT_NOT_FOUND,
|
|
134
|
-
attempted_account_id: input.account_id
|
|
135
|
-
}
|
|
135
|
+
attempted_account_id: input.account_id
|
|
136
|
+
}
|
|
136
137
|
});
|
|
137
138
|
throw jsonrpc_errors.not_found('account', { reason: ERROR_ACCOUNT_NOT_FOUND });
|
|
138
139
|
}
|
|
@@ -149,7 +150,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
149
150
|
account_id: auth.account.id,
|
|
150
151
|
target_account_id: input.account_id,
|
|
151
152
|
ip: ctx.client_ip,
|
|
152
|
-
metadata: { count }
|
|
153
|
+
metadata: { count }
|
|
153
154
|
});
|
|
154
155
|
return { ok: true, count };
|
|
155
156
|
};
|
|
@@ -160,7 +161,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
160
161
|
account_id: input.account_id ?? undefined,
|
|
161
162
|
limit: input.limit ?? AUDIT_LOG_DEFAULT_LIMIT,
|
|
162
163
|
offset: input.offset ?? 0,
|
|
163
|
-
since_seq: input.since_seq ?? undefined
|
|
164
|
+
since_seq: input.since_seq ?? undefined
|
|
164
165
|
});
|
|
165
166
|
return { events };
|
|
166
167
|
};
|
|
@@ -176,7 +177,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
176
177
|
const existing = await query_account_by_username(ctx, username);
|
|
177
178
|
if (existing) {
|
|
178
179
|
throw jsonrpc_errors.conflict('an account already exists with that username', {
|
|
179
|
-
reason: ERROR_INVITE_ACCOUNT_EXISTS_USERNAME
|
|
180
|
+
reason: ERROR_INVITE_ACCOUNT_EXISTS_USERNAME
|
|
180
181
|
});
|
|
181
182
|
}
|
|
182
183
|
}
|
|
@@ -184,7 +185,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
184
185
|
const existing = await query_account_by_email(ctx, email);
|
|
185
186
|
if (existing) {
|
|
186
187
|
throw jsonrpc_errors.conflict('an account already exists with that email', {
|
|
187
|
-
reason: ERROR_INVITE_ACCOUNT_EXISTS_EMAIL
|
|
188
|
+
reason: ERROR_INVITE_ACCOUNT_EXISTS_EMAIL
|
|
188
189
|
});
|
|
189
190
|
}
|
|
190
191
|
}
|
|
@@ -193,13 +194,13 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
193
194
|
invite = await query_create_invite(ctx, {
|
|
194
195
|
email,
|
|
195
196
|
username,
|
|
196
|
-
created_by: auth.actor.id
|
|
197
|
+
created_by: auth.actor.id
|
|
197
198
|
});
|
|
198
199
|
}
|
|
199
200
|
catch (err) {
|
|
200
201
|
if (is_pg_unique_violation(err)) {
|
|
201
202
|
throw jsonrpc_errors.conflict('an unclaimed invite already exists', {
|
|
202
|
-
reason: ERROR_INVITE_DUPLICATE
|
|
203
|
+
reason: ERROR_INVITE_DUPLICATE
|
|
203
204
|
});
|
|
204
205
|
}
|
|
205
206
|
throw err;
|
|
@@ -208,7 +209,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
208
209
|
event_type: 'invite_create',
|
|
209
210
|
account_id: auth.account.id,
|
|
210
211
|
ip: ctx.client_ip,
|
|
211
|
-
metadata: { invite_id: invite.id, email, username }
|
|
212
|
+
metadata: { invite_id: invite.id, email, username }
|
|
212
213
|
});
|
|
213
214
|
return { ok: true, invite };
|
|
214
215
|
};
|
|
@@ -226,7 +227,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
226
227
|
event_type: 'invite_delete',
|
|
227
228
|
account_id: auth.account.id,
|
|
228
229
|
ip: ctx.client_ip,
|
|
229
|
-
metadata: { invite_id: input.invite_id }
|
|
230
|
+
metadata: { invite_id: input.invite_id }
|
|
230
231
|
});
|
|
231
232
|
return { ok: true };
|
|
232
233
|
};
|
|
@@ -255,7 +256,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
255
256
|
account_id: auth.account.id,
|
|
256
257
|
target_account_id,
|
|
257
258
|
ip: ctx.client_ip,
|
|
258
|
-
metadata: { reason }
|
|
259
|
+
metadata: { reason }
|
|
259
260
|
});
|
|
260
261
|
throw jsonrpc_errors.forbidden(message, { reason });
|
|
261
262
|
};
|
|
@@ -284,7 +285,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
284
285
|
// Self-or-admin elevation: deleting someone else needs admin.
|
|
285
286
|
if (target_account_id !== auth.account.id && !has_role(auth, ROLE_ADMIN)) {
|
|
286
287
|
throw jsonrpc_errors.forbidden('cannot delete another account', {
|
|
287
|
-
reason: ERROR_INSUFFICIENT_PERMISSIONS
|
|
288
|
+
reason: ERROR_INSUFFICIENT_PERMISSIONS
|
|
288
289
|
});
|
|
289
290
|
}
|
|
290
291
|
// Keeper + last-admin guards (fail-loud, before the tombstone).
|
|
@@ -300,7 +301,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
300
301
|
actor_id: auth.actor.id,
|
|
301
302
|
account_id: auth.account.id,
|
|
302
303
|
ip: ctx.client_ip,
|
|
303
|
-
metadata: { reason: ERROR_ACCOUNT_NOT_FOUND, attempted_account_id: target_account_id }
|
|
304
|
+
metadata: { reason: ERROR_ACCOUNT_NOT_FOUND, attempted_account_id: target_account_id }
|
|
304
305
|
});
|
|
305
306
|
throw jsonrpc_errors.not_found('account', { reason: ERROR_ACCOUNT_NOT_FOUND });
|
|
306
307
|
}
|
|
@@ -320,7 +321,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
320
321
|
account_id: auth.account.id,
|
|
321
322
|
target_account_id,
|
|
322
323
|
ip: ctx.client_ip,
|
|
323
|
-
metadata: { username: snapshot.username, email: snapshot.email }
|
|
324
|
+
metadata: { username: snapshot.username, email: snapshot.email }
|
|
324
325
|
});
|
|
325
326
|
for (const actor of soft_deleted_actors) {
|
|
326
327
|
deps.audit.emit(ctx, {
|
|
@@ -330,7 +331,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
330
331
|
target_account_id,
|
|
331
332
|
target_actor_id: actor.id,
|
|
332
333
|
ip: ctx.client_ip,
|
|
333
|
-
metadata: { name: actor.name }
|
|
334
|
+
metadata: { name: actor.name }
|
|
334
335
|
});
|
|
335
336
|
}
|
|
336
337
|
return { ok: true, deleted: true };
|
|
@@ -345,7 +346,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
345
346
|
// Fail-loud: refuse the irreversible purge without explicit confirm.
|
|
346
347
|
if (input.confirm !== true) {
|
|
347
348
|
throw jsonrpc_errors.invalid_params('purge requires confirm: true', {
|
|
348
|
-
reason: ERROR_PURGE_NOT_CONFIRMED
|
|
349
|
+
reason: ERROR_PURGE_NOT_CONFIRMED
|
|
349
350
|
});
|
|
350
351
|
}
|
|
351
352
|
// Keeper + last-admin guards (fail-loud, before the cascade).
|
|
@@ -360,7 +361,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
360
361
|
actor_id: auth.actor.id,
|
|
361
362
|
account_id: auth.account.id,
|
|
362
363
|
ip: ctx.client_ip,
|
|
363
|
-
metadata: { reason: ERROR_ACCOUNT_NOT_FOUND, attempted_account_id: input.account_id }
|
|
364
|
+
metadata: { reason: ERROR_ACCOUNT_NOT_FOUND, attempted_account_id: input.account_id }
|
|
364
365
|
});
|
|
365
366
|
throw jsonrpc_errors.not_found('account', { reason: ERROR_ACCOUNT_NOT_FOUND });
|
|
366
367
|
}
|
|
@@ -373,7 +374,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
373
374
|
account_id: auth.account.id,
|
|
374
375
|
target_account_id: input.account_id,
|
|
375
376
|
ip: ctx.client_ip,
|
|
376
|
-
metadata: { username: snapshot.username, email: snapshot.email }
|
|
377
|
+
metadata: { username: snapshot.username, email: snapshot.email }
|
|
377
378
|
});
|
|
378
379
|
for (const actor of actors) {
|
|
379
380
|
deps.audit.emit(ctx, {
|
|
@@ -383,7 +384,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
383
384
|
target_account_id: input.account_id,
|
|
384
385
|
target_actor_id: actor.id,
|
|
385
386
|
ip: ctx.client_ip,
|
|
386
|
-
metadata: { name: actor.name }
|
|
387
|
+
metadata: { name: actor.name }
|
|
387
388
|
});
|
|
388
389
|
}
|
|
389
390
|
return { ok: true, purged: true };
|
|
@@ -407,7 +408,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
407
408
|
actor_id: auth.actor.id,
|
|
408
409
|
account_id: auth.account.id,
|
|
409
410
|
ip: ctx.client_ip,
|
|
410
|
-
metadata: { reason: ERROR_ACCOUNT_NOT_FOUND, attempted_account_id: input.account_id }
|
|
411
|
+
metadata: { reason: ERROR_ACCOUNT_NOT_FOUND, attempted_account_id: input.account_id }
|
|
411
412
|
});
|
|
412
413
|
throw jsonrpc_errors.not_found('account', { reason: ERROR_ACCOUNT_NOT_FOUND });
|
|
413
414
|
}
|
|
@@ -423,7 +424,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
423
424
|
account_id: auth.account.id,
|
|
424
425
|
target_account_id: input.account_id,
|
|
425
426
|
ip: ctx.client_ip,
|
|
426
|
-
metadata: { username: snapshot.username, email: snapshot.email }
|
|
427
|
+
metadata: { username: snapshot.username, email: snapshot.email }
|
|
427
428
|
});
|
|
428
429
|
for (const actor of undeleted_actors) {
|
|
429
430
|
deps.audit.emit(ctx, {
|
|
@@ -433,7 +434,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
433
434
|
target_account_id: input.account_id,
|
|
434
435
|
target_actor_id: actor.id,
|
|
435
436
|
ip: ctx.client_ip,
|
|
436
|
-
metadata: { name: actor.name }
|
|
437
|
+
metadata: { name: actor.name }
|
|
437
438
|
});
|
|
438
439
|
}
|
|
439
440
|
return { ok: true, undeleted: true };
|
|
@@ -450,7 +451,7 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
450
451
|
rpc_action(audit_log_role_grant_history_action_spec, audit_log_role_grant_history_handler),
|
|
451
452
|
rpc_action(invite_create_action_spec, invite_create_handler),
|
|
452
453
|
rpc_action(invite_list_action_spec, invite_list_handler),
|
|
453
|
-
rpc_action(invite_delete_action_spec, invite_delete_handler)
|
|
454
|
+
rpc_action(invite_delete_action_spec, invite_delete_handler)
|
|
454
455
|
];
|
|
455
456
|
const app_settings_get_handler = async (_input, ctx) => {
|
|
456
457
|
const settings = await query_app_settings_load_with_username(ctx);
|
|
@@ -468,8 +469,8 @@ export const create_admin_actions = (deps, options = {}) => {
|
|
|
468
469
|
metadata: {
|
|
469
470
|
setting: 'open_signup',
|
|
470
471
|
old_value,
|
|
471
|
-
new_value: input.open_signup
|
|
472
|
-
}
|
|
472
|
+
new_value: input.open_signup
|
|
473
|
+
}
|
|
473
474
|
});
|
|
474
475
|
const settings = await query_app_settings_load_with_username(ctx);
|
|
475
476
|
return { ok: true, settings };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"all_action_spec_registries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/all_action_spec_registries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"all_action_spec_registries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/all_action_spec_registries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAQ3E,qDAAqD;AACrD,MAAM,WAAW,yBAAyB;IACzC,iGAAiG;IACjG,IAAI,EAAE,MAAM,CAAC;IACb,6FAA6F;IAC7F,KAAK,EAAE,aAAa,CAAC,yBAAyB,CAAC,CAAC;CAChD;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mCAAmC,EAAE,aAAa,CAAC,yBAAyB,CAOxF,CAAC"}
|
|
@@ -55,5 +55,5 @@ export const all_fuz_auth_action_spec_registries = [
|
|
|
55
55
|
{ name: 'account', specs: all_account_action_specs },
|
|
56
56
|
{ name: 'self_service_role', specs: all_self_service_role_action_specs },
|
|
57
57
|
{ name: 'actor_lookup', specs: all_actor_lookup_action_specs },
|
|
58
|
-
{ name: 'actor_search', specs: all_actor_search_action_specs }
|
|
58
|
+
{ name: 'actor_search', specs: all_actor_search_action_specs }
|
|
59
59
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"all_cell_actions.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/all_cell_actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"all_cell_actions.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/all_cell_actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAK7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,uBAAuB,GACnC,MAAM,cAAc,EACpB,SAAS,qBAAqB,KAC5B,KAAK,CAAC,SAAS,CAMjB,CAAC"}
|
|
@@ -28,5 +28,5 @@ export const create_all_cell_actions = (deps, options) => [
|
|
|
28
28
|
...create_cell_grant_actions({ ...deps, roles: options.roles }),
|
|
29
29
|
...create_cell_field_actions(deps),
|
|
30
30
|
...create_cell_item_actions(deps),
|
|
31
|
-
...create_cell_audit_actions()
|
|
31
|
+
...create_cell_audit_actions()
|
|
32
32
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api_token.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/api_token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"api_token.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/api_token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AAEpD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,QAA4B,CAAC;AAE5D,8CAA8C;AAC9C,eAAO,MAAM,UAAU,aAAuC,CAAC;AAC/D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,KAAG,MAA4B,CAAC;AAE5E;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,QAAO;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAMpF,CAAC"}
|
|
@@ -73,8 +73,13 @@ export declare const query_api_token_list_for_account: (deps: QueryDeps, account
|
|
|
73
73
|
* Race safety: this function must run inside a transaction alongside the
|
|
74
74
|
* INSERT that created the new token. The caller (the `account_token_create`
|
|
75
75
|
* RPC handler) runs under the dispatcher's transaction path because the
|
|
76
|
-
* spec declares `side_effects: true`,
|
|
77
|
-
* pair
|
|
76
|
+
* spec declares `side_effects: true`, making one creator's INSERT +
|
|
77
|
+
* enforce_limit pair atomic. That does **not** serialize concurrent creators:
|
|
78
|
+
* under Read Committed, two transactions can't see each other's uncommitted
|
|
79
|
+
* token row, so each evicts against a stale count and both can commit above
|
|
80
|
+
* `max_tokens`. Closing this needs one serialization point per
|
|
81
|
+
* `(account_id, credential_kind)` before count/evict/insert — see the matching
|
|
82
|
+
* note on `query_session_enforce_limit`.
|
|
78
83
|
*
|
|
79
84
|
* @param deps - query dependencies (must be transaction-scoped)
|
|
80
85
|
* @param account_id - the account to enforce the limit for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api_token_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/api_token_queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"api_token_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/api_token_queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAGpD,yEAAyE;AACzE,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IACnD,GAAG,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,GAClC,MAAM,SAAS,EACf,IAAI,MAAM,EACV,YAAY,MAAM,EAClB,MAAM,MAAM,EACZ,YAAY,MAAM,EAClB,aAAa,IAAI,GAAG,IAAI,KACtB,OAAO,CAAC,QAAQ,CAQlB,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,wBAAwB,GACpC,MAAM,iBAAiB,EACvB,WAAW,MAAM,EACjB,IAAI,MAAM,GAAG,SAAS,EACtB,iBAAiB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,KAC/C,OAAO,CAAC,QAAQ,GAAG,SAAS,CAuB9B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uCAAuC,GACnD,MAAM,SAAS,EACf,YAAY,MAAM,KAChB,OAAO,CAAC,MAAM,CAMhB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kCAAkC,GAC9C,MAAM,SAAS,EACf,IAAI,MAAM,EACV,YAAY,MAAM,KAChB,OAAO,CAAC,OAAO,CAMjB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,GAC5C,MAAM,SAAS,EACf,YAAY,MAAM,KAChB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAM7C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,6BAA6B,GACzC,MAAM,SAAS,EACf,YAAY,MAAM,EAClB,YAAY,MAAM,KAChB,OAAO,CAAC,MAAM,CAYhB,CAAC"}
|
|
@@ -49,7 +49,7 @@ export const query_validate_api_token = async (deps, raw_token, ip, pending_effe
|
|
|
49
49
|
const p = deps.db
|
|
50
50
|
.query(`UPDATE api_token SET last_used_at = NOW(), last_used_ip = $1 WHERE id = $2`, [
|
|
51
51
|
ip ?? null,
|
|
52
|
-
row.id
|
|
52
|
+
row.id
|
|
53
53
|
])
|
|
54
54
|
.then(() => { })
|
|
55
55
|
.catch((err) => {
|
|
@@ -101,8 +101,13 @@ export const query_api_token_list_for_account = async (deps, account_id) => {
|
|
|
101
101
|
* Race safety: this function must run inside a transaction alongside the
|
|
102
102
|
* INSERT that created the new token. The caller (the `account_token_create`
|
|
103
103
|
* RPC handler) runs under the dispatcher's transaction path because the
|
|
104
|
-
* spec declares `side_effects: true`,
|
|
105
|
-
* pair
|
|
104
|
+
* spec declares `side_effects: true`, making one creator's INSERT +
|
|
105
|
+
* enforce_limit pair atomic. That does **not** serialize concurrent creators:
|
|
106
|
+
* under Read Committed, two transactions can't see each other's uncommitted
|
|
107
|
+
* token row, so each evicts against a stale count and both can commit above
|
|
108
|
+
* `max_tokens`. Closing this needs one serialization point per
|
|
109
|
+
* `(account_id, credential_kind)` before count/evict/insert — see the matching
|
|
110
|
+
* note on `query_session_enforce_limit`.
|
|
106
111
|
*
|
|
107
112
|
* @param deps - query dependencies (must be transaction-scoped)
|
|
108
113
|
* @param account_id - the account to enforce the limit for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app_settings_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/app_settings_queries.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"app_settings_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/app_settings_queries.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAEzF;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,GAAU,MAAM,SAAS,KAAG,OAAO,CAAC,WAAW,CAQlF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,qCAAqC,GACjD,MAAM,SAAS,KACb,OAAO,CAAC,2BAA2B,CAWrC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,GACrC,MAAM,SAAS,EACf,aAAa,OAAO,EACpB,UAAU,MAAM,KACd,OAAO,CAAC,WAAW,CASrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app_settings_schema.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/app_settings_schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"app_settings_schema.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/app_settings_schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,oDAAoD;AACpD,eAAO,MAAM,eAAe;;;;kBAI1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,wEAAwE;AACxE,eAAO,MAAM,2BAA2B;;;;;kBAEtC,CAAC;AACH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEtF,4CAA4C;AAC5C,eAAO,MAAM,sBAAsB;;kBAEjC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
|
|
@@ -11,13 +11,13 @@ import { Uuid } from '@fuzdev/fuz_util/id.ts';
|
|
|
11
11
|
export const AppSettingsJson = z.strictObject({
|
|
12
12
|
open_signup: z.boolean(),
|
|
13
13
|
updated_at: z.string().nullable(),
|
|
14
|
-
updated_by: Uuid.nullable()
|
|
14
|
+
updated_by: Uuid.nullable()
|
|
15
15
|
});
|
|
16
16
|
/** Zod schema for admin app settings with resolved updater username. */
|
|
17
17
|
export const AppSettingsWithUsernameJson = AppSettingsJson.extend({
|
|
18
|
-
updated_by_username: z.string().nullable()
|
|
18
|
+
updated_by_username: z.string().nullable()
|
|
19
19
|
});
|
|
20
20
|
/** Zod schema for updating app settings. */
|
|
21
21
|
export const UpdateAppSettingsInput = z.strictObject({
|
|
22
|
-
open_signup: z.boolean()
|
|
22
|
+
open_signup: z.boolean()
|
|
23
23
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Bound audit-emit capability.
|
|
3
3
|
*
|
|
4
|
-
* `AuditEmitter` closes over the pool-level `Db`,
|
|
5
|
-
*
|
|
4
|
+
* `AuditEmitter` closes over the pool-level `Db`, its registered
|
|
5
|
+
* listeners, and the optional `AuditLogConfig`. Built by the
|
|
6
6
|
* consumer's `audit_factory` callback on `CreateAppBackendOptions` —
|
|
7
7
|
* `create_app_backend` invokes the factory once with its constructed
|
|
8
8
|
* `{db, log}` and lands the result on `AppDeps.audit`. Consumers reach
|
|
@@ -26,16 +26,16 @@
|
|
|
26
26
|
* Same write-then-notify semantics as `emit`, just synchronous-with-await.
|
|
27
27
|
* - `notify(event)` — fan out an already-written audit row (e.g. rows
|
|
28
28
|
* returned by `query_accept_offer` that were inserted in-transaction by
|
|
29
|
-
* the query layer). Runs every listener
|
|
29
|
+
* the query layer). Runs every registered listener; per-listener throws
|
|
30
30
|
* are isolated.
|
|
31
31
|
*
|
|
32
|
-
*
|
|
33
|
-
* additional listeners after the backend is
|
|
34
|
-
* audit-log SSE, per-endpoint WS auth guards and
|
|
35
|
-
* `extra_audit_handlers` on a `WsEndpointSpec`) before
|
|
36
|
-
* runs. Consumers can also
|
|
37
|
-
* they return from `audit_factory` for setups that don't pass
|
|
38
|
-
* `create_app_server`.
|
|
32
|
+
* Listeners are a documented registration seam — `create_app_server`
|
|
33
|
+
* registers additional listeners via `add_listener` after the backend is
|
|
34
|
+
* built (the factory-managed audit-log SSE, per-endpoint WS auth guards and
|
|
35
|
+
* logout closers, any `extra_audit_handlers` on a `WsEndpointSpec`) before
|
|
36
|
+
* the first request runs. Consumers can also register listeners directly on
|
|
37
|
+
* the emitter they return from `audit_factory` for setups that don't pass
|
|
38
|
+
* through `create_app_server`.
|
|
39
39
|
*
|
|
40
40
|
* @module
|
|
41
41
|
*/
|
|
@@ -124,7 +124,7 @@ export interface AuditEmitter {
|
|
|
124
124
|
*/
|
|
125
125
|
emit_pool<T extends string>(input: AuditLogInput<T>): Promise<void>;
|
|
126
126
|
/**
|
|
127
|
-
* Fan out an already-written audit row to the
|
|
127
|
+
* Fan out an already-written audit row to the registered listeners.
|
|
128
128
|
*
|
|
129
129
|
* Use only when the row was inserted in-transaction by a query helper
|
|
130
130
|
* that returned the `AuditLogEvent` (e.g. `query_accept_offer.audit_events`).
|
|
@@ -133,14 +133,22 @@ export interface AuditEmitter {
|
|
|
133
133
|
*/
|
|
134
134
|
notify(event: AuditLogEvent): void;
|
|
135
135
|
/**
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* `
|
|
141
|
-
*
|
|
136
|
+
* Register an audit-event listener. Append-only — listeners fire in
|
|
137
|
+
* registration order on every successful `emit` / `emit_pool` and on
|
|
138
|
+
* every `notify`.
|
|
139
|
+
*
|
|
140
|
+
* `create_app_server` registers the factory-managed audit-log SSE
|
|
141
|
+
* listener and per-endpoint WS auth guards / logout closers here so
|
|
142
|
+
* SSE + WS fan-out compose on top of the consumer's `on_audit_event`
|
|
143
|
+
* callback without shallow-copying `AppDeps`. Consumers can also
|
|
144
|
+
* register listeners directly for setups that don't run through
|
|
145
|
+
* `create_app_server`.
|
|
146
|
+
*
|
|
147
|
+
* Twin of the Rust `fuz_auth` `AuditEmitter::add_listener`.
|
|
142
148
|
*/
|
|
143
|
-
|
|
149
|
+
add_listener(listener: (event: AuditLogEvent) => void): void;
|
|
150
|
+
/** Count of registered listeners — introspection for tests and diagnostics. */
|
|
151
|
+
listener_count(): number;
|
|
144
152
|
}
|
|
145
153
|
/**
|
|
146
154
|
* Signature of `AuditEmitter.emit` — captured by the inner closure so
|
|
@@ -170,8 +178,8 @@ export interface CreateAuditEmitterOptions {
|
|
|
170
178
|
/** Logger for write + listener-callback failures. */
|
|
171
179
|
log: Logger;
|
|
172
180
|
/**
|
|
173
|
-
* Initial
|
|
174
|
-
* that compose listeners post-assembly (e.g. via `audit_log_sse`).
|
|
181
|
+
* Initial listener — registered as the first listener when set. Omit for
|
|
182
|
+
* backends that compose listeners post-assembly (e.g. via `audit_log_sse`).
|
|
175
183
|
*/
|
|
176
184
|
on_audit_event?: ((event: AuditLogEvent) => void) | null;
|
|
177
185
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit_emitter.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/audit_emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"audit_emitter.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/audit_emitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAEN,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,mBAAmB;IACnC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACrE,0FAA0F;IAC1F,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC5B;;;;;;;;;;;;;;;;OAgBG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAChF;;;;;;;OAOG;IACH,sBAAsB,CAAC,CAAC,SAAS,MAAM,EACtC,GAAG,EAAE,yBAAyB,EAC9B,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE;QACN,UAAU,EAAE,CAAC,CAAC;QACd,iBAAiB,EAAE,IAAI,GAAG,IAAI,CAAC;QAC/B,eAAe,EAAE,IAAI,GAAG,IAAI,CAAC;QAC7B,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;KAChC,GACC,IAAI,CAAC;IACR;;;;;;;;;;OAUG;IACH,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IACnC;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7D,+EAA+E;IAC/E,cAAc,IAAI,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,SAAS,MAAM,EAC1C,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KACnB,IAAI,CAAC;AAEV;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,WAAW,CAAC;AAEhE,0CAA0C;AAC1C,MAAM,WAAW,yBAAyB;IACzC,oDAAoD;IACpD,EAAE,EAAE,EAAE,CAAC;IACP,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACzD;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAClC;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS,yBAAyB,KAAG,YAuFzE,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Bound audit-emit capability.
|
|
3
3
|
*
|
|
4
|
-
* `AuditEmitter` closes over the pool-level `Db`,
|
|
5
|
-
*
|
|
4
|
+
* `AuditEmitter` closes over the pool-level `Db`, its registered
|
|
5
|
+
* listeners, and the optional `AuditLogConfig`. Built by the
|
|
6
6
|
* consumer's `audit_factory` callback on `CreateAppBackendOptions` —
|
|
7
7
|
* `create_app_backend` invokes the factory once with its constructed
|
|
8
8
|
* `{db, log}` and lands the result on `AppDeps.audit`. Consumers reach
|
|
@@ -26,21 +26,21 @@
|
|
|
26
26
|
* Same write-then-notify semantics as `emit`, just synchronous-with-await.
|
|
27
27
|
* - `notify(event)` — fan out an already-written audit row (e.g. rows
|
|
28
28
|
* returned by `query_accept_offer` that were inserted in-transaction by
|
|
29
|
-
* the query layer). Runs every listener
|
|
29
|
+
* the query layer). Runs every registered listener; per-listener throws
|
|
30
30
|
* are isolated.
|
|
31
31
|
*
|
|
32
|
-
*
|
|
33
|
-
* additional listeners after the backend is
|
|
34
|
-
* audit-log SSE, per-endpoint WS auth guards and
|
|
35
|
-
* `extra_audit_handlers` on a `WsEndpointSpec`) before
|
|
36
|
-
* runs. Consumers can also
|
|
37
|
-
* they return from `audit_factory` for setups that don't pass
|
|
38
|
-
* `create_app_server`.
|
|
32
|
+
* Listeners are a documented registration seam — `create_app_server`
|
|
33
|
+
* registers additional listeners via `add_listener` after the backend is
|
|
34
|
+
* built (the factory-managed audit-log SSE, per-endpoint WS auth guards and
|
|
35
|
+
* logout closers, any `extra_audit_handlers` on a `WsEndpointSpec`) before
|
|
36
|
+
* the first request runs. Consumers can also register listeners directly on
|
|
37
|
+
* the emitter they return from `audit_factory` for setups that don't pass
|
|
38
|
+
* through `create_app_server`.
|
|
39
39
|
*
|
|
40
40
|
* @module
|
|
41
41
|
*/
|
|
42
42
|
import { query_audit_log } from './audit_log_queries.js';
|
|
43
|
-
import { builtin_audit_log_config
|
|
43
|
+
import { builtin_audit_log_config } from './audit_log_schema.js';
|
|
44
44
|
/**
|
|
45
45
|
* Build a bound `AuditEmitter`. Typical caller is the consumer's
|
|
46
46
|
* `audit_factory` callback on `CreateAppBackendOptions` —
|
|
@@ -52,11 +52,17 @@ import { builtin_audit_log_config, } from './audit_log_schema.js';
|
|
|
52
52
|
*/
|
|
53
53
|
export const create_audit_emitter = (options) => {
|
|
54
54
|
const { db, log, audit_log_config = builtin_audit_log_config, emit_decorator } = options;
|
|
55
|
-
|
|
55
|
+
// Closure-private listener list — no mutable array is exposed on the
|
|
56
|
+
// returned (frozen) emitter; registration goes through `add_listener`.
|
|
57
|
+
const listeners = [];
|
|
56
58
|
if (options.on_audit_event)
|
|
57
|
-
|
|
59
|
+
listeners.push(options.on_audit_event);
|
|
58
60
|
const notify = (event) => {
|
|
59
|
-
|
|
61
|
+
// Snapshot-at-notify: iterate a copy so a listener that registers
|
|
62
|
+
// another listener mid-fan-out doesn't have the newcomer fire for the
|
|
63
|
+
// in-flight event (it fires on the next `notify`). Converges with the
|
|
64
|
+
// Rust twin, which clones the listener vec before iterating.
|
|
65
|
+
for (const listener of [...listeners]) {
|
|
60
66
|
try {
|
|
61
67
|
listener(event);
|
|
62
68
|
}
|
|
@@ -91,9 +97,13 @@ export const create_audit_emitter = (options) => {
|
|
|
91
97
|
target_account_id: input.target_account_id,
|
|
92
98
|
target_actor_id: input.target_actor_id,
|
|
93
99
|
ip: ctx.client_ip,
|
|
94
|
-
metadata: input.metadata
|
|
100
|
+
metadata: input.metadata
|
|
95
101
|
});
|
|
96
102
|
};
|
|
103
|
+
const add_listener = (listener) => {
|
|
104
|
+
listeners.push(listener);
|
|
105
|
+
};
|
|
106
|
+
const listener_count = () => listeners.length;
|
|
97
107
|
// Freeze the slot layout so consumers cannot hot-patch `emit` /
|
|
98
108
|
// `emit_role_grant_target` / `emit_pool` / `notify` after construction.
|
|
99
109
|
// The previous test helper `patch_audit_emit_capture` did exactly this
|
|
@@ -102,8 +112,16 @@ export const create_audit_emitter = (options) => {
|
|
|
102
112
|
// `this.emit`, so the patch silently bypassed role-grant-shape emits.
|
|
103
113
|
// Tests that need instrumentation pass `emit_decorator` so the wrap
|
|
104
114
|
// is captured by the closure before the freeze (see
|
|
105
|
-
// `create_emit_ordering_audit_factory`).
|
|
106
|
-
//
|
|
107
|
-
// `create_app_server`
|
|
108
|
-
|
|
115
|
+
// `create_emit_ordering_audit_factory`). The listener list stays
|
|
116
|
+
// closure-private; registration is append-only via `add_listener`
|
|
117
|
+
// (`create_app_server` registers its SSE + WS listeners post-assembly,
|
|
118
|
+
// by design).
|
|
119
|
+
return Object.freeze({
|
|
120
|
+
emit,
|
|
121
|
+
emit_role_grant_target,
|
|
122
|
+
emit_pool,
|
|
123
|
+
notify,
|
|
124
|
+
add_listener,
|
|
125
|
+
listener_count
|
|
126
|
+
});
|
|
109
127
|
};
|
|
@@ -47,5 +47,5 @@ export const AUDIT_LOG_INDEXES = [
|
|
|
47
47
|
`CREATE INDEX IF NOT EXISTS idx_audit_log_account ON audit_log(account_id)`,
|
|
48
48
|
`CREATE INDEX IF NOT EXISTS idx_audit_log_event_type ON audit_log(event_type)`,
|
|
49
49
|
`CREATE INDEX IF NOT EXISTS idx_audit_log_target_account ON audit_log(target_account_id)`,
|
|
50
|
-
`CREATE INDEX IF NOT EXISTS idx_audit_log_target_actor ON audit_log(target_actor_id)
|
|
50
|
+
`CREATE INDEX IF NOT EXISTS idx_audit_log_target_actor ON audit_log(target_actor_id)`
|
|
51
51
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit_log_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/audit_log_queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"audit_log_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/audit_log_queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAGN,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC9B,MAAM,uBAAuB,CAAC;AAa/B,iFAAiF;AACjF,eAAO,MAAM,sCAAsC,QAAO,MACvB,CAAC;AAEpC,0CAA0C;AAC1C,eAAO,MAAM,wCAAwC,QAAO,IAE3D,CAAC;AAYF,gFAAgF;AAChF,eAAO,MAAM,qCAAqC,QAAO,MACvB,CAAC;AAEnC,0CAA0C;AAC1C,eAAO,MAAM,uCAAuC,QAAO,IAE1D,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,eAAe,GAAU,CAAC,SAAS,MAAM,EACrD,MAAM,SAAS,EACf,OAAO,aAAa,CAAC,CAAC,CAAC,EACvB,SAAQ,cAAyC,KAC/C,OAAO,CAAC,aAAa,CAsCvB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAChC,MAAM,SAAS,EACf,UAAU,mBAAmB,KAC3B,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CA0C9B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC,GAC/C,MAAM,SAAS,EACf,UAAU,mBAAmB,KAC3B,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAwD/C,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,uCAAuC,GACnD,MAAM,SAAS,EACf,cAA+B,EAC/B,eAAU,KACR,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAmB1C,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,GAC1C,MAAM,SAAS,EACf,QAAQ,IAAI,KACV,OAAO,CAAC,MAAM,CAMhB,CAAC"}
|