loom-kernel 1.9.0__tar.gz → 1.9.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1175) hide show
  1. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/CHANGELOG.md +60 -0
  2. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/PKG-INFO +1 -1
  3. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/ai/a2a.md +10 -5
  4. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/ai/mcp.md +141 -14
  5. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/ai/overview.md +68 -0
  6. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/ai/providers.md +39 -1
  7. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/getting-started/rest.md +20 -0
  8. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/pyproject.toml +2 -2
  9. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/config.py +24 -3
  10. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_mcp.py +7 -2
  11. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_spec.py +52 -3
  12. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/provider.py +13 -2
  13. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/errors.py +36 -0
  14. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/inference.py +29 -2
  15. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/remote_auth.py +110 -54
  16. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/runtime/_lifecycle.py +98 -21
  17. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/_resolver_utils.py +41 -13
  18. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/secrets.py +38 -14
  19. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/ssm.py +40 -13
  20. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/discovery/base.py +6 -0
  21. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/discovery/interfaces.py +10 -4
  22. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/discovery/modules.py +7 -3
  23. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/auto.py +88 -34
  24. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/helpers/remote_auth_plugin.py +3 -1
  25. loom_kernel-1.9.2/tests/integration/ai/_agents_only_app.py +175 -0
  26. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/conftest.py +8 -0
  27. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_a2a_auth_wiring.py +13 -1
  28. loom_kernel-1.9.2/tests/integration/ai/test_auto_agents_only.py +271 -0
  29. loom_kernel-1.9.2/tests/integration/ai/test_auto_without_sqlalchemy.py +33 -0
  30. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_remote_auth_wiring.py +79 -12
  31. loom_kernel-1.9.2/tests/integration/ai/test_runtime_remote_clients.py +579 -0
  32. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/engines/test_pydantic_ai_binding.py +128 -2
  33. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_config.py +115 -1
  34. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_remote_auth.py +93 -5
  35. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_resolver_utils.py +56 -0
  36. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_secrets.py +154 -0
  37. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_ssm.py +131 -5
  38. loom_kernel-1.9.2/tests/unit/core/discovery/test_interfaces.py +34 -0
  39. loom_kernel-1.9.2/tests/unit/core/discovery/test_modules.py +14 -0
  40. loom_kernel-1.9.2/tests/unit/rest/test_fastapi_auto_persistence.py +209 -0
  41. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/uv.lock +1 -1
  42. loom_kernel-1.9.0/tests/unit/rest/test_fastapi_auto_persistence.py +0 -104
  43. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.github/workflows/ci-main.yml +0 -0
  44. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.github/workflows/ci-pr.yml +0 -0
  45. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.github/workflows/docs.yml +0 -0
  46. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.github/workflows/release.yml +0 -0
  47. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.gitignore +0 -0
  48. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.pre-commit-config.yaml +0 -0
  49. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/.readthedocs.yaml +0 -0
  50. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/LICENSE +0 -0
  51. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/Makefile +0 -0
  52. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/README.md +0 -0
  53. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/codecov.yml +0 -0
  54. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docker-compose.local.yaml +0 -0
  55. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/_static/.gitkeep +0 -0
  56. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/_static/custom.css +0 -0
  57. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/_static/logo-transparent.png +0 -0
  58. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/_static/logo.svg +0 -0
  59. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/ai/artifacts.md +0 -0
  60. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/ai/observability.md +0 -0
  61. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/architecture/adr/README.md +0 -0
  62. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/architecture/clean-architecture.md +0 -0
  63. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/architecture/overview.md +0 -0
  64. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/conf.py +0 -0
  65. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/etl/examples.md +0 -0
  66. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/etl/pipelines.md +0 -0
  67. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/etl/testing.md +0 -0
  68. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/examples-repo/index.md +0 -0
  69. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/getting-started/etl.md +0 -0
  70. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/getting-started/streaming.md +0 -0
  71. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/guides/autocrud.md +0 -0
  72. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/guides/celery.md +0 -0
  73. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/guides/etl.md +0 -0
  74. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/guides/fake-repo-examples.md +0 -0
  75. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/guides/quickstart.md +0 -0
  76. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/guides/use-case-dsl.md +0 -0
  77. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/index.rst +0 -0
  78. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/overview.md +0 -0
  79. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/ai.rst +0 -0
  80. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/core.rst +0 -0
  81. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/etl.rst +0 -0
  82. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/repository.rst +0 -0
  83. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/rest.rst +0 -0
  84. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/streaming.rst +0 -0
  85. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/api/testing.rst +0 -0
  86. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/reference/index.rst +0 -0
  87. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/requirements.txt +0 -0
  88. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/autocrud.md +0 -0
  89. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/celery.md +0 -0
  90. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/examples.md +0 -0
  91. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/identity.md +0 -0
  92. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/sql.md +0 -0
  93. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/testing.md +0 -0
  94. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/rest/use-case-dsl.md +0 -0
  95. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/streaming/bytewax.md +0 -0
  96. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/streaming/delivery.md +0 -0
  97. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/docs/streaming/tracing.md +0 -0
  98. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/scripts/release/checkout_merged_release.py +0 -0
  99. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/sonar-project.properties +0 -0
  100. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/__init__.py +0 -0
  101. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/__init__.py +0 -0
  102. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/_filters.py +0 -0
  103. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/_transport.py +0 -0
  104. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/_usecase.py +0 -0
  105. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/__init__.py +0 -0
  106. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/_binding.py +0 -0
  107. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/_handlers.py +0 -0
  108. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/_rpc.py +0 -0
  109. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/card.py +0 -0
  110. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/events.py +0 -0
  111. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/a2a/server.py +0 -0
  112. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/abc.py +0 -0
  113. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/__init__.py +0 -0
  114. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/_compiler.py +0 -0
  115. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/_plan.py +0 -0
  116. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/_symbols.py +0 -0
  117. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/phases/__init__.py +0 -0
  118. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/phases/_capabilities.py +0 -0
  119. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/phases/_hook.py +0 -0
  120. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/phases/_limits.py +0 -0
  121. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/phases/_model_role.py +0 -0
  122. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/compiler/phases/_output.py +0 -0
  123. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/declarative/__init__.py +0 -0
  124. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/declarative/_envelope.py +0 -0
  125. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/declarative/_schema.py +0 -0
  126. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/declarative/_v1.py +0 -0
  127. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
  128. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/describe.py +0 -0
  129. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/__init__.py +0 -0
  130. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
  131. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
  132. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
  133. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
  134. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
  135. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
  136. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
  137. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
  138. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
  139. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
  140. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
  141. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/fastapi/__init__.py +0 -0
  142. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/fastapi/endpoints.py +0 -0
  143. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/fastapi/response.py +0 -0
  144. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/fastapi/streaming.py +0 -0
  145. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/registry.py +0 -0
  146. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/runtime/__init__.py +0 -0
  147. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/runtime/_health.py +0 -0
  148. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/runtime/_hooks.py +0 -0
  149. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/runtime/_limits.py +0 -0
  150. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/runtime/_mcp.py +0 -0
  151. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/validate/__init__.py +0 -0
  152. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/ai/validate/__main__.py +0 -0
  153. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/__init__.py +0 -0
  154. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/auto.py +0 -0
  155. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/bootstrap.py +0 -0
  156. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/config.py +0 -0
  157. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/constants.py +0 -0
  158. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/runner.py +0 -0
  159. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/celery/service.py +0 -0
  160. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/async_bridge.py +0 -0
  161. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/backend/__init__.py +0 -0
  162. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/backend/core_model.py +0 -0
  163. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/backend/protocol.py +0 -0
  164. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/backend/sqlalchemy.py +0 -0
  165. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/bootstrap/__init__.py +0 -0
  166. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/bootstrap/bootstrap.py +0 -0
  167. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/bootstrap/kernel.py +0 -0
  168. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/__init__.py +0 -0
  169. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/abc/__init__.py +0 -0
  170. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/abc/backend.py +0 -0
  171. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/abc/config.py +0 -0
  172. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/abc/dependency.py +0 -0
  173. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/codec.py +0 -0
  174. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/decorators.py +0 -0
  175. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/dependency.py +0 -0
  176. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/gateway.py +0 -0
  177. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/keys.py +0 -0
  178. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/repository.py +0 -0
  179. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/cache/serializer.py +0 -0
  180. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/command/__init__.py +0 -0
  181. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/command/adapter.py +0 -0
  182. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/command/base.py +0 -0
  183. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/command/field.py +0 -0
  184. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/command/introspection.py +0 -0
  185. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/compiler.py +0 -0
  186. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/__init__.py +0 -0
  187. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/binder.py +0 -0
  188. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/configurable.py +0 -0
  189. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/context.py +0 -0
  190. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/errors.py +0 -0
  191. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/keys.py +0 -0
  192. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/loader.py +0 -0
  193. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/model.py +0 -0
  194. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/observability.py +0 -0
  195. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/config/resolver.py +0 -0
  196. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/contracts/__init__.py +0 -0
  197. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/contracts/manifest.py +0 -0
  198. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/di/__init__.py +0 -0
  199. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/di/container.py +0 -0
  200. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/di/scope.py +0 -0
  201. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/discovery/__init__.py +0 -0
  202. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/discovery/_utils.py +0 -0
  203. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/discovery/manifest.py +0 -0
  204. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/__init__.py +0 -0
  205. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/compilable.py +0 -0
  206. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/compiler.py +0 -0
  207. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/events.py +0 -0
  208. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/executor.py +0 -0
  209. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/metrics.py +0 -0
  210. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/engine/plan.py +0 -0
  211. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/errors/__init__.py +0 -0
  212. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/errors/codes.py +0 -0
  213. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/errors/errors.py +0 -0
  214. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/expr/__init__.py +0 -0
  215. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/expr/eval.py +0 -0
  216. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/expr/nodes.py +0 -0
  217. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/expr/refs.py +0 -0
  218. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/identity/__init__.py +0 -0
  219. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/identity/context.py +0 -0
  220. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/identity/identity.py +0 -0
  221. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/identity/issuer.py +0 -0
  222. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/identity/wire.py +0 -0
  223. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/introspection/__init__.py +0 -0
  224. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/introspection/base.py +0 -0
  225. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/introspection/describe.py +0 -0
  226. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/job/__init__.py +0 -0
  227. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/job/callback.py +0 -0
  228. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/job/context.py +0 -0
  229. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/job/handle.py +0 -0
  230. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/job/job.py +0 -0
  231. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/job/service.py +0 -0
  232. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/logger/__init__.py +0 -0
  233. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/logger/abc.py +0 -0
  234. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/logger/config.py +0 -0
  235. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/logger/registry.py +0 -0
  236. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/logger/structlogger.py +0 -0
  237. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/__init__.py +0 -0
  238. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/base.py +0 -0
  239. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/enums.py +0 -0
  240. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/field.py +0 -0
  241. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/introspection.py +0 -0
  242. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/projection.py +0 -0
  243. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/relation.py +0 -0
  244. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/struct.py +0 -0
  245. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/timestamped.py +0 -0
  246. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/types.py +0 -0
  247. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/model/types_postgres.py +0 -0
  248. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/__init__.py +0 -0
  249. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/config.py +0 -0
  250. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/event.py +0 -0
  251. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/observer/__init__.py +0 -0
  252. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/observer/noop.py +0 -0
  253. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/observer/otel.py +0 -0
  254. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/observer/structlog.py +0 -0
  255. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/otel_ids.py +0 -0
  256. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/protocol.py +0 -0
  257. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/runtime.py +0 -0
  258. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/span.py +0 -0
  259. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/observability/topology.py +0 -0
  260. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/plugins/__init__.py +0 -0
  261. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/plugins/entrypoints.py +0 -0
  262. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/projection/__init__.py +0 -0
  263. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/projection/loaders.py +0 -0
  264. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/projection/runtime.py +0 -0
  265. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/__init__.py +0 -0
  266. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/abc/__init__.py +0 -0
  267. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/abc/query.py +0 -0
  268. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/abc/repo_for.py +0 -0
  269. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/abc/repository.py +0 -0
  270. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/dynamodb/__init__.py +0 -0
  271. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/dynamodb/registry.py +0 -0
  272. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/dynamodb/repository.py +0 -0
  273. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/dynamodb/uow.py +0 -0
  274. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/mutation.py +0 -0
  275. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/registration.py +0 -0
  276. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/registry.py +0 -0
  277. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
  278. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
  279. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
  280. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
  281. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/model.py +0 -0
  282. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
  283. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
  284. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
  285. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
  286. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
  287. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
  288. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
  289. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
  290. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
  291. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
  292. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
  293. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
  294. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
  295. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
  296. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
  297. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/response/__init__.py +0 -0
  298. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/response/base.py +0 -0
  299. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/routing/__init__.py +0 -0
  300. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/routing/ref.py +0 -0
  301. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/routing/resolver.py +0 -0
  302. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/runner.py +0 -0
  303. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/schema/__init__.py +0 -0
  304. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/schema/schema_mode.py +0 -0
  305. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/__init__.py +0 -0
  306. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/abc/__init__.py +0 -0
  307. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/abc/contracts.py +0 -0
  308. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/abc/errors.py +0 -0
  309. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/clickhouse/__init__.py +0 -0
  310. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/clickhouse/_client.py +0 -0
  311. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/clickhouse/executor.py +0 -0
  312. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/clickhouse/registry.py +0 -0
  313. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/config.py +0 -0
  314. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/roles.py +0 -0
  315. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/sql/service.py +0 -0
  316. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/tracing/__init__.py +0 -0
  317. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/tracing/context.py +0 -0
  318. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/transport/__init__.py +0 -0
  319. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/transport/adapter.py +0 -0
  320. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/uow/__init__.py +0 -0
  321. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/uow/abc.py +0 -0
  322. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/uow/context.py +0 -0
  323. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/__init__.py +0 -0
  324. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/_predicates.py +0 -0
  325. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/compute.py +0 -0
  326. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/constants.py +0 -0
  327. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/factory.py +0 -0
  328. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/field_ref.py +0 -0
  329. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/invoker.py +0 -0
  330. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/keys.py +0 -0
  331. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/markers.py +0 -0
  332. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/registry.py +0 -0
  333. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/rule.py +0 -0
  334. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/core/use_case/use_case.py +0 -0
  335. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/__init__.py +0 -0
  336. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/__init__.py +0 -0
  337. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_format_registry.py +0 -0
  338. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_historify/__init__.py +0 -0
  339. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_historify/_common.py +0 -0
  340. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_historify/_log.py +0 -0
  341. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_historify/_ops.py +0 -0
  342. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
  343. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_historify/_transform.py +0 -0
  344. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_merge.py +0 -0
  345. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_path_template.py +0 -0
  346. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_predicate.py +0 -0
  347. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
  348. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
  349. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
  350. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/_write_policy.py +0 -0
  351. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/__init__.py +0 -0
  352. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_dtype.py +0 -0
  353. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_file_writer.py +0 -0
  354. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_historify.py +0 -0
  355. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_predicate.py +0 -0
  356. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_reader.py +0 -0
  357. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_schema.py +0 -0
  358. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
  359. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_streaming.py +0 -0
  360. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/_writer.py +0 -0
  361. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/polars/provider.py +0 -0
  362. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/__init__.py +0 -0
  363. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/_dtype.py +0 -0
  364. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/_historify.py +0 -0
  365. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/_reader.py +0 -0
  366. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/_schema.py +0 -0
  367. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
  368. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/_writer.py +0 -0
  369. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/backends/spark/provider.py +0 -0
  370. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/__init__.py +0 -0
  371. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
  372. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
  373. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/_cleaners.py +0 -0
  374. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/_paths.py +0 -0
  375. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/_scope.py +0 -0
  376. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/checkpoint/_store.py +0 -0
  377. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/__init__.py +0 -0
  378. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_binding.py +0 -0
  379. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_compiler.py +0 -0
  380. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_errors.py +0 -0
  381. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_plan.py +0 -0
  382. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_validators.py +0 -0
  383. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_validators_plan.py +0 -0
  384. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/compiler/_validators_step.py +0 -0
  385. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/__init__.py +0 -0
  386. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/_format.py +0 -0
  387. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/_read_options.py +0 -0
  388. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/_utils.py +0 -0
  389. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/_write_options.py +0 -0
  390. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/expr/__init__.py +0 -0
  391. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/expr/_params.py +0 -0
  392. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/expr/_predicate.py +0 -0
  393. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
  394. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/expr/_refs.py +0 -0
  395. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/source/__init__.py +0 -0
  396. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/source/_from.py +0 -0
  397. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
  398. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
  399. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
  400. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/source/_specs.py +0 -0
  401. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/__init__.py +0 -0
  402. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_client.py +0 -0
  403. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_file.py +0 -0
  404. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
  405. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
  406. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
  407. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
  408. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_history/_report.py +0 -0
  409. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
  410. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_into.py +0 -0
  411. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
  412. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_table.py +0 -0
  413. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/declarative/target/_temp.py +0 -0
  414. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/executor/__init__.py +0 -0
  415. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/executor/_dispatcher.py +0 -0
  416. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/executor/_executor.py +0 -0
  417. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/__init__.py +0 -0
  418. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/_registry.py +0 -0
  419. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/__init__.py +0 -0
  420. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_clickhouse.py +0 -0
  421. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_dynamodb.py +0 -0
  422. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
  423. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
  424. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_mongo.py +0 -0
  425. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
  426. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
  427. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
  428. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/sources/_serialization.py +0 -0
  429. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/targets/__init__.py +0 -0
  430. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/io/targets/_clickhouse.py +0 -0
  431. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/__init__.py +0 -0
  432. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/_config.py +0 -0
  433. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/_observer.py +0 -0
  434. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/_records.py +0 -0
  435. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/sinks/__init__.py +0 -0
  436. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
  437. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/sinks/_table.py +0 -0
  438. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/lineage/sinks/_writer.py +0 -0
  439. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/__init__.py +0 -0
  440. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/_builder.py +0 -0
  441. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/_ops.py +0 -0
  442. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/_protocol.py +0 -0
  443. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/_runner.py +0 -0
  444. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/_step.py +0 -0
  445. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/backends/__init__.py +0 -0
  446. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
  447. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/__init__.py +0 -0
  448. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_generics.py +0 -0
  449. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_params.py +0 -0
  450. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_pipeline.py +0 -0
  451. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_process.py +0 -0
  452. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_sql.py +0 -0
  453. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_step.py +0 -0
  454. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_step_client.py +0 -0
  455. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/pipeline/_step_sql.py +0 -0
  456. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/__init__.py +0 -0
  457. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/_providers.py +0 -0
  458. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/_wiring.py +0 -0
  459. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/config_loader.py +0 -0
  460. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/core.py +0 -0
  461. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/errors.py +0 -0
  462. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runner/filtering.py +0 -0
  463. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runtime/__init__.py +0 -0
  464. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/runtime/contracts.py +0 -0
  465. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/schema/__init__.py +0 -0
  466. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/schema/_contract.py +0 -0
  467. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/schema/_schema.py +0 -0
  468. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/storage/__init__.py +0 -0
  469. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/storage/_config.py +0 -0
  470. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/storage/_file_locator.py +0 -0
  471. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/storage/_locator.py +0 -0
  472. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/storage/routing.py +0 -0
  473. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/testing/__init__.py +0 -0
  474. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/testing/_result.py +0 -0
  475. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/testing/_runners.py +0 -0
  476. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/testing/_scenario.py +0 -0
  477. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/testing/_stubs.py +0 -0
  478. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/etl/testing/spark.py +0 -0
  479. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/__init__.py +0 -0
  480. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/_async.py +0 -0
  481. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/_config.py +0 -0
  482. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/_ctx.py +0 -0
  483. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/_meta.py +0 -0
  484. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/_placeholders.py +0 -0
  485. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/_summary.py +0 -0
  486. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/deploy/__init__.py +0 -0
  487. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/deploy/_discovery.py +0 -0
  488. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/deploy/_schedule.py +0 -0
  489. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/deploy/_yaml.py +0 -0
  490. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/__init__.py +0 -0
  491. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_assemble.py +0 -0
  492. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_backfill.py +0 -0
  493. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_backfill_body.py +0 -0
  494. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_body.py +0 -0
  495. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_common.py +0 -0
  496. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_factory.py +0 -0
  497. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_hooks.py +0 -0
  498. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_maintenance.py +0 -0
  499. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_run_name.py +0 -0
  500. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_runtime.py +0 -0
  501. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_signature.py +0 -0
  502. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/flow/_stages.py +0 -0
  503. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/manifest/__init__.py +0 -0
  504. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/manifest/_model.py +0 -0
  505. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/manifest/_s3.py +0 -0
  506. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/manifest/_store.py +0 -0
  507. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/notify/__init__.py +0 -0
  508. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/notify/_event.py +0 -0
  509. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/notify/_factory.py +0 -0
  510. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/notify/_port.py +0 -0
  511. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/notify/_slack.py +0 -0
  512. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/observer/__init__.py +0 -0
  513. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/observer/_flow.py +0 -0
  514. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/observer/_logging_bridge.py +0 -0
  515. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/observer/_manifest.py +0 -0
  516. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prefect/observer/_task_run.py +0 -0
  517. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prometheus/__init__.py +0 -0
  518. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prometheus/adapter.py +0 -0
  519. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prometheus/kafka.py +0 -0
  520. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prometheus/lifecycle.py +0 -0
  521. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/prometheus/middleware.py +0 -0
  522. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/py.typed +0 -0
  523. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/__init__.py +0 -0
  524. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/_body.py +0 -0
  525. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/adapter.py +0 -0
  526. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/auth/__init__.py +0 -0
  527. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/auth/abc.py +0 -0
  528. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/auth/config.py +0 -0
  529. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/auth/jwt.py +0 -0
  530. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/auth/middleware.py +0 -0
  531. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/autocrud.py +0 -0
  532. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/compiler.py +0 -0
  533. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/constants.py +0 -0
  534. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/cors.py +0 -0
  535. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/errors.py +0 -0
  536. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/__init__.py +0 -0
  537. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/_errors.py +0 -0
  538. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/_exclusions.py +0 -0
  539. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/app.py +0 -0
  540. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/openapi.py +0 -0
  541. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/response.py +0 -0
  542. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/router_runtime.py +0 -0
  543. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/fastapi/sql.py +0 -0
  544. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/middleware.py +0 -0
  545. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/model.py +0 -0
  546. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/rest/rest_adapter.py +0 -0
  547. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/__init__.py +0 -0
  548. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/__init__.py +0 -0
  549. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_adapter.py +0 -0
  550. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
  551. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
  552. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_dlq.py +0 -0
  553. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
  554. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_errors.py +0 -0
  555. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_operators.py +0 -0
  556. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
  557. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
  558. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
  559. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
  560. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
  561. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
  562. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
  563. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
  564. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
  565. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
  566. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
  567. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
  568. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/bytewax/runner.py +0 -0
  569. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/__init__.py +0 -0
  570. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/_bindings.py +0 -0
  571. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/_compiler.py +0 -0
  572. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/_errors.py +0 -0
  573. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/_plan.py +0 -0
  574. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
  575. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/compiler/phases/validate.py +0 -0
  576. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/core/__init__.py +0 -0
  577. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/core/_errors.py +0 -0
  578. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/core/_exceptions.py +0 -0
  579. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/core/_message.py +0 -0
  580. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/core/_tracing.py +0 -0
  581. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/core/_typing.py +0 -0
  582. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/graph/__init__.py +0 -0
  583. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/graph/_flow.py +0 -0
  584. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/__init__.py +0 -0
  585. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_codec.py +0 -0
  586. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_config.py +0 -0
  587. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_errors.py +0 -0
  588. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_key_resolver.py +0 -0
  589. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_message.py +0 -0
  590. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_record.py +0 -0
  591. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/_wire.py +0 -0
  592. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/client/__init__.py +0 -0
  593. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/client/_consumer.py +0 -0
  594. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/client/_producer.py +0 -0
  595. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/client/_protocol.py +0 -0
  596. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/client/_retry.py +0 -0
  597. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/message/__init__.py +0 -0
  598. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/message/_consumer.py +0 -0
  599. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/message/_producer.py +0 -0
  600. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/kafka/message/_protocol.py +0 -0
  601. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/mongo/__init__.py +0 -0
  602. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
  603. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/mongo/_config.py +0 -0
  604. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/mongo/_event.py +0 -0
  605. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/mongo/_normalize.py +0 -0
  606. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/__init__.py +0 -0
  607. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_boundary.py +0 -0
  608. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_broadcast.py +0 -0
  609. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_capabilities.py +0 -0
  610. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_decompose.py +0 -0
  611. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_expand_routes.py +0 -0
  612. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_expr_eval.py +0 -0
  613. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_fork.py +0 -0
  614. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_helpers.py +0 -0
  615. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_mongo.py +0 -0
  616. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_protocols.py +0 -0
  617. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_router.py +0 -0
  618. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_shape.py +0 -0
  619. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_sink.py +0 -0
  620. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_step.py +0 -0
  621. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_table/__init__.py +0 -0
  622. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_table/common.py +0 -0
  623. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_table/config.py +0 -0
  624. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/_with.py +0 -0
  625. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/nodes/refs.py +0 -0
  626. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/streaming/testing.py +0 -0
  627. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/__init__.py +0 -0
  628. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/agents.py +0 -0
  629. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/golden.py +0 -0
  630. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/http_harness.py +0 -0
  631. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/in_memory.py +0 -0
  632. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/repository_harness.py +0 -0
  633. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/src/loom/testing/runner.py +0 -0
  634. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/__init__.py +0 -0
  635. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/conftest.py +0 -0
  636. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/contract/__init__.py +0 -0
  637. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/contract/ai/__init__.py +0 -0
  638. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/contract/ai/test_contract_fake.py +0 -0
  639. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/contract/ai/test_contract_pydantic_ai.py +0 -0
  640. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/contract/observability/__init__.py +0 -0
  641. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/contract/observability/test_otel_sdk_contract.py +0 -0
  642. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/golden/__init__.py +0 -0
  643. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/golden/baselines/.gitkeep +0 -0
  644. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/golden/outputs/.gitkeep +0 -0
  645. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/golden/plans/.gitkeep +0 -0
  646. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/helpers/__init__.py +0 -0
  647. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/helpers/pydantic_ai_engine.py +0 -0
  648. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/helpers/spans.py +0 -0
  649. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/__init__.py +0 -0
  650. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/__init__.py +0 -0
  651. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_a2a.py +0 -0
  652. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_agent_specs_source.py +0 -0
  653. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_auto_a2a.py +0 -0
  654. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_auto_client_factories.py +0 -0
  655. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_auto_gate.py +0 -0
  656. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_capabilities.py +0 -0
  657. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_describe.py +0 -0
  658. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_endpoints.py +0 -0
  659. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_grant_wiring.py +0 -0
  660. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_health_probe.py +0 -0
  661. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_hooks.py +0 -0
  662. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_limits.py +0 -0
  663. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_live_provider.py +0 -0
  664. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_mcp_end_to_end.py +0 -0
  665. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_provider_portability.py +0 -0
  666. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_runtime.py +0 -0
  667. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_streaming.py +0 -0
  668. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/ai/test_transport.py +0 -0
  669. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/celery_bootstrap/__init__.py +0 -0
  670. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/celery_bootstrap/config/conf.celery.integration.yaml +0 -0
  671. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/celery_bootstrap/test_auto_create_app_integration.py +0 -0
  672. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/celery_bootstrap/test_bootstrap_worker.py +0 -0
  673. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/conftest.py +0 -0
  674. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/__init__.py +0 -0
  675. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/bootstrap/__init__.py +0 -0
  676. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/bootstrap/test_bootstrap_integration.py +0 -0
  677. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/repository/__init__.py +0 -0
  678. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/repository/sqlalchemy/__init__.py +0 -0
  679. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/repository/sqlalchemy/conftest.py +0 -0
  680. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/repository/sqlalchemy/test_cache_integration.py +0 -0
  681. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/repository/sqlalchemy/test_repository_integration.py +0 -0
  682. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/rest/__init__.py +0 -0
  683. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/rest/test_auto_interface_integration.py +0 -0
  684. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/rest/test_fastapi_app_integration.py +0 -0
  685. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/rest/test_rest_error_mapping.py +0 -0
  686. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/rest/test_rest_observability.py +0 -0
  687. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/use_case/__init__.py +0 -0
  688. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/use_case/test_custom_repository_integration.py +0 -0
  689. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/core/use_case/test_use_case_crud_integration.py +0 -0
  690. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/etl/__init__.py +0 -0
  691. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/etl/test_runner_integration.py +0 -0
  692. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/__init__.py +0 -0
  693. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/config/__init__.py +0 -0
  694. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/config/conf.interfaces.yaml +0 -0
  695. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/config/conf.manifest.yaml +0 -0
  696. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/config/conf.modules.yaml +0 -0
  697. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/config/conf.yaml +0 -0
  698. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/main.py +0 -0
  699. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/manifest.py +0 -0
  700. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/__init__.py +0 -0
  701. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/category/__init__.py +0 -0
  702. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/category/model.py +0 -0
  703. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/category/schemas.py +0 -0
  704. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/interface.py +0 -0
  705. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/jobs.py +0 -0
  706. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/model.py +0 -0
  707. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/relations.py +0 -0
  708. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/repository.py +0 -0
  709. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/repository_contract.py +0 -0
  710. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/review/__init__.py +0 -0
  711. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/review/model.py +0 -0
  712. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/review/schemas.py +0 -0
  713. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/schemas.py +0 -0
  714. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/fake_repo/product/use_cases.py +0 -0
  715. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/sql/__init__.py +0 -0
  716. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/sql/init/01_users_roles.sql +0 -0
  717. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/sql/test_clickhouse_integration.py +0 -0
  718. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/streaming/__init__.py +0 -0
  719. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/streaming/kafka/__init__.py +0 -0
  720. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/streaming/kafka/conftest.py +0 -0
  721. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/streaming/kafka/test_partitioned_source_integration.py +0 -0
  722. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/streaming/kafka/test_source_contract_integration.py +0 -0
  723. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/streaming/test_into_table_integration.py +0 -0
  724. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/support/__init__.py +0 -0
  725. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/integration/support/logical_repo_fixtures.py +0 -0
  726. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/__init__.py +0 -0
  727. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/__init__.py +0 -0
  728. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/conftest.py +0 -0
  729. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/engines/__init__.py +0 -0
  730. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/engines/test_a2a_capability.py +0 -0
  731. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/engines/test_capability_span_nesting.py +0 -0
  732. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/engines/test_pydantic_ai_failures.py +0 -0
  733. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/engines/test_pydantic_ai_translation.py +0 -0
  734. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/README.md +0 -0
  735. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-a2a-agent/agent.yaml +0 -0
  736. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-mcp-agent/agent.yaml +0 -0
  737. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-python-agent/agent.yaml +0 -0
  738. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-skills-agent/agent.yaml +0 -0
  739. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-skills-agent/skills/release-notes/SKILL.md +0 -0
  740. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-sql-agent/agent.yaml +0 -0
  741. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/capability-usecase-agent/agent.yaml +0 -0
  742. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/full-agent/agent.yaml +0 -0
  743. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/full-agent/skills/severity-rubric/SKILL.md +0 -0
  744. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/minimal-agent/agent.yaml +0 -0
  745. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/corpus_v1/output-type-ref-agent/agent.yaml +0 -0
  746. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/__init__.py +0 -0
  747. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/__init__.py +0 -0
  748. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/incidents.py +0 -0
  749. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/invoices.py +0 -0
  750. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/triage.py +0 -0
  751. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/domain/unsupported.py +0 -0
  752. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/__init__.py +0 -0
  753. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/broken.py +0 -0
  754. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/geo.py +0 -0
  755. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/fake_pkgs/myapp/tools/metrics.py +0 -0
  756. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/skills_root/shared/group-changes/SKILL.md +0 -0
  757. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/fixtures/skills_root/shared/tone-of-voice/SKILL.md +0 -0
  758. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/__init__.py +0 -0
  759. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/conftest.py +0 -0
  760. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_capabilities.py +0 -0
  761. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_hook.py +0 -0
  762. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_limits.py +0 -0
  763. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_model_role.py +0 -0
  764. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_output.py +0 -0
  765. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_remote_auth_plan.py +0 -0
  766. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/phases/test_validate_cli.py +0 -0
  767. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/runtime/__init__.py +0 -0
  768. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/runtime/test_hook_command.py +0 -0
  769. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_a2a_base_url.py +0 -0
  770. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_a2a_card.py +0 -0
  771. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_compiler.py +0 -0
  772. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_compiler_offline.py +0 -0
  773. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_declarative_envelope.py +0 -0
  774. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_declarative_hook.py +0 -0
  775. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_describe.py +0 -0
  776. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_error_catalogue_totality.py +0 -0
  777. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_error_factories.py +0 -0
  778. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_fake_engine.py +0 -0
  779. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_loopback_plaintext.py +0 -0
  780. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_no_extras_import.py +0 -0
  781. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_public_surface.py +0 -0
  782. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_registry.py +0 -0
  783. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_remote_auth_settings.py +0 -0
  784. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_run_error_hook.py +0 -0
  785. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_schema_emission.py +0 -0
  786. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_secret_containment.py +0 -0
  787. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_spec_v1_corpus.py +0 -0
  788. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ai/test_usecase_helpers.py +0 -0
  789. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_bootstrap/__init__.py +0 -0
  790. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_bootstrap/test_async_runtime.py +0 -0
  791. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_bootstrap/test_bootstrap.py +0 -0
  792. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_jobs/__init__.py +0 -0
  793. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_jobs/test_auto.py +0 -0
  794. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_jobs/test_celery_service.py +0 -0
  795. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_jobs/test_config.py +0 -0
  796. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_jobs/test_identity_propagation.py +0 -0
  797. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/celery_jobs/test_runner.py +0 -0
  798. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/ci/test_workflow_supply_chain_contract.py +0 -0
  799. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/__init__.py +0 -0
  800. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/backend/__init__.py +0 -0
  801. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/backend/test_backend_compiler.py +0 -0
  802. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/bootstrap/__init__.py +0 -0
  803. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/bootstrap/test_bootstrap.py +0 -0
  804. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/bootstrap/test_bootstrap_metrics.py +0 -0
  805. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/bootstrap/test_kernel.py +0 -0
  806. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/cache/__init__.py +0 -0
  807. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/cache/test_cached_repository.py +0 -0
  808. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/cache/test_config_wiring.py +0 -0
  809. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/cache/test_gateway_config.py +0 -0
  810. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/command/__init__.py +0 -0
  811. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/command/test_command_base.py +0 -0
  812. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/command/test_command_field.py +0 -0
  813. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/command/test_command_patch.py +0 -0
  814. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/command/test_introspection.py +0 -0
  815. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/__init__.py +0 -0
  816. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_binder.py +0 -0
  817. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_config.py +0 -0
  818. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_configurable.py +0 -0
  819. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/config/test_context.py +0 -0
  820. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/di/__init__.py +0 -0
  821. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/di/test_container.py +0 -0
  822. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/discovery/__init__.py +0 -0
  823. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/discovery/test_manifest.py +0 -0
  824. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/__init__.py +0 -0
  825. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_caller_binding.py +0 -0
  826. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_compiler.py +0 -0
  827. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_executor.py +0 -0
  828. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_executor_trace.py +0 -0
  829. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_executor_uow.py +0 -0
  830. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_metrics.py +0 -0
  831. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/engine/test_plan.py +0 -0
  832. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/errors/__init__.py +0 -0
  833. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/errors/test_errors.py +0 -0
  834. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/expr/__init__.py +0 -0
  835. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/expr/test_expr.py +0 -0
  836. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/identity/__init__.py +0 -0
  837. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/identity/test_context.py +0 -0
  838. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/identity/test_identity.py +0 -0
  839. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/identity/test_wire.py +0 -0
  840. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/introspection/__init__.py +0 -0
  841. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/introspection/test_describe.py +0 -0
  842. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/__init__.py +0 -0
  843. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/conftest.py +0 -0
  844. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/test_callback.py +0 -0
  845. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/test_context.py +0 -0
  846. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/test_handle.py +0 -0
  847. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/test_inline_service.py +0 -0
  848. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/job/test_job.py +0 -0
  849. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/logger/__init__.py +0 -0
  850. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/logger/test_config.py +0 -0
  851. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/logger/test_registry.py +0 -0
  852. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/model/__init__.py +0 -0
  853. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/model/test_model.py +0 -0
  854. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/model/test_struct.py +0 -0
  855. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/model/test_timestamped.py +0 -0
  856. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/__init__.py +0 -0
  857. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_message_id_generator.py +0 -0
  858. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_observers.py +0 -0
  859. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_optional_otel_sdk.py +0 -0
  860. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_otel_loader_branches.py +0 -0
  861. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_provider_modes.py +0 -0
  862. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_runtime.py +0 -0
  863. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/observability/test_tracing_characterisation.py +0 -0
  864. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/plugins/__init__.py +0 -0
  865. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/plugins/test_entrypoints.py +0 -0
  866. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/plugins/test_import_containment.py +0 -0
  867. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/projection/__init__.py +0 -0
  868. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/projection/test_runtime.py +0 -0
  869. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/__init__.py +0 -0
  870. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/abc/__init__.py +0 -0
  871. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/abc/conftest.py +0 -0
  872. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/abc/test_query.py +0 -0
  873. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/abc/test_repository_contract.py +0 -0
  874. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/dynamodb/__init__.py +0 -0
  875. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/dynamodb/conftest.py +0 -0
  876. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/dynamodb/test_registry.py +0 -0
  877. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/dynamodb/test_repository.py +0 -0
  878. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/sqlalchemy/__init__.py +0 -0
  879. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/sqlalchemy/conftest.py +0 -0
  880. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/sqlalchemy/test_loaders.py +0 -0
  881. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/sqlalchemy/test_repository.py +0 -0
  882. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/repository/sqlalchemy/test_transactional.py +0 -0
  883. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/routing/__init__.py +0 -0
  884. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/routing/test_routing.py +0 -0
  885. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/__init__.py +0 -0
  886. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/_fakes.py +0 -0
  887. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/conftest.py +0 -0
  888. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_clickhouse_executor.py +0 -0
  889. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_clickhouse_transport.py +0 -0
  890. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_config.py +0 -0
  891. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_isolation.py +0 -0
  892. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_null_service.py +0 -0
  893. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_pagination_limits.py +0 -0
  894. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_registry_lifecycle.py +0 -0
  895. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/sql/test_role_policy.py +0 -0
  896. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/test_async_bridge.py +0 -0
  897. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/test_compiler_contracts.py +0 -0
  898. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/test_runner_contracts.py +0 -0
  899. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/tracing/__init__.py +0 -0
  900. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/tracing/test_context.py +0 -0
  901. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/uow/__init__.py +0 -0
  902. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/uow/test_executor_uow.py +0 -0
  903. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/uow/test_sqlalchemy_uow.py +0 -0
  904. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/uow/test_uow_protocols.py +0 -0
  905. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/__init__.py +0 -0
  906. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_compute.py +0 -0
  907. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_factory.py +0 -0
  908. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_field_ref.py +0 -0
  909. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_invoker.py +0 -0
  910. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_markers.py +0 -0
  911. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_rule.py +0 -0
  912. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/core/use_case/test_use_case.py +0 -0
  913. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/__init__.py +0 -0
  914. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/__init__.py +0 -0
  915. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/_historify_contract.py +0 -0
  916. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_empty_write_warning.py +0 -0
  917. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_historify_common.py +0 -0
  918. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_path_template.py +0 -0
  919. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/__init__.py +0 -0
  920. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/conftest.py +0 -0
  921. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_apply_schema.py +0 -0
  922. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_backend.py +0 -0
  923. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_dtype.py +0 -0
  924. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_file_writer.py +0 -0
  925. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_historify_polars.py +0 -0
  926. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_predicate_pushdown.py +0 -0
  927. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_reader_columns.py +0 -0
  928. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_reader_json_columns.py +0 -0
  929. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_step_execution.py +0 -0
  930. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_streaming_write.py +0 -0
  931. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_update_writer.py +0 -0
  932. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_upsert_writer.py +0 -0
  933. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_writer_null_schema.py +0 -0
  934. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_polars/test_writer_to_frame.py +0 -0
  935. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/__init__.py +0 -0
  936. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/conftest.py +0 -0
  937. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/test_dtype.py +0 -0
  938. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/test_historify_spark.py +0 -0
  939. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/test_spark_apply_schema.py +0 -0
  940. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/test_step_execution.py +0 -0
  941. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_spark/test_writer_to_frame.py +0 -0
  942. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/backends/test_write_policy_historify.py +0 -0
  943. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/checkpoint/__init__.py +0 -0
  944. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/checkpoint/backends/__init__.py +0 -0
  945. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/checkpoint/backends/test_checkpoint_polars.py +0 -0
  946. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/checkpoint/test_checkpoint_paths.py +0 -0
  947. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/checkpoint/test_cleaners.py +0 -0
  948. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/checkpoint/test_store.py +0 -0
  949. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/client_step/__init__.py +0 -0
  950. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/client_step/test_client_step.py +0 -0
  951. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/__init__.py +0 -0
  952. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_catalog_validator.py +0 -0
  953. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_compiler.py +0 -0
  954. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_compiler_catalog.py +0 -0
  955. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_compiler_upsert.py +0 -0
  956. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_errors.py +0 -0
  957. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_errors_additional_factories.py +0 -0
  958. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_errors_runtime_factories.py +0 -0
  959. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_file_template_validator.py +0 -0
  960. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_historify_validator.py +0 -0
  961. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_param_exprs_validator.py +0 -0
  962. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_plan_traversal.py +0 -0
  963. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_step_validator.py +0 -0
  964. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_structural.py +0 -0
  965. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_temp_validator.py +0 -0
  966. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/compiler/test_upsert_validator.py +0 -0
  967. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/conftest.py +0 -0
  968. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/__init__.py +0 -0
  969. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/__init__.py +0 -0
  970. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_clickhouse_reader.py +0 -0
  971. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_dynamodb_predicate.py +0 -0
  972. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_dynamodb_reader.py +0 -0
  973. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_from_clickhouse.py +0 -0
  974. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_from_dynamodb.py +0 -0
  975. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_from_mongo.py +0 -0
  976. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_mongo_predicate.py +0 -0
  977. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_mongo_reader.py +0 -0
  978. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/sources/test_mongo_reader_memory.py +0 -0
  979. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/targets/__init__.py +0 -0
  980. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/targets/test_clickhouse_writer.py +0 -0
  981. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/targets/test_into_clickhouse.py +0 -0
  982. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_history_target.py +0 -0
  983. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_registry.py +0 -0
  984. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_source.py +0 -0
  985. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_source_json.py +0 -0
  986. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_source_options.py +0 -0
  987. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_target.py +0 -0
  988. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_utils.py +0 -0
  989. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/io/test_variants.py +0 -0
  990. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/lineage/test_observer.py +0 -0
  991. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/lineage/test_records.py +0 -0
  992. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/lineage/test_store.py +0 -0
  993. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/__init__.py +0 -0
  994. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/backends/__init__.py +0 -0
  995. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/backends/test_delta_rs.py +0 -0
  996. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/conftest.py +0 -0
  997. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/test_builder.py +0 -0
  998. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/test_runner.py +0 -0
  999. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/maintenance/test_step.py +0 -0
  1000. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/pipeline/__init__.py +0 -0
  1001. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/pipeline/test_pipeline_process.py +0 -0
  1002. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/pipeline/test_proxy.py +0 -0
  1003. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/pipeline/test_step.py +0 -0
  1004. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/schema/__init__.py +0 -0
  1005. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/schema/test_contract.py +0 -0
  1006. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/schema/test_schema.py +0 -0
  1007. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/schema/test_table.py +0 -0
  1008. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/sql/__init__.py +0 -0
  1009. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/sql/test_merge.py +0 -0
  1010. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/sql/test_predicate.py +0 -0
  1011. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/sql/test_predicate_dialect.py +0 -0
  1012. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/sql/test_sql_runtime.py +0 -0
  1013. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/__init__.py +0 -0
  1014. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_backend_factory.py +0 -0
  1015. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_io_protocols.py +0 -0
  1016. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_locator.py +0 -0
  1017. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_observability_and_protocols.py +0 -0
  1018. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_route_build.py +0 -0
  1019. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_schema_readers.py +0 -0
  1020. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/storage/test_storage_config.py +0 -0
  1021. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_config_loader.py +0 -0
  1022. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_executor.py +0 -0
  1023. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_executor_tracing.py +0 -0
  1024. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_format_registry.py +0 -0
  1025. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_module_contracts.py +0 -0
  1026. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_public_api_discovery.py +0 -0
  1027. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_record_schema_coverage.py +0 -0
  1028. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_runner.py +0 -0
  1029. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_runner_errors.py +0 -0
  1030. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/test_spark_testing.py +0 -0
  1031. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/testing/__init__.py +0 -0
  1032. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/testing/test_runners.py +0 -0
  1033. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/testing/test_scenario_and_stubs.py +0 -0
  1034. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/etl/testing/test_spark_helpers.py +0 -0
  1035. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/__init__.py +0 -0
  1036. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_backfill_flow.py +0 -0
  1037. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_config.py +0 -0
  1038. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_ctx.py +0 -0
  1039. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_etl_flow.py +0 -0
  1040. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_logging_bridge.py +0 -0
  1041. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_maintenance_flow.py +0 -0
  1042. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_manifest.py +0 -0
  1043. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_manifest_s3.py +0 -0
  1044. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_notify.py +0 -0
  1045. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_observer.py +0 -0
  1046. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_placeholders.py +0 -0
  1047. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_task_run_observer.py +0 -0
  1048. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prefect/test_yaml_loader.py +0 -0
  1049. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prometheus/__init__.py +0 -0
  1050. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prometheus/test_adapter.py +0 -0
  1051. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/prometheus/test_middleware.py +0 -0
  1052. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/release/test_checkout_merged_release.py +0 -0
  1053. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/release/test_release_workflow_contract.py +0 -0
  1054. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/__init__.py +0 -0
  1055. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/_fixture_app.py +0 -0
  1056. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_app_hardening.py +0 -0
  1057. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_auth_middleware.py +0 -0
  1058. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_auth_rejection_logging.py +0 -0
  1059. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_autocrud.py +0 -0
  1060. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_cors.py +0 -0
  1061. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_fastapi_auto_logger.py +0 -0
  1062. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_jwt_issuer.py +0 -0
  1063. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_jwt_middleware.py +0 -0
  1064. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_middleware.py +0 -0
  1065. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_pydantic_adapter.py +0 -0
  1066. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_request_hardening.py +0 -0
  1067. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_response.py +0 -0
  1068. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_rest_adapter.py +0 -0
  1069. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_rest_compiler.py +0 -0
  1070. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_rest_model.py +0 -0
  1071. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_route_rbac.py +0 -0
  1072. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_router_identity.py +0 -0
  1073. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_router_runtime.py +0 -0
  1074. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_sql_endpoint.py +0 -0
  1075. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_sql_endpoint_auth_gate.py +0 -0
  1076. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_sql_endpoint_roles.py +0 -0
  1077. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/rest/test_sql_serialization.py +0 -0
  1078. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/__init__.py +0 -0
  1079. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/__init__.py +0 -0
  1080. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/cases.py +0 -0
  1081. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/conftest.py +0 -0
  1082. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_adapter.py +0 -0
  1083. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_batch_key.py +0 -0
  1084. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_bytewax_dispatcher.py +0 -0
  1085. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_collect_batch.py +0 -0
  1086. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_dlq.py +0 -0
  1087. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_error_boundary.py +0 -0
  1088. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_fanout_accounting.py +0 -0
  1089. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_operators.py +0 -0
  1090. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_resource_manager.py +0 -0
  1091. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_runner.py +0 -0
  1092. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_runtime_io.py +0 -0
  1093. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_runtime_sink.py +0 -0
  1094. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_runtime_source.py +0 -0
  1095. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_sink_registry.py +0 -0
  1096. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_steps.py +0 -0
  1097. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_storage.py +0 -0
  1098. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/bytewax/test_storage_trace_characterisation.py +0 -0
  1099. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/__init__.py +0 -0
  1100. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/cases.py +0 -0
  1101. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_async_walk.py +0 -0
  1102. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_basics.py +0 -0
  1103. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_config_bindings.py +0 -0
  1104. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_delivery.py +0 -0
  1105. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_error_codes.py +0 -0
  1106. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_mongo_source.py +0 -0
  1107. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_multi_source.py +0 -0
  1108. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_router.py +0 -0
  1109. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_window.py +0 -0
  1110. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/compiler/test_with.py +0 -0
  1111. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/conftest.py +0 -0
  1112. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/__init__.py +0 -0
  1113. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/cases.py +0 -0
  1114. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/test_boundary.py +0 -0
  1115. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/test_message.py +0 -0
  1116. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/test_mongo_contracts.py +0 -0
  1117. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/test_multi_boundary.py +0 -0
  1118. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/contracts/test_steps.py +0 -0
  1119. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/__init__.py +0 -0
  1120. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/__init__.py +0 -0
  1121. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/batch.py +0 -0
  1122. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/explode.py +0 -0
  1123. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/fork.py +0 -0
  1124. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/router.py +0 -0
  1125. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/shared.py +0 -0
  1126. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/cases/simple.py +0 -0
  1127. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/conftest.py +0 -0
  1128. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/test_compiler_examples.py +0 -0
  1129. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/flows/test_flow_examples.py +0 -0
  1130. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/__init__.py +0 -0
  1131. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/cases.py +0 -0
  1132. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/conftest.py +0 -0
  1133. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/fakes.py +0 -0
  1134. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_client.py +0 -0
  1135. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_config.py +0 -0
  1136. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_coordinator_retry.py +0 -0
  1137. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_key_resolver.py +0 -0
  1138. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_message.py +0 -0
  1139. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_message_client.py +0 -0
  1140. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_multi_wire.py +0 -0
  1141. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_observability.py +0 -0
  1142. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_settings.py +0 -0
  1143. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_source_decode_parity.py +0 -0
  1144. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/kafka/test_wire.py +0 -0
  1145. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/mongo/test_bytewax_source.py +0 -0
  1146. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/nodes/__init__.py +0 -0
  1147. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/nodes/conftest.py +0 -0
  1148. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/nodes/test_broadcast.py +0 -0
  1149. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/nodes/test_delta_config.py +0 -0
  1150. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/nodes/test_logging.py +0 -0
  1151. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/nodes/test_table_package.py +0 -0
  1152. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/__init__.py +0 -0
  1153. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/cases.py +0 -0
  1154. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/conftest.py +0 -0
  1155. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_message_lifecycle_spans.py +0 -0
  1156. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_multiworker_trace_continuity.py +0 -0
  1157. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_observability_runner.py +0 -0
  1158. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_outbound_topic_terminal_spans.py +0 -0
  1159. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_protocols.py +0 -0
  1160. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_registry.py +0 -0
  1161. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/observability/test_structlog.py +0 -0
  1162. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/support/__init__.py +0 -0
  1163. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/support/flow_cases.py +0 -0
  1164. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/test_expand_routes.py +0 -0
  1165. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/test_fork.py +0 -0
  1166. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/test_otel_observability.py +0 -0
  1167. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/test_routing.py +0 -0
  1168. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/test_testing_mongo.py +0 -0
  1169. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/streaming/test_with.py +0 -0
  1170. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/testing/__init__.py +0 -0
  1171. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/testing/test_golden.py +0 -0
  1172. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/testing/test_http_harness.py +0 -0
  1173. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/testing/test_identity_harness.py +0 -0
  1174. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/testing/test_in_memory.py +0 -0
  1175. {loom_kernel-1.9.0 → loom_kernel-1.9.2}/tests/unit/testing/test_runner.py +0 -0
