loom-kernel 7.0.0__tar.gz → 8.0.1__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-7.0.0 → loom_kernel-8.0.1}/CHANGELOG.md +78 -3
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/PKG-INFO +1 -1
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/backend/sqlalchemy.py +8 -4
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/introspection.py +10 -4
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/types.py +10 -2
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/handlers/_shared.py +22 -22
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/handlers/steps.py +39 -6
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/compiler/_plan.py +0 -4
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/compiler/phases/build_plan.py +12 -10
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/compiler/phases/validate.py +85 -81
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_boundary.py +0 -7
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_mongo.py +0 -3
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_shape.py +3 -4
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_step.py +16 -3
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/.gitignore +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/LICENSE +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/README.md +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/pyproject.toml +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/_concurrency.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/_filters.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/_paths.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/_roles.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/_startup.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/_transport.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/_usecase.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/a2a/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/a2a/_binding.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/a2a/_handlers.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/a2a/_rpc.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/a2a/card.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/a2a/events.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/a2a/server.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/abc.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/bootstrap.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/_compiler.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/_fingerprint.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/_plan.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/phases/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/phases/_capabilities.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/phases/_conversation.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/phases/_feedable.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/phases/_hook.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/phases/_instructions.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/phases/_limits.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/phases/_model_role.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/phases/_output.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/compiler/phases/_state.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/declarative/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/declarative/_envelope.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/declarative/_schema.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/declarative/_v1.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/describe.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_escape.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_history.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_instructions.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_limits.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_mcp.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_native.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/extras/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/extras/a2a.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/extras/handlebars.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/extras/mcp.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/extras/skills.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/providers/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/providers/_shared.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/providers/anthropic.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/providers/bedrock.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/providers/gateway.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/providers/openai.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/engines/pydantic_ai/providers/typesafe.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/etl/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/etl/_batch.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/etl/_columns.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/etl/_frames.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/etl/_ledger.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/etl/_runner.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/etl/_validation.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/fastapi/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/fastapi/endpoints.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/fastapi/response.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/fastapi/streaming.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/inference.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/pricing.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/registry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/remote_auth.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/runtime/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/runtime/_bounded.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/runtime/_chain.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/runtime/_conversation.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/runtime/_grants.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/runtime/_handle.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/runtime/_health.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/runtime/_hooks.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/runtime/_lifecycle.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/runtime/_limits.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/runtime/_mcp.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/validate/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/ai/validate/__main__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/celery/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/celery/auto.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/celery/bootstrap.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/celery/config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/celery/constants.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/celery/runner.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/celery/service.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/cli/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/cli/app.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/cli/check.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/cli/schema.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/async_bridge.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/authz/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/authz/_decide.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/authz/_grants.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/authz/_roles.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/authz/_scope.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/authz/elevation.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/authz/product.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/backend/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/backend/core_model.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/backend/protocol.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/backend/scoped_ddl.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/bootstrap/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/bootstrap/bootstrap.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/bootstrap/kernel.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/_batching.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/_single_flight.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/abc/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/abc/backend.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/abc/config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/abc/dependency.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/calls.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/codec.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/decorators.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/dependency.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/gateway.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/keys.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/memory.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/repository.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/result_codec.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/serializer.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/cache/wiring.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/checks.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/command/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/command/adapter.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/command/base.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/command/field.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/command/introspection.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/compiler.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/_boto3.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/_includes.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/_resolver_utils.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/binder.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/configurable.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/context.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/keys.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/loader.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/model.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/observability.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/overrides.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/resolver.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/secrets.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/config/ssm.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/contracts/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/contracts/manifest.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/di/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/di/container.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/di/scope.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/discovery/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/discovery/_utils.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/discovery/base.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/discovery/interfaces.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/discovery/manifest.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/discovery/modules.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/engine/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/engine/compilable.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/engine/compiler.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/engine/events.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/engine/executor.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/engine/metrics.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/engine/plan.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/engine/post_commit.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/environment.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/errors/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/errors/codes.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/errors/errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/expr/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/expr/eval.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/expr/nodes.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/expr/refs.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/identity/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/identity/context.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/identity/identity.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/identity/issuer.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/identity/wire.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/introspection/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/introspection/base.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/introspection/describe.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/job/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/job/callback.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/job/context.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/job/handle.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/job/job.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/job/service.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/locator.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/logger/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/logger/abc.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/logger/checks.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/logger/config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/logger/registry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/logger/structlogger.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/_json_schema.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/_loom_type.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/base.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/convert.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/enums.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/field.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/partition.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/privilege.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/projection.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/relation.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/scoped.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/struct.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/timestamped.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/model/types_postgres.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/observability/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/observability/config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/observability/event.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/observability/observer/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/observability/observer/noop.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/observability/observer/otel.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/observability/observer/structlog.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/observability/otel_ids.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/observability/protocol.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/observability/runtime.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/observability/span.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/observability/topology.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/persistence/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/persistence/abc.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/persistence/none.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/persistence/registry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/plugins/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/plugins/entrypoints.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/plugins/optional.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/projection/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/projection/loaders.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/projection/runtime.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/abc/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/abc/cursor.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/abc/errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/abc/query.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/abc/query_compiler.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/abc/repo_for.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/abc/repository.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/abc/session_scope.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/dynamodb/backend.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/dynamodb/registry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/dynamodb/repository.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/dynamodb/uow.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/mongo/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/mongo/backend.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/mongo/ids.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/mongo/query_compiler.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/mongo/registry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/mongo/repository.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/mongo/uow.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/mongo/values.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/mutation.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/registration.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/registry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/backend.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/migrations/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/migrations/env_template.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/migrations/hook.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/migrations/operations.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/migrations/runners.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/model.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/bootstrap.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/elevate.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/guard/0001.sql +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/guard/0002.sql +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/guard/preflight.sql +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/guard_manifest.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/integrity.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/partitions.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/provider.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/schema.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/sources.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/rls/verify.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/session_settings.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/repository/sqlalchemy/values.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/response/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/response/base.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/routing/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/routing/ref.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/routing/resolver.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/runner.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/schema/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/schema/schema_mode.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/schema_names.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/sql/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/sql/abc/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/sql/abc/contracts.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/sql/abc/errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/sql/caller_bound.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/sql/clickhouse/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/sql/clickhouse/_client.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/sql/clickhouse/executor.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/sql/clickhouse/registry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/sql/config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/sql/roles.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/sql/service.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/symbols.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/tracing/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/tracing/context.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/transaction.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/transport/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/transport/adapter.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/uow/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/uow/abc.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/uow/context.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/_predicates.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/agent_markers.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/compute.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/constants.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/factory.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/field_ref.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/invoker.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/keys.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/markers.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/mcp_markers.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/outcome.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/registry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/rule.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/core/use_case/use_case.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/_uri.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_format_registry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_historify/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_historify/_common.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_historify/_log.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_historify/_ops.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_historify/_transform.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_merge.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_path_template.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_predicate.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/_write_policy.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/polars/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/polars/_dtype.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/polars/_file_writer.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/polars/_frame.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/polars/_historify.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/polars/_predicate.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/polars/_reader.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/polars/_schema.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/polars/_streaming.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/polars/_writer.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/polars/provider.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/spark/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/spark/_dtype.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/spark/_historify.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/spark/_reader.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/spark/_schema.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/spark/_writer.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/backends/spark/provider.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/checkpoint/_cleaners.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/checkpoint/_options.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/checkpoint/_paths.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/checkpoint/_scope.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/checkpoint/_store.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/compiler/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/compiler/_binding.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/compiler/_compiler.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/compiler/_errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/compiler/_filter.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/compiler/_plan.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/compiler/_validators.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/compiler/_validators_agents.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/compiler/_validators_config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/compiler/_validators_plan.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/compiler/_validators_step.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/_format.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/_read_options.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/_utils.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/_with_agent.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/_write_options.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/expr/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/expr/_params.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/expr/_predicate.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/expr/_refs.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/source/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/source/_from.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/source/_from_config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/source/_specs.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_client.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_file.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_history/_report.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_into.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_table.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/declarative/target/_temp.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/executor/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/executor/_agents.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/executor/_dispatcher.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/executor/_executor.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/_registry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/sources/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/sources/_clickhouse.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/sources/_dynamodb.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/sources/_mongo.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/sources/_serialization.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/targets/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/io/targets/_clickhouse.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/lineage/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/lineage/_config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/lineage/_observer.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/lineage/_records.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/lineage/sinks/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/lineage/sinks/_table.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/lineage/sinks/_writer.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/maintenance/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/maintenance/_builder.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/maintenance/_ops.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/maintenance/_protocol.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/maintenance/_runner.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/maintenance/_step.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/pipeline/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/pipeline/_generics.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/pipeline/_params.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/pipeline/_pipeline.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/pipeline/_process.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/pipeline/_sql.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/pipeline/_step.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/pipeline/_step_client.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/pipeline/_step_sql.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/runner/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/runner/_agents.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/runner/_providers.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/runner/_wiring.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/runner/config_loader.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/runner/core.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/runner/errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/runner/filtering.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/runtime/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/runtime/_config_values.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/runtime/contracts.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/schema/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/schema/_contract.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/schema/_schema.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/storage/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/storage/_config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/storage/_file_locator.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/storage/_locator.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/storage/routing.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/testing/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/testing/_result.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/testing/_runners.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/testing/_scenario.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/testing/_stubs.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/etl/testing/spark.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/_async.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/_config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/_ctx.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/_flow_yaml.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/_meta.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/_placeholders.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/_summary.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/deploy/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/deploy/_discovery.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/deploy/_schedule.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/deploy/_yaml_etls.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/deploy/entrypoint.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_assemble.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_backfill.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_backfill_body.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_body.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_common.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_factory.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_hooks.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_maintenance.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_params.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_run_name.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_runtime.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_signature.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/flow/_stages.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/manifest/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/manifest/_model.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/manifest/_s3.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/manifest/_store.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/notify/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/notify/_event.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/notify/_factory.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/notify/_format.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/notify/_port.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/notify/_slack.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/notify/_sns.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/observer/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/observer/_flow.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/observer/_logging_bridge.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/observer/_manifest.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prefect/observer/_task_run.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prometheus/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prometheus/_instruments.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prometheus/adapter.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prometheus/kafka.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prometheus/lifecycle.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/prometheus/middleware.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/py.typed +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/_body.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/adapter.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/auth/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/auth/abc.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/auth/config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/auth/jwt.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/auth/middleware.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/autocrud.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/checks.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/compiler.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/constants.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/cors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/fastapi/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/fastapi/_errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/fastapi/_exclusions.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/fastapi/app.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/fastapi/auto.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/fastapi/health.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/fastapi/openapi.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/fastapi/response.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/fastapi/router_runtime.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/fastapi/sql.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/middleware.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/model.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/rest/rest_adapter.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/_adapter.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/_errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/_operators.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/bytewax/runner.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/compiler/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/compiler/_bindings.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/compiler/_compiler.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/compiler/_errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/core/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/core/_errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/core/_exceptions.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/core/_message.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/core/_tracing.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/core/_typing.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/graph/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/graph/_flow.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/_codec.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/_config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/_errors.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/_key_resolver.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/_message.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/_record.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/_wire.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/client/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/client/_consumer.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/client/_producer.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/client/_protocol.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/client/_retry.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/message/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/message/_consumer.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/message/_producer.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/kafka/message/_protocol.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/mongo/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/mongo/_config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/mongo/_event.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/mongo/_normalize.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_branches.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_broadcast.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_capabilities.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_decompose.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_expand_routes.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_expr_eval.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_fork.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_helpers.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_protocols.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_router.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_sink.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_table/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_table/common.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_table/config.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/_with.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/nodes/refs.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/streaming/testing.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/testing/__init__.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/testing/agents.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/testing/golden.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/testing/http_harness.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/testing/in_memory.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/testing/repository_harness.py +0 -0
- {loom_kernel-7.0.0 → loom_kernel-8.0.1}/src/loom/testing/runner.py +0 -0
|
@@ -459,6 +459,16 @@
|
|
|
459
459
|
|
|
460
460
|
### core
|
|
461
461
|
|
|
462
|
+
- **core:** a `Decimal` field, plain or optional, declares its column type: a
|
|
463
|
+
SQLAlchemy model with an undeclared one is refused when it is compiled,
|
|
464
|
+
naming the field. loom inferred `NUMERIC(10, 2)`, and Postgres silently
|
|
465
|
+
rounds a value to that scale (`1.2345` is stored as `1.23`) and refuses one
|
|
466
|
+
past that precision. Migration: declare it, e.g.
|
|
467
|
+
`Annotated[Decimal, Numeric(precision=20, scale=6)]` or
|
|
468
|
+
`ColumnField(Numeric(precision=20, scale=6))`; `Numeric()` with no
|
|
469
|
+
precision is now an unbounded `NUMERIC` instead of `NUMERIC(10, 2)`, and
|
|
470
|
+
`Numeric(scale=...)` without a precision raises `ValueError`, as SQLAlchemy
|
|
471
|
+
would drop the scale.
|
|
462
472
|
- **core:** `sql_endpoint.auth` admits only `identity` and `external`;
|
|
463
473
|
`auth: jwt` is refused when the config is loaded, and the alias and its
|
|
464
474
|
`DeprecationWarning` are gone. Migration: replace `auth: jwt` with
|
|
@@ -949,6 +959,40 @@
|
|
|
949
959
|
|
|
950
960
|
### streaming
|
|
951
961
|
|
|
962
|
+
- **streaming:** `FromTopic`, `FromMultiTypeTopic`, `FromMongoCDC` and
|
|
963
|
+
`IntoTopic` take no `shape`, `CompiledSingleSource`, `CompiledMultiSource`
|
|
964
|
+
and `CompiledMongoCDCSource` have no `shape` field, and `StreamShape.MANY`
|
|
965
|
+
is removed. The runtime never read a declared shape: every source emits one
|
|
966
|
+
record per message, so a source declared `BATCH` was shape-checked as
|
|
967
|
+
batches while its nodes received records, and an `IntoTopic` writes one
|
|
968
|
+
record per message whatever it declared. Every flow now starts as a record
|
|
969
|
+
stream, and an `IntoTopic` ends its path (shape `none`). Migration: drop
|
|
970
|
+
`shape=`; to work on batches, use `CollectBatch` and, back to records,
|
|
971
|
+
`ForEach`.
|
|
972
|
+
- **streaming:** a batch reaching a `Drain` or a `Broadcast` fails compilation
|
|
973
|
+
with `SHAPE_MISMATCH`, whatever the delivery. Under at-most-once delivery
|
|
974
|
+
`CollectBatch → Drain` compiled and dropped the batch; under at-least-once
|
|
975
|
+
the batch's offsets never completed. Under at-least-once a `Broadcast` with
|
|
976
|
+
more than one route raised `TypeError` (`Expected Message, got list`) on a
|
|
977
|
+
batch. Put a `ForEach` before the node.
|
|
978
|
+
- **streaming:** `BatchExpandStep.execute` returns one list of payloads per
|
|
979
|
+
message of its batch, in batch order, instead of one flat list. List `i`
|
|
980
|
+
holds what `messages[i]` expands into; each output takes that message's
|
|
981
|
+
metadata, and an empty list filters the message out. A result whose length
|
|
982
|
+
differs from the batch, a flat list of payloads, a `Message` among the
|
|
983
|
+
outputs, or a `str`, `bytes`, `bytearray` or mapping in place of the result
|
|
984
|
+
or of one of its lists raises `TypeError`, and the batch becomes error
|
|
985
|
+
envelopes.
|
|
986
|
+
|
|
987
|
+
```python
|
|
988
|
+
# before
|
|
989
|
+
def execute(self, messages: list[Message[Event]], **kwargs: object) -> list[Score]:
|
|
990
|
+
return [Score(value=m.payload.amount) for m in messages]
|
|
991
|
+
|
|
992
|
+
# after
|
|
993
|
+
def execute(self, messages: list[Message[Event]], **kwargs: object) -> list[list[Score]]:
|
|
994
|
+
return [[Score(value=m.payload.amount)] for m in messages]
|
|
995
|
+
```
|
|
952
996
|
- **streaming:** compile issues come from the code catalogue
|
|
953
997
|
(`StreamingErrorCode.X.issue(...)`), and the compiler's private issue
|
|
954
998
|
factories are removed. `loom.streaming.compiler.CompilationIssue` is a type
|
|
@@ -957,9 +1001,11 @@
|
|
|
957
1001
|
`CompileIssue` instead), `loom_message_type()` is gone, and
|
|
958
1002
|
`CompilationIssue.prefixed()` is removed. Messages keep their text.
|
|
959
1003
|
- **streaming:** a `Broadcast` followed by another node reports
|
|
960
|
-
`BROADCAST_NOT_LAST` with component `broadcast`, at the top level
|
|
961
|
-
branch
|
|
962
|
-
|
|
1004
|
+
`BROADCAST_NOT_LAST` with component `broadcast`, at the top level and in a
|
|
1005
|
+
branch. It used to report `TERMINAL_NOT_LAST` with component `Broadcast`. In
|
|
1006
|
+
a Router branch a `Broadcast` reports `ROUTER_BRANCH_UNSAFE_NODE`, and one
|
|
1007
|
+
followed by another node also `TERMINAL_NOT_LAST` with component
|
|
1008
|
+
`router branch <label> > Broadcast`.
|
|
963
1009
|
- **streaming:** a Router branch that ends in `IntoTopic`, `IntoTable` (any
|
|
964
1010
|
`IntoSink`) or `Drain` hands the message to that terminal. The branch's
|
|
965
1011
|
terminal was skipped: with a flow `output` the message went to the output
|
|
@@ -1346,6 +1392,27 @@
|
|
|
1346
1392
|
|
|
1347
1393
|
### streaming
|
|
1348
1394
|
|
|
1395
|
+
- **streaming:** `ForEach` accepts the batch a `BatchStep` produces, so
|
|
1396
|
+
`CollectBatch → BatchStep → ForEach → IntoTopic` compiles; it failed with
|
|
1397
|
+
`shape mismatch: expected many but got batch before ForEach`. Under
|
|
1398
|
+
at-least-once delivery each offset completes once, after its write is
|
|
1399
|
+
flushed.
|
|
1400
|
+
- **streaming:** a batch reaching a node that takes records fails compilation
|
|
1401
|
+
with `SHAPE_MISMATCH`: `IntoTopic`, `IntoTable` (any `IntoSink`), `Fork`,
|
|
1402
|
+
`ExpandRoutes`, `CollectBatch` (it groups records), the flow `output`
|
|
1403
|
+
(component `flow.output`, field `output`)
|
|
1404
|
+
and a Broadcast route `output` (component `broadcast branch <n> > output`,
|
|
1405
|
+
field `output`). Such flows used to compile. `CollectBatch → BatchStep →
|
|
1406
|
+
IntoTopic` raised `'list' object has no attribute 'meta'` at runtime. Put a
|
|
1407
|
+
`ForEach` before the node. `Drain` and `Broadcast` are under Behaviour
|
|
1408
|
+
changes.
|
|
1409
|
+
- **streaming:** a `BatchExpandStep` subclass outputs records to the shape
|
|
1410
|
+
check. The compiler matched step output shapes by exact type, so every step
|
|
1411
|
+
subclass kept the incoming shape and a record step after a
|
|
1412
|
+
`BatchExpandStep` failed with `expected record but got batch`. The shape
|
|
1413
|
+
check reads a step's `input_shape` and `output_shape` from its class,
|
|
1414
|
+
except in a Router branch: there a `BatchStep` runs one record at a time,
|
|
1415
|
+
on a one-message batch, so it is record to record.
|
|
1349
1416
|
- **streaming:** a `Broadcast` is validated as a `Broadcast`. The compiler
|
|
1350
1417
|
treated it as a plain terminal, so the nodes of its branches were never
|
|
1351
1418
|
shape-checked. A branch with a shape mismatch, such as a record step after
|
|
@@ -1407,6 +1474,14 @@
|
|
|
1407
1474
|
`Drain` default failed with `ROUTER_BRANCH_SHAPE_DIVERGENCE`, and a step
|
|
1408
1475
|
after a `Router` without a default whose branches all end their path failed
|
|
1409
1476
|
with `SHAPE_MISMATCH`; both compile now.
|
|
1477
|
+
- **streaming:** a `BatchExpandStep` expands. Every output had to pair with
|
|
1478
|
+
one input message, so a step returning more or fewer outputs than its batch
|
|
1479
|
+
raised and each message of the batch became an error envelope. Under
|
|
1480
|
+
at-least-once delivery each source offset now completes once per output,
|
|
1481
|
+
after that output's write, and a message with no output completes its
|
|
1482
|
+
offset at the step, also when the batch holds several messages of one
|
|
1483
|
+
offset that an earlier expanding node produced. The new return type is under
|
|
1484
|
+
Behaviour changes.
|
|
1410
1485
|
|
|
1411
1486
|
### prefect
|
|
1412
1487
|
|
|
@@ -292,15 +292,19 @@ def _compile_model(
|
|
|
292
292
|
def _refuse_undeclared_column_types(
|
|
293
293
|
struct_cls: type, column_fields: Mapping[str, ColumnFieldInfo]
|
|
294
294
|
) -> None:
|
|
295
|
-
"""Refuse a plain enum or ``Literal`` field whose column type is not declared.
|
|
295
|
+
"""Refuse a ``Decimal``, plain enum or ``Literal`` field whose column type is not declared.
|
|
296
296
|
|
|
297
|
-
loom does not infer a SQL type from the values of
|
|
297
|
+
loom does not infer a SQL type from the values of an enum or a ``Literal``,
|
|
298
|
+
nor a precision and scale for a ``Decimal``: Postgres rounds a value to the
|
|
299
|
+
declared scale and refuses one past the declared precision.
|
|
298
300
|
"""
|
|
299
301
|
for name, info in column_fields.items():
|
|
300
302
|
if info.needs_declared_type:
|
|
301
303
|
raise ValueError(
|
|
302
|
-
f"{struct_cls.__name__}.{name}: no column type
|
|
303
|
-
"Enum or Literal annotation; declare it, e.g.
|
|
304
|
+
f"{struct_cls.__name__}.{name}: no column type is inferred from a Decimal, "
|
|
305
|
+
"plain Enum or Literal annotation; declare it, e.g. "
|
|
306
|
+
"`Annotated[Decimal, Numeric(precision=12, scale=2)]` for a Decimal, "
|
|
307
|
+
"`ColumnField(String(20))` for an Enum or Literal"
|
|
304
308
|
)
|
|
305
309
|
|
|
306
310
|
|
|
@@ -11,6 +11,7 @@ from typing import (
|
|
|
11
11
|
Annotated,
|
|
12
12
|
Any,
|
|
13
13
|
ClassVar,
|
|
14
|
+
Final,
|
|
14
15
|
Literal,
|
|
15
16
|
Union,
|
|
16
17
|
cast,
|
|
@@ -56,8 +57,9 @@ class ColumnFieldInfo:
|
|
|
56
57
|
"""Resolved metadata for a single column field.
|
|
57
58
|
|
|
58
59
|
``needs_declared_type`` marks a field whose column type was not declared
|
|
59
|
-
and
|
|
60
|
-
|
|
60
|
+
and is not inferred: ``column_type`` is then a placeholder, an unbounded
|
|
61
|
+
``Numeric`` for a ``Decimal``, whose precision and scale must be declared,
|
|
62
|
+
and JSON for a plain enum or a ``Literal``.
|
|
61
63
|
"""
|
|
62
64
|
|
|
63
65
|
name: str
|
|
@@ -120,7 +122,7 @@ def _resolve_column_field(
|
|
|
120
122
|
python_type=_extract_origin_type(annotation),
|
|
121
123
|
column_type=column_type or JSON,
|
|
122
124
|
field=field,
|
|
123
|
-
needs_declared_type=column_type is None,
|
|
125
|
+
needs_declared_type=column_type is None or column_type is _UNDECLARED_DECIMAL,
|
|
124
126
|
)
|
|
125
127
|
|
|
126
128
|
|
|
@@ -401,6 +403,10 @@ def _is_classvar(annotation: Any) -> bool:
|
|
|
401
403
|
return get_origin(annotation) is ClassVar
|
|
402
404
|
|
|
403
405
|
|
|
406
|
+
# The placeholder of a Decimal with no declared column type; the SQLAlchemy
|
|
407
|
+
# compiler refuses such a field, so it is never compiled.
|
|
408
|
+
_UNDECLARED_DECIMAL: Final = Numeric()
|
|
409
|
+
|
|
404
410
|
_SCALAR_TYPE_MAP: dict[type, ColumnType] = {
|
|
405
411
|
int: Integer,
|
|
406
412
|
float: Float,
|
|
@@ -409,7 +415,7 @@ _SCALAR_TYPE_MAP: dict[type, ColumnType] = {
|
|
|
409
415
|
datetime: DateTime(tz=True),
|
|
410
416
|
date: Date,
|
|
411
417
|
time: Time,
|
|
412
|
-
Decimal:
|
|
418
|
+
Decimal: _UNDECLARED_DECIMAL,
|
|
413
419
|
}
|
|
414
420
|
|
|
415
421
|
|
|
@@ -28,8 +28,16 @@ def DateTime(*, tz: bool = True) -> ColumnType:
|
|
|
28
28
|
return ColumnType("DateTime", kwargs={"timezone": tz})
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
def Numeric(*, precision: int =
|
|
32
|
-
|
|
31
|
+
def Numeric(*, precision: int | None = None, scale: int | None = None) -> ColumnType:
|
|
32
|
+
"""A ``NUMERIC`` column; with no precision it is unbounded.
|
|
33
|
+
|
|
34
|
+
Raises:
|
|
35
|
+
ValueError: A scale is given without a precision; SQLAlchemy would
|
|
36
|
+
ignore it.
|
|
37
|
+
"""
|
|
38
|
+
if scale is not None and precision is None:
|
|
39
|
+
raise ValueError("Numeric: a scale needs a precision")
|
|
40
|
+
return ColumnType("Numeric", kwargs={"precision": precision, "scale": scale})
|
|
33
41
|
|
|
34
42
|
|
|
35
43
|
class _JsonMarker:
|
|
@@ -36,6 +36,7 @@ if TYPE_CHECKING:
|
|
|
36
36
|
|
|
37
37
|
Stream: TypeAlias = Any
|
|
38
38
|
AwaitT = TypeVar("AwaitT")
|
|
39
|
+
ExpandT = TypeVar("ExpandT", bound=Iterable[Any])
|
|
39
40
|
|
|
40
41
|
|
|
41
42
|
@runtime_checkable
|
|
@@ -91,11 +92,8 @@ class _ExecutableBatchExpandStep(Protocol):
|
|
|
91
92
|
self,
|
|
92
93
|
messages: list[Message[StreamPayload]],
|
|
93
94
|
**kwargs: object,
|
|
94
|
-
) ->
|
|
95
|
-
|
|
96
|
-
| Awaitable[Iterable[StreamPayload | Message[StreamPayload]]]
|
|
97
|
-
):
|
|
98
|
-
"""Expand one batch into many payloads or replacement messages."""
|
|
95
|
+
) -> Iterable[Iterable[StreamPayload]] | Awaitable[Iterable[Iterable[StreamPayload]]]:
|
|
96
|
+
"""Expand each message of one batch into its own list of payloads."""
|
|
99
97
|
...
|
|
100
98
|
|
|
101
99
|
|
|
@@ -259,10 +257,9 @@ def _resolve_batch_result(
|
|
|
259
257
|
|
|
260
258
|
|
|
261
259
|
def _resolve_expand_result(
|
|
262
|
-
result:
|
|
263
|
-
| Awaitable[Iterable[StreamPayload | Message[StreamPayload]]],
|
|
260
|
+
result: ExpandT | Awaitable[ExpandT],
|
|
264
261
|
node_type: str,
|
|
265
|
-
) ->
|
|
262
|
+
) -> ExpandT:
|
|
266
263
|
"""Resolve a synchronous expanding result and reject awaitables."""
|
|
267
264
|
if isinstance(result, Awaitable):
|
|
268
265
|
raise TypeError(f"{node_type} returned an awaitable outside WithAsync.")
|
|
@@ -353,9 +350,11 @@ def _reconcile_fanout(
|
|
|
353
350
|
|
|
354
351
|
An expanding node turns one input record into N outputs that all carry the
|
|
355
352
|
same source offset, and every one of them completes that offset when it
|
|
356
|
-
reaches a terminal.
|
|
357
|
-
|
|
358
|
-
|
|
353
|
+
reaches a terminal. Each input already owes one completion, and a batch can
|
|
354
|
+
hold several inputs of one offset when an earlier node expanded it, so per
|
|
355
|
+
offset the outputs are compared with the inputs: extra outputs fork the
|
|
356
|
+
difference, and missing ones complete it here — while the outputs are still
|
|
357
|
+
a plain list and none of them can have reached a terminal yet.
|
|
359
358
|
|
|
360
359
|
Two failures this prevents, both silent:
|
|
361
360
|
|
|
@@ -372,20 +371,21 @@ def _reconcile_fanout(
|
|
|
372
371
|
"""
|
|
373
372
|
if tracker is None:
|
|
374
373
|
return
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
tracker.fork(key[0], key[1], key[2], count - 1)
|
|
383
|
-
for original in originals:
|
|
384
|
-
key = _commit_key(original)
|
|
385
|
-
if key is not None and key not in produced:
|
|
374
|
+
expected = _commit_key_counts(originals)
|
|
375
|
+
produced = _commit_key_counts(results)
|
|
376
|
+
for key in expected | produced:
|
|
377
|
+
delta = produced[key] - expected[key]
|
|
378
|
+
if delta > 0:
|
|
379
|
+
tracker.fork(key[0], key[1], key[2], delta)
|
|
380
|
+
for _ in range(-delta):
|
|
386
381
|
tracker.complete(key[0], key[1], key[2])
|
|
387
382
|
|
|
388
383
|
|
|
384
|
+
def _commit_key_counts(items: Sequence[Any]) -> Counter[tuple[str, int, int]]:
|
|
385
|
+
"""Count the items accountable for each source offset."""
|
|
386
|
+
return Counter(key for item in items if (key := _commit_key(item)) is not None)
|
|
387
|
+
|
|
388
|
+
|
|
389
389
|
def _drop_and_commit(item: Any, tracker: CommitCompletionPort) -> tuple[()]:
|
|
390
390
|
"""Drop one item and mark it complete for commit tracking.
|
|
391
391
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from collections.abc import Iterable
|
|
5
|
+
from collections.abc import Iterable, Mapping
|
|
6
6
|
from typing import Any
|
|
7
7
|
|
|
8
8
|
from bytewax.operators import flat_map
|
|
@@ -134,8 +134,6 @@ def _apply_expand_step(
|
|
|
134
134
|
|
|
135
135
|
sid = _step_id(f"expand_{idx}_{name}", ctx)
|
|
136
136
|
mapped = bw_map(sid, stream, step_fn)
|
|
137
|
-
from bytewax.operators import flat_map
|
|
138
|
-
|
|
139
137
|
flattened_stream = flat_map(_step_id(f"flatten_expand_{idx}", ctx), mapped, _identity)
|
|
140
138
|
return _split_node_result(flattened_stream, sid, ctx, ErrorKind.TASK)
|
|
141
139
|
|
|
@@ -296,9 +294,44 @@ def _execute_batch_expand_step(
|
|
|
296
294
|
correlation_id=messages[0].meta.correlation_id if messages else None,
|
|
297
295
|
):
|
|
298
296
|
result = _resolve_expand_result(batch_expand_step.execute(messages), name)
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
297
|
+
return _outputs_per_message(messages, _result_list(result, name), name)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def _outputs_per_message(
|
|
301
|
+
messages: list[Message[StreamPayload]],
|
|
302
|
+
groups: list[Any],
|
|
303
|
+
name: str,
|
|
304
|
+
) -> list[Message[StreamPayload]]:
|
|
305
|
+
"""Give each output the metadata of the message whose list it is in.
|
|
306
|
+
|
|
307
|
+
``groups[i]`` holds the outputs of ``messages[i]``; an empty list filters
|
|
308
|
+
that message out.
|
|
309
|
+
"""
|
|
310
|
+
if len(groups) != len(messages):
|
|
311
|
+
raise TypeError(
|
|
312
|
+
f"{name} returned {len(groups)} output lists for {len(messages)} messages; "
|
|
313
|
+
"return one list of payloads per message, in batch order."
|
|
314
|
+
)
|
|
315
|
+
outputs: list[Message[StreamPayload]] = []
|
|
316
|
+
for message, payloads in zip(messages, groups, strict=True):
|
|
317
|
+
for payload in _result_list(payloads, name):
|
|
318
|
+
if isinstance(payload, Message):
|
|
319
|
+
raise TypeError(
|
|
320
|
+
f"{name} must return payloads, not messages: each output "
|
|
321
|
+
"takes the metadata of the message it came from."
|
|
322
|
+
)
|
|
323
|
+
outputs.append(_replace_payload(message, payload))
|
|
324
|
+
return outputs
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
def _result_list(value: object, name: str) -> list[Any]:
|
|
328
|
+
"""Materialize one list of a batch-expanding result, iterating it once.
|
|
329
|
+
|
|
330
|
+
``str``, ``bytes`` and mappings are iterable but are not lists of results.
|
|
331
|
+
"""
|
|
332
|
+
if not isinstance(value, Iterable) or isinstance(value, (str, bytes, bytearray, Mapping)):
|
|
333
|
+
raise TypeError(f"{name} must return one list of payloads per message.")
|
|
334
|
+
return list(value)
|
|
302
335
|
|
|
303
336
|
|
|
304
337
|
def _execute_explode_step(
|
|
@@ -31,7 +31,6 @@ class CompiledSingleSource:
|
|
|
31
31
|
settings: ConsumerSettings
|
|
32
32
|
topics: tuple[str, ...]
|
|
33
33
|
payload_type: type[LoomStruct | LoomFrozenStruct]
|
|
34
|
-
shape: StreamShape
|
|
35
34
|
decode_strategy: Literal["record", "batch"]
|
|
36
35
|
|
|
37
36
|
|
|
@@ -45,7 +44,6 @@ class CompiledMultiSource:
|
|
|
45
44
|
dispatch: Pre-built table mapping ``message_type`` and error
|
|
46
45
|
``payload_type`` strings to their concrete Python types, plus
|
|
47
46
|
explicit wire-error payload types.
|
|
48
|
-
shape: Declared source shape.
|
|
49
47
|
decode_strategy: Whether to decode records individually or in batches.
|
|
50
48
|
"""
|
|
51
49
|
|
|
@@ -54,7 +52,6 @@ class CompiledMultiSource:
|
|
|
54
52
|
settings: ConsumerSettings
|
|
55
53
|
topics: tuple[str, ...]
|
|
56
54
|
dispatch: DispatchTable
|
|
57
|
-
shape: StreamShape
|
|
58
55
|
decode_strategy: Literal["record", "batch"]
|
|
59
56
|
|
|
60
57
|
|
|
@@ -67,7 +64,6 @@ class CompiledMongoCDCSource:
|
|
|
67
64
|
settings: MongoSourceConfig
|
|
68
65
|
collections: tuple[str, ...]
|
|
69
66
|
watch_options: Mapping[str, object]
|
|
70
|
-
shape: StreamShape
|
|
71
67
|
|
|
72
68
|
|
|
73
69
|
@dataclass(frozen=True)
|
|
@@ -21,9 +21,8 @@ from loom.streaming.compiler._plan import (
|
|
|
21
21
|
CompiledStorageSink,
|
|
22
22
|
)
|
|
23
23
|
from loom.streaming.compiler.phases.validate import (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
_walk_all_process_nodes,
|
|
24
|
+
node_output_shape,
|
|
25
|
+
walk_process_nodes,
|
|
27
26
|
)
|
|
28
27
|
from loom.streaming.core._errors import ErrorEnvelope
|
|
29
28
|
from loom.streaming.graph._flow import StreamFlow
|
|
@@ -33,7 +32,7 @@ from loom.streaming.mongo import MongoConfig
|
|
|
33
32
|
from loom.streaming.nodes._boundary import FromMultiTypeTopic, FromTopic, IntoTopic
|
|
34
33
|
from loom.streaming.nodes._branches import is_branching_node, iter_branches
|
|
35
34
|
from loom.streaming.nodes._mongo import FromMongoCDC
|
|
36
|
-
from loom.streaming.nodes._shape import CollectBatch
|
|
35
|
+
from loom.streaming.nodes._shape import CollectBatch, StreamShape
|
|
37
36
|
from loom.streaming.nodes._sink import IntoSink
|
|
38
37
|
from loom.streaming.nodes._table import Backend, IntoTable
|
|
39
38
|
from loom.streaming.nodes._table.config import (
|
|
@@ -60,7 +59,7 @@ def build_plan(flow: StreamFlow[Any, Any], ctx: ConfigContext) -> CompiledPlan:
|
|
|
60
59
|
terminal_sinks, terminal_storage_sinks = _build_terminal_sinks(flow.process.nodes, ctx)
|
|
61
60
|
error_routes = {kind: _build_sink(topic, ctx) for kind, topic in flow.errors.items()}
|
|
62
61
|
needs_async = any(
|
|
63
|
-
_node_needs_async_bridge(node) for node in
|
|
62
|
+
_node_needs_async_bridge(node) for node in walk_process_nodes(flow.process.nodes)
|
|
64
63
|
)
|
|
65
64
|
return CompiledPlan(
|
|
66
65
|
name=flow.name,
|
|
@@ -74,6 +73,12 @@ def build_plan(flow: StreamFlow[Any, Any], ctx: ConfigContext) -> CompiledPlan:
|
|
|
74
73
|
)
|
|
75
74
|
|
|
76
75
|
|
|
76
|
+
def _node_needs_async_bridge(node: object) -> bool:
|
|
77
|
+
return isinstance(node, WithAsync) or (
|
|
78
|
+
isinstance(node, IntoTable) and node.backend is Backend.SQLALCHEMY
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
77
82
|
def _build_mongo_source(flow: StreamFlow[Any, Any], ctx: ConfigContext) -> CompiledMongoCDCSource:
|
|
78
83
|
source = flow.source
|
|
79
84
|
if not isinstance(source, FromMongoCDC):
|
|
@@ -85,7 +90,6 @@ def _build_mongo_source(flow: StreamFlow[Any, Any], ctx: ConfigContext) -> Compi
|
|
|
85
90
|
settings=settings,
|
|
86
91
|
collections=source.collections,
|
|
87
92
|
watch_options=watch_options,
|
|
88
|
-
shape=source.shape,
|
|
89
93
|
)
|
|
90
94
|
|
|
91
95
|
|
|
@@ -100,7 +104,6 @@ def _build_single_source(flow: StreamFlow[Any, Any], ctx: ConfigContext) -> Comp
|
|
|
100
104
|
settings=consumer,
|
|
101
105
|
topics=consumer.topics,
|
|
102
106
|
payload_type=source.payload,
|
|
103
|
-
shape=source.shape,
|
|
104
107
|
decode_strategy=decode_strategy,
|
|
105
108
|
)
|
|
106
109
|
|
|
@@ -117,7 +120,6 @@ def _build_multi_source(flow: StreamFlow[Any, Any], ctx: ConfigContext) -> Compi
|
|
|
117
120
|
settings=consumer,
|
|
118
121
|
topics=consumer.topics,
|
|
119
122
|
dispatch=dispatch,
|
|
120
|
-
shape=source.shape,
|
|
121
123
|
decode_strategy=decode_strategy,
|
|
122
124
|
)
|
|
123
125
|
|
|
@@ -169,10 +171,10 @@ def _require_message_type(t: type[Any]) -> str:
|
|
|
169
171
|
|
|
170
172
|
def _build_nodes(flow: StreamFlow[Any, Any]) -> list[CompiledNode]:
|
|
171
173
|
nodes: list[CompiledNode] = []
|
|
172
|
-
current_shape =
|
|
174
|
+
current_shape = StreamShape.RECORD
|
|
173
175
|
for node in flow.process.nodes:
|
|
174
176
|
input_shape = current_shape
|
|
175
|
-
output_shape =
|
|
177
|
+
output_shape = node_output_shape(node, current_shape)
|
|
176
178
|
nodes.append(
|
|
177
179
|
CompiledNode(
|
|
178
180
|
node=node,
|