loom-kernel 2.14.0__tar.gz → 2.15.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 (681) hide show
  1. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/CHANGELOG.md +73 -0
  2. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/PKG-INFO +2 -2
  3. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/pyproject.toml +1 -1
  4. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/__init__.py +4 -0
  5. loom_kernel-2.15.0/src/loom/ai/_paths.py +33 -0
  6. loom_kernel-2.15.0/src/loom/ai/bootstrap.py +120 -0
  7. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/_compiler.py +4 -0
  8. loom_kernel-2.15.0/src/loom/ai/compiler/_fingerprint.py +70 -0
  9. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/_plan.py +20 -0
  10. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_capabilities.py +5 -10
  11. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/config.py +6 -0
  12. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/declarative/__init__.py +30 -6
  13. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_limits.py +68 -15
  14. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/provider.py +47 -6
  15. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/errors.py +17 -2
  16. loom_kernel-2.15.0/src/loom/ai/etl/__init__.py +41 -0
  17. loom_kernel-2.15.0/src/loom/ai/etl/_batch.py +98 -0
  18. loom_kernel-2.15.0/src/loom/ai/etl/_columns.py +139 -0
  19. loom_kernel-2.15.0/src/loom/ai/etl/_frames.py +169 -0
  20. loom_kernel-2.15.0/src/loom/ai/etl/_ledger.py +61 -0
  21. loom_kernel-2.15.0/src/loom/ai/etl/_runner.py +179 -0
  22. loom_kernel-2.15.0/src/loom/ai/etl/_validation.py +123 -0
  23. loom_kernel-2.15.0/src/loom/ai/pricing.py +77 -0
  24. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/registry.py +23 -0
  25. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_lifecycle.py +5 -0
  26. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/__init__.py +7 -0
  27. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/__init__.py +2 -0
  28. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_binding.py +22 -1
  29. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_compiler.py +36 -7
  30. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_errors.py +66 -9
  31. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_plan.py +20 -0
  32. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_validators.py +5 -1
  33. loom_kernel-2.15.0/src/loom/etl/compiler/_validators_agents.py +76 -0
  34. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_validators_step.py +46 -13
  35. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/__init__.py +2 -0
  36. loom_kernel-2.15.0/src/loom/etl/declarative/_with_agent.py +70 -0
  37. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/executor/__init__.py +2 -0
  38. loom_kernel-2.15.0/src/loom/etl/executor/_agents.py +58 -0
  39. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/executor/_executor.py +29 -1
  40. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_step.py +17 -6
  41. loom_kernel-2.15.0/src/loom/etl/runner/_agents.py +51 -0
  42. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/runner/_wiring.py +72 -3
  43. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/runner/config_loader.py +17 -0
  44. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/runner/core.py +27 -3
  45. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/runtime/__init__.py +12 -1
  46. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/runtime/contracts.py +95 -1
  47. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/auto.py +13 -40
  48. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/.gitignore +0 -0
  49. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/LICENSE +0 -0
  50. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/README.md +0 -0
  51. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/__init__.py +0 -0
  52. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/_concurrency.py +0 -0
  53. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/_filters.py +0 -0
  54. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/_roles.py +0 -0
  55. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/_startup.py +0 -0
  56. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/_transport.py +0 -0
  57. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/_usecase.py +0 -0
  58. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/__init__.py +0 -0
  59. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/_binding.py +0 -0
  60. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/_handlers.py +0 -0
  61. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/_rpc.py +0 -0
  62. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/card.py +0 -0
  63. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/events.py +0 -0
  64. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/a2a/server.py +0 -0
  65. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/abc.py +0 -0
  66. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/__init__.py +0 -0
  67. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
  68. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_conversation.py +0 -0
  69. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_feedable.py +0 -0
  70. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_hook.py +0 -0
  71. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_instructions.py +0 -0
  72. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
  73. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
  74. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_output.py +0 -0
  75. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/compiler/phases/_state.py +0 -0
  76. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/declarative/_envelope.py +0 -0
  77. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/declarative/_schema.py +0 -0
  78. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/declarative/_v1.py +0 -0
  79. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
  80. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/describe.py +0 -0
  81. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/__init__.py +0 -0
  82. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
  83. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
  84. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
  85. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
  86. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
  87. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_escape.py +0 -0
  88. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
  89. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
  90. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_history.py +0 -0
  91. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_instructions.py +0 -0
  92. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +0 -0
  93. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
  94. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_native.py +0 -0
  95. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
  96. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
  97. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
  98. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
  99. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/extras/__init__.py +0 -0
  100. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/extras/a2a.py +0 -0
  101. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/extras/handlebars.py +0 -0
  102. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/extras/mcp.py +0 -0
  103. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/extras/skills.py +0 -0
  104. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/__init__.py +0 -0
  105. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/_shared.py +0 -0
  106. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/anthropic.py +0 -0
  107. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/bedrock.py +0 -0
  108. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/gateway.py +0 -0
  109. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/openai.py +0 -0
  110. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/engines/pydantic_ai/providers/typesafe.py +0 -0
  111. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/fastapi/__init__.py +0 -0
  112. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/fastapi/endpoints.py +0 -0
  113. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/fastapi/response.py +0 -0
  114. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/fastapi/streaming.py +0 -0
  115. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/inference.py +0 -0
  116. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/remote_auth.py +0 -0
  117. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/__init__.py +0 -0
  118. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_bounded.py +0 -0
  119. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_chain.py +0 -0
  120. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_conversation.py +0 -0
  121. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_grants.py +0 -0
  122. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_handle.py +0 -0
  123. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_health.py +0 -0
  124. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_hooks.py +0 -0
  125. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_limits.py +0 -0
  126. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/runtime/_mcp.py +0 -0
  127. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/validate/__init__.py +0 -0
  128. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/ai/validate/__main__.py +0 -0
  129. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/celery/__init__.py +0 -0
  130. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/celery/auto.py +0 -0
  131. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/celery/bootstrap.py +0 -0
  132. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/celery/config.py +0 -0
  133. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/celery/constants.py +0 -0
  134. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/celery/runner.py +0 -0
  135. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/celery/service.py +0 -0
  136. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/cli/__init__.py +0 -0
  137. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/cli/app.py +0 -0
  138. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/cli/schema.py +0 -0
  139. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/async_bridge.py +0 -0
  140. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/authz/__init__.py +0 -0
  141. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/authz/_decide.py +0 -0
  142. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/authz/_grants.py +0 -0
  143. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/authz/_roles.py +0 -0
  144. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/authz/_scope.py +0 -0
  145. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/authz/elevation.py +0 -0
  146. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/authz/product.py +0 -0
  147. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/backend/__init__.py +0 -0
  148. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/backend/core_model.py +0 -0
  149. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/backend/protocol.py +0 -0
  150. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/backend/scoped_ddl.py +0 -0
  151. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/backend/sqlalchemy.py +0 -0
  152. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/bootstrap/__init__.py +0 -0
  153. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
  154. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/bootstrap/kernel.py +0 -0
  155. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/__init__.py +0 -0
  156. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/_batching.py +0 -0
  157. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/_single_flight.py +0 -0
  158. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/abc/__init__.py +0 -0
  159. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/abc/backend.py +0 -0
  160. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/abc/config.py +0 -0
  161. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/abc/dependency.py +0 -0
  162. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/calls.py +0 -0
  163. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/codec.py +0 -0
  164. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/decorators.py +0 -0
  165. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/dependency.py +0 -0
  166. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/errors.py +0 -0
  167. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/gateway.py +0 -0
  168. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/keys.py +0 -0
  169. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/memory.py +0 -0
  170. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/repository.py +0 -0
  171. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/result_codec.py +0 -0
  172. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/serializer.py +0 -0
  173. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/cache/wiring.py +0 -0
  174. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/command/__init__.py +0 -0
  175. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/command/adapter.py +0 -0
  176. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/command/base.py +0 -0
  177. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/command/field.py +0 -0
  178. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/command/introspection.py +0 -0
  179. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/compiler.py +0 -0
  180. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/__init__.py +0 -0
  181. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/_boto3.py +0 -0
  182. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/_includes.py +0 -0
  183. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/_resolver_utils.py +0 -0
  184. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/binder.py +0 -0
  185. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/configurable.py +0 -0
  186. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/context.py +0 -0
  187. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/errors.py +0 -0
  188. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/keys.py +0 -0
  189. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/loader.py +0 -0
  190. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/model.py +0 -0
  191. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/observability.py +0 -0
  192. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/resolver.py +0 -0
  193. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/secrets.py +0 -0
  194. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/config/ssm.py +0 -0
  195. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/contracts/__init__.py +0 -0
  196. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/contracts/manifest.py +0 -0
  197. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/di/__init__.py +0 -0
  198. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/di/container.py +0 -0
  199. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/di/scope.py +0 -0
  200. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/discovery/__init__.py +0 -0
  201. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/discovery/_utils.py +0 -0
  202. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/discovery/base.py +0 -0
  203. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/discovery/interfaces.py +0 -0
  204. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/discovery/manifest.py +0 -0
  205. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/discovery/modules.py +0 -0
  206. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/engine/__init__.py +0 -0
  207. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/engine/compilable.py +0 -0
  208. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/engine/compiler.py +0 -0
  209. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/engine/events.py +0 -0
  210. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/engine/executor.py +0 -0
  211. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/engine/metrics.py +0 -0
  212. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/engine/plan.py +0 -0
  213. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/engine/post_commit.py +0 -0
  214. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/errors/__init__.py +0 -0
  215. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/errors/codes.py +0 -0
  216. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/errors/errors.py +0 -0
  217. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/expr/__init__.py +0 -0
  218. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/expr/eval.py +0 -0
  219. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/expr/nodes.py +0 -0
  220. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/expr/refs.py +0 -0
  221. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/identity/__init__.py +0 -0
  222. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/identity/context.py +0 -0
  223. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/identity/identity.py +0 -0
  224. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/identity/issuer.py +0 -0
  225. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/identity/wire.py +0 -0
  226. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/introspection/__init__.py +0 -0
  227. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/introspection/base.py +0 -0
  228. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/introspection/describe.py +0 -0
  229. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/job/__init__.py +0 -0
  230. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/job/callback.py +0 -0
  231. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/job/context.py +0 -0
  232. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/job/handle.py +0 -0
  233. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/job/job.py +0 -0
  234. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/job/service.py +0 -0
  235. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/locator.py +0 -0
  236. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/logger/__init__.py +0 -0
  237. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/logger/abc.py +0 -0
  238. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/logger/config.py +0 -0
  239. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/logger/registry.py +0 -0
  240. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/logger/structlogger.py +0 -0
  241. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/__init__.py +0 -0
  242. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/_loom_type.py +0 -0
  243. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/base.py +0 -0
  244. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/convert.py +0 -0
  245. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/enums.py +0 -0
  246. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/field.py +0 -0
  247. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/introspection.py +0 -0
  248. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/partition.py +0 -0
  249. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/privilege.py +0 -0
  250. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/projection.py +0 -0
  251. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/relation.py +0 -0
  252. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/scoped.py +0 -0
  253. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/struct.py +0 -0
  254. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/timestamped.py +0 -0
  255. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/types.py +0 -0
  256. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/model/types_postgres.py +0 -0
  257. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/observability/__init__.py +0 -0
  258. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/observability/config.py +0 -0
  259. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/observability/event.py +0 -0
  260. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/observability/observer/__init__.py +0 -0
  261. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/observability/observer/noop.py +0 -0
  262. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/observability/observer/otel.py +0 -0
  263. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/observability/observer/structlog.py +0 -0
  264. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/observability/otel_ids.py +0 -0
  265. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/observability/protocol.py +0 -0
  266. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/observability/runtime.py +0 -0
  267. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/observability/span.py +0 -0
  268. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/observability/topology.py +0 -0
  269. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/persistence/__init__.py +0 -0
  270. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/persistence/abc.py +0 -0
  271. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/persistence/none.py +0 -0
  272. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/persistence/registry.py +0 -0
  273. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/plugins/__init__.py +0 -0
  274. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/plugins/entrypoints.py +0 -0
  275. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/plugins/optional.py +0 -0
  276. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/projection/__init__.py +0 -0
  277. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/projection/loaders.py +0 -0
  278. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/projection/runtime.py +0 -0
  279. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/__init__.py +0 -0
  280. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/__init__.py +0 -0
  281. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/cursor.py +0 -0
  282. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/errors.py +0 -0
  283. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/query.py +0 -0
  284. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/query_compiler.py +0 -0
  285. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/repo_for.py +0 -0
  286. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/repository.py +0 -0
  287. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/abc/session_scope.py +0 -0
  288. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
  289. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/dynamodb/backend.py +0 -0
  290. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/dynamodb/registry.py +0 -0
  291. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/dynamodb/repository.py +0 -0
  292. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
  293. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/__init__.py +0 -0
  294. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/backend.py +0 -0
  295. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/ids.py +0 -0
  296. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/query_compiler.py +0 -0
  297. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/registry.py +0 -0
  298. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/repository.py +0 -0
  299. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/uow.py +0 -0
  300. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/mongo/values.py +0 -0
  301. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/mutation.py +0 -0
  302. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/registration.py +0 -0
  303. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/registry.py +0 -0
  304. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
  305. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/backend.py +0 -0
  306. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
  307. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
  308. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/migrations/__init__.py +0 -0
  309. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/migrations/env_template.py +0 -0
  310. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/migrations/hook.py +0 -0
  311. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/migrations/operations.py +0 -0
  312. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/migrations/runners.py +0 -0
  313. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
  314. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
  315. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
  316. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
  317. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
  318. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
  319. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
  320. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
  321. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
  322. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
  323. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
  324. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
  325. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
  326. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
  327. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/__init__.py +0 -0
  328. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/bootstrap.py +0 -0
  329. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/config.py +0 -0
  330. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/elevate.py +0 -0
  331. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/guard/0001.sql +0 -0
  332. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/guard/0002.sql +0 -0
  333. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/guard/preflight.sql +0 -0
  334. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/guard_manifest.py +0 -0
  335. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/integrity.py +0 -0
  336. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/partitions.py +0 -0
  337. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/provider.py +0 -0
  338. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/schema.py +0 -0
  339. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/sources.py +0 -0
  340. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/rls/verify.py +0 -0
  341. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
  342. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/session_settings.py +0 -0
  343. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
  344. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
  345. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/response/__init__.py +0 -0
  346. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/response/base.py +0 -0
  347. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/routing/__init__.py +0 -0
  348. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/routing/ref.py +0 -0
  349. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/routing/resolver.py +0 -0
  350. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/runner.py +0 -0
  351. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/schema/__init__.py +0 -0
  352. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/schema/schema_mode.py +0 -0
  353. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/schema_names.py +0 -0
  354. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/sql/__init__.py +0 -0
  355. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/sql/abc/__init__.py +0 -0
  356. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/sql/abc/contracts.py +0 -0
  357. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/sql/abc/errors.py +0 -0
  358. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/sql/caller_bound.py +0 -0
  359. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
  360. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/sql/clickhouse/_client.py +0 -0
  361. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
  362. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/sql/clickhouse/registry.py +0 -0
  363. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/sql/config.py +0 -0
  364. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/sql/roles.py +0 -0
  365. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/sql/service.py +0 -0
  366. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/symbols.py +0 -0
  367. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/tracing/__init__.py +0 -0
  368. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/tracing/context.py +0 -0
  369. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/transaction.py +0 -0
  370. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/transport/__init__.py +0 -0
  371. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/transport/adapter.py +0 -0
  372. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/uow/__init__.py +0 -0
  373. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/uow/abc.py +0 -0
  374. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/uow/context.py +0 -0
  375. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/__init__.py +0 -0
  376. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/_predicates.py +0 -0
  377. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/agent_markers.py +0 -0
  378. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/compute.py +0 -0
  379. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/constants.py +0 -0
  380. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/factory.py +0 -0
  381. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/field_ref.py +0 -0
  382. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/invoker.py +0 -0
  383. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/keys.py +0 -0
  384. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/markers.py +0 -0
  385. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/mcp_markers.py +0 -0
  386. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/registry.py +0 -0
  387. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/rule.py +0 -0
  388. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/core/use_case/use_case.py +0 -0
  389. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/__init__.py +0 -0
  390. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_format_registry.py +0 -0
  391. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
  392. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_historify/_common.py +0 -0
  393. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_historify/_log.py +0 -0
  394. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
  395. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
  396. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
  397. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_merge.py +0 -0
  398. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_path_template.py +0 -0
  399. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_predicate.py +0 -0
  400. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
  401. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
  402. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
  403. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/_write_policy.py +0 -0
  404. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/__init__.py +0 -0
  405. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
  406. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
  407. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_historify.py +0 -0
  408. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
  409. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_reader.py +0 -0
  410. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_schema.py +0 -0
  411. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
  412. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
  413. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/_writer.py +0 -0
  414. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/polars/provider.py +0 -0
  415. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/__init__.py +0 -0
  416. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
  417. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/_historify.py +0 -0
  418. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/_reader.py +0 -0
  419. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/_schema.py +0 -0
  420. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
  421. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/_writer.py +0 -0
  422. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/backends/spark/provider.py +0 -0
  423. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/__init__.py +0 -0
  424. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
  425. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
  426. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
  427. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_options.py +0 -0
  428. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_paths.py +0 -0
  429. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_scope.py +0 -0
  430. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/checkpoint/_store.py +0 -0
  431. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_validators_config.py +0 -0
  432. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
  433. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/_format.py +0 -0
  434. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/_read_options.py +0 -0
  435. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/_utils.py +0 -0
  436. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/_write_options.py +0 -0
  437. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
  438. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/expr/_params.py +0 -0
  439. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
  440. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
  441. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
  442. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/__init__.py +0 -0
  443. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/_from.py +0 -0
  444. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
  445. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/_from_config.py +0 -0
  446. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
  447. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
  448. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/source/_specs.py +0 -0
  449. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/__init__.py +0 -0
  450. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_client.py +0 -0
  451. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_file.py +0 -0
  452. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
  453. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
  454. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
  455. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
  456. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
  457. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
  458. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_into.py +0 -0
  459. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
  460. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_table.py +0 -0
  461. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/declarative/target/_temp.py +0 -0
  462. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/executor/_dispatcher.py +0 -0
  463. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/__init__.py +0 -0
  464. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/_registry.py +0 -0
  465. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/__init__.py +0 -0
  466. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_clickhouse.py +0 -0
  467. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
  468. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
  469. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
  470. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_mongo.py +0 -0
  471. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
  472. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
  473. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
  474. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/sources/_serialization.py +0 -0
  475. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/targets/__init__.py +0 -0
  476. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/io/targets/_clickhouse.py +0 -0
  477. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/__init__.py +0 -0
  478. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/_config.py +0 -0
  479. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/_observer.py +0 -0
  480. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/_records.py +0 -0
  481. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
  482. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
  483. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
  484. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
  485. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/__init__.py +0 -0
  486. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/_builder.py +0 -0
  487. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/_ops.py +0 -0
  488. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/_protocol.py +0 -0
  489. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/_runner.py +0 -0
  490. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/_step.py +0 -0
  491. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
  492. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
  493. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/__init__.py +0 -0
  494. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_generics.py +0 -0
  495. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_params.py +0 -0
  496. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
  497. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_process.py +0 -0
  498. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_sql.py +0 -0
  499. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_step_client.py +0 -0
  500. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
  501. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/runner/__init__.py +0 -0
  502. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/runner/_providers.py +0 -0
  503. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/runner/errors.py +0 -0
  504. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/runner/filtering.py +0 -0
  505. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/runtime/_config_values.py +0 -0
  506. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/schema/__init__.py +0 -0
  507. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/schema/_contract.py +0 -0
  508. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/schema/_schema.py +0 -0
  509. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/storage/__init__.py +0 -0
  510. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/storage/_config.py +0 -0
  511. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/storage/_file_locator.py +0 -0
  512. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/storage/_locator.py +0 -0
  513. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/storage/routing.py +0 -0
  514. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/testing/__init__.py +0 -0
  515. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/testing/_result.py +0 -0
  516. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/testing/_runners.py +0 -0
  517. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/testing/_scenario.py +0 -0
  518. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/testing/_stubs.py +0 -0
  519. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/etl/testing/spark.py +0 -0
  520. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/__init__.py +0 -0
  521. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/_async.py +0 -0
  522. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/_config.py +0 -0
  523. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/_ctx.py +0 -0
  524. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/_flow_yaml.py +0 -0
  525. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/_meta.py +0 -0
  526. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/_placeholders.py +0 -0
  527. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/_summary.py +0 -0
  528. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/deploy/__init__.py +0 -0
  529. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/deploy/_discovery.py +0 -0
  530. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/deploy/_schedule.py +0 -0
  531. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/deploy/_yaml_etls.py +0 -0
  532. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/deploy/entrypoint.py +0 -0
  533. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/__init__.py +0 -0
  534. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_assemble.py +0 -0
  535. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_backfill.py +0 -0
  536. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
  537. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_body.py +0 -0
  538. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_common.py +0 -0
  539. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_factory.py +0 -0
  540. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_hooks.py +0 -0
  541. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_maintenance.py +0 -0
  542. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_params.py +0 -0
  543. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_run_name.py +0 -0
  544. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_runtime.py +0 -0
  545. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_signature.py +0 -0
  546. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/flow/_stages.py +0 -0
  547. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/manifest/__init__.py +0 -0
  548. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/manifest/_model.py +0 -0
  549. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/manifest/_s3.py +0 -0
  550. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/manifest/_store.py +0 -0
  551. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/notify/__init__.py +0 -0
  552. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/notify/_event.py +0 -0
  553. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/notify/_factory.py +0 -0
  554. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/notify/_port.py +0 -0
  555. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/notify/_slack.py +0 -0
  556. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/observer/__init__.py +0 -0
  557. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/observer/_flow.py +0 -0
  558. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
  559. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/observer/_manifest.py +0 -0
  560. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prefect/observer/_task_run.py +0 -0
  561. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prometheus/__init__.py +0 -0
  562. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prometheus/_instruments.py +0 -0
  563. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prometheus/adapter.py +0 -0
  564. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prometheus/kafka.py +0 -0
  565. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prometheus/lifecycle.py +0 -0
  566. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/prometheus/middleware.py +0 -0
  567. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/py.typed +0 -0
  568. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/__init__.py +0 -0
  569. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/_body.py +0 -0
  570. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/adapter.py +0 -0
  571. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/auth/__init__.py +0 -0
  572. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/auth/abc.py +0 -0
  573. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/auth/config.py +0 -0
  574. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/auth/jwt.py +0 -0
  575. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/auth/middleware.py +0 -0
  576. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/autocrud.py +0 -0
  577. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/compiler.py +0 -0
  578. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/config.py +0 -0
  579. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/constants.py +0 -0
  580. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/cors.py +0 -0
  581. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/errors.py +0 -0
  582. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/__init__.py +0 -0
  583. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/_errors.py +0 -0
  584. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
  585. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/app.py +0 -0
  586. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/health.py +0 -0
  587. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/openapi.py +0 -0
  588. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/response.py +0 -0
  589. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/router_runtime.py +0 -0
  590. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/fastapi/sql.py +0 -0
  591. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/middleware.py +0 -0
  592. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/model.py +0 -0
  593. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/rest/rest_adapter.py +0 -0
  594. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/__init__.py +0 -0
  595. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/__init__.py +0 -0
  596. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
  597. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
  598. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
  599. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
  600. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
  601. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_errors.py +0 -0
  602. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_operators.py +0 -0
  603. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
  604. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
  605. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
  606. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
  607. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
  608. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
  609. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
  610. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
  611. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
  612. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
  613. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
  614. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
  615. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/bytewax/runner.py +0 -0
  616. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/__init__.py +0 -0
  617. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/_bindings.py +0 -0
  618. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/_compiler.py +0 -0
  619. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/_errors.py +0 -0
  620. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/_plan.py +0 -0
  621. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
  622. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/compiler/phases/validate.py +0 -0
  623. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/core/__init__.py +0 -0
  624. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/core/_errors.py +0 -0
  625. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/core/_exceptions.py +0 -0
  626. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/core/_message.py +0 -0
  627. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/core/_tracing.py +0 -0
  628. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/core/_typing.py +0 -0
  629. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/graph/__init__.py +0 -0
  630. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/graph/_flow.py +0 -0
  631. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/__init__.py +0 -0
  632. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_codec.py +0 -0
  633. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_config.py +0 -0
  634. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_errors.py +0 -0
  635. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
  636. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_message.py +0 -0
  637. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_record.py +0 -0
  638. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/_wire.py +0 -0
  639. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
  640. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
  641. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
  642. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
  643. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
  644. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
  645. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
  646. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
  647. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
  648. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/mongo/__init__.py +0 -0
  649. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
  650. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/mongo/_config.py +0 -0
  651. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/mongo/_event.py +0 -0
  652. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/mongo/_normalize.py +0 -0
  653. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/__init__.py +0 -0
  654. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_boundary.py +0 -0
  655. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_branches.py +0 -0
  656. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
  657. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
  658. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_decompose.py +0 -0
  659. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
  660. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
  661. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_fork.py +0 -0
  662. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_helpers.py +0 -0
  663. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_mongo.py +0 -0
  664. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_protocols.py +0 -0
  665. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_router.py +0 -0
  666. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_shape.py +0 -0
  667. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_sink.py +0 -0
  668. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_step.py +0 -0
  669. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_table/__init__.py +0 -0
  670. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_table/common.py +0 -0
  671. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_table/config.py +0 -0
  672. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/_with.py +0 -0
  673. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/nodes/refs.py +0 -0
  674. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/streaming/testing.py +0 -0
  675. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/testing/__init__.py +0 -0
  676. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/testing/agents.py +0 -0
  677. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/testing/golden.py +0 -0
  678. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/testing/http_harness.py +0 -0
  679. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/testing/in_memory.py +0 -0
  680. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/testing/repository_harness.py +0 -0
  681. {loom_kernel-2.14.0 → loom_kernel-2.15.0}/src/loom/testing/runner.py +0 -0
