matrx-orm 3.1.146__tar.gz → 3.1.148__tar.gz
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.
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/PKG-INFO +1 -1
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/__init__.py +2 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/expressions.py +1 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/session_context.py +53 -9
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/query/executor.py +43 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/pyproject.toml +1 -1
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_standalone_write_session_context.py +8 -2
- matrx_orm-3.1.148/tests/test_user_visible_lookup.py +52 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/.gitignore +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/AGENTS.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/BASE_CLASS_METHODS.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/CLAUDE.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/MODEL_API.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/database/orm/extended/managers/ai_model_base.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/docs/migrations.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/FEATURE.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/adapters/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/adapters/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/adapters/async_postgresql.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/adapters/base_adapter.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/adapters/postgresql.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/adapters/supabase_adapter.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/admin/FEATURE.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/admin/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/admin/router.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/api/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/api/auth.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/api/config.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/api/handlers.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/api/protocol.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/api/server.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/associations.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/cache_debug.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/catalog.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/catalog_sql.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/client/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/client/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/client/postgres_connection.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/client/postgrest.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/client/supabase_auth.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/client/supabase_config.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/client/supabase_manager.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/EXTENDED-TASK.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/FEATURE.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/TASKS.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/async_db_manager.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/base.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/config.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/connections.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/db_function.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/diagnostics.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/extended.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/fields.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/introspection.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/listen.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/loop_filters.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/model_dto.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/model_view.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/one_database.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/paginator.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/pool_maintenance.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/pool_watch.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/pooler_role.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/pydantic_bridge.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/registry.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/relations.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/resilience.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/rls_session.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/signals.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/tls.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/transaction.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/types.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/write_queue.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/core/write_retry.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/entity.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/error_handling.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/exceptions.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/extended/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/extended/app_error_handler.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/identity_rule.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/local_sqlite.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/middleware/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/middleware/base.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/migrations/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/migrations/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/migrations/cli.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/migrations/ddl.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/migrations/diff.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/migrations/executor.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/migrations/integration.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/migrations/loader.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/migrations/operations.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/migrations/state.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/migrations/table_filter.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/no_org_assignment.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/FEATURE.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/bulk_update_values.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/catalog_select.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/conflict.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/conflict_writes.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/create.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/db_functions.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/delete.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/dynamic_admin.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/dynamic_crud.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/graph_walk.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/latest_rows.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/queue_claim.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/read.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/relational_backfill.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/staging_load.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/operations/update.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/platform_access.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/platform_db.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/py.typed +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/pytest_plugin.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/python_sql/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/python_sql/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/python_sql/db_objects.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/query/FEATURE.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/query/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/query/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/query/builder.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/resources/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/resources/additional-assigners-2026-09-12.json +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/resources/org_assignment_trigger_baseline.json +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/FEATURE.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/code_handler.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/codegen_writer.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/columns.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/common.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/diff_preview.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/generator.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/package_wiring.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/relationships.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/runner.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/schema.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/schema_manager.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/tables.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/schema_builder/views.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/secrets_battery/FEATURE.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/secrets_battery/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/secrets_battery/attachments.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/secrets_battery/crypto.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/secrets_battery/host_authorization.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/secrets_battery/items.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/secrets_battery/model.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/secrets_battery/mutation_receipts.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/secrets_battery/org_service.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/secrets_battery/service.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/coalesce.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/dag.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/errors.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/fallback.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/flush.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/lifecycle.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/managed.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/op.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/reads.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/session.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/session/telemetry.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/sql_executor/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/sql_executor/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/sql_executor/executor.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/sql_executor/queries.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/sql_executor/registry.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/sql_executor/types.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/sql_executor/utils.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/state.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/utils/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/utils/sql_utils.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/matrx_orm/utils/type_converters.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/scripts/git-branches.sh +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/scripts/publish.sh +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/scripts/release.sh +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/conftest.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_adapter_registry.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_admin_db_columns.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_admin_response_rendering.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_admin_search_negation.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_admin_search_sentinels.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_advisory_lock.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_agent_message.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_api_auth.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_api_config.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_api_handlers.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_api_protocol.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_array_agg_order_by.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_associations.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_associations_wiring.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_bulk_hydration_offload.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_bulk_update_by_pk.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_cache_debug.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_call_function.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_case_when.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_catalog.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_committed_row_guard.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_composite_pk_filter.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_composite_pk_write_paths.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_config.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_conflict_target.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_conflict_writes.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_connection_codecs.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_connection_poison_guard.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_connection_primitives.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_count_composite_distinct.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_count_limit_param_leak.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_db_function_field.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_ddl_generator.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_deadlock_retry.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_derived_table.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_dirty_tracking.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_dynamic_crud.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_exceptions.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_execute_query_integrity_mapping.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_expression_primitives.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_fields.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_from_alias.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_fts.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_func_expression_args.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_graph_walk.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_having_annotate_alias.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_introspect_rls_policies.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_join_and_aggregate.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_latest_rows.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_listen_notify.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_local_sqlite.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_lock_contention_retry.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_managed_write_guard.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_matrx_entity.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_migration_diff_types.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_migration_loader.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_model_instance.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_model_meta.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_optimistic_concurrency.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_order_by_expression.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_org_assignment_inventory.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_parameter_name_hydration.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_patch_jsonb_path.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_persisted_count.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_pool_holder_census.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_pool_loop_recreation.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_pool_maintenance.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_postgrest_filters.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_pydantic_bridge.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_query_builder.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_query_error_detail.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_query_executor_sql.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_query_timeout.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_queue_claim.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_read_connection_retry.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_registry.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_registry_multi_database.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_registry_multi_schema.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_relational_backfill.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_relations.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_resilience.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_rls_session_scope.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_schema_exists.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_session_advisory_lock.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_state_cache.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_subquery_filter_raw.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_subquery_in_filter.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_subquery_nested_expressions.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_supabase_auth.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_supabase_config.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_tls.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_transaction_database_identity.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_typed_join_projection.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_typed_predicates.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_update_case_expression.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_update_subquery.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_update_with_rebase.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_upsert_default_leak.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_upsert_with_conflict.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_values_jsonb_decode.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_watched_lifecycle.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_write_queue_deadline.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_write_retry_semantics.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/MODULE_README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/conftest.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/test_bulk_ops.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/test_cache_integration.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/test_crud.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/test_foreign_keys.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/test_m2m.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/test_manager.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/test_migrations_live.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/test_query_execution.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/test_schema_diff.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level2/verify_committed_row_guard_pg17.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/live_pooler_role.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project/.env.example +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project/README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project/generate.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project/generated/.gitkeep +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project/matrx_orm.yaml +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project/test_schema_generation.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project_desktop/.env.example +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project_desktop/README.md +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project_desktop/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project_desktop/client_example.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project_desktop/client_example.ts +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project_desktop/client_supabase_example.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/sample_project_desktop/server.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/entity_tests.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_base_generation.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_composite_pk_fk_generation.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_composite_unique_generation.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_dto_identity_generation.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_entity_capability_generation.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_enum_ordering.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_generate_schema.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_junction_analysis.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_multi_schema_output.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_schema_analysis.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_sql_expression_defaults.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_table_relationships_query.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema/test_view_generation.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema_builder/test_array_default_parsing.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema_builder/test_focused_generation_plan.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/schema_builder/test_host_models_aggregator.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/__init__.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/conftest.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_cache_no_downgrade.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_capture_poison_proof.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_coalesce.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_dag.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_disk_spill_fallback.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_flush_individual_fallback.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_governed_write.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_managed.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_op_enqueue_site.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_reads.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_record_error_bounded_insert.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_record_error_storm.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_session.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/session/test_spill_guard_plugin.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_array_arg_element_type.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_database_name_alias.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_db_functions.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_dynamic_select_unregistered.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_immutable_insert_or_exact_verify.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_keyed_digest.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_model_cls_refactor.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_no_blocking_asyncpg_tls.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_one_database.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_order_by_desc_nulls_last.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_pooler_role_guard.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_secrets_battery.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_secrets_minting_keys.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_sql_param_casts.py +0 -0
- {matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/test_sync_twins_guard.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: matrx-orm
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.148
|
|
4
4
|
Summary: Async-first PostgreSQL ORM with bidirectional migrations, schema introspection, many-to-many relationships, and built-in state caching
|
|
5
5
|
Project-URL: Homepage, https://github.com/AI-Matrix-Engine/aidream-current
|
|
6
6
|
Project-URL: Repository, https://github.com/AI-Matrix-Engine/aidream-current
|
|
@@ -241,6 +241,7 @@ from .core.registry import (
|
|
|
241
241
|
from .core.relations import ManyToManyField
|
|
242
242
|
from .core.rls_session import rls_session
|
|
243
243
|
from .core.session_context import (
|
|
244
|
+
ACTOR_AGENT_GUC,
|
|
244
245
|
ACTOR_SYSTEM_GUC,
|
|
245
246
|
ACTOR_TIER_GUC,
|
|
246
247
|
VALID_TIERS,
|
|
@@ -654,6 +655,7 @@ __all__ = [
|
|
|
654
655
|
"acquire_connection",
|
|
655
656
|
"set_local_guc",
|
|
656
657
|
"SessionContextProvider",
|
|
658
|
+
"ACTOR_AGENT_GUC",
|
|
657
659
|
"ACTOR_SYSTEM_GUC",
|
|
658
660
|
"ACTOR_TIER_GUC",
|
|
659
661
|
"VALID_TIERS",
|
|
@@ -35,6 +35,7 @@ from contextlib import asynccontextmanager, contextmanager
|
|
|
35
35
|
from contextvars import ContextVar
|
|
36
36
|
from dataclasses import dataclass
|
|
37
37
|
from typing import Any, Literal
|
|
38
|
+
from uuid import UUID
|
|
38
39
|
|
|
39
40
|
logger = logging.getLogger("matrx_orm.core.session_context")
|
|
40
41
|
|
|
@@ -110,6 +111,12 @@ ActorTier = Literal["code", "ai", "human"]
|
|
|
110
111
|
|
|
111
112
|
ACTOR_TIER_GUC = "app.actor_tier"
|
|
112
113
|
ACTOR_SYSTEM_GUC = "app.actor_system"
|
|
114
|
+
# DD-211: WHICH AGENT, when an agent is the one writing. The database reads it
|
|
115
|
+
# through ``platform.declared_actor_agent()`` and names the ``agent`` rung when
|
|
116
|
+
# it resolves ``records.confirmation.agent_write_born_confirmed`` -- which is
|
|
117
|
+
# what makes a per-agent born-confirmed exception a real setting instead of a
|
|
118
|
+
# control that saves a value nothing honours.
|
|
119
|
+
ACTOR_AGENT_GUC = "app.actor_agent"
|
|
113
120
|
|
|
114
121
|
VALID_TIERS: frozenset[str] = frozenset({"code", "ai", "human"})
|
|
115
122
|
|
|
@@ -120,10 +127,25 @@ class ActorRef:
|
|
|
120
127
|
|
|
121
128
|
tier: ActorTier
|
|
122
129
|
system: str | None = None
|
|
130
|
+
#: The agent definition id, when the writer IS an agent (DD-211). A
|
|
131
|
+
#: person's write never carries one -- the database refuses the pair
|
|
132
|
+
#: ``tier="human"`` + an agent, because "a person did this" and "agent X
|
|
133
|
+
#: did this" are two different authors.
|
|
134
|
+
agent: str | None = None
|
|
123
135
|
|
|
124
136
|
def as_gucs(self) -> dict[str, str]:
|
|
125
|
-
"""The
|
|
126
|
-
|
|
137
|
+
"""The session GUCs this actor implies.
|
|
138
|
+
|
|
139
|
+
``app.actor_agent`` is always emitted, empty when no agent is writing:
|
|
140
|
+
the GUCs are transaction-local and a *stale* agent left over from an
|
|
141
|
+
outer declaration would attribute this block's writes to the wrong
|
|
142
|
+
agent. Empty is read as "no agent" by ``platform.declared_actor_agent``.
|
|
143
|
+
"""
|
|
144
|
+
return {
|
|
145
|
+
ACTOR_TIER_GUC: self.tier,
|
|
146
|
+
ACTOR_SYSTEM_GUC: self.system or "",
|
|
147
|
+
ACTOR_AGENT_GUC: self.agent or "",
|
|
148
|
+
}
|
|
127
149
|
|
|
128
150
|
|
|
129
151
|
_current_actor: ContextVar[ActorRef | None] = ContextVar("_provenance_actor", default=None)
|
|
@@ -154,16 +176,33 @@ def declared_actor_gucs() -> dict[str, str]:
|
|
|
154
176
|
return actor.as_gucs()
|
|
155
177
|
|
|
156
178
|
|
|
157
|
-
def _validated_actor(tier: str, system: str, *, caller: str) -> ActorRef:
|
|
179
|
+
def _validated_actor(tier: str, system: str, agent: str | None, *, caller: str) -> ActorRef:
|
|
158
180
|
if tier not in VALID_TIERS:
|
|
159
181
|
raise ValueError(f"{caller} tier must be one of {sorted(VALID_TIERS)}; got {tier!r}")
|
|
160
182
|
if not system or not system.strip():
|
|
161
183
|
raise ValueError(f"{caller} requires a non-empty system (who specifically)")
|
|
162
|
-
|
|
184
|
+
cleaned = (agent or "").strip() or None
|
|
185
|
+
if cleaned is not None:
|
|
186
|
+
if tier == "human":
|
|
187
|
+
# The database refuses this pair outright (23514). Refusing it here
|
|
188
|
+
# too means the door that made the mistake learns at the call site
|
|
189
|
+
# rather than on whichever write happens to land first.
|
|
190
|
+
raise ValueError(
|
|
191
|
+
f"{caller} was given tier='human' AND agent={cleaned!r}. A person's write carries "
|
|
192
|
+
"no agent: either the person is the author (drop the agent) or the agent is "
|
|
193
|
+
"(declare tier='ai' and the agent that is running)."
|
|
194
|
+
)
|
|
195
|
+
try:
|
|
196
|
+
UUID(cleaned)
|
|
197
|
+
except ValueError as exc:
|
|
198
|
+
raise ValueError(
|
|
199
|
+
f"{caller} agent must be the uuid of an agent.definition row; got {cleaned!r}"
|
|
200
|
+
) from exc
|
|
201
|
+
return ActorRef(tier=tier, system=system.strip(), agent=cleaned) # type: ignore[arg-type]
|
|
163
202
|
|
|
164
203
|
|
|
165
204
|
@contextmanager
|
|
166
|
-
def declaring_actor(tier: ActorTier, system: str) -> Iterator[ActorRef]:
|
|
205
|
+
def declaring_actor(tier: ActorTier, system: str, agent: str | None = None) -> Iterator[ActorRef]:
|
|
167
206
|
"""Synchronous form of :func:`declared_actor` - same ContextVar, no await.
|
|
168
207
|
|
|
169
208
|
A write door is often a plain function (``queue_message_create``), and the
|
|
@@ -173,7 +212,7 @@ def declaring_actor(tier: ActorTier, system: str) -> Iterator[ActorRef]:
|
|
|
173
212
|
(``matrx_orm.session.op``) and the flush re-declares it per row. Nothing
|
|
174
213
|
here touches a connection.
|
|
175
214
|
"""
|
|
176
|
-
actor = _validated_actor(tier, system, caller="declaring_actor")
|
|
215
|
+
actor = _validated_actor(tier, system, agent, caller="declaring_actor")
|
|
177
216
|
token = _current_actor.set(actor)
|
|
178
217
|
try:
|
|
179
218
|
yield actor
|
|
@@ -182,7 +221,9 @@ def declaring_actor(tier: ActorTier, system: str) -> Iterator[ActorRef]:
|
|
|
182
221
|
|
|
183
222
|
|
|
184
223
|
@asynccontextmanager
|
|
185
|
-
async def declared_actor(
|
|
224
|
+
async def declared_actor(
|
|
225
|
+
tier: ActorTier, system: str, agent: str | None = None
|
|
226
|
+
) -> AsyncIterator[ActorRef]:
|
|
186
227
|
"""Declare the actor for the block WITHOUT opening a transaction.
|
|
187
228
|
|
|
188
229
|
The declaration is a ContextVar, so the GUCs land when the work inside
|
|
@@ -195,9 +236,11 @@ async def declared_actor(tier: ActorTier, system: str) -> AsyncIterator[ActorRef
|
|
|
195
236
|
transaction, so a chokepoint that opened one would break every handler that
|
|
196
237
|
acts as the user.
|
|
197
238
|
"""
|
|
198
|
-
actor = _validated_actor(tier, system, caller="declared_actor")
|
|
239
|
+
actor = _validated_actor(tier, system, agent, caller="declared_actor")
|
|
199
240
|
token = _current_actor.set(actor)
|
|
200
|
-
logger.debug(
|
|
241
|
+
logger.debug(
|
|
242
|
+
"provenance: declared tier=%s system=%s agent=%s", actor.tier, actor.system, actor.agent
|
|
243
|
+
)
|
|
201
244
|
try:
|
|
202
245
|
yield actor
|
|
203
246
|
finally:
|
|
@@ -205,6 +248,7 @@ async def declared_actor(tier: ActorTier, system: str) -> AsyncIterator[ActorRef
|
|
|
205
248
|
|
|
206
249
|
|
|
207
250
|
__all__ = [
|
|
251
|
+
"ACTOR_AGENT_GUC",
|
|
208
252
|
"ACTOR_SYSTEM_GUC",
|
|
209
253
|
"ACTOR_TIER_GUC",
|
|
210
254
|
"VALID_TIERS",
|
|
@@ -32,6 +32,12 @@ _BULK_HYDRATION_THREAD_THRESHOLD = 200
|
|
|
32
32
|
|
|
33
33
|
_SKIP_PARAM = object()
|
|
34
34
|
|
|
35
|
+
# The path field family the `__user_visible` lookup is registered on. The lookup
|
|
36
|
+
# emits `files.is_user_visible_path(<column>)`, an IMMUTABLE predicate over a
|
|
37
|
+
# logical file path; applying it to any other column would test the wrong value,
|
|
38
|
+
# so the lookup raises instead.
|
|
39
|
+
_USER_VISIBLE_PATH_FIELDS = frozenset({"file_path", "folder_path"})
|
|
40
|
+
|
|
35
41
|
_PARAM_RE = re.compile(r"\$(\d+)")
|
|
36
42
|
# Plain SQL identifier — same trust model as conflict_writes._IDENT_RE. Used for
|
|
37
43
|
# the primary-key name interpolated into the pk-ordered locking sub-select.
|
|
@@ -351,6 +357,8 @@ class QueryExecutor:
|
|
|
351
357
|
"startswith",
|
|
352
358
|
"endswith",
|
|
353
359
|
"exclude",
|
|
360
|
+
# Path-family predicate lookup (see _USER_VISIBLE_PATH_FIELDS)
|
|
361
|
+
"user_visible",
|
|
354
362
|
# JSONB operators
|
|
355
363
|
"json_key",
|
|
356
364
|
"json_has_key",
|
|
@@ -444,6 +452,41 @@ class QueryExecutor:
|
|
|
444
452
|
return f"{field} LIKE {placeholder}", f"%{_escape_like(value)}"
|
|
445
453
|
if operator == "exclude":
|
|
446
454
|
return f"{field} != {placeholder}", value
|
|
455
|
+
if operator == "user_visible":
|
|
456
|
+
# `file_path__user_visible=True` -> files.is_user_visible_path(file_path) = $n
|
|
457
|
+
#
|
|
458
|
+
# ONE EXPRESSION, not merely one rule. Postgres's predicate-implication
|
|
459
|
+
# prover matches a partial index whose predicate contains a function call
|
|
460
|
+
# only against the SAME expression in the query: spelling the rule as
|
|
461
|
+
# `path NOT LIKE 'system-files/%' AND ...` does NOT imply
|
|
462
|
+
# `files.is_user_visible_path(path)`, so the index is lost (measured live
|
|
463
|
+
# 2026-09-13: cost 11,177 with Sort+Filter vs 13.83 Index Only Scan for
|
|
464
|
+
# the identical predicate spelled as the function call). This named lookup
|
|
465
|
+
# is how every consumer -- the change feed, the tree RPC and both partial
|
|
466
|
+
# index predicates -- spells one expression. It is NOT a raw-SQL escape
|
|
467
|
+
# hatch: matrx-orm deliberately has none, and the emitted call is fixed.
|
|
468
|
+
column = field.rsplit(".", 1)[-1].strip('"')
|
|
469
|
+
if column not in _USER_VISIBLE_PATH_FIELDS:
|
|
470
|
+
raise QueryError(
|
|
471
|
+
message=(
|
|
472
|
+
f"The `__user_visible` lookup is registered on the path field "
|
|
473
|
+
f"family {sorted(_USER_VISIBLE_PATH_FIELDS)} and cannot be applied "
|
|
474
|
+
f"to {column!r}: files.is_user_visible_path() takes a logical file "
|
|
475
|
+
f"path, so applying it to another column would silently test the "
|
|
476
|
+
f"wrong value."
|
|
477
|
+
),
|
|
478
|
+
details={"query": f"{field} __user_visible"},
|
|
479
|
+
)
|
|
480
|
+
if not isinstance(value, bool):
|
|
481
|
+
raise QueryError(
|
|
482
|
+
message=(
|
|
483
|
+
f"The `__user_visible` lookup is boolean-valued; got "
|
|
484
|
+
f"{type(value).__name__} ({value!r}). Pass True for user-visible "
|
|
485
|
+
f"rows or False for their complement."
|
|
486
|
+
),
|
|
487
|
+
details={"query": f"{field} __user_visible"},
|
|
488
|
+
)
|
|
489
|
+
return f"files.is_user_visible_path({field}) = {placeholder}", value
|
|
447
490
|
# JSONB operators
|
|
448
491
|
if operator == "json_key":
|
|
449
492
|
# value is either a bare key (non-null test) or (key, expected_value)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "matrx-orm"
|
|
3
|
-
version = "3.1.
|
|
3
|
+
version = "3.1.148"
|
|
4
4
|
description = "Async-first PostgreSQL ORM with bidirectional migrations, schema introspection, many-to-many relationships, and built-in state caching"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { text = "MIT" }
|
{matrx_orm-3.1.146 → matrx_orm-3.1.148}/tests/level1/test_standalone_write_session_context.py
RENAMED
|
@@ -79,7 +79,9 @@ async def test_declared_write_keeps_the_queue_and_lands_gucs_in_its_transaction(
|
|
|
79
79
|
(
|
|
80
80
|
"begin",
|
|
81
81
|
"test",
|
|
82
|
-
|
|
82
|
+
# DD-211: the agent is always emitted, empty when no agent is writing, so a
|
|
83
|
+
# nested declaration can never inherit an outer block's agent.
|
|
84
|
+
{"app.actor_tier": "ai", "app.actor_system": "tool:instance_create", "app.actor_agent": ""},
|
|
83
85
|
),
|
|
84
86
|
("write", "test", "INSERT INTO content_ir.kind_instance DEFAULT VALUES RETURNING id"),
|
|
85
87
|
("commit", "test"),
|
|
@@ -111,7 +113,11 @@ async def test_declared_write_without_a_queue_opens_its_own_transaction(monkeypa
|
|
|
111
113
|
configure_session_context(None)
|
|
112
114
|
|
|
113
115
|
assert rows == [{"id": 3}]
|
|
114
|
-
assert events[0] == (
|
|
116
|
+
assert events[0] == (
|
|
117
|
+
"begin",
|
|
118
|
+
"test",
|
|
119
|
+
{"app.actor_tier": "human", "app.actor_system": "user-1", "app.actor_agent": ""},
|
|
120
|
+
)
|
|
115
121
|
assert events[-1] == ("commit", "test")
|
|
116
122
|
|
|
117
123
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""The `__user_visible` path lookup (folder-sync SPEC-SERVER S25).
|
|
2
|
+
|
|
3
|
+
ONE EXPRESSION, not merely one rule: the change feed, `public.get_user_file_tree`
|
|
4
|
+
and both partial index predicates must spell the visibility rule as the identical
|
|
5
|
+
call `files.is_user_visible_path(<column>)`, because Postgres's predicate-implication
|
|
6
|
+
prover only matches an index predicate containing a function call against the same
|
|
7
|
+
expression. These tests pin the emitted SQL text, so a refactor that "simplifies" the
|
|
8
|
+
lookup into LIKE conjuncts fails here instead of silently losing the index.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import pytest
|
|
12
|
+
|
|
13
|
+
from matrx_orm.core.expressions import _parse_lookup_simple
|
|
14
|
+
from matrx_orm.exceptions import QueryError
|
|
15
|
+
from matrx_orm.query.executor import QueryExecutor
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_lookup_is_parsed_as_an_operator_not_a_column():
|
|
19
|
+
assert QueryExecutor._parse_lookup("file_path__user_visible") == ("file_path", "user_visible")
|
|
20
|
+
assert _parse_lookup_simple("file_path__user_visible") == ("file_path", "user_visible")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@pytest.mark.parametrize(
|
|
24
|
+
("field", "expected"),
|
|
25
|
+
[
|
|
26
|
+
("file_path", "files.is_user_visible_path(file_path) = $1"),
|
|
27
|
+
("files.files.file_path", "files.is_user_visible_path(files.files.file_path) = $1"),
|
|
28
|
+
("folder_path", "files.is_user_visible_path(folder_path) = $1"),
|
|
29
|
+
],
|
|
30
|
+
)
|
|
31
|
+
def test_emits_the_predicate_call_verbatim(field, expected):
|
|
32
|
+
sql, param = QueryExecutor._build_condition(field, "user_visible", True, 1)
|
|
33
|
+
assert sql == expected
|
|
34
|
+
assert param is True
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_false_is_the_complement_not_a_negated_spelling():
|
|
38
|
+
sql, param = QueryExecutor._build_condition("file_path", "user_visible", False, 7)
|
|
39
|
+
assert sql == "files.is_user_visible_path(file_path) = $7"
|
|
40
|
+
assert param is False
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_a_non_path_column_raises_instead_of_testing_the_wrong_value():
|
|
44
|
+
with pytest.raises(QueryError) as exc:
|
|
45
|
+
QueryExecutor._build_condition("files.files.file_name", "user_visible", True, 1)
|
|
46
|
+
assert "path field family" in str(exc.value)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_a_non_boolean_value_raises():
|
|
50
|
+
with pytest.raises(QueryError) as exc:
|
|
51
|
+
QueryExecutor._build_condition("file_path", "user_visible", "true", 1)
|
|
52
|
+
assert "boolean-valued" in str(exc.value)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|