loom-kernel 1.8.0__tar.gz → 1.9.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/CHANGELOG.md +73 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/PKG-INFO +1 -1
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/ai/artifacts.md +197 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/ai/overview.md +4 -1
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/pyproject.toml +7 -2
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/scripts/release/checkout_merged_release.py +19 -3
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/_transport.py +17 -8
- loom_kernel-1.9.0/src/loom/ai/_usecase.py +74 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/_rpc.py +1 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/abc.py +17 -1
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/__init__.py +2 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/_compiler.py +15 -2
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/_plan.py +41 -1
- loom_kernel-1.9.0/src/loom/ai/compiler/phases/_hook.py +127 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/declarative/__init__.py +2 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/declarative/_schema.py +21 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/declarative/_v1.py +22 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +17 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +4 -27
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/errors.py +71 -2
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/fastapi/endpoints.py +34 -14
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/fastapi/response.py +14 -5
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/fastapi/streaming.py +8 -2
- loom_kernel-1.9.0/src/loom/ai/runtime/_hooks.py +294 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/runtime/_lifecycle.py +96 -15
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/executor.py +11 -4
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/conftest.py +105 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_endpoints.py +408 -11
- loom_kernel-1.9.0/tests/integration/ai/test_hooks.py +960 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_streaming.py +25 -1
- loom_kernel-1.9.0/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/triage.py +91 -0
- loom_kernel-1.9.0/tests/unit/ai/phases/test_hook.py +193 -0
- loom_kernel-1.9.0/tests/unit/ai/runtime/__init__.py +1 -0
- loom_kernel-1.9.0/tests/unit/ai/runtime/test_hook_command.py +116 -0
- loom_kernel-1.9.0/tests/unit/ai/test_declarative_hook.py +111 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_error_factories.py +47 -0
- loom_kernel-1.9.0/tests/unit/ai/test_run_error_hook.py +49 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_schema_emission.py +5 -0
- loom_kernel-1.9.0/tests/unit/ai/test_usecase_helpers.py +150 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_executor_uow.py +59 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/release/test_checkout_merged_release.py +32 -1
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_adapter.py +1 -3
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/uv.lock +1 -1
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.github/workflows/ci-main.yml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.github/workflows/ci-pr.yml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.github/workflows/docs.yml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.github/workflows/release.yml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.gitignore +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.pre-commit-config.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/.readthedocs.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/LICENSE +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/Makefile +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/README.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/codecov.yml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docker-compose.local.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/_static/.gitkeep +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/_static/custom.css +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/_static/logo-transparent.png +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/_static/logo.svg +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/ai/a2a.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/ai/mcp.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/ai/observability.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/ai/providers.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/architecture/adr/README.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/architecture/clean-architecture.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/architecture/overview.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/conf.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/etl/examples.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/etl/pipelines.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/etl/testing.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/examples-repo/index.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/getting-started/etl.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/getting-started/rest.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/getting-started/streaming.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/guides/autocrud.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/guides/celery.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/guides/etl.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/guides/fake-repo-examples.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/guides/quickstart.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/guides/use-case-dsl.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/index.rst +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/overview.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/ai.rst +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/core.rst +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/etl.rst +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/repository.rst +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/rest.rst +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/streaming.rst +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/api/testing.rst +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/reference/index.rst +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/requirements.txt +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/autocrud.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/celery.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/examples.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/identity.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/sql.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/testing.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/rest/use-case-dsl.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/streaming/bytewax.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/streaming/delivery.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/docs/streaming/tracing.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/sonar-project.properties +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/_filters.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/_binding.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/_handlers.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/card.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/events.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/a2a/server.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/_symbols.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/phases/_capabilities.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/compiler/phases/_output.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/declarative/_envelope.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/describe.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/fastapi/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/inference.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/remote_auth.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/runtime/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/runtime/_health.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/runtime/_limits.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/runtime/_mcp.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/validate/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/ai/validate/__main__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/auto.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/bootstrap.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/constants.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/runner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/celery/service.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/async_bridge.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/backend/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/backend/core_model.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/backend/protocol.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/backend/sqlalchemy.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/bootstrap/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/bootstrap/kernel.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/abc/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/abc/backend.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/abc/config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/abc/dependency.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/codec.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/decorators.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/dependency.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/gateway.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/keys.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/repository.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/cache/serializer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/command/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/command/adapter.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/command/base.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/command/field.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/command/introspection.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/compiler.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/_resolver_utils.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/binder.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/configurable.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/context.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/keys.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/loader.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/model.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/observability.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/resolver.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/secrets.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/config/ssm.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/contracts/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/contracts/manifest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/di/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/di/container.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/di/scope.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/discovery/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/discovery/_utils.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/discovery/base.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/discovery/interfaces.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/discovery/manifest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/discovery/modules.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/compilable.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/compiler.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/events.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/metrics.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/engine/plan.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/errors/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/errors/codes.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/errors/errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/expr/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/expr/eval.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/expr/nodes.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/expr/refs.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/identity/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/identity/context.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/identity/identity.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/identity/issuer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/identity/wire.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/introspection/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/introspection/base.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/introspection/describe.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/job/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/job/callback.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/job/context.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/job/handle.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/job/job.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/job/service.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/logger/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/logger/abc.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/logger/config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/logger/registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/logger/structlogger.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/base.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/enums.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/field.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/introspection.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/projection.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/relation.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/struct.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/timestamped.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/types.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/model/types_postgres.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/event.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/observer/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/observer/noop.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/observer/otel.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/observer/structlog.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/otel_ids.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/protocol.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/runtime.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/span.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/observability/topology.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/plugins/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/plugins/entrypoints.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/projection/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/projection/loaders.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/projection/runtime.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/abc/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/abc/query.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/abc/repo_for.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/abc/repository.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/dynamodb/registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/dynamodb/repository.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/mutation.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/registration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/response/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/response/base.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/routing/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/routing/ref.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/routing/resolver.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/runner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/schema/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/schema/schema_mode.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/abc/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/abc/contracts.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/abc/errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/clickhouse/_client.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/clickhouse/registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/roles.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/sql/service.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/tracing/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/tracing/context.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/transport/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/transport/adapter.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/uow/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/uow/abc.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/uow/context.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/_predicates.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/compute.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/constants.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/factory.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/field_ref.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/invoker.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/keys.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/markers.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/rule.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/core/use_case/use_case.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_format_registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_historify/_common.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_historify/_log.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_merge.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_path_template.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_predicate.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/_write_policy.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_historify.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_reader.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_schema.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/_writer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/polars/provider.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/_historify.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/_reader.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/_schema.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/_writer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/backends/spark/provider.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/_paths.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/_scope.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/checkpoint/_store.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_binding.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_compiler.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_plan.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_validators.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/compiler/_validators_step.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/_format.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/_read_options.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/_utils.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/_write_options.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/expr/_params.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/source/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/source/_from.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/source/_specs.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_client.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_file.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_into.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_table.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/declarative/target/_temp.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/executor/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/executor/_dispatcher.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/executor/_executor.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/_registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_clickhouse.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_mongo.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/sources/_serialization.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/targets/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/io/targets/_clickhouse.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/_observer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/_records.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/_builder.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/_ops.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/_protocol.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/_runner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/_step.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_generics.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_params.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_process.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_sql.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_step.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_step_client.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/_providers.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/_wiring.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/config_loader.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/core.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runner/filtering.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runtime/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/runtime/contracts.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/schema/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/schema/_contract.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/schema/_schema.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/storage/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/storage/_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/storage/_file_locator.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/storage/_locator.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/storage/routing.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/testing/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/testing/_result.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/testing/_runners.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/testing/_scenario.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/testing/_stubs.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/etl/testing/spark.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/_async.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/_ctx.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/_meta.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/_placeholders.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/_summary.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/deploy/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/deploy/_discovery.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/deploy/_schedule.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/deploy/_yaml.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_assemble.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_backfill.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_body.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_common.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_factory.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_hooks.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_maintenance.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_run_name.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_runtime.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_signature.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/flow/_stages.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/manifest/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/manifest/_model.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/manifest/_s3.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/manifest/_store.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/notify/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/notify/_event.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/notify/_factory.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/notify/_port.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/notify/_slack.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/observer/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/observer/_flow.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/observer/_manifest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prefect/observer/_task_run.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prometheus/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prometheus/adapter.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prometheus/kafka.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prometheus/lifecycle.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/prometheus/middleware.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/py.typed +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/_body.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/adapter.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/auth/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/auth/abc.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/auth/config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/auth/jwt.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/auth/middleware.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/autocrud.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/compiler.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/constants.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/cors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/_errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/app.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/auto.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/openapi.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/response.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/router_runtime.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/fastapi/sql.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/middleware.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/model.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/rest/rest_adapter.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_operators.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/bytewax/runner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/_bindings.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/_compiler.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/_errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/_plan.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/compiler/phases/validate.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/core/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/core/_errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/core/_exceptions.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/core/_message.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/core/_tracing.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/core/_typing.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/graph/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/graph/_flow.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_codec.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_message.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_record.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/_wire.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/mongo/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/mongo/_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/mongo/_event.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/mongo/_normalize.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_boundary.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_decompose.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_fork.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_helpers.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_mongo.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_protocols.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_router.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_shape.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_sink.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_step.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_table/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_table/common.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_table/config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/_with.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/nodes/refs.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/streaming/testing.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/agents.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/golden.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/http_harness.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/in_memory.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/repository_harness.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/src/loom/testing/runner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/contract/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/contract/ai/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/contract/ai/test_contract_fake.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/contract/ai/test_contract_pydantic_ai.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/contract/observability/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/contract/observability/test_otel_sdk_contract.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/golden/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/golden/baselines/.gitkeep +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/golden/outputs/.gitkeep +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/golden/plans/.gitkeep +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/helpers/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/helpers/pydantic_ai_engine.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/helpers/remote_auth_plugin.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/helpers/spans.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_a2a.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_a2a_auth_wiring.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_agent_specs_source.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_auto_a2a.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_auto_client_factories.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_auto_gate.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_capabilities.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_describe.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_grant_wiring.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_health_probe.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_limits.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_live_provider.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_mcp_end_to_end.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_provider_portability.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_remote_auth_wiring.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_runtime.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/ai/test_transport.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/celery_bootstrap/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/celery_bootstrap/config/conf.celery.integration.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/celery_bootstrap/test_auto_create_app_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/celery_bootstrap/test_bootstrap_worker.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/bootstrap/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/bootstrap/test_bootstrap_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/repository/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/repository/sqlalchemy/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/repository/sqlalchemy/test_cache_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/repository/sqlalchemy/test_repository_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/rest/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/rest/test_auto_interface_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/rest/test_fastapi_app_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/rest/test_rest_error_mapping.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/rest/test_rest_observability.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/use_case/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/use_case/test_custom_repository_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/core/use_case/test_use_case_crud_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/etl/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/etl/test_runner_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/config/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/config/conf.interfaces.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/config/conf.manifest.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/config/conf.modules.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/config/conf.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/main.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/manifest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/category/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/category/model.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/category/schemas.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/interface.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/jobs.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/model.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/relations.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/repository.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/repository_contract.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/review/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/review/model.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/review/schemas.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/schemas.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/fake_repo/product/use_cases.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/sql/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/sql/init/01_users_roles.sql +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/sql/test_clickhouse_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/streaming/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/streaming/kafka/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/streaming/kafka/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/streaming/kafka/test_partitioned_source_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/streaming/kafka/test_source_contract_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/streaming/test_into_table_integration.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/support/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/integration/support/logical_repo_fixtures.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/engines/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/engines/test_a2a_capability.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/engines/test_capability_span_nesting.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/engines/test_pydantic_ai_binding.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/engines/test_pydantic_ai_failures.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/engines/test_pydantic_ai_translation.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/README.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-a2a-agent/agent.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-mcp-agent/agent.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-python-agent/agent.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-skills-agent/agent.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-skills-agent/skills/release-notes/SKILL.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-sql-agent/agent.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/capability-usecase-agent/agent.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/full-agent/agent.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/full-agent/skills/severity-rubric/SKILL.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/minimal-agent/agent.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/corpus_v1/output-type-ref-agent/agent.yaml +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/incidents.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/invoices.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/unsupported.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/broken.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/geo.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/metrics.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/skills_root/shared/group-changes/SKILL.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/fixtures/skills_root/shared/tone-of-voice/SKILL.md +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/test_capabilities.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/test_limits.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/test_model_role.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/test_output.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/test_remote_auth_plan.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/phases/test_validate_cli.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_a2a_base_url.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_a2a_card.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_compiler.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_compiler_offline.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_declarative_envelope.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_describe.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_error_catalogue_totality.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_fake_engine.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_loopback_plaintext.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_no_extras_import.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_public_surface.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_remote_auth.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_remote_auth_settings.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_secret_containment.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ai/test_spec_v1_corpus.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_bootstrap/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_bootstrap/test_async_runtime.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_bootstrap/test_bootstrap.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_jobs/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_jobs/test_auto.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_jobs/test_celery_service.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_jobs/test_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_jobs/test_identity_propagation.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/celery_jobs/test_runner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/ci/test_workflow_supply_chain_contract.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/backend/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/backend/test_backend_compiler.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/bootstrap/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/bootstrap/test_bootstrap.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/bootstrap/test_bootstrap_metrics.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/bootstrap/test_kernel.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/cache/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/cache/test_cached_repository.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/cache/test_config_wiring.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/cache/test_gateway_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/command/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/command/test_command_base.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/command/test_command_field.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/command/test_command_patch.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/command/test_introspection.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_binder.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_configurable.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_context.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_resolver_utils.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_secrets.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/config/test_ssm.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/di/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/di/test_container.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/discovery/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/discovery/test_manifest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_caller_binding.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_compiler.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_executor.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_executor_trace.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_metrics.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/engine/test_plan.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/errors/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/errors/test_errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/expr/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/expr/test_expr.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/identity/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/identity/test_context.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/identity/test_identity.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/identity/test_wire.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/introspection/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/introspection/test_describe.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/test_callback.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/test_context.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/test_handle.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/test_inline_service.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/job/test_job.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/logger/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/logger/test_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/logger/test_registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/model/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/model/test_model.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/model/test_struct.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/model/test_timestamped.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_message_id_generator.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_observers.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_optional_otel_sdk.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_otel_loader_branches.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_provider_modes.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_runtime.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/observability/test_tracing_characterisation.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/plugins/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/plugins/test_entrypoints.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/plugins/test_import_containment.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/projection/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/projection/test_runtime.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/abc/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/abc/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/abc/test_query.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/abc/test_repository_contract.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/dynamodb/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/dynamodb/test_registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/dynamodb/test_repository.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/sqlalchemy/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/sqlalchemy/test_loaders.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/sqlalchemy/test_repository.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/repository/sqlalchemy/test_transactional.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/routing/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/routing/test_routing.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/_fakes.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_clickhouse_executor.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_clickhouse_transport.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_isolation.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_null_service.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_pagination_limits.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_registry_lifecycle.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/sql/test_role_policy.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/test_async_bridge.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/test_compiler_contracts.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/test_runner_contracts.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/tracing/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/tracing/test_context.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/uow/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/uow/test_executor_uow.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/uow/test_sqlalchemy_uow.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/uow/test_uow_protocols.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_compute.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_factory.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_field_ref.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_invoker.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_markers.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_rule.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/core/use_case/test_use_case.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/_historify_contract.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_empty_write_warning.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_historify_common.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_path_template.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_apply_schema.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_backend.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_dtype.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_file_writer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_historify_polars.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_predicate_pushdown.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_reader_columns.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_reader_json_columns.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_step_execution.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_streaming_write.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_update_writer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_upsert_writer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_writer_null_schema.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_polars/test_writer_to_frame.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/test_dtype.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/test_historify_spark.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/test_spark_apply_schema.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/test_step_execution.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_spark/test_writer_to_frame.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/backends/test_write_policy_historify.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/checkpoint/backends/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/checkpoint/backends/test_checkpoint_polars.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/checkpoint/test_checkpoint_paths.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/checkpoint/test_cleaners.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/checkpoint/test_store.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/client_step/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/client_step/test_client_step.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_catalog_validator.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_compiler.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_compiler_catalog.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_compiler_upsert.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_errors_additional_factories.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_errors_runtime_factories.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_file_template_validator.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_historify_validator.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_param_exprs_validator.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_plan_traversal.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_step_validator.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_structural.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_temp_validator.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/compiler/test_upsert_validator.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_clickhouse_reader.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_dynamodb_predicate.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_dynamodb_reader.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_from_clickhouse.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_from_dynamodb.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_from_mongo.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_mongo_predicate.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_mongo_reader.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/sources/test_mongo_reader_memory.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/targets/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/targets/test_clickhouse_writer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/targets/test_into_clickhouse.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_history_target.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_source.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_source_json.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_source_options.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_target.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_utils.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/io/test_variants.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/lineage/test_observer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/lineage/test_records.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/lineage/test_store.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/backends/test_delta_rs.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/test_builder.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/test_runner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/maintenance/test_step.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/pipeline/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/pipeline/test_pipeline_process.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/pipeline/test_proxy.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/pipeline/test_step.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/schema/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/schema/test_contract.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/schema/test_schema.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/schema/test_table.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/sql/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/sql/test_merge.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/sql/test_predicate.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/sql/test_predicate_dialect.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/sql/test_sql_runtime.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_backend_factory.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_io_protocols.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_locator.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_observability_and_protocols.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_route_build.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_schema_readers.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/storage/test_storage_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_config_loader.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_executor.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_executor_tracing.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_format_registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_module_contracts.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_public_api_discovery.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_record_schema_coverage.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_runner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_runner_errors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/test_spark_testing.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/testing/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/testing/test_runners.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/testing/test_scenario_and_stubs.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/etl/testing/test_spark_helpers.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_backfill_flow.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_ctx.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_etl_flow.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_logging_bridge.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_maintenance_flow.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_manifest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_manifest_s3.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_notify.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_observer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_placeholders.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_task_run_observer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prefect/test_yaml_loader.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prometheus/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prometheus/test_adapter.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/prometheus/test_middleware.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/release/test_release_workflow_contract.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/_fixture_app.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_app_hardening.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_auth_middleware.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_auth_rejection_logging.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_autocrud.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_cors.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_fastapi_auto_logger.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_fastapi_auto_persistence.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_jwt_issuer.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_jwt_middleware.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_middleware.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_pydantic_adapter.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_request_hardening.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_response.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_rest_adapter.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_rest_compiler.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_rest_model.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_route_rbac.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_router_identity.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_router_runtime.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_sql_endpoint.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_sql_endpoint_auth_gate.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_sql_endpoint_roles.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/rest/test_sql_serialization.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/cases.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_batch_key.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_bytewax_dispatcher.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_collect_batch.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_dlq.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_error_boundary.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_fanout_accounting.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_operators.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_resource_manager.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_runner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_runtime_io.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_runtime_sink.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_runtime_source.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_sink_registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_steps.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_storage.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/bytewax/test_storage_trace_characterisation.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/cases.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_async_walk.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_basics.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_config_bindings.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_delivery.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_error_codes.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_mongo_source.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_multi_source.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_router.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_window.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/compiler/test_with.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/cases.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/test_boundary.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/test_message.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/test_mongo_contracts.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/test_multi_boundary.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/contracts/test_steps.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/batch.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/explode.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/fork.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/router.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/shared.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/cases/simple.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/test_compiler_examples.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/flows/test_flow_examples.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/cases.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/fakes.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_client.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_coordinator_retry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_key_resolver.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_message.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_message_client.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_multi_wire.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_observability.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_settings.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_source_decode_parity.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/kafka/test_wire.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/mongo/test_bytewax_source.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/nodes/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/nodes/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/nodes/test_broadcast.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/nodes/test_delta_config.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/nodes/test_logging.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/nodes/test_table_package.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/cases.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/conftest.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_message_lifecycle_spans.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_multiworker_trace_continuity.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_observability_runner.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_outbound_topic_terminal_spans.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_protocols.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_registry.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/observability/test_structlog.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/support/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/support/flow_cases.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/test_expand_routes.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/test_fork.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/test_otel_observability.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/test_routing.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/test_testing_mongo.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/streaming/test_with.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/testing/__init__.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/testing/test_golden.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/testing/test_http_harness.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/testing/test_identity_harness.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/testing/test_in_memory.py +0 -0
- {loom_kernel-1.8.0 → loom_kernel-1.9.0}/tests/unit/testing/test_runner.py +0 -0
|
@@ -1,3 +1,76 @@
|
|
|
1
|
+
# 🚀 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
|
+
|
|
3
|
+
|
|
4
|
+
## ✨ Features
|
|
5
|
+
### ai
|
|
6
|
+
- **ai:** run a deployment use case on every completed agent run (on_output)<br>
|
|
7
|
+
> An agent artifact may declare `on_output: {usecase: <key>}`. The runtime
|
|
8
|
+
> then executes that use case exactly once per run that completes with a
|
|
9
|
+
> validated output, as the caller, through the normal use-case path
|
|
10
|
+
> (executor, rules, unit of work), with a command carrying the output under
|
|
11
|
+
> `output` plus runtime context (interaction_id, conversation_id, subject,
|
|
12
|
+
> mechanism, agent, provider, model). The use case's return value comes back
|
|
13
|
+
> as `hook_result`; a failing hook fails the run with HOOK_FAILED (500), an
|
|
14
|
+
> authorization denial with UNAUTHORIZED (403); the model never sees the hook.
|
|
15
|
+
> Every admitted run now carries an `interaction_id` on its result, its SSE
|
|
16
|
+
> `final`/`error` frame and its HTTP error body, and the request accepts an
|
|
17
|
+
> opaque `conversation_id` (1..128) propagated verbatim to the hook.
|
|
18
|
+
> Compile-time refusals: unknown use case, unsatisfiable Input, a use case
|
|
19
|
+
> that is both a `kind: usecase` grant and the hook, and a deps bundle whose
|
|
20
|
+
> invoker is missing or unbound (checked at start-up before any client opens).
|
|
21
|
+
> The hook is shielded from client disconnects and bounded by
|
|
22
|
+
> tool_timeout_ms; RuntimeExecutor now rolls back its unit of work on
|
|
23
|
+
> cancellation as well as on exceptions, and the SSE transport settles the
|
|
24
|
+
> frame task before closing the event generator.
|
|
25
|
+
> pyright now resolves imports against the project venv when invoked
|
|
26
|
+
> directly, so a globally installed dependency cannot shadow the pinned one.
|
|
27
|
+
> Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
|
28
|
+
> Claude-Session: https://claude.ai/code/session_01Gr9ww7Ut7iiPZcukawEXzH
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
## ♻️ Refactor
|
|
36
|
+
### ai
|
|
37
|
+
- **ai:** clear the SonarCloud findings of the on_output hook<br>
|
|
38
|
+
> The quality gate of #154 failed on a single reliability finding (S7497):
|
|
39
|
+
> the hook runner's `except asyncio.CancelledError` turned an internal
|
|
40
|
+
> cancellation into `RuntimeError` instead of re-raising. Wait on the hook
|
|
41
|
+
> task with `asyncio.wait` instead of `asyncio.shield`, which returns once
|
|
42
|
+
> the task ends, cancelled included; the consumer's cancellation is then
|
|
43
|
+
> the only `CancelledError` reaching the handler, always re-raised, and the
|
|
44
|
+
> internal cancel is detected after the wait. `_consumer_cancelled` and its
|
|
45
|
+
> `cancelling()` probe go away. `_settle` bounds its wait with
|
|
46
|
+
> `asyncio.timeout` (S7483).
|
|
47
|
+
|
|
48
|
+
- **ai:** name _settle's bound so Sonar S7483 stops matching the parameter<br>
|
|
49
|
+
> Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
|
50
|
+
> Claude-Session: https://claude.ai/code/session_016xY1skW5S2PU9Fc3M7tfAW
|
|
51
|
+
> --------
|
|
52
|
+
> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# 🚀 Release 1.8.1 ([#152](https://github.com/the-reacher-data/loom-py/pull/152)) ([`e8d1d81`](https://github.com/the-reacher-data/loom-py/commit/e8d1d81cf2b3fe15e8351108b893d6076950f0cd))
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
## 🐛 Fixes
|
|
64
|
+
### release
|
|
65
|
+
- **release:** merge the release PR when its check rollup is empty
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
1
74
|
# 🚀 Release 1.8.0 ([#147](https://github.com/the-reacher-data/loom-py/pull/147)) ([`1d9667e`](https://github.com/the-reacher-data/loom-py/commit/1d9667e3))
|
|
2
75
|
|
|
3
76
|
|
|
@@ -68,6 +68,8 @@ model_role: reasoning
|
|
|
68
68
|
output:
|
|
69
69
|
kind: type_ref
|
|
70
70
|
ref: myapp.domain.incidents:IncidentReport
|
|
71
|
+
on_output:
|
|
72
|
+
usecase: incidents.record_report
|
|
71
73
|
capabilities:
|
|
72
74
|
- kind: usecase
|
|
73
75
|
keys:
|
|
@@ -109,6 +111,7 @@ metadata:
|
|
|
109
111
|
| `instructions` | yes | — | Non-empty. **Never published.** Never a place to encode authorization. |
|
|
110
112
|
| `model_role` | no | `default` | `^[a-z][a-z0-9_-]{0,31}$`. A logical role, never a vendor name or a model id. |
|
|
111
113
|
| `output` | yes | — | The declared answer shape. See below. |
|
|
114
|
+
| `on_output` | no | — | Use case executed once per completed run with the validated output; see below. |
|
|
112
115
|
| `capabilities` | no | `[]` | Explicit grants. Empty means the agent can only talk. |
|
|
113
116
|
| `policies` | no | see below | Execution limits. |
|
|
114
117
|
| `metadata` | no | `{}` | Free-form `string: string` labels. **Never published**, never read by the runtime. |
|
|
@@ -165,6 +168,200 @@ output:
|
|
|
165
168
|
The reference is `module:Symbol`. Filesystem paths are not representable by the
|
|
166
169
|
pattern.
|
|
167
170
|
|
|
171
|
+
## `on_output` — a use case run once per completed run
|
|
172
|
+
|
|
173
|
+
```yaml
|
|
174
|
+
output:
|
|
175
|
+
kind: type_ref
|
|
176
|
+
ref: myapp.domain.triage:TriageReport
|
|
177
|
+
on_output:
|
|
178
|
+
usecase: incidents.record_triage # a use-case key of the registry; must not also be a grant
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
For every run that **completes** with an output validated against the declared
|
|
182
|
+
shape, the runtime executes that use case **exactly once**, as the caller,
|
|
183
|
+
through the normal use-case path — executor, rules, unit of work. The use
|
|
184
|
+
case's return value comes back to the caller as `hook_result`.
|
|
185
|
+
|
|
186
|
+
It is **not a tool: the model never sees it.** It never enters the
|
|
187
|
+
instructions, it is never offered to the model, and the model cannot call it,
|
|
188
|
+
skip it or choose its arguments. Whether a triage is recorded is decided by the
|
|
189
|
+
deployment that wrote the artifact, not by the model on each run — which is
|
|
190
|
+
what makes the record deterministic. Granting the same operation as a
|
|
191
|
+
`kind: usecase` tool gives you the opposite: a record that exists only when the
|
|
192
|
+
model felt like calling it, with whatever arguments it wrote.
|
|
193
|
+
|
|
194
|
+
Only a completed run fires the hook. A run that ends in an `error`, breaches a
|
|
195
|
+
declared limit (`run_timeout_ms`, `max_iterations`, …) or whose client leaves
|
|
196
|
+
the stream before the `final` event never runs it.
|
|
197
|
+
|
|
198
|
+
### What the use case receives
|
|
199
|
+
|
|
200
|
+
The command nests the validated output under `output` and offers the run's
|
|
201
|
+
context beside it:
|
|
202
|
+
|
|
203
|
+
| Name | Value |
|
|
204
|
+
|---|---|
|
|
205
|
+
| `output` | The validated answer, as **one nested value**, whatever the artifact's `output` block declares. |
|
|
206
|
+
| `interaction_id` | Identifier the runtime mints for every admitted run. |
|
|
207
|
+
| `conversation_id` | The request's `conversation_id`, verbatim; `None` when the request carried none. |
|
|
208
|
+
| `subject`, `mechanism` | The caller's identity. |
|
|
209
|
+
| `agent`, `provider`, `model` | The agent's name, and the provider and model its `model_role` resolved to. |
|
|
210
|
+
|
|
211
|
+
**The Command declares what it wants** and receives only that: the runtime
|
|
212
|
+
filters the offered names down to the ones the Input declares, so a strict
|
|
213
|
+
Command (`forbid_unknown_fields=True`) decodes without listing every context
|
|
214
|
+
name. Because `output` is always nested, a field called `subject` inside the
|
|
215
|
+
model's answer can never shadow the caller's.
|
|
216
|
+
|
|
217
|
+
```python
|
|
218
|
+
class RecordTriageCommand(Command):
|
|
219
|
+
output: TriageReport # the type_ref type itself; dict[str, Any] also works
|
|
220
|
+
interaction_id: str
|
|
221
|
+
conversation_id: str | None = None
|
|
222
|
+
agent: str
|
|
223
|
+
model: str
|
|
224
|
+
# `subject`, `mechanism`, `provider` are offered but not declared: filtered out.
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
class TriageRecorded(msgspec.Struct, frozen=True):
|
|
228
|
+
triage_id: str
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
@use_case_key("incidents.record_triage")
|
|
232
|
+
class RecordTriage(UseCase[Triage, TriageRecorded]):
|
|
233
|
+
def __init__(self, triages: TriageRepository) -> None:
|
|
234
|
+
self._triages = triages
|
|
235
|
+
|
|
236
|
+
async def execute(
|
|
237
|
+
self,
|
|
238
|
+
cmd: RecordTriageCommand = Input(),
|
|
239
|
+
caller: Identity = Caller(), # the agent's caller
|
|
240
|
+
) -> TriageRecorded:
|
|
241
|
+
report = cmd.output
|
|
242
|
+
await self._triages.save(
|
|
243
|
+
Triage(
|
|
244
|
+
id=cmd.interaction_id, conversation_id=cmd.conversation_id,
|
|
245
|
+
subject=caller.subject, agent=cmd.agent, model=cmd.model,
|
|
246
|
+
incident_ref=report.incident_ref, severity=report.severity,
|
|
247
|
+
confidence=report.confidence,
|
|
248
|
+
)
|
|
249
|
+
)
|
|
250
|
+
return TriageRecorded(triage_id=cmd.interaction_id)
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
The verdict the on-call engineer gives later ("wrong severity") is an ordinary
|
|
254
|
+
use case of your application, called with the `interaction_id` the app already
|
|
255
|
+
holds. Loom stores nothing.
|
|
256
|
+
|
|
257
|
+
### The compile-time rule
|
|
258
|
+
|
|
259
|
+
The compiler proves that the run can feed the use case, so a missing field is
|
|
260
|
+
never discovered at the end of a paid run. The key is resolved against the
|
|
261
|
+
same registry as a `kind: usecase` grant, and the use case's `execute` must
|
|
262
|
+
take an `Input()` whose required fields are all among `output` and the context
|
|
263
|
+
names above. Four coded issues:
|
|
264
|
+
|
|
265
|
+
| Code | When |
|
|
266
|
+
|---|---|
|
|
267
|
+
| `ON_OUTPUT_USECASE_UNKNOWN` | The key is not registered. |
|
|
268
|
+
| `ON_OUTPUT_INPUT_UNSATISFIED` | The use case cannot be fed from a run: it is not compiled, its `execute` declares primitive parameters, declares no `Input()`, or its Input requires a name the run does not offer. `internal` and `calculated` command fields and `Caller()` are never demanded. |
|
|
269
|
+
| `ON_OUTPUT_USECASE_ALSO_GRANTED` | The same key also appears in a `kind: usecase` grant. A hook use case must not be callable by the model. |
|
|
270
|
+
| `ON_OUTPUT_INVOKER_MISSING` | Start-up: an agent declares a hook but the dependency bundle carries no `invoker` bound to the caller. Probed before any client opens, so a misconfigured deployment fails at start-up rather than after every run. |
|
|
271
|
+
|
|
272
|
+
The offline validator (`python -m loom.ai.validate`) accepts the field but
|
|
273
|
+
does not resolve the key: it runs only the configuration-independent phases,
|
|
274
|
+
and a use-case registry is deployment state. The four issues above surface
|
|
275
|
+
when the application compiles its agents.
|
|
276
|
+
|
|
277
|
+
### `on_output` versus a `kind: usecase` grant
|
|
278
|
+
|
|
279
|
+
Same vocabulary, same registry, same caller identity, same executor — and
|
|
280
|
+
opposite owners. A **grant** is a tool the *model* may call, when and how it
|
|
281
|
+
decides. A **hook** is a use case the *runtime* calls, once, with the
|
|
282
|
+
validated output. That is why one key cannot be both. Deciding whether an
|
|
283
|
+
operation is a tool at all follows
|
|
284
|
+
[the rule](mcp.md#the-rule-your-own-tools-are-a-usecase-grant) on the MCP page;
|
|
285
|
+
`on_output` is for the operation that must happen after every answer,
|
|
286
|
+
regardless of what the model did.
|
|
287
|
+
|
|
288
|
+
### When the hook fails, the run fails
|
|
289
|
+
|
|
290
|
+
The model's answer is withheld and the caller gets a coded error. The hook is
|
|
291
|
+
**never retried**: it runs outside the engine's retry loop, and `HOOK_FAILED`
|
|
292
|
+
is not a retriable code.
|
|
293
|
+
|
|
294
|
+
| The hook… | The caller gets |
|
|
295
|
+
|---|---|
|
|
296
|
+
| raises | `500` `HOOK_FAILED` with a fixed message — `the output hook failed; the detail is recorded server-side`. The exception never reaches the caller; the server log carries it under the `interaction_id`. |
|
|
297
|
+
| raises `Forbidden`, `Unauthenticated`, `RoleNotAllowedError` or `RolesNotBoundError` | `403` `UNAUTHORIZED`, exactly as a `kind: usecase` tool would. |
|
|
298
|
+
| exceeds `tool_timeout_ms` | Cut at the bound and reported as `HOOK_FAILED`. |
|
|
299
|
+
| is cancelled internally | `HOOK_FAILED`: a hook that cancels itself is a hook failure, not a client exit. |
|
|
300
|
+
|
|
301
|
+
On `/stream` the failure is a single `error` frame and no `final`.
|
|
302
|
+
|
|
303
|
+
An anonymous caller — an endpoint declaring `allow_anonymous` — runs the hook
|
|
304
|
+
with `Caller()` bound to `ANONYMOUS`, so the command's `subject` is `""`.
|
|
305
|
+
Recording those is the deployment's choice: a use case whose rules refuse an
|
|
306
|
+
anonymous caller answers `403 UNAUTHORIZED` like any other denial.
|
|
307
|
+
|
|
308
|
+
### Timing and the concurrency permit
|
|
309
|
+
|
|
310
|
+
The hook runs after the model has finished, but **inside** the run: the
|
|
311
|
+
`max_concurrent_runs` permit is held until it ends. It is bounded by the same
|
|
312
|
+
`tool_timeout_ms` as a capability call, so the worst-case duration of an
|
|
313
|
+
admitted run is `run_timeout_ms + tool_timeout_ms + 1 s` of grace given to a
|
|
314
|
+
cut hook to observe its cancellation. A hook that ignores that grace runs
|
|
315
|
+
detached afterwards; the permit is released regardless.
|
|
316
|
+
|
|
317
|
+
A client that disconnects while the hook is running does not interrupt it:
|
|
318
|
+
the hook is shielded, so a record that has begun finishes or fails cleanly and
|
|
319
|
+
its unit of work is committed or rolled back as usual.
|
|
320
|
+
|
|
321
|
+
A hook cut at its bound is rolled back; on a non-transactional backend such
|
|
322
|
+
as DynamoDB, partial writes may remain, so a hook use case should be
|
|
323
|
+
idempotent on `interaction_id`, and `HOOK_FAILED` means "unknown", not "not
|
|
324
|
+
recorded".
|
|
325
|
+
|
|
326
|
+
### What the caller receives
|
|
327
|
+
|
|
328
|
+
Every result carries `interaction_id`, hook or no hook: `AgentResult`, the
|
|
329
|
+
`final` and `error` SSE frames, and every HTTP error body. It is `null` only
|
|
330
|
+
when the failure happened before a run was admitted — a `422` body, a `429`
|
|
331
|
+
`TOO_MANY_RUNS` — because a fixed shape beats a conditional one. `hook_result`
|
|
332
|
+
is on `final` and on `AgentResult`, `null` when the artifact declares no hook.
|
|
333
|
+
The hook's return value is a client-facing DTO delivered verbatim to the caller
|
|
334
|
+
— public on an `allow_anonymous` mount — so return a purpose-built struct,
|
|
335
|
+
never a domain entity.
|
|
336
|
+
|
|
337
|
+
The request body accepts an optional `conversation_id`: a string of 1 to 128
|
|
338
|
+
characters that loom never reads and never keys anything on. It is copied
|
|
339
|
+
verbatim into the hook's command and nowhere else; an out-of-range value is a
|
|
340
|
+
`422`.
|
|
341
|
+
|
|
342
|
+
`POST /agents/incident-triage/run` with
|
|
343
|
+
`{"prompt": "Checkout latency doubled since 09:40…", "conversation_id": "c-42"}`:
|
|
344
|
+
|
|
345
|
+
```json
|
|
346
|
+
{
|
|
347
|
+
"output": {"incident_ref": "INC-1", "severity": "high", "confidence": 0.71, "alerts": ["A-7", "A-9"]},
|
|
348
|
+
"usage": {"input_tokens": 1840, "output_tokens": 412, "requests": 3, "duration_ms": 5210},
|
|
349
|
+
"interaction_id": "7f3c9a0e4b2d4c1e9a7b5d6e8f0a1b2c",
|
|
350
|
+
"hook_result": {"triage_id": "7f3c9a0e4b2d4c1e9a7b5d6e8f0a1b2c"}
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
Over `/stream`, the last frame is:
|
|
355
|
+
|
|
356
|
+
```
|
|
357
|
+
event: final
|
|
358
|
+
data: {"output":{...},"usage":{...},"interaction_id":"7f3c...","hook_result":{"triage_id":"7f3c..."}}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
Had `RecordTriage` raised, the app would instead get
|
|
362
|
+
`500 {"code":"HOOK_FAILED","message":"the output hook failed; the detail is recorded server-side","interaction_id":"7f3c..."}`
|
|
363
|
+
— or an `error` frame with the same three fields — and no answer.
|
|
364
|
+
|
|
168
365
|
## `capabilities` — the six kinds
|
|
169
366
|
|
|
170
367
|
A capability is a **grant**, never a discovery. Nothing is expanded
|
|
@@ -99,7 +99,10 @@ Exposure is always an explicit opt-in, never a default.
|
|
|
99
99
|
## Where to go next
|
|
100
100
|
|
|
101
101
|
- **[Artifact reference](artifacts.md)** — the complete `spec_version: 1`
|
|
102
|
-
format, field by field, and the folder layout an agent lives in.
|
|
102
|
+
format, field by field, and the folder layout an agent lives in. It includes
|
|
103
|
+
[`on_output`](artifacts.md#on_output--a-use-case-run-once-per-completed-run),
|
|
104
|
+
the use case the runtime executes once per completed run with the validated
|
|
105
|
+
output.
|
|
103
106
|
- **[Model providers](providers.md)** — the provider matrix, and why an
|
|
104
107
|
OpenAI-compatible endpoint is one provider covering many vendors.
|
|
105
108
|
- **[A2A surface](a2a.md)** — publishing an agent to other agents, and exactly
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "loom-kernel"
|
|
3
|
-
version = "1.
|
|
3
|
+
version = "1.9.0"
|
|
4
4
|
description = "Loom Python project"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -269,6 +269,11 @@ extend-immutable-calls = [
|
|
|
269
269
|
|
|
270
270
|
[tool.pyright]
|
|
271
271
|
pythonVersion = "3.11"
|
|
272
|
+
# Resolve imports against the project venv even when pyright is invoked
|
|
273
|
+
# directly (editor, hooks) instead of through `uv run`, so a globally
|
|
274
|
+
# installed, older dependency never shadows the pinned one.
|
|
275
|
+
venvPath = "."
|
|
276
|
+
venv = ".venv"
|
|
272
277
|
# src only, deliberately. Checking tests as well surfaces 294 errors across
|
|
273
278
|
# eight rules — mostly stubs that no longer satisfy the protocol they stand in
|
|
274
279
|
# for. That is real signal and worth burning down, but it is a project, not a
|
|
@@ -357,7 +362,7 @@ markers = [
|
|
|
357
362
|
|
|
358
363
|
[tool.commitizen]
|
|
359
364
|
name = "cz_conventional_commits"
|
|
360
|
-
version = "1.
|
|
365
|
+
version = "1.9.0"
|
|
361
366
|
tag_format = "v$version"
|
|
362
367
|
version_files = [
|
|
363
368
|
"pyproject.toml:project.version",
|
|
@@ -195,9 +195,25 @@ def _is_ready_to_merge(merge_state: str, check_outcomes: Sequence[CheckOutcome])
|
|
|
195
195
|
# reports through the Checks API, and no workflow runs on a branch pushed by
|
|
196
196
|
# GITHUB_TOKEN, so no coverage is ever uploaded for it. Merging is still
|
|
197
197
|
# safe as long as every check that did report has passed.
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
198
|
+
#
|
|
199
|
+
# And an empty rollup is the *normal* state, not a missing signal. The branch
|
|
200
|
+
# and the PR are created with GITHUB_TOKEN, and GitHub deliberately emits no
|
|
201
|
+
# event for actions taken with it -- the protection against workflows
|
|
202
|
+
# triggering workflows without end. So no run is ever queued against a release
|
|
203
|
+
# PR and no check can ever appear. Requiring at least one made the wait
|
|
204
|
+
# unsatisfiable by construction: every release timed out and was published by
|
|
205
|
+
# hand.
|
|
206
|
+
#
|
|
207
|
+
# What guards a release PR is not CI on a version bump -- the code it describes
|
|
208
|
+
# already passed CI in the pull requests that composed it. It is that the PR
|
|
209
|
+
# changes exactly CHANGELOG.md, pyproject.toml and uv.lock and nothing else,
|
|
210
|
+
# asserted by _validate_snapshot at the top of every poll before this function
|
|
211
|
+
# is reached. A PR carrying anything more never gets this far.
|
|
212
|
+
#
|
|
213
|
+
# This cannot open the loop the token protection exists to prevent: the release
|
|
214
|
+
# workflow's own `prepare` job refuses a head ref starting with `docs/`, so
|
|
215
|
+
# merging a release PR never starts another release.
|
|
216
|
+
return all(outcome is CheckOutcome.PASSED for outcome in check_outcomes)
|
|
201
217
|
|
|
202
218
|
|
|
203
219
|
def _validate_polling_bounds(timeout_seconds: float, poll_interval_seconds: float) -> None:
|
|
@@ -218,7 +218,7 @@ def failure_event(exc: BaseException) -> ErrorEvent:
|
|
|
218
218
|
event = failure_event(AgentRunError(AgentRunErrorCode.RUN_TIMEOUT, "late"))
|
|
219
219
|
"""
|
|
220
220
|
if isinstance(exc, AgentRunError):
|
|
221
|
-
return ErrorEvent(code=exc.code, message=str(exc))
|
|
221
|
+
return ErrorEvent(code=exc.code, message=str(exc), interaction_id=exc.interaction_id)
|
|
222
222
|
return ErrorEvent(code=AgentRunErrorCode.PROVIDER_UNAVAILABLE, message=_UNEXPECTED_FAILURE)
|
|
223
223
|
|
|
224
224
|
|
|
@@ -231,16 +231,25 @@ async def _next_frame(frames: AsyncIterator[bytes]) -> bytes | None:
|
|
|
231
231
|
|
|
232
232
|
|
|
233
233
|
async def _drain(pending: asyncio.Future[bytes | None] | None) -> None:
|
|
234
|
-
"""Cancel the awaited frame and wait for it, so nothing outlives the stream.
|
|
234
|
+
"""Cancel the awaited frame and wait for it, so nothing outlives the stream.
|
|
235
|
+
|
|
236
|
+
The wait is shielded and repeated until the frame task is done. A server
|
|
237
|
+
that cancels its handler again at every checkpoint (an ``anyio`` cancel
|
|
238
|
+
scope does, after a disconnect) would otherwise cancel the frame task a
|
|
239
|
+
second time through the bare await — cutting the output hook it shields —
|
|
240
|
+
and then return early, letting the caller close a generator that task is
|
|
241
|
+
still running.
|
|
242
|
+
"""
|
|
235
243
|
if pending is None:
|
|
236
244
|
return
|
|
237
245
|
pending.cancel()
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
246
|
+
while not pending.done():
|
|
247
|
+
try:
|
|
248
|
+
await asyncio.shield(pending)
|
|
249
|
+
except (Exception, asyncio.CancelledError):
|
|
250
|
+
# The consumer is already gone: neither the cancellation just
|
|
251
|
+
# requested nor a late failure has anybody left to be reported to.
|
|
252
|
+
continue
|
|
244
253
|
|
|
245
254
|
|
|
246
255
|
async def with_heartbeats(
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"""Engine-free helpers to run a granted use case as a given caller.
|
|
2
|
+
|
|
3
|
+
Both the pydantic-ai capability tools and the runtime output hook invoke a use
|
|
4
|
+
case through the dependency bundle's **bound** invoker, with the caller
|
|
5
|
+
installed as the ambient identity for the duration of the call. This module
|
|
6
|
+
holds that shared piece without importing any engine, so the runtime can use
|
|
7
|
+
it with no optional extra installed.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
from loom.ai.errors import AgentRunError, AgentRunErrorCode
|
|
15
|
+
from loom.core.engine.compilable import Compilable
|
|
16
|
+
from loom.core.identity import Identity, reset_identity, set_identity
|
|
17
|
+
from loom.core.use_case.invoker import ApplicationInvoker
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def require_invoker(bundle: object, label: str) -> ApplicationInvoker:
|
|
21
|
+
"""Return the bundle's invoker, refusing a bundle that carries none.
|
|
22
|
+
|
|
23
|
+
Read from the bundle rather than resolved from the container: the bundle's
|
|
24
|
+
invoker is the one the composition root already bound to this invocation's
|
|
25
|
+
caller, and the container holds only the unbound singleton.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
bundle: Dependency bundle built for the caller by the deps factory.
|
|
29
|
+
label: Caller of the refused call, worded as it should appear in the
|
|
30
|
+
error (``"tool 'lookup'"``, ``"on_output hook 'incidents.record'"``).
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
The invoker bound to the caller.
|
|
34
|
+
|
|
35
|
+
Raises:
|
|
36
|
+
AgentRunError: ``UNAUTHORIZED`` when the bundle carries no invoker.
|
|
37
|
+
"""
|
|
38
|
+
invoker = getattr(bundle, "invoker", None)
|
|
39
|
+
if isinstance(invoker, ApplicationInvoker):
|
|
40
|
+
return invoker
|
|
41
|
+
raise AgentRunError(
|
|
42
|
+
AgentRunErrorCode.UNAUTHORIZED,
|
|
43
|
+
f"{label} requires a dependency bundle exposing an 'invoker' bound to its caller",
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
async def invoke_as(
|
|
48
|
+
invoker: ApplicationInvoker,
|
|
49
|
+
use_case: type[Compilable],
|
|
50
|
+
identity: Identity,
|
|
51
|
+
*,
|
|
52
|
+
params: dict[str, Any] | None,
|
|
53
|
+
payload: dict[str, Any] | None,
|
|
54
|
+
) -> object:
|
|
55
|
+
"""Invoke ``use_case`` through ``invoker`` with ``identity`` as the ambient caller.
|
|
56
|
+
|
|
57
|
+
The identity is installed only for the duration of the call and restored in
|
|
58
|
+
a ``finally`` block, so a reused task never inherits it.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
invoker: Invoker already bound to ``identity`` by the composition root.
|
|
62
|
+
use_case: Use case type to run.
|
|
63
|
+
identity: Caller to install as the ambient identity during the call.
|
|
64
|
+
params: Query-style parameters forwarded untouched.
|
|
65
|
+
payload: Body-style payload forwarded untouched.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
Whatever the use case returns.
|
|
69
|
+
"""
|
|
70
|
+
token = set_identity(identity)
|
|
71
|
+
try:
|
|
72
|
+
return await invoker.invoke(use_case, params=params, payload=payload)
|
|
73
|
+
finally:
|
|
74
|
+
reset_identity(token)
|
|
@@ -50,6 +50,7 @@ RUN_ERROR_DETAILS: Final[Mapping[AgentRunErrorCode, str]] = MappingProxyType(
|
|
|
50
50
|
AgentRunErrorCode.TOO_MANY_RUNS: "the agent is at its concurrency limit",
|
|
51
51
|
AgentRunErrorCode.UNAUTHORIZED: "the caller is not permitted to perform this run",
|
|
52
52
|
AgentRunErrorCode.CANCELLED: "the run was cancelled",
|
|
53
|
+
AgentRunErrorCode.HOOK_FAILED: "the output hook failed",
|
|
53
54
|
}
|
|
54
55
|
)
|
|
55
56
|
|
|
@@ -12,13 +12,16 @@ from __future__ import annotations
|
|
|
12
12
|
|
|
13
13
|
from collections.abc import AsyncIterator, Mapping
|
|
14
14
|
from contextlib import AbstractAsyncContextManager
|
|
15
|
-
from typing import Any, ClassVar, Literal, Protocol
|
|
15
|
+
from typing import Any, ClassVar, Final, Literal, Protocol
|
|
16
16
|
|
|
17
17
|
from loom.ai.errors import AgentRunErrorCode
|
|
18
18
|
from loom.core.di import LoomContainer
|
|
19
19
|
from loom.core.identity import Identity
|
|
20
20
|
from loom.core.model import LoomFrozenStruct
|
|
21
21
|
|
|
22
|
+
CONVERSATION_ID_MAX_LENGTH: Final[int] = 128
|
|
23
|
+
"""Longest ``conversation_id`` a run accepts; the value itself is opaque."""
|
|
24
|
+
|
|
22
25
|
|
|
23
26
|
class AgentUsage(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
24
27
|
"""Resource accounting of one agent run.
|
|
@@ -43,10 +46,15 @@ class AgentResult(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
|
43
46
|
output: Answer already decoded and validated against the declared
|
|
44
47
|
output shape.
|
|
45
48
|
usage: Resource accounting of the run.
|
|
49
|
+
interaction_id: Identifier the runtime minted for this run.
|
|
50
|
+
hook_result: Return value of the ``on_output`` use case, when the plan
|
|
51
|
+
declares one.
|
|
46
52
|
"""
|
|
47
53
|
|
|
48
54
|
output: object
|
|
49
55
|
usage: AgentUsage
|
|
56
|
+
interaction_id: str | None = None
|
|
57
|
+
hook_result: object | None = None
|
|
50
58
|
|
|
51
59
|
|
|
52
60
|
class TextDeltaEvent(
|
|
@@ -97,10 +105,13 @@ class ErrorEvent(LoomFrozenStruct, frozen=True, kw_only=True, tag="error", tag_f
|
|
|
97
105
|
Attributes:
|
|
98
106
|
code: Stable run-time failure code; the retry policy reads its class.
|
|
99
107
|
message: Human-readable description.
|
|
108
|
+
interaction_id: Identifier of the admitted run this failure belongs
|
|
109
|
+
to; ``None`` before admission.
|
|
100
110
|
"""
|
|
101
111
|
|
|
102
112
|
code: AgentRunErrorCode
|
|
103
113
|
message: str
|
|
114
|
+
interaction_id: str | None = None
|
|
104
115
|
|
|
105
116
|
|
|
106
117
|
class FinalEvent(LoomFrozenStruct, frozen=True, kw_only=True, tag="final", tag_field="type"):
|
|
@@ -110,10 +121,15 @@ class FinalEvent(LoomFrozenStruct, frozen=True, kw_only=True, tag="final", tag_f
|
|
|
110
121
|
output: Answer already decoded and validated against the declared
|
|
111
122
|
output shape.
|
|
112
123
|
usage: Resource accounting of the whole run.
|
|
124
|
+
interaction_id: Identifier the runtime minted for this run.
|
|
125
|
+
hook_result: Return value of the ``on_output`` use case, when the plan
|
|
126
|
+
declares one.
|
|
113
127
|
"""
|
|
114
128
|
|
|
115
129
|
output: object
|
|
116
130
|
usage: AgentUsage
|
|
131
|
+
interaction_id: str | None = None
|
|
132
|
+
hook_result: object | None = None
|
|
117
133
|
|
|
118
134
|
|
|
119
135
|
AgentEvent = TextDeltaEvent | ToolCallEvent | ToolResultEvent | ErrorEvent | FinalEvent
|
|
@@ -22,6 +22,7 @@ from loom.ai.compiler._plan import (
|
|
|
22
22
|
CompiledCapability,
|
|
23
23
|
CompiledMcpCapability,
|
|
24
24
|
CompiledOutput,
|
|
25
|
+
CompiledOutputHook,
|
|
25
26
|
CompiledPythonCapability,
|
|
26
27
|
CompiledRemoteAuth,
|
|
27
28
|
CompiledSkillsCapability,
|
|
@@ -40,6 +41,7 @@ __all__ = [
|
|
|
40
41
|
"CompiledCapability",
|
|
41
42
|
"CompiledMcpCapability",
|
|
42
43
|
"CompiledOutput",
|
|
44
|
+
"CompiledOutputHook",
|
|
43
45
|
"CompiledPythonCapability",
|
|
44
46
|
"CompiledRemoteAuth",
|
|
45
47
|
"CompiledSkillsCapability",
|
|
@@ -12,8 +12,14 @@ from collections import defaultdict
|
|
|
12
12
|
from collections.abc import Sequence
|
|
13
13
|
from types import MappingProxyType
|
|
14
14
|
|
|
15
|
-
from loom.ai.compiler._plan import
|
|
15
|
+
from loom.ai.compiler._plan import (
|
|
16
|
+
AgentPlan,
|
|
17
|
+
CompiledCapability,
|
|
18
|
+
CompiledOutput,
|
|
19
|
+
CompiledOutputHook,
|
|
20
|
+
)
|
|
16
21
|
from loom.ai.compiler.phases._capabilities import compile_capabilities
|
|
22
|
+
from loom.ai.compiler.phases._hook import compile_output_hook
|
|
17
23
|
from loom.ai.compiler.phases._limits import validate_policies
|
|
18
24
|
from loom.ai.compiler.phases._model_role import resolve_model_role
|
|
19
25
|
from loom.ai.compiler.phases._output import compile_output
|
|
@@ -122,6 +128,10 @@ class AgentCompiler:
|
|
|
122
128
|
issues: list[AgentCompilationIssue] = []
|
|
123
129
|
output, output_issues = compile_output(spec.output, component)
|
|
124
130
|
issues.extend(output_issues)
|
|
131
|
+
on_output, hook_issues = compile_output_hook(
|
|
132
|
+
spec, component=component, registry=self._registry
|
|
133
|
+
)
|
|
134
|
+
issues.extend(hook_issues)
|
|
125
135
|
issues.extend(validate_policies(spec.policies, component))
|
|
126
136
|
inference, role_issues = resolve_model_role(spec.model_role, self._config.models, component)
|
|
127
137
|
issues.extend(role_issues)
|
|
@@ -137,7 +147,8 @@ class AgentCompiler:
|
|
|
137
147
|
issues.extend(capability_issues)
|
|
138
148
|
if issues or output is None or inference is None:
|
|
139
149
|
return None, issues
|
|
140
|
-
|
|
150
|
+
plan = self._build_plan(spec, inference, output, capabilities, on_output, source_path)
|
|
151
|
+
return plan, []
|
|
141
152
|
|
|
142
153
|
@staticmethod
|
|
143
154
|
def _build_plan(
|
|
@@ -145,6 +156,7 @@ class AgentCompiler:
|
|
|
145
156
|
inference: InferenceTarget,
|
|
146
157
|
output: CompiledOutput,
|
|
147
158
|
capabilities: tuple[CompiledCapability, ...],
|
|
159
|
+
on_output: CompiledOutputHook | None,
|
|
148
160
|
source_path: str | None,
|
|
149
161
|
) -> AgentPlan:
|
|
150
162
|
return AgentPlan(
|
|
@@ -156,6 +168,7 @@ class AgentCompiler:
|
|
|
156
168
|
output=output,
|
|
157
169
|
capabilities=capabilities,
|
|
158
170
|
policies=spec.policies,
|
|
171
|
+
on_output=on_output,
|
|
159
172
|
metadata=MappingProxyType(dict(spec.metadata)),
|
|
160
173
|
source_path=source_path,
|
|
161
174
|
)
|