matrx-orm 3.1.164__tar.gz → 3.1.166__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.164 → matrx_orm-3.1.166}/PKG-INFO +1 -1
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/__init__.py +2 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/FEATURE.md +5 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/pool_watch.py +56 -2
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/secrets_battery/FEATURE.md +16 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/secrets_battery/__init__.py +2 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/secrets_battery/attachments.py +66 -3
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/secrets_battery/host_authorization.py +14 -1
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/secrets_battery/items.py +111 -12
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/secrets_battery/org_service.py +72 -7
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/secrets_battery/service.py +24 -3
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/pyproject.toml +1 -1
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_pool_holder_census.py +29 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_relational_backfill.py +5 -0
- matrx_orm-3.1.166/tests/test_secret_audit_names_its_organization.py +155 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_secrets_battery.py +31 -7
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_secrets_minting_keys.py +20 -5
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/.gitignore +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/AGENTS.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/BASE_CLASS_METHODS.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/CLAUDE.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/MODEL_API.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/database/orm/extended/managers/ai_model_base.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/docs/migrations.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/FEATURE.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/adapters/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/adapters/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/adapters/async_postgresql.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/adapters/base_adapter.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/adapters/postgrest_client_adapter.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/adapters/supabase_adapter.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/admin/FEATURE.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/admin/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/admin/router.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/api/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/api/auth.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/api/config.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/api/handlers.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/api/protocol.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/api/server.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/associations.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/cache_debug.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/catalog.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/catalog_sql.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/client/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/client/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/client/postgres_connection.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/client/postgrest.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/client/supabase_auth.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/client/supabase_config.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/client/supabase_manager.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/EXTENDED-TASK.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/RELATIONS-TASKS.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/TASKS.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/async_db_manager.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/base.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/config.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/connections.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/db_function.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/diagnostics.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/expressions.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/extended.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/fields.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/introspection.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/listen.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/loop_filters.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/model_dto.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/model_view.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/one_database.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/paginator.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/pool_maintenance.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/pooler_role.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/pydantic_bridge.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/registry.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/relations.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/resilience.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/rls_session.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/session_context.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/signals.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/tls.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/transaction.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/types.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/write_queue.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/core/write_retry.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/entity.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/error_handling.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/exceptions.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/extended/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/extended/app_error_handler.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/identity_rule.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/local_sqlite.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/middleware/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/middleware/base.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/migrations/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/migrations/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/migrations/cli.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/migrations/ddl.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/migrations/diff.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/migrations/executor.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/migrations/integration.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/migrations/loader.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/migrations/operations.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/migrations/state.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/migrations/table_filter.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/no_org_assignment.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/FEATURE.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/bulk_update_values.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/catalog_select.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/conflict.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/conflict_writes.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/create.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/db_functions.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/delete.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/dynamic_admin.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/dynamic_crud.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/graph_walk.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/latest_rows.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/queue_claim.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/read.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/relational_backfill.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/staging_load.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/operations/update.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/platform_access.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/platform_db.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/py.typed +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/pytest_lock_guard.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/pytest_plugin.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/python_sql/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/python_sql/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/python_sql/db_objects.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/python_sql/table_detailed_relationships.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/python_sql/table_typescript_relationship.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/query/FEATURE.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/query/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/query/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/query/builder.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/query/executor.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/resources/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/resources/additional-assigners-2026-09-12.json +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/resources/org_assignment_trigger_baseline.json +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/FEATURE.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/code_handler.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/codegen_writer.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/columns.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/common.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/diff_preview.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/entity_capabilities.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/generator.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/helpers/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/helpers/base_generators.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/helpers/entity_generators.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/helpers/git_checker.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/package_wiring.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/relationships.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/runner.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/schema.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/schema_manager.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/tables.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/schema_builder/views.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/secrets_battery/crypto.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/secrets_battery/model.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/secrets_battery/mutation_receipts.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/coalesce.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/dag.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/errors.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/fallback.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/flush.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/lifecycle.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/managed.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/op.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/reads.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/session.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/session/telemetry.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/sql_executor/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/sql_executor/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/sql_executor/executor.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/sql_executor/queries.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/sql_executor/registry.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/sql_executor/types.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/sql_executor/utils.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/state.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/utils/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/utils/sql_utils.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/utils/type_converters.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/matrx_orm/write_actor.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/scripts/git-branches.sh +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/scripts/publish.sh +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/scripts/release.sh +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/conftest.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_adapter_registry.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_admin_db_columns.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_admin_response_rendering.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_admin_search_negation.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_admin_search_sentinels.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_advisory_lock.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_agent_message.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_api_auth.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_api_config.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_api_handlers.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_api_protocol.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_array_agg_order_by.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_associations.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_associations_wiring.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_bulk_hydration_offload.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_bulk_update_by_pk.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_bulk_upsert_increment_set_fields.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_cache_debug.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_call_function.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_case_when.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_catalog.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_committed_row_guard.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_composite_pk_filter.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_composite_pk_write_paths.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_config.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_conflict_target.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_conflict_writes.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_connection_codecs.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_connection_poison_guard.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_connection_primitives.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_count_composite_distinct.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_count_limit_param_leak.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_db_function_field.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_ddl_generator.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_deadlock_retry.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_derived_table.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_dirty_tracking.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_dynamic_crud.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_exceptions.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_execute_query_integrity_mapping.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_expression_primitives.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_fields.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_filter_jsonb_agg_array_index.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_from_alias.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_fts.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_func_expression_args.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_graph_walk.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_having_annotate_alias.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_insert_ignore_and_admin_primitives.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_introspect_rls_policies.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_join_and_aggregate.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_latest_rows.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_listen_notify.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_local_sqlite.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_lock_contention_retry.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_managed_write_guard.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_matrx_entity.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_migration_diff_types.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_migration_loader.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_model_instance.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_model_meta.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_optimistic_concurrency.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_order_by_expression.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_org_assignment_inventory.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_orm_banners_are_client_safe.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_parameter_name_hydration.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_patch_jsonb_path.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_persisted_count.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_pool_loop_recreation.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_pool_maintenance.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_postgrest_filters.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_pydantic_bridge.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_query_builder.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_query_error_detail.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_query_executor_sql.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_query_timeout.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_querybuilder_clone_semantics.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_queue_claim.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_read_connection_retry.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_registry.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_registry_multi_database.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_registry_multi_schema.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_relations.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_resilience.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_rls_session_scope.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_schema_exists.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_session_advisory_lock.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_standalone_write_session_context.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_state_cache.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_subquery_filter_raw.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_subquery_in_filter.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_subquery_nested_expressions.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_supabase_auth.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_supabase_config.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_tls.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_transaction_database_identity.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_typed_join_projection.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_typed_predicates.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_update_case_expression.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_update_subquery.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_update_with_rebase.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_upsert_default_leak.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_upsert_with_conflict.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_values_jsonb_decode.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_watched_lifecycle.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_write_queue_deadline.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level1/test_write_retry_semantics.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/MODULE_README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/conftest.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/test_bulk_ops.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/test_cache_integration.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/test_crud.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/test_foreign_keys.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/test_m2m.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/test_manager.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/test_migrations_live.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/test_query_execution.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/test_schema_diff.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/level2/verify_committed_row_guard_pg17.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/live_pooler_role.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project/.env.example +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project/README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project/generate.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project/generated/.gitkeep +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project/matrx_orm.yaml +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project/test_schema_generation.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project_desktop/.env.example +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project_desktop/README.md +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project_desktop/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project_desktop/client_example.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project_desktop/client_example.ts +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project_desktop/client_supabase_example.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/sample_project_desktop/server.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/entity_tests.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_base_generation.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_composite_pk_fk_generation.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_composite_unique_generation.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_dto_identity_generation.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_entity_capability_generation.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_enum_ordering.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_generate_schema.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_junction_analysis.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_multi_schema_output.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_schema_analysis.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_sql_expression_defaults.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_table_relationships_query.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema/test_view_generation.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema_builder/test_array_default_parsing.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema_builder/test_focused_generation_plan.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/schema_builder/test_host_models_aggregator.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/__init__.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/conftest.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_cache_no_downgrade.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_capture_poison_proof.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_coalesce.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_dag.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_disk_spill_fallback.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_flush_individual_fallback.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_governed_write.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_managed.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_op_enqueue_site.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_reads.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_record_error_bounded_insert.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_record_error_storm.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_session.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/session/test_spill_guard_plugin.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_array_arg_element_type.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_database_name_alias.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_db_functions.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_dynamic_select_unregistered.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_immutable_insert_or_exact_verify.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_keyed_digest.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_model_cls_refactor.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_no_blocking_asyncpg_tls.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_one_database.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_order_by_desc_nulls_last.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_pooler_role_guard.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_shared_lock_guard.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_sql_param_casts.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_sync_twins_guard.py +0 -0
- {matrx_orm-3.1.164 → matrx_orm-3.1.166}/tests/test_user_visible_lookup.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.166
|
|
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
|
|
@@ -226,6 +226,7 @@ from .core.pydantic_bridge import (
|
|
|
226
226
|
model_json_schema,
|
|
227
227
|
)
|
|
228
228
|
from .core.pool_watch import (
|
|
229
|
+
PoolHolderProvenance,
|
|
229
230
|
PoolHolderSnapshot,
|
|
230
231
|
PoolSaturationEvent,
|
|
231
232
|
connection_holder_census,
|
|
@@ -657,6 +658,7 @@ __all__ = [
|
|
|
657
658
|
"Paginator",
|
|
658
659
|
"Page",
|
|
659
660
|
# ── Pool saturation observability ───────────────────────────────────────────
|
|
661
|
+
"PoolHolderProvenance",
|
|
660
662
|
"PoolHolderSnapshot",
|
|
661
663
|
"PoolSaturationEvent",
|
|
662
664
|
"connection_holder_census",
|
|
@@ -186,6 +186,11 @@ and invokes host sinks; subsequent retry timeouts do not spam another incident.
|
|
|
186
186
|
Once a release returns an idle slot, the alarm re-arms. The final
|
|
187
187
|
`PoolAcquireTimeoutError.details` carries both the first snapshot and the current
|
|
188
188
|
census, so retry/persistence casualties preserve the diagnosis.
|
|
189
|
+
The census also carries only identifier-validated request provenance from the
|
|
190
|
+
host-injected context (`request_id`, source/execution labels). It deliberately
|
|
191
|
+
excludes route text, users, arguments, SQL, and arbitrary metadata, so an opaque
|
|
192
|
+
ORM operation can be tied to its producer without turning the saturation sink
|
|
193
|
+
into a request-payload recorder.
|
|
189
194
|
|
|
190
195
|
**Release is bounded and cancellation-safe.** Return/reset runs in a dedicated,
|
|
191
196
|
shielded task with a 10-second asyncpg release timeout. A holder remains visible
|
|
@@ -2,6 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import logging
|
|
5
|
+
import re
|
|
5
6
|
import time
|
|
6
7
|
import traceback
|
|
7
8
|
from collections.abc import AsyncIterator, Callable
|
|
@@ -10,14 +11,41 @@ from dataclasses import dataclass
|
|
|
10
11
|
from datetime import UTC, datetime
|
|
11
12
|
from typing import Any, Literal
|
|
12
13
|
|
|
13
|
-
from pydantic import BaseModel, ConfigDict
|
|
14
|
+
from pydantic import BaseModel, ConfigDict, field_validator
|
|
14
15
|
|
|
15
|
-
from matrx_utils import vcprint
|
|
16
|
+
from matrx_utils import get_active_context, vcprint
|
|
16
17
|
|
|
17
18
|
logger = logging.getLogger("matrx_orm.pool_watch")
|
|
18
19
|
|
|
19
20
|
_STACK_LIMIT = 24
|
|
20
21
|
_DISPLAY_STACK_LIMIT = 8
|
|
22
|
+
_PROVENANCE_TEXT = re.compile(r"^[A-Za-z0-9_.:/-]{1,128}$")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class PoolHolderProvenance(BaseModel):
|
|
26
|
+
"""Bounded, request-scoped producer identity safe for durable capture."""
|
|
27
|
+
|
|
28
|
+
model_config = ConfigDict(extra="forbid", frozen=True)
|
|
29
|
+
|
|
30
|
+
request_id: str | None = None
|
|
31
|
+
source_app: str | None = None
|
|
32
|
+
source_feature: str | None = None
|
|
33
|
+
origin_class: str | None = None
|
|
34
|
+
execution_kind: str | None = None
|
|
35
|
+
execution_id: str | None = None
|
|
36
|
+
|
|
37
|
+
@field_validator(
|
|
38
|
+
"request_id",
|
|
39
|
+
"source_app",
|
|
40
|
+
"source_feature",
|
|
41
|
+
"origin_class",
|
|
42
|
+
"execution_kind",
|
|
43
|
+
"execution_id",
|
|
44
|
+
mode="before",
|
|
45
|
+
)
|
|
46
|
+
@classmethod
|
|
47
|
+
def _only_bounded_identifiers(cls, value: Any) -> str | None:
|
|
48
|
+
return value if isinstance(value, str) and _PROVENANCE_TEXT.fullmatch(value) else None
|
|
21
49
|
|
|
22
50
|
|
|
23
51
|
class PoolHolderSnapshot(BaseModel):
|
|
@@ -32,6 +60,7 @@ class PoolHolderSnapshot(BaseModel):
|
|
|
32
60
|
acquired_at: datetime
|
|
33
61
|
checkout_site: str
|
|
34
62
|
checkout_stack: tuple[str, ...]
|
|
63
|
+
provenance: PoolHolderProvenance = PoolHolderProvenance()
|
|
35
64
|
current_site: str | None
|
|
36
65
|
current_stack: tuple[str, ...]
|
|
37
66
|
task_done: bool
|
|
@@ -68,6 +97,7 @@ class _TrackedHolder:
|
|
|
68
97
|
acquired_at: datetime
|
|
69
98
|
checkout_site: str
|
|
70
99
|
checkout_stack: tuple[str, ...]
|
|
100
|
+
provenance: PoolHolderProvenance
|
|
71
101
|
state: Literal["held", "releasing"] = "held"
|
|
72
102
|
|
|
73
103
|
|
|
@@ -105,6 +135,26 @@ def _capture_checkout_stack() -> tuple[str, tuple[str, ...]]:
|
|
|
105
135
|
return site, formatted
|
|
106
136
|
|
|
107
137
|
|
|
138
|
+
def _safe_provenance_text(value: Any) -> str | None:
|
|
139
|
+
"""Keep only bounded identifier vocabulary; never persist context payloads."""
|
|
140
|
+
return value if isinstance(value, str) and _PROVENANCE_TEXT.fullmatch(value) else None
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _capture_provenance() -> PoolHolderProvenance:
|
|
144
|
+
"""Project host request context without coupling this package to that host."""
|
|
145
|
+
context = get_active_context()
|
|
146
|
+
if context is None:
|
|
147
|
+
return PoolHolderProvenance()
|
|
148
|
+
return PoolHolderProvenance(
|
|
149
|
+
request_id=_safe_provenance_text(getattr(context, "request_id", None)),
|
|
150
|
+
source_app=_safe_provenance_text(getattr(context, "source_app", None)),
|
|
151
|
+
source_feature=_safe_provenance_text(getattr(context, "source_feature", None)),
|
|
152
|
+
origin_class=_safe_provenance_text(getattr(context, "origin_class", None)),
|
|
153
|
+
execution_kind=_safe_provenance_text(getattr(context, "execution_kind", None)),
|
|
154
|
+
execution_id=_safe_provenance_text(getattr(context, "execution_id", None)),
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
|
|
108
158
|
def _task_stack(task: asyncio.Task[Any]) -> tuple[str | None, tuple[str, ...]]:
|
|
109
159
|
try:
|
|
110
160
|
frames = task.get_stack(limit=_DISPLAY_STACK_LIMIT)
|
|
@@ -122,6 +172,7 @@ def track_connection_holder(config_name: str, connection: Any) -> None:
|
|
|
122
172
|
if task is None:
|
|
123
173
|
return
|
|
124
174
|
checkout_site, checkout_stack = _capture_checkout_stack()
|
|
175
|
+
provenance = _capture_provenance()
|
|
125
176
|
tracked = _TrackedHolder(
|
|
126
177
|
config_name=config_name,
|
|
127
178
|
connection=connection,
|
|
@@ -130,6 +181,7 @@ def track_connection_holder(config_name: str, connection: Any) -> None:
|
|
|
130
181
|
acquired_at=datetime.now(UTC),
|
|
131
182
|
checkout_site=checkout_site,
|
|
132
183
|
checkout_stack=checkout_stack,
|
|
184
|
+
provenance=provenance,
|
|
133
185
|
)
|
|
134
186
|
_holders.setdefault(config_name, {})[id(connection)] = tracked
|
|
135
187
|
|
|
@@ -166,6 +218,7 @@ def connection_holder_census(config_name: str) -> tuple[PoolHolderSnapshot, ...]
|
|
|
166
218
|
acquired_at=tracked.acquired_at,
|
|
167
219
|
checkout_site=tracked.checkout_site,
|
|
168
220
|
checkout_stack=tracked.checkout_stack,
|
|
221
|
+
provenance=tracked.provenance,
|
|
169
222
|
current_site=current_site,
|
|
170
223
|
current_stack=current_stack,
|
|
171
224
|
task_done=tracked.task.done(),
|
|
@@ -304,6 +357,7 @@ def emit_first_pool_timeout(
|
|
|
304
357
|
|
|
305
358
|
|
|
306
359
|
__all__ = [
|
|
360
|
+
"PoolHolderProvenance",
|
|
307
361
|
"PoolHolderSnapshot",
|
|
308
362
|
"PoolSaturationEvent",
|
|
309
363
|
"connection_holder_census",
|
|
@@ -328,6 +328,22 @@ delete).
|
|
|
328
328
|
|
|
329
329
|
## Change Log
|
|
330
330
|
|
|
331
|
+
- **2026-09-17 (3.1.160)** — **An audit row NAMES its organization, or nothing is
|
|
332
|
+
written.** `record_secret_audit(organization_id=...)` is REQUIRED and refuses an
|
|
333
|
+
empty value by name; it used to default to `None` "for legacy callers", and 51 of
|
|
334
|
+
its 72 call sites passed nothing, so the database's resolver chain
|
|
335
|
+
(`users._stamp_secret_audit_org`, migration 0444) stamped whichever personal
|
|
336
|
+
organization it could reach and a team credential's trail landed in one person's
|
|
337
|
+
workspace, silently. The new `audit_organization(record_organization_id=...,
|
|
338
|
+
request_organization_id=...)` picks the value: the AUDITED RECORD's organization
|
|
339
|
+
wins (a child row takes its parent's tenancy), a PERSONAL record — whose
|
|
340
|
+
`organization_id` IS NULL by `credential_items_one_owner_check` — is filed in the
|
|
341
|
+
organization the HOST carried in, and with neither it REFUSES naming the site.
|
|
342
|
+
Every write/reveal/grant/transfer/fork/attachment entry point therefore takes an
|
|
343
|
+
optional `audit_organization_id` (the admitted request organization); the battery
|
|
344
|
+
still has no tenancy model and never resolves one. Pinned by
|
|
345
|
+
`tests/test_secret_audit_names_its_organization.py`. Law:
|
|
346
|
+
`common-docs/policies/context-is-carried-never-rebuilt.md`.
|
|
331
347
|
- **2026-09-12** — `resolve_org_secrets`' `last_used_at` telemetry write now
|
|
332
348
|
locks its rows ascending by primary key (`lock_rows_in_pk_order=True`). As an
|
|
333
349
|
unordered multi-row UPDATE it deadlocked against itself under parallel agent
|
|
@@ -132,6 +132,7 @@ from .org_service import (
|
|
|
132
132
|
delete_org_secret,
|
|
133
133
|
get_org_secret_row,
|
|
134
134
|
list_org_secrets,
|
|
135
|
+
audit_organization,
|
|
135
136
|
record_secret_audit,
|
|
136
137
|
resolve_effective_secrets,
|
|
137
138
|
resolve_org_secrets,
|
|
@@ -282,6 +283,7 @@ __all__ = [
|
|
|
282
283
|
"delete_org_secret",
|
|
283
284
|
"get_org_secret_row",
|
|
284
285
|
"list_org_secrets",
|
|
286
|
+
"audit_organization",
|
|
285
287
|
"record_secret_audit",
|
|
286
288
|
"resolve_effective_secrets",
|
|
287
289
|
"resolve_org_secrets",
|
|
@@ -15,7 +15,7 @@ from typing import Any
|
|
|
15
15
|
from .crypto import decrypt_bytes, encrypt_bytes
|
|
16
16
|
from .items import CredentialItemNotFoundError, HANDLING_MODES, SealedFieldError
|
|
17
17
|
from .model import CredentialAttachment, CredentialItem
|
|
18
|
-
from .org_service import record_secret_audit
|
|
18
|
+
from .org_service import audit_organization, record_secret_audit
|
|
19
19
|
from .service import SecretDecryptError
|
|
20
20
|
|
|
21
21
|
MAX_VAULT_ATTACHMENT_BYTES = 25 * 1024 * 1024
|
|
@@ -85,6 +85,23 @@ async def _require_item(item_id: str) -> None:
|
|
|
85
85
|
raise CredentialItemNotFoundError(f"credential item {item_id} not found")
|
|
86
86
|
|
|
87
87
|
|
|
88
|
+
async def _parent_item_organization(item_id: str) -> str | None:
|
|
89
|
+
"""The organization of the item an attachment hangs off.
|
|
90
|
+
|
|
91
|
+
An attachment is a CHILD of the credential item — ownership and sharing
|
|
92
|
+
live exclusively on the parent — so its audit row belongs in the PARENT's
|
|
93
|
+
organization (THE REQUEST CONTEXT IS CARRIED, NEVER REBUILT, rule 4). A
|
|
94
|
+
PERSONAL parent has ``organization_id IS NULL`` by constraint; the host's
|
|
95
|
+
request organization answers for it, through :func:`audit_organization`.
|
|
96
|
+
"""
|
|
97
|
+
rows = await CredentialItem.filter(id=item_id, deleted_at__isnull=True).values(
|
|
98
|
+
"organization_id"
|
|
99
|
+
)
|
|
100
|
+
if not rows:
|
|
101
|
+
raise CredentialItemNotFoundError(f"credential item {item_id} not found")
|
|
102
|
+
return rows[0].get("organization_id")
|
|
103
|
+
|
|
104
|
+
|
|
88
105
|
async def _require_raw(attachment_id: str) -> dict[str, Any]:
|
|
89
106
|
rows = await CredentialAttachment.filter(id=attachment_id, deleted_at__isnull=True).values(
|
|
90
107
|
*_ATTACHMENT_FIELDS, "value_encrypted"
|
|
@@ -157,9 +174,11 @@ async def add_credential_attachment(
|
|
|
157
174
|
content: bytes,
|
|
158
175
|
handling: str = "revealable",
|
|
159
176
|
actor_id: str | None = None,
|
|
177
|
+
audit_organization_id: str | None = None,
|
|
160
178
|
) -> CredentialAttachmentRow:
|
|
161
179
|
"""Encrypt and attach one file to an existing credential item."""
|
|
162
180
|
await _require_item(item_id)
|
|
181
|
+
parent_org = await _parent_item_organization(item_id)
|
|
163
182
|
_validate_content(content)
|
|
164
183
|
_validate_handling(handling)
|
|
165
184
|
clean_label = _validate_text(label, name="label", maximum=200)
|
|
@@ -184,6 +203,11 @@ async def add_credential_attachment(
|
|
|
184
203
|
await record_secret_audit(
|
|
185
204
|
action="attachment_added",
|
|
186
205
|
actor_id=actor_id,
|
|
206
|
+
organization_id=audit_organization(
|
|
207
|
+
record_organization_id=parent_org,
|
|
208
|
+
request_organization_id=audit_organization_id,
|
|
209
|
+
what=f"add_credential_attachment(item_id={item_id})",
|
|
210
|
+
),
|
|
187
211
|
metadata={
|
|
188
212
|
"credential_item_id": item_id,
|
|
189
213
|
"attachment_id": str(instance.id),
|
|
@@ -209,9 +233,11 @@ async def update_credential_attachment_metadata(
|
|
|
209
233
|
file_name: str | None = None,
|
|
210
234
|
handling: str | None = None,
|
|
211
235
|
actor_id: str | None = None,
|
|
236
|
+
audit_organization_id: str | None = None,
|
|
212
237
|
) -> CredentialAttachmentRow:
|
|
213
238
|
"""Patch safe metadata without touching bytes or ``value_version``."""
|
|
214
239
|
raw = await _require_raw(attachment_id)
|
|
240
|
+
parent_org = await _parent_item_organization(str(raw["credential_item_id"]))
|
|
215
241
|
if handling is not None:
|
|
216
242
|
_validate_handling(handling)
|
|
217
243
|
if str(raw["handling"]) == "sealed" and handling != "sealed":
|
|
@@ -238,6 +264,11 @@ async def update_credential_attachment_metadata(
|
|
|
238
264
|
await record_secret_audit(
|
|
239
265
|
action="attachment_updated",
|
|
240
266
|
actor_id=actor_id,
|
|
267
|
+
organization_id=audit_organization(
|
|
268
|
+
record_organization_id=parent_org,
|
|
269
|
+
request_organization_id=audit_organization_id,
|
|
270
|
+
what=f"update_credential_attachment_metadata(attachment_id={attachment_id})",
|
|
271
|
+
),
|
|
241
272
|
metadata={
|
|
242
273
|
"credential_item_id": str(raw["credential_item_id"]),
|
|
243
274
|
"attachment_id": attachment_id,
|
|
@@ -257,9 +288,11 @@ async def replace_credential_attachment(
|
|
|
257
288
|
media_type: str | None,
|
|
258
289
|
content: bytes,
|
|
259
290
|
actor_id: str | None = None,
|
|
291
|
+
audit_organization_id: str | None = None,
|
|
260
292
|
) -> CredentialAttachmentRow:
|
|
261
293
|
"""Atomically replace the encrypted bytes and file metadata."""
|
|
262
294
|
raw = await _require_raw(attachment_id)
|
|
295
|
+
parent_org = await _parent_item_organization(str(raw["credential_item_id"]))
|
|
263
296
|
_validate_content(content)
|
|
264
297
|
clean_name = _validate_text(file_name, name="file_name", maximum=512)
|
|
265
298
|
await CredentialAttachment.update_where(
|
|
@@ -274,6 +307,11 @@ async def replace_credential_attachment(
|
|
|
274
307
|
await record_secret_audit(
|
|
275
308
|
action="attachment_replaced",
|
|
276
309
|
actor_id=actor_id,
|
|
310
|
+
organization_id=audit_organization(
|
|
311
|
+
record_organization_id=parent_org,
|
|
312
|
+
request_organization_id=audit_organization_id,
|
|
313
|
+
what=f"replace_credential_attachment(attachment_id={attachment_id})",
|
|
314
|
+
),
|
|
277
315
|
metadata={
|
|
278
316
|
"credential_item_id": str(raw["credential_item_id"]),
|
|
279
317
|
"attachment_id": attachment_id,
|
|
@@ -287,8 +325,14 @@ async def replace_credential_attachment(
|
|
|
287
325
|
return row
|
|
288
326
|
|
|
289
327
|
|
|
290
|
-
async def delete_credential_attachment(
|
|
328
|
+
async def delete_credential_attachment(
|
|
329
|
+
attachment_id: str,
|
|
330
|
+
*,
|
|
331
|
+
actor_id: str | None = None,
|
|
332
|
+
audit_organization_id: str | None = None,
|
|
333
|
+
) -> bool:
|
|
291
334
|
raw = await _require_raw(attachment_id)
|
|
335
|
+
parent_org = await _parent_item_organization(str(raw["credential_item_id"]))
|
|
292
336
|
now = datetime.now(UTC)
|
|
293
337
|
result = await CredentialAttachment.update_where(
|
|
294
338
|
{"id": attachment_id, "deleted_at__isnull": True},
|
|
@@ -300,6 +344,11 @@ async def delete_credential_attachment(attachment_id: str, *, actor_id: str | No
|
|
|
300
344
|
await record_secret_audit(
|
|
301
345
|
action="attachment_deleted",
|
|
302
346
|
actor_id=actor_id,
|
|
347
|
+
organization_id=audit_organization(
|
|
348
|
+
record_organization_id=parent_org,
|
|
349
|
+
request_organization_id=audit_organization_id,
|
|
350
|
+
what=f"delete_credential_attachment(attachment_id={attachment_id})",
|
|
351
|
+
),
|
|
303
352
|
metadata={
|
|
304
353
|
"credential_item_id": str(raw["credential_item_id"]),
|
|
305
354
|
"attachment_id": attachment_id,
|
|
@@ -310,14 +359,23 @@ async def delete_credential_attachment(attachment_id: str, *, actor_id: str | No
|
|
|
310
359
|
|
|
311
360
|
|
|
312
361
|
async def reveal_credential_attachment(
|
|
313
|
-
attachment_id: str,
|
|
362
|
+
attachment_id: str,
|
|
363
|
+
*,
|
|
364
|
+
actor_id: str | None = None,
|
|
365
|
+
audit_organization_id: str | None = None,
|
|
314
366
|
) -> tuple[CredentialAttachmentRow, bytes]:
|
|
315
367
|
"""Human download path. Sealed bytes are structurally refused."""
|
|
316
368
|
raw = await _require_raw(attachment_id)
|
|
369
|
+
parent_org = await _parent_item_organization(str(raw["credential_item_id"]))
|
|
317
370
|
if str(raw["handling"]) == "sealed":
|
|
318
371
|
await record_secret_audit(
|
|
319
372
|
action="attachment_download_denied",
|
|
320
373
|
actor_id=actor_id,
|
|
374
|
+
organization_id=audit_organization(
|
|
375
|
+
record_organization_id=parent_org,
|
|
376
|
+
request_organization_id=audit_organization_id,
|
|
377
|
+
what=f"reveal_credential_attachment(attachment_id={attachment_id})",
|
|
378
|
+
),
|
|
321
379
|
metadata={
|
|
322
380
|
"credential_item_id": str(raw["credential_item_id"]),
|
|
323
381
|
"attachment_id": attachment_id,
|
|
@@ -337,6 +395,11 @@ async def reveal_credential_attachment(
|
|
|
337
395
|
await record_secret_audit(
|
|
338
396
|
action="attachment_downloaded",
|
|
339
397
|
actor_id=actor_id,
|
|
398
|
+
organization_id=audit_organization(
|
|
399
|
+
record_organization_id=parent_org,
|
|
400
|
+
request_organization_id=audit_organization_id,
|
|
401
|
+
what=f"reveal_credential_attachment(attachment_id={attachment_id})",
|
|
402
|
+
),
|
|
340
403
|
metadata={
|
|
341
404
|
"credential_item_id": str(raw["credential_item_id"]),
|
|
342
405
|
"attachment_id": attachment_id,
|
|
@@ -131,6 +131,7 @@ async def require_host_authorization(
|
|
|
131
131
|
*,
|
|
132
132
|
capability: str,
|
|
133
133
|
operation: str,
|
|
134
|
+
audit_organization_id: str | None = None,
|
|
134
135
|
) -> None:
|
|
135
136
|
"""Refuse a privileged write unless the host recorded ``capability`` for
|
|
136
137
|
this (item, actor). Screams and writes a durable ``denied`` audit row
|
|
@@ -149,12 +150,24 @@ async def require_host_authorization(
|
|
|
149
150
|
capability,
|
|
150
151
|
sorted(caps) or "nothing",
|
|
151
152
|
)
|
|
152
|
-
from .
|
|
153
|
+
from .model import CredentialItem
|
|
154
|
+
from .org_service import audit_organization, record_secret_audit
|
|
153
155
|
|
|
154
156
|
try:
|
|
157
|
+
# The denial row is a child of the ITEM, so it is filed in the item's
|
|
158
|
+
# organization; a PERSONAL item names none by constraint and the host's
|
|
159
|
+
# request organization answers for it.
|
|
160
|
+
item_rows = await CredentialItem.filter(id=item_id).values("organization_id")
|
|
155
161
|
await record_secret_audit(
|
|
156
162
|
action="denied",
|
|
157
163
|
actor_id=actor_id,
|
|
164
|
+
organization_id=audit_organization(
|
|
165
|
+
record_organization_id=(
|
|
166
|
+
item_rows[0].get("organization_id") if item_rows else None
|
|
167
|
+
),
|
|
168
|
+
request_organization_id=audit_organization_id,
|
|
169
|
+
what=f"require_host_authorization(item_id={item_id})",
|
|
170
|
+
),
|
|
158
171
|
metadata={
|
|
159
172
|
"credential_item_id": str(item_id),
|
|
160
173
|
"operation": operation,
|