@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
|
@@ -34,7 +34,7 @@ import '../assert_dev_env.js';
|
|
|
34
34
|
* @module
|
|
35
35
|
*/
|
|
36
36
|
import { describe, test, assert } from 'vitest';
|
|
37
|
-
import { actor_search_action_spec, ERROR_ACTOR_SEARCH_SCOPE_REQUIRED
|
|
37
|
+
import { actor_search_action_spec, ERROR_ACTOR_SEARCH_SCOPE_REQUIRED } from '../../auth/actor_search_action_specs.js';
|
|
38
38
|
import { SPINE_RPC_PATH } from './spine_surface_constants.js';
|
|
39
39
|
/** Nil UUID — an unheld scope id (no actor holds a role_grant on it). */
|
|
40
40
|
const NIL_UUID = '00000000-0000-0000-0000-000000000000';
|
|
@@ -49,7 +49,7 @@ export const describe_actor_search_cross_tests = (options) => {
|
|
|
49
49
|
const res = await fixture.fresh_transport()(rpc_path, {
|
|
50
50
|
method: 'POST',
|
|
51
51
|
headers: { 'content-type': 'application/json' },
|
|
52
|
-
body: search_envelope({ query: 'a' }, 'anon-search')
|
|
52
|
+
body: search_envelope({ query: 'a' }, 'anon-search')
|
|
53
53
|
});
|
|
54
54
|
assert.strictEqual(res.status, 401, 'unauthenticated actor_search must be refused');
|
|
55
55
|
});
|
|
@@ -59,7 +59,7 @@ export const describe_actor_search_cross_tests = (options) => {
|
|
|
59
59
|
const res = await fixture.fresh_transport()(rpc_path, {
|
|
60
60
|
method: 'POST',
|
|
61
61
|
headers: { ...account.create_session_headers(), 'content-type': 'application/json' },
|
|
62
|
-
body: search_envelope({ query: 'a' }, 'nonadmin-noscope')
|
|
62
|
+
body: search_envelope({ query: 'a' }, 'nonadmin-noscope')
|
|
63
63
|
});
|
|
64
64
|
assert.strictEqual(res.status, 400, 'non-admin unbounded search must be rejected');
|
|
65
65
|
const body = (await res.json());
|
|
@@ -71,7 +71,7 @@ export const describe_actor_search_cross_tests = (options) => {
|
|
|
71
71
|
const res = await fixture.fresh_transport()(rpc_path, {
|
|
72
72
|
method: 'POST',
|
|
73
73
|
headers: { ...account.create_session_headers(), 'content-type': 'application/json' },
|
|
74
|
-
body: search_envelope({ query: 'a', scope_ids: [NIL_UUID] }, 'nonadmin-scope')
|
|
74
|
+
body: search_envelope({ query: 'a', scope_ids: [NIL_UUID] }, 'nonadmin-scope')
|
|
75
75
|
});
|
|
76
76
|
assert.strictEqual(res.status, 200, 'non-admin with a scope filter is allowed');
|
|
77
77
|
const body = (await res.json());
|
|
@@ -82,7 +82,7 @@ export const describe_actor_search_cross_tests = (options) => {
|
|
|
82
82
|
const res = await fixture.transport(rpc_path, {
|
|
83
83
|
method: 'POST',
|
|
84
84
|
headers: { ...fixture.create_session_headers(), 'content-type': 'application/json' },
|
|
85
|
-
body: search_envelope({ query: 'a' }, 'admin-noscope')
|
|
85
|
+
body: search_envelope({ query: 'a' }, 'admin-noscope')
|
|
86
86
|
});
|
|
87
87
|
assert.strictEqual(res.status, 200, 'admin unbounded search is allowed');
|
|
88
88
|
const body = (await res.json());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app_settings.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/app_settings.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAsC9B,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"app_settings.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/app_settings.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAsC9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D,qFAAqF;AACrF,MAAM,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;AAiBnE,eAAO,MAAM,iCAAiC,GAAI,SAAS,2BAA2B,KAAG,IA8DxF,CAAC"}
|
|
@@ -43,7 +43,7 @@ const update_envelope = (open_signup, id) => JSON.stringify({
|
|
|
43
43
|
jsonrpc: '2.0',
|
|
44
44
|
method: app_settings_update_action_spec.method,
|
|
45
45
|
params: { open_signup },
|
|
46
|
-
id
|
|
46
|
+
id
|
|
47
47
|
});
|
|
48
48
|
export const describe_app_settings_cross_tests = (options) => {
|
|
49
49
|
const { setup_test } = options;
|
|
@@ -54,13 +54,13 @@ export const describe_app_settings_cross_tests = (options) => {
|
|
|
54
54
|
const enable = await fixture.transport(rpc_path, {
|
|
55
55
|
method: 'POST',
|
|
56
56
|
headers: { ...fixture.create_session_headers(), 'content-type': 'application/json' },
|
|
57
|
-
body: update_envelope(true, 'enable-open-signup')
|
|
57
|
+
body: update_envelope(true, 'enable-open-signup')
|
|
58
58
|
});
|
|
59
59
|
assert.strictEqual(enable.status, 200, 'admin app_settings_update must succeed');
|
|
60
60
|
const res = await fixture.fresh_transport()(SIGNUP_PATH, {
|
|
61
61
|
method: 'POST',
|
|
62
62
|
headers: { 'content-type': 'application/json' },
|
|
63
|
-
body: JSON.stringify({ username: 'open_signup_user', password: SIGNUP_PASSWORD })
|
|
63
|
+
body: JSON.stringify({ username: 'open_signup_user', password: SIGNUP_PASSWORD })
|
|
64
64
|
});
|
|
65
65
|
assert.strictEqual(res.status, 200, 'open signup must admit an anonymous account');
|
|
66
66
|
const body = (await res.json());
|
|
@@ -73,19 +73,19 @@ export const describe_app_settings_cross_tests = (options) => {
|
|
|
73
73
|
const enable = await fixture.transport(rpc_path, {
|
|
74
74
|
method: 'POST',
|
|
75
75
|
headers: { ...fixture.create_session_headers(), 'content-type': 'application/json' },
|
|
76
|
-
body: update_envelope(true, 'enable-before-disable')
|
|
76
|
+
body: update_envelope(true, 'enable-before-disable')
|
|
77
77
|
});
|
|
78
78
|
assert.strictEqual(enable.status, 200, 'admin app_settings_update (enable) must succeed');
|
|
79
79
|
const disable = await fixture.transport(rpc_path, {
|
|
80
80
|
method: 'POST',
|
|
81
81
|
headers: { ...fixture.create_session_headers(), 'content-type': 'application/json' },
|
|
82
|
-
body: update_envelope(false, 'disable-open-signup')
|
|
82
|
+
body: update_envelope(false, 'disable-open-signup')
|
|
83
83
|
});
|
|
84
84
|
assert.strictEqual(disable.status, 200, 'admin app_settings_update (disable) must succeed');
|
|
85
85
|
const res = await fixture.fresh_transport()(SIGNUP_PATH, {
|
|
86
86
|
method: 'POST',
|
|
87
87
|
headers: { 'content-type': 'application/json' },
|
|
88
|
-
body: JSON.stringify({ username: 'closed_signup_user', password: SIGNUP_PASSWORD })
|
|
88
|
+
body: JSON.stringify({ username: 'closed_signup_user', password: SIGNUP_PASSWORD })
|
|
89
89
|
});
|
|
90
90
|
assert.strictEqual(res.status, 403, 'closed signup must refuse a no-invite anonymous account');
|
|
91
91
|
const body = (await res.json());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend_config.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/backend_config.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"backend_config.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/backend_config.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D;;;;;;;;;;GAUG;AACH,MAAM,WAAW,sBAAsB;IACtC,qFAAqF;IACrF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC7B,sFAAsF;IACtF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,6DAA6D;IAC7D,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;CAC3C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bench_report.d.ts","sourceRoot":"../src/lib/","sources":["../../../../src/lib/testing/cross_backend/bench/bench_report.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAGjC,OAAO,EAEN,KAAK,mBAAmB,EACxB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"bench_report.d.ts","sourceRoot":"../src/lib/","sources":["../../../../src/lib/testing/cross_backend/bench/bench_report.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAGjC,OAAO,EAEN,KAAK,mBAAmB,EACxB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE;;;;;;GAMG;AAEH,sFAAsF;AACtF,eAAO,MAAM,0BAA0B,GAAI,QAAQ,oBAAoB,KAAG,MAM3D,CAAC;AAEhB,iFAAiF;AACjF,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAC;CACzC;AAED,MAAM,WAAW,uBAAuB;IACvC,wFAAwF;IACxF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC9B,QAAQ,oBAAoB,EAC5B,UAAU,uBAAuB,KAC/B,KAAK,CAAC,wBAAwB,CAoBhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,GACxC,SAAS,aAAa,CAAC,wBAAwB,CAAC,KAC9C,MAGU,CAAC;AAEd;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GAAI,QAAQ,oBAAoB,KAAG,MA4BpE,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import '../../assert_dev_env.js';
|
|
2
2
|
import { benchmark_format_markdown } from '@fuzdev/fuz_util/benchmark_format.ts';
|
|
3
|
-
import { benchmark_stats_compare
|
|
3
|
+
import { benchmark_stats_compare } from '@fuzdev/fuz_util/benchmark_stats.ts';
|
|
4
4
|
/**
|
|
5
5
|
* Reporting adapters over a `CrossImplBenchResult` — all built on fuz_util's
|
|
6
6
|
* formatters + Welch comparison. Markdown for human eyeballs, a per-scenario
|
|
@@ -36,7 +36,7 @@ export const compare_cross_impl = (result, options) => {
|
|
|
36
36
|
scenario,
|
|
37
37
|
reference,
|
|
38
38
|
backend: e.backend,
|
|
39
|
-
comparison: benchmark_stats_compare(ref_entry.result.stats, e.result.stats)
|
|
39
|
+
comparison: benchmark_stats_compare(ref_entry.result.stats, e.result.stats)
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -77,7 +77,7 @@ export const format_cross_impl_json = (result) => JSON.stringify({
|
|
|
77
77
|
std_dev_ns: e.result.stats.std_dev_ns,
|
|
78
78
|
ops_per_second: e.result.stats.ops_per_second,
|
|
79
79
|
outlier_ratio: e.result.stats.outlier_ratio,
|
|
80
|
-
sample_size: e.result.stats.sample_size
|
|
81
|
-
}
|
|
82
|
-
}))
|
|
80
|
+
sample_size: e.result.stats.sample_size
|
|
81
|
+
}
|
|
82
|
+
}))
|
|
83
83
|
}, null, 2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run_cross_impl_bench.d.ts","sourceRoot":"../src/lib/","sources":["../../../../src/lib/testing/cross_backend/bench/run_cross_impl_bench.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAGjC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"run_cross_impl_bench.d.ts","sourceRoot":"../src/lib/","sources":["../../../../src/lib/testing/cross_backend/bench/run_cross_impl_bench.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAE5F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAwB,MAAM,eAAe,CAAC;AAEzE;;;;;;;;;;;;GAYG;AAEH,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;CACjC;AAED,6DAA6D;AAC7D,MAAM,WAAW,oBAAoB;IACpC,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,uDAAuD;IACvD,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,wBAAwB;IACxC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,yBAAyB,CAAC,CAAC;IAC3D,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IACjD,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;CAC3C;AAeD,eAAO,MAAM,oBAAoB,GAChC,SAAS,wBAAwB,KAC/B,OAAO,CAAC,oBAAoB,CAwB9B,CAAC"}
|
|
@@ -10,7 +10,7 @@ const DEFAULT_BENCH_CONFIG = {
|
|
|
10
10
|
warmup_iterations: 20,
|
|
11
11
|
min_iterations: 100,
|
|
12
12
|
duration_ms: 3000,
|
|
13
|
-
cooldown_ms: 100
|
|
13
|
+
cooldown_ms: 100
|
|
14
14
|
};
|
|
15
15
|
export const run_cross_impl_bench = async (options) => {
|
|
16
16
|
const config = { ...DEFAULT_BENCH_CONFIG, ...options.config };
|
|
@@ -19,7 +19,7 @@ export const run_cross_impl_bench = async (options) => {
|
|
|
19
19
|
const ctx = {
|
|
20
20
|
transport: handle.keeper_transport,
|
|
21
21
|
rpc_path: handle.config.rpc_path,
|
|
22
|
-
capabilities: handle.config.capabilities
|
|
22
|
+
capabilities: handle.config.capabilities
|
|
23
23
|
};
|
|
24
24
|
for (const scenario of options.scenarios) {
|
|
25
25
|
if (scenario.requires && !scenario.requires(handle.config.capabilities))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario.d.ts","sourceRoot":"../src/lib/","sources":["../../../../src/lib/testing/cross_backend/bench/scenario.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAGjC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"scenario.d.ts","sourceRoot":"../src/lib/","sources":["../../../../src/lib/testing/cross_backend/bench/scenario.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACpC,2EAA2E;IAC3E,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;CAC3C;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC7B,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,mBAAmB,KAAK,OAAO,CAAC;IACnE,wDAAwD;IACxD,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D;AAcD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC,aAAa,CAIhE,CAAC"}
|
|
@@ -24,5 +24,5 @@ const rpc_scenario = (method, params) => async (ctx) => {
|
|
|
24
24
|
export const default_bench_scenarios = [
|
|
25
25
|
{ name: 'account_verify', run: rpc_scenario('account_verify') },
|
|
26
26
|
{ name: 'account_session_list', run: rpc_scenario('account_session_list') },
|
|
27
|
-
{ name: 'audit_log_list', run: rpc_scenario('audit_log_list', { limit: 20 }) }
|
|
27
|
+
{ name: 'audit_log_list', run: rpc_scenario('audit_log_list', { limit: 20 }) }
|
|
28
28
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body_size.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/body_size.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA6D9B,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"body_size.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/body_size.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA6D9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,wBAAwB,CAAC;AAmDhE,eAAO,MAAM,8BAA8B,GAAI,SAAS,wBAAwB,KAAG,IA0ClF,CAAC"}
|
|
@@ -104,7 +104,7 @@ export const describe_body_size_cross_tests = (options) => {
|
|
|
104
104
|
const post = (fixture, body) => fetch_retrying_once(fixture.transport, rpc_path, {
|
|
105
105
|
method: 'POST',
|
|
106
106
|
headers: { ...fixture.create_session_headers(), 'content-type': 'application/json' },
|
|
107
|
-
body
|
|
107
|
+
body
|
|
108
108
|
});
|
|
109
109
|
describe('body-size limit parity', () => {
|
|
110
110
|
test('over-limit POST (cap + 1) → 413 payload_too_large (refused before dispatch)', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap_backend.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/bootstrap_backend.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"bootstrap_backend.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/bootstrap_backend.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,GAC7B,QAAQ,aAAa,KACnB,OAAO,CAAC,yBAAyB,CAwBnC,CAAC"}
|
|
@@ -28,11 +28,11 @@ export const bootstrap_backend = async (config) => {
|
|
|
28
28
|
keeper_daemon_transport: create_fetch_transport({
|
|
29
29
|
base_url: config.base_url,
|
|
30
30
|
initial_cookies: keeper.cookies,
|
|
31
|
-
origin: null
|
|
31
|
+
origin: null
|
|
32
32
|
}),
|
|
33
33
|
keeper_account: keeper.account,
|
|
34
34
|
keeper_actor: keeper.actor,
|
|
35
|
-
keeper_cookies: keeper.cookies
|
|
35
|
+
keeper_cookies: keeper.cookies
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
38
|
catch (err) {
|
|
@@ -28,6 +28,6 @@ export const build_test_backend_paths = (prefix) => {
|
|
|
28
28
|
bootstrap_token_path: join(root, 'bootstrap_token'),
|
|
29
29
|
// `init_daemon_token` (Rust) and the TS server's daemon-token
|
|
30
30
|
// writer both land the token at `{root}/run/daemon_token`.
|
|
31
|
-
daemon_token_path: join(root, 'run', 'daemon_token')
|
|
31
|
+
daemon_token_path: join(root, 'run', 'daemon_token')
|
|
32
32
|
};
|
|
33
33
|
};
|
|
@@ -58,7 +58,7 @@ export const in_process_capabilities = Object.freeze({
|
|
|
58
58
|
peer_request: false,
|
|
59
59
|
// Cross-process-only: the test `CellCreateAuthorize` policy is mounted on the
|
|
60
60
|
// spine binaries' full mount + the Rust stub, not the in-process default app.
|
|
61
|
-
cell_gated_create: false
|
|
61
|
+
cell_gated_create: false
|
|
62
62
|
});
|
|
63
63
|
/**
|
|
64
64
|
* Shape notes for the in-process Hono transport — every wiring fact present
|
|
@@ -68,7 +68,7 @@ export const in_process_capabilities = Object.freeze({
|
|
|
68
68
|
export const in_process_shape_notes = Object.freeze({
|
|
69
69
|
bearer_auth: true,
|
|
70
70
|
trusted_proxy: true,
|
|
71
|
-
login_rate_limit: true
|
|
71
|
+
login_rate_limit: true
|
|
72
72
|
});
|
|
73
73
|
/**
|
|
74
74
|
* Conditional `test()` wrapper — registers a vitest case only when
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell_cross_helpers.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_cross_helpers.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAmB9B,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"cell_cross_helpers.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_cross_helpers.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAmB9B,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAEvE,qEAAqE;AACrE,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC9F;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAC1B,WAAW,cAAc,EACzB,MAAM,MAAM,EACZ,QAAQ,MAAM,EACd,QAAQ,OAAO,EACf,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,SAAS,CAMnB,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,YAAY,GAAI,GAAG,SAAS,KAAG,OAG/B,CAAC;AAEd;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,GAAG,SAAS,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAG,CAUrE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell_crud.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_crud.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA2D9B,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"cell_crud.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_crud.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA2D9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D,eAAO,MAAM,8BAA8B,GAAI,SAAS,wBAAwB,KAAG,IAsclF,CAAC"}
|
|
@@ -45,7 +45,7 @@ import '../assert_dev_env.js';
|
|
|
45
45
|
* @module
|
|
46
46
|
*/
|
|
47
47
|
import { describe, assert } from 'vitest';
|
|
48
|
-
import { CellCreateOutput, CellDeleteOutput, CellGetOutput, CellListOutput, CellUpdateOutput
|
|
48
|
+
import { CellCreateOutput, CellDeleteOutput, CellGetOutput, CellListOutput, CellUpdateOutput } from '../../auth/cell_action_specs.js';
|
|
49
49
|
import { test_if } from './capabilities.js';
|
|
50
50
|
import { cross_rpc_call, error_reason, expect_output } from './cell_cross_helpers.js';
|
|
51
51
|
import { SPINE_RPC_PATH } from './spine_surface_constants.js';
|
|
@@ -102,7 +102,10 @@ export const describe_cell_crud_cross_tests = (options) => {
|
|
|
102
102
|
const ref_b = `blake3:${'b'.repeat(64)}`;
|
|
103
103
|
const ref_c = `blake3:${'c'.repeat(64)}`;
|
|
104
104
|
const sorted = [ref_a, ref_b, ref_c];
|
|
105
|
-
const created = expect_output(await cross_rpc_call(t, rpc_path, 'cell_create', {
|
|
105
|
+
const created = expect_output(await cross_rpc_call(t, rpc_path, 'cell_create', {
|
|
106
|
+
kind: 'note',
|
|
107
|
+
data: { cover: ref_c, nested: { attachments: [ref_b, ref_a, ref_b] } }
|
|
108
|
+
}, owner_headers), CellCreateOutput);
|
|
106
109
|
assert.deepStrictEqual(created.cell.refs, sorted, 'create did not return sorted refs');
|
|
107
110
|
// Read it back — the stored column round-trips sorted too.
|
|
108
111
|
const got = expect_output(await cross_rpc_call(t, rpc_path, 'cell_get', { id: created.cell.id }, owner_headers), CellGetOutput);
|
|
@@ -1,4 +1,28 @@
|
|
|
1
1
|
import '../assert_dev_env.js';
|
|
2
2
|
import type { RpcPathCrossSuiteOptions } from './setup.js';
|
|
3
3
|
export declare const describe_cell_gated_create_cross_tests: (options: RpcPathCrossSuiteOptions) => void;
|
|
4
|
+
/**
|
|
5
|
+
* Cross-backend parity for the **`cell_moderate` verb** (the `pending →
|
|
6
|
+
* approved | rejected` transition) — root-authority-gated.
|
|
7
|
+
*
|
|
8
|
+
* Builds a moderated public space (admin) + a `participant`'s `post` (born
|
|
9
|
+
* `pending` + private under the `moderation_required: true` policy), then
|
|
10
|
+
* proves both spines agree:
|
|
11
|
+
*
|
|
12
|
+
* - **a root manager (admin) approves** → `moderation: 'approved'` +
|
|
13
|
+
* `visibility: 'public'` (the contribution goes live).
|
|
14
|
+
* - **the author cannot self-approve** → `403 cell_moderate_forbidden` (the
|
|
15
|
+
* author can *view* their own pending cell, so they reach the gate, and are
|
|
16
|
+
* denied — moderation authority is over the governing root, not the
|
|
17
|
+
* contribution).
|
|
18
|
+
* - **a non-viewer is 404-masked** → a stranger who can't see the pending
|
|
19
|
+
* contribution gets `cell_not_found`, never learns it exists.
|
|
20
|
+
* - **reject** → `moderation: 'rejected'`, visibility stays private.
|
|
21
|
+
*
|
|
22
|
+
* Gated on `capabilities.cell_gated_create` — a `pending` contribution only
|
|
23
|
+
* exists when the directory authorizer is mounted (reference spine binaries).
|
|
24
|
+
*
|
|
25
|
+
* `$lib`-free by contract (relative specifiers only).
|
|
26
|
+
*/
|
|
27
|
+
export declare const describe_cell_moderate_cross_tests: (options: RpcPathCrossSuiteOptions) => void;
|
|
4
28
|
//# sourceMappingURL=cell_gated_create.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell_gated_create.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_gated_create.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"cell_gated_create.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_gated_create.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAiD9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAkB3D,eAAO,MAAM,sCAAsC,GAAI,SAAS,wBAAwB,KAAG,IAwP1F,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,kCAAkC,GAAI,SAAS,wBAAwB,KAAG,IAwHtF,CAAC"}
|
|
@@ -1,25 +1,35 @@
|
|
|
1
1
|
import '../assert_dev_env.js';
|
|
2
2
|
/**
|
|
3
|
-
* Cross-backend parity suite for the **cell-creation authorizer**
|
|
4
|
-
* (`CellCreateAuthorize`).
|
|
3
|
+
* Cross-backend parity suite for the **parent-aware cell-creation authorizer**
|
|
4
|
+
* (`CellCreateAuthorize`) — the directory model.
|
|
5
5
|
*
|
|
6
6
|
* The authorizer adds no method, column, or wire shape, so the schema-snapshot
|
|
7
7
|
* and action-manifest parity gates are **blind** to a TS↔Rust authorizer
|
|
8
|
-
* divergence (the authorizer in the wrong phase, a different deny shape,
|
|
9
|
-
*
|
|
10
|
-
* one — proven *here in fuz_app*, against both reference
|
|
8
|
+
* divergence (the authorizer in the wrong phase, a different deny shape, the
|
|
9
|
+
* 404/403 split, the moderation outcome). This behavioral cross case is the
|
|
10
|
+
* only gate that catches one — proven *here in fuz_app*, against both reference
|
|
11
|
+
* spines.
|
|
11
12
|
*
|
|
12
|
-
* Both spines mount the same
|
|
13
|
-
*
|
|
14
|
-
* `TestCellGatedCreateAuthorize`):
|
|
15
|
-
* `
|
|
16
|
-
*
|
|
13
|
+
* Both spines mount the same directory-model policy (the TS spine binary via
|
|
14
|
+
* `create_test_cell_gated_create_authorize`, the Rust `testing_spine_stub` via
|
|
15
|
+
* `TestCellGatedCreateAuthorize`): admin bypasses; a non-admin creating a
|
|
16
|
+
* `kind: 'space'` **root** is denied (admin-only); a **contribution** under a
|
|
17
|
+
* space is gated by the space's `data.policy[kind] = {min_role, moderation_required}`,
|
|
18
|
+
* with the moderation outcome folded into the verdict; plain parentless creates
|
|
19
|
+
* stay open. The suite asserts all spines agree on:
|
|
17
20
|
*
|
|
18
|
-
* - **
|
|
19
|
-
*
|
|
20
|
-
* - **
|
|
21
|
-
*
|
|
22
|
-
* - **
|
|
21
|
+
* - **root-create admin-only** — a non-admin `space` root → **403**
|
|
22
|
+
* `cell_create_forbidden`; admin → succeeds.
|
|
23
|
+
* - **contribution gated by the root's policy** — under a public space, an
|
|
24
|
+
* unauthorized stranger → **403**; a `participant` → succeeds.
|
|
25
|
+
* - **moderation per `moderation_required`** — a `participant`'s `post`
|
|
26
|
+
* (`moderation_required: true`) is born `moderation: 'pending'` + private; a
|
|
27
|
+
* `react` (`moderation_required: false`) is born `moderation: 'approved'` at
|
|
28
|
+
* the author's visibility.
|
|
29
|
+
* - **404 on a hidden parent vs 403 on a visible one** — a contribution under a
|
|
30
|
+
* **private** space the caller can't view → **404** `cell_not_found` (the
|
|
31
|
+
* parent is masked); under a **public** space → **403** (you see it, you
|
|
32
|
+
* can't contribute).
|
|
23
33
|
*
|
|
24
34
|
* Gated on `capabilities.cell_gated_create` — `true` only on the reference
|
|
25
35
|
* spine binaries that mount the policy, so it skips for generic consumers and
|
|
@@ -31,41 +41,174 @@ import '../assert_dev_env.js';
|
|
|
31
41
|
* @module
|
|
32
42
|
*/
|
|
33
43
|
import { describe, assert } from 'vitest';
|
|
34
|
-
import { CellCreateOutput } from '../../auth/cell_action_specs.js';
|
|
44
|
+
import { CellCreateOutput, CellModerateOutput } from '../../auth/cell_action_specs.js';
|
|
35
45
|
import { test_if } from './capabilities.js';
|
|
36
46
|
import { cross_rpc_call, error_reason, expect_output } from './cell_cross_helpers.js';
|
|
37
47
|
import { SPINE_RPC_PATH } from './spine_surface_constants.js';
|
|
38
|
-
import {
|
|
48
|
+
import { SPACE_CELL_KIND, PARTICIPATION_ROLE } from './test_cell_gated_create_authorize.js';
|
|
49
|
+
/**
|
|
50
|
+
* A space `data.policy` mirroring the test ladder: gated `post` (moderated) +
|
|
51
|
+
* `react` (live) + `comment` (live). `comment` exists so the deep-case test can
|
|
52
|
+
* create a comment under a post (`root_id !== parent_id`) and prove the policy
|
|
53
|
+
* resolves from the governing root (the space), not the immediate parent.
|
|
54
|
+
*/
|
|
55
|
+
const SPACE_POLICY = {
|
|
56
|
+
policy: {
|
|
57
|
+
post: { min_role: PARTICIPATION_ROLE, moderation_required: true },
|
|
58
|
+
react: { min_role: PARTICIPATION_ROLE, moderation_required: false },
|
|
59
|
+
comment: { min_role: PARTICIPATION_ROLE, moderation_required: false }
|
|
60
|
+
}
|
|
61
|
+
};
|
|
39
62
|
export const describe_cell_gated_create_cross_tests = (options) => {
|
|
40
63
|
const { setup_test, capabilities } = options;
|
|
41
64
|
const rpc_path = options.rpc_path ?? SPINE_RPC_PATH;
|
|
42
|
-
describe('cell_gated_create authorizer parity', () => {
|
|
43
|
-
test_if(capabilities.cell_gated_create, 'a non-
|
|
65
|
+
describe('cell_gated_create authorizer parity (directory model)', () => {
|
|
66
|
+
test_if(capabilities.cell_gated_create, 'a non-admin is denied a `space` root (admin-only), admin succeeds', async () => {
|
|
44
67
|
const fixture = await setup_test();
|
|
45
|
-
const stranger = await fixture.create_account({ username: '
|
|
46
|
-
const denied = await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind:
|
|
47
|
-
assert.ok(!denied.ok, 'a non-
|
|
48
|
-
assert.strictEqual(error_reason(denied), '
|
|
68
|
+
const stranger = await fixture.create_account({ username: 'space_stranger' });
|
|
69
|
+
const denied = await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: SPACE_CELL_KIND, data: {} }, stranger.create_session_headers());
|
|
70
|
+
assert.ok(!denied.ok, 'a non-admin must not create a space root');
|
|
71
|
+
assert.strictEqual(error_reason(denied), 'cell_create_forbidden');
|
|
72
|
+
const space = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: SPACE_CELL_KIND, data: SPACE_POLICY, visibility: 'public' }, fixture.create_session_headers()), CellCreateOutput);
|
|
73
|
+
assert.strictEqual(space.cell.kind, SPACE_CELL_KIND, 'admin creates the space root');
|
|
74
|
+
assert.strictEqual(space.cell.parent_id, null, 'a root is parentless');
|
|
75
|
+
assert.strictEqual(space.cell.root_id, null, 'a root has no governing root');
|
|
76
|
+
assert.strictEqual(space.cell.moderation, null, 'a root carries no moderation marker even under a mounted authorizer (moderation is a contribution concept)');
|
|
49
77
|
});
|
|
50
|
-
test_if(capabilities.cell_gated_create, 'a
|
|
78
|
+
test_if(capabilities.cell_gated_create, 'a contribution under a public space: unauthorized → 403, participant → allowed', async () => {
|
|
51
79
|
const fixture = await setup_test();
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
80
|
+
const space = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: SPACE_CELL_KIND, data: SPACE_POLICY, visibility: 'public' }, fixture.create_session_headers()), CellCreateOutput);
|
|
81
|
+
// A non-participant sees the public space but can't contribute → 403.
|
|
82
|
+
const stranger = await fixture.create_account({ username: 'post_stranger' });
|
|
83
|
+
const forbidden = await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: 'post', data: {}, parent_id: space.cell.id }, stranger.create_session_headers());
|
|
84
|
+
assert.ok(!forbidden.ok, 'a non-participant must not post in the space');
|
|
85
|
+
assert.strictEqual(error_reason(forbidden), 'cell_create_forbidden');
|
|
86
|
+
// A participant may post; the contribution carries the directory edges.
|
|
87
|
+
const participant = await fixture.create_account({
|
|
88
|
+
username: 'post_participant',
|
|
89
|
+
roles: [PARTICIPATION_ROLE]
|
|
90
|
+
});
|
|
91
|
+
const post = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: 'post', data: {}, parent_id: space.cell.id }, participant.create_session_headers()), CellCreateOutput);
|
|
92
|
+
assert.strictEqual(post.cell.parent_id, space.cell.id, 'parent edge set');
|
|
93
|
+
assert.strictEqual(post.cell.root_id, space.cell.id, 'root resolved to the space');
|
|
55
94
|
});
|
|
56
|
-
test_if(capabilities.cell_gated_create, '
|
|
95
|
+
test_if(capabilities.cell_gated_create, 'moderation is set per `moderation_required` (post → pending+private, react → approved)', async () => {
|
|
57
96
|
const fixture = await setup_test();
|
|
97
|
+
const space = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: SPACE_CELL_KIND, data: SPACE_POLICY, visibility: 'public' }, fixture.create_session_headers()), CellCreateOutput);
|
|
58
98
|
const participant = await fixture.create_account({
|
|
59
|
-
username: '
|
|
60
|
-
roles: [
|
|
99
|
+
username: 'mod_participant',
|
|
100
|
+
roles: [PARTICIPATION_ROLE]
|
|
61
101
|
});
|
|
62
|
-
|
|
63
|
-
|
|
102
|
+
// `post` requires moderation → born pending + forced private.
|
|
103
|
+
const post = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: 'post', data: {}, parent_id: space.cell.id, visibility: 'public' }, participant.create_session_headers()), CellCreateOutput);
|
|
104
|
+
assert.strictEqual(post.cell.moderation, 'pending', 'gated post is born pending');
|
|
105
|
+
assert.strictEqual(post.cell.visibility, 'private', 'a pending contribution is forced private until approved');
|
|
106
|
+
// `react` does not require moderation → born approved at the author's visibility.
|
|
107
|
+
const react = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: 'react', data: {}, parent_id: space.cell.id, visibility: 'public' }, participant.create_session_headers()), CellCreateOutput);
|
|
108
|
+
assert.strictEqual(react.cell.moderation, 'approved', 'unmoderated kind is born approved');
|
|
109
|
+
assert.strictEqual(react.cell.visibility, 'public', "the author's visibility is honored");
|
|
110
|
+
});
|
|
111
|
+
test_if(capabilities.cell_gated_create, 'a contribution under a hidden (private) space is 404-masked (not 403)', async () => {
|
|
112
|
+
const fixture = await setup_test();
|
|
113
|
+
// A private space — only admin/owner can view it.
|
|
114
|
+
const space = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: SPACE_CELL_KIND, data: SPACE_POLICY, visibility: 'private' }, fixture.create_session_headers()), CellCreateOutput);
|
|
115
|
+
const stranger = await fixture.create_account({ username: 'hidden_stranger' });
|
|
116
|
+
const masked = await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: 'post', data: {}, parent_id: space.cell.id }, stranger.create_session_headers());
|
|
117
|
+
assert.ok(!masked.ok, 'a stranger must not contribute under a hidden space');
|
|
118
|
+
assert.strictEqual(error_reason(masked), 'cell_not_found', 'a hidden parent 404-masks the attempt (never reveals it exists)');
|
|
64
119
|
});
|
|
65
|
-
test_if(capabilities.cell_gated_create, '
|
|
120
|
+
test_if(capabilities.cell_gated_create, 'a deep contribution (comment under a post) resolves policy from the governing root, not the parent', async () => {
|
|
66
121
|
const fixture = await setup_test();
|
|
67
|
-
const
|
|
68
|
-
|
|
122
|
+
const space = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: SPACE_CELL_KIND, data: SPACE_POLICY, visibility: 'public' }, fixture.create_session_headers()), CellCreateOutput);
|
|
123
|
+
const participant = await fixture.create_account({
|
|
124
|
+
username: 'deep_participant',
|
|
125
|
+
roles: [PARTICIPATION_ROLE]
|
|
126
|
+
});
|
|
127
|
+
// A post lives directly under the space — the shallow case
|
|
128
|
+
// (`root_id === parent_id`), so the handler reuses the parent row as
|
|
129
|
+
// `root_data`. The post is gated `moderation_required: true`, so it's
|
|
130
|
+
// born pending + private; the author can still view their own pending
|
|
131
|
+
// cell, so it's a valid parent for the comment below.
|
|
132
|
+
const post = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: 'post', data: {}, parent_id: space.cell.id }, participant.create_session_headers()), CellCreateOutput);
|
|
133
|
+
assert.strictEqual(post.cell.root_id, space.cell.id, 'a post roots at the space');
|
|
134
|
+
// A comment lives under the post — the DEEP case. Here
|
|
135
|
+
// `root_id !== parent_id`, so the handler must read the governing
|
|
136
|
+
// root (the space) *through* the post (the separate in-tx root read),
|
|
137
|
+
// and the authorizer must resolve `policy.comment` from the SPACE's
|
|
138
|
+
// data, not the post's. This is the only case that exercises the
|
|
139
|
+
// deep-read branch on both spines.
|
|
140
|
+
const comment = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: 'comment', data: {}, parent_id: post.cell.id }, participant.create_session_headers()), CellCreateOutput);
|
|
141
|
+
assert.strictEqual(comment.cell.parent_id, post.cell.id, 'the immediate parent is the post');
|
|
142
|
+
assert.strictEqual(comment.cell.root_id, space.cell.id, 'the governing root resolves to the space (deep read through the post), not the post');
|
|
143
|
+
assert.strictEqual(comment.cell.moderation, 'approved', 'the comment policy (moderation_required: false) resolved from the space, not the post');
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Cross-backend parity for the **`cell_moderate` verb** (the `pending →
|
|
149
|
+
* approved | rejected` transition) — root-authority-gated.
|
|
150
|
+
*
|
|
151
|
+
* Builds a moderated public space (admin) + a `participant`'s `post` (born
|
|
152
|
+
* `pending` + private under the `moderation_required: true` policy), then
|
|
153
|
+
* proves both spines agree:
|
|
154
|
+
*
|
|
155
|
+
* - **a root manager (admin) approves** → `moderation: 'approved'` +
|
|
156
|
+
* `visibility: 'public'` (the contribution goes live).
|
|
157
|
+
* - **the author cannot self-approve** → `403 cell_moderate_forbidden` (the
|
|
158
|
+
* author can *view* their own pending cell, so they reach the gate, and are
|
|
159
|
+
* denied — moderation authority is over the governing root, not the
|
|
160
|
+
* contribution).
|
|
161
|
+
* - **a non-viewer is 404-masked** → a stranger who can't see the pending
|
|
162
|
+
* contribution gets `cell_not_found`, never learns it exists.
|
|
163
|
+
* - **reject** → `moderation: 'rejected'`, visibility stays private.
|
|
164
|
+
*
|
|
165
|
+
* Gated on `capabilities.cell_gated_create` — a `pending` contribution only
|
|
166
|
+
* exists when the directory authorizer is mounted (reference spine binaries).
|
|
167
|
+
*
|
|
168
|
+
* `$lib`-free by contract (relative specifiers only).
|
|
169
|
+
*/
|
|
170
|
+
export const describe_cell_moderate_cross_tests = (options) => {
|
|
171
|
+
const { setup_test, capabilities } = options;
|
|
172
|
+
const rpc_path = options.rpc_path ?? SPINE_RPC_PATH;
|
|
173
|
+
// Build an admin-owned public space (moderated `post` policy) + a
|
|
174
|
+
// participant's pending post under it.
|
|
175
|
+
const setup_pending_post = async () => {
|
|
176
|
+
const fixture = await setup_test();
|
|
177
|
+
const space = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: SPACE_CELL_KIND, data: SPACE_POLICY, visibility: 'public' }, fixture.create_session_headers()), CellCreateOutput);
|
|
178
|
+
const author = await fixture.create_account({
|
|
179
|
+
username: 'moderate_author',
|
|
180
|
+
roles: [PARTICIPATION_ROLE]
|
|
181
|
+
});
|
|
182
|
+
const post = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_create', { kind: 'post', data: {}, parent_id: space.cell.id }, author.create_session_headers()), CellCreateOutput);
|
|
183
|
+
return { fixture, author, post };
|
|
184
|
+
};
|
|
185
|
+
describe('cell_moderate verb parity (root-authority-gated)', () => {
|
|
186
|
+
test_if(capabilities.cell_gated_create, 'a root manager (admin) approves a pending post → approved + public', async () => {
|
|
187
|
+
const { fixture, post } = await setup_pending_post();
|
|
188
|
+
assert.strictEqual(post.cell.moderation, 'pending', 'the post is born pending');
|
|
189
|
+
const moderated = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_moderate', { cell_id: post.cell.id, moderation: 'approved' }, fixture.create_session_headers() // keeper = admin = root manager
|
|
190
|
+
), CellModerateOutput);
|
|
191
|
+
assert.strictEqual(moderated.cell.moderation, 'approved', 'approval sets the marker');
|
|
192
|
+
assert.strictEqual(moderated.cell.visibility, 'public', 'approval publishes the post');
|
|
193
|
+
});
|
|
194
|
+
test_if(capabilities.cell_gated_create, 'the author (non-manager) cannot moderate their own pending post → 403', async () => {
|
|
195
|
+
const { fixture, author, post } = await setup_pending_post();
|
|
196
|
+
const denied = await cross_rpc_call(fixture.transport, rpc_path, 'cell_moderate', { cell_id: post.cell.id, moderation: 'approved' }, author.create_session_headers());
|
|
197
|
+
assert.ok(!denied.ok, 'the author must not self-approve');
|
|
198
|
+
assert.strictEqual(error_reason(denied), 'cell_moderate_forbidden');
|
|
199
|
+
});
|
|
200
|
+
test_if(capabilities.cell_gated_create, 'a non-viewer is 404-masked from moderating a pending post', async () => {
|
|
201
|
+
const { fixture, post } = await setup_pending_post();
|
|
202
|
+
const stranger = await fixture.create_account({ username: 'moderate_stranger' });
|
|
203
|
+
const masked = await cross_rpc_call(fixture.transport, rpc_path, 'cell_moderate', { cell_id: post.cell.id, moderation: 'approved' }, stranger.create_session_headers());
|
|
204
|
+
assert.ok(!masked.ok, 'a non-viewer must not moderate');
|
|
205
|
+
assert.strictEqual(error_reason(masked), 'cell_not_found', 'a non-viewer never learns the pending post exists');
|
|
206
|
+
});
|
|
207
|
+
test_if(capabilities.cell_gated_create, 'a root manager rejects a pending post → rejected, stays private', async () => {
|
|
208
|
+
const { fixture, post } = await setup_pending_post();
|
|
209
|
+
const moderated = expect_output(await cross_rpc_call(fixture.transport, rpc_path, 'cell_moderate', { cell_id: post.cell.id, moderation: 'rejected' }, fixture.create_session_headers()), CellModerateOutput);
|
|
210
|
+
assert.strictEqual(moderated.cell.moderation, 'rejected', 'rejection sets the marker');
|
|
211
|
+
assert.strictEqual(moderated.cell.visibility, 'private', 'rejection leaves the post private');
|
|
69
212
|
});
|
|
70
213
|
});
|
|
71
214
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell_grant_role.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_grant_role.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA8C9B,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"cell_grant_role.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cell_grant_role.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA8C9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAG3D,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,gBAAyB,CAAC;AAEvD,oFAAoF;AACpF,eAAO,MAAM,yBAAyB,qBAAqB,CAAC;AAK5D,eAAO,MAAM,oCAAoC,GAAI,SAAS,wBAAwB,KAAG,IAuIxF,CAAC"}
|
|
@@ -35,7 +35,7 @@ import '../assert_dev_env.js';
|
|
|
35
35
|
*/
|
|
36
36
|
import { describe, assert } from 'vitest';
|
|
37
37
|
import { CellCreateOutput, CellGetOutput, CellUpdateOutput } from '../../auth/cell_action_specs.js';
|
|
38
|
-
import { CellGrantCreateOutput, ERROR_CELL_GRANT_UNKNOWN_ROLE
|
|
38
|
+
import { CellGrantCreateOutput, ERROR_CELL_GRANT_UNKNOWN_ROLE } from '../../auth/cell_grant_action_specs.js';
|
|
39
39
|
import { test_if } from './capabilities.js';
|
|
40
40
|
import { cross_rpc_call, error_reason, expect_output } from './cell_cross_helpers.js';
|
|
41
41
|
import { SPINE_CELL_EDITOR_ROLE, SPINE_RPC_PATH } from './spine_surface_constants.js';
|
|
@@ -80,7 +80,7 @@ export const describe_cell_grant_role_cross_tests = (options) => {
|
|
|
80
80
|
const denied = await cross_rpc_call(t, rpc_path, 'cell_grant_create', {
|
|
81
81
|
cell_id: created.cell.id,
|
|
82
82
|
level: 'viewer',
|
|
83
|
-
principal: { kind: 'role', role: UNREGISTERED_ROLE }
|
|
83
|
+
principal: { kind: 'role', role: UNREGISTERED_ROLE }
|
|
84
84
|
}, owner_h);
|
|
85
85
|
assert.ok(!denied.ok, 'granting an unregistered role must fail');
|
|
86
86
|
assert.strictEqual(error_reason(denied), ERROR_CELL_GRANT_UNKNOWN_ROLE);
|