@@ -137,6 +137,45 @@
137
137
  library produced the answer, the hook payload, `/agents/{name}/run`, the
138
138
  SSE `final` frame and the A2A output artifact all carry it as plain JSON
139
139
  builtins, built from the plan's `LoomType`.
140
+ - **ai:** `ai.prices` declares model prices in USD per million tokens
141
+ (`input`, `output`, optional `cache_read`/`cache_write`, `source`,
142
+ `as_of`), keyed by the vendor model id (`loom.ai.ModelPrice`). The
143
+ compiler carries the bound model's price on the plan (`AgentPlan.price`)
144
+ and the pydantic-ai engine prices every response with it before
145
+ genai-prices, so `AgentUsage.cost`, `policies.max_usd` and
146
+ `on_unpriced_spend: refuse` work for a model the catalogue does not know
147
+ (a Bedrock inference profile such as `eu.anthropic.claude-haiku-5-5`):
148
+ `refuse` no longer fails after paying, and `serve` enforces the cap. The
149
+ start-up notice is skipped for a priced model. Engines may expose a
150
+ `prices_model(target)` oracle, read with
151
+ `loom.ai.registry.engine_prices_model`.
152
+ - **ai:** `loom.ai.build_agent_runtime(config, *, root, names=None, ...)`
153
+ assembles an unentered `AgentRuntime` from an `ai:` section: engine,
154
+ artifacts under `root`, compilation. `create_app` now builds its runtime
155
+ through it. `AgentRuntime.plans` exposes the compiled plans.
156
+ - **ai:** `AgentPlan.fingerprint`, a stable sha256 of what decides an
157
+ agent's answers: compiled instructions, output schema, output check (by
158
+ import path), policies, `spec_version`, the kind and name of every
159
+ capability and the bound provider, model, `output_mode` and `options`; not
160
+ the name, metadata, price, where a capability is served from, region,
161
+ endpoint, credentials or `streaming`.
162
+ - **ai:** `loom.ai.etl.PolarsAgentRunner` runs an agent over a Polars frame
163
+ for ETL steps (see `etl`): a runtime of its own per call that also sees the
164
+ caller's context variables, concurrency that waits instead of refusing, one
165
+ output row per input row with errors as rows (an unexpected exception is an
166
+ `UNEXPECTED_ERROR` row, never an aborted batch, and an answer value its
167
+ column cannot hold an `OUTPUT_UNREPRESENTABLE` row that keeps its cost),
168
+ answer columns typed by the declared output (`date` as `Date`, `datetime`
169
+ as UTC `Datetime`, `Decimal` as `Decimal(38, 9)`, string choices as
170
+ `String`, ...) even for a batch
171
+ without rows or with errors only, tokens, cost and version per row, and a
172
+ budget per call that reserves `policies.max_usd` per run and is exceeded
173
+ only by the elastic excess of the last response of each run in flight (at
174
+ most `max_concurrent_runs` responses); a budget without `policies.max_usd`
175
+ raises `ValueError`. A frame without rows compiles nothing; `validate` and
176
+ `version` compile each agent once per runner, and each `map` recompiles it
177
+ and leaves that compilation for `version`, so `version` always equals the
178
+ `agent_version` the last `map` wrote.
140
179
 
