loom-kernel 2.20.2__tar.gz → 2.22.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (689) hide show
  1. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/CHANGELOG.md +111 -0
  2. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/PKG-INFO +1 -1
  3. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/pyproject.toml +3 -0
  4. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_capabilities.py +7 -1
  5. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/errors.py +14 -0
  6. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/compiler.py +36 -0
  7. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/executor.py +19 -0
  8. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/plan.py +21 -0
  9. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/errors/__init__.py +4 -0
  10. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/errors/codes.py +3 -0
  11. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/errors/errors.py +88 -1
  12. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/job/job.py +3 -1
  13. loom_kernel-2.22.0/src/loom/core/model/_json_schema.py +35 -0
  14. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/_loom_type.py +145 -9
  15. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +10 -4
  16. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/__init__.py +4 -0
  17. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/markers.py +29 -0
  18. loom_kernel-2.22.0/src/loom/core/use_case/outcome.py +52 -0
  19. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/__init__.py +2 -0
  20. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_historify/_common.py +11 -0
  21. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_historify/_log.py +26 -1
  22. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_historify/_ops.py +22 -1
  23. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_historify/_transform.py +22 -3
  24. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_write_policy.py +52 -42
  25. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_historify.py +37 -12
  26. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_writer.py +3 -36
  27. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/_historify.py +38 -11
  28. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/_writer.py +3 -37
  29. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_validators_step.py +40 -0
  30. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/__init__.py +2 -0
  31. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/__init__.py +3 -0
  32. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_history/__init__.py +2 -0
  33. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_history/_builder.py +75 -0
  34. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_history/_errors.py +38 -8
  35. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_history/_spec.py +6 -0
  36. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/compiler.py +173 -17
  37. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/constants.py +10 -1
  38. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/errors.py +59 -8
  39. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/openapi.py +111 -43
  40. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/response.py +14 -0
  41. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/router_runtime.py +97 -26
  42. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/rest_adapter.py +10 -2
  43. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/.gitignore +0 -0
  44. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/LICENSE +0 -0
  45. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/README.md +0 -0
  46. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/__init__.py +0 -0
  47. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/__init__.py +0 -0
  48. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_concurrency.py +0 -0
  49. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_filters.py +0 -0
  50. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_paths.py +0 -0
  51. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_roles.py +0 -0
  52. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_startup.py +0 -0
  53. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_transport.py +0 -0
  54. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/_usecase.py +0 -0
  55. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/__init__.py +0 -0
  56. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/_binding.py +0 -0
  57. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/_handlers.py +0 -0
  58. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/_rpc.py +0 -0
  59. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/card.py +0 -0
  60. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/events.py +0 -0
  61. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/a2a/server.py +0 -0
  62. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/abc.py +0 -0
  63. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/bootstrap.py +0 -0
  64. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/__init__.py +0 -0
  65. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/_compiler.py +0 -0
  66. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/_fingerprint.py +0 -0
  67. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/_plan.py +0 -0
  68. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
  69. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_conversation.py +0 -0
  70. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_feedable.py +0 -0
  71. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_hook.py +0 -0
  72. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_instructions.py +0 -0
  73. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
  74. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
  75. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_output.py +0 -0
  76. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/compiler/phases/_state.py +0 -0
  77. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/config.py +0 -0
  78. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/declarative/__init__.py +0 -0
  79. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/declarative/_envelope.py +0 -0
  80. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/declarative/_schema.py +0 -0
  81. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/declarative/_v1.py +0 -0
  82. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
  83. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/describe.py +0 -0
  84. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/__init__.py +0 -0
  85. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
  86. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
  87. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
  88. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
  89. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
  90. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_escape.py +0 -0
  91. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
  92. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
  93. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_history.py +0 -0
  94. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_instructions.py +0 -0
  95. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_limits.py +0 -0
  96. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +0 -0
  97. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
  98. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_native.py +0 -0
  99. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
  100. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
  101. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
  102. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
  103. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/extras/__init__.py +0 -0
  104. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/extras/a2a.py +0 -0
  105. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/extras/handlebars.py +0 -0
  106. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/extras/mcp.py +0 -0
  107. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/extras/skills.py +0 -0
  108. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
  109. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/__init__.py +0 -0
  110. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/_shared.py +0 -0
  111. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/anthropic.py +0 -0
  112. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/bedrock.py +0 -0
  113. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/gateway.py +0 -0
  114. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/openai.py +0 -0
  115. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/engines/pydantic_ai/providers/typesafe.py +0 -0
  116. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/__init__.py +0 -0
  117. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/_batch.py +0 -0
  118. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/_columns.py +0 -0
  119. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/_frames.py +0 -0
  120. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/_ledger.py +0 -0
  121. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/_runner.py +0 -0
  122. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/etl/_validation.py +0 -0
  123. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/fastapi/__init__.py +0 -0
  124. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/fastapi/endpoints.py +0 -0
  125. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/fastapi/response.py +0 -0
  126. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/fastapi/streaming.py +0 -0
  127. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/inference.py +0 -0
  128. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/pricing.py +0 -0
  129. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/registry.py +0 -0
  130. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/remote_auth.py +0 -0
  131. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/__init__.py +0 -0
  132. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_bounded.py +0 -0
  133. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_chain.py +0 -0
  134. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_conversation.py +0 -0
  135. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_grants.py +0 -0
  136. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_handle.py +0 -0
  137. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_health.py +0 -0
  138. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_hooks.py +0 -0
  139. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_lifecycle.py +0 -0
  140. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_limits.py +0 -0
  141. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/runtime/_mcp.py +0 -0
  142. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/validate/__init__.py +0 -0
  143. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/ai/validate/__main__.py +0 -0
  144. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/__init__.py +0 -0
  145. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/auto.py +0 -0
  146. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/bootstrap.py +0 -0
  147. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/config.py +0 -0
  148. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/constants.py +0 -0
  149. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/runner.py +0 -0
  150. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/celery/service.py +0 -0
  151. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/cli/__init__.py +0 -0
  152. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/cli/app.py +0 -0
  153. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/cli/schema.py +0 -0
  154. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/async_bridge.py +0 -0
  155. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/__init__.py +0 -0
  156. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/_decide.py +0 -0
  157. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/_grants.py +0 -0
  158. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/_roles.py +0 -0
  159. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/_scope.py +0 -0
  160. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/elevation.py +0 -0
  161. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/authz/product.py +0 -0
  162. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/backend/__init__.py +0 -0
  163. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/backend/core_model.py +0 -0
  164. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/backend/protocol.py +0 -0
  165. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/backend/scoped_ddl.py +0 -0
  166. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/backend/sqlalchemy.py +0 -0
  167. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/bootstrap/__init__.py +0 -0
  168. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
  169. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/bootstrap/kernel.py +0 -0
  170. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/__init__.py +0 -0
  171. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/_batching.py +0 -0
  172. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/_single_flight.py +0 -0
  173. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/abc/__init__.py +0 -0
  174. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/abc/backend.py +0 -0
  175. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/abc/config.py +0 -0
  176. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/abc/dependency.py +0 -0
  177. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/calls.py +0 -0
  178. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/codec.py +0 -0
  179. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/decorators.py +0 -0
  180. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/dependency.py +0 -0
  181. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/errors.py +0 -0
  182. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/gateway.py +0 -0
  183. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/keys.py +0 -0
  184. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/memory.py +0 -0
  185. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/repository.py +0 -0
  186. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/result_codec.py +0 -0
  187. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/serializer.py +0 -0
  188. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/cache/wiring.py +0 -0
  189. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/command/__init__.py +0 -0
  190. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/command/adapter.py +0 -0
  191. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/command/base.py +0 -0
  192. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/command/field.py +0 -0
  193. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/command/introspection.py +0 -0
  194. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/compiler.py +0 -0
  195. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/__init__.py +0 -0
  196. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/_boto3.py +0 -0
  197. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/_includes.py +0 -0
  198. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/_resolver_utils.py +0 -0
  199. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/binder.py +0 -0
  200. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/configurable.py +0 -0
  201. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/context.py +0 -0
  202. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/errors.py +0 -0
  203. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/keys.py +0 -0
  204. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/loader.py +0 -0
  205. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/model.py +0 -0
  206. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/observability.py +0 -0
  207. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/resolver.py +0 -0
  208. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/secrets.py +0 -0
  209. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/config/ssm.py +0 -0
  210. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/contracts/__init__.py +0 -0
  211. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/contracts/manifest.py +0 -0
  212. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/di/__init__.py +0 -0
  213. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/di/container.py +0 -0
  214. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/di/scope.py +0 -0
  215. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/discovery/__init__.py +0 -0
  216. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/discovery/_utils.py +0 -0
  217. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/discovery/base.py +0 -0
  218. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/discovery/interfaces.py +0 -0
  219. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/discovery/manifest.py +0 -0
  220. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/discovery/modules.py +0 -0
  221. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/__init__.py +0 -0
  222. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/compilable.py +0 -0
  223. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/events.py +0 -0
  224. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/metrics.py +0 -0
  225. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/engine/post_commit.py +0 -0
  226. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/expr/__init__.py +0 -0
  227. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/expr/eval.py +0 -0
  228. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/expr/nodes.py +0 -0
  229. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/expr/refs.py +0 -0
  230. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/identity/__init__.py +0 -0
  231. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/identity/context.py +0 -0
  232. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/identity/identity.py +0 -0
  233. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/identity/issuer.py +0 -0
  234. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/identity/wire.py +0 -0
  235. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/introspection/__init__.py +0 -0
  236. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/introspection/base.py +0 -0
  237. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/introspection/describe.py +0 -0
  238. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/job/__init__.py +0 -0
  239. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/job/callback.py +0 -0
  240. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/job/context.py +0 -0
  241. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/job/handle.py +0 -0
  242. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/job/service.py +0 -0
  243. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/locator.py +0 -0
  244. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/logger/__init__.py +0 -0
  245. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/logger/abc.py +0 -0
  246. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/logger/config.py +0 -0
  247. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/logger/registry.py +0 -0
  248. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/logger/structlogger.py +0 -0
  249. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/__init__.py +0 -0
  250. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/base.py +0 -0
  251. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/convert.py +0 -0
  252. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/enums.py +0 -0
  253. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/field.py +0 -0
  254. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/introspection.py +0 -0
  255. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/partition.py +0 -0
  256. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/privilege.py +0 -0
  257. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/projection.py +0 -0
  258. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/relation.py +0 -0
  259. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/scoped.py +0 -0
  260. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/struct.py +0 -0
  261. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/timestamped.py +0 -0
  262. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/types.py +0 -0
  263. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/model/types_postgres.py +0 -0
  264. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/__init__.py +0 -0
  265. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/config.py +0 -0
  266. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/event.py +0 -0
  267. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/observer/__init__.py +0 -0
  268. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/observer/noop.py +0 -0
  269. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/observer/otel.py +0 -0
  270. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/observer/structlog.py +0 -0
  271. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/otel_ids.py +0 -0
  272. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/protocol.py +0 -0
  273. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/runtime.py +0 -0
  274. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/span.py +0 -0
  275. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/observability/topology.py +0 -0
  276. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/persistence/__init__.py +0 -0
  277. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/persistence/abc.py +0 -0
  278. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/persistence/none.py +0 -0
  279. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/persistence/registry.py +0 -0
  280. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/plugins/__init__.py +0 -0
  281. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/plugins/entrypoints.py +0 -0
  282. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/plugins/optional.py +0 -0
  283. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/projection/__init__.py +0 -0
  284. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/projection/loaders.py +0 -0
  285. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/projection/runtime.py +0 -0
  286. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/__init__.py +0 -0
  287. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/__init__.py +0 -0
  288. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/cursor.py +0 -0
  289. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/errors.py +0 -0
  290. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/query.py +0 -0
  291. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/query_compiler.py +0 -0
  292. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/repo_for.py +0 -0
  293. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/repository.py +0 -0
  294. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/abc/session_scope.py +0 -0
  295. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
  296. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/dynamodb/backend.py +0 -0
  297. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/dynamodb/registry.py +0 -0
  298. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/dynamodb/repository.py +0 -0
  299. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
  300. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/__init__.py +0 -0
  301. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/backend.py +0 -0
  302. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/ids.py +0 -0
  303. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/query_compiler.py +0 -0
  304. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/registry.py +0 -0
  305. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/repository.py +0 -0
  306. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/uow.py +0 -0
  307. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mongo/values.py +0 -0
  308. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/mutation.py +0 -0
  309. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/registration.py +0 -0
  310. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/registry.py +0 -0
  311. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
  312. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/backend.py +0 -0
  313. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
  314. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
  315. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/migrations/__init__.py +0 -0
  316. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/migrations/env_template.py +0 -0
  317. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/migrations/hook.py +0 -0
  318. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/migrations/operations.py +0 -0
  319. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/migrations/runners.py +0 -0
  320. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
  321. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
  322. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
  323. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
  324. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
  325. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
  326. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
  327. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
  328. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
  329. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
  330. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
  331. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
  332. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
  333. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/__init__.py +0 -0
  334. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/bootstrap.py +0 -0
  335. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/config.py +0 -0
  336. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/elevate.py +0 -0
  337. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/guard/0001.sql +0 -0
  338. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/guard/0002.sql +0 -0
  339. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/guard/preflight.sql +0 -0
  340. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/guard_manifest.py +0 -0
  341. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/integrity.py +0 -0
  342. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/partitions.py +0 -0
  343. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/provider.py +0 -0
  344. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/schema.py +0 -0
  345. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/sources.py +0 -0
  346. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/rls/verify.py +0 -0
  347. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
  348. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/session_settings.py +0 -0
  349. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
  350. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
  351. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/response/__init__.py +0 -0
  352. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/response/base.py +0 -0
  353. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/routing/__init__.py +0 -0
  354. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/routing/ref.py +0 -0
  355. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/routing/resolver.py +0 -0
  356. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/runner.py +0 -0
  357. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/schema/__init__.py +0 -0
  358. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/schema/schema_mode.py +0 -0
  359. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/schema_names.py +0 -0
  360. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/__init__.py +0 -0
  361. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/abc/__init__.py +0 -0
  362. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/abc/contracts.py +0 -0
  363. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/abc/errors.py +0 -0
  364. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/caller_bound.py +0 -0
  365. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
  366. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/clickhouse/_client.py +0 -0
  367. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
  368. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/clickhouse/registry.py +0 -0
  369. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/config.py +0 -0
  370. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/roles.py +0 -0
  371. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/sql/service.py +0 -0
  372. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/symbols.py +0 -0
  373. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/tracing/__init__.py +0 -0
  374. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/tracing/context.py +0 -0
  375. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/transaction.py +0 -0
  376. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/transport/__init__.py +0 -0
  377. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/transport/adapter.py +0 -0
  378. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/uow/__init__.py +0 -0
  379. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/uow/abc.py +0 -0
  380. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/uow/context.py +0 -0
  381. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/_predicates.py +0 -0
  382. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/agent_markers.py +0 -0
  383. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/compute.py +0 -0
  384. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/constants.py +0 -0
  385. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/factory.py +0 -0
  386. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/field_ref.py +0 -0
  387. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/invoker.py +0 -0
  388. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/keys.py +0 -0
  389. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/mcp_markers.py +0 -0
  390. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/registry.py +0 -0
  391. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/rule.py +0 -0
  392. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/core/use_case/use_case.py +0 -0
  393. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/_uri.py +0 -0
  394. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/__init__.py +0 -0
  395. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_format_registry.py +0 -0
  396. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
  397. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
  398. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_merge.py +0 -0
  399. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_path_template.py +0 -0
  400. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_predicate.py +0 -0
  401. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
  402. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
  403. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
  404. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/__init__.py +0 -0
  405. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
  406. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
  407. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_frame.py +0 -0
  408. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
  409. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_reader.py +0 -0
  410. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_schema.py +0 -0
  411. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
  412. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
  413. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/polars/provider.py +0 -0
  414. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/__init__.py +0 -0
  415. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
  416. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/_reader.py +0 -0
  417. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/_schema.py +0 -0
  418. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
  419. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/backends/spark/provider.py +0 -0
  420. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/__init__.py +0 -0
  421. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
  422. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
  423. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
  424. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_options.py +0 -0
  425. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_paths.py +0 -0
  426. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_scope.py +0 -0
  427. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/checkpoint/_store.py +0 -0
  428. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/__init__.py +0 -0
  429. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_binding.py +0 -0
  430. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_compiler.py +0 -0
  431. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_errors.py +0 -0
  432. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_filter.py +0 -0
  433. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_plan.py +0 -0
  434. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_validators.py +0 -0
  435. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_validators_agents.py +0 -0
  436. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_validators_config.py +0 -0
  437. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
  438. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/_format.py +0 -0
  439. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/_read_options.py +0 -0
  440. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/_utils.py +0 -0
  441. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/_with_agent.py +0 -0
  442. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/_write_options.py +0 -0
  443. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
  444. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/expr/_params.py +0 -0
  445. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
  446. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
  447. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
  448. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/__init__.py +0 -0
  449. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/_from.py +0 -0
  450. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
  451. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/_from_config.py +0 -0
  452. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
  453. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
  454. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/source/_specs.py +0 -0
  455. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_client.py +0 -0
  456. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_errors.py +0 -0
  457. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_file.py +0 -0
  458. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
  459. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
  460. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_into.py +0 -0
  461. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
  462. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_table.py +0 -0
  463. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/declarative/target/_temp.py +0 -0
  464. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/executor/__init__.py +0 -0
  465. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/executor/_agents.py +0 -0
  466. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/executor/_dispatcher.py +0 -0
  467. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/executor/_executor.py +0 -0
  468. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/__init__.py +0 -0
  469. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/_registry.py +0 -0
  470. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/__init__.py +0 -0
  471. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_clickhouse.py +0 -0
  472. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
  473. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
  474. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
  475. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_mongo.py +0 -0
  476. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
  477. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
  478. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
  479. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/sources/_serialization.py +0 -0
  480. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/targets/__init__.py +0 -0
  481. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/io/targets/_clickhouse.py +0 -0
  482. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/__init__.py +0 -0
  483. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/_config.py +0 -0
  484. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/_observer.py +0 -0
  485. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/_records.py +0 -0
  486. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
  487. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
  488. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
  489. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
  490. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/__init__.py +0 -0
  491. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/_builder.py +0 -0
  492. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/_ops.py +0 -0
  493. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/_protocol.py +0 -0
  494. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/_runner.py +0 -0
  495. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/_step.py +0 -0
  496. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
  497. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
  498. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/__init__.py +0 -0
  499. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_generics.py +0 -0
  500. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_params.py +0 -0
  501. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
  502. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_process.py +0 -0
  503. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_sql.py +0 -0
  504. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_step.py +0 -0
  505. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_step_client.py +0 -0
  506. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
  507. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/__init__.py +0 -0
  508. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/_agents.py +0 -0
  509. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/_providers.py +0 -0
  510. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/_wiring.py +0 -0
  511. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/config_loader.py +0 -0
  512. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/core.py +0 -0
  513. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/errors.py +0 -0
  514. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runner/filtering.py +0 -0
  515. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runtime/__init__.py +0 -0
  516. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runtime/_config_values.py +0 -0
  517. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/runtime/contracts.py +0 -0
  518. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/schema/__init__.py +0 -0
  519. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/schema/_contract.py +0 -0
  520. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/schema/_schema.py +0 -0
  521. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/storage/__init__.py +0 -0
  522. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/storage/_config.py +0 -0
  523. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/storage/_file_locator.py +0 -0
  524. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/storage/_locator.py +0 -0
  525. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/storage/routing.py +0 -0
  526. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/testing/__init__.py +0 -0
  527. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/testing/_result.py +0 -0
  528. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/testing/_runners.py +0 -0
  529. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/testing/_scenario.py +0 -0
  530. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/testing/_stubs.py +0 -0
  531. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/etl/testing/spark.py +0 -0
  532. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/__init__.py +0 -0
  533. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_async.py +0 -0
  534. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_config.py +0 -0
  535. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_ctx.py +0 -0
  536. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_flow_yaml.py +0 -0
  537. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_meta.py +0 -0
  538. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_placeholders.py +0 -0
  539. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/_summary.py +0 -0
  540. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/deploy/__init__.py +0 -0
  541. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/deploy/_discovery.py +0 -0
  542. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/deploy/_schedule.py +0 -0
  543. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/deploy/_yaml_etls.py +0 -0
  544. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/deploy/entrypoint.py +0 -0
  545. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/__init__.py +0 -0
  546. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_assemble.py +0 -0
  547. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_backfill.py +0 -0
  548. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
  549. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_body.py +0 -0
  550. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_common.py +0 -0
  551. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_factory.py +0 -0
  552. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_hooks.py +0 -0
  553. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_maintenance.py +0 -0
  554. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_params.py +0 -0
  555. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_run_name.py +0 -0
  556. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_runtime.py +0 -0
  557. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_signature.py +0 -0
  558. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/flow/_stages.py +0 -0
  559. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/manifest/__init__.py +0 -0
  560. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/manifest/_model.py +0 -0
  561. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/manifest/_s3.py +0 -0
  562. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/manifest/_store.py +0 -0
  563. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/__init__.py +0 -0
  564. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/_event.py +0 -0
  565. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/_factory.py +0 -0
  566. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/_format.py +0 -0
  567. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/_port.py +0 -0
  568. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/_slack.py +0 -0
  569. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/notify/_sns.py +0 -0
  570. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/observer/__init__.py +0 -0
  571. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/observer/_flow.py +0 -0
  572. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
  573. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/observer/_manifest.py +0 -0
  574. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prefect/observer/_task_run.py +0 -0
  575. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prometheus/__init__.py +0 -0
  576. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prometheus/_instruments.py +0 -0
  577. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prometheus/adapter.py +0 -0
  578. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prometheus/kafka.py +0 -0
  579. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prometheus/lifecycle.py +0 -0
  580. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/prometheus/middleware.py +0 -0
  581. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/py.typed +0 -0
  582. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/__init__.py +0 -0
  583. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/_body.py +0 -0
  584. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/adapter.py +0 -0
  585. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/auth/__init__.py +0 -0
  586. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/auth/abc.py +0 -0
  587. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/auth/config.py +0 -0
  588. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/auth/jwt.py +0 -0
  589. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/auth/middleware.py +0 -0
  590. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/autocrud.py +0 -0
  591. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/config.py +0 -0
  592. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/cors.py +0 -0
  593. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/__init__.py +0 -0
  594. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/_errors.py +0 -0
  595. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
  596. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/app.py +0 -0
  597. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/auto.py +0 -0
  598. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/health.py +0 -0
  599. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/fastapi/sql.py +0 -0
  600. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/middleware.py +0 -0
  601. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/rest/model.py +0 -0
  602. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/__init__.py +0 -0
  603. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/__init__.py +0 -0
  604. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
  605. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
  606. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
  607. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
  608. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
  609. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_errors.py +0 -0
  610. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_operators.py +0 -0
  611. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
  612. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
  613. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
  614. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
  615. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
  616. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
  617. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
  618. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
  619. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
  620. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
  621. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
  622. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
  623. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/bytewax/runner.py +0 -0
  624. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/__init__.py +0 -0
  625. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/_bindings.py +0 -0
  626. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/_compiler.py +0 -0
  627. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/_errors.py +0 -0
  628. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/_plan.py +0 -0
  629. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
  630. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/compiler/phases/validate.py +0 -0
  631. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/core/__init__.py +0 -0
  632. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/core/_errors.py +0 -0
  633. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/core/_exceptions.py +0 -0
  634. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/core/_message.py +0 -0
  635. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/core/_tracing.py +0 -0
  636. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/core/_typing.py +0 -0
  637. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/graph/__init__.py +0 -0
  638. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/graph/_flow.py +0 -0
  639. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/__init__.py +0 -0
  640. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_codec.py +0 -0
  641. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_config.py +0 -0
  642. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_errors.py +0 -0
  643. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
  644. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_message.py +0 -0
  645. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_record.py +0 -0
  646. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/_wire.py +0 -0
  647. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
  648. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
  649. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
  650. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
  651. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
  652. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
  653. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
  654. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
  655. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
  656. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/mongo/__init__.py +0 -0
  657. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
  658. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/mongo/_config.py +0 -0
  659. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/mongo/_event.py +0 -0
  660. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/mongo/_normalize.py +0 -0
  661. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/__init__.py +0 -0
  662. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_boundary.py +0 -0
  663. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_branches.py +0 -0
  664. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
  665. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
  666. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_decompose.py +0 -0
  667. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
  668. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
  669. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_fork.py +0 -0
  670. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_helpers.py +0 -0
  671. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_mongo.py +0 -0
  672. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_protocols.py +0 -0
  673. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_router.py +0 -0
  674. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_shape.py +0 -0
  675. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_sink.py +0 -0
  676. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_step.py +0 -0
  677. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_table/__init__.py +0 -0
  678. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_table/common.py +0 -0
  679. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_table/config.py +0 -0
  680. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/_with.py +0 -0
  681. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/nodes/refs.py +0 -0
  682. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/streaming/testing.py +0 -0
  683. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/__init__.py +0 -0
  684. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/agents.py +0 -0
  685. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/golden.py +0 -0
  686. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/http_harness.py +0 -0
  687. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/in_memory.py +0 -0
  688. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/repository_harness.py +0 -0
  689. {loom_kernel-2.20.2 → loom_kernel-2.22.0}/src/loom/testing/runner.py +0 -0
