loom-kernel 9.0.0__tar.gz → 9.2.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 (734) hide show
  1. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/CHANGELOG.md +111 -6
  2. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/PKG-INFO +1 -1
  3. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/card.py +1 -1
  4. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/server.py +4 -1
  5. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/_plan.py +12 -7
  6. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_capabilities.py +17 -6
  7. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/config.py +38 -23
  8. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +6 -1
  9. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/_shared.py +11 -0
  10. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/anthropic.py +2 -2
  11. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/bedrock.py +2 -2
  12. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/openai.py +2 -2
  13. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/typesafe.py +2 -2
  14. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/inference.py +2 -1
  15. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/remote_auth.py +9 -3
  16. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/bootstrap.py +38 -35
  17. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/config.py +6 -5
  18. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/abc/config.py +5 -2
  19. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/gateway.py +3 -1
  20. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/checks.py +7 -0
  21. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/__init__.py +2 -0
  22. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/_resolver_utils.py +10 -12
  23. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/binder.py +4 -3
  24. loom_kernel-9.2.0/src/loom/core/config/checks.py +64 -0
  25. loom_kernel-9.2.0/src/loom/core/config/convert.py +206 -0
  26. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/loader.py +2 -1
  27. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/observability.py +13 -7
  28. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/overrides.py +16 -2
  29. loom_kernel-9.2.0/src/loom/core/config/retired.py +35 -0
  30. loom_kernel-9.2.0/src/loom/core/connections/__init__.py +40 -0
  31. loom_kernel-9.2.0/src/loom/core/connections/_base.py +134 -0
  32. loom_kernel-9.2.0/src/loom/core/connections/aws/__init__.py +12 -0
  33. loom_kernel-9.2.0/src/loom/core/connections/aws/client.py +51 -0
  34. loom_kernel-9.2.0/src/loom/core/connections/aws/config.py +91 -0
  35. loom_kernel-9.2.0/src/loom/core/connections/aws/loader.py +35 -0
  36. loom_kernel-9.2.0/src/loom/core/connections/clickhouse/__init__.py +12 -0
  37. loom_kernel-9.2.0/src/loom/core/connections/clickhouse/client.py +83 -0
  38. loom_kernel-9.2.0/src/loom/core/connections/clickhouse/config.py +77 -0
  39. loom_kernel-9.2.0/src/loom/core/connections/clickhouse/loader.py +44 -0
  40. loom_kernel-9.2.0/src/loom/core/connections/mongo/__init__.py +12 -0
  41. loom_kernel-9.2.0/src/loom/core/connections/mongo/client.py +64 -0
  42. loom_kernel-9.2.0/src/loom/core/connections/mongo/config.py +112 -0
  43. loom_kernel-9.2.0/src/loom/core/connections/mongo/loader.py +41 -0
  44. loom_kernel-9.2.0/src/loom/core/connections/relational.py +27 -0
  45. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/errors/__init__.py +2 -0
  46. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/errors/errors.py +4 -0
  47. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/locator.py +10 -54
  48. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/logger/__init__.py +2 -0
  49. loom_kernel-9.2.0/src/loom/core/logger/context.py +43 -0
  50. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/_loom_type.py +5 -4
  51. loom_kernel-9.2.0/src/loom/core/model/redaction.py +508 -0
  52. loom_kernel-9.2.0/src/loom/core/model/struct.py +112 -0
  53. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/types.py +3 -0
  54. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/config.py +2 -1
  55. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/observer/otel.py +15 -7
  56. loom_kernel-9.2.0/src/loom/core/persistence/__init__.py +46 -0
  57. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/persistence/abc.py +31 -11
  58. loom_kernel-9.2.0/src/loom/core/persistence/database.py +265 -0
  59. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/persistence/none.py +14 -7
  60. loom_kernel-9.2.0/src/loom/core/persistence/profile.py +119 -0
  61. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/dynamodb/backend.py +50 -47
  62. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/dynamodb/registry.py +8 -0
  63. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/dynamodb/repository.py +51 -12
  64. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/backend.py +35 -31
  65. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/__init__.py +2 -1
  66. loom_kernel-9.2.0/src/loom/core/repository/sqlalchemy/_pool_metrics.py +42 -0
  67. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/backend.py +76 -71
  68. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/migrations/runners.py +2 -1
  69. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/mixins.py +2 -1
  70. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +1 -1
  71. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/__init__.py +1 -1
  72. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/session_manager.py +81 -52
  73. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/clickhouse/_client.py +8 -31
  74. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/clickhouse/registry.py +10 -18
  75. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/config.py +62 -30
  76. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/__init__.py +4 -0
  77. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_merge.py +43 -3
  78. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_write_policy.py +65 -17
  79. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_reader.py +37 -27
  80. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_writer.py +125 -9
  81. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/provider.py +32 -41
  82. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/_writer.py +3 -1
  83. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/provider.py +3 -2
  84. loom_kernel-9.2.0/src/loom/etl/checkpoint/_backends/_memory.py +60 -0
  85. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_backends/_polars.py +21 -8
  86. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_compiler.py +11 -2
  87. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_errors.py +8 -0
  88. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_validators.py +1 -15
  89. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_validators_plan.py +6 -2
  90. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_validators_step.py +21 -2
  91. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/__init__.py +4 -0
  92. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/__init__.py +9 -1
  93. loom_kernel-9.2.0/src/loom/etl/declarative/target/_errors.py +68 -0
  94. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_into.py +32 -0
  95. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_table.py +32 -0
  96. loom_kernel-9.2.0/src/loom/etl/io/_clickhouse_connection.py +44 -0
  97. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_clickhouse.py +18 -18
  98. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/targets/_clickhouse.py +35 -31
  99. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/_config.py +4 -3
  100. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runner/config_loader.py +2 -1
  101. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runner/core.py +2 -3
  102. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/storage/__init__.py +0 -4
  103. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/storage/_config.py +63 -69
  104. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/storage/routing.py +3 -2
  105. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/testing/__init__.py +6 -3
  106. loom_kernel-9.2.0/src/loom/etl/testing/_delta.py +86 -0
  107. loom_kernel-9.2.0/src/loom/etl/testing/_result.py +173 -0
  108. loom_kernel-9.2.0/src/loom/etl/testing/_runners.py +393 -0
  109. loom_kernel-9.2.0/src/loom/etl/testing/_scenario.py +260 -0
  110. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/testing/spark.py +31 -1
  111. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_flow_yaml.py +6 -1
  112. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/_factory.py +4 -3
  113. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/_slack.py +5 -2
  114. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/_sns.py +3 -2
  115. loom_kernel-9.2.0/src/loom/prometheus/db_pool.py +135 -0
  116. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prometheus/lifecycle.py +6 -3
  117. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/_body.py +25 -2
  118. loom_kernel-9.2.0/src/loom/rest/fastapi/_auto_ai.py +524 -0
  119. loom_kernel-9.2.0/src/loom/rest/fastapi/_auto_auth.py +145 -0
  120. loom_kernel-9.2.0/src/loom/rest/fastapi/_auto_sql.py +221 -0
  121. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/_errors.py +30 -3
  122. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/auto.py +103 -874
  123. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/router_runtime.py +43 -38
  124. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/sql.py +12 -25
  125. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/middleware.py +6 -8
  126. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/__init__.py +0 -2
  127. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_resource_manager.py +34 -54
  128. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_runtime_io.py +16 -4
  129. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/_shared.py +6 -17
  130. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/_plan.py +2 -2
  131. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/phases/build_plan.py +4 -3
  132. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/phases/validate.py +2 -2
  133. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_config.py +8 -6
  134. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/mongo/_bytewax_source.py +13 -24
  135. loom_kernel-9.2.0/src/loom/streaming/mongo/_config.py +68 -0
  136. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/__init__.py +0 -2
  137. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_table/__init__.py +3 -4
  138. loom_kernel-9.2.0/src/loom/streaming/nodes/_table/_clickhouse.py +206 -0
  139. loom_kernel-9.2.0/src/loom/streaming/nodes/_table/_delta.py +255 -0
  140. loom_kernel-9.2.0/src/loom/streaming/nodes/_table/_sqlalchemy.py +163 -0
  141. loom_kernel-9.2.0/src/loom/streaming/nodes/_table/common.py +595 -0
  142. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_table/config.py +49 -10
  143. loom_kernel-9.0.0/src/loom/core/config/_boto3.py +0 -22
  144. loom_kernel-9.0.0/src/loom/core/model/struct.py +0 -38
  145. loom_kernel-9.0.0/src/loom/core/persistence/__init__.py +0 -18
  146. loom_kernel-9.0.0/src/loom/etl/declarative/target/_errors.py +0 -30
  147. loom_kernel-9.0.0/src/loom/etl/testing/_result.py +0 -88
  148. loom_kernel-9.0.0/src/loom/etl/testing/_runners.py +0 -183
  149. loom_kernel-9.0.0/src/loom/etl/testing/_scenario.py +0 -79
  150. loom_kernel-9.0.0/src/loom/streaming/mongo/_config.py +0 -55
  151. loom_kernel-9.0.0/src/loom/streaming/nodes/_table/common.py +0 -1268
  152. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/.gitignore +0 -0
  153. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/LICENSE +0 -0
  154. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/README.md +0 -0
  155. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/pyproject.toml +0 -0
  156. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/__init__.py +0 -0
  157. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/__init__.py +0 -0
  158. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_concurrency.py +0 -0
  159. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_filters.py +0 -0
  160. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_paths.py +0 -0
  161. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_roles.py +0 -0
  162. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_startup.py +0 -0
  163. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_transport.py +0 -0
  164. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_usecase.py +0 -0
  165. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/__init__.py +0 -0
  166. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/_binding.py +0 -0
  167. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/_handlers.py +0 -0
  168. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/_rpc.py +0 -0
  169. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/events.py +0 -0
  170. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/abc.py +0 -0
  171. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/bootstrap.py +0 -0
  172. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/__init__.py +0 -0
  173. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/_compiler.py +0 -0
  174. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/_fingerprint.py +0 -0
  175. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
  176. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_conversation.py +0 -0
  177. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_feedable.py +0 -0
  178. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_hook.py +0 -0
  179. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_instructions.py +0 -0
  180. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
  181. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
  182. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_output.py +0 -0
  183. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_state.py +0 -0
  184. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/declarative/__init__.py +0 -0
  185. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/declarative/_envelope.py +0 -0
  186. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/declarative/_schema.py +0 -0
  187. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/declarative/_v1.py +0 -0
  188. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
  189. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/describe.py +0 -0
  190. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/__init__.py +0 -0
  191. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
  192. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
  193. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
  194. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
  195. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
  196. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_escape.py +0 -0
  197. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
  198. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
  199. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_history.py +0 -0
  200. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_instructions.py +0 -0
  201. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_limits.py +0 -0
  202. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
  203. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_native.py +0 -0
  204. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
  205. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
  206. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
  207. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
  208. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/extras/__init__.py +0 -0
  209. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/extras/a2a.py +0 -0
  210. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/extras/handlebars.py +0 -0
  211. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/extras/mcp.py +0 -0
  212. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/extras/skills.py +0 -0
  213. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
  214. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/__init__.py +0 -0
  215. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/gateway.py +0 -0
  216. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/errors.py +0 -0
  217. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/__init__.py +0 -0
  218. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/_batch.py +0 -0
  219. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/_columns.py +0 -0
  220. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/_frames.py +0 -0
  221. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/_ledger.py +0 -0
  222. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/_runner.py +0 -0
  223. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/_validation.py +0 -0
  224. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/fastapi/__init__.py +0 -0
  225. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/fastapi/endpoints.py +0 -0
  226. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/fastapi/response.py +0 -0
  227. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/fastapi/streaming.py +0 -0
  228. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/pricing.py +0 -0
  229. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/registry.py +0 -0
  230. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/__init__.py +0 -0
  231. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_bounded.py +0 -0
  232. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_chain.py +0 -0
  233. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_conversation.py +0 -0
  234. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_grants.py +0 -0
  235. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_handle.py +0 -0
  236. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_health.py +0 -0
  237. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_hooks.py +0 -0
  238. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_lifecycle.py +0 -0
  239. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_limits.py +0 -0
  240. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_mcp.py +0 -0
  241. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/validate/__init__.py +0 -0
  242. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/validate/__main__.py +0 -0
  243. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/__init__.py +0 -0
  244. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/auto.py +0 -0
  245. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/constants.py +0 -0
  246. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/runner.py +0 -0
  247. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/service.py +0 -0
  248. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/cli/__init__.py +0 -0
  249. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/cli/app.py +0 -0
  250. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/cli/check.py +0 -0
  251. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/cli/schema.py +0 -0
  252. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/async_bridge.py +0 -0
  253. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/__init__.py +0 -0
  254. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/_decide.py +0 -0
  255. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/_grants.py +0 -0
  256. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/_roles.py +0 -0
  257. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/_scope.py +0 -0
  258. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/elevation.py +0 -0
  259. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/product.py +0 -0
  260. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/backend/__init__.py +0 -0
  261. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/backend/core_model.py +0 -0
  262. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/backend/protocol.py +0 -0
  263. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/backend/scoped_ddl.py +0 -0
  264. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/backend/sqlalchemy.py +0 -0
  265. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/bootstrap/__init__.py +0 -0
  266. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
  267. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/bootstrap/kernel.py +0 -0
  268. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/__init__.py +0 -0
  269. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/_batching.py +0 -0
  270. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/_single_flight.py +0 -0
  271. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/abc/__init__.py +0 -0
  272. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/abc/backend.py +0 -0
  273. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/abc/dependency.py +0 -0
  274. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/calls.py +0 -0
  275. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/codec.py +0 -0
  276. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/decorators.py +0 -0
  277. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/dependency.py +0 -0
  278. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/errors.py +0 -0
  279. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/keys.py +0 -0
  280. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/memory.py +0 -0
  281. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/repository.py +0 -0
  282. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/result_codec.py +0 -0
  283. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/serializer.py +0 -0
  284. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/wiring.py +0 -0
  285. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/command/__init__.py +0 -0
  286. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/command/adapter.py +0 -0
  287. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/command/base.py +0 -0
  288. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/command/field.py +0 -0
  289. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/command/introspection.py +0 -0
  290. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/compiler.py +0 -0
  291. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/_includes.py +0 -0
  292. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/configurable.py +0 -0
  293. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/context.py +0 -0
  294. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/errors.py +0 -0
  295. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/keys.py +0 -0
  296. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/model.py +0 -0
  297. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/resolver.py +0 -0
  298. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/secrets.py +0 -0
  299. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/ssm.py +0 -0
  300. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/contracts/__init__.py +0 -0
  301. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/contracts/manifest.py +0 -0
  302. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/di/__init__.py +0 -0
  303. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/di/container.py +0 -0
  304. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/di/scope.py +0 -0
  305. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/discovery/__init__.py +0 -0
  306. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/discovery/_utils.py +0 -0
  307. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/discovery/base.py +0 -0
  308. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/discovery/interfaces.py +0 -0
  309. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/discovery/manifest.py +0 -0
  310. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/discovery/modules.py +0 -0
  311. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/__init__.py +0 -0
  312. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/compilable.py +0 -0
  313. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/compiler.py +0 -0
  314. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/events.py +0 -0
  315. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/executor.py +0 -0
  316. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/metrics.py +0 -0
  317. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/plan.py +0 -0
  318. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/post_commit.py +0 -0
  319. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/environment.py +0 -0
  320. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/errors/codes.py +0 -0
  321. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/expr/__init__.py +0 -0
  322. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/expr/eval.py +0 -0
  323. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/expr/nodes.py +0 -0
  324. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/expr/refs.py +0 -0
  325. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/identity/__init__.py +0 -0
  326. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/identity/context.py +0 -0
  327. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/identity/identity.py +0 -0
  328. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/identity/issuer.py +0 -0
  329. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/identity/wire.py +0 -0
  330. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/introspection/__init__.py +0 -0
  331. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/introspection/base.py +0 -0
  332. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/introspection/describe.py +0 -0
  333. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/job/__init__.py +0 -0
  334. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/job/callback.py +0 -0
  335. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/job/context.py +0 -0
  336. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/job/handle.py +0 -0
  337. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/job/job.py +0 -0
  338. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/job/service.py +0 -0
  339. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/logger/abc.py +0 -0
  340. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/logger/checks.py +0 -0
  341. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/logger/config.py +0 -0
  342. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/logger/registry.py +0 -0
  343. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/logger/structlogger.py +0 -0
  344. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/__init__.py +0 -0
  345. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/_json_schema.py +0 -0
  346. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/base.py +0 -0
  347. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/convert.py +0 -0
  348. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/enums.py +0 -0
  349. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/field.py +0 -0
  350. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/introspection.py +0 -0
  351. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/partition.py +0 -0
  352. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/privilege.py +0 -0
  353. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/projection.py +0 -0
  354. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/relation.py +0 -0
  355. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/scoped.py +0 -0
  356. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/timestamped.py +0 -0
  357. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/types_postgres.py +0 -0
  358. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/__init__.py +0 -0
  359. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/event.py +0 -0
  360. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/observer/__init__.py +0 -0
  361. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/observer/noop.py +0 -0
  362. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/observer/structlog.py +0 -0
  363. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/otel_ids.py +0 -0
  364. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/protocol.py +0 -0
  365. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/runtime.py +0 -0
  366. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/span.py +0 -0
  367. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/topology.py +0 -0
  368. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/persistence/registry.py +0 -0
  369. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/plugins/__init__.py +0 -0
  370. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/plugins/entrypoints.py +0 -0
  371. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/plugins/optional.py +0 -0
  372. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/projection/__init__.py +0 -0
  373. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/projection/loaders.py +0 -0
  374. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/projection/runtime.py +0 -0
  375. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/__init__.py +0 -0
  376. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/__init__.py +0 -0
  377. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/checks.py +0 -0
  378. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/cursor.py +0 -0
  379. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/errors.py +0 -0
  380. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/query.py +0 -0
  381. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/query_compiler.py +0 -0
  382. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/repo_for.py +0 -0
  383. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/repository.py +0 -0
  384. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/session_scope.py +0 -0
  385. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
  386. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
  387. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/__init__.py +0 -0
  388. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/ids.py +0 -0
  389. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/query_compiler.py +0 -0
  390. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/registry.py +0 -0
  391. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/repository.py +0 -0
  392. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/uow.py +0 -0
  393. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/values.py +0 -0
  394. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mutation.py +0 -0
  395. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/registration.py +0 -0
  396. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/registry.py +0 -0
  397. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
  398. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
  399. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/migrations/__init__.py +0 -0
  400. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/migrations/env_template.py +0 -0
  401. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/migrations/hook.py +0 -0
  402. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/migrations/operations.py +0 -0
  403. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
  404. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
  405. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
  406. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
  407. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
  408. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
  409. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
  410. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
  411. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
  412. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
  413. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
  414. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
  415. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/bootstrap.py +0 -0
  416. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/config.py +0 -0
  417. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/elevate.py +0 -0
  418. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/guard/0001.sql +0 -0
  419. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/guard/0002.sql +0 -0
  420. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/guard/preflight.sql +0 -0
  421. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/guard_manifest.py +0 -0
  422. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/integrity.py +0 -0
  423. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/partitions.py +0 -0
  424. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/provider.py +0 -0
  425. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/schema.py +0 -0
  426. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/sources.py +0 -0
  427. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/verify.py +0 -0
  428. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/session_settings.py +0 -0
  429. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
  430. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
  431. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/values.py +0 -0
  432. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/response/__init__.py +0 -0
  433. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/response/base.py +0 -0
  434. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/routing/__init__.py +0 -0
  435. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/routing/ref.py +0 -0
  436. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/routing/resolver.py +0 -0
  437. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/runner.py +0 -0
  438. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/schema/__init__.py +0 -0
  439. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/schema/schema_mode.py +0 -0
  440. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/schema_names.py +0 -0
  441. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/__init__.py +0 -0
  442. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/abc/__init__.py +0 -0
  443. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/abc/contracts.py +0 -0
  444. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/abc/errors.py +0 -0
  445. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/caller_bound.py +0 -0
  446. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
  447. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
  448. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/roles.py +0 -0
  449. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/service.py +0 -0
  450. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/symbols.py +0 -0
  451. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/tracing/__init__.py +0 -0
  452. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/tracing/context.py +0 -0
  453. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/transaction.py +0 -0
  454. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/transport/__init__.py +0 -0
  455. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/transport/adapter.py +0 -0
  456. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/uow/__init__.py +0 -0
  457. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/uow/abc.py +0 -0
  458. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/uow/context.py +0 -0
  459. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/__init__.py +0 -0
  460. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/_predicates.py +0 -0
  461. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/agent_markers.py +0 -0
  462. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/compute.py +0 -0
  463. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/constants.py +0 -0
  464. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/factory.py +0 -0
  465. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/field_ref.py +0 -0
  466. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/invoker.py +0 -0
  467. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/keys.py +0 -0
  468. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/markers.py +0 -0
  469. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/mcp_markers.py +0 -0
  470. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/outcome.py +0 -0
  471. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/registry.py +0 -0
  472. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/rule.py +0 -0
  473. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/use_case.py +0 -0
  474. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/_uri.py +0 -0
  475. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/__init__.py +0 -0
  476. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_format_registry.py +0 -0
  477. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
  478. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_historify/_common.py +0 -0
  479. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_historify/_log.py +0 -0
  480. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
  481. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
  482. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
  483. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_path_template.py +0 -0
  484. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_predicate.py +0 -0
  485. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
  486. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
  487. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
  488. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/__init__.py +0 -0
  489. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
  490. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
  491. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_frame.py +0 -0
  492. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_historify.py +0 -0
  493. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
  494. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_schema.py +0 -0
  495. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
  496. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
  497. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/__init__.py +0 -0
  498. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
  499. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/_historify.py +0 -0
  500. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/_reader.py +0 -0
  501. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/_schema.py +0 -0
  502. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
  503. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/__init__.py +0 -0
  504. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
  505. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
  506. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_options.py +0 -0
  507. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_paths.py +0 -0
  508. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_scope.py +0 -0
  509. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_store.py +0 -0
  510. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/__init__.py +0 -0
  511. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_binding.py +0 -0
  512. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_filter.py +0 -0
  513. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_plan.py +0 -0
  514. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_validators_agents.py +0 -0
  515. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_validators_config.py +0 -0
  516. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/_format.py +0 -0
  517. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/_read_options.py +0 -0
  518. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/_utils.py +0 -0
  519. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/_with_agent.py +0 -0
  520. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/_write_options.py +0 -0
  521. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
  522. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/expr/_params.py +0 -0
  523. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
  524. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
  525. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
  526. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/__init__.py +0 -0
  527. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/_from.py +0 -0
  528. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
  529. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/_from_config.py +0 -0
  530. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
  531. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
  532. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/_specs.py +0 -0
  533. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_client.py +0 -0
  534. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_file.py +0 -0
  535. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
  536. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
  537. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
  538. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
  539. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
  540. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
  541. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_temp.py +0 -0
  542. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/executor/__init__.py +0 -0
  543. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/executor/_agents.py +0 -0
  544. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/executor/_dispatcher.py +0 -0
  545. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/executor/_executor.py +0 -0
  546. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/__init__.py +0 -0
  547. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/_registry.py +0 -0
  548. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/__init__.py +0 -0
  549. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
  550. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
  551. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
  552. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_mongo.py +0 -0
  553. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
  554. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
  555. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
  556. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_serialization.py +0 -0
  557. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/targets/__init__.py +0 -0
  558. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/__init__.py +0 -0
  559. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/_observer.py +0 -0
  560. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/_records.py +0 -0
  561. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
  562. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
  563. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
  564. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
  565. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/__init__.py +0 -0
  566. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/_builder.py +0 -0
  567. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/_ops.py +0 -0
  568. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/_protocol.py +0 -0
  569. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/_runner.py +0 -0
  570. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/_step.py +0 -0
  571. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
  572. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
  573. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/__init__.py +0 -0
  574. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_generics.py +0 -0
  575. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_params.py +0 -0
  576. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
  577. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_process.py +0 -0
  578. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_sql.py +0 -0
  579. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_step.py +0 -0
  580. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_step_client.py +0 -0
  581. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
  582. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runner/__init__.py +0 -0
  583. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runner/_agents.py +0 -0
  584. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runner/_providers.py +0 -0
  585. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runner/_wiring.py +0 -0
  586. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runtime/__init__.py +0 -0
  587. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runtime/_config_values.py +0 -0
  588. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runtime/contracts.py +0 -0
  589. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/schema/__init__.py +0 -0
  590. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/schema/_contract.py +0 -0
  591. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/schema/_schema.py +0 -0
  592. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/storage/_file_locator.py +0 -0
  593. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/storage/_locator.py +0 -0
  594. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/testing/_stubs.py +0 -0
  595. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/__init__.py +0 -0
  596. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_async.py +0 -0
  597. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_config.py +0 -0
  598. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_ctx.py +0 -0
  599. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_meta.py +0 -0
  600. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_placeholders.py +0 -0
  601. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_summary.py +0 -0
  602. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/deploy/__init__.py +0 -0
  603. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/deploy/_discovery.py +0 -0
  604. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/deploy/_schedule.py +0 -0
  605. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/deploy/_yaml_etls.py +0 -0
  606. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/deploy/entrypoint.py +0 -0
  607. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/__init__.py +0 -0
  608. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_assemble.py +0 -0
  609. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_backfill.py +0 -0
  610. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
  611. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_body.py +0 -0
  612. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_common.py +0 -0
  613. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_factory.py +0 -0
  614. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_hooks.py +0 -0
  615. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_maintenance.py +0 -0
  616. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_params.py +0 -0
  617. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_run_name.py +0 -0
  618. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_runtime.py +0 -0
  619. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_signature.py +0 -0
  620. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_stages.py +0 -0
  621. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/manifest/__init__.py +0 -0
  622. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/manifest/_model.py +0 -0
  623. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/manifest/_s3.py +0 -0
  624. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/manifest/_store.py +0 -0
  625. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/__init__.py +0 -0
  626. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/_event.py +0 -0
  627. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/_format.py +0 -0
  628. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/_port.py +0 -0
  629. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/observer/__init__.py +0 -0
  630. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/observer/_flow.py +0 -0
  631. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
  632. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/observer/_manifest.py +0 -0
  633. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/observer/_task_run.py +0 -0
  634. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prometheus/__init__.py +0 -0
  635. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prometheus/_instruments.py +0 -0
  636. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prometheus/adapter.py +0 -0
  637. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prometheus/kafka.py +0 -0
  638. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prometheus/middleware.py +0 -0
  639. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/py.typed +0 -0
  640. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/__init__.py +0 -0
  641. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/adapter.py +0 -0
  642. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/auth/__init__.py +0 -0
  643. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/auth/abc.py +0 -0
  644. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/auth/config.py +0 -0
  645. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/auth/jwt.py +0 -0
  646. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/auth/middleware.py +0 -0
  647. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/autocrud.py +0 -0
  648. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/checks.py +0 -0
  649. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/compiler.py +0 -0
  650. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/config.py +0 -0
  651. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/constants.py +0 -0
  652. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/cors.py +0 -0
  653. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/errors.py +0 -0
  654. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/__init__.py +0 -0
  655. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
  656. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/app.py +0 -0
  657. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/health.py +0 -0
  658. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/openapi.py +0 -0
  659. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/response.py +0 -0
  660. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/model.py +0 -0
  661. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/rest_adapter.py +0 -0
  662. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/__init__.py +0 -0
  663. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
  664. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
  665. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
  666. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
  667. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_errors.py +0 -0
  668. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_operators.py +0 -0
  669. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
  670. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
  671. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
  672. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
  673. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
  674. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
  675. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
  676. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
  677. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
  678. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/runner.py +0 -0
  679. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/__init__.py +0 -0
  680. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/_bindings.py +0 -0
  681. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/_compiler.py +0 -0
  682. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/_errors.py +0 -0
  683. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/core/__init__.py +0 -0
  684. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/core/_errors.py +0 -0
  685. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/core/_exceptions.py +0 -0
  686. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/core/_message.py +0 -0
  687. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/core/_tracing.py +0 -0
  688. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/core/_typing.py +0 -0
  689. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/graph/__init__.py +0 -0
  690. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/graph/_flow.py +0 -0
  691. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/__init__.py +0 -0
  692. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_codec.py +0 -0
  693. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_errors.py +0 -0
  694. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
  695. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_message.py +0 -0
  696. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_record.py +0 -0
  697. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_wire.py +0 -0
  698. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
  699. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
  700. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
  701. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
  702. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
  703. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
  704. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
  705. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
  706. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
  707. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/mongo/__init__.py +0 -0
  708. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/mongo/_event.py +0 -0
  709. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/mongo/_normalize.py +0 -0
  710. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_boundary.py +0 -0
  711. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_branches.py +0 -0
  712. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
  713. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
  714. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_decompose.py +0 -0
  715. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
  716. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
  717. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_fork.py +0 -0
  718. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_helpers.py +0 -0
  719. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_mongo.py +0 -0
  720. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_protocols.py +0 -0
  721. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_router.py +0 -0
  722. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_shape.py +0 -0
  723. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_sink.py +0 -0
  724. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_step.py +0 -0
  725. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_with.py +0 -0
  726. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/refs.py +0 -0
  727. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/testing.py +0 -0
  728. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/__init__.py +0 -0
  729. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/agents.py +0 -0
  730. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/golden.py +0 -0
  731. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/http_harness.py +0 -0
  732. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/in_memory.py +0 -0
  733. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/repository_harness.py +0 -0
  734. {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/runner.py +0 -0
@@ -2,6 +2,87 @@
2
2
 
3
3
  ## ✨ Features
4
4
 
5
+ ### etl
6
+
7
+ - **etl:** `IntoTable(...).upsert(..., delete_flag=...)` deletes matched rows
8
+ whose boolean source column is true and does not insert unmatched rows with
9
+ that flag. A false or null flag keeps the normal update or insert; null is
10
+ read as false (`coalesce(s.<flag>, false)`). The column is removed before
11
+ schema alignment, including `SchemaMode.STRICT`, so it is never written and
12
+ never appears in the update or insert maps. It must exist on the source
13
+ frame, be boolean, must not be a key, a partition column, or listed in
14
+ `exclude` or `include`, and must not name a column of the target table;
15
+ otherwise `UpsertDeleteFlagError` is raised before anything is written. The
16
+ Polars writer applies it. Any other writer, including Spark, raises
17
+ `UnsupportedUpsertDeleteFlagError` and does not write. On first write the
18
+ table is created from the unflagged rows, so a batch where every row is
19
+ flagged creates an empty table. A key repeated in the source batch (for
20
+ example a tombstone and a live row) fails the MERGE. With
21
+ `SchemaMode.EVOLVE` the MERGE does not add new source columns, as before.
22
+ Omitting `delete_flag` leaves the MERGE byte-for-byte as it was: matched
23
+ update and unmatched insert, with no delete clause. `UpsertSpec` gains
24
+ `delete_flag`; `UpsertDeleteFlagError` and
25
+ `UnsupportedUpsertDeleteFlagError` are exported from `loom.etl`.
26
+ - **etl:** `PolarsStepRunner` tests steps that use temps and real Delta
27
+ targets. `FromTemp`/`IntoTemp` work through an in-memory `CheckpointStore`
28
+ that keeps the production checks (an `IntoTemp` step returning a
29
+ `pl.DataFrame` raises `TypeError`, fan-in aligns to the first schema,
30
+ RUN then CORRELATION lookup); temps persist across `run()` calls of one
31
+ runner, which keeps a fixed run context. `seed_temp(name, data, columns,
32
+ *, schema=)` seeds a temp by `temp_name` from row tuples or a Polars frame;
33
+ `seed_temp(result)` seeds the `StepResult` of an `IntoTemp` step under the
34
+ name it wrote. A seeded temp lives in RUN scope, which `FromTemp` reads
35
+ before CORRELATION scope. A step whose target is `IntoTemp` returns, as its
36
+ `StepResult`, the temp read from the scope the step wrote (the accumulated
37
+ temp for fan-in) instead of raising "Step produced no output". `seed` and
38
+ `ETLScenario.with_table` accept `schema=` (loom types) so empty and all-null
39
+ columns keep their dtype. `PolarsStepRunner(*scenarios, delta_root=)`
40
+ applies scenarios at construction; with `delta_root` the real
41
+ `PolarsSourceReader`/`PolarsTargetWriter` run on that directory, seeds are
42
+ written as Delta tables (a column left without dtype raises `SchemaError`
43
+ asking for `schema=`), missing targets are created, and `table(ref)`
44
+ returns the final state. `StepResult` keeps the step's `target` spec and
45
+ derives `temp_name` and `delete_flag` from it. `StepResult.deletes` counts
46
+ the rows the step emitted with its upsert `delete_flag` set, and raises
47
+ `UpsertDeleteFlagError` when the output lacks the flag column or it is not
48
+ boolean; `StepResult.merged` returns the `MergeMetrics(inserted, updated,
49
+ deleted)` the Delta MERGE applied, only with `delta_root` and an upsert or
50
+ update that merged into an existing table. `ETLScenario` gains `with_temp`,
51
+ `after(step, params)` and `+`. `after()` runs the `IntoTemp` step once, on
52
+ a fresh in-memory runner seeded only with the scenario entries before it
53
+ (not the runner's config or other seeds), and seeds the memoized output on
54
+ every application. The scenario `repr` lists `tables`, `temps` and
55
+ `after` separately.
56
+ `SparkStepRunner.seed_temp` and `SparkStepRunner.seed(..., schema=...)`
57
+ raise `NotImplementedError`. Cache scenarios and frames, not runners: tests
58
+ that mutate state need a function-scoped runner on their own `tmp_path`.
59
+
60
+ ## ⚠ Behaviour changes
61
+
62
+ ### etl
63
+
64
+ - **etl:** the `PolarsStepRunner` reader applies what a `FromTable` or
65
+ `FromFile` declares, as `PolarsSourceReader` does: `.where()` filters,
66
+ `.columns()` projects (an unknown column raises
67
+ `polars.exceptions.ColumnNotFoundError`), `with_schema` casts and
68
+ `parse_json` decodes. Before, the seeded frame reached the step unchanged;
69
+ a seed that was already decoded for a `parse_json` column must now hold the
70
+ JSON text.
71
+ - **etl:** `ETLScenario` is immutable: `with_table` returns a new scenario
72
+ and no longer changes the one it is called on. Chained calls work as before;
73
+ code that called `scenario.with_table(...)` without using the result must
74
+ use it.
75
+ - **etl:** `StepRunnerProto` requires `seed(..., *, schema=None)`,
76
+ `seed_temp` and `run`. `ETLScenario.apply` still calls `seed(ref, data,
77
+ columns)` positionally when no schema is declared.
78
+
79
+ # 🚀 Releases 2.1.3 to 9.0.0
80
+
81
+ Entries from 2.1.3 to 9.0.0 were kept under one heading and are not split
82
+ by version; each release's own list is in its GitHub Release notes.
83
+
84
+ ## ✨ Features
85
+
5
86
  ### core
6
87
 
7
88
  - **core:** range-partitioned row-scoped tables.
@@ -99,6 +180,13 @@
99
180
  parameter raises a `TypeError` naming the code. `AgentErrorCode`,
100
181
  `StreamingErrorCode` and `ETLErrorCode` are such catalogues, and
101
182
  `ETLCompilationError.from_issue(issue)` raises the ETL error for an issue.
183
+ - **core:** `loom.core.logger.log_context(**values)` adds fields to every log
184
+ record emitted inside the block through `get_logger` with its default
185
+ factory, and to plain stdlib records once `configure_logging` has installed
186
+ loom's formatter, so an application can bind, say, an audit `request_id`
187
+ without importing structlog. The values follow the current thread or
188
+ asyncio task, and each key regains its previous value on exit, even by
189
+ exception. The block must be entered and exited in the same context.
102
190
 
103
191
  ### ai
104
192
 
@@ -965,12 +1053,11 @@
965
1053
  - **rest:** a JSON object body that fails `Command` validation now answers
966
1054
  `422 boundary_validation` with a `violations` list (`{field, message}`
967
1055
  pairs, `field` being the wire name the client sent, the same shape
968
- `rule_violations` already uses) instead of a generic `500`; malformed
969
- JSON and a non-object body are unchanged. `Command.from_payload` now
970
- raises `BoundaryValidationError` — a `ValueError` — instead of
971
- `msgspec.ValidationError`. The root `title` is dropped on pydantic
972
- OpenAPI schemas for request bodies and responses alike, matching the
973
- untitled document a Struct always produced.
1056
+ `rule_violations` already uses) instead of a generic `500`.
1057
+ `Command.from_payload` now raises `BoundaryValidationError` — a
1058
+ `ValueError` — instead of `msgspec.ValidationError`. The root `title` is
1059
+ dropped on pydantic OpenAPI schemas for request bodies and responses alike,
1060
+ matching the untitled document a Struct always produced.
974
1061
  - **rest:** a `sortable` column must be a field of the items the route
975
1062
  answers with (`PageResult[T]`, `CursorResult[T]` or `list[T]`); a column
976
1063
  the response does not show, or a result type that does not say, fails
@@ -998,6 +1085,24 @@
998
1085
  `QUERY_PARAM_SORT`, `QUERY_PARAM_DIRECTION` and `QUERY_PARAM_PROFILE`
999
1086
  re-exports of `loom.rest.fastapi.openapi` are removed; use the matching
1000
1087
  `loom.rest.constants.QueryParam` member (`QueryParam.PAGE`, ...).
1088
+ - **rest:** a request body that is not well-formed JSON — a syntax error,
1089
+ bytes that are not UTF-8, nesting too deep to decode, or an empty body on a
1090
+ route that takes input — now answers `400` with the standard error body
1091
+ (`code: bad_request`, the fixed message `Request body is not valid JSON`,
1092
+ `trace_id`) instead of a generic `500 internal_error` without the `detail`
1093
+ envelope. Well-formed JSON that is not an object (an array, a string, a
1094
+ number, `null`) answers `422 boundary_validation` with the fixed message
1095
+ `Request body must be a JSON object` and one `body` violation, instead of
1096
+ that same `500`. Neither echoes the body. A JSON object that fails
1097
+ validation still answers `422` as before, and the `Content-Type` header is
1098
+ still not checked.
1099
+ - **rest:** the SQL endpoint answers a body that is not well-formed JSON the
1100
+ same way: `400` with `code: bad_request` and the fixed message
1101
+ `Request body is not valid JSON`, instead of a `422 rule_violation` that
1102
+ carried the decoder's message. Bytes that are not UTF-8 inside a JSON
1103
+ string and nesting too deep to decode, which answered a generic
1104
+ `500 internal_error`, are now that `400` too. A well-formed body
1105
+ that does not fit the schema still answers `422 rule_violation`.
1001
1106
 
1002
1107
  ### prefect
1003
1108
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: loom-kernel
3
- Version: 9.0.0
3
+ Version: 9.2.0
4
4
  Summary: Loom Python project
5
5
  License-File: LICENSE
6
6
  Classifier: Programming Language :: Python :: 3
@@ -136,7 +136,7 @@ def build_agent_card(
136
136
  "protocolVersion": PROTOCOL_VERSION,
137
137
  "name": plan.name,
138
138
  "description": plan.description,
139
- "url": agent_url(config.base_url, plan.name, prefix=prefix),
139
+ "url": agent_url(config.base_url.reveal(), plan.name, prefix=prefix),
140
140
  "version": str(plan.spec_version),
141
141
  "capabilities": dict(_TRANSPORT_CAPABILITIES),
142
142
  "defaultInputModes": list(_INPUT_MODES),
@@ -221,5 +221,8 @@ def bind_a2a_endpoints(
221
221
  methods=["POST"],
222
222
  )
223
223
  announce_publication(
224
- agent, base_url=config.a2a.base_url, mechanism=mechanism, prefix=prefix
224
+ agent,
225
+ base_url=str(config.a2a.base_url),
226
+ mechanism=mechanism,
227
+ prefix=prefix,
225
228
  )
@@ -30,6 +30,7 @@ from loom.ai.inference import InferenceTarget
30
30
  from loom.ai.pricing import ModelPrice
31
31
  from loom.core.engine.compilable import Compilable
32
32
  from loom.core.model import LoomFrozenStruct, LoomType
33
+ from loom.core.model.redaction import Secret
33
34
  from loom.core.sql.config import SqlConnectionConfig
34
35
 
35
36
 
@@ -111,11 +112,12 @@ class CompiledRemoteAuth(LoomFrozenStruct, frozen=True, kw_only=True):
111
112
  Attributes:
112
113
  kind: Strategy name registered in the ``loom.ai.remote_auth`` group.
113
114
  settings: The rest of the ``auth`` block, passed to the strategy as
114
- keyword arguments in declaration order.
115
+ keyword arguments in declaration order. A repr masks them; the
116
+ strategy receives the text when it is built.
115
117
  """
116
118
 
117
119
  kind: str
118
- settings: tuple[tuple[str, str], ...] = ()
120
+ settings: tuple[tuple[str, Secret[str] | str], ...] = ()
119
121
 
120
122
 
121
123
  class CompiledMcpCapability(LoomFrozenStruct, frozen=True, kw_only=True):
@@ -139,7 +141,8 @@ class CompiledMcpCapability(LoomFrozenStruct, frozen=True, kw_only=True):
139
141
  of this worker.
140
142
  url: Validated ``https://`` server URL, free of inline credentials;
141
143
  ``None`` under ``stdio``.
142
- headers_ref: Reference to deployment-resolved headers; never a secret.
144
+ headers_ref: Resolved header payload. A repr masks it; the client
145
+ reveals it when the connection opens.
143
146
  auth: Named authentication strategy, mutually exclusive with
144
147
  ``headers_ref``; ``None`` when the server needs no credential.
145
148
  timeout_ms: Deadline of a single call to this server.
@@ -148,6 +151,7 @@ class CompiledMcpCapability(LoomFrozenStruct, frozen=True, kw_only=True):
148
151
  args: Arguments passed to ``command``.
149
152
  env: Environment handed to the subprocess as key-sorted pairs, so the
150
153
  plan stays a hashable value whatever order the operator wrote.
154
+ Values are masked in a repr and revealed when the process starts.
151
155
  include: Tool names or glob patterns to expose; empty means all.
152
156
  exclude: Tool names or glob patterns to omit, applied after ``include``.
153
157
  """
@@ -157,12 +161,12 @@ class CompiledMcpCapability(LoomFrozenStruct, frozen=True, kw_only=True):
157
161
  server: str
158
162
  transport: str = "http"
159
163
  url: str | None = None
160
- headers_ref: str | None = None
164
+ headers_ref: Secret[str] | None = None
161
165
  auth: CompiledRemoteAuth | None = None
162
166
  timeout_ms: int = 20000
163
167
  command: str | None = None
164
168
  args: tuple[str, ...] = ()
165
- env: tuple[tuple[str, str], ...] = ()
169
+ env: tuple[tuple[str, Secret[str] | str], ...] = ()
166
170
  include: tuple[str, ...] = ()
167
171
  exclude: tuple[str, ...] = ()
168
172
 
@@ -244,7 +248,8 @@ class CompiledA2ACapability(LoomFrozenStruct, frozen=True, kw_only=True):
244
248
  Attributes:
245
249
  agent: Configured agent name, carried for the self-description.
246
250
  url: Validated ``https://`` remote agent URL, free of credentials.
247
- headers_ref: Reference to deployment-resolved headers; never a secret.
251
+ headers_ref: Resolved header payload. A repr masks it; the client
252
+ reveals it when the connection opens.
248
253
  Applied to every request the client makes, the card fetch included.
249
254
  auth: Named authentication strategy, mutually exclusive with
250
255
  ``headers_ref``; ``None`` when the agent needs no credential.
@@ -256,7 +261,7 @@ class CompiledA2ACapability(LoomFrozenStruct, frozen=True, kw_only=True):
256
261
 
257
262
  agent: str
258
263
  url: str
259
- headers_ref: str | None = None
264
+ headers_ref: Secret[str] | None = None
260
265
  auth: CompiledRemoteAuth | None = None
261
266
  include: tuple[str, ...] = ()
262
267
  exclude: tuple[str, ...] = ()
@@ -49,6 +49,7 @@ from loom.ai.declarative import (
49
49
  from loom.ai.errors import AgentCompilationError, AgentCompilationIssue, AgentErrorCode
50
50
  from loom.ai.inference import InferenceTarget
51
51
  from loom.core.engine.compilable import Compilable
52
+ from loom.core.model.redaction import Secret
52
53
  from loom.core.sql.config import SqlConfig, roles_need_identity_binding
53
54
  from loom.core.symbols import import_symbol
54
55
  from loom.core.use_case.registry import UseCaseRegistry
@@ -319,13 +320,13 @@ def compile_mcp_capability(
319
320
  CompiledMcpCapability(
320
321
  server=server_name,
321
322
  transport=server.transport,
322
- url=server.url,
323
+ url=None if server.url is None else server.url.reveal(),
323
324
  headers_ref=server.headers_ref,
324
325
  auth=_compile_auth(server.auth),
325
326
  timeout_ms=server.timeout_ms,
326
327
  command=server.command,
327
328
  args=server.args,
328
- env=tuple(sorted((server.env or {}).items())),
329
+ env=tuple(sorted((key, _carry(value)) for key, value in (server.env or {}).items())),
329
330
  include=include,
330
331
  exclude=exclude,
331
332
  ),
@@ -343,7 +344,17 @@ def _compile_mcp(capability: McpCapability, context: _Context) -> _HandlerResult
343
344
  )
344
345
 
345
346
 
346
- def _compile_auth(auth: Mapping[str, str] | None) -> CompiledRemoteAuth | None:
347
+ def _carry(value: object) -> Secret[str] | str:
348
+ """Hold a resolved setting. A blank string stays text: ``Secret`` rejects it."""
349
+ if isinstance(value, Secret):
350
+ return value
351
+ text = value if isinstance(value, str) else str(value)
352
+ if text.strip():
353
+ return Secret(text)
354
+ return text
355
+
356
+
357
+ def _compile_auth(auth: Mapping[str, object] | None) -> CompiledRemoteAuth | None:
347
358
  """Split a validated ``auth`` block into the strategy name and its settings.
348
359
 
349
360
  Shared by the ``mcp`` and ``a2a`` grants: both endpoints declare the same
@@ -354,8 +365,8 @@ def _compile_auth(auth: Mapping[str, str] | None) -> CompiledRemoteAuth | None:
354
365
  if auth is None:
355
366
  return None
356
367
  return CompiledRemoteAuth(
357
- kind=auth["kind"],
358
- settings=tuple((key, value) for key, value in auth.items() if key != "kind"),
368
+ kind=str(auth["kind"]),
369
+ settings=tuple((key, _carry(value)) for key, value in auth.items() if key != "kind"),
359
370
  )
360
371
 
361
372
 
@@ -370,7 +381,7 @@ def _compile_a2a(capability: A2ACapability, context: _Context) -> _HandlerResult
370
381
  return (
371
382
  CompiledA2ACapability(
372
383
  agent=capability.agent,
373
- url=agent.url,
384
+ url=agent.url.reveal(),
374
385
  headers_ref=agent.headers_ref,
375
386
  auth=_compile_auth(agent.auth),
376
387
  include=capability.include,
@@ -25,6 +25,7 @@ from loom.ai.inference import OUTPUT_MODES, InferenceTarget
25
25
  from loom.ai.pricing import ModelPrice
26
26
  from loom.ai.remote_auth import is_strategy_registered, registered_strategy_names
27
27
  from loom.core.model import LoomFrozenStruct
28
+ from loom.core.model.redaction import Dsn, RedactedMap, Secret
28
29
 
29
30
  # Conservative allowlist for a secret *reference*: a name, path, ARN or key id
30
31
  # the secrets resolver can look up. It excludes whitespace, newlines, quotes,
@@ -241,13 +242,13 @@ class McpServerConfig(LoomFrozenStruct, frozen=True, kw_only=True):
241
242
  """
242
243
 
243
244
  transport: str = "http"
244
- url: str | None = None
245
- headers_ref: str | None = None
246
- auth: dict[str, str] | None = None
245
+ url: Dsn | None = None
246
+ headers_ref: Secret[str] | None = None
247
+ auth: RedactedMap | None = None
247
248
  timeout_ms: int = 20000
248
249
  command: str | None = None
249
250
  args: tuple[str, ...] = ()
250
- env: dict[str, str] | None = None
251
+ env: RedactedMap | None = None
251
252
 
252
253
 
253
254
  class A2AAgentConfig(LoomFrozenStruct, frozen=True, kw_only=True):
@@ -270,9 +271,9 @@ class A2AAgentConfig(LoomFrozenStruct, frozen=True, kw_only=True):
270
271
  Mutually exclusive with ``headers_ref``.
271
272
  """
272
273
 
273
- url: str
274
- headers_ref: str | None = None
275
- auth: dict[str, str] | None = None
274
+ url: Dsn
275
+ headers_ref: Secret[str] | None = None
276
+ auth: RedactedMap | None = None
276
277
 
277
278
 
278
279
  class AgentEndpointConfig(LoomFrozenStruct, frozen=True, kw_only=True):
@@ -306,7 +307,7 @@ class A2AConfig(LoomFrozenStruct, frozen=True, kw_only=True):
306
307
  when ``expose`` names no agent.
307
308
  """
308
309
 
309
- base_url: str
310
+ base_url: Dsn
310
311
  expose: tuple[str, ...]
311
312
 
312
313
  def __post_init__(self) -> None:
@@ -317,15 +318,17 @@ class A2AConfig(LoomFrozenStruct, frozen=True, kw_only=True):
317
318
  # advertise a plaintext channel to every discovering client, and
318
319
  # userinfo would publish a credential outright. Same rule the compiler
319
320
  # already applies to the remote URLs it validates, applied where this
320
- # one actually lives (FR-038).
321
- fault = _url_fault(self.base_url)
321
+ # one actually lives (FR-038). The check reads the address; the card
322
+ # and the error publish only the redacted form.
323
+ address = self.base_url.reveal()
324
+ fault = _url_fault(address)
322
325
  if fault is None:
323
- _warn_plaintext_loopback("ai.a2a.base_url", self.base_url)
326
+ _warn_plaintext_loopback("ai.a2a.base_url", address)
324
327
  if fault is not None:
325
328
  raise AgentCompilationError(
326
329
  [
327
330
  AgentErrorCode.A2A_BASE_URL_INVALID.issue(
328
- url=_redact_url(self.base_url), reason=fault
331
+ url=_redact_url(address), reason=fault
329
332
  )
330
333
  ]
331
334
  )
@@ -450,21 +453,27 @@ def _warn_unused_prices(
450
453
 
451
454
 
452
455
  def _validate_remote_url(
453
- component: str, url: str, invalid: AgentErrorCode
456
+ component: str, url: Dsn | str, invalid: AgentErrorCode
454
457
  ) -> list[AgentCompilationIssue]:
455
458
  """Collect the fault of one remote URL, redacted so it cannot leak a secret.
456
459
 
457
460
  The *invalid* code takes ``component, url, reason``.
458
461
  """
459
- fault = _url_fault(url)
462
+ address = url.reveal() if isinstance(url, Dsn) else url
463
+ fault = _url_fault(address)
460
464
  if fault is None:
461
- _warn_plaintext_loopback(component, url)
465
+ _warn_plaintext_loopback(component, address)
462
466
  return []
463
- return [invalid.issue(component=component, url=_redact_url(url), reason=fault)]
467
+ return [invalid.issue(component=component, url=_redact_url(address), reason=fault)]
464
468
 
465
469
 
466
- def _validate_headers_ref(component: str, headers_ref: str | None) -> list[AgentCompilationIssue]:
467
- if headers_ref is None or _is_credentials_reference(headers_ref):
470
+ def _validate_headers_ref(
471
+ component: str, headers_ref: Secret[str] | str | None
472
+ ) -> list[AgentCompilationIssue]:
473
+ if headers_ref is None:
474
+ return []
475
+ text = headers_ref.reveal() if isinstance(headers_ref, Secret) else headers_ref
476
+ if _is_credentials_reference(text):
468
477
  return []
469
478
  # The rejected value is deliberately absent: the message must not leak the
470
479
  # very secret it rejects.
@@ -472,7 +481,9 @@ def _validate_headers_ref(component: str, headers_ref: str | None) -> list[Agent
472
481
 
473
482
 
474
483
  def _validate_auth(
475
- component: str, headers_ref: str | None, auth: Mapping[str, str] | None
484
+ component: str,
485
+ headers_ref: Secret[str] | str | None,
486
+ auth: Mapping[str, object] | None,
476
487
  ) -> list[AgentCompilationIssue]:
477
488
  """Collect the issues of one endpoint's ``auth`` block.
478
489
 
@@ -493,9 +504,11 @@ def _validate_auth(
493
504
  # ``headers_ref``: the message must not leak what it rejects.
494
505
  AgentErrorCode.MCP_CREDENTIALS_INLINE.issue(component=component, field=f"auth.{key}")
495
506
  for key, value in auth.items()
496
- if key != _AUTH_KIND_KEY and not _is_credentials_reference(value)
507
+ if key != _AUTH_KIND_KEY
508
+ and not (isinstance(value, str) and _is_credentials_reference(value))
497
509
  ]
498
- kind = auth.get(_AUTH_KIND_KEY, "")
510
+ raw_kind = auth.get(_AUTH_KIND_KEY, "")
511
+ kind = raw_kind if isinstance(raw_kind, str) else ""
499
512
  if not is_strategy_registered(kind):
500
513
  issues.append(
501
514
  AgentErrorCode.MCP_AUTH_STRATEGY_UNKNOWN.issue(
@@ -582,7 +595,9 @@ def _validate_stdio_server(component: str, server: McpServerConfig) -> list[Agen
582
595
  return issues
583
596
 
584
597
 
585
- def _validate_mcp_env(component: str, env: Mapping[str, str] | None) -> list[AgentCompilationIssue]:
598
+ def _validate_mcp_env(
599
+ component: str, env: Mapping[str, object] | None
600
+ ) -> list[AgentCompilationIssue]:
586
601
  """Collect the issues of a subprocess ``env`` block: valid names, single-token values."""
587
602
  if env is None:
588
603
  return []
@@ -596,7 +611,7 @@ def _validate_mcp_env(component: str, env: Mapping[str, str] | None) -> list[Age
596
611
  reason=f"'{name}' is not a valid environment variable name",
597
612
  )
598
613
  )
599
- if not _has_reference_shape(value):
614
+ if not isinstance(value, str) or not _has_reference_shape(value):
600
615
  # The rejected value is deliberately absent: a broken interpolation
601
616
  # may still contain part of the secret it failed to resolve.
602
617
  issues.append(
@@ -47,6 +47,7 @@ from loom.ai.compiler import CompiledMcpCapability, mcp_connection
47
47
  from loom.ai.errors import AgentCompilationError, AgentErrorCode
48
48
  from loom.ai.registry import require_provider_sdk
49
49
  from loom.ai.remote_auth import headers_from_ref, shared_mcp_auth
50
+ from loom.core.model.redaction import Secret
50
51
 
51
52
  if TYPE_CHECKING:
52
53
  from fastmcp.client.transports import ClientTransport, StdioTransport
@@ -299,7 +300,11 @@ def _stdio_transport(command: str, capability: CompiledMcpCapability) -> ClientT
299
300
  return _sdk().StdioTransport(
300
301
  command=command,
301
302
  args=list(capability.args),
302
- env=dict(capability.env) or None,
303
+ env={
304
+ key: value.reveal() if isinstance(value, Secret) else value
305
+ for key, value in capability.env
306
+ }
307
+ or None,
303
308
  keep_alive=False,
304
309
  )
305
310
 
@@ -38,6 +38,17 @@ def model_settings(target: InferenceTarget) -> ModelSettings | None:
38
38
  return cast(ModelSettings, dict(target.options))
39
39
 
40
40
 
41
+ def provider_endpoint(target: InferenceTarget) -> str | None:
42
+ """Return the endpoint string the provider SDK connects to.
43
+
44
+ ``None`` leaves the SDK on its own default. The stored address stays a
45
+ :class:`~loom.core.model.redaction.Dsn`, whose text form hides a password.
46
+ """
47
+ if target.endpoint is None:
48
+ return None
49
+ return target.endpoint.reveal()
50
+
51
+
41
52
  def api_key(target: InferenceTarget) -> str | None:
42
53
  """Read the API key of a target whose ``credentials_ref`` names a variable.
43
54
 
@@ -6,7 +6,7 @@ from pydantic_ai.models import Model
6
6
  from pydantic_ai.models.anthropic import AnthropicModel
7
7
  from pydantic_ai.providers.anthropic import AnthropicProvider
8
8
 
9
- from loom.ai.engines.pydantic_ai.providers._shared import api_key, model_settings
9
+ from loom.ai.engines.pydantic_ai.providers._shared import api_key, model_settings, provider_endpoint
10
10
  from loom.ai.inference import InferenceTarget
11
11
 
12
12
  MODEL_CLASS: type[Model] = AnthropicModel
@@ -14,5 +14,5 @@ MODEL_CLASS: type[Model] = AnthropicModel
14
14
 
15
15
  def build(target: InferenceTarget) -> Model:
16
16
  """Build the Anthropic model of one binding; ``endpoint`` overrides the base URL."""
17
- provider = AnthropicProvider(api_key=api_key(target), base_url=target.endpoint)
17
+ provider = AnthropicProvider(api_key=api_key(target), base_url=provider_endpoint(target))
18
18
  return AnthropicModel(target.model, provider=provider, settings=model_settings(target))
@@ -6,7 +6,7 @@ from pydantic_ai.models import Model
6
6
  from pydantic_ai.models.bedrock import BedrockConverseModel
7
7
  from pydantic_ai.providers.bedrock import BedrockProvider
8
8
 
9
- from loom.ai.engines.pydantic_ai.providers._shared import model_settings
9
+ from loom.ai.engines.pydantic_ai.providers._shared import model_settings, provider_endpoint
10
10
  from loom.ai.inference import InferenceTarget
11
11
  from loom.ai.registry import require_provider_setting
12
12
 
@@ -19,6 +19,6 @@ def build(target: InferenceTarget) -> Model:
19
19
  provider = BedrockProvider(
20
20
  region_name=target.region,
21
21
  profile_name=target.credentials_ref,
22
- base_url=target.endpoint,
22
+ base_url=provider_endpoint(target),
23
23
  )
24
24
  return BedrockConverseModel(target.model, provider=provider, settings=model_settings(target))
@@ -6,7 +6,7 @@ from pydantic_ai.models import Model
6
6
  from pydantic_ai.models.openai import OpenAIChatModel
7
7
  from pydantic_ai.providers.openai import OpenAIProvider
8
8
 
9
- from loom.ai.engines.pydantic_ai.providers._shared import api_key, model_settings
9
+ from loom.ai.engines.pydantic_ai.providers._shared import api_key, model_settings, provider_endpoint
10
10
  from loom.ai.inference import InferenceTarget
11
11
 
12
12
  MODEL_CLASS: type[Model] = OpenAIChatModel
@@ -14,5 +14,5 @@ MODEL_CLASS: type[Model] = OpenAIChatModel
14
14
 
15
15
  def build(target: InferenceTarget) -> Model:
16
16
  """Build the OpenAI chat model of one binding; ``endpoint`` overrides the base URL."""
17
- provider = OpenAIProvider(base_url=target.endpoint, api_key=api_key(target))
17
+ provider = OpenAIProvider(base_url=provider_endpoint(target), api_key=api_key(target))
18
18
  return OpenAIChatModel(target.model, provider=provider, settings=model_settings(target))
@@ -11,7 +11,7 @@ from pydantic_ai.models import Model
11
11
  from pydantic_ai.models.typesafe import TypeSafeModel
12
12
  from pydantic_ai.providers.typesafe import TypeSafeProvider
13
13
 
14
- from loom.ai.engines.pydantic_ai.providers._shared import api_key, model_settings
14
+ from loom.ai.engines.pydantic_ai.providers._shared import api_key, model_settings, provider_endpoint
15
15
  from loom.ai.errors import AgentCompilationError, AgentErrorCode
16
16
  from loom.ai.inference import InferenceTarget
17
17
 
@@ -31,5 +31,5 @@ def build(target: InferenceTarget) -> Model:
31
31
  )
32
32
  ]
33
33
  )
34
- provider = TypeSafeProvider(api_key=api_key(target), base_url=target.endpoint)
34
+ provider = TypeSafeProvider(api_key=api_key(target), base_url=provider_endpoint(target))
35
35
  return TypeSafeModel(target.model, provider=provider, settings=model_settings(target))
@@ -25,6 +25,7 @@ from typing import Any, Final, Literal, get_args
25
25
  from msgspec import field, structs
26
26
 
27
27
  from loom.core.model import LoomFrozenStruct
28
+ from loom.core.model.redaction import Dsn
28
29
 
29
30
  OutputMode = Literal["tool", "native"]
30
31
  """How the engine asks the model for the structured answer.
@@ -131,7 +132,7 @@ class InferenceTarget(LoomFrozenStruct, frozen=True, kw_only=True):
131
132
  provider: str
132
133
  model: str
133
134
  region: str | None = None
134
- endpoint: str | None = None
135
+ endpoint: Dsn | None = None
135
136
  output_mode: str | None = None
136
137
  streaming: bool = True
137
138
  credentials_ref: str | None = None
@@ -82,6 +82,7 @@ from typing import TYPE_CHECKING, Any, Final, cast, get_type_hints
82
82
  import msgspec
83
83
 
84
84
  from loom.ai.errors import AgentCompilationError, AgentErrorCode
85
+ from loom.core.model.redaction import Secret
85
86
  from loom.core.plugins.entrypoints import (
86
87
  DuplicateEntryPointError,
87
88
  EntryPointNotFoundError,
@@ -154,7 +155,7 @@ def is_strategy_registered(kind: str) -> bool:
154
155
  return select_entry_point(REMOTE_AUTH_ENTRY_POINT_GROUP, kind, on_duplicate="error") is not None
155
156
 
156
157
 
157
- def headers_from_ref(component: str, headers_ref: str | None) -> dict[str, str]:
158
+ def headers_from_ref(component: str, headers_ref: Secret[str] | str | None) -> dict[str, str]:
158
159
  """Read the header a resolved ``headers_ref`` carries.
159
160
 
160
161
  The deployment's secret resolver has already run — ``${secrets:/path}`` is
@@ -184,7 +185,8 @@ def headers_from_ref(component: str, headers_ref: str | None) -> dict[str, str]:
184
185
  """
185
186
  if headers_ref is None:
186
187
  return {}
187
- name, separator, value = headers_ref.partition(_HEADER_SEPARATOR)
188
+ payload = headers_ref.reveal() if isinstance(headers_ref, Secret) else headers_ref
189
+ name, separator, value = payload.partition(_HEADER_SEPARATOR)
188
190
  if not separator or not name or not value:
189
191
  raise AgentCompilationError(
190
192
  [AgentErrorCode.MCP_HEADERS_REF_INVALID.issue(component=component)]
@@ -415,7 +417,11 @@ def _build(auth: CompiledRemoteAuth) -> ClientAuth:
415
417
  """Load the named strategy and construct it from its settings."""
416
418
  strategy = _load_strategy(auth.kind)
417
419
  try:
418
- settings = _coerce_settings(strategy, dict(auth.settings))
420
+ plain = {
421
+ key: value.reveal() if isinstance(value, Secret) else value
422
+ for key, value in auth.settings
423
+ }
424
+ settings = _coerce_settings(strategy, plain)
419
425
  except msgspec.ValidationError as exc:
420
426
  raise AgentCompilationError(
421
427
  [