141
180
  ### rest
142
181
 
@@ -211,6 +250,34 @@
211
250
  may quote the value. `ETLRunner`, `ETLRunner.from_config` and `ETLExecutor` take
212
251
  `config_context=`; `PolarsStepRunner` and `SparkStepRunner` take
213
252
  `with_config(mapping)` for fake values in tests.
253
+ - **etl:** a step may map rows through an agent of the runner's `ai:`
254
+ section. `WithAgent("seller_reply", output=SellerReply, max_usd=None)`
255
+ declared as a class attribute is passed to `execute()` as an `AgentMapper`
256
+ whose `map(frame, keys=..., prompt=...)` returns, per input row, the keys,
257
+ the fields of `output` and `agent_version`, `agent_status`, `agent_error`,
258
+ `agent_input_tokens`, `agent_output_tokens`, `agent_cache_read_tokens`,
259
+ `agent_cache_write_tokens` and `agent_cost_usd`; `version` is the agent's
260
+ fingerprint, for the anti-join. A failed run is an error row; with
261
+ `max_usd`, the rows past the budget come back as `BUDGET_EXHAUSTED`
262
+ unsent; a step budget needs `policies.max_usd` on the artifact and room for
263
+ one run's `policies.max_usd`, and is overshot only by the elastic excess of
264
+ the last response of each run in flight (at most `max_concurrent_runs`
265
+ responses). `ETLRunner.from_yaml`
266
+ resolves `ai.specs` against `ai.root`, a path relative to the YAML's
267
+ directory (the directory itself when absent), so a config kept in a
268
+ subfolder reaches artifacts elsewhere in the repository while no glob may
269
+ leave that root, and loads `loom.ai.etl` by module path only when `ai:` is
270
+ present and the engine is Polars: `loom.etl` never imports `loom.ai`.
271
+ `ETLRunner.run` validates every declaration through the new
272
+ `AgentBatchRunner` port before any step runs, with new codes
273
+ `AGENT_NOT_FOUND`, `AGENT_COMPILATION_FAILED`, `AGENT_OUTPUT_MISMATCH`,
274
+ `AGENT_UNPRICED_BUDGET`, `AGENT_BUDGET_UNENFORCEABLE` (a step budget with
275
+ no `policies.max_usd`, or below it),
276
+ `AGENT_COLUMN_COLLISION` (an output field named like an `agent_*` column)
277
+ and `AGENT_UNSUPPORTED_ENGINE` (a Spark runner); the shape reuses
278
+ `MISSING_CONFIG_PARAMS`, `CONFIG_ALIAS_CONFLICT` and
279
+ `UNSUPPORTED_CONFIG_VALUE`. `ETLRunner`, `ETLRunner.from_config`,
280
+ `ETLCompiler` and `ETLExecutor` take `agents=`. Polars only.
214
281
 