@@ -184,6 +184,78 @@
184
184
 
185
185
  ### rest
186
186
 
187
+ - **rest:** a use case says it created. `loom.core.use_case.Created[T]` wraps
188
+ the result of a use case declared `T | Created[T]`. The REST route answers
189
+ `Created(v)` with `201` and body `v`, and any other result with the route's
190
+ `status_code` as before; OpenAPI documents both statuses with the same
191
+ schema. `Created(v, location="/items/1")` also sends `Location` (RFC 9110
192
+ §15.3.2), which OpenAPI declares on the `201`; a location that is empty or
193
+ holds a character not allowed in an RFC 3986 URI reference raises
194
+ `ValueError`.
195
+ `LoomRestAdapter.handle` answers a `Created` the same way. Compilation
196
+ refuses a `Created` that wraps a type other than another member of the
197
+ result, appears twice or is not parameterised, and a `Created` on a route
198
+ whose `status_code` is already `201`. The invoker, jobs and Celery receive
199
+ the wrapper and read `.value`; the use case imports nothing from HTTP.
200
+ - **rest:** `429` with `Retry-After`. `ErrorCode.RATE_LIMITED`
201
+ (`"rate_limited"`) and `loom.core.errors.RateLimited(retry_after)`, a
202
+ `DomainError` holding the delay in whole seconds, rounded up and at least
203
+ 1; a non-finite `retry_after` raises `ValueError`. `HttpErrorMapper`
204
+ answers it with `429`, the standard body and `Retry-After: <seconds>`.
205
+ loom ships no limiter: the consumer decides who is limited and raises
206
+ `RateLimited`.
207
+ - **rest:** declared query parameters. `loom.core.use_case.Query()` marks an
208
+ `execute` parameter typed with a strict `msgspec.Struct` or pydantic model
209
+ whose fields are each a string, integer, number, boolean, enum or
210
+ `Literal`, optionally `None`. The REST route accepts exactly its wire
211
+ names, plus `profile` where the route exposes it and `execute` declares an
212
+ annotated `profile` parameter, the condition OpenAPI publishes it under.
213
+ - An unknown or repeated parameter, `profile` included, answers
214
+ `400 unsupported_query`.
215
+ - A bad value answers `400 query_validation` (`ErrorCode.QUERY_VALIDATION`),
216
+ with the body and `violations` of `boundary_validation`; `422` stays for
217
+ bodies. A `profile` the route does not allow answers the same 400, on
218
+ field `profile` and without the value.
219
+ - Values are spelled strictly: a number follows the JSON number grammar
220
+ and is finite, an integer its integer subset within `[-2**63, 2**64)`
221
+ (an `IntEnum` or an int `Literal` is coerced the same way), a boolean is
222
+ `true` or `false`, `null` is never `None`, and a date or time field
223
+ refuses a number. A refused query never builds the use case.
224
+ - OpenAPI publishes one parameter per field, with `required`, its
225
+ constraints and description and no `title`; named enums go to
226
+ `components.schemas`.
227
+ - List, object and multi-type fields, a field named like a path parameter
228
+ or `profile`, a `QuerySpec` next to it and a second `Query()` are refused
229
+ at startup.
230
+ - A caller other than REST must pass an instance of the query type; any
231
+ other value raises `ParameterBindingError` naming the parameter and the
232
+ type received, never the value.
233
+ - A `Job` that declares `Query()` fails to compile with a
234
+ `CompilationError`: a job is dispatched with primitive parameters, so the
235
+ query struct could never reach it.
236
+ - An agent granted a use case that takes `Query()` fails to compile with
237
+ `USECASE_DECLARES_QUERY`.
238
+ - New: `ExecutionPlan.query_binding` (`QueryBinding`),
239
+ `CompiledRoute.query_fields` (`QueryField`), `CompiledRoute.result_type`
240
+ and `created_type`, `build_success_responses`, `LoomType.from_query`,
241
+ `names_query_spec`, `created_response`, `RETRY_AFTER_HEADER`,
242
+ `LOCATION_HEADER`, and a keyword-only `code` on `BoundaryValidationError`
243
+ (default `boundary_validation`). `build_query_parameters_schema` takes an
244
+ optional `component_registry`. `QuerySpec` routes are unchanged.
245
+ - **rest:** step-up authentication (RFC 9470).
246
+ `loom.core.errors.InsufficientAuthentication(message, *, max_age=None,
247
+ acr_values=())`, an `Unauthenticated` with its own code
248
+ `ErrorCode.INSUFFICIENT_AUTHENTICATION` (`"insufficient_authentication"`),
249
+ answers `401` with `WWW-Authenticate: Bearer
250
+ error="insufficient_user_authentication", error_description="…"`, plus
251
+ `max_age="N"` and `acr_values="…"` when given. In the description each
252
+ character RFC 6750 §3 does not allow becomes a space, runs of spaces
253
+ collapse, an empty result falls back to the default message, and the text
254
+ is cut at 256 characters. A non-`str` message, a negative or non-int
255
+ `max_age`, `acr_values` that is a single `str` or `bytes`, or
256
+ an ACR value that is not a `str`, is empty, or holds anything but visible
257
+ ASCII other than a double quote or a backslash raise `ValueError`. Every
258
+ other 401 keeps the plain `Bearer` challenge.
187
259
  - **rest:** a `403` can say why and what is missing. `Forbidden` takes two
