@fuzdev/fuz_app 0.103.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 +40 -18
- 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 +227 -2
- package/dist/auth/cell_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_action_specs.js +117 -39
- package/dist/auth/cell_actions.d.ts +34 -11
- package/dist/auth/cell_actions.d.ts.map +1 -1
- package/dist/auth/cell_actions.js +155 -41
- 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 +1 -1
- package/dist/auth/cell_audit_events.d.ts.map +1 -1
- package/dist/auth/cell_audit_events.js +7 -6
- package/dist/auth/cell_audit_metadata.d.ts +15 -0
- package/dist/auth/cell_audit_metadata.d.ts.map +1 -1
- package/dist/auth/cell_audit_metadata.js +13 -2
- 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/CLAUDE.md +16 -6
- 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 +14 -1
- package/dist/db/cell_ddl.d.ts.map +1 -1
- package/dist/db/cell_ddl.js +26 -6
- 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 +46 -1
- package/dist/db/cell_queries.d.ts.map +1 -1
- package/dist/db/cell_queries.js +42 -5
- 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 +27 -18
- 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 +24 -0
- package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_gated_create.js +178 -35
- 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/expected_schema.json +3 -0
- 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 +11 -8
- 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/test_cell_gated_create_authorize.d.ts +12 -7
- package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts.map +1 -1
- package/dist/testing/cross_backend/test_cell_gated_create_authorize.js +54 -15
- 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
|
@@ -39,16 +39,16 @@
|
|
|
39
39
|
* @module
|
|
40
40
|
*/
|
|
41
41
|
import { z } from 'zod';
|
|
42
|
-
import { rpc_action
|
|
42
|
+
import { rpc_action } from '../actions/action_rpc.js';
|
|
43
43
|
import { jsonrpc_errors, dev_only } from '../http/jsonrpc_errors.js';
|
|
44
44
|
import { is_pg_unique_violation } from '../db/pg_error.js';
|
|
45
45
|
import { has_role } from './request_context.js';
|
|
46
46
|
import { ROLE_ADMIN } from './role_schema.js';
|
|
47
|
-
import { cell_create_action_spec, cell_get_action_spec, cell_update_action_spec, cell_delete_action_spec, cell_list_action_spec, cell_clone_action_spec, ERROR_CELL_NOT_FOUND, ERROR_CELL_PATH_ADMIN_ONLY, ERROR_CELL_PATH_TAKEN, ERROR_CELL_VISIBILITY_MANAGE_ONLY, ERROR_CELL_GET_REQUIRES_ID_OR_PATH, ERROR_CELL_KIND_IN_DATA, ERROR_CELL_KIND_EMPTY, ERROR_CELL_LIST_CREATED_BY_REQUIRES_AUTH, ERROR_CELL_LIST_SHARED_WITH_REQUIRES_AUTH, CELL_LIST_LIMIT_DEFAULT, CELL_RELATIONS_BUNDLE_LIMIT
|
|
48
|
-
import { query_cell_create, query_cell_get, query_cell_get_by_path, query_cell_update, query_cell_delete, query_cell_list, query_cell_load_many
|
|
49
|
-
import { query_cell_grant_list_for_cell, query_cell_grants_for_caller_in_cells
|
|
47
|
+
import { cell_create_action_spec, cell_get_action_spec, cell_update_action_spec, cell_delete_action_spec, cell_list_action_spec, cell_clone_action_spec, cell_moderate_action_spec, ERROR_CELL_NOT_FOUND, ERROR_CELL_PATH_ADMIN_ONLY, ERROR_CELL_PATH_TAKEN, ERROR_CELL_VISIBILITY_MANAGE_ONLY, ERROR_CELL_GET_REQUIRES_ID_OR_PATH, ERROR_CELL_KIND_IN_DATA, ERROR_CELL_KIND_EMPTY, ERROR_CELL_CREATE_FORBIDDEN, ERROR_CELL_MODERATE_FORBIDDEN, ERROR_CELL_NOT_A_CONTRIBUTION, ERROR_CELL_LIST_CREATED_BY_REQUIRES_AUTH, ERROR_CELL_LIST_SHARED_WITH_REQUIRES_AUTH, CELL_LIST_LIMIT_DEFAULT, CELL_RELATIONS_BUNDLE_LIMIT } from './cell_action_specs.js';
|
|
48
|
+
import { query_cell_create, query_cell_get, query_cell_get_by_path, query_cell_update, query_cell_delete, query_cell_set_moderation, query_cell_list, query_cell_load_many } from '../db/cell_queries.js';
|
|
49
|
+
import { query_cell_grant_list_for_cell, query_cell_grants_for_caller_in_cells } from '../db/cell_grant_queries.js';
|
|
50
50
|
import { query_cell_field_list_for_source, query_cell_field_set } from '../db/cell_field_queries.js';
|
|
51
|
-
import { query_cell_item_insert, query_cell_item_list_for_parent
|
|
51
|
+
import { query_cell_item_insert, query_cell_item_list_for_parent } from '../db/cell_item_queries.js';
|
|
52
52
|
import { can_view_cell, can_edit_cell, can_manage_cell } from './cell_authorize.js';
|
|
53
53
|
import { filter_visible_target_ids } from './cell_relation_visibility.js';
|
|
54
54
|
import { to_grant_json } from './cell_grant_actions.js';
|
|
@@ -76,7 +76,7 @@ const path_taken_error = () => jsonrpc_errors.conflict('cell.path is already tak
|
|
|
76
76
|
const reject_kind_in_data = (data) => {
|
|
77
77
|
if (Object.hasOwn(data, 'kind')) {
|
|
78
78
|
throw jsonrpc_errors.invalid_params('cell.data must not contain `kind` (it is a top-level field)', {
|
|
79
|
-
reason: ERROR_CELL_KIND_IN_DATA
|
|
79
|
+
reason: ERROR_CELL_KIND_IN_DATA
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
};
|
|
@@ -87,12 +87,15 @@ export const to_cell_json = (row) => ({
|
|
|
87
87
|
kind: row.kind,
|
|
88
88
|
visibility: row.visibility,
|
|
89
89
|
refs: row.refs,
|
|
90
|
+
parent_id: row.parent_id,
|
|
91
|
+
root_id: row.root_id,
|
|
92
|
+
moderation: row.moderation,
|
|
90
93
|
created_by: row.created_by,
|
|
91
94
|
updated_by: row.updated_by,
|
|
92
95
|
created_at: typeof row.created_at === 'string' ? row.created_at : row.created_at.toISOString(),
|
|
93
96
|
updated_at: to_iso_nullable(row.updated_at),
|
|
94
97
|
deleted_at: to_iso_nullable(row.deleted_at),
|
|
95
|
-
grant_count: row.grant_count
|
|
98
|
+
grant_count: row.grant_count
|
|
96
99
|
});
|
|
97
100
|
/**
|
|
98
101
|
* Emit a cell-mutation audit event with the standard `{cell_id, kind?,
|
|
@@ -108,8 +111,8 @@ const emit_cell_audit = (ctx, event_type, row, deps, auth) => {
|
|
|
108
111
|
metadata: {
|
|
109
112
|
cell_id: row.id,
|
|
110
113
|
kind: row.kind ?? undefined,
|
|
111
|
-
path: row.path
|
|
112
|
-
}
|
|
114
|
+
path: row.path
|
|
115
|
+
}
|
|
113
116
|
});
|
|
114
117
|
};
|
|
115
118
|
/** Create the six generic cell RPC actions. */
|
|
@@ -141,7 +144,7 @@ export const create_cell_actions = (deps) => {
|
|
|
141
144
|
// + DB are clean.
|
|
142
145
|
if (input.path !== undefined && input.path !== null && !has_role(auth, ROLE_ADMIN)) {
|
|
143
146
|
throw jsonrpc_errors.forbidden('cell.path is admin-only', {
|
|
144
|
-
reason: ERROR_CELL_PATH_ADMIN_ONLY
|
|
147
|
+
reason: ERROR_CELL_PATH_ADMIN_ONLY
|
|
145
148
|
});
|
|
146
149
|
}
|
|
147
150
|
// `kind` is the top-level column — reject a stray copy inside `data`,
|
|
@@ -156,15 +159,75 @@ export const create_cell_actions = (deps) => {
|
|
|
156
159
|
// known kinds with malformed payloads surface as invalid_params.
|
|
157
160
|
const validated_data = validate_data_or_throw(input.data);
|
|
158
161
|
const kind = input.kind ?? null;
|
|
159
|
-
//
|
|
160
|
-
//
|
|
161
|
-
//
|
|
162
|
-
//
|
|
163
|
-
//
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
162
|
+
// Directory tree: resolve the governing `root_id` from the parent (and
|
|
163
|
+
// the root's `data` for the authorizer's policy read). Runs whether or
|
|
164
|
+
// not an authorizer is mounted — `root_id` is written regardless, and an
|
|
165
|
+
// unviewable parent 404-masks the attempt (the same IDOR mask the read
|
|
166
|
+
// path uses; never reveals a hidden container). A root creation
|
|
167
|
+
// (`parent_id` null/absent) has `root_id = null`. `root_data` is read
|
|
168
|
+
// **in-tx** (only when an authorizer is mounted), reusing the parent row
|
|
169
|
+
// when the parent *is* the root, else one read by `root_id` — so the
|
|
170
|
+
// authorizer stays pure + the read rides the handler's connection (no
|
|
171
|
+
// separate-handle deadlock on the single-connection PGlite).
|
|
172
|
+
const parent_id = input.parent_id ?? null;
|
|
173
|
+
let root_id = null;
|
|
174
|
+
let root_data = null;
|
|
175
|
+
if (parent_id !== null) {
|
|
176
|
+
const parent = await query_cell_get(ctx, parent_id);
|
|
177
|
+
if (!parent)
|
|
178
|
+
throw jsonrpc_errors.not_found('cell', { reason: ERROR_CELL_NOT_FOUND });
|
|
179
|
+
const parent_grants = await query_cell_grant_list_for_cell(ctx, parent.id);
|
|
180
|
+
if (!can_view_cell(auth, parent, parent_grants)) {
|
|
181
|
+
throw jsonrpc_errors.not_found('cell', { reason: ERROR_CELL_NOT_FOUND });
|
|
182
|
+
}
|
|
183
|
+
root_id = parent.root_id ?? parent.id;
|
|
184
|
+
if (authorize_create) {
|
|
185
|
+
root_data =
|
|
186
|
+
root_id === parent.id
|
|
187
|
+
? parent.data
|
|
188
|
+
: ((await query_cell_get(ctx, root_id))?.data ?? null);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Parent-aware creation authorizer (opt-in). Runs after shape validation
|
|
192
|
+
// and after the parent-resolve (a hidden parent already 404-masked).
|
|
193
|
+
// `{allow: false}` for a *viewable* parent / a root creation is a 403
|
|
194
|
+
// `forbidden` (not the 404 mask); an `{allow: true}` verdict folds the
|
|
195
|
+
// moderation outcome. Receives the **raw** `input.data` (not the
|
|
196
|
+
// `validate_data`-normalized value) to match the Rust twin, so a consumer
|
|
197
|
+
// with a transforming validator can't diverge TS↔Rust. `scope_id` is
|
|
198
|
+
// `null` in v1. Without an authorizer, create is open: `moderation` stays
|
|
199
|
+
// null and the author's visibility holds.
|
|
200
|
+
let moderation = null;
|
|
201
|
+
let visibility = input.visibility;
|
|
202
|
+
if (authorize_create) {
|
|
203
|
+
const verdict = await authorize_create(auth, {
|
|
204
|
+
kind,
|
|
205
|
+
data: input.data,
|
|
206
|
+
parent_id,
|
|
207
|
+
root_id,
|
|
208
|
+
root_data,
|
|
209
|
+
scope_id: null
|
|
210
|
+
});
|
|
211
|
+
if (!verdict.allow) {
|
|
212
|
+
throw jsonrpc_errors.forbidden('cell creation is not permitted here', {
|
|
213
|
+
reason: ERROR_CELL_CREATE_FORBIDDEN
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
// Moderation is a *contribution* concept — only stamp it for a create
|
|
217
|
+
// with a parent. A root / unparented create stays `moderation = null`
|
|
218
|
+
// at the author's visibility even under a mounted authorizer (there is
|
|
219
|
+
// no container to be moderated under).
|
|
220
|
+
if (parent_id !== null) {
|
|
221
|
+
if (verdict.moderation_required) {
|
|
222
|
+
// Born pending: stays private until `cell_moderate` approves it.
|
|
223
|
+
moderation = 'pending';
|
|
224
|
+
visibility = 'private';
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
// Born approved + live immediately at the author's visibility.
|
|
228
|
+
moderation = 'approved';
|
|
229
|
+
}
|
|
230
|
+
}
|
|
168
231
|
}
|
|
169
232
|
let row;
|
|
170
233
|
try {
|
|
@@ -176,9 +239,12 @@ export const create_cell_actions = (deps) => {
|
|
|
176
239
|
// schema-validated runtime shape.
|
|
177
240
|
data: validated_data,
|
|
178
241
|
kind,
|
|
179
|
-
visibility
|
|
242
|
+
visibility,
|
|
180
243
|
path: input.path ?? null,
|
|
181
|
-
|
|
244
|
+
parent_id,
|
|
245
|
+
root_id,
|
|
246
|
+
moderation,
|
|
247
|
+
created_by: auth.actor.id
|
|
182
248
|
});
|
|
183
249
|
}
|
|
184
250
|
catch (err) {
|
|
@@ -195,7 +261,7 @@ export const create_cell_actions = (deps) => {
|
|
|
195
261
|
// bypass the wire schema get the same error shape.
|
|
196
262
|
if (input.id === undefined && input.path === undefined) {
|
|
197
263
|
throw jsonrpc_errors.invalid_params('cell_get requires id or path', {
|
|
198
|
-
reason: ERROR_CELL_GET_REQUIRES_ID_OR_PATH
|
|
264
|
+
reason: ERROR_CELL_GET_REQUIRES_ID_OR_PATH
|
|
199
265
|
});
|
|
200
266
|
}
|
|
201
267
|
const auth = ctx.auth;
|
|
@@ -214,11 +280,11 @@ export const create_cell_actions = (deps) => {
|
|
|
214
280
|
const [grants, fields, items] = await Promise.all([
|
|
215
281
|
auth ? query_cell_grant_list_for_cell(ctx, row.id) : Promise.resolve(null),
|
|
216
282
|
query_cell_field_list_for_source(ctx, row.id, {
|
|
217
|
-
limit: CELL_RELATIONS_BUNDLE_LIMIT + 1
|
|
283
|
+
limit: CELL_RELATIONS_BUNDLE_LIMIT + 1
|
|
218
284
|
}),
|
|
219
285
|
query_cell_item_list_for_parent(ctx, row.id, {
|
|
220
|
-
limit: CELL_RELATIONS_BUNDLE_LIMIT + 1
|
|
221
|
-
})
|
|
286
|
+
limit: CELL_RELATIONS_BUNDLE_LIMIT + 1
|
|
287
|
+
})
|
|
222
288
|
]);
|
|
223
289
|
// 404 covers both "no such cell" and "exists but caller can't view"
|
|
224
290
|
// — same response code so private-cell existence doesn't leak.
|
|
@@ -241,7 +307,7 @@ export const create_cell_actions = (deps) => {
|
|
|
241
307
|
// id-sets. `*_truncated` still reflects the raw relation size.
|
|
242
308
|
const visible_targets = await filter_visible_target_ids(ctx, auth, [
|
|
243
309
|
...fields_bundled.map((f) => f.target_id),
|
|
244
|
-
...items_bundled.map((i) => i.child_id)
|
|
310
|
+
...items_bundled.map((i) => i.child_id)
|
|
245
311
|
]);
|
|
246
312
|
const fields_visible = fields_bundled.filter((f) => visible_targets.has(f.target_id));
|
|
247
313
|
const items_visible = items_bundled.filter((i) => visible_targets.has(i.child_id));
|
|
@@ -252,7 +318,7 @@ export const create_cell_actions = (deps) => {
|
|
|
252
318
|
items: items_visible.map(to_item_json),
|
|
253
319
|
items_truncated,
|
|
254
320
|
can_edit,
|
|
255
|
-
can_grant
|
|
321
|
+
can_grant
|
|
256
322
|
};
|
|
257
323
|
};
|
|
258
324
|
const update_handler = async (input, ctx) => {
|
|
@@ -262,7 +328,7 @@ export const create_cell_actions = (deps) => {
|
|
|
262
328
|
// can't probe for cell existence by varying `path` shape.
|
|
263
329
|
if (path_provided && !has_role(auth, ROLE_ADMIN)) {
|
|
264
330
|
throw jsonrpc_errors.forbidden('cell.path is admin-only', {
|
|
265
|
-
reason: ERROR_CELL_PATH_ADMIN_ONLY
|
|
331
|
+
reason: ERROR_CELL_PATH_ADMIN_ONLY
|
|
266
332
|
});
|
|
267
333
|
}
|
|
268
334
|
const existing = await query_cell_get(ctx, input.cell_id);
|
|
@@ -283,7 +349,7 @@ export const create_cell_actions = (deps) => {
|
|
|
283
349
|
input.visibility !== existing.visibility &&
|
|
284
350
|
!can_manage_cell(auth, existing)) {
|
|
285
351
|
throw jsonrpc_errors.forbidden('cell.visibility is manage-tier only', {
|
|
286
|
-
reason: ERROR_CELL_VISIBILITY_MANAGE_ONLY
|
|
352
|
+
reason: ERROR_CELL_VISIBILITY_MANAGE_ONLY
|
|
287
353
|
});
|
|
288
354
|
}
|
|
289
355
|
// Per-kind shape validation when `data` is supplied. Patch-only —
|
|
@@ -302,7 +368,7 @@ export const create_cell_actions = (deps) => {
|
|
|
302
368
|
data: validated_data,
|
|
303
369
|
visibility: input.visibility,
|
|
304
370
|
path: path_provided ? (input.path ?? null) : undefined,
|
|
305
|
-
updated_by: auth.actor.id
|
|
371
|
+
updated_by: auth.actor.id
|
|
306
372
|
});
|
|
307
373
|
}
|
|
308
374
|
catch (err) {
|
|
@@ -338,6 +404,51 @@ export const create_cell_actions = (deps) => {
|
|
|
338
404
|
emit_cell_audit(ctx, 'cell_delete', existing, deps, auth);
|
|
339
405
|
return { ok: true, deleted: true };
|
|
340
406
|
};
|
|
407
|
+
const moderate_handler = async (input, ctx) => {
|
|
408
|
+
const auth = ctx.auth;
|
|
409
|
+
const existing = await query_cell_get(ctx, input.cell_id);
|
|
410
|
+
// 404 covers miss + unviewable so a pending (private) contribution
|
|
411
|
+
// doesn't leak existence to a non-viewer.
|
|
412
|
+
if (!existing)
|
|
413
|
+
throw jsonrpc_errors.not_found('cell', { reason: ERROR_CELL_NOT_FOUND });
|
|
414
|
+
const grants = await query_cell_grant_list_for_cell(ctx, existing.id);
|
|
415
|
+
if (!can_view_cell(auth, existing, grants)) {
|
|
416
|
+
throw jsonrpc_errors.not_found('cell', { reason: ERROR_CELL_NOT_FOUND });
|
|
417
|
+
}
|
|
418
|
+
// Only a contribution (with a governing root) is moderatable.
|
|
419
|
+
if (existing.root_id === null) {
|
|
420
|
+
throw jsonrpc_errors.invalid_params('cell is not a contribution (no governing root to moderate under)', { reason: ERROR_CELL_NOT_A_CONTRIBUTION });
|
|
421
|
+
}
|
|
422
|
+
// Authority is over the governing ROOT (admin / root owner), not the
|
|
423
|
+
// contribution — the author manages the contribution and could otherwise
|
|
424
|
+
// self-approve. A viewable-but-unauthorized caller (incl. the author) → 403.
|
|
425
|
+
const root = await query_cell_get(ctx, existing.root_id);
|
|
426
|
+
if (!root)
|
|
427
|
+
throw jsonrpc_errors.not_found('cell', { reason: ERROR_CELL_NOT_FOUND });
|
|
428
|
+
if (!can_manage_cell(auth, root)) {
|
|
429
|
+
throw jsonrpc_errors.forbidden('cell_moderate requires moderation authority over the governing root', { reason: ERROR_CELL_MODERATE_FORBIDDEN });
|
|
430
|
+
}
|
|
431
|
+
const approved = input.moderation === 'approved';
|
|
432
|
+
const updated = await query_cell_set_moderation(ctx, input.cell_id, input.moderation, {
|
|
433
|
+
set_visibility_public: approved,
|
|
434
|
+
updated_by: auth.actor.id
|
|
435
|
+
});
|
|
436
|
+
// Raced with a deleter between the authz check and the UPDATE.
|
|
437
|
+
if (!updated)
|
|
438
|
+
throw jsonrpc_errors.not_found('cell', { reason: ERROR_CELL_NOT_FOUND });
|
|
439
|
+
deps.audit.emit(ctx, {
|
|
440
|
+
event_type: 'cell_moderate',
|
|
441
|
+
actor_id: auth.actor.id,
|
|
442
|
+
account_id: auth.account.id,
|
|
443
|
+
ip: ctx.client_ip,
|
|
444
|
+
metadata: {
|
|
445
|
+
cell_id: updated.id,
|
|
446
|
+
root_id: existing.root_id,
|
|
447
|
+
moderation: input.moderation
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
return { cell: to_cell_json(updated) };
|
|
451
|
+
};
|
|
341
452
|
/**
|
|
342
453
|
* Insert one cloned cell row owned by the caller.
|
|
343
454
|
*
|
|
@@ -370,7 +481,7 @@ export const create_cell_actions = (deps) => {
|
|
|
370
481
|
kind: source.kind,
|
|
371
482
|
visibility: source.visibility,
|
|
372
483
|
path: null, // admin-only paths cannot auto-clone
|
|
373
|
-
created_by: auth.actor.id
|
|
484
|
+
created_by: auth.actor.id
|
|
374
485
|
});
|
|
375
486
|
};
|
|
376
487
|
const clone_handler = async (input, ctx) => {
|
|
@@ -407,7 +518,7 @@ export const create_cell_actions = (deps) => {
|
|
|
407
518
|
const child_ids = source_items.map((i) => i.child_id);
|
|
408
519
|
const [child_rows, visible_children] = await Promise.all([
|
|
409
520
|
query_cell_load_many(ctx, child_ids),
|
|
410
|
-
filter_visible_target_ids(ctx, auth, child_ids)
|
|
521
|
+
filter_visible_target_ids(ctx, auth, child_ids)
|
|
411
522
|
]);
|
|
412
523
|
const child_by_id = new Map(child_rows.map((r) => [r.id, r]));
|
|
413
524
|
for (const item of source_items) {
|
|
@@ -427,7 +538,7 @@ export const create_cell_actions = (deps) => {
|
|
|
427
538
|
// in that single transaction and rolls back together on any
|
|
428
539
|
// failure. No nested `ctx.db.transaction(...)` here.
|
|
429
540
|
const cloned_root = await clone_one_cell_row(ctx, source, auth, {
|
|
430
|
-
patch_data: input.with_data_patch
|
|
541
|
+
patch_data: input.with_data_patch
|
|
431
542
|
});
|
|
432
543
|
// Copy outgoing fields shallowly: the clone points at the same
|
|
433
544
|
// targets the source did (fields are JSON references, not
|
|
@@ -448,7 +559,7 @@ export const create_cell_actions = (deps) => {
|
|
|
448
559
|
await query_cell_field_set(ctx, {
|
|
449
560
|
source_id: cloned_root.id,
|
|
450
561
|
name: f.name,
|
|
451
|
-
target_id: f.target_id
|
|
562
|
+
target_id: f.target_id
|
|
452
563
|
});
|
|
453
564
|
}
|
|
454
565
|
if (deep) {
|
|
@@ -464,7 +575,7 @@ export const create_cell_actions = (deps) => {
|
|
|
464
575
|
await query_cell_item_insert(ctx, {
|
|
465
576
|
parent_id: cloned_root.id,
|
|
466
577
|
position: item.position,
|
|
467
|
-
child_id: cloned_child.id
|
|
578
|
+
child_id: cloned_child.id
|
|
468
579
|
});
|
|
469
580
|
}
|
|
470
581
|
}
|
|
@@ -487,7 +598,7 @@ export const create_cell_actions = (deps) => {
|
|
|
487
598
|
await query_cell_item_insert(ctx, {
|
|
488
599
|
parent_id: cloned_root.id,
|
|
489
600
|
position: item.position,
|
|
490
|
-
child_id: item.child_id
|
|
601
|
+
child_id: item.child_id
|
|
491
602
|
});
|
|
492
603
|
}
|
|
493
604
|
}
|
|
@@ -507,8 +618,8 @@ export const create_cell_actions = (deps) => {
|
|
|
507
618
|
new_id: cloned_root.id,
|
|
508
619
|
deep,
|
|
509
620
|
item_count: cloned_child_count,
|
|
510
|
-
...(source_kind !== undefined ? { kind: source_kind } : {})
|
|
511
|
-
}
|
|
621
|
+
...(source_kind !== undefined ? { kind: source_kind } : {})
|
|
622
|
+
}
|
|
512
623
|
});
|
|
513
624
|
return { cell: to_cell_json(cloned_root) };
|
|
514
625
|
};
|
|
@@ -518,14 +629,14 @@ export const create_cell_actions = (deps) => {
|
|
|
518
629
|
// ("does account X have any public cells?") — require auth to use it.
|
|
519
630
|
if (auth === null && input.created_by !== undefined) {
|
|
520
631
|
throw jsonrpc_errors.invalid_params('cell_list created_by requires authentication', {
|
|
521
|
-
reason: ERROR_CELL_LIST_CREATED_BY_REQUIRES_AUTH
|
|
632
|
+
reason: ERROR_CELL_LIST_CREATED_BY_REQUIRES_AUTH
|
|
522
633
|
});
|
|
523
634
|
}
|
|
524
635
|
// `shared_with: 'me'` resolves to the caller's actor + role_grants;
|
|
525
636
|
// no auth means no caller, no admit path.
|
|
526
637
|
if (auth === null && input.shared_with !== undefined) {
|
|
527
638
|
throw jsonrpc_errors.invalid_params('cell_list shared_with requires authentication', {
|
|
528
|
-
reason: ERROR_CELL_LIST_SHARED_WITH_REQUIRES_AUTH
|
|
639
|
+
reason: ERROR_CELL_LIST_SHARED_WITH_REQUIRES_AUTH
|
|
529
640
|
});
|
|
530
641
|
}
|
|
531
642
|
// Project the active role_grant set into parallel arrays for the
|
|
@@ -542,6 +653,8 @@ export const create_cell_actions = (deps) => {
|
|
|
542
653
|
ref: input.ref,
|
|
543
654
|
created_by: input.created_by,
|
|
544
655
|
path_prefix: input.path_prefix,
|
|
656
|
+
root_id: input.root_id,
|
|
657
|
+
moderation: input.moderation,
|
|
545
658
|
viewer_actor_id: caller_actor_id,
|
|
546
659
|
viewer_is_admin: auth ? has_role(auth, ROLE_ADMIN) : false,
|
|
547
660
|
caller_actor_id,
|
|
@@ -553,7 +666,7 @@ export const create_cell_actions = (deps) => {
|
|
|
553
666
|
// Apply the default cap when caller omits `limit`. Without this
|
|
554
667
|
// the SQL `LIMIT NULL` returns every matching row.
|
|
555
668
|
limit: input.limit ?? CELL_LIST_LIMIT_DEFAULT,
|
|
556
|
-
offset: input.offset
|
|
669
|
+
offset: input.offset
|
|
557
670
|
});
|
|
558
671
|
let cell_grants;
|
|
559
672
|
if (input.shared_with === 'me' && rows.length > 0 && caller_actor_id !== null) {
|
|
@@ -572,5 +685,6 @@ export const create_cell_actions = (deps) => {
|
|
|
572
685
|
rpc_action(cell_delete_action_spec, delete_handler),
|
|
573
686
|
rpc_action(cell_list_action_spec, list_handler),
|
|
574
687
|
rpc_action(cell_clone_action_spec, clone_handler),
|
|
688
|
+
rpc_action(cell_moderate_action_spec, moderate_handler)
|
|
575
689
|
];
|
|
576
690
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell_audit_action_specs.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_audit_action_specs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"cell_audit_action_specs.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_audit_action_specs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;kBAO7B,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE,2EAA2E;AAC3E,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAEhD,eAAO,MAAM,kBAAkB;;;kBAG7B,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;kBAE9B,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWH,CAAC;AAEtC,+DAA+D;AAC/D,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAyC,CAAC"}
|
|
@@ -44,16 +44,16 @@ export const CellAuditEventJson = z.strictObject({
|
|
|
44
44
|
event_type: z.string(),
|
|
45
45
|
outcome: z.enum(['success', 'failure']),
|
|
46
46
|
actor_id: Uuid.nullable(),
|
|
47
|
-
created_at: z.string()
|
|
47
|
+
created_at: z.string()
|
|
48
48
|
});
|
|
49
49
|
/** Page size for `cell_audit_list`. Single page at MVP; no cursor wire. */
|
|
50
50
|
export const CELL_AUDIT_LIST_DEFAULT_LIMIT = 50;
|
|
51
51
|
export const CellAuditListInput = z.strictObject({
|
|
52
52
|
cell_id: Uuid.meta({ description: 'Cell whose audit trail to fetch.' }),
|
|
53
|
-
acting: ActingActor
|
|
53
|
+
acting: ActingActor
|
|
54
54
|
});
|
|
55
55
|
export const CellAuditListOutput = z.strictObject({
|
|
56
|
-
events: z.array(CellAuditEventJson)
|
|
56
|
+
events: z.array(CellAuditEventJson)
|
|
57
57
|
});
|
|
58
58
|
export const cell_audit_list_action_spec = {
|
|
59
59
|
method: 'cell_audit_list',
|
|
@@ -64,7 +64,7 @@ export const cell_audit_list_action_spec = {
|
|
|
64
64
|
input: CellAuditListInput,
|
|
65
65
|
output: CellAuditListOutput,
|
|
66
66
|
async: true,
|
|
67
|
-
description: 'List the most-recent audit events referencing the cell on any of `cell_id`, `source_id`, `parent_id`, `child_id`, `target_id`, or `new_id` metadata keys. Manage-tier only (admin / owner) — the timeline reveals who touched the cell, so viewers and editors get the IDOR-mask 404. 404 on miss or unauthorized — same shape as `cell_get` so private-cell existence does not leak.'
|
|
67
|
+
description: 'List the most-recent audit events referencing the cell on any of `cell_id`, `source_id`, `parent_id`, `child_id`, `target_id`, or `new_id` metadata keys. Manage-tier only (admin / owner) — the timeline reveals who touched the cell, so viewers and editors get the IDOR-mask 404. 404 on miss or unauthorized — same shape as `cell_get` so private-cell existence does not leak.'
|
|
68
68
|
};
|
|
69
69
|
/** Registry export to compose into `all_cell_action_specs`. */
|
|
70
70
|
export const all_cell_audit_action_specs = [cell_audit_list_action_spec];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell_audit_actions.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_audit_actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"cell_audit_actions.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_audit_actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAuC,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAgC/F,eAAO,MAAM,yBAAyB,QAAO,KAAK,CAAC,SAAS,CA0B3D,CAAC"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { rpc_action } from '../actions/action_rpc.js';
|
|
17
17
|
import { jsonrpc_errors } from '../http/jsonrpc_errors.js';
|
|
18
|
-
import { cell_audit_list_action_spec, CELL_AUDIT_LIST_DEFAULT_LIMIT
|
|
18
|
+
import { cell_audit_list_action_spec, CELL_AUDIT_LIST_DEFAULT_LIMIT } from './cell_audit_action_specs.js';
|
|
19
19
|
import { ERROR_CELL_NOT_FOUND } from './cell_action_specs.js';
|
|
20
20
|
import { query_cell_get } from '../db/cell_queries.js';
|
|
21
21
|
import { query_audit_log_list_by_cell } from '../db/cell_audit_queries.js';
|
|
@@ -32,7 +32,7 @@ const to_cell_audit_event_json = (row) => ({
|
|
|
32
32
|
event_type: row.event_type,
|
|
33
33
|
outcome: row.outcome,
|
|
34
34
|
actor_id: row.actor_id,
|
|
35
|
-
created_at: typeof row.created_at === 'string' ? row.created_at : row.created_at.toISOString()
|
|
35
|
+
created_at: typeof row.created_at === 'string' ? row.created_at : row.created_at.toISOString()
|
|
36
36
|
});
|
|
37
37
|
export const create_cell_audit_actions = () => {
|
|
38
38
|
const handler = async (input, ctx) => {
|
|
@@ -51,7 +51,7 @@ export const create_cell_audit_actions = () => {
|
|
|
51
51
|
throw jsonrpc_errors.not_found('cell', { reason: ERROR_CELL_NOT_FOUND });
|
|
52
52
|
}
|
|
53
53
|
const rows = await query_audit_log_list_by_cell(ctx, cell.id, {
|
|
54
|
-
limit: CELL_AUDIT_LIST_DEFAULT_LIMIT
|
|
54
|
+
limit: CELL_AUDIT_LIST_DEFAULT_LIMIT
|
|
55
55
|
});
|
|
56
56
|
return { events: rows.map(to_cell_audit_event_json) };
|
|
57
57
|
};
|
|
@@ -20,7 +20,7 @@ import type { z } from 'zod';
|
|
|
20
20
|
/**
|
|
21
21
|
* Cell-layer `event_type → metadata schema` map for `extra_events`.
|
|
22
22
|
*
|
|
23
|
-
* Covers the
|
|
23
|
+
* Covers the seven generic cell verbs' mutation events plus the grant /
|
|
24
24
|
* field / item relation events. Read-only verbs (`cell_get`, `cell_list`,
|
|
25
25
|
* `cell_*_list`, `cell_audit_list`) emit nothing and are absent here.
|
|
26
26
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell_audit_events.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_audit_events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"cell_audit_events.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_audit_events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqB7B;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAajE,CAAC"}
|
|
@@ -16,14 +16,14 @@
|
|
|
16
16
|
*
|
|
17
17
|
* @module
|
|
18
18
|
*/
|
|
19
|
-
import { CellAuditMetadata, CellCloneAuditMetadata } from './cell_audit_metadata.js';
|
|
20
|
-
import { CellGrantCreateAuditMetadata, CellGrantRevokeAuditMetadata
|
|
21
|
-
import { CellFieldSetAuditMetadata, CellFieldDeleteAuditMetadata
|
|
22
|
-
import { CellItemInsertAuditMetadata, CellItemMoveAuditMetadata, CellItemDeleteAuditMetadata
|
|
19
|
+
import { CellAuditMetadata, CellCloneAuditMetadata, CellModerateAuditMetadata } from './cell_audit_metadata.js';
|
|
20
|
+
import { CellGrantCreateAuditMetadata, CellGrantRevokeAuditMetadata } from './cell_grant_audit_metadata.js';
|
|
21
|
+
import { CellFieldSetAuditMetadata, CellFieldDeleteAuditMetadata } from './cell_field_audit_metadata.js';
|
|
22
|
+
import { CellItemInsertAuditMetadata, CellItemMoveAuditMetadata, CellItemDeleteAuditMetadata } from './cell_item_audit_metadata.js';
|
|
23
23
|
/**
|
|
24
24
|
* Cell-layer `event_type → metadata schema` map for `extra_events`.
|
|
25
25
|
*
|
|
26
|
-
* Covers the
|
|
26
|
+
* Covers the seven generic cell verbs' mutation events plus the grant /
|
|
27
27
|
* field / item relation events. Read-only verbs (`cell_get`, `cell_list`,
|
|
28
28
|
* `cell_*_list`, `cell_audit_list`) emit nothing and are absent here.
|
|
29
29
|
*/
|
|
@@ -32,11 +32,12 @@ export const cell_audit_events = {
|
|
|
32
32
|
cell_update: CellAuditMetadata,
|
|
33
33
|
cell_delete: CellAuditMetadata,
|
|
34
34
|
cell_clone: CellCloneAuditMetadata,
|
|
35
|
+
cell_moderate: CellModerateAuditMetadata,
|
|
35
36
|
cell_grant_create: CellGrantCreateAuditMetadata,
|
|
36
37
|
cell_grant_revoke: CellGrantRevokeAuditMetadata,
|
|
37
38
|
cell_field_set: CellFieldSetAuditMetadata,
|
|
38
39
|
cell_field_delete: CellFieldDeleteAuditMetadata,
|
|
39
40
|
cell_item_insert: CellItemInsertAuditMetadata,
|
|
40
41
|
cell_item_move: CellItemMoveAuditMetadata,
|
|
41
|
-
cell_item_delete: CellItemDeleteAuditMetadata
|
|
42
|
+
cell_item_delete: CellItemDeleteAuditMetadata
|
|
42
43
|
};
|
|
@@ -45,4 +45,19 @@ export declare const CellCloneAuditMetadata: z.ZodObject<{
|
|
|
45
45
|
kind: z.ZodOptional<z.ZodString>;
|
|
46
46
|
}, z.core.$loose>;
|
|
47
47
|
export type CellCloneAuditMetadata = z.infer<typeof CellCloneAuditMetadata>;
|
|
48
|
+
/**
|
|
49
|
+
* Metadata envelope for `cell_moderate`. `cell_id` is the moderated
|
|
50
|
+
* contribution; `root_id` is its governing root (the container whose
|
|
51
|
+
* moderation authority gated the call); `moderation` is the terminal decision
|
|
52
|
+
* applied (`'approved'` | `'rejected'`).
|
|
53
|
+
*/
|
|
54
|
+
export declare const CellModerateAuditMetadata: z.ZodObject<{
|
|
55
|
+
cell_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
56
|
+
root_id: z.core.$ZodBranded<z.ZodUUID, "Uuid", "out">;
|
|
57
|
+
moderation: z.ZodEnum<{
|
|
58
|
+
rejected: "rejected";
|
|
59
|
+
approved: "approved";
|
|
60
|
+
}>;
|
|
61
|
+
}, z.core.$loose>;
|
|
62
|
+
export type CellModerateAuditMetadata = z.infer<typeof CellModerateAuditMetadata>;
|
|
48
63
|
//# sourceMappingURL=cell_audit_metadata.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell_audit_metadata.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_audit_metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"cell_audit_metadata.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_audit_metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB;;;;iBAI5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB;;;;;;iBAMjC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE5E;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB;;;;;;;iBAIpC,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
|
|
@@ -21,7 +21,7 @@ import { Uuid } from '@fuzdev/fuz_util/id.ts';
|
|
|
21
21
|
export const CellAuditMetadata = z.looseObject({
|
|
22
22
|
cell_id: Uuid,
|
|
23
23
|
kind: z.string().optional(),
|
|
24
|
-
path: z.string().nullable().optional()
|
|
24
|
+
path: z.string().nullable().optional()
|
|
25
25
|
});
|
|
26
26
|
/**
|
|
27
27
|
* Metadata envelope for `cell_clone`.
|
|
@@ -42,5 +42,16 @@ export const CellCloneAuditMetadata = z.looseObject({
|
|
|
42
42
|
new_id: Uuid,
|
|
43
43
|
deep: z.boolean(),
|
|
44
44
|
item_count: z.number().int().nonnegative(),
|
|
45
|
-
kind: z.string().optional()
|
|
45
|
+
kind: z.string().optional()
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Metadata envelope for `cell_moderate`. `cell_id` is the moderated
|
|
49
|
+
* contribution; `root_id` is its governing root (the container whose
|
|
50
|
+
* moderation authority gated the call); `moderation` is the terminal decision
|
|
51
|
+
* applied (`'approved'` | `'rejected'`).
|
|
52
|
+
*/
|
|
53
|
+
export const CellModerateAuditMetadata = z.looseObject({
|
|
54
|
+
cell_id: Uuid,
|
|
55
|
+
root_id: Uuid,
|
|
56
|
+
moderation: z.enum(['approved', 'rejected'])
|
|
46
57
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell_authorize.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_authorize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"cell_authorize.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_authorize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AA+DhE;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,GACzB,MAAM,cAAc,GAAG,IAAI,EAC3B,MAAM,OAAO,EACb,QAAQ,aAAa,CAAC,YAAY,CAAC,GAAG,IAAI,KACxC,OAMF,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,GACzB,MAAM,cAAc,GAAG,IAAI,EAC3B,MAAM,OAAO,EACb,QAAQ,aAAa,CAAC,YAAY,CAAC,GAAG,IAAI,KACxC,OAUF,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM,cAAc,GAAG,IAAI,EAAE,MAAM,OAAO,KAAG,OAI5E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell_data_schema.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_data_schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"cell_data_schema.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_data_schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,eAAO,MAAM,QAAQ;;;iBAGnB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell_field_action_specs.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_field_action_specs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"cell_field_action_specs.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/cell_field_action_specs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,gFAAgF;AAChF,eAAO,MAAM,+CAA+C,EAC3D,2CAAoD,CAAC;AAItD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAA2B,CAAC;AAC9D,eAAO,MAAM,aAAa,yDAAiE,CAAC;AAC5F,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE1D,2EAA2E;AAC3E,eAAO,MAAM,SAAS;;;;;kBAKpB,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAIlD;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;kBAO5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,eAAO,MAAM,kBAAkB;;;;;;;kBAAuC,CAAC;AACvE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAIpE;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;kBAI/B,CAAC;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE,eAAO,MAAM,qBAAqB;;;kBAGhC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAI1E;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB;;;;;;kBAoB5B,CAAC;AACJ,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE,eAAO,MAAM,mBAAmB;;;;;;;kBAE9B,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAItE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;CAWF,CAAC;AAEtC,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;CAWL,CAAC;AAEtC,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;CAYH,CAAC;AAEtC,2EAA2E;AAC3E,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI9B,CAAC"}
|