215
282
  ## ⚠ Behaviour changes
216
283
 
@@ -227,6 +294,12 @@
227
294
 
228
295
  ### ai
229
296
 
297
+ - **ai:** `load_specs`, and so `ai.specs`, refuses a glob that leaves the
298
+ root it resolves against — a `..` segment, an absolute pattern or a match
299
+ that resolves outside the root through a symlink — with
300
+ `AGENT_SPECS_ESCAPE_ROOT`, before reading any artifact. A deployment whose
301
+ `ai.specs` climbs out of the application root with `..` must move its
302
+ artifacts under it. Absolute patterns already failed.
230
303
  - **ai:** `CompiledOutput.decoder` and `StateShape.decoder` are gone,
231
304
  replaced by `loom_type: LoomType` (`LoomType | None` on `StateShape`); a
232
305
  reader of either field must move to `loom_type.type` / `.decode_json()` /
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: loom-kernel
3
- Version: 2.14.0
3
+ Version: 2.15.0
4
4
  Summary: Loom Python project
5
5
  License-File: LICENSE
6
6
  Classifier: Programming Language :: Python :: 3
@@ -16,7 +16,7 @@ Requires-Dist: msgspec<1.0,>=0.18
16
16
  Requires-Dist: omegaconf<3.0,>=2.3
