loom-kernel 1.7.0__tar.gz → 1.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.github/workflows/ci-main.yml +1 -1
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.github/workflows/ci-pr.yml +5 -5
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.github/workflows/release.yml +2 -2
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/CHANGELOG.md +68 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/PKG-INFO +1 -1
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/ai/a2a.md +50 -1
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/ai/mcp.md +10 -2
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/streaming/tracing.md +25 -4
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/pyproject.toml +16 -9
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/sonar-project.properties +1 -10
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/__init__.py +2 -2
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/_plan.py +12 -4
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/phases/_capabilities.py +9 -7
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/config.py +30 -14
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +51 -5
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +3 -3
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/errors.py +3 -3
- loom_kernel-1.7.0/src/loom/ai/mcp_auth.py → loom_kernel-1.8.0/src/loom/ai/remote_auth.py +181 -45
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_adapter.py +49 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_runtime_io.py +271 -8
- loom_kernel-1.7.0/tests/helpers/mcp_auth_plugin.py → loom_kernel-1.8.0/tests/helpers/remote_auth_plugin.py +10 -8
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/helpers/spans.py +26 -2
- loom_kernel-1.8.0/tests/integration/ai/test_a2a_auth_wiring.py +207 -0
- loom_kernel-1.7.0/tests/integration/ai/test_mcp_auth_wiring.py → loom_kernel-1.8.0/tests/integration/ai/test_remote_auth_wiring.py +10 -10
- loom_kernel-1.8.0/tests/unit/ai/phases/test_remote_auth_plan.py +205 -0
- loom_kernel-1.7.0/tests/unit/ai/test_mcp_auth.py → loom_kernel-1.8.0/tests/unit/ai/test_remote_auth.py +183 -29
- loom_kernel-1.8.0/tests/unit/ai/test_remote_auth_settings.py +87 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_adapter.py +12 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_bytewax_dispatcher.py +3 -3
- loom_kernel-1.8.0/tests/unit/streaming/observability/test_outbound_topic_terminal_spans.py +625 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/uv.lock +1 -1
- loom_kernel-1.7.0/tests/unit/ai/phases/test_mcp_auth_plan.py +0 -111
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.github/workflows/docs.yml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.gitignore +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.pre-commit-config.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/.readthedocs.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/LICENSE +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/Makefile +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/README.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/codecov.yml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docker-compose.local.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/_static/.gitkeep +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/_static/custom.css +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/_static/logo-transparent.png +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/_static/logo.svg +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/ai/artifacts.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/ai/observability.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/ai/overview.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/ai/providers.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/architecture/adr/README.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/architecture/clean-architecture.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/architecture/overview.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/conf.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/etl/examples.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/etl/pipelines.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/etl/testing.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/examples-repo/index.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/getting-started/etl.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/getting-started/rest.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/getting-started/streaming.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/guides/autocrud.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/guides/celery.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/guides/etl.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/guides/fake-repo-examples.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/guides/quickstart.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/guides/use-case-dsl.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/index.rst +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/overview.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/ai.rst +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/core.rst +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/etl.rst +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/repository.rst +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/rest.rst +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/streaming.rst +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/api/testing.rst +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/reference/index.rst +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/requirements.txt +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/autocrud.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/celery.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/examples.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/identity.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/sql.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/testing.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/rest/use-case-dsl.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/streaming/bytewax.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/docs/streaming/delivery.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/scripts/release/checkout_merged_release.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/_filters.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/_transport.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/_binding.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/_handlers.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/_rpc.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/card.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/events.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/a2a/server.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/abc.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/_compiler.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/_symbols.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/compiler/phases/_output.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/declarative/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/declarative/_envelope.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/declarative/_schema.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/declarative/_v1.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/describe.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/fastapi/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/fastapi/endpoints.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/fastapi/response.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/fastapi/streaming.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/inference.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/runtime/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/runtime/_health.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/runtime/_lifecycle.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/runtime/_limits.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/runtime/_mcp.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/validate/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/ai/validate/__main__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/auto.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/bootstrap.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/constants.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/runner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/celery/service.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/async_bridge.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/backend/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/backend/core_model.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/backend/protocol.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/backend/sqlalchemy.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/bootstrap/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/bootstrap/kernel.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/abc/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/abc/backend.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/abc/config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/abc/dependency.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/codec.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/decorators.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/dependency.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/gateway.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/keys.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/repository.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/cache/serializer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/command/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/command/adapter.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/command/base.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/command/field.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/command/introspection.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/compiler.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/_resolver_utils.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/binder.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/configurable.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/context.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/keys.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/loader.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/model.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/observability.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/resolver.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/secrets.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/config/ssm.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/contracts/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/contracts/manifest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/di/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/di/container.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/di/scope.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/discovery/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/discovery/_utils.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/discovery/base.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/discovery/interfaces.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/discovery/manifest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/discovery/modules.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/compilable.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/compiler.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/events.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/executor.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/metrics.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/engine/plan.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/errors/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/errors/codes.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/errors/errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/expr/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/expr/eval.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/expr/nodes.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/expr/refs.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/identity/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/identity/context.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/identity/identity.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/identity/issuer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/identity/wire.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/introspection/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/introspection/base.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/introspection/describe.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/job/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/job/callback.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/job/context.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/job/handle.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/job/job.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/job/service.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/logger/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/logger/abc.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/logger/config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/logger/registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/logger/structlogger.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/base.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/enums.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/field.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/introspection.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/projection.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/relation.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/struct.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/timestamped.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/types.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/model/types_postgres.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/event.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/observer/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/observer/noop.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/observer/otel.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/observer/structlog.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/otel_ids.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/protocol.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/runtime.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/span.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/observability/topology.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/plugins/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/plugins/entrypoints.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/projection/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/projection/loaders.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/projection/runtime.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/abc/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/abc/query.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/abc/repo_for.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/abc/repository.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/dynamodb/registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/dynamodb/repository.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/mutation.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/registration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/response/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/response/base.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/routing/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/routing/ref.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/routing/resolver.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/runner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/schema/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/schema/schema_mode.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/abc/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/abc/contracts.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/abc/errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/clickhouse/_client.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/clickhouse/registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/roles.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/sql/service.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/tracing/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/tracing/context.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/transport/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/transport/adapter.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/uow/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/uow/abc.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/uow/context.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/_predicates.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/compute.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/constants.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/factory.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/field_ref.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/invoker.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/keys.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/markers.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/rule.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/core/use_case/use_case.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_format_registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_historify/_common.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_historify/_log.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_merge.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_path_template.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_predicate.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/_write_policy.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_historify.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_reader.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_schema.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/_writer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/polars/provider.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/_historify.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/_reader.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/_schema.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/_writer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/backends/spark/provider.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/_paths.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/_scope.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/checkpoint/_store.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_binding.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_compiler.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_plan.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_validators.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/compiler/_validators_step.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/_format.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/_read_options.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/_utils.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/_write_options.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/expr/_params.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/source/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/source/_from.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/source/_specs.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_client.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_file.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_into.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_table.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/declarative/target/_temp.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/executor/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/executor/_dispatcher.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/executor/_executor.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/_registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_clickhouse.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_mongo.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/sources/_serialization.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/targets/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/io/targets/_clickhouse.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/_observer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/_records.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/_builder.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/_ops.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/_protocol.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/_runner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/_step.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_generics.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_params.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_process.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_sql.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_step.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_step_client.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/_providers.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/_wiring.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/config_loader.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/core.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runner/filtering.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runtime/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/runtime/contracts.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/schema/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/schema/_contract.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/schema/_schema.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/storage/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/storage/_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/storage/_file_locator.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/storage/_locator.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/storage/routing.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/testing/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/testing/_result.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/testing/_runners.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/testing/_scenario.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/testing/_stubs.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/etl/testing/spark.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/_async.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/_ctx.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/_meta.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/_placeholders.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/_summary.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/deploy/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/deploy/_discovery.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/deploy/_schedule.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/deploy/_yaml.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_assemble.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_backfill.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_body.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_common.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_factory.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_hooks.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_maintenance.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_run_name.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_runtime.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_signature.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/flow/_stages.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/manifest/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/manifest/_model.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/manifest/_s3.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/manifest/_store.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/notify/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/notify/_event.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/notify/_factory.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/notify/_port.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/notify/_slack.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/observer/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/observer/_flow.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/observer/_manifest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prefect/observer/_task_run.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prometheus/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prometheus/adapter.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prometheus/kafka.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prometheus/lifecycle.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/prometheus/middleware.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/py.typed +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/_body.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/adapter.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/auth/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/auth/abc.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/auth/config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/auth/jwt.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/auth/middleware.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/autocrud.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/compiler.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/constants.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/cors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/_errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/app.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/auto.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/openapi.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/response.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/router_runtime.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/fastapi/sql.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/middleware.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/model.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/rest/rest_adapter.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_operators.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/bytewax/runner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/_bindings.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/_compiler.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/_errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/_plan.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/compiler/phases/validate.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/core/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/core/_errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/core/_exceptions.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/core/_message.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/core/_tracing.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/core/_typing.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/graph/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/graph/_flow.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_codec.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_message.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_record.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/_wire.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/mongo/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/mongo/_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/mongo/_event.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/mongo/_normalize.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_boundary.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_decompose.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_fork.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_helpers.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_mongo.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_protocols.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_router.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_shape.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_sink.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_step.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_table/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_table/common.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_table/config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/_with.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/nodes/refs.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/streaming/testing.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/agents.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/golden.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/http_harness.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/in_memory.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/repository_harness.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/src/loom/testing/runner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/contract/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/contract/ai/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/contract/ai/test_contract_fake.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/contract/ai/test_contract_pydantic_ai.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/contract/observability/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/contract/observability/test_otel_sdk_contract.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/golden/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/golden/baselines/.gitkeep +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/golden/outputs/.gitkeep +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/golden/plans/.gitkeep +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/helpers/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/helpers/pydantic_ai_engine.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_a2a.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_agent_specs_source.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_auto_a2a.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_auto_client_factories.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_auto_gate.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_capabilities.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_describe.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_endpoints.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_grant_wiring.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_health_probe.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_limits.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_live_provider.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_mcp_end_to_end.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_provider_portability.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_runtime.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_streaming.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/ai/test_transport.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/celery_bootstrap/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/celery_bootstrap/config/conf.celery.integration.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/celery_bootstrap/test_auto_create_app_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/celery_bootstrap/test_bootstrap_worker.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/bootstrap/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/bootstrap/test_bootstrap_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/repository/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/repository/sqlalchemy/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/repository/sqlalchemy/test_cache_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/repository/sqlalchemy/test_repository_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/rest/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/rest/test_auto_interface_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/rest/test_fastapi_app_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/rest/test_rest_error_mapping.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/rest/test_rest_observability.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/use_case/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/use_case/test_custom_repository_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/core/use_case/test_use_case_crud_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/etl/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/etl/test_runner_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/config/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/config/conf.interfaces.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/config/conf.manifest.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/config/conf.modules.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/config/conf.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/main.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/manifest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/category/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/category/model.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/category/schemas.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/interface.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/jobs.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/model.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/relations.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/repository.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/repository_contract.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/review/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/review/model.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/review/schemas.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/schemas.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/fake_repo/product/use_cases.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/sql/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/sql/init/01_users_roles.sql +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/sql/test_clickhouse_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/streaming/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/streaming/kafka/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/streaming/kafka/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/streaming/kafka/test_partitioned_source_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/streaming/kafka/test_source_contract_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/streaming/test_into_table_integration.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/support/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/integration/support/logical_repo_fixtures.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/engines/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/engines/test_a2a_capability.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/engines/test_capability_span_nesting.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/engines/test_pydantic_ai_binding.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/engines/test_pydantic_ai_failures.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/engines/test_pydantic_ai_translation.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/README.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-a2a-agent/agent.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-mcp-agent/agent.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-python-agent/agent.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-skills-agent/agent.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-skills-agent/skills/release-notes/SKILL.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-sql-agent/agent.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/capability-usecase-agent/agent.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/full-agent/agent.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/full-agent/skills/severity-rubric/SKILL.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/minimal-agent/agent.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/corpus_v1/output-type-ref-agent/agent.yaml +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/incidents.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/invoices.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/unsupported.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/broken.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/geo.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/metrics.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/skills_root/shared/group-changes/SKILL.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/fixtures/skills_root/shared/tone-of-voice/SKILL.md +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/test_capabilities.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/test_limits.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/test_model_role.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/test_output.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/phases/test_validate_cli.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_a2a_base_url.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_a2a_card.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_compiler.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_compiler_offline.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_declarative_envelope.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_describe.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_error_catalogue_totality.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_error_factories.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_fake_engine.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_loopback_plaintext.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_no_extras_import.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_public_surface.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_schema_emission.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_secret_containment.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ai/test_spec_v1_corpus.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_bootstrap/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_bootstrap/test_async_runtime.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_bootstrap/test_bootstrap.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_jobs/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_jobs/test_auto.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_jobs/test_celery_service.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_jobs/test_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_jobs/test_identity_propagation.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/celery_jobs/test_runner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/ci/test_workflow_supply_chain_contract.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/backend/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/backend/test_backend_compiler.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/bootstrap/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/bootstrap/test_bootstrap.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/bootstrap/test_bootstrap_metrics.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/bootstrap/test_kernel.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/cache/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/cache/test_cached_repository.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/cache/test_config_wiring.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/cache/test_gateway_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/command/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/command/test_command_base.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/command/test_command_field.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/command/test_command_patch.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/command/test_introspection.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_binder.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_configurable.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_context.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_resolver_utils.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_secrets.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/config/test_ssm.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/di/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/di/test_container.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/discovery/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/discovery/test_manifest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_caller_binding.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_compiler.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_executor.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_executor_trace.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_executor_uow.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_metrics.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/engine/test_plan.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/errors/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/errors/test_errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/expr/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/expr/test_expr.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/identity/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/identity/test_context.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/identity/test_identity.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/identity/test_wire.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/introspection/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/introspection/test_describe.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/test_callback.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/test_context.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/test_handle.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/test_inline_service.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/job/test_job.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/logger/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/logger/test_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/logger/test_registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/model/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/model/test_model.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/model/test_struct.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/model/test_timestamped.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_message_id_generator.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_observers.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_optional_otel_sdk.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_otel_loader_branches.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_provider_modes.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_runtime.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/observability/test_tracing_characterisation.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/plugins/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/plugins/test_entrypoints.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/plugins/test_import_containment.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/projection/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/projection/test_runtime.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/abc/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/abc/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/abc/test_query.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/abc/test_repository_contract.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/dynamodb/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/dynamodb/test_registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/dynamodb/test_repository.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/sqlalchemy/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/sqlalchemy/test_loaders.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/sqlalchemy/test_repository.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/repository/sqlalchemy/test_transactional.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/routing/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/routing/test_routing.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/_fakes.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_clickhouse_executor.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_clickhouse_transport.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_isolation.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_null_service.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_pagination_limits.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_registry_lifecycle.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/sql/test_role_policy.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/test_async_bridge.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/test_compiler_contracts.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/test_runner_contracts.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/tracing/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/tracing/test_context.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/uow/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/uow/test_executor_uow.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/uow/test_sqlalchemy_uow.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/uow/test_uow_protocols.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_compute.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_factory.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_field_ref.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_invoker.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_markers.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_rule.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/core/use_case/test_use_case.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/_historify_contract.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_empty_write_warning.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_historify_common.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_path_template.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_apply_schema.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_backend.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_dtype.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_file_writer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_historify_polars.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_predicate_pushdown.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_reader_columns.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_reader_json_columns.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_step_execution.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_streaming_write.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_update_writer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_upsert_writer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_writer_null_schema.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_polars/test_writer_to_frame.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/test_dtype.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/test_historify_spark.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/test_spark_apply_schema.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/test_step_execution.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_spark/test_writer_to_frame.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/backends/test_write_policy_historify.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/checkpoint/backends/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/checkpoint/backends/test_checkpoint_polars.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/checkpoint/test_checkpoint_paths.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/checkpoint/test_cleaners.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/checkpoint/test_store.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/client_step/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/client_step/test_client_step.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_catalog_validator.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_compiler.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_compiler_catalog.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_compiler_upsert.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_errors_additional_factories.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_errors_runtime_factories.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_file_template_validator.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_historify_validator.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_param_exprs_validator.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_plan_traversal.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_step_validator.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_structural.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_temp_validator.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/compiler/test_upsert_validator.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_clickhouse_reader.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_dynamodb_predicate.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_dynamodb_reader.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_from_clickhouse.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_from_dynamodb.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_from_mongo.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_mongo_predicate.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_mongo_reader.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/sources/test_mongo_reader_memory.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/targets/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/targets/test_clickhouse_writer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/targets/test_into_clickhouse.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_history_target.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_source.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_source_json.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_source_options.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_target.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_utils.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/io/test_variants.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/lineage/test_observer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/lineage/test_records.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/lineage/test_store.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/backends/test_delta_rs.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/test_builder.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/test_runner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/maintenance/test_step.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/pipeline/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/pipeline/test_pipeline_process.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/pipeline/test_proxy.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/pipeline/test_step.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/schema/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/schema/test_contract.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/schema/test_schema.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/schema/test_table.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/sql/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/sql/test_merge.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/sql/test_predicate.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/sql/test_predicate_dialect.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/sql/test_sql_runtime.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_backend_factory.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_io_protocols.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_locator.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_observability_and_protocols.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_route_build.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_schema_readers.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/storage/test_storage_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_config_loader.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_executor.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_executor_tracing.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_format_registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_module_contracts.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_public_api_discovery.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_record_schema_coverage.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_runner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_runner_errors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/test_spark_testing.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/testing/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/testing/test_runners.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/testing/test_scenario_and_stubs.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/etl/testing/test_spark_helpers.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_backfill_flow.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_ctx.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_etl_flow.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_logging_bridge.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_maintenance_flow.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_manifest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_manifest_s3.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_notify.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_observer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_placeholders.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_task_run_observer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prefect/test_yaml_loader.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prometheus/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prometheus/test_adapter.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/prometheus/test_middleware.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/release/test_checkout_merged_release.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/release/test_release_workflow_contract.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/_fixture_app.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_app_hardening.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_auth_middleware.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_auth_rejection_logging.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_autocrud.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_cors.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_fastapi_auto_logger.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_fastapi_auto_persistence.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_jwt_issuer.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_jwt_middleware.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_middleware.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_pydantic_adapter.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_request_hardening.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_response.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_rest_adapter.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_rest_compiler.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_rest_model.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_route_rbac.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_router_identity.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_router_runtime.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_sql_endpoint.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_sql_endpoint_auth_gate.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_sql_endpoint_roles.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/rest/test_sql_serialization.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/cases.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_batch_key.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_collect_batch.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_dlq.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_error_boundary.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_fanout_accounting.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_operators.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_resource_manager.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_runner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_runtime_io.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_runtime_sink.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_runtime_source.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_sink_registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_steps.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_storage.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/bytewax/test_storage_trace_characterisation.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/cases.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_async_walk.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_basics.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_config_bindings.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_delivery.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_error_codes.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_mongo_source.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_multi_source.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_router.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_window.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/compiler/test_with.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/cases.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/test_boundary.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/test_message.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/test_mongo_contracts.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/test_multi_boundary.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/contracts/test_steps.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/batch.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/explode.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/fork.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/router.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/shared.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/cases/simple.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/test_compiler_examples.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/flows/test_flow_examples.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/cases.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/fakes.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_client.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_coordinator_retry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_key_resolver.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_message.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_message_client.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_multi_wire.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_observability.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_settings.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_source_decode_parity.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/kafka/test_wire.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/mongo/test_bytewax_source.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/nodes/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/nodes/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/nodes/test_broadcast.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/nodes/test_delta_config.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/nodes/test_logging.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/nodes/test_table_package.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/cases.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/conftest.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/test_message_lifecycle_spans.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/test_multiworker_trace_continuity.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/test_observability_runner.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/test_protocols.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/test_registry.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/observability/test_structlog.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/support/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/support/flow_cases.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/test_expand_routes.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/test_fork.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/test_otel_observability.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/test_routing.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/test_testing_mongo.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/streaming/test_with.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/testing/__init__.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/testing/test_golden.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/testing/test_http_harness.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/testing/test_identity_harness.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/testing/test_in_memory.py +0 -0
- {loom_kernel-1.7.0 → loom_kernel-1.8.0}/tests/unit/testing/test_runner.py +0 -0
|
@@ -31,7 +31,7 @@ jobs:
|
|
|
31
31
|
pip install --only-binary :all: "uv==0.10.2"
|
|
32
32
|
|
|
33
33
|
- name: Quality report (strict)
|
|
34
|
-
uses: the-reacher-data/loom-actions/actions/python/quality-report@
|
|
34
|
+
uses: the-reacher-data/loom-actions/actions/python/quality-report@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
|
|
35
35
|
with:
|
|
36
36
|
src-dir: src
|
|
37
37
|
test-dir: tests
|
|
@@ -50,7 +50,7 @@ jobs:
|
|
|
50
50
|
- name: Quality report (strict gate)
|
|
51
51
|
id: quality
|
|
52
52
|
continue-on-error: true
|
|
53
|
-
uses: the-reacher-data/loom-actions/actions/python/quality-report@
|
|
53
|
+
uses: the-reacher-data/loom-actions/actions/python/quality-report@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
|
|
54
54
|
with:
|
|
55
55
|
src-dir: src
|
|
56
56
|
test-dir: tests
|
|
@@ -61,7 +61,7 @@ jobs:
|
|
|
61
61
|
|
|
62
62
|
- name: Publish PR quality comment
|
|
63
63
|
if: ${{ always() && steps.quality.outputs.report-file != '' }}
|
|
64
|
-
uses: the-reacher-data/loom-actions/actions/core/pr-comment-update@
|
|
64
|
+
uses: the-reacher-data/loom-actions/actions/core/pr-comment-update@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
|
|
65
65
|
with:
|
|
66
66
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
67
67
|
tags: "<!-- loom-quality-report -->"
|
|
@@ -69,7 +69,7 @@ jobs:
|
|
|
69
69
|
|
|
70
70
|
- name: Compute candidate prerelease version
|
|
71
71
|
id: version
|
|
72
|
-
uses: the-reacher-data/loom-actions/actions/release/versioning-branch-semantic@
|
|
72
|
+
uses: the-reacher-data/loom-actions/actions/release/versioning-branch-semantic@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
|
|
73
73
|
with:
|
|
74
74
|
branch: ${{ github.head_ref }}
|
|
75
75
|
prerelease: "true"
|
|
@@ -77,7 +77,7 @@ jobs:
|
|
|
77
77
|
- name: Generate changelog preview
|
|
78
78
|
id: changelog
|
|
79
79
|
continue-on-error: true
|
|
80
|
-
uses: the-reacher-data/loom-actions/actions/release/changelog-conventional-commit@
|
|
80
|
+
uses: the-reacher-data/loom-actions/actions/release/changelog-conventional-commit@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
|
|
81
81
|
with:
|
|
82
82
|
mode: "pr"
|
|
83
83
|
branch: ${{ github.event.pull_request.head.sha }}
|
|
@@ -88,7 +88,7 @@ jobs:
|
|
|
88
88
|
|
|
89
89
|
- name: Publish PR changelog comment
|
|
90
90
|
if: ${{ steps.changelog.outcome == 'success' && steps.changelog.outputs.output_path != '' }}
|
|
91
|
-
uses: the-reacher-data/loom-actions/actions/core/pr-comment-update@
|
|
91
|
+
uses: the-reacher-data/loom-actions/actions/core/pr-comment-update@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
|
|
92
92
|
with:
|
|
93
93
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
94
94
|
tags: "<!-- changelog-preview -->,<!-- branch-source:${{ github.head_ref }} -->"
|
|
@@ -47,7 +47,7 @@ jobs:
|
|
|
47
47
|
|
|
48
48
|
- name: Compute release version from merged branch
|
|
49
49
|
id: version
|
|
50
|
-
uses: the-reacher-data/loom-actions/actions/release/versioning-branch-semantic@
|
|
50
|
+
uses: the-reacher-data/loom-actions/actions/release/versioning-branch-semantic@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
|
|
51
51
|
with:
|
|
52
52
|
branch: ${{ env.RELEASE_BRANCH }}
|
|
53
53
|
prerelease: "false"
|
|
@@ -67,7 +67,7 @@ jobs:
|
|
|
67
67
|
- name: Generate release changelog
|
|
68
68
|
id: changelog
|
|
69
69
|
if: ${{ steps.version.outputs.deploy == 'true' && github.event_name != 'workflow_dispatch' }}
|
|
70
|
-
uses: the-reacher-data/loom-actions/actions/release/changelog-conventional-commit@
|
|
70
|
+
uses: the-reacher-data/loom-actions/actions/release/changelog-conventional-commit@bdb1b5bc76f37f3f33a6598224e864c17b8d756a # v1.0.5
|
|
71
71
|
with:
|
|
72
72
|
mode: "release"
|
|
73
73
|
branch: ${{ env.RELEASE_BRANCH }}
|
|
@@ -1,3 +1,71 @@
|
|
|
1
|
+
# 🚀 Release 1.8.0 ([#147](https://github.com/the-reacher-data/loom-py/pull/147)) ([`1d9667e`](https://github.com/the-reacher-data/loom-py/commit/1d9667e3))
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
## ✨ Features
|
|
5
|
+
### ai
|
|
6
|
+
- **ai:** authenticate to remote A2A agents, and share one strategy registry ([#147](https://github.com/the-reacher-data/loom-py/pull/147))<br>
|
|
7
|
+
> `A2AAgentConfig.headers_ref` was declared, validated by the compiler and
|
|
8
|
+
> carried into the plan — then dropped, so an agent configured with
|
|
9
|
+
> credentials connected **unauthenticated, silently**. MCP at least refused.
|
|
10
|
+
>
|
|
11
|
+
> **BREAKING**: the entry-point group `loom.ai.mcp_auth` is renamed
|
|
12
|
+
> `loom.ai.remote_auth`, and `mcp_auth.py` becomes `remote_auth.py`. Anything
|
|
13
|
+
> registered under the old name stops being found. No deprecation cycle was
|
|
14
|
+
> run because the group shipped one release earlier with no consumers.
|
|
15
|
+
>
|
|
16
|
+
> One registry now serves both outbound transports: nothing about `bearer`,
|
|
17
|
+
> `oauth` or `static` is MCP-specific, since the contract is `httpx.Auth`.
|
|
18
|
+
> Sharing keys are scoped by transport, so an MCP server and an A2A agent of
|
|
19
|
+
> the same name remain two credentials. The credential is set on the client,
|
|
20
|
+
> so the card fetch — the *first* request of a session — carries it too.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## 🐛 Fixes
|
|
24
|
+
### ai
|
|
25
|
+
- **ai:** give a plugin the setting types its signature declares ([#150](https://github.com/the-reacher-data/loom-py/pull/150))<br>
|
|
26
|
+
> Auth settings arrive as strings, because each passes the inline-credential
|
|
27
|
+
> refusal, which admits no spaces. A strategy declaring `timeout: int` got
|
|
28
|
+
> `"30"`, and one declaring `verify: bool` got `"false"` — which is truthy, so
|
|
29
|
+
> a deployment asking to turn verification off got it turned on.
|
|
30
|
+
>
|
|
31
|
+
> A setting whose parameter declares `str`, `int`, `float` or `bool` is now
|
|
32
|
+
> converted to it; a custom type or an unannotated parameter is passed exactly
|
|
33
|
+
> as before, so no existing strategy changes behaviour.
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
## 🧹 Chores
|
|
37
|
+
- **chore:** retire two expired Sonar suppressions and fix two lying test stubs ([#146](https://github.com/the-reacher-data/loom-py/pull/146))<br>
|
|
38
|
+
> Both suppressions carried a written expiry condition that the 1.7.0 split
|
|
39
|
+
> met; one pointed at a file that no longer exists. Two test stubs had
|
|
40
|
+
> silently stopped satisfying the protocols they stand in for.
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# 🚀 Release 1.7.1 ([#143](https://github.com/the-reacher-data/loom-py/pull/143)) ([`0322dbb`](https://github.com/the-reacher-data/loom-py/commit/0322dbb2))
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
## 🐛 Fixes
|
|
47
|
+
### streaming
|
|
48
|
+
- **streaming:** emit a terminal span for outbound topic writes ([#143](https://github.com/the-reacher-data/loom-py/pull/143))<br>
|
|
49
|
+
> `TerminalReason.SINK_WRITE` has documented "written to a storage sink or an
|
|
50
|
+
> outbound topic" since 1.7.0, but the outbound half was never true: the Kafka
|
|
51
|
+
> sink partition had no observability runtime in reach, so a flow ending in
|
|
52
|
+
> `IntoTopic` produced a trace that stopped at its last node span.
|
|
53
|
+
>
|
|
54
|
+
> A message written to an outbound topic now emits one terminal span in its own
|
|
55
|
+
> trace, plus the same N+1 batch shape as the storage sink. Failed writes close
|
|
56
|
+
> failed and carry `terminal.failure_scope="batch"`, because the producer keeps
|
|
57
|
+
> one delivery error for a whole batch — without the marker a trace would claim
|
|
58
|
+
> that messages the broker acknowledged had failed. A batch diverted to a DLQ
|
|
59
|
+
> also closes failed: `send_batch_to_dlq` never flushes, so at span-close time
|
|
60
|
+
> the landing is unverified.
|
|
61
|
+
>
|
|
62
|
+
> The untraced path gained no branch: tracing is a wrapper returned only when
|
|
63
|
+
> bound, so a flow without observability runs exactly the code it ran before.
|
|
64
|
+
>
|
|
65
|
+
> Three of five death paths are now traced. Drop sinks and `Drain` still emit
|
|
66
|
+
> no terminal span.
|
|
67
|
+
|
|
68
|
+
|
|
1
69
|
# 🚀 Release 1.7.0 ([#142](https://github.com/the-reacher-data/loom-py/pull/142)) ([`1a9240a`](https://github.com/the-reacher-data/loom-py/commit/1a9240a6))
|
|
2
70
|
|
|
3
71
|
|
|
@@ -36,7 +36,7 @@ ai:
|
|
|
36
36
|
a2a_agents:
|
|
37
37
|
oncall:
|
|
38
38
|
url: https://oncall.partner.example.com/a2a/rota
|
|
39
|
-
headers_ref:
|
|
39
|
+
headers_ref: ${secrets:/loom/oncall/api-key} # stores e.g. X-API-Key=abc123
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
At start-up the remote card is fetched and validated. An unreachable agent fails
|
|
@@ -57,6 +57,55 @@ The remote URL must be `https://`, with no credentials in its userinfo and no
|
|
|
57
57
|
query string. Compilation refuses anything else, and the offending URL is
|
|
58
58
|
redacted in the error message.
|
|
59
59
|
|
|
60
|
+
### Authenticating to the remote agent
|
|
61
|
+
|
|
62
|
+
A remote agent declares its credential exactly as an MCP server does, and loom
|
|
63
|
+
resolves it through the same registry — see
|
|
64
|
+
[mcp.md § Authentication](mcp.md#authentication) for the full reference:
|
|
65
|
+
|
|
66
|
+
```yaml
|
|
67
|
+
ai:
|
|
68
|
+
a2a_agents:
|
|
69
|
+
oncall:
|
|
70
|
+
url: https://oncall.partner.example.com/a2a/rota
|
|
71
|
+
headers_ref: ${secrets:/loom/oncall/api-key} # one Name=value pair
|
|
72
|
+
market:
|
|
73
|
+
url: https://market.partner.example.com/a2a
|
|
74
|
+
auth:
|
|
75
|
+
kind: bearer # Authorization: Bearer <token>
|
|
76
|
+
token_ref: ${secrets:/loom/market/token}
|
|
77
|
+
orders:
|
|
78
|
+
url: https://orders.internal.example.com/a2a
|
|
79
|
+
auth:
|
|
80
|
+
kind: agent-session # a strategy you register
|
|
81
|
+
session_url: https://orders.internal.example.com/auth/agent/session
|
|
82
|
+
bootstrap_ref: ${secrets:/agents/prod/agent-sales}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The credential is set on the HTTP client, not on one request, so **every** call
|
|
86
|
+
carries it — including the card fetch, which is the *first* request of the
|
|
87
|
+
session. An agent that authenticates its card endpoint would otherwise fail
|
|
88
|
+
start-up before a skill was ever called.
|
|
89
|
+
|
|
90
|
+
`kind` names an entry point in the group `loom.ai.remote_auth`, the same group
|
|
91
|
+
MCP servers resolve against: the strategy contract is
|
|
92
|
+
[`httpx.Auth`](https://www.python-httpx.org/advanced/authentication/), which
|
|
93
|
+
knows nothing of either protocol, so a deployment registers its strategy once
|
|
94
|
+
and grants it to either transport. The one strategy an A2A agent cannot use is
|
|
95
|
+
`kind: oauth`, which delegates to the MCP client library's own flow; naming it
|
|
96
|
+
here is refused with `MCP_AUTH_STRATEGY_INVALID` rather than connecting without
|
|
97
|
+
the credential the deployment asked for.
|
|
98
|
+
|
|
99
|
+
What compilation guarantees is what it guarantees for an MCP server:
|
|
100
|
+
`headers_ref` and `auth` are **mutually exclusive** (`MCP_AUTH_CONFLICT`); a
|
|
101
|
+
`kind` nobody registers fails at compile time naming what is installed
|
|
102
|
+
(`MCP_AUTH_STRATEGY_UNKNOWN`); and no literal secret is accepted anywhere in the
|
|
103
|
+
block (`MCP_CREDENTIALS_INLINE`, and the rejection never repeats the value).
|
|
104
|
+
|
|
105
|
+
The authentication object is built **once per configured agent and shared by
|
|
106
|
+
every agent granted it**: the credential belongs to the deployment, so a
|
|
107
|
+
renewing strategy renews once rather than once per caller.
|
|
108
|
+
|
|
60
109
|
## Inbound — publishing your agent
|
|
61
110
|
|
|
62
111
|
```yaml
|
|
@@ -167,7 +167,7 @@ ai:
|
|
|
167
167
|
bootstrap_ref: ${secrets:/agents/prod/agent-sales}
|
|
168
168
|
```
|
|
169
169
|
|
|
170
|
-
`kind` names an entry point in the group `loom.ai.
|
|
170
|
+
`kind` names an entry point in the group `loom.ai.remote_auth`; every other key in
|
|
171
171
|
the block is passed to it as a **keyword argument**. Loom registers three, all
|
|
172
172
|
thin delegations to what the libraries already provide:
|
|
173
173
|
|
|
@@ -196,7 +196,7 @@ from **your own package**; loom does not change:
|
|
|
196
196
|
|
|
197
197
|
```toml
|
|
198
198
|
# pyproject.toml of your own distribution
|
|
199
|
-
[project.entry-points."loom.ai.
|
|
199
|
+
[project.entry-points."loom.ai.remote_auth"]
|
|
200
200
|
agent-session = "my_package.auth:AgentSessionAuth"
|
|
201
201
|
```
|
|
202
202
|
|
|
@@ -254,6 +254,14 @@ server's read permissions to that prefix and log failed attempts per path.
|
|
|
254
254
|
- A strategy that cannot be built from its settings fails at start-up with
|
|
255
255
|
`MCP_AUTH_STRATEGY_INVALID`.
|
|
256
256
|
|
|
257
|
+
The group is `loom.ai.remote_auth`, not `loom.ai.mcp_auth`: one registry serves
|
|
258
|
+
the MCP servers of `ai.mcp_servers` **and** the remote agents of `ai.a2a_agents`
|
|
259
|
+
(see [a2a.md](a2a.md)), because the contract is `httpx.Auth` and knows neither
|
|
260
|
+
protocol. A strategy is registered once and granted to either. The one
|
|
261
|
+
exception is `kind: oauth`, which delegates to the MCP client library's own
|
|
262
|
+
flow: an A2A agent naming it is refused with `MCP_AUTH_STRATEGY_INVALID` rather
|
|
263
|
+
than connected without a credential.
|
|
264
|
+
|
|
257
265
|
### One instance per server
|
|
258
266
|
|
|
259
267
|
The authentication object is built **once per server and shared by every agent
|
|
@@ -22,7 +22,7 @@ rather than emitting an unusable one.
|
|
|
22
22
|
| --- | --- |
|
|
23
23
|
| `transport:kafka_consume` | The consumer, from the inbound header — the message's birth |
|
|
24
24
|
| `node:<flow>:<idx>` | Each node the message traverses |
|
|
25
|
-
| `terminal:sink_write` | Written to a storage sink |
|
|
25
|
+
| `terminal:sink_write` | Written to a storage sink or an outbound Kafka topic |
|
|
26
26
|
| `terminal:error_envelope` | Turned into an error envelope or routed to a DLQ |
|
|
27
27
|
| `terminal:dropped_no_route` | Expanded or routed to zero rows |
|
|
28
28
|
|
|
@@ -112,6 +112,27 @@ broken.
|
|
|
112
112
|
ratio, most batch spans are dropped along with most messages. What holds at
|
|
113
113
|
every ratio is that an exported batch span links to exactly the participation
|
|
114
114
|
spans that were also exported.
|
|
115
|
-
-
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
- **Two death paths are still untraced.** `_DropSinkPartition` (an unrouted
|
|
116
|
+
branch or error kind) and `Drain` discard a message without a terminal span,
|
|
117
|
+
so `TerminalReason.DROPPED_NO_ROUTE` is not emitted on either. Three of the
|
|
118
|
+
five death paths — outbound topic, storage sink, error envelope — are traced.
|
|
119
|
+
- **A wire decode failure has no terminal span, and cannot have one.** A
|
|
120
|
+
`DecodeError` never became a message: it carries no `MessageMeta`, so there is
|
|
121
|
+
no trace id, no message id and no lineage to open a span in. Fabricating a
|
|
122
|
+
synthetic meta would invent a message that never existed.
|
|
123
|
+
- **A failed outbound batch fails every message in it.** The Kafka producer
|
|
124
|
+
keeps one pending delivery error and `flush()` raises it for the whole batch,
|
|
125
|
+
so a single rejected record closes all N terminal spans failed. Those spans
|
|
126
|
+
carry `terminal.failure_scope="batch"` to say the attribution is batch-wide,
|
|
127
|
+
not per record. Success carries no such attribute: `flush()` waited for every
|
|
128
|
+
record, so a successful death is per-message truth.
|
|
129
|
+
- **A batch diverted to a DLQ closes failed, with `terminal.dlq_topic` set.**
|
|
130
|
+
The diversion never flushes and swallows per-item failures, so at span-close
|
|
131
|
+
time the DLQ landing is unverified. The batch still commits, as it did before.
|
|
132
|
+
- **A delivery error can be attributed to the wrong batch.** The producer's
|
|
133
|
+
pending error is consumed by whichever `flush()` observes it, which may be the
|
|
134
|
+
next batch's. The terminal spans that close failed are then one batch late.
|
|
135
|
+
- **Epoch replay produces duplicate terminal spans.** Bytewax replays an epoch
|
|
136
|
+
from the last snapshot after a failure, so a message written twice records two
|
|
137
|
+
`terminal:sink_write` spans under one trace id. That is at-least-once delivery
|
|
138
|
+
being visible, not a tracing fault; deduplicate on `loom.batch_id`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "loom-kernel"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.8.0"
|
|
4
4
|
description = "Loom Python project"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -138,13 +138,15 @@ celery = [
|
|
|
138
138
|
[project.entry-points."loom.ai.engines"]
|
|
139
139
|
pydantic-ai = "loom.ai.engines.pydantic_ai.provider:PydanticAIEngineProvider"
|
|
140
140
|
|
|
141
|
-
# Authentication strategies for
|
|
142
|
-
#
|
|
143
|
-
#
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
141
|
+
# Authentication strategies for the remote endpoints loom calls out to: MCP
|
|
142
|
+
# servers and A2A agents alike, since the contract is httpx.Auth and knows
|
|
143
|
+
# nothing of either protocol. A deployment plugs in its own from its own
|
|
144
|
+
# package under the same group; loom ships only these three thin delegations.
|
|
145
|
+
# See docs/ai/mcp.md and docs/ai/a2a.md.
|
|
146
|
+
[project.entry-points."loom.ai.remote_auth"]
|
|
147
|
+
oauth = "loom.ai.remote_auth:standard_oauth"
|
|
148
|
+
bearer = "loom.ai.remote_auth:bearer_token"
|
|
149
|
+
static = "loom.ai.remote_auth:static_headers"
|
|
148
150
|
|
|
149
151
|
[project.entry-points."loom.etl.backends"]
|
|
150
152
|
polars = "loom.etl.backends.polars.provider:PolarsProvider"
|
|
@@ -267,6 +269,11 @@ extend-immutable-calls = [
|
|
|
267
269
|
|
|
268
270
|
[tool.pyright]
|
|
269
271
|
pythonVersion = "3.11"
|
|
272
|
+
# src only, deliberately. Checking tests as well surfaces 294 errors across
|
|
273
|
+
# eight rules — mostly stubs that no longer satisfy the protocol they stand in
|
|
274
|
+
# for. That is real signal and worth burning down, but it is a project, not a
|
|
275
|
+
# flag flip: turning it on without the cleanup would make the gate meaningless
|
|
276
|
+
# on its first run. Tracked in specs/feature/quality/typecheck_tests.md.
|
|
270
277
|
include = [
|
|
271
278
|
"src",
|
|
272
279
|
]
|
|
@@ -350,7 +357,7 @@ markers = [
|
|
|
350
357
|
|
|
351
358
|
[tool.commitizen]
|
|
352
359
|
name = "cz_conventional_commits"
|
|
353
|
-
version = "1.
|
|
360
|
+
version = "1.8.0"
|
|
354
361
|
tag_format = "v$version"
|
|
355
362
|
version_files = [
|
|
356
363
|
"pyproject.toml:project.version",
|
|
@@ -25,7 +25,7 @@ sonar.coverage.exclusions=tests/**,tests/**/*,**/.github/**,docs/**,docs/**/*
|
|
|
25
25
|
# String(), DateTime(), Numeric()
|
|
26
26
|
#
|
|
27
27
|
# Renaming any of them would be a breaking public API change.
|
|
28
|
-
sonar.issue.ignore.multicriteria=e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19,e20,e21,e22,e23,e24,e25,e26,e27,e28,e29,e30,e31,e32,e33,e34,e35,e36,e37,e38,e39,e40,e41,e42,e43,e44,e45,
|
|
28
|
+
sonar.issue.ignore.multicriteria=e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19,e20,e21,e22,e23,e24,e25,e26,e27,e28,e29,e30,e31,e32,e33,e34,e35,e36,e37,e38,e39,e40,e41,e42,e43,e44,e45,e48,e49,e50,e51
|
|
29
29
|
|
|
30
30
|
# Use-case DSL markers: Input, Load, LoadById, Exists — S100 (method) + S1542 (function)
|
|
31
31
|
sonar.issue.ignore.multicriteria.e1.ruleKey=python:S100
|
|
@@ -209,15 +209,6 @@ sonar.issue.ignore.multicriteria.e45.resourceKey=**/etl/declarative/target/_hist
|
|
|
209
209
|
# reasoning as IntoHistory above: an options object would hide the very names a
|
|
210
210
|
# reader needs, and for a wiring function the parameter list IS the contract —
|
|
211
211
|
# it is what tells you, at a glance, everything the runtime is handed.
|
|
212
|
-
#
|
|
213
|
-
# TEMPORARY for two of them: runtime.py and a2a/server.py are scheduled to be
|
|
214
|
-
# split by responsibility (runtime/{_lifecycle,_mcp,_limits,_health}.py and the
|
|
215
|
-
# a2a binding already extracted). Both signatures shrink with that split, so
|
|
216
|
-
# e46 and e47 should be removed then rather than inherited.
|
|
217
|
-
sonar.issue.ignore.multicriteria.e46.ruleKey=python:S107
|
|
218
|
-
sonar.issue.ignore.multicriteria.e46.resourceKey=**/ai/runtime.py
|
|
219
|
-
sonar.issue.ignore.multicriteria.e47.ruleKey=python:S107
|
|
220
|
-
sonar.issue.ignore.multicriteria.e47.resourceKey=**/ai/a2a/server.py
|
|
221
212
|
sonar.issue.ignore.multicriteria.e48.ruleKey=python:S107
|
|
222
213
|
sonar.issue.ignore.multicriteria.e48.resourceKey=**/ai/fastapi/endpoints.py
|
|
223
214
|
sonar.issue.ignore.multicriteria.e49.ruleKey=python:S107
|
|
@@ -20,10 +20,10 @@ from loom.ai.compiler._plan import (
|
|
|
20
20
|
AgentPlan,
|
|
21
21
|
CompiledA2ACapability,
|
|
22
22
|
CompiledCapability,
|
|
23
|
-
CompiledMcpAuth,
|
|
24
23
|
CompiledMcpCapability,
|
|
25
24
|
CompiledOutput,
|
|
26
25
|
CompiledPythonCapability,
|
|
26
|
+
CompiledRemoteAuth,
|
|
27
27
|
CompiledSkillsCapability,
|
|
28
28
|
CompiledSqlCapability,
|
|
29
29
|
CompiledUsecaseCapability,
|
|
@@ -38,10 +38,10 @@ __all__ = [
|
|
|
38
38
|
"AgentPlan",
|
|
39
39
|
"CompiledA2ACapability",
|
|
40
40
|
"CompiledCapability",
|
|
41
|
-
"CompiledMcpAuth",
|
|
42
41
|
"CompiledMcpCapability",
|
|
43
42
|
"CompiledOutput",
|
|
44
43
|
"CompiledPythonCapability",
|
|
44
|
+
"CompiledRemoteAuth",
|
|
45
45
|
"CompiledSkillsCapability",
|
|
46
46
|
"CompiledSqlCapability",
|
|
47
47
|
"CompiledUsecaseCapability",
|
|
@@ -81,8 +81,12 @@ class CompiledSqlCapability(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
81
81
|
max_result_bytes: int
|
|
82
82
|
|
|
83
83
|
|
|
84
|
-
class
|
|
85
|
-
"""Authentication strategy of one
|
|
84
|
+
class CompiledRemoteAuth(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
85
|
+
"""Authentication strategy of one remote endpoint, resolved to name and settings.
|
|
86
|
+
|
|
87
|
+
One struct serves both outbound transports, MCP servers and A2A agents, as
|
|
88
|
+
the one registry that builds it does: the strategy contract is
|
|
89
|
+
``httpx.Auth``, which knows nothing of either protocol.
|
|
86
90
|
|
|
87
91
|
``kind`` is separated from the rest of the ``auth`` block once, here, so the
|
|
88
92
|
engine never re-reads configuration to find out which strategy to build.
|
|
@@ -90,7 +94,7 @@ class CompiledMcpAuth(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
90
94
|
plan is a frozen, hashable value.
|
|
91
95
|
|
|
92
96
|
Attributes:
|
|
93
|
-
kind: Strategy name registered in the ``loom.ai.
|
|
97
|
+
kind: Strategy name registered in the ``loom.ai.remote_auth`` group.
|
|
94
98
|
settings: The rest of the ``auth`` block, passed to the strategy as
|
|
95
99
|
keyword arguments in declaration order.
|
|
96
100
|
"""
|
|
@@ -125,7 +129,7 @@ class CompiledMcpCapability(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
125
129
|
server: str
|
|
126
130
|
url: str
|
|
127
131
|
headers_ref: str | None = None
|
|
128
|
-
auth:
|
|
132
|
+
auth: CompiledRemoteAuth | None = None
|
|
129
133
|
timeout_ms: int = 20000
|
|
130
134
|
include: tuple[str, ...] = ()
|
|
131
135
|
exclude: tuple[str, ...] = ()
|
|
@@ -176,6 +180,9 @@ class CompiledA2ACapability(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
176
180
|
agent: Configured agent name, carried for the self-description.
|
|
177
181
|
url: Validated ``https://`` remote agent URL, free of credentials.
|
|
178
182
|
headers_ref: Reference to deployment-resolved headers; never a secret.
|
|
183
|
+
Applied to every request the client makes, the card fetch included.
|
|
184
|
+
auth: Named authentication strategy, mutually exclusive with
|
|
185
|
+
``headers_ref``; ``None`` when the agent needs no credential.
|
|
179
186
|
include: Skill names or glob patterns to expose; empty means all.
|
|
180
187
|
exclude: Skill names or glob patterns to omit, applied after ``include``.
|
|
181
188
|
"""
|
|
@@ -185,6 +192,7 @@ class CompiledA2ACapability(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
185
192
|
agent: str
|
|
186
193
|
url: str
|
|
187
194
|
headers_ref: str | None = None
|
|
195
|
+
auth: CompiledRemoteAuth | None = None
|
|
188
196
|
include: tuple[str, ...] = ()
|
|
189
197
|
exclude: tuple[str, ...] = ()
|
|
190
198
|
|
|
@@ -23,9 +23,9 @@ from loom.ai._filters import select_names
|
|
|
23
23
|
from loom.ai.compiler._plan import (
|
|
24
24
|
CompiledA2ACapability,
|
|
25
25
|
CompiledCapability,
|
|
26
|
-
CompiledMcpAuth,
|
|
27
26
|
CompiledMcpCapability,
|
|
28
27
|
CompiledPythonCapability,
|
|
28
|
+
CompiledRemoteAuth,
|
|
29
29
|
CompiledSkillsCapability,
|
|
30
30
|
CompiledSqlCapability,
|
|
31
31
|
CompiledUsecaseCapability,
|
|
@@ -221,7 +221,7 @@ def _compile_mcp(capability: McpCapability, context: _Context) -> _HandlerResult
|
|
|
221
221
|
server=capability.server,
|
|
222
222
|
url=server.url,
|
|
223
223
|
headers_ref=server.headers_ref,
|
|
224
|
-
auth=
|
|
224
|
+
auth=_compile_auth(server.auth),
|
|
225
225
|
timeout_ms=server.timeout_ms,
|
|
226
226
|
include=capability.include,
|
|
227
227
|
exclude=capability.exclude,
|
|
@@ -230,16 +230,17 @@ def _compile_mcp(capability: McpCapability, context: _Context) -> _HandlerResult
|
|
|
230
230
|
)
|
|
231
231
|
|
|
232
232
|
|
|
233
|
-
def
|
|
233
|
+
def _compile_auth(auth: Mapping[str, str] | None) -> CompiledRemoteAuth | None:
|
|
234
234
|
"""Split a validated ``auth`` block into the strategy name and its settings.
|
|
235
235
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
236
|
+
Shared by the ``mcp`` and ``a2a`` grants: both endpoints declare the same
|
|
237
|
+
block. Configuration already refused a block whose ``kind`` names no
|
|
238
|
+
registered strategy, so the split is the only work left: ``kind`` selects
|
|
239
|
+
the entry point and everything else becomes its keyword arguments.
|
|
239
240
|
"""
|
|
240
241
|
if auth is None:
|
|
241
242
|
return None
|
|
242
|
-
return
|
|
243
|
+
return CompiledRemoteAuth(
|
|
243
244
|
kind=auth["kind"],
|
|
244
245
|
settings=tuple((key, value) for key, value in auth.items() if key != "kind"),
|
|
245
246
|
)
|
|
@@ -254,6 +255,7 @@ def _compile_a2a(capability: A2ACapability, context: _Context) -> _HandlerResult
|
|
|
254
255
|
agent=capability.agent,
|
|
255
256
|
url=agent.url,
|
|
256
257
|
headers_ref=agent.headers_ref,
|
|
258
|
+
auth=_compile_auth(agent.auth),
|
|
257
259
|
include=capability.include,
|
|
258
260
|
exclude=capability.exclude,
|
|
259
261
|
),
|
|
@@ -34,7 +34,7 @@ from loom.ai.errors import (
|
|
|
34
34
|
policy_out_of_range,
|
|
35
35
|
)
|
|
36
36
|
from loom.ai.inference import InferenceTarget
|
|
37
|
-
from loom.ai.
|
|
37
|
+
from loom.ai.remote_auth import is_strategy_registered, registered_strategy_names
|
|
38
38
|
from loom.core.model import LoomFrozenStruct
|
|
39
39
|
|
|
40
40
|
# Conservative allowlist for a secret *reference*: a name, path, ARN or key id
|
|
@@ -191,7 +191,7 @@ class McpServerConfig(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
191
191
|
here; a bearer token belongs in ``auth: {kind: bearer}``.
|
|
192
192
|
Mutually exclusive with ``auth``.
|
|
193
193
|
auth: Named authentication strategy and its settings, flattened:
|
|
194
|
-
``kind`` selects an entry point registered in ``loom.ai.
|
|
194
|
+
``kind`` selects an entry point registered in ``loom.ai.remote_auth``
|
|
195
195
|
and every other key is passed to it as a keyword argument.
|
|
196
196
|
Mutually exclusive with ``headers_ref``.
|
|
197
197
|
timeout_ms: Deadline of a single call to this server.
|
|
@@ -206,14 +206,26 @@ class McpServerConfig(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
206
206
|
class A2AAgentConfig(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
207
207
|
"""One named remote A2A agent (``ai.a2a_agents.<name>``).
|
|
208
208
|
|
|
209
|
+
The credential is declared exactly as an MCP server declares it, and for
|
|
210
|
+
the same reason: the artifact names the agent, the deployment says how to
|
|
211
|
+
authenticate to it.
|
|
212
|
+
|
|
209
213
|
Attributes:
|
|
210
214
|
url: ``https://`` agent URL, free of userinfo and query string.
|
|
211
215
|
headers_ref: Reference to headers resolved by the secrets resolver.
|
|
212
|
-
Never a literal secret.
|
|
216
|
+
Never a literal secret. The resolved payload must be a single
|
|
217
|
+
``Name=value`` header pair, a shape checked at start-up rather than
|
|
218
|
+
here; a bearer token belongs in ``auth: {kind: bearer}``.
|
|
219
|
+
Mutually exclusive with ``auth``.
|
|
220
|
+
auth: Named authentication strategy and its settings, flattened:
|
|
221
|
+
``kind`` selects an entry point registered in ``loom.ai.remote_auth``
|
|
222
|
+
and every other key is passed to it as a keyword argument.
|
|
223
|
+
Mutually exclusive with ``headers_ref``.
|
|
213
224
|
"""
|
|
214
225
|
|
|
215
226
|
url: str
|
|
216
227
|
headers_ref: str | None = None
|
|
228
|
+
auth: dict[str, str] | None = None
|
|
217
229
|
|
|
218
230
|
|
|
219
231
|
class AgentEndpointConfig(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
@@ -342,19 +354,22 @@ def _validate_headers_ref(component: str, headers_ref: str | None) -> list[Agent
|
|
|
342
354
|
return [mcp_credentials_inline(component, "headers_ref")]
|
|
343
355
|
|
|
344
356
|
|
|
345
|
-
def _validate_auth(
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
357
|
+
def _validate_auth(
|
|
358
|
+
component: str, headers_ref: str | None, auth: Mapping[str, str] | None
|
|
359
|
+
) -> list[AgentCompilationIssue]:
|
|
360
|
+
"""Collect the issues of one endpoint's ``auth`` block.
|
|
361
|
+
|
|
362
|
+
Applied to MCP servers and A2A agents alike, since both declare the same
|
|
363
|
+
block and resolve it through the same registry. Two credentials on one
|
|
364
|
+
connection are ambiguous, so ``headers_ref`` and ``auth`` are refused
|
|
365
|
+
together; every setting in the block is held to the same fail-closed
|
|
366
|
+
reference test as ``headers_ref``, so no literal secret reaches loom by the
|
|
367
|
+
back door; and an unregistered strategy is refused here rather than at the
|
|
368
|
+
first message in production.
|
|
353
369
|
"""
|
|
354
|
-
auth = server.auth
|
|
355
370
|
if auth is None:
|
|
356
371
|
return []
|
|
357
|
-
if
|
|
372
|
+
if headers_ref is not None:
|
|
358
373
|
return [mcp_auth_conflict(component)]
|
|
359
374
|
issues = [
|
|
360
375
|
# The rejected value is deliberately absent from the issue, as for
|
|
@@ -378,7 +393,7 @@ def _validate_mcp_servers(
|
|
|
378
393
|
component = f"ai.mcp_servers.{name}"
|
|
379
394
|
issues.extend(_validate_remote_url(component, server.url, mcp_url_invalid))
|
|
380
395
|
issues.extend(_validate_headers_ref(component, server.headers_ref))
|
|
381
|
-
issues.extend(_validate_auth(component, server))
|
|
396
|
+
issues.extend(_validate_auth(component, server.headers_ref, server.auth))
|
|
382
397
|
if not _TIMEOUT_MS_MIN <= server.timeout_ms <= _TIMEOUT_MS_MAX:
|
|
383
398
|
issues.append(
|
|
384
399
|
policy_out_of_range(
|
|
@@ -401,4 +416,5 @@ def _validate_a2a_agents(
|
|
|
401
416
|
component = f"ai.a2a_agents.{name}"
|
|
402
417
|
issues.extend(_validate_remote_url(component, agent.url, a2a_url_invalid))
|
|
403
418
|
issues.extend(_validate_headers_ref(component, agent.headers_ref))
|
|
419
|
+
issues.extend(_validate_auth(component, agent.headers_ref, agent.auth))
|
|
404
420
|
return issues
|