loom-kernel 5.0.0__tar.gz → 6.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-5.0.0 → loom_kernel-6.0.1}/CHANGELOG.md +113 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/PKG-INFO +1 -1
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/sql/config.py +5 -21
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/_adapter.py +113 -76
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/_error_boundary.py +4 -3
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/_runtime_io.py +73 -87
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/handlers/_shared.py +11 -23
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/handlers/boundary.py +1 -2
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/handlers/dispatcher.py +22 -7
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/handlers/routing.py +105 -83
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/handlers/scopes.py +9 -13
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/handlers/shapes.py +4 -9
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/handlers/storage.py +110 -37
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/compiler/_errors.py +43 -5
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/compiler/phases/validate.py +41 -3
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_branches.py +30 -1
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_decompose.py +11 -8
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_router.py +1 -2
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_shape.py +0 -3
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_sink.py +23 -5
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_table/common.py +94 -50
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_with.py +1 -2
- loom_kernel-5.0.0/src/loom/streaming/bytewax/_dlq.py +0 -173
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/.gitignore +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/LICENSE +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/README.md +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/pyproject.toml +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/_concurrency.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/_filters.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/_paths.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/_roles.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/_startup.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/_transport.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/_usecase.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/a2a/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/a2a/_binding.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/a2a/_handlers.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/a2a/_rpc.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/a2a/card.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/a2a/events.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/a2a/server.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/abc.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/bootstrap.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/_compiler.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/_fingerprint.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/_plan.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/phases/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/phases/_capabilities.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/phases/_conversation.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/phases/_feedable.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/phases/_hook.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/phases/_instructions.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/phases/_limits.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/phases/_model_role.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/phases/_output.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/compiler/phases/_state.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/declarative/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/declarative/_envelope.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/declarative/_schema.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/declarative/_v1.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/describe.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_escape.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_history.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_instructions.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_limits.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_mcp.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_native.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/extras/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/extras/a2a.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/extras/handlebars.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/extras/mcp.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/extras/skills.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/providers/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/providers/_shared.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/providers/anthropic.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/providers/bedrock.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/providers/gateway.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/providers/openai.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/engines/pydantic_ai/providers/typesafe.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/etl/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/etl/_batch.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/etl/_columns.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/etl/_frames.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/etl/_ledger.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/etl/_runner.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/etl/_validation.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/fastapi/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/fastapi/endpoints.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/fastapi/response.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/fastapi/streaming.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/inference.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/pricing.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/registry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/remote_auth.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/runtime/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/runtime/_bounded.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/runtime/_chain.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/runtime/_conversation.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/runtime/_grants.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/runtime/_handle.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/runtime/_health.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/runtime/_hooks.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/runtime/_lifecycle.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/runtime/_limits.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/runtime/_mcp.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/validate/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/ai/validate/__main__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/celery/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/celery/auto.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/celery/bootstrap.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/celery/config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/celery/constants.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/celery/runner.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/celery/service.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/cli/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/cli/app.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/cli/check.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/cli/schema.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/async_bridge.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/authz/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/authz/_decide.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/authz/_grants.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/authz/_roles.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/authz/_scope.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/authz/elevation.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/authz/product.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/backend/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/backend/core_model.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/backend/protocol.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/backend/scoped_ddl.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/backend/sqlalchemy.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/bootstrap/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/bootstrap/bootstrap.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/bootstrap/kernel.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/_batching.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/_single_flight.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/abc/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/abc/backend.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/abc/config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/abc/dependency.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/calls.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/codec.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/decorators.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/dependency.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/gateway.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/keys.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/memory.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/repository.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/result_codec.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/serializer.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/cache/wiring.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/checks.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/command/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/command/adapter.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/command/base.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/command/field.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/command/introspection.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/compiler.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/_boto3.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/_includes.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/_resolver_utils.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/binder.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/configurable.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/context.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/keys.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/loader.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/model.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/observability.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/overrides.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/resolver.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/secrets.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/config/ssm.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/contracts/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/contracts/manifest.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/di/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/di/container.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/di/scope.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/discovery/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/discovery/_utils.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/discovery/base.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/discovery/interfaces.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/discovery/manifest.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/discovery/modules.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/engine/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/engine/compilable.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/engine/compiler.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/engine/events.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/engine/executor.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/engine/metrics.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/engine/plan.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/engine/post_commit.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/environment.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/errors/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/errors/codes.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/errors/errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/expr/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/expr/eval.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/expr/nodes.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/expr/refs.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/identity/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/identity/context.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/identity/identity.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/identity/issuer.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/identity/wire.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/introspection/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/introspection/base.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/introspection/describe.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/job/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/job/callback.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/job/context.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/job/handle.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/job/job.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/job/service.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/locator.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/logger/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/logger/abc.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/logger/checks.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/logger/config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/logger/registry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/logger/structlogger.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/_json_schema.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/_loom_type.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/base.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/convert.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/enums.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/field.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/introspection.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/partition.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/privilege.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/projection.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/relation.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/scoped.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/struct.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/timestamped.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/types.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/model/types_postgres.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/observability/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/observability/config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/observability/event.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/observability/observer/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/observability/observer/noop.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/observability/observer/otel.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/observability/observer/structlog.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/observability/otel_ids.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/observability/protocol.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/observability/runtime.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/observability/span.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/observability/topology.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/persistence/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/persistence/abc.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/persistence/none.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/persistence/registry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/plugins/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/plugins/entrypoints.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/plugins/optional.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/projection/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/projection/loaders.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/projection/runtime.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/abc/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/abc/cursor.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/abc/errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/abc/query.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/abc/query_compiler.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/abc/repo_for.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/abc/repository.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/abc/session_scope.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/dynamodb/backend.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/dynamodb/registry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/dynamodb/repository.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/dynamodb/uow.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/mongo/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/mongo/backend.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/mongo/ids.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/mongo/query_compiler.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/mongo/registry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/mongo/repository.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/mongo/uow.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/mongo/values.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/mutation.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/registration.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/registry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/backend.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/migrations/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/migrations/env_template.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/migrations/hook.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/migrations/operations.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/migrations/runners.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/model.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/bootstrap.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/elevate.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/guard/0001.sql +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/guard/0002.sql +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/guard/preflight.sql +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/guard_manifest.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/integrity.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/partitions.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/provider.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/schema.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/sources.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/rls/verify.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/session_settings.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/repository/sqlalchemy/values.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/response/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/response/base.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/routing/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/routing/ref.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/routing/resolver.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/runner.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/schema/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/schema/schema_mode.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/schema_names.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/sql/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/sql/abc/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/sql/abc/contracts.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/sql/abc/errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/sql/caller_bound.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/sql/clickhouse/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/sql/clickhouse/_client.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/sql/clickhouse/executor.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/sql/clickhouse/registry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/sql/roles.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/sql/service.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/symbols.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/tracing/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/tracing/context.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/transaction.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/transport/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/transport/adapter.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/uow/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/uow/abc.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/uow/context.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/_predicates.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/agent_markers.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/compute.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/constants.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/factory.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/field_ref.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/invoker.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/keys.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/markers.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/mcp_markers.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/outcome.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/registry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/rule.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/core/use_case/use_case.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/_uri.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_format_registry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_historify/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_historify/_common.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_historify/_log.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_historify/_ops.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_historify/_transform.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_merge.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_path_template.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_predicate.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/_write_policy.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/polars/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/polars/_dtype.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/polars/_file_writer.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/polars/_frame.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/polars/_historify.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/polars/_predicate.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/polars/_reader.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/polars/_schema.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/polars/_streaming.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/polars/_writer.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/polars/provider.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/spark/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/spark/_dtype.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/spark/_historify.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/spark/_reader.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/spark/_schema.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/spark/_writer.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/backends/spark/provider.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/checkpoint/_cleaners.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/checkpoint/_options.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/checkpoint/_paths.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/checkpoint/_scope.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/checkpoint/_store.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/compiler/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/compiler/_binding.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/compiler/_compiler.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/compiler/_errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/compiler/_filter.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/compiler/_plan.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/compiler/_validators.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/compiler/_validators_agents.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/compiler/_validators_config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/compiler/_validators_plan.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/compiler/_validators_step.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/_format.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/_read_options.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/_utils.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/_with_agent.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/_write_options.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/expr/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/expr/_params.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/expr/_predicate.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/expr/_refs.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/source/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/source/_from.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/source/_from_config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/source/_specs.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_client.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_file.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_history/_report.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_into.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_table.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/declarative/target/_temp.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/executor/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/executor/_agents.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/executor/_dispatcher.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/executor/_executor.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/_registry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/sources/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/sources/_clickhouse.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/sources/_dynamodb.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/sources/_mongo.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/sources/_serialization.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/targets/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/io/targets/_clickhouse.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/lineage/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/lineage/_config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/lineage/_observer.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/lineage/_records.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/lineage/sinks/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/lineage/sinks/_table.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/lineage/sinks/_writer.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/maintenance/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/maintenance/_builder.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/maintenance/_ops.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/maintenance/_protocol.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/maintenance/_runner.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/maintenance/_step.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/pipeline/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/pipeline/_generics.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/pipeline/_params.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/pipeline/_pipeline.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/pipeline/_process.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/pipeline/_sql.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/pipeline/_step.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/pipeline/_step_client.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/pipeline/_step_sql.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/runner/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/runner/_agents.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/runner/_providers.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/runner/_wiring.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/runner/config_loader.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/runner/core.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/runner/errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/runner/filtering.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/runtime/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/runtime/_config_values.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/runtime/contracts.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/schema/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/schema/_contract.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/schema/_schema.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/storage/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/storage/_config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/storage/_file_locator.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/storage/_locator.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/storage/routing.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/testing/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/testing/_result.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/testing/_runners.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/testing/_scenario.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/testing/_stubs.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/etl/testing/spark.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/_async.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/_config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/_ctx.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/_flow_yaml.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/_meta.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/_placeholders.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/_summary.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/deploy/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/deploy/_discovery.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/deploy/_schedule.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/deploy/_yaml_etls.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/deploy/entrypoint.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_assemble.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_backfill.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_backfill_body.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_body.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_common.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_factory.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_hooks.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_maintenance.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_params.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_run_name.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_runtime.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_signature.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/flow/_stages.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/manifest/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/manifest/_model.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/manifest/_s3.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/manifest/_store.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/notify/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/notify/_event.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/notify/_factory.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/notify/_format.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/notify/_port.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/notify/_slack.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/notify/_sns.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/observer/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/observer/_flow.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/observer/_logging_bridge.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/observer/_manifest.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prefect/observer/_task_run.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prometheus/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prometheus/_instruments.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prometheus/adapter.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prometheus/kafka.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prometheus/lifecycle.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/prometheus/middleware.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/py.typed +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/_body.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/adapter.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/auth/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/auth/abc.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/auth/config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/auth/jwt.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/auth/middleware.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/autocrud.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/checks.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/compiler.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/constants.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/cors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/fastapi/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/fastapi/_errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/fastapi/_exclusions.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/fastapi/app.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/fastapi/auto.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/fastapi/health.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/fastapi/openapi.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/fastapi/response.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/fastapi/router_runtime.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/fastapi/sql.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/middleware.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/model.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/rest/rest_adapter.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/_errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/_operators.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/bytewax/runner.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/compiler/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/compiler/_bindings.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/compiler/_compiler.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/compiler/_plan.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/core/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/core/_errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/core/_exceptions.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/core/_message.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/core/_tracing.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/core/_typing.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/graph/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/graph/_flow.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/_codec.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/_config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/_errors.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/_key_resolver.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/_message.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/_record.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/_wire.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/client/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/client/_consumer.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/client/_producer.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/client/_protocol.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/client/_retry.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/message/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/message/_consumer.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/message/_producer.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/kafka/message/_protocol.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/mongo/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/mongo/_config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/mongo/_event.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/mongo/_normalize.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_boundary.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_broadcast.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_capabilities.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_expand_routes.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_expr_eval.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_fork.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_helpers.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_mongo.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_protocols.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_step.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_table/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/_table/config.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/nodes/refs.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/streaming/testing.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/testing/__init__.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/testing/agents.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/testing/golden.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/testing/http_harness.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/testing/in_memory.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/testing/repository_harness.py +0 -0
- {loom_kernel-5.0.0 → loom_kernel-6.0.1}/src/loom/testing/runner.py +0 -0
|
@@ -459,6 +459,10 @@
|
|
|
459
459
|
|
|
460
460
|
### core
|
|
461
461
|
|
|
462
|
+
- **core:** `sql_endpoint.auth` admits only `identity` and `external`;
|
|
463
|
+
`auth: jwt` is refused when the config is loaded, and the alias and its
|
|
464
|
+
`DeprecationWarning` are gone. Migration: replace `auth: jwt` with
|
|
465
|
+
`auth: identity`.
|
|
462
466
|
- **core:** with no `LOOM_ENV` and no `environment=`, a process starts as
|
|
463
467
|
`production` and runs the deploy checks; an API without authentication now
|
|
464
468
|
fails at startup with `loom.rest.E001` until it configures
|
|
@@ -916,6 +920,80 @@
|
|
|
916
920
|
`BROADCAST_NOT_LAST` with component `broadcast`, at the top level, in a
|
|
917
921
|
branch and in a Router branch. It used to report `TERMINAL_NOT_LAST` with
|
|
918
922
|
component `Broadcast`.
|
|
923
|
+
- **streaming:** a Router branch that ends in `IntoTopic`, `IntoTable` (any
|
|
924
|
+
`IntoSink`) or `Drain` hands the message to that terminal. The branch's
|
|
925
|
+
terminal was skipped: with a flow `output` the message went to the output
|
|
926
|
+
instead, without one it was not written.
|
|
927
|
+
- **streaming:** `With`, `WithAsync`, `Router`, `CollectBatch`, `ForEach` and
|
|
928
|
+
`Explode` inside a Router branch fail compilation with
|
|
929
|
+
`ROUTER_BRANCH_UNSAFE_NODE`. Such flows compiled and raised `TypeError` when
|
|
930
|
+
the branch ran.
|
|
931
|
+
- **streaming:** `SinkPartition.write_batch` and `close` return an `int`: how
|
|
932
|
+
many of the oldest events not yet reported durable they made durable, `0`
|
|
933
|
+
when they only buffered. A custom `IntoSink` partition must report it: a
|
|
934
|
+
`write_batch` that returns anything else, a `bool` included, fails with
|
|
935
|
+
`TypeError`, and a bad count from `close()` is logged as
|
|
936
|
+
`storage_sink_close_count_invalid` and completes nothing. After a call
|
|
937
|
+
raised or returned a refused count, later counts complete nothing. A storage sink's
|
|
938
|
+
`terminal:sink_write` spans are emitted for the events a call made durable,
|
|
939
|
+
not for every event handed to it. A buffering partition migrates like this:
|
|
940
|
+
|
|
941
|
+
```python
|
|
942
|
+
# before
|
|
943
|
+
def write_batch(self, items):
|
|
944
|
+
self._buffer.extend(items)
|
|
945
|
+
|
|
946
|
+
def close(self):
|
|
947
|
+
flush(self._path, self._buffer)
|
|
948
|
+
|
|
949
|
+
# after
|
|
950
|
+
def write_batch(self, items) -> int:
|
|
951
|
+
self._buffer.extend(items)
|
|
952
|
+
return 0 # buffered, nothing durable yet
|
|
953
|
+
|
|
954
|
+
def close(self) -> int:
|
|
955
|
+
flush(self._path, self._buffer)
|
|
956
|
+
flushed, self._buffer = len(self._buffer), []
|
|
957
|
+
return flushed # durable now
|
|
958
|
+
```
|
|
959
|
+
- **streaming:** under at-least-once delivery, a caller-supplied terminal sink
|
|
960
|
+
written inline by `With(process=...)` or `WithAsync(process=...)` must expose
|
|
961
|
+
`build_inline_partition()`, which returns a partition that completes no
|
|
962
|
+
offset and records no death; without it the flow fails at assembly with
|
|
963
|
+
`RuntimeConfigurationError` (`INLINE_SINK_CANNOT_SKIP_COMMITS`). Its
|
|
964
|
+
partitions completed offsets at the inline write.
|
|
965
|
+
- **streaming:** a Delta `IntoTable` whose payload type has no fields fails
|
|
966
|
+
with `ValueError` when its partition is built. Its items wrote no row.
|
|
967
|
+
- **streaming:** an output declared after a node that ends every path fails
|
|
968
|
+
compilation. A flow `output` after a process that ends in `IntoTopic`,
|
|
969
|
+
`IntoSink`, `Drain`, `ExpandRoutes`, or a `Router` with a `default` whose
|
|
970
|
+
branches all end in one of `IntoTopic`, `IntoSink`, `Drain`, fails with
|
|
971
|
+
`OUTPUT_AFTER_PATH_END`. A Broadcast route `output` after a process that ends
|
|
972
|
+
in any of those, in a `Broadcast`, or in a `Fork` with a `default` fails
|
|
973
|
+
with `BROADCAST_OUTPUT_AFTER_PATH_END`. Such flows compiled and wrote the
|
|
974
|
+
message twice, handed the expanded payload of an `ExpandRoutes` to the
|
|
975
|
+
output, or never wrote the output. A step or an `IntoTopic` after such a
|
|
976
|
+
`Router` fails with `TERMINAL_NOT_LAST`, the code an `IntoTopic`, `IntoSink`
|
|
977
|
+
or `Drain` followed by a node reports. A
|
|
978
|
+
branch that ends without a sink no longer logs `unrouted_branch_drop_sink`.
|
|
979
|
+
- **streaming:** a `terminal_sinks` override passed to `build_dataflow` must
|
|
980
|
+
cover every compiled `IntoTopic` path; a missing one fails with
|
|
981
|
+
`RuntimeConfigurationError` (`TERMINAL_SINK_MISSING`). The path fell back to
|
|
982
|
+
a drop sink, so its messages completed without being written.
|
|
983
|
+
- **streaming:** a failed send or flush to a Kafka sink's DLQ topic fails the
|
|
984
|
+
run (inside `With` or `WithAsync`, the message becomes an error envelope). It
|
|
985
|
+
used to be logged as `dlq_send_failed` and the batch's offsets were
|
|
986
|
+
committed. The fix is under Fixes.
|
|
987
|
+
- **streaming:** a DLQ record is built from the same send request as the sink
|
|
988
|
+
record: it keeps the message key (and with it the partition and order), the
|
|
989
|
+
message type and the headers of the sink record, error envelopes now carry
|
|
990
|
+
`x-error-reason` and follow the sink's partition policy, and `x-dlq-error`
|
|
991
|
+
is added. A diverted message keeps its own trace id and parent trace id; an
|
|
992
|
+
error envelope without an original message gets a new trace id, as on the
|
|
993
|
+
sink, instead of none.
|
|
994
|
+
- **streaming:** a sync `With(process=...)` hands on one message at a time, as
|
|
995
|
+
`WithAsync` does. After a `CollectBatch` it handed on whole batches, so as
|
|
996
|
+
the last node of a flow without `output` its messages never completed.
|
|
919
997
|
|
|
920
998
|
## 🐛 Fixes
|
|
921
999
|
|
|
@@ -1238,6 +1316,41 @@
|
|
|
1238
1316
|
follows. Each route is now checked on the record stream it receives, with
|
|
1239
1317
|
issues scoped under `expand_routes branch <type>`, and a node after an
|
|
1240
1318
|
`ExpandRoutes` fails with `TERMINAL_NOT_LAST`; such flows used to compile.
|
|
1319
|
+
- **streaming:** under at-least-once delivery each source offset completes
|
|
1320
|
+
once per fork share, and not before the writes on its path are flushed.
|
|
1321
|
+
These shapes broke it:
|
|
1322
|
+
- an inline `IntoTopic` in `With(process=...)` or `WithAsync(process=...)`
|
|
1323
|
+
followed by a flow `output` completed the offset at the inline write,
|
|
1324
|
+
before the output write, and again at the output;
|
|
1325
|
+
- an `ExpandRoutes` route ending in a scope completed at a drop sink wired
|
|
1326
|
+
beside the route's process, which does not wait for the inline write, and
|
|
1327
|
+
again at the inline write;
|
|
1328
|
+
- an `IntoTopic` ending an `ExpandRoutes` route, or a Broadcast route
|
|
1329
|
+
without `output`, completed at its sink and again at a drop sink;
|
|
1330
|
+
- a Router branch terminal, and a Router's unmatched messages with nothing
|
|
1331
|
+
after them, never completed;
|
|
1332
|
+
- a storage sink (`IntoTable`, any `IntoSink`) never completed;
|
|
1333
|
+
- an undecodable record with no `WIRE` error route never completed;
|
|
1334
|
+
- a batch diverted to a DLQ topic completed before the DLQ records were
|
|
1335
|
+
flushed.
|
|
1336
|
+
|
|
1337
|
+
A Router keeps the source order of the messages that continue after it, and
|
|
1338
|
+
an inline write no longer completes an offset: the message completes where
|
|
1339
|
+
its path ends. A storage sink completes the offsets of the events its flush
|
|
1340
|
+
wrote, so events still buffered when a worker dies are consumed again.
|
|
1341
|
+
- **streaming:** a sync `With(process=...)` runs on a record stream. It
|
|
1342
|
+
accepted only batches and raised `TypeError` for every message.
|
|
1343
|
+
- **streaming:** a Kafka sink batch diverted to its DLQ topic commits its
|
|
1344
|
+
offsets only once the DLQ topic received every record. The diversion sent
|
|
1345
|
+
each record without flushing, logged and swallowed per-record failures, and
|
|
1346
|
+
committed anyway, so a batch the DLQ topic never received was lost. The
|
|
1347
|
+
producer is now flushed after the diversion, and a failed DLQ send or flush
|
|
1348
|
+
raises `KafkaDeliveryError` naming the DLQ topic, with the failure the DLQ
|
|
1349
|
+
step observed as its cause. The batch is not committed and is handled like a failed batch on a
|
|
1350
|
+
sink without a DLQ topic: the run fails and, on restart, the batch is
|
|
1351
|
+
consumed again from the recovery snapshot or, without one, from the last
|
|
1352
|
+
committed offset; inside `With` or `WithAsync` the message becomes an error
|
|
1353
|
+
envelope.
|
|
1241
1354
|
|
|
1242
1355
|
### prefect
|
|
1243
1356
|
|
|
@@ -8,7 +8,6 @@ invalid values abort the parse and surface as
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
10
|
import re
|
|
11
|
-
import warnings
|
|
12
11
|
from collections.abc import Sequence
|
|
13
12
|
from typing import Any, Literal
|
|
14
13
|
|
|
@@ -24,11 +23,7 @@ _URL_CREDENTIALS_RE = re.compile(r"://[^@]+@")
|
|
|
24
23
|
|
|
25
24
|
# The only ``sql_endpoint.auth`` mode carrying a verified caller identity, and
|
|
26
25
|
# therefore the only one able to bind a request to a subset of the allowlist.
|
|
27
|
-
# ``jwt`` is the deprecated spelling of the same mode, kept because it named a
|
|
28
|
-
# mechanism where the contract only ever needed "the framework knows the caller".
|
|
29
26
|
_IDENTITY_BOUND_AUTH = "identity"
|
|
30
|
-
_DEPRECATED_AUTH_ALIAS = "jwt"
|
|
31
|
-
_IDENTITY_BOUND_AUTH_MODES = frozenset({_IDENTITY_BOUND_AUTH, _DEPRECATED_AUTH_ALIAS})
|
|
32
27
|
|
|
33
28
|
|
|
34
29
|
def _redact_url(url: str) -> str:
|
|
@@ -69,36 +64,25 @@ class SqlEndpointConfig(LoomFrozenStruct, frozen=True, kw_only=True, forbid_unkn
|
|
|
69
64
|
authenticates the caller with the configured mechanism and binds
|
|
70
65
|
roles to their verified identity) or ``"external"`` (explicit
|
|
71
66
|
acknowledgement that the operator provides authentication, with no
|
|
72
|
-
identity the framework can read).
|
|
73
|
-
|
|
67
|
+
identity the framework can read). Any other value fails the
|
|
68
|
+
parse.
|
|
74
69
|
path: Mount path override. Defaults to ``/sql/{name}`` when ``None``.
|
|
75
70
|
include_in_schema: Whether the endpoint appears in the OpenAPI schema.
|
|
76
71
|
"""
|
|
77
72
|
|
|
78
73
|
enabled: bool = False
|
|
79
|
-
auth: Literal["identity", "
|
|
74
|
+
auth: Literal["identity", "external"] | None = None
|
|
80
75
|
path: str | None = None
|
|
81
76
|
include_in_schema: bool = False
|
|
82
77
|
|
|
83
|
-
def __post_init__(self) -> None:
|
|
84
|
-
if self.auth != _DEPRECATED_AUTH_ALIAS:
|
|
85
|
-
return
|
|
86
|
-
warnings.warn(
|
|
87
|
-
f"sql_endpoint.auth: {_DEPRECATED_AUTH_ALIAS!r} is deprecated because it names "
|
|
88
|
-
f"a mechanism instead of a contract. Use {_IDENTITY_BOUND_AUTH!r}: the endpoint "
|
|
89
|
-
"requires a verified caller, whichever authenticator provides it.",
|
|
90
|
-
DeprecationWarning,
|
|
91
|
-
stacklevel=3,
|
|
92
|
-
)
|
|
93
|
-
|
|
94
78
|
@property
|
|
95
79
|
def binds_identity(self) -> bool:
|
|
96
80
|
"""Whether this endpoint requires an identity the framework can read.
|
|
97
81
|
|
|
98
82
|
Returns:
|
|
99
|
-
``True`` for ``"identity"
|
|
83
|
+
``True`` for ``"identity"``.
|
|
100
84
|
"""
|
|
101
|
-
return self.auth
|
|
85
|
+
return self.auth == _IDENTITY_BOUND_AUTH
|
|
102
86
|
|
|
103
87
|
|
|
104
88
|
class SqlConnectionConfig(LoomFrozenStruct, frozen=True, kw_only=True, forbid_unknown_fields=True):
|
|
@@ -3,6 +3,20 @@
|
|
|
3
3
|
Translates a :class:`CompiledPlan` into a Bytewax :class:`Dataflow`,
|
|
4
4
|
wiring decode, node dispatch, encode, and output routing operators.
|
|
5
5
|
|
|
6
|
+
Offset completion invariant: for every flow that compiles, each source offset,
|
|
7
|
+
or each share of it a fan-out node forked, completes exactly once, at the end
|
|
8
|
+
of the path it travels and after that path's last durable write. A node
|
|
9
|
+
handler returns the stream that is still live after it, or ``None`` when it
|
|
10
|
+
closed every path it received. ``IntoTopic`` ends its
|
|
11
|
+
path at its compiled sink through :meth:`_BuildContext.wire_branch_terminal`.
|
|
12
|
+
A branching node wires each branch through :meth:`_BuildContext.wire_branch`,
|
|
13
|
+
which hands the branch's live end to ``wire_branch_terminal``: the sink
|
|
14
|
+
compiled for the branch, else a drop sink. The flow's own live end goes
|
|
15
|
+
through :meth:`_BuildContext.wire_flow_output`: the flow output, else a drop
|
|
16
|
+
sink. A Bytewax output has no downstream, so no completion relies on the order
|
|
17
|
+
of sibling operators: it happens inside the sink that writes, or downstream of
|
|
18
|
+
an inline write.
|
|
19
|
+
|
|
6
20
|
Requires ``bytewax`` to be installed.
|
|
7
21
|
"""
|
|
8
22
|
|
|
@@ -63,11 +77,13 @@ class _BuiltDataflow:
|
|
|
63
77
|
|
|
64
78
|
|
|
65
79
|
class _DropSinkPartition(StatelessSinkPartition[Any]):
|
|
66
|
-
"""Discard items
|
|
80
|
+
"""Discard the items of a path that ends without a sink.
|
|
67
81
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
82
|
+
Such a path is an error kind with no route, a branch or flow end that owns
|
|
83
|
+
no output, or an undecodable record with no WIRE route. Discarding still
|
|
84
|
+
completes each record with the commit tracker: a dropped message that never
|
|
85
|
+
completes would freeze its partition's watermark under at-least-once
|
|
86
|
+
delivery.
|
|
71
87
|
"""
|
|
72
88
|
|
|
73
89
|
def __init__(self, commit_tracker: CommitCompletionPort | None = None) -> None:
|
|
@@ -83,7 +99,7 @@ class _DropSinkPartition(StatelessSinkPartition[Any]):
|
|
|
83
99
|
|
|
84
100
|
|
|
85
101
|
class _DropSink(DynamicSink[Any]):
|
|
86
|
-
"""Build
|
|
102
|
+
"""Build the tracker-aware discard sink for a path that ends without a sink."""
|
|
87
103
|
|
|
88
104
|
def __init__(self, commit_tracker: CommitCompletionPort | None = None) -> None:
|
|
89
105
|
self._commit_tracker = commit_tracker
|
|
@@ -182,18 +198,14 @@ class _SupportsTerminalTracing(Protocol):
|
|
|
182
198
|
) -> None:
|
|
183
199
|
"""Make this sink emit a terminal span per message it writes."""
|
|
184
200
|
|
|
185
|
-
def mark_inline_partition(self) -> None:
|
|
186
|
-
"""Record that an inline, non-terminal partition is built from this sink."""
|
|
187
201
|
|
|
202
|
+
@runtime_checkable
|
|
203
|
+
class _SupportsInlinePartition(Protocol):
|
|
204
|
+
"""Runtime sink that can build a partition for an inline, non-terminal write."""
|
|
188
205
|
|
|
189
|
-
def
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
Sinks that cannot carry terminal tracing — storage sinks, test doubles —
|
|
193
|
-
have nothing to record and are left untouched.
|
|
194
|
-
"""
|
|
195
|
-
if isinstance(sink, _SupportsTerminalTracing):
|
|
196
|
-
sink.mark_inline_partition()
|
|
206
|
+
def build_inline_partition(self) -> StatelessSinkPartition[Any]:
|
|
207
|
+
"""Build a partition that completes no offset and records no death."""
|
|
208
|
+
...
|
|
197
209
|
|
|
198
210
|
|
|
199
211
|
def _bind_commit_tracker_object(
|
|
@@ -235,8 +247,10 @@ def _assemble_dataflow(plan: CompiledPlan, ctx: _BuildContext) -> Any:
|
|
|
235
247
|
flow = _bytewax_dataflow.Dataflow(plan.name)
|
|
236
248
|
stream = _build_source_pipeline(flow, ctx)
|
|
237
249
|
stream = _wire_process(stream, tuple(node.node for node in plan.nodes), ctx)
|
|
238
|
-
|
|
239
|
-
|
|
250
|
+
ctx.wire_flow_output(stream)
|
|
251
|
+
for kind in plan.error_routes:
|
|
252
|
+
if kind not in ctx.error_sinks:
|
|
253
|
+
raise RuntimeError(f"Bytewax sink is required for error route {kind.value}.")
|
|
240
254
|
return flow
|
|
241
255
|
|
|
242
256
|
|
|
@@ -281,43 +295,66 @@ class _BuildContext:
|
|
|
281
295
|
self.resource_manager = ResourceManager(bridge)
|
|
282
296
|
self._path: tuple[int, ...] = ()
|
|
283
297
|
|
|
284
|
-
def
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
298
|
+
def wire_branch(
|
|
299
|
+
self,
|
|
300
|
+
step_id: str,
|
|
301
|
+
stream: Any,
|
|
302
|
+
nodes: tuple[object, ...],
|
|
303
|
+
path: tuple[int, ...],
|
|
304
|
+
*,
|
|
305
|
+
start: int = 0,
|
|
306
|
+
) -> None:
|
|
307
|
+
"""Wire one branch's *nodes* from index *start* under *path*; end what stays live."""
|
|
308
|
+
tail = _wire_process(stream, nodes, self, path_prefix=path, start=start)
|
|
309
|
+
self.wire_branch_terminal(step_id, tail, path)
|
|
289
310
|
|
|
290
|
-
def wire_branch_terminal(self, step_id: str, stream: Any, path: tuple[int, ...]) -> None:
|
|
291
|
-
sink
|
|
311
|
+
def wire_branch_terminal(self, step_id: str, stream: Any | None, path: tuple[int, ...]) -> None:
|
|
312
|
+
"""End one branch's live stream at the sink compiled for *path*, else a drop sink.
|
|
313
|
+
|
|
314
|
+
``None`` means the branch already ended in a sink, which completes what
|
|
315
|
+
it writes; wiring anything more would complete those offsets twice.
|
|
316
|
+
"""
|
|
317
|
+
sink = self._runtime_sink_for(path)
|
|
318
|
+
if stream is None:
|
|
319
|
+
if sink is not None:
|
|
320
|
+
raise RuntimeError(
|
|
321
|
+
f"the output compiled for path {path} is never written: the branch "
|
|
322
|
+
"already ended the path of every message it received."
|
|
323
|
+
)
|
|
324
|
+
return
|
|
292
325
|
if sink is not None:
|
|
293
326
|
self._bind_terminal_tracing(sink)
|
|
294
327
|
bw_output(_qualified_step_id(step_id, path), stream, sink)
|
|
295
328
|
return
|
|
296
|
-
# A branch
|
|
297
|
-
#
|
|
298
|
-
#
|
|
299
|
-
# froze the partition's watermark. Unrouted error branches already fall
|
|
300
|
-
# back to a drop sink for exactly this reason; branches now do too.
|
|
301
|
-
logger.warning(
|
|
302
|
-
"unrouted_branch_drop_sink",
|
|
303
|
-
flow=self.plan.name,
|
|
304
|
-
step_id=step_id,
|
|
305
|
-
path=path,
|
|
306
|
-
)
|
|
329
|
+
# A live branch end with no sink still owes each record a completion;
|
|
330
|
+
# discarding it would leave the offset, or its fork share, outstanding
|
|
331
|
+
# and freeze the partition's watermark.
|
|
307
332
|
bw_output(
|
|
308
333
|
_qualified_step_id(f"{step_id}_dropped", path),
|
|
309
334
|
stream,
|
|
310
335
|
_DropSink(self.commit_tracker),
|
|
311
336
|
)
|
|
312
337
|
|
|
338
|
+
def _runtime_sink_for(self, path: tuple[int, ...]) -> Any | None:
|
|
339
|
+
"""Return the runtime sink for *path*, or ``None`` when nothing was compiled there.
|
|
340
|
+
|
|
341
|
+
Raises:
|
|
342
|
+
RuntimeConfigurationError: If an ``IntoTopic`` was compiled at *path*
|
|
343
|
+
but no runtime sink was supplied for it.
|
|
344
|
+
"""
|
|
345
|
+
sink = self.terminal_sinks.get(path)
|
|
346
|
+
compiled = self.plan.terminal_sinks.get(path)
|
|
347
|
+
if sink is None and compiled is not None:
|
|
348
|
+
issue = StreamingErrorCode.TERMINAL_SINK_MISSING.issue(path=path, topic=compiled.topic)
|
|
349
|
+
raise RuntimeConfigurationError([issue])
|
|
350
|
+
return sink
|
|
351
|
+
|
|
313
352
|
def _bind_terminal_tracing(self, sink: Any) -> None:
|
|
314
353
|
"""Give one real terminal sink the runtime its death spans open on.
|
|
315
354
|
|
|
316
355
|
Called only from the two wiring sites that run for a genuine terminal.
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
where the message explicitly does not die; binding any earlier would
|
|
320
|
-
emit a death span for a message that goes on living.
|
|
356
|
+
An inline partition comes from ``build_inline_partition``, which never
|
|
357
|
+
applies tracing, because the message goes on after an inline write.
|
|
321
358
|
|
|
322
359
|
Sinks that cannot record a death — storage sinks, drop sinks, test
|
|
323
360
|
doubles — are left untouched.
|
|
@@ -338,22 +375,26 @@ class _BuildContext:
|
|
|
338
375
|
)
|
|
339
376
|
bw_output(f"{step_id}_{kind.value}_dropped", stream, _DropSink(self.commit_tracker))
|
|
340
377
|
|
|
341
|
-
def wire_flow_output(self, stream: Any
|
|
342
|
-
|
|
378
|
+
def wire_flow_output(self, stream: Any | None) -> None:
|
|
379
|
+
"""End the flow's live stream at the output sink, else complete it at a drop sink."""
|
|
380
|
+
if self.sink is None and self.plan.output is not None:
|
|
343
381
|
raise RuntimeError("Bytewax sink is required for terminal output wiring.")
|
|
344
|
-
if self.
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
382
|
+
if stream is None and self.plan.output is not None:
|
|
383
|
+
raise RuntimeError(
|
|
384
|
+
"flow.output is never written: the process already ended the path of every "
|
|
385
|
+
"message it received."
|
|
386
|
+
)
|
|
387
|
+
if stream is not None and self.sink is not None:
|
|
388
|
+
self._bind_terminal_tracing(self.sink)
|
|
389
|
+
bw_output("output", stream, self.sink)
|
|
390
|
+
elif stream is not None:
|
|
391
|
+
bw_output("output_dropped", stream, _DropSink(self.commit_tracker))
|
|
392
|
+
|
|
393
|
+
def wire_decode_error(self, stream: Any) -> None:
|
|
394
|
+
"""Route undecodable records to the WIRE error sink, else complete them at a drop sink."""
|
|
395
|
+
if ErrorKind.WIRE in self.plan.error_routes and ErrorKind.WIRE not in self.error_sinks:
|
|
356
396
|
raise RuntimeError("Bytewax sink is required for WIRE error routing.")
|
|
397
|
+
self.wire_node_error(ErrorKind.WIRE, "decode", stream)
|
|
357
398
|
|
|
358
399
|
def inline_sink_partition_for(
|
|
359
400
|
self,
|
|
@@ -373,16 +414,27 @@ class _BuildContext:
|
|
|
373
414
|
sink is registered for *path*.
|
|
374
415
|
|
|
375
416
|
Raises:
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
417
|
+
RuntimeConfigurationError: If an ``IntoTopic`` was compiled at *path*
|
|
418
|
+
but no runtime sink was supplied for it
|
|
419
|
+
(``TERMINAL_SINK_MISSING``), or if a commit tracker is bound and
|
|
420
|
+
the sink cannot build an inline partition, so its partitions
|
|
421
|
+
would complete offsets at the inline write
|
|
422
|
+
(``INLINE_SINK_CANNOT_SKIP_COMMITS``).
|
|
379
423
|
"""
|
|
380
|
-
sink = self.
|
|
424
|
+
sink = self._runtime_sink_for(path)
|
|
381
425
|
if sink is None:
|
|
382
426
|
return None
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
427
|
+
if isinstance(sink, _SupportsInlinePartition):
|
|
428
|
+
return sink.build_inline_partition()
|
|
429
|
+
if self.commit_tracker is not None:
|
|
430
|
+
issue = StreamingErrorCode.INLINE_SINK_CANNOT_SKIP_COMMITS.issue(
|
|
431
|
+
component=type(sink).__name__
|
|
432
|
+
)
|
|
433
|
+
raise RuntimeConfigurationError([issue])
|
|
434
|
+
partition: StatelessSinkPartition[Any] = sink.build(
|
|
435
|
+
"inline_" + "_".join(str(p) for p in path), 0, 1
|
|
436
|
+
)
|
|
437
|
+
return partition
|
|
386
438
|
|
|
387
439
|
def manager_for(
|
|
388
440
|
self,
|
|
@@ -411,16 +463,6 @@ class _BuildContext:
|
|
|
411
463
|
finally:
|
|
412
464
|
self._path = previous
|
|
413
465
|
|
|
414
|
-
def wire_process(
|
|
415
|
-
self,
|
|
416
|
-
stream: Any,
|
|
417
|
-
nodes: tuple[object, ...],
|
|
418
|
-
*,
|
|
419
|
-
path_prefix: tuple[int, ...] = (),
|
|
420
|
-
) -> Any:
|
|
421
|
-
"""Wire one nested process subtree."""
|
|
422
|
-
return _wire_process(stream, nodes, self, path_prefix=path_prefix)
|
|
423
|
-
|
|
424
466
|
def shutdown_all(self) -> None:
|
|
425
467
|
"""Shutdown all resource managers."""
|
|
426
468
|
self.resource_manager.shutdown_all()
|
|
@@ -442,7 +484,7 @@ def _build_source_pipeline(flow: Any, ctx: _BuildContext) -> Stream:
|
|
|
442
484
|
stream: Stream = bw_input("source", flow, source)
|
|
443
485
|
decoded = _decode_source_stream(stream, ctx, codec, step_id)
|
|
444
486
|
decoded_branch = _split_decode_results(decoded, step_id)
|
|
445
|
-
ctx.wire_decode_error(decoded_branch.falses
|
|
487
|
+
ctx.wire_decode_error(decoded_branch.falses)
|
|
446
488
|
return bw_map(f"{step_id}_message", decoded_branch.trues, _decode_ok_message)
|
|
447
489
|
|
|
448
490
|
|
|
@@ -461,11 +503,6 @@ def _split_decode_results(stream: Stream, step_id: str) -> Any:
|
|
|
461
503
|
return branch(f"{step_id}_is_ok", stream, _is_decode_ok)
|
|
462
504
|
|
|
463
505
|
|
|
464
|
-
def _wire_output(stream: Any, ctx: _BuildContext) -> None:
|
|
465
|
-
"""Wire the output sink and error routes."""
|
|
466
|
-
ctx.wire_flow_output(stream, ctx.plan)
|
|
467
|
-
|
|
468
|
-
|
|
469
506
|
def _qualified_step_id(step_id: str, path: tuple[int, ...]) -> str:
|
|
470
507
|
if not path:
|
|
471
508
|
return step_id
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from collections.abc import Callable, Sequence
|
|
6
6
|
from dataclasses import dataclass
|
|
7
|
-
from typing import Any, Protocol, TypeAlias
|
|
7
|
+
from typing import Any, Protocol, TypeAlias, TypeVar
|
|
8
8
|
|
|
9
9
|
from bytewax.operators import branch, flat_map
|
|
10
10
|
|
|
@@ -19,6 +19,7 @@ from loom.streaming.core._typing import StreamPayload
|
|
|
19
19
|
|
|
20
20
|
Stream: TypeAlias = Any
|
|
21
21
|
NodeResult: TypeAlias = Message[StreamPayload] | ErrorEnvelope[StreamPayload]
|
|
22
|
+
ResultT = TypeVar("ResultT")
|
|
22
23
|
logger = get_logger(__name__)
|
|
23
24
|
|
|
24
25
|
|
|
@@ -87,9 +88,9 @@ def _build_error_envelope(
|
|
|
87
88
|
def _execute_in_boundary(
|
|
88
89
|
classify: Callable[[Exception], ErrorKind],
|
|
89
90
|
original: Message[StreamPayload],
|
|
90
|
-
fn: Callable[[],
|
|
91
|
+
fn: Callable[[], ResultT],
|
|
91
92
|
boundary: ErrorBoundary,
|
|
92
|
-
) ->
|
|
93
|
+
) -> ResultT | ErrorEnvelope[StreamPayload]:
|
|
93
94
|
"""Execute one message node and capture failures as error envelopes."""
|
|
94
95
|
try:
|
|
95
96
|
return fn()
|