loom-kernel 1.9.0__tar.gz → 1.9.2__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.9.0 → loom_kernel-1.9.2}/CHANGELOG.md +60 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/PKG-INFO +1 -1
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/ai/a2a.md +10 -5
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/ai/mcp.md +141 -14
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/ai/overview.md +68 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/ai/providers.md +39 -1
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/getting-started/rest.md +20 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/pyproject.toml +2 -2
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/config.py +24 -3
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_mcp.py +7 -2
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_spec.py +52 -3
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/provider.py +13 -2
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/errors.py +36 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/inference.py +29 -2
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/remote_auth.py +110 -54
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/runtime/_lifecycle.py +98 -21
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/_resolver_utils.py +41 -13
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/secrets.py +38 -14
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/ssm.py +40 -13
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/discovery/base.py +6 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/discovery/interfaces.py +10 -4
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/discovery/modules.py +7 -3
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/auto.py +88 -34
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/helpers/remote_auth_plugin.py +3 -1
- loom_kernel-1.9.2/tests/integration/ai/_agents_only_app.py +175 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/conftest.py +8 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_a2a_auth_wiring.py +13 -1
- loom_kernel-1.9.2/tests/integration/ai/test_auto_agents_only.py +271 -0
- loom_kernel-1.9.2/tests/integration/ai/test_auto_without_sqlalchemy.py +33 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_remote_auth_wiring.py +79 -12
- loom_kernel-1.9.2/tests/integration/ai/test_runtime_remote_clients.py +579 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/engines/test_pydantic_ai_binding.py +128 -2
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_config.py +115 -1
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_remote_auth.py +93 -5
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_resolver_utils.py +56 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_secrets.py +154 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_ssm.py +131 -5
- loom_kernel-1.9.2/tests/unit/core/discovery/test_interfaces.py +34 -0
- loom_kernel-1.9.2/tests/unit/core/discovery/test_modules.py +14 -0
- loom_kernel-1.9.2/tests/unit/rest/test_fastapi_auto_persistence.py +209 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/uv.lock +1 -1
- loom_kernel-1.9.0/tests/unit/rest/test_fastapi_auto_persistence.py +0 -104
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.github/workflows/ci-main.yml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.github/workflows/ci-pr.yml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.github/workflows/docs.yml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.github/workflows/release.yml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.gitignore +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.pre-commit-config.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.readthedocs.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/LICENSE +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/Makefile +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/README.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/codecov.yml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docker-compose.local.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/_static/.gitkeep +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/_static/custom.css +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/_static/logo-transparent.png +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/_static/logo.svg +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/ai/artifacts.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/ai/observability.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/architecture/adr/README.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/architecture/clean-architecture.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/architecture/overview.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/conf.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/etl/examples.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/etl/pipelines.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/etl/testing.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/examples-repo/index.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/getting-started/etl.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/getting-started/streaming.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/guides/autocrud.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/guides/celery.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/guides/etl.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/guides/fake-repo-examples.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/guides/quickstart.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/guides/use-case-dsl.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/index.rst +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/overview.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/ai.rst +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/core.rst +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/etl.rst +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/repository.rst +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/rest.rst +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/streaming.rst +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/testing.rst +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/index.rst +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/requirements.txt +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/autocrud.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/celery.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/examples.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/identity.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/sql.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/testing.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/use-case-dsl.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/streaming/bytewax.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/streaming/delivery.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/streaming/tracing.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/scripts/release/checkout_merged_release.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/sonar-project.properties +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/_filters.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/_transport.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/_usecase.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/_binding.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/_handlers.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/_rpc.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/card.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/events.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/server.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/abc.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/_compiler.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/_plan.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/_symbols.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/phases/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/phases/_capabilities.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/phases/_hook.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/phases/_limits.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/phases/_model_role.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/phases/_output.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/declarative/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/declarative/_envelope.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/declarative/_schema.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/declarative/_v1.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/describe.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/fastapi/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/fastapi/endpoints.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/fastapi/response.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/fastapi/streaming.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/runtime/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/runtime/_health.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/runtime/_hooks.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/runtime/_limits.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/runtime/_mcp.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/validate/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/validate/__main__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/auto.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/bootstrap.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/constants.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/runner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/service.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/async_bridge.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/backend/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/backend/core_model.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/backend/protocol.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/backend/sqlalchemy.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/bootstrap/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/bootstrap/bootstrap.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/bootstrap/kernel.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/abc/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/abc/backend.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/abc/config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/abc/dependency.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/codec.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/decorators.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/dependency.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/gateway.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/keys.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/repository.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/serializer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/command/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/command/adapter.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/command/base.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/command/field.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/command/introspection.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/compiler.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/binder.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/configurable.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/context.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/keys.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/loader.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/model.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/observability.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/resolver.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/contracts/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/contracts/manifest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/di/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/di/container.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/di/scope.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/discovery/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/discovery/_utils.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/discovery/manifest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/compilable.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/compiler.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/events.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/executor.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/metrics.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/plan.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/errors/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/errors/codes.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/errors/errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/expr/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/expr/eval.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/expr/nodes.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/expr/refs.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/identity/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/identity/context.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/identity/identity.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/identity/issuer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/identity/wire.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/introspection/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/introspection/base.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/introspection/describe.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/job/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/job/callback.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/job/context.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/job/handle.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/job/job.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/job/service.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/logger/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/logger/abc.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/logger/config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/logger/registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/logger/structlogger.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/base.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/enums.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/field.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/introspection.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/projection.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/relation.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/struct.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/timestamped.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/types.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/types_postgres.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/event.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/observer/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/observer/noop.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/observer/otel.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/observer/structlog.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/otel_ids.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/protocol.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/runtime.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/span.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/topology.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/plugins/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/plugins/entrypoints.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/projection/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/projection/loaders.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/projection/runtime.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/abc/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/abc/query.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/abc/repo_for.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/abc/repository.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/dynamodb/registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/dynamodb/repository.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/dynamodb/uow.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/mutation.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/registration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/model.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/response/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/response/base.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/routing/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/routing/ref.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/routing/resolver.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/runner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/schema/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/schema/schema_mode.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/abc/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/abc/contracts.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/abc/errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/clickhouse/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/clickhouse/_client.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/clickhouse/executor.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/clickhouse/registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/roles.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/service.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/tracing/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/tracing/context.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/transport/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/transport/adapter.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/uow/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/uow/abc.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/uow/context.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/_predicates.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/compute.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/constants.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/factory.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/field_ref.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/invoker.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/keys.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/markers.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/rule.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/use_case.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_format_registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_historify/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_historify/_common.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_historify/_log.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_historify/_ops.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_historify/_transform.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_merge.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_path_template.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_predicate.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_write_policy.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_dtype.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_file_writer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_historify.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_predicate.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_reader.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_schema.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_streaming.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_writer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/provider.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/_dtype.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/_historify.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/_reader.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/_schema.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/_writer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/provider.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/_cleaners.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/_paths.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/_scope.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/_store.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_binding.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_compiler.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_plan.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_validators.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_validators_plan.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_validators_step.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/_format.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/_read_options.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/_utils.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/_write_options.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/expr/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/expr/_params.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/expr/_predicate.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/expr/_refs.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/source/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/source/_from.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/source/_specs.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_client.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_file.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_history/_report.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_into.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_table.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_temp.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/executor/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/executor/_dispatcher.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/executor/_executor.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/_registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_clickhouse.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_dynamodb.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_mongo.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_serialization.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/targets/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/targets/_clickhouse.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/_observer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/_records.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/sinks/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/sinks/_table.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/sinks/_writer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/_builder.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/_ops.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/_protocol.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/_runner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/_step.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_generics.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_params.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_pipeline.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_process.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_sql.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_step.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_step_client.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_step_sql.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/_providers.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/_wiring.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/config_loader.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/core.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/filtering.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runtime/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runtime/contracts.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/schema/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/schema/_contract.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/schema/_schema.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/storage/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/storage/_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/storage/_file_locator.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/storage/_locator.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/storage/routing.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/testing/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/testing/_result.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/testing/_runners.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/testing/_scenario.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/testing/_stubs.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/testing/spark.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/_async.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/_ctx.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/_meta.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/_placeholders.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/_summary.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/deploy/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/deploy/_discovery.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/deploy/_schedule.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/deploy/_yaml.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_assemble.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_backfill.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_backfill_body.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_body.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_common.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_factory.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_hooks.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_maintenance.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_run_name.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_runtime.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_signature.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_stages.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/manifest/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/manifest/_model.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/manifest/_s3.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/manifest/_store.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/notify/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/notify/_event.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/notify/_factory.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/notify/_port.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/notify/_slack.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/observer/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/observer/_flow.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/observer/_logging_bridge.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/observer/_manifest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/observer/_task_run.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prometheus/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prometheus/adapter.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prometheus/kafka.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prometheus/lifecycle.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prometheus/middleware.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/py.typed +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/_body.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/adapter.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/auth/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/auth/abc.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/auth/config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/auth/jwt.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/auth/middleware.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/autocrud.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/compiler.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/constants.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/cors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/_errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/_exclusions.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/app.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/openapi.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/response.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/router_runtime.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/sql.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/middleware.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/model.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/rest_adapter.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_adapter.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_dlq.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_operators.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/runner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/_bindings.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/_compiler.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/_errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/_plan.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/phases/validate.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/core/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/core/_errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/core/_exceptions.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/core/_message.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/core/_tracing.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/core/_typing.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/graph/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/graph/_flow.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_codec.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_key_resolver.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_message.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_record.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_wire.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/client/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/client/_consumer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/client/_producer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/client/_protocol.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/client/_retry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/message/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/message/_consumer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/message/_producer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/message/_protocol.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/mongo/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/mongo/_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/mongo/_event.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/mongo/_normalize.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_boundary.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_broadcast.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_capabilities.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_decompose.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_expand_routes.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_expr_eval.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_fork.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_helpers.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_mongo.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_protocols.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_router.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_shape.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_sink.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_step.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_table/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_table/common.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_table/config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_with.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/refs.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/testing.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/agents.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/golden.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/http_harness.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/in_memory.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/repository_harness.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/runner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/contract/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/contract/ai/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/contract/ai/test_contract_fake.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/contract/ai/test_contract_pydantic_ai.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/contract/observability/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/contract/observability/test_otel_sdk_contract.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/golden/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/golden/baselines/.gitkeep +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/golden/outputs/.gitkeep +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/golden/plans/.gitkeep +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/helpers/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/helpers/pydantic_ai_engine.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/helpers/spans.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_a2a.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_agent_specs_source.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_auto_a2a.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_auto_client_factories.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_auto_gate.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_capabilities.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_describe.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_endpoints.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_grant_wiring.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_health_probe.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_hooks.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_limits.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_live_provider.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_mcp_end_to_end.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_provider_portability.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_runtime.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_streaming.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_transport.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/celery_bootstrap/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/celery_bootstrap/config/conf.celery.integration.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/celery_bootstrap/test_auto_create_app_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/celery_bootstrap/test_bootstrap_worker.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/bootstrap/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/bootstrap/test_bootstrap_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/repository/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/repository/sqlalchemy/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/repository/sqlalchemy/test_cache_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/repository/sqlalchemy/test_repository_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/rest/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/rest/test_auto_interface_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/rest/test_fastapi_app_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/rest/test_rest_error_mapping.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/rest/test_rest_observability.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/use_case/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/use_case/test_custom_repository_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/use_case/test_use_case_crud_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/etl/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/etl/test_runner_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/config/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/config/conf.interfaces.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/config/conf.manifest.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/config/conf.modules.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/config/conf.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/main.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/manifest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/category/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/category/model.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/category/schemas.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/interface.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/jobs.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/model.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/relations.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/repository.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/repository_contract.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/review/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/review/model.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/review/schemas.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/schemas.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/use_cases.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/sql/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/sql/init/01_users_roles.sql +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/sql/test_clickhouse_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/streaming/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/streaming/kafka/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/streaming/kafka/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/streaming/kafka/test_partitioned_source_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/streaming/kafka/test_source_contract_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/streaming/test_into_table_integration.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/support/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/support/logical_repo_fixtures.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/engines/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/engines/test_a2a_capability.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/engines/test_capability_span_nesting.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/engines/test_pydantic_ai_failures.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/engines/test_pydantic_ai_translation.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/README.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-a2a-agent/agent.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-mcp-agent/agent.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-python-agent/agent.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-skills-agent/agent.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-skills-agent/skills/release-notes/SKILL.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-sql-agent/agent.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-usecase-agent/agent.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/full-agent/agent.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/full-agent/skills/severity-rubric/SKILL.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/minimal-agent/agent.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/output-type-ref-agent/agent.yaml +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/incidents.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/invoices.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/triage.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/unsupported.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/broken.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/geo.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/metrics.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/skills_root/shared/group-changes/SKILL.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/skills_root/shared/tone-of-voice/SKILL.md +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_capabilities.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_hook.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_limits.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_model_role.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_output.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_remote_auth_plan.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_validate_cli.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/runtime/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/runtime/test_hook_command.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_a2a_base_url.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_a2a_card.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_compiler.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_compiler_offline.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_declarative_envelope.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_declarative_hook.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_describe.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_error_catalogue_totality.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_error_factories.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_fake_engine.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_loopback_plaintext.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_no_extras_import.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_public_surface.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_remote_auth_settings.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_run_error_hook.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_schema_emission.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_secret_containment.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_spec_v1_corpus.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_usecase_helpers.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_bootstrap/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_bootstrap/test_async_runtime.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_bootstrap/test_bootstrap.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_jobs/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_jobs/test_auto.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_jobs/test_celery_service.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_jobs/test_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_jobs/test_identity_propagation.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_jobs/test_runner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ci/test_workflow_supply_chain_contract.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/backend/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/backend/test_backend_compiler.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/bootstrap/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/bootstrap/test_bootstrap.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/bootstrap/test_bootstrap_metrics.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/bootstrap/test_kernel.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/cache/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/cache/test_cached_repository.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/cache/test_config_wiring.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/cache/test_gateway_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/command/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/command/test_command_base.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/command/test_command_field.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/command/test_command_patch.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/command/test_introspection.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_binder.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_configurable.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_context.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/di/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/di/test_container.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/discovery/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/discovery/test_manifest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_caller_binding.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_compiler.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_executor.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_executor_trace.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_executor_uow.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_metrics.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_plan.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/errors/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/errors/test_errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/expr/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/expr/test_expr.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/identity/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/identity/test_context.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/identity/test_identity.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/identity/test_wire.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/introspection/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/introspection/test_describe.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/test_callback.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/test_context.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/test_handle.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/test_inline_service.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/test_job.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/logger/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/logger/test_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/logger/test_registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/model/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/model/test_model.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/model/test_struct.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/model/test_timestamped.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_message_id_generator.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_observers.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_optional_otel_sdk.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_otel_loader_branches.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_provider_modes.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_runtime.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_tracing_characterisation.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/plugins/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/plugins/test_entrypoints.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/plugins/test_import_containment.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/projection/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/projection/test_runtime.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/abc/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/abc/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/abc/test_query.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/abc/test_repository_contract.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/dynamodb/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/dynamodb/test_registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/dynamodb/test_repository.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/sqlalchemy/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/sqlalchemy/test_loaders.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/sqlalchemy/test_repository.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/sqlalchemy/test_transactional.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/routing/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/routing/test_routing.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/_fakes.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_clickhouse_executor.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_clickhouse_transport.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_isolation.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_null_service.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_pagination_limits.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_registry_lifecycle.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_role_policy.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/test_async_bridge.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/test_compiler_contracts.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/test_runner_contracts.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/tracing/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/tracing/test_context.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/uow/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/uow/test_executor_uow.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/uow/test_sqlalchemy_uow.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/uow/test_uow_protocols.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_compute.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_factory.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_field_ref.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_invoker.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_markers.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_rule.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_use_case.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/_historify_contract.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_empty_write_warning.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_historify_common.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_path_template.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_apply_schema.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_backend.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_dtype.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_file_writer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_historify_polars.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_predicate_pushdown.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_reader_columns.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_reader_json_columns.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_step_execution.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_streaming_write.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_update_writer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_upsert_writer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_writer_null_schema.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_writer_to_frame.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/test_dtype.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/test_historify_spark.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/test_spark_apply_schema.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/test_step_execution.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/test_writer_to_frame.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_write_policy_historify.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/checkpoint/backends/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/checkpoint/backends/test_checkpoint_polars.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/checkpoint/test_checkpoint_paths.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/checkpoint/test_cleaners.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/checkpoint/test_store.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/client_step/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/client_step/test_client_step.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_catalog_validator.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_compiler.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_compiler_catalog.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_compiler_upsert.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_errors_additional_factories.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_errors_runtime_factories.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_file_template_validator.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_historify_validator.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_param_exprs_validator.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_plan_traversal.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_step_validator.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_structural.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_temp_validator.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_upsert_validator.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_clickhouse_reader.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_dynamodb_predicate.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_dynamodb_reader.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_from_clickhouse.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_from_dynamodb.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_from_mongo.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_mongo_predicate.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_mongo_reader.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_mongo_reader_memory.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/targets/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/targets/test_clickhouse_writer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/targets/test_into_clickhouse.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_history_target.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_source.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_source_json.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_source_options.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_target.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_utils.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_variants.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/lineage/test_observer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/lineage/test_records.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/lineage/test_store.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/backends/test_delta_rs.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/test_builder.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/test_runner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/test_step.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/pipeline/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/pipeline/test_pipeline_process.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/pipeline/test_proxy.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/pipeline/test_step.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/schema/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/schema/test_contract.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/schema/test_schema.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/schema/test_table.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/sql/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/sql/test_merge.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/sql/test_predicate.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/sql/test_predicate_dialect.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/sql/test_sql_runtime.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_backend_factory.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_io_protocols.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_locator.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_observability_and_protocols.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_route_build.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_schema_readers.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_storage_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_config_loader.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_executor.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_executor_tracing.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_format_registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_module_contracts.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_public_api_discovery.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_record_schema_coverage.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_runner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_runner_errors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_spark_testing.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/testing/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/testing/test_runners.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/testing/test_scenario_and_stubs.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/testing/test_spark_helpers.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_backfill_flow.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_ctx.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_etl_flow.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_logging_bridge.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_maintenance_flow.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_manifest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_manifest_s3.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_notify.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_observer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_placeholders.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_task_run_observer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_yaml_loader.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prometheus/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prometheus/test_adapter.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prometheus/test_middleware.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/release/test_checkout_merged_release.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/release/test_release_workflow_contract.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/_fixture_app.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_app_hardening.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_auth_middleware.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_auth_rejection_logging.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_autocrud.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_cors.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_fastapi_auto_logger.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_jwt_issuer.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_jwt_middleware.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_middleware.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_pydantic_adapter.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_request_hardening.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_response.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_rest_adapter.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_rest_compiler.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_rest_model.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_route_rbac.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_router_identity.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_router_runtime.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_sql_endpoint.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_sql_endpoint_auth_gate.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_sql_endpoint_roles.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_sql_serialization.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/cases.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_adapter.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_batch_key.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_bytewax_dispatcher.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_collect_batch.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_dlq.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_error_boundary.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_fanout_accounting.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_operators.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_resource_manager.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_runner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_runtime_io.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_runtime_sink.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_runtime_source.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_sink_registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_steps.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_storage.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_storage_trace_characterisation.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/cases.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_async_walk.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_basics.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_config_bindings.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_delivery.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_error_codes.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_mongo_source.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_multi_source.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_router.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_window.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_with.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/cases.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/test_boundary.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/test_message.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/test_mongo_contracts.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/test_multi_boundary.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/test_steps.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/batch.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/explode.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/fork.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/router.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/shared.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/simple.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/test_compiler_examples.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/test_flow_examples.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/cases.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/fakes.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_client.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_coordinator_retry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_key_resolver.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_message.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_message_client.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_multi_wire.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_observability.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_settings.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_source_decode_parity.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_wire.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/mongo/test_bytewax_source.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/nodes/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/nodes/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/nodes/test_broadcast.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/nodes/test_delta_config.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/nodes/test_logging.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/nodes/test_table_package.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/cases.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/conftest.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_message_lifecycle_spans.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_multiworker_trace_continuity.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_observability_runner.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_outbound_topic_terminal_spans.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_protocols.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_registry.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_structlog.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/support/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/support/flow_cases.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/test_expand_routes.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/test_fork.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/test_otel_observability.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/test_routing.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/test_testing_mongo.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/test_with.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/testing/__init__.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/testing/test_golden.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/testing/test_http_harness.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/testing/test_identity_harness.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/testing/test_in_memory.py +0 -0
- {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/testing/test_runner.py +0 -0
|
@@ -1,3 +1,63 @@
|
|
|
1
|
+
# 🚀 Release 1.9.2 ([#157](https://github.com/the-reacher-data/loom-py/pull/157)) ([`3b32161`](https://github.com/the-reacher-data/loom-py/commit/3b32161dfcfe12fe25fe05ff7ccb4d6a71a6b64a))
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
## 🐛 Fixes
|
|
6
|
+
### ai
|
|
7
|
+
- **ai:** make outbound auth work for MCP and let a grant boot offline
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# 🚀 Release 1.9.1 ([#155](https://github.com/the-reacher-data/loom-py/pull/155)) ([`587affc`](https://github.com/the-reacher-data/loom-py/commit/587affcfbf46301ccd3e02a5edeb34e63b460628))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
## ✨ Features
|
|
20
|
+
### rest
|
|
21
|
+
- **rest:** let an application whose only content is agents boot<br>
|
|
22
|
+
> Reported from downstream: an app whose manifest declares only AGENTS failed
|
|
23
|
+
> six times in a row on `create_app`, each message naming a symptom rather than
|
|
24
|
+
> the cause ("no module named 'sqlalchemy'", "No UseCase classes discovered.",
|
|
25
|
+
> "the greenlet library is required...").
|
|
26
|
+
> `persistence.backend: none`: no unit of work, no repositories, no model
|
|
27
|
+
> compilation, `database:` ignored. `sqlalchemy` stays the default and its
|
|
28
|
+
> no-models error now names the way out.
|
|
29
|
+
> `create_app` imports the SQLAlchemy backend lazily, inside the wiring that
|
|
30
|
+
> needs it, so the `sqlalchemy` extra is no longer required to import it.
|
|
31
|
+
> One discovery guard instead of three: an app fails only when it has no use
|
|
32
|
+
> case, no interface and no agent, and every discovery error now names
|
|
33
|
+
> `app.discovery.mode: manifest` and `AGENTS`.
|
|
34
|
+
> `ai.models.<role>.output_mode: tool | native` pins the structured-output
|
|
35
|
+
> mode a deployment needs; absent keeps the engine's own resolution.
|
|
36
|
+
> The AWS resolvers log and report the key as written, never the `%VAR%`
|
|
37
|
+
> expanded path, and split dot-notation before expanding so an environment
|
|
38
|
+
> value can never introduce a JSON separator or reach an error message.
|
|
39
|
+
> Fetch errors carry the AWS error code instead of the client's message.
|
|
40
|
+
> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
|
41
|
+
> Claude-Session: https://claude.ai/code/session_016xY1skW5S2PU9Fc3M7tfAW
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
## ✅ Tests
|
|
51
|
+
### quality
|
|
52
|
+
- **quality:** clear the SonarCloud findings of the agents-only slice<br>
|
|
53
|
+
> The quality gate failed on one reliability issue: the subprocess helper
|
|
54
|
+
> asserted inside a `try` whose `except Exception` also catches
|
|
55
|
+
> `AssertionError`, so a failed check reported itself as a caught error
|
|
56
|
+
> (S5779). It raises `RuntimeError` now, and the block check does too.
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
1
61
|
# 🚀 Release 1.9.0 ([#154](https://github.com/the-reacher-data/loom-py/pull/154)) ([`22d9a89`](https://github.com/the-reacher-data/loom-py/commit/22d9a894c766d2414ee6607e990b6473dd5ebfe3))
|
|
2
62
|
|
|
3
63
|
|
|
@@ -88,11 +88,16 @@ session. An agent that authenticates its card endpoint would otherwise fail
|
|
|
88
88
|
start-up before a skill was ever called.
|
|
89
89
|
|
|
90
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
|
-
[`
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
91
|
+
MCP servers resolve against: the strategy contract is the HTTP client's own
|
|
92
|
+
[`Auth`](https://www.python-httpx.org/advanced/authentication/), which knows
|
|
93
|
+
nothing of either protocol, so a deployment registers its strategy once and
|
|
94
|
+
grants it to either transport. The A2A client is loom's own, built with `httpx`,
|
|
95
|
+
while an MCP server is reached through a client using `httpx2` — a strategy
|
|
96
|
+
registered as a class is refused by the other flavour, and a strategy returning
|
|
97
|
+
a plain callable serves both: see
|
|
98
|
+
[mcp.md § Two HTTP libraries, one callable](mcp.md#two-http-libraries-one-callable).
|
|
99
|
+
|
|
100
|
+
The one strategy an A2A agent cannot use is `kind: oauth`, which delegates to the MCP client library's own flow; naming it
|
|
96
101
|
here is refused with `MCP_AUTH_STRATEGY_INVALID` rather than connecting without
|
|
97
102
|
the credential the deployment asked for.
|
|
98
103
|
|
|
@@ -106,6 +106,58 @@ rejected fail-closed.
|
|
|
106
106
|
Tool filters are matched against the tools the server really advertises, not
|
|
107
107
|
against what the artifact hoped for.
|
|
108
108
|
|
|
109
|
+
### Booting without the network: `ai.remote_clients`
|
|
110
|
+
|
|
111
|
+
Granting `kind: mcp` makes every server the grant names a start-up dependency.
|
|
112
|
+
That is right in production and awkward everywhere else — a laptop, a CI job, an
|
|
113
|
+
environment brought up before its side-cars. `ai.remote_clients` says how a
|
|
114
|
+
client that will not open is treated:
|
|
115
|
+
|
|
116
|
+
```yaml
|
|
117
|
+
ai:
|
|
118
|
+
remote_clients: optional # required (default) | optional
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
| Value | A client that fails to *connect* |
|
|
122
|
+
|---|---|
|
|
123
|
+
| `required` (default) | Aborts start-up, by name, with `MCP_SERVER_UNREACHABLE` — or `A2A_AGENT_UNREACHABLE` for a remote agent. |
|
|
124
|
+
| `optional` | Logged at WARNING and dropped; the runtime starts without it. |
|
|
125
|
+
|
|
126
|
+
The switch is process-wide and covers the remote agents of `ai.a2a_agents` as
|
|
127
|
+
well as the servers of `ai.mcp_servers`. An unknown value fails configuration
|
|
128
|
+
load with `REMOTE_CLIENTS_UNKNOWN`, naming the key and both accepted values.
|
|
129
|
+
|
|
130
|
+
Under `optional`, the WARNING carries the error code and the registered name
|
|
131
|
+
only: the transport's own reason is an arbitrary library's exception text and
|
|
132
|
+
can name a URL, so it goes to DEBUG, where an operator asks for it deliberately,
|
|
133
|
+
rather than into routine logs on every boot. The health probe reports the
|
|
134
|
+
dependency `unavailable` once its first pass has run.
|
|
135
|
+
|
|
136
|
+
`optional` tolerates a network that is not there. It tolerates nothing else, and
|
|
137
|
+
three carve-outs are deliberate:
|
|
138
|
+
|
|
139
|
+
**A missing client factory is still fatal.** A plan declaring an `mcp` grant in a
|
|
140
|
+
deployment that wired no MCP client factory is a wiring bug, not an offline
|
|
141
|
+
network. It is collected apart, where the factory is found missing, never told
|
|
142
|
+
from a connection failure by reading its message, and aborts start-up under
|
|
143
|
+
**both** values.
|
|
144
|
+
|
|
145
|
+
**Tool-filter verification still fails closed for a server that did open.** The
|
|
146
|
+
waiver covers only servers that never connected: a server with no session is
|
|
147
|
+
skipped, and a filter on it does not fail start-up. A server that opened has its
|
|
148
|
+
declared filters verified as usual, and a listing that times out still aborts
|
|
149
|
+
start-up under `optional`. Because a tolerated connection failure has already
|
|
150
|
+
spent the shared start-up budget, the verification pass is given a fresh
|
|
151
|
+
`startup_timeout_ms` rather than the exhausted one — otherwise one hanging
|
|
152
|
+
server would fail the filters of every server that answered.
|
|
153
|
+
|
|
154
|
+
**Nothing becomes lazy.** A start-up client that never opened is not reconnected
|
|
155
|
+
later; the clients are session-affine and closing one from a foreign task is
|
|
156
|
+
refused, so reconnecting them needs a supervisor task that does not exist yet.
|
|
157
|
+
This says nothing about the run path, which builds its own toolset and connects
|
|
158
|
+
on its own: under `optional`, a run against a server that never opened at
|
|
159
|
+
start-up connects then and there, and succeeds if the network came back.
|
|
160
|
+
|
|
109
161
|
## Authentication
|
|
110
162
|
|
|
111
163
|
The MCP specification standardises OAuth 2.0 for HTTP transports, so an
|
|
@@ -187,12 +239,62 @@ loom writes the header.
|
|
|
187
239
|
set credentials on one connection is ambiguous, and compilation refuses it with
|
|
188
240
|
`MCP_AUTH_CONFLICT`.
|
|
189
241
|
|
|
242
|
+
### Two HTTP libraries, one callable
|
|
243
|
+
|
|
244
|
+
A strategy is handed to an HTTP client, and the two outbound transports do not
|
|
245
|
+
use the same one.
|
|
246
|
+
|
|
247
|
+
An `mcp` grant becomes a pydantic-ai `MCPToolset`, which connects through one of
|
|
248
|
+
fastmcp's HTTP transports — `StreamableHttpTransport`, or `SSETransport` when the
|
|
249
|
+
URL ends in `/sse`. Those transports special-case OAuth and pass any other auth
|
|
250
|
+
object straight through to their client, and their client is **`httpx2`**. An
|
|
251
|
+
`a2a` grant goes to a client loom builds itself, with **`httpx`**.
|
|
252
|
+
|
|
253
|
+
Each library accepts an auth object only when it is an instance of *its own*
|
|
254
|
+
`Auth` class, a two-tuple, or a callable. So an `httpx.Auth` subclass is refused
|
|
255
|
+
by the MCP transport's client, and an `httpx2.Auth` subclass by the A2A one.
|
|
256
|
+
**Loom adapts neither**, and publishes no recipe for a class that satisfies both
|
|
257
|
+
at once: nothing in its test suite would keep such a recipe honest.
|
|
258
|
+
|
|
259
|
+
| Grant | Client library | A class must subclass |
|
|
260
|
+
|---|---|---|
|
|
261
|
+
| `kind: mcp` | `httpx2`, reached through fastmcp's transport | `httpx2.Auth` |
|
|
262
|
+
| `kind: a2a` | `httpx`, in the client loom builds | `httpx.Auth` |
|
|
263
|
+
|
|
264
|
+
**A plain callable is the supported answer for both.** Each library wraps a
|
|
265
|
+
callable in a `FunctionAuth` of its own, so one function serves either transport
|
|
266
|
+
— and whatever flavour either library moves to next. It takes the outgoing
|
|
267
|
+
request, sets its headers, and **returns** it:
|
|
268
|
+
|
|
269
|
+
```python
|
|
270
|
+
def incident_api_key(*, key_ref: str):
|
|
271
|
+
"""Register this as a strategy: it returns the callable both clients wrap."""
|
|
272
|
+
|
|
273
|
+
def add_key(request):
|
|
274
|
+
request.headers["X-API-Key"] = key_ref
|
|
275
|
+
return request
|
|
276
|
+
|
|
277
|
+
return add_key
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Returning the request is not optional: the wrapper's flow is
|
|
281
|
+
`yield self._func(request)`, so a callable returning `None` sends `None`.
|
|
282
|
+
Nothing in the inner signature names a library, which is exactly the point — the
|
|
283
|
+
request it receives is of whichever flavour drove it. The two strategies loom
|
|
284
|
+
ships, `bearer` and `static`, are this shape.
|
|
285
|
+
|
|
286
|
+
A callable is a single-shot flow: it never sees the response, so it cannot
|
|
287
|
+
inspect a `401` or renew. A strategy that needs the response is a class.
|
|
288
|
+
|
|
190
289
|
### Writing your own
|
|
191
290
|
|
|
192
|
-
The contract is
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
291
|
+
The contract is the HTTP client's own
|
|
292
|
+
[`Auth`](https://www.python-httpx.org/advanced/authentication/), not an
|
|
293
|
+
abstraction of loom's — nobody has to learn one of ours, and an existing `Auth`
|
|
294
|
+
class works with no adapter, provided it is the flavour of the transport that
|
|
295
|
+
will use it (above). This example authenticates an MCP server, so it subclasses
|
|
296
|
+
`httpx2.Auth`; the identical class written for an A2A agent subclasses
|
|
297
|
+
`httpx.Auth`. Register it from **your own package**; loom does not change:
|
|
196
298
|
|
|
197
299
|
```toml
|
|
198
300
|
# pyproject.toml of your own distribution
|
|
@@ -204,10 +306,10 @@ A worked example — a server exposing a session endpoint, where the agent
|
|
|
204
306
|
presents a long-lived bootstrap secret and receives short-lived tokens:
|
|
205
307
|
|
|
206
308
|
```python
|
|
207
|
-
import
|
|
309
|
+
import httpx2 # the flavour the MCP transport's client uses
|
|
208
310
|
|
|
209
311
|
|
|
210
|
-
class AgentSessionAuth(
|
|
312
|
+
class AgentSessionAuth(httpx2.Auth):
|
|
211
313
|
"""Exchange a bootstrap secret for a token, renewed when rejected."""
|
|
212
314
|
|
|
213
315
|
def __init__(self, *, session_url: str, bootstrap_ref: str) -> None:
|
|
@@ -226,14 +328,22 @@ class AgentSessionAuth(httpx.Auth):
|
|
|
226
328
|
yield request
|
|
227
329
|
|
|
228
330
|
def _mint(self):
|
|
229
|
-
response = yield
|
|
331
|
+
response = yield httpx2.Request(
|
|
230
332
|
"POST", self._url, json={"secret_path": self._ref}
|
|
231
333
|
)
|
|
232
334
|
return response.json()["access_token"]
|
|
233
335
|
```
|
|
234
336
|
|
|
235
|
-
Retry-with-a-refreshed-credential is
|
|
236
|
-
not reimplement it.
|
|
337
|
+
Retry-with-a-refreshed-credential is the library's standard generator shape;
|
|
338
|
+
loom does not reimplement it.
|
|
339
|
+
|
|
340
|
+
```{warning}
|
|
341
|
+
`requires_response_body` is honoured by `Auth`'s **own** base flow, not by the
|
|
342
|
+
client. A strategy that overrides `async_auth_flow` — which any asynchronous
|
|
343
|
+
token exchange must — replaces the very code that reads the flag, and has to
|
|
344
|
+
`await response.aread()` itself before touching the body. Setting the attribute
|
|
345
|
+
and overriding the flow leaves the body unread, silently.
|
|
346
|
+
```
|
|
237
347
|
|
|
238
348
|
If you are designing such an endpoint: this is OAuth 2.0 `client_credentials`
|
|
239
349
|
by another name — `secret_path` is the client id and the bootstrap secret is the
|
|
@@ -256,11 +366,12 @@ server's read permissions to that prefix and log failed attempts per path.
|
|
|
256
366
|
|
|
257
367
|
The group is `loom.ai.remote_auth`, not `loom.ai.mcp_auth`: one registry serves
|
|
258
368
|
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
|
|
260
|
-
protocol. A strategy is registered once and granted
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
369
|
+
(see [a2a.md](a2a.md)), because the contract is the HTTP client's and knows
|
|
370
|
+
neither protocol. A strategy returning a callable is registered once and granted
|
|
371
|
+
to either; one registered as a class is granted to the transports of its own
|
|
372
|
+
flavour. The one exception is `kind: oauth`, which delegates to the MCP client
|
|
373
|
+
library's own flow: an A2A agent naming it is refused with
|
|
374
|
+
`MCP_AUTH_STRATEGY_INVALID` rather than connected without a credential.
|
|
264
375
|
|
|
265
376
|
### One instance per server
|
|
266
377
|
|
|
@@ -270,6 +381,22 @@ renewing strategy holds the live token, so sharing means one renewal instead of
|
|
|
270
381
|
one per agent, and no burst of simultaneous logins when several agents start
|
|
271
382
|
together.
|
|
272
383
|
|
|
384
|
+
What is shared is what the strategy returned. A class instance is shared as
|
|
385
|
+
itself, so a strategy that must renew once, for everybody, stays a class and
|
|
386
|
+
keeps that identity. A callable is shared as itself too, but each client wraps
|
|
387
|
+
it in a `FunctionAuth` of its own, so two clients built from one credential no
|
|
388
|
+
longer hold the same `client.auth` object — they hold two wrappers around one
|
|
389
|
+
function. For a fixed header that is a distinction without a difference, and it
|
|
390
|
+
is the reason a stateful strategy is a class.
|
|
391
|
+
|
|
392
|
+
```{admonition} Public contract
|
|
393
|
+
:class: note
|
|
394
|
+
`shared_mcp_auth` and `shared_a2a_auth` are exported, and their return type has
|
|
395
|
+
widened from `httpx.Auth | str` to what a client accepts, which now includes a
|
|
396
|
+
callable. Code doing `isinstance(value, httpx.Auth)` on the result stops
|
|
397
|
+
matching for the built-in `bearer` and `static` strategies.
|
|
398
|
+
```
|
|
399
|
+
|
|
273
400
|
## The rule: your own tools are a `usecase` grant
|
|
274
401
|
|
|
275
402
|
Here is the decision that actually comes up, and the one this page exists for.
|
|
@@ -96,6 +96,74 @@ Every agent matched by `specs` is compiled. Only the agents named in
|
|
|
96
96
|
agent absent from `endpoints` exists in the process and is reachable by nobody.
|
|
97
97
|
Exposure is always an explicit opt-in, never a default.
|
|
98
98
|
|
|
99
|
+
## An application that is only agents
|
|
100
|
+
|
|
101
|
+
An application does not need a model, a use case or a REST interface to run an
|
|
102
|
+
agent. Its manifest module declares `AGENTS` and nothing else, discovery runs in
|
|
103
|
+
`manifest` mode, and persistence is switched off:
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
# myapp/manifest.py
|
|
107
|
+
AGENTS = ["agents/*.yaml"] # globs resolve against app.code_path
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```yaml
|
|
111
|
+
# config/api.yaml
|
|
112
|
+
app:
|
|
113
|
+
name: incident-triage
|
|
114
|
+
discovery:
|
|
115
|
+
mode: manifest
|
|
116
|
+
manifest:
|
|
117
|
+
module: myapp.manifest
|
|
118
|
+
|
|
119
|
+
persistence:
|
|
120
|
+
backend: none
|
|
121
|
+
|
|
122
|
+
ai:
|
|
123
|
+
engine: pydantic-ai
|
|
124
|
+
models:
|
|
125
|
+
default:
|
|
126
|
+
provider: bedrock
|
|
127
|
+
model: <model id>
|
|
128
|
+
region: eu-west-1
|
|
129
|
+
output_mode: native # optional, see Model providers
|
|
130
|
+
endpoints:
|
|
131
|
+
incident-triage:
|
|
132
|
+
enabled: true
|
|
133
|
+
auth: jwt
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
pip install "loom-kernel[rest,ai-pydantic,ai-bedrock]" # swap the provider extra for yours
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
The `sqlalchemy` extra is not needed: `create_app` imports the SQLAlchemy backend
|
|
141
|
+
only inside the `sqlalchemy` wiring, so an agents-only process never loads it.
|
|
142
|
+
(`loom.celery` still imports it at module level; this recipe is about the REST
|
|
143
|
+
application, not every loom module.)
|
|
144
|
+
|
|
145
|
+
What `persistence.backend: none` means:
|
|
146
|
+
|
|
147
|
+
- No unit of work and no repositories. A granted `usecase` capability still
|
|
148
|
+
runs through the kernel executor, just without a transaction around it.
|
|
149
|
+
- Discovered models are accepted but **not compiled**, and they get no
|
|
150
|
+
repository. Declaring them under `none` is harmless and pointless.
|
|
151
|
+
- A `database:` section is ignored, silently.
|
|
152
|
+
- Deferred job dispatch does not fire. `JobService.dispatch` queues the call to
|
|
153
|
+
run after the unit of work commits, and with no unit of work nothing flushes
|
|
154
|
+
the queue, so a job dispatched from a use case is dropped without an error.
|
|
155
|
+
An agents-only application that needs background jobs keeps a real backend.
|
|
156
|
+
|
|
157
|
+
Only `manifest` discovery can describe this application: the `interfaces` and
|
|
158
|
+
`modules` engines require at least one module path, and their errors — like the
|
|
159
|
+
`RuntimeError` raised when discovery finds no use case, no interface and no
|
|
160
|
+
agent — say so by naming `app.discovery.mode: manifest` and `AGENTS`.
|
|
161
|
+
|
|
162
|
+
`persistence.backend` still defaults to `sqlalchemy`; loom never infers `none`
|
|
163
|
+
from the absence of models or of a `database:` section. Leaving the default
|
|
164
|
+
in place with no models fails start-up with a message that names
|
|
165
|
+
`persistence.backend: none` as the way out.
|
|
166
|
+
|
|
99
167
|
## Where to go next
|
|
100
168
|
|
|
101
169
|
- **[Artifact reference](artifacts.md)** — the complete `spec_version: 1`
|
|
@@ -118,7 +118,7 @@ redacts itself:
|
|
|
118
118
|
|
|
119
119
|
```pycon
|
|
120
120
|
>>> print(target)
|
|
121
|
-
InferenceTarget(provider='bedrock', model='anthropic.claude-sonnet-4-...', region='eu-west-1', endpoint=None, credentials_ref=<redacted>, options=<redacted>)
|
|
121
|
+
InferenceTarget(provider='bedrock', model='anthropic.claude-sonnet-4-...', region='eu-west-1', endpoint=None, output_mode=None, credentials_ref=<redacted>, options=<redacted>)
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
and **refuses** to be serialised at all when it carries a secret reference —
|
|
@@ -148,6 +148,44 @@ ai:
|
|
|
148
148
|
`options` is confined to the deployment configuration and, like
|
|
149
149
|
`credentials_ref`, never reaches the artifact and never survives serialisation.
|
|
150
150
|
|
|
151
|
+
## Pinning the structured-output mode
|
|
152
|
+
|
|
153
|
+
Every agent answers with a structured object, and the engine has more than one
|
|
154
|
+
way of asking a model for it. Left alone, the engine picks the mode per
|
|
155
|
+
provider and model. When that choice is wrong for a particular model — it
|
|
156
|
+
accepts tool calls but not a native JSON-schema response, or the reverse — the
|
|
157
|
+
binding pins it with `output_mode`:
|
|
158
|
+
|
|
159
|
+
| `output_mode` | The engine asks for the answer as | When to set it |
|
|
160
|
+
|---|---|---|
|
|
161
|
+
| *absent* | whatever the engine resolves for that provider and model | the default; leave it unless a run fails at the provider |
|
|
162
|
+
| `tool` | a tool call whose arguments carry the object | the model supports tool calling and rejects the native mode |
|
|
163
|
+
| `native` | the provider's own structured-output response | the model supports structured output and misbehaves with the tool mode |
|
|
164
|
+
|
|
165
|
+
```yaml
|
|
166
|
+
ai:
|
|
167
|
+
models:
|
|
168
|
+
reasoning:
|
|
169
|
+
provider: bedrock
|
|
170
|
+
model: <model id>
|
|
171
|
+
region: eu-west-1
|
|
172
|
+
output_mode: tool
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
The mode is per binding and per deployment: the artifact never sees it, and
|
|
176
|
+
loom does not infer it per provider. Two consequences follow from that:
|
|
177
|
+
|
|
178
|
+
- An unknown value fails **start-up** with `OUTPUT_MODE_UNKNOWN`, naming the
|
|
179
|
+
role and the two values loom offers. `prompted` is deliberately not one of
|
|
180
|
+
them: the engine strips markdown fences before validating a prompted answer,
|
|
181
|
+
while loom decodes the raw text part, so a fenced answer would pass the
|
|
182
|
+
engine and fail loom.
|
|
183
|
+
- A mode the model rejects at **request time** is a provider refusal, and it
|
|
184
|
+
surfaces as `PROVIDER_UNAVAILABLE`. The provider's detail stays server-side,
|
|
185
|
+
in the logs; the caller sees the code. Loom cannot check a mode against a
|
|
186
|
+
model before the first request, so a wrong pin is found there, not at
|
|
187
|
+
start-up.
|
|
188
|
+
|
|
151
189
|
## What does not happen
|
|
152
190
|
|
|
153
191
|
**No fallback routing.** An exhausted or failing provider fails the run. It is
|
|
@@ -372,6 +372,26 @@ discovery:
|
|
|
372
372
|
module: app.manifest
|
|
373
373
|
```
|
|
374
374
|
|
|
375
|
+
### Choose the persistence backend
|
|
376
|
+
|
|
377
|
+
`database:` is read by the default backend. `persistence.backend` selects it:
|
|
378
|
+
|
|
379
|
+
| `persistence.backend` | Reads | What the app gets |
|
|
380
|
+
|---|---|---|
|
|
381
|
+
| `sqlalchemy` (default) | `database:` | unit of work, repositories and compiled tables for every discovered model; requires at least one model and the `sqlalchemy` extra |
|
|
382
|
+
| `dynamodb` | `persistence.dynamodb:` | the DynamoDB repositories, no relational tables |
|
|
383
|
+
| `none` | nothing | no unit of work, no repositories; discovered models are accepted but not compiled, a `database:` section is ignored, and deferred job dispatch never fires |
|
|
384
|
+
|
|
385
|
+
```yaml
|
|
386
|
+
persistence:
|
|
387
|
+
backend: none
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
`none` is for an application whose only content is agents (see
|
|
391
|
+
[An application that is only agents](../ai/overview.md#an-application-that-is-only-agents)).
|
|
392
|
+
It is never inferred: with the default backend and no discovered models,
|
|
393
|
+
start-up fails with a message that names `persistence.backend: none`.
|
|
394
|
+
|
|
375
395
|
---
|
|
376
396
|
|
|
377
397
|
## Rules + Computes (advanced)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "loom-kernel"
|
|
3
|
-
version = "1.9.
|
|
3
|
+
version = "1.9.2"
|
|
4
4
|
description = "Loom Python project"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -362,7 +362,7 @@ markers = [
|
|
|
362
362
|
|
|
363
363
|
[tool.commitizen]
|
|
364
364
|
name = "cz_conventional_commits"
|
|
365
|
-
version = "1.9.
|
|
365
|
+
version = "1.9.2"
|
|
366
366
|
tag_format = "v$version"
|
|
367
367
|
version_files = [
|
|
368
368
|
"pyproject.toml:project.version",
|
|
@@ -31,9 +31,11 @@ from loom.ai.errors import (
|
|
|
31
31
|
mcp_auth_strategy_unknown,
|
|
32
32
|
mcp_credentials_inline,
|
|
33
33
|
mcp_url_invalid,
|
|
34
|
+
output_mode_unknown,
|
|
34
35
|
policy_out_of_range,
|
|
36
|
+
remote_clients_unknown,
|
|
35
37
|
)
|
|
36
|
-
from loom.ai.inference import InferenceTarget
|
|
38
|
+
from loom.ai.inference import OUTPUT_MODES, InferenceTarget
|
|
37
39
|
from loom.ai.remote_auth import is_strategy_registered, registered_strategy_names
|
|
38
40
|
from loom.core.model import LoomFrozenStruct
|
|
39
41
|
|
|
@@ -54,6 +56,11 @@ _URL_USERINFO_RE = re.compile(r"://[^/]*@")
|
|
|
54
56
|
# key is that strategy's own setting.
|
|
55
57
|
_AUTH_KIND_KEY = "kind"
|
|
56
58
|
|
|
59
|
+
# Accepted values of ``ai.remote_clients``: whether a remote client that will
|
|
60
|
+
# not open aborts start-up (``required``) or is dropped with a warning
|
|
61
|
+
# (``optional``).
|
|
62
|
+
_REMOTE_CLIENTS_MODES: tuple[str, ...] = ("required", "optional")
|
|
63
|
+
|
|
57
64
|
# Bounds of a single remote call, mirroring ``policies.tool_timeout_ms``.
|
|
58
65
|
_TIMEOUT_MS_MIN = 1
|
|
59
66
|
_TIMEOUT_MS_MAX = 600000
|
|
@@ -168,6 +175,8 @@ def _validate_model_binding(role: str, target: InferenceTarget) -> list[AgentCom
|
|
|
168
175
|
for setting in required:
|
|
169
176
|
if not getattr(target, setting):
|
|
170
177
|
issues.append(inference_target_incomplete(role, setting))
|
|
178
|
+
if target.output_mode is not None and target.output_mode not in OUTPUT_MODES:
|
|
179
|
+
issues.append(output_mode_unknown(role, target.output_mode, OUTPUT_MODES))
|
|
171
180
|
ref = target.credentials_ref
|
|
172
181
|
if ref is not None and not _is_credentials_reference(ref):
|
|
173
182
|
# The rejected value is deliberately absent from the issue: the error
|
|
@@ -296,6 +305,15 @@ class AiConfig(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
296
305
|
startup_timeout_ms: Total budget of start-up: opening every live
|
|
297
306
|
client concurrently and validating the declared tool filters
|
|
298
307
|
share one deadline, whatever the number of servers.
|
|
308
|
+
remote_clients: Start-up tolerance for the MCP servers and A2A agents
|
|
309
|
+
the deployment connects to, ``required`` (the default) or
|
|
310
|
+
``optional``. Under ``optional`` a client that fails to *connect*
|
|
311
|
+
is logged and dropped instead of aborting start-up, so an
|
|
312
|
+
application can boot with no network. It tolerates nothing else:
|
|
313
|
+
a missing client factory is a wiring bug and stays fatal, a server
|
|
314
|
+
that did open and whose tool listing times out still fails
|
|
315
|
+
start-up, and no client becomes lazy — one that never opened is
|
|
316
|
+
not reconnected later.
|
|
299
317
|
max_concurrent_runs: Per-worker run limit (FR-033a).
|
|
300
318
|
max_prompt_bytes: Enforced while reading the request body.
|
|
301
319
|
health_cache_ttl_ms: Refresh period of the health probe.
|
|
@@ -304,8 +322,8 @@ class AiConfig(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
304
322
|
AgentCompilationError: Aggregating one issue per invalid model binding
|
|
305
323
|
(incomplete provider settings, literal secret in
|
|
306
324
|
``credentials_ref``), per unsafe remote server or agent (bad URL,
|
|
307
|
-
inline credentials, out-of-range timeout)
|
|
308
|
-
a named ``auth
|
|
325
|
+
inline credentials, out-of-range timeout), per endpoint without
|
|
326
|
+
a named ``auth``, and for an unknown ``remote_clients`` mode.
|
|
309
327
|
"""
|
|
310
328
|
|
|
311
329
|
engine: str
|
|
@@ -317,6 +335,7 @@ class AiConfig(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
317
335
|
a2a: A2AConfig | None = None
|
|
318
336
|
endpoints: dict[str, AgentEndpointConfig] = field(default_factory=dict)
|
|
319
337
|
startup_timeout_ms: int = 10000
|
|
338
|
+
remote_clients: str = "required"
|
|
320
339
|
max_concurrent_runs: int = 8
|
|
321
340
|
max_prompt_bytes: int = 65536
|
|
322
341
|
health_cache_ttl_ms: int = 5000
|
|
@@ -330,6 +349,8 @@ class AiConfig(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
330
349
|
for name, endpoint in self.endpoints.items():
|
|
331
350
|
if not endpoint.auth.strip():
|
|
332
351
|
issues.append(endpoint_auth_missing(name))
|
|
352
|
+
if self.remote_clients not in _REMOTE_CLIENTS_MODES:
|
|
353
|
+
issues.append(remote_clients_unknown(self.remote_clients, _REMOTE_CLIENTS_MODES))
|
|
333
354
|
if issues:
|
|
334
355
|
raise AgentCompilationError(issues)
|
|
335
356
|
|
|
@@ -26,7 +26,7 @@ from __future__ import annotations
|
|
|
26
26
|
|
|
27
27
|
from collections.abc import AsyncIterator, Mapping
|
|
28
28
|
from contextlib import asynccontextmanager
|
|
29
|
-
from typing import TYPE_CHECKING, Any
|
|
29
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
30
30
|
|
|
31
31
|
from loom.ai.compiler import CompiledMcpCapability
|
|
32
32
|
from loom.ai.errors import AgentCompilationError, provider_not_installed
|
|
@@ -101,7 +101,12 @@ def build_mcp_toolset(capability: CompiledMcpCapability) -> MCPToolset[Any]:
|
|
|
101
101
|
component = f"mcp server '{capability.server}'"
|
|
102
102
|
headers = headers_from_ref(component, capability.headers_ref) or None
|
|
103
103
|
auth = shared_mcp_auth(capability.server, capability.auth)
|
|
104
|
-
|
|
104
|
+
# ``MCPToolset`` annotates auth as ``httpx.Auth | Literal['oauth'] | str | None``,
|
|
105
|
+
# which admits no callable, while what really consumes it is fastmcp's HTTP
|
|
106
|
+
# transport: its ``_set_auth`` special-cases only ``"oauth"``, ``OAuth``, the
|
|
107
|
+
# OAuth providers and ``str``, and hands anything else to its ``httpx2`` client
|
|
108
|
+
# untouched — including the callable loom's own strategies return.
|
|
109
|
+
toolset: MCPToolset[Any] = MCPToolset(capability.url, headers=headers, auth=cast("Any", auth))
|
|
105
110
|
return toolset
|
|
106
111
|
|
|
107
112
|
|
|
@@ -29,15 +29,21 @@ What is deliberately **not** projected:
|
|
|
29
29
|
replays a failed *tool* call inside one run, loom's replays a failed
|
|
30
30
|
*provider* call across runs. They share one artifact field on purpose — a
|
|
31
31
|
single operator-facing knob — but neither enforcement subsumes the other.
|
|
32
|
+
|
|
33
|
+
``output_mode`` (``ai.models.<role>``) is projected next to the spec rather than
|
|
34
|
+
inside it: ``AgentSpec.output_schema`` has no mode field, so the mode travels as
|
|
35
|
+
``Agent.from_spec(output_type=...)`` via :func:`build_output_type`. Absent, the
|
|
36
|
+
engine keeps resolving the mode itself from ``output_schema``.
|
|
32
37
|
"""
|
|
33
38
|
|
|
34
39
|
from __future__ import annotations
|
|
35
40
|
|
|
36
|
-
from typing import Any
|
|
41
|
+
from typing import Any, assert_never, cast
|
|
37
42
|
|
|
38
|
-
from pydantic_ai import AgentSpec
|
|
43
|
+
from pydantic_ai import AgentSpec, NativeOutput, StructuredDict, ToolOutput
|
|
39
44
|
|
|
40
45
|
from loom.ai.compiler import AgentPlan
|
|
46
|
+
from loom.ai.inference import OutputMode
|
|
41
47
|
|
|
42
48
|
|
|
43
49
|
def build_agent_spec(plan: AgentPlan) -> AgentSpec:
|
|
@@ -45,7 +51,9 @@ def build_agent_spec(plan: AgentPlan) -> AgentSpec:
|
|
|
45
51
|
|
|
46
52
|
``output_schema`` instructs the model on the shape to produce; it does not
|
|
47
53
|
validate the answer (research R-004), which is why the plan's decoder owns
|
|
48
|
-
validation at the boundary (see ``_output``).
|
|
54
|
+
validation at the boundary (see ``_output``). How the engine asks for that
|
|
55
|
+
shape (tool call or native structured output) is not part of the spec;
|
|
56
|
+
:func:`build_output_type` overrides it when the binding pins a mode.
|
|
49
57
|
|
|
50
58
|
Args:
|
|
51
59
|
plan: Compiled agent plan.
|
|
@@ -61,3 +69,44 @@ def build_agent_spec(plan: AgentPlan) -> AgentSpec:
|
|
|
61
69
|
output_schema=schema,
|
|
62
70
|
retries=plan.policies.retries,
|
|
63
71
|
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def build_output_type(plan: AgentPlan) -> ToolOutput[Any] | NativeOutput[Any] | None:
|
|
75
|
+
"""Pin the engine's output mode when the model binding declares one.
|
|
76
|
+
|
|
77
|
+
Wraps the plan's output schema in the engine's own marker, with no name
|
|
78
|
+
or description, so the engine builds the same ``StructuredDict`` it would
|
|
79
|
+
build from ``output_schema`` alone but with the mode fixed instead of
|
|
80
|
+
resolved per provider. The value has already been validated against
|
|
81
|
+
:data:`~loom.ai.inference.OUTPUT_MODES` when the config loaded.
|
|
82
|
+
|
|
83
|
+
The dispatch is exhaustive rather than defaulted: an unhandled mode fails
|
|
84
|
+
type checking here (``assert_never``) and raises at run time, so a value
|
|
85
|
+
that reached this point without the config check — a plan built in
|
|
86
|
+
process, a mode loom deliberately excludes such as ``prompted`` — cannot
|
|
87
|
+
be silently served as ``native``.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
plan: Compiled agent plan.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
``ToolOutput`` for ``tool``, ``NativeOutput`` for ``native``, ``None``
|
|
94
|
+
when the binding leaves the mode to the engine.
|
|
95
|
+
|
|
96
|
+
Raises:
|
|
97
|
+
AssertionError: The binding names a mode loom does not offer.
|
|
98
|
+
"""
|
|
99
|
+
declared = plan.inference.output_mode
|
|
100
|
+
if declared is None:
|
|
101
|
+
return None
|
|
102
|
+
# The struct field is ``str`` (msgspec would reject a Literal during the
|
|
103
|
+
# decode, before the config check could name the role), so the narrowing
|
|
104
|
+
# happens here, where the dispatch below either handles the value or
|
|
105
|
+
# refuses it.
|
|
106
|
+
mode = cast("OutputMode", declared)
|
|
107
|
+
structured = StructuredDict(dict(plan.output.schema))
|
|
108
|
+
if mode == "tool":
|
|
109
|
+
return ToolOutput(structured)
|
|
110
|
+
if mode == "native":
|
|
111
|
+
return NativeOutput(structured)
|
|
112
|
+
assert_never(mode)
|