loom-kernel 2.20.2__tar.gz → 2.22.0__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.
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/CHANGELOG.md +111 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/PKG-INFO +1 -1
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/pyproject.toml +3 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_capabilities.py +7 -1
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/errors.py +14 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/compiler.py +36 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/executor.py +19 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/plan.py +21 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/errors/__init__.py +4 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/errors/codes.py +3 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/errors/errors.py +88 -1
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/job/job.py +3 -1
- loom_kernel-2.22.0/src/loom/core/model/_json_schema.py +35 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/_loom_type.py +145 -9
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +10 -4
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/__init__.py +4 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/markers.py +29 -0
- loom_kernel-2.22.0/src/loom/core/use_case/outcome.py +52 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/__init__.py +2 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_historify/_common.py +11 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_historify/_log.py +26 -1
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_historify/_ops.py +22 -1
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_historify/_transform.py +22 -3
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_write_policy.py +52 -42
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_historify.py +37 -12
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_writer.py +3 -36
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/_historify.py +38 -11
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/_writer.py +3 -37
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_validators_step.py +40 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/__init__.py +2 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/__init__.py +3 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_history/__init__.py +2 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_history/_builder.py +75 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_history/_errors.py +38 -8
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_history/_spec.py +6 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/compiler.py +173 -17
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/constants.py +10 -1
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/errors.py +59 -8
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/openapi.py +111 -43
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/response.py +14 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/router_runtime.py +97 -26
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/rest_adapter.py +10 -2
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/.gitignore +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/LICENSE +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/README.md +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_concurrency.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_filters.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_paths.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_roles.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_startup.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_transport.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_usecase.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/_binding.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/_handlers.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/_rpc.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/card.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/events.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/server.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/abc.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/bootstrap.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/_compiler.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/_fingerprint.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/_plan.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_conversation.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_feedable.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_hook.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_instructions.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_output.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_state.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/declarative/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/declarative/_envelope.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/declarative/_schema.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/declarative/_v1.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/describe.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_escape.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_history.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_instructions.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_limits.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_native.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/extras/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/extras/a2a.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/extras/handlebars.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/extras/mcp.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/extras/skills.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/_shared.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/anthropic.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/bedrock.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/gateway.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/openai.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/typesafe.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/_batch.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/_columns.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/_frames.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/_ledger.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/_runner.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/_validation.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/fastapi/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/fastapi/endpoints.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/fastapi/response.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/fastapi/streaming.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/inference.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/pricing.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/registry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/remote_auth.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_bounded.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_chain.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_conversation.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_grants.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_handle.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_health.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_hooks.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_lifecycle.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_limits.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_mcp.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/validate/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/validate/__main__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/auto.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/bootstrap.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/constants.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/runner.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/service.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/cli/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/cli/app.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/cli/schema.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/async_bridge.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/_decide.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/_grants.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/_roles.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/_scope.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/elevation.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/product.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/backend/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/backend/core_model.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/backend/protocol.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/backend/scoped_ddl.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/backend/sqlalchemy.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/bootstrap/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/bootstrap/kernel.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/_batching.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/_single_flight.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/abc/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/abc/backend.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/abc/config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/abc/dependency.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/calls.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/codec.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/decorators.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/dependency.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/gateway.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/keys.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/memory.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/repository.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/result_codec.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/serializer.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/wiring.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/command/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/command/adapter.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/command/base.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/command/field.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/command/introspection.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/compiler.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/_boto3.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/_includes.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/_resolver_utils.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/binder.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/configurable.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/context.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/keys.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/loader.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/model.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/observability.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/resolver.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/secrets.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/ssm.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/contracts/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/contracts/manifest.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/di/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/di/container.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/di/scope.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/discovery/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/discovery/_utils.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/discovery/base.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/discovery/interfaces.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/discovery/manifest.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/discovery/modules.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/compilable.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/events.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/metrics.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/post_commit.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/expr/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/expr/eval.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/expr/nodes.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/expr/refs.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/identity/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/identity/context.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/identity/identity.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/identity/issuer.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/identity/wire.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/introspection/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/introspection/base.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/introspection/describe.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/job/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/job/callback.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/job/context.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/job/handle.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/job/service.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/locator.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/logger/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/logger/abc.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/logger/config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/logger/registry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/logger/structlogger.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/base.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/convert.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/enums.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/field.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/introspection.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/partition.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/privilege.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/projection.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/relation.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/scoped.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/struct.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/timestamped.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/types.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/types_postgres.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/event.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/observer/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/observer/noop.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/observer/otel.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/observer/structlog.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/otel_ids.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/protocol.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/runtime.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/span.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/topology.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/persistence/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/persistence/abc.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/persistence/none.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/persistence/registry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/plugins/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/plugins/entrypoints.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/plugins/optional.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/projection/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/projection/loaders.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/projection/runtime.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/cursor.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/query.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/query_compiler.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/repo_for.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/repository.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/session_scope.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/dynamodb/backend.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/dynamodb/registry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/dynamodb/repository.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/backend.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/ids.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/query_compiler.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/registry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/repository.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/uow.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/values.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mutation.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/registration.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/registry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/backend.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/migrations/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/migrations/env_template.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/migrations/hook.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/migrations/operations.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/migrations/runners.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/bootstrap.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/elevate.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/guard/0001.sql +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/guard/0002.sql +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/guard/preflight.sql +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/guard_manifest.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/integrity.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/partitions.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/provider.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/schema.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/sources.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/verify.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/session_settings.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/response/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/response/base.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/routing/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/routing/ref.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/routing/resolver.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/runner.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/schema/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/schema/schema_mode.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/schema_names.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/abc/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/abc/contracts.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/abc/errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/caller_bound.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/clickhouse/_client.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/clickhouse/registry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/roles.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/service.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/symbols.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/tracing/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/tracing/context.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/transaction.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/transport/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/transport/adapter.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/uow/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/uow/abc.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/uow/context.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/_predicates.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/agent_markers.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/compute.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/constants.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/factory.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/field_ref.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/invoker.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/keys.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/mcp_markers.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/registry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/rule.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/use_case.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/_uri.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_format_registry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_merge.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_path_template.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_predicate.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_frame.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_reader.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_schema.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/provider.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/_reader.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/_schema.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/provider.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_options.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_paths.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_scope.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_store.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_binding.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_compiler.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_filter.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_plan.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_validators.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_validators_agents.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_validators_config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/_format.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/_read_options.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/_utils.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/_with_agent.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/_write_options.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/expr/_params.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/_from.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/_from_config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/_specs.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_client.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_file.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_into.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_table.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_temp.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/executor/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/executor/_agents.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/executor/_dispatcher.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/executor/_executor.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/_registry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_clickhouse.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_mongo.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_serialization.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/targets/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/targets/_clickhouse.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/_config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/_observer.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/_records.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/_builder.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/_ops.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/_protocol.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/_runner.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/_step.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_generics.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_params.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_process.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_sql.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_step.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_step_client.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/_agents.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/_providers.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/_wiring.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/config_loader.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/core.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/filtering.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runtime/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runtime/_config_values.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runtime/contracts.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/schema/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/schema/_contract.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/schema/_schema.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/storage/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/storage/_config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/storage/_file_locator.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/storage/_locator.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/storage/routing.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/testing/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/testing/_result.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/testing/_runners.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/testing/_scenario.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/testing/_stubs.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/testing/spark.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_async.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_ctx.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_flow_yaml.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_meta.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_placeholders.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_summary.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/deploy/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/deploy/_discovery.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/deploy/_schedule.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/deploy/_yaml_etls.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/deploy/entrypoint.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_assemble.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_backfill.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_body.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_common.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_factory.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_hooks.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_maintenance.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_params.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_run_name.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_runtime.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_signature.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_stages.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/manifest/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/manifest/_model.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/manifest/_s3.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/manifest/_store.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/_event.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/_factory.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/_format.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/_port.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/_slack.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/_sns.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/observer/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/observer/_flow.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/observer/_manifest.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/observer/_task_run.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prometheus/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prometheus/_instruments.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prometheus/adapter.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prometheus/kafka.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prometheus/lifecycle.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prometheus/middleware.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/py.typed +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/_body.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/adapter.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/auth/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/auth/abc.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/auth/config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/auth/jwt.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/auth/middleware.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/autocrud.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/cors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/_errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/app.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/auto.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/health.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/sql.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/middleware.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/model.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_operators.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/runner.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/_bindings.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/_compiler.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/_errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/_plan.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/phases/validate.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/core/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/core/_errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/core/_exceptions.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/core/_message.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/core/_tracing.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/core/_typing.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/graph/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/graph/_flow.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_codec.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_errors.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_message.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_record.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_wire.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/mongo/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/mongo/_config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/mongo/_event.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/mongo/_normalize.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_boundary.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_branches.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_decompose.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_fork.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_helpers.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_mongo.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_protocols.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_router.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_shape.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_sink.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_step.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_table/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_table/common.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_table/config.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_with.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/refs.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/testing.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/__init__.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/agents.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/golden.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/http_harness.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/in_memory.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/repository_harness.py +0 -0
- {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/runner.py +0 -0
|
@@ -184,6 +184,78 @@
|
|
|
184
184
|
|
|
185
185
|
### rest
|
|
186
186
|
|
|
187
|
+
- **rest:** a use case says it created. `loom.core.use_case.Created[T]` wraps
|
|
188
|
+
the result of a use case declared `T | Created[T]`. The REST route answers
|
|
189
|
+
`Created(v)` with `201` and body `v`, and any other result with the route's
|
|
190
|
+
`status_code` as before; OpenAPI documents both statuses with the same
|
|
191
|
+
schema. `Created(v, location="/items/1")` also sends `Location` (RFC 9110
|
|
192
|
+
§15.3.2), which OpenAPI declares on the `201`; a location that is empty or
|
|
193
|
+
holds a character not allowed in an RFC 3986 URI reference raises
|
|
194
|
+
`ValueError`.
|
|
195
|
+
`LoomRestAdapter.handle` answers a `Created` the same way. Compilation
|
|
196
|
+
refuses a `Created` that wraps a type other than another member of the
|
|
197
|
+
result, appears twice or is not parameterised, and a `Created` on a route
|
|
198
|
+
whose `status_code` is already `201`. The invoker, jobs and Celery receive
|
|
199
|
+
the wrapper and read `.value`; the use case imports nothing from HTTP.
|
|
200
|
+
- **rest:** `429` with `Retry-After`. `ErrorCode.RATE_LIMITED`
|
|
201
|
+
(`"rate_limited"`) and `loom.core.errors.RateLimited(retry_after)`, a
|
|
202
|
+
`DomainError` holding the delay in whole seconds, rounded up and at least
|
|
203
|
+
1; a non-finite `retry_after` raises `ValueError`. `HttpErrorMapper`
|
|
204
|
+
answers it with `429`, the standard body and `Retry-After: <seconds>`.
|
|
205
|
+
loom ships no limiter: the consumer decides who is limited and raises
|
|
206
|
+
`RateLimited`.
|
|
207
|
+
- **rest:** declared query parameters. `loom.core.use_case.Query()` marks an
|
|
208
|
+
`execute` parameter typed with a strict `msgspec.Struct` or pydantic model
|
|
209
|
+
whose fields are each a string, integer, number, boolean, enum or
|
|
210
|
+
`Literal`, optionally `None`. The REST route accepts exactly its wire
|
|
211
|
+
names, plus `profile` where the route exposes it and `execute` declares an
|
|
212
|
+
annotated `profile` parameter, the condition OpenAPI publishes it under.
|
|
213
|
+
- An unknown or repeated parameter, `profile` included, answers
|
|
214
|
+
`400 unsupported_query`.
|
|
215
|
+
- A bad value answers `400 query_validation` (`ErrorCode.QUERY_VALIDATION`),
|
|
216
|
+
with the body and `violations` of `boundary_validation`; `422` stays for
|
|
217
|
+
bodies. A `profile` the route does not allow answers the same 400, on
|
|
218
|
+
field `profile` and without the value.
|
|
219
|
+
- Values are spelled strictly: a number follows the JSON number grammar
|
|
220
|
+
and is finite, an integer its integer subset within `[-2**63, 2**64)`
|
|
221
|
+
(an `IntEnum` or an int `Literal` is coerced the same way), a boolean is
|
|
222
|
+
`true` or `false`, `null` is never `None`, and a date or time field
|
|
223
|
+
refuses a number. A refused query never builds the use case.
|
|
224
|
+
- OpenAPI publishes one parameter per field, with `required`, its
|
|
225
|
+
constraints and description and no `title`; named enums go to
|
|
226
|
+
`components.schemas`.
|
|
227
|
+
- List, object and multi-type fields, a field named like a path parameter
|
|
228
|
+
or `profile`, a `QuerySpec` next to it and a second `Query()` are refused
|
|
229
|
+
at startup.
|
|
230
|
+
- A caller other than REST must pass an instance of the query type; any
|
|
231
|
+
other value raises `ParameterBindingError` naming the parameter and the
|
|
232
|
+
type received, never the value.
|
|
233
|
+
- A `Job` that declares `Query()` fails to compile with a
|
|
234
|
+
`CompilationError`: a job is dispatched with primitive parameters, so the
|
|
235
|
+
query struct could never reach it.
|
|
236
|
+
- An agent granted a use case that takes `Query()` fails to compile with
|
|
237
|
+
`USECASE_DECLARES_QUERY`.
|
|
238
|
+
- New: `ExecutionPlan.query_binding` (`QueryBinding`),
|
|
239
|
+
`CompiledRoute.query_fields` (`QueryField`), `CompiledRoute.result_type`
|
|
240
|
+
and `created_type`, `build_success_responses`, `LoomType.from_query`,
|
|
241
|
+
`names_query_spec`, `created_response`, `RETRY_AFTER_HEADER`,
|
|
242
|
+
`LOCATION_HEADER`, and a keyword-only `code` on `BoundaryValidationError`
|
|
243
|
+
(default `boundary_validation`). `build_query_parameters_schema` takes an
|
|
244
|
+
optional `component_registry`. `QuerySpec` routes are unchanged.
|
|
245
|
+
- **rest:** step-up authentication (RFC 9470).
|
|
246
|
+
`loom.core.errors.InsufficientAuthentication(message, *, max_age=None,
|
|
247
|
+
acr_values=())`, an `Unauthenticated` with its own code
|
|
248
|
+
`ErrorCode.INSUFFICIENT_AUTHENTICATION` (`"insufficient_authentication"`),
|
|
249
|
+
answers `401` with `WWW-Authenticate: Bearer
|
|
250
|
+
error="insufficient_user_authentication", error_description="…"`, plus
|
|
251
|
+
`max_age="N"` and `acr_values="…"` when given. In the description each
|
|
252
|
+
character RFC 6750 §3 does not allow becomes a space, runs of spaces
|
|
253
|
+
collapse, an empty result falls back to the default message, and the text
|
|
254
|
+
is cut at 256 characters. A non-`str` message, a negative or non-int
|
|
255
|
+
`max_age`, `acr_values` that is a single `str` or `bytes`, or
|
|
256
|
+
an ACR value that is not a `str`, is empty, or holds anything but visible
|
|
257
|
+
ASCII other than a double quote or a backslash raise `ValueError`. Every
|
|
258
|
+
other 401 keeps the plain `Bearer` challenge.
|
|
187
259
|
- **rest:** a `403` can say why and what is missing. `Forbidden` takes two
|
|
188
260
|
optional keyword arguments, `reason` (a machine-readable cause such as
|
|
189
261
|
`"mfa_required"`) and `missing` (the permissions the caller lacks, kept as a
|
|
@@ -375,6 +447,13 @@
|
|
|
375
447
|
|
|
376
448
|
### core
|
|
377
449
|
|
|
450
|
+
- **core:** the `LoomType` protocol gains `from_query(params)`, which
|
|
451
|
+
validates query-string values strictly. A number takes the JSON number
|
|
452
|
+
grammar and must be finite, an integer its integer subset within
|
|
453
|
+
`[-2**63, 2**64)`, a boolean `true` or `false`; `null` is never `None` and
|
|
454
|
+
a date or time field refuses a number instead of reading a timestamp. Both
|
|
455
|
+
implementations are private to `loom.core.model`; a class of your own
|
|
456
|
+
declared as a `LoomType` must add the method.
|
|
378
457
|
- **core:** on a model with a composite primary key, the SQLAlchemy
|
|
379
458
|
repository's `get_by_id`, `exists`, `update` and `delete` take the key as a
|
|
380
459
|
tuple of every key value in declaration order (`repo.get_by_id((account_id,
|
|
@@ -485,6 +564,17 @@
|
|
|
485
564
|
|
|
486
565
|
### rest
|
|
487
566
|
|
|
567
|
+
- **rest:** every route now resolves its request parameters and decodes its
|
|
568
|
+
body before the use case is built, so a request refused at that point
|
|
569
|
+
never runs the use case's constructor.
|
|
570
|
+
- **rest:** `build_success_response_schema` reads `CompiledRoute.result_type`
|
|
571
|
+
instead of the use case's annotations; a `CompiledRoute` built by hand
|
|
572
|
+
without it documents no success body.
|
|
573
|
+
- **rest:** an error whose `code` is `"query_validation"` now answers `400`,
|
|
574
|
+
and one coded `"insufficient_authentication"` answers `401` with the plain
|
|
575
|
+
`Bearer` challenge unless it is an `InsufficientAuthentication`.
|
|
576
|
+
- **rest:** an error whose `code` is `"rate_limited"` now answers `429`
|
|
577
|
+
instead of `500`; only a `RateLimited` carries `Retry-After`.
|
|
488
578
|
- **rest:** a `RestInterface` whose `prefix` contains `{` now raises
|
|
489
579
|
`InterfaceCompilationError` at compile time, naming the interface and the
|
|
490
580
|
prefix; declare the placeholder in the route `path` instead (a catch-all
|
|
@@ -606,6 +696,16 @@
|
|
|
606
696
|
|
|
607
697
|
### core
|
|
608
698
|
|
|
699
|
+
- **core:** a `BoundaryValidationError` no longer echoes the rejected value
|
|
700
|
+
(#347). msgspec's `Invalid enum value 'x'` (an `Enum`, `IntEnum` or `Literal`
|
|
701
|
+
field or dict key) and `Invalid value 'x'` (a tagged-union tag) become
|
|
702
|
+
`Invalid enum value` and `Invalid value`, in the message and the violation,
|
|
703
|
+
with the field path kept: ``Invalid enum value - at `$.colour` ``. pydantic's
|
|
704
|
+
`union_tag_invalid`, `uuid_parsing` and `bytes_invalid_encoding` reasons
|
|
705
|
+
become `Input tag does not match any of the expected tags`, `Input should be
|
|
706
|
+
a valid UUID` and `Data should be valid in its declared encoding`. A message
|
|
707
|
+
raised by the type's own validator keeps its text.
|
|
708
|
+
|
|
609
709
|
- **core:** the relation steps and the `load_many` projection steps of a read
|
|
610
710
|
profile run one after another on the request's session. They ran with
|
|
611
711
|
`asyncio.gather` on that one session: when one step failed while another was
|
|
@@ -782,6 +882,17 @@
|
|
|
782
882
|
|
|
783
883
|
### rest
|
|
784
884
|
|
|
885
|
+
- **rest:** the OpenAPI `limit` parameter of a `QuerySpec` route published
|
|
886
|
+
`maximum: 1000` and `default: 50` whatever `RestApiDefaults.max_limit` said,
|
|
887
|
+
while the router clamped `?limit=` to `max_limit`. The schema now publishes
|
|
888
|
+
`max_limit` as its `maximum` and `min(50, max_limit)` as its `default`, the
|
|
889
|
+
values the router applies. A larger `?limit=` is still clamped, not refused.
|
|
890
|
+
- **rest:** a `QuerySpec` filter or sort on a field the SQLAlchemy compiler
|
|
891
|
+
cannot resolve, or a filter the repository's allow-list refuses, answered
|
|
892
|
+
`500 internal_error`. `FilterPathError` and `UnsafeFilterError` are now
|
|
893
|
+
`DomainError`s with code `unsupported_query`, so the route answers `400` with
|
|
894
|
+
the standard error body, whose message names the field and never its value.
|
|
895
|
+
Both remain `ValueError` subclasses with unchanged constructors and messages.
|
|
785
896
|
- **rest:** a path placeholder in `RestInterface.prefix` was dropped. The route
|
|
786
897
|
was registered on prefix + path, but path parameters were read from the
|
|
787
898
|
route `path` only, so the use case never received the prefix parameter (a
|
|
@@ -333,6 +333,7 @@ extend-immutable-calls = [
|
|
|
333
333
|
"Load",
|
|
334
334
|
"LoadById",
|
|
335
335
|
"Mcp",
|
|
336
|
+
"Query",
|
|
336
337
|
"loom.core.use_case.Agent",
|
|
337
338
|
"loom.core.use_case.Caller",
|
|
338
339
|
"loom.core.use_case.Exists",
|
|
@@ -340,6 +341,7 @@ extend-immutable-calls = [
|
|
|
340
341
|
"loom.core.use_case.Load",
|
|
341
342
|
"loom.core.use_case.LoadById",
|
|
342
343
|
"loom.core.use_case.Mcp",
|
|
344
|
+
"loom.core.use_case.Query",
|
|
343
345
|
"loom.core.use_case.markers.Agent",
|
|
344
346
|
"loom.core.use_case.markers.Caller",
|
|
345
347
|
"loom.core.use_case.markers.Exists",
|
|
@@ -347,6 +349,7 @@ extend-immutable-calls = [
|
|
|
347
349
|
"loom.core.use_case.markers.Load",
|
|
348
350
|
"loom.core.use_case.markers.LoadById",
|
|
349
351
|
"loom.core.use_case.markers.Mcp",
|
|
352
|
+
"loom.core.use_case.markers.Query",
|
|
350
353
|
]
|
|
351
354
|
|
|
352
355
|
[tool.pyright]
|
|
@@ -68,6 +68,7 @@ from loom.ai.errors import (
|
|
|
68
68
|
sql_connection_roles_unbound,
|
|
69
69
|
sql_connection_unknown,
|
|
70
70
|
sql_result_bound_missing,
|
|
71
|
+
usecase_declares_query,
|
|
71
72
|
usecase_key_unknown,
|
|
72
73
|
)
|
|
73
74
|
from loom.ai.inference import InferenceTarget
|
|
@@ -227,9 +228,14 @@ def _compile_usecase(capability: UsecaseCapability, context: _Context) -> _Handl
|
|
|
227
228
|
use_cases: list[type[Compilable]] = []
|
|
228
229
|
for key in capability.keys:
|
|
229
230
|
try:
|
|
230
|
-
|
|
231
|
+
use_case = context.registry.resolve(key)
|
|
231
232
|
except KeyError:
|
|
232
233
|
issues.append(usecase_key_unknown(context.component, key))
|
|
234
|
+
continue
|
|
235
|
+
execution = getattr(use_case, "__execution_plan__", None)
|
|
236
|
+
if execution is not None and execution.query_binding is not None:
|
|
237
|
+
issues.append(usecase_declares_query(context.component, key))
|
|
238
|
+
use_cases.append(use_case)
|
|
233
239
|
if issues:
|
|
234
240
|
return None, issues
|
|
235
241
|
return CompiledUsecaseCapability(keys=capability.keys, use_cases=tuple(use_cases)), []
|
|
@@ -101,6 +101,7 @@ class AgentErrorCode(StrEnum):
|
|
|
101
101
|
NATIVE_TOOL_DUPLICATE = "NATIVE_TOOL_DUPLICATE"
|
|
102
102
|
CAPABILITY_EMPTY = "CAPABILITY_EMPTY"
|
|
103
103
|
USECASE_KEY_UNKNOWN = "USECASE_KEY_UNKNOWN"
|
|
104
|
+
USECASE_DECLARES_QUERY = "USECASE_DECLARES_QUERY"
|
|
104
105
|
SQL_CONNECTION_UNKNOWN = "SQL_CONNECTION_UNKNOWN"
|
|
105
106
|
SQL_CONNECTION_NOT_READONLY = "SQL_CONNECTION_NOT_READONLY"
|
|
106
107
|
SQL_CONFIG_MISSING = "SQL_CONFIG_MISSING"
|
|
@@ -648,6 +649,19 @@ def usecase_key_unknown(component: str, key: str) -> AgentCompilationIssue:
|
|
|
648
649
|
)
|
|
649
650
|
|
|
650
651
|
|
|
652
|
+
def usecase_declares_query(component: str, key: str) -> AgentCompilationIssue:
|
|
653
|
+
"""A granted use case takes a ``Query()`` parameter, which a tool call cannot bind."""
|
|
654
|
+
return AgentCompilationIssue(
|
|
655
|
+
code=AgentErrorCode.USECASE_DECLARES_QUERY,
|
|
656
|
+
message=(
|
|
657
|
+
f"{component}: use case '{key}' declares a Query() parameter, which an agent "
|
|
658
|
+
"tool call cannot bind; grant a use case without one"
|
|
659
|
+
),
|
|
660
|
+
component=component,
|
|
661
|
+
field="capabilities.keys",
|
|
662
|
+
)
|
|
663
|
+
|
|
664
|
+
|
|
651
665
|
def sql_connection_unknown(component: str, connection: str) -> AgentCompilationIssue:
|
|
652
666
|
"""A ``sql`` capability names a connection that is not configured."""
|
|
653
667
|
return AgentCompilationIssue(
|
|
@@ -18,9 +18,12 @@ from loom.core.engine.plan import (
|
|
|
18
18
|
LoadStep,
|
|
19
19
|
McpBinding,
|
|
20
20
|
ParamBinding,
|
|
21
|
+
QueryBinding,
|
|
21
22
|
RuleStep,
|
|
22
23
|
)
|
|
24
|
+
from loom.core.job.job import Job
|
|
23
25
|
from loom.core.logger import LoggerPort, get_logger
|
|
26
|
+
from loom.core.model import UnsupportedBoundaryType, loom_type
|
|
24
27
|
from loom.core.use_case.markers import (
|
|
25
28
|
LookupKind,
|
|
26
29
|
SourceKind,
|
|
@@ -31,6 +34,7 @@ from loom.core.use_case.markers import (
|
|
|
31
34
|
_LoadByIdMarker,
|
|
32
35
|
_LoadMarker,
|
|
33
36
|
_McpMarker,
|
|
37
|
+
_QueryMarker,
|
|
34
38
|
)
|
|
35
39
|
|
|
36
40
|
|
|
@@ -57,6 +61,7 @@ class _SignatureBindings:
|
|
|
57
61
|
mcp_bindings: list[McpBinding] = field(default_factory=list)
|
|
58
62
|
input_binding: InputBinding | None = None
|
|
59
63
|
caller_binding: CallerBinding | None = None
|
|
64
|
+
query_binding: QueryBinding | None = None
|
|
60
65
|
|
|
61
66
|
|
|
62
67
|
class UseCaseCompiler:
|
|
@@ -173,6 +178,7 @@ class UseCaseCompiler:
|
|
|
173
178
|
caller_binding=bindings.caller_binding,
|
|
174
179
|
agent_bindings=tuple(bindings.agent_bindings),
|
|
175
180
|
mcp_bindings=tuple(bindings.mcp_bindings),
|
|
181
|
+
query_binding=bindings.query_binding,
|
|
176
182
|
)
|
|
177
183
|
use_case_type.__execution_plan__ = plan
|
|
178
184
|
return plan
|
|
@@ -224,6 +230,10 @@ class UseCaseCompiler:
|
|
|
224
230
|
self._collect_caller(use_case_type, name, bindings)
|
|
225
231
|
return
|
|
226
232
|
|
|
233
|
+
if isinstance(marker, _QueryMarker):
|
|
234
|
+
self._collect_query(use_case_type, name, annotation, bindings)
|
|
235
|
+
return
|
|
236
|
+
|
|
227
237
|
if isinstance(marker, _AgentMarker):
|
|
228
238
|
self._collect_agent(name, annotation, marker, bindings)
|
|
229
239
|
return
|
|
@@ -288,6 +298,32 @@ class UseCaseCompiler:
|
|
|
288
298
|
bindings.caller_binding = CallerBinding(name=name)
|
|
289
299
|
self._logger.info(f"[BOOT] - Detected Caller: {name}")
|
|
290
300
|
|
|
301
|
+
def _collect_query(
|
|
302
|
+
self,
|
|
303
|
+
use_case_type: type[Compilable],
|
|
304
|
+
name: str,
|
|
305
|
+
annotation: Any,
|
|
306
|
+
bindings: _SignatureBindings,
|
|
307
|
+
) -> None:
|
|
308
|
+
where = f"{use_case_type.__qualname__}.execute"
|
|
309
|
+
if issubclass(use_case_type, Job):
|
|
310
|
+
raise CompilationError(
|
|
311
|
+
f"{where}: a Job cannot declare Query(); a job is dispatched with plain "
|
|
312
|
+
"parameters, so pass the values it needs as parameters instead"
|
|
313
|
+
)
|
|
314
|
+
if bindings.query_binding is not None:
|
|
315
|
+
raise CompilationError(f"{where}: only one Query() parameter is allowed")
|
|
316
|
+
try:
|
|
317
|
+
loom_type(annotation)
|
|
318
|
+
except UnsupportedBoundaryType as exc:
|
|
319
|
+
raise CompilationError(
|
|
320
|
+
f"{where}: Query() parameter '{name}' must be a strict msgspec.Struct or "
|
|
321
|
+
f"pydantic model: {exc.message}"
|
|
322
|
+
) from exc
|
|
323
|
+
bindings.query_binding = QueryBinding(name=name, query_type=annotation)
|
|
324
|
+
bindings.param_bindings.append(ParamBinding(name=name, annotation=annotation))
|
|
325
|
+
self._logger.info(f"[BOOT] - Detected Query: {annotation.__name__} -> {name}")
|
|
326
|
+
|
|
291
327
|
def _collect_agent(
|
|
292
328
|
self,
|
|
293
329
|
name: str,
|
|
@@ -575,6 +575,7 @@ class RuntimeExecutor:
|
|
|
575
575
|
inputs: _ExecutionInputs,
|
|
576
576
|
) -> Any:
|
|
577
577
|
bound: dict[str, Any] = {}
|
|
578
|
+
self._check_query(plan, inputs.params or {})
|
|
578
579
|
self._bind_params(plan, inputs.params or {}, bound)
|
|
579
580
|
self._bind_caller(plan, inputs.identity, bound)
|
|
580
581
|
self._bind_agents(plan, inputs.identity, bound)
|
|
@@ -688,6 +689,24 @@ class RuntimeExecutor:
|
|
|
688
689
|
use_case_name=plan.use_case_type.__qualname__,
|
|
689
690
|
)
|
|
690
691
|
|
|
692
|
+
@staticmethod
|
|
693
|
+
def _check_query(plan: ExecutionPlan, params: dict[str, Any]) -> None:
|
|
694
|
+
"""Refuse a ``Query()`` value that is not an instance of its type.
|
|
695
|
+
|
|
696
|
+
A generic coercion would call the type with the raw value: a struct
|
|
697
|
+
whose fields are positional would take a dict as its first field. The
|
|
698
|
+
message names the type received, never the value.
|
|
699
|
+
"""
|
|
700
|
+
binding = plan.query_binding
|
|
701
|
+
if binding is None or binding.name not in params:
|
|
702
|
+
return
|
|
703
|
+
raw = params[binding.name]
|
|
704
|
+
if not isinstance(raw, binding.query_type):
|
|
705
|
+
raise ParameterBindingError(
|
|
706
|
+
f"{plan.use_case_type.__qualname__}: parameter '{binding.name}' takes a "
|
|
707
|
+
f"{binding.query_type.__name__} instance, got {type(raw).__name__}"
|
|
708
|
+
)
|
|
709
|
+
|
|
691
710
|
@staticmethod
|
|
692
711
|
def _bind_caller(
|
|
693
712
|
plan: ExecutionPlan,
|
|
@@ -40,6 +40,24 @@ class InputBinding:
|
|
|
40
40
|
command_type: type[Any]
|
|
41
41
|
|
|
42
42
|
|
|
43
|
+
@dataclass(frozen=True)
|
|
44
|
+
class QueryBinding:
|
|
45
|
+
"""The declared query parameter marked with ``Query()``.
|
|
46
|
+
|
|
47
|
+
The parameter is also an ordinary :class:`ParamBinding`: the executor
|
|
48
|
+
receives the typed value under ``name``. This binding tells a transport
|
|
49
|
+
which type declares the query it must accept and decode.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
name: Parameter name as declared in the signature.
|
|
53
|
+
query_type: The strict ``msgspec.Struct`` or pydantic model declaring
|
|
54
|
+
the query.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
name: str
|
|
58
|
+
query_type: type[Any]
|
|
59
|
+
|
|
60
|
+
|
|
43
61
|
@dataclass(frozen=True)
|
|
44
62
|
class CallerBinding:
|
|
45
63
|
"""The caller-identity parameter marked with ``Caller()``.
|
|
@@ -205,6 +223,8 @@ class ExecutionPlan:
|
|
|
205
223
|
empty when the use case declares none.
|
|
206
224
|
mcp_bindings: ``Mcp()`` marker bindings, in declaration order; empty
|
|
207
225
|
when the use case declares none.
|
|
226
|
+
query_binding: ``Query()`` binding, or ``None`` when the use case
|
|
227
|
+
declares no ``Query()`` parameter.
|
|
208
228
|
load_steps: Entity prefetch steps, in declaration order.
|
|
209
229
|
exists_steps: Boolean existence checks, in declaration order.
|
|
210
230
|
compute_steps: Compute transformations, in declaration order.
|
|
@@ -247,3 +267,4 @@ class ExecutionPlan:
|
|
|
247
267
|
caller_binding: CallerBinding | None = None
|
|
248
268
|
agent_bindings: tuple[AgentBinding, ...] = ()
|
|
249
269
|
mcp_bindings: tuple[McpBinding, ...] = ()
|
|
270
|
+
query_binding: QueryBinding | None = None
|
|
@@ -2,8 +2,10 @@ from loom.core.errors.errors import (
|
|
|
2
2
|
Conflict,
|
|
3
3
|
DomainError,
|
|
4
4
|
Forbidden,
|
|
5
|
+
InsufficientAuthentication,
|
|
5
6
|
LoomError,
|
|
6
7
|
NotFound,
|
|
8
|
+
RateLimited,
|
|
7
9
|
RuleViolation,
|
|
8
10
|
RuleViolations,
|
|
9
11
|
SystemError,
|
|
@@ -14,8 +16,10 @@ __all__ = [
|
|
|
14
16
|
"Conflict",
|
|
15
17
|
"DomainError",
|
|
16
18
|
"Forbidden",
|
|
19
|
+
"InsufficientAuthentication",
|
|
17
20
|
"LoomError",
|
|
18
21
|
"NotFound",
|
|
22
|
+
"RateLimited",
|
|
19
23
|
"RuleViolation",
|
|
20
24
|
"RuleViolations",
|
|
21
25
|
"SystemError",
|
|
@@ -26,13 +26,16 @@ class ErrorCode(StrEnum):
|
|
|
26
26
|
|
|
27
27
|
NOT_FOUND = "not_found"
|
|
28
28
|
UNAUTHENTICATED = "unauthenticated"
|
|
29
|
+
INSUFFICIENT_AUTHENTICATION = "insufficient_authentication"
|
|
29
30
|
FORBIDDEN = "forbidden"
|
|
30
31
|
CONFLICT = "conflict"
|
|
31
32
|
RULE_VIOLATION = "rule_violation"
|
|
32
33
|
RULE_VIOLATIONS = "rule_violations"
|
|
33
34
|
BOUNDARY_VALIDATION = "boundary_validation"
|
|
35
|
+
QUERY_VALIDATION = "query_validation"
|
|
34
36
|
UNSUPPORTED_FORMAT = "unsupported_format"
|
|
35
37
|
UNSUPPORTED_QUERY = "unsupported_query"
|
|
38
|
+
RATE_LIMITED = "rate_limited"
|
|
36
39
|
SYSTEM_ERROR = "system_error"
|
|
37
40
|
SERVICE_UNAVAILABLE = "service_unavailable"
|
|
38
41
|
POST_COMMIT_FAILURE = "post_commit_failure"
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import math
|
|
3
4
|
from collections.abc import Iterable, Sequence
|
|
4
|
-
from typing import Any
|
|
5
|
+
from typing import Any, ClassVar
|
|
5
6
|
|
|
6
7
|
from loom.core.errors.codes import ErrorCode
|
|
7
8
|
|
|
@@ -92,6 +93,66 @@ class Unauthenticated(DomainError):
|
|
|
92
93
|
super().__init__(message, code=ErrorCode.UNAUTHENTICATED)
|
|
93
94
|
|
|
94
95
|
|
|
96
|
+
class InsufficientAuthentication(Unauthenticated):
|
|
97
|
+
"""Raised when the caller is authenticated, but not strongly or recently enough.
|
|
98
|
+
|
|
99
|
+
The caller can fix it by authenticating again under the stated
|
|
100
|
+
requirements (step-up).
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
message: Description of the missing authentication strength.
|
|
104
|
+
max_age: Seconds within which the caller must have authenticated;
|
|
105
|
+
``None`` when recency is not the issue.
|
|
106
|
+
acr_values: Authentication context classes acceptable for a retry,
|
|
107
|
+
in order of preference; empty when any will do.
|
|
108
|
+
|
|
109
|
+
Raises:
|
|
110
|
+
ValueError: If ``message`` is not a ``str``, ``max_age`` is not a
|
|
111
|
+
non-negative ``int``, ``acr_values`` is a single ``str`` or
|
|
112
|
+
``bytes``, or a value is not a ``str``, is empty, or holds a
|
|
113
|
+
character outside visible ASCII, a double quote or a backslash.
|
|
114
|
+
TypeError: If ``acr_values`` is not iterable.
|
|
115
|
+
|
|
116
|
+
Example::
|
|
117
|
+
|
|
118
|
+
raise InsufficientAuthentication(max_age=300, acr_values=("urn:mfa",))
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
default_message: ClassVar[str] = "A different authentication level is required"
|
|
122
|
+
|
|
123
|
+
def __init__(
|
|
124
|
+
self,
|
|
125
|
+
message: str = default_message,
|
|
126
|
+
*,
|
|
127
|
+
max_age: int | None = None,
|
|
128
|
+
acr_values: Iterable[str] = (),
|
|
129
|
+
) -> None:
|
|
130
|
+
if not isinstance(message, str):
|
|
131
|
+
raise ValueError("InsufficientAuthentication.message must be a str")
|
|
132
|
+
if max_age is not None and (type(max_age) is not int or max_age < 0):
|
|
133
|
+
raise ValueError("InsufficientAuthentication.max_age must be a non-negative int")
|
|
134
|
+
if isinstance(acr_values, (str, bytes)):
|
|
135
|
+
raise ValueError(
|
|
136
|
+
"InsufficientAuthentication.acr_values takes an iterable of str values, "
|
|
137
|
+
"not one str or bytes"
|
|
138
|
+
)
|
|
139
|
+
values = tuple(acr_values)
|
|
140
|
+
if not all(
|
|
141
|
+
isinstance(value, str)
|
|
142
|
+
and value
|
|
143
|
+
and all("!" <= char <= "~" and char not in '"\\' for char in value)
|
|
144
|
+
for value in values
|
|
145
|
+
):
|
|
146
|
+
raise ValueError(
|
|
147
|
+
"InsufficientAuthentication.acr_values must be visible ASCII without "
|
|
148
|
+
"whitespace, double quotes or backslashes"
|
|
149
|
+
)
|
|
150
|
+
super().__init__(message)
|
|
151
|
+
self.code = ErrorCode.INSUFFICIENT_AUTHENTICATION
|
|
152
|
+
self.max_age = max_age
|
|
153
|
+
self.acr_values: tuple[str, ...] = values
|
|
154
|
+
|
|
155
|
+
|
|
95
156
|
class Forbidden(DomainError):
|
|
96
157
|
"""Raised when an action is not permitted for the caller.
|
|
97
158
|
|
|
@@ -143,6 +204,32 @@ class Conflict(DomainError):
|
|
|
143
204
|
super().__init__(message, code=ErrorCode.CONFLICT)
|
|
144
205
|
|
|
145
206
|
|
|
207
|
+
class RateLimited(DomainError):
|
|
208
|
+
"""Raised when the caller spent its budget and must wait before retrying.
|
|
209
|
+
|
|
210
|
+
loom ships no limiter: the consumer decides who is limited and how much,
|
|
211
|
+
and raises this when a caller exceeds it.
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
retry_after: Seconds the caller should wait. Kept as whole seconds,
|
|
215
|
+
rounded up and at least ``1``.
|
|
216
|
+
message: Human-readable description of the refusal.
|
|
217
|
+
|
|
218
|
+
Raises:
|
|
219
|
+
ValueError: ``retry_after`` is not finite.
|
|
220
|
+
|
|
221
|
+
Example::
|
|
222
|
+
|
|
223
|
+
raise RateLimited(retry_after=2.0)
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
def __init__(self, retry_after: float, message: str = "Too many requests.") -> None:
|
|
227
|
+
if not math.isfinite(retry_after):
|
|
228
|
+
raise ValueError(f"RateLimited.retry_after must be finite, got {retry_after!r}")
|
|
229
|
+
super().__init__(message, code=ErrorCode.RATE_LIMITED)
|
|
230
|
+
self.retry_after = max(1, math.ceil(retry_after))
|
|
231
|
+
|
|
232
|
+
|
|
146
233
|
class RuleViolation(DomainError):
|
|
147
234
|
"""Raised when a single business rule is violated.
|
|
148
235
|
|
|
@@ -18,7 +18,9 @@ class Job(ABC, Generic[ResultT]):
|
|
|
18
18
|
|
|
19
19
|
``Job`` is independent of ``UseCase`` — it does not inherit from it.
|
|
20
20
|
The compiler and factory operate on ``__execution_plan__`` and
|
|
21
|
-
``execute()`` by duck typing, so they support ``Job`` without changes
|
|
21
|
+
``execute()`` by duck typing, so they support ``Job`` without changes,
|
|
22
|
+
except that the compiler refuses a ``Query()`` parameter on a ``Job``: a
|
|
23
|
+
job is dispatched with primitive parameters.
|
|
22
24
|
|
|
23
25
|
Subclass and implement ``execute`` with any typed signature. The method
|
|
24
26
|
may be ``async def`` or a plain ``def``; the Celery runner detects the
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Reading the JSON Schema a :class:`~loom.core.model.LoomType` publishes.
|
|
2
|
+
|
|
3
|
+
msgspec puts the root of a model behind ``{"$ref": "#/$defs/Name"}`` and
|
|
4
|
+
pydantic inlines it; both keep nested definitions under ``$defs`` and write
|
|
5
|
+
an optional value as an ``anyOf`` with a ``null`` branch.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from collections.abc import Mapping
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
DEFS = "$defs"
|
|
14
|
+
REF = "$ref"
|
|
15
|
+
DEFS_PREFIX = "#/$defs/"
|
|
16
|
+
|
|
17
|
+
_NULL = {"type": "null"}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def definition(schema: Mapping[str, Any], definitions: Mapping[str, Any]) -> Mapping[str, Any]:
|
|
21
|
+
"""Return the definition *schema* references, or *schema* when it references none."""
|
|
22
|
+
ref = schema.get(REF)
|
|
23
|
+
return definitions[ref.removeprefix(DEFS_PREFIX)] if ref is not None else schema
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def without_null(prop: Mapping[str, Any]) -> Mapping[str, Any]:
|
|
27
|
+
"""Return an optional property as its single non-null branch, without a ``None`` default.
|
|
28
|
+
|
|
29
|
+
A property that is not ``X | None`` is returned as it is.
|
|
30
|
+
"""
|
|
31
|
+
options = [option for option in prop.get("anyOf", ()) if option != _NULL]
|
|
32
|
+
if len(options) != 1:
|
|
33
|
+
return prop
|
|
34
|
+
rest = {k: v for k, v in prop.items() if k != "anyOf" and not (k == "default" and v is None)}
|
|
35
|
+
return {**options[0], **rest}
|