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.
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/CHANGELOG.md +111 -6
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/PKG-INFO +1 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/card.py +1 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/server.py +4 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/_plan.py +12 -7
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_capabilities.py +17 -6
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/config.py +38 -23
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +6 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/_shared.py +11 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/anthropic.py +2 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/bedrock.py +2 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/openai.py +2 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/typesafe.py +2 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/inference.py +2 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/remote_auth.py +9 -3
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/bootstrap.py +38 -35
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/config.py +6 -5
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/abc/config.py +5 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/gateway.py +3 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/checks.py +7 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/__init__.py +2 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/_resolver_utils.py +10 -12
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/binder.py +4 -3
- loom_kernel-9.2.0/src/loom/core/config/checks.py +64 -0
- loom_kernel-9.2.0/src/loom/core/config/convert.py +206 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/loader.py +2 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/observability.py +13 -7
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/overrides.py +16 -2
- loom_kernel-9.2.0/src/loom/core/config/retired.py +35 -0
- loom_kernel-9.2.0/src/loom/core/connections/__init__.py +40 -0
- loom_kernel-9.2.0/src/loom/core/connections/_base.py +134 -0
- loom_kernel-9.2.0/src/loom/core/connections/aws/__init__.py +12 -0
- loom_kernel-9.2.0/src/loom/core/connections/aws/client.py +51 -0
- loom_kernel-9.2.0/src/loom/core/connections/aws/config.py +91 -0
- loom_kernel-9.2.0/src/loom/core/connections/aws/loader.py +35 -0
- loom_kernel-9.2.0/src/loom/core/connections/clickhouse/__init__.py +12 -0
- loom_kernel-9.2.0/src/loom/core/connections/clickhouse/client.py +83 -0
- loom_kernel-9.2.0/src/loom/core/connections/clickhouse/config.py +77 -0
- loom_kernel-9.2.0/src/loom/core/connections/clickhouse/loader.py +44 -0
- loom_kernel-9.2.0/src/loom/core/connections/mongo/__init__.py +12 -0
- loom_kernel-9.2.0/src/loom/core/connections/mongo/client.py +64 -0
- loom_kernel-9.2.0/src/loom/core/connections/mongo/config.py +112 -0
- loom_kernel-9.2.0/src/loom/core/connections/mongo/loader.py +41 -0
- loom_kernel-9.2.0/src/loom/core/connections/relational.py +27 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/errors/__init__.py +2 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/errors/errors.py +4 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/locator.py +10 -54
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/logger/__init__.py +2 -0
- loom_kernel-9.2.0/src/loom/core/logger/context.py +43 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/_loom_type.py +5 -4
- loom_kernel-9.2.0/src/loom/core/model/redaction.py +508 -0
- loom_kernel-9.2.0/src/loom/core/model/struct.py +112 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/types.py +3 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/config.py +2 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/observer/otel.py +15 -7
- loom_kernel-9.2.0/src/loom/core/persistence/__init__.py +46 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/persistence/abc.py +31 -11
- loom_kernel-9.2.0/src/loom/core/persistence/database.py +265 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/persistence/none.py +14 -7
- loom_kernel-9.2.0/src/loom/core/persistence/profile.py +119 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/dynamodb/backend.py +50 -47
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/dynamodb/registry.py +8 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/dynamodb/repository.py +51 -12
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/backend.py +35 -31
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/__init__.py +2 -1
- loom_kernel-9.2.0/src/loom/core/repository/sqlalchemy/_pool_metrics.py +42 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/backend.py +76 -71
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/migrations/runners.py +2 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/mixins.py +2 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +1 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/__init__.py +1 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/session_manager.py +81 -52
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/clickhouse/_client.py +8 -31
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/clickhouse/registry.py +10 -18
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/config.py +62 -30
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/__init__.py +4 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_merge.py +43 -3
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_write_policy.py +65 -17
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_reader.py +37 -27
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_writer.py +125 -9
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/provider.py +32 -41
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/_writer.py +3 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/provider.py +3 -2
- loom_kernel-9.2.0/src/loom/etl/checkpoint/_backends/_memory.py +60 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_backends/_polars.py +21 -8
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_compiler.py +11 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_errors.py +8 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_validators.py +1 -15
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_validators_plan.py +6 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_validators_step.py +21 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/__init__.py +4 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/__init__.py +9 -1
- loom_kernel-9.2.0/src/loom/etl/declarative/target/_errors.py +68 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_into.py +32 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_table.py +32 -0
- loom_kernel-9.2.0/src/loom/etl/io/_clickhouse_connection.py +44 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_clickhouse.py +18 -18
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/targets/_clickhouse.py +35 -31
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/_config.py +4 -3
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runner/config_loader.py +2 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runner/core.py +2 -3
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/storage/__init__.py +0 -4
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/storage/_config.py +63 -69
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/storage/routing.py +3 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/testing/__init__.py +6 -3
- loom_kernel-9.2.0/src/loom/etl/testing/_delta.py +86 -0
- loom_kernel-9.2.0/src/loom/etl/testing/_result.py +173 -0
- loom_kernel-9.2.0/src/loom/etl/testing/_runners.py +393 -0
- loom_kernel-9.2.0/src/loom/etl/testing/_scenario.py +260 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/testing/spark.py +31 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_flow_yaml.py +6 -1
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/_factory.py +4 -3
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/_slack.py +5 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/_sns.py +3 -2
- loom_kernel-9.2.0/src/loom/prometheus/db_pool.py +135 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prometheus/lifecycle.py +6 -3
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/_body.py +25 -2
- loom_kernel-9.2.0/src/loom/rest/fastapi/_auto_ai.py +524 -0
- loom_kernel-9.2.0/src/loom/rest/fastapi/_auto_auth.py +145 -0
- loom_kernel-9.2.0/src/loom/rest/fastapi/_auto_sql.py +221 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/_errors.py +30 -3
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/auto.py +103 -874
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/router_runtime.py +43 -38
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/sql.py +12 -25
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/middleware.py +6 -8
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/__init__.py +0 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_resource_manager.py +34 -54
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_runtime_io.py +16 -4
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/_shared.py +6 -17
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/_plan.py +2 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/phases/build_plan.py +4 -3
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/phases/validate.py +2 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_config.py +8 -6
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/mongo/_bytewax_source.py +13 -24
- loom_kernel-9.2.0/src/loom/streaming/mongo/_config.py +68 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/__init__.py +0 -2
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_table/__init__.py +3 -4
- loom_kernel-9.2.0/src/loom/streaming/nodes/_table/_clickhouse.py +206 -0
- loom_kernel-9.2.0/src/loom/streaming/nodes/_table/_delta.py +255 -0
- loom_kernel-9.2.0/src/loom/streaming/nodes/_table/_sqlalchemy.py +163 -0
- loom_kernel-9.2.0/src/loom/streaming/nodes/_table/common.py +595 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_table/config.py +49 -10
- loom_kernel-9.0.0/src/loom/core/config/_boto3.py +0 -22
- loom_kernel-9.0.0/src/loom/core/model/struct.py +0 -38
- loom_kernel-9.0.0/src/loom/core/persistence/__init__.py +0 -18
- loom_kernel-9.0.0/src/loom/etl/declarative/target/_errors.py +0 -30
- loom_kernel-9.0.0/src/loom/etl/testing/_result.py +0 -88
- loom_kernel-9.0.0/src/loom/etl/testing/_runners.py +0 -183
- loom_kernel-9.0.0/src/loom/etl/testing/_scenario.py +0 -79
- loom_kernel-9.0.0/src/loom/streaming/mongo/_config.py +0 -55
- loom_kernel-9.0.0/src/loom/streaming/nodes/_table/common.py +0 -1268
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/.gitignore +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/LICENSE +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/README.md +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/pyproject.toml +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_concurrency.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_filters.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_paths.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_roles.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_startup.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_transport.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/_usecase.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/_binding.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/_handlers.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/_rpc.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/a2a/events.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/abc.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/bootstrap.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/_compiler.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/_fingerprint.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_conversation.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_feedable.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_hook.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_instructions.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_output.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/compiler/phases/_state.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/declarative/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/declarative/_envelope.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/declarative/_schema.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/declarative/_v1.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/describe.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_escape.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_history.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_instructions.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_limits.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_native.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/extras/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/extras/a2a.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/extras/handlebars.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/extras/mcp.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/extras/skills.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/gateway.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/_batch.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/_columns.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/_frames.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/_ledger.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/_runner.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/etl/_validation.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/fastapi/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/fastapi/endpoints.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/fastapi/response.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/fastapi/streaming.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/pricing.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/registry.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_bounded.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_chain.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_conversation.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_grants.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_handle.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_health.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_hooks.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_lifecycle.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_limits.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/runtime/_mcp.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/validate/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/validate/__main__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/auto.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/constants.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/runner.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/celery/service.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/cli/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/cli/app.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/cli/check.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/cli/schema.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/async_bridge.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/_decide.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/_grants.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/_roles.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/_scope.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/elevation.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/authz/product.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/backend/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/backend/core_model.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/backend/protocol.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/backend/scoped_ddl.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/backend/sqlalchemy.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/bootstrap/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/bootstrap/kernel.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/_batching.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/_single_flight.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/abc/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/abc/backend.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/abc/dependency.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/calls.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/codec.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/decorators.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/dependency.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/keys.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/memory.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/repository.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/result_codec.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/serializer.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/cache/wiring.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/command/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/command/adapter.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/command/base.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/command/field.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/command/introspection.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/compiler.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/_includes.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/configurable.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/context.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/keys.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/model.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/resolver.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/secrets.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/config/ssm.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/contracts/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/contracts/manifest.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/di/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/di/container.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/di/scope.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/discovery/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/discovery/_utils.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/discovery/base.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/discovery/interfaces.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/discovery/manifest.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/discovery/modules.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/compilable.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/compiler.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/events.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/executor.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/metrics.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/plan.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/engine/post_commit.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/environment.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/errors/codes.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/expr/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/expr/eval.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/expr/nodes.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/expr/refs.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/identity/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/identity/context.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/identity/identity.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/identity/issuer.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/identity/wire.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/introspection/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/introspection/base.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/introspection/describe.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/job/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/job/callback.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/job/context.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/job/handle.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/job/job.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/job/service.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/logger/abc.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/logger/checks.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/logger/config.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/logger/registry.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/logger/structlogger.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/_json_schema.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/base.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/convert.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/enums.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/field.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/introspection.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/partition.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/privilege.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/projection.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/relation.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/scoped.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/timestamped.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/model/types_postgres.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/event.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/observer/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/observer/noop.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/observer/structlog.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/otel_ids.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/protocol.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/runtime.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/span.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/observability/topology.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/persistence/registry.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/plugins/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/plugins/entrypoints.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/plugins/optional.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/projection/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/projection/loaders.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/projection/runtime.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/checks.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/cursor.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/query.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/query_compiler.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/repo_for.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/repository.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/abc/session_scope.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/ids.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/query_compiler.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/registry.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/repository.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/uow.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mongo/values.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/mutation.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/registration.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/registry.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/migrations/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/migrations/env_template.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/migrations/hook.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/migrations/operations.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/bootstrap.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/config.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/elevate.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/guard/0001.sql +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/guard/0002.sql +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/guard/preflight.sql +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/guard_manifest.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/integrity.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/partitions.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/provider.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/schema.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/sources.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/rls/verify.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/session_settings.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/repository/sqlalchemy/values.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/response/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/response/base.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/routing/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/routing/ref.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/routing/resolver.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/runner.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/schema/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/schema/schema_mode.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/schema_names.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/abc/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/abc/contracts.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/abc/errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/caller_bound.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/roles.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/sql/service.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/symbols.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/tracing/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/tracing/context.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/transaction.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/transport/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/transport/adapter.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/uow/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/uow/abc.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/uow/context.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/_predicates.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/agent_markers.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/compute.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/constants.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/factory.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/field_ref.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/invoker.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/keys.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/markers.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/mcp_markers.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/outcome.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/registry.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/rule.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/core/use_case/use_case.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/_uri.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_format_registry.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_historify/_common.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_historify/_log.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_path_template.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_predicate.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_frame.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_historify.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_schema.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/_historify.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/_reader.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/_schema.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_options.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_paths.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_scope.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/checkpoint/_store.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_binding.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_filter.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_plan.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_validators_agents.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/compiler/_validators_config.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/_format.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/_read_options.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/_utils.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/_with_agent.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/_write_options.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/expr/_params.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/_from.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/_from_config.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/source/_specs.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_client.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_file.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/declarative/target/_temp.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/executor/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/executor/_agents.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/executor/_dispatcher.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/executor/_executor.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/_registry.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_mongo.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/sources/_serialization.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/io/targets/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/_observer.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/_records.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/_builder.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/_ops.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/_protocol.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/_runner.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/_step.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_generics.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_params.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_process.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_sql.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_step.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_step_client.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runner/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runner/_agents.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runner/_providers.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runner/_wiring.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runtime/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runtime/_config_values.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/runtime/contracts.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/schema/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/schema/_contract.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/schema/_schema.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/storage/_file_locator.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/storage/_locator.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/etl/testing/_stubs.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_async.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_config.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_ctx.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_meta.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_placeholders.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/_summary.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/deploy/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/deploy/_discovery.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/deploy/_schedule.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/deploy/_yaml_etls.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/deploy/entrypoint.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_assemble.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_backfill.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_body.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_common.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_factory.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_hooks.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_maintenance.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_params.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_run_name.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_runtime.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_signature.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/flow/_stages.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/manifest/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/manifest/_model.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/manifest/_s3.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/manifest/_store.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/_event.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/_format.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/notify/_port.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/observer/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/observer/_flow.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/observer/_manifest.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prefect/observer/_task_run.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prometheus/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prometheus/_instruments.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prometheus/adapter.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prometheus/kafka.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/prometheus/middleware.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/py.typed +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/adapter.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/auth/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/auth/abc.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/auth/config.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/auth/jwt.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/auth/middleware.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/autocrud.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/checks.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/compiler.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/config.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/constants.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/cors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/app.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/health.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/openapi.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/fastapi/response.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/model.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/rest/rest_adapter.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_operators.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/bytewax/runner.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/_bindings.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/_compiler.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/compiler/_errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/core/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/core/_errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/core/_exceptions.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/core/_message.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/core/_tracing.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/core/_typing.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/graph/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/graph/_flow.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_codec.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_errors.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_message.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_record.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/_wire.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/mongo/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/mongo/_event.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/mongo/_normalize.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_boundary.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_branches.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_decompose.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_fork.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_helpers.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_mongo.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_protocols.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_router.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_shape.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_sink.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_step.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/_with.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/nodes/refs.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/streaming/testing.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/__init__.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/agents.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/golden.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/http_harness.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/in_memory.py +0 -0
- {loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/testing/repository_harness.py +0 -0
- {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
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
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
|
|
|
@@ -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),
|
|
@@ -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:
|
|
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:
|
|
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
|
|
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:
|
|
245
|
-
headers_ref: str | None = None
|
|
246
|
-
auth:
|
|
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:
|
|
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:
|
|
274
|
-
headers_ref: str | None = None
|
|
275
|
-
auth:
|
|
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:
|
|
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
|
-
|
|
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",
|
|
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(
|
|
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
|
-
|
|
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,
|
|
465
|
+
_warn_plaintext_loopback(component, address)
|
|
462
466
|
return []
|
|
463
|
-
return [invalid.issue(component=component, url=_redact_url(
|
|
467
|
+
return [invalid.issue(component=component, url=_redact_url(address), reason=fault)]
|
|
464
468
|
|
|
465
469
|
|
|
466
|
-
def _validate_headers_ref(
|
|
467
|
-
|
|
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,
|
|
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
|
|
507
|
+
if key != _AUTH_KIND_KEY
|
|
508
|
+
and not (isinstance(value, str) and _is_credentials_reference(value))
|
|
497
509
|
]
|
|
498
|
-
|
|
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(
|
|
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=
|
|
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
|
|
{loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/_shared.py
RENAMED
|
@@ -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
|
|
{loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/anthropic.py
RENAMED
|
@@ -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
|
|
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))
|
{loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/bedrock.py
RENAMED
|
@@ -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
|
|
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
|
|
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))
|
{loom_kernel-9.0.0 → loom_kernel-9.2.0}/src/loom/ai/engines/pydantic_ai/providers/typesafe.py
RENAMED
|
@@ -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
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
[
|