188
260
  optional keyword arguments, `reason` (a machine-readable cause such as
189
261
  `"mfa_required"`) and `missing` (the permissions the caller lacks, kept as a
@@ -375,6 +447,13 @@
375
447
 
376
448
  ### core
377
449
 
450
+ - **core:** the `LoomType` protocol gains `from_query(params)`, which
451
+ validates query-string values strictly. A number takes the JSON number
452
+ grammar and must be finite, an integer its integer subset within
453
+ `[-2**63, 2**64)`, a boolean `true` or `false`; `null` is never `None` and
454
+ a date or time field refuses a number instead of reading a timestamp. Both
455
+ implementations are private to `loom.core.model`; a class of your own
456
+ declared as a `LoomType` must add the method.
378
457
  - **core:** on a model with a composite primary key, the SQLAlchemy
379
458
  repository's `get_by_id`, `exists`, `update` and `delete` take the key as a
380
459
  tuple of every key value in declaration order (`repo.get_by_id((account_id,
@@ -485,6 +564,17 @@
485
564
 
486
565
  ### rest
487
566
 
567
+ - **rest:** every route now resolves its request parameters and decodes its
568
+ body before the use case is built, so a request refused at that point
569
+ never runs the use case's constructor.
570
+ - **rest:** `build_success_response_schema` reads `CompiledRoute.result_type`
571
+ instead of the use case's annotations; a `CompiledRoute` built by hand
572
+ without it documents no success body.
573
+ - **rest:** an error whose `code` is `"query_validation"` now answers `400`,
574
+ and one coded `"insufficient_authentication"` answers `401` with the plain
575
+ `Bearer` challenge unless it is an `InsufficientAuthentication`.
576
+ - **rest:** an error whose `code` is `"rate_limited"` now answers `429`
577
+ instead of `500`; only a `RateLimited` carries `Retry-After`.
488
578
  - **rest:** a `RestInterface` whose `prefix` contains `{` now raises
489
579
  `InterfaceCompilationError` at compile time, naming the interface and the
490
580
  prefix; declare the placeholder in the route `path` instead (a catch-all
@@ -606,6 +696,16 @@
606
696
 
607
697
  ### core
608
698
 
699
+ - **core:** a `BoundaryValidationError` no longer echoes the rejected value
700
+ (#347). msgspec's `Invalid enum value 'x'` (an `Enum`, `IntEnum` or `Literal`
701
+ field or dict key) and `Invalid value 'x'` (a tagged-union tag) become
702
+ `Invalid enum value` and `Invalid value`, in the message and the violation,
703
+ with the field path kept: ``Invalid enum value - at `$.colour` ``. pydantic's
704
+ `union_tag_invalid`, `uuid_parsing` and `bytes_invalid_encoding` reasons
705
+ become `Input tag does not match any of the expected tags`, `Input should be
706
+ a valid UUID` and `Data should be valid in its declared encoding`. A message
707
+ raised by the type's own validator keeps its text.
708
+
609
709
  - **core:** the relation steps and the `load_many` projection steps of a read
610
710
  profile run one after another on the request's session. They ran with
611
711
  `asyncio.gather` on that one session: when one step failed while another was
@@ -782,6 +882,17 @@
782
882
 
783
883
  ### rest
784
884
 
885
+ - **rest:** the OpenAPI `limit` parameter of a `QuerySpec` route published
886
+ `maximum: 1000` and `default: 50` whatever `RestApiDefaults.max_limit` said,
887
+ while the router clamped `?limit=` to `max_limit`. The schema now publishes
888
+ `max_limit` as its `maximum` and `min(50, max_limit)` as its `default`, the
889
+ values the router applies. A larger `?limit=` is still clamped, not refused.
890
+ - **rest:** a `QuerySpec` filter or sort on a field the SQLAlchemy compiler
891
+ cannot resolve, or a filter the repository's allow-list refuses, answered
892
+ `500 internal_error`. `FilterPathError` and `UnsafeFilterError` are now
893
+ `DomainError`s with code `unsupported_query`, so the route answers `400` with
894
+ the standard error body, whose message names the field and never its value.
895
+ Both remain `ValueError` subclasses with unchanged constructors and messages.
785
896
  - **rest:** a path placeholder in `RestInterface.prefix` was dropped. The route
786
897
  was registered on prefix + path, but path parameters were read from the
787
898
  route `path` only, so the use case never received the prefix parameter (a
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: loom-kernel
3
- Version: 2.20.2
3
+ Version: 2.22.0
4
4
  Summary: Loom Python project
5
5
  License-File: LICENSE
6
6
  Classifier: Programming Language :: Python :: 3
@@ -333,6 +333,7 @@ extend-immutable-calls = [
333
333
  "Load",
334
334
  "LoadById",
335
335
  "Mcp",
336
+ "Query",
336
337
  "loom.core.use_case.Agent",
337
338
  "loom.core.use_case.Caller",
338
339
  "loom.core.use_case.Exists",
@@ -340,6 +341,7 @@ extend-immutable-calls = [
340
341
  "loom.core.use_case.Load",
341
342
  "loom.core.use_case.LoadById",
342
343
  "loom.core.use_case.Mcp",
344
+ "loom.core.use_case.Query",
343
345
  "loom.core.use_case.markers.Agent",
344
346
  "loom.core.use_case.markers.Caller",
345
347
  "loom.core.use_case.markers.Exists",
@@ -347,6 +349,7 @@ extend-immutable-calls = [
347
349
  "loom.core.use_case.markers.Load",
348
350
  "loom.core.use_case.markers.LoadById",
349
351
  "loom.core.use_case.markers.Mcp",
352
+ "loom.core.use_case.markers.Query",
350
353
  ]
351
354
 
352
355
  [tool.pyright]
@@ -68,6 +68,7 @@ from loom.ai.errors import (
68
68
  sql_connection_roles_unbound,
69
69
  sql_connection_unknown,
70
70
  sql_result_bound_missing,
71
+ usecase_declares_query,
71
72
  usecase_key_unknown,
72
73
  )
73
74
  from loom.ai.inference import InferenceTarget
@@ -227,9 +228,14 @@ def _compile_usecase(capability: UsecaseCapability, context: _Context) -> _Handl
227
228
  use_cases: list[type[Compilable]] = []
228
229
  for key in capability.keys:
229
230
  try:
230
- use_cases.append(context.registry.resolve(key))
231
+ use_case = context.registry.resolve(key)
231
232
  except KeyError:
232
233
  issues.append(usecase_key_unknown(context.component, key))
234
+ continue
235
+ execution = getattr(use_case, "__execution_plan__", None)
236
+ if execution is not None and execution.query_binding is not None:
237
+ issues.append(usecase_declares_query(context.component, key))
238
+ use_cases.append(use_case)
233
239
  if issues:
234
240
  return None, issues
235
241
  return CompiledUsecaseCapability(keys=capability.keys, use_cases=tuple(use_cases)), []
@@ -101,6 +101,7 @@ class AgentErrorCode(StrEnum):
101
101
  NATIVE_TOOL_DUPLICATE = "NATIVE_TOOL_DUPLICATE"
102
102
  CAPABILITY_EMPTY = "CAPABILITY_EMPTY"
103
103
  USECASE_KEY_UNKNOWN = "USECASE_KEY_UNKNOWN"
104
+ USECASE_DECLARES_QUERY = "USECASE_DECLARES_QUERY"
104
105
  SQL_CONNECTION_UNKNOWN = "SQL_CONNECTION_UNKNOWN"
105
106
  SQL_CONNECTION_NOT_READONLY = "SQL_CONNECTION_NOT_READONLY"
106
107
  SQL_CONFIG_MISSING = "SQL_CONFIG_MISSING"
@@ -648,6 +649,19 @@ def usecase_key_unknown(component: str, key: str) -> AgentCompilationIssue:
648
649
  )
649
650
 
650
651
 
652
+ def usecase_declares_query(component: str, key: str) -> AgentCompilationIssue:
653
+ """A granted use case takes a ``Query()`` parameter, which a tool call cannot bind."""
654
+ return AgentCompilationIssue(
655
+ code=AgentErrorCode.USECASE_DECLARES_QUERY,
656
+ message=(
657
+ f"{component}: use case '{key}' declares a Query() parameter, which an agent "
658
+ "tool call cannot bind; grant a use case without one"
659
+ ),
660
+ component=component,
661
+ field="capabilities.keys",
662
+ )
663
+
664
+
651
665
  def sql_connection_unknown(component: str, connection: str) -> AgentCompilationIssue:
652
666
  """A ``sql`` capability names a connection that is not configured."""
653
667
  return AgentCompilationIssue(
@@ -18,9 +18,12 @@ from loom.core.engine.plan import (
18
18
  LoadStep,
19
19
  McpBinding,
20
20
  ParamBinding,
21
+ QueryBinding,
21
22
  RuleStep,
22
23
  )
24
+ from loom.core.job.job import Job
23
25
  from loom.core.logger import LoggerPort, get_logger
26
+ from loom.core.model import UnsupportedBoundaryType, loom_type
24
27
  from loom.core.use_case.markers import (
25
28
  LookupKind,
26
29
  SourceKind,
@@ -31,6 +34,7 @@ from loom.core.use_case.markers import (
31
34
  _LoadByIdMarker,
32
35
  _LoadMarker,
33
36
  _McpMarker,
37
+ _QueryMarker,
34
38
  )
35
39
 
36
40
 
@@ -57,6 +61,7 @@ class _SignatureBindings:
57
61
  mcp_bindings: list[McpBinding] = field(default_factory=list)
58
62
  input_binding: InputBinding | None = None
59
63
  caller_binding: CallerBinding | None = None
64
+ query_binding: QueryBinding | None = None
60
65
 
61
66
 
62
67
  class UseCaseCompiler:
@@ -173,6 +178,7 @@ class UseCaseCompiler:
173
178
  caller_binding=bindings.caller_binding,
174
179
  agent_bindings=tuple(bindings.agent_bindings),
175
180
  mcp_bindings=tuple(bindings.mcp_bindings),
181
+ query_binding=bindings.query_binding,
176
182
  )
177
183
  use_case_type.__execution_plan__ = plan
178
184
  return plan
@@ -224,6 +230,10 @@ class UseCaseCompiler:
224
230
  self._collect_caller(use_case_type, name, bindings)
225
231
  return
226
232
 
233
+ if isinstance(marker, _QueryMarker):
234
+ self._collect_query(use_case_type, name, annotation, bindings)
235
+ return
236
+
227
237
  if isinstance(marker, _AgentMarker):
228
238
  self._collect_agent(name, annotation, marker, bindings)
229
239
  return
@@ -288,6 +298,32 @@ class UseCaseCompiler:
288
298
  bindings.caller_binding = CallerBinding(name=name)
289
299
  self._logger.info(f"[BOOT] - Detected Caller: {name}")
290
300
 
301
+ def _collect_query(
302
+ self,
303
+ use_case_type: type[Compilable],
304
+ name: str,
305
+ annotation: Any,
306
+ bindings: _SignatureBindings,
307
+ ) -> None:
308
+ where = f"{use_case_type.__qualname__}.execute"
309
+ if issubclass(use_case_type, Job):
310
+ raise CompilationError(
311
+ f"{where}: a Job cannot declare Query(); a job is dispatched with plain "
312
+ "parameters, so pass the values it needs as parameters instead"
313
+ )
314
+ if bindings.query_binding is not None:
315
+ raise CompilationError(f"{where}: only one Query() parameter is allowed")
316
+ try:
317
+ loom_type(annotation)
318
+ except UnsupportedBoundaryType as exc:
319
+ raise CompilationError(
320
+ f"{where}: Query() parameter '{name}' must be a strict msgspec.Struct or "
321
+ f"pydantic model: {exc.message}"
322
+ ) from exc
323
+ bindings.query_binding = QueryBinding(name=name, query_type=annotation)
324
+ bindings.param_bindings.append(ParamBinding(name=name, annotation=annotation))
325
+ self._logger.info(f"[BOOT] - Detected Query: {annotation.__name__} -> {name}")
326
+
291
327
  def _collect_agent(
292
328
  self,
293
329
  name: str,
@@ -575,6 +575,7 @@ class RuntimeExecutor:
575
575
  inputs: _ExecutionInputs,
576
576
  ) -> Any:
577
577
  bound: dict[str, Any] = {}
578
+ self._check_query(plan, inputs.params or {})
578
579
  self._bind_params(plan, inputs.params or {}, bound)
579
580
  self._bind_caller(plan, inputs.identity, bound)
580
581
  self._bind_agents(plan, inputs.identity, bound)
@@ -688,6 +689,24 @@ class RuntimeExecutor:
688
689
  use_case_name=plan.use_case_type.__qualname__,
689
690
  )
690
691
 
692
+ @staticmethod
693
+ def _check_query(plan: ExecutionPlan, params: dict[str, Any]) -> None:
694
+ """Refuse a ``Query()`` value that is not an instance of its type.
695
+
696
+ A generic coercion would call the type with the raw value: a struct
697
+ whose fields are positional would take a dict as its first field. The
698
+ message names the type received, never the value.
699
+ """
700
+ binding = plan.query_binding
701
+ if binding is None or binding.name not in params:
702
+ return
703
+ raw = params[binding.name]
704
+ if not isinstance(raw, binding.query_type):
705
+ raise ParameterBindingError(
706
+ f"{plan.use_case_type.__qualname__}: parameter '{binding.name}' takes a "
707
+ f"{binding.query_type.__name__} instance, got {type(raw).__name__}"
708
+ )
709
+
691
710
  @staticmethod
692
711
  def _bind_caller(
693
712
  plan: ExecutionPlan,
@@ -40,6 +40,24 @@ class InputBinding:
40
40
  command_type: type[Any]
41
41
 
42
42
 
43
+ @dataclass(frozen=True)
44
+ class QueryBinding:
45
+ """The declared query parameter marked with ``Query()``.
46
+
47
+ The parameter is also an ordinary :class:`ParamBinding`: the executor
48
+ receives the typed value under ``name``. This binding tells a transport
49
+ which type declares the query it must accept and decode.
50
+
51
+ Args:
52
+ name: Parameter name as declared in the signature.
53
+ query_type: The strict ``msgspec.Struct`` or pydantic model declaring
54
+ the query.
55
+ """
56
+
57
+ name: str
58
+ query_type: type[Any]
59
+
60
+
43
61
  @dataclass(frozen=True)
44
62
  class CallerBinding:
45
63
  """The caller-identity parameter marked with ``Caller()``.
@@ -205,6 +223,8 @@ class ExecutionPlan:
205
223
  empty when the use case declares none.
206
224
  mcp_bindings: ``Mcp()`` marker bindings, in declaration order; empty
207
225
  when the use case declares none.
226
+ query_binding: ``Query()`` binding, or ``None`` when the use case
227
+ declares no ``Query()`` parameter.
208
228
  load_steps: Entity prefetch steps, in declaration order.
209
229
  exists_steps: Boolean existence checks, in declaration order.
210
230
  compute_steps: Compute transformations, in declaration order.
@@ -247,3 +267,4 @@ class ExecutionPlan:
247
267
  caller_binding: CallerBinding | None = None
248
268
  agent_bindings: tuple[AgentBinding, ...] = ()
249
269
  mcp_bindings: tuple[McpBinding, ...] = ()
270
+ query_binding: QueryBinding | None = None
@@ -2,8 +2,10 @@ from loom.core.errors.errors import (
2
2
  Conflict,
3
3
  DomainError,
4
4
  Forbidden,
5
+ InsufficientAuthentication,
5
6
  LoomError,
6
7
  NotFound,
8
+ RateLimited,
7
9
  RuleViolation,
8
10
  RuleViolations,
9
11
  SystemError,
@@ -14,8 +16,10 @@ __all__ = [
14
16
  "Conflict",
15
17
  "DomainError",
16
18
  "Forbidden",
19
+ "InsufficientAuthentication",
17
20
  "LoomError",
18
21
  "NotFound",
22
+ "RateLimited",
19
23
  "RuleViolation",
20
24
  "RuleViolations",
21
25
  "SystemError",
@@ -26,13 +26,16 @@ class ErrorCode(StrEnum):
26
26
 
27
27
  NOT_FOUND = "not_found"
28
28
  UNAUTHENTICATED = "unauthenticated"
29
+ INSUFFICIENT_AUTHENTICATION = "insufficient_authentication"
29
30
  FORBIDDEN = "forbidden"
30
31
  CONFLICT = "conflict"
31
32
  RULE_VIOLATION = "rule_violation"
32
33
  RULE_VIOLATIONS = "rule_violations"
33
34
  BOUNDARY_VALIDATION = "boundary_validation"
35
+ QUERY_VALIDATION = "query_validation"
34
36
  UNSUPPORTED_FORMAT = "unsupported_format"
35
37
  UNSUPPORTED_QUERY = "unsupported_query"
38
+ RATE_LIMITED = "rate_limited"
36
39
  SYSTEM_ERROR = "system_error"
37
40
  SERVICE_UNAVAILABLE = "service_unavailable"
38
41
  POST_COMMIT_FAILURE = "post_commit_failure"
@@ -1,7 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import math
3
4
  from collections.abc import Iterable, Sequence
4
- from typing import Any
5
+ from typing import Any, ClassVar
5
6
 
6
7
  from loom.core.errors.codes import ErrorCode
7
8
 
@@ -92,6 +93,66 @@ class Unauthenticated(DomainError):
92
93
  super().__init__(message, code=ErrorCode.UNAUTHENTICATED)
93
94
 
94
95
 
96
+ class InsufficientAuthentication(Unauthenticated):
97
+ """Raised when the caller is authenticated, but not strongly or recently enough.
98
+
99
+ The caller can fix it by authenticating again under the stated
100
+ requirements (step-up).
101
+
102
+ Args:
103
+ message: Description of the missing authentication strength.
104
+ max_age: Seconds within which the caller must have authenticated;
105
+ ``None`` when recency is not the issue.
106
+ acr_values: Authentication context classes acceptable for a retry,
107
+ in order of preference; empty when any will do.
108
+
109
+ Raises:
110
+ ValueError: If ``message`` is not a ``str``, ``max_age`` is not a
111
+ non-negative ``int``, ``acr_values`` is a single ``str`` or
112
+ ``bytes``, or a value is not a ``str``, is empty, or holds a
113
+ character outside visible ASCII, a double quote or a backslash.
114
+ TypeError: If ``acr_values`` is not iterable.
115
+
116
+ Example::
117
+
118
+ raise InsufficientAuthentication(max_age=300, acr_values=("urn:mfa",))
119
+ """
120
+
121
+ default_message: ClassVar[str] = "A different authentication level is required"
122
+
123
+ def __init__(
124
+ self,
125
+ message: str = default_message,
126
+ *,
127
+ max_age: int | None = None,
128
+ acr_values: Iterable[str] = (),
129
+ ) -> None:
130
+ if not isinstance(message, str):
131
+ raise ValueError("InsufficientAuthentication.message must be a str")
132
+ if max_age is not None and (type(max_age) is not int or max_age < 0):
133
+ raise ValueError("InsufficientAuthentication.max_age must be a non-negative int")
134
+ if isinstance(acr_values, (str, bytes)):
135
+ raise ValueError(
136
+ "InsufficientAuthentication.acr_values takes an iterable of str values, "
137
+ "not one str or bytes"
138
+ )
139
+ values = tuple(acr_values)
140
+ if not all(
141
+ isinstance(value, str)
142
+ and value
143
+ and all("!" <= char <= "~" and char not in '"\\' for char in value)
144
+ for value in values
145
+ ):
146
+ raise ValueError(
147
+ "InsufficientAuthentication.acr_values must be visible ASCII without "
148
+ "whitespace, double quotes or backslashes"
149
+ )
150
+ super().__init__(message)
151
+ self.code = ErrorCode.INSUFFICIENT_AUTHENTICATION
152
+ self.max_age = max_age
153
+ self.acr_values: tuple[str, ...] = values
154
+
155
+
95
156
  class Forbidden(DomainError):
96
157
  """Raised when an action is not permitted for the caller.
97
158
 
@@ -143,6 +204,32 @@ class Conflict(DomainError):
143
204
  super().__init__(message, code=ErrorCode.CONFLICT)
144
205
 
145
206
 
207
+ class RateLimited(DomainError):
208
+ """Raised when the caller spent its budget and must wait before retrying.
209
+
210
+ loom ships no limiter: the consumer decides who is limited and how much,
211
+ and raises this when a caller exceeds it.
212
+
213
+ Args:
214
+ retry_after: Seconds the caller should wait. Kept as whole seconds,
215
+ rounded up and at least ``1``.
216
+ message: Human-readable description of the refusal.
217
+
218
+ Raises:
219
+ ValueError: ``retry_after`` is not finite.
220
+
221
+ Example::
222
+
223
+ raise RateLimited(retry_after=2.0)
224
+ """
225
+
226
+ def __init__(self, retry_after: float, message: str = "Too many requests.") -> None:
227
+ if not math.isfinite(retry_after):
228
+ raise ValueError(f"RateLimited.retry_after must be finite, got {retry_after!r}")
229
+ super().__init__(message, code=ErrorCode.RATE_LIMITED)
230
+ self.retry_after = max(1, math.ceil(retry_after))
231
+
232
+
146
233
  class RuleViolation(DomainError):
147
234
  """Raised when a single business rule is violated.
148
235
 
@@ -18,7 +18,9 @@ class Job(ABC, Generic[ResultT]):
18
18
 
19
19
  ``Job`` is independent of ``UseCase`` — it does not inherit from it.
20
20
  The compiler and factory operate on ``__execution_plan__`` and
21
- ``execute()`` by duck typing, so they support ``Job`` without changes.
21
+ ``execute()`` by duck typing, so they support ``Job`` without changes,
22
+ except that the compiler refuses a ``Query()`` parameter on a ``Job``: a
23
+ job is dispatched with primitive parameters.
22
24
 
23
25
  Subclass and implement ``execute`` with any typed signature. The method
24
26
  may be ``async def`` or a plain ``def``; the Celery runner detects the
@@ -0,0 +1,35 @@
1
+ """Reading the JSON Schema a :class:`~loom.core.model.LoomType` publishes.
2
+
3
+ msgspec puts the root of a model behind ``{"$ref": "#/$defs/Name"}`` and
4
+ pydantic inlines it; both keep nested definitions under ``$defs`` and write
5
+ an optional value as an ``anyOf`` with a ``null`` branch.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from collections.abc import Mapping
11
+ from typing import Any
12
+
13
+ DEFS = "$defs"
14
+ REF = "$ref"
15
+ DEFS_PREFIX = "#/$defs/"
16
+
17
+ _NULL = {"type": "null"}
18
+
19
+
20
+ def definition(schema: Mapping[str, Any], definitions: Mapping[str, Any]) -> Mapping[str, Any]:
21
+ """Return the definition *schema* references, or *schema* when it references none."""
22
+ ref = schema.get(REF)
23
+ return definitions[ref.removeprefix(DEFS_PREFIX)] if ref is not None else schema
24
+
25
+
26
+ def without_null(prop: Mapping[str, Any]) -> Mapping[str, Any]:
27
+ """Return an optional property as its single non-null branch, without a ``None`` default.
28
+
29
+ A property that is not ``X | None`` is returned as it is.
30
+ """
31
+ options = [option for option in prop.get("anyOf", ()) if option != _NULL]
32
+ if len(options) != 1:
33
+ return prop
34
+ rest = {k: v for k, v in prop.items() if k != "anyOf" and not (k == "default" and v is None)}
35
+ return {**options[0], **rest}