@@ -1,3 +1,63 @@
1
+ # 🚀 Release 1.9.2 ([#157](https://github.com/the-reacher-data/loom-py/pull/157)) ([`3b32161`](https://github.com/the-reacher-data/loom-py/commit/3b32161dfcfe12fe25fe05ff7ccb4d6a71a6b64a))
2
+
3
+
4
+
5
+ ## 🐛 Fixes
6
+ ### ai
7
+ - **ai:** make outbound auth work for MCP and let a grant boot offline
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+ # 🚀 Release 1.9.1 ([#155](https://github.com/the-reacher-data/loom-py/pull/155)) ([`587affc`](https://github.com/the-reacher-data/loom-py/commit/587affcfbf46301ccd3e02a5edeb34e63b460628))
17
+
18
+
19
+ ## ✨ Features
20
+ ### rest
21
+ - **rest:** let an application whose only content is agents boot<br>
22
+ > Reported from downstream: an app whose manifest declares only AGENTS failed
23
+ > six times in a row on `create_app`, each message naming a symptom rather than
24
+ > the cause ("no module named 'sqlalchemy'", "No UseCase classes discovered.",
25
+ > "the greenlet library is required...").
26
+ > `persistence.backend: none`: no unit of work, no repositories, no model
27
+ > compilation, `database:` ignored. `sqlalchemy` stays the default and its
28
+ > no-models error now names the way out.
29
+ > `create_app` imports the SQLAlchemy backend lazily, inside the wiring that
30
+ > needs it, so the `sqlalchemy` extra is no longer required to import it.
31
+ > One discovery guard instead of three: an app fails only when it has no use
32
+ > case, no interface and no agent, and every discovery error now names
33
+ > `app.discovery.mode: manifest` and `AGENTS`.
34
+ > `ai.models.<role>.output_mode: tool | native` pins the structured-output
35
+ > mode a deployment needs; absent keeps the engine's own resolution.
36
+ > The AWS resolvers log and report the key as written, never the `%VAR%`
37
+ > expanded path, and split dot-notation before expanding so an environment
38
+ > value can never introduce a JSON separator or reach an error message.
39
+ > Fetch errors carry the AWS error code instead of the client's message.
40
+ > Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
41
+ > Claude-Session: https://claude.ai/code/session_016xY1skW5S2PU9Fc3M7tfAW
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+ ## ✅ Tests
51
+ ### quality
52
+ - **quality:** clear the SonarCloud findings of the agents-only slice<br>
53
+ > The quality gate failed on one reliability issue: the subprocess helper
54
+ > asserted inside a `try` whose `except Exception` also catches
55
+ > `AssertionError`, so a failed check reported itself as a caught error
56
+ > (S5779). It raises `RuntimeError` now, and the block check does too.
57
+
58
+
59
+
60
+
1
61
  # 🚀 Release 1.9.0 ([#154](https://github.com/the-reacher-data/loom-py/pull/154)) ([`22d9a89`](https://github.com/the-reacher-data/loom-py/commit/22d9a894c766d2414ee6607e990b6473dd5ebfe3))