17
17
  Requires-Dist: opentelemetry-api<2.0,>=1.27
18
18
  Requires-Dist: prometheus-client>=0.20
19
- Requires-Dist: structlog<26.0,>=24.4
19
+ Requires-Dist: structlog<27.0,>=24.4
20
20
  Requires-Dist: typing-extensions>=4.12
21
21
  Provides-Extra: ai-a2a
22
22
  Requires-Dist: a2a-sdk<2,>=1.1; extra == 'ai-a2a'
@@ -15,7 +15,7 @@ classifiers = [
15
15
  ]
16
16
  dependencies = [
17
17
  "msgspec>=0.18,<1.0",
18
- "structlog>=24.4,<26.0",
18
+ "structlog>=24.4,<27.0",
19
19
  "omegaconf>=2.3,<3.0",
20
20
  "prometheus-client>=0.20",
21
21
  "aiocache>=0.12,<1.0",
@@ -43,6 +43,7 @@ from loom.ai.abc import (
43
43
  ToolsetContext,
44
44
  ToolsetFactory,
45
45
  )
46
+ from loom.ai.bootstrap import build_agent_runtime
46
47
  from loom.ai.config import A2AConfig, AgentEndpointConfig, AiConfig
47
48
  from loom.ai.errors import (
48
49
  AgentCompilationError,
@@ -54,6 +55,7 @@ from loom.ai.errors import (
54
55
  is_retriable,
55
56
  )
56
57
  from loom.ai.inference import InferenceTarget
58
+ from loom.ai.pricing import ModelPrice
57
59
  from loom.ai.runtime import AgentHealth, AgentRuntime
58
60
 
59
61
  __all__ = [
@@ -89,6 +91,7 @@ __all__ = [
89
91
  "McpSession",
90
92
  "McpToolCallResult",
91
93
  "McpToolInfo",
94
+ "ModelPrice",
92
95
  "NativeCapableEngine",
93
96
  "OutputCheck",
94
97
  "Prompt",
@@ -98,4 +101,5 @@ __all__ = [
98
101
  "ToolResultEvent",
99
102
  "ToolsetContext",
100
103
  "ToolsetFactory",
104
+ "build_agent_runtime",
101
105
  ]
@@ -0,0 +1,33 @@
1
+ """Containment of relative paths inside the directory they are anchored to."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path, PurePath
6
+
7
+ __all__ = ["escapes", "is_within"]
8
+
9
+
10
+ def escapes(relative: str) -> bool:
11
+ """Report whether *relative* could name something outside its anchor.
12
+
13
+ Args:
14
+ relative: Path or glob written relative to an anchor directory.
15
+
16
+ Returns:
17
+ ``True`` when it is absolute or climbs with a ``..`` segment.
18
+ """
19
+ path = PurePath(relative)
20
+ return path.is_absolute() or ".." in path.parts
21
+
22
+
23
+ def is_within(path: Path, root: Path) -> bool:
24
+ """Report whether *path*, symlinks resolved, stays inside *root*.
25
+
26
+ Args:
27
+ path: Path found on disk.
28
+ root: Directory *path* must not leave.
29
+
30
+ Returns:
31
+ Whether the resolved *path* is *root* or below it.
32
+ """
33
+ return path.resolve().is_relative_to(root.resolve())
@@ -0,0 +1,120 @@
1
+ """Assembly of an agent runtime from a deployment's ``ai:`` section.
2
+
3
+ The one path every transport takes from configuration to a live
4
+ :class:`~loom.ai.runtime.AgentRuntime`: resolve the engine, load and compile
5
+ the artifacts, and hand both to the runtime, which opens nothing until it is
6
+ entered.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from collections.abc import Collection, Mapping, Sequence
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ from loom.ai.abc import AgentEngineProvider, DepsFactory
16
+ from loom.ai.compiler import AgentCompiler
17
+ from loom.ai.config import AiConfig
18
+ from loom.ai.declarative import DecodedSpec, load_specs
19
+ from loom.ai.registry import (
20
+ configure_engine_mcp_connect_timeout,
21
+ engine_client_factories,
22
+ engine_native_tool_support,
23
+ engine_supported_kinds,
24
+ resolve_engine_provider,
25
+ )
26
+ from loom.ai.runtime import AgentRuntime, UseCaseMcpGrant
27
+ from loom.core.di import LoomContainer
28
+ from loom.core.identity import Identity
29
+ from loom.core.sql.config import SqlConfig
30
+ from loom.core.use_case.registry import UseCaseRegistry
31
+
32
+ __all__ = ["build_agent_runtime"]
33
+
34
+
35
+ class _NoDependencies(DepsFactory):
36
+ """Dependency factory of a runtime whose agents reach no application service."""
37
+
38
+ def build(
39
+ self,
40
+ identity: Identity,
41
+ container: LoomContainer,
42
+ state: Mapping[str, Any] | None = None,
43
+ ) -> object:
44
+ return None
45
+
46
+
47
+ def build_agent_runtime(
48
+ config: AiConfig,
49
+ *,
50
+ root: Path | str,
51
+ names: Collection[str] | None = None,
52
+ specs: Sequence[str] | None = None,
53
+ engine_provider: AgentEngineProvider | None = None,
54
+ registry: UseCaseRegistry | None = None,
55
+ container: LoomContainer | None = None,
56
+ deps: DepsFactory | None = None,
57
+ sql: SqlConfig | None = None,
58
+ use_case_mcp: Sequence[UseCaseMcpGrant] = (),
59
+ ) -> AgentRuntime:
60
+ """Compile the declared artifacts and build the runtime that serves them.
61
+
62
+ Compilation is offline and complete: every issue of every artifact is
63
+ reported at once. No client opens until the returned runtime is entered.
64
+
65
+ Args:
66
+ config: Parsed ``ai:`` section.
67
+ root: Directory the artifact globs are resolved against; no glob may
68
+ leave it.
69
+ names: Agents to serve; ``None`` serves every artifact found.
70
+ specs: Artifact globs replacing ``config.specs``.
71
+ engine_provider: Engine provider to build engines with; resolved from
72
+ ``config.engine`` when omitted.
73
+ registry: Use cases ``usecase`` grants and hooks resolve against;
74
+ empty when omitted.
75
+ container: Application container engines resolve services from;
76
+ empty when omitted.
77
+ deps: Per-invocation dependency factory; when omitted every run gets
78
+ no dependency bundle.
79
+ sql: Data-layer configuration ``sql`` grants resolve against.
80
+ use_case_mcp: Compiled ``Mcp()`` marker grants of the application's
81
+ use cases.
82
+
83
+ Returns:
84
+ The runtime, not yet entered.
85
+
86
+ Raises:
87
+ AgentCompilationError: When the engine cannot be resolved, a glob
88
+ leaves *root*, or an artifact does not compile.
89
+ """
90
+ provider = engine_provider or resolve_engine_provider(config.engine)
91
+ configure_engine_mcp_connect_timeout(provider, config.startup_timeout_ms / 1000)
92
+ mcp_factory, a2a_factory = engine_client_factories(provider)
93
+ compiler = AgentCompiler(
94
+ config=config,
95
+ registry=registry or UseCaseRegistry.build([]),
96
+ supported_kinds=engine_supported_kinds(provider, config.engine),
97
+ sql=sql,
98
+ native_tools=engine_native_tool_support(provider),
99
+ )
100
+ decoded = load_specs(config.specs if specs is None else specs, root=root)
101
+ plans = compiler.compile_all(_named(decoded, names))
102
+ return AgentRuntime(
103
+ plans=plans,
104
+ config=config,
105
+ engine_provider=provider,
106
+ deps=deps or _NoDependencies(),
107
+ container=container or LoomContainer(),
108
+ sql_config=sql,
109
+ mcp_client_factory=mcp_factory,
110
+ a2a_client_factory=a2a_factory,
111
+ use_case_mcp=use_case_mcp,
112
+ )
113
+
114
+
115
+ def _named(
116
+ decoded: Sequence[DecodedSpec], names: Collection[str] | None
117
+ ) -> tuple[DecodedSpec, ...]:
118
+ if names is None:
119
+ return tuple(decoded)
120
+ return tuple(item for item in decoded if item.spec.name in names)
@@ -37,6 +37,7 @@ from loom.ai.errors import (
37
37
  agent_name_duplicate,
38
38
  )
39
39
  from loom.ai.inference import InferenceTarget
40
+ from loom.ai.pricing import ModelPrice
40
41
  from loom.core.sql.config import SqlConfig
41
42
  from loom.core.use_case.registry import UseCaseRegistry
42
43
 
@@ -176,6 +177,7 @@ class AgentCompiler:
176
177
  instructions,
177
178
  state,
178
179
  inference,
180
+ self._config.prices.get(inference.model),
179
181
  output,
180
182
  output_check,
181
183
  capabilities,
@@ -191,6 +193,7 @@ class AgentCompiler:
191
193
  instructions: tuple[CompiledInstruction, ...],
192
194
  state: StateShape | None,
193
195
  inference: InferenceTarget,
196
+ price: ModelPrice | None,
194
197
  output: CompiledOutput,
195
198
  output_check: OutputCheck | None,
196
199
  capabilities: tuple[CompiledCapability, ...],
@@ -205,6 +208,7 @@ class AgentCompiler:
205
208
  state=state,
206
209
  spec_version=spec.spec_version,
207
210
  inference=inference,
211
+ price=price,
208
212
  output=output,
209
213
  output_check=output_check,
210
214
  capabilities=capabilities,
@@ -0,0 +1,70 @@
1
+ """Fingerprint of the facts of a compiled plan that decide its answers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ from collections.abc import Mapping
7
+ from types import MappingProxyType
8
+ from typing import TYPE_CHECKING, Final
9
+
10
+ import msgspec
11
+
12
+ from loom.ai.abc import OutputCheck
13
+
14
+ if TYPE_CHECKING:
15
+ from loom.ai.compiler._plan import AgentPlan, CompiledCapability
16
+
17
+ _CAPABILITY_NAMES: Final[Mapping[str, tuple[str, ...]]] = MappingProxyType(
18
+ {
19
+ "usecase": ("keys",),
20
+ "sql": ("connection",),
21
+ "mcp": ("server",),
22
+ "skills": ("library", "names"),
23
+ "python": ("factory_ref",),
24
+ "a2a": ("agent",),
25
+ "native": ("tool",),
26
+ }
27
+ )
28
+
29
+
30
+ def plan_fingerprint(plan: AgentPlan) -> str:
31
+ """Return the sha256 of what decides *plan*'s answers.
32
+
33
+ Args:
34
+ plan: Compiled plan.
35
+
36
+ Returns:
37
+ Hex digest over the instructions, output schema and check, policies,
38
+ format version, the kind and name of every capability and the model
39
+ binding, without the deployment details.
40
+ """
41
+ facts = {
42
+ "spec_version": plan.spec_version,
43
+ "instructions": [[block.text, block.template] for block in plan.instructions],
44
+ "output_schema": plan.output.schema,
45
+ "output_check": _reference(plan.output_check),
46
+ "policies": plan.policies,
47
+ "capabilities": [_capability(capability) for capability in plan.capabilities],
48
+ "provider": plan.inference.provider,
49
+ "model": plan.inference.model,
50
+ "output_mode": plan.inference.output_mode,
51
+ "options": plan.inference.options,
52
+ }
53
+ encoded = msgspec.json.encode(facts, order="sorted", enc_hook=_as_dict)
54
+ return hashlib.sha256(encoded).hexdigest()
55
+
56
+
57
+ def _as_dict(value: object) -> dict[object, object]:
58
+ if isinstance(value, Mapping):
59
+ return dict(value)
60
+ raise NotImplementedError(f"cannot fingerprint {type(value).__name__}")
61
+
62
+
63
+ def _reference(check: OutputCheck | None) -> str | None:
64
+ if check is None:
65
+ return None
66
+ return f"{check.__module__}:{check.__qualname__}"
67
+
68
+
69
+ def _capability(capability: CompiledCapability) -> list[object]:
70
+ return [capability.kind, *(getattr(capability, a) for a in _CAPABILITY_NAMES[capability.kind])]
@@ -24,8 +24,10 @@ from typing import Any, ClassVar, Final
24
24
  import msgspec
25
25
 
26
26
  from loom.ai.abc import OutputCheck, StateShape
27
+ from loom.ai.compiler._fingerprint import plan_fingerprint
27
28
  from loom.ai.declarative import PolicySpec
28
29
  from loom.ai.inference import InferenceTarget
30
+ from loom.ai.pricing import ModelPrice
29
31
  from loom.core.engine.compilable import Compilable
30
32
  from loom.core.model import LoomFrozenStruct, LoomType
31
33
  from loom.core.sql.config import SqlConnectionConfig
@@ -391,6 +393,8 @@ class AgentPlan(LoomFrozenStruct, frozen=True, kw_only=True):
391
393
  artifact declares neither ``deps_type`` nor ``deps_schema``.
392
394
  spec_version: Artifact format version, retained for self-description.
393
395
  inference: Resolved model binding; one binding, no fallback (FR-019a).
396
+ price: Configured price of the bound model, from ``ai.prices``, or
397
+ ``None`` when the deployment declares none for it.
394
398
  output: Structured-output contract with its compiled boundary type.
395
399
  output_check: Resolved predicate over the answer the engine parsed,
396
400
  when the artifact declares ``output_check``; ``None`` otherwise.
@@ -402,12 +406,28 @@ class AgentPlan(LoomFrozenStruct, frozen=True, kw_only=True):
402
406
  source_path: Artifact provenance for error messages, when known.
403
407
  """
404
408
 
409
+ @property
410
+ def fingerprint(self) -> str:
411
+ """Stable sha256 of everything that decides this agent's answers.
412
+
413
+ Covers the instructions as compiled, the output schema, the output
414
+ check, the policies, the format version, the kind and name of every
415
+ capability and the bound provider, model, output mode and options.
416
+ Leaves out the name, description, metadata, provenance, configured
417
+ price, where a capability is served from (URL, directory,
418
+ credentials, timeouts) and the binding's region, endpoint,
419
+ credentials and streaming flag. The output check enters by its import
420
+ path, so editing the check's body keeps the fingerprint.
421
+ """
422
+ return plan_fingerprint(self)
423
+
405
424
  name: str
406
425
  description: str
407
426
  instructions: tuple[CompiledInstruction, ...]
408
427
  state: StateShape | None = None
409
428
  spec_version: int
410
429
  inference: InferenceTarget
430
+ price: ModelPrice | None = None
411
431
  output: CompiledOutput
412
432
  output_check: OutputCheck | None = None
413
433
  capabilities: tuple[CompiledCapability, ...] = ()
@@ -21,6 +21,7 @@ from pathlib import Path
21
21
  from typing import Any, Final
22
22
 
23
23
  from loom.ai._filters import select_names
24
+ from loom.ai._paths import escapes, is_within
24
25
  from loom.ai.abc import NativeToolSupport
25
26
  from loom.ai.compiler._plan import (
26
27
  CompiledA2ACapability,
@@ -354,12 +355,6 @@ def _compile_a2a(capability: A2ACapability, context: _Context) -> _HandlerResult
354
355
  )
355
356
 
356
357
 
357
- def _library_escapes(library: str) -> bool:
358
- """Report whether a library name would leave the directory it is anchored to."""
359
- name = library.removeprefix(_LOCAL_LIBRARY_PREFIX)
360
- return ".." in Path(name).parts
361
-
362
-
363
358
  def _library_base(library: str, context: _Context) -> _ResolveResult:
364
359
  """Return the directory ``library`` is anchored to, or why it has none."""
365
360
  if library.startswith(_LOCAL_LIBRARY_PREFIX):
@@ -373,15 +368,15 @@ def _library_base(library: str, context: _Context) -> _ResolveResult:
373
368
 
374
369
 
375
370
  def _resolve_library(library: str, context: _Context) -> _ResolveResult:
376
- if _library_escapes(library):
371
+ if escapes(library.removeprefix(_LOCAL_LIBRARY_PREFIX)):
377
372
  return None, [skills_library_escapes(context.component, library)]
378
373
  base, issues = _library_base(library, context)
379
374
  if base is None:
380
375
  return None, issues
381
- resolved = (base / library.removeprefix(_LOCAL_LIBRARY_PREFIX)).resolve()
382
- if not resolved.is_relative_to(base.resolve()):
376
+ resolved = base / library.removeprefix(_LOCAL_LIBRARY_PREFIX)
377
+ if not is_within(resolved, base):
383
378
  return None, [skills_library_escapes(context.component, library)]
384
- return resolved, []
379
+ return resolved.resolve(), []
385
380
 
386
381
 
387
382
  def _discover_skills(directory: Path) -> tuple[tuple[str, ...], str | None]:
@@ -38,6 +38,7 @@ from loom.ai.errors import (
38
38
  remote_clients_unknown,
39
39
  )
40
40
  from loom.ai.inference import OUTPUT_MODES, InferenceTarget
41
+ from loom.ai.pricing import ModelPrice
41
42
  from loom.ai.remote_auth import is_strategy_registered, registered_strategy_names
42
43
  from loom.core.model import LoomFrozenStruct
43
44
 
@@ -339,6 +340,10 @@ class AiConfig(LoomFrozenStruct, frozen=True, kw_only=True):
339
340
  one of the two declares the artifacts of an application, and
340
341
  declaring both is a compilation error.
341
342
  models: Model-role bindings; must contain every role an agent declares.
343
+ prices: Prices keyed by vendor model id (``InferenceTarget.model``).
344
+ A plan bound to a listed model is priced with these rates rather
345
+ than the engine's own, which is what keeps ``policies.max_usd``
346
+ enforceable for a model the engine cannot price.
342
347
  skills_root: Filesystem root bare skill library names resolve against.
343
348
  mcp_servers: Named remote MCP servers artifacts refer to by name.
344
349
  a2a_agents: Named remote A2A agents artifacts refer to by name.
@@ -390,6 +395,7 @@ class AiConfig(LoomFrozenStruct, frozen=True, kw_only=True):
390
395
  engine: str
391
396
  models: dict[str, InferenceTarget]
392
397
  specs: tuple[str, ...] = ()
398
+ prices: dict[str, ModelPrice] = field(default_factory=dict)
393
399
  skills_root: str | None = None
394
400
  mcp_servers: dict[str, McpServerConfig] = field(default_factory=dict)
395
401
  a2a_agents: dict[str, A2AAgentConfig] = field(default_factory=dict)
@@ -18,7 +18,13 @@ from pathlib import Path
18
18
  from types import MappingProxyType
19
19
  from typing import Final, TypeVar
20
20
 
21
- from loom.ai.errors import AgentCompilationError, AgentCompilationIssue, spec_malformed
21
+ from loom.ai._paths import escapes, is_within
22
+ from loom.ai.errors import (
23
+ AgentCompilationError,
24
+ AgentCompilationIssue,
25
+ agent_specs_escape_root,
26
+ spec_malformed,
27
+ )
22
28
 
23
29
  from ._envelope import (
24
30
  LATEST_SPEC_VERSION,
@@ -122,10 +128,24 @@ _LOADERS: Final[Mapping[str, Callable[[bytes, str], DecodedSpec]]] = MappingProx
122
128
  )
123
129
 
124
130
 
131
+ def _glob(pattern: str, root: Path) -> tuple[set[Path], list[AgentCompilationIssue]]:
132
+ if escapes(pattern):
133
+ return set(), [agent_specs_escape_root(pattern)]
134
+ matches = {path for path in root.glob(pattern) if path.is_file()}
135
+ if not all(is_within(path, root) for path in matches):
136
+ return set(), [agent_specs_escape_root(pattern)]
137
+ return matches, []
138
+
139
+
125
140
  def _resolve_paths(patterns: Sequence[str], root: Path) -> tuple[Path, ...]:
126
141
  matches: set[Path] = set()
142
+ issues: list[AgentCompilationIssue] = []
127
143
  for pattern in patterns:
128
- matches.update(path for path in root.glob(pattern) if path.is_file())
144
+ found, pattern_issues = _glob(pattern, root)
145
+ matches.update(found)
146
+ issues.extend(pattern_issues)
147
+ if issues:
148
+ raise AgentCompilationError(issues)
129
149
  return tuple(sorted(matches))
130
150
 
131
151
 
@@ -154,8 +174,11 @@ def load_specs(
154
174
  ) -> tuple[DecodedSpec, ...]:
155
175
  """Load every artifact matching a set of globs.
156
176
 
157
- Patterns are resolved relative to ``root``; matches are de-duplicated across
158
- patterns and returned sorted by path, so the result is deterministic.
177
+ Patterns are resolved relative to ``root`` and may not leave it: an
178
+ absolute pattern, a ``..`` segment or a match whose resolved path lies
179
+ outside ``root`` is refused before any artifact is read. Matches are
180
+ de-duplicated across patterns and returned sorted by path, so the result
181
+ is deterministic.
159
182
  ``.yaml``/``.yml`` files decode as YAML, ``.json`` files as JSON, and any
160
183
  other extension is a failure.
161
184
 
@@ -172,8 +195,9 @@ def load_specs(
172
195
  One decoded artifact per matched file, ordered by path.
173
196
 
174
197
  Raises:
175
- AgentCompilationError: Aggregating every fatal issue found across all
176
- matched files.
198
+ AgentCompilationError: With ``AGENT_SPECS_ESCAPE_ROOT`` for every
199
+ pattern that leaves ``root``; otherwise aggregating every fatal
200
+ issue found across all matched files.
177
201
 
178
202
  Example:
179
203
  >>> load_specs(["*.agent.yaml"], root="agents")