2
62
 
3
63
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: loom-kernel
3
- Version: 1.9.0
3
+ Version: 1.9.2
4
4
  Summary: Loom Python project
5
5
  License-File: LICENSE
6
6
  Classifier: Typing :: Typed
@@ -88,11 +88,16 @@ session. An agent that authenticates its card endpoint would otherwise fail
88
88
  start-up before a skill was ever called.
89
89
 
90
90
  `kind` names an entry point in the group `loom.ai.remote_auth`, the same group
91
- MCP servers resolve against: the strategy contract is
92
- [`httpx.Auth`](https://www.python-httpx.org/advanced/authentication/), which
93
- knows nothing of either protocol, so a deployment registers its strategy once
94
- and grants it to either transport. The one strategy an A2A agent cannot use is
95
- `kind: oauth`, which delegates to the MCP client library's own flow; naming it
91
+ MCP servers resolve against: the strategy contract is the HTTP client's own
92
+ [`Auth`](https://www.python-httpx.org/advanced/authentication/), which knows
93
+ nothing of either protocol, so a deployment registers its strategy once and
94
+ grants it to either transport. The A2A client is loom's own, built with `httpx`,
95
+ while an MCP server is reached through a client using `httpx2` — a strategy
96
+ registered as a class is refused by the other flavour, and a strategy returning
97
+ a plain callable serves both: see
98
+ [mcp.md § Two HTTP libraries, one callable](mcp.md#two-http-libraries-one-callable).
99
+
100
+ The one strategy an A2A agent cannot use is `kind: oauth`, which delegates to the MCP client library's own flow; naming it
96
101
  here is refused with `MCP_AUTH_STRATEGY_INVALID` rather than connecting without
97
102
  the credential the deployment asked for.
98
103
 
@@ -106,6 +106,58 @@ rejected fail-closed.
106
106
  Tool filters are matched against the tools the server really advertises, not
107
107
  against what the artifact hoped for.
108
108
 
109
+ ### Booting without the network: `ai.remote_clients`
110
+
111
+ Granting `kind: mcp` makes every server the grant names a start-up dependency.
112
+ That is right in production and awkward everywhere else — a laptop, a CI job, an
113
+ environment brought up before its side-cars. `ai.remote_clients` says how a
114
+ client that will not open is treated:
115
+
116
+ ```yaml
117
+ ai:
118
+ remote_clients: optional # required (default) | optional
119
+ ```
120
+
121
+ | Value | A client that fails to *connect* |
122
+ |---|---|
123
+ | `required` (default) | Aborts start-up, by name, with `MCP_SERVER_UNREACHABLE` — or `A2A_AGENT_UNREACHABLE` for a remote agent. |
124
+ | `optional` | Logged at WARNING and dropped; the runtime starts without it. |
125
+
126
+ The switch is process-wide and covers the remote agents of `ai.a2a_agents` as
127
+ well as the servers of `ai.mcp_servers`. An unknown value fails configuration
128
+ load with `REMOTE_CLIENTS_UNKNOWN`, naming the key and both accepted values.
129
+
130
+ Under `optional`, the WARNING carries the error code and the registered name
131
+ only: the transport's own reason is an arbitrary library's exception text and
132
+ can name a URL, so it goes to DEBUG, where an operator asks for it deliberately,
133
+ rather than into routine logs on every boot. The health probe reports the
134
+ dependency `unavailable` once its first pass has run.
135
+
136
+ `optional` tolerates a network that is not there. It tolerates nothing else, and
137
+ three carve-outs are deliberate:
138
+
139
+ **A missing client factory is still fatal.** A plan declaring an `mcp` grant in a
140
+ deployment that wired no MCP client factory is a wiring bug, not an offline
141
+ network. It is collected apart, where the factory is found missing, never told
142
+ from a connection failure by reading its message, and aborts start-up under
143
+ **both** values.
144
+
145
+ **Tool-filter verification still fails closed for a server that did open.** The
146
+ waiver covers only servers that never connected: a server with no session is
147
+ skipped, and a filter on it does not fail start-up. A server that opened has its
148
+ declared filters verified as usual, and a listing that times out still aborts
149
+ start-up under `optional`. Because a tolerated connection failure has already
150
+ spent the shared start-up budget, the verification pass is given a fresh
151
+ `startup_timeout_ms` rather than the exhausted one — otherwise one hanging
152
+ server would fail the filters of every server that answered.
153
+
154
+ **Nothing becomes lazy.** A start-up client that never opened is not reconnected
155
+ later; the clients are session-affine and closing one from a foreign task is
156
+ refused, so reconnecting them needs a supervisor task that does not exist yet.
157
+ This says nothing about the run path, which builds its own toolset and connects
158
+ on its own: under `optional`, a run against a server that never opened at
159
+ start-up connects then and there, and succeeds if the network came back.
160
+
109
161
  ## Authentication
110
162
 
111
163
  The MCP specification standardises OAuth 2.0 for HTTP transports, so an
@@ -187,12 +239,62 @@ loom writes the header.
187
239
  set credentials on one connection is ambiguous, and compilation refuses it with
188
240
  `MCP_AUTH_CONFLICT`.
189
241
 
242
+ ### Two HTTP libraries, one callable
243
+
244
+ A strategy is handed to an HTTP client, and the two outbound transports do not
245
+ use the same one.
246
+
247
+ An `mcp` grant becomes a pydantic-ai `MCPToolset`, which connects through one of
248
+ fastmcp's HTTP transports — `StreamableHttpTransport`, or `SSETransport` when the
249
+ URL ends in `/sse`. Those transports special-case OAuth and pass any other auth
250
+ object straight through to their client, and their client is **`httpx2`**. An
251
+ `a2a` grant goes to a client loom builds itself, with **`httpx`**.
252
+
253
+ Each library accepts an auth object only when it is an instance of *its own*
254
+ `Auth` class, a two-tuple, or a callable. So an `httpx.Auth` subclass is refused
255
+ by the MCP transport's client, and an `httpx2.Auth` subclass by the A2A one.
256
+ **Loom adapts neither**, and publishes no recipe for a class that satisfies both
257
+ at once: nothing in its test suite would keep such a recipe honest.
258
+
259
+ | Grant | Client library | A class must subclass |
260
+ |---|---|---|
261
+ | `kind: mcp` | `httpx2`, reached through fastmcp's transport | `httpx2.Auth` |
262
+ | `kind: a2a` | `httpx`, in the client loom builds | `httpx.Auth` |
263
+
264
+ **A plain callable is the supported answer for both.** Each library wraps a
265
+ callable in a `FunctionAuth` of its own, so one function serves either transport
266
+ — and whatever flavour either library moves to next. It takes the outgoing
267
+ request, sets its headers, and **returns** it:
268
+
269
+ ```python
270
+ def incident_api_key(*, key_ref: str):
271
+ """Register this as a strategy: it returns the callable both clients wrap."""
272
+
273
+ def add_key(request):
274
+ request.headers["X-API-Key"] = key_ref
275
+ return request
276
+
277
+ return add_key
278
+ ```
279
+
280
+ Returning the request is not optional: the wrapper's flow is
281
+ `yield self._func(request)`, so a callable returning `None` sends `None`.
282
+ Nothing in the inner signature names a library, which is exactly the point — the
283
+ request it receives is of whichever flavour drove it. The two strategies loom
284
+ ships, `bearer` and `static`, are this shape.
285
+
286
+ A callable is a single-shot flow: it never sees the response, so it cannot
287
+ inspect a `401` or renew. A strategy that needs the response is a class.
288
+
190
289
  ### Writing your own
191
290
 
192
- The contract is [`httpx.Auth`](https://www.python-httpx.org/advanced/authentication/)
193
- itself, not an abstraction of loom's — nobody has to learn one of ours, and any
194
- existing `httpx.Auth` in the ecosystem works with no adapter. Register the class
195
- from **your own package**; loom does not change:
291
+ The contract is the HTTP client's own
292
+ [`Auth`](https://www.python-httpx.org/advanced/authentication/), not an
293
+ abstraction of loom's — nobody has to learn one of ours, and an existing `Auth`
294
+ class works with no adapter, provided it is the flavour of the transport that
295
+ will use it (above). This example authenticates an MCP server, so it subclasses
296
+ `httpx2.Auth`; the identical class written for an A2A agent subclasses
297
+ `httpx.Auth`. Register it from **your own package**; loom does not change:
196
298
 
197
299
  ```toml
198
300
  # pyproject.toml of your own distribution
@@ -204,10 +306,10 @@ A worked example — a server exposing a session endpoint, where the agent
204
306
  presents a long-lived bootstrap secret and receives short-lived tokens:
205
307
 
206
308
  ```python
207
- import httpx
309
+ import httpx2 # the flavour the MCP transport's client uses
208
310
 
209
311
 
210
- class AgentSessionAuth(httpx.Auth):
312
+ class AgentSessionAuth(httpx2.Auth):
211
313
  """Exchange a bootstrap secret for a token, renewed when rejected."""
212
314
 
213
315
  def __init__(self, *, session_url: str, bootstrap_ref: str) -> None:
@@ -226,14 +328,22 @@ class AgentSessionAuth(httpx.Auth):
226
328
  yield request
227
329
 
228
330
  def _mint(self):
229
- response = yield httpx.Request(
331
+ response = yield httpx2.Request(
230
332
  "POST", self._url, json={"secret_path": self._ref}
231
333
  )
232
334
  return response.json()["access_token"]
233
335
  ```
234
336
 
235
- Retry-with-a-refreshed-credential is httpx's standard generator shape; loom does
236
- not reimplement it.
337
+ Retry-with-a-refreshed-credential is the library's standard generator shape;
338
+ loom does not reimplement it.
339
+
340
+ ```{warning}
341
+ `requires_response_body` is honoured by `Auth`'s **own** base flow, not by the
342
+ client. A strategy that overrides `async_auth_flow` — which any asynchronous
343
+ token exchange must — replaces the very code that reads the flag, and has to
344
+ `await response.aread()` itself before touching the body. Setting the attribute
345
+ and overriding the flow leaves the body unread, silently.
346
+ ```
237
347
 
238
348
  If you are designing such an endpoint: this is OAuth 2.0 `client_credentials`
239
349
  by another name — `secret_path` is the client id and the bootstrap secret is the
@@ -256,11 +366,12 @@ server's read permissions to that prefix and log failed attempts per path.
256
366
 
257
367
  The group is `loom.ai.remote_auth`, not `loom.ai.mcp_auth`: one registry serves
258
368
  the MCP servers of `ai.mcp_servers` **and** the remote agents of `ai.a2a_agents`
259
- (see [a2a.md](a2a.md)), because the contract is `httpx.Auth` and knows neither
260
- protocol. A strategy is registered once and granted to either. The one
261
- exception is `kind: oauth`, which delegates to the MCP client library's own
262
- flow: an A2A agent naming it is refused with `MCP_AUTH_STRATEGY_INVALID` rather
263
- than connected without a credential.
369
+ (see [a2a.md](a2a.md)), because the contract is the HTTP client's and knows
370
+ neither protocol. A strategy returning a callable is registered once and granted
371
+ to either; one registered as a class is granted to the transports of its own
372
+ flavour. The one exception is `kind: oauth`, which delegates to the MCP client
373
+ library's own flow: an A2A agent naming it is refused with
374
+ `MCP_AUTH_STRATEGY_INVALID` rather than connected without a credential.
264
375
 
265
376
  ### One instance per server
266
377
 
@@ -270,6 +381,22 @@ renewing strategy holds the live token, so sharing means one renewal instead of
270
381
  one per agent, and no burst of simultaneous logins when several agents start
271
382
  together.
272
383
 
384
+ What is shared is what the strategy returned. A class instance is shared as
385
+ itself, so a strategy that must renew once, for everybody, stays a class and
386
+ keeps that identity. A callable is shared as itself too, but each client wraps
387
+ it in a `FunctionAuth` of its own, so two clients built from one credential no
388
+ longer hold the same `client.auth` object — they hold two wrappers around one
389
+ function. For a fixed header that is a distinction without a difference, and it
390
+ is the reason a stateful strategy is a class.
391
+
392
+ ```{admonition} Public contract
393
+ :class: note
394
+ `shared_mcp_auth` and `shared_a2a_auth` are exported, and their return type has
395
+ widened from `httpx.Auth | str` to what a client accepts, which now includes a
396
+ callable. Code doing `isinstance(value, httpx.Auth)` on the result stops
397
+ matching for the built-in `bearer` and `static` strategies.
398
+ ```
399
+
273
400
  ## The rule: your own tools are a `usecase` grant
274
401
 
275
402
  Here is the decision that actually comes up, and the one this page exists for.
@@ -96,6 +96,74 @@ Every agent matched by `specs` is compiled. Only the agents named in
96
96
  agent absent from `endpoints` exists in the process and is reachable by nobody.
97
97
  Exposure is always an explicit opt-in, never a default.
98
98
 
99
+ ## An application that is only agents
100
+
101
+ An application does not need a model, a use case or a REST interface to run an
102
+ agent. Its manifest module declares `AGENTS` and nothing else, discovery runs in
103
+ `manifest` mode, and persistence is switched off:
104
+
105
+ ```python
106
+ # myapp/manifest.py
107
+ AGENTS = ["agents/*.yaml"] # globs resolve against app.code_path
108
+ ```
109
+
110
+ ```yaml
111
+ # config/api.yaml
112
+ app:
113
+ name: incident-triage
114
+ discovery:
115
+ mode: manifest
116
+ manifest:
117
+ module: myapp.manifest
118
+
119
+ persistence:
120
+ backend: none
121
+
122
+ ai:
123
+ engine: pydantic-ai
124
+ models:
125
+ default:
126
+ provider: bedrock
127
+ model: <model id>
128
+ region: eu-west-1
129
+ output_mode: native # optional, see Model providers
130
+ endpoints:
131
+ incident-triage:
132
+ enabled: true
133
+ auth: jwt
134
+ ```
135
+
136
+ ```bash
137
+ pip install "loom-kernel[rest,ai-pydantic,ai-bedrock]" # swap the provider extra for yours
138
+ ```
139
+
140
+ The `sqlalchemy` extra is not needed: `create_app` imports the SQLAlchemy backend
141
+ only inside the `sqlalchemy` wiring, so an agents-only process never loads it.
142
+ (`loom.celery` still imports it at module level; this recipe is about the REST
143
+ application, not every loom module.)
144
+
145
+ What `persistence.backend: none` means:
146
+
147
+ - No unit of work and no repositories. A granted `usecase` capability still
148
+ runs through the kernel executor, just without a transaction around it.
149
+ - Discovered models are accepted but **not compiled**, and they get no
150
+ repository. Declaring them under `none` is harmless and pointless.
151
+ - A `database:` section is ignored, silently.
152
+ - Deferred job dispatch does not fire. `JobService.dispatch` queues the call to
153
+ run after the unit of work commits, and with no unit of work nothing flushes
154
+ the queue, so a job dispatched from a use case is dropped without an error.
155
+ An agents-only application that needs background jobs keeps a real backend.
156
+
157
+ Only `manifest` discovery can describe this application: the `interfaces` and
158
+ `modules` engines require at least one module path, and their errors — like the
159
+ `RuntimeError` raised when discovery finds no use case, no interface and no
160
+ agent — say so by naming `app.discovery.mode: manifest` and `AGENTS`.
161
+
162
+ `persistence.backend` still defaults to `sqlalchemy`; loom never infers `none`
163
+ from the absence of models or of a `database:` section. Leaving the default
164
+ in place with no models fails start-up with a message that names
165
+ `persistence.backend: none` as the way out.
166
+
99
167
  ## Where to go next
100
168
 
101
169
  - **[Artifact reference](artifacts.md)** — the complete `spec_version: 1`
@@ -118,7 +118,7 @@ redacts itself:
118
118
 
119
119
  ```pycon
120
120
  >>> print(target)
121
- InferenceTarget(provider='bedrock', model='anthropic.claude-sonnet-4-...', region='eu-west-1', endpoint=None, credentials_ref=<redacted>, options=<redacted>)
121
+ InferenceTarget(provider='bedrock', model='anthropic.claude-sonnet-4-...', region='eu-west-1', endpoint=None, output_mode=None, credentials_ref=<redacted>, options=<redacted>)
122
122
  ```
123
123
 
124
124
  and **refuses** to be serialised at all when it carries a secret reference —
@@ -148,6 +148,44 @@ ai:
148
148
  `options` is confined to the deployment configuration and, like
149
149
  `credentials_ref`, never reaches the artifact and never survives serialisation.
150
150
 
151
+ ## Pinning the structured-output mode
152
+
153
+ Every agent answers with a structured object, and the engine has more than one
154
+ way of asking a model for it. Left alone, the engine picks the mode per
155
+ provider and model. When that choice is wrong for a particular model — it
156
+ accepts tool calls but not a native JSON-schema response, or the reverse — the
157
+ binding pins it with `output_mode`:
158
+
159
+ | `output_mode` | The engine asks for the answer as | When to set it |
160
+ |---|---|---|
161
+ | *absent* | whatever the engine resolves for that provider and model | the default; leave it unless a run fails at the provider |
162
+ | `tool` | a tool call whose arguments carry the object | the model supports tool calling and rejects the native mode |
163
+ | `native` | the provider's own structured-output response | the model supports structured output and misbehaves with the tool mode |
164
+
165
+ ```yaml
166
+ ai:
167
+ models:
168
+ reasoning:
169
+ provider: bedrock
170
+ model: <model id>
171
+ region: eu-west-1
172
+ output_mode: tool
173
+ ```
174
+
175
+ The mode is per binding and per deployment: the artifact never sees it, and
176
+ loom does not infer it per provider. Two consequences follow from that:
177
+
178
+ - An unknown value fails **start-up** with `OUTPUT_MODE_UNKNOWN`, naming the
179
+ role and the two values loom offers. `prompted` is deliberately not one of
180
+ them: the engine strips markdown fences before validating a prompted answer,
181
+ while loom decodes the raw text part, so a fenced answer would pass the
182
+ engine and fail loom.
183
+ - A mode the model rejects at **request time** is a provider refusal, and it
184
+ surfaces as `PROVIDER_UNAVAILABLE`. The provider's detail stays server-side,
185
+ in the logs; the caller sees the code. Loom cannot check a mode against a
186
+ model before the first request, so a wrong pin is found there, not at
187
+ start-up.
188
+
151
189
  ## What does not happen
152
190
 
153
191
  **No fallback routing.** An exhausted or failing provider fails the run. It is
@@ -372,6 +372,26 @@ discovery:
372
372
  module: app.manifest
373
373
  ```
374
374
 
375
+ ### Choose the persistence backend
376
+
377
+ `database:` is read by the default backend. `persistence.backend` selects it:
378
+
379
+ | `persistence.backend` | Reads | What the app gets |
380
+ |---|---|---|
381
+ | `sqlalchemy` (default) | `database:` | unit of work, repositories and compiled tables for every discovered model; requires at least one model and the `sqlalchemy` extra |
382
+ | `dynamodb` | `persistence.dynamodb:` | the DynamoDB repositories, no relational tables |
383
+ | `none` | nothing | no unit of work, no repositories; discovered models are accepted but not compiled, a `database:` section is ignored, and deferred job dispatch never fires |
384
+
385
+ ```yaml
386
+ persistence:
387
+ backend: none
388
+ ```
389
+
390
+ `none` is for an application whose only content is agents (see
391
+ [An application that is only agents](../ai/overview.md#an-application-that-is-only-agents)).
392
+ It is never inferred: with the default backend and no discovered models,
393
+ start-up fails with a message that names `persistence.backend: none`.
394
+
375
395
  ---
376
396
 
377
397
  ## Rules + Computes (advanced)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "loom-kernel"
3
- version = "1.9.0"
3
+ version = "1.9.2"
4
4
  description = "Loom Python project"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -362,7 +362,7 @@ markers = [
362
362
 
363
363
  [tool.commitizen]
364
364
  name = "cz_conventional_commits"
365
- version = "1.9.0"
365
+ version = "1.9.2"
366
366
  tag_format = "v$version"
367
367
  version_files = [
368
368
  "pyproject.toml:project.version",
@@ -31,9 +31,11 @@ from loom.ai.errors import (
31
31
  mcp_auth_strategy_unknown,
32
32
  mcp_credentials_inline,
33
33
  mcp_url_invalid,
34
+ output_mode_unknown,
34
35
  policy_out_of_range,
36
+ remote_clients_unknown,
35
37
  )
36
- from loom.ai.inference import InferenceTarget
38
+ from loom.ai.inference import OUTPUT_MODES, InferenceTarget
37
39
  from loom.ai.remote_auth import is_strategy_registered, registered_strategy_names
38
40
  from loom.core.model import LoomFrozenStruct
39
41
 
@@ -54,6 +56,11 @@ _URL_USERINFO_RE = re.compile(r"://[^/]*@")
54
56
  # key is that strategy's own setting.
55
57
  _AUTH_KIND_KEY = "kind"
56
58
 
59
+ # Accepted values of ``ai.remote_clients``: whether a remote client that will
60
+ # not open aborts start-up (``required``) or is dropped with a warning
61
+ # (``optional``).
62
+ _REMOTE_CLIENTS_MODES: tuple[str, ...] = ("required", "optional")
63
+
57
64
  # Bounds of a single remote call, mirroring ``policies.tool_timeout_ms``.
58
65
  _TIMEOUT_MS_MIN = 1
59
66
  _TIMEOUT_MS_MAX = 600000
@@ -168,6 +175,8 @@ def _validate_model_binding(role: str, target: InferenceTarget) -> list[AgentCom
168
175
  for setting in required:
169
176
  if not getattr(target, setting):
170
177
  issues.append(inference_target_incomplete(role, setting))
178
+ if target.output_mode is not None and target.output_mode not in OUTPUT_MODES:
179
+ issues.append(output_mode_unknown(role, target.output_mode, OUTPUT_MODES))
171
180
  ref = target.credentials_ref
172
181
  if ref is not None and not _is_credentials_reference(ref):
173
182
  # The rejected value is deliberately absent from the issue: the error
@@ -296,6 +305,15 @@ class AiConfig(LoomFrozenStruct, frozen=True, kw_only=True):
296
305
  startup_timeout_ms: Total budget of start-up: opening every live
297
306
  client concurrently and validating the declared tool filters
298
307
  share one deadline, whatever the number of servers.
308
+ remote_clients: Start-up tolerance for the MCP servers and A2A agents
309
+ the deployment connects to, ``required`` (the default) or
310
+ ``optional``. Under ``optional`` a client that fails to *connect*
311
+ is logged and dropped instead of aborting start-up, so an
312
+ application can boot with no network. It tolerates nothing else:
313
+ a missing client factory is a wiring bug and stays fatal, a server
314
+ that did open and whose tool listing times out still fails
315
+ start-up, and no client becomes lazy — one that never opened is
316
+ not reconnected later.
299
317
  max_concurrent_runs: Per-worker run limit (FR-033a).
300
318
  max_prompt_bytes: Enforced while reading the request body.
301
319
  health_cache_ttl_ms: Refresh period of the health probe.
@@ -304,8 +322,8 @@ class AiConfig(LoomFrozenStruct, frozen=True, kw_only=True):
304
322
  AgentCompilationError: Aggregating one issue per invalid model binding
305
323
  (incomplete provider settings, literal secret in
306
324
  ``credentials_ref``), per unsafe remote server or agent (bad URL,
307
- inline credentials, out-of-range timeout) and per endpoint without
308
- a named ``auth``.
325
+ inline credentials, out-of-range timeout), per endpoint without
326
+ a named ``auth``, and for an unknown ``remote_clients`` mode.
309
327
  """
310
328
 
311
329
  engine: str
@@ -317,6 +335,7 @@ class AiConfig(LoomFrozenStruct, frozen=True, kw_only=True):
317
335
  a2a: A2AConfig | None = None
318
336
  endpoints: dict[str, AgentEndpointConfig] = field(default_factory=dict)
319
337
  startup_timeout_ms: int = 10000
338
+ remote_clients: str = "required"
320
339
  max_concurrent_runs: int = 8
321
340
  max_prompt_bytes: int = 65536
322
341
  health_cache_ttl_ms: int = 5000
@@ -330,6 +349,8 @@ class AiConfig(LoomFrozenStruct, frozen=True, kw_only=True):
330
349
  for name, endpoint in self.endpoints.items():
331
350
  if not endpoint.auth.strip():
332
351
  issues.append(endpoint_auth_missing(name))
352
+ if self.remote_clients not in _REMOTE_CLIENTS_MODES:
353
+ issues.append(remote_clients_unknown(self.remote_clients, _REMOTE_CLIENTS_MODES))
333
354
  if issues:
334
355
  raise AgentCompilationError(issues)
335
356
 
@@ -26,7 +26,7 @@ from __future__ import annotations
26
26
 
27
27
  from collections.abc import AsyncIterator, Mapping
28
28
  from contextlib import asynccontextmanager
29
- from typing import TYPE_CHECKING, Any
29
+ from typing import TYPE_CHECKING, Any, cast
30
30
 
31
31
  from loom.ai.compiler import CompiledMcpCapability
32
32
  from loom.ai.errors import AgentCompilationError, provider_not_installed
@@ -101,7 +101,12 @@ def build_mcp_toolset(capability: CompiledMcpCapability) -> MCPToolset[Any]:
101
101
  component = f"mcp server '{capability.server}'"
102
102
  headers = headers_from_ref(component, capability.headers_ref) or None
103
103
  auth = shared_mcp_auth(capability.server, capability.auth)
104
- toolset: MCPToolset[Any] = MCPToolset(capability.url, headers=headers, auth=auth)
104
+ # ``MCPToolset`` annotates auth as ``httpx.Auth | Literal['oauth'] | str | None``,
105
+ # which admits no callable, while what really consumes it is fastmcp's HTTP
106
+ # transport: its ``_set_auth`` special-cases only ``"oauth"``, ``OAuth``, the
107
+ # OAuth providers and ``str``, and hands anything else to its ``httpx2`` client
108
+ # untouched — including the callable loom's own strategies return.
109
+ toolset: MCPToolset[Any] = MCPToolset(capability.url, headers=headers, auth=cast("Any", auth))
105
110
  return toolset
106
111
 
107
112
 
@@ -29,15 +29,21 @@ What is deliberately **not** projected:
29
29
  replays a failed *tool* call inside one run, loom's replays a failed
30
30
  *provider* call across runs. They share one artifact field on purpose — a
31
31
  single operator-facing knob — but neither enforcement subsumes the other.
32
+
33
+ ``output_mode`` (``ai.models.<role>``) is projected next to the spec rather than
34
+ inside it: ``AgentSpec.output_schema`` has no mode field, so the mode travels as
35
+ ``Agent.from_spec(output_type=...)`` via :func:`build_output_type`. Absent, the
36
+ engine keeps resolving the mode itself from ``output_schema``.
32
37
  """
33
38
 
34
39
  from __future__ import annotations
35
40
 
36
- from typing import Any
41
+ from typing import Any, assert_never, cast
37
42
 
38
- from pydantic_ai import AgentSpec
43
+ from pydantic_ai import AgentSpec, NativeOutput, StructuredDict, ToolOutput
39
44
 
40
45
  from loom.ai.compiler import AgentPlan
46
+ from loom.ai.inference import OutputMode
41
47
 
42
48
 
43
49
  def build_agent_spec(plan: AgentPlan) -> AgentSpec:
@@ -45,7 +51,9 @@ def build_agent_spec(plan: AgentPlan) -> AgentSpec:
45
51
 
46
52
  ``output_schema`` instructs the model on the shape to produce; it does not
47
53
  validate the answer (research R-004), which is why the plan's decoder owns
48
- validation at the boundary (see ``_output``).
54
+ validation at the boundary (see ``_output``). How the engine asks for that
55
+ shape (tool call or native structured output) is not part of the spec;
56
+ :func:`build_output_type` overrides it when the binding pins a mode.
49
57
 
50
58
  Args:
51
59
  plan: Compiled agent plan.
@@ -61,3 +69,44 @@ def build_agent_spec(plan: AgentPlan) -> AgentSpec:
61
69
  output_schema=schema,
62
70
  retries=plan.policies.retries,
63
71
  )
72
+
73
+
74
+ def build_output_type(plan: AgentPlan) -> ToolOutput[Any] | NativeOutput[Any] | None:
75
+ """Pin the engine's output mode when the model binding declares one.
76
+
77
+ Wraps the plan's output schema in the engine's own marker, with no name
78
+ or description, so the engine builds the same ``StructuredDict`` it would
79
+ build from ``output_schema`` alone but with the mode fixed instead of
80
+ resolved per provider. The value has already been validated against
81
+ :data:`~loom.ai.inference.OUTPUT_MODES` when the config loaded.
82
+
83
+ The dispatch is exhaustive rather than defaulted: an unhandled mode fails
84
+ type checking here (``assert_never``) and raises at run time, so a value
85
+ that reached this point without the config check — a plan built in
86
+ process, a mode loom deliberately excludes such as ``prompted`` — cannot
87
+ be silently served as ``native``.
88
+
89
+ Args:
90
+ plan: Compiled agent plan.
91
+
92
+ Returns:
93
+ ``ToolOutput`` for ``tool``, ``NativeOutput`` for ``native``, ``None``
94
+ when the binding leaves the mode to the engine.
95
+
96
+ Raises:
97
+ AssertionError: The binding names a mode loom does not offer.
98
+ """
99
+ declared = plan.inference.output_mode
100
+ if declared is None:
101
+ return None
102
+ # The struct field is ``str`` (msgspec would reject a Literal during the
103
+ # decode, before the config check could name the role), so the narrowing
104
+ # happens here, where the dispatch below either handles the value or
105
+ # refuses it.
106
+ mode = cast("OutputMode", declared)
107
+ structured = StructuredDict(dict(plan.output.schema))
108
+ if mode == "tool":
109
+ return ToolOutput(structured)
110
+ if mode == "native":
111
+ return NativeOutput(structured)
112
+ assert